/*!-----------------------------------------------------------------------------
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Version: 0.33.0(4b1abad427e58dbedc1215d99a0902ffc885fcd4)
 * Released under the MIT license
 * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
 *-----------------------------------------------------------------------------*/
define("vs/language/typescript/tsWorker", ["require"],(require)=>{
var moduleExports = (() => {
  var __defProp = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __getOwnPropNames = Object.getOwnPropertyNames;
  var __hasOwnProp = Object.prototype.hasOwnProperty;
  var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
  var __export = (target, all) => {
    for (var name in all)
      __defProp(target, name, { get: all[name], enumerable: true });
  };
  var __reExport = (target, module2, copyDefault, desc) => {
    if (module2 && typeof module2 === "object" || typeof module2 === "function") {
      for (let key of __getOwnPropNames(module2))
        if (!__hasOwnProp.call(target, key) && (copyDefault || key !== "default"))
          __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
    }
    return target;
  };
  var __toCommonJS = /* @__PURE__ */ ((cache) => {
    return (module2, temp) => {
      return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
    };
  })(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);

  // src/language/typescript/tsWorker.ts
  var tsWorker_exports = {};
  __export(tsWorker_exports, {
    TypeScriptWorker: () => TypeScriptWorker,
    create: () => create
  });

  // src/language/typescript/lib/typescriptServices.js
  var typescriptServices_exports = {};
  __export(typescriptServices_exports, {
    EndOfLineState: () => EndOfLineState,
    IndentStyle: () => IndentStyle,
    ScriptKind: () => ScriptKind,
    ScriptTarget: () => ScriptTarget,
    TokenClass: () => TokenClass,
    createClassifier: () => createClassifier,
    createLanguageService: () => createLanguageService,
    displayPartsToString: () => displayPartsToString,
    flattenDiagnosticMessageText: () => flattenDiagnosticMessageText,
    typescript: () => typescript
  });
  var __spreadArray = function(to, from, pack) {
    if (pack || arguments.length === 2)
      for (var i = 0, l = from.length, ar; i < l; i++) {
        if (ar || !(i in from)) {
          if (!ar)
            ar = Array.prototype.slice.call(from, 0, i);
          ar[i] = from[i];
        }
      }
    return to.concat(ar || Array.prototype.slice.call(from));
  };
  var __assign = function() {
    __assign = Object.assign || function(t) {
      for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i];
        for (var p in s)
          if (Object.prototype.hasOwnProperty.call(s, p))
            t[p] = s[p];
      }
      return t;
    };
    return __assign.apply(this, arguments);
  };
  var __makeTemplateObject = function(cooked, raw) {
    if (Object.defineProperty) {
      Object.defineProperty(cooked, "raw", { value: raw });
    } else {
      cooked.raw = raw;
    }
    return cooked;
  };
  var __generator = function(thisArg, body) {
    var _ = { label: 0, sent: function() {
      if (t[0] & 1)
        throw t[1];
      return t[1];
    }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
      return this;
    }), g;
    function verb(n) {
      return function(v) {
        return step([n, v]);
      };
    }
    function step(op) {
      if (f)
        throw new TypeError("Generator is already executing.");
      while (_)
        try {
          if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
            return t;
          if (y = 0, t)
            op = [op[0] & 2, t.value];
          switch (op[0]) {
            case 0:
            case 1:
              t = op;
              break;
            case 4:
              _.label++;
              return { value: op[1], done: false };
            case 5:
              _.label++;
              y = op[1];
              op = [0];
              continue;
            case 7:
              op = _.ops.pop();
              _.trys.pop();
              continue;
            default:
              if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
                _ = 0;
                continue;
              }
              if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
                _.label = op[1];
                break;
              }
              if (op[0] === 6 && _.label < t[1]) {
                _.label = t[1];
                t = op;
                break;
              }
              if (t && _.label < t[2]) {
                _.label = t[2];
                _.ops.push(op);
                break;
              }
              if (t[2])
                _.ops.pop();
              _.trys.pop();
              continue;
          }
          op = body.call(thisArg, _);
        } catch (e) {
          op = [6, e];
          y = 0;
        } finally {
          f = t = 0;
        }
      if (op[0] & 5)
        throw op[1];
      return { value: op[0] ? op[1] : void 0, done: true };
    }
  };
  var __rest = function(s, e) {
    var t = {};
    for (var p in s)
      if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
        t[p] = s[p];
    if (s != null && typeof Object.getOwnPropertySymbols === "function")
      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
        if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
          t[p[i]] = s[p[i]];
      }
    return t;
  };
  var __extends = function() {
    var extendStatics = function(d, b) {
      extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
        d2.__proto__ = b2;
      } || function(d2, b2) {
        for (var p in b2)
          if (Object.prototype.hasOwnProperty.call(b2, p))
            d2[p] = b2[p];
      };
      return extendStatics(d, b);
    };
    return function(d, b) {
      if (typeof b !== "function" && b !== null)
        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
      extendStatics(d, b);
      function __() {
        this.constructor = d;
      }
      d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
  }();
  (function(ts2) {
    function createMapData() {
      var sentinel = {};
      sentinel.prev = sentinel;
      return { head: sentinel, tail: sentinel, size: 0 };
    }
    function createMapEntry(key, value) {
      return { key, value, next: void 0, prev: void 0 };
    }
    function sameValueZero(x, y) {
      return x === y || x !== x && y !== y;
    }
    function getPrev(entry) {
      var prev = entry.prev;
      if (!prev || prev === entry)
        throw new Error("Illegal state");
      return prev;
    }
    function getNext(entry) {
      while (entry) {
        var skipNext = !entry.prev;
        entry = entry.next;
        if (skipNext) {
          continue;
        }
        return entry;
      }
    }
    function getEntry(data, key) {
      for (var entry = data.tail; entry !== data.head; entry = getPrev(entry)) {
        if (sameValueZero(entry.key, key)) {
          return entry;
        }
      }
    }
    function addOrUpdateEntry(data, key, value) {
      var existing = getEntry(data, key);
      if (existing) {
        existing.value = value;
        return;
      }
      var entry = createMapEntry(key, value);
      entry.prev = data.tail;
      data.tail.next = entry;
      data.tail = entry;
      data.size++;
      return entry;
    }
    function deleteEntry(data, key) {
      for (var entry = data.tail; entry !== data.head; entry = getPrev(entry)) {
        if (entry.prev === void 0)
          throw new Error("Illegal state");
        if (sameValueZero(entry.key, key)) {
          if (entry.next) {
            entry.next.prev = entry.prev;
          } else {
            if (data.tail !== entry)
              throw new Error("Illegal state");
            data.tail = entry.prev;
          }
          entry.prev.next = entry.next;
          entry.next = entry.prev;
          entry.prev = void 0;
          data.size--;
          return entry;
        }
      }
    }
    function clearEntries(data) {
      var node = data.tail;
      while (node !== data.head) {
        var prev = getPrev(node);
        node.next = data.head;
        node.prev = void 0;
        node = prev;
      }
      data.head.next = void 0;
      data.tail = data.head;
      data.size = 0;
    }
    function forEachEntry(data, action) {
      var entry = data.head;
      while (entry) {
        entry = getNext(entry);
        if (entry) {
          action(entry.value, entry.key);
        }
      }
    }
    function forEachIteration(iterator, action) {
      if (iterator) {
        for (var step = iterator.next(); !step.done; step = iterator.next()) {
          action(step.value);
        }
      }
    }
    function createIteratorData(data, selector) {
      return { current: data.head, selector };
    }
    function iteratorNext(data) {
      data.current = getNext(data.current);
      if (data.current) {
        return { value: data.selector(data.current.key, data.current.value), done: false };
      } else {
        return { value: void 0, done: true };
      }
    }
    var ShimCollections;
    (function(ShimCollections2) {
      function createMapShim(getIterator) {
        var MapIterator = function() {
          function MapIterator2(data, selector) {
            this._data = createIteratorData(data, selector);
          }
          MapIterator2.prototype.next = function() {
            return iteratorNext(this._data);
          };
          return MapIterator2;
        }();
        return function() {
          function Map2(iterable) {
            var _this = this;
            this._mapData = createMapData();
            forEachIteration(getIterator(iterable), function(_a) {
              var key = _a[0], value = _a[1];
              return _this.set(key, value);
            });
          }
          Object.defineProperty(Map2.prototype, "size", {
            get: function() {
              return this._mapData.size;
            },
            enumerable: false,
            configurable: true
          });
          Map2.prototype.get = function(key) {
            var _a;
            return (_a = getEntry(this._mapData, key)) === null || _a === void 0 ? void 0 : _a.value;
          };
          Map2.prototype.set = function(key, value) {
            return addOrUpdateEntry(this._mapData, key, value), this;
          };
          Map2.prototype.has = function(key) {
            return !!getEntry(this._mapData, key);
          };
          Map2.prototype.delete = function(key) {
            return !!deleteEntry(this._mapData, key);
          };
          Map2.prototype.clear = function() {
            clearEntries(this._mapData);
          };
          Map2.prototype.keys = function() {
            return new MapIterator(this._mapData, function(key, _value) {
              return key;
            });
          };
          Map2.prototype.values = function() {
            return new MapIterator(this._mapData, function(_key, value) {
              return value;
            });
          };
          Map2.prototype.entries = function() {
            return new MapIterator(this._mapData, function(key, value) {
              return [key, value];
            });
          };
          Map2.prototype.forEach = function(action) {
            forEachEntry(this._mapData, action);
          };
          return Map2;
        }();
      }
      ShimCollections2.createMapShim = createMapShim;
      function createSetShim(getIterator) {
        var SetIterator = function() {
          function SetIterator2(data, selector) {
            this._data = createIteratorData(data, selector);
          }
          SetIterator2.prototype.next = function() {
            return iteratorNext(this._data);
          };
          return SetIterator2;
        }();
        return function() {
          function Set2(iterable) {
            var _this = this;
            this._mapData = createMapData();
            forEachIteration(getIterator(iterable), function(value) {
              return _this.add(value);
            });
          }
          Object.defineProperty(Set2.prototype, "size", {
            get: function() {
              return this._mapData.size;
            },
            enumerable: false,
            configurable: true
          });
          Set2.prototype.add = function(value) {
            return addOrUpdateEntry(this._mapData, value, value), this;
          };
          Set2.prototype.has = function(value) {
            return !!getEntry(this._mapData, value);
          };
          Set2.prototype.delete = function(value) {
            return !!deleteEntry(this._mapData, value);
          };
          Set2.prototype.clear = function() {
            clearEntries(this._mapData);
          };
          Set2.prototype.keys = function() {
            return new SetIterator(this._mapData, function(key, _value) {
              return key;
            });
          };
          Set2.prototype.values = function() {
            return new SetIterator(this._mapData, function(_key, value) {
              return value;
            });
          };
          Set2.prototype.entries = function() {
            return new SetIterator(this._mapData, function(key, value) {
              return [key, value];
            });
          };
          Set2.prototype.forEach = function(action) {
            forEachEntry(this._mapData, action);
          };
          return Set2;
        }();
      }
      ShimCollections2.createSetShim = createSetShim;
    })(ShimCollections = ts2.ShimCollections || (ts2.ShimCollections = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    ts2.versionMajorMinor = "4.5";
    ts2.version = "4.5.5";
    var Comparison;
    (function(Comparison2) {
      Comparison2[Comparison2["LessThan"] = -1] = "LessThan";
      Comparison2[Comparison2["EqualTo"] = 0] = "EqualTo";
      Comparison2[Comparison2["GreaterThan"] = 1] = "GreaterThan";
    })(Comparison = ts2.Comparison || (ts2.Comparison = {}));
    var NativeCollections;
    (function(NativeCollections2) {
      function tryGetNativeMap() {
        return typeof Map !== "undefined" && "entries" in Map.prototype && (/* @__PURE__ */ new Map([[0, 0]])).size === 1 ? Map : void 0;
      }
      NativeCollections2.tryGetNativeMap = tryGetNativeMap;
      function tryGetNativeSet() {
        return typeof Set !== "undefined" && "entries" in Set.prototype && (/* @__PURE__ */ new Set([0])).size === 1 ? Set : void 0;
      }
      NativeCollections2.tryGetNativeSet = tryGetNativeSet;
    })(NativeCollections || (NativeCollections = {}));
    ts2.Map = getCollectionImplementation("Map", "tryGetNativeMap", "createMapShim");
    ts2.Set = getCollectionImplementation("Set", "tryGetNativeSet", "createSetShim");
    function getCollectionImplementation(name, nativeFactory, shimFactory) {
      var _a;
      var constructor = (_a = NativeCollections[nativeFactory]()) !== null && _a !== void 0 ? _a : ts2.ShimCollections === null || ts2.ShimCollections === void 0 ? void 0 : ts2.ShimCollections[shimFactory](ts2.getIterator);
      if (constructor)
        return constructor;
      throw new Error("TypeScript requires an environment that provides a compatible native ".concat(name, " implementation."));
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function getIterator(iterable) {
      if (iterable) {
        if (isArray(iterable))
          return arrayIterator(iterable);
        if (iterable instanceof ts2.Map)
          return iterable.entries();
        if (iterable instanceof ts2.Set)
          return iterable.values();
        throw new Error("Iteration not supported.");
      }
    }
    ts2.getIterator = getIterator;
    ts2.emptyArray = [];
    ts2.emptyMap = new ts2.Map();
    ts2.emptySet = new ts2.Set();
    function createMap() {
      return new ts2.Map();
    }
    ts2.createMap = createMap;
    function createMapFromTemplate(template) {
      var map2 = new ts2.Map();
      for (var key in template) {
        if (hasOwnProperty.call(template, key)) {
          map2.set(key, template[key]);
        }
      }
      return map2;
    }
    ts2.createMapFromTemplate = createMapFromTemplate;
    function length(array) {
      return array ? array.length : 0;
    }
    ts2.length = length;
    function forEach(array, callback) {
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var result = callback(array[i], i);
          if (result) {
            return result;
          }
        }
      }
      return void 0;
    }
    ts2.forEach = forEach;
    function forEachRight(array, callback) {
      if (array) {
        for (var i = array.length - 1; i >= 0; i--) {
          var result = callback(array[i], i);
          if (result) {
            return result;
          }
        }
      }
      return void 0;
    }
    ts2.forEachRight = forEachRight;
    function firstDefined(array, callback) {
      if (array === void 0) {
        return void 0;
      }
      for (var i = 0; i < array.length; i++) {
        var result = callback(array[i], i);
        if (result !== void 0) {
          return result;
        }
      }
      return void 0;
    }
    ts2.firstDefined = firstDefined;
    function firstDefinedIterator(iter, callback) {
      while (true) {
        var iterResult = iter.next();
        if (iterResult.done) {
          return void 0;
        }
        var result = callback(iterResult.value);
        if (result !== void 0) {
          return result;
        }
      }
    }
    ts2.firstDefinedIterator = firstDefinedIterator;
    function reduceLeftIterator(iterator, f, initial) {
      var result = initial;
      if (iterator) {
        for (var step = iterator.next(), pos = 0; !step.done; step = iterator.next(), pos++) {
          result = f(result, step.value, pos);
        }
      }
      return result;
    }
    ts2.reduceLeftIterator = reduceLeftIterator;
    function zipWith(arrayA, arrayB, callback) {
      var result = [];
      ts2.Debug.assertEqual(arrayA.length, arrayB.length);
      for (var i = 0; i < arrayA.length; i++) {
        result.push(callback(arrayA[i], arrayB[i], i));
      }
      return result;
    }
    ts2.zipWith = zipWith;
    function zipToIterator(arrayA, arrayB) {
      ts2.Debug.assertEqual(arrayA.length, arrayB.length);
      var i = 0;
      return {
        next: function() {
          if (i === arrayA.length) {
            return { value: void 0, done: true };
          }
          i++;
          return { value: [arrayA[i - 1], arrayB[i - 1]], done: false };
        }
      };
    }
    ts2.zipToIterator = zipToIterator;
    function zipToMap(keys, values) {
      ts2.Debug.assert(keys.length === values.length);
      var map2 = new ts2.Map();
      for (var i = 0; i < keys.length; ++i) {
        map2.set(keys[i], values[i]);
      }
      return map2;
    }
    ts2.zipToMap = zipToMap;
    function intersperse(input, element) {
      if (input.length <= 1) {
        return input;
      }
      var result = [];
      for (var i = 0, n = input.length; i < n; i++) {
        if (i)
          result.push(element);
        result.push(input[i]);
      }
      return result;
    }
    ts2.intersperse = intersperse;
    function every(array, callback) {
      if (array) {
        for (var i = 0; i < array.length; i++) {
          if (!callback(array[i], i)) {
            return false;
          }
        }
      }
      return true;
    }
    ts2.every = every;
    function find(array, predicate) {
      for (var i = 0; i < array.length; i++) {
        var value = array[i];
        if (predicate(value, i)) {
          return value;
        }
      }
      return void 0;
    }
    ts2.find = find;
    function findLast(array, predicate) {
      for (var i = array.length - 1; i >= 0; i--) {
        var value = array[i];
        if (predicate(value, i)) {
          return value;
        }
      }
      return void 0;
    }
    ts2.findLast = findLast;
    function findIndex(array, predicate, startIndex) {
      for (var i = startIndex || 0; i < array.length; i++) {
        if (predicate(array[i], i)) {
          return i;
        }
      }
      return -1;
    }
    ts2.findIndex = findIndex;
    function findLastIndex(array, predicate, startIndex) {
      for (var i = startIndex === void 0 ? array.length - 1 : startIndex; i >= 0; i--) {
        if (predicate(array[i], i)) {
          return i;
        }
      }
      return -1;
    }
    ts2.findLastIndex = findLastIndex;
    function findMap(array, callback) {
      for (var i = 0; i < array.length; i++) {
        var result = callback(array[i], i);
        if (result) {
          return result;
        }
      }
      return ts2.Debug.fail();
    }
    ts2.findMap = findMap;
    function contains(array, value, equalityComparer) {
      if (equalityComparer === void 0) {
        equalityComparer = equateValues;
      }
      if (array) {
        for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {
          var v = array_1[_i];
          if (equalityComparer(v, value)) {
            return true;
          }
        }
      }
      return false;
    }
    ts2.contains = contains;
    function arraysEqual(a, b, equalityComparer) {
      if (equalityComparer === void 0) {
        equalityComparer = equateValues;
      }
      return a.length === b.length && a.every(function(x, i) {
        return equalityComparer(x, b[i]);
      });
    }
    ts2.arraysEqual = arraysEqual;
    function indexOfAnyCharCode(text, charCodes, start) {
      for (var i = start || 0; i < text.length; i++) {
        if (contains(charCodes, text.charCodeAt(i))) {
          return i;
        }
      }
      return -1;
    }
    ts2.indexOfAnyCharCode = indexOfAnyCharCode;
    function countWhere(array, predicate) {
      var count = 0;
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var v = array[i];
          if (predicate(v, i)) {
            count++;
          }
        }
      }
      return count;
    }
    ts2.countWhere = countWhere;
    function filter(array, f) {
      if (array) {
        var len = array.length;
        var i = 0;
        while (i < len && f(array[i]))
          i++;
        if (i < len) {
          var result = array.slice(0, i);
          i++;
          while (i < len) {
            var item = array[i];
            if (f(item)) {
              result.push(item);
            }
            i++;
          }
          return result;
        }
      }
      return array;
    }
    ts2.filter = filter;
    function filterMutate(array, f) {
      var outIndex = 0;
      for (var i = 0; i < array.length; i++) {
        if (f(array[i], i, array)) {
          array[outIndex] = array[i];
          outIndex++;
        }
      }
      array.length = outIndex;
    }
    ts2.filterMutate = filterMutate;
    function clear(array) {
      array.length = 0;
    }
    ts2.clear = clear;
    function map(array, f) {
      var result;
      if (array) {
        result = [];
        for (var i = 0; i < array.length; i++) {
          result.push(f(array[i], i));
        }
      }
      return result;
    }
    ts2.map = map;
    function mapIterator(iter, mapFn) {
      return {
        next: function() {
          var iterRes = iter.next();
          return iterRes.done ? iterRes : { value: mapFn(iterRes.value), done: false };
        }
      };
    }
    ts2.mapIterator = mapIterator;
    function sameMap(array, f) {
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var item = array[i];
          var mapped = f(item, i);
          if (item !== mapped) {
            var result = array.slice(0, i);
            result.push(mapped);
            for (i++; i < array.length; i++) {
              result.push(f(array[i], i));
            }
            return result;
          }
        }
      }
      return array;
    }
    ts2.sameMap = sameMap;
    function flatten(array) {
      var result = [];
      for (var _i = 0, array_2 = array; _i < array_2.length; _i++) {
        var v = array_2[_i];
        if (v) {
          if (isArray(v)) {
            addRange(result, v);
          } else {
            result.push(v);
          }
        }
      }
      return result;
    }
    ts2.flatten = flatten;
    function flatMap(array, mapfn) {
      var result;
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var v = mapfn(array[i], i);
          if (v) {
            if (isArray(v)) {
              result = addRange(result, v);
            } else {
              result = append(result, v);
            }
          }
        }
      }
      return result || ts2.emptyArray;
    }
    ts2.flatMap = flatMap;
    function flatMapToMutable(array, mapfn) {
      var result = [];
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var v = mapfn(array[i], i);
          if (v) {
            if (isArray(v)) {
              addRange(result, v);
            } else {
              result.push(v);
            }
          }
        }
      }
      return result;
    }
    ts2.flatMapToMutable = flatMapToMutable;
    function flatMapIterator(iter, mapfn) {
      var first2 = iter.next();
      if (first2.done) {
        return ts2.emptyIterator;
      }
      var currentIter = getIterator2(first2.value);
      return {
        next: function() {
          while (true) {
            var currentRes = currentIter.next();
            if (!currentRes.done) {
              return currentRes;
            }
            var iterRes = iter.next();
            if (iterRes.done) {
              return iterRes;
            }
            currentIter = getIterator2(iterRes.value);
          }
        }
      };
      function getIterator2(x) {
        var res = mapfn(x);
        return res === void 0 ? ts2.emptyIterator : isArray(res) ? arrayIterator(res) : res;
      }
    }
    ts2.flatMapIterator = flatMapIterator;
    function sameFlatMap(array, mapfn) {
      var result;
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var item = array[i];
          var mapped = mapfn(item, i);
          if (result || item !== mapped || isArray(mapped)) {
            if (!result) {
              result = array.slice(0, i);
            }
            if (isArray(mapped)) {
              addRange(result, mapped);
            } else {
              result.push(mapped);
            }
          }
        }
      }
      return result || array;
    }
    ts2.sameFlatMap = sameFlatMap;
    function mapAllOrFail(array, mapFn) {
      var result = [];
      for (var i = 0; i < array.length; i++) {
        var mapped = mapFn(array[i], i);
        if (mapped === void 0) {
          return void 0;
        }
        result.push(mapped);
      }
      return result;
    }
    ts2.mapAllOrFail = mapAllOrFail;
    function mapDefined(array, mapFn) {
      var result = [];
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var mapped = mapFn(array[i], i);
          if (mapped !== void 0) {
            result.push(mapped);
          }
        }
      }
      return result;
    }
    ts2.mapDefined = mapDefined;
    function mapDefinedIterator(iter, mapFn) {
      return {
        next: function() {
          while (true) {
            var res = iter.next();
            if (res.done) {
              return res;
            }
            var value = mapFn(res.value);
            if (value !== void 0) {
              return { value, done: false };
            }
          }
        }
      };
    }
    ts2.mapDefinedIterator = mapDefinedIterator;
    function mapDefinedEntries(map2, f) {
      if (!map2) {
        return void 0;
      }
      var result = new ts2.Map();
      map2.forEach(function(value, key) {
        var entry = f(key, value);
        if (entry !== void 0) {
          var newKey = entry[0], newValue = entry[1];
          if (newKey !== void 0 && newValue !== void 0) {
            result.set(newKey, newValue);
          }
        }
      });
      return result;
    }
    ts2.mapDefinedEntries = mapDefinedEntries;
    function mapDefinedValues(set, f) {
      if (set) {
        var result_1 = new ts2.Set();
        set.forEach(function(value) {
          var newValue = f(value);
          if (newValue !== void 0) {
            result_1.add(newValue);
          }
        });
        return result_1;
      }
    }
    ts2.mapDefinedValues = mapDefinedValues;
    function getOrUpdate(map2, key, callback) {
      if (map2.has(key)) {
        return map2.get(key);
      }
      var value = callback();
      map2.set(key, value);
      return value;
    }
    ts2.getOrUpdate = getOrUpdate;
    function tryAddToSet(set, value) {
      if (!set.has(value)) {
        set.add(value);
        return true;
      }
      return false;
    }
    ts2.tryAddToSet = tryAddToSet;
    ts2.emptyIterator = { next: function() {
      return { value: void 0, done: true };
    } };
    function singleIterator(value) {
      var done = false;
      return {
        next: function() {
          var wasDone = done;
          done = true;
          return wasDone ? { value: void 0, done: true } : { value, done: false };
        }
      };
    }
    ts2.singleIterator = singleIterator;
    function spanMap(array, keyfn, mapfn) {
      var result;
      if (array) {
        result = [];
        var len = array.length;
        var previousKey = void 0;
        var key = void 0;
        var start = 0;
        var pos = 0;
        while (start < len) {
          while (pos < len) {
            var value = array[pos];
            key = keyfn(value, pos);
            if (pos === 0) {
              previousKey = key;
            } else if (key !== previousKey) {
              break;
            }
            pos++;
          }
          if (start < pos) {
            var v = mapfn(array.slice(start, pos), previousKey, start, pos);
            if (v) {
              result.push(v);
            }
            start = pos;
          }
          previousKey = key;
          pos++;
        }
      }
      return result;
    }
    ts2.spanMap = spanMap;
    function mapEntries(map2, f) {
      if (!map2) {
        return void 0;
      }
      var result = new ts2.Map();
      map2.forEach(function(value, key) {
        var _a = f(key, value), newKey = _a[0], newValue = _a[1];
        result.set(newKey, newValue);
      });
      return result;
    }
    ts2.mapEntries = mapEntries;
    function some(array, predicate) {
      if (array) {
        if (predicate) {
          for (var _i = 0, array_3 = array; _i < array_3.length; _i++) {
            var v = array_3[_i];
            if (predicate(v)) {
              return true;
            }
          }
        } else {
          return array.length > 0;
        }
      }
      return false;
    }
    ts2.some = some;
    function getRangesWhere(arr, pred, cb) {
      var start;
      for (var i = 0; i < arr.length; i++) {
        if (pred(arr[i])) {
          start = start === void 0 ? i : start;
        } else {
          if (start !== void 0) {
            cb(start, i);
            start = void 0;
          }
        }
      }
      if (start !== void 0)
        cb(start, arr.length);
    }
    ts2.getRangesWhere = getRangesWhere;
    function concatenate(array1, array2) {
      if (!some(array2))
        return array1;
      if (!some(array1))
        return array2;
      return __spreadArray(__spreadArray([], array1, true), array2, true);
    }
    ts2.concatenate = concatenate;
    function selectIndex(_, i) {
      return i;
    }
    function indicesOf(array) {
      return array.map(selectIndex);
    }
    ts2.indicesOf = indicesOf;
    function deduplicateRelational(array, equalityComparer, comparer) {
      var indices = indicesOf(array);
      stableSortIndices(array, indices, comparer);
      var last2 = array[indices[0]];
      var deduplicated = [indices[0]];
      for (var i = 1; i < indices.length; i++) {
        var index = indices[i];
        var item = array[index];
        if (!equalityComparer(last2, item)) {
          deduplicated.push(index);
          last2 = item;
        }
      }
      deduplicated.sort();
      return deduplicated.map(function(i2) {
        return array[i2];
      });
    }
    function deduplicateEquality(array, equalityComparer) {
      var result = [];
      for (var _i = 0, array_4 = array; _i < array_4.length; _i++) {
        var item = array_4[_i];
        pushIfUnique(result, item, equalityComparer);
      }
      return result;
    }
    function deduplicate(array, equalityComparer, comparer) {
      return array.length === 0 ? [] : array.length === 1 ? array.slice() : comparer ? deduplicateRelational(array, equalityComparer, comparer) : deduplicateEquality(array, equalityComparer);
    }
    ts2.deduplicate = deduplicate;
    function deduplicateSorted(array, comparer) {
      if (array.length === 0)
        return ts2.emptyArray;
      var last2 = array[0];
      var deduplicated = [last2];
      for (var i = 1; i < array.length; i++) {
        var next = array[i];
        switch (comparer(next, last2)) {
          case true:
          case 0:
            continue;
          case -1:
            return ts2.Debug.fail("Array is unsorted.");
        }
        deduplicated.push(last2 = next);
      }
      return deduplicated;
    }
    function insertSorted(array, insert, compare) {
      if (array.length === 0) {
        array.push(insert);
        return;
      }
      var insertIndex = binarySearch(array, insert, identity, compare);
      if (insertIndex < 0) {
        array.splice(~insertIndex, 0, insert);
      }
    }
    ts2.insertSorted = insertSorted;
    function sortAndDeduplicate(array, comparer, equalityComparer) {
      return deduplicateSorted(sort(array, comparer), equalityComparer || comparer || compareStringsCaseSensitive);
    }
    ts2.sortAndDeduplicate = sortAndDeduplicate;
    function arrayIsSorted(array, comparer) {
      if (array.length < 2)
        return true;
      var prevElement = array[0];
      for (var _i = 0, _a = array.slice(1); _i < _a.length; _i++) {
        var element = _a[_i];
        if (comparer(prevElement, element) === 1) {
          return false;
        }
        prevElement = element;
      }
      return true;
    }
    ts2.arrayIsSorted = arrayIsSorted;
    function arrayIsEqualTo(array1, array2, equalityComparer) {
      if (equalityComparer === void 0) {
        equalityComparer = equateValues;
      }
      if (!array1 || !array2) {
        return array1 === array2;
      }
      if (array1.length !== array2.length) {
        return false;
      }
      for (var i = 0; i < array1.length; i++) {
        if (!equalityComparer(array1[i], array2[i], i)) {
          return false;
        }
      }
      return true;
    }
    ts2.arrayIsEqualTo = arrayIsEqualTo;
    function compact(array) {
      var result;
      if (array) {
        for (var i = 0; i < array.length; i++) {
          var v = array[i];
          if (result || !v) {
            if (!result) {
              result = array.slice(0, i);
            }
            if (v) {
              result.push(v);
            }
          }
        }
      }
      return result || array;
    }
    ts2.compact = compact;
    function relativeComplement(arrayA, arrayB, comparer) {
      if (!arrayB || !arrayA || arrayB.length === 0 || arrayA.length === 0)
        return arrayB;
      var result = [];
      loopB:
        for (var offsetA = 0, offsetB = 0; offsetB < arrayB.length; offsetB++) {
          if (offsetB > 0) {
            ts2.Debug.assertGreaterThanOrEqual(comparer(arrayB[offsetB], arrayB[offsetB - 1]), 0);
          }
          loopA:
            for (var startA = offsetA; offsetA < arrayA.length; offsetA++) {
              if (offsetA > startA) {
                ts2.Debug.assertGreaterThanOrEqual(comparer(arrayA[offsetA], arrayA[offsetA - 1]), 0);
              }
              switch (comparer(arrayB[offsetB], arrayA[offsetA])) {
                case -1:
                  result.push(arrayB[offsetB]);
                  continue loopB;
                case 0:
                  continue loopB;
                case 1:
                  continue loopA;
              }
            }
        }
      return result;
    }
    ts2.relativeComplement = relativeComplement;
    function sum(array, prop) {
      var result = 0;
      for (var _i = 0, array_5 = array; _i < array_5.length; _i++) {
        var v = array_5[_i];
        result += v[prop];
      }
      return result;
    }
    ts2.sum = sum;
    function append(to, value) {
      if (value === void 0)
        return to;
      if (to === void 0)
        return [value];
      to.push(value);
      return to;
    }
    ts2.append = append;
    function combine(xs, ys) {
      if (xs === void 0)
        return ys;
      if (ys === void 0)
        return xs;
      if (isArray(xs))
        return isArray(ys) ? concatenate(xs, ys) : append(xs, ys);
      if (isArray(ys))
        return append(ys, xs);
      return [xs, ys];
    }
    ts2.combine = combine;
    function toOffset(array, offset) {
      return offset < 0 ? array.length + offset : offset;
    }
    function addRange(to, from, start, end) {
      if (from === void 0 || from.length === 0)
        return to;
      if (to === void 0)
        return from.slice(start, end);
      start = start === void 0 ? 0 : toOffset(from, start);
      end = end === void 0 ? from.length : toOffset(from, end);
      for (var i = start; i < end && i < from.length; i++) {
        if (from[i] !== void 0) {
          to.push(from[i]);
        }
      }
      return to;
    }
    ts2.addRange = addRange;
    function pushIfUnique(array, toAdd, equalityComparer) {
      if (contains(array, toAdd, equalityComparer)) {
        return false;
      } else {
        array.push(toAdd);
        return true;
      }
    }
    ts2.pushIfUnique = pushIfUnique;
    function appendIfUnique(array, toAdd, equalityComparer) {
      if (array) {
        pushIfUnique(array, toAdd, equalityComparer);
        return array;
      } else {
        return [toAdd];
      }
    }
    ts2.appendIfUnique = appendIfUnique;
    function stableSortIndices(array, indices, comparer) {
      indices.sort(function(x, y) {
        return comparer(array[x], array[y]) || compareValues(x, y);
      });
    }
    function sort(array, comparer) {
      return array.length === 0 ? array : array.slice().sort(comparer);
    }
    ts2.sort = sort;
    function arrayIterator(array) {
      var i = 0;
      return { next: function() {
        if (i === array.length) {
          return { value: void 0, done: true };
        } else {
          i++;
          return { value: array[i - 1], done: false };
        }
      } };
    }
    ts2.arrayIterator = arrayIterator;
    function arrayReverseIterator(array) {
      var i = array.length;
      return {
        next: function() {
          if (i === 0) {
            return { value: void 0, done: true };
          } else {
            i--;
            return { value: array[i], done: false };
          }
        }
      };
    }
    ts2.arrayReverseIterator = arrayReverseIterator;
    function stableSort(array, comparer) {
      var indices = indicesOf(array);
      stableSortIndices(array, indices, comparer);
      return indices.map(function(i) {
        return array[i];
      });
    }
    ts2.stableSort = stableSort;
    function rangeEquals(array1, array2, pos, end) {
      while (pos < end) {
        if (array1[pos] !== array2[pos]) {
          return false;
        }
        pos++;
      }
      return true;
    }
    ts2.rangeEquals = rangeEquals;
    function elementAt(array, offset) {
      if (array) {
        offset = toOffset(array, offset);
        if (offset < array.length) {
          return array[offset];
        }
      }
      return void 0;
    }
    ts2.elementAt = elementAt;
    function firstOrUndefined(array) {
      return array.length === 0 ? void 0 : array[0];
    }
    ts2.firstOrUndefined = firstOrUndefined;
    function first(array) {
      ts2.Debug.assert(array.length !== 0);
      return array[0];
    }
    ts2.first = first;
    function lastOrUndefined(array) {
      return array.length === 0 ? void 0 : array[array.length - 1];
    }
    ts2.lastOrUndefined = lastOrUndefined;
    function last(array) {
      ts2.Debug.assert(array.length !== 0);
      return array[array.length - 1];
    }
    ts2.last = last;
    function singleOrUndefined(array) {
      return array && array.length === 1 ? array[0] : void 0;
    }
    ts2.singleOrUndefined = singleOrUndefined;
    function singleOrMany(array) {
      return array && array.length === 1 ? array[0] : array;
    }
    ts2.singleOrMany = singleOrMany;
    function replaceElement(array, index, value) {
      var result = array.slice(0);
      result[index] = value;
      return result;
    }
    ts2.replaceElement = replaceElement;
    function binarySearch(array, value, keySelector, keyComparer, offset) {
      return binarySearchKey(array, keySelector(value), keySelector, keyComparer, offset);
    }
    ts2.binarySearch = binarySearch;
    function binarySearchKey(array, key, keySelector, keyComparer, offset) {
      if (!some(array)) {
        return -1;
      }
      var low = offset || 0;
      var high = array.length - 1;
      while (low <= high) {
        var middle = low + (high - low >> 1);
        var midKey = keySelector(array[middle], middle);
        switch (keyComparer(midKey, key)) {
          case -1:
            low = middle + 1;
            break;
          case 0:
            return middle;
          case 1:
            high = middle - 1;
            break;
        }
      }
      return ~low;
    }
    ts2.binarySearchKey = binarySearchKey;
    function reduceLeft(array, f, initial, start, count) {
      if (array && array.length > 0) {
        var size = array.length;
        if (size > 0) {
          var pos = start === void 0 || start < 0 ? 0 : start;
          var end = count === void 0 || pos + count > size - 1 ? size - 1 : pos + count;
          var result = void 0;
          if (arguments.length <= 2) {
            result = array[pos];
            pos++;
          } else {
            result = initial;
          }
          while (pos <= end) {
            result = f(result, array[pos], pos);
            pos++;
          }
          return result;
        }
      }
      return initial;
    }
    ts2.reduceLeft = reduceLeft;
    var hasOwnProperty = Object.prototype.hasOwnProperty;
    function hasProperty(map2, key) {
      return hasOwnProperty.call(map2, key);
    }
    ts2.hasProperty = hasProperty;
    function getProperty(map2, key) {
      return hasOwnProperty.call(map2, key) ? map2[key] : void 0;
    }
    ts2.getProperty = getProperty;
    function getOwnKeys(map2) {
      var keys = [];
      for (var key in map2) {
        if (hasOwnProperty.call(map2, key)) {
          keys.push(key);
        }
      }
      return keys;
    }
    ts2.getOwnKeys = getOwnKeys;
    function getAllKeys(obj) {
      var result = [];
      do {
        var names = Object.getOwnPropertyNames(obj);
        for (var _i = 0, names_1 = names; _i < names_1.length; _i++) {
          var name = names_1[_i];
          pushIfUnique(result, name);
        }
      } while (obj = Object.getPrototypeOf(obj));
      return result;
    }
    ts2.getAllKeys = getAllKeys;
    function getOwnValues(sparseArray) {
      var values = [];
      for (var key in sparseArray) {
        if (hasOwnProperty.call(sparseArray, key)) {
          values.push(sparseArray[key]);
        }
      }
      return values;
    }
    ts2.getOwnValues = getOwnValues;
    var _entries = Object.entries || function(obj) {
      var keys = getOwnKeys(obj);
      var result = Array(keys.length);
      for (var i = 0; i < keys.length; i++) {
        result[i] = [keys[i], obj[keys[i]]];
      }
      return result;
    };
    function getEntries(obj) {
      return obj ? _entries(obj) : [];
    }
    ts2.getEntries = getEntries;
    function arrayOf(count, f) {
      var result = new Array(count);
      for (var i = 0; i < count; i++) {
        result[i] = f(i);
      }
      return result;
    }
    ts2.arrayOf = arrayOf;
    function arrayFrom(iterator, map2) {
      var result = [];
      for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
        result.push(map2 ? map2(iterResult.value) : iterResult.value);
      }
      return result;
    }
    ts2.arrayFrom = arrayFrom;
    function assign(t) {
      var args = [];
      for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
      }
      for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {
        var arg = args_1[_a];
        if (arg === void 0)
          continue;
        for (var p in arg) {
          if (hasProperty(arg, p)) {
            t[p] = arg[p];
          }
        }
      }
      return t;
    }
    ts2.assign = assign;
    function equalOwnProperties(left, right, equalityComparer) {
      if (equalityComparer === void 0) {
        equalityComparer = equateValues;
      }
      if (left === right)
        return true;
      if (!left || !right)
        return false;
      for (var key in left) {
        if (hasOwnProperty.call(left, key)) {
          if (!hasOwnProperty.call(right, key))
            return false;
          if (!equalityComparer(left[key], right[key]))
            return false;
        }
      }
      for (var key in right) {
        if (hasOwnProperty.call(right, key)) {
          if (!hasOwnProperty.call(left, key))
            return false;
        }
      }
      return true;
    }
    ts2.equalOwnProperties = equalOwnProperties;
    function arrayToMap(array, makeKey, makeValue) {
      if (makeValue === void 0) {
        makeValue = identity;
      }
      var result = new ts2.Map();
      for (var _i = 0, array_6 = array; _i < array_6.length; _i++) {
        var value = array_6[_i];
        var key = makeKey(value);
        if (key !== void 0)
          result.set(key, makeValue(value));
      }
      return result;
    }
    ts2.arrayToMap = arrayToMap;
    function arrayToNumericMap(array, makeKey, makeValue) {
      if (makeValue === void 0) {
        makeValue = identity;
      }
      var result = [];
      for (var _i = 0, array_7 = array; _i < array_7.length; _i++) {
        var value = array_7[_i];
        result[makeKey(value)] = makeValue(value);
      }
      return result;
    }
    ts2.arrayToNumericMap = arrayToNumericMap;
    function arrayToMultiMap(values, makeKey, makeValue) {
      if (makeValue === void 0) {
        makeValue = identity;
      }
      var result = createMultiMap();
      for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
        var value = values_1[_i];
        result.add(makeKey(value), makeValue(value));
      }
      return result;
    }
    ts2.arrayToMultiMap = arrayToMultiMap;
    function group(values, getGroupId, resultSelector) {
      if (resultSelector === void 0) {
        resultSelector = identity;
      }
      return arrayFrom(arrayToMultiMap(values, getGroupId).values(), resultSelector);
    }
    ts2.group = group;
    function clone(object) {
      var result = {};
      for (var id in object) {
        if (hasOwnProperty.call(object, id)) {
          result[id] = object[id];
        }
      }
      return result;
    }
    ts2.clone = clone;
    function extend(first2, second) {
      var result = {};
      for (var id in second) {
        if (hasOwnProperty.call(second, id)) {
          result[id] = second[id];
        }
      }
      for (var id in first2) {
        if (hasOwnProperty.call(first2, id)) {
          result[id] = first2[id];
        }
      }
      return result;
    }
    ts2.extend = extend;
    function copyProperties(first2, second) {
      for (var id in second) {
        if (hasOwnProperty.call(second, id)) {
          first2[id] = second[id];
        }
      }
    }
    ts2.copyProperties = copyProperties;
    function maybeBind(obj, fn) {
      return fn ? fn.bind(obj) : void 0;
    }
    ts2.maybeBind = maybeBind;
    function createMultiMap() {
      var map2 = new ts2.Map();
      map2.add = multiMapAdd;
      map2.remove = multiMapRemove;
      return map2;
    }
    ts2.createMultiMap = createMultiMap;
    function multiMapAdd(key, value) {
      var values = this.get(key);
      if (values) {
        values.push(value);
      } else {
        this.set(key, values = [value]);
      }
      return values;
    }
    function multiMapRemove(key, value) {
      var values = this.get(key);
      if (values) {
        unorderedRemoveItem(values, value);
        if (!values.length) {
          this.delete(key);
        }
      }
    }
    function createUnderscoreEscapedMultiMap() {
      return createMultiMap();
    }
    ts2.createUnderscoreEscapedMultiMap = createUnderscoreEscapedMultiMap;
    function isArray(value) {
      return Array.isArray ? Array.isArray(value) : value instanceof Array;
    }
    ts2.isArray = isArray;
    function toArray(value) {
      return isArray(value) ? value : [value];
    }
    ts2.toArray = toArray;
    function isString(text) {
      return typeof text === "string";
    }
    ts2.isString = isString;
    function isNumber(x) {
      return typeof x === "number";
    }
    ts2.isNumber = isNumber;
    function tryCast(value, test) {
      return value !== void 0 && test(value) ? value : void 0;
    }
    ts2.tryCast = tryCast;
    function cast(value, test) {
      if (value !== void 0 && test(value))
        return value;
      return ts2.Debug.fail("Invalid cast. The supplied value ".concat(value, " did not pass the test '").concat(ts2.Debug.getFunctionName(test), "'."));
    }
    ts2.cast = cast;
    function noop(_) {
    }
    ts2.noop = noop;
    function returnFalse() {
      return false;
    }
    ts2.returnFalse = returnFalse;
    function returnTrue() {
      return true;
    }
    ts2.returnTrue = returnTrue;
    function returnUndefined() {
      return void 0;
    }
    ts2.returnUndefined = returnUndefined;
    function identity(x) {
      return x;
    }
    ts2.identity = identity;
    function toLowerCase(x) {
      return x.toLowerCase();
    }
    ts2.toLowerCase = toLowerCase;
    var fileNameLowerCaseRegExp = /[^\u0130\u0131\u00DFa-z0-9\\/:\-_\. ]+/g;
    function toFileNameLowerCase(x) {
      return fileNameLowerCaseRegExp.test(x) ? x.replace(fileNameLowerCaseRegExp, toLowerCase) : x;
    }
    ts2.toFileNameLowerCase = toFileNameLowerCase;
    function notImplemented() {
      throw new Error("Not implemented");
    }
    ts2.notImplemented = notImplemented;
    function memoize(callback) {
      var value;
      return function() {
        if (callback) {
          value = callback();
          callback = void 0;
        }
        return value;
      };
    }
    ts2.memoize = memoize;
    function memoizeOne(callback) {
      var map2 = new ts2.Map();
      return function(arg) {
        var key = "".concat(typeof arg, ":").concat(arg);
        var value = map2.get(key);
        if (value === void 0 && !map2.has(key)) {
          value = callback(arg);
          map2.set(key, value);
        }
        return value;
      };
    }
    ts2.memoizeOne = memoizeOne;
    function compose(a, b, c, d, e) {
      if (!!e) {
        var args_2 = [];
        for (var i = 0; i < arguments.length; i++) {
          args_2[i] = arguments[i];
        }
        return function(t) {
          return reduceLeft(args_2, function(u, f) {
            return f(u);
          }, t);
        };
      } else if (d) {
        return function(t) {
          return d(c(b(a(t))));
        };
      } else if (c) {
        return function(t) {
          return c(b(a(t)));
        };
      } else if (b) {
        return function(t) {
          return b(a(t));
        };
      } else if (a) {
        return function(t) {
          return a(t);
        };
      } else {
        return function(t) {
          return t;
        };
      }
    }
    ts2.compose = compose;
    var AssertionLevel;
    (function(AssertionLevel2) {
      AssertionLevel2[AssertionLevel2["None"] = 0] = "None";
      AssertionLevel2[AssertionLevel2["Normal"] = 1] = "Normal";
      AssertionLevel2[AssertionLevel2["Aggressive"] = 2] = "Aggressive";
      AssertionLevel2[AssertionLevel2["VeryAggressive"] = 3] = "VeryAggressive";
    })(AssertionLevel = ts2.AssertionLevel || (ts2.AssertionLevel = {}));
    function equateValues(a, b) {
      return a === b;
    }
    ts2.equateValues = equateValues;
    function equateStringsCaseInsensitive(a, b) {
      return a === b || a !== void 0 && b !== void 0 && a.toUpperCase() === b.toUpperCase();
    }
    ts2.equateStringsCaseInsensitive = equateStringsCaseInsensitive;
    function equateStringsCaseSensitive(a, b) {
      return equateValues(a, b);
    }
    ts2.equateStringsCaseSensitive = equateStringsCaseSensitive;
    function compareComparableValues(a, b) {
      return a === b ? 0 : a === void 0 ? -1 : b === void 0 ? 1 : a < b ? -1 : 1;
    }
    function compareValues(a, b) {
      return compareComparableValues(a, b);
    }
    ts2.compareValues = compareValues;
    function compareTextSpans(a, b) {
      return compareValues(a === null || a === void 0 ? void 0 : a.start, b === null || b === void 0 ? void 0 : b.start) || compareValues(a === null || a === void 0 ? void 0 : a.length, b === null || b === void 0 ? void 0 : b.length);
    }
    ts2.compareTextSpans = compareTextSpans;
    function min(a, b, compare) {
      return compare(a, b) === -1 ? a : b;
    }
    ts2.min = min;
    function compareStringsCaseInsensitive(a, b) {
      if (a === b)
        return 0;
      if (a === void 0)
        return -1;
      if (b === void 0)
        return 1;
      a = a.toUpperCase();
      b = b.toUpperCase();
      return a < b ? -1 : a > b ? 1 : 0;
    }
    ts2.compareStringsCaseInsensitive = compareStringsCaseInsensitive;
    function compareStringsCaseSensitive(a, b) {
      return compareComparableValues(a, b);
    }
    ts2.compareStringsCaseSensitive = compareStringsCaseSensitive;
    function getStringComparer(ignoreCase) {
      return ignoreCase ? compareStringsCaseInsensitive : compareStringsCaseSensitive;
    }
    ts2.getStringComparer = getStringComparer;
    var createUIStringComparer = function() {
      var defaultComparer;
      var enUSComparer;
      var stringComparerFactory = getStringComparerFactory();
      return createStringComparer;
      function compareWithCallback(a, b, comparer) {
        if (a === b)
          return 0;
        if (a === void 0)
          return -1;
        if (b === void 0)
          return 1;
        var value = comparer(a, b);
        return value < 0 ? -1 : value > 0 ? 1 : 0;
      }
      function createIntlCollatorStringComparer(locale) {
        var comparer = new Intl.Collator(locale, { usage: "sort", sensitivity: "variant" }).compare;
        return function(a, b) {
          return compareWithCallback(a, b, comparer);
        };
      }
      function createLocaleCompareStringComparer(locale) {
        if (locale !== void 0)
          return createFallbackStringComparer();
        return function(a, b) {
          return compareWithCallback(a, b, compareStrings);
        };
        function compareStrings(a, b) {
          return a.localeCompare(b);
        }
      }
      function createFallbackStringComparer() {
        return function(a, b) {
          return compareWithCallback(a, b, compareDictionaryOrder);
        };
        function compareDictionaryOrder(a, b) {
          return compareStrings(a.toUpperCase(), b.toUpperCase()) || compareStrings(a, b);
        }
        function compareStrings(a, b) {
          return a < b ? -1 : a > b ? 1 : 0;
        }
      }
      function getStringComparerFactory() {
        if (typeof Intl === "object" && typeof Intl.Collator === "function") {
          return createIntlCollatorStringComparer;
        }
        if (typeof String.prototype.localeCompare === "function" && typeof String.prototype.toLocaleUpperCase === "function" && "a".localeCompare("B") < 0) {
          return createLocaleCompareStringComparer;
        }
        return createFallbackStringComparer;
      }
      function createStringComparer(locale) {
        if (locale === void 0) {
          return defaultComparer || (defaultComparer = stringComparerFactory(locale));
        } else if (locale === "en-US") {
          return enUSComparer || (enUSComparer = stringComparerFactory(locale));
        } else {
          return stringComparerFactory(locale);
        }
      }
    }();
    var uiComparerCaseSensitive;
    var uiLocale;
    function getUILocale() {
      return uiLocale;
    }
    ts2.getUILocale = getUILocale;
    function setUILocale(value) {
      if (uiLocale !== value) {
        uiLocale = value;
        uiComparerCaseSensitive = void 0;
      }
    }
    ts2.setUILocale = setUILocale;
    function compareStringsCaseSensitiveUI(a, b) {
      var comparer = uiComparerCaseSensitive || (uiComparerCaseSensitive = createUIStringComparer(uiLocale));
      return comparer(a, b);
    }
    ts2.compareStringsCaseSensitiveUI = compareStringsCaseSensitiveUI;
    function compareProperties(a, b, key, comparer) {
      return a === b ? 0 : a === void 0 ? -1 : b === void 0 ? 1 : comparer(a[key], b[key]);
    }
    ts2.compareProperties = compareProperties;
    function compareBooleans(a, b) {
      return compareValues(a ? 1 : 0, b ? 1 : 0);
    }
    ts2.compareBooleans = compareBooleans;
    function getSpellingSuggestion(name, candidates, getName) {
      var maximumLengthDifference = Math.min(2, Math.floor(name.length * 0.34));
      var bestDistance = Math.floor(name.length * 0.4) + 1;
      var bestCandidate;
      for (var _i = 0, candidates_1 = candidates; _i < candidates_1.length; _i++) {
        var candidate = candidates_1[_i];
        var candidateName = getName(candidate);
        if (candidateName !== void 0 && Math.abs(candidateName.length - name.length) <= maximumLengthDifference) {
          if (candidateName === name) {
            continue;
          }
          if (candidateName.length < 3 && candidateName.toLowerCase() !== name.toLowerCase()) {
            continue;
          }
          var distance = levenshteinWithMax(name, candidateName, bestDistance - 0.1);
          if (distance === void 0) {
            continue;
          }
          ts2.Debug.assert(distance < bestDistance);
          bestDistance = distance;
          bestCandidate = candidate;
        }
      }
      return bestCandidate;
    }
    ts2.getSpellingSuggestion = getSpellingSuggestion;
    function levenshteinWithMax(s1, s2, max) {
      var previous = new Array(s2.length + 1);
      var current = new Array(s2.length + 1);
      var big = max + 0.01;
      for (var i = 0; i <= s2.length; i++) {
        previous[i] = i;
      }
      for (var i = 1; i <= s1.length; i++) {
        var c1 = s1.charCodeAt(i - 1);
        var minJ = Math.ceil(i > max ? i - max : 1);
        var maxJ = Math.floor(s2.length > max + i ? max + i : s2.length);
        current[0] = i;
        var colMin = i;
        for (var j = 1; j < minJ; j++) {
          current[j] = big;
        }
        for (var j = minJ; j <= maxJ; j++) {
          var substitutionDistance = s1[i - 1].toLowerCase() === s2[j - 1].toLowerCase() ? previous[j - 1] + 0.1 : previous[j - 1] + 2;
          var dist = c1 === s2.charCodeAt(j - 1) ? previous[j - 1] : Math.min(previous[j] + 1, current[j - 1] + 1, substitutionDistance);
          current[j] = dist;
          colMin = Math.min(colMin, dist);
        }
        for (var j = maxJ + 1; j <= s2.length; j++) {
          current[j] = big;
        }
        if (colMin > max) {
          return void 0;
        }
        var temp = previous;
        previous = current;
        current = temp;
      }
      var res = previous[s2.length];
      return res > max ? void 0 : res;
    }
    function endsWith(str, suffix) {
      var expectedPos = str.length - suffix.length;
      return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos;
    }
    ts2.endsWith = endsWith;
    function removeSuffix(str, suffix) {
      return endsWith(str, suffix) ? str.slice(0, str.length - suffix.length) : str;
    }
    ts2.removeSuffix = removeSuffix;
    function tryRemoveSuffix(str, suffix) {
      return endsWith(str, suffix) ? str.slice(0, str.length - suffix.length) : void 0;
    }
    ts2.tryRemoveSuffix = tryRemoveSuffix;
    function stringContains(str, substring) {
      return str.indexOf(substring) !== -1;
    }
    ts2.stringContains = stringContains;
    function removeMinAndVersionNumbers(fileName) {
      var end = fileName.length;
      for (var pos = end - 1; pos > 0; pos--) {
        var ch = fileName.charCodeAt(pos);
        if (ch >= 48 && ch <= 57) {
          do {
            --pos;
            ch = fileName.charCodeAt(pos);
          } while (pos > 0 && ch >= 48 && ch <= 57);
        } else if (pos > 4 && (ch === 110 || ch === 78)) {
          --pos;
          ch = fileName.charCodeAt(pos);
          if (ch !== 105 && ch !== 73) {
            break;
          }
          --pos;
          ch = fileName.charCodeAt(pos);
          if (ch !== 109 && ch !== 77) {
            break;
          }
          --pos;
          ch = fileName.charCodeAt(pos);
        } else {
          break;
        }
        if (ch !== 45 && ch !== 46) {
          break;
        }
        end = pos;
      }
      return end === fileName.length ? fileName : fileName.slice(0, end);
    }
    ts2.removeMinAndVersionNumbers = removeMinAndVersionNumbers;
    function orderedRemoveItem(array, item) {
      for (var i = 0; i < array.length; i++) {
        if (array[i] === item) {
          orderedRemoveItemAt(array, i);
          return true;
        }
      }
      return false;
    }
    ts2.orderedRemoveItem = orderedRemoveItem;
    function orderedRemoveItemAt(array, index) {
      for (var i = index; i < array.length - 1; i++) {
        array[i] = array[i + 1];
      }
      array.pop();
    }
    ts2.orderedRemoveItemAt = orderedRemoveItemAt;
    function unorderedRemoveItemAt(array, index) {
      array[index] = array[array.length - 1];
      array.pop();
    }
    ts2.unorderedRemoveItemAt = unorderedRemoveItemAt;
    function unorderedRemoveItem(array, item) {
      return unorderedRemoveFirstItemWhere(array, function(element) {
        return element === item;
      });
    }
    ts2.unorderedRemoveItem = unorderedRemoveItem;
    function unorderedRemoveFirstItemWhere(array, predicate) {
      for (var i = 0; i < array.length; i++) {
        if (predicate(array[i])) {
          unorderedRemoveItemAt(array, i);
          return true;
        }
      }
      return false;
    }
    function createGetCanonicalFileName(useCaseSensitiveFileNames) {
      return useCaseSensitiveFileNames ? identity : toFileNameLowerCase;
    }
    ts2.createGetCanonicalFileName = createGetCanonicalFileName;
    function patternText(_a) {
      var prefix = _a.prefix, suffix = _a.suffix;
      return "".concat(prefix, "*").concat(suffix);
    }
    ts2.patternText = patternText;
    function matchedText(pattern, candidate) {
      ts2.Debug.assert(isPatternMatch(pattern, candidate));
      return candidate.substring(pattern.prefix.length, candidate.length - pattern.suffix.length);
    }
    ts2.matchedText = matchedText;
    function findBestPatternMatch(values, getPattern, candidate) {
      var matchedValue;
      var longestMatchPrefixLength = -1;
      for (var _i = 0, values_2 = values; _i < values_2.length; _i++) {
        var v = values_2[_i];
        var pattern = getPattern(v);
        if (isPatternMatch(pattern, candidate) && pattern.prefix.length > longestMatchPrefixLength) {
          longestMatchPrefixLength = pattern.prefix.length;
          matchedValue = v;
        }
      }
      return matchedValue;
    }
    ts2.findBestPatternMatch = findBestPatternMatch;
    function startsWith(str, prefix) {
      return str.lastIndexOf(prefix, 0) === 0;
    }
    ts2.startsWith = startsWith;
    function removePrefix(str, prefix) {
      return startsWith(str, prefix) ? str.substr(prefix.length) : str;
    }
    ts2.removePrefix = removePrefix;
    function tryRemovePrefix(str, prefix, getCanonicalFileName) {
      if (getCanonicalFileName === void 0) {
        getCanonicalFileName = identity;
      }
      return startsWith(getCanonicalFileName(str), getCanonicalFileName(prefix)) ? str.substring(prefix.length) : void 0;
    }
    ts2.tryRemovePrefix = tryRemovePrefix;
    function isPatternMatch(_a, candidate) {
      var prefix = _a.prefix, suffix = _a.suffix;
      return candidate.length >= prefix.length + suffix.length && startsWith(candidate, prefix) && endsWith(candidate, suffix);
    }
    function and(f, g) {
      return function(arg) {
        return f(arg) && g(arg);
      };
    }
    ts2.and = and;
    function or() {
      var fs = [];
      for (var _i = 0; _i < arguments.length; _i++) {
        fs[_i] = arguments[_i];
      }
      return function() {
        var args = [];
        for (var _i2 = 0; _i2 < arguments.length; _i2++) {
          args[_i2] = arguments[_i2];
        }
        for (var _a = 0, fs_1 = fs; _a < fs_1.length; _a++) {
          var f = fs_1[_a];
          if (f.apply(void 0, args)) {
            return true;
          }
        }
        return false;
      };
    }
    ts2.or = or;
    function not(fn) {
      return function() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i];
        }
        return !fn.apply(void 0, args);
      };
    }
    ts2.not = not;
    function assertType(_) {
    }
    ts2.assertType = assertType;
    function singleElementArray(t) {
      return t === void 0 ? void 0 : [t];
    }
    ts2.singleElementArray = singleElementArray;
    function enumerateInsertsAndDeletes(newItems, oldItems, comparer, inserted, deleted, unchanged) {
      unchanged = unchanged || noop;
      var newIndex = 0;
      var oldIndex = 0;
      var newLen = newItems.length;
      var oldLen = oldItems.length;
      var hasChanges = false;
      while (newIndex < newLen && oldIndex < oldLen) {
        var newItem = newItems[newIndex];
        var oldItem = oldItems[oldIndex];
        var compareResult = comparer(newItem, oldItem);
        if (compareResult === -1) {
          inserted(newItem);
          newIndex++;
          hasChanges = true;
        } else if (compareResult === 1) {
          deleted(oldItem);
          oldIndex++;
          hasChanges = true;
        } else {
          unchanged(oldItem, newItem);
          newIndex++;
          oldIndex++;
        }
      }
      while (newIndex < newLen) {
        inserted(newItems[newIndex++]);
        hasChanges = true;
      }
      while (oldIndex < oldLen) {
        deleted(oldItems[oldIndex++]);
        hasChanges = true;
      }
      return hasChanges;
    }
    ts2.enumerateInsertsAndDeletes = enumerateInsertsAndDeletes;
    function fill(length2, cb) {
      var result = Array(length2);
      for (var i = 0; i < length2; i++) {
        result[i] = cb(i);
      }
      return result;
    }
    ts2.fill = fill;
    function cartesianProduct(arrays) {
      var result = [];
      cartesianProductWorker(arrays, result, void 0, 0);
      return result;
    }
    ts2.cartesianProduct = cartesianProduct;
    function cartesianProductWorker(arrays, result, outer, index) {
      for (var _i = 0, _a = arrays[index]; _i < _a.length; _i++) {
        var element = _a[_i];
        var inner = void 0;
        if (outer) {
          inner = outer.slice();
          inner.push(element);
        } else {
          inner = [element];
        }
        if (index === arrays.length - 1) {
          result.push(inner);
        } else {
          cartesianProductWorker(arrays, result, inner, index + 1);
        }
      }
    }
    function padLeft(s, length2, padString) {
      if (padString === void 0) {
        padString = " ";
      }
      return length2 <= s.length ? s : padString.repeat(length2 - s.length) + s;
    }
    ts2.padLeft = padLeft;
    function padRight(s, length2, padString) {
      if (padString === void 0) {
        padString = " ";
      }
      return length2 <= s.length ? s : s + padString.repeat(length2 - s.length);
    }
    ts2.padRight = padRight;
    function takeWhile(array, predicate) {
      var len = array.length;
      var index = 0;
      while (index < len && predicate(array[index])) {
        index++;
      }
      return array.slice(0, index);
    }
    ts2.takeWhile = takeWhile;
    ts2.trimString = !!String.prototype.trim ? function(s) {
      return s.trim();
    } : function(s) {
      return ts2.trimStringEnd(ts2.trimStringStart(s));
    };
    ts2.trimStringEnd = !!String.prototype.trimEnd ? function(s) {
      return s.trimEnd();
    } : trimEndImpl;
    ts2.trimStringStart = !!String.prototype.trimStart ? function(s) {
      return s.trimStart();
    } : function(s) {
      return s.replace(/^\s+/g, "");
    };
    function trimEndImpl(s) {
      var end = s.length - 1;
      while (end >= 0) {
        if (!ts2.isWhiteSpaceLike(s.charCodeAt(end)))
          break;
        end--;
      }
      return s.slice(0, end + 1);
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var LogLevel;
    (function(LogLevel2) {
      LogLevel2[LogLevel2["Off"] = 0] = "Off";
      LogLevel2[LogLevel2["Error"] = 1] = "Error";
      LogLevel2[LogLevel2["Warning"] = 2] = "Warning";
      LogLevel2[LogLevel2["Info"] = 3] = "Info";
      LogLevel2[LogLevel2["Verbose"] = 4] = "Verbose";
    })(LogLevel = ts2.LogLevel || (ts2.LogLevel = {}));
    var Debug;
    (function(Debug2) {
      var typeScriptVersion;
      var currentAssertionLevel = 0;
      Debug2.currentLogLevel = LogLevel.Warning;
      Debug2.isDebugging = false;
      function getTypeScriptVersion() {
        return typeScriptVersion !== null && typeScriptVersion !== void 0 ? typeScriptVersion : typeScriptVersion = new ts2.Version(ts2.version);
      }
      Debug2.getTypeScriptVersion = getTypeScriptVersion;
      function shouldLog(level) {
        return Debug2.currentLogLevel <= level;
      }
      Debug2.shouldLog = shouldLog;
      function logMessage(level, s) {
        if (Debug2.loggingHost && shouldLog(level)) {
          Debug2.loggingHost.log(level, s);
        }
      }
      function log(s) {
        logMessage(LogLevel.Info, s);
      }
      Debug2.log = log;
      (function(log_1) {
        function error(s) {
          logMessage(LogLevel.Error, s);
        }
        log_1.error = error;
        function warn(s) {
          logMessage(LogLevel.Warning, s);
        }
        log_1.warn = warn;
        function log2(s) {
          logMessage(LogLevel.Info, s);
        }
        log_1.log = log2;
        function trace(s) {
          logMessage(LogLevel.Verbose, s);
        }
        log_1.trace = trace;
      })(log = Debug2.log || (Debug2.log = {}));
      var assertionCache = {};
      function getAssertionLevel() {
        return currentAssertionLevel;
      }
      Debug2.getAssertionLevel = getAssertionLevel;
      function setAssertionLevel(level) {
        var prevAssertionLevel = currentAssertionLevel;
        currentAssertionLevel = level;
        if (level > prevAssertionLevel) {
          for (var _i = 0, _a = ts2.getOwnKeys(assertionCache); _i < _a.length; _i++) {
            var key = _a[_i];
            var cachedFunc = assertionCache[key];
            if (cachedFunc !== void 0 && Debug2[key] !== cachedFunc.assertion && level >= cachedFunc.level) {
              Debug2[key] = cachedFunc;
              assertionCache[key] = void 0;
            }
          }
        }
      }
      Debug2.setAssertionLevel = setAssertionLevel;
      function shouldAssert(level) {
        return currentAssertionLevel >= level;
      }
      Debug2.shouldAssert = shouldAssert;
      function shouldAssertFunction(level, name) {
        if (!shouldAssert(level)) {
          assertionCache[name] = { level, assertion: Debug2[name] };
          Debug2[name] = ts2.noop;
          return false;
        }
        return true;
      }
      function fail(message, stackCrawlMark) {
        var e = new Error(message ? "Debug Failure. ".concat(message) : "Debug Failure.");
        if (Error.captureStackTrace) {
          Error.captureStackTrace(e, stackCrawlMark || fail);
        }
        throw e;
      }
      Debug2.fail = fail;
      function failBadSyntaxKind(node, message, stackCrawlMark) {
        return fail("".concat(message || "Unexpected node.", "\r\nNode ").concat(formatSyntaxKind(node.kind), " was unexpected."), stackCrawlMark || failBadSyntaxKind);
      }
      Debug2.failBadSyntaxKind = failBadSyntaxKind;
      function assert(expression, message, verboseDebugInfo, stackCrawlMark) {
        if (!expression) {
          message = message ? "False expression: ".concat(message) : "False expression.";
          if (verboseDebugInfo) {
            message += "\r\nVerbose Debug Information: " + (typeof verboseDebugInfo === "string" ? verboseDebugInfo : verboseDebugInfo());
          }
          fail(message, stackCrawlMark || assert);
        }
      }
      Debug2.assert = assert;
      function assertEqual(a, b, msg, msg2, stackCrawlMark) {
        if (a !== b) {
          var message = msg ? msg2 ? "".concat(msg, " ").concat(msg2) : msg : "";
          fail("Expected ".concat(a, " === ").concat(b, ". ").concat(message), stackCrawlMark || assertEqual);
        }
      }
      Debug2.assertEqual = assertEqual;
      function assertLessThan(a, b, msg, stackCrawlMark) {
        if (a >= b) {
          fail("Expected ".concat(a, " < ").concat(b, ". ").concat(msg || ""), stackCrawlMark || assertLessThan);
        }
      }
      Debug2.assertLessThan = assertLessThan;
      function assertLessThanOrEqual(a, b, stackCrawlMark) {
        if (a > b) {
          fail("Expected ".concat(a, " <= ").concat(b), stackCrawlMark || assertLessThanOrEqual);
        }
      }
      Debug2.assertLessThanOrEqual = assertLessThanOrEqual;
      function assertGreaterThanOrEqual(a, b, stackCrawlMark) {
        if (a < b) {
          fail("Expected ".concat(a, " >= ").concat(b), stackCrawlMark || assertGreaterThanOrEqual);
        }
      }
      Debug2.assertGreaterThanOrEqual = assertGreaterThanOrEqual;
      function assertIsDefined(value, message, stackCrawlMark) {
        if (value === void 0 || value === null) {
          fail(message, stackCrawlMark || assertIsDefined);
        }
      }
      Debug2.assertIsDefined = assertIsDefined;
      function checkDefined(value, message, stackCrawlMark) {
        assertIsDefined(value, message, stackCrawlMark || checkDefined);
        return value;
      }
      Debug2.checkDefined = checkDefined;
      Debug2.assertDefined = checkDefined;
      function assertEachIsDefined(value, message, stackCrawlMark) {
        for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
          var v = value_1[_i];
          assertIsDefined(v, message, stackCrawlMark || assertEachIsDefined);
        }
      }
      Debug2.assertEachIsDefined = assertEachIsDefined;
      function checkEachDefined(value, message, stackCrawlMark) {
        assertEachIsDefined(value, message, stackCrawlMark || checkEachDefined);
        return value;
      }
      Debug2.checkEachDefined = checkEachDefined;
      Debug2.assertEachDefined = checkEachDefined;
      function assertNever(member, message, stackCrawlMark) {
        if (message === void 0) {
          message = "Illegal value:";
        }
        var detail = typeof member === "object" && ts2.hasProperty(member, "kind") && ts2.hasProperty(member, "pos") && formatSyntaxKind ? "SyntaxKind: " + formatSyntaxKind(member.kind) : JSON.stringify(member);
        return fail("".concat(message, " ").concat(detail), stackCrawlMark || assertNever);
      }
      Debug2.assertNever = assertNever;
      function assertEachNode(nodes, test, message, stackCrawlMark) {
        if (shouldAssertFunction(1, "assertEachNode")) {
          assert(test === void 0 || ts2.every(nodes, test), message || "Unexpected node.", function() {
            return "Node array did not pass test '".concat(getFunctionName(test), "'.");
          }, stackCrawlMark || assertEachNode);
        }
      }
      Debug2.assertEachNode = assertEachNode;
      function assertNode(node, test, message, stackCrawlMark) {
        if (shouldAssertFunction(1, "assertNode")) {
          assert(node !== void 0 && (test === void 0 || test(node)), message || "Unexpected node.", function() {
            return "Node ".concat(formatSyntaxKind(node === null || node === void 0 ? void 0 : node.kind), " did not pass test '").concat(getFunctionName(test), "'.");
          }, stackCrawlMark || assertNode);
        }
      }
      Debug2.assertNode = assertNode;
      function assertNotNode(node, test, message, stackCrawlMark) {
        if (shouldAssertFunction(1, "assertNotNode")) {
          assert(node === void 0 || test === void 0 || !test(node), message || "Unexpected node.", function() {
            return "Node ".concat(formatSyntaxKind(node.kind), " should not have passed test '").concat(getFunctionName(test), "'.");
          }, stackCrawlMark || assertNotNode);
        }
      }
      Debug2.assertNotNode = assertNotNode;
      function assertOptionalNode(node, test, message, stackCrawlMark) {
        if (shouldAssertFunction(1, "assertOptionalNode")) {
          assert(test === void 0 || node === void 0 || test(node), message || "Unexpected node.", function() {
            return "Node ".concat(formatSyntaxKind(node === null || node === void 0 ? void 0 : node.kind), " did not pass test '").concat(getFunctionName(test), "'.");
          }, stackCrawlMark || assertOptionalNode);
        }
      }
      Debug2.assertOptionalNode = assertOptionalNode;
      function assertOptionalToken(node, kind, message, stackCrawlMark) {
        if (shouldAssertFunction(1, "assertOptionalToken")) {
          assert(kind === void 0 || node === void 0 || node.kind === kind, message || "Unexpected node.", function() {
            return "Node ".concat(formatSyntaxKind(node === null || node === void 0 ? void 0 : node.kind), " was not a '").concat(formatSyntaxKind(kind), "' token.");
          }, stackCrawlMark || assertOptionalToken);
        }
      }
      Debug2.assertOptionalToken = assertOptionalToken;
      function assertMissingNode(node, message, stackCrawlMark) {
        if (shouldAssertFunction(1, "assertMissingNode")) {
          assert(node === void 0, message || "Unexpected node.", function() {
            return "Node ".concat(formatSyntaxKind(node.kind), " was unexpected'.");
          }, stackCrawlMark || assertMissingNode);
        }
      }
      Debug2.assertMissingNode = assertMissingNode;
      function type(_value) {
      }
      Debug2.type = type;
      function getFunctionName(func) {
        if (typeof func !== "function") {
          return "";
        } else if (func.hasOwnProperty("name")) {
          return func.name;
        } else {
          var text = Function.prototype.toString.call(func);
          var match = /^function\s+([\w\$]+)\s*\(/.exec(text);
          return match ? match[1] : "";
        }
      }
      Debug2.getFunctionName = getFunctionName;
      function formatSymbol(symbol) {
        return "{ name: ".concat(ts2.unescapeLeadingUnderscores(symbol.escapedName), "; flags: ").concat(formatSymbolFlags(symbol.flags), "; declarations: ").concat(ts2.map(symbol.declarations, function(node) {
          return formatSyntaxKind(node.kind);
        }), " }");
      }
      Debug2.formatSymbol = formatSymbol;
      function formatEnum(value, enumObject, isFlags) {
        if (value === void 0) {
          value = 0;
        }
        var members = getEnumMembers(enumObject);
        if (value === 0) {
          return members.length > 0 && members[0][0] === 0 ? members[0][1] : "0";
        }
        if (isFlags) {
          var result = "";
          var remainingFlags = value;
          for (var _i = 0, members_1 = members; _i < members_1.length; _i++) {
            var _a = members_1[_i], enumValue = _a[0], enumName = _a[1];
            if (enumValue > value) {
              break;
            }
            if (enumValue !== 0 && enumValue & value) {
              result = "".concat(result).concat(result ? "|" : "").concat(enumName);
              remainingFlags &= ~enumValue;
            }
          }
          if (remainingFlags === 0) {
            return result;
          }
        } else {
          for (var _b = 0, members_2 = members; _b < members_2.length; _b++) {
            var _c = members_2[_b], enumValue = _c[0], enumName = _c[1];
            if (enumValue === value) {
              return enumName;
            }
          }
        }
        return value.toString();
      }
      Debug2.formatEnum = formatEnum;
      function getEnumMembers(enumObject) {
        var result = [];
        for (var name in enumObject) {
          var value = enumObject[name];
          if (typeof value === "number") {
            result.push([value, name]);
          }
        }
        return ts2.stableSort(result, function(x, y) {
          return ts2.compareValues(x[0], y[0]);
        });
      }
      function formatSyntaxKind(kind) {
        return formatEnum(kind, ts2.SyntaxKind, false);
      }
      Debug2.formatSyntaxKind = formatSyntaxKind;
      function formatSnippetKind(kind) {
        return formatEnum(kind, ts2.SnippetKind, false);
      }
      Debug2.formatSnippetKind = formatSnippetKind;
      function formatNodeFlags(flags) {
        return formatEnum(flags, ts2.NodeFlags, true);
      }
      Debug2.formatNodeFlags = formatNodeFlags;
      function formatModifierFlags(flags) {
        return formatEnum(flags, ts2.ModifierFlags, true);
      }
      Debug2.formatModifierFlags = formatModifierFlags;
      function formatTransformFlags(flags) {
        return formatEnum(flags, ts2.TransformFlags, true);
      }
      Debug2.formatTransformFlags = formatTransformFlags;
      function formatEmitFlags(flags) {
        return formatEnum(flags, ts2.EmitFlags, true);
      }
      Debug2.formatEmitFlags = formatEmitFlags;
      function formatSymbolFlags(flags) {
        return formatEnum(flags, ts2.SymbolFlags, true);
      }
      Debug2.formatSymbolFlags = formatSymbolFlags;
      function formatTypeFlags(flags) {
        return formatEnum(flags, ts2.TypeFlags, true);
      }
      Debug2.formatTypeFlags = formatTypeFlags;
      function formatSignatureFlags(flags) {
        return formatEnum(flags, ts2.SignatureFlags, true);
      }
      Debug2.formatSignatureFlags = formatSignatureFlags;
      function formatObjectFlags(flags) {
        return formatEnum(flags, ts2.ObjectFlags, true);
      }
      Debug2.formatObjectFlags = formatObjectFlags;
      function formatFlowFlags(flags) {
        return formatEnum(flags, ts2.FlowFlags, true);
      }
      Debug2.formatFlowFlags = formatFlowFlags;
      var isDebugInfoEnabled = false;
      var extendedDebugModule;
      function extendedDebug() {
        enableDebugInfo();
        if (!extendedDebugModule) {
          throw new Error("Debugging helpers could not be loaded.");
        }
        return extendedDebugModule;
      }
      function printControlFlowGraph(flowNode) {
        return console.log(formatControlFlowGraph(flowNode));
      }
      Debug2.printControlFlowGraph = printControlFlowGraph;
      function formatControlFlowGraph(flowNode) {
        return extendedDebug().formatControlFlowGraph(flowNode);
      }
      Debug2.formatControlFlowGraph = formatControlFlowGraph;
      var flowNodeProto;
      function attachFlowNodeDebugInfoWorker(flowNode) {
        if (!("__debugFlowFlags" in flowNode)) {
          Object.defineProperties(flowNode, {
            __tsDebuggerDisplay: {
              value: function() {
                var flowHeader = this.flags & 2 ? "FlowStart" : this.flags & 4 ? "FlowBranchLabel" : this.flags & 8 ? "FlowLoopLabel" : this.flags & 16 ? "FlowAssignment" : this.flags & 32 ? "FlowTrueCondition" : this.flags & 64 ? "FlowFalseCondition" : this.flags & 128 ? "FlowSwitchClause" : this.flags & 256 ? "FlowArrayMutation" : this.flags & 512 ? "FlowCall" : this.flags & 1024 ? "FlowReduceLabel" : this.flags & 1 ? "FlowUnreachable" : "UnknownFlow";
                var remainingFlags = this.flags & ~(2048 - 1);
                return "".concat(flowHeader).concat(remainingFlags ? " (".concat(formatFlowFlags(remainingFlags), ")") : "");
              }
            },
            __debugFlowFlags: { get: function() {
              return formatEnum(this.flags, ts2.FlowFlags, true);
            } },
            __debugToString: { value: function() {
              return formatControlFlowGraph(this);
            } }
          });
        }
      }
      function attachFlowNodeDebugInfo(flowNode) {
        if (isDebugInfoEnabled) {
          if (typeof Object.setPrototypeOf === "function") {
            if (!flowNodeProto) {
              flowNodeProto = Object.create(Object.prototype);
              attachFlowNodeDebugInfoWorker(flowNodeProto);
            }
            Object.setPrototypeOf(flowNode, flowNodeProto);
          } else {
            attachFlowNodeDebugInfoWorker(flowNode);
          }
        }
      }
      Debug2.attachFlowNodeDebugInfo = attachFlowNodeDebugInfo;
      var nodeArrayProto;
      function attachNodeArrayDebugInfoWorker(array) {
        if (!("__tsDebuggerDisplay" in array)) {
          Object.defineProperties(array, {
            __tsDebuggerDisplay: {
              value: function(defaultValue) {
                defaultValue = String(defaultValue).replace(/(?:,[\s\w\d_]+:[^,]+)+\]$/, "]");
                return "NodeArray ".concat(defaultValue);
              }
            }
          });
        }
      }
      function attachNodeArrayDebugInfo(array) {
        if (isDebugInfoEnabled) {
          if (typeof Object.setPrototypeOf === "function") {
            if (!nodeArrayProto) {
              nodeArrayProto = Object.create(Array.prototype);
              attachNodeArrayDebugInfoWorker(nodeArrayProto);
            }
            Object.setPrototypeOf(array, nodeArrayProto);
          } else {
            attachNodeArrayDebugInfoWorker(array);
          }
        }
      }
      Debug2.attachNodeArrayDebugInfo = attachNodeArrayDebugInfo;
      function enableDebugInfo() {
        if (isDebugInfoEnabled)
          return;
        var weakTypeTextMap;
        var weakNodeTextMap;
        function getWeakTypeTextMap() {
          if (weakTypeTextMap === void 0) {
            if (typeof WeakMap === "function")
              weakTypeTextMap = /* @__PURE__ */ new WeakMap();
          }
          return weakTypeTextMap;
        }
        function getWeakNodeTextMap() {
          if (weakNodeTextMap === void 0) {
            if (typeof WeakMap === "function")
              weakNodeTextMap = /* @__PURE__ */ new WeakMap();
          }
          return weakNodeTextMap;
        }
        Object.defineProperties(ts2.objectAllocator.getSymbolConstructor().prototype, {
          __tsDebuggerDisplay: {
            value: function() {
              var symbolHeader = this.flags & 33554432 ? "TransientSymbol" : "Symbol";
              var remainingSymbolFlags = this.flags & ~33554432;
              return "".concat(symbolHeader, " '").concat(ts2.symbolName(this), "'").concat(remainingSymbolFlags ? " (".concat(formatSymbolFlags(remainingSymbolFlags), ")") : "");
            }
          },
          __debugFlags: { get: function() {
            return formatSymbolFlags(this.flags);
          } }
        });
        Object.defineProperties(ts2.objectAllocator.getTypeConstructor().prototype, {
          __tsDebuggerDisplay: {
            value: function() {
              var typeHeader = this.flags & 98304 ? "NullableType" : this.flags & 384 ? "LiteralType ".concat(JSON.stringify(this.value)) : this.flags & 2048 ? "LiteralType ".concat(this.value.negative ? "-" : "").concat(this.value.base10Value, "n") : this.flags & 8192 ? "UniqueESSymbolType" : this.flags & 32 ? "EnumType" : this.flags & 67359327 ? "IntrinsicType ".concat(this.intrinsicName) : this.flags & 1048576 ? "UnionType" : this.flags & 2097152 ? "IntersectionType" : this.flags & 4194304 ? "IndexType" : this.flags & 8388608 ? "IndexedAccessType" : this.flags & 16777216 ? "ConditionalType" : this.flags & 33554432 ? "SubstitutionType" : this.flags & 262144 ? "TypeParameter" : this.flags & 524288 ? this.objectFlags & 3 ? "InterfaceType" : this.objectFlags & 4 ? "TypeReference" : this.objectFlags & 8 ? "TupleType" : this.objectFlags & 16 ? "AnonymousType" : this.objectFlags & 32 ? "MappedType" : this.objectFlags & 1024 ? "ReverseMappedType" : this.objectFlags & 256 ? "EvolvingArrayType" : "ObjectType" : "Type";
              var remainingObjectFlags = this.flags & 524288 ? this.objectFlags & ~1343 : 0;
              return "".concat(typeHeader).concat(this.symbol ? " '".concat(ts2.symbolName(this.symbol), "'") : "").concat(remainingObjectFlags ? " (".concat(formatObjectFlags(remainingObjectFlags), ")") : "");
            }
          },
          __debugFlags: { get: function() {
            return formatTypeFlags(this.flags);
          } },
          __debugObjectFlags: { get: function() {
            return this.flags & 524288 ? formatObjectFlags(this.objectFlags) : "";
          } },
          __debugTypeToString: {
            value: function() {
              var map = getWeakTypeTextMap();
              var text = map === null || map === void 0 ? void 0 : map.get(this);
              if (text === void 0) {
                text = this.checker.typeToString(this);
                map === null || map === void 0 ? void 0 : map.set(this, text);
              }
              return text;
            }
          }
        });
        Object.defineProperties(ts2.objectAllocator.getSignatureConstructor().prototype, {
          __debugFlags: { get: function() {
            return formatSignatureFlags(this.flags);
          } },
          __debugSignatureToString: { value: function() {
            var _a;
            return (_a = this.checker) === null || _a === void 0 ? void 0 : _a.signatureToString(this);
          } }
        });
        var nodeConstructors = [
          ts2.objectAllocator.getNodeConstructor(),
          ts2.objectAllocator.getIdentifierConstructor(),
          ts2.objectAllocator.getTokenConstructor(),
          ts2.objectAllocator.getSourceFileConstructor()
        ];
        for (var _i = 0, nodeConstructors_1 = nodeConstructors; _i < nodeConstructors_1.length; _i++) {
          var ctor = nodeConstructors_1[_i];
          if (!ctor.prototype.hasOwnProperty("__debugKind")) {
            Object.defineProperties(ctor.prototype, {
              __tsDebuggerDisplay: {
                value: function() {
                  var nodeHeader = ts2.isGeneratedIdentifier(this) ? "GeneratedIdentifier" : ts2.isIdentifier(this) ? "Identifier '".concat(ts2.idText(this), "'") : ts2.isPrivateIdentifier(this) ? "PrivateIdentifier '".concat(ts2.idText(this), "'") : ts2.isStringLiteral(this) ? "StringLiteral ".concat(JSON.stringify(this.text.length < 10 ? this.text : this.text.slice(10) + "...")) : ts2.isNumericLiteral(this) ? "NumericLiteral ".concat(this.text) : ts2.isBigIntLiteral(this) ? "BigIntLiteral ".concat(this.text, "n") : ts2.isTypeParameterDeclaration(this) ? "TypeParameterDeclaration" : ts2.isParameter(this) ? "ParameterDeclaration" : ts2.isConstructorDeclaration(this) ? "ConstructorDeclaration" : ts2.isGetAccessorDeclaration(this) ? "GetAccessorDeclaration" : ts2.isSetAccessorDeclaration(this) ? "SetAccessorDeclaration" : ts2.isCallSignatureDeclaration(this) ? "CallSignatureDeclaration" : ts2.isConstructSignatureDeclaration(this) ? "ConstructSignatureDeclaration" : ts2.isIndexSignatureDeclaration(this) ? "IndexSignatureDeclaration" : ts2.isTypePredicateNode(this) ? "TypePredicateNode" : ts2.isTypeReferenceNode(this) ? "TypeReferenceNode" : ts2.isFunctionTypeNode(this) ? "FunctionTypeNode" : ts2.isConstructorTypeNode(this) ? "ConstructorTypeNode" : ts2.isTypeQueryNode(this) ? "TypeQueryNode" : ts2.isTypeLiteralNode(this) ? "TypeLiteralNode" : ts2.isArrayTypeNode(this) ? "ArrayTypeNode" : ts2.isTupleTypeNode(this) ? "TupleTypeNode" : ts2.isOptionalTypeNode(this) ? "OptionalTypeNode" : ts2.isRestTypeNode(this) ? "RestTypeNode" : ts2.isUnionTypeNode(this) ? "UnionTypeNode" : ts2.isIntersectionTypeNode(this) ? "IntersectionTypeNode" : ts2.isConditionalTypeNode(this) ? "ConditionalTypeNode" : ts2.isInferTypeNode(this) ? "InferTypeNode" : ts2.isParenthesizedTypeNode(this) ? "ParenthesizedTypeNode" : ts2.isThisTypeNode(this) ? "ThisTypeNode" : ts2.isTypeOperatorNode(this) ? "TypeOperatorNode" : ts2.isIndexedAccessTypeNode(this) ? "IndexedAccessTypeNode" : ts2.isMappedTypeNode(this) ? "MappedTypeNode" : ts2.isLiteralTypeNode(this) ? "LiteralTypeNode" : ts2.isNamedTupleMember(this) ? "NamedTupleMember" : ts2.isImportTypeNode(this) ? "ImportTypeNode" : formatSyntaxKind(this.kind);
                  return "".concat(nodeHeader).concat(this.flags ? " (".concat(formatNodeFlags(this.flags), ")") : "");
                }
              },
              __debugKind: { get: function() {
                return formatSyntaxKind(this.kind);
              } },
              __debugNodeFlags: { get: function() {
                return formatNodeFlags(this.flags);
              } },
              __debugModifierFlags: { get: function() {
                return formatModifierFlags(ts2.getEffectiveModifierFlagsNoCache(this));
              } },
              __debugTransformFlags: { get: function() {
                return formatTransformFlags(this.transformFlags);
              } },
              __debugIsParseTreeNode: { get: function() {
                return ts2.isParseTreeNode(this);
              } },
              __debugEmitFlags: { get: function() {
                return formatEmitFlags(ts2.getEmitFlags(this));
              } },
              __debugGetText: {
                value: function(includeTrivia) {
                  if (ts2.nodeIsSynthesized(this))
                    return "";
                  var map = getWeakNodeTextMap();
                  var text = map === null || map === void 0 ? void 0 : map.get(this);
                  if (text === void 0) {
                    var parseNode = ts2.getParseTreeNode(this);
                    var sourceFile = parseNode && ts2.getSourceFileOfNode(parseNode);
                    text = sourceFile ? ts2.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : "";
                    map === null || map === void 0 ? void 0 : map.set(this, text);
                  }
                  return text;
                }
              }
            });
          }
        }
        try {
          if (ts2.sys && ts2.sys.require) {
            var basePath = ts2.getDirectoryPath(ts2.resolvePath(ts2.sys.getExecutingFilePath()));
            var result = void 0;
            if (!result.error) {
              result.module.init(ts2);
              extendedDebugModule = result.module;
            }
          }
        } catch (_a) {
        }
        isDebugInfoEnabled = true;
      }
      Debug2.enableDebugInfo = enableDebugInfo;
      function formatDeprecationMessage(name, error, errorAfter, since, message) {
        var deprecationMessage = error ? "DeprecationError: " : "DeprecationWarning: ";
        deprecationMessage += "'".concat(name, "' ");
        deprecationMessage += since ? "has been deprecated since v".concat(since) : "is deprecated";
        deprecationMessage += error ? " and can no longer be used." : errorAfter ? " and will no longer be usable after v".concat(errorAfter, ".") : ".";
        deprecationMessage += message ? " ".concat(ts2.formatStringFromArgs(message, [name], 0)) : "";
        return deprecationMessage;
      }
      function createErrorDeprecation(name, errorAfter, since, message) {
        var deprecationMessage = formatDeprecationMessage(name, true, errorAfter, since, message);
        return function() {
          throw new TypeError(deprecationMessage);
        };
      }
      function createWarningDeprecation(name, errorAfter, since, message) {
        var hasWrittenDeprecation = false;
        return function() {
          if (!hasWrittenDeprecation) {
            log.warn(formatDeprecationMessage(name, false, errorAfter, since, message));
            hasWrittenDeprecation = true;
          }
        };
      }
      function createDeprecation(name, options) {
        var _a, _b;
        if (options === void 0) {
          options = {};
        }
        var version = typeof options.typeScriptVersion === "string" ? new ts2.Version(options.typeScriptVersion) : (_a = options.typeScriptVersion) !== null && _a !== void 0 ? _a : getTypeScriptVersion();
        var errorAfter = typeof options.errorAfter === "string" ? new ts2.Version(options.errorAfter) : options.errorAfter;
        var warnAfter = typeof options.warnAfter === "string" ? new ts2.Version(options.warnAfter) : options.warnAfter;
        var since = typeof options.since === "string" ? new ts2.Version(options.since) : (_b = options.since) !== null && _b !== void 0 ? _b : warnAfter;
        var error = options.error || errorAfter && version.compareTo(errorAfter) <= 0;
        var warn = !warnAfter || version.compareTo(warnAfter) >= 0;
        return error ? createErrorDeprecation(name, errorAfter, since, options.message) : warn ? createWarningDeprecation(name, errorAfter, since, options.message) : ts2.noop;
      }
      function wrapFunction(deprecation, func) {
        return function() {
          deprecation();
          return func.apply(this, arguments);
        };
      }
      function deprecate(func, options) {
        var deprecation = createDeprecation(getFunctionName(func), options);
        return wrapFunction(deprecation, func);
      }
      Debug2.deprecate = deprecate;
    })(Debug = ts2.Debug || (ts2.Debug = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var versionRegExp = /^(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:\.(0|[1-9]\d*)(?:\-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$/i;
    var prereleaseRegExp = /^(?:0|[1-9]\d*|[a-z-][a-z0-9-]*)(?:\.(?:0|[1-9]\d*|[a-z-][a-z0-9-]*))*$/i;
    var buildRegExp = /^[a-z0-9-]+(?:\.[a-z0-9-]+)*$/i;
    var numericIdentifierRegExp = /^(0|[1-9]\d*)$/;
    var Version = function() {
      function Version2(major, minor, patch, prerelease, build) {
        if (minor === void 0) {
          minor = 0;
        }
        if (patch === void 0) {
          patch = 0;
        }
        if (prerelease === void 0) {
          prerelease = "";
        }
        if (build === void 0) {
          build = "";
        }
        if (typeof major === "string") {
          var result = ts2.Debug.checkDefined(tryParseComponents(major), "Invalid version");
          major = result.major, minor = result.minor, patch = result.patch, prerelease = result.prerelease, build = result.build;
        }
        ts2.Debug.assert(major >= 0, "Invalid argument: major");
        ts2.Debug.assert(minor >= 0, "Invalid argument: minor");
        ts2.Debug.assert(patch >= 0, "Invalid argument: patch");
        ts2.Debug.assert(!prerelease || prereleaseRegExp.test(prerelease), "Invalid argument: prerelease");
        ts2.Debug.assert(!build || buildRegExp.test(build), "Invalid argument: build");
        this.major = major;
        this.minor = minor;
        this.patch = patch;
        this.prerelease = prerelease ? prerelease.split(".") : ts2.emptyArray;
        this.build = build ? build.split(".") : ts2.emptyArray;
      }
      Version2.tryParse = function(text) {
        var result = tryParseComponents(text);
        if (!result)
          return void 0;
        var major = result.major, minor = result.minor, patch = result.patch, prerelease = result.prerelease, build = result.build;
        return new Version2(major, minor, patch, prerelease, build);
      };
      Version2.prototype.compareTo = function(other) {
        if (this === other)
          return 0;
        if (other === void 0)
          return 1;
        return ts2.compareValues(this.major, other.major) || ts2.compareValues(this.minor, other.minor) || ts2.compareValues(this.patch, other.patch) || comparePrereleaseIdentifiers(this.prerelease, other.prerelease);
      };
      Version2.prototype.increment = function(field) {
        switch (field) {
          case "major":
            return new Version2(this.major + 1, 0, 0);
          case "minor":
            return new Version2(this.major, this.minor + 1, 0);
          case "patch":
            return new Version2(this.major, this.minor, this.patch + 1);
          default:
            return ts2.Debug.assertNever(field);
        }
      };
      Version2.prototype.toString = function() {
        var result = "".concat(this.major, ".").concat(this.minor, ".").concat(this.patch);
        if (ts2.some(this.prerelease))
          result += "-".concat(this.prerelease.join("."));
        if (ts2.some(this.build))
          result += "+".concat(this.build.join("."));
        return result;
      };
      Version2.zero = new Version2(0, 0, 0);
      return Version2;
    }();
    ts2.Version = Version;
    function tryParseComponents(text) {
      var match = versionRegExp.exec(text);
      if (!match)
        return void 0;
      var major = match[1], _a = match[2], minor = _a === void 0 ? "0" : _a, _b = match[3], patch = _b === void 0 ? "0" : _b, _c = match[4], prerelease = _c === void 0 ? "" : _c, _d = match[5], build = _d === void 0 ? "" : _d;
      if (prerelease && !prereleaseRegExp.test(prerelease))
        return void 0;
      if (build && !buildRegExp.test(build))
        return void 0;
      return {
        major: parseInt(major, 10),
        minor: parseInt(minor, 10),
        patch: parseInt(patch, 10),
        prerelease,
        build
      };
    }
    function comparePrereleaseIdentifiers(left, right) {
      if (left === right)
        return 0;
      if (left.length === 0)
        return right.length === 0 ? 0 : 1;
      if (right.length === 0)
        return -1;
      var length = Math.min(left.length, right.length);
      for (var i = 0; i < length; i++) {
        var leftIdentifier = left[i];
        var rightIdentifier = right[i];
        if (leftIdentifier === rightIdentifier)
          continue;
        var leftIsNumeric = numericIdentifierRegExp.test(leftIdentifier);
        var rightIsNumeric = numericIdentifierRegExp.test(rightIdentifier);
        if (leftIsNumeric || rightIsNumeric) {
          if (leftIsNumeric !== rightIsNumeric)
            return leftIsNumeric ? -1 : 1;
          var result = ts2.compareValues(+leftIdentifier, +rightIdentifier);
          if (result)
            return result;
        } else {
          var result = ts2.compareStringsCaseSensitive(leftIdentifier, rightIdentifier);
          if (result)
            return result;
        }
      }
      return ts2.compareValues(left.length, right.length);
    }
    var VersionRange = function() {
      function VersionRange2(spec) {
        this._alternatives = spec ? ts2.Debug.checkDefined(parseRange(spec), "Invalid range spec.") : ts2.emptyArray;
      }
      VersionRange2.tryParse = function(text) {
        var sets = parseRange(text);
        if (sets) {
          var range = new VersionRange2("");
          range._alternatives = sets;
          return range;
        }
        return void 0;
      };
      VersionRange2.prototype.test = function(version) {
        if (typeof version === "string")
          version = new Version(version);
        return testDisjunction(version, this._alternatives);
      };
      VersionRange2.prototype.toString = function() {
        return formatDisjunction(this._alternatives);
      };
      return VersionRange2;
    }();
    ts2.VersionRange = VersionRange;
    var logicalOrRegExp = /\|\|/g;
    var whitespaceRegExp = /\s+/g;
    var partialRegExp = /^([xX*0]|[1-9]\d*)(?:\.([xX*0]|[1-9]\d*)(?:\.([xX*0]|[1-9]\d*)(?:-([a-z0-9-.]+))?(?:\+([a-z0-9-.]+))?)?)?$/i;
    var hyphenRegExp = /^\s*([a-z0-9-+.*]+)\s+-\s+([a-z0-9-+.*]+)\s*$/i;
    var rangeRegExp = /^(~|\^|<|<=|>|>=|=)?\s*([a-z0-9-+.*]+)$/i;
    function parseRange(text) {
      var alternatives = [];
      for (var _i = 0, _a = ts2.trimString(text).split(logicalOrRegExp); _i < _a.length; _i++) {
        var range = _a[_i];
        if (!range)
          continue;
        var comparators = [];
        range = ts2.trimString(range);
        var match = hyphenRegExp.exec(range);
        if (match) {
          if (!parseHyphen(match[1], match[2], comparators))
            return void 0;
        } else {
          for (var _b = 0, _c = range.split(whitespaceRegExp); _b < _c.length; _b++) {
            var simple = _c[_b];
            var match_1 = rangeRegExp.exec(ts2.trimString(simple));
            if (!match_1 || !parseComparator(match_1[1], match_1[2], comparators))
              return void 0;
          }
        }
        alternatives.push(comparators);
      }
      return alternatives;
    }
    function parsePartial(text) {
      var match = partialRegExp.exec(text);
      if (!match)
        return void 0;
      var major = match[1], _a = match[2], minor = _a === void 0 ? "*" : _a, _b = match[3], patch = _b === void 0 ? "*" : _b, prerelease = match[4], build = match[5];
      var version = new Version(isWildcard(major) ? 0 : parseInt(major, 10), isWildcard(major) || isWildcard(minor) ? 0 : parseInt(minor, 10), isWildcard(major) || isWildcard(minor) || isWildcard(patch) ? 0 : parseInt(patch, 10), prerelease, build);
      return { version, major, minor, patch };
    }
    function parseHyphen(left, right, comparators) {
      var leftResult = parsePartial(left);
      if (!leftResult)
        return false;
      var rightResult = parsePartial(right);
      if (!rightResult)
        return false;
      if (!isWildcard(leftResult.major)) {
        comparators.push(createComparator(">=", leftResult.version));
      }
      if (!isWildcard(rightResult.major)) {
        comparators.push(isWildcard(rightResult.minor) ? createComparator("<", rightResult.version.increment("major")) : isWildcard(rightResult.patch) ? createComparator("<", rightResult.version.increment("minor")) : createComparator("<=", rightResult.version));
      }
      return true;
    }
    function parseComparator(operator, text, comparators) {
      var result = parsePartial(text);
      if (!result)
        return false;
      var version = result.version, major = result.major, minor = result.minor, patch = result.patch;
      if (!isWildcard(major)) {
        switch (operator) {
          case "~":
            comparators.push(createComparator(">=", version));
            comparators.push(createComparator("<", version.increment(isWildcard(minor) ? "major" : "minor")));
            break;
          case "^":
            comparators.push(createComparator(">=", version));
            comparators.push(createComparator("<", version.increment(version.major > 0 || isWildcard(minor) ? "major" : version.minor > 0 || isWildcard(patch) ? "minor" : "patch")));
            break;
          case "<":
          case ">=":
            comparators.push(createComparator(operator, version));
            break;
          case "<=":
          case ">":
            comparators.push(isWildcard(minor) ? createComparator(operator === "<=" ? "<" : ">=", version.increment("major")) : isWildcard(patch) ? createComparator(operator === "<=" ? "<" : ">=", version.increment("minor")) : createComparator(operator, version));
            break;
          case "=":
          case void 0:
            if (isWildcard(minor) || isWildcard(patch)) {
              comparators.push(createComparator(">=", version));
              comparators.push(createComparator("<", version.increment(isWildcard(minor) ? "major" : "minor")));
            } else {
              comparators.push(createComparator("=", version));
            }
            break;
          default:
            return false;
        }
      } else if (operator === "<" || operator === ">") {
        comparators.push(createComparator("<", Version.zero));
      }
      return true;
    }
    function isWildcard(part) {
      return part === "*" || part === "x" || part === "X";
    }
    function createComparator(operator, operand) {
      return { operator, operand };
    }
    function testDisjunction(version, alternatives) {
      if (alternatives.length === 0)
        return true;
      for (var _i = 0, alternatives_1 = alternatives; _i < alternatives_1.length; _i++) {
        var alternative = alternatives_1[_i];
        if (testAlternative(version, alternative))
          return true;
      }
      return false;
    }
    function testAlternative(version, comparators) {
      for (var _i = 0, comparators_1 = comparators; _i < comparators_1.length; _i++) {
        var comparator = comparators_1[_i];
        if (!testComparator(version, comparator.operator, comparator.operand))
          return false;
      }
      return true;
    }
    function testComparator(version, operator, operand) {
      var cmp = version.compareTo(operand);
      switch (operator) {
        case "<":
          return cmp < 0;
        case "<=":
          return cmp <= 0;
        case ">":
          return cmp > 0;
        case ">=":
          return cmp >= 0;
        case "=":
          return cmp === 0;
        default:
          return ts2.Debug.assertNever(operator);
      }
    }
    function formatDisjunction(alternatives) {
      return ts2.map(alternatives, formatAlternative).join(" || ") || "*";
    }
    function formatAlternative(comparators) {
      return ts2.map(comparators, formatComparator).join(" ");
    }
    function formatComparator(comparator) {
      return "".concat(comparator.operator).concat(comparator.operand);
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function hasRequiredAPI(performance2, PerformanceObserver2) {
      return typeof performance2 === "object" && typeof performance2.timeOrigin === "number" && typeof performance2.mark === "function" && typeof performance2.measure === "function" && typeof performance2.now === "function" && typeof PerformanceObserver2 === "function";
    }
    function tryGetWebPerformanceHooks() {
      if (typeof performance === "object" && typeof PerformanceObserver === "function" && hasRequiredAPI(performance, PerformanceObserver)) {
        return {
          shouldWriteNativeEvents: true,
          performance,
          PerformanceObserver
        };
      }
    }
    function tryGetNodePerformanceHooks() {
      if (typeof process !== "undefined" && process.nextTick && !process.browser && typeof module === "object" && false) {
        try {
          var performance_1;
          var _a = {}, nodePerformance_1 = _a.performance, PerformanceObserver_1 = _a.PerformanceObserver;
          if (hasRequiredAPI(nodePerformance_1, PerformanceObserver_1)) {
            performance_1 = nodePerformance_1;
            var version_1 = new ts2.Version(process.versions.node);
            var range = new ts2.VersionRange("<12.16.3 || 13 <13.13");
            if (range.test(version_1)) {
              performance_1 = {
                get timeOrigin() {
                  return nodePerformance_1.timeOrigin;
                },
                now: function() {
                  return nodePerformance_1.now();
                },
                mark: function(name) {
                  return nodePerformance_1.mark(name);
                },
                measure: function(name, start, end) {
                  if (start === void 0) {
                    start = "nodeStart";
                  }
                  if (end === void 0) {
                    end = "__performance.measure-fix__";
                    nodePerformance_1.mark(end);
                  }
                  nodePerformance_1.measure(name, start, end);
                  if (end === "__performance.measure-fix__") {
                    nodePerformance_1.clearMarks("__performance.measure-fix__");
                  }
                }
              };
            }
            return {
              shouldWriteNativeEvents: false,
              performance: performance_1,
              PerformanceObserver: PerformanceObserver_1
            };
          }
        } catch (_b) {
        }
      }
    }
    var nativePerformanceHooks = tryGetWebPerformanceHooks() || tryGetNodePerformanceHooks();
    var nativePerformance = nativePerformanceHooks === null || nativePerformanceHooks === void 0 ? void 0 : nativePerformanceHooks.performance;
    function tryGetNativePerformanceHooks() {
      return nativePerformanceHooks;
    }
    ts2.tryGetNativePerformanceHooks = tryGetNativePerformanceHooks;
    ts2.timestamp = nativePerformance ? function() {
      return nativePerformance.now();
    } : Date.now ? Date.now : function() {
      return +new Date();
    };
  })(ts || (ts = {}));
  (function(ts2) {
    var performance2;
    (function(performance3) {
      var perfHooks;
      var performanceImpl;
      function createTimerIf(condition, measureName, startMarkName, endMarkName) {
        return condition ? createTimer(measureName, startMarkName, endMarkName) : performance3.nullTimer;
      }
      performance3.createTimerIf = createTimerIf;
      function createTimer(measureName, startMarkName, endMarkName) {
        var enterCount = 0;
        return {
          enter,
          exit
        };
        function enter() {
          if (++enterCount === 1) {
            mark(startMarkName);
          }
        }
        function exit() {
          if (--enterCount === 0) {
            mark(endMarkName);
            measure(measureName, startMarkName, endMarkName);
          } else if (enterCount < 0) {
            ts2.Debug.fail("enter/exit count does not match.");
          }
        }
      }
      performance3.createTimer = createTimer;
      performance3.nullTimer = { enter: ts2.noop, exit: ts2.noop };
      var enabled = false;
      var timeorigin = ts2.timestamp();
      var marks = new ts2.Map();
      var counts = new ts2.Map();
      var durations = new ts2.Map();
      function mark(markName) {
        var _a;
        if (enabled) {
          var count = (_a = counts.get(markName)) !== null && _a !== void 0 ? _a : 0;
          counts.set(markName, count + 1);
          marks.set(markName, ts2.timestamp());
          performanceImpl === null || performanceImpl === void 0 ? void 0 : performanceImpl.mark(markName);
        }
      }
      performance3.mark = mark;
      function measure(measureName, startMarkName, endMarkName) {
        var _a, _b;
        if (enabled) {
          var end = (_a = endMarkName !== void 0 ? marks.get(endMarkName) : void 0) !== null && _a !== void 0 ? _a : ts2.timestamp();
          var start = (_b = startMarkName !== void 0 ? marks.get(startMarkName) : void 0) !== null && _b !== void 0 ? _b : timeorigin;
          var previousDuration = durations.get(measureName) || 0;
          durations.set(measureName, previousDuration + (end - start));
          performanceImpl === null || performanceImpl === void 0 ? void 0 : performanceImpl.measure(measureName, startMarkName, endMarkName);
        }
      }
      performance3.measure = measure;
      function getCount(markName) {
        return counts.get(markName) || 0;
      }
      performance3.getCount = getCount;
      function getDuration(measureName) {
        return durations.get(measureName) || 0;
      }
      performance3.getDuration = getDuration;
      function forEachMeasure(cb) {
        durations.forEach(function(duration, measureName) {
          return cb(measureName, duration);
        });
      }
      performance3.forEachMeasure = forEachMeasure;
      function isEnabled() {
        return enabled;
      }
      performance3.isEnabled = isEnabled;
      function enable(system) {
        var _a;
        if (system === void 0) {
          system = ts2.sys;
        }
        if (!enabled) {
          enabled = true;
          perfHooks || (perfHooks = ts2.tryGetNativePerformanceHooks());
          if (perfHooks) {
            timeorigin = perfHooks.performance.timeOrigin;
            if (perfHooks.shouldWriteNativeEvents || ((_a = system === null || system === void 0 ? void 0 : system.cpuProfilingEnabled) === null || _a === void 0 ? void 0 : _a.call(system)) || (system === null || system === void 0 ? void 0 : system.debugMode)) {
              performanceImpl = perfHooks.performance;
            }
          }
        }
        return true;
      }
      performance3.enable = enable;
      function disable() {
        if (enabled) {
          marks.clear();
          counts.clear();
          durations.clear();
          performanceImpl = void 0;
          enabled = false;
        }
      }
      performance3.disable = disable;
    })(performance2 = ts2.performance || (ts2.performance = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var _a;
    var nullLogger = {
      logEvent: ts2.noop,
      logErrEvent: ts2.noop,
      logPerfEvent: ts2.noop,
      logInfoEvent: ts2.noop,
      logStartCommand: ts2.noop,
      logStopCommand: ts2.noop,
      logStartUpdateProgram: ts2.noop,
      logStopUpdateProgram: ts2.noop,
      logStartUpdateGraph: ts2.noop,
      logStopUpdateGraph: ts2.noop,
      logStartResolveModule: ts2.noop,
      logStopResolveModule: ts2.noop,
      logStartParseSourceFile: ts2.noop,
      logStopParseSourceFile: ts2.noop,
      logStartReadFile: ts2.noop,
      logStopReadFile: ts2.noop,
      logStartBindFile: ts2.noop,
      logStopBindFile: ts2.noop,
      logStartScheduledOperation: ts2.noop,
      logStopScheduledOperation: ts2.noop
    };
    var etwModule;
    try {
      var etwModulePath = (_a = process.env.TS_ETW_MODULE_PATH) !== null && _a !== void 0 ? _a : "./node_modules/@microsoft/typescript-etw";
      etwModule = void 0;
    } catch (e) {
      etwModule = void 0;
    }
    ts2.perfLogger = etwModule && etwModule.logEvent ? etwModule : nullLogger;
  })(ts || (ts = {}));
  (function(ts2) {
    var tracingEnabled;
    (function(tracingEnabled2) {
      var fs;
      var traceCount = 0;
      var traceFd = 0;
      var mode;
      var typeCatalog = [];
      var legendPath;
      var legend = [];
      ;
      function startTracing(tracingMode, traceDir, configFilePath) {
        ts2.Debug.assert(!ts2.tracing, "Tracing already started");
        if (fs === void 0) {
          try {
            fs = void 0;
          } catch (e) {
            throw new Error("tracing requires having fs\n(original error: ".concat(e.message || e, ")"));
          }
        }
        mode = tracingMode;
        typeCatalog.length = 0;
        if (legendPath === void 0) {
          legendPath = ts2.combinePaths(traceDir, "legend.json");
        }
        if (!fs.existsSync(traceDir)) {
          fs.mkdirSync(traceDir, { recursive: true });
        }
        var countPart = mode === "build" ? ".".concat(process.pid, "-").concat(++traceCount) : mode === "server" ? ".".concat(process.pid) : "";
        var tracePath = ts2.combinePaths(traceDir, "trace".concat(countPart, ".json"));
        var typesPath = ts2.combinePaths(traceDir, "types".concat(countPart, ".json"));
        legend.push({
          configFilePath,
          tracePath,
          typesPath
        });
        traceFd = fs.openSync(tracePath, "w");
        ts2.tracing = tracingEnabled2;
        var meta = { cat: "__metadata", ph: "M", ts: 1e3 * ts2.timestamp(), pid: 1, tid: 1 };
        fs.writeSync(traceFd, "[\n" + [__assign({ name: "process_name", args: { name: "tsc" } }, meta), __assign({ name: "thread_name", args: { name: "Main" } }, meta), __assign(__assign({ name: "TracingStartedInBrowser" }, meta), { cat: "disabled-by-default-devtools.timeline" })].map(function(v) {
          return JSON.stringify(v);
        }).join(",\n"));
      }
      tracingEnabled2.startTracing = startTracing;
      function stopTracing() {
        ts2.Debug.assert(ts2.tracing, "Tracing is not in progress");
        ts2.Debug.assert(!!typeCatalog.length === (mode !== "server"));
        fs.writeSync(traceFd, "\n]\n");
        fs.closeSync(traceFd);
        ts2.tracing = void 0;
        if (typeCatalog.length) {
          dumpTypes(typeCatalog);
        } else {
          legend[legend.length - 1].typesPath = void 0;
        }
      }
      tracingEnabled2.stopTracing = stopTracing;
      function recordType(type) {
        if (mode !== "server") {
          typeCatalog.push(type);
        }
      }
      tracingEnabled2.recordType = recordType;
      var Phase;
      (function(Phase2) {
        Phase2["Parse"] = "parse";
        Phase2["Program"] = "program";
        Phase2["Bind"] = "bind";
        Phase2["Check"] = "check";
        Phase2["CheckTypes"] = "checkTypes";
        Phase2["Emit"] = "emit";
        Phase2["Session"] = "session";
      })(Phase = tracingEnabled2.Phase || (tracingEnabled2.Phase = {}));
      function instant(phase, name, args) {
        writeEvent("I", phase, name, args, '"s":"g"');
      }
      tracingEnabled2.instant = instant;
      var eventStack = [];
      function push(phase, name, args, separateBeginAndEnd) {
        if (separateBeginAndEnd === void 0) {
          separateBeginAndEnd = false;
        }
        if (separateBeginAndEnd) {
          writeEvent("B", phase, name, args);
        }
        eventStack.push({ phase, name, args, time: 1e3 * ts2.timestamp(), separateBeginAndEnd });
      }
      tracingEnabled2.push = push;
      function pop() {
        ts2.Debug.assert(eventStack.length > 0);
        writeStackEvent(eventStack.length - 1, 1e3 * ts2.timestamp());
        eventStack.length--;
      }
      tracingEnabled2.pop = pop;
      function popAll() {
        var endTime = 1e3 * ts2.timestamp();
        for (var i = eventStack.length - 1; i >= 0; i--) {
          writeStackEvent(i, endTime);
        }
        eventStack.length = 0;
      }
      tracingEnabled2.popAll = popAll;
      var sampleInterval = 1e3 * 10;
      function writeStackEvent(index, endTime) {
        var _a = eventStack[index], phase = _a.phase, name = _a.name, args = _a.args, time = _a.time, separateBeginAndEnd = _a.separateBeginAndEnd;
        if (separateBeginAndEnd) {
          writeEvent("E", phase, name, args, void 0, endTime);
        } else if (sampleInterval - time % sampleInterval <= endTime - time) {
          writeEvent("X", phase, name, args, '"dur":'.concat(endTime - time), time);
        }
      }
      function writeEvent(eventType, phase, name, args, extras, time) {
        if (time === void 0) {
          time = 1e3 * ts2.timestamp();
        }
        if (mode === "server" && phase === "checkTypes")
          return;
        ts2.performance.mark("beginTracing");
        fs.writeSync(traceFd, ',\n{"pid":1,"tid":1,"ph":"'.concat(eventType, '","cat":"').concat(phase, '","ts":').concat(time, ',"name":"').concat(name, '"'));
        if (extras)
          fs.writeSync(traceFd, ",".concat(extras));
        if (args)
          fs.writeSync(traceFd, ',"args":'.concat(JSON.stringify(args)));
        fs.writeSync(traceFd, "}");
        ts2.performance.mark("endTracing");
        ts2.performance.measure("Tracing", "beginTracing", "endTracing");
      }
      function getLocation(node) {
        var file = ts2.getSourceFileOfNode(node);
        return !file ? void 0 : {
          path: file.path,
          start: indexFromOne(ts2.getLineAndCharacterOfPosition(file, node.pos)),
          end: indexFromOne(ts2.getLineAndCharacterOfPosition(file, node.end))
        };
        function indexFromOne(lc) {
          return {
            line: lc.line + 1,
            character: lc.character + 1
          };
        }
      }
      function dumpTypes(types) {
        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
        ts2.performance.mark("beginDumpTypes");
        var typesPath = legend[legend.length - 1].typesPath;
        var typesFd = fs.openSync(typesPath, "w");
        var recursionIdentityMap = new ts2.Map();
        fs.writeSync(typesFd, "[");
        var numTypes = types.length;
        for (var i = 0; i < numTypes; i++) {
          var type = types[i];
          var objectFlags = type.objectFlags;
          var symbol = (_a = type.aliasSymbol) !== null && _a !== void 0 ? _a : type.symbol;
          var display = void 0;
          if (objectFlags & 16 | type.flags & 2944) {
            try {
              display = (_b = type.checker) === null || _b === void 0 ? void 0 : _b.typeToString(type);
            } catch (_y) {
              display = void 0;
            }
          }
          var indexedAccessProperties = {};
          if (type.flags & 8388608) {
            var indexedAccessType = type;
            indexedAccessProperties = {
              indexedAccessObjectType: (_c = indexedAccessType.objectType) === null || _c === void 0 ? void 0 : _c.id,
              indexedAccessIndexType: (_d = indexedAccessType.indexType) === null || _d === void 0 ? void 0 : _d.id
            };
          }
          var referenceProperties = {};
          if (objectFlags & 4) {
            var referenceType = type;
            referenceProperties = {
              instantiatedType: (_e = referenceType.target) === null || _e === void 0 ? void 0 : _e.id,
              typeArguments: (_f = referenceType.resolvedTypeArguments) === null || _f === void 0 ? void 0 : _f.map(function(t) {
                return t.id;
              }),
              referenceLocation: getLocation(referenceType.node)
            };
          }
          var conditionalProperties = {};
          if (type.flags & 16777216) {
            var conditionalType = type;
            conditionalProperties = {
              conditionalCheckType: (_g = conditionalType.checkType) === null || _g === void 0 ? void 0 : _g.id,
              conditionalExtendsType: (_h = conditionalType.extendsType) === null || _h === void 0 ? void 0 : _h.id,
              conditionalTrueType: (_k = (_j = conditionalType.resolvedTrueType) === null || _j === void 0 ? void 0 : _j.id) !== null && _k !== void 0 ? _k : -1,
              conditionalFalseType: (_m = (_l = conditionalType.resolvedFalseType) === null || _l === void 0 ? void 0 : _l.id) !== null && _m !== void 0 ? _m : -1
            };
          }
          var substitutionProperties = {};
          if (type.flags & 33554432) {
            var substitutionType = type;
            substitutionProperties = {
              substitutionBaseType: (_o = substitutionType.baseType) === null || _o === void 0 ? void 0 : _o.id,
              substituteType: (_p = substitutionType.substitute) === null || _p === void 0 ? void 0 : _p.id
            };
          }
          var reverseMappedProperties = {};
          if (objectFlags & 1024) {
            var reverseMappedType = type;
            reverseMappedProperties = {
              reverseMappedSourceType: (_q = reverseMappedType.source) === null || _q === void 0 ? void 0 : _q.id,
              reverseMappedMappedType: (_r = reverseMappedType.mappedType) === null || _r === void 0 ? void 0 : _r.id,
              reverseMappedConstraintType: (_s = reverseMappedType.constraintType) === null || _s === void 0 ? void 0 : _s.id
            };
          }
          var evolvingArrayProperties = {};
          if (objectFlags & 256) {
            var evolvingArrayType = type;
            evolvingArrayProperties = {
              evolvingArrayElementType: evolvingArrayType.elementType.id,
              evolvingArrayFinalType: (_t = evolvingArrayType.finalArrayType) === null || _t === void 0 ? void 0 : _t.id
            };
          }
          var recursionToken = void 0;
          var recursionIdentity = type.checker.getRecursionIdentity(type);
          if (recursionIdentity) {
            recursionToken = recursionIdentityMap.get(recursionIdentity);
            if (!recursionToken) {
              recursionToken = recursionIdentityMap.size;
              recursionIdentityMap.set(recursionIdentity, recursionToken);
            }
          }
          var descriptor = __assign(__assign(__assign(__assign(__assign(__assign(__assign({ id: type.id, intrinsicName: type.intrinsicName, symbolName: (symbol === null || symbol === void 0 ? void 0 : symbol.escapedName) && ts2.unescapeLeadingUnderscores(symbol.escapedName), recursionId: recursionToken, isTuple: objectFlags & 8 ? true : void 0, unionTypes: type.flags & 1048576 ? (_u = type.types) === null || _u === void 0 ? void 0 : _u.map(function(t) {
            return t.id;
          }) : void 0, intersectionTypes: type.flags & 2097152 ? type.types.map(function(t) {
            return t.id;
          }) : void 0, aliasTypeArguments: (_v = type.aliasTypeArguments) === null || _v === void 0 ? void 0 : _v.map(function(t) {
            return t.id;
          }), keyofType: type.flags & 4194304 ? (_w = type.type) === null || _w === void 0 ? void 0 : _w.id : void 0 }, indexedAccessProperties), referenceProperties), conditionalProperties), substitutionProperties), reverseMappedProperties), evolvingArrayProperties), { destructuringPattern: getLocation(type.pattern), firstDeclaration: getLocation((_x = symbol === null || symbol === void 0 ? void 0 : symbol.declarations) === null || _x === void 0 ? void 0 : _x[0]), flags: ts2.Debug.formatTypeFlags(type.flags).split("|"), display });
          fs.writeSync(typesFd, JSON.stringify(descriptor));
          if (i < numTypes - 1) {
            fs.writeSync(typesFd, ",\n");
          }
        }
        fs.writeSync(typesFd, "]\n");
        fs.closeSync(typesFd);
        ts2.performance.mark("endDumpTypes");
        ts2.performance.measure("Dump types", "beginDumpTypes", "endDumpTypes");
      }
      function dumpLegend() {
        if (!legendPath) {
          return;
        }
        fs.writeFileSync(legendPath, JSON.stringify(legend));
      }
      tracingEnabled2.dumpLegend = dumpLegend;
    })(tracingEnabled || (tracingEnabled = {}));
    ts2.startTracing = tracingEnabled.startTracing;
    ts2.dumpTracingLegend = tracingEnabled.dumpLegend;
  })(ts || (ts = {}));
  (function(ts2) {
    var SyntaxKind;
    (function(SyntaxKind2) {
      SyntaxKind2[SyntaxKind2["Unknown"] = 0] = "Unknown";
      SyntaxKind2[SyntaxKind2["EndOfFileToken"] = 1] = "EndOfFileToken";
      SyntaxKind2[SyntaxKind2["SingleLineCommentTrivia"] = 2] = "SingleLineCommentTrivia";
      SyntaxKind2[SyntaxKind2["MultiLineCommentTrivia"] = 3] = "MultiLineCommentTrivia";
      SyntaxKind2[SyntaxKind2["NewLineTrivia"] = 4] = "NewLineTrivia";
      SyntaxKind2[SyntaxKind2["WhitespaceTrivia"] = 5] = "WhitespaceTrivia";
      SyntaxKind2[SyntaxKind2["ShebangTrivia"] = 6] = "ShebangTrivia";
      SyntaxKind2[SyntaxKind2["ConflictMarkerTrivia"] = 7] = "ConflictMarkerTrivia";
      SyntaxKind2[SyntaxKind2["NumericLiteral"] = 8] = "NumericLiteral";
      SyntaxKind2[SyntaxKind2["BigIntLiteral"] = 9] = "BigIntLiteral";
      SyntaxKind2[SyntaxKind2["StringLiteral"] = 10] = "StringLiteral";
      SyntaxKind2[SyntaxKind2["JsxText"] = 11] = "JsxText";
      SyntaxKind2[SyntaxKind2["JsxTextAllWhiteSpaces"] = 12] = "JsxTextAllWhiteSpaces";
      SyntaxKind2[SyntaxKind2["RegularExpressionLiteral"] = 13] = "RegularExpressionLiteral";
      SyntaxKind2[SyntaxKind2["NoSubstitutionTemplateLiteral"] = 14] = "NoSubstitutionTemplateLiteral";
      SyntaxKind2[SyntaxKind2["TemplateHead"] = 15] = "TemplateHead";
      SyntaxKind2[SyntaxKind2["TemplateMiddle"] = 16] = "TemplateMiddle";
      SyntaxKind2[SyntaxKind2["TemplateTail"] = 17] = "TemplateTail";
      SyntaxKind2[SyntaxKind2["OpenBraceToken"] = 18] = "OpenBraceToken";
      SyntaxKind2[SyntaxKind2["CloseBraceToken"] = 19] = "CloseBraceToken";
      SyntaxKind2[SyntaxKind2["OpenParenToken"] = 20] = "OpenParenToken";
      SyntaxKind2[SyntaxKind2["CloseParenToken"] = 21] = "CloseParenToken";
      SyntaxKind2[SyntaxKind2["OpenBracketToken"] = 22] = "OpenBracketToken";
      SyntaxKind2[SyntaxKind2["CloseBracketToken"] = 23] = "CloseBracketToken";
      SyntaxKind2[SyntaxKind2["DotToken"] = 24] = "DotToken";
      SyntaxKind2[SyntaxKind2["DotDotDotToken"] = 25] = "DotDotDotToken";
      SyntaxKind2[SyntaxKind2["SemicolonToken"] = 26] = "SemicolonToken";
      SyntaxKind2[SyntaxKind2["CommaToken"] = 27] = "CommaToken";
      SyntaxKind2[SyntaxKind2["QuestionDotToken"] = 28] = "QuestionDotToken";
      SyntaxKind2[SyntaxKind2["LessThanToken"] = 29] = "LessThanToken";
      SyntaxKind2[SyntaxKind2["LessThanSlashToken"] = 30] = "LessThanSlashToken";
      SyntaxKind2[SyntaxKind2["GreaterThanToken"] = 31] = "GreaterThanToken";
      SyntaxKind2[SyntaxKind2["LessThanEqualsToken"] = 32] = "LessThanEqualsToken";
      SyntaxKind2[SyntaxKind2["GreaterThanEqualsToken"] = 33] = "GreaterThanEqualsToken";
      SyntaxKind2[SyntaxKind2["EqualsEqualsToken"] = 34] = "EqualsEqualsToken";
      SyntaxKind2[SyntaxKind2["ExclamationEqualsToken"] = 35] = "ExclamationEqualsToken";
      SyntaxKind2[SyntaxKind2["EqualsEqualsEqualsToken"] = 36] = "EqualsEqualsEqualsToken";
      SyntaxKind2[SyntaxKind2["ExclamationEqualsEqualsToken"] = 37] = "ExclamationEqualsEqualsToken";
      SyntaxKind2[SyntaxKind2["EqualsGreaterThanToken"] = 38] = "EqualsGreaterThanToken";
      SyntaxKind2[SyntaxKind2["PlusToken"] = 39] = "PlusToken";
      SyntaxKind2[SyntaxKind2["MinusToken"] = 40] = "MinusToken";
      SyntaxKind2[SyntaxKind2["AsteriskToken"] = 41] = "AsteriskToken";
      SyntaxKind2[SyntaxKind2["AsteriskAsteriskToken"] = 42] = "AsteriskAsteriskToken";
      SyntaxKind2[SyntaxKind2["SlashToken"] = 43] = "SlashToken";
      SyntaxKind2[SyntaxKind2["PercentToken"] = 44] = "PercentToken";
      SyntaxKind2[SyntaxKind2["PlusPlusToken"] = 45] = "PlusPlusToken";
      SyntaxKind2[SyntaxKind2["MinusMinusToken"] = 46] = "MinusMinusToken";
      SyntaxKind2[SyntaxKind2["LessThanLessThanToken"] = 47] = "LessThanLessThanToken";
      SyntaxKind2[SyntaxKind2["GreaterThanGreaterThanToken"] = 48] = "GreaterThanGreaterThanToken";
      SyntaxKind2[SyntaxKind2["GreaterThanGreaterThanGreaterThanToken"] = 49] = "GreaterThanGreaterThanGreaterThanToken";
      SyntaxKind2[SyntaxKind2["AmpersandToken"] = 50] = "AmpersandToken";
      SyntaxKind2[SyntaxKind2["BarToken"] = 51] = "BarToken";
      SyntaxKind2[SyntaxKind2["CaretToken"] = 52] = "CaretToken";
      SyntaxKind2[SyntaxKind2["ExclamationToken"] = 53] = "ExclamationToken";
      SyntaxKind2[SyntaxKind2["TildeToken"] = 54] = "TildeToken";
      SyntaxKind2[SyntaxKind2["AmpersandAmpersandToken"] = 55] = "AmpersandAmpersandToken";
      SyntaxKind2[SyntaxKind2["BarBarToken"] = 56] = "BarBarToken";
      SyntaxKind2[SyntaxKind2["QuestionToken"] = 57] = "QuestionToken";
      SyntaxKind2[SyntaxKind2["ColonToken"] = 58] = "ColonToken";
      SyntaxKind2[SyntaxKind2["AtToken"] = 59] = "AtToken";
      SyntaxKind2[SyntaxKind2["QuestionQuestionToken"] = 60] = "QuestionQuestionToken";
      SyntaxKind2[SyntaxKind2["BacktickToken"] = 61] = "BacktickToken";
      SyntaxKind2[SyntaxKind2["HashToken"] = 62] = "HashToken";
      SyntaxKind2[SyntaxKind2["EqualsToken"] = 63] = "EqualsToken";
      SyntaxKind2[SyntaxKind2["PlusEqualsToken"] = 64] = "PlusEqualsToken";
      SyntaxKind2[SyntaxKind2["MinusEqualsToken"] = 65] = "MinusEqualsToken";
      SyntaxKind2[SyntaxKind2["AsteriskEqualsToken"] = 66] = "AsteriskEqualsToken";
      SyntaxKind2[SyntaxKind2["AsteriskAsteriskEqualsToken"] = 67] = "AsteriskAsteriskEqualsToken";
      SyntaxKind2[SyntaxKind2["SlashEqualsToken"] = 68] = "SlashEqualsToken";
      SyntaxKind2[SyntaxKind2["PercentEqualsToken"] = 69] = "PercentEqualsToken";
      SyntaxKind2[SyntaxKind2["LessThanLessThanEqualsToken"] = 70] = "LessThanLessThanEqualsToken";
      SyntaxKind2[SyntaxKind2["GreaterThanGreaterThanEqualsToken"] = 71] = "GreaterThanGreaterThanEqualsToken";
      SyntaxKind2[SyntaxKind2["GreaterThanGreaterThanGreaterThanEqualsToken"] = 72] = "GreaterThanGreaterThanGreaterThanEqualsToken";
      SyntaxKind2[SyntaxKind2["AmpersandEqualsToken"] = 73] = "AmpersandEqualsToken";
      SyntaxKind2[SyntaxKind2["BarEqualsToken"] = 74] = "BarEqualsToken";
      SyntaxKind2[SyntaxKind2["BarBarEqualsToken"] = 75] = "BarBarEqualsToken";
      SyntaxKind2[SyntaxKind2["AmpersandAmpersandEqualsToken"] = 76] = "AmpersandAmpersandEqualsToken";
      SyntaxKind2[SyntaxKind2["QuestionQuestionEqualsToken"] = 77] = "QuestionQuestionEqualsToken";
      SyntaxKind2[SyntaxKind2["CaretEqualsToken"] = 78] = "CaretEqualsToken";
      SyntaxKind2[SyntaxKind2["Identifier"] = 79] = "Identifier";
      SyntaxKind2[SyntaxKind2["PrivateIdentifier"] = 80] = "PrivateIdentifier";
      SyntaxKind2[SyntaxKind2["BreakKeyword"] = 81] = "BreakKeyword";
      SyntaxKind2[SyntaxKind2["CaseKeyword"] = 82] = "CaseKeyword";
      SyntaxKind2[SyntaxKind2["CatchKeyword"] = 83] = "CatchKeyword";
      SyntaxKind2[SyntaxKind2["ClassKeyword"] = 84] = "ClassKeyword";
      SyntaxKind2[SyntaxKind2["ConstKeyword"] = 85] = "ConstKeyword";
      SyntaxKind2[SyntaxKind2["ContinueKeyword"] = 86] = "ContinueKeyword";
      SyntaxKind2[SyntaxKind2["DebuggerKeyword"] = 87] = "DebuggerKeyword";
      SyntaxKind2[SyntaxKind2["DefaultKeyword"] = 88] = "DefaultKeyword";
      SyntaxKind2[SyntaxKind2["DeleteKeyword"] = 89] = "DeleteKeyword";
      SyntaxKind2[SyntaxKind2["DoKeyword"] = 90] = "DoKeyword";
      SyntaxKind2[SyntaxKind2["ElseKeyword"] = 91] = "ElseKeyword";
      SyntaxKind2[SyntaxKind2["EnumKeyword"] = 92] = "EnumKeyword";
      SyntaxKind2[SyntaxKind2["ExportKeyword"] = 93] = "ExportKeyword";
      SyntaxKind2[SyntaxKind2["ExtendsKeyword"] = 94] = "ExtendsKeyword";
      SyntaxKind2[SyntaxKind2["FalseKeyword"] = 95] = "FalseKeyword";
      SyntaxKind2[SyntaxKind2["FinallyKeyword"] = 96] = "FinallyKeyword";
      SyntaxKind2[SyntaxKind2["ForKeyword"] = 97] = "ForKeyword";
      SyntaxKind2[SyntaxKind2["FunctionKeyword"] = 98] = "FunctionKeyword";
      SyntaxKind2[SyntaxKind2["IfKeyword"] = 99] = "IfKeyword";
      SyntaxKind2[SyntaxKind2["ImportKeyword"] = 100] = "ImportKeyword";
      SyntaxKind2[SyntaxKind2["InKeyword"] = 101] = "InKeyword";
      SyntaxKind2[SyntaxKind2["InstanceOfKeyword"] = 102] = "InstanceOfKeyword";
      SyntaxKind2[SyntaxKind2["NewKeyword"] = 103] = "NewKeyword";
      SyntaxKind2[SyntaxKind2["NullKeyword"] = 104] = "NullKeyword";
      SyntaxKind2[SyntaxKind2["ReturnKeyword"] = 105] = "ReturnKeyword";
      SyntaxKind2[SyntaxKind2["SuperKeyword"] = 106] = "SuperKeyword";
      SyntaxKind2[SyntaxKind2["SwitchKeyword"] = 107] = "SwitchKeyword";
      SyntaxKind2[SyntaxKind2["ThisKeyword"] = 108] = "ThisKeyword";
      SyntaxKind2[SyntaxKind2["ThrowKeyword"] = 109] = "ThrowKeyword";
      SyntaxKind2[SyntaxKind2["TrueKeyword"] = 110] = "TrueKeyword";
      SyntaxKind2[SyntaxKind2["TryKeyword"] = 111] = "TryKeyword";
      SyntaxKind2[SyntaxKind2["TypeOfKeyword"] = 112] = "TypeOfKeyword";
      SyntaxKind2[SyntaxKind2["VarKeyword"] = 113] = "VarKeyword";
      SyntaxKind2[SyntaxKind2["VoidKeyword"] = 114] = "VoidKeyword";
      SyntaxKind2[SyntaxKind2["WhileKeyword"] = 115] = "WhileKeyword";
      SyntaxKind2[SyntaxKind2["WithKeyword"] = 116] = "WithKeyword";
      SyntaxKind2[SyntaxKind2["ImplementsKeyword"] = 117] = "ImplementsKeyword";
      SyntaxKind2[SyntaxKind2["InterfaceKeyword"] = 118] = "InterfaceKeyword";
      SyntaxKind2[SyntaxKind2["LetKeyword"] = 119] = "LetKeyword";
      SyntaxKind2[SyntaxKind2["PackageKeyword"] = 120] = "PackageKeyword";
      SyntaxKind2[SyntaxKind2["PrivateKeyword"] = 121] = "PrivateKeyword";
      SyntaxKind2[SyntaxKind2["ProtectedKeyword"] = 122] = "ProtectedKeyword";
      SyntaxKind2[SyntaxKind2["PublicKeyword"] = 123] = "PublicKeyword";
      SyntaxKind2[SyntaxKind2["StaticKeyword"] = 124] = "StaticKeyword";
      SyntaxKind2[SyntaxKind2["YieldKeyword"] = 125] = "YieldKeyword";
      SyntaxKind2[SyntaxKind2["AbstractKeyword"] = 126] = "AbstractKeyword";
      SyntaxKind2[SyntaxKind2["AsKeyword"] = 127] = "AsKeyword";
      SyntaxKind2[SyntaxKind2["AssertsKeyword"] = 128] = "AssertsKeyword";
      SyntaxKind2[SyntaxKind2["AssertKeyword"] = 129] = "AssertKeyword";
      SyntaxKind2[SyntaxKind2["AnyKeyword"] = 130] = "AnyKeyword";
      SyntaxKind2[SyntaxKind2["AsyncKeyword"] = 131] = "AsyncKeyword";
      SyntaxKind2[SyntaxKind2["AwaitKeyword"] = 132] = "AwaitKeyword";
      SyntaxKind2[SyntaxKind2["BooleanKeyword"] = 133] = "BooleanKeyword";
      SyntaxKind2[SyntaxKind2["ConstructorKeyword"] = 134] = "ConstructorKeyword";
      SyntaxKind2[SyntaxKind2["DeclareKeyword"] = 135] = "DeclareKeyword";
      SyntaxKind2[SyntaxKind2["GetKeyword"] = 136] = "GetKeyword";
      SyntaxKind2[SyntaxKind2["InferKeyword"] = 137] = "InferKeyword";
      SyntaxKind2[SyntaxKind2["IntrinsicKeyword"] = 138] = "IntrinsicKeyword";
      SyntaxKind2[SyntaxKind2["IsKeyword"] = 139] = "IsKeyword";
      SyntaxKind2[SyntaxKind2["KeyOfKeyword"] = 140] = "KeyOfKeyword";
      SyntaxKind2[SyntaxKind2["ModuleKeyword"] = 141] = "ModuleKeyword";
      SyntaxKind2[SyntaxKind2["NamespaceKeyword"] = 142] = "NamespaceKeyword";
      SyntaxKind2[SyntaxKind2["NeverKeyword"] = 143] = "NeverKeyword";
      SyntaxKind2[SyntaxKind2["ReadonlyKeyword"] = 144] = "ReadonlyKeyword";
      SyntaxKind2[SyntaxKind2["RequireKeyword"] = 145] = "RequireKeyword";
      SyntaxKind2[SyntaxKind2["NumberKeyword"] = 146] = "NumberKeyword";
      SyntaxKind2[SyntaxKind2["ObjectKeyword"] = 147] = "ObjectKeyword";
      SyntaxKind2[SyntaxKind2["SetKeyword"] = 148] = "SetKeyword";
      SyntaxKind2[SyntaxKind2["StringKeyword"] = 149] = "StringKeyword";
      SyntaxKind2[SyntaxKind2["SymbolKeyword"] = 150] = "SymbolKeyword";
      SyntaxKind2[SyntaxKind2["TypeKeyword"] = 151] = "TypeKeyword";
      SyntaxKind2[SyntaxKind2["UndefinedKeyword"] = 152] = "UndefinedKeyword";
      SyntaxKind2[SyntaxKind2["UniqueKeyword"] = 153] = "UniqueKeyword";
      SyntaxKind2[SyntaxKind2["UnknownKeyword"] = 154] = "UnknownKeyword";
      SyntaxKind2[SyntaxKind2["FromKeyword"] = 155] = "FromKeyword";
      SyntaxKind2[SyntaxKind2["GlobalKeyword"] = 156] = "GlobalKeyword";
      SyntaxKind2[SyntaxKind2["BigIntKeyword"] = 157] = "BigIntKeyword";
      SyntaxKind2[SyntaxKind2["OverrideKeyword"] = 158] = "OverrideKeyword";
      SyntaxKind2[SyntaxKind2["OfKeyword"] = 159] = "OfKeyword";
      SyntaxKind2[SyntaxKind2["QualifiedName"] = 160] = "QualifiedName";
      SyntaxKind2[SyntaxKind2["ComputedPropertyName"] = 161] = "ComputedPropertyName";
      SyntaxKind2[SyntaxKind2["TypeParameter"] = 162] = "TypeParameter";
      SyntaxKind2[SyntaxKind2["Parameter"] = 163] = "Parameter";
      SyntaxKind2[SyntaxKind2["Decorator"] = 164] = "Decorator";
      SyntaxKind2[SyntaxKind2["PropertySignature"] = 165] = "PropertySignature";
      SyntaxKind2[SyntaxKind2["PropertyDeclaration"] = 166] = "PropertyDeclaration";
      SyntaxKind2[SyntaxKind2["MethodSignature"] = 167] = "MethodSignature";
      SyntaxKind2[SyntaxKind2["MethodDeclaration"] = 168] = "MethodDeclaration";
      SyntaxKind2[SyntaxKind2["ClassStaticBlockDeclaration"] = 169] = "ClassStaticBlockDeclaration";
      SyntaxKind2[SyntaxKind2["Constructor"] = 170] = "Constructor";
      SyntaxKind2[SyntaxKind2["GetAccessor"] = 171] = "GetAccessor";
      SyntaxKind2[SyntaxKind2["SetAccessor"] = 172] = "SetAccessor";
      SyntaxKind2[SyntaxKind2["CallSignature"] = 173] = "CallSignature";
      SyntaxKind2[SyntaxKind2["ConstructSignature"] = 174] = "ConstructSignature";
      SyntaxKind2[SyntaxKind2["IndexSignature"] = 175] = "IndexSignature";
      SyntaxKind2[SyntaxKind2["TypePredicate"] = 176] = "TypePredicate";
      SyntaxKind2[SyntaxKind2["TypeReference"] = 177] = "TypeReference";
      SyntaxKind2[SyntaxKind2["FunctionType"] = 178] = "FunctionType";
      SyntaxKind2[SyntaxKind2["ConstructorType"] = 179] = "ConstructorType";
      SyntaxKind2[SyntaxKind2["TypeQuery"] = 180] = "TypeQuery";
      SyntaxKind2[SyntaxKind2["TypeLiteral"] = 181] = "TypeLiteral";
      SyntaxKind2[SyntaxKind2["ArrayType"] = 182] = "ArrayType";
      SyntaxKind2[SyntaxKind2["TupleType"] = 183] = "TupleType";
      SyntaxKind2[SyntaxKind2["OptionalType"] = 184] = "OptionalType";
      SyntaxKind2[SyntaxKind2["RestType"] = 185] = "RestType";
      SyntaxKind2[SyntaxKind2["UnionType"] = 186] = "UnionType";
      SyntaxKind2[SyntaxKind2["IntersectionType"] = 187] = "IntersectionType";
      SyntaxKind2[SyntaxKind2["ConditionalType"] = 188] = "ConditionalType";
      SyntaxKind2[SyntaxKind2["InferType"] = 189] = "InferType";
      SyntaxKind2[SyntaxKind2["ParenthesizedType"] = 190] = "ParenthesizedType";
      SyntaxKind2[SyntaxKind2["ThisType"] = 191] = "ThisType";
      SyntaxKind2[SyntaxKind2["TypeOperator"] = 192] = "TypeOperator";
      SyntaxKind2[SyntaxKind2["IndexedAccessType"] = 193] = "IndexedAccessType";
      SyntaxKind2[SyntaxKind2["MappedType"] = 194] = "MappedType";
      SyntaxKind2[SyntaxKind2["LiteralType"] = 195] = "LiteralType";
      SyntaxKind2[SyntaxKind2["NamedTupleMember"] = 196] = "NamedTupleMember";
      SyntaxKind2[SyntaxKind2["TemplateLiteralType"] = 197] = "TemplateLiteralType";
      SyntaxKind2[SyntaxKind2["TemplateLiteralTypeSpan"] = 198] = "TemplateLiteralTypeSpan";
      SyntaxKind2[SyntaxKind2["ImportType"] = 199] = "ImportType";
      SyntaxKind2[SyntaxKind2["ObjectBindingPattern"] = 200] = "ObjectBindingPattern";
      SyntaxKind2[SyntaxKind2["ArrayBindingPattern"] = 201] = "ArrayBindingPattern";
      SyntaxKind2[SyntaxKind2["BindingElement"] = 202] = "BindingElement";
      SyntaxKind2[SyntaxKind2["ArrayLiteralExpression"] = 203] = "ArrayLiteralExpression";
      SyntaxKind2[SyntaxKind2["ObjectLiteralExpression"] = 204] = "ObjectLiteralExpression";
      SyntaxKind2[SyntaxKind2["PropertyAccessExpression"] = 205] = "PropertyAccessExpression";
      SyntaxKind2[SyntaxKind2["ElementAccessExpression"] = 206] = "ElementAccessExpression";
      SyntaxKind2[SyntaxKind2["CallExpression"] = 207] = "CallExpression";
      SyntaxKind2[SyntaxKind2["NewExpression"] = 208] = "NewExpression";
      SyntaxKind2[SyntaxKind2["TaggedTemplateExpression"] = 209] = "TaggedTemplateExpression";
      SyntaxKind2[SyntaxKind2["TypeAssertionExpression"] = 210] = "TypeAssertionExpression";
      SyntaxKind2[SyntaxKind2["ParenthesizedExpression"] = 211] = "ParenthesizedExpression";
      SyntaxKind2[SyntaxKind2["FunctionExpression"] = 212] = "FunctionExpression";
      SyntaxKind2[SyntaxKind2["ArrowFunction"] = 213] = "ArrowFunction";
      SyntaxKind2[SyntaxKind2["DeleteExpression"] = 214] = "DeleteExpression";
      SyntaxKind2[SyntaxKind2["TypeOfExpression"] = 215] = "TypeOfExpression";
      SyntaxKind2[SyntaxKind2["VoidExpression"] = 216] = "VoidExpression";
      SyntaxKind2[SyntaxKind2["AwaitExpression"] = 217] = "AwaitExpression";
      SyntaxKind2[SyntaxKind2["PrefixUnaryExpression"] = 218] = "PrefixUnaryExpression";
      SyntaxKind2[SyntaxKind2["PostfixUnaryExpression"] = 219] = "PostfixUnaryExpression";
      SyntaxKind2[SyntaxKind2["BinaryExpression"] = 220] = "BinaryExpression";
      SyntaxKind2[SyntaxKind2["ConditionalExpression"] = 221] = "ConditionalExpression";
      SyntaxKind2[SyntaxKind2["TemplateExpression"] = 222] = "TemplateExpression";
      SyntaxKind2[SyntaxKind2["YieldExpression"] = 223] = "YieldExpression";
      SyntaxKind2[SyntaxKind2["SpreadElement"] = 224] = "SpreadElement";
      SyntaxKind2[SyntaxKind2["ClassExpression"] = 225] = "ClassExpression";
      SyntaxKind2[SyntaxKind2["OmittedExpression"] = 226] = "OmittedExpression";
      SyntaxKind2[SyntaxKind2["ExpressionWithTypeArguments"] = 227] = "ExpressionWithTypeArguments";
      SyntaxKind2[SyntaxKind2["AsExpression"] = 228] = "AsExpression";
      SyntaxKind2[SyntaxKind2["NonNullExpression"] = 229] = "NonNullExpression";
      SyntaxKind2[SyntaxKind2["MetaProperty"] = 230] = "MetaProperty";
      SyntaxKind2[SyntaxKind2["SyntheticExpression"] = 231] = "SyntheticExpression";
      SyntaxKind2[SyntaxKind2["TemplateSpan"] = 232] = "TemplateSpan";
      SyntaxKind2[SyntaxKind2["SemicolonClassElement"] = 233] = "SemicolonClassElement";
      SyntaxKind2[SyntaxKind2["Block"] = 234] = "Block";
      SyntaxKind2[SyntaxKind2["EmptyStatement"] = 235] = "EmptyStatement";
      SyntaxKind2[SyntaxKind2["VariableStatement"] = 236] = "VariableStatement";
      SyntaxKind2[SyntaxKind2["ExpressionStatement"] = 237] = "ExpressionStatement";
      SyntaxKind2[SyntaxKind2["IfStatement"] = 238] = "IfStatement";
      SyntaxKind2[SyntaxKind2["DoStatement"] = 239] = "DoStatement";
      SyntaxKind2[SyntaxKind2["WhileStatement"] = 240] = "WhileStatement";
      SyntaxKind2[SyntaxKind2["ForStatement"] = 241] = "ForStatement";
      SyntaxKind2[SyntaxKind2["ForInStatement"] = 242] = "ForInStatement";
      SyntaxKind2[SyntaxKind2["ForOfStatement"] = 243] = "ForOfStatement";
      SyntaxKind2[SyntaxKind2["ContinueStatement"] = 244] = "ContinueStatement";
      SyntaxKind2[SyntaxKind2["BreakStatement"] = 245] = "BreakStatement";
      SyntaxKind2[SyntaxKind2["ReturnStatement"] = 246] = "ReturnStatement";
      SyntaxKind2[SyntaxKind2["WithStatement"] = 247] = "WithStatement";
      SyntaxKind2[SyntaxKind2["SwitchStatement"] = 248] = "SwitchStatement";
      SyntaxKind2[SyntaxKind2["LabeledStatement"] = 249] = "LabeledStatement";
      SyntaxKind2[SyntaxKind2["ThrowStatement"] = 250] = "ThrowStatement";
      SyntaxKind2[SyntaxKind2["TryStatement"] = 251] = "TryStatement";
      SyntaxKind2[SyntaxKind2["DebuggerStatement"] = 252] = "DebuggerStatement";
      SyntaxKind2[SyntaxKind2["VariableDeclaration"] = 253] = "VariableDeclaration";
      SyntaxKind2[SyntaxKind2["VariableDeclarationList"] = 254] = "VariableDeclarationList";
      SyntaxKind2[SyntaxKind2["FunctionDeclaration"] = 255] = "FunctionDeclaration";
      SyntaxKind2[SyntaxKind2["ClassDeclaration"] = 256] = "ClassDeclaration";
      SyntaxKind2[SyntaxKind2["InterfaceDeclaration"] = 257] = "InterfaceDeclaration";
      SyntaxKind2[SyntaxKind2["TypeAliasDeclaration"] = 258] = "TypeAliasDeclaration";
      SyntaxKind2[SyntaxKind2["EnumDeclaration"] = 259] = "EnumDeclaration";
      SyntaxKind2[SyntaxKind2["ModuleDeclaration"] = 260] = "ModuleDeclaration";
      SyntaxKind2[SyntaxKind2["ModuleBlock"] = 261] = "ModuleBlock";
      SyntaxKind2[SyntaxKind2["CaseBlock"] = 262] = "CaseBlock";
      SyntaxKind2[SyntaxKind2["NamespaceExportDeclaration"] = 263] = "NamespaceExportDeclaration";
      SyntaxKind2[SyntaxKind2["ImportEqualsDeclaration"] = 264] = "ImportEqualsDeclaration";
      SyntaxKind2[SyntaxKind2["ImportDeclaration"] = 265] = "ImportDeclaration";
      SyntaxKind2[SyntaxKind2["ImportClause"] = 266] = "ImportClause";
      SyntaxKind2[SyntaxKind2["NamespaceImport"] = 267] = "NamespaceImport";
      SyntaxKind2[SyntaxKind2["NamedImports"] = 268] = "NamedImports";
      SyntaxKind2[SyntaxKind2["ImportSpecifier"] = 269] = "ImportSpecifier";
      SyntaxKind2[SyntaxKind2["ExportAssignment"] = 270] = "ExportAssignment";
      SyntaxKind2[SyntaxKind2["ExportDeclaration"] = 271] = "ExportDeclaration";
      SyntaxKind2[SyntaxKind2["NamedExports"] = 272] = "NamedExports";
      SyntaxKind2[SyntaxKind2["NamespaceExport"] = 273] = "NamespaceExport";
      SyntaxKind2[SyntaxKind2["ExportSpecifier"] = 274] = "ExportSpecifier";
      SyntaxKind2[SyntaxKind2["MissingDeclaration"] = 275] = "MissingDeclaration";
      SyntaxKind2[SyntaxKind2["ExternalModuleReference"] = 276] = "ExternalModuleReference";
      SyntaxKind2[SyntaxKind2["JsxElement"] = 277] = "JsxElement";
      SyntaxKind2[SyntaxKind2["JsxSelfClosingElement"] = 278] = "JsxSelfClosingElement";
      SyntaxKind2[SyntaxKind2["JsxOpeningElement"] = 279] = "JsxOpeningElement";
      SyntaxKind2[SyntaxKind2["JsxClosingElement"] = 280] = "JsxClosingElement";
      SyntaxKind2[SyntaxKind2["JsxFragment"] = 281] = "JsxFragment";
      SyntaxKind2[SyntaxKind2["JsxOpeningFragment"] = 282] = "JsxOpeningFragment";
      SyntaxKind2[SyntaxKind2["JsxClosingFragment"] = 283] = "JsxClosingFragment";
      SyntaxKind2[SyntaxKind2["JsxAttribute"] = 284] = "JsxAttribute";
      SyntaxKind2[SyntaxKind2["JsxAttributes"] = 285] = "JsxAttributes";
      SyntaxKind2[SyntaxKind2["JsxSpreadAttribute"] = 286] = "JsxSpreadAttribute";
      SyntaxKind2[SyntaxKind2["JsxExpression"] = 287] = "JsxExpression";
      SyntaxKind2[SyntaxKind2["CaseClause"] = 288] = "CaseClause";
      SyntaxKind2[SyntaxKind2["DefaultClause"] = 289] = "DefaultClause";
      SyntaxKind2[SyntaxKind2["HeritageClause"] = 290] = "HeritageClause";
      SyntaxKind2[SyntaxKind2["CatchClause"] = 291] = "CatchClause";
      SyntaxKind2[SyntaxKind2["AssertClause"] = 292] = "AssertClause";
      SyntaxKind2[SyntaxKind2["AssertEntry"] = 293] = "AssertEntry";
      SyntaxKind2[SyntaxKind2["PropertyAssignment"] = 294] = "PropertyAssignment";
      SyntaxKind2[SyntaxKind2["ShorthandPropertyAssignment"] = 295] = "ShorthandPropertyAssignment";
      SyntaxKind2[SyntaxKind2["SpreadAssignment"] = 296] = "SpreadAssignment";
      SyntaxKind2[SyntaxKind2["EnumMember"] = 297] = "EnumMember";
      SyntaxKind2[SyntaxKind2["UnparsedPrologue"] = 298] = "UnparsedPrologue";
      SyntaxKind2[SyntaxKind2["UnparsedPrepend"] = 299] = "UnparsedPrepend";
      SyntaxKind2[SyntaxKind2["UnparsedText"] = 300] = "UnparsedText";
      SyntaxKind2[SyntaxKind2["UnparsedInternalText"] = 301] = "UnparsedInternalText";
      SyntaxKind2[SyntaxKind2["UnparsedSyntheticReference"] = 302] = "UnparsedSyntheticReference";
      SyntaxKind2[SyntaxKind2["SourceFile"] = 303] = "SourceFile";
      SyntaxKind2[SyntaxKind2["Bundle"] = 304] = "Bundle";
      SyntaxKind2[SyntaxKind2["UnparsedSource"] = 305] = "UnparsedSource";
      SyntaxKind2[SyntaxKind2["InputFiles"] = 306] = "InputFiles";
      SyntaxKind2[SyntaxKind2["JSDocTypeExpression"] = 307] = "JSDocTypeExpression";
      SyntaxKind2[SyntaxKind2["JSDocNameReference"] = 308] = "JSDocNameReference";
      SyntaxKind2[SyntaxKind2["JSDocMemberName"] = 309] = "JSDocMemberName";
      SyntaxKind2[SyntaxKind2["JSDocAllType"] = 310] = "JSDocAllType";
      SyntaxKind2[SyntaxKind2["JSDocUnknownType"] = 311] = "JSDocUnknownType";
      SyntaxKind2[SyntaxKind2["JSDocNullableType"] = 312] = "JSDocNullableType";
      SyntaxKind2[SyntaxKind2["JSDocNonNullableType"] = 313] = "JSDocNonNullableType";
      SyntaxKind2[SyntaxKind2["JSDocOptionalType"] = 314] = "JSDocOptionalType";
      SyntaxKind2[SyntaxKind2["JSDocFunctionType"] = 315] = "JSDocFunctionType";
      SyntaxKind2[SyntaxKind2["JSDocVariadicType"] = 316] = "JSDocVariadicType";
      SyntaxKind2[SyntaxKind2["JSDocNamepathType"] = 317] = "JSDocNamepathType";
      SyntaxKind2[SyntaxKind2["JSDocComment"] = 318] = "JSDocComment";
      SyntaxKind2[SyntaxKind2["JSDocText"] = 319] = "JSDocText";
      SyntaxKind2[SyntaxKind2["JSDocTypeLiteral"] = 320] = "JSDocTypeLiteral";
      SyntaxKind2[SyntaxKind2["JSDocSignature"] = 321] = "JSDocSignature";
      SyntaxKind2[SyntaxKind2["JSDocLink"] = 322] = "JSDocLink";
      SyntaxKind2[SyntaxKind2["JSDocLinkCode"] = 323] = "JSDocLinkCode";
      SyntaxKind2[SyntaxKind2["JSDocLinkPlain"] = 324] = "JSDocLinkPlain";
      SyntaxKind2[SyntaxKind2["JSDocTag"] = 325] = "JSDocTag";
      SyntaxKind2[SyntaxKind2["JSDocAugmentsTag"] = 326] = "JSDocAugmentsTag";
      SyntaxKind2[SyntaxKind2["JSDocImplementsTag"] = 327] = "JSDocImplementsTag";
      SyntaxKind2[SyntaxKind2["JSDocAuthorTag"] = 328] = "JSDocAuthorTag";
      SyntaxKind2[SyntaxKind2["JSDocDeprecatedTag"] = 329] = "JSDocDeprecatedTag";
      SyntaxKind2[SyntaxKind2["JSDocClassTag"] = 330] = "JSDocClassTag";
      SyntaxKind2[SyntaxKind2["JSDocPublicTag"] = 331] = "JSDocPublicTag";
      SyntaxKind2[SyntaxKind2["JSDocPrivateTag"] = 332] = "JSDocPrivateTag";
      SyntaxKind2[SyntaxKind2["JSDocProtectedTag"] = 333] = "JSDocProtectedTag";
      SyntaxKind2[SyntaxKind2["JSDocReadonlyTag"] = 334] = "JSDocReadonlyTag";
      SyntaxKind2[SyntaxKind2["JSDocOverrideTag"] = 335] = "JSDocOverrideTag";
      SyntaxKind2[SyntaxKind2["JSDocCallbackTag"] = 336] = "JSDocCallbackTag";
      SyntaxKind2[SyntaxKind2["JSDocEnumTag"] = 337] = "JSDocEnumTag";
      SyntaxKind2[SyntaxKind2["JSDocParameterTag"] = 338] = "JSDocParameterTag";
      SyntaxKind2[SyntaxKind2["JSDocReturnTag"] = 339] = "JSDocReturnTag";
      SyntaxKind2[SyntaxKind2["JSDocThisTag"] = 340] = "JSDocThisTag";
      SyntaxKind2[SyntaxKind2["JSDocTypeTag"] = 341] = "JSDocTypeTag";
      SyntaxKind2[SyntaxKind2["JSDocTemplateTag"] = 342] = "JSDocTemplateTag";
      SyntaxKind2[SyntaxKind2["JSDocTypedefTag"] = 343] = "JSDocTypedefTag";
      SyntaxKind2[SyntaxKind2["JSDocSeeTag"] = 344] = "JSDocSeeTag";
      SyntaxKind2[SyntaxKind2["JSDocPropertyTag"] = 345] = "JSDocPropertyTag";
      SyntaxKind2[SyntaxKind2["SyntaxList"] = 346] = "SyntaxList";
      SyntaxKind2[SyntaxKind2["NotEmittedStatement"] = 347] = "NotEmittedStatement";
      SyntaxKind2[SyntaxKind2["PartiallyEmittedExpression"] = 348] = "PartiallyEmittedExpression";
      SyntaxKind2[SyntaxKind2["CommaListExpression"] = 349] = "CommaListExpression";
      SyntaxKind2[SyntaxKind2["MergeDeclarationMarker"] = 350] = "MergeDeclarationMarker";
      SyntaxKind2[SyntaxKind2["EndOfDeclarationMarker"] = 351] = "EndOfDeclarationMarker";
      SyntaxKind2[SyntaxKind2["SyntheticReferenceExpression"] = 352] = "SyntheticReferenceExpression";
      SyntaxKind2[SyntaxKind2["Count"] = 353] = "Count";
      SyntaxKind2[SyntaxKind2["FirstAssignment"] = 63] = "FirstAssignment";
      SyntaxKind2[SyntaxKind2["LastAssignment"] = 78] = "LastAssignment";
      SyntaxKind2[SyntaxKind2["FirstCompoundAssignment"] = 64] = "FirstCompoundAssignment";
      SyntaxKind2[SyntaxKind2["LastCompoundAssignment"] = 78] = "LastCompoundAssignment";
      SyntaxKind2[SyntaxKind2["FirstReservedWord"] = 81] = "FirstReservedWord";
      SyntaxKind2[SyntaxKind2["LastReservedWord"] = 116] = "LastReservedWord";
      SyntaxKind2[SyntaxKind2["FirstKeyword"] = 81] = "FirstKeyword";
      SyntaxKind2[SyntaxKind2["LastKeyword"] = 159] = "LastKeyword";
      SyntaxKind2[SyntaxKind2["FirstFutureReservedWord"] = 117] = "FirstFutureReservedWord";
      SyntaxKind2[SyntaxKind2["LastFutureReservedWord"] = 125] = "LastFutureReservedWord";
      SyntaxKind2[SyntaxKind2["FirstTypeNode"] = 176] = "FirstTypeNode";
      SyntaxKind2[SyntaxKind2["LastTypeNode"] = 199] = "LastTypeNode";
      SyntaxKind2[SyntaxKind2["FirstPunctuation"] = 18] = "FirstPunctuation";
      SyntaxKind2[SyntaxKind2["LastPunctuation"] = 78] = "LastPunctuation";
      SyntaxKind2[SyntaxKind2["FirstToken"] = 0] = "FirstToken";
      SyntaxKind2[SyntaxKind2["LastToken"] = 159] = "LastToken";
      SyntaxKind2[SyntaxKind2["FirstTriviaToken"] = 2] = "FirstTriviaToken";
      SyntaxKind2[SyntaxKind2["LastTriviaToken"] = 7] = "LastTriviaToken";
      SyntaxKind2[SyntaxKind2["FirstLiteralToken"] = 8] = "FirstLiteralToken";
      SyntaxKind2[SyntaxKind2["LastLiteralToken"] = 14] = "LastLiteralToken";
      SyntaxKind2[SyntaxKind2["FirstTemplateToken"] = 14] = "FirstTemplateToken";
      SyntaxKind2[SyntaxKind2["LastTemplateToken"] = 17] = "LastTemplateToken";
      SyntaxKind2[SyntaxKind2["FirstBinaryOperator"] = 29] = "FirstBinaryOperator";
      SyntaxKind2[SyntaxKind2["LastBinaryOperator"] = 78] = "LastBinaryOperator";
      SyntaxKind2[SyntaxKind2["FirstStatement"] = 236] = "FirstStatement";
      SyntaxKind2[SyntaxKind2["LastStatement"] = 252] = "LastStatement";
      SyntaxKind2[SyntaxKind2["FirstNode"] = 160] = "FirstNode";
      SyntaxKind2[SyntaxKind2["FirstJSDocNode"] = 307] = "FirstJSDocNode";
      SyntaxKind2[SyntaxKind2["LastJSDocNode"] = 345] = "LastJSDocNode";
      SyntaxKind2[SyntaxKind2["FirstJSDocTagNode"] = 325] = "FirstJSDocTagNode";
      SyntaxKind2[SyntaxKind2["LastJSDocTagNode"] = 345] = "LastJSDocTagNode";
      SyntaxKind2[SyntaxKind2["FirstContextualKeyword"] = 126] = "FirstContextualKeyword";
      SyntaxKind2[SyntaxKind2["LastContextualKeyword"] = 159] = "LastContextualKeyword";
    })(SyntaxKind = ts2.SyntaxKind || (ts2.SyntaxKind = {}));
    var NodeFlags;
    (function(NodeFlags2) {
      NodeFlags2[NodeFlags2["None"] = 0] = "None";
      NodeFlags2[NodeFlags2["Let"] = 1] = "Let";
      NodeFlags2[NodeFlags2["Const"] = 2] = "Const";
      NodeFlags2[NodeFlags2["NestedNamespace"] = 4] = "NestedNamespace";
      NodeFlags2[NodeFlags2["Synthesized"] = 8] = "Synthesized";
      NodeFlags2[NodeFlags2["Namespace"] = 16] = "Namespace";
      NodeFlags2[NodeFlags2["OptionalChain"] = 32] = "OptionalChain";
      NodeFlags2[NodeFlags2["ExportContext"] = 64] = "ExportContext";
      NodeFlags2[NodeFlags2["ContainsThis"] = 128] = "ContainsThis";
      NodeFlags2[NodeFlags2["HasImplicitReturn"] = 256] = "HasImplicitReturn";
      NodeFlags2[NodeFlags2["HasExplicitReturn"] = 512] = "HasExplicitReturn";
      NodeFlags2[NodeFlags2["GlobalAugmentation"] = 1024] = "GlobalAugmentation";
      NodeFlags2[NodeFlags2["HasAsyncFunctions"] = 2048] = "HasAsyncFunctions";
      NodeFlags2[NodeFlags2["DisallowInContext"] = 4096] = "DisallowInContext";
      NodeFlags2[NodeFlags2["YieldContext"] = 8192] = "YieldContext";
      NodeFlags2[NodeFlags2["DecoratorContext"] = 16384] = "DecoratorContext";
      NodeFlags2[NodeFlags2["AwaitContext"] = 32768] = "AwaitContext";
      NodeFlags2[NodeFlags2["ThisNodeHasError"] = 65536] = "ThisNodeHasError";
      NodeFlags2[NodeFlags2["JavaScriptFile"] = 131072] = "JavaScriptFile";
      NodeFlags2[NodeFlags2["ThisNodeOrAnySubNodesHasError"] = 262144] = "ThisNodeOrAnySubNodesHasError";
      NodeFlags2[NodeFlags2["HasAggregatedChildData"] = 524288] = "HasAggregatedChildData";
      NodeFlags2[NodeFlags2["PossiblyContainsDynamicImport"] = 1048576] = "PossiblyContainsDynamicImport";
      NodeFlags2[NodeFlags2["PossiblyContainsImportMeta"] = 2097152] = "PossiblyContainsImportMeta";
      NodeFlags2[NodeFlags2["JSDoc"] = 4194304] = "JSDoc";
      NodeFlags2[NodeFlags2["Ambient"] = 8388608] = "Ambient";
      NodeFlags2[NodeFlags2["InWithStatement"] = 16777216] = "InWithStatement";
      NodeFlags2[NodeFlags2["JsonFile"] = 33554432] = "JsonFile";
      NodeFlags2[NodeFlags2["TypeCached"] = 67108864] = "TypeCached";
      NodeFlags2[NodeFlags2["Deprecated"] = 134217728] = "Deprecated";
      NodeFlags2[NodeFlags2["BlockScoped"] = 3] = "BlockScoped";
      NodeFlags2[NodeFlags2["ReachabilityCheckFlags"] = 768] = "ReachabilityCheckFlags";
      NodeFlags2[NodeFlags2["ReachabilityAndEmitFlags"] = 2816] = "ReachabilityAndEmitFlags";
      NodeFlags2[NodeFlags2["ContextFlags"] = 25358336] = "ContextFlags";
      NodeFlags2[NodeFlags2["TypeExcludesFlags"] = 40960] = "TypeExcludesFlags";
      NodeFlags2[NodeFlags2["PermanentlySetIncrementalFlags"] = 3145728] = "PermanentlySetIncrementalFlags";
    })(NodeFlags = ts2.NodeFlags || (ts2.NodeFlags = {}));
    var ModifierFlags;
    (function(ModifierFlags2) {
      ModifierFlags2[ModifierFlags2["None"] = 0] = "None";
      ModifierFlags2[ModifierFlags2["Export"] = 1] = "Export";
      ModifierFlags2[ModifierFlags2["Ambient"] = 2] = "Ambient";
      ModifierFlags2[ModifierFlags2["Public"] = 4] = "Public";
      ModifierFlags2[ModifierFlags2["Private"] = 8] = "Private";
      ModifierFlags2[ModifierFlags2["Protected"] = 16] = "Protected";
      ModifierFlags2[ModifierFlags2["Static"] = 32] = "Static";
      ModifierFlags2[ModifierFlags2["Readonly"] = 64] = "Readonly";
      ModifierFlags2[ModifierFlags2["Abstract"] = 128] = "Abstract";
      ModifierFlags2[ModifierFlags2["Async"] = 256] = "Async";
      ModifierFlags2[ModifierFlags2["Default"] = 512] = "Default";
      ModifierFlags2[ModifierFlags2["Const"] = 2048] = "Const";
      ModifierFlags2[ModifierFlags2["HasComputedJSDocModifiers"] = 4096] = "HasComputedJSDocModifiers";
      ModifierFlags2[ModifierFlags2["Deprecated"] = 8192] = "Deprecated";
      ModifierFlags2[ModifierFlags2["Override"] = 16384] = "Override";
      ModifierFlags2[ModifierFlags2["HasComputedFlags"] = 536870912] = "HasComputedFlags";
      ModifierFlags2[ModifierFlags2["AccessibilityModifier"] = 28] = "AccessibilityModifier";
      ModifierFlags2[ModifierFlags2["ParameterPropertyModifier"] = 16476] = "ParameterPropertyModifier";
      ModifierFlags2[ModifierFlags2["NonPublicAccessibilityModifier"] = 24] = "NonPublicAccessibilityModifier";
      ModifierFlags2[ModifierFlags2["TypeScriptModifier"] = 18654] = "TypeScriptModifier";
      ModifierFlags2[ModifierFlags2["ExportDefault"] = 513] = "ExportDefault";
      ModifierFlags2[ModifierFlags2["All"] = 27647] = "All";
    })(ModifierFlags = ts2.ModifierFlags || (ts2.ModifierFlags = {}));
    var JsxFlags;
    (function(JsxFlags2) {
      JsxFlags2[JsxFlags2["None"] = 0] = "None";
      JsxFlags2[JsxFlags2["IntrinsicNamedElement"] = 1] = "IntrinsicNamedElement";
      JsxFlags2[JsxFlags2["IntrinsicIndexedElement"] = 2] = "IntrinsicIndexedElement";
      JsxFlags2[JsxFlags2["IntrinsicElement"] = 3] = "IntrinsicElement";
    })(JsxFlags = ts2.JsxFlags || (ts2.JsxFlags = {}));
    var RelationComparisonResult;
    (function(RelationComparisonResult2) {
      RelationComparisonResult2[RelationComparisonResult2["Succeeded"] = 1] = "Succeeded";
      RelationComparisonResult2[RelationComparisonResult2["Failed"] = 2] = "Failed";
      RelationComparisonResult2[RelationComparisonResult2["Reported"] = 4] = "Reported";
      RelationComparisonResult2[RelationComparisonResult2["ReportsUnmeasurable"] = 8] = "ReportsUnmeasurable";
      RelationComparisonResult2[RelationComparisonResult2["ReportsUnreliable"] = 16] = "ReportsUnreliable";
      RelationComparisonResult2[RelationComparisonResult2["ReportsMask"] = 24] = "ReportsMask";
    })(RelationComparisonResult = ts2.RelationComparisonResult || (ts2.RelationComparisonResult = {}));
    var GeneratedIdentifierFlags;
    (function(GeneratedIdentifierFlags2) {
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["None"] = 0] = "None";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["Auto"] = 1] = "Auto";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["Loop"] = 2] = "Loop";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["Unique"] = 3] = "Unique";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["Node"] = 4] = "Node";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["KindMask"] = 7] = "KindMask";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["ReservedInNestedScopes"] = 8] = "ReservedInNestedScopes";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["Optimistic"] = 16] = "Optimistic";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["FileLevel"] = 32] = "FileLevel";
      GeneratedIdentifierFlags2[GeneratedIdentifierFlags2["AllowNameSubstitution"] = 64] = "AllowNameSubstitution";
    })(GeneratedIdentifierFlags = ts2.GeneratedIdentifierFlags || (ts2.GeneratedIdentifierFlags = {}));
    var TokenFlags;
    (function(TokenFlags2) {
      TokenFlags2[TokenFlags2["None"] = 0] = "None";
      TokenFlags2[TokenFlags2["PrecedingLineBreak"] = 1] = "PrecedingLineBreak";
      TokenFlags2[TokenFlags2["PrecedingJSDocComment"] = 2] = "PrecedingJSDocComment";
      TokenFlags2[TokenFlags2["Unterminated"] = 4] = "Unterminated";
      TokenFlags2[TokenFlags2["ExtendedUnicodeEscape"] = 8] = "ExtendedUnicodeEscape";
      TokenFlags2[TokenFlags2["Scientific"] = 16] = "Scientific";
      TokenFlags2[TokenFlags2["Octal"] = 32] = "Octal";
      TokenFlags2[TokenFlags2["HexSpecifier"] = 64] = "HexSpecifier";
      TokenFlags2[TokenFlags2["BinarySpecifier"] = 128] = "BinarySpecifier";
      TokenFlags2[TokenFlags2["OctalSpecifier"] = 256] = "OctalSpecifier";
      TokenFlags2[TokenFlags2["ContainsSeparator"] = 512] = "ContainsSeparator";
      TokenFlags2[TokenFlags2["UnicodeEscape"] = 1024] = "UnicodeEscape";
      TokenFlags2[TokenFlags2["ContainsInvalidEscape"] = 2048] = "ContainsInvalidEscape";
      TokenFlags2[TokenFlags2["BinaryOrOctalSpecifier"] = 384] = "BinaryOrOctalSpecifier";
      TokenFlags2[TokenFlags2["NumericLiteralFlags"] = 1008] = "NumericLiteralFlags";
      TokenFlags2[TokenFlags2["TemplateLiteralLikeFlags"] = 2048] = "TemplateLiteralLikeFlags";
    })(TokenFlags = ts2.TokenFlags || (ts2.TokenFlags = {}));
    var FlowFlags;
    (function(FlowFlags2) {
      FlowFlags2[FlowFlags2["Unreachable"] = 1] = "Unreachable";
      FlowFlags2[FlowFlags2["Start"] = 2] = "Start";
      FlowFlags2[FlowFlags2["BranchLabel"] = 4] = "BranchLabel";
      FlowFlags2[FlowFlags2["LoopLabel"] = 8] = "LoopLabel";
      FlowFlags2[FlowFlags2["Assignment"] = 16] = "Assignment";
      FlowFlags2[FlowFlags2["TrueCondition"] = 32] = "TrueCondition";
      FlowFlags2[FlowFlags2["FalseCondition"] = 64] = "FalseCondition";
      FlowFlags2[FlowFlags2["SwitchClause"] = 128] = "SwitchClause";
      FlowFlags2[FlowFlags2["ArrayMutation"] = 256] = "ArrayMutation";
      FlowFlags2[FlowFlags2["Call"] = 512] = "Call";
      FlowFlags2[FlowFlags2["ReduceLabel"] = 1024] = "ReduceLabel";
      FlowFlags2[FlowFlags2["Referenced"] = 2048] = "Referenced";
      FlowFlags2[FlowFlags2["Shared"] = 4096] = "Shared";
      FlowFlags2[FlowFlags2["Label"] = 12] = "Label";
      FlowFlags2[FlowFlags2["Condition"] = 96] = "Condition";
    })(FlowFlags = ts2.FlowFlags || (ts2.FlowFlags = {}));
    var CommentDirectiveType;
    (function(CommentDirectiveType2) {
      CommentDirectiveType2[CommentDirectiveType2["ExpectError"] = 0] = "ExpectError";
      CommentDirectiveType2[CommentDirectiveType2["Ignore"] = 1] = "Ignore";
    })(CommentDirectiveType = ts2.CommentDirectiveType || (ts2.CommentDirectiveType = {}));
    var OperationCanceledException = function() {
      function OperationCanceledException2() {
      }
      return OperationCanceledException2;
    }();
    ts2.OperationCanceledException = OperationCanceledException;
    var FileIncludeKind;
    (function(FileIncludeKind2) {
      FileIncludeKind2[FileIncludeKind2["RootFile"] = 0] = "RootFile";
      FileIncludeKind2[FileIncludeKind2["SourceFromProjectReference"] = 1] = "SourceFromProjectReference";
      FileIncludeKind2[FileIncludeKind2["OutputFromProjectReference"] = 2] = "OutputFromProjectReference";
      FileIncludeKind2[FileIncludeKind2["Import"] = 3] = "Import";
      FileIncludeKind2[FileIncludeKind2["ReferenceFile"] = 4] = "ReferenceFile";
      FileIncludeKind2[FileIncludeKind2["TypeReferenceDirective"] = 5] = "TypeReferenceDirective";
      FileIncludeKind2[FileIncludeKind2["LibFile"] = 6] = "LibFile";
      FileIncludeKind2[FileIncludeKind2["LibReferenceDirective"] = 7] = "LibReferenceDirective";
      FileIncludeKind2[FileIncludeKind2["AutomaticTypeDirectiveFile"] = 8] = "AutomaticTypeDirectiveFile";
    })(FileIncludeKind = ts2.FileIncludeKind || (ts2.FileIncludeKind = {}));
    var FilePreprocessingDiagnosticsKind;
    (function(FilePreprocessingDiagnosticsKind2) {
      FilePreprocessingDiagnosticsKind2[FilePreprocessingDiagnosticsKind2["FilePreprocessingReferencedDiagnostic"] = 0] = "FilePreprocessingReferencedDiagnostic";
      FilePreprocessingDiagnosticsKind2[FilePreprocessingDiagnosticsKind2["FilePreprocessingFileExplainingDiagnostic"] = 1] = "FilePreprocessingFileExplainingDiagnostic";
    })(FilePreprocessingDiagnosticsKind = ts2.FilePreprocessingDiagnosticsKind || (ts2.FilePreprocessingDiagnosticsKind = {}));
    var StructureIsReused;
    (function(StructureIsReused2) {
      StructureIsReused2[StructureIsReused2["Not"] = 0] = "Not";
      StructureIsReused2[StructureIsReused2["SafeModules"] = 1] = "SafeModules";
      StructureIsReused2[StructureIsReused2["Completely"] = 2] = "Completely";
    })(StructureIsReused = ts2.StructureIsReused || (ts2.StructureIsReused = {}));
    var ExitStatus;
    (function(ExitStatus2) {
      ExitStatus2[ExitStatus2["Success"] = 0] = "Success";
      ExitStatus2[ExitStatus2["DiagnosticsPresent_OutputsSkipped"] = 1] = "DiagnosticsPresent_OutputsSkipped";
      ExitStatus2[ExitStatus2["DiagnosticsPresent_OutputsGenerated"] = 2] = "DiagnosticsPresent_OutputsGenerated";
      ExitStatus2[ExitStatus2["InvalidProject_OutputsSkipped"] = 3] = "InvalidProject_OutputsSkipped";
      ExitStatus2[ExitStatus2["ProjectReferenceCycle_OutputsSkipped"] = 4] = "ProjectReferenceCycle_OutputsSkipped";
      ExitStatus2[ExitStatus2["ProjectReferenceCycle_OutputsSkupped"] = 4] = "ProjectReferenceCycle_OutputsSkupped";
    })(ExitStatus = ts2.ExitStatus || (ts2.ExitStatus = {}));
    var MemberOverrideStatus;
    (function(MemberOverrideStatus2) {
      MemberOverrideStatus2[MemberOverrideStatus2["Ok"] = 0] = "Ok";
      MemberOverrideStatus2[MemberOverrideStatus2["NeedsOverride"] = 1] = "NeedsOverride";
      MemberOverrideStatus2[MemberOverrideStatus2["HasInvalidOverride"] = 2] = "HasInvalidOverride";
    })(MemberOverrideStatus = ts2.MemberOverrideStatus || (ts2.MemberOverrideStatus = {}));
    var UnionReduction;
    (function(UnionReduction2) {
      UnionReduction2[UnionReduction2["None"] = 0] = "None";
      UnionReduction2[UnionReduction2["Literal"] = 1] = "Literal";
      UnionReduction2[UnionReduction2["Subtype"] = 2] = "Subtype";
    })(UnionReduction = ts2.UnionReduction || (ts2.UnionReduction = {}));
    var ContextFlags;
    (function(ContextFlags2) {
      ContextFlags2[ContextFlags2["None"] = 0] = "None";
      ContextFlags2[ContextFlags2["Signature"] = 1] = "Signature";
      ContextFlags2[ContextFlags2["NoConstraints"] = 2] = "NoConstraints";
      ContextFlags2[ContextFlags2["Completions"] = 4] = "Completions";
      ContextFlags2[ContextFlags2["SkipBindingPatterns"] = 8] = "SkipBindingPatterns";
    })(ContextFlags = ts2.ContextFlags || (ts2.ContextFlags = {}));
    var NodeBuilderFlags;
    (function(NodeBuilderFlags2) {
      NodeBuilderFlags2[NodeBuilderFlags2["None"] = 0] = "None";
      NodeBuilderFlags2[NodeBuilderFlags2["NoTruncation"] = 1] = "NoTruncation";
      NodeBuilderFlags2[NodeBuilderFlags2["WriteArrayAsGenericType"] = 2] = "WriteArrayAsGenericType";
      NodeBuilderFlags2[NodeBuilderFlags2["GenerateNamesForShadowedTypeParams"] = 4] = "GenerateNamesForShadowedTypeParams";
      NodeBuilderFlags2[NodeBuilderFlags2["UseStructuralFallback"] = 8] = "UseStructuralFallback";
      NodeBuilderFlags2[NodeBuilderFlags2["ForbidIndexedAccessSymbolReferences"] = 16] = "ForbidIndexedAccessSymbolReferences";
      NodeBuilderFlags2[NodeBuilderFlags2["WriteTypeArgumentsOfSignature"] = 32] = "WriteTypeArgumentsOfSignature";
      NodeBuilderFlags2[NodeBuilderFlags2["UseFullyQualifiedType"] = 64] = "UseFullyQualifiedType";
      NodeBuilderFlags2[NodeBuilderFlags2["UseOnlyExternalAliasing"] = 128] = "UseOnlyExternalAliasing";
      NodeBuilderFlags2[NodeBuilderFlags2["SuppressAnyReturnType"] = 256] = "SuppressAnyReturnType";
      NodeBuilderFlags2[NodeBuilderFlags2["WriteTypeParametersInQualifiedName"] = 512] = "WriteTypeParametersInQualifiedName";
      NodeBuilderFlags2[NodeBuilderFlags2["MultilineObjectLiterals"] = 1024] = "MultilineObjectLiterals";
      NodeBuilderFlags2[NodeBuilderFlags2["WriteClassExpressionAsTypeLiteral"] = 2048] = "WriteClassExpressionAsTypeLiteral";
      NodeBuilderFlags2[NodeBuilderFlags2["UseTypeOfFunction"] = 4096] = "UseTypeOfFunction";
      NodeBuilderFlags2[NodeBuilderFlags2["OmitParameterModifiers"] = 8192] = "OmitParameterModifiers";
      NodeBuilderFlags2[NodeBuilderFlags2["UseAliasDefinedOutsideCurrentScope"] = 16384] = "UseAliasDefinedOutsideCurrentScope";
      NodeBuilderFlags2[NodeBuilderFlags2["UseSingleQuotesForStringLiteralType"] = 268435456] = "UseSingleQuotesForStringLiteralType";
      NodeBuilderFlags2[NodeBuilderFlags2["NoTypeReduction"] = 536870912] = "NoTypeReduction";
      NodeBuilderFlags2[NodeBuilderFlags2["NoUndefinedOptionalParameterType"] = 1073741824] = "NoUndefinedOptionalParameterType";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowThisInObjectLiteral"] = 32768] = "AllowThisInObjectLiteral";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowQualifiedNameInPlaceOfIdentifier"] = 65536] = "AllowQualifiedNameInPlaceOfIdentifier";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowQualifedNameInPlaceOfIdentifier"] = 65536] = "AllowQualifedNameInPlaceOfIdentifier";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowAnonymousIdentifier"] = 131072] = "AllowAnonymousIdentifier";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowEmptyUnionOrIntersection"] = 262144] = "AllowEmptyUnionOrIntersection";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowEmptyTuple"] = 524288] = "AllowEmptyTuple";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowUniqueESSymbolType"] = 1048576] = "AllowUniqueESSymbolType";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowEmptyIndexInfoType"] = 2097152] = "AllowEmptyIndexInfoType";
      NodeBuilderFlags2[NodeBuilderFlags2["AllowNodeModulesRelativePaths"] = 67108864] = "AllowNodeModulesRelativePaths";
      NodeBuilderFlags2[NodeBuilderFlags2["DoNotIncludeSymbolChain"] = 134217728] = "DoNotIncludeSymbolChain";
      NodeBuilderFlags2[NodeBuilderFlags2["IgnoreErrors"] = 70221824] = "IgnoreErrors";
      NodeBuilderFlags2[NodeBuilderFlags2["InObjectTypeLiteral"] = 4194304] = "InObjectTypeLiteral";
      NodeBuilderFlags2[NodeBuilderFlags2["InTypeAlias"] = 8388608] = "InTypeAlias";
      NodeBuilderFlags2[NodeBuilderFlags2["InInitialEntityName"] = 16777216] = "InInitialEntityName";
    })(NodeBuilderFlags = ts2.NodeBuilderFlags || (ts2.NodeBuilderFlags = {}));
    var TypeFormatFlags;
    (function(TypeFormatFlags2) {
      TypeFormatFlags2[TypeFormatFlags2["None"] = 0] = "None";
      TypeFormatFlags2[TypeFormatFlags2["NoTruncation"] = 1] = "NoTruncation";
      TypeFormatFlags2[TypeFormatFlags2["WriteArrayAsGenericType"] = 2] = "WriteArrayAsGenericType";
      TypeFormatFlags2[TypeFormatFlags2["UseStructuralFallback"] = 8] = "UseStructuralFallback";
      TypeFormatFlags2[TypeFormatFlags2["WriteTypeArgumentsOfSignature"] = 32] = "WriteTypeArgumentsOfSignature";
      TypeFormatFlags2[TypeFormatFlags2["UseFullyQualifiedType"] = 64] = "UseFullyQualifiedType";
      TypeFormatFlags2[TypeFormatFlags2["SuppressAnyReturnType"] = 256] = "SuppressAnyReturnType";
      TypeFormatFlags2[TypeFormatFlags2["MultilineObjectLiterals"] = 1024] = "MultilineObjectLiterals";
      TypeFormatFlags2[TypeFormatFlags2["WriteClassExpressionAsTypeLiteral"] = 2048] = "WriteClassExpressionAsTypeLiteral";
      TypeFormatFlags2[TypeFormatFlags2["UseTypeOfFunction"] = 4096] = "UseTypeOfFunction";
      TypeFormatFlags2[TypeFormatFlags2["OmitParameterModifiers"] = 8192] = "OmitParameterModifiers";
      TypeFormatFlags2[TypeFormatFlags2["UseAliasDefinedOutsideCurrentScope"] = 16384] = "UseAliasDefinedOutsideCurrentScope";
      TypeFormatFlags2[TypeFormatFlags2["UseSingleQuotesForStringLiteralType"] = 268435456] = "UseSingleQuotesForStringLiteralType";
      TypeFormatFlags2[TypeFormatFlags2["NoTypeReduction"] = 536870912] = "NoTypeReduction";
      TypeFormatFlags2[TypeFormatFlags2["AllowUniqueESSymbolType"] = 1048576] = "AllowUniqueESSymbolType";
      TypeFormatFlags2[TypeFormatFlags2["AddUndefined"] = 131072] = "AddUndefined";
      TypeFormatFlags2[TypeFormatFlags2["WriteArrowStyleSignature"] = 262144] = "WriteArrowStyleSignature";
      TypeFormatFlags2[TypeFormatFlags2["InArrayType"] = 524288] = "InArrayType";
      TypeFormatFlags2[TypeFormatFlags2["InElementType"] = 2097152] = "InElementType";
      TypeFormatFlags2[TypeFormatFlags2["InFirstTypeArgument"] = 4194304] = "InFirstTypeArgument";
      TypeFormatFlags2[TypeFormatFlags2["InTypeAlias"] = 8388608] = "InTypeAlias";
      TypeFormatFlags2[TypeFormatFlags2["WriteOwnNameForAnyLike"] = 0] = "WriteOwnNameForAnyLike";
      TypeFormatFlags2[TypeFormatFlags2["NodeBuilderFlagsMask"] = 814775659] = "NodeBuilderFlagsMask";
    })(TypeFormatFlags = ts2.TypeFormatFlags || (ts2.TypeFormatFlags = {}));
    var SymbolFormatFlags;
    (function(SymbolFormatFlags2) {
      SymbolFormatFlags2[SymbolFormatFlags2["None"] = 0] = "None";
      SymbolFormatFlags2[SymbolFormatFlags2["WriteTypeParametersOrArguments"] = 1] = "WriteTypeParametersOrArguments";
      SymbolFormatFlags2[SymbolFormatFlags2["UseOnlyExternalAliasing"] = 2] = "UseOnlyExternalAliasing";
      SymbolFormatFlags2[SymbolFormatFlags2["AllowAnyNodeKind"] = 4] = "AllowAnyNodeKind";
      SymbolFormatFlags2[SymbolFormatFlags2["UseAliasDefinedOutsideCurrentScope"] = 8] = "UseAliasDefinedOutsideCurrentScope";
      SymbolFormatFlags2[SymbolFormatFlags2["DoNotIncludeSymbolChain"] = 16] = "DoNotIncludeSymbolChain";
    })(SymbolFormatFlags = ts2.SymbolFormatFlags || (ts2.SymbolFormatFlags = {}));
    var SymbolAccessibility;
    (function(SymbolAccessibility2) {
      SymbolAccessibility2[SymbolAccessibility2["Accessible"] = 0] = "Accessible";
      SymbolAccessibility2[SymbolAccessibility2["NotAccessible"] = 1] = "NotAccessible";
      SymbolAccessibility2[SymbolAccessibility2["CannotBeNamed"] = 2] = "CannotBeNamed";
    })(SymbolAccessibility = ts2.SymbolAccessibility || (ts2.SymbolAccessibility = {}));
    var SyntheticSymbolKind;
    (function(SyntheticSymbolKind2) {
      SyntheticSymbolKind2[SyntheticSymbolKind2["UnionOrIntersection"] = 0] = "UnionOrIntersection";
      SyntheticSymbolKind2[SyntheticSymbolKind2["Spread"] = 1] = "Spread";
    })(SyntheticSymbolKind = ts2.SyntheticSymbolKind || (ts2.SyntheticSymbolKind = {}));
    var TypePredicateKind;
    (function(TypePredicateKind2) {
      TypePredicateKind2[TypePredicateKind2["This"] = 0] = "This";
      TypePredicateKind2[TypePredicateKind2["Identifier"] = 1] = "Identifier";
      TypePredicateKind2[TypePredicateKind2["AssertsThis"] = 2] = "AssertsThis";
      TypePredicateKind2[TypePredicateKind2["AssertsIdentifier"] = 3] = "AssertsIdentifier";
    })(TypePredicateKind = ts2.TypePredicateKind || (ts2.TypePredicateKind = {}));
    var TypeReferenceSerializationKind;
    (function(TypeReferenceSerializationKind2) {
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["Unknown"] = 0] = "Unknown";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["TypeWithConstructSignatureAndValue"] = 1] = "TypeWithConstructSignatureAndValue";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["VoidNullableOrNeverType"] = 2] = "VoidNullableOrNeverType";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["NumberLikeType"] = 3] = "NumberLikeType";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["BigIntLikeType"] = 4] = "BigIntLikeType";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["StringLikeType"] = 5] = "StringLikeType";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["BooleanType"] = 6] = "BooleanType";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["ArrayLikeType"] = 7] = "ArrayLikeType";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["ESSymbolType"] = 8] = "ESSymbolType";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["Promise"] = 9] = "Promise";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["TypeWithCallSignature"] = 10] = "TypeWithCallSignature";
      TypeReferenceSerializationKind2[TypeReferenceSerializationKind2["ObjectType"] = 11] = "ObjectType";
    })(TypeReferenceSerializationKind = ts2.TypeReferenceSerializationKind || (ts2.TypeReferenceSerializationKind = {}));
    var SymbolFlags;
    (function(SymbolFlags2) {
      SymbolFlags2[SymbolFlags2["None"] = 0] = "None";
      SymbolFlags2[SymbolFlags2["FunctionScopedVariable"] = 1] = "FunctionScopedVariable";
      SymbolFlags2[SymbolFlags2["BlockScopedVariable"] = 2] = "BlockScopedVariable";
      SymbolFlags2[SymbolFlags2["Property"] = 4] = "Property";
      SymbolFlags2[SymbolFlags2["EnumMember"] = 8] = "EnumMember";
      SymbolFlags2[SymbolFlags2["Function"] = 16] = "Function";
      SymbolFlags2[SymbolFlags2["Class"] = 32] = "Class";
      SymbolFlags2[SymbolFlags2["Interface"] = 64] = "Interface";
      SymbolFlags2[SymbolFlags2["ConstEnum"] = 128] = "ConstEnum";
      SymbolFlags2[SymbolFlags2["RegularEnum"] = 256] = "RegularEnum";
      SymbolFlags2[SymbolFlags2["ValueModule"] = 512] = "ValueModule";
      SymbolFlags2[SymbolFlags2["NamespaceModule"] = 1024] = "NamespaceModule";
      SymbolFlags2[SymbolFlags2["TypeLiteral"] = 2048] = "TypeLiteral";
      SymbolFlags2[SymbolFlags2["ObjectLiteral"] = 4096] = "ObjectLiteral";
      SymbolFlags2[SymbolFlags2["Method"] = 8192] = "Method";
      SymbolFlags2[SymbolFlags2["Constructor"] = 16384] = "Constructor";
      SymbolFlags2[SymbolFlags2["GetAccessor"] = 32768] = "GetAccessor";
      SymbolFlags2[SymbolFlags2["SetAccessor"] = 65536] = "SetAccessor";
      SymbolFlags2[SymbolFlags2["Signature"] = 131072] = "Signature";
      SymbolFlags2[SymbolFlags2["TypeParameter"] = 262144] = "TypeParameter";
      SymbolFlags2[SymbolFlags2["TypeAlias"] = 524288] = "TypeAlias";
      SymbolFlags2[SymbolFlags2["ExportValue"] = 1048576] = "ExportValue";
      SymbolFlags2[SymbolFlags2["Alias"] = 2097152] = "Alias";
      SymbolFlags2[SymbolFlags2["Prototype"] = 4194304] = "Prototype";
      SymbolFlags2[SymbolFlags2["ExportStar"] = 8388608] = "ExportStar";
      SymbolFlags2[SymbolFlags2["Optional"] = 16777216] = "Optional";
      SymbolFlags2[SymbolFlags2["Transient"] = 33554432] = "Transient";
      SymbolFlags2[SymbolFlags2["Assignment"] = 67108864] = "Assignment";
      SymbolFlags2[SymbolFlags2["ModuleExports"] = 134217728] = "ModuleExports";
      SymbolFlags2[SymbolFlags2["All"] = 67108863] = "All";
      SymbolFlags2[SymbolFlags2["Enum"] = 384] = "Enum";
      SymbolFlags2[SymbolFlags2["Variable"] = 3] = "Variable";
      SymbolFlags2[SymbolFlags2["Value"] = 111551] = "Value";
      SymbolFlags2[SymbolFlags2["Type"] = 788968] = "Type";
      SymbolFlags2[SymbolFlags2["Namespace"] = 1920] = "Namespace";
      SymbolFlags2[SymbolFlags2["Module"] = 1536] = "Module";
      SymbolFlags2[SymbolFlags2["Accessor"] = 98304] = "Accessor";
      SymbolFlags2[SymbolFlags2["FunctionScopedVariableExcludes"] = 111550] = "FunctionScopedVariableExcludes";
      SymbolFlags2[SymbolFlags2["BlockScopedVariableExcludes"] = 111551] = "BlockScopedVariableExcludes";
      SymbolFlags2[SymbolFlags2["ParameterExcludes"] = 111551] = "ParameterExcludes";
      SymbolFlags2[SymbolFlags2["PropertyExcludes"] = 0] = "PropertyExcludes";
      SymbolFlags2[SymbolFlags2["EnumMemberExcludes"] = 900095] = "EnumMemberExcludes";
      SymbolFlags2[SymbolFlags2["FunctionExcludes"] = 110991] = "FunctionExcludes";
      SymbolFlags2[SymbolFlags2["ClassExcludes"] = 899503] = "ClassExcludes";
      SymbolFlags2[SymbolFlags2["InterfaceExcludes"] = 788872] = "InterfaceExcludes";
      SymbolFlags2[SymbolFlags2["RegularEnumExcludes"] = 899327] = "RegularEnumExcludes";
      SymbolFlags2[SymbolFlags2["ConstEnumExcludes"] = 899967] = "ConstEnumExcludes";
      SymbolFlags2[SymbolFlags2["ValueModuleExcludes"] = 110735] = "ValueModuleExcludes";
      SymbolFlags2[SymbolFlags2["NamespaceModuleExcludes"] = 0] = "NamespaceModuleExcludes";
      SymbolFlags2[SymbolFlags2["MethodExcludes"] = 103359] = "MethodExcludes";
      SymbolFlags2[SymbolFlags2["GetAccessorExcludes"] = 46015] = "GetAccessorExcludes";
      SymbolFlags2[SymbolFlags2["SetAccessorExcludes"] = 78783] = "SetAccessorExcludes";
      SymbolFlags2[SymbolFlags2["TypeParameterExcludes"] = 526824] = "TypeParameterExcludes";
      SymbolFlags2[SymbolFlags2["TypeAliasExcludes"] = 788968] = "TypeAliasExcludes";
      SymbolFlags2[SymbolFlags2["AliasExcludes"] = 2097152] = "AliasExcludes";
      SymbolFlags2[SymbolFlags2["ModuleMember"] = 2623475] = "ModuleMember";
      SymbolFlags2[SymbolFlags2["ExportHasLocal"] = 944] = "ExportHasLocal";
      SymbolFlags2[SymbolFlags2["BlockScoped"] = 418] = "BlockScoped";
      SymbolFlags2[SymbolFlags2["PropertyOrAccessor"] = 98308] = "PropertyOrAccessor";
      SymbolFlags2[SymbolFlags2["ClassMember"] = 106500] = "ClassMember";
      SymbolFlags2[SymbolFlags2["ExportSupportsDefaultModifier"] = 112] = "ExportSupportsDefaultModifier";
      SymbolFlags2[SymbolFlags2["ExportDoesNotSupportDefaultModifier"] = -113] = "ExportDoesNotSupportDefaultModifier";
      SymbolFlags2[SymbolFlags2["Classifiable"] = 2885600] = "Classifiable";
      SymbolFlags2[SymbolFlags2["LateBindingContainer"] = 6256] = "LateBindingContainer";
    })(SymbolFlags = ts2.SymbolFlags || (ts2.SymbolFlags = {}));
    var EnumKind;
    (function(EnumKind2) {
      EnumKind2[EnumKind2["Numeric"] = 0] = "Numeric";
      EnumKind2[EnumKind2["Literal"] = 1] = "Literal";
    })(EnumKind = ts2.EnumKind || (ts2.EnumKind = {}));
    var CheckFlags;
    (function(CheckFlags2) {
      CheckFlags2[CheckFlags2["Instantiated"] = 1] = "Instantiated";
      CheckFlags2[CheckFlags2["SyntheticProperty"] = 2] = "SyntheticProperty";
      CheckFlags2[CheckFlags2["SyntheticMethod"] = 4] = "SyntheticMethod";
      CheckFlags2[CheckFlags2["Readonly"] = 8] = "Readonly";
      CheckFlags2[CheckFlags2["ReadPartial"] = 16] = "ReadPartial";
      CheckFlags2[CheckFlags2["WritePartial"] = 32] = "WritePartial";
      CheckFlags2[CheckFlags2["HasNonUniformType"] = 64] = "HasNonUniformType";
      CheckFlags2[CheckFlags2["HasLiteralType"] = 128] = "HasLiteralType";
      CheckFlags2[CheckFlags2["ContainsPublic"] = 256] = "ContainsPublic";
      CheckFlags2[CheckFlags2["ContainsProtected"] = 512] = "ContainsProtected";
      CheckFlags2[CheckFlags2["ContainsPrivate"] = 1024] = "ContainsPrivate";
      CheckFlags2[CheckFlags2["ContainsStatic"] = 2048] = "ContainsStatic";
      CheckFlags2[CheckFlags2["Late"] = 4096] = "Late";
      CheckFlags2[CheckFlags2["ReverseMapped"] = 8192] = "ReverseMapped";
      CheckFlags2[CheckFlags2["OptionalParameter"] = 16384] = "OptionalParameter";
      CheckFlags2[CheckFlags2["RestParameter"] = 32768] = "RestParameter";
      CheckFlags2[CheckFlags2["DeferredType"] = 65536] = "DeferredType";
      CheckFlags2[CheckFlags2["HasNeverType"] = 131072] = "HasNeverType";
      CheckFlags2[CheckFlags2["Mapped"] = 262144] = "Mapped";
      CheckFlags2[CheckFlags2["StripOptional"] = 524288] = "StripOptional";
      CheckFlags2[CheckFlags2["Unresolved"] = 1048576] = "Unresolved";
      CheckFlags2[CheckFlags2["Synthetic"] = 6] = "Synthetic";
      CheckFlags2[CheckFlags2["Discriminant"] = 192] = "Discriminant";
      CheckFlags2[CheckFlags2["Partial"] = 48] = "Partial";
    })(CheckFlags = ts2.CheckFlags || (ts2.CheckFlags = {}));
    var InternalSymbolName;
    (function(InternalSymbolName2) {
      InternalSymbolName2["Call"] = "__call";
      InternalSymbolName2["Constructor"] = "__constructor";
      InternalSymbolName2["New"] = "__new";
      InternalSymbolName2["Index"] = "__index";
      InternalSymbolName2["ExportStar"] = "__export";
      InternalSymbolName2["Global"] = "__global";
      InternalSymbolName2["Missing"] = "__missing";
      InternalSymbolName2["Type"] = "__type";
      InternalSymbolName2["Object"] = "__object";
      InternalSymbolName2["JSXAttributes"] = "__jsxAttributes";
      InternalSymbolName2["Class"] = "__class";
      InternalSymbolName2["Function"] = "__function";
      InternalSymbolName2["Computed"] = "__computed";
      InternalSymbolName2["Resolving"] = "__resolving__";
      InternalSymbolName2["ExportEquals"] = "export=";
      InternalSymbolName2["Default"] = "default";
      InternalSymbolName2["This"] = "this";
    })(InternalSymbolName = ts2.InternalSymbolName || (ts2.InternalSymbolName = {}));
    var NodeCheckFlags;
    (function(NodeCheckFlags2) {
      NodeCheckFlags2[NodeCheckFlags2["TypeChecked"] = 1] = "TypeChecked";
      NodeCheckFlags2[NodeCheckFlags2["LexicalThis"] = 2] = "LexicalThis";
      NodeCheckFlags2[NodeCheckFlags2["CaptureThis"] = 4] = "CaptureThis";
      NodeCheckFlags2[NodeCheckFlags2["CaptureNewTarget"] = 8] = "CaptureNewTarget";
      NodeCheckFlags2[NodeCheckFlags2["SuperInstance"] = 256] = "SuperInstance";
      NodeCheckFlags2[NodeCheckFlags2["SuperStatic"] = 512] = "SuperStatic";
      NodeCheckFlags2[NodeCheckFlags2["ContextChecked"] = 1024] = "ContextChecked";
      NodeCheckFlags2[NodeCheckFlags2["AsyncMethodWithSuper"] = 2048] = "AsyncMethodWithSuper";
      NodeCheckFlags2[NodeCheckFlags2["AsyncMethodWithSuperBinding"] = 4096] = "AsyncMethodWithSuperBinding";
      NodeCheckFlags2[NodeCheckFlags2["CaptureArguments"] = 8192] = "CaptureArguments";
      NodeCheckFlags2[NodeCheckFlags2["EnumValuesComputed"] = 16384] = "EnumValuesComputed";
      NodeCheckFlags2[NodeCheckFlags2["LexicalModuleMergesWithClass"] = 32768] = "LexicalModuleMergesWithClass";
      NodeCheckFlags2[NodeCheckFlags2["LoopWithCapturedBlockScopedBinding"] = 65536] = "LoopWithCapturedBlockScopedBinding";
      NodeCheckFlags2[NodeCheckFlags2["ContainsCapturedBlockScopeBinding"] = 131072] = "ContainsCapturedBlockScopeBinding";
      NodeCheckFlags2[NodeCheckFlags2["CapturedBlockScopedBinding"] = 262144] = "CapturedBlockScopedBinding";
      NodeCheckFlags2[NodeCheckFlags2["BlockScopedBindingInLoop"] = 524288] = "BlockScopedBindingInLoop";
      NodeCheckFlags2[NodeCheckFlags2["ClassWithBodyScopedClassBinding"] = 1048576] = "ClassWithBodyScopedClassBinding";
      NodeCheckFlags2[NodeCheckFlags2["BodyScopedClassBinding"] = 2097152] = "BodyScopedClassBinding";
      NodeCheckFlags2[NodeCheckFlags2["NeedsLoopOutParameter"] = 4194304] = "NeedsLoopOutParameter";
      NodeCheckFlags2[NodeCheckFlags2["AssignmentsMarked"] = 8388608] = "AssignmentsMarked";
      NodeCheckFlags2[NodeCheckFlags2["ClassWithConstructorReference"] = 16777216] = "ClassWithConstructorReference";
      NodeCheckFlags2[NodeCheckFlags2["ConstructorReferenceInClass"] = 33554432] = "ConstructorReferenceInClass";
      NodeCheckFlags2[NodeCheckFlags2["ContainsClassWithPrivateIdentifiers"] = 67108864] = "ContainsClassWithPrivateIdentifiers";
      NodeCheckFlags2[NodeCheckFlags2["ContainsSuperPropertyInStaticInitializer"] = 134217728] = "ContainsSuperPropertyInStaticInitializer";
    })(NodeCheckFlags = ts2.NodeCheckFlags || (ts2.NodeCheckFlags = {}));
    var TypeFlags;
    (function(TypeFlags2) {
      TypeFlags2[TypeFlags2["Any"] = 1] = "Any";
      TypeFlags2[TypeFlags2["Unknown"] = 2] = "Unknown";
      TypeFlags2[TypeFlags2["String"] = 4] = "String";
      TypeFlags2[TypeFlags2["Number"] = 8] = "Number";
      TypeFlags2[TypeFlags2["Boolean"] = 16] = "Boolean";
      TypeFlags2[TypeFlags2["Enum"] = 32] = "Enum";
      TypeFlags2[TypeFlags2["BigInt"] = 64] = "BigInt";
      TypeFlags2[TypeFlags2["StringLiteral"] = 128] = "StringLiteral";
      TypeFlags2[TypeFlags2["NumberLiteral"] = 256] = "NumberLiteral";
      TypeFlags2[TypeFlags2["BooleanLiteral"] = 512] = "BooleanLiteral";
      TypeFlags2[TypeFlags2["EnumLiteral"] = 1024] = "EnumLiteral";
      TypeFlags2[TypeFlags2["BigIntLiteral"] = 2048] = "BigIntLiteral";
      TypeFlags2[TypeFlags2["ESSymbol"] = 4096] = "ESSymbol";
      TypeFlags2[TypeFlags2["UniqueESSymbol"] = 8192] = "UniqueESSymbol";
      TypeFlags2[TypeFlags2["Void"] = 16384] = "Void";
      TypeFlags2[TypeFlags2["Undefined"] = 32768] = "Undefined";
      TypeFlags2[TypeFlags2["Null"] = 65536] = "Null";
      TypeFlags2[TypeFlags2["Never"] = 131072] = "Never";
      TypeFlags2[TypeFlags2["TypeParameter"] = 262144] = "TypeParameter";
      TypeFlags2[TypeFlags2["Object"] = 524288] = "Object";
      TypeFlags2[TypeFlags2["Union"] = 1048576] = "Union";
      TypeFlags2[TypeFlags2["Intersection"] = 2097152] = "Intersection";
      TypeFlags2[TypeFlags2["Index"] = 4194304] = "Index";
      TypeFlags2[TypeFlags2["IndexedAccess"] = 8388608] = "IndexedAccess";
      TypeFlags2[TypeFlags2["Conditional"] = 16777216] = "Conditional";
      TypeFlags2[TypeFlags2["Substitution"] = 33554432] = "Substitution";
      TypeFlags2[TypeFlags2["NonPrimitive"] = 67108864] = "NonPrimitive";
      TypeFlags2[TypeFlags2["TemplateLiteral"] = 134217728] = "TemplateLiteral";
      TypeFlags2[TypeFlags2["StringMapping"] = 268435456] = "StringMapping";
      TypeFlags2[TypeFlags2["AnyOrUnknown"] = 3] = "AnyOrUnknown";
      TypeFlags2[TypeFlags2["Nullable"] = 98304] = "Nullable";
      TypeFlags2[TypeFlags2["Literal"] = 2944] = "Literal";
      TypeFlags2[TypeFlags2["Unit"] = 109440] = "Unit";
      TypeFlags2[TypeFlags2["StringOrNumberLiteral"] = 384] = "StringOrNumberLiteral";
      TypeFlags2[TypeFlags2["StringOrNumberLiteralOrUnique"] = 8576] = "StringOrNumberLiteralOrUnique";
      TypeFlags2[TypeFlags2["DefinitelyFalsy"] = 117632] = "DefinitelyFalsy";
      TypeFlags2[TypeFlags2["PossiblyFalsy"] = 117724] = "PossiblyFalsy";
      TypeFlags2[TypeFlags2["Intrinsic"] = 67359327] = "Intrinsic";
      TypeFlags2[TypeFlags2["Primitive"] = 131068] = "Primitive";
      TypeFlags2[TypeFlags2["StringLike"] = 402653316] = "StringLike";
      TypeFlags2[TypeFlags2["NumberLike"] = 296] = "NumberLike";
      TypeFlags2[TypeFlags2["BigIntLike"] = 2112] = "BigIntLike";
      TypeFlags2[TypeFlags2["BooleanLike"] = 528] = "BooleanLike";
      TypeFlags2[TypeFlags2["EnumLike"] = 1056] = "EnumLike";
      TypeFlags2[TypeFlags2["ESSymbolLike"] = 12288] = "ESSymbolLike";
      TypeFlags2[TypeFlags2["VoidLike"] = 49152] = "VoidLike";
      TypeFlags2[TypeFlags2["DisjointDomains"] = 469892092] = "DisjointDomains";
      TypeFlags2[TypeFlags2["UnionOrIntersection"] = 3145728] = "UnionOrIntersection";
      TypeFlags2[TypeFlags2["StructuredType"] = 3670016] = "StructuredType";
      TypeFlags2[TypeFlags2["TypeVariable"] = 8650752] = "TypeVariable";
      TypeFlags2[TypeFlags2["InstantiableNonPrimitive"] = 58982400] = "InstantiableNonPrimitive";
      TypeFlags2[TypeFlags2["InstantiablePrimitive"] = 406847488] = "InstantiablePrimitive";
      TypeFlags2[TypeFlags2["Instantiable"] = 465829888] = "Instantiable";
      TypeFlags2[TypeFlags2["StructuredOrInstantiable"] = 469499904] = "StructuredOrInstantiable";
      TypeFlags2[TypeFlags2["ObjectFlagsType"] = 3899393] = "ObjectFlagsType";
      TypeFlags2[TypeFlags2["Simplifiable"] = 25165824] = "Simplifiable";
      TypeFlags2[TypeFlags2["Singleton"] = 67358815] = "Singleton";
      TypeFlags2[TypeFlags2["Narrowable"] = 536624127] = "Narrowable";
      TypeFlags2[TypeFlags2["IncludesMask"] = 205258751] = "IncludesMask";
      TypeFlags2[TypeFlags2["IncludesMissingType"] = 262144] = "IncludesMissingType";
      TypeFlags2[TypeFlags2["IncludesNonWideningType"] = 4194304] = "IncludesNonWideningType";
      TypeFlags2[TypeFlags2["IncludesWildcard"] = 8388608] = "IncludesWildcard";
      TypeFlags2[TypeFlags2["IncludesEmptyObject"] = 16777216] = "IncludesEmptyObject";
      TypeFlags2[TypeFlags2["IncludesInstantiable"] = 33554432] = "IncludesInstantiable";
      TypeFlags2[TypeFlags2["NotPrimitiveUnion"] = 36323363] = "NotPrimitiveUnion";
    })(TypeFlags = ts2.TypeFlags || (ts2.TypeFlags = {}));
    var ObjectFlags;
    (function(ObjectFlags2) {
      ObjectFlags2[ObjectFlags2["Class"] = 1] = "Class";
      ObjectFlags2[ObjectFlags2["Interface"] = 2] = "Interface";
      ObjectFlags2[ObjectFlags2["Reference"] = 4] = "Reference";
      ObjectFlags2[ObjectFlags2["Tuple"] = 8] = "Tuple";
      ObjectFlags2[ObjectFlags2["Anonymous"] = 16] = "Anonymous";
      ObjectFlags2[ObjectFlags2["Mapped"] = 32] = "Mapped";
      ObjectFlags2[ObjectFlags2["Instantiated"] = 64] = "Instantiated";
      ObjectFlags2[ObjectFlags2["ObjectLiteral"] = 128] = "ObjectLiteral";
      ObjectFlags2[ObjectFlags2["EvolvingArray"] = 256] = "EvolvingArray";
      ObjectFlags2[ObjectFlags2["ObjectLiteralPatternWithComputedProperties"] = 512] = "ObjectLiteralPatternWithComputedProperties";
      ObjectFlags2[ObjectFlags2["ReverseMapped"] = 1024] = "ReverseMapped";
      ObjectFlags2[ObjectFlags2["JsxAttributes"] = 2048] = "JsxAttributes";
      ObjectFlags2[ObjectFlags2["MarkerType"] = 4096] = "MarkerType";
      ObjectFlags2[ObjectFlags2["JSLiteral"] = 8192] = "JSLiteral";
      ObjectFlags2[ObjectFlags2["FreshLiteral"] = 16384] = "FreshLiteral";
      ObjectFlags2[ObjectFlags2["ArrayLiteral"] = 32768] = "ArrayLiteral";
      ObjectFlags2[ObjectFlags2["PrimitiveUnion"] = 65536] = "PrimitiveUnion";
      ObjectFlags2[ObjectFlags2["ContainsWideningType"] = 131072] = "ContainsWideningType";
      ObjectFlags2[ObjectFlags2["ContainsObjectOrArrayLiteral"] = 262144] = "ContainsObjectOrArrayLiteral";
      ObjectFlags2[ObjectFlags2["NonInferrableType"] = 524288] = "NonInferrableType";
      ObjectFlags2[ObjectFlags2["CouldContainTypeVariablesComputed"] = 1048576] = "CouldContainTypeVariablesComputed";
      ObjectFlags2[ObjectFlags2["CouldContainTypeVariables"] = 2097152] = "CouldContainTypeVariables";
      ObjectFlags2[ObjectFlags2["ClassOrInterface"] = 3] = "ClassOrInterface";
      ObjectFlags2[ObjectFlags2["RequiresWidening"] = 393216] = "RequiresWidening";
      ObjectFlags2[ObjectFlags2["PropagatingFlags"] = 917504] = "PropagatingFlags";
      ObjectFlags2[ObjectFlags2["ObjectTypeKindMask"] = 1343] = "ObjectTypeKindMask";
      ObjectFlags2[ObjectFlags2["ContainsSpread"] = 4194304] = "ContainsSpread";
      ObjectFlags2[ObjectFlags2["ObjectRestType"] = 8388608] = "ObjectRestType";
      ObjectFlags2[ObjectFlags2["IsClassInstanceClone"] = 16777216] = "IsClassInstanceClone";
      ObjectFlags2[ObjectFlags2["IdenticalBaseTypeCalculated"] = 33554432] = "IdenticalBaseTypeCalculated";
      ObjectFlags2[ObjectFlags2["IdenticalBaseTypeExists"] = 67108864] = "IdenticalBaseTypeExists";
      ObjectFlags2[ObjectFlags2["IsGenericTypeComputed"] = 4194304] = "IsGenericTypeComputed";
      ObjectFlags2[ObjectFlags2["IsGenericObjectType"] = 8388608] = "IsGenericObjectType";
      ObjectFlags2[ObjectFlags2["IsGenericIndexType"] = 16777216] = "IsGenericIndexType";
      ObjectFlags2[ObjectFlags2["IsGenericType"] = 25165824] = "IsGenericType";
      ObjectFlags2[ObjectFlags2["ContainsIntersections"] = 33554432] = "ContainsIntersections";
      ObjectFlags2[ObjectFlags2["IsNeverIntersectionComputed"] = 33554432] = "IsNeverIntersectionComputed";
      ObjectFlags2[ObjectFlags2["IsNeverIntersection"] = 67108864] = "IsNeverIntersection";
    })(ObjectFlags = ts2.ObjectFlags || (ts2.ObjectFlags = {}));
    var VarianceFlags;
    (function(VarianceFlags2) {
      VarianceFlags2[VarianceFlags2["Invariant"] = 0] = "Invariant";
      VarianceFlags2[VarianceFlags2["Covariant"] = 1] = "Covariant";
      VarianceFlags2[VarianceFlags2["Contravariant"] = 2] = "Contravariant";
      VarianceFlags2[VarianceFlags2["Bivariant"] = 3] = "Bivariant";
      VarianceFlags2[VarianceFlags2["Independent"] = 4] = "Independent";
      VarianceFlags2[VarianceFlags2["VarianceMask"] = 7] = "VarianceMask";
      VarianceFlags2[VarianceFlags2["Unmeasurable"] = 8] = "Unmeasurable";
      VarianceFlags2[VarianceFlags2["Unreliable"] = 16] = "Unreliable";
      VarianceFlags2[VarianceFlags2["AllowsStructuralFallback"] = 24] = "AllowsStructuralFallback";
    })(VarianceFlags = ts2.VarianceFlags || (ts2.VarianceFlags = {}));
    var ElementFlags;
    (function(ElementFlags2) {
      ElementFlags2[ElementFlags2["Required"] = 1] = "Required";
      ElementFlags2[ElementFlags2["Optional"] = 2] = "Optional";
      ElementFlags2[ElementFlags2["Rest"] = 4] = "Rest";
      ElementFlags2[ElementFlags2["Variadic"] = 8] = "Variadic";
      ElementFlags2[ElementFlags2["Fixed"] = 3] = "Fixed";
      ElementFlags2[ElementFlags2["Variable"] = 12] = "Variable";
      ElementFlags2[ElementFlags2["NonRequired"] = 14] = "NonRequired";
      ElementFlags2[ElementFlags2["NonRest"] = 11] = "NonRest";
    })(ElementFlags = ts2.ElementFlags || (ts2.ElementFlags = {}));
    var AccessFlags;
    (function(AccessFlags2) {
      AccessFlags2[AccessFlags2["None"] = 0] = "None";
      AccessFlags2[AccessFlags2["IncludeUndefined"] = 1] = "IncludeUndefined";
      AccessFlags2[AccessFlags2["NoIndexSignatures"] = 2] = "NoIndexSignatures";
      AccessFlags2[AccessFlags2["Writing"] = 4] = "Writing";
      AccessFlags2[AccessFlags2["CacheSymbol"] = 8] = "CacheSymbol";
      AccessFlags2[AccessFlags2["NoTupleBoundsCheck"] = 16] = "NoTupleBoundsCheck";
      AccessFlags2[AccessFlags2["ExpressionPosition"] = 32] = "ExpressionPosition";
      AccessFlags2[AccessFlags2["ReportDeprecated"] = 64] = "ReportDeprecated";
      AccessFlags2[AccessFlags2["SuppressNoImplicitAnyError"] = 128] = "SuppressNoImplicitAnyError";
      AccessFlags2[AccessFlags2["Contextual"] = 256] = "Contextual";
      AccessFlags2[AccessFlags2["Persistent"] = 1] = "Persistent";
    })(AccessFlags = ts2.AccessFlags || (ts2.AccessFlags = {}));
    var JsxReferenceKind;
    (function(JsxReferenceKind2) {
      JsxReferenceKind2[JsxReferenceKind2["Component"] = 0] = "Component";
      JsxReferenceKind2[JsxReferenceKind2["Function"] = 1] = "Function";
      JsxReferenceKind2[JsxReferenceKind2["Mixed"] = 2] = "Mixed";
    })(JsxReferenceKind = ts2.JsxReferenceKind || (ts2.JsxReferenceKind = {}));
    var SignatureKind;
    (function(SignatureKind2) {
      SignatureKind2[SignatureKind2["Call"] = 0] = "Call";
      SignatureKind2[SignatureKind2["Construct"] = 1] = "Construct";
    })(SignatureKind = ts2.SignatureKind || (ts2.SignatureKind = {}));
    var SignatureFlags;
    (function(SignatureFlags2) {
      SignatureFlags2[SignatureFlags2["None"] = 0] = "None";
      SignatureFlags2[SignatureFlags2["HasRestParameter"] = 1] = "HasRestParameter";
      SignatureFlags2[SignatureFlags2["HasLiteralTypes"] = 2] = "HasLiteralTypes";
      SignatureFlags2[SignatureFlags2["Abstract"] = 4] = "Abstract";
      SignatureFlags2[SignatureFlags2["IsInnerCallChain"] = 8] = "IsInnerCallChain";
      SignatureFlags2[SignatureFlags2["IsOuterCallChain"] = 16] = "IsOuterCallChain";
      SignatureFlags2[SignatureFlags2["IsUntypedSignatureInJSFile"] = 32] = "IsUntypedSignatureInJSFile";
      SignatureFlags2[SignatureFlags2["PropagatingFlags"] = 39] = "PropagatingFlags";
      SignatureFlags2[SignatureFlags2["CallChainFlags"] = 24] = "CallChainFlags";
    })(SignatureFlags = ts2.SignatureFlags || (ts2.SignatureFlags = {}));
    var IndexKind;
    (function(IndexKind2) {
      IndexKind2[IndexKind2["String"] = 0] = "String";
      IndexKind2[IndexKind2["Number"] = 1] = "Number";
    })(IndexKind = ts2.IndexKind || (ts2.IndexKind = {}));
    var TypeMapKind;
    (function(TypeMapKind2) {
      TypeMapKind2[TypeMapKind2["Simple"] = 0] = "Simple";
      TypeMapKind2[TypeMapKind2["Array"] = 1] = "Array";
      TypeMapKind2[TypeMapKind2["Function"] = 2] = "Function";
      TypeMapKind2[TypeMapKind2["Composite"] = 3] = "Composite";
      TypeMapKind2[TypeMapKind2["Merged"] = 4] = "Merged";
    })(TypeMapKind = ts2.TypeMapKind || (ts2.TypeMapKind = {}));
    var InferencePriority;
    (function(InferencePriority2) {
      InferencePriority2[InferencePriority2["NakedTypeVariable"] = 1] = "NakedTypeVariable";
      InferencePriority2[InferencePriority2["SpeculativeTuple"] = 2] = "SpeculativeTuple";
      InferencePriority2[InferencePriority2["SubstituteSource"] = 4] = "SubstituteSource";
      InferencePriority2[InferencePriority2["HomomorphicMappedType"] = 8] = "HomomorphicMappedType";
      InferencePriority2[InferencePriority2["PartialHomomorphicMappedType"] = 16] = "PartialHomomorphicMappedType";
      InferencePriority2[InferencePriority2["MappedTypeConstraint"] = 32] = "MappedTypeConstraint";
      InferencePriority2[InferencePriority2["ContravariantConditional"] = 64] = "ContravariantConditional";
      InferencePriority2[InferencePriority2["ReturnType"] = 128] = "ReturnType";
      InferencePriority2[InferencePriority2["LiteralKeyof"] = 256] = "LiteralKeyof";
      InferencePriority2[InferencePriority2["NoConstraints"] = 512] = "NoConstraints";
      InferencePriority2[InferencePriority2["AlwaysStrict"] = 1024] = "AlwaysStrict";
      InferencePriority2[InferencePriority2["MaxValue"] = 2048] = "MaxValue";
      InferencePriority2[InferencePriority2["PriorityImpliesCombination"] = 416] = "PriorityImpliesCombination";
      InferencePriority2[InferencePriority2["Circularity"] = -1] = "Circularity";
    })(InferencePriority = ts2.InferencePriority || (ts2.InferencePriority = {}));
    var InferenceFlags;
    (function(InferenceFlags2) {
      InferenceFlags2[InferenceFlags2["None"] = 0] = "None";
      InferenceFlags2[InferenceFlags2["NoDefault"] = 1] = "NoDefault";
      InferenceFlags2[InferenceFlags2["AnyDefault"] = 2] = "AnyDefault";
      InferenceFlags2[InferenceFlags2["SkippedGenericFunction"] = 4] = "SkippedGenericFunction";
    })(InferenceFlags = ts2.InferenceFlags || (ts2.InferenceFlags = {}));
    var Ternary;
    (function(Ternary2) {
      Ternary2[Ternary2["False"] = 0] = "False";
      Ternary2[Ternary2["Unknown"] = 1] = "Unknown";
      Ternary2[Ternary2["Maybe"] = 3] = "Maybe";
      Ternary2[Ternary2["True"] = -1] = "True";
    })(Ternary = ts2.Ternary || (ts2.Ternary = {}));
    var AssignmentDeclarationKind;
    (function(AssignmentDeclarationKind2) {
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["None"] = 0] = "None";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["ExportsProperty"] = 1] = "ExportsProperty";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["ModuleExports"] = 2] = "ModuleExports";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["PrototypeProperty"] = 3] = "PrototypeProperty";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["ThisProperty"] = 4] = "ThisProperty";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["Property"] = 5] = "Property";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["Prototype"] = 6] = "Prototype";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["ObjectDefinePropertyValue"] = 7] = "ObjectDefinePropertyValue";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["ObjectDefinePropertyExports"] = 8] = "ObjectDefinePropertyExports";
      AssignmentDeclarationKind2[AssignmentDeclarationKind2["ObjectDefinePrototypeProperty"] = 9] = "ObjectDefinePrototypeProperty";
    })(AssignmentDeclarationKind = ts2.AssignmentDeclarationKind || (ts2.AssignmentDeclarationKind = {}));
    var DiagnosticCategory;
    (function(DiagnosticCategory2) {
      DiagnosticCategory2[DiagnosticCategory2["Warning"] = 0] = "Warning";
      DiagnosticCategory2[DiagnosticCategory2["Error"] = 1] = "Error";
      DiagnosticCategory2[DiagnosticCategory2["Suggestion"] = 2] = "Suggestion";
      DiagnosticCategory2[DiagnosticCategory2["Message"] = 3] = "Message";
    })(DiagnosticCategory = ts2.DiagnosticCategory || (ts2.DiagnosticCategory = {}));
    function diagnosticCategoryName(d, lowerCase) {
      if (lowerCase === void 0) {
        lowerCase = true;
      }
      var name = DiagnosticCategory[d.category];
      return lowerCase ? name.toLowerCase() : name;
    }
    ts2.diagnosticCategoryName = diagnosticCategoryName;
    var ModuleResolutionKind;
    (function(ModuleResolutionKind2) {
      ModuleResolutionKind2[ModuleResolutionKind2["Classic"] = 1] = "Classic";
      ModuleResolutionKind2[ModuleResolutionKind2["NodeJs"] = 2] = "NodeJs";
      ModuleResolutionKind2[ModuleResolutionKind2["Node12"] = 3] = "Node12";
      ModuleResolutionKind2[ModuleResolutionKind2["NodeNext"] = 99] = "NodeNext";
    })(ModuleResolutionKind = ts2.ModuleResolutionKind || (ts2.ModuleResolutionKind = {}));
    var WatchFileKind;
    (function(WatchFileKind2) {
      WatchFileKind2[WatchFileKind2["FixedPollingInterval"] = 0] = "FixedPollingInterval";
      WatchFileKind2[WatchFileKind2["PriorityPollingInterval"] = 1] = "PriorityPollingInterval";
      WatchFileKind2[WatchFileKind2["DynamicPriorityPolling"] = 2] = "DynamicPriorityPolling";
      WatchFileKind2[WatchFileKind2["FixedChunkSizePolling"] = 3] = "FixedChunkSizePolling";
      WatchFileKind2[WatchFileKind2["UseFsEvents"] = 4] = "UseFsEvents";
      WatchFileKind2[WatchFileKind2["UseFsEventsOnParentDirectory"] = 5] = "UseFsEventsOnParentDirectory";
    })(WatchFileKind = ts2.WatchFileKind || (ts2.WatchFileKind = {}));
    var WatchDirectoryKind;
    (function(WatchDirectoryKind2) {
      WatchDirectoryKind2[WatchDirectoryKind2["UseFsEvents"] = 0] = "UseFsEvents";
      WatchDirectoryKind2[WatchDirectoryKind2["FixedPollingInterval"] = 1] = "FixedPollingInterval";
      WatchDirectoryKind2[WatchDirectoryKind2["DynamicPriorityPolling"] = 2] = "DynamicPriorityPolling";
      WatchDirectoryKind2[WatchDirectoryKind2["FixedChunkSizePolling"] = 3] = "FixedChunkSizePolling";
    })(WatchDirectoryKind = ts2.WatchDirectoryKind || (ts2.WatchDirectoryKind = {}));
    var PollingWatchKind;
    (function(PollingWatchKind2) {
      PollingWatchKind2[PollingWatchKind2["FixedInterval"] = 0] = "FixedInterval";
      PollingWatchKind2[PollingWatchKind2["PriorityInterval"] = 1] = "PriorityInterval";
      PollingWatchKind2[PollingWatchKind2["DynamicPriority"] = 2] = "DynamicPriority";
      PollingWatchKind2[PollingWatchKind2["FixedChunkSize"] = 3] = "FixedChunkSize";
    })(PollingWatchKind = ts2.PollingWatchKind || (ts2.PollingWatchKind = {}));
    var ModuleKind;
    (function(ModuleKind2) {
      ModuleKind2[ModuleKind2["None"] = 0] = "None";
      ModuleKind2[ModuleKind2["CommonJS"] = 1] = "CommonJS";
      ModuleKind2[ModuleKind2["AMD"] = 2] = "AMD";
      ModuleKind2[ModuleKind2["UMD"] = 3] = "UMD";
      ModuleKind2[ModuleKind2["System"] = 4] = "System";
      ModuleKind2[ModuleKind2["ES2015"] = 5] = "ES2015";
      ModuleKind2[ModuleKind2["ES2020"] = 6] = "ES2020";
      ModuleKind2[ModuleKind2["ES2022"] = 7] = "ES2022";
      ModuleKind2[ModuleKind2["ESNext"] = 99] = "ESNext";
      ModuleKind2[ModuleKind2["Node12"] = 100] = "Node12";
      ModuleKind2[ModuleKind2["NodeNext"] = 199] = "NodeNext";
    })(ModuleKind = ts2.ModuleKind || (ts2.ModuleKind = {}));
    var JsxEmit;
    (function(JsxEmit2) {
      JsxEmit2[JsxEmit2["None"] = 0] = "None";
      JsxEmit2[JsxEmit2["Preserve"] = 1] = "Preserve";
      JsxEmit2[JsxEmit2["React"] = 2] = "React";
      JsxEmit2[JsxEmit2["ReactNative"] = 3] = "ReactNative";
      JsxEmit2[JsxEmit2["ReactJSX"] = 4] = "ReactJSX";
      JsxEmit2[JsxEmit2["ReactJSXDev"] = 5] = "ReactJSXDev";
    })(JsxEmit = ts2.JsxEmit || (ts2.JsxEmit = {}));
    var ImportsNotUsedAsValues;
    (function(ImportsNotUsedAsValues2) {
      ImportsNotUsedAsValues2[ImportsNotUsedAsValues2["Remove"] = 0] = "Remove";
      ImportsNotUsedAsValues2[ImportsNotUsedAsValues2["Preserve"] = 1] = "Preserve";
      ImportsNotUsedAsValues2[ImportsNotUsedAsValues2["Error"] = 2] = "Error";
    })(ImportsNotUsedAsValues = ts2.ImportsNotUsedAsValues || (ts2.ImportsNotUsedAsValues = {}));
    var NewLineKind;
    (function(NewLineKind2) {
      NewLineKind2[NewLineKind2["CarriageReturnLineFeed"] = 0] = "CarriageReturnLineFeed";
      NewLineKind2[NewLineKind2["LineFeed"] = 1] = "LineFeed";
    })(NewLineKind = ts2.NewLineKind || (ts2.NewLineKind = {}));
    var ScriptKind2;
    (function(ScriptKind3) {
      ScriptKind3[ScriptKind3["Unknown"] = 0] = "Unknown";
      ScriptKind3[ScriptKind3["JS"] = 1] = "JS";
      ScriptKind3[ScriptKind3["JSX"] = 2] = "JSX";
      ScriptKind3[ScriptKind3["TS"] = 3] = "TS";
      ScriptKind3[ScriptKind3["TSX"] = 4] = "TSX";
      ScriptKind3[ScriptKind3["External"] = 5] = "External";
      ScriptKind3[ScriptKind3["JSON"] = 6] = "JSON";
      ScriptKind3[ScriptKind3["Deferred"] = 7] = "Deferred";
    })(ScriptKind2 = ts2.ScriptKind || (ts2.ScriptKind = {}));
    var ScriptTarget2;
    (function(ScriptTarget3) {
      ScriptTarget3[ScriptTarget3["ES3"] = 0] = "ES3";
      ScriptTarget3[ScriptTarget3["ES5"] = 1] = "ES5";
      ScriptTarget3[ScriptTarget3["ES2015"] = 2] = "ES2015";
      ScriptTarget3[ScriptTarget3["ES2016"] = 3] = "ES2016";
      ScriptTarget3[ScriptTarget3["ES2017"] = 4] = "ES2017";
      ScriptTarget3[ScriptTarget3["ES2018"] = 5] = "ES2018";
      ScriptTarget3[ScriptTarget3["ES2019"] = 6] = "ES2019";
      ScriptTarget3[ScriptTarget3["ES2020"] = 7] = "ES2020";
      ScriptTarget3[ScriptTarget3["ES2021"] = 8] = "ES2021";
      ScriptTarget3[ScriptTarget3["ESNext"] = 99] = "ESNext";
      ScriptTarget3[ScriptTarget3["JSON"] = 100] = "JSON";
      ScriptTarget3[ScriptTarget3["Latest"] = 99] = "Latest";
    })(ScriptTarget2 = ts2.ScriptTarget || (ts2.ScriptTarget = {}));
    var LanguageVariant;
    (function(LanguageVariant2) {
      LanguageVariant2[LanguageVariant2["Standard"] = 0] = "Standard";
      LanguageVariant2[LanguageVariant2["JSX"] = 1] = "JSX";
    })(LanguageVariant = ts2.LanguageVariant || (ts2.LanguageVariant = {}));
    var WatchDirectoryFlags;
    (function(WatchDirectoryFlags2) {
      WatchDirectoryFlags2[WatchDirectoryFlags2["None"] = 0] = "None";
      WatchDirectoryFlags2[WatchDirectoryFlags2["Recursive"] = 1] = "Recursive";
    })(WatchDirectoryFlags = ts2.WatchDirectoryFlags || (ts2.WatchDirectoryFlags = {}));
    var CharacterCodes;
    (function(CharacterCodes2) {
      CharacterCodes2[CharacterCodes2["nullCharacter"] = 0] = "nullCharacter";
      CharacterCodes2[CharacterCodes2["maxAsciiCharacter"] = 127] = "maxAsciiCharacter";
      CharacterCodes2[CharacterCodes2["lineFeed"] = 10] = "lineFeed";
      CharacterCodes2[CharacterCodes2["carriageReturn"] = 13] = "carriageReturn";
      CharacterCodes2[CharacterCodes2["lineSeparator"] = 8232] = "lineSeparator";
      CharacterCodes2[CharacterCodes2["paragraphSeparator"] = 8233] = "paragraphSeparator";
      CharacterCodes2[CharacterCodes2["nextLine"] = 133] = "nextLine";
      CharacterCodes2[CharacterCodes2["space"] = 32] = "space";
      CharacterCodes2[CharacterCodes2["nonBreakingSpace"] = 160] = "nonBreakingSpace";
      CharacterCodes2[CharacterCodes2["enQuad"] = 8192] = "enQuad";
      CharacterCodes2[CharacterCodes2["emQuad"] = 8193] = "emQuad";
      CharacterCodes2[CharacterCodes2["enSpace"] = 8194] = "enSpace";
      CharacterCodes2[CharacterCodes2["emSpace"] = 8195] = "emSpace";
      CharacterCodes2[CharacterCodes2["threePerEmSpace"] = 8196] = "threePerEmSpace";
      CharacterCodes2[CharacterCodes2["fourPerEmSpace"] = 8197] = "fourPerEmSpace";
      CharacterCodes2[CharacterCodes2["sixPerEmSpace"] = 8198] = "sixPerEmSpace";
      CharacterCodes2[CharacterCodes2["figureSpace"] = 8199] = "figureSpace";
      CharacterCodes2[CharacterCodes2["punctuationSpace"] = 8200] = "punctuationSpace";
      CharacterCodes2[CharacterCodes2["thinSpace"] = 8201] = "thinSpace";
      CharacterCodes2[CharacterCodes2["hairSpace"] = 8202] = "hairSpace";
      CharacterCodes2[CharacterCodes2["zeroWidthSpace"] = 8203] = "zeroWidthSpace";
      CharacterCodes2[CharacterCodes2["narrowNoBreakSpace"] = 8239] = "narrowNoBreakSpace";
      CharacterCodes2[CharacterCodes2["ideographicSpace"] = 12288] = "ideographicSpace";
      CharacterCodes2[CharacterCodes2["mathematicalSpace"] = 8287] = "mathematicalSpace";
      CharacterCodes2[CharacterCodes2["ogham"] = 5760] = "ogham";
      CharacterCodes2[CharacterCodes2["_"] = 95] = "_";
      CharacterCodes2[CharacterCodes2["$"] = 36] = "$";
      CharacterCodes2[CharacterCodes2["_0"] = 48] = "_0";
      CharacterCodes2[CharacterCodes2["_1"] = 49] = "_1";
      CharacterCodes2[CharacterCodes2["_2"] = 50] = "_2";
      CharacterCodes2[CharacterCodes2["_3"] = 51] = "_3";
      CharacterCodes2[CharacterCodes2["_4"] = 52] = "_4";
      CharacterCodes2[CharacterCodes2["_5"] = 53] = "_5";
      CharacterCodes2[CharacterCodes2["_6"] = 54] = "_6";
      CharacterCodes2[CharacterCodes2["_7"] = 55] = "_7";
      CharacterCodes2[CharacterCodes2["_8"] = 56] = "_8";
      CharacterCodes2[CharacterCodes2["_9"] = 57] = "_9";
      CharacterCodes2[CharacterCodes2["a"] = 97] = "a";
      CharacterCodes2[CharacterCodes2["b"] = 98] = "b";
      CharacterCodes2[CharacterCodes2["c"] = 99] = "c";
      CharacterCodes2[CharacterCodes2["d"] = 100] = "d";
      CharacterCodes2[CharacterCodes2["e"] = 101] = "e";
      CharacterCodes2[CharacterCodes2["f"] = 102] = "f";
      CharacterCodes2[CharacterCodes2["g"] = 103] = "g";
      CharacterCodes2[CharacterCodes2["h"] = 104] = "h";
      CharacterCodes2[CharacterCodes2["i"] = 105] = "i";
      CharacterCodes2[CharacterCodes2["j"] = 106] = "j";
      CharacterCodes2[CharacterCodes2["k"] = 107] = "k";
      CharacterCodes2[CharacterCodes2["l"] = 108] = "l";
      CharacterCodes2[CharacterCodes2["m"] = 109] = "m";
      CharacterCodes2[CharacterCodes2["n"] = 110] = "n";
      CharacterCodes2[CharacterCodes2["o"] = 111] = "o";
      CharacterCodes2[CharacterCodes2["p"] = 112] = "p";
      CharacterCodes2[CharacterCodes2["q"] = 113] = "q";
      CharacterCodes2[CharacterCodes2["r"] = 114] = "r";
      CharacterCodes2[CharacterCodes2["s"] = 115] = "s";
      CharacterCodes2[CharacterCodes2["t"] = 116] = "t";
      CharacterCodes2[CharacterCodes2["u"] = 117] = "u";
      CharacterCodes2[CharacterCodes2["v"] = 118] = "v";
      CharacterCodes2[CharacterCodes2["w"] = 119] = "w";
      CharacterCodes2[CharacterCodes2["x"] = 120] = "x";
      CharacterCodes2[CharacterCodes2["y"] = 121] = "y";
      CharacterCodes2[CharacterCodes2["z"] = 122] = "z";
      CharacterCodes2[CharacterCodes2["A"] = 65] = "A";
      CharacterCodes2[CharacterCodes2["B"] = 66] = "B";
      CharacterCodes2[CharacterCodes2["C"] = 67] = "C";
      CharacterCodes2[CharacterCodes2["D"] = 68] = "D";
      CharacterCodes2[CharacterCodes2["E"] = 69] = "E";
      CharacterCodes2[CharacterCodes2["F"] = 70] = "F";
      CharacterCodes2[CharacterCodes2["G"] = 71] = "G";
      CharacterCodes2[CharacterCodes2["H"] = 72] = "H";
      CharacterCodes2[CharacterCodes2["I"] = 73] = "I";
      CharacterCodes2[CharacterCodes2["J"] = 74] = "J";
      CharacterCodes2[CharacterCodes2["K"] = 75] = "K";
      CharacterCodes2[CharacterCodes2["L"] = 76] = "L";
      CharacterCodes2[CharacterCodes2["M"] = 77] = "M";
      CharacterCodes2[CharacterCodes2["N"] = 78] = "N";
      CharacterCodes2[CharacterCodes2["O"] = 79] = "O";
      CharacterCodes2[CharacterCodes2["P"] = 80] = "P";
      CharacterCodes2[CharacterCodes2["Q"] = 81] = "Q";
      CharacterCodes2[CharacterCodes2["R"] = 82] = "R";
      CharacterCodes2[CharacterCodes2["S"] = 83] = "S";
      CharacterCodes2[CharacterCodes2["T"] = 84] = "T";
      CharacterCodes2[CharacterCodes2["U"] = 85] = "U";
      CharacterCodes2[CharacterCodes2["V"] = 86] = "V";
      CharacterCodes2[CharacterCodes2["W"] = 87] = "W";
      CharacterCodes2[CharacterCodes2["X"] = 88] = "X";
      CharacterCodes2[CharacterCodes2["Y"] = 89] = "Y";
      CharacterCodes2[CharacterCodes2["Z"] = 90] = "Z";
      CharacterCodes2[CharacterCodes2["ampersand"] = 38] = "ampersand";
      CharacterCodes2[CharacterCodes2["asterisk"] = 42] = "asterisk";
      CharacterCodes2[CharacterCodes2["at"] = 64] = "at";
      CharacterCodes2[CharacterCodes2["backslash"] = 92] = "backslash";
      CharacterCodes2[CharacterCodes2["backtick"] = 96] = "backtick";
      CharacterCodes2[CharacterCodes2["bar"] = 124] = "bar";
      CharacterCodes2[CharacterCodes2["caret"] = 94] = "caret";
      CharacterCodes2[CharacterCodes2["closeBrace"] = 125] = "closeBrace";
      CharacterCodes2[CharacterCodes2["closeBracket"] = 93] = "closeBracket";
      CharacterCodes2[CharacterCodes2["closeParen"] = 41] = "closeParen";
      CharacterCodes2[CharacterCodes2["colon"] = 58] = "colon";
      CharacterCodes2[CharacterCodes2["comma"] = 44] = "comma";
      CharacterCodes2[CharacterCodes2["dot"] = 46] = "dot";
      CharacterCodes2[CharacterCodes2["doubleQuote"] = 34] = "doubleQuote";
      CharacterCodes2[CharacterCodes2["equals"] = 61] = "equals";
      CharacterCodes2[CharacterCodes2["exclamation"] = 33] = "exclamation";
      CharacterCodes2[CharacterCodes2["greaterThan"] = 62] = "greaterThan";
      CharacterCodes2[CharacterCodes2["hash"] = 35] = "hash";
      CharacterCodes2[CharacterCodes2["lessThan"] = 60] = "lessThan";
      CharacterCodes2[CharacterCodes2["minus"] = 45] = "minus";
      CharacterCodes2[CharacterCodes2["openBrace"] = 123] = "openBrace";
      CharacterCodes2[CharacterCodes2["openBracket"] = 91] = "openBracket";
      CharacterCodes2[CharacterCodes2["openParen"] = 40] = "openParen";
      CharacterCodes2[CharacterCodes2["percent"] = 37] = "percent";
      CharacterCodes2[CharacterCodes2["plus"] = 43] = "plus";
      CharacterCodes2[CharacterCodes2["question"] = 63] = "question";
      CharacterCodes2[CharacterCodes2["semicolon"] = 59] = "semicolon";
      CharacterCodes2[CharacterCodes2["singleQuote"] = 39] = "singleQuote";
      CharacterCodes2[CharacterCodes2["slash"] = 47] = "slash";
      CharacterCodes2[CharacterCodes2["tilde"] = 126] = "tilde";
      CharacterCodes2[CharacterCodes2["backspace"] = 8] = "backspace";
      CharacterCodes2[CharacterCodes2["formFeed"] = 12] = "formFeed";
      CharacterCodes2[CharacterCodes2["byteOrderMark"] = 65279] = "byteOrderMark";
      CharacterCodes2[CharacterCodes2["tab"] = 9] = "tab";
      CharacterCodes2[CharacterCodes2["verticalTab"] = 11] = "verticalTab";
    })(CharacterCodes = ts2.CharacterCodes || (ts2.CharacterCodes = {}));
    var Extension;
    (function(Extension2) {
      Extension2["Ts"] = ".ts";
      Extension2["Tsx"] = ".tsx";
      Extension2["Dts"] = ".d.ts";
      Extension2["Js"] = ".js";
      Extension2["Jsx"] = ".jsx";
      Extension2["Json"] = ".json";
      Extension2["TsBuildInfo"] = ".tsbuildinfo";
      Extension2["Mjs"] = ".mjs";
      Extension2["Mts"] = ".mts";
      Extension2["Dmts"] = ".d.mts";
      Extension2["Cjs"] = ".cjs";
      Extension2["Cts"] = ".cts";
      Extension2["Dcts"] = ".d.cts";
    })(Extension = ts2.Extension || (ts2.Extension = {}));
    var TransformFlags;
    (function(TransformFlags2) {
      TransformFlags2[TransformFlags2["None"] = 0] = "None";
      TransformFlags2[TransformFlags2["ContainsTypeScript"] = 1] = "ContainsTypeScript";
      TransformFlags2[TransformFlags2["ContainsJsx"] = 2] = "ContainsJsx";
      TransformFlags2[TransformFlags2["ContainsESNext"] = 4] = "ContainsESNext";
      TransformFlags2[TransformFlags2["ContainsES2021"] = 8] = "ContainsES2021";
      TransformFlags2[TransformFlags2["ContainsES2020"] = 16] = "ContainsES2020";
      TransformFlags2[TransformFlags2["ContainsES2019"] = 32] = "ContainsES2019";
      TransformFlags2[TransformFlags2["ContainsES2018"] = 64] = "ContainsES2018";
      TransformFlags2[TransformFlags2["ContainsES2017"] = 128] = "ContainsES2017";
      TransformFlags2[TransformFlags2["ContainsES2016"] = 256] = "ContainsES2016";
      TransformFlags2[TransformFlags2["ContainsES2015"] = 512] = "ContainsES2015";
      TransformFlags2[TransformFlags2["ContainsGenerator"] = 1024] = "ContainsGenerator";
      TransformFlags2[TransformFlags2["ContainsDestructuringAssignment"] = 2048] = "ContainsDestructuringAssignment";
      TransformFlags2[TransformFlags2["ContainsTypeScriptClassSyntax"] = 4096] = "ContainsTypeScriptClassSyntax";
      TransformFlags2[TransformFlags2["ContainsLexicalThis"] = 8192] = "ContainsLexicalThis";
      TransformFlags2[TransformFlags2["ContainsRestOrSpread"] = 16384] = "ContainsRestOrSpread";
      TransformFlags2[TransformFlags2["ContainsObjectRestOrSpread"] = 32768] = "ContainsObjectRestOrSpread";
      TransformFlags2[TransformFlags2["ContainsComputedPropertyName"] = 65536] = "ContainsComputedPropertyName";
      TransformFlags2[TransformFlags2["ContainsBlockScopedBinding"] = 131072] = "ContainsBlockScopedBinding";
      TransformFlags2[TransformFlags2["ContainsBindingPattern"] = 262144] = "ContainsBindingPattern";
      TransformFlags2[TransformFlags2["ContainsYield"] = 524288] = "ContainsYield";
      TransformFlags2[TransformFlags2["ContainsAwait"] = 1048576] = "ContainsAwait";
      TransformFlags2[TransformFlags2["ContainsHoistedDeclarationOrCompletion"] = 2097152] = "ContainsHoistedDeclarationOrCompletion";
      TransformFlags2[TransformFlags2["ContainsDynamicImport"] = 4194304] = "ContainsDynamicImport";
      TransformFlags2[TransformFlags2["ContainsClassFields"] = 8388608] = "ContainsClassFields";
      TransformFlags2[TransformFlags2["ContainsPossibleTopLevelAwait"] = 16777216] = "ContainsPossibleTopLevelAwait";
      TransformFlags2[TransformFlags2["ContainsLexicalSuper"] = 33554432] = "ContainsLexicalSuper";
      TransformFlags2[TransformFlags2["ContainsUpdateExpressionForIdentifier"] = 67108864] = "ContainsUpdateExpressionForIdentifier";
      TransformFlags2[TransformFlags2["HasComputedFlags"] = 536870912] = "HasComputedFlags";
      TransformFlags2[TransformFlags2["AssertTypeScript"] = 1] = "AssertTypeScript";
      TransformFlags2[TransformFlags2["AssertJsx"] = 2] = "AssertJsx";
      TransformFlags2[TransformFlags2["AssertESNext"] = 4] = "AssertESNext";
      TransformFlags2[TransformFlags2["AssertES2021"] = 8] = "AssertES2021";
      TransformFlags2[TransformFlags2["AssertES2020"] = 16] = "AssertES2020";
      TransformFlags2[TransformFlags2["AssertES2019"] = 32] = "AssertES2019";
      TransformFlags2[TransformFlags2["AssertES2018"] = 64] = "AssertES2018";
      TransformFlags2[TransformFlags2["AssertES2017"] = 128] = "AssertES2017";
      TransformFlags2[TransformFlags2["AssertES2016"] = 256] = "AssertES2016";
      TransformFlags2[TransformFlags2["AssertES2015"] = 512] = "AssertES2015";
      TransformFlags2[TransformFlags2["AssertGenerator"] = 1024] = "AssertGenerator";
      TransformFlags2[TransformFlags2["AssertDestructuringAssignment"] = 2048] = "AssertDestructuringAssignment";
      TransformFlags2[TransformFlags2["OuterExpressionExcludes"] = 536870912] = "OuterExpressionExcludes";
      TransformFlags2[TransformFlags2["PropertyAccessExcludes"] = 536870912] = "PropertyAccessExcludes";
      TransformFlags2[TransformFlags2["NodeExcludes"] = 536870912] = "NodeExcludes";
      TransformFlags2[TransformFlags2["ArrowFunctionExcludes"] = 557748224] = "ArrowFunctionExcludes";
      TransformFlags2[TransformFlags2["FunctionExcludes"] = 591310848] = "FunctionExcludes";
      TransformFlags2[TransformFlags2["ConstructorExcludes"] = 591306752] = "ConstructorExcludes";
      TransformFlags2[TransformFlags2["MethodOrAccessorExcludes"] = 574529536] = "MethodOrAccessorExcludes";
      TransformFlags2[TransformFlags2["PropertyExcludes"] = 570433536] = "PropertyExcludes";
      TransformFlags2[TransformFlags2["ClassExcludes"] = 536940544] = "ClassExcludes";
      TransformFlags2[TransformFlags2["ModuleExcludes"] = 589443072] = "ModuleExcludes";
      TransformFlags2[TransformFlags2["TypeExcludes"] = -2] = "TypeExcludes";
      TransformFlags2[TransformFlags2["ObjectLiteralExcludes"] = 536973312] = "ObjectLiteralExcludes";
      TransformFlags2[TransformFlags2["ArrayLiteralOrCallOrNewExcludes"] = 536887296] = "ArrayLiteralOrCallOrNewExcludes";
      TransformFlags2[TransformFlags2["VariableDeclarationListExcludes"] = 537165824] = "VariableDeclarationListExcludes";
      TransformFlags2[TransformFlags2["ParameterExcludes"] = 536870912] = "ParameterExcludes";
      TransformFlags2[TransformFlags2["CatchClauseExcludes"] = 536903680] = "CatchClauseExcludes";
      TransformFlags2[TransformFlags2["BindingPatternExcludes"] = 536887296] = "BindingPatternExcludes";
      TransformFlags2[TransformFlags2["ContainsLexicalThisOrSuper"] = 33562624] = "ContainsLexicalThisOrSuper";
      TransformFlags2[TransformFlags2["PropertyNamePropagatingFlags"] = 33562624] = "PropertyNamePropagatingFlags";
    })(TransformFlags = ts2.TransformFlags || (ts2.TransformFlags = {}));
    var SnippetKind;
    (function(SnippetKind2) {
      SnippetKind2[SnippetKind2["TabStop"] = 0] = "TabStop";
      SnippetKind2[SnippetKind2["Placeholder"] = 1] = "Placeholder";
      SnippetKind2[SnippetKind2["Choice"] = 2] = "Choice";
      SnippetKind2[SnippetKind2["Variable"] = 3] = "Variable";
    })(SnippetKind = ts2.SnippetKind || (ts2.SnippetKind = {}));
    var EmitFlags;
    (function(EmitFlags2) {
      EmitFlags2[EmitFlags2["None"] = 0] = "None";
      EmitFlags2[EmitFlags2["SingleLine"] = 1] = "SingleLine";
      EmitFlags2[EmitFlags2["AdviseOnEmitNode"] = 2] = "AdviseOnEmitNode";
      EmitFlags2[EmitFlags2["NoSubstitution"] = 4] = "NoSubstitution";
      EmitFlags2[EmitFlags2["CapturesThis"] = 8] = "CapturesThis";
      EmitFlags2[EmitFlags2["NoLeadingSourceMap"] = 16] = "NoLeadingSourceMap";
      EmitFlags2[EmitFlags2["NoTrailingSourceMap"] = 32] = "NoTrailingSourceMap";
      EmitFlags2[EmitFlags2["NoSourceMap"] = 48] = "NoSourceMap";
      EmitFlags2[EmitFlags2["NoNestedSourceMaps"] = 64] = "NoNestedSourceMaps";
      EmitFlags2[EmitFlags2["NoTokenLeadingSourceMaps"] = 128] = "NoTokenLeadingSourceMaps";
      EmitFlags2[EmitFlags2["NoTokenTrailingSourceMaps"] = 256] = "NoTokenTrailingSourceMaps";
      EmitFlags2[EmitFlags2["NoTokenSourceMaps"] = 384] = "NoTokenSourceMaps";
      EmitFlags2[EmitFlags2["NoLeadingComments"] = 512] = "NoLeadingComments";
      EmitFlags2[EmitFlags2["NoTrailingComments"] = 1024] = "NoTrailingComments";
      EmitFlags2[EmitFlags2["NoComments"] = 1536] = "NoComments";
      EmitFlags2[EmitFlags2["NoNestedComments"] = 2048] = "NoNestedComments";
      EmitFlags2[EmitFlags2["HelperName"] = 4096] = "HelperName";
      EmitFlags2[EmitFlags2["ExportName"] = 8192] = "ExportName";
      EmitFlags2[EmitFlags2["LocalName"] = 16384] = "LocalName";
      EmitFlags2[EmitFlags2["InternalName"] = 32768] = "InternalName";
      EmitFlags2[EmitFlags2["Indented"] = 65536] = "Indented";
      EmitFlags2[EmitFlags2["NoIndentation"] = 131072] = "NoIndentation";
      EmitFlags2[EmitFlags2["AsyncFunctionBody"] = 262144] = "AsyncFunctionBody";
      EmitFlags2[EmitFlags2["ReuseTempVariableScope"] = 524288] = "ReuseTempVariableScope";
      EmitFlags2[EmitFlags2["CustomPrologue"] = 1048576] = "CustomPrologue";
      EmitFlags2[EmitFlags2["NoHoisting"] = 2097152] = "NoHoisting";
      EmitFlags2[EmitFlags2["HasEndOfDeclarationMarker"] = 4194304] = "HasEndOfDeclarationMarker";
      EmitFlags2[EmitFlags2["Iterator"] = 8388608] = "Iterator";
      EmitFlags2[EmitFlags2["NoAsciiEscaping"] = 16777216] = "NoAsciiEscaping";
      EmitFlags2[EmitFlags2["TypeScriptClassWrapper"] = 33554432] = "TypeScriptClassWrapper";
      EmitFlags2[EmitFlags2["NeverApplyImportHelper"] = 67108864] = "NeverApplyImportHelper";
      EmitFlags2[EmitFlags2["IgnoreSourceNewlines"] = 134217728] = "IgnoreSourceNewlines";
      EmitFlags2[EmitFlags2["Immutable"] = 268435456] = "Immutable";
      EmitFlags2[EmitFlags2["IndirectCall"] = 536870912] = "IndirectCall";
    })(EmitFlags = ts2.EmitFlags || (ts2.EmitFlags = {}));
    var ExternalEmitHelpers;
    (function(ExternalEmitHelpers2) {
      ExternalEmitHelpers2[ExternalEmitHelpers2["Extends"] = 1] = "Extends";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Assign"] = 2] = "Assign";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Rest"] = 4] = "Rest";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Decorate"] = 8] = "Decorate";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Metadata"] = 16] = "Metadata";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Param"] = 32] = "Param";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Awaiter"] = 64] = "Awaiter";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Generator"] = 128] = "Generator";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Values"] = 256] = "Values";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Read"] = 512] = "Read";
      ExternalEmitHelpers2[ExternalEmitHelpers2["SpreadArray"] = 1024] = "SpreadArray";
      ExternalEmitHelpers2[ExternalEmitHelpers2["Await"] = 2048] = "Await";
      ExternalEmitHelpers2[ExternalEmitHelpers2["AsyncGenerator"] = 4096] = "AsyncGenerator";
      ExternalEmitHelpers2[ExternalEmitHelpers2["AsyncDelegator"] = 8192] = "AsyncDelegator";
      ExternalEmitHelpers2[ExternalEmitHelpers2["AsyncValues"] = 16384] = "AsyncValues";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ExportStar"] = 32768] = "ExportStar";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ImportStar"] = 65536] = "ImportStar";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ImportDefault"] = 131072] = "ImportDefault";
      ExternalEmitHelpers2[ExternalEmitHelpers2["MakeTemplateObject"] = 262144] = "MakeTemplateObject";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ClassPrivateFieldGet"] = 524288] = "ClassPrivateFieldGet";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ClassPrivateFieldSet"] = 1048576] = "ClassPrivateFieldSet";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ClassPrivateFieldIn"] = 2097152] = "ClassPrivateFieldIn";
      ExternalEmitHelpers2[ExternalEmitHelpers2["CreateBinding"] = 4194304] = "CreateBinding";
      ExternalEmitHelpers2[ExternalEmitHelpers2["FirstEmitHelper"] = 1] = "FirstEmitHelper";
      ExternalEmitHelpers2[ExternalEmitHelpers2["LastEmitHelper"] = 4194304] = "LastEmitHelper";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ForOfIncludes"] = 256] = "ForOfIncludes";
      ExternalEmitHelpers2[ExternalEmitHelpers2["ForAwaitOfIncludes"] = 16384] = "ForAwaitOfIncludes";
      ExternalEmitHelpers2[ExternalEmitHelpers2["AsyncGeneratorIncludes"] = 6144] = "AsyncGeneratorIncludes";
      ExternalEmitHelpers2[ExternalEmitHelpers2["AsyncDelegatorIncludes"] = 26624] = "AsyncDelegatorIncludes";
      ExternalEmitHelpers2[ExternalEmitHelpers2["SpreadIncludes"] = 1536] = "SpreadIncludes";
    })(ExternalEmitHelpers = ts2.ExternalEmitHelpers || (ts2.ExternalEmitHelpers = {}));
    var EmitHint;
    (function(EmitHint2) {
      EmitHint2[EmitHint2["SourceFile"] = 0] = "SourceFile";
      EmitHint2[EmitHint2["Expression"] = 1] = "Expression";
      EmitHint2[EmitHint2["IdentifierName"] = 2] = "IdentifierName";
      EmitHint2[EmitHint2["MappedTypeParameter"] = 3] = "MappedTypeParameter";
      EmitHint2[EmitHint2["Unspecified"] = 4] = "Unspecified";
      EmitHint2[EmitHint2["EmbeddedStatement"] = 5] = "EmbeddedStatement";
      EmitHint2[EmitHint2["JsxAttributeValue"] = 6] = "JsxAttributeValue";
    })(EmitHint = ts2.EmitHint || (ts2.EmitHint = {}));
    var OuterExpressionKinds;
    (function(OuterExpressionKinds2) {
      OuterExpressionKinds2[OuterExpressionKinds2["Parentheses"] = 1] = "Parentheses";
      OuterExpressionKinds2[OuterExpressionKinds2["TypeAssertions"] = 2] = "TypeAssertions";
      OuterExpressionKinds2[OuterExpressionKinds2["NonNullAssertions"] = 4] = "NonNullAssertions";
      OuterExpressionKinds2[OuterExpressionKinds2["PartiallyEmittedExpressions"] = 8] = "PartiallyEmittedExpressions";
      OuterExpressionKinds2[OuterExpressionKinds2["Assertions"] = 6] = "Assertions";
      OuterExpressionKinds2[OuterExpressionKinds2["All"] = 15] = "All";
      OuterExpressionKinds2[OuterExpressionKinds2["ExcludeJSDocTypeAssertion"] = 16] = "ExcludeJSDocTypeAssertion";
    })(OuterExpressionKinds = ts2.OuterExpressionKinds || (ts2.OuterExpressionKinds = {}));
    var LexicalEnvironmentFlags;
    (function(LexicalEnvironmentFlags2) {
      LexicalEnvironmentFlags2[LexicalEnvironmentFlags2["None"] = 0] = "None";
      LexicalEnvironmentFlags2[LexicalEnvironmentFlags2["InParameters"] = 1] = "InParameters";
      LexicalEnvironmentFlags2[LexicalEnvironmentFlags2["VariablesHoistedInParameters"] = 2] = "VariablesHoistedInParameters";
    })(LexicalEnvironmentFlags = ts2.LexicalEnvironmentFlags || (ts2.LexicalEnvironmentFlags = {}));
    var BundleFileSectionKind;
    (function(BundleFileSectionKind2) {
      BundleFileSectionKind2["Prologue"] = "prologue";
      BundleFileSectionKind2["EmitHelpers"] = "emitHelpers";
      BundleFileSectionKind2["NoDefaultLib"] = "no-default-lib";
      BundleFileSectionKind2["Reference"] = "reference";
      BundleFileSectionKind2["Type"] = "type";
      BundleFileSectionKind2["Lib"] = "lib";
      BundleFileSectionKind2["Prepend"] = "prepend";
      BundleFileSectionKind2["Text"] = "text";
      BundleFileSectionKind2["Internal"] = "internal";
    })(BundleFileSectionKind = ts2.BundleFileSectionKind || (ts2.BundleFileSectionKind = {}));
    var ListFormat;
    (function(ListFormat2) {
      ListFormat2[ListFormat2["None"] = 0] = "None";
      ListFormat2[ListFormat2["SingleLine"] = 0] = "SingleLine";
      ListFormat2[ListFormat2["MultiLine"] = 1] = "MultiLine";
      ListFormat2[ListFormat2["PreserveLines"] = 2] = "PreserveLines";
      ListFormat2[ListFormat2["LinesMask"] = 3] = "LinesMask";
      ListFormat2[ListFormat2["NotDelimited"] = 0] = "NotDelimited";
      ListFormat2[ListFormat2["BarDelimited"] = 4] = "BarDelimited";
      ListFormat2[ListFormat2["AmpersandDelimited"] = 8] = "AmpersandDelimited";
      ListFormat2[ListFormat2["CommaDelimited"] = 16] = "CommaDelimited";
      ListFormat2[ListFormat2["AsteriskDelimited"] = 32] = "AsteriskDelimited";
      ListFormat2[ListFormat2["DelimitersMask"] = 60] = "DelimitersMask";
      ListFormat2[ListFormat2["AllowTrailingComma"] = 64] = "AllowTrailingComma";
      ListFormat2[ListFormat2["Indented"] = 128] = "Indented";
      ListFormat2[ListFormat2["SpaceBetweenBraces"] = 256] = "SpaceBetweenBraces";
      ListFormat2[ListFormat2["SpaceBetweenSiblings"] = 512] = "SpaceBetweenSiblings";
      ListFormat2[ListFormat2["Braces"] = 1024] = "Braces";
      ListFormat2[ListFormat2["Parenthesis"] = 2048] = "Parenthesis";
      ListFormat2[ListFormat2["AngleBrackets"] = 4096] = "AngleBrackets";
      ListFormat2[ListFormat2["SquareBrackets"] = 8192] = "SquareBrackets";
      ListFormat2[ListFormat2["BracketsMask"] = 15360] = "BracketsMask";
      ListFormat2[ListFormat2["OptionalIfUndefined"] = 16384] = "OptionalIfUndefined";
      ListFormat2[ListFormat2["OptionalIfEmpty"] = 32768] = "OptionalIfEmpty";
      ListFormat2[ListFormat2["Optional"] = 49152] = "Optional";
      ListFormat2[ListFormat2["PreferNewLine"] = 65536] = "PreferNewLine";
      ListFormat2[ListFormat2["NoTrailingNewLine"] = 131072] = "NoTrailingNewLine";
      ListFormat2[ListFormat2["NoInterveningComments"] = 262144] = "NoInterveningComments";
      ListFormat2[ListFormat2["NoSpaceIfEmpty"] = 524288] = "NoSpaceIfEmpty";
      ListFormat2[ListFormat2["SingleElement"] = 1048576] = "SingleElement";
      ListFormat2[ListFormat2["SpaceAfterList"] = 2097152] = "SpaceAfterList";
      ListFormat2[ListFormat2["Modifiers"] = 262656] = "Modifiers";
      ListFormat2[ListFormat2["HeritageClauses"] = 512] = "HeritageClauses";
      ListFormat2[ListFormat2["SingleLineTypeLiteralMembers"] = 768] = "SingleLineTypeLiteralMembers";
      ListFormat2[ListFormat2["MultiLineTypeLiteralMembers"] = 32897] = "MultiLineTypeLiteralMembers";
      ListFormat2[ListFormat2["SingleLineTupleTypeElements"] = 528] = "SingleLineTupleTypeElements";
      ListFormat2[ListFormat2["MultiLineTupleTypeElements"] = 657] = "MultiLineTupleTypeElements";
      ListFormat2[ListFormat2["UnionTypeConstituents"] = 516] = "UnionTypeConstituents";
      ListFormat2[ListFormat2["IntersectionTypeConstituents"] = 520] = "IntersectionTypeConstituents";
      ListFormat2[ListFormat2["ObjectBindingPatternElements"] = 525136] = "ObjectBindingPatternElements";
      ListFormat2[ListFormat2["ArrayBindingPatternElements"] = 524880] = "ArrayBindingPatternElements";
      ListFormat2[ListFormat2["ObjectLiteralExpressionProperties"] = 526226] = "ObjectLiteralExpressionProperties";
      ListFormat2[ListFormat2["ImportClauseEntries"] = 526226] = "ImportClauseEntries";
      ListFormat2[ListFormat2["ArrayLiteralExpressionElements"] = 8914] = "ArrayLiteralExpressionElements";
      ListFormat2[ListFormat2["CommaListElements"] = 528] = "CommaListElements";
      ListFormat2[ListFormat2["CallExpressionArguments"] = 2576] = "CallExpressionArguments";
      ListFormat2[ListFormat2["NewExpressionArguments"] = 18960] = "NewExpressionArguments";
      ListFormat2[ListFormat2["TemplateExpressionSpans"] = 262144] = "TemplateExpressionSpans";
      ListFormat2[ListFormat2["SingleLineBlockStatements"] = 768] = "SingleLineBlockStatements";
      ListFormat2[ListFormat2["MultiLineBlockStatements"] = 129] = "MultiLineBlockStatements";
      ListFormat2[ListFormat2["VariableDeclarationList"] = 528] = "VariableDeclarationList";
      ListFormat2[ListFormat2["SingleLineFunctionBodyStatements"] = 768] = "SingleLineFunctionBodyStatements";
      ListFormat2[ListFormat2["MultiLineFunctionBodyStatements"] = 1] = "MultiLineFunctionBodyStatements";
      ListFormat2[ListFormat2["ClassHeritageClauses"] = 0] = "ClassHeritageClauses";
      ListFormat2[ListFormat2["ClassMembers"] = 129] = "ClassMembers";
      ListFormat2[ListFormat2["InterfaceMembers"] = 129] = "InterfaceMembers";
      ListFormat2[ListFormat2["EnumMembers"] = 145] = "EnumMembers";
      ListFormat2[ListFormat2["CaseBlockClauses"] = 129] = "CaseBlockClauses";
      ListFormat2[ListFormat2["NamedImportsOrExportsElements"] = 525136] = "NamedImportsOrExportsElements";
      ListFormat2[ListFormat2["JsxElementOrFragmentChildren"] = 262144] = "JsxElementOrFragmentChildren";
      ListFormat2[ListFormat2["JsxElementAttributes"] = 262656] = "JsxElementAttributes";
      ListFormat2[ListFormat2["CaseOrDefaultClauseStatements"] = 163969] = "CaseOrDefaultClauseStatements";
      ListFormat2[ListFormat2["HeritageClauseTypes"] = 528] = "HeritageClauseTypes";
      ListFormat2[ListFormat2["SourceFileStatements"] = 131073] = "SourceFileStatements";
      ListFormat2[ListFormat2["Decorators"] = 2146305] = "Decorators";
      ListFormat2[ListFormat2["TypeArguments"] = 53776] = "TypeArguments";
      ListFormat2[ListFormat2["TypeParameters"] = 53776] = "TypeParameters";
      ListFormat2[ListFormat2["Parameters"] = 2576] = "Parameters";
      ListFormat2[ListFormat2["IndexSignatureParameters"] = 8848] = "IndexSignatureParameters";
      ListFormat2[ListFormat2["JSDocComment"] = 33] = "JSDocComment";
    })(ListFormat = ts2.ListFormat || (ts2.ListFormat = {}));
    var PragmaKindFlags;
    (function(PragmaKindFlags2) {
      PragmaKindFlags2[PragmaKindFlags2["None"] = 0] = "None";
      PragmaKindFlags2[PragmaKindFlags2["TripleSlashXML"] = 1] = "TripleSlashXML";
      PragmaKindFlags2[PragmaKindFlags2["SingleLine"] = 2] = "SingleLine";
      PragmaKindFlags2[PragmaKindFlags2["MultiLine"] = 4] = "MultiLine";
      PragmaKindFlags2[PragmaKindFlags2["All"] = 7] = "All";
      PragmaKindFlags2[PragmaKindFlags2["Default"] = 7] = "Default";
    })(PragmaKindFlags = ts2.PragmaKindFlags || (ts2.PragmaKindFlags = {}));
    ts2.commentPragmas = {
      "reference": {
        args: [
          { name: "types", optional: true, captureSpan: true },
          { name: "lib", optional: true, captureSpan: true },
          { name: "path", optional: true, captureSpan: true },
          { name: "no-default-lib", optional: true }
        ],
        kind: 1
      },
      "amd-dependency": {
        args: [{ name: "path" }, { name: "name", optional: true }],
        kind: 1
      },
      "amd-module": {
        args: [{ name: "name" }],
        kind: 1
      },
      "ts-check": {
        kind: 2
      },
      "ts-nocheck": {
        kind: 2
      },
      "jsx": {
        args: [{ name: "factory" }],
        kind: 4
      },
      "jsxfrag": {
        args: [{ name: "factory" }],
        kind: 4
      },
      "jsximportsource": {
        args: [{ name: "factory" }],
        kind: 4
      },
      "jsxruntime": {
        args: [{ name: "factory" }],
        kind: 4
      }
    };
  })(ts || (ts = {}));
  (function(ts2) {
    ts2.directorySeparator = "/";
    ts2.altDirectorySeparator = "\\";
    var urlSchemeSeparator = "://";
    var backslashRegExp = /\\/g;
    function isAnyDirectorySeparator(charCode) {
      return charCode === 47 || charCode === 92;
    }
    ts2.isAnyDirectorySeparator = isAnyDirectorySeparator;
    function isUrl(path) {
      return getEncodedRootLength(path) < 0;
    }
    ts2.isUrl = isUrl;
    function isRootedDiskPath(path) {
      return getEncodedRootLength(path) > 0;
    }
    ts2.isRootedDiskPath = isRootedDiskPath;
    function isDiskPathRoot(path) {
      var rootLength = getEncodedRootLength(path);
      return rootLength > 0 && rootLength === path.length;
    }
    ts2.isDiskPathRoot = isDiskPathRoot;
    function pathIsAbsolute(path) {
      return getEncodedRootLength(path) !== 0;
    }
    ts2.pathIsAbsolute = pathIsAbsolute;
    function pathIsRelative(path) {
      return /^\.\.?($|[\\/])/.test(path);
    }
    ts2.pathIsRelative = pathIsRelative;
    function pathIsBareSpecifier(path) {
      return !pathIsAbsolute(path) && !pathIsRelative(path);
    }
    ts2.pathIsBareSpecifier = pathIsBareSpecifier;
    function hasExtension(fileName) {
      return ts2.stringContains(getBaseFileName(fileName), ".");
    }
    ts2.hasExtension = hasExtension;
    function fileExtensionIs(path, extension) {
      return path.length > extension.length && ts2.endsWith(path, extension);
    }
    ts2.fileExtensionIs = fileExtensionIs;
    function fileExtensionIsOneOf(path, extensions) {
      for (var _i = 0, extensions_1 = extensions; _i < extensions_1.length; _i++) {
        var extension = extensions_1[_i];
        if (fileExtensionIs(path, extension)) {
          return true;
        }
      }
      return false;
    }
    ts2.fileExtensionIsOneOf = fileExtensionIsOneOf;
    function hasTrailingDirectorySeparator(path) {
      return path.length > 0 && isAnyDirectorySeparator(path.charCodeAt(path.length - 1));
    }
    ts2.hasTrailingDirectorySeparator = hasTrailingDirectorySeparator;
    function isVolumeCharacter(charCode) {
      return charCode >= 97 && charCode <= 122 || charCode >= 65 && charCode <= 90;
    }
    function getFileUrlVolumeSeparatorEnd(url, start) {
      var ch0 = url.charCodeAt(start);
      if (ch0 === 58)
        return start + 1;
      if (ch0 === 37 && url.charCodeAt(start + 1) === 51) {
        var ch2 = url.charCodeAt(start + 2);
        if (ch2 === 97 || ch2 === 65)
          return start + 3;
      }
      return -1;
    }
    function getEncodedRootLength(path) {
      if (!path)
        return 0;
      var ch0 = path.charCodeAt(0);
      if (ch0 === 47 || ch0 === 92) {
        if (path.charCodeAt(1) !== ch0)
          return 1;
        var p1 = path.indexOf(ch0 === 47 ? ts2.directorySeparator : ts2.altDirectorySeparator, 2);
        if (p1 < 0)
          return path.length;
        return p1 + 1;
      }
      if (isVolumeCharacter(ch0) && path.charCodeAt(1) === 58) {
        var ch2 = path.charCodeAt(2);
        if (ch2 === 47 || ch2 === 92)
          return 3;
        if (path.length === 2)
          return 2;
      }
      var schemeEnd = path.indexOf(urlSchemeSeparator);
      if (schemeEnd !== -1) {
        var authorityStart = schemeEnd + urlSchemeSeparator.length;
        var authorityEnd = path.indexOf(ts2.directorySeparator, authorityStart);
        if (authorityEnd !== -1) {
          var scheme = path.slice(0, schemeEnd);
          var authority = path.slice(authorityStart, authorityEnd);
          if (scheme === "file" && (authority === "" || authority === "localhost") && isVolumeCharacter(path.charCodeAt(authorityEnd + 1))) {
            var volumeSeparatorEnd = getFileUrlVolumeSeparatorEnd(path, authorityEnd + 2);
            if (volumeSeparatorEnd !== -1) {
              if (path.charCodeAt(volumeSeparatorEnd) === 47) {
                return ~(volumeSeparatorEnd + 1);
              }
              if (volumeSeparatorEnd === path.length) {
                return ~volumeSeparatorEnd;
              }
            }
          }
          return ~(authorityEnd + 1);
        }
        return ~path.length;
      }
      return 0;
    }
    function getRootLength(path) {
      var rootLength = getEncodedRootLength(path);
      return rootLength < 0 ? ~rootLength : rootLength;
    }
    ts2.getRootLength = getRootLength;
    function getDirectoryPath(path) {
      path = normalizeSlashes(path);
      var rootLength = getRootLength(path);
      if (rootLength === path.length)
        return path;
      path = removeTrailingDirectorySeparator(path);
      return path.slice(0, Math.max(rootLength, path.lastIndexOf(ts2.directorySeparator)));
    }
    ts2.getDirectoryPath = getDirectoryPath;
    function getBaseFileName(path, extensions, ignoreCase) {
      path = normalizeSlashes(path);
      var rootLength = getRootLength(path);
      if (rootLength === path.length)
        return "";
      path = removeTrailingDirectorySeparator(path);
      var name = path.slice(Math.max(getRootLength(path), path.lastIndexOf(ts2.directorySeparator) + 1));
      var extension = extensions !== void 0 && ignoreCase !== void 0 ? getAnyExtensionFromPath(name, extensions, ignoreCase) : void 0;
      return extension ? name.slice(0, name.length - extension.length) : name;
    }
    ts2.getBaseFileName = getBaseFileName;
    function tryGetExtensionFromPath(path, extension, stringEqualityComparer) {
      if (!ts2.startsWith(extension, "."))
        extension = "." + extension;
      if (path.length >= extension.length && path.charCodeAt(path.length - extension.length) === 46) {
        var pathExtension = path.slice(path.length - extension.length);
        if (stringEqualityComparer(pathExtension, extension)) {
          return pathExtension;
        }
      }
    }
    function getAnyExtensionFromPathWorker(path, extensions, stringEqualityComparer) {
      if (typeof extensions === "string") {
        return tryGetExtensionFromPath(path, extensions, stringEqualityComparer) || "";
      }
      for (var _i = 0, extensions_2 = extensions; _i < extensions_2.length; _i++) {
        var extension = extensions_2[_i];
        var result = tryGetExtensionFromPath(path, extension, stringEqualityComparer);
        if (result)
          return result;
      }
      return "";
    }
    function getAnyExtensionFromPath(path, extensions, ignoreCase) {
      if (extensions) {
        return getAnyExtensionFromPathWorker(removeTrailingDirectorySeparator(path), extensions, ignoreCase ? ts2.equateStringsCaseInsensitive : ts2.equateStringsCaseSensitive);
      }
      var baseFileName = getBaseFileName(path);
      var extensionIndex = baseFileName.lastIndexOf(".");
      if (extensionIndex >= 0) {
        return baseFileName.substring(extensionIndex);
      }
      return "";
    }
    ts2.getAnyExtensionFromPath = getAnyExtensionFromPath;
    function pathComponents(path, rootLength) {
      var root = path.substring(0, rootLength);
      var rest = path.substring(rootLength).split(ts2.directorySeparator);
      if (rest.length && !ts2.lastOrUndefined(rest))
        rest.pop();
      return __spreadArray([root], rest, true);
    }
    function getPathComponents(path, currentDirectory) {
      if (currentDirectory === void 0) {
        currentDirectory = "";
      }
      path = combinePaths(currentDirectory, path);
      return pathComponents(path, getRootLength(path));
    }
    ts2.getPathComponents = getPathComponents;
    function getPathFromPathComponents(pathComponents2) {
      if (pathComponents2.length === 0)
        return "";
      var root = pathComponents2[0] && ensureTrailingDirectorySeparator(pathComponents2[0]);
      return root + pathComponents2.slice(1).join(ts2.directorySeparator);
    }
    ts2.getPathFromPathComponents = getPathFromPathComponents;
    function normalizeSlashes(path) {
      var index = path.indexOf("\\");
      if (index === -1) {
        return path;
      }
      backslashRegExp.lastIndex = index;
      return path.replace(backslashRegExp, ts2.directorySeparator);
    }
    ts2.normalizeSlashes = normalizeSlashes;
    function reducePathComponents(components) {
      if (!ts2.some(components))
        return [];
      var reduced = [components[0]];
      for (var i = 1; i < components.length; i++) {
        var component = components[i];
        if (!component)
          continue;
        if (component === ".")
          continue;
        if (component === "..") {
          if (reduced.length > 1) {
            if (reduced[reduced.length - 1] !== "..") {
              reduced.pop();
              continue;
            }
          } else if (reduced[0])
            continue;
        }
        reduced.push(component);
      }
      return reduced;
    }
    ts2.reducePathComponents = reducePathComponents;
    function combinePaths(path) {
      var paths = [];
      for (var _i = 1; _i < arguments.length; _i++) {
        paths[_i - 1] = arguments[_i];
      }
      if (path)
        path = normalizeSlashes(path);
      for (var _a = 0, paths_1 = paths; _a < paths_1.length; _a++) {
        var relativePath = paths_1[_a];
        if (!relativePath)
          continue;
        relativePath = normalizeSlashes(relativePath);
        if (!path || getRootLength(relativePath) !== 0) {
          path = relativePath;
        } else {
          path = ensureTrailingDirectorySeparator(path) + relativePath;
        }
      }
      return path;
    }
    ts2.combinePaths = combinePaths;
    function resolvePath(path) {
      var paths = [];
      for (var _i = 1; _i < arguments.length; _i++) {
        paths[_i - 1] = arguments[_i];
      }
      return normalizePath(ts2.some(paths) ? combinePaths.apply(void 0, __spreadArray([path], paths, false)) : normalizeSlashes(path));
    }
    ts2.resolvePath = resolvePath;
    function getNormalizedPathComponents(path, currentDirectory) {
      return reducePathComponents(getPathComponents(path, currentDirectory));
    }
    ts2.getNormalizedPathComponents = getNormalizedPathComponents;
    function getNormalizedAbsolutePath(fileName, currentDirectory) {
      return getPathFromPathComponents(getNormalizedPathComponents(fileName, currentDirectory));
    }
    ts2.getNormalizedAbsolutePath = getNormalizedAbsolutePath;
    function normalizePath(path) {
      path = normalizeSlashes(path);
      if (!relativePathSegmentRegExp.test(path)) {
        return path;
      }
      var simplified = path.replace(/\/\.\//g, "/").replace(/^\.\//, "");
      if (simplified !== path) {
        path = simplified;
        if (!relativePathSegmentRegExp.test(path)) {
          return path;
        }
      }
      var normalized = getPathFromPathComponents(reducePathComponents(getPathComponents(path)));
      return normalized && hasTrailingDirectorySeparator(path) ? ensureTrailingDirectorySeparator(normalized) : normalized;
    }
    ts2.normalizePath = normalizePath;
    function getPathWithoutRoot(pathComponents2) {
      if (pathComponents2.length === 0)
        return "";
      return pathComponents2.slice(1).join(ts2.directorySeparator);
    }
    function getNormalizedAbsolutePathWithoutRoot(fileName, currentDirectory) {
      return getPathWithoutRoot(getNormalizedPathComponents(fileName, currentDirectory));
    }
    ts2.getNormalizedAbsolutePathWithoutRoot = getNormalizedAbsolutePathWithoutRoot;
    function toPath(fileName, basePath, getCanonicalFileName) {
      var nonCanonicalizedPath = isRootedDiskPath(fileName) ? normalizePath(fileName) : getNormalizedAbsolutePath(fileName, basePath);
      return getCanonicalFileName(nonCanonicalizedPath);
    }
    ts2.toPath = toPath;
    function normalizePathAndParts(path) {
      path = normalizeSlashes(path);
      var _a = reducePathComponents(getPathComponents(path)), root = _a[0], parts = _a.slice(1);
      if (parts.length) {
        var joinedParts = root + parts.join(ts2.directorySeparator);
        return { path: hasTrailingDirectorySeparator(path) ? ensureTrailingDirectorySeparator(joinedParts) : joinedParts, parts };
      } else {
        return { path: root, parts };
      }
    }
    ts2.normalizePathAndParts = normalizePathAndParts;
    function removeTrailingDirectorySeparator(path) {
      if (hasTrailingDirectorySeparator(path)) {
        return path.substr(0, path.length - 1);
      }
      return path;
    }
    ts2.removeTrailingDirectorySeparator = removeTrailingDirectorySeparator;
    function ensureTrailingDirectorySeparator(path) {
      if (!hasTrailingDirectorySeparator(path)) {
        return path + ts2.directorySeparator;
      }
      return path;
    }
    ts2.ensureTrailingDirectorySeparator = ensureTrailingDirectorySeparator;
    function ensurePathIsNonModuleName(path) {
      return !pathIsAbsolute(path) && !pathIsRelative(path) ? "./" + path : path;
    }
    ts2.ensurePathIsNonModuleName = ensurePathIsNonModuleName;
    function changeAnyExtension(path, ext, extensions, ignoreCase) {
      var pathext = extensions !== void 0 && ignoreCase !== void 0 ? getAnyExtensionFromPath(path, extensions, ignoreCase) : getAnyExtensionFromPath(path);
      return pathext ? path.slice(0, path.length - pathext.length) + (ts2.startsWith(ext, ".") ? ext : "." + ext) : path;
    }
    ts2.changeAnyExtension = changeAnyExtension;
    var relativePathSegmentRegExp = /(?:\/\/)|(?:^|\/)\.\.?(?:$|\/)/;
    function comparePathsWorker(a, b, componentComparer) {
      if (a === b)
        return 0;
      if (a === void 0)
        return -1;
      if (b === void 0)
        return 1;
      var aRoot = a.substring(0, getRootLength(a));
      var bRoot = b.substring(0, getRootLength(b));
      var result = ts2.compareStringsCaseInsensitive(aRoot, bRoot);
      if (result !== 0) {
        return result;
      }
      var aRest = a.substring(aRoot.length);
      var bRest = b.substring(bRoot.length);
      if (!relativePathSegmentRegExp.test(aRest) && !relativePathSegmentRegExp.test(bRest)) {
        return componentComparer(aRest, bRest);
      }
      var aComponents = reducePathComponents(getPathComponents(a));
      var bComponents = reducePathComponents(getPathComponents(b));
      var sharedLength = Math.min(aComponents.length, bComponents.length);
      for (var i = 1; i < sharedLength; i++) {
        var result_2 = componentComparer(aComponents[i], bComponents[i]);
        if (result_2 !== 0) {
          return result_2;
        }
      }
      return ts2.compareValues(aComponents.length, bComponents.length);
    }
    function comparePathsCaseSensitive(a, b) {
      return comparePathsWorker(a, b, ts2.compareStringsCaseSensitive);
    }
    ts2.comparePathsCaseSensitive = comparePathsCaseSensitive;
    function comparePathsCaseInsensitive(a, b) {
      return comparePathsWorker(a, b, ts2.compareStringsCaseInsensitive);
    }
    ts2.comparePathsCaseInsensitive = comparePathsCaseInsensitive;
    function comparePaths(a, b, currentDirectory, ignoreCase) {
      if (typeof currentDirectory === "string") {
        a = combinePaths(currentDirectory, a);
        b = combinePaths(currentDirectory, b);
      } else if (typeof currentDirectory === "boolean") {
        ignoreCase = currentDirectory;
      }
      return comparePathsWorker(a, b, ts2.getStringComparer(ignoreCase));
    }
    ts2.comparePaths = comparePaths;
    function containsPath(parent, child, currentDirectory, ignoreCase) {
      if (typeof currentDirectory === "string") {
        parent = combinePaths(currentDirectory, parent);
        child = combinePaths(currentDirectory, child);
      } else if (typeof currentDirectory === "boolean") {
        ignoreCase = currentDirectory;
      }
      if (parent === void 0 || child === void 0)
        return false;
      if (parent === child)
        return true;
      var parentComponents = reducePathComponents(getPathComponents(parent));
      var childComponents = reducePathComponents(getPathComponents(child));
      if (childComponents.length < parentComponents.length) {
        return false;
      }
      var componentEqualityComparer = ignoreCase ? ts2.equateStringsCaseInsensitive : ts2.equateStringsCaseSensitive;
      for (var i = 0; i < parentComponents.length; i++) {
        var equalityComparer = i === 0 ? ts2.equateStringsCaseInsensitive : componentEqualityComparer;
        if (!equalityComparer(parentComponents[i], childComponents[i])) {
          return false;
        }
      }
      return true;
    }
    ts2.containsPath = containsPath;
    function startsWithDirectory(fileName, directoryName, getCanonicalFileName) {
      var canonicalFileName = getCanonicalFileName(fileName);
      var canonicalDirectoryName = getCanonicalFileName(directoryName);
      return ts2.startsWith(canonicalFileName, canonicalDirectoryName + "/") || ts2.startsWith(canonicalFileName, canonicalDirectoryName + "\\");
    }
    ts2.startsWithDirectory = startsWithDirectory;
    function getPathComponentsRelativeTo(from, to, stringEqualityComparer, getCanonicalFileName) {
      var fromComponents = reducePathComponents(getPathComponents(from));
      var toComponents = reducePathComponents(getPathComponents(to));
      var start;
      for (start = 0; start < fromComponents.length && start < toComponents.length; start++) {
        var fromComponent = getCanonicalFileName(fromComponents[start]);
        var toComponent = getCanonicalFileName(toComponents[start]);
        var comparer = start === 0 ? ts2.equateStringsCaseInsensitive : stringEqualityComparer;
        if (!comparer(fromComponent, toComponent))
          break;
      }
      if (start === 0) {
        return toComponents;
      }
      var components = toComponents.slice(start);
      var relative = [];
      for (; start < fromComponents.length; start++) {
        relative.push("..");
      }
      return __spreadArray(__spreadArray([""], relative, true), components, true);
    }
    ts2.getPathComponentsRelativeTo = getPathComponentsRelativeTo;
    function getRelativePathFromDirectory(fromDirectory, to, getCanonicalFileNameOrIgnoreCase) {
      ts2.Debug.assert(getRootLength(fromDirectory) > 0 === getRootLength(to) > 0, "Paths must either both be absolute or both be relative");
      var getCanonicalFileName = typeof getCanonicalFileNameOrIgnoreCase === "function" ? getCanonicalFileNameOrIgnoreCase : ts2.identity;
      var ignoreCase = typeof getCanonicalFileNameOrIgnoreCase === "boolean" ? getCanonicalFileNameOrIgnoreCase : false;
      var pathComponents2 = getPathComponentsRelativeTo(fromDirectory, to, ignoreCase ? ts2.equateStringsCaseInsensitive : ts2.equateStringsCaseSensitive, getCanonicalFileName);
      return getPathFromPathComponents(pathComponents2);
    }
    ts2.getRelativePathFromDirectory = getRelativePathFromDirectory;
    function convertToRelativePath(absoluteOrRelativePath, basePath, getCanonicalFileName) {
      return !isRootedDiskPath(absoluteOrRelativePath) ? absoluteOrRelativePath : getRelativePathToDirectoryOrUrl(basePath, absoluteOrRelativePath, basePath, getCanonicalFileName, false);
    }
    ts2.convertToRelativePath = convertToRelativePath;
    function getRelativePathFromFile(from, to, getCanonicalFileName) {
      return ensurePathIsNonModuleName(getRelativePathFromDirectory(getDirectoryPath(from), to, getCanonicalFileName));
    }
    ts2.getRelativePathFromFile = getRelativePathFromFile;
    function getRelativePathToDirectoryOrUrl(directoryPathOrUrl, relativeOrAbsolutePath, currentDirectory, getCanonicalFileName, isAbsolutePathAnUrl) {
      var pathComponents2 = getPathComponentsRelativeTo(resolvePath(currentDirectory, directoryPathOrUrl), resolvePath(currentDirectory, relativeOrAbsolutePath), ts2.equateStringsCaseSensitive, getCanonicalFileName);
      var firstComponent = pathComponents2[0];
      if (isAbsolutePathAnUrl && isRootedDiskPath(firstComponent)) {
        var prefix = firstComponent.charAt(0) === ts2.directorySeparator ? "file://" : "file:///";
        pathComponents2[0] = prefix + firstComponent;
      }
      return getPathFromPathComponents(pathComponents2);
    }
    ts2.getRelativePathToDirectoryOrUrl = getRelativePathToDirectoryOrUrl;
    function forEachAncestorDirectory(directory, callback) {
      while (true) {
        var result = callback(directory);
        if (result !== void 0) {
          return result;
        }
        var parentPath = getDirectoryPath(directory);
        if (parentPath === directory) {
          return void 0;
        }
        directory = parentPath;
      }
    }
    ts2.forEachAncestorDirectory = forEachAncestorDirectory;
    function isNodeModulesDirectory(dirPath) {
      return ts2.endsWith(dirPath, "/node_modules");
    }
    ts2.isNodeModulesDirectory = isNodeModulesDirectory;
  })(ts || (ts = {}));
  (function(ts2) {
    function generateDjb2Hash(data) {
      var acc = 5381;
      for (var i = 0; i < data.length; i++) {
        acc = (acc << 5) + acc + data.charCodeAt(i);
      }
      return acc.toString();
    }
    ts2.generateDjb2Hash = generateDjb2Hash;
    function setStackTraceLimit() {
      if (Error.stackTraceLimit < 100) {
        Error.stackTraceLimit = 100;
      }
    }
    ts2.setStackTraceLimit = setStackTraceLimit;
    var FileWatcherEventKind;
    (function(FileWatcherEventKind2) {
      FileWatcherEventKind2[FileWatcherEventKind2["Created"] = 0] = "Created";
      FileWatcherEventKind2[FileWatcherEventKind2["Changed"] = 1] = "Changed";
      FileWatcherEventKind2[FileWatcherEventKind2["Deleted"] = 2] = "Deleted";
    })(FileWatcherEventKind = ts2.FileWatcherEventKind || (ts2.FileWatcherEventKind = {}));
    var PollingInterval;
    (function(PollingInterval2) {
      PollingInterval2[PollingInterval2["High"] = 2e3] = "High";
      PollingInterval2[PollingInterval2["Medium"] = 500] = "Medium";
      PollingInterval2[PollingInterval2["Low"] = 250] = "Low";
    })(PollingInterval = ts2.PollingInterval || (ts2.PollingInterval = {}));
    ts2.missingFileModifiedTime = new Date(0);
    function getModifiedTime(host, fileName) {
      return host.getModifiedTime(fileName) || ts2.missingFileModifiedTime;
    }
    ts2.getModifiedTime = getModifiedTime;
    function createPollingIntervalBasedLevels(levels) {
      var _a;
      return _a = {}, _a[PollingInterval.Low] = levels.Low, _a[PollingInterval.Medium] = levels.Medium, _a[PollingInterval.High] = levels.High, _a;
    }
    var defaultChunkLevels = { Low: 32, Medium: 64, High: 256 };
    var pollingChunkSize = createPollingIntervalBasedLevels(defaultChunkLevels);
    ts2.unchangedPollThresholds = createPollingIntervalBasedLevels(defaultChunkLevels);
    function setCustomPollingValues(system) {
      if (!system.getEnvironmentVariable) {
        return;
      }
      var pollingIntervalChanged = setCustomLevels("TSC_WATCH_POLLINGINTERVAL", PollingInterval);
      pollingChunkSize = getCustomPollingBasedLevels("TSC_WATCH_POLLINGCHUNKSIZE", defaultChunkLevels) || pollingChunkSize;
      ts2.unchangedPollThresholds = getCustomPollingBasedLevels("TSC_WATCH_UNCHANGEDPOLLTHRESHOLDS", defaultChunkLevels) || ts2.unchangedPollThresholds;
      function getLevel(envVar, level) {
        return system.getEnvironmentVariable("".concat(envVar, "_").concat(level.toUpperCase()));
      }
      function getCustomLevels(baseVariable) {
        var customLevels;
        setCustomLevel("Low");
        setCustomLevel("Medium");
        setCustomLevel("High");
        return customLevels;
        function setCustomLevel(level) {
          var customLevel = getLevel(baseVariable, level);
          if (customLevel) {
            (customLevels || (customLevels = {}))[level] = Number(customLevel);
          }
        }
      }
      function setCustomLevels(baseVariable, levels) {
        var customLevels = getCustomLevels(baseVariable);
        if (customLevels) {
          setLevel("Low");
          setLevel("Medium");
          setLevel("High");
          return true;
        }
        return false;
        function setLevel(level) {
          levels[level] = customLevels[level] || levels[level];
        }
      }
      function getCustomPollingBasedLevels(baseVariable, defaultLevels) {
        var customLevels = getCustomLevels(baseVariable);
        return (pollingIntervalChanged || customLevels) && createPollingIntervalBasedLevels(customLevels ? __assign(__assign({}, defaultLevels), customLevels) : defaultLevels);
      }
    }
    ts2.setCustomPollingValues = setCustomPollingValues;
    function pollWatchedFileQueue(host, queue, pollIndex, chunkSize, callbackOnWatchFileStat) {
      var definedValueCopyToIndex = pollIndex;
      for (var canVisit = queue.length; chunkSize && canVisit; nextPollIndex(), canVisit--) {
        var watchedFile = queue[pollIndex];
        if (!watchedFile) {
          continue;
        } else if (watchedFile.isClosed) {
          queue[pollIndex] = void 0;
          continue;
        }
        chunkSize--;
        var fileChanged = onWatchedFileStat(watchedFile, getModifiedTime(host, watchedFile.fileName));
        if (watchedFile.isClosed) {
          queue[pollIndex] = void 0;
          continue;
        }
        callbackOnWatchFileStat === null || callbackOnWatchFileStat === void 0 ? void 0 : callbackOnWatchFileStat(watchedFile, pollIndex, fileChanged);
        if (queue[pollIndex]) {
          if (definedValueCopyToIndex < pollIndex) {
            queue[definedValueCopyToIndex] = watchedFile;
            queue[pollIndex] = void 0;
          }
          definedValueCopyToIndex++;
        }
      }
      return pollIndex;
      function nextPollIndex() {
        pollIndex++;
        if (pollIndex === queue.length) {
          if (definedValueCopyToIndex < pollIndex) {
            queue.length = definedValueCopyToIndex;
          }
          pollIndex = 0;
          definedValueCopyToIndex = 0;
        }
      }
    }
    function createDynamicPriorityPollingWatchFile(host) {
      var watchedFiles = [];
      var changedFilesInLastPoll = [];
      var lowPollingIntervalQueue = createPollingIntervalQueue(PollingInterval.Low);
      var mediumPollingIntervalQueue = createPollingIntervalQueue(PollingInterval.Medium);
      var highPollingIntervalQueue = createPollingIntervalQueue(PollingInterval.High);
      return watchFile;
      function watchFile(fileName, callback, defaultPollingInterval) {
        var file = {
          fileName,
          callback,
          unchangedPolls: 0,
          mtime: getModifiedTime(host, fileName)
        };
        watchedFiles.push(file);
        addToPollingIntervalQueue(file, defaultPollingInterval);
        return {
          close: function() {
            file.isClosed = true;
            ts2.unorderedRemoveItem(watchedFiles, file);
          }
        };
      }
      function createPollingIntervalQueue(pollingInterval) {
        var queue = [];
        queue.pollingInterval = pollingInterval;
        queue.pollIndex = 0;
        queue.pollScheduled = false;
        return queue;
      }
      function pollPollingIntervalQueue(queue) {
        queue.pollIndex = pollQueue(queue, queue.pollingInterval, queue.pollIndex, pollingChunkSize[queue.pollingInterval]);
        if (queue.length) {
          scheduleNextPoll(queue.pollingInterval);
        } else {
          ts2.Debug.assert(queue.pollIndex === 0);
          queue.pollScheduled = false;
        }
      }
      function pollLowPollingIntervalQueue(queue) {
        pollQueue(changedFilesInLastPoll, PollingInterval.Low, 0, changedFilesInLastPoll.length);
        pollPollingIntervalQueue(queue);
        if (!queue.pollScheduled && changedFilesInLastPoll.length) {
          scheduleNextPoll(PollingInterval.Low);
        }
      }
      function pollQueue(queue, pollingInterval, pollIndex, chunkSize) {
        return pollWatchedFileQueue(host, queue, pollIndex, chunkSize, onWatchFileStat);
        function onWatchFileStat(watchedFile, pollIndex2, fileChanged) {
          if (fileChanged) {
            watchedFile.unchangedPolls = 0;
            if (queue !== changedFilesInLastPoll) {
              queue[pollIndex2] = void 0;
              addChangedFileToLowPollingIntervalQueue(watchedFile);
            }
          } else if (watchedFile.unchangedPolls !== ts2.unchangedPollThresholds[pollingInterval]) {
            watchedFile.unchangedPolls++;
          } else if (queue === changedFilesInLastPoll) {
            watchedFile.unchangedPolls = 1;
            queue[pollIndex2] = void 0;
            addToPollingIntervalQueue(watchedFile, PollingInterval.Low);
          } else if (pollingInterval !== PollingInterval.High) {
            watchedFile.unchangedPolls++;
            queue[pollIndex2] = void 0;
            addToPollingIntervalQueue(watchedFile, pollingInterval === PollingInterval.Low ? PollingInterval.Medium : PollingInterval.High);
          }
        }
      }
      function pollingIntervalQueue(pollingInterval) {
        switch (pollingInterval) {
          case PollingInterval.Low:
            return lowPollingIntervalQueue;
          case PollingInterval.Medium:
            return mediumPollingIntervalQueue;
          case PollingInterval.High:
            return highPollingIntervalQueue;
        }
      }
      function addToPollingIntervalQueue(file, pollingInterval) {
        pollingIntervalQueue(pollingInterval).push(file);
        scheduleNextPollIfNotAlreadyScheduled(pollingInterval);
      }
      function addChangedFileToLowPollingIntervalQueue(file) {
        changedFilesInLastPoll.push(file);
        scheduleNextPollIfNotAlreadyScheduled(PollingInterval.Low);
      }
      function scheduleNextPollIfNotAlreadyScheduled(pollingInterval) {
        if (!pollingIntervalQueue(pollingInterval).pollScheduled) {
          scheduleNextPoll(pollingInterval);
        }
      }
      function scheduleNextPoll(pollingInterval) {
        pollingIntervalQueue(pollingInterval).pollScheduled = host.setTimeout(pollingInterval === PollingInterval.Low ? pollLowPollingIntervalQueue : pollPollingIntervalQueue, pollingInterval, pollingIntervalQueue(pollingInterval));
      }
    }
    ts2.createDynamicPriorityPollingWatchFile = createDynamicPriorityPollingWatchFile;
    function createUseFsEventsOnParentDirectoryWatchFile(fsWatch, useCaseSensitiveFileNames) {
      var fileWatcherCallbacks = ts2.createMultiMap();
      var dirWatchers = new ts2.Map();
      var toCanonicalName = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      return nonPollingWatchFile;
      function nonPollingWatchFile(fileName, callback, _pollingInterval, fallbackOptions) {
        var filePath = toCanonicalName(fileName);
        fileWatcherCallbacks.add(filePath, callback);
        var dirPath = ts2.getDirectoryPath(filePath) || ".";
        var watcher = dirWatchers.get(dirPath) || createDirectoryWatcher(ts2.getDirectoryPath(fileName) || ".", dirPath, fallbackOptions);
        watcher.referenceCount++;
        return {
          close: function() {
            if (watcher.referenceCount === 1) {
              watcher.close();
              dirWatchers.delete(dirPath);
            } else {
              watcher.referenceCount--;
            }
            fileWatcherCallbacks.remove(filePath, callback);
          }
        };
      }
      function createDirectoryWatcher(dirName, dirPath, fallbackOptions) {
        var watcher = fsWatch(dirName, 1, function(_eventName, relativeFileName) {
          if (!ts2.isString(relativeFileName))
            return;
          var fileName = ts2.getNormalizedAbsolutePath(relativeFileName, dirName);
          var callbacks = fileName && fileWatcherCallbacks.get(toCanonicalName(fileName));
          if (callbacks) {
            for (var _i = 0, callbacks_1 = callbacks; _i < callbacks_1.length; _i++) {
              var fileCallback = callbacks_1[_i];
              fileCallback(fileName, FileWatcherEventKind.Changed);
            }
          }
        }, false, PollingInterval.Medium, fallbackOptions);
        watcher.referenceCount = 0;
        dirWatchers.set(dirPath, watcher);
        return watcher;
      }
    }
    function createFixedChunkSizePollingWatchFile(host) {
      var watchedFiles = [];
      var pollIndex = 0;
      var pollScheduled;
      return watchFile;
      function watchFile(fileName, callback) {
        var file = {
          fileName,
          callback,
          mtime: getModifiedTime(host, fileName)
        };
        watchedFiles.push(file);
        scheduleNextPoll();
        return {
          close: function() {
            file.isClosed = true;
            ts2.unorderedRemoveItem(watchedFiles, file);
          }
        };
      }
      function pollQueue() {
        pollScheduled = void 0;
        pollIndex = pollWatchedFileQueue(host, watchedFiles, pollIndex, pollingChunkSize[PollingInterval.Low]);
        scheduleNextPoll();
      }
      function scheduleNextPoll() {
        if (!watchedFiles.length || pollScheduled)
          return;
        pollScheduled = host.setTimeout(pollQueue, PollingInterval.High);
      }
    }
    function createSingleFileWatcherPerName(watchFile, useCaseSensitiveFileNames) {
      var cache = new ts2.Map();
      var callbacksCache = ts2.createMultiMap();
      var toCanonicalFileName = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      return function(fileName, callback, pollingInterval, options) {
        var path = toCanonicalFileName(fileName);
        var existing = cache.get(path);
        if (existing) {
          existing.refCount++;
        } else {
          cache.set(path, {
            watcher: watchFile(fileName, function(fileName2, eventKind) {
              return ts2.forEach(callbacksCache.get(path), function(cb) {
                return cb(fileName2, eventKind);
              });
            }, pollingInterval, options),
            refCount: 1
          });
        }
        callbacksCache.add(path, callback);
        return {
          close: function() {
            var watcher = ts2.Debug.checkDefined(cache.get(path));
            callbacksCache.remove(path, callback);
            watcher.refCount--;
            if (watcher.refCount)
              return;
            cache.delete(path);
            ts2.closeFileWatcherOf(watcher);
          }
        };
      };
    }
    ts2.createSingleFileWatcherPerName = createSingleFileWatcherPerName;
    function onWatchedFileStat(watchedFile, modifiedTime) {
      var oldTime = watchedFile.mtime.getTime();
      var newTime = modifiedTime.getTime();
      if (oldTime !== newTime) {
        watchedFile.mtime = modifiedTime;
        watchedFile.callback(watchedFile.fileName, getFileWatcherEventKind(oldTime, newTime));
        return true;
      }
      return false;
    }
    ts2.onWatchedFileStat = onWatchedFileStat;
    function getFileWatcherEventKind(oldTime, newTime) {
      return oldTime === 0 ? FileWatcherEventKind.Created : newTime === 0 ? FileWatcherEventKind.Deleted : FileWatcherEventKind.Changed;
    }
    ts2.getFileWatcherEventKind = getFileWatcherEventKind;
    ts2.ignoredPaths = ["/node_modules/.", "/.git", "/.#"];
    ts2.sysLog = ts2.noop;
    function setSysLog(logger) {
      ts2.sysLog = logger;
    }
    ts2.setSysLog = setSysLog;
    function createDirectoryWatcherSupportingRecursive(_a) {
      var watchDirectory = _a.watchDirectory, useCaseSensitiveFileNames = _a.useCaseSensitiveFileNames, getCurrentDirectory = _a.getCurrentDirectory, getAccessibleSortedChildDirectories = _a.getAccessibleSortedChildDirectories, directoryExists = _a.directoryExists, realpath = _a.realpath, setTimeout = _a.setTimeout, clearTimeout = _a.clearTimeout;
      var cache = new ts2.Map();
      var callbackCache = ts2.createMultiMap();
      var cacheToUpdateChildWatches = new ts2.Map();
      var timerToUpdateChildWatches;
      var filePathComparer = ts2.getStringComparer(!useCaseSensitiveFileNames);
      var toCanonicalFilePath = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      return function(dirName, callback, recursive, options) {
        return recursive ? createDirectoryWatcher(dirName, options, callback) : watchDirectory(dirName, callback, recursive, options);
      };
      function createDirectoryWatcher(dirName, options, callback) {
        var dirPath = toCanonicalFilePath(dirName);
        var directoryWatcher = cache.get(dirPath);
        if (directoryWatcher) {
          directoryWatcher.refCount++;
        } else {
          directoryWatcher = {
            watcher: watchDirectory(dirName, function(fileName) {
              if (isIgnoredPath(fileName, options))
                return;
              if (options === null || options === void 0 ? void 0 : options.synchronousWatchDirectory) {
                invokeCallbacks(dirPath, fileName);
                updateChildWatches(dirName, dirPath, options);
              } else {
                nonSyncUpdateChildWatches(dirName, dirPath, fileName, options);
              }
            }, false, options),
            refCount: 1,
            childWatches: ts2.emptyArray
          };
          cache.set(dirPath, directoryWatcher);
          updateChildWatches(dirName, dirPath, options);
        }
        var callbackToAdd = callback && { dirName, callback };
        if (callbackToAdd) {
          callbackCache.add(dirPath, callbackToAdd);
        }
        return {
          dirName,
          close: function() {
            var directoryWatcher2 = ts2.Debug.checkDefined(cache.get(dirPath));
            if (callbackToAdd)
              callbackCache.remove(dirPath, callbackToAdd);
            directoryWatcher2.refCount--;
            if (directoryWatcher2.refCount)
              return;
            cache.delete(dirPath);
            ts2.closeFileWatcherOf(directoryWatcher2);
            directoryWatcher2.childWatches.forEach(ts2.closeFileWatcher);
          }
        };
      }
      function invokeCallbacks(dirPath, fileNameOrInvokeMap, fileNames) {
        var fileName;
        var invokeMap;
        if (ts2.isString(fileNameOrInvokeMap)) {
          fileName = fileNameOrInvokeMap;
        } else {
          invokeMap = fileNameOrInvokeMap;
        }
        callbackCache.forEach(function(callbacks, rootDirName) {
          var _a2;
          if (invokeMap && invokeMap.get(rootDirName) === true)
            return;
          if (rootDirName === dirPath || ts2.startsWith(dirPath, rootDirName) && dirPath[rootDirName.length] === ts2.directorySeparator) {
            if (invokeMap) {
              if (fileNames) {
                var existing = invokeMap.get(rootDirName);
                if (existing) {
                  (_a2 = existing).push.apply(_a2, fileNames);
                } else {
                  invokeMap.set(rootDirName, fileNames.slice());
                }
              } else {
                invokeMap.set(rootDirName, true);
              }
            } else {
              callbacks.forEach(function(_a3) {
                var callback = _a3.callback;
                return callback(fileName);
              });
            }
          }
        });
      }
      function nonSyncUpdateChildWatches(dirName, dirPath, fileName, options) {
        var parentWatcher = cache.get(dirPath);
        if (parentWatcher && directoryExists(dirName)) {
          scheduleUpdateChildWatches(dirName, dirPath, fileName, options);
          return;
        }
        invokeCallbacks(dirPath, fileName);
        removeChildWatches(parentWatcher);
      }
      function scheduleUpdateChildWatches(dirName, dirPath, fileName, options) {
        var existing = cacheToUpdateChildWatches.get(dirPath);
        if (existing) {
          existing.fileNames.push(fileName);
        } else {
          cacheToUpdateChildWatches.set(dirPath, { dirName, options, fileNames: [fileName] });
        }
        if (timerToUpdateChildWatches) {
          clearTimeout(timerToUpdateChildWatches);
          timerToUpdateChildWatches = void 0;
        }
        timerToUpdateChildWatches = setTimeout(onTimerToUpdateChildWatches, 1e3);
      }
      function onTimerToUpdateChildWatches() {
        timerToUpdateChildWatches = void 0;
        ts2.sysLog("sysLog:: onTimerToUpdateChildWatches:: ".concat(cacheToUpdateChildWatches.size));
        var start = ts2.timestamp();
        var invokeMap = new ts2.Map();
        while (!timerToUpdateChildWatches && cacheToUpdateChildWatches.size) {
          var result = cacheToUpdateChildWatches.entries().next();
          ts2.Debug.assert(!result.done);
          var _a2 = result.value, dirPath = _a2[0], _b = _a2[1], dirName = _b.dirName, options = _b.options, fileNames = _b.fileNames;
          cacheToUpdateChildWatches.delete(dirPath);
          var hasChanges = updateChildWatches(dirName, dirPath, options);
          invokeCallbacks(dirPath, invokeMap, hasChanges ? void 0 : fileNames);
        }
        ts2.sysLog("sysLog:: invokingWatchers:: Elapsed:: ".concat(ts2.timestamp() - start, "ms:: ").concat(cacheToUpdateChildWatches.size));
        callbackCache.forEach(function(callbacks, rootDirName) {
          var existing = invokeMap.get(rootDirName);
          if (existing) {
            callbacks.forEach(function(_a3) {
              var callback = _a3.callback, dirName2 = _a3.dirName;
              if (ts2.isArray(existing)) {
                existing.forEach(callback);
              } else {
                callback(dirName2);
              }
            });
          }
        });
        var elapsed = ts2.timestamp() - start;
        ts2.sysLog("sysLog:: Elapsed:: ".concat(elapsed, "ms:: onTimerToUpdateChildWatches:: ").concat(cacheToUpdateChildWatches.size, " ").concat(timerToUpdateChildWatches));
      }
      function removeChildWatches(parentWatcher) {
        if (!parentWatcher)
          return;
        var existingChildWatches = parentWatcher.childWatches;
        parentWatcher.childWatches = ts2.emptyArray;
        for (var _i = 0, existingChildWatches_1 = existingChildWatches; _i < existingChildWatches_1.length; _i++) {
          var childWatcher = existingChildWatches_1[_i];
          childWatcher.close();
          removeChildWatches(cache.get(toCanonicalFilePath(childWatcher.dirName)));
        }
      }
      function updateChildWatches(parentDir, parentDirPath, options) {
        var parentWatcher = cache.get(parentDirPath);
        if (!parentWatcher)
          return false;
        var newChildWatches;
        var hasChanges = ts2.enumerateInsertsAndDeletes(directoryExists(parentDir) ? ts2.mapDefined(getAccessibleSortedChildDirectories(parentDir), function(child) {
          var childFullName = ts2.getNormalizedAbsolutePath(child, parentDir);
          return !isIgnoredPath(childFullName, options) && filePathComparer(childFullName, ts2.normalizePath(realpath(childFullName))) === 0 ? childFullName : void 0;
        }) : ts2.emptyArray, parentWatcher.childWatches, function(child, childWatcher) {
          return filePathComparer(child, childWatcher.dirName);
        }, createAndAddChildDirectoryWatcher, ts2.closeFileWatcher, addChildDirectoryWatcher);
        parentWatcher.childWatches = newChildWatches || ts2.emptyArray;
        return hasChanges;
        function createAndAddChildDirectoryWatcher(childName) {
          var result = createDirectoryWatcher(childName, options);
          addChildDirectoryWatcher(result);
        }
        function addChildDirectoryWatcher(childWatcher) {
          (newChildWatches || (newChildWatches = [])).push(childWatcher);
        }
      }
      function isIgnoredPath(path, options) {
        return ts2.some(ts2.ignoredPaths, function(searchPath) {
          return isInPath(path, searchPath);
        }) || isIgnoredByWatchOptions(path, options, useCaseSensitiveFileNames, getCurrentDirectory);
      }
      function isInPath(path, searchPath) {
        if (ts2.stringContains(path, searchPath))
          return true;
        if (useCaseSensitiveFileNames)
          return false;
        return ts2.stringContains(toCanonicalFilePath(path), searchPath);
      }
    }
    ts2.createDirectoryWatcherSupportingRecursive = createDirectoryWatcherSupportingRecursive;
    var FileSystemEntryKind;
    (function(FileSystemEntryKind2) {
      FileSystemEntryKind2[FileSystemEntryKind2["File"] = 0] = "File";
      FileSystemEntryKind2[FileSystemEntryKind2["Directory"] = 1] = "Directory";
    })(FileSystemEntryKind = ts2.FileSystemEntryKind || (ts2.FileSystemEntryKind = {}));
    function createFileWatcherCallback(callback) {
      return function(_fileName, eventKind) {
        return callback(eventKind === FileWatcherEventKind.Changed ? "change" : "rename", "");
      };
    }
    ts2.createFileWatcherCallback = createFileWatcherCallback;
    function createFsWatchCallbackForFileWatcherCallback(fileName, callback, fileExists) {
      return function(eventName) {
        if (eventName === "rename") {
          callback(fileName, fileExists(fileName) ? FileWatcherEventKind.Created : FileWatcherEventKind.Deleted);
        } else {
          callback(fileName, FileWatcherEventKind.Changed);
        }
      };
    }
    function isIgnoredByWatchOptions(pathToCheck, options, useCaseSensitiveFileNames, getCurrentDirectory) {
      return ((options === null || options === void 0 ? void 0 : options.excludeDirectories) || (options === null || options === void 0 ? void 0 : options.excludeFiles)) && (ts2.matchesExclude(pathToCheck, options === null || options === void 0 ? void 0 : options.excludeFiles, useCaseSensitiveFileNames, getCurrentDirectory()) || ts2.matchesExclude(pathToCheck, options === null || options === void 0 ? void 0 : options.excludeDirectories, useCaseSensitiveFileNames, getCurrentDirectory()));
    }
    function createFsWatchCallbackForDirectoryWatcherCallback(directoryName, callback, options, useCaseSensitiveFileNames, getCurrentDirectory) {
      return function(eventName, relativeFileName) {
        if (eventName === "rename") {
          var fileName = !relativeFileName ? directoryName : ts2.normalizePath(ts2.combinePaths(directoryName, relativeFileName));
          if (!relativeFileName || !isIgnoredByWatchOptions(fileName, options, useCaseSensitiveFileNames, getCurrentDirectory)) {
            callback(fileName);
          }
        }
      };
    }
    function createSystemWatchFunctions(_a) {
      var pollingWatchFile = _a.pollingWatchFile, getModifiedTime2 = _a.getModifiedTime, setTimeout = _a.setTimeout, clearTimeout = _a.clearTimeout, fsWatch = _a.fsWatch, fileExists = _a.fileExists, useCaseSensitiveFileNames = _a.useCaseSensitiveFileNames, getCurrentDirectory = _a.getCurrentDirectory, fsSupportsRecursiveFsWatch = _a.fsSupportsRecursiveFsWatch, directoryExists = _a.directoryExists, getAccessibleSortedChildDirectories = _a.getAccessibleSortedChildDirectories, realpath = _a.realpath, tscWatchFile = _a.tscWatchFile, useNonPollingWatchers = _a.useNonPollingWatchers, tscWatchDirectory = _a.tscWatchDirectory, defaultWatchFileKind = _a.defaultWatchFileKind;
      var dynamicPollingWatchFile;
      var fixedChunkSizePollingWatchFile;
      var nonPollingWatchFile;
      var hostRecursiveDirectoryWatcher;
      return {
        watchFile,
        watchDirectory
      };
      function watchFile(fileName, callback, pollingInterval, options) {
        options = updateOptionsForWatchFile(options, useNonPollingWatchers);
        var watchFileKind = ts2.Debug.checkDefined(options.watchFile);
        switch (watchFileKind) {
          case ts2.WatchFileKind.FixedPollingInterval:
            return pollingWatchFile(fileName, callback, PollingInterval.Low, void 0);
          case ts2.WatchFileKind.PriorityPollingInterval:
            return pollingWatchFile(fileName, callback, pollingInterval, void 0);
          case ts2.WatchFileKind.DynamicPriorityPolling:
            return ensureDynamicPollingWatchFile()(fileName, callback, pollingInterval, void 0);
          case ts2.WatchFileKind.FixedChunkSizePolling:
            return ensureFixedChunkSizePollingWatchFile()(fileName, callback, void 0, void 0);
          case ts2.WatchFileKind.UseFsEvents:
            return fsWatch(fileName, 0, createFsWatchCallbackForFileWatcherCallback(fileName, callback, fileExists), false, pollingInterval, ts2.getFallbackOptions(options));
          case ts2.WatchFileKind.UseFsEventsOnParentDirectory:
            if (!nonPollingWatchFile) {
              nonPollingWatchFile = createUseFsEventsOnParentDirectoryWatchFile(fsWatch, useCaseSensitiveFileNames);
            }
            return nonPollingWatchFile(fileName, callback, pollingInterval, ts2.getFallbackOptions(options));
          default:
            ts2.Debug.assertNever(watchFileKind);
        }
      }
      function ensureDynamicPollingWatchFile() {
        return dynamicPollingWatchFile || (dynamicPollingWatchFile = createDynamicPriorityPollingWatchFile({ getModifiedTime: getModifiedTime2, setTimeout }));
      }
      function ensureFixedChunkSizePollingWatchFile() {
        return fixedChunkSizePollingWatchFile || (fixedChunkSizePollingWatchFile = createFixedChunkSizePollingWatchFile({ getModifiedTime: getModifiedTime2, setTimeout }));
      }
      function updateOptionsForWatchFile(options, useNonPollingWatchers2) {
        if (options && options.watchFile !== void 0)
          return options;
        switch (tscWatchFile) {
          case "PriorityPollingInterval":
            return { watchFile: ts2.WatchFileKind.PriorityPollingInterval };
          case "DynamicPriorityPolling":
            return { watchFile: ts2.WatchFileKind.DynamicPriorityPolling };
          case "UseFsEvents":
            return generateWatchFileOptions(ts2.WatchFileKind.UseFsEvents, ts2.PollingWatchKind.PriorityInterval, options);
          case "UseFsEventsWithFallbackDynamicPolling":
            return generateWatchFileOptions(ts2.WatchFileKind.UseFsEvents, ts2.PollingWatchKind.DynamicPriority, options);
          case "UseFsEventsOnParentDirectory":
            useNonPollingWatchers2 = true;
          default:
            return useNonPollingWatchers2 ? generateWatchFileOptions(ts2.WatchFileKind.UseFsEventsOnParentDirectory, ts2.PollingWatchKind.PriorityInterval, options) : { watchFile: (defaultWatchFileKind === null || defaultWatchFileKind === void 0 ? void 0 : defaultWatchFileKind()) || ts2.WatchFileKind.FixedPollingInterval };
        }
      }
      function generateWatchFileOptions(watchFile2, fallbackPolling, options) {
        var defaultFallbackPolling = options === null || options === void 0 ? void 0 : options.fallbackPolling;
        return {
          watchFile: watchFile2,
          fallbackPolling: defaultFallbackPolling === void 0 ? fallbackPolling : defaultFallbackPolling
        };
      }
      function watchDirectory(directoryName, callback, recursive, options) {
        if (fsSupportsRecursiveFsWatch) {
          return fsWatch(directoryName, 1, createFsWatchCallbackForDirectoryWatcherCallback(directoryName, callback, options, useCaseSensitiveFileNames, getCurrentDirectory), recursive, PollingInterval.Medium, ts2.getFallbackOptions(options));
        }
        if (!hostRecursiveDirectoryWatcher) {
          hostRecursiveDirectoryWatcher = createDirectoryWatcherSupportingRecursive({
            useCaseSensitiveFileNames,
            getCurrentDirectory,
            directoryExists,
            getAccessibleSortedChildDirectories,
            watchDirectory: nonRecursiveWatchDirectory,
            realpath,
            setTimeout,
            clearTimeout
          });
        }
        return hostRecursiveDirectoryWatcher(directoryName, callback, recursive, options);
      }
      function nonRecursiveWatchDirectory(directoryName, callback, recursive, options) {
        ts2.Debug.assert(!recursive);
        var watchDirectoryOptions = updateOptionsForWatchDirectory(options);
        var watchDirectoryKind = ts2.Debug.checkDefined(watchDirectoryOptions.watchDirectory);
        switch (watchDirectoryKind) {
          case ts2.WatchDirectoryKind.FixedPollingInterval:
            return pollingWatchFile(directoryName, function() {
              return callback(directoryName);
            }, PollingInterval.Medium, void 0);
          case ts2.WatchDirectoryKind.DynamicPriorityPolling:
            return ensureDynamicPollingWatchFile()(directoryName, function() {
              return callback(directoryName);
            }, PollingInterval.Medium, void 0);
          case ts2.WatchDirectoryKind.FixedChunkSizePolling:
            return ensureFixedChunkSizePollingWatchFile()(directoryName, function() {
              return callback(directoryName);
            }, void 0, void 0);
          case ts2.WatchDirectoryKind.UseFsEvents:
            return fsWatch(directoryName, 1, createFsWatchCallbackForDirectoryWatcherCallback(directoryName, callback, options, useCaseSensitiveFileNames, getCurrentDirectory), recursive, PollingInterval.Medium, ts2.getFallbackOptions(watchDirectoryOptions));
          default:
            ts2.Debug.assertNever(watchDirectoryKind);
        }
      }
      function updateOptionsForWatchDirectory(options) {
        if (options && options.watchDirectory !== void 0)
          return options;
        switch (tscWatchDirectory) {
          case "RecursiveDirectoryUsingFsWatchFile":
            return { watchDirectory: ts2.WatchDirectoryKind.FixedPollingInterval };
          case "RecursiveDirectoryUsingDynamicPriorityPolling":
            return { watchDirectory: ts2.WatchDirectoryKind.DynamicPriorityPolling };
          default:
            var defaultFallbackPolling = options === null || options === void 0 ? void 0 : options.fallbackPolling;
            return {
              watchDirectory: ts2.WatchDirectoryKind.UseFsEvents,
              fallbackPolling: defaultFallbackPolling !== void 0 ? defaultFallbackPolling : void 0
            };
        }
      }
    }
    ts2.createSystemWatchFunctions = createSystemWatchFunctions;
    function patchWriteFileEnsuringDirectory(sys) {
      var originalWriteFile = sys.writeFile;
      sys.writeFile = function(path, data, writeBom) {
        return ts2.writeFileEnsuringDirectories(path, data, !!writeBom, function(path2, data2, writeByteOrderMark) {
          return originalWriteFile.call(sys, path2, data2, writeByteOrderMark);
        }, function(path2) {
          return sys.createDirectory(path2);
        }, function(path2) {
          return sys.directoryExists(path2);
        });
      };
    }
    ts2.patchWriteFileEnsuringDirectory = patchWriteFileEnsuringDirectory;
    function getNodeMajorVersion() {
      if (typeof process === "undefined") {
        return void 0;
      }
      var version = process.version;
      if (!version) {
        return void 0;
      }
      var dot = version.indexOf(".");
      if (dot === -1) {
        return void 0;
      }
      return parseInt(version.substring(1, dot));
    }
    ts2.getNodeMajorVersion = getNodeMajorVersion;
    ts2.sys = void 0;
    function setSys(s) {
      ts2.sys = s;
    }
    ts2.setSys = setSys;
    if (ts2.sys && ts2.sys.getEnvironmentVariable) {
      setCustomPollingValues(ts2.sys);
      ts2.Debug.setAssertionLevel(/^development$/i.test(ts2.sys.getEnvironmentVariable("NODE_ENV")) ? 1 : 0);
    }
    if (ts2.sys && ts2.sys.debugMode) {
      ts2.Debug.isDebugging = true;
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function diag(code, category, key, message, reportsUnnecessary, elidedInCompatabilityPyramid, reportsDeprecated) {
      return { code, category, key, message, reportsUnnecessary, elidedInCompatabilityPyramid, reportsDeprecated };
    }
    ts2.Diagnostics = {
      Unterminated_string_literal: diag(1002, ts2.DiagnosticCategory.Error, "Unterminated_string_literal_1002", "Unterminated string literal."),
      Identifier_expected: diag(1003, ts2.DiagnosticCategory.Error, "Identifier_expected_1003", "Identifier expected."),
      _0_expected: diag(1005, ts2.DiagnosticCategory.Error, "_0_expected_1005", "'{0}' expected."),
      A_file_cannot_have_a_reference_to_itself: diag(1006, ts2.DiagnosticCategory.Error, "A_file_cannot_have_a_reference_to_itself_1006", "A file cannot have a reference to itself."),
      The_parser_expected_to_find_a_to_match_the_token_here: diag(1007, ts2.DiagnosticCategory.Error, "The_parser_expected_to_find_a_to_match_the_token_here_1007", "The parser expected to find a '}' to match the '{' token here."),
      Trailing_comma_not_allowed: diag(1009, ts2.DiagnosticCategory.Error, "Trailing_comma_not_allowed_1009", "Trailing comma not allowed."),
      Asterisk_Slash_expected: diag(1010, ts2.DiagnosticCategory.Error, "Asterisk_Slash_expected_1010", "'*/' expected."),
      An_element_access_expression_should_take_an_argument: diag(1011, ts2.DiagnosticCategory.Error, "An_element_access_expression_should_take_an_argument_1011", "An element access expression should take an argument."),
      Unexpected_token: diag(1012, ts2.DiagnosticCategory.Error, "Unexpected_token_1012", "Unexpected token."),
      A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma: diag(1013, ts2.DiagnosticCategory.Error, "A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma_1013", "A rest parameter or binding pattern may not have a trailing comma."),
      A_rest_parameter_must_be_last_in_a_parameter_list: diag(1014, ts2.DiagnosticCategory.Error, "A_rest_parameter_must_be_last_in_a_parameter_list_1014", "A rest parameter must be last in a parameter list."),
      Parameter_cannot_have_question_mark_and_initializer: diag(1015, ts2.DiagnosticCategory.Error, "Parameter_cannot_have_question_mark_and_initializer_1015", "Parameter cannot have question mark and initializer."),
      A_required_parameter_cannot_follow_an_optional_parameter: diag(1016, ts2.DiagnosticCategory.Error, "A_required_parameter_cannot_follow_an_optional_parameter_1016", "A required parameter cannot follow an optional parameter."),
      An_index_signature_cannot_have_a_rest_parameter: diag(1017, ts2.DiagnosticCategory.Error, "An_index_signature_cannot_have_a_rest_parameter_1017", "An index signature cannot have a rest parameter."),
      An_index_signature_parameter_cannot_have_an_accessibility_modifier: diag(1018, ts2.DiagnosticCategory.Error, "An_index_signature_parameter_cannot_have_an_accessibility_modifier_1018", "An index signature parameter cannot have an accessibility modifier."),
      An_index_signature_parameter_cannot_have_a_question_mark: diag(1019, ts2.DiagnosticCategory.Error, "An_index_signature_parameter_cannot_have_a_question_mark_1019", "An index signature parameter cannot have a question mark."),
      An_index_signature_parameter_cannot_have_an_initializer: diag(1020, ts2.DiagnosticCategory.Error, "An_index_signature_parameter_cannot_have_an_initializer_1020", "An index signature parameter cannot have an initializer."),
      An_index_signature_must_have_a_type_annotation: diag(1021, ts2.DiagnosticCategory.Error, "An_index_signature_must_have_a_type_annotation_1021", "An index signature must have a type annotation."),
      An_index_signature_parameter_must_have_a_type_annotation: diag(1022, ts2.DiagnosticCategory.Error, "An_index_signature_parameter_must_have_a_type_annotation_1022", "An index signature parameter must have a type annotation."),
      readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature: diag(1024, ts2.DiagnosticCategory.Error, "readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature_1024", "'readonly' modifier can only appear on a property declaration or index signature."),
      An_index_signature_cannot_have_a_trailing_comma: diag(1025, ts2.DiagnosticCategory.Error, "An_index_signature_cannot_have_a_trailing_comma_1025", "An index signature cannot have a trailing comma."),
      Accessibility_modifier_already_seen: diag(1028, ts2.DiagnosticCategory.Error, "Accessibility_modifier_already_seen_1028", "Accessibility modifier already seen."),
      _0_modifier_must_precede_1_modifier: diag(1029, ts2.DiagnosticCategory.Error, "_0_modifier_must_precede_1_modifier_1029", "'{0}' modifier must precede '{1}' modifier."),
      _0_modifier_already_seen: diag(1030, ts2.DiagnosticCategory.Error, "_0_modifier_already_seen_1030", "'{0}' modifier already seen."),
      _0_modifier_cannot_appear_on_class_elements_of_this_kind: diag(1031, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_appear_on_class_elements_of_this_kind_1031", "'{0}' modifier cannot appear on class elements of this kind."),
      super_must_be_followed_by_an_argument_list_or_member_access: diag(1034, ts2.DiagnosticCategory.Error, "super_must_be_followed_by_an_argument_list_or_member_access_1034", "'super' must be followed by an argument list or member access."),
      Only_ambient_modules_can_use_quoted_names: diag(1035, ts2.DiagnosticCategory.Error, "Only_ambient_modules_can_use_quoted_names_1035", "Only ambient modules can use quoted names."),
      Statements_are_not_allowed_in_ambient_contexts: diag(1036, ts2.DiagnosticCategory.Error, "Statements_are_not_allowed_in_ambient_contexts_1036", "Statements are not allowed in ambient contexts."),
      A_declare_modifier_cannot_be_used_in_an_already_ambient_context: diag(1038, ts2.DiagnosticCategory.Error, "A_declare_modifier_cannot_be_used_in_an_already_ambient_context_1038", "A 'declare' modifier cannot be used in an already ambient context."),
      Initializers_are_not_allowed_in_ambient_contexts: diag(1039, ts2.DiagnosticCategory.Error, "Initializers_are_not_allowed_in_ambient_contexts_1039", "Initializers are not allowed in ambient contexts."),
      _0_modifier_cannot_be_used_in_an_ambient_context: diag(1040, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_be_used_in_an_ambient_context_1040", "'{0}' modifier cannot be used in an ambient context."),
      _0_modifier_cannot_be_used_here: diag(1042, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_be_used_here_1042", "'{0}' modifier cannot be used here."),
      _0_modifier_cannot_appear_on_a_module_or_namespace_element: diag(1044, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_appear_on_a_module_or_namespace_element_1044", "'{0}' modifier cannot appear on a module or namespace element."),
      Top_level_declarations_in_d_ts_files_must_start_with_either_a_declare_or_export_modifier: diag(1046, ts2.DiagnosticCategory.Error, "Top_level_declarations_in_d_ts_files_must_start_with_either_a_declare_or_export_modifier_1046", "Top-level declarations in .d.ts files must start with either a 'declare' or 'export' modifier."),
      A_rest_parameter_cannot_be_optional: diag(1047, ts2.DiagnosticCategory.Error, "A_rest_parameter_cannot_be_optional_1047", "A rest parameter cannot be optional."),
      A_rest_parameter_cannot_have_an_initializer: diag(1048, ts2.DiagnosticCategory.Error, "A_rest_parameter_cannot_have_an_initializer_1048", "A rest parameter cannot have an initializer."),
      A_set_accessor_must_have_exactly_one_parameter: diag(1049, ts2.DiagnosticCategory.Error, "A_set_accessor_must_have_exactly_one_parameter_1049", "A 'set' accessor must have exactly one parameter."),
      A_set_accessor_cannot_have_an_optional_parameter: diag(1051, ts2.DiagnosticCategory.Error, "A_set_accessor_cannot_have_an_optional_parameter_1051", "A 'set' accessor cannot have an optional parameter."),
      A_set_accessor_parameter_cannot_have_an_initializer: diag(1052, ts2.DiagnosticCategory.Error, "A_set_accessor_parameter_cannot_have_an_initializer_1052", "A 'set' accessor parameter cannot have an initializer."),
      A_set_accessor_cannot_have_rest_parameter: diag(1053, ts2.DiagnosticCategory.Error, "A_set_accessor_cannot_have_rest_parameter_1053", "A 'set' accessor cannot have rest parameter."),
      A_get_accessor_cannot_have_parameters: diag(1054, ts2.DiagnosticCategory.Error, "A_get_accessor_cannot_have_parameters_1054", "A 'get' accessor cannot have parameters."),
      Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value: diag(1055, ts2.DiagnosticCategory.Error, "Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Prom_1055", "Type '{0}' is not a valid async function return type in ES5/ES3 because it does not refer to a Promise-compatible constructor value."),
      Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher: diag(1056, ts2.DiagnosticCategory.Error, "Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher_1056", "Accessors are only available when targeting ECMAScript 5 and higher."),
      The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: diag(1058, ts2.DiagnosticCategory.Error, "The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_t_1058", "The return type of an async function must either be a valid promise or must not contain a callable 'then' member."),
      A_promise_must_have_a_then_method: diag(1059, ts2.DiagnosticCategory.Error, "A_promise_must_have_a_then_method_1059", "A promise must have a 'then' method."),
      The_first_parameter_of_the_then_method_of_a_promise_must_be_a_callback: diag(1060, ts2.DiagnosticCategory.Error, "The_first_parameter_of_the_then_method_of_a_promise_must_be_a_callback_1060", "The first parameter of the 'then' method of a promise must be a callback."),
      Enum_member_must_have_initializer: diag(1061, ts2.DiagnosticCategory.Error, "Enum_member_must_have_initializer_1061", "Enum member must have initializer."),
      Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method: diag(1062, ts2.DiagnosticCategory.Error, "Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method_1062", "Type is referenced directly or indirectly in the fulfillment callback of its own 'then' method."),
      An_export_assignment_cannot_be_used_in_a_namespace: diag(1063, ts2.DiagnosticCategory.Error, "An_export_assignment_cannot_be_used_in_a_namespace_1063", "An export assignment cannot be used in a namespace."),
      The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0: diag(1064, ts2.DiagnosticCategory.Error, "The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_wri_1064", "The return type of an async function or method must be the global Promise<T> type. Did you mean to write 'Promise<{0}>'?"),
      In_ambient_enum_declarations_member_initializer_must_be_constant_expression: diag(1066, ts2.DiagnosticCategory.Error, "In_ambient_enum_declarations_member_initializer_must_be_constant_expression_1066", "In ambient enum declarations member initializer must be constant expression."),
      Unexpected_token_A_constructor_method_accessor_or_property_was_expected: diag(1068, ts2.DiagnosticCategory.Error, "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068", "Unexpected token. A constructor, method, accessor, or property was expected."),
      Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces: diag(1069, ts2.DiagnosticCategory.Error, "Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces_1069", "Unexpected token. A type parameter name was expected without curly braces."),
      _0_modifier_cannot_appear_on_a_type_member: diag(1070, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_appear_on_a_type_member_1070", "'{0}' modifier cannot appear on a type member."),
      _0_modifier_cannot_appear_on_an_index_signature: diag(1071, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_appear_on_an_index_signature_1071", "'{0}' modifier cannot appear on an index signature."),
      A_0_modifier_cannot_be_used_with_an_import_declaration: diag(1079, ts2.DiagnosticCategory.Error, "A_0_modifier_cannot_be_used_with_an_import_declaration_1079", "A '{0}' modifier cannot be used with an import declaration."),
      Invalid_reference_directive_syntax: diag(1084, ts2.DiagnosticCategory.Error, "Invalid_reference_directive_syntax_1084", "Invalid 'reference' directive syntax."),
      Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher_Use_the_syntax_0: diag(1085, ts2.DiagnosticCategory.Error, "Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher_Use_the_syntax_0_1085", "Octal literals are not available when targeting ECMAScript 5 and higher. Use the syntax '{0}'."),
      _0_modifier_cannot_appear_on_a_constructor_declaration: diag(1089, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_appear_on_a_constructor_declaration_1089", "'{0}' modifier cannot appear on a constructor declaration."),
      _0_modifier_cannot_appear_on_a_parameter: diag(1090, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_appear_on_a_parameter_1090", "'{0}' modifier cannot appear on a parameter."),
      Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: diag(1091, ts2.DiagnosticCategory.Error, "Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement_1091", "Only a single variable declaration is allowed in a 'for...in' statement."),
      Type_parameters_cannot_appear_on_a_constructor_declaration: diag(1092, ts2.DiagnosticCategory.Error, "Type_parameters_cannot_appear_on_a_constructor_declaration_1092", "Type parameters cannot appear on a constructor declaration."),
      Type_annotation_cannot_appear_on_a_constructor_declaration: diag(1093, ts2.DiagnosticCategory.Error, "Type_annotation_cannot_appear_on_a_constructor_declaration_1093", "Type annotation cannot appear on a constructor declaration."),
      An_accessor_cannot_have_type_parameters: diag(1094, ts2.DiagnosticCategory.Error, "An_accessor_cannot_have_type_parameters_1094", "An accessor cannot have type parameters."),
      A_set_accessor_cannot_have_a_return_type_annotation: diag(1095, ts2.DiagnosticCategory.Error, "A_set_accessor_cannot_have_a_return_type_annotation_1095", "A 'set' accessor cannot have a return type annotation."),
      An_index_signature_must_have_exactly_one_parameter: diag(1096, ts2.DiagnosticCategory.Error, "An_index_signature_must_have_exactly_one_parameter_1096", "An index signature must have exactly one parameter."),
      _0_list_cannot_be_empty: diag(1097, ts2.DiagnosticCategory.Error, "_0_list_cannot_be_empty_1097", "'{0}' list cannot be empty."),
      Type_parameter_list_cannot_be_empty: diag(1098, ts2.DiagnosticCategory.Error, "Type_parameter_list_cannot_be_empty_1098", "Type parameter list cannot be empty."),
      Type_argument_list_cannot_be_empty: diag(1099, ts2.DiagnosticCategory.Error, "Type_argument_list_cannot_be_empty_1099", "Type argument list cannot be empty."),
      Invalid_use_of_0_in_strict_mode: diag(1100, ts2.DiagnosticCategory.Error, "Invalid_use_of_0_in_strict_mode_1100", "Invalid use of '{0}' in strict mode."),
      with_statements_are_not_allowed_in_strict_mode: diag(1101, ts2.DiagnosticCategory.Error, "with_statements_are_not_allowed_in_strict_mode_1101", "'with' statements are not allowed in strict mode."),
      delete_cannot_be_called_on_an_identifier_in_strict_mode: diag(1102, ts2.DiagnosticCategory.Error, "delete_cannot_be_called_on_an_identifier_in_strict_mode_1102", "'delete' cannot be called on an identifier in strict mode."),
      for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules: diag(1103, ts2.DiagnosticCategory.Error, "for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules_1103", "'for await' loops are only allowed within async functions and at the top levels of modules."),
      A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement: diag(1104, ts2.DiagnosticCategory.Error, "A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement_1104", "A 'continue' statement can only be used within an enclosing iteration statement."),
      A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement: diag(1105, ts2.DiagnosticCategory.Error, "A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement_1105", "A 'break' statement can only be used within an enclosing iteration or switch statement."),
      The_left_hand_side_of_a_for_of_statement_may_not_be_async: diag(1106, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_of_statement_may_not_be_async_1106", "The left-hand side of a 'for...of' statement may not be 'async'."),
      Jump_target_cannot_cross_function_boundary: diag(1107, ts2.DiagnosticCategory.Error, "Jump_target_cannot_cross_function_boundary_1107", "Jump target cannot cross function boundary."),
      A_return_statement_can_only_be_used_within_a_function_body: diag(1108, ts2.DiagnosticCategory.Error, "A_return_statement_can_only_be_used_within_a_function_body_1108", "A 'return' statement can only be used within a function body."),
      Expression_expected: diag(1109, ts2.DiagnosticCategory.Error, "Expression_expected_1109", "Expression expected."),
      Type_expected: diag(1110, ts2.DiagnosticCategory.Error, "Type_expected_1110", "Type expected."),
      A_default_clause_cannot_appear_more_than_once_in_a_switch_statement: diag(1113, ts2.DiagnosticCategory.Error, "A_default_clause_cannot_appear_more_than_once_in_a_switch_statement_1113", "A 'default' clause cannot appear more than once in a 'switch' statement."),
      Duplicate_label_0: diag(1114, ts2.DiagnosticCategory.Error, "Duplicate_label_0_1114", "Duplicate label '{0}'."),
      A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement: diag(1115, ts2.DiagnosticCategory.Error, "A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement_1115", "A 'continue' statement can only jump to a label of an enclosing iteration statement."),
      A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement: diag(1116, ts2.DiagnosticCategory.Error, "A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement_1116", "A 'break' statement can only jump to a label of an enclosing statement."),
      An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode: diag(1117, ts2.DiagnosticCategory.Error, "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117", "An object literal cannot have multiple properties with the same name in strict mode."),
      An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name: diag(1118, ts2.DiagnosticCategory.Error, "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118", "An object literal cannot have multiple get/set accessors with the same name."),
      An_object_literal_cannot_have_property_and_accessor_with_the_same_name: diag(1119, ts2.DiagnosticCategory.Error, "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119", "An object literal cannot have property and accessor with the same name."),
      An_export_assignment_cannot_have_modifiers: diag(1120, ts2.DiagnosticCategory.Error, "An_export_assignment_cannot_have_modifiers_1120", "An export assignment cannot have modifiers."),
      Octal_literals_are_not_allowed_in_strict_mode: diag(1121, ts2.DiagnosticCategory.Error, "Octal_literals_are_not_allowed_in_strict_mode_1121", "Octal literals are not allowed in strict mode."),
      Variable_declaration_list_cannot_be_empty: diag(1123, ts2.DiagnosticCategory.Error, "Variable_declaration_list_cannot_be_empty_1123", "Variable declaration list cannot be empty."),
      Digit_expected: diag(1124, ts2.DiagnosticCategory.Error, "Digit_expected_1124", "Digit expected."),
      Hexadecimal_digit_expected: diag(1125, ts2.DiagnosticCategory.Error, "Hexadecimal_digit_expected_1125", "Hexadecimal digit expected."),
      Unexpected_end_of_text: diag(1126, ts2.DiagnosticCategory.Error, "Unexpected_end_of_text_1126", "Unexpected end of text."),
      Invalid_character: diag(1127, ts2.DiagnosticCategory.Error, "Invalid_character_1127", "Invalid character."),
      Declaration_or_statement_expected: diag(1128, ts2.DiagnosticCategory.Error, "Declaration_or_statement_expected_1128", "Declaration or statement expected."),
      Statement_expected: diag(1129, ts2.DiagnosticCategory.Error, "Statement_expected_1129", "Statement expected."),
      case_or_default_expected: diag(1130, ts2.DiagnosticCategory.Error, "case_or_default_expected_1130", "'case' or 'default' expected."),
      Property_or_signature_expected: diag(1131, ts2.DiagnosticCategory.Error, "Property_or_signature_expected_1131", "Property or signature expected."),
      Enum_member_expected: diag(1132, ts2.DiagnosticCategory.Error, "Enum_member_expected_1132", "Enum member expected."),
      Variable_declaration_expected: diag(1134, ts2.DiagnosticCategory.Error, "Variable_declaration_expected_1134", "Variable declaration expected."),
      Argument_expression_expected: diag(1135, ts2.DiagnosticCategory.Error, "Argument_expression_expected_1135", "Argument expression expected."),
      Property_assignment_expected: diag(1136, ts2.DiagnosticCategory.Error, "Property_assignment_expected_1136", "Property assignment expected."),
      Expression_or_comma_expected: diag(1137, ts2.DiagnosticCategory.Error, "Expression_or_comma_expected_1137", "Expression or comma expected."),
      Parameter_declaration_expected: diag(1138, ts2.DiagnosticCategory.Error, "Parameter_declaration_expected_1138", "Parameter declaration expected."),
      Type_parameter_declaration_expected: diag(1139, ts2.DiagnosticCategory.Error, "Type_parameter_declaration_expected_1139", "Type parameter declaration expected."),
      Type_argument_expected: diag(1140, ts2.DiagnosticCategory.Error, "Type_argument_expected_1140", "Type argument expected."),
      String_literal_expected: diag(1141, ts2.DiagnosticCategory.Error, "String_literal_expected_1141", "String literal expected."),
      Line_break_not_permitted_here: diag(1142, ts2.DiagnosticCategory.Error, "Line_break_not_permitted_here_1142", "Line break not permitted here."),
      or_expected: diag(1144, ts2.DiagnosticCategory.Error, "or_expected_1144", "'{' or ';' expected."),
      Declaration_expected: diag(1146, ts2.DiagnosticCategory.Error, "Declaration_expected_1146", "Declaration expected."),
      Import_declarations_in_a_namespace_cannot_reference_a_module: diag(1147, ts2.DiagnosticCategory.Error, "Import_declarations_in_a_namespace_cannot_reference_a_module_1147", "Import declarations in a namespace cannot reference a module."),
      Cannot_use_imports_exports_or_module_augmentations_when_module_is_none: diag(1148, ts2.DiagnosticCategory.Error, "Cannot_use_imports_exports_or_module_augmentations_when_module_is_none_1148", "Cannot use imports, exports, or module augmentations when '--module' is 'none'."),
      File_name_0_differs_from_already_included_file_name_1_only_in_casing: diag(1149, ts2.DiagnosticCategory.Error, "File_name_0_differs_from_already_included_file_name_1_only_in_casing_1149", "File name '{0}' differs from already included file name '{1}' only in casing."),
      const_declarations_must_be_initialized: diag(1155, ts2.DiagnosticCategory.Error, "const_declarations_must_be_initialized_1155", "'const' declarations must be initialized."),
      const_declarations_can_only_be_declared_inside_a_block: diag(1156, ts2.DiagnosticCategory.Error, "const_declarations_can_only_be_declared_inside_a_block_1156", "'const' declarations can only be declared inside a block."),
      let_declarations_can_only_be_declared_inside_a_block: diag(1157, ts2.DiagnosticCategory.Error, "let_declarations_can_only_be_declared_inside_a_block_1157", "'let' declarations can only be declared inside a block."),
      Unterminated_template_literal: diag(1160, ts2.DiagnosticCategory.Error, "Unterminated_template_literal_1160", "Unterminated template literal."),
      Unterminated_regular_expression_literal: diag(1161, ts2.DiagnosticCategory.Error, "Unterminated_regular_expression_literal_1161", "Unterminated regular expression literal."),
      An_object_member_cannot_be_declared_optional: diag(1162, ts2.DiagnosticCategory.Error, "An_object_member_cannot_be_declared_optional_1162", "An object member cannot be declared optional."),
      A_yield_expression_is_only_allowed_in_a_generator_body: diag(1163, ts2.DiagnosticCategory.Error, "A_yield_expression_is_only_allowed_in_a_generator_body_1163", "A 'yield' expression is only allowed in a generator body."),
      Computed_property_names_are_not_allowed_in_enums: diag(1164, ts2.DiagnosticCategory.Error, "Computed_property_names_are_not_allowed_in_enums_1164", "Computed property names are not allowed in enums."),
      A_computed_property_name_in_an_ambient_context_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: diag(1165, ts2.DiagnosticCategory.Error, "A_computed_property_name_in_an_ambient_context_must_refer_to_an_expression_whose_type_is_a_literal_t_1165", "A computed property name in an ambient context must refer to an expression whose type is a literal type or a 'unique symbol' type."),
      A_computed_property_name_in_a_class_property_declaration_must_have_a_simple_literal_type_or_a_unique_symbol_type: diag(1166, ts2.DiagnosticCategory.Error, "A_computed_property_name_in_a_class_property_declaration_must_have_a_simple_literal_type_or_a_unique_1166", "A computed property name in a class property declaration must have a simple literal type or a 'unique symbol' type."),
      A_computed_property_name_in_a_method_overload_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: diag(1168, ts2.DiagnosticCategory.Error, "A_computed_property_name_in_a_method_overload_must_refer_to_an_expression_whose_type_is_a_literal_ty_1168", "A computed property name in a method overload must refer to an expression whose type is a literal type or a 'unique symbol' type."),
      A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: diag(1169, ts2.DiagnosticCategory.Error, "A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_1169", "A computed property name in an interface must refer to an expression whose type is a literal type or a 'unique symbol' type."),
      A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type: diag(1170, ts2.DiagnosticCategory.Error, "A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type__1170", "A computed property name in a type literal must refer to an expression whose type is a literal type or a 'unique symbol' type."),
      A_comma_expression_is_not_allowed_in_a_computed_property_name: diag(1171, ts2.DiagnosticCategory.Error, "A_comma_expression_is_not_allowed_in_a_computed_property_name_1171", "A comma expression is not allowed in a computed property name."),
      extends_clause_already_seen: diag(1172, ts2.DiagnosticCategory.Error, "extends_clause_already_seen_1172", "'extends' clause already seen."),
      extends_clause_must_precede_implements_clause: diag(1173, ts2.DiagnosticCategory.Error, "extends_clause_must_precede_implements_clause_1173", "'extends' clause must precede 'implements' clause."),
      Classes_can_only_extend_a_single_class: diag(1174, ts2.DiagnosticCategory.Error, "Classes_can_only_extend_a_single_class_1174", "Classes can only extend a single class."),
      implements_clause_already_seen: diag(1175, ts2.DiagnosticCategory.Error, "implements_clause_already_seen_1175", "'implements' clause already seen."),
      Interface_declaration_cannot_have_implements_clause: diag(1176, ts2.DiagnosticCategory.Error, "Interface_declaration_cannot_have_implements_clause_1176", "Interface declaration cannot have 'implements' clause."),
      Binary_digit_expected: diag(1177, ts2.DiagnosticCategory.Error, "Binary_digit_expected_1177", "Binary digit expected."),
      Octal_digit_expected: diag(1178, ts2.DiagnosticCategory.Error, "Octal_digit_expected_1178", "Octal digit expected."),
      Unexpected_token_expected: diag(1179, ts2.DiagnosticCategory.Error, "Unexpected_token_expected_1179", "Unexpected token. '{' expected."),
      Property_destructuring_pattern_expected: diag(1180, ts2.DiagnosticCategory.Error, "Property_destructuring_pattern_expected_1180", "Property destructuring pattern expected."),
      Array_element_destructuring_pattern_expected: diag(1181, ts2.DiagnosticCategory.Error, "Array_element_destructuring_pattern_expected_1181", "Array element destructuring pattern expected."),
      A_destructuring_declaration_must_have_an_initializer: diag(1182, ts2.DiagnosticCategory.Error, "A_destructuring_declaration_must_have_an_initializer_1182", "A destructuring declaration must have an initializer."),
      An_implementation_cannot_be_declared_in_ambient_contexts: diag(1183, ts2.DiagnosticCategory.Error, "An_implementation_cannot_be_declared_in_ambient_contexts_1183", "An implementation cannot be declared in ambient contexts."),
      Modifiers_cannot_appear_here: diag(1184, ts2.DiagnosticCategory.Error, "Modifiers_cannot_appear_here_1184", "Modifiers cannot appear here."),
      Merge_conflict_marker_encountered: diag(1185, ts2.DiagnosticCategory.Error, "Merge_conflict_marker_encountered_1185", "Merge conflict marker encountered."),
      A_rest_element_cannot_have_an_initializer: diag(1186, ts2.DiagnosticCategory.Error, "A_rest_element_cannot_have_an_initializer_1186", "A rest element cannot have an initializer."),
      A_parameter_property_may_not_be_declared_using_a_binding_pattern: diag(1187, ts2.DiagnosticCategory.Error, "A_parameter_property_may_not_be_declared_using_a_binding_pattern_1187", "A parameter property may not be declared using a binding pattern."),
      Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: diag(1188, ts2.DiagnosticCategory.Error, "Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement_1188", "Only a single variable declaration is allowed in a 'for...of' statement."),
      The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer: diag(1189, ts2.DiagnosticCategory.Error, "The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer_1189", "The variable declaration of a 'for...in' statement cannot have an initializer."),
      The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer: diag(1190, ts2.DiagnosticCategory.Error, "The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer_1190", "The variable declaration of a 'for...of' statement cannot have an initializer."),
      An_import_declaration_cannot_have_modifiers: diag(1191, ts2.DiagnosticCategory.Error, "An_import_declaration_cannot_have_modifiers_1191", "An import declaration cannot have modifiers."),
      Module_0_has_no_default_export: diag(1192, ts2.DiagnosticCategory.Error, "Module_0_has_no_default_export_1192", "Module '{0}' has no default export."),
      An_export_declaration_cannot_have_modifiers: diag(1193, ts2.DiagnosticCategory.Error, "An_export_declaration_cannot_have_modifiers_1193", "An export declaration cannot have modifiers."),
      Export_declarations_are_not_permitted_in_a_namespace: diag(1194, ts2.DiagnosticCategory.Error, "Export_declarations_are_not_permitted_in_a_namespace_1194", "Export declarations are not permitted in a namespace."),
      export_Asterisk_does_not_re_export_a_default: diag(1195, ts2.DiagnosticCategory.Error, "export_Asterisk_does_not_re_export_a_default_1195", "'export *' does not re-export a default."),
      Catch_clause_variable_type_annotation_must_be_any_or_unknown_if_specified: diag(1196, ts2.DiagnosticCategory.Error, "Catch_clause_variable_type_annotation_must_be_any_or_unknown_if_specified_1196", "Catch clause variable type annotation must be 'any' or 'unknown' if specified."),
      Catch_clause_variable_cannot_have_an_initializer: diag(1197, ts2.DiagnosticCategory.Error, "Catch_clause_variable_cannot_have_an_initializer_1197", "Catch clause variable cannot have an initializer."),
      An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive: diag(1198, ts2.DiagnosticCategory.Error, "An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive_1198", "An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive."),
      Unterminated_Unicode_escape_sequence: diag(1199, ts2.DiagnosticCategory.Error, "Unterminated_Unicode_escape_sequence_1199", "Unterminated Unicode escape sequence."),
      Line_terminator_not_permitted_before_arrow: diag(1200, ts2.DiagnosticCategory.Error, "Line_terminator_not_permitted_before_arrow_1200", "Line terminator not permitted before arrow."),
      Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead: diag(1202, ts2.DiagnosticCategory.Error, "Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_1202", `Import assignment cannot be used when targeting ECMAScript modules. Consider using 'import * as ns from "mod"', 'import {a} from "mod"', 'import d from "mod"', or another module format instead.`),
      Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or_another_module_format_instead: diag(1203, ts2.DiagnosticCategory.Error, "Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or__1203", "Export assignment cannot be used when targeting ECMAScript modules. Consider using 'export default' or another module format instead."),
      Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type: diag(1205, ts2.DiagnosticCategory.Error, "Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type_1205", "Re-exporting a type when the '--isolatedModules' flag is provided requires using 'export type'."),
      Decorators_are_not_valid_here: diag(1206, ts2.DiagnosticCategory.Error, "Decorators_are_not_valid_here_1206", "Decorators are not valid here."),
      Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name: diag(1207, ts2.DiagnosticCategory.Error, "Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name_1207", "Decorators cannot be applied to multiple get/set accessors of the same name."),
      _0_cannot_be_compiled_under_isolatedModules_because_it_is_considered_a_global_script_file_Add_an_import_export_or_an_empty_export_statement_to_make_it_a_module: diag(1208, ts2.DiagnosticCategory.Error, "_0_cannot_be_compiled_under_isolatedModules_because_it_is_considered_a_global_script_file_Add_an_imp_1208", "'{0}' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module."),
      Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode: diag(1210, ts2.DiagnosticCategory.Error, "Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of__1210", "Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of '{0}'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode."),
      A_class_declaration_without_the_default_modifier_must_have_a_name: diag(1211, ts2.DiagnosticCategory.Error, "A_class_declaration_without_the_default_modifier_must_have_a_name_1211", "A class declaration without the 'default' modifier must have a name."),
      Identifier_expected_0_is_a_reserved_word_in_strict_mode: diag(1212, ts2.DiagnosticCategory.Error, "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212", "Identifier expected. '{0}' is a reserved word in strict mode."),
      Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: diag(1213, ts2.DiagnosticCategory.Error, "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213", "Identifier expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode."),
      Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode: diag(1214, ts2.DiagnosticCategory.Error, "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214", "Identifier expected. '{0}' is a reserved word in strict mode. Modules are automatically in strict mode."),
      Invalid_use_of_0_Modules_are_automatically_in_strict_mode: diag(1215, ts2.DiagnosticCategory.Error, "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215", "Invalid use of '{0}'. Modules are automatically in strict mode."),
      Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules: diag(1216, ts2.DiagnosticCategory.Error, "Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules_1216", "Identifier expected. '__esModule' is reserved as an exported marker when transforming ECMAScript modules."),
      Export_assignment_is_not_supported_when_module_flag_is_system: diag(1218, ts2.DiagnosticCategory.Error, "Export_assignment_is_not_supported_when_module_flag_is_system_1218", "Export assignment is not supported when '--module' flag is 'system'."),
      Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_in_your_tsconfig_or_jsconfig_to_remove_this_warning: diag(1219, ts2.DiagnosticCategory.Error, "Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_t_1219", "Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option in your 'tsconfig' or 'jsconfig' to remove this warning."),
      Generators_are_not_allowed_in_an_ambient_context: diag(1221, ts2.DiagnosticCategory.Error, "Generators_are_not_allowed_in_an_ambient_context_1221", "Generators are not allowed in an ambient context."),
      An_overload_signature_cannot_be_declared_as_a_generator: diag(1222, ts2.DiagnosticCategory.Error, "An_overload_signature_cannot_be_declared_as_a_generator_1222", "An overload signature cannot be declared as a generator."),
      _0_tag_already_specified: diag(1223, ts2.DiagnosticCategory.Error, "_0_tag_already_specified_1223", "'{0}' tag already specified."),
      Signature_0_must_be_a_type_predicate: diag(1224, ts2.DiagnosticCategory.Error, "Signature_0_must_be_a_type_predicate_1224", "Signature '{0}' must be a type predicate."),
      Cannot_find_parameter_0: diag(1225, ts2.DiagnosticCategory.Error, "Cannot_find_parameter_0_1225", "Cannot find parameter '{0}'."),
      Type_predicate_0_is_not_assignable_to_1: diag(1226, ts2.DiagnosticCategory.Error, "Type_predicate_0_is_not_assignable_to_1_1226", "Type predicate '{0}' is not assignable to '{1}'."),
      Parameter_0_is_not_in_the_same_position_as_parameter_1: diag(1227, ts2.DiagnosticCategory.Error, "Parameter_0_is_not_in_the_same_position_as_parameter_1_1227", "Parameter '{0}' is not in the same position as parameter '{1}'."),
      A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods: diag(1228, ts2.DiagnosticCategory.Error, "A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods_1228", "A type predicate is only allowed in return type position for functions and methods."),
      A_type_predicate_cannot_reference_a_rest_parameter: diag(1229, ts2.DiagnosticCategory.Error, "A_type_predicate_cannot_reference_a_rest_parameter_1229", "A type predicate cannot reference a rest parameter."),
      A_type_predicate_cannot_reference_element_0_in_a_binding_pattern: diag(1230, ts2.DiagnosticCategory.Error, "A_type_predicate_cannot_reference_element_0_in_a_binding_pattern_1230", "A type predicate cannot reference element '{0}' in a binding pattern."),
      An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration: diag(1231, ts2.DiagnosticCategory.Error, "An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration_1231", "An export assignment must be at the top level of a file or module declaration."),
      An_import_declaration_can_only_be_used_in_a_namespace_or_module: diag(1232, ts2.DiagnosticCategory.Error, "An_import_declaration_can_only_be_used_in_a_namespace_or_module_1232", "An import declaration can only be used in a namespace or module."),
      An_export_declaration_can_only_be_used_in_a_module: diag(1233, ts2.DiagnosticCategory.Error, "An_export_declaration_can_only_be_used_in_a_module_1233", "An export declaration can only be used in a module."),
      An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file: diag(1234, ts2.DiagnosticCategory.Error, "An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file_1234", "An ambient module declaration is only allowed at the top level in a file."),
      A_namespace_declaration_is_only_allowed_in_a_namespace_or_module: diag(1235, ts2.DiagnosticCategory.Error, "A_namespace_declaration_is_only_allowed_in_a_namespace_or_module_1235", "A namespace declaration is only allowed in a namespace or module."),
      The_return_type_of_a_property_decorator_function_must_be_either_void_or_any: diag(1236, ts2.DiagnosticCategory.Error, "The_return_type_of_a_property_decorator_function_must_be_either_void_or_any_1236", "The return type of a property decorator function must be either 'void' or 'any'."),
      The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any: diag(1237, ts2.DiagnosticCategory.Error, "The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any_1237", "The return type of a parameter decorator function must be either 'void' or 'any'."),
      Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression: diag(1238, ts2.DiagnosticCategory.Error, "Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression_1238", "Unable to resolve signature of class decorator when called as an expression."),
      Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression: diag(1239, ts2.DiagnosticCategory.Error, "Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression_1239", "Unable to resolve signature of parameter decorator when called as an expression."),
      Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression: diag(1240, ts2.DiagnosticCategory.Error, "Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression_1240", "Unable to resolve signature of property decorator when called as an expression."),
      Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression: diag(1241, ts2.DiagnosticCategory.Error, "Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression_1241", "Unable to resolve signature of method decorator when called as an expression."),
      abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration: diag(1242, ts2.DiagnosticCategory.Error, "abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration_1242", "'abstract' modifier can only appear on a class, method, or property declaration."),
      _0_modifier_cannot_be_used_with_1_modifier: diag(1243, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_be_used_with_1_modifier_1243", "'{0}' modifier cannot be used with '{1}' modifier."),
      Abstract_methods_can_only_appear_within_an_abstract_class: diag(1244, ts2.DiagnosticCategory.Error, "Abstract_methods_can_only_appear_within_an_abstract_class_1244", "Abstract methods can only appear within an abstract class."),
      Method_0_cannot_have_an_implementation_because_it_is_marked_abstract: diag(1245, ts2.DiagnosticCategory.Error, "Method_0_cannot_have_an_implementation_because_it_is_marked_abstract_1245", "Method '{0}' cannot have an implementation because it is marked abstract."),
      An_interface_property_cannot_have_an_initializer: diag(1246, ts2.DiagnosticCategory.Error, "An_interface_property_cannot_have_an_initializer_1246", "An interface property cannot have an initializer."),
      A_type_literal_property_cannot_have_an_initializer: diag(1247, ts2.DiagnosticCategory.Error, "A_type_literal_property_cannot_have_an_initializer_1247", "A type literal property cannot have an initializer."),
      A_class_member_cannot_have_the_0_keyword: diag(1248, ts2.DiagnosticCategory.Error, "A_class_member_cannot_have_the_0_keyword_1248", "A class member cannot have the '{0}' keyword."),
      A_decorator_can_only_decorate_a_method_implementation_not_an_overload: diag(1249, ts2.DiagnosticCategory.Error, "A_decorator_can_only_decorate_a_method_implementation_not_an_overload_1249", "A decorator can only decorate a method implementation, not an overload."),
      Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5: diag(1250, ts2.DiagnosticCategory.Error, "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_1250", "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'."),
      Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_definitions_are_automatically_in_strict_mode: diag(1251, ts2.DiagnosticCategory.Error, "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_d_1251", "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'. Class definitions are automatically in strict mode."),
      Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_are_automatically_in_strict_mode: diag(1252, ts2.DiagnosticCategory.Error, "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_1252", "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'. Modules are automatically in strict mode."),
      A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal_or_literal_enum_reference: diag(1254, ts2.DiagnosticCategory.Error, "A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal_or_literal_enum_refere_1254", "A 'const' initializer in an ambient context must be a string or numeric literal or literal enum reference."),
      A_definite_assignment_assertion_is_not_permitted_in_this_context: diag(1255, ts2.DiagnosticCategory.Error, "A_definite_assignment_assertion_is_not_permitted_in_this_context_1255", "A definite assignment assertion '!' is not permitted in this context."),
      A_required_element_cannot_follow_an_optional_element: diag(1257, ts2.DiagnosticCategory.Error, "A_required_element_cannot_follow_an_optional_element_1257", "A required element cannot follow an optional element."),
      A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration: diag(1258, ts2.DiagnosticCategory.Error, "A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration_1258", "A default export must be at the top level of a file or module declaration."),
      Module_0_can_only_be_default_imported_using_the_1_flag: diag(1259, ts2.DiagnosticCategory.Error, "Module_0_can_only_be_default_imported_using_the_1_flag_1259", "Module '{0}' can only be default-imported using the '{1}' flag"),
      Keywords_cannot_contain_escape_characters: diag(1260, ts2.DiagnosticCategory.Error, "Keywords_cannot_contain_escape_characters_1260", "Keywords cannot contain escape characters."),
      Already_included_file_name_0_differs_from_file_name_1_only_in_casing: diag(1261, ts2.DiagnosticCategory.Error, "Already_included_file_name_0_differs_from_file_name_1_only_in_casing_1261", "Already included file name '{0}' differs from file name '{1}' only in casing."),
      Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module: diag(1262, ts2.DiagnosticCategory.Error, "Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module_1262", "Identifier expected. '{0}' is a reserved word at the top-level of a module."),
      Declarations_with_initializers_cannot_also_have_definite_assignment_assertions: diag(1263, ts2.DiagnosticCategory.Error, "Declarations_with_initializers_cannot_also_have_definite_assignment_assertions_1263", "Declarations with initializers cannot also have definite assignment assertions."),
      Declarations_with_definite_assignment_assertions_must_also_have_type_annotations: diag(1264, ts2.DiagnosticCategory.Error, "Declarations_with_definite_assignment_assertions_must_also_have_type_annotations_1264", "Declarations with definite assignment assertions must also have type annotations."),
      A_rest_element_cannot_follow_another_rest_element: diag(1265, ts2.DiagnosticCategory.Error, "A_rest_element_cannot_follow_another_rest_element_1265", "A rest element cannot follow another rest element."),
      An_optional_element_cannot_follow_a_rest_element: diag(1266, ts2.DiagnosticCategory.Error, "An_optional_element_cannot_follow_a_rest_element_1266", "An optional element cannot follow a rest element."),
      Property_0_cannot_have_an_initializer_because_it_is_marked_abstract: diag(1267, ts2.DiagnosticCategory.Error, "Property_0_cannot_have_an_initializer_because_it_is_marked_abstract_1267", "Property '{0}' cannot have an initializer because it is marked abstract."),
      An_index_signature_parameter_type_must_be_string_number_symbol_or_a_template_literal_type: diag(1268, ts2.DiagnosticCategory.Error, "An_index_signature_parameter_type_must_be_string_number_symbol_or_a_template_literal_type_1268", "An index signature parameter type must be 'string', 'number', 'symbol', or a template literal type."),
      with_statements_are_not_allowed_in_an_async_function_block: diag(1300, ts2.DiagnosticCategory.Error, "with_statements_are_not_allowed_in_an_async_function_block_1300", "'with' statements are not allowed in an async function block."),
      await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules: diag(1308, ts2.DiagnosticCategory.Error, "await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules_1308", "'await' expressions are only allowed within async functions and at the top levels of modules."),
      Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern: diag(1312, ts2.DiagnosticCategory.Error, "Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_1312", "Did you mean to use a ':'? An '=' can only follow a property name when the containing object literal is part of a destructuring pattern."),
      The_body_of_an_if_statement_cannot_be_the_empty_statement: diag(1313, ts2.DiagnosticCategory.Error, "The_body_of_an_if_statement_cannot_be_the_empty_statement_1313", "The body of an 'if' statement cannot be the empty statement."),
      Global_module_exports_may_only_appear_in_module_files: diag(1314, ts2.DiagnosticCategory.Error, "Global_module_exports_may_only_appear_in_module_files_1314", "Global module exports may only appear in module files."),
      Global_module_exports_may_only_appear_in_declaration_files: diag(1315, ts2.DiagnosticCategory.Error, "Global_module_exports_may_only_appear_in_declaration_files_1315", "Global module exports may only appear in declaration files."),
      Global_module_exports_may_only_appear_at_top_level: diag(1316, ts2.DiagnosticCategory.Error, "Global_module_exports_may_only_appear_at_top_level_1316", "Global module exports may only appear at top level."),
      A_parameter_property_cannot_be_declared_using_a_rest_parameter: diag(1317, ts2.DiagnosticCategory.Error, "A_parameter_property_cannot_be_declared_using_a_rest_parameter_1317", "A parameter property cannot be declared using a rest parameter."),
      An_abstract_accessor_cannot_have_an_implementation: diag(1318, ts2.DiagnosticCategory.Error, "An_abstract_accessor_cannot_have_an_implementation_1318", "An abstract accessor cannot have an implementation."),
      A_default_export_can_only_be_used_in_an_ECMAScript_style_module: diag(1319, ts2.DiagnosticCategory.Error, "A_default_export_can_only_be_used_in_an_ECMAScript_style_module_1319", "A default export can only be used in an ECMAScript-style module."),
      Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: diag(1320, ts2.DiagnosticCategory.Error, "Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member_1320", "Type of 'await' operand must either be a valid promise or must not contain a callable 'then' member."),
      Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: diag(1321, ts2.DiagnosticCategory.Error, "Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_cal_1321", "Type of 'yield' operand in an async generator must either be a valid promise or must not contain a callable 'then' member."),
      Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member: diag(1322, ts2.DiagnosticCategory.Error, "Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_con_1322", "Type of iterated elements of a 'yield*' operand must either be a valid promise or must not contain a callable 'then' member."),
      Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd_system_umd_node12_or_nodenext: diag(1323, ts2.DiagnosticCategory.Error, "Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd__1323", "Dynamic imports are only supported when the '--module' flag is set to 'es2020', 'es2022', 'esnext', 'commonjs', 'amd', 'system', 'umd', 'node12', or 'nodenext'."),
      Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext: diag(1324, ts2.DiagnosticCategory.Error, "Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext_1324", "Dynamic imports only support a second argument when the '--module' option is set to 'esnext'."),
      Argument_of_dynamic_import_cannot_be_spread_element: diag(1325, ts2.DiagnosticCategory.Error, "Argument_of_dynamic_import_cannot_be_spread_element_1325", "Argument of dynamic import cannot be spread element."),
      Dynamic_import_cannot_have_type_arguments: diag(1326, ts2.DiagnosticCategory.Error, "Dynamic_import_cannot_have_type_arguments_1326", "Dynamic import cannot have type arguments."),
      String_literal_with_double_quotes_expected: diag(1327, ts2.DiagnosticCategory.Error, "String_literal_with_double_quotes_expected_1327", "String literal with double quotes expected."),
      Property_value_can_only_be_string_literal_numeric_literal_true_false_null_object_literal_or_array_literal: diag(1328, ts2.DiagnosticCategory.Error, "Property_value_can_only_be_string_literal_numeric_literal_true_false_null_object_literal_or_array_li_1328", "Property value can only be string literal, numeric literal, 'true', 'false', 'null', object literal or array literal."),
      _0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write_0: diag(1329, ts2.DiagnosticCategory.Error, "_0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write__1329", "'{0}' accepts too few arguments to be used as a decorator here. Did you mean to call it first and write '@{0}()'?"),
      A_property_of_an_interface_or_type_literal_whose_type_is_a_unique_symbol_type_must_be_readonly: diag(1330, ts2.DiagnosticCategory.Error, "A_property_of_an_interface_or_type_literal_whose_type_is_a_unique_symbol_type_must_be_readonly_1330", "A property of an interface or type literal whose type is a 'unique symbol' type must be 'readonly'."),
      A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly: diag(1331, ts2.DiagnosticCategory.Error, "A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly_1331", "A property of a class whose type is a 'unique symbol' type must be both 'static' and 'readonly'."),
      A_variable_whose_type_is_a_unique_symbol_type_must_be_const: diag(1332, ts2.DiagnosticCategory.Error, "A_variable_whose_type_is_a_unique_symbol_type_must_be_const_1332", "A variable whose type is a 'unique symbol' type must be 'const'."),
      unique_symbol_types_may_not_be_used_on_a_variable_declaration_with_a_binding_name: diag(1333, ts2.DiagnosticCategory.Error, "unique_symbol_types_may_not_be_used_on_a_variable_declaration_with_a_binding_name_1333", "'unique symbol' types may not be used on a variable declaration with a binding name."),
      unique_symbol_types_are_only_allowed_on_variables_in_a_variable_statement: diag(1334, ts2.DiagnosticCategory.Error, "unique_symbol_types_are_only_allowed_on_variables_in_a_variable_statement_1334", "'unique symbol' types are only allowed on variables in a variable statement."),
      unique_symbol_types_are_not_allowed_here: diag(1335, ts2.DiagnosticCategory.Error, "unique_symbol_types_are_not_allowed_here_1335", "'unique symbol' types are not allowed here."),
      An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead: diag(1337, ts2.DiagnosticCategory.Error, "An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_o_1337", "An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead."),
      infer_declarations_are_only_permitted_in_the_extends_clause_of_a_conditional_type: diag(1338, ts2.DiagnosticCategory.Error, "infer_declarations_are_only_permitted_in_the_extends_clause_of_a_conditional_type_1338", "'infer' declarations are only permitted in the 'extends' clause of a conditional type."),
      Module_0_does_not_refer_to_a_value_but_is_used_as_a_value_here: diag(1339, ts2.DiagnosticCategory.Error, "Module_0_does_not_refer_to_a_value_but_is_used_as_a_value_here_1339", "Module '{0}' does not refer to a value, but is used as a value here."),
      Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0: diag(1340, ts2.DiagnosticCategory.Error, "Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0_1340", "Module '{0}' does not refer to a type, but is used as a type here. Did you mean 'typeof import('{0}')'?"),
      Type_arguments_cannot_be_used_here: diag(1342, ts2.DiagnosticCategory.Error, "Type_arguments_cannot_be_used_here_1342", "Type arguments cannot be used here."),
      The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system_node12_or_nodenext: diag(1343, ts2.DiagnosticCategory.Error, "The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system__1343", "The 'import.meta' meta-property is only allowed when the '--module' option is 'es2020', 'es2022', 'esnext', 'system', 'node12', or 'nodenext'."),
      A_label_is_not_allowed_here: diag(1344, ts2.DiagnosticCategory.Error, "A_label_is_not_allowed_here_1344", "'A label is not allowed here."),
      An_expression_of_type_void_cannot_be_tested_for_truthiness: diag(1345, ts2.DiagnosticCategory.Error, "An_expression_of_type_void_cannot_be_tested_for_truthiness_1345", "An expression of type 'void' cannot be tested for truthiness."),
      This_parameter_is_not_allowed_with_use_strict_directive: diag(1346, ts2.DiagnosticCategory.Error, "This_parameter_is_not_allowed_with_use_strict_directive_1346", "This parameter is not allowed with 'use strict' directive."),
      use_strict_directive_cannot_be_used_with_non_simple_parameter_list: diag(1347, ts2.DiagnosticCategory.Error, "use_strict_directive_cannot_be_used_with_non_simple_parameter_list_1347", "'use strict' directive cannot be used with non-simple parameter list."),
      Non_simple_parameter_declared_here: diag(1348, ts2.DiagnosticCategory.Error, "Non_simple_parameter_declared_here_1348", "Non-simple parameter declared here."),
      use_strict_directive_used_here: diag(1349, ts2.DiagnosticCategory.Error, "use_strict_directive_used_here_1349", "'use strict' directive used here."),
      Print_the_final_configuration_instead_of_building: diag(1350, ts2.DiagnosticCategory.Message, "Print_the_final_configuration_instead_of_building_1350", "Print the final configuration instead of building."),
      An_identifier_or_keyword_cannot_immediately_follow_a_numeric_literal: diag(1351, ts2.DiagnosticCategory.Error, "An_identifier_or_keyword_cannot_immediately_follow_a_numeric_literal_1351", "An identifier or keyword cannot immediately follow a numeric literal."),
      A_bigint_literal_cannot_use_exponential_notation: diag(1352, ts2.DiagnosticCategory.Error, "A_bigint_literal_cannot_use_exponential_notation_1352", "A bigint literal cannot use exponential notation."),
      A_bigint_literal_must_be_an_integer: diag(1353, ts2.DiagnosticCategory.Error, "A_bigint_literal_must_be_an_integer_1353", "A bigint literal must be an integer."),
      readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types: diag(1354, ts2.DiagnosticCategory.Error, "readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types_1354", "'readonly' type modifier is only permitted on array and tuple literal types."),
      A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals: diag(1355, ts2.DiagnosticCategory.Error, "A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array__1355", "A 'const' assertions can only be applied to references to enum members, or string, number, boolean, array, or object literals."),
      Did_you_mean_to_mark_this_function_as_async: diag(1356, ts2.DiagnosticCategory.Error, "Did_you_mean_to_mark_this_function_as_async_1356", "Did you mean to mark this function as 'async'?"),
      An_enum_member_name_must_be_followed_by_a_or: diag(1357, ts2.DiagnosticCategory.Error, "An_enum_member_name_must_be_followed_by_a_or_1357", "An enum member name must be followed by a ',', '=', or '}'."),
      Tagged_template_expressions_are_not_permitted_in_an_optional_chain: diag(1358, ts2.DiagnosticCategory.Error, "Tagged_template_expressions_are_not_permitted_in_an_optional_chain_1358", "Tagged template expressions are not permitted in an optional chain."),
      Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here: diag(1359, ts2.DiagnosticCategory.Error, "Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here_1359", "Identifier expected. '{0}' is a reserved word that cannot be used here."),
      _0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type: diag(1361, ts2.DiagnosticCategory.Error, "_0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type_1361", "'{0}' cannot be used as a value because it was imported using 'import type'."),
      _0_cannot_be_used_as_a_value_because_it_was_exported_using_export_type: diag(1362, ts2.DiagnosticCategory.Error, "_0_cannot_be_used_as_a_value_because_it_was_exported_using_export_type_1362", "'{0}' cannot be used as a value because it was exported using 'export type'."),
      A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both: diag(1363, ts2.DiagnosticCategory.Error, "A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both_1363", "A type-only import can specify a default import or named bindings, but not both."),
      Convert_to_type_only_export: diag(1364, ts2.DiagnosticCategory.Message, "Convert_to_type_only_export_1364", "Convert to type-only export"),
      Convert_all_re_exported_types_to_type_only_exports: diag(1365, ts2.DiagnosticCategory.Message, "Convert_all_re_exported_types_to_type_only_exports_1365", "Convert all re-exported types to type-only exports"),
      Split_into_two_separate_import_declarations: diag(1366, ts2.DiagnosticCategory.Message, "Split_into_two_separate_import_declarations_1366", "Split into two separate import declarations"),
      Split_all_invalid_type_only_imports: diag(1367, ts2.DiagnosticCategory.Message, "Split_all_invalid_type_only_imports_1367", "Split all invalid type-only imports"),
      Did_you_mean_0: diag(1369, ts2.DiagnosticCategory.Message, "Did_you_mean_0_1369", "Did you mean '{0}'?"),
      This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error: diag(1371, ts2.DiagnosticCategory.Error, "This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set__1371", "This import is never used as a value and must use 'import type' because 'importsNotUsedAsValues' is set to 'error'."),
      Convert_to_type_only_import: diag(1373, ts2.DiagnosticCategory.Message, "Convert_to_type_only_import_1373", "Convert to type-only import"),
      Convert_all_imports_not_used_as_a_value_to_type_only_imports: diag(1374, ts2.DiagnosticCategory.Message, "Convert_all_imports_not_used_as_a_value_to_type_only_imports_1374", "Convert all imports not used as a value to type-only imports"),
      await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module: diag(1375, ts2.DiagnosticCategory.Error, "await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_fi_1375", "'await' expressions are only allowed at the top level of a file when that file is a module, but this file has no imports or exports. Consider adding an empty 'export {}' to make this file a module."),
      _0_was_imported_here: diag(1376, ts2.DiagnosticCategory.Message, "_0_was_imported_here_1376", "'{0}' was imported here."),
      _0_was_exported_here: diag(1377, ts2.DiagnosticCategory.Message, "_0_was_exported_here_1377", "'{0}' was exported here."),
      Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher: diag(1378, ts2.DiagnosticCategory.Error, "Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_o_1378", "Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', or 'nodenext', and the 'target' option is set to 'es2017' or higher."),
      An_import_alias_cannot_reference_a_declaration_that_was_exported_using_export_type: diag(1379, ts2.DiagnosticCategory.Error, "An_import_alias_cannot_reference_a_declaration_that_was_exported_using_export_type_1379", "An import alias cannot reference a declaration that was exported using 'export type'."),
      An_import_alias_cannot_reference_a_declaration_that_was_imported_using_import_type: diag(1380, ts2.DiagnosticCategory.Error, "An_import_alias_cannot_reference_a_declaration_that_was_imported_using_import_type_1380", "An import alias cannot reference a declaration that was imported using 'import type'."),
      Unexpected_token_Did_you_mean_or_rbrace: diag(1381, ts2.DiagnosticCategory.Error, "Unexpected_token_Did_you_mean_or_rbrace_1381", "Unexpected token. Did you mean `{'}'}` or `&rbrace;`?"),
      Unexpected_token_Did_you_mean_or_gt: diag(1382, ts2.DiagnosticCategory.Error, "Unexpected_token_Did_you_mean_or_gt_1382", "Unexpected token. Did you mean `{'>'}` or `&gt;`?"),
      Only_named_exports_may_use_export_type: diag(1383, ts2.DiagnosticCategory.Error, "Only_named_exports_may_use_export_type_1383", "Only named exports may use 'export type'."),
      A_new_expression_with_type_arguments_must_always_be_followed_by_a_parenthesized_argument_list: diag(1384, ts2.DiagnosticCategory.Error, "A_new_expression_with_type_arguments_must_always_be_followed_by_a_parenthesized_argument_list_1384", "A 'new' expression with type arguments must always be followed by a parenthesized argument list."),
      Function_type_notation_must_be_parenthesized_when_used_in_a_union_type: diag(1385, ts2.DiagnosticCategory.Error, "Function_type_notation_must_be_parenthesized_when_used_in_a_union_type_1385", "Function type notation must be parenthesized when used in a union type."),
      Constructor_type_notation_must_be_parenthesized_when_used_in_a_union_type: diag(1386, ts2.DiagnosticCategory.Error, "Constructor_type_notation_must_be_parenthesized_when_used_in_a_union_type_1386", "Constructor type notation must be parenthesized when used in a union type."),
      Function_type_notation_must_be_parenthesized_when_used_in_an_intersection_type: diag(1387, ts2.DiagnosticCategory.Error, "Function_type_notation_must_be_parenthesized_when_used_in_an_intersection_type_1387", "Function type notation must be parenthesized when used in an intersection type."),
      Constructor_type_notation_must_be_parenthesized_when_used_in_an_intersection_type: diag(1388, ts2.DiagnosticCategory.Error, "Constructor_type_notation_must_be_parenthesized_when_used_in_an_intersection_type_1388", "Constructor type notation must be parenthesized when used in an intersection type."),
      _0_is_not_allowed_as_a_variable_declaration_name: diag(1389, ts2.DiagnosticCategory.Error, "_0_is_not_allowed_as_a_variable_declaration_name_1389", "'{0}' is not allowed as a variable declaration name."),
      _0_is_not_allowed_as_a_parameter_name: diag(1390, ts2.DiagnosticCategory.Error, "_0_is_not_allowed_as_a_parameter_name_1390", "'{0}' is not allowed as a parameter name."),
      An_import_alias_cannot_use_import_type: diag(1392, ts2.DiagnosticCategory.Error, "An_import_alias_cannot_use_import_type_1392", "An import alias cannot use 'import type'"),
      Imported_via_0_from_file_1: diag(1393, ts2.DiagnosticCategory.Message, "Imported_via_0_from_file_1_1393", "Imported via {0} from file '{1}'"),
      Imported_via_0_from_file_1_with_packageId_2: diag(1394, ts2.DiagnosticCategory.Message, "Imported_via_0_from_file_1_with_packageId_2_1394", "Imported via {0} from file '{1}' with packageId '{2}'"),
      Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions: diag(1395, ts2.DiagnosticCategory.Message, "Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions_1395", "Imported via {0} from file '{1}' to import 'importHelpers' as specified in compilerOptions"),
      Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions: diag(1396, ts2.DiagnosticCategory.Message, "Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions_1396", "Imported via {0} from file '{1}' with packageId '{2}' to import 'importHelpers' as specified in compilerOptions"),
      Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions: diag(1397, ts2.DiagnosticCategory.Message, "Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions_1397", "Imported via {0} from file '{1}' to import 'jsx' and 'jsxs' factory functions"),
      Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions: diag(1398, ts2.DiagnosticCategory.Message, "Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions_1398", "Imported via {0} from file '{1}' with packageId '{2}' to import 'jsx' and 'jsxs' factory functions"),
      File_is_included_via_import_here: diag(1399, ts2.DiagnosticCategory.Message, "File_is_included_via_import_here_1399", "File is included via import here."),
      Referenced_via_0_from_file_1: diag(1400, ts2.DiagnosticCategory.Message, "Referenced_via_0_from_file_1_1400", "Referenced via '{0}' from file '{1}'"),
      File_is_included_via_reference_here: diag(1401, ts2.DiagnosticCategory.Message, "File_is_included_via_reference_here_1401", "File is included via reference here."),
      Type_library_referenced_via_0_from_file_1: diag(1402, ts2.DiagnosticCategory.Message, "Type_library_referenced_via_0_from_file_1_1402", "Type library referenced via '{0}' from file '{1}'"),
      Type_library_referenced_via_0_from_file_1_with_packageId_2: diag(1403, ts2.DiagnosticCategory.Message, "Type_library_referenced_via_0_from_file_1_with_packageId_2_1403", "Type library referenced via '{0}' from file '{1}' with packageId '{2}'"),
      File_is_included_via_type_library_reference_here: diag(1404, ts2.DiagnosticCategory.Message, "File_is_included_via_type_library_reference_here_1404", "File is included via type library reference here."),
      Library_referenced_via_0_from_file_1: diag(1405, ts2.DiagnosticCategory.Message, "Library_referenced_via_0_from_file_1_1405", "Library referenced via '{0}' from file '{1}'"),
      File_is_included_via_library_reference_here: diag(1406, ts2.DiagnosticCategory.Message, "File_is_included_via_library_reference_here_1406", "File is included via library reference here."),
      Matched_by_include_pattern_0_in_1: diag(1407, ts2.DiagnosticCategory.Message, "Matched_by_include_pattern_0_in_1_1407", "Matched by include pattern '{0}' in '{1}'"),
      File_is_matched_by_include_pattern_specified_here: diag(1408, ts2.DiagnosticCategory.Message, "File_is_matched_by_include_pattern_specified_here_1408", "File is matched by include pattern specified here."),
      Part_of_files_list_in_tsconfig_json: diag(1409, ts2.DiagnosticCategory.Message, "Part_of_files_list_in_tsconfig_json_1409", "Part of 'files' list in tsconfig.json"),
      File_is_matched_by_files_list_specified_here: diag(1410, ts2.DiagnosticCategory.Message, "File_is_matched_by_files_list_specified_here_1410", "File is matched by 'files' list specified here."),
      Output_from_referenced_project_0_included_because_1_specified: diag(1411, ts2.DiagnosticCategory.Message, "Output_from_referenced_project_0_included_because_1_specified_1411", "Output from referenced project '{0}' included because '{1}' specified"),
      Output_from_referenced_project_0_included_because_module_is_specified_as_none: diag(1412, ts2.DiagnosticCategory.Message, "Output_from_referenced_project_0_included_because_module_is_specified_as_none_1412", "Output from referenced project '{0}' included because '--module' is specified as 'none'"),
      File_is_output_from_referenced_project_specified_here: diag(1413, ts2.DiagnosticCategory.Message, "File_is_output_from_referenced_project_specified_here_1413", "File is output from referenced project specified here."),
      Source_from_referenced_project_0_included_because_1_specified: diag(1414, ts2.DiagnosticCategory.Message, "Source_from_referenced_project_0_included_because_1_specified_1414", "Source from referenced project '{0}' included because '{1}' specified"),
      Source_from_referenced_project_0_included_because_module_is_specified_as_none: diag(1415, ts2.DiagnosticCategory.Message, "Source_from_referenced_project_0_included_because_module_is_specified_as_none_1415", "Source from referenced project '{0}' included because '--module' is specified as 'none'"),
      File_is_source_from_referenced_project_specified_here: diag(1416, ts2.DiagnosticCategory.Message, "File_is_source_from_referenced_project_specified_here_1416", "File is source from referenced project specified here."),
      Entry_point_of_type_library_0_specified_in_compilerOptions: diag(1417, ts2.DiagnosticCategory.Message, "Entry_point_of_type_library_0_specified_in_compilerOptions_1417", "Entry point of type library '{0}' specified in compilerOptions"),
      Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1: diag(1418, ts2.DiagnosticCategory.Message, "Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1_1418", "Entry point of type library '{0}' specified in compilerOptions with packageId '{1}'"),
      File_is_entry_point_of_type_library_specified_here: diag(1419, ts2.DiagnosticCategory.Message, "File_is_entry_point_of_type_library_specified_here_1419", "File is entry point of type library specified here."),
      Entry_point_for_implicit_type_library_0: diag(1420, ts2.DiagnosticCategory.Message, "Entry_point_for_implicit_type_library_0_1420", "Entry point for implicit type library '{0}'"),
      Entry_point_for_implicit_type_library_0_with_packageId_1: diag(1421, ts2.DiagnosticCategory.Message, "Entry_point_for_implicit_type_library_0_with_packageId_1_1421", "Entry point for implicit type library '{0}' with packageId '{1}'"),
      Library_0_specified_in_compilerOptions: diag(1422, ts2.DiagnosticCategory.Message, "Library_0_specified_in_compilerOptions_1422", "Library '{0}' specified in compilerOptions"),
      File_is_library_specified_here: diag(1423, ts2.DiagnosticCategory.Message, "File_is_library_specified_here_1423", "File is library specified here."),
      Default_library: diag(1424, ts2.DiagnosticCategory.Message, "Default_library_1424", "Default library"),
      Default_library_for_target_0: diag(1425, ts2.DiagnosticCategory.Message, "Default_library_for_target_0_1425", "Default library for target '{0}'"),
      File_is_default_library_for_target_specified_here: diag(1426, ts2.DiagnosticCategory.Message, "File_is_default_library_for_target_specified_here_1426", "File is default library for target specified here."),
      Root_file_specified_for_compilation: diag(1427, ts2.DiagnosticCategory.Message, "Root_file_specified_for_compilation_1427", "Root file specified for compilation"),
      File_is_output_of_project_reference_source_0: diag(1428, ts2.DiagnosticCategory.Message, "File_is_output_of_project_reference_source_0_1428", "File is output of project reference source '{0}'"),
      File_redirects_to_file_0: diag(1429, ts2.DiagnosticCategory.Message, "File_redirects_to_file_0_1429", "File redirects to file '{0}'"),
      The_file_is_in_the_program_because_Colon: diag(1430, ts2.DiagnosticCategory.Message, "The_file_is_in_the_program_because_Colon_1430", "The file is in the program because:"),
      for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module: diag(1431, ts2.DiagnosticCategory.Error, "for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_1431", "'for await' loops are only allowed at the top level of a file when that file is a module, but this file has no imports or exports. Consider adding an empty 'export {}' to make this file a module."),
      Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher: diag(1432, ts2.DiagnosticCategory.Error, "Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_or__1432", "Top-level 'for await' loops are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', or 'nodenext', and the 'target' option is set to 'es2017' or higher."),
      Decorators_may_not_be_applied_to_this_parameters: diag(1433, ts2.DiagnosticCategory.Error, "Decorators_may_not_be_applied_to_this_parameters_1433", "Decorators may not be applied to 'this' parameters."),
      Unexpected_keyword_or_identifier: diag(1434, ts2.DiagnosticCategory.Error, "Unexpected_keyword_or_identifier_1434", "Unexpected keyword or identifier."),
      Unknown_keyword_or_identifier_Did_you_mean_0: diag(1435, ts2.DiagnosticCategory.Error, "Unknown_keyword_or_identifier_Did_you_mean_0_1435", "Unknown keyword or identifier. Did you mean '{0}'?"),
      Decorators_must_precede_the_name_and_all_keywords_of_property_declarations: diag(1436, ts2.DiagnosticCategory.Error, "Decorators_must_precede_the_name_and_all_keywords_of_property_declarations_1436", "Decorators must precede the name and all keywords of property declarations."),
      Namespace_must_be_given_a_name: diag(1437, ts2.DiagnosticCategory.Error, "Namespace_must_be_given_a_name_1437", "Namespace must be given a name."),
      Interface_must_be_given_a_name: diag(1438, ts2.DiagnosticCategory.Error, "Interface_must_be_given_a_name_1438", "Interface must be given a name."),
      Type_alias_must_be_given_a_name: diag(1439, ts2.DiagnosticCategory.Error, "Type_alias_must_be_given_a_name_1439", "Type alias must be given a name."),
      Variable_declaration_not_allowed_at_this_location: diag(1440, ts2.DiagnosticCategory.Error, "Variable_declaration_not_allowed_at_this_location_1440", "Variable declaration not allowed at this location."),
      Cannot_start_a_function_call_in_a_type_annotation: diag(1441, ts2.DiagnosticCategory.Error, "Cannot_start_a_function_call_in_a_type_annotation_1441", "Cannot start a function call in a type annotation."),
      Expected_for_property_initializer: diag(1442, ts2.DiagnosticCategory.Error, "Expected_for_property_initializer_1442", "Expected '=' for property initializer."),
      Module_declaration_names_may_only_use_or_quoted_strings: diag(1443, ts2.DiagnosticCategory.Error, "Module_declaration_names_may_only_use_or_quoted_strings_1443", `Module declaration names may only use ' or " quoted strings.`),
      _0_is_a_type_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled: diag(1444, ts2.DiagnosticCategory.Error, "_0_is_a_type_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedMod_1444", "'{0}' is a type and must be imported using a type-only import when 'preserveValueImports' and 'isolatedModules' are both enabled."),
      _0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled: diag(1446, ts2.DiagnosticCategory.Error, "_0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_preserveVa_1446", "'{0}' resolves to a type-only declaration and must be imported using a type-only import when 'preserveValueImports' and 'isolatedModules' are both enabled."),
      _0_resolves_to_a_type_only_declaration_and_must_be_re_exported_using_a_type_only_re_export_when_isolatedModules_is_enabled: diag(1448, ts2.DiagnosticCategory.Error, "_0_resolves_to_a_type_only_declaration_and_must_be_re_exported_using_a_type_only_re_export_when_isol_1448", "'{0}' resolves to a type-only declaration and must be re-exported using a type-only re-export when 'isolatedModules' is enabled."),
      Preserve_unused_imported_values_in_the_JavaScript_output_that_would_otherwise_be_removed: diag(1449, ts2.DiagnosticCategory.Message, "Preserve_unused_imported_values_in_the_JavaScript_output_that_would_otherwise_be_removed_1449", "Preserve unused imported values in the JavaScript output that would otherwise be removed."),
      Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments: diag(1450, ts2.DiagnosticCategory.Message, "Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments_1450", "Dynamic imports can only accept a module specifier and an optional assertion as arguments"),
      Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression: diag(1451, ts2.DiagnosticCategory.Error, "Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member__1451", "Private identifiers are only allowed in class bodies and may only be used as part of a class member declaration, property access, or on the left-hand-side of an 'in' expression"),
      The_import_meta_meta_property_is_not_allowed_in_files_which_will_build_into_CommonJS_output: diag(1470, ts2.DiagnosticCategory.Error, "The_import_meta_meta_property_is_not_allowed_in_files_which_will_build_into_CommonJS_output_1470", "The 'import.meta' meta-property is not allowed in files which will build into CommonJS output."),
      Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_cannot_be_imported_synchronously_Use_dynamic_import_instead: diag(1471, ts2.DiagnosticCategory.Error, "Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_c_1471", "Module '{0}' cannot be imported using this construct. The specifier only resolves to an ES module, which cannot be imported synchronously. Use dynamic import instead."),
      The_types_of_0_are_incompatible_between_these_types: diag(2200, ts2.DiagnosticCategory.Error, "The_types_of_0_are_incompatible_between_these_types_2200", "The types of '{0}' are incompatible between these types."),
      The_types_returned_by_0_are_incompatible_between_these_types: diag(2201, ts2.DiagnosticCategory.Error, "The_types_returned_by_0_are_incompatible_between_these_types_2201", "The types returned by '{0}' are incompatible between these types."),
      Call_signature_return_types_0_and_1_are_incompatible: diag(2202, ts2.DiagnosticCategory.Error, "Call_signature_return_types_0_and_1_are_incompatible_2202", "Call signature return types '{0}' and '{1}' are incompatible.", void 0, true),
      Construct_signature_return_types_0_and_1_are_incompatible: diag(2203, ts2.DiagnosticCategory.Error, "Construct_signature_return_types_0_and_1_are_incompatible_2203", "Construct signature return types '{0}' and '{1}' are incompatible.", void 0, true),
      Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1: diag(2204, ts2.DiagnosticCategory.Error, "Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1_2204", "Call signatures with no arguments have incompatible return types '{0}' and '{1}'.", void 0, true),
      Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1: diag(2205, ts2.DiagnosticCategory.Error, "Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1_2205", "Construct signatures with no arguments have incompatible return types '{0}' and '{1}'.", void 0, true),
      The_type_modifier_cannot_be_used_on_a_named_import_when_import_type_is_used_on_its_import_statement: diag(2206, ts2.DiagnosticCategory.Error, "The_type_modifier_cannot_be_used_on_a_named_import_when_import_type_is_used_on_its_import_statement_2206", "The 'type' modifier cannot be used on a named import when 'import type' is used on its import statement."),
      The_type_modifier_cannot_be_used_on_a_named_export_when_export_type_is_used_on_its_export_statement: diag(2207, ts2.DiagnosticCategory.Error, "The_type_modifier_cannot_be_used_on_a_named_export_when_export_type_is_used_on_its_export_statement_2207", "The 'type' modifier cannot be used on a named export when 'export type' is used on its export statement."),
      Duplicate_identifier_0: diag(2300, ts2.DiagnosticCategory.Error, "Duplicate_identifier_0_2300", "Duplicate identifier '{0}'."),
      Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: diag(2301, ts2.DiagnosticCategory.Error, "Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor_2301", "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor."),
      Static_members_cannot_reference_class_type_parameters: diag(2302, ts2.DiagnosticCategory.Error, "Static_members_cannot_reference_class_type_parameters_2302", "Static members cannot reference class type parameters."),
      Circular_definition_of_import_alias_0: diag(2303, ts2.DiagnosticCategory.Error, "Circular_definition_of_import_alias_0_2303", "Circular definition of import alias '{0}'."),
      Cannot_find_name_0: diag(2304, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_2304", "Cannot find name '{0}'."),
      Module_0_has_no_exported_member_1: diag(2305, ts2.DiagnosticCategory.Error, "Module_0_has_no_exported_member_1_2305", "Module '{0}' has no exported member '{1}'."),
      File_0_is_not_a_module: diag(2306, ts2.DiagnosticCategory.Error, "File_0_is_not_a_module_2306", "File '{0}' is not a module."),
      Cannot_find_module_0_or_its_corresponding_type_declarations: diag(2307, ts2.DiagnosticCategory.Error, "Cannot_find_module_0_or_its_corresponding_type_declarations_2307", "Cannot find module '{0}' or its corresponding type declarations."),
      Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambiguity: diag(2308, ts2.DiagnosticCategory.Error, "Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambig_2308", "Module {0} has already exported a member named '{1}'. Consider explicitly re-exporting to resolve the ambiguity."),
      An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements: diag(2309, ts2.DiagnosticCategory.Error, "An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements_2309", "An export assignment cannot be used in a module with other exported elements."),
      Type_0_recursively_references_itself_as_a_base_type: diag(2310, ts2.DiagnosticCategory.Error, "Type_0_recursively_references_itself_as_a_base_type_2310", "Type '{0}' recursively references itself as a base type."),
      An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_members: diag(2312, ts2.DiagnosticCategory.Error, "An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_me_2312", "An interface can only extend an object type or intersection of object types with statically known members."),
      Type_parameter_0_has_a_circular_constraint: diag(2313, ts2.DiagnosticCategory.Error, "Type_parameter_0_has_a_circular_constraint_2313", "Type parameter '{0}' has a circular constraint."),
      Generic_type_0_requires_1_type_argument_s: diag(2314, ts2.DiagnosticCategory.Error, "Generic_type_0_requires_1_type_argument_s_2314", "Generic type '{0}' requires {1} type argument(s)."),
      Type_0_is_not_generic: diag(2315, ts2.DiagnosticCategory.Error, "Type_0_is_not_generic_2315", "Type '{0}' is not generic."),
      Global_type_0_must_be_a_class_or_interface_type: diag(2316, ts2.DiagnosticCategory.Error, "Global_type_0_must_be_a_class_or_interface_type_2316", "Global type '{0}' must be a class or interface type."),
      Global_type_0_must_have_1_type_parameter_s: diag(2317, ts2.DiagnosticCategory.Error, "Global_type_0_must_have_1_type_parameter_s_2317", "Global type '{0}' must have {1} type parameter(s)."),
      Cannot_find_global_type_0: diag(2318, ts2.DiagnosticCategory.Error, "Cannot_find_global_type_0_2318", "Cannot find global type '{0}'."),
      Named_property_0_of_types_1_and_2_are_not_identical: diag(2319, ts2.DiagnosticCategory.Error, "Named_property_0_of_types_1_and_2_are_not_identical_2319", "Named property '{0}' of types '{1}' and '{2}' are not identical."),
      Interface_0_cannot_simultaneously_extend_types_1_and_2: diag(2320, ts2.DiagnosticCategory.Error, "Interface_0_cannot_simultaneously_extend_types_1_and_2_2320", "Interface '{0}' cannot simultaneously extend types '{1}' and '{2}'."),
      Excessive_stack_depth_comparing_types_0_and_1: diag(2321, ts2.DiagnosticCategory.Error, "Excessive_stack_depth_comparing_types_0_and_1_2321", "Excessive stack depth comparing types '{0}' and '{1}'."),
      Type_0_is_not_assignable_to_type_1: diag(2322, ts2.DiagnosticCategory.Error, "Type_0_is_not_assignable_to_type_1_2322", "Type '{0}' is not assignable to type '{1}'."),
      Cannot_redeclare_exported_variable_0: diag(2323, ts2.DiagnosticCategory.Error, "Cannot_redeclare_exported_variable_0_2323", "Cannot redeclare exported variable '{0}'."),
      Property_0_is_missing_in_type_1: diag(2324, ts2.DiagnosticCategory.Error, "Property_0_is_missing_in_type_1_2324", "Property '{0}' is missing in type '{1}'."),
      Property_0_is_private_in_type_1_but_not_in_type_2: diag(2325, ts2.DiagnosticCategory.Error, "Property_0_is_private_in_type_1_but_not_in_type_2_2325", "Property '{0}' is private in type '{1}' but not in type '{2}'."),
      Types_of_property_0_are_incompatible: diag(2326, ts2.DiagnosticCategory.Error, "Types_of_property_0_are_incompatible_2326", "Types of property '{0}' are incompatible."),
      Property_0_is_optional_in_type_1_but_required_in_type_2: diag(2327, ts2.DiagnosticCategory.Error, "Property_0_is_optional_in_type_1_but_required_in_type_2_2327", "Property '{0}' is optional in type '{1}' but required in type '{2}'."),
      Types_of_parameters_0_and_1_are_incompatible: diag(2328, ts2.DiagnosticCategory.Error, "Types_of_parameters_0_and_1_are_incompatible_2328", "Types of parameters '{0}' and '{1}' are incompatible."),
      Index_signature_for_type_0_is_missing_in_type_1: diag(2329, ts2.DiagnosticCategory.Error, "Index_signature_for_type_0_is_missing_in_type_1_2329", "Index signature for type '{0}' is missing in type '{1}'."),
      _0_and_1_index_signatures_are_incompatible: diag(2330, ts2.DiagnosticCategory.Error, "_0_and_1_index_signatures_are_incompatible_2330", "'{0}' and '{1}' index signatures are incompatible."),
      this_cannot_be_referenced_in_a_module_or_namespace_body: diag(2331, ts2.DiagnosticCategory.Error, "this_cannot_be_referenced_in_a_module_or_namespace_body_2331", "'this' cannot be referenced in a module or namespace body."),
      this_cannot_be_referenced_in_current_location: diag(2332, ts2.DiagnosticCategory.Error, "this_cannot_be_referenced_in_current_location_2332", "'this' cannot be referenced in current location."),
      this_cannot_be_referenced_in_constructor_arguments: diag(2333, ts2.DiagnosticCategory.Error, "this_cannot_be_referenced_in_constructor_arguments_2333", "'this' cannot be referenced in constructor arguments."),
      this_cannot_be_referenced_in_a_static_property_initializer: diag(2334, ts2.DiagnosticCategory.Error, "this_cannot_be_referenced_in_a_static_property_initializer_2334", "'this' cannot be referenced in a static property initializer."),
      super_can_only_be_referenced_in_a_derived_class: diag(2335, ts2.DiagnosticCategory.Error, "super_can_only_be_referenced_in_a_derived_class_2335", "'super' can only be referenced in a derived class."),
      super_cannot_be_referenced_in_constructor_arguments: diag(2336, ts2.DiagnosticCategory.Error, "super_cannot_be_referenced_in_constructor_arguments_2336", "'super' cannot be referenced in constructor arguments."),
      Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors: diag(2337, ts2.DiagnosticCategory.Error, "Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors_2337", "Super calls are not permitted outside constructors or in nested functions inside constructors."),
      super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class: diag(2338, ts2.DiagnosticCategory.Error, "super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_der_2338", "'super' property access is permitted only in a constructor, member function, or member accessor of a derived class."),
      Property_0_does_not_exist_on_type_1: diag(2339, ts2.DiagnosticCategory.Error, "Property_0_does_not_exist_on_type_1_2339", "Property '{0}' does not exist on type '{1}'."),
      Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword: diag(2340, ts2.DiagnosticCategory.Error, "Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword_2340", "Only public and protected methods of the base class are accessible via the 'super' keyword."),
      Property_0_is_private_and_only_accessible_within_class_1: diag(2341, ts2.DiagnosticCategory.Error, "Property_0_is_private_and_only_accessible_within_class_1_2341", "Property '{0}' is private and only accessible within class '{1}'."),
      This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_version_of_0: diag(2343, ts2.DiagnosticCategory.Error, "This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_ve_2343", "This syntax requires an imported helper named '{1}' which does not exist in '{0}'. Consider upgrading your version of '{0}'."),
      Type_0_does_not_satisfy_the_constraint_1: diag(2344, ts2.DiagnosticCategory.Error, "Type_0_does_not_satisfy_the_constraint_1_2344", "Type '{0}' does not satisfy the constraint '{1}'."),
      Argument_of_type_0_is_not_assignable_to_parameter_of_type_1: diag(2345, ts2.DiagnosticCategory.Error, "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345", "Argument of type '{0}' is not assignable to parameter of type '{1}'."),
      Call_target_does_not_contain_any_signatures: diag(2346, ts2.DiagnosticCategory.Error, "Call_target_does_not_contain_any_signatures_2346", "Call target does not contain any signatures."),
      Untyped_function_calls_may_not_accept_type_arguments: diag(2347, ts2.DiagnosticCategory.Error, "Untyped_function_calls_may_not_accept_type_arguments_2347", "Untyped function calls may not accept type arguments."),
      Value_of_type_0_is_not_callable_Did_you_mean_to_include_new: diag(2348, ts2.DiagnosticCategory.Error, "Value_of_type_0_is_not_callable_Did_you_mean_to_include_new_2348", "Value of type '{0}' is not callable. Did you mean to include 'new'?"),
      This_expression_is_not_callable: diag(2349, ts2.DiagnosticCategory.Error, "This_expression_is_not_callable_2349", "This expression is not callable."),
      Only_a_void_function_can_be_called_with_the_new_keyword: diag(2350, ts2.DiagnosticCategory.Error, "Only_a_void_function_can_be_called_with_the_new_keyword_2350", "Only a void function can be called with the 'new' keyword."),
      This_expression_is_not_constructable: diag(2351, ts2.DiagnosticCategory.Error, "This_expression_is_not_constructable_2351", "This expression is not constructable."),
      Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first: diag(2352, ts2.DiagnosticCategory.Error, "Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the__2352", "Conversion of type '{0}' to type '{1}' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first."),
      Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1: diag(2353, ts2.DiagnosticCategory.Error, "Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1_2353", "Object literal may only specify known properties, and '{0}' does not exist in type '{1}'."),
      This_syntax_requires_an_imported_helper_but_module_0_cannot_be_found: diag(2354, ts2.DiagnosticCategory.Error, "This_syntax_requires_an_imported_helper_but_module_0_cannot_be_found_2354", "This syntax requires an imported helper but module '{0}' cannot be found."),
      A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value: diag(2355, ts2.DiagnosticCategory.Error, "A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_2355", "A function whose declared type is neither 'void' nor 'any' must return a value."),
      An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type: diag(2356, ts2.DiagnosticCategory.Error, "An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type_2356", "An arithmetic operand must be of type 'any', 'number', 'bigint' or an enum type."),
      The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access: diag(2357, ts2.DiagnosticCategory.Error, "The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access_2357", "The operand of an increment or decrement operator must be a variable or a property access."),
      The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: diag(2358, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_paramete_2358", "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter."),
      The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type: diag(2359, ts2.DiagnosticCategory.Error, "The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_F_2359", "The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type."),
      The_left_hand_side_of_an_in_expression_must_be_a_private_identifier_or_of_type_any_string_number_or_symbol: diag(2360, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_an_in_expression_must_be_a_private_identifier_or_of_type_any_string_number_or__2360", "The left-hand side of an 'in' expression must be a private identifier or of type 'any', 'string', 'number', or 'symbol'."),
      The_right_hand_side_of_an_in_expression_must_not_be_a_primitive: diag(2361, ts2.DiagnosticCategory.Error, "The_right_hand_side_of_an_in_expression_must_not_be_a_primitive_2361", "The right-hand side of an 'in' expression must not be a primitive."),
      The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type: diag(2362, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type_2362", "The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type."),
      The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type: diag(2363, ts2.DiagnosticCategory.Error, "The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type_2363", "The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type."),
      The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access: diag(2364, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access_2364", "The left-hand side of an assignment expression must be a variable or a property access."),
      Operator_0_cannot_be_applied_to_types_1_and_2: diag(2365, ts2.DiagnosticCategory.Error, "Operator_0_cannot_be_applied_to_types_1_and_2_2365", "Operator '{0}' cannot be applied to types '{1}' and '{2}'."),
      Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined: diag(2366, ts2.DiagnosticCategory.Error, "Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined_2366", "Function lacks ending return statement and return type does not include 'undefined'."),
      This_condition_will_always_return_0_since_the_types_1_and_2_have_no_overlap: diag(2367, ts2.DiagnosticCategory.Error, "This_condition_will_always_return_0_since_the_types_1_and_2_have_no_overlap_2367", "This condition will always return '{0}' since the types '{1}' and '{2}' have no overlap."),
      Type_parameter_name_cannot_be_0: diag(2368, ts2.DiagnosticCategory.Error, "Type_parameter_name_cannot_be_0_2368", "Type parameter name cannot be '{0}'."),
      A_parameter_property_is_only_allowed_in_a_constructor_implementation: diag(2369, ts2.DiagnosticCategory.Error, "A_parameter_property_is_only_allowed_in_a_constructor_implementation_2369", "A parameter property is only allowed in a constructor implementation."),
      A_rest_parameter_must_be_of_an_array_type: diag(2370, ts2.DiagnosticCategory.Error, "A_rest_parameter_must_be_of_an_array_type_2370", "A rest parameter must be of an array type."),
      A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation: diag(2371, ts2.DiagnosticCategory.Error, "A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation_2371", "A parameter initializer is only allowed in a function or constructor implementation."),
      Parameter_0_cannot_reference_itself: diag(2372, ts2.DiagnosticCategory.Error, "Parameter_0_cannot_reference_itself_2372", "Parameter '{0}' cannot reference itself."),
      Parameter_0_cannot_reference_identifier_1_declared_after_it: diag(2373, ts2.DiagnosticCategory.Error, "Parameter_0_cannot_reference_identifier_1_declared_after_it_2373", "Parameter '{0}' cannot reference identifier '{1}' declared after it."),
      Duplicate_index_signature_for_type_0: diag(2374, ts2.DiagnosticCategory.Error, "Duplicate_index_signature_for_type_0_2374", "Duplicate index signature for type '{0}'."),
      Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties: diag(2375, ts2.DiagnosticCategory.Error, "Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefi_2375", "Type '{0}' is not assignable to type '{1}' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties."),
      A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_parameter_properties_or_private_identifiers: diag(2376, ts2.DiagnosticCategory.Error, "A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_proper_2376", "A 'super' call must be the first statement in the constructor when a class contains initialized properties, parameter properties, or private identifiers."),
      Constructors_for_derived_classes_must_contain_a_super_call: diag(2377, ts2.DiagnosticCategory.Error, "Constructors_for_derived_classes_must_contain_a_super_call_2377", "Constructors for derived classes must contain a 'super' call."),
      A_get_accessor_must_return_a_value: diag(2378, ts2.DiagnosticCategory.Error, "A_get_accessor_must_return_a_value_2378", "A 'get' accessor must return a value."),
      Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties: diag(2379, ts2.DiagnosticCategory.Error, "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_tr_2379", "Argument of type '{0}' is not assignable to parameter of type '{1}' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties."),
      The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type: diag(2380, ts2.DiagnosticCategory.Error, "The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type_2380", "The return type of a 'get' accessor must be assignable to its 'set' accessor type"),
      Overload_signatures_must_all_be_exported_or_non_exported: diag(2383, ts2.DiagnosticCategory.Error, "Overload_signatures_must_all_be_exported_or_non_exported_2383", "Overload signatures must all be exported or non-exported."),
      Overload_signatures_must_all_be_ambient_or_non_ambient: diag(2384, ts2.DiagnosticCategory.Error, "Overload_signatures_must_all_be_ambient_or_non_ambient_2384", "Overload signatures must all be ambient or non-ambient."),
      Overload_signatures_must_all_be_public_private_or_protected: diag(2385, ts2.DiagnosticCategory.Error, "Overload_signatures_must_all_be_public_private_or_protected_2385", "Overload signatures must all be public, private or protected."),
      Overload_signatures_must_all_be_optional_or_required: diag(2386, ts2.DiagnosticCategory.Error, "Overload_signatures_must_all_be_optional_or_required_2386", "Overload signatures must all be optional or required."),
      Function_overload_must_be_static: diag(2387, ts2.DiagnosticCategory.Error, "Function_overload_must_be_static_2387", "Function overload must be static."),
      Function_overload_must_not_be_static: diag(2388, ts2.DiagnosticCategory.Error, "Function_overload_must_not_be_static_2388", "Function overload must not be static."),
      Function_implementation_name_must_be_0: diag(2389, ts2.DiagnosticCategory.Error, "Function_implementation_name_must_be_0_2389", "Function implementation name must be '{0}'."),
      Constructor_implementation_is_missing: diag(2390, ts2.DiagnosticCategory.Error, "Constructor_implementation_is_missing_2390", "Constructor implementation is missing."),
      Function_implementation_is_missing_or_not_immediately_following_the_declaration: diag(2391, ts2.DiagnosticCategory.Error, "Function_implementation_is_missing_or_not_immediately_following_the_declaration_2391", "Function implementation is missing or not immediately following the declaration."),
      Multiple_constructor_implementations_are_not_allowed: diag(2392, ts2.DiagnosticCategory.Error, "Multiple_constructor_implementations_are_not_allowed_2392", "Multiple constructor implementations are not allowed."),
      Duplicate_function_implementation: diag(2393, ts2.DiagnosticCategory.Error, "Duplicate_function_implementation_2393", "Duplicate function implementation."),
      This_overload_signature_is_not_compatible_with_its_implementation_signature: diag(2394, ts2.DiagnosticCategory.Error, "This_overload_signature_is_not_compatible_with_its_implementation_signature_2394", "This overload signature is not compatible with its implementation signature."),
      Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local: diag(2395, ts2.DiagnosticCategory.Error, "Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local_2395", "Individual declarations in merged declaration '{0}' must be all exported or all local."),
      Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters: diag(2396, ts2.DiagnosticCategory.Error, "Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters_2396", "Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters."),
      Declaration_name_conflicts_with_built_in_global_identifier_0: diag(2397, ts2.DiagnosticCategory.Error, "Declaration_name_conflicts_with_built_in_global_identifier_0_2397", "Declaration name conflicts with built-in global identifier '{0}'."),
      constructor_cannot_be_used_as_a_parameter_property_name: diag(2398, ts2.DiagnosticCategory.Error, "constructor_cannot_be_used_as_a_parameter_property_name_2398", "'constructor' cannot be used as a parameter property name."),
      Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference: diag(2399, ts2.DiagnosticCategory.Error, "Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference_2399", "Duplicate identifier '_this'. Compiler uses variable declaration '_this' to capture 'this' reference."),
      Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference: diag(2400, ts2.DiagnosticCategory.Error, "Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference_2400", "Expression resolves to variable declaration '_this' that compiler uses to capture 'this' reference."),
      Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference: diag(2402, ts2.DiagnosticCategory.Error, "Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference_2402", "Expression resolves to '_super' that compiler uses to capture base class reference."),
      Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2: diag(2403, ts2.DiagnosticCategory.Error, "Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_t_2403", "Subsequent variable declarations must have the same type.  Variable '{0}' must be of type '{1}', but here has type '{2}'."),
      The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation: diag(2404, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation_2404", "The left-hand side of a 'for...in' statement cannot use a type annotation."),
      The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any: diag(2405, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any_2405", "The left-hand side of a 'for...in' statement must be of type 'string' or 'any'."),
      The_left_hand_side_of_a_for_in_statement_must_be_a_variable_or_a_property_access: diag(2406, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_in_statement_must_be_a_variable_or_a_property_access_2406", "The left-hand side of a 'for...in' statement must be a variable or a property access."),
      The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_but_here_has_type_0: diag(2407, ts2.DiagnosticCategory.Error, "The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_but_2407", "The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter, but here has type '{0}'."),
      Setters_cannot_return_a_value: diag(2408, ts2.DiagnosticCategory.Error, "Setters_cannot_return_a_value_2408", "Setters cannot return a value."),
      Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class: diag(2409, ts2.DiagnosticCategory.Error, "Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class_2409", "Return type of constructor signature must be assignable to the instance type of the class."),
      The_with_statement_is_not_supported_All_symbols_in_a_with_block_will_have_type_any: diag(2410, ts2.DiagnosticCategory.Error, "The_with_statement_is_not_supported_All_symbols_in_a_with_block_will_have_type_any_2410", "The 'with' statement is not supported. All symbols in a 'with' block will have type 'any'."),
      Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target: diag(2412, ts2.DiagnosticCategory.Error, "Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefi_2412", "Type '{0}' is not assignable to type '{1}' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the type of the target."),
      Property_0_of_type_1_is_not_assignable_to_2_index_type_3: diag(2411, ts2.DiagnosticCategory.Error, "Property_0_of_type_1_is_not_assignable_to_2_index_type_3_2411", "Property '{0}' of type '{1}' is not assignable to '{2}' index type '{3}'."),
      _0_index_type_1_is_not_assignable_to_2_index_type_3: diag(2413, ts2.DiagnosticCategory.Error, "_0_index_type_1_is_not_assignable_to_2_index_type_3_2413", "'{0}' index type '{1}' is not assignable to '{2}' index type '{3}'."),
      Class_name_cannot_be_0: diag(2414, ts2.DiagnosticCategory.Error, "Class_name_cannot_be_0_2414", "Class name cannot be '{0}'."),
      Class_0_incorrectly_extends_base_class_1: diag(2415, ts2.DiagnosticCategory.Error, "Class_0_incorrectly_extends_base_class_1_2415", "Class '{0}' incorrectly extends base class '{1}'."),
      Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2: diag(2416, ts2.DiagnosticCategory.Error, "Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2_2416", "Property '{0}' in type '{1}' is not assignable to the same property in base type '{2}'."),
      Class_static_side_0_incorrectly_extends_base_class_static_side_1: diag(2417, ts2.DiagnosticCategory.Error, "Class_static_side_0_incorrectly_extends_base_class_static_side_1_2417", "Class static side '{0}' incorrectly extends base class static side '{1}'."),
      Type_of_computed_property_s_value_is_0_which_is_not_assignable_to_type_1: diag(2418, ts2.DiagnosticCategory.Error, "Type_of_computed_property_s_value_is_0_which_is_not_assignable_to_type_1_2418", "Type of computed property's value is '{0}', which is not assignable to type '{1}'."),
      Types_of_construct_signatures_are_incompatible: diag(2419, ts2.DiagnosticCategory.Error, "Types_of_construct_signatures_are_incompatible_2419", "Types of construct signatures are incompatible."),
      Class_0_incorrectly_implements_interface_1: diag(2420, ts2.DiagnosticCategory.Error, "Class_0_incorrectly_implements_interface_1_2420", "Class '{0}' incorrectly implements interface '{1}'."),
      A_class_can_only_implement_an_object_type_or_intersection_of_object_types_with_statically_known_members: diag(2422, ts2.DiagnosticCategory.Error, "A_class_can_only_implement_an_object_type_or_intersection_of_object_types_with_statically_known_memb_2422", "A class can only implement an object type or intersection of object types with statically known members."),
      Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor: diag(2423, ts2.DiagnosticCategory.Error, "Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_access_2423", "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member accessor."),
      Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function: diag(2425, ts2.DiagnosticCategory.Error, "Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_functi_2425", "Class '{0}' defines instance member property '{1}', but extended class '{2}' defines it as instance member function."),
      Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function: diag(2426, ts2.DiagnosticCategory.Error, "Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_functi_2426", "Class '{0}' defines instance member accessor '{1}', but extended class '{2}' defines it as instance member function."),
      Interface_name_cannot_be_0: diag(2427, ts2.DiagnosticCategory.Error, "Interface_name_cannot_be_0_2427", "Interface name cannot be '{0}'."),
      All_declarations_of_0_must_have_identical_type_parameters: diag(2428, ts2.DiagnosticCategory.Error, "All_declarations_of_0_must_have_identical_type_parameters_2428", "All declarations of '{0}' must have identical type parameters."),
      Interface_0_incorrectly_extends_interface_1: diag(2430, ts2.DiagnosticCategory.Error, "Interface_0_incorrectly_extends_interface_1_2430", "Interface '{0}' incorrectly extends interface '{1}'."),
      Enum_name_cannot_be_0: diag(2431, ts2.DiagnosticCategory.Error, "Enum_name_cannot_be_0_2431", "Enum name cannot be '{0}'."),
      In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element: diag(2432, ts2.DiagnosticCategory.Error, "In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enu_2432", "In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element."),
      A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged: diag(2433, ts2.DiagnosticCategory.Error, "A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merg_2433", "A namespace declaration cannot be in a different file from a class or function with which it is merged."),
      A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged: diag(2434, ts2.DiagnosticCategory.Error, "A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged_2434", "A namespace declaration cannot be located prior to a class or function with which it is merged."),
      Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces: diag(2435, ts2.DiagnosticCategory.Error, "Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces_2435", "Ambient modules cannot be nested in other modules or namespaces."),
      Ambient_module_declaration_cannot_specify_relative_module_name: diag(2436, ts2.DiagnosticCategory.Error, "Ambient_module_declaration_cannot_specify_relative_module_name_2436", "Ambient module declaration cannot specify relative module name."),
      Module_0_is_hidden_by_a_local_declaration_with_the_same_name: diag(2437, ts2.DiagnosticCategory.Error, "Module_0_is_hidden_by_a_local_declaration_with_the_same_name_2437", "Module '{0}' is hidden by a local declaration with the same name."),
      Import_name_cannot_be_0: diag(2438, ts2.DiagnosticCategory.Error, "Import_name_cannot_be_0_2438", "Import name cannot be '{0}'."),
      Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name: diag(2439, ts2.DiagnosticCategory.Error, "Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relati_2439", "Import or export declaration in an ambient module declaration cannot reference module through relative module name."),
      Import_declaration_conflicts_with_local_declaration_of_0: diag(2440, ts2.DiagnosticCategory.Error, "Import_declaration_conflicts_with_local_declaration_of_0_2440", "Import declaration conflicts with local declaration of '{0}'."),
      Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module: diag(2441, ts2.DiagnosticCategory.Error, "Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_2441", "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module."),
      Types_have_separate_declarations_of_a_private_property_0: diag(2442, ts2.DiagnosticCategory.Error, "Types_have_separate_declarations_of_a_private_property_0_2442", "Types have separate declarations of a private property '{0}'."),
      Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2: diag(2443, ts2.DiagnosticCategory.Error, "Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2_2443", "Property '{0}' is protected but type '{1}' is not a class derived from '{2}'."),
      Property_0_is_protected_in_type_1_but_public_in_type_2: diag(2444, ts2.DiagnosticCategory.Error, "Property_0_is_protected_in_type_1_but_public_in_type_2_2444", "Property '{0}' is protected in type '{1}' but public in type '{2}'."),
      Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses: diag(2445, ts2.DiagnosticCategory.Error, "Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses_2445", "Property '{0}' is protected and only accessible within class '{1}' and its subclasses."),
      Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1_This_is_an_instance_of_class_2: diag(2446, ts2.DiagnosticCategory.Error, "Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1_This_is_an_instance_of_cl_2446", "Property '{0}' is protected and only accessible through an instance of class '{1}'. This is an instance of class '{2}'."),
      The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead: diag(2447, ts2.DiagnosticCategory.Error, "The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead_2447", "The '{0}' operator is not allowed for boolean types. Consider using '{1}' instead."),
      Block_scoped_variable_0_used_before_its_declaration: diag(2448, ts2.DiagnosticCategory.Error, "Block_scoped_variable_0_used_before_its_declaration_2448", "Block-scoped variable '{0}' used before its declaration."),
      Class_0_used_before_its_declaration: diag(2449, ts2.DiagnosticCategory.Error, "Class_0_used_before_its_declaration_2449", "Class '{0}' used before its declaration."),
      Enum_0_used_before_its_declaration: diag(2450, ts2.DiagnosticCategory.Error, "Enum_0_used_before_its_declaration_2450", "Enum '{0}' used before its declaration."),
      Cannot_redeclare_block_scoped_variable_0: diag(2451, ts2.DiagnosticCategory.Error, "Cannot_redeclare_block_scoped_variable_0_2451", "Cannot redeclare block-scoped variable '{0}'."),
      An_enum_member_cannot_have_a_numeric_name: diag(2452, ts2.DiagnosticCategory.Error, "An_enum_member_cannot_have_a_numeric_name_2452", "An enum member cannot have a numeric name."),
      Variable_0_is_used_before_being_assigned: diag(2454, ts2.DiagnosticCategory.Error, "Variable_0_is_used_before_being_assigned_2454", "Variable '{0}' is used before being assigned."),
      Type_alias_0_circularly_references_itself: diag(2456, ts2.DiagnosticCategory.Error, "Type_alias_0_circularly_references_itself_2456", "Type alias '{0}' circularly references itself."),
      Type_alias_name_cannot_be_0: diag(2457, ts2.DiagnosticCategory.Error, "Type_alias_name_cannot_be_0_2457", "Type alias name cannot be '{0}'."),
      An_AMD_module_cannot_have_multiple_name_assignments: diag(2458, ts2.DiagnosticCategory.Error, "An_AMD_module_cannot_have_multiple_name_assignments_2458", "An AMD module cannot have multiple name assignments."),
      Module_0_declares_1_locally_but_it_is_not_exported: diag(2459, ts2.DiagnosticCategory.Error, "Module_0_declares_1_locally_but_it_is_not_exported_2459", "Module '{0}' declares '{1}' locally, but it is not exported."),
      Module_0_declares_1_locally_but_it_is_exported_as_2: diag(2460, ts2.DiagnosticCategory.Error, "Module_0_declares_1_locally_but_it_is_exported_as_2_2460", "Module '{0}' declares '{1}' locally, but it is exported as '{2}'."),
      Type_0_is_not_an_array_type: diag(2461, ts2.DiagnosticCategory.Error, "Type_0_is_not_an_array_type_2461", "Type '{0}' is not an array type."),
      A_rest_element_must_be_last_in_a_destructuring_pattern: diag(2462, ts2.DiagnosticCategory.Error, "A_rest_element_must_be_last_in_a_destructuring_pattern_2462", "A rest element must be last in a destructuring pattern."),
      A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: diag(2463, ts2.DiagnosticCategory.Error, "A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature_2463", "A binding pattern parameter cannot be optional in an implementation signature."),
      A_computed_property_name_must_be_of_type_string_number_symbol_or_any: diag(2464, ts2.DiagnosticCategory.Error, "A_computed_property_name_must_be_of_type_string_number_symbol_or_any_2464", "A computed property name must be of type 'string', 'number', 'symbol', or 'any'."),
      this_cannot_be_referenced_in_a_computed_property_name: diag(2465, ts2.DiagnosticCategory.Error, "this_cannot_be_referenced_in_a_computed_property_name_2465", "'this' cannot be referenced in a computed property name."),
      super_cannot_be_referenced_in_a_computed_property_name: diag(2466, ts2.DiagnosticCategory.Error, "super_cannot_be_referenced_in_a_computed_property_name_2466", "'super' cannot be referenced in a computed property name."),
      A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: diag(2467, ts2.DiagnosticCategory.Error, "A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type_2467", "A computed property name cannot reference a type parameter from its containing type."),
      Cannot_find_global_value_0: diag(2468, ts2.DiagnosticCategory.Error, "Cannot_find_global_value_0_2468", "Cannot find global value '{0}'."),
      The_0_operator_cannot_be_applied_to_type_symbol: diag(2469, ts2.DiagnosticCategory.Error, "The_0_operator_cannot_be_applied_to_type_symbol_2469", "The '{0}' operator cannot be applied to type 'symbol'."),
      Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher: diag(2472, ts2.DiagnosticCategory.Error, "Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher_2472", "Spread operator in 'new' expressions is only available when targeting ECMAScript 5 and higher."),
      Enum_declarations_must_all_be_const_or_non_const: diag(2473, ts2.DiagnosticCategory.Error, "Enum_declarations_must_all_be_const_or_non_const_2473", "Enum declarations must all be const or non-const."),
      const_enum_member_initializers_can_only_contain_literal_values_and_other_computed_enum_values: diag(2474, ts2.DiagnosticCategory.Error, "const_enum_member_initializers_can_only_contain_literal_values_and_other_computed_enum_values_2474", "const enum member initializers can only contain literal values and other computed enum values."),
      const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment_or_type_query: diag(2475, ts2.DiagnosticCategory.Error, "const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_im_2475", "'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment or type query."),
      A_const_enum_member_can_only_be_accessed_using_a_string_literal: diag(2476, ts2.DiagnosticCategory.Error, "A_const_enum_member_can_only_be_accessed_using_a_string_literal_2476", "A const enum member can only be accessed using a string literal."),
      const_enum_member_initializer_was_evaluated_to_a_non_finite_value: diag(2477, ts2.DiagnosticCategory.Error, "const_enum_member_initializer_was_evaluated_to_a_non_finite_value_2477", "'const' enum member initializer was evaluated to a non-finite value."),
      const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN: diag(2478, ts2.DiagnosticCategory.Error, "const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN_2478", "'const' enum member initializer was evaluated to disallowed value 'NaN'."),
      let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: diag(2480, ts2.DiagnosticCategory.Error, "let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations_2480", "'let' is not allowed to be used as a name in 'let' or 'const' declarations."),
      Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: diag(2481, ts2.DiagnosticCategory.Error, "Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1_2481", "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'."),
      The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: diag(2483, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation_2483", "The left-hand side of a 'for...of' statement cannot use a type annotation."),
      Export_declaration_conflicts_with_exported_declaration_of_0: diag(2484, ts2.DiagnosticCategory.Error, "Export_declaration_conflicts_with_exported_declaration_of_0_2484", "Export declaration conflicts with exported declaration of '{0}'."),
      The_left_hand_side_of_a_for_of_statement_must_be_a_variable_or_a_property_access: diag(2487, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_of_statement_must_be_a_variable_or_a_property_access_2487", "The left-hand side of a 'for...of' statement must be a variable or a property access."),
      Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator: diag(2488, ts2.DiagnosticCategory.Error, "Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator_2488", "Type '{0}' must have a '[Symbol.iterator]()' method that returns an iterator."),
      An_iterator_must_have_a_next_method: diag(2489, ts2.DiagnosticCategory.Error, "An_iterator_must_have_a_next_method_2489", "An iterator must have a 'next()' method."),
      The_type_returned_by_the_0_method_of_an_iterator_must_have_a_value_property: diag(2490, ts2.DiagnosticCategory.Error, "The_type_returned_by_the_0_method_of_an_iterator_must_have_a_value_property_2490", "The type returned by the '{0}()' method of an iterator must have a 'value' property."),
      The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: diag(2491, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491", "The left-hand side of a 'for...in' statement cannot be a destructuring pattern."),
      Cannot_redeclare_identifier_0_in_catch_clause: diag(2492, ts2.DiagnosticCategory.Error, "Cannot_redeclare_identifier_0_in_catch_clause_2492", "Cannot redeclare identifier '{0}' in catch clause."),
      Tuple_type_0_of_length_1_has_no_element_at_index_2: diag(2493, ts2.DiagnosticCategory.Error, "Tuple_type_0_of_length_1_has_no_element_at_index_2_2493", "Tuple type '{0}' of length '{1}' has no element at index '{2}'."),
      Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: diag(2494, ts2.DiagnosticCategory.Error, "Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher_2494", "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher."),
      Type_0_is_not_an_array_type_or_a_string_type: diag(2495, ts2.DiagnosticCategory.Error, "Type_0_is_not_an_array_type_or_a_string_type_2495", "Type '{0}' is not an array type or a string type."),
      The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression: diag(2496, ts2.DiagnosticCategory.Error, "The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_stand_2496", "The 'arguments' object cannot be referenced in an arrow function in ES3 and ES5. Consider using a standard function expression."),
      This_module_can_only_be_referenced_with_ECMAScript_imports_Slashexports_by_turning_on_the_0_flag_and_referencing_its_default_export: diag(2497, ts2.DiagnosticCategory.Error, "This_module_can_only_be_referenced_with_ECMAScript_imports_Slashexports_by_turning_on_the_0_flag_and_2497", "This module can only be referenced with ECMAScript imports/exports by turning on the '{0}' flag and referencing its default export."),
      Module_0_uses_export_and_cannot_be_used_with_export_Asterisk: diag(2498, ts2.DiagnosticCategory.Error, "Module_0_uses_export_and_cannot_be_used_with_export_Asterisk_2498", "Module '{0}' uses 'export =' and cannot be used with 'export *'."),
      An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments: diag(2499, ts2.DiagnosticCategory.Error, "An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments_2499", "An interface can only extend an identifier/qualified-name with optional type arguments."),
      A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments: diag(2500, ts2.DiagnosticCategory.Error, "A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments_2500", "A class can only implement an identifier/qualified-name with optional type arguments."),
      A_rest_element_cannot_contain_a_binding_pattern: diag(2501, ts2.DiagnosticCategory.Error, "A_rest_element_cannot_contain_a_binding_pattern_2501", "A rest element cannot contain a binding pattern."),
      _0_is_referenced_directly_or_indirectly_in_its_own_type_annotation: diag(2502, ts2.DiagnosticCategory.Error, "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502", "'{0}' is referenced directly or indirectly in its own type annotation."),
      Cannot_find_namespace_0: diag(2503, ts2.DiagnosticCategory.Error, "Cannot_find_namespace_0_2503", "Cannot find namespace '{0}'."),
      Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator: diag(2504, ts2.DiagnosticCategory.Error, "Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator_2504", "Type '{0}' must have a '[Symbol.asyncIterator]()' method that returns an async iterator."),
      A_generator_cannot_have_a_void_type_annotation: diag(2505, ts2.DiagnosticCategory.Error, "A_generator_cannot_have_a_void_type_annotation_2505", "A generator cannot have a 'void' type annotation."),
      _0_is_referenced_directly_or_indirectly_in_its_own_base_expression: diag(2506, ts2.DiagnosticCategory.Error, "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506", "'{0}' is referenced directly or indirectly in its own base expression."),
      Type_0_is_not_a_constructor_function_type: diag(2507, ts2.DiagnosticCategory.Error, "Type_0_is_not_a_constructor_function_type_2507", "Type '{0}' is not a constructor function type."),
      No_base_constructor_has_the_specified_number_of_type_arguments: diag(2508, ts2.DiagnosticCategory.Error, "No_base_constructor_has_the_specified_number_of_type_arguments_2508", "No base constructor has the specified number of type arguments."),
      Base_constructor_return_type_0_is_not_an_object_type_or_intersection_of_object_types_with_statically_known_members: diag(2509, ts2.DiagnosticCategory.Error, "Base_constructor_return_type_0_is_not_an_object_type_or_intersection_of_object_types_with_statically_2509", "Base constructor return type '{0}' is not an object type or intersection of object types with statically known members."),
      Base_constructors_must_all_have_the_same_return_type: diag(2510, ts2.DiagnosticCategory.Error, "Base_constructors_must_all_have_the_same_return_type_2510", "Base constructors must all have the same return type."),
      Cannot_create_an_instance_of_an_abstract_class: diag(2511, ts2.DiagnosticCategory.Error, "Cannot_create_an_instance_of_an_abstract_class_2511", "Cannot create an instance of an abstract class."),
      Overload_signatures_must_all_be_abstract_or_non_abstract: diag(2512, ts2.DiagnosticCategory.Error, "Overload_signatures_must_all_be_abstract_or_non_abstract_2512", "Overload signatures must all be abstract or non-abstract."),
      Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression: diag(2513, ts2.DiagnosticCategory.Error, "Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression_2513", "Abstract method '{0}' in class '{1}' cannot be accessed via super expression."),
      Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2: diag(2515, ts2.DiagnosticCategory.Error, "Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2_2515", "Non-abstract class '{0}' does not implement inherited abstract member '{1}' from class '{2}'."),
      All_declarations_of_an_abstract_method_must_be_consecutive: diag(2516, ts2.DiagnosticCategory.Error, "All_declarations_of_an_abstract_method_must_be_consecutive_2516", "All declarations of an abstract method must be consecutive."),
      Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type: diag(2517, ts2.DiagnosticCategory.Error, "Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type_2517", "Cannot assign an abstract constructor type to a non-abstract constructor type."),
      A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard: diag(2518, ts2.DiagnosticCategory.Error, "A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard_2518", "A 'this'-based type guard is not compatible with a parameter-based type guard."),
      An_async_iterator_must_have_a_next_method: diag(2519, ts2.DiagnosticCategory.Error, "An_async_iterator_must_have_a_next_method_2519", "An async iterator must have a 'next()' method."),
      Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions: diag(2520, ts2.DiagnosticCategory.Error, "Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions_2520", "Duplicate identifier '{0}'. Compiler uses declaration '{1}' to support async functions."),
      The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_using_a_standard_function_or_method: diag(2522, ts2.DiagnosticCategory.Error, "The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_usi_2522", "The 'arguments' object cannot be referenced in an async function or method in ES3 and ES5. Consider using a standard function or method."),
      yield_expressions_cannot_be_used_in_a_parameter_initializer: diag(2523, ts2.DiagnosticCategory.Error, "yield_expressions_cannot_be_used_in_a_parameter_initializer_2523", "'yield' expressions cannot be used in a parameter initializer."),
      await_expressions_cannot_be_used_in_a_parameter_initializer: diag(2524, ts2.DiagnosticCategory.Error, "await_expressions_cannot_be_used_in_a_parameter_initializer_2524", "'await' expressions cannot be used in a parameter initializer."),
      Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value: diag(2525, ts2.DiagnosticCategory.Error, "Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value_2525", "Initializer provides no value for this binding element and the binding element has no default value."),
      A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface: diag(2526, ts2.DiagnosticCategory.Error, "A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface_2526", "A 'this' type is available only in a non-static member of a class or interface."),
      The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary: diag(2527, ts2.DiagnosticCategory.Error, "The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary_2527", "The inferred type of '{0}' references an inaccessible '{1}' type. A type annotation is necessary."),
      A_module_cannot_have_multiple_default_exports: diag(2528, ts2.DiagnosticCategory.Error, "A_module_cannot_have_multiple_default_exports_2528", "A module cannot have multiple default exports."),
      Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_functions: diag(2529, ts2.DiagnosticCategory.Error, "Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_func_2529", "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module containing async functions."),
      Property_0_is_incompatible_with_index_signature: diag(2530, ts2.DiagnosticCategory.Error, "Property_0_is_incompatible_with_index_signature_2530", "Property '{0}' is incompatible with index signature."),
      Object_is_possibly_null: diag(2531, ts2.DiagnosticCategory.Error, "Object_is_possibly_null_2531", "Object is possibly 'null'."),
      Object_is_possibly_undefined: diag(2532, ts2.DiagnosticCategory.Error, "Object_is_possibly_undefined_2532", "Object is possibly 'undefined'."),
      Object_is_possibly_null_or_undefined: diag(2533, ts2.DiagnosticCategory.Error, "Object_is_possibly_null_or_undefined_2533", "Object is possibly 'null' or 'undefined'."),
      A_function_returning_never_cannot_have_a_reachable_end_point: diag(2534, ts2.DiagnosticCategory.Error, "A_function_returning_never_cannot_have_a_reachable_end_point_2534", "A function returning 'never' cannot have a reachable end point."),
      Enum_type_0_has_members_with_initializers_that_are_not_literals: diag(2535, ts2.DiagnosticCategory.Error, "Enum_type_0_has_members_with_initializers_that_are_not_literals_2535", "Enum type '{0}' has members with initializers that are not literals."),
      Type_0_cannot_be_used_to_index_type_1: diag(2536, ts2.DiagnosticCategory.Error, "Type_0_cannot_be_used_to_index_type_1_2536", "Type '{0}' cannot be used to index type '{1}'."),
      Type_0_has_no_matching_index_signature_for_type_1: diag(2537, ts2.DiagnosticCategory.Error, "Type_0_has_no_matching_index_signature_for_type_1_2537", "Type '{0}' has no matching index signature for type '{1}'."),
      Type_0_cannot_be_used_as_an_index_type: diag(2538, ts2.DiagnosticCategory.Error, "Type_0_cannot_be_used_as_an_index_type_2538", "Type '{0}' cannot be used as an index type."),
      Cannot_assign_to_0_because_it_is_not_a_variable: diag(2539, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_not_a_variable_2539", "Cannot assign to '{0}' because it is not a variable."),
      Cannot_assign_to_0_because_it_is_a_read_only_property: diag(2540, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_a_read_only_property_2540", "Cannot assign to '{0}' because it is a read-only property."),
      Index_signature_in_type_0_only_permits_reading: diag(2542, ts2.DiagnosticCategory.Error, "Index_signature_in_type_0_only_permits_reading_2542", "Index signature in type '{0}' only permits reading."),
      Duplicate_identifier_newTarget_Compiler_uses_variable_declaration_newTarget_to_capture_new_target_meta_property_reference: diag(2543, ts2.DiagnosticCategory.Error, "Duplicate_identifier_newTarget_Compiler_uses_variable_declaration_newTarget_to_capture_new_target_me_2543", "Duplicate identifier '_newTarget'. Compiler uses variable declaration '_newTarget' to capture 'new.target' meta-property reference."),
      Expression_resolves_to_variable_declaration_newTarget_that_compiler_uses_to_capture_new_target_meta_property_reference: diag(2544, ts2.DiagnosticCategory.Error, "Expression_resolves_to_variable_declaration_newTarget_that_compiler_uses_to_capture_new_target_meta__2544", "Expression resolves to variable declaration '_newTarget' that compiler uses to capture 'new.target' meta-property reference."),
      A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any: diag(2545, ts2.DiagnosticCategory.Error, "A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any_2545", "A mixin class must have a constructor with a single rest parameter of type 'any[]'."),
      The_type_returned_by_the_0_method_of_an_async_iterator_must_be_a_promise_for_a_type_with_a_value_property: diag(2547, ts2.DiagnosticCategory.Error, "The_type_returned_by_the_0_method_of_an_async_iterator_must_be_a_promise_for_a_type_with_a_value_pro_2547", "The type returned by the '{0}()' method of an async iterator must be a promise for a type with a 'value' property."),
      Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator: diag(2548, ts2.DiagnosticCategory.Error, "Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator_2548", "Type '{0}' is not an array type or does not have a '[Symbol.iterator]()' method that returns an iterator."),
      Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator: diag(2549, ts2.DiagnosticCategory.Error, "Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns__2549", "Type '{0}' is not an array type or a string type or does not have a '[Symbol.iterator]()' method that returns an iterator."),
      Property_0_does_not_exist_on_type_1_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2_or_later: diag(2550, ts2.DiagnosticCategory.Error, "Property_0_does_not_exist_on_type_1_Do_you_need_to_change_your_target_library_Try_changing_the_lib_c_2550", "Property '{0}' does not exist on type '{1}'. Do you need to change your target library? Try changing the 'lib' compiler option to '{2}' or later."),
      Property_0_does_not_exist_on_type_1_Did_you_mean_2: diag(2551, ts2.DiagnosticCategory.Error, "Property_0_does_not_exist_on_type_1_Did_you_mean_2_2551", "Property '{0}' does not exist on type '{1}'. Did you mean '{2}'?"),
      Cannot_find_name_0_Did_you_mean_1: diag(2552, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Did_you_mean_1_2552", "Cannot find name '{0}'. Did you mean '{1}'?"),
      Computed_values_are_not_permitted_in_an_enum_with_string_valued_members: diag(2553, ts2.DiagnosticCategory.Error, "Computed_values_are_not_permitted_in_an_enum_with_string_valued_members_2553", "Computed values are not permitted in an enum with string valued members."),
      Expected_0_arguments_but_got_1: diag(2554, ts2.DiagnosticCategory.Error, "Expected_0_arguments_but_got_1_2554", "Expected {0} arguments, but got {1}."),
      Expected_at_least_0_arguments_but_got_1: diag(2555, ts2.DiagnosticCategory.Error, "Expected_at_least_0_arguments_but_got_1_2555", "Expected at least {0} arguments, but got {1}."),
      A_spread_argument_must_either_have_a_tuple_type_or_be_passed_to_a_rest_parameter: diag(2556, ts2.DiagnosticCategory.Error, "A_spread_argument_must_either_have_a_tuple_type_or_be_passed_to_a_rest_parameter_2556", "A spread argument must either have a tuple type or be passed to a rest parameter."),
      Expected_0_type_arguments_but_got_1: diag(2558, ts2.DiagnosticCategory.Error, "Expected_0_type_arguments_but_got_1_2558", "Expected {0} type arguments, but got {1}."),
      Type_0_has_no_properties_in_common_with_type_1: diag(2559, ts2.DiagnosticCategory.Error, "Type_0_has_no_properties_in_common_with_type_1_2559", "Type '{0}' has no properties in common with type '{1}'."),
      Value_of_type_0_has_no_properties_in_common_with_type_1_Did_you_mean_to_call_it: diag(2560, ts2.DiagnosticCategory.Error, "Value_of_type_0_has_no_properties_in_common_with_type_1_Did_you_mean_to_call_it_2560", "Value of type '{0}' has no properties in common with type '{1}'. Did you mean to call it?"),
      Object_literal_may_only_specify_known_properties_but_0_does_not_exist_in_type_1_Did_you_mean_to_write_2: diag(2561, ts2.DiagnosticCategory.Error, "Object_literal_may_only_specify_known_properties_but_0_does_not_exist_in_type_1_Did_you_mean_to_writ_2561", "Object literal may only specify known properties, but '{0}' does not exist in type '{1}'. Did you mean to write '{2}'?"),
      Base_class_expressions_cannot_reference_class_type_parameters: diag(2562, ts2.DiagnosticCategory.Error, "Base_class_expressions_cannot_reference_class_type_parameters_2562", "Base class expressions cannot reference class type parameters."),
      The_containing_function_or_module_body_is_too_large_for_control_flow_analysis: diag(2563, ts2.DiagnosticCategory.Error, "The_containing_function_or_module_body_is_too_large_for_control_flow_analysis_2563", "The containing function or module body is too large for control flow analysis."),
      Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor: diag(2564, ts2.DiagnosticCategory.Error, "Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor_2564", "Property '{0}' has no initializer and is not definitely assigned in the constructor."),
      Property_0_is_used_before_being_assigned: diag(2565, ts2.DiagnosticCategory.Error, "Property_0_is_used_before_being_assigned_2565", "Property '{0}' is used before being assigned."),
      A_rest_element_cannot_have_a_property_name: diag(2566, ts2.DiagnosticCategory.Error, "A_rest_element_cannot_have_a_property_name_2566", "A rest element cannot have a property name."),
      Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations: diag(2567, ts2.DiagnosticCategory.Error, "Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations_2567", "Enum declarations can only merge with namespace or other enum declarations."),
      Property_0_may_not_exist_on_type_1_Did_you_mean_2: diag(2568, ts2.DiagnosticCategory.Error, "Property_0_may_not_exist_on_type_1_Did_you_mean_2_2568", "Property '{0}' may not exist on type '{1}'. Did you mean '{2}'?"),
      Type_0_is_not_an_array_type_or_a_string_type_Use_compiler_option_downlevelIteration_to_allow_iterating_of_iterators: diag(2569, ts2.DiagnosticCategory.Error, "Type_0_is_not_an_array_type_or_a_string_type_Use_compiler_option_downlevelIteration_to_allow_iterati_2569", "Type '{0}' is not an array type or a string type. Use compiler option '--downlevelIteration' to allow iterating of iterators."),
      Could_not_find_name_0_Did_you_mean_1: diag(2570, ts2.DiagnosticCategory.Error, "Could_not_find_name_0_Did_you_mean_1_2570", "Could not find name '{0}'. Did you mean '{1}'?"),
      Object_is_of_type_unknown: diag(2571, ts2.DiagnosticCategory.Error, "Object_is_of_type_unknown_2571", "Object is of type 'unknown'."),
      A_rest_element_type_must_be_an_array_type: diag(2574, ts2.DiagnosticCategory.Error, "A_rest_element_type_must_be_an_array_type_2574", "A rest element type must be an array type."),
      No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments: diag(2575, ts2.DiagnosticCategory.Error, "No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments_2575", "No overload expects {0} arguments, but overloads do exist that expect either {1} or {2} arguments."),
      Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead: diag(2576, ts2.DiagnosticCategory.Error, "Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead_2576", "Property '{0}' does not exist on type '{1}'. Did you mean to access the static member '{2}' instead?"),
      Return_type_annotation_circularly_references_itself: diag(2577, ts2.DiagnosticCategory.Error, "Return_type_annotation_circularly_references_itself_2577", "Return type annotation circularly references itself."),
      Unused_ts_expect_error_directive: diag(2578, ts2.DiagnosticCategory.Error, "Unused_ts_expect_error_directive_2578", "Unused '@ts-expect-error' directive."),
      Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode: diag(2580, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashno_2580", "Cannot find name '{0}'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node`."),
      Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery: diag(2581, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slash_2581", "Cannot find name '{0}'. Do you need to install type definitions for jQuery? Try `npm i --save-dev @types/jquery`."),
      Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha: diag(2582, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_type_2582", "Cannot find name '{0}'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha`."),
      Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_1_or_later: diag(2583, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2583", "Cannot find name '{0}'. Do you need to change your target library? Try changing the 'lib' compiler option to '{1}' or later."),
      Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_include_dom: diag(2584, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2584", "Cannot find name '{0}'. Do you need to change your target library? Try changing the 'lib' compiler option to include 'dom'."),
      _0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_es2015_or_later: diag(2585, ts2.DiagnosticCategory.Error, "_0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Do_you_need_to_change_your_target_library_2585", "'{0}' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the 'lib' compiler option to es2015 or later."),
      Cannot_assign_to_0_because_it_is_a_constant: diag(2588, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_a_constant_2588", "Cannot assign to '{0}' because it is a constant."),
      Type_instantiation_is_excessively_deep_and_possibly_infinite: diag(2589, ts2.DiagnosticCategory.Error, "Type_instantiation_is_excessively_deep_and_possibly_infinite_2589", "Type instantiation is excessively deep and possibly infinite."),
      Expression_produces_a_union_type_that_is_too_complex_to_represent: diag(2590, ts2.DiagnosticCategory.Error, "Expression_produces_a_union_type_that_is_too_complex_to_represent_2590", "Expression produces a union type that is too complex to represent."),
      Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig: diag(2591, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashno_2591", "Cannot find name '{0}'. Do you need to install type definitions for node? Try `npm i --save-dev @types/node` and then add 'node' to the types field in your tsconfig."),
      Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery_and_then_add_jquery_to_the_types_field_in_your_tsconfig: diag(2592, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slash_2592", "Cannot find name '{0}'. Do you need to install type definitions for jQuery? Try `npm i --save-dev @types/jquery` and then add 'jquery' to the types field in your tsconfig."),
      Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha_and_then_add_jest_or_mocha_to_the_types_field_in_your_tsconfig: diag(2593, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_type_2593", "Cannot find name '{0}'. Do you need to install type definitions for a test runner? Try `npm i --save-dev @types/jest` or `npm i --save-dev @types/mocha` and then add 'jest' or 'mocha' to the types field in your tsconfig."),
      This_module_is_declared_with_using_export_and_can_only_be_used_with_a_default_import_when_using_the_0_flag: diag(2594, ts2.DiagnosticCategory.Error, "This_module_is_declared_with_using_export_and_can_only_be_used_with_a_default_import_when_using_the__2594", "This module is declared with using 'export =', and can only be used with a default import when using the '{0}' flag."),
      _0_can_only_be_imported_by_using_a_default_import: diag(2595, ts2.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_a_default_import_2595", "'{0}' can only be imported by using a default import."),
      _0_can_only_be_imported_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2596, ts2.DiagnosticCategory.Error, "_0_can_only_be_imported_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import_2596", "'{0}' can only be imported by turning on the 'esModuleInterop' flag and using a default import."),
      _0_can_only_be_imported_by_using_a_require_call_or_by_using_a_default_import: diag(2597, ts2.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_a_require_call_or_by_using_a_default_import_2597", "'{0}' can only be imported by using a 'require' call or by using a default import."),
      _0_can_only_be_imported_by_using_a_require_call_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2598, ts2.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_a_require_call_or_by_turning_on_the_esModuleInterop_flag_and_using__2598", "'{0}' can only be imported by using a 'require' call or by turning on the 'esModuleInterop' flag and using a default import."),
      JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist: diag(2602, ts2.DiagnosticCategory.Error, "JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist_2602", "JSX element implicitly has type 'any' because the global type 'JSX.Element' does not exist."),
      Property_0_in_type_1_is_not_assignable_to_type_2: diag(2603, ts2.DiagnosticCategory.Error, "Property_0_in_type_1_is_not_assignable_to_type_2_2603", "Property '{0}' in type '{1}' is not assignable to type '{2}'."),
      JSX_element_type_0_does_not_have_any_construct_or_call_signatures: diag(2604, ts2.DiagnosticCategory.Error, "JSX_element_type_0_does_not_have_any_construct_or_call_signatures_2604", "JSX element type '{0}' does not have any construct or call signatures."),
      Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property: diag(2606, ts2.DiagnosticCategory.Error, "Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property_2606", "Property '{0}' of JSX spread attribute is not assignable to target property."),
      JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property: diag(2607, ts2.DiagnosticCategory.Error, "JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property_2607", "JSX element class does not support attributes because it does not have a '{0}' property."),
      The_global_type_JSX_0_may_not_have_more_than_one_property: diag(2608, ts2.DiagnosticCategory.Error, "The_global_type_JSX_0_may_not_have_more_than_one_property_2608", "The global type 'JSX.{0}' may not have more than one property."),
      JSX_spread_child_must_be_an_array_type: diag(2609, ts2.DiagnosticCategory.Error, "JSX_spread_child_must_be_an_array_type_2609", "JSX spread child must be an array type."),
      _0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property: diag(2610, ts2.DiagnosticCategory.Error, "_0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property_2610", "'{0}' is defined as an accessor in class '{1}', but is overridden here in '{2}' as an instance property."),
      _0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor: diag(2611, ts2.DiagnosticCategory.Error, "_0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor_2611", "'{0}' is defined as a property in class '{1}', but is overridden here in '{2}' as an accessor."),
      Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration: diag(2612, ts2.DiagnosticCategory.Error, "Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_2612", "Property '{0}' will overwrite the base property in '{1}'. If this is intentional, add an initializer. Otherwise, add a 'declare' modifier or remove the redundant declaration."),
      Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead: diag(2613, ts2.DiagnosticCategory.Error, "Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead_2613", "Module '{0}' has no default export. Did you mean to use 'import { {1} } from {0}' instead?"),
      Module_0_has_no_exported_member_1_Did_you_mean_to_use_import_1_from_0_instead: diag(2614, ts2.DiagnosticCategory.Error, "Module_0_has_no_exported_member_1_Did_you_mean_to_use_import_1_from_0_instead_2614", "Module '{0}' has no exported member '{1}'. Did you mean to use 'import {1} from {0}' instead?"),
      Type_of_property_0_circularly_references_itself_in_mapped_type_1: diag(2615, ts2.DiagnosticCategory.Error, "Type_of_property_0_circularly_references_itself_in_mapped_type_1_2615", "Type of property '{0}' circularly references itself in mapped type '{1}'."),
      _0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import: diag(2616, ts2.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import_2616", "'{0}' can only be imported by using 'import {1} = require({2})' or a default import."),
      _0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import: diag(2617, ts2.DiagnosticCategory.Error, "_0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_us_2617", "'{0}' can only be imported by using 'import {1} = require({2})' or by turning on the 'esModuleInterop' flag and using a default import."),
      Source_has_0_element_s_but_target_requires_1: diag(2618, ts2.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_requires_1_2618", "Source has {0} element(s) but target requires {1}."),
      Source_has_0_element_s_but_target_allows_only_1: diag(2619, ts2.DiagnosticCategory.Error, "Source_has_0_element_s_but_target_allows_only_1_2619", "Source has {0} element(s) but target allows only {1}."),
      Target_requires_0_element_s_but_source_may_have_fewer: diag(2620, ts2.DiagnosticCategory.Error, "Target_requires_0_element_s_but_source_may_have_fewer_2620", "Target requires {0} element(s) but source may have fewer."),
      Target_allows_only_0_element_s_but_source_may_have_more: diag(2621, ts2.DiagnosticCategory.Error, "Target_allows_only_0_element_s_but_source_may_have_more_2621", "Target allows only {0} element(s) but source may have more."),
      Source_provides_no_match_for_required_element_at_position_0_in_target: diag(2623, ts2.DiagnosticCategory.Error, "Source_provides_no_match_for_required_element_at_position_0_in_target_2623", "Source provides no match for required element at position {0} in target."),
      Source_provides_no_match_for_variadic_element_at_position_0_in_target: diag(2624, ts2.DiagnosticCategory.Error, "Source_provides_no_match_for_variadic_element_at_position_0_in_target_2624", "Source provides no match for variadic element at position {0} in target."),
      Variadic_element_at_position_0_in_source_does_not_match_element_at_position_1_in_target: diag(2625, ts2.DiagnosticCategory.Error, "Variadic_element_at_position_0_in_source_does_not_match_element_at_position_1_in_target_2625", "Variadic element at position {0} in source does not match element at position {1} in target."),
      Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target: diag(2626, ts2.DiagnosticCategory.Error, "Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target_2626", "Type at position {0} in source is not compatible with type at position {1} in target."),
      Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target: diag(2627, ts2.DiagnosticCategory.Error, "Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target_2627", "Type at positions {0} through {1} in source is not compatible with type at position {2} in target."),
      Cannot_assign_to_0_because_it_is_an_enum: diag(2628, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_an_enum_2628", "Cannot assign to '{0}' because it is an enum."),
      Cannot_assign_to_0_because_it_is_a_class: diag(2629, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_a_class_2629", "Cannot assign to '{0}' because it is a class."),
      Cannot_assign_to_0_because_it_is_a_function: diag(2630, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_a_function_2630", "Cannot assign to '{0}' because it is a function."),
      Cannot_assign_to_0_because_it_is_a_namespace: diag(2631, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_a_namespace_2631", "Cannot assign to '{0}' because it is a namespace."),
      Cannot_assign_to_0_because_it_is_an_import: diag(2632, ts2.DiagnosticCategory.Error, "Cannot_assign_to_0_because_it_is_an_import_2632", "Cannot assign to '{0}' because it is an import."),
      JSX_property_access_expressions_cannot_include_JSX_namespace_names: diag(2633, ts2.DiagnosticCategory.Error, "JSX_property_access_expressions_cannot_include_JSX_namespace_names_2633", "JSX property access expressions cannot include JSX namespace names"),
      _0_index_signatures_are_incompatible: diag(2634, ts2.DiagnosticCategory.Error, "_0_index_signatures_are_incompatible_2634", "'{0}' index signatures are incompatible."),
      Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity: diag(2649, ts2.DiagnosticCategory.Error, "Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity_2649", "Cannot augment module '{0}' with value exports because it resolves to a non-module entity."),
      A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: diag(2651, ts2.DiagnosticCategory.Error, "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums."),
      Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: diag(2652, ts2.DiagnosticCategory.Error, "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead."),
      Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1: diag(2653, ts2.DiagnosticCategory.Error, "Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1_2653", "Non-abstract class expression does not implement inherited abstract member '{0}' from class '{1}'."),
      JSX_expressions_must_have_one_parent_element: diag(2657, ts2.DiagnosticCategory.Error, "JSX_expressions_must_have_one_parent_element_2657", "JSX expressions must have one parent element."),
      Type_0_provides_no_match_for_the_signature_1: diag(2658, ts2.DiagnosticCategory.Error, "Type_0_provides_no_match_for_the_signature_1_2658", "Type '{0}' provides no match for the signature '{1}'."),
      super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_higher: diag(2659, ts2.DiagnosticCategory.Error, "super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_highe_2659", "'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher."),
      super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions: diag(2660, ts2.DiagnosticCategory.Error, "super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions_2660", "'super' can only be referenced in members of derived classes or object literal expressions."),
      Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module: diag(2661, ts2.DiagnosticCategory.Error, "Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module_2661", "Cannot export '{0}'. Only local declarations can be exported from a module."),
      Cannot_find_name_0_Did_you_mean_the_static_member_1_0: diag(2662, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Did_you_mean_the_static_member_1_0_2662", "Cannot find name '{0}'. Did you mean the static member '{1}.{0}'?"),
      Cannot_find_name_0_Did_you_mean_the_instance_member_this_0: diag(2663, ts2.DiagnosticCategory.Error, "Cannot_find_name_0_Did_you_mean_the_instance_member_this_0_2663", "Cannot find name '{0}'. Did you mean the instance member 'this.{0}'?"),
      Invalid_module_name_in_augmentation_module_0_cannot_be_found: diag(2664, ts2.DiagnosticCategory.Error, "Invalid_module_name_in_augmentation_module_0_cannot_be_found_2664", "Invalid module name in augmentation, module '{0}' cannot be found."),
      Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented: diag(2665, ts2.DiagnosticCategory.Error, "Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augm_2665", "Invalid module name in augmentation. Module '{0}' resolves to an untyped module at '{1}', which cannot be augmented."),
      Exports_and_export_assignments_are_not_permitted_in_module_augmentations: diag(2666, ts2.DiagnosticCategory.Error, "Exports_and_export_assignments_are_not_permitted_in_module_augmentations_2666", "Exports and export assignments are not permitted in module augmentations."),
      Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_module: diag(2667, ts2.DiagnosticCategory.Error, "Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_mod_2667", "Imports are not permitted in module augmentations. Consider moving them to the enclosing external module."),
      export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always_visible: diag(2668, ts2.DiagnosticCategory.Error, "export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always__2668", "'export' modifier cannot be applied to ambient modules and module augmentations since they are always visible."),
      Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations: diag(2669, ts2.DiagnosticCategory.Error, "Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_2669", "Augmentations for the global scope can only be directly nested in external modules or ambient module declarations."),
      Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambient_context: diag(2670, ts2.DiagnosticCategory.Error, "Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambien_2670", "Augmentations for the global scope should have 'declare' modifier unless they appear in already ambient context."),
      Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity: diag(2671, ts2.DiagnosticCategory.Error, "Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity_2671", "Cannot augment module '{0}' because it resolves to a non-module entity."),
      Cannot_assign_a_0_constructor_type_to_a_1_constructor_type: diag(2672, ts2.DiagnosticCategory.Error, "Cannot_assign_a_0_constructor_type_to_a_1_constructor_type_2672", "Cannot assign a '{0}' constructor type to a '{1}' constructor type."),
      Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration: diag(2673, ts2.DiagnosticCategory.Error, "Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration_2673", "Constructor of class '{0}' is private and only accessible within the class declaration."),
      Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration: diag(2674, ts2.DiagnosticCategory.Error, "Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration_2674", "Constructor of class '{0}' is protected and only accessible within the class declaration."),
      Cannot_extend_a_class_0_Class_constructor_is_marked_as_private: diag(2675, ts2.DiagnosticCategory.Error, "Cannot_extend_a_class_0_Class_constructor_is_marked_as_private_2675", "Cannot extend a class '{0}'. Class constructor is marked as private."),
      Accessors_must_both_be_abstract_or_non_abstract: diag(2676, ts2.DiagnosticCategory.Error, "Accessors_must_both_be_abstract_or_non_abstract_2676", "Accessors must both be abstract or non-abstract."),
      A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type: diag(2677, ts2.DiagnosticCategory.Error, "A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type_2677", "A type predicate's type must be assignable to its parameter's type."),
      Type_0_is_not_comparable_to_type_1: diag(2678, ts2.DiagnosticCategory.Error, "Type_0_is_not_comparable_to_type_1_2678", "Type '{0}' is not comparable to type '{1}'."),
      A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void: diag(2679, ts2.DiagnosticCategory.Error, "A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void_2679", "A function that is called with the 'new' keyword cannot have a 'this' type that is 'void'."),
      A_0_parameter_must_be_the_first_parameter: diag(2680, ts2.DiagnosticCategory.Error, "A_0_parameter_must_be_the_first_parameter_2680", "A '{0}' parameter must be the first parameter."),
      A_constructor_cannot_have_a_this_parameter: diag(2681, ts2.DiagnosticCategory.Error, "A_constructor_cannot_have_a_this_parameter_2681", "A constructor cannot have a 'this' parameter."),
      this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation: diag(2683, ts2.DiagnosticCategory.Error, "this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_2683", "'this' implicitly has type 'any' because it does not have a type annotation."),
      The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1: diag(2684, ts2.DiagnosticCategory.Error, "The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1_2684", "The 'this' context of type '{0}' is not assignable to method's 'this' of type '{1}'."),
      The_this_types_of_each_signature_are_incompatible: diag(2685, ts2.DiagnosticCategory.Error, "The_this_types_of_each_signature_are_incompatible_2685", "The 'this' types of each signature are incompatible."),
      _0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead: diag(2686, ts2.DiagnosticCategory.Error, "_0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead_2686", "'{0}' refers to a UMD global, but the current file is a module. Consider adding an import instead."),
      All_declarations_of_0_must_have_identical_modifiers: diag(2687, ts2.DiagnosticCategory.Error, "All_declarations_of_0_must_have_identical_modifiers_2687", "All declarations of '{0}' must have identical modifiers."),
      Cannot_find_type_definition_file_for_0: diag(2688, ts2.DiagnosticCategory.Error, "Cannot_find_type_definition_file_for_0_2688", "Cannot find type definition file for '{0}'."),
      Cannot_extend_an_interface_0_Did_you_mean_implements: diag(2689, ts2.DiagnosticCategory.Error, "Cannot_extend_an_interface_0_Did_you_mean_implements_2689", "Cannot extend an interface '{0}'. Did you mean 'implements'?"),
      _0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0: diag(2690, ts2.DiagnosticCategory.Error, "_0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0_2690", "'{0}' only refers to a type, but is being used as a value here. Did you mean to use '{1} in {0}'?"),
      An_import_path_cannot_end_with_a_0_extension_Consider_importing_1_instead: diag(2691, ts2.DiagnosticCategory.Error, "An_import_path_cannot_end_with_a_0_extension_Consider_importing_1_instead_2691", "An import path cannot end with a '{0}' extension. Consider importing '{1}' instead."),
      _0_is_a_primitive_but_1_is_a_wrapper_object_Prefer_using_0_when_possible: diag(2692, ts2.DiagnosticCategory.Error, "_0_is_a_primitive_but_1_is_a_wrapper_object_Prefer_using_0_when_possible_2692", "'{0}' is a primitive, but '{1}' is a wrapper object. Prefer using '{0}' when possible."),
      _0_only_refers_to_a_type_but_is_being_used_as_a_value_here: diag(2693, ts2.DiagnosticCategory.Error, "_0_only_refers_to_a_type_but_is_being_used_as_a_value_here_2693", "'{0}' only refers to a type, but is being used as a value here."),
      Namespace_0_has_no_exported_member_1: diag(2694, ts2.DiagnosticCategory.Error, "Namespace_0_has_no_exported_member_1_2694", "Namespace '{0}' has no exported member '{1}'."),
      Left_side_of_comma_operator_is_unused_and_has_no_side_effects: diag(2695, ts2.DiagnosticCategory.Error, "Left_side_of_comma_operator_is_unused_and_has_no_side_effects_2695", "Left side of comma operator is unused and has no side effects.", true),
      The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead: diag(2696, ts2.DiagnosticCategory.Error, "The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead_2696", "The 'Object' type is assignable to very few other types. Did you mean to use the 'any' type instead?"),
      An_async_function_or_method_must_return_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option: diag(2697, ts2.DiagnosticCategory.Error, "An_async_function_or_method_must_return_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_in_2697", "An async function or method must return a 'Promise'. Make sure you have a declaration for 'Promise' or include 'ES2015' in your '--lib' option."),
      Spread_types_may_only_be_created_from_object_types: diag(2698, ts2.DiagnosticCategory.Error, "Spread_types_may_only_be_created_from_object_types_2698", "Spread types may only be created from object types."),
      Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1: diag(2699, ts2.DiagnosticCategory.Error, "Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1_2699", "Static property '{0}' conflicts with built-in property 'Function.{0}' of constructor function '{1}'."),
      Rest_types_may_only_be_created_from_object_types: diag(2700, ts2.DiagnosticCategory.Error, "Rest_types_may_only_be_created_from_object_types_2700", "Rest types may only be created from object types."),
      The_target_of_an_object_rest_assignment_must_be_a_variable_or_a_property_access: diag(2701, ts2.DiagnosticCategory.Error, "The_target_of_an_object_rest_assignment_must_be_a_variable_or_a_property_access_2701", "The target of an object rest assignment must be a variable or a property access."),
      _0_only_refers_to_a_type_but_is_being_used_as_a_namespace_here: diag(2702, ts2.DiagnosticCategory.Error, "_0_only_refers_to_a_type_but_is_being_used_as_a_namespace_here_2702", "'{0}' only refers to a type, but is being used as a namespace here."),
      The_operand_of_a_delete_operator_must_be_a_property_reference: diag(2703, ts2.DiagnosticCategory.Error, "The_operand_of_a_delete_operator_must_be_a_property_reference_2703", "The operand of a 'delete' operator must be a property reference."),
      The_operand_of_a_delete_operator_cannot_be_a_read_only_property: diag(2704, ts2.DiagnosticCategory.Error, "The_operand_of_a_delete_operator_cannot_be_a_read_only_property_2704", "The operand of a 'delete' operator cannot be a read-only property."),
      An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option: diag(2705, ts2.DiagnosticCategory.Error, "An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_de_2705", "An async function or method in ES5/ES3 requires the 'Promise' constructor.  Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your '--lib' option."),
      Required_type_parameters_may_not_follow_optional_type_parameters: diag(2706, ts2.DiagnosticCategory.Error, "Required_type_parameters_may_not_follow_optional_type_parameters_2706", "Required type parameters may not follow optional type parameters."),
      Generic_type_0_requires_between_1_and_2_type_arguments: diag(2707, ts2.DiagnosticCategory.Error, "Generic_type_0_requires_between_1_and_2_type_arguments_2707", "Generic type '{0}' requires between {1} and {2} type arguments."),
      Cannot_use_namespace_0_as_a_value: diag(2708, ts2.DiagnosticCategory.Error, "Cannot_use_namespace_0_as_a_value_2708", "Cannot use namespace '{0}' as a value."),
      Cannot_use_namespace_0_as_a_type: diag(2709, ts2.DiagnosticCategory.Error, "Cannot_use_namespace_0_as_a_type_2709", "Cannot use namespace '{0}' as a type."),
      _0_are_specified_twice_The_attribute_named_0_will_be_overwritten: diag(2710, ts2.DiagnosticCategory.Error, "_0_are_specified_twice_The_attribute_named_0_will_be_overwritten_2710", "'{0}' are specified twice. The attribute named '{0}' will be overwritten."),
      A_dynamic_import_call_returns_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option: diag(2711, ts2.DiagnosticCategory.Error, "A_dynamic_import_call_returns_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES20_2711", "A dynamic import call returns a 'Promise'. Make sure you have a declaration for 'Promise' or include 'ES2015' in your '--lib' option."),
      A_dynamic_import_call_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option: diag(2712, ts2.DiagnosticCategory.Error, "A_dynamic_import_call_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declarat_2712", "A dynamic import call in ES5/ES3 requires the 'Promise' constructor.  Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your '--lib' option."),
      Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1: diag(2713, ts2.DiagnosticCategory.Error, "Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_p_2713", `Cannot access '{0}.{1}' because '{0}' is a type, but not a namespace. Did you mean to retrieve the type of the property '{1}' in '{0}' with '{0}["{1}"]'?`),
      The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context: diag(2714, ts2.DiagnosticCategory.Error, "The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context_2714", "The expression of an export assignment must be an identifier or qualified name in an ambient context."),
      Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor: diag(2715, ts2.DiagnosticCategory.Error, "Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor_2715", "Abstract property '{0}' in class '{1}' cannot be accessed in the constructor."),
      Type_parameter_0_has_a_circular_default: diag(2716, ts2.DiagnosticCategory.Error, "Type_parameter_0_has_a_circular_default_2716", "Type parameter '{0}' has a circular default."),
      Subsequent_property_declarations_must_have_the_same_type_Property_0_must_be_of_type_1_but_here_has_type_2: diag(2717, ts2.DiagnosticCategory.Error, "Subsequent_property_declarations_must_have_the_same_type_Property_0_must_be_of_type_1_but_here_has_t_2717", "Subsequent property declarations must have the same type.  Property '{0}' must be of type '{1}', but here has type '{2}'."),
      Duplicate_property_0: diag(2718, ts2.DiagnosticCategory.Error, "Duplicate_property_0_2718", "Duplicate property '{0}'."),
      Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated: diag(2719, ts2.DiagnosticCategory.Error, "Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated_2719", "Type '{0}' is not assignable to type '{1}'. Two different types with this name exist, but they are unrelated."),
      Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass: diag(2720, ts2.DiagnosticCategory.Error, "Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclas_2720", "Class '{0}' incorrectly implements class '{1}'. Did you mean to extend '{1}' and inherit its members as a subclass?"),
      Cannot_invoke_an_object_which_is_possibly_null: diag(2721, ts2.DiagnosticCategory.Error, "Cannot_invoke_an_object_which_is_possibly_null_2721", "Cannot invoke an object which is possibly 'null'."),
      Cannot_invoke_an_object_which_is_possibly_undefined: diag(2722, ts2.DiagnosticCategory.Error, "Cannot_invoke_an_object_which_is_possibly_undefined_2722", "Cannot invoke an object which is possibly 'undefined'."),
      Cannot_invoke_an_object_which_is_possibly_null_or_undefined: diag(2723, ts2.DiagnosticCategory.Error, "Cannot_invoke_an_object_which_is_possibly_null_or_undefined_2723", "Cannot invoke an object which is possibly 'null' or 'undefined'."),
      _0_has_no_exported_member_named_1_Did_you_mean_2: diag(2724, ts2.DiagnosticCategory.Error, "_0_has_no_exported_member_named_1_Did_you_mean_2_2724", "'{0}' has no exported member named '{1}'. Did you mean '{2}'?"),
      Class_name_cannot_be_Object_when_targeting_ES5_with_module_0: diag(2725, ts2.DiagnosticCategory.Error, "Class_name_cannot_be_Object_when_targeting_ES5_with_module_0_2725", "Class name cannot be 'Object' when targeting ES5 with module {0}."),
      Cannot_find_lib_definition_for_0: diag(2726, ts2.DiagnosticCategory.Error, "Cannot_find_lib_definition_for_0_2726", "Cannot find lib definition for '{0}'."),
      Cannot_find_lib_definition_for_0_Did_you_mean_1: diag(2727, ts2.DiagnosticCategory.Error, "Cannot_find_lib_definition_for_0_Did_you_mean_1_2727", "Cannot find lib definition for '{0}'. Did you mean '{1}'?"),
      _0_is_declared_here: diag(2728, ts2.DiagnosticCategory.Message, "_0_is_declared_here_2728", "'{0}' is declared here."),
      Property_0_is_used_before_its_initialization: diag(2729, ts2.DiagnosticCategory.Error, "Property_0_is_used_before_its_initialization_2729", "Property '{0}' is used before its initialization."),
      An_arrow_function_cannot_have_a_this_parameter: diag(2730, ts2.DiagnosticCategory.Error, "An_arrow_function_cannot_have_a_this_parameter_2730", "An arrow function cannot have a 'this' parameter."),
      Implicit_conversion_of_a_symbol_to_a_string_will_fail_at_runtime_Consider_wrapping_this_expression_in_String: diag(2731, ts2.DiagnosticCategory.Error, "Implicit_conversion_of_a_symbol_to_a_string_will_fail_at_runtime_Consider_wrapping_this_expression_i_2731", "Implicit conversion of a 'symbol' to a 'string' will fail at runtime. Consider wrapping this expression in 'String(...)'."),
      Cannot_find_module_0_Consider_using_resolveJsonModule_to_import_module_with_json_extension: diag(2732, ts2.DiagnosticCategory.Error, "Cannot_find_module_0_Consider_using_resolveJsonModule_to_import_module_with_json_extension_2732", "Cannot find module '{0}'. Consider using '--resolveJsonModule' to import module with '.json' extension."),
      Property_0_was_also_declared_here: diag(2733, ts2.DiagnosticCategory.Error, "Property_0_was_also_declared_here_2733", "Property '{0}' was also declared here."),
      Are_you_missing_a_semicolon: diag(2734, ts2.DiagnosticCategory.Error, "Are_you_missing_a_semicolon_2734", "Are you missing a semicolon?"),
      Did_you_mean_for_0_to_be_constrained_to_type_new_args_Colon_any_1: diag(2735, ts2.DiagnosticCategory.Error, "Did_you_mean_for_0_to_be_constrained_to_type_new_args_Colon_any_1_2735", "Did you mean for '{0}' to be constrained to type 'new (...args: any[]) => {1}'?"),
      Operator_0_cannot_be_applied_to_type_1: diag(2736, ts2.DiagnosticCategory.Error, "Operator_0_cannot_be_applied_to_type_1_2736", "Operator '{0}' cannot be applied to type '{1}'."),
      BigInt_literals_are_not_available_when_targeting_lower_than_ES2020: diag(2737, ts2.DiagnosticCategory.Error, "BigInt_literals_are_not_available_when_targeting_lower_than_ES2020_2737", "BigInt literals are not available when targeting lower than ES2020."),
      An_outer_value_of_this_is_shadowed_by_this_container: diag(2738, ts2.DiagnosticCategory.Message, "An_outer_value_of_this_is_shadowed_by_this_container_2738", "An outer value of 'this' is shadowed by this container."),
      Type_0_is_missing_the_following_properties_from_type_1_Colon_2: diag(2739, ts2.DiagnosticCategory.Error, "Type_0_is_missing_the_following_properties_from_type_1_Colon_2_2739", "Type '{0}' is missing the following properties from type '{1}': {2}"),
      Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more: diag(2740, ts2.DiagnosticCategory.Error, "Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more_2740", "Type '{0}' is missing the following properties from type '{1}': {2}, and {3} more."),
      Property_0_is_missing_in_type_1_but_required_in_type_2: diag(2741, ts2.DiagnosticCategory.Error, "Property_0_is_missing_in_type_1_but_required_in_type_2_2741", "Property '{0}' is missing in type '{1}' but required in type '{2}'."),
      The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary: diag(2742, ts2.DiagnosticCategory.Error, "The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_a_2742", "The inferred type of '{0}' cannot be named without a reference to '{1}'. This is likely not portable. A type annotation is necessary."),
      No_overload_expects_0_type_arguments_but_overloads_do_exist_that_expect_either_1_or_2_type_arguments: diag(2743, ts2.DiagnosticCategory.Error, "No_overload_expects_0_type_arguments_but_overloads_do_exist_that_expect_either_1_or_2_type_arguments_2743", "No overload expects {0} type arguments, but overloads do exist that expect either {1} or {2} type arguments."),
      Type_parameter_defaults_can_only_reference_previously_declared_type_parameters: diag(2744, ts2.DiagnosticCategory.Error, "Type_parameter_defaults_can_only_reference_previously_declared_type_parameters_2744", "Type parameter defaults can only reference previously declared type parameters."),
      This_JSX_tag_s_0_prop_expects_type_1_which_requires_multiple_children_but_only_a_single_child_was_provided: diag(2745, ts2.DiagnosticCategory.Error, "This_JSX_tag_s_0_prop_expects_type_1_which_requires_multiple_children_but_only_a_single_child_was_pr_2745", "This JSX tag's '{0}' prop expects type '{1}' which requires multiple children, but only a single child was provided."),
      This_JSX_tag_s_0_prop_expects_a_single_child_of_type_1_but_multiple_children_were_provided: diag(2746, ts2.DiagnosticCategory.Error, "This_JSX_tag_s_0_prop_expects_a_single_child_of_type_1_but_multiple_children_were_provided_2746", "This JSX tag's '{0}' prop expects a single child of type '{1}', but multiple children were provided."),
      _0_components_don_t_accept_text_as_child_elements_Text_in_JSX_has_the_type_string_but_the_expected_type_of_1_is_2: diag(2747, ts2.DiagnosticCategory.Error, "_0_components_don_t_accept_text_as_child_elements_Text_in_JSX_has_the_type_string_but_the_expected_t_2747", "'{0}' components don't accept text as child elements. Text in JSX has the type 'string', but the expected type of '{1}' is '{2}'."),
      Cannot_access_ambient_const_enums_when_the_isolatedModules_flag_is_provided: diag(2748, ts2.DiagnosticCategory.Error, "Cannot_access_ambient_const_enums_when_the_isolatedModules_flag_is_provided_2748", "Cannot access ambient const enums when the '--isolatedModules' flag is provided."),
      _0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0: diag(2749, ts2.DiagnosticCategory.Error, "_0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0_2749", "'{0}' refers to a value, but is being used as a type here. Did you mean 'typeof {0}'?"),
      The_implementation_signature_is_declared_here: diag(2750, ts2.DiagnosticCategory.Error, "The_implementation_signature_is_declared_here_2750", "The implementation signature is declared here."),
      Circularity_originates_in_type_at_this_location: diag(2751, ts2.DiagnosticCategory.Error, "Circularity_originates_in_type_at_this_location_2751", "Circularity originates in type at this location."),
      The_first_export_default_is_here: diag(2752, ts2.DiagnosticCategory.Error, "The_first_export_default_is_here_2752", "The first export default is here."),
      Another_export_default_is_here: diag(2753, ts2.DiagnosticCategory.Error, "Another_export_default_is_here_2753", "Another export default is here."),
      super_may_not_use_type_arguments: diag(2754, ts2.DiagnosticCategory.Error, "super_may_not_use_type_arguments_2754", "'super' may not use type arguments."),
      No_constituent_of_type_0_is_callable: diag(2755, ts2.DiagnosticCategory.Error, "No_constituent_of_type_0_is_callable_2755", "No constituent of type '{0}' is callable."),
      Not_all_constituents_of_type_0_are_callable: diag(2756, ts2.DiagnosticCategory.Error, "Not_all_constituents_of_type_0_are_callable_2756", "Not all constituents of type '{0}' are callable."),
      Type_0_has_no_call_signatures: diag(2757, ts2.DiagnosticCategory.Error, "Type_0_has_no_call_signatures_2757", "Type '{0}' has no call signatures."),
      Each_member_of_the_union_type_0_has_signatures_but_none_of_those_signatures_are_compatible_with_each_other: diag(2758, ts2.DiagnosticCategory.Error, "Each_member_of_the_union_type_0_has_signatures_but_none_of_those_signatures_are_compatible_with_each_2758", "Each member of the union type '{0}' has signatures, but none of those signatures are compatible with each other."),
      No_constituent_of_type_0_is_constructable: diag(2759, ts2.DiagnosticCategory.Error, "No_constituent_of_type_0_is_constructable_2759", "No constituent of type '{0}' is constructable."),
      Not_all_constituents_of_type_0_are_constructable: diag(2760, ts2.DiagnosticCategory.Error, "Not_all_constituents_of_type_0_are_constructable_2760", "Not all constituents of type '{0}' are constructable."),
      Type_0_has_no_construct_signatures: diag(2761, ts2.DiagnosticCategory.Error, "Type_0_has_no_construct_signatures_2761", "Type '{0}' has no construct signatures."),
      Each_member_of_the_union_type_0_has_construct_signatures_but_none_of_those_signatures_are_compatible_with_each_other: diag(2762, ts2.DiagnosticCategory.Error, "Each_member_of_the_union_type_0_has_construct_signatures_but_none_of_those_signatures_are_compatible_2762", "Each member of the union type '{0}' has construct signatures, but none of those signatures are compatible with each other."),
      Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_for_of_will_always_send_0: diag(2763, ts2.DiagnosticCategory.Error, "Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_for_of_will_always_s_2763", "Cannot iterate value because the 'next' method of its iterator expects type '{1}', but for-of will always send '{0}'."),
      Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_spread_will_always_send_0: diag(2764, ts2.DiagnosticCategory.Error, "Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_spread_will_al_2764", "Cannot iterate value because the 'next' method of its iterator expects type '{1}', but array spread will always send '{0}'."),
      Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_destructuring_will_always_send_0: diag(2765, ts2.DiagnosticCategory.Error, "Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_destructuring__2765", "Cannot iterate value because the 'next' method of its iterator expects type '{1}', but array destructuring will always send '{0}'."),
      Cannot_delegate_iteration_to_value_because_the_next_method_of_its_iterator_expects_type_1_but_the_containing_generator_will_always_send_0: diag(2766, ts2.DiagnosticCategory.Error, "Cannot_delegate_iteration_to_value_because_the_next_method_of_its_iterator_expects_type_1_but_the_co_2766", "Cannot delegate iteration to value because the 'next' method of its iterator expects type '{1}', but the containing generator will always send '{0}'."),
      The_0_property_of_an_iterator_must_be_a_method: diag(2767, ts2.DiagnosticCategory.Error, "The_0_property_of_an_iterator_must_be_a_method_2767", "The '{0}' property of an iterator must be a method."),
      The_0_property_of_an_async_iterator_must_be_a_method: diag(2768, ts2.DiagnosticCategory.Error, "The_0_property_of_an_async_iterator_must_be_a_method_2768", "The '{0}' property of an async iterator must be a method."),
      No_overload_matches_this_call: diag(2769, ts2.DiagnosticCategory.Error, "No_overload_matches_this_call_2769", "No overload matches this call."),
      The_last_overload_gave_the_following_error: diag(2770, ts2.DiagnosticCategory.Error, "The_last_overload_gave_the_following_error_2770", "The last overload gave the following error."),
      The_last_overload_is_declared_here: diag(2771, ts2.DiagnosticCategory.Error, "The_last_overload_is_declared_here_2771", "The last overload is declared here."),
      Overload_0_of_1_2_gave_the_following_error: diag(2772, ts2.DiagnosticCategory.Error, "Overload_0_of_1_2_gave_the_following_error_2772", "Overload {0} of {1}, '{2}', gave the following error."),
      Did_you_forget_to_use_await: diag(2773, ts2.DiagnosticCategory.Error, "Did_you_forget_to_use_await_2773", "Did you forget to use 'await'?"),
      This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead: diag(2774, ts2.DiagnosticCategory.Error, "This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_2774", "This condition will always return true since this function is always defined. Did you mean to call it instead?"),
      Assertions_require_every_name_in_the_call_target_to_be_declared_with_an_explicit_type_annotation: diag(2775, ts2.DiagnosticCategory.Error, "Assertions_require_every_name_in_the_call_target_to_be_declared_with_an_explicit_type_annotation_2775", "Assertions require every name in the call target to be declared with an explicit type annotation."),
      Assertions_require_the_call_target_to_be_an_identifier_or_qualified_name: diag(2776, ts2.DiagnosticCategory.Error, "Assertions_require_the_call_target_to_be_an_identifier_or_qualified_name_2776", "Assertions require the call target to be an identifier or qualified name."),
      The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access: diag(2777, ts2.DiagnosticCategory.Error, "The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access_2777", "The operand of an increment or decrement operator may not be an optional property access."),
      The_target_of_an_object_rest_assignment_may_not_be_an_optional_property_access: diag(2778, ts2.DiagnosticCategory.Error, "The_target_of_an_object_rest_assignment_may_not_be_an_optional_property_access_2778", "The target of an object rest assignment may not be an optional property access."),
      The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access: diag(2779, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access_2779", "The left-hand side of an assignment expression may not be an optional property access."),
      The_left_hand_side_of_a_for_in_statement_may_not_be_an_optional_property_access: diag(2780, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_in_statement_may_not_be_an_optional_property_access_2780", "The left-hand side of a 'for...in' statement may not be an optional property access."),
      The_left_hand_side_of_a_for_of_statement_may_not_be_an_optional_property_access: diag(2781, ts2.DiagnosticCategory.Error, "The_left_hand_side_of_a_for_of_statement_may_not_be_an_optional_property_access_2781", "The left-hand side of a 'for...of' statement may not be an optional property access."),
      _0_needs_an_explicit_type_annotation: diag(2782, ts2.DiagnosticCategory.Message, "_0_needs_an_explicit_type_annotation_2782", "'{0}' needs an explicit type annotation."),
      _0_is_specified_more_than_once_so_this_usage_will_be_overwritten: diag(2783, ts2.DiagnosticCategory.Error, "_0_is_specified_more_than_once_so_this_usage_will_be_overwritten_2783", "'{0}' is specified more than once, so this usage will be overwritten."),
      get_and_set_accessors_cannot_declare_this_parameters: diag(2784, ts2.DiagnosticCategory.Error, "get_and_set_accessors_cannot_declare_this_parameters_2784", "'get' and 'set' accessors cannot declare 'this' parameters."),
      This_spread_always_overwrites_this_property: diag(2785, ts2.DiagnosticCategory.Error, "This_spread_always_overwrites_this_property_2785", "This spread always overwrites this property."),
      _0_cannot_be_used_as_a_JSX_component: diag(2786, ts2.DiagnosticCategory.Error, "_0_cannot_be_used_as_a_JSX_component_2786", "'{0}' cannot be used as a JSX component."),
      Its_return_type_0_is_not_a_valid_JSX_element: diag(2787, ts2.DiagnosticCategory.Error, "Its_return_type_0_is_not_a_valid_JSX_element_2787", "Its return type '{0}' is not a valid JSX element."),
      Its_instance_type_0_is_not_a_valid_JSX_element: diag(2788, ts2.DiagnosticCategory.Error, "Its_instance_type_0_is_not_a_valid_JSX_element_2788", "Its instance type '{0}' is not a valid JSX element."),
      Its_element_type_0_is_not_a_valid_JSX_element: diag(2789, ts2.DiagnosticCategory.Error, "Its_element_type_0_is_not_a_valid_JSX_element_2789", "Its element type '{0}' is not a valid JSX element."),
      The_operand_of_a_delete_operator_must_be_optional: diag(2790, ts2.DiagnosticCategory.Error, "The_operand_of_a_delete_operator_must_be_optional_2790", "The operand of a 'delete' operator must be optional."),
      Exponentiation_cannot_be_performed_on_bigint_values_unless_the_target_option_is_set_to_es2016_or_later: diag(2791, ts2.DiagnosticCategory.Error, "Exponentiation_cannot_be_performed_on_bigint_values_unless_the_target_option_is_set_to_es2016_or_lat_2791", "Exponentiation cannot be performed on 'bigint' values unless the 'target' option is set to 'es2016' or later."),
      Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_node_or_to_add_aliases_to_the_paths_option: diag(2792, ts2.DiagnosticCategory.Error, "Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_node_or_to_add_aliases_to_th_2792", "Cannot find module '{0}'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?"),
      The_call_would_have_succeeded_against_this_implementation_but_implementation_signatures_of_overloads_are_not_externally_visible: diag(2793, ts2.DiagnosticCategory.Error, "The_call_would_have_succeeded_against_this_implementation_but_implementation_signatures_of_overloads_2793", "The call would have succeeded against this implementation, but implementation signatures of overloads are not externally visible."),
      Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise: diag(2794, ts2.DiagnosticCategory.Error, "Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise_2794", "Expected {0} arguments, but got {1}. Did you forget to include 'void' in your type argument to 'Promise'?"),
      The_intrinsic_keyword_can_only_be_used_to_declare_compiler_provided_intrinsic_types: diag(2795, ts2.DiagnosticCategory.Error, "The_intrinsic_keyword_can_only_be_used_to_declare_compiler_provided_intrinsic_types_2795", "The 'intrinsic' keyword can only be used to declare compiler provided intrinsic types."),
      It_is_likely_that_you_are_missing_a_comma_to_separate_these_two_template_expressions_They_form_a_tagged_template_expression_which_cannot_be_invoked: diag(2796, ts2.DiagnosticCategory.Error, "It_is_likely_that_you_are_missing_a_comma_to_separate_these_two_template_expressions_They_form_a_tag_2796", "It is likely that you are missing a comma to separate these two template expressions. They form a tagged template expression which cannot be invoked."),
      A_mixin_class_that_extends_from_a_type_variable_containing_an_abstract_construct_signature_must_also_be_declared_abstract: diag(2797, ts2.DiagnosticCategory.Error, "A_mixin_class_that_extends_from_a_type_variable_containing_an_abstract_construct_signature_must_also_2797", "A mixin class that extends from a type variable containing an abstract construct signature must also be declared 'abstract'."),
      The_declaration_was_marked_as_deprecated_here: diag(2798, ts2.DiagnosticCategory.Error, "The_declaration_was_marked_as_deprecated_here_2798", "The declaration was marked as deprecated here."),
      Type_produces_a_tuple_type_that_is_too_large_to_represent: diag(2799, ts2.DiagnosticCategory.Error, "Type_produces_a_tuple_type_that_is_too_large_to_represent_2799", "Type produces a tuple type that is too large to represent."),
      Expression_produces_a_tuple_type_that_is_too_large_to_represent: diag(2800, ts2.DiagnosticCategory.Error, "Expression_produces_a_tuple_type_that_is_too_large_to_represent_2800", "Expression produces a tuple type that is too large to represent."),
      This_condition_will_always_return_true_since_this_0_is_always_defined: diag(2801, ts2.DiagnosticCategory.Error, "This_condition_will_always_return_true_since_this_0_is_always_defined_2801", "This condition will always return true since this '{0}' is always defined."),
      Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es2015_or_higher: diag(2802, ts2.DiagnosticCategory.Error, "Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es201_2802", "Type '{0}' can only be iterated through when using the '--downlevelIteration' flag or with a '--target' of 'es2015' or higher."),
      Cannot_assign_to_private_method_0_Private_methods_are_not_writable: diag(2803, ts2.DiagnosticCategory.Error, "Cannot_assign_to_private_method_0_Private_methods_are_not_writable_2803", "Cannot assign to private method '{0}'. Private methods are not writable."),
      Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name: diag(2804, ts2.DiagnosticCategory.Error, "Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name_2804", "Duplicate identifier '{0}'. Static and instance elements cannot share the same private name."),
      Static_fields_with_private_names_can_t_have_initializers_when_the_useDefineForClassFields_flag_is_not_specified_with_a_target_of_esnext_Consider_adding_the_useDefineForClassFields_flag: diag(2805, ts2.DiagnosticCategory.Error, "Static_fields_with_private_names_can_t_have_initializers_when_the_useDefineForClassFields_flag_is_no_2805", "Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag."),
      Private_accessor_was_defined_without_a_getter: diag(2806, ts2.DiagnosticCategory.Error, "Private_accessor_was_defined_without_a_getter_2806", "Private accessor was defined without a getter."),
      This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0: diag(2807, ts2.DiagnosticCategory.Error, "This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_o_2807", "This syntax requires an imported helper named '{1}' with {2} parameters, which is not compatible with the one in '{0}'. Consider upgrading your version of '{0}'."),
      A_get_accessor_must_be_at_least_as_accessible_as_the_setter: diag(2808, ts2.DiagnosticCategory.Error, "A_get_accessor_must_be_at_least_as_accessible_as_the_setter_2808", "A get accessor must be at least as accessible as the setter"),
      Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_destructuring_assignment_you_might_need_to_wrap_the_the_whole_assignment_in_parentheses: diag(2809, ts2.DiagnosticCategory.Error, "Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_d_2809", "Declaration or statement expected. This '=' follows a block of statements, so if you intended to write a destructuring assignment, you might need to wrap the the whole assignment in parentheses."),
      Property_0_may_not_be_used_in_a_static_property_s_initializer_in_the_same_class_when_target_is_esnext_and_useDefineForClassFields_is_false: diag(2810, ts2.DiagnosticCategory.Error, "Property_0_may_not_be_used_in_a_static_property_s_initializer_in_the_same_class_when_target_is_esnex_2810", "Property '{0}' may not be used in a static property's initializer in the same class when 'target' is 'esnext' and 'useDefineForClassFields' is 'false'."),
      Initializer_for_property_0: diag(2811, ts2.DiagnosticCategory.Error, "Initializer_for_property_0_2811", "Initializer for property '{0}'"),
      Property_0_does_not_exist_on_type_1_Try_changing_the_lib_compiler_option_to_include_dom: diag(2812, ts2.DiagnosticCategory.Error, "Property_0_does_not_exist_on_type_1_Try_changing_the_lib_compiler_option_to_include_dom_2812", "Property '{0}' does not exist on type '{1}'. Try changing the 'lib' compiler option to include 'dom'."),
      Class_declaration_cannot_implement_overload_list_for_0: diag(2813, ts2.DiagnosticCategory.Error, "Class_declaration_cannot_implement_overload_list_for_0_2813", "Class declaration cannot implement overload list for '{0}'."),
      Function_with_bodies_can_only_merge_with_classes_that_are_ambient: diag(2814, ts2.DiagnosticCategory.Error, "Function_with_bodies_can_only_merge_with_classes_that_are_ambient_2814", "Function with bodies can only merge with classes that are ambient."),
      arguments_cannot_be_referenced_in_property_initializers: diag(2815, ts2.DiagnosticCategory.Error, "arguments_cannot_be_referenced_in_property_initializers_2815", "'arguments' cannot be referenced in property initializers."),
      Cannot_use_this_in_a_static_property_initializer_of_a_decorated_class: diag(2816, ts2.DiagnosticCategory.Error, "Cannot_use_this_in_a_static_property_initializer_of_a_decorated_class_2816", "Cannot use 'this' in a static property initializer of a decorated class."),
      Property_0_has_no_initializer_and_is_not_definitely_assigned_in_a_class_static_block: diag(2817, ts2.DiagnosticCategory.Error, "Property_0_has_no_initializer_and_is_not_definitely_assigned_in_a_class_static_block_2817", "Property '{0}' has no initializer and is not definitely assigned in a class static block."),
      Duplicate_identifier_0_Compiler_reserves_name_1_when_emitting_super_references_in_static_initializers: diag(2818, ts2.DiagnosticCategory.Error, "Duplicate_identifier_0_Compiler_reserves_name_1_when_emitting_super_references_in_static_initializer_2818", "Duplicate identifier '{0}'. Compiler reserves name '{1}' when emitting 'super' references in static initializers."),
      Namespace_name_cannot_be_0: diag(2819, ts2.DiagnosticCategory.Error, "Namespace_name_cannot_be_0_2819", "Namespace name cannot be '{0}'."),
      Type_0_is_not_assignable_to_type_1_Did_you_mean_2: diag(2820, ts2.DiagnosticCategory.Error, "Type_0_is_not_assignable_to_type_1_Did_you_mean_2_2820", "Type '{0}' is not assignable to type '{1}'. Did you mean '{2}'?"),
      Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext: diag(2821, ts2.DiagnosticCategory.Error, "Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext_2821", "Import assertions are only supported when the '--module' option is set to 'esnext'."),
      Import_assertions_cannot_be_used_with_type_only_imports_or_exports: diag(2822, ts2.DiagnosticCategory.Error, "Import_assertions_cannot_be_used_with_type_only_imports_or_exports_2822", "Import assertions cannot be used with type-only imports or exports."),
      Cannot_find_namespace_0_Did_you_mean_1: diag(2833, ts2.DiagnosticCategory.Error, "Cannot_find_namespace_0_Did_you_mean_1_2833", "Cannot find namespace '{0}'. Did you mean '{1}'?"),
      Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node12_or_nodenext_Consider_adding_an_extension_to_the_import_path: diag(2834, ts2.DiagnosticCategory.Error, "Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_n_2834", "Relative import paths need explicit file extensions in EcmaScript imports when '--moduleResolution' is 'node12' or 'nodenext'. Consider adding an extension to the import path."),
      Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node12_or_nodenext_Did_you_mean_0: diag(2835, ts2.DiagnosticCategory.Error, "Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_n_2835", "Relative import paths need explicit file extensions in EcmaScript imports when '--moduleResolution' is 'node12' or 'nodenext'. Did you mean '{0}'?"),
      Import_declaration_0_is_using_private_name_1: diag(4e3, ts2.DiagnosticCategory.Error, "Import_declaration_0_is_using_private_name_1_4000", "Import declaration '{0}' is using private name '{1}'."),
      Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: diag(4002, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_exported_class_has_or_is_using_private_name_1_4002", "Type parameter '{0}' of exported class has or is using private name '{1}'."),
      Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: diag(4004, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1_4004", "Type parameter '{0}' of exported interface has or is using private name '{1}'."),
      Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: diag(4006, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1_4006", "Type parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'."),
      Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: diag(4008, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1_4008", "Type parameter '{0}' of call signature from exported interface has or is using private name '{1}'."),
      Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: diag(4010, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1_4010", "Type parameter '{0}' of public static method from exported class has or is using private name '{1}'."),
      Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: diag(4012, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1_4012", "Type parameter '{0}' of public method from exported class has or is using private name '{1}'."),
      Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: diag(4014, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1_4014", "Type parameter '{0}' of method from exported interface has or is using private name '{1}'."),
      Type_parameter_0_of_exported_function_has_or_is_using_private_name_1: diag(4016, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_exported_function_has_or_is_using_private_name_1_4016", "Type parameter '{0}' of exported function has or is using private name '{1}'."),
      Implements_clause_of_exported_class_0_has_or_is_using_private_name_1: diag(4019, ts2.DiagnosticCategory.Error, "Implements_clause_of_exported_class_0_has_or_is_using_private_name_1_4019", "Implements clause of exported class '{0}' has or is using private name '{1}'."),
      extends_clause_of_exported_class_0_has_or_is_using_private_name_1: diag(4020, ts2.DiagnosticCategory.Error, "extends_clause_of_exported_class_0_has_or_is_using_private_name_1_4020", "'extends' clause of exported class '{0}' has or is using private name '{1}'."),
      extends_clause_of_exported_class_has_or_is_using_private_name_0: diag(4021, ts2.DiagnosticCategory.Error, "extends_clause_of_exported_class_has_or_is_using_private_name_0_4021", "'extends' clause of exported class has or is using private name '{0}'."),
      extends_clause_of_exported_interface_0_has_or_is_using_private_name_1: diag(4022, ts2.DiagnosticCategory.Error, "extends_clause_of_exported_interface_0_has_or_is_using_private_name_1_4022", "'extends' clause of exported interface '{0}' has or is using private name '{1}'."),
      Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4023, ts2.DiagnosticCategory.Error, "Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4023", "Exported variable '{0}' has or is using name '{1}' from external module {2} but cannot be named."),
      Exported_variable_0_has_or_is_using_name_1_from_private_module_2: diag(4024, ts2.DiagnosticCategory.Error, "Exported_variable_0_has_or_is_using_name_1_from_private_module_2_4024", "Exported variable '{0}' has or is using name '{1}' from private module '{2}'."),
      Exported_variable_0_has_or_is_using_private_name_1: diag(4025, ts2.DiagnosticCategory.Error, "Exported_variable_0_has_or_is_using_private_name_1_4025", "Exported variable '{0}' has or is using private name '{1}'."),
      Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4026, ts2.DiagnosticCategory.Error, "Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot__4026", "Public static property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4027, ts2.DiagnosticCategory.Error, "Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4027", "Public static property '{0}' of exported class has or is using name '{1}' from private module '{2}'."),
      Public_static_property_0_of_exported_class_has_or_is_using_private_name_1: diag(4028, ts2.DiagnosticCategory.Error, "Public_static_property_0_of_exported_class_has_or_is_using_private_name_1_4028", "Public static property '{0}' of exported class has or is using private name '{1}'."),
      Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4029, ts2.DiagnosticCategory.Error, "Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_name_4029", "Public property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4030, ts2.DiagnosticCategory.Error, "Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4030", "Public property '{0}' of exported class has or is using name '{1}' from private module '{2}'."),
      Public_property_0_of_exported_class_has_or_is_using_private_name_1: diag(4031, ts2.DiagnosticCategory.Error, "Public_property_0_of_exported_class_has_or_is_using_private_name_1_4031", "Public property '{0}' of exported class has or is using private name '{1}'."),
      Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: diag(4032, ts2.DiagnosticCategory.Error, "Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2_4032", "Property '{0}' of exported interface has or is using name '{1}' from private module '{2}'."),
      Property_0_of_exported_interface_has_or_is_using_private_name_1: diag(4033, ts2.DiagnosticCategory.Error, "Property_0_of_exported_interface_has_or_is_using_private_name_1_4033", "Property '{0}' of exported interface has or is using private name '{1}'."),
      Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4034, ts2.DiagnosticCategory.Error, "Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_mod_4034", "Parameter type of public static setter '{0}' from exported class has or is using name '{1}' from private module '{2}'."),
      Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1: diag(4035, ts2.DiagnosticCategory.Error, "Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1_4035", "Parameter type of public static setter '{0}' from exported class has or is using private name '{1}'."),
      Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4036, ts2.DiagnosticCategory.Error, "Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2_4036", "Parameter type of public setter '{0}' from exported class has or is using name '{1}' from private module '{2}'."),
      Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1: diag(4037, ts2.DiagnosticCategory.Error, "Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1_4037", "Parameter type of public setter '{0}' from exported class has or is using private name '{1}'."),
      Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4038, ts2.DiagnosticCategory.Error, "Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_modul_4038", "Return type of public static getter '{0}' from exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4039, ts2.DiagnosticCategory.Error, "Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_4039", "Return type of public static getter '{0}' from exported class has or is using name '{1}' from private module '{2}'."),
      Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1: diag(4040, ts2.DiagnosticCategory.Error, "Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1_4040", "Return type of public static getter '{0}' from exported class has or is using private name '{1}'."),
      Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4041, ts2.DiagnosticCategory.Error, "Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_4041", "Return type of public getter '{0}' from exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4042, ts2.DiagnosticCategory.Error, "Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2_4042", "Return type of public getter '{0}' from exported class has or is using name '{1}' from private module '{2}'."),
      Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1: diag(4043, ts2.DiagnosticCategory.Error, "Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1_4043", "Return type of public getter '{0}' from exported class has or is using private name '{1}'."),
      Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: diag(4044, ts2.DiagnosticCategory.Error, "Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_mod_4044", "Return type of constructor signature from exported interface has or is using name '{0}' from private module '{1}'."),
      Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0: diag(4045, ts2.DiagnosticCategory.Error, "Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0_4045", "Return type of constructor signature from exported interface has or is using private name '{0}'."),
      Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: diag(4046, ts2.DiagnosticCategory.Error, "Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4046", "Return type of call signature from exported interface has or is using name '{0}' from private module '{1}'."),
      Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0: diag(4047, ts2.DiagnosticCategory.Error, "Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0_4047", "Return type of call signature from exported interface has or is using private name '{0}'."),
      Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: diag(4048, ts2.DiagnosticCategory.Error, "Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4048", "Return type of index signature from exported interface has or is using name '{0}' from private module '{1}'."),
      Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0: diag(4049, ts2.DiagnosticCategory.Error, "Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0_4049", "Return type of index signature from exported interface has or is using private name '{0}'."),
      Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: diag(4050, ts2.DiagnosticCategory.Error, "Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module__4050", "Return type of public static method from exported class has or is using name '{0}' from external module {1} but cannot be named."),
      Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: diag(4051, ts2.DiagnosticCategory.Error, "Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1_4051", "Return type of public static method from exported class has or is using name '{0}' from private module '{1}'."),
      Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0: diag(4052, ts2.DiagnosticCategory.Error, "Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0_4052", "Return type of public static method from exported class has or is using private name '{0}'."),
      Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: diag(4053, ts2.DiagnosticCategory.Error, "Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_c_4053", "Return type of public method from exported class has or is using name '{0}' from external module {1} but cannot be named."),
      Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: diag(4054, ts2.DiagnosticCategory.Error, "Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1_4054", "Return type of public method from exported class has or is using name '{0}' from private module '{1}'."),
      Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0: diag(4055, ts2.DiagnosticCategory.Error, "Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0_4055", "Return type of public method from exported class has or is using private name '{0}'."),
      Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1: diag(4056, ts2.DiagnosticCategory.Error, "Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4056", "Return type of method from exported interface has or is using name '{0}' from private module '{1}'."),
      Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0: diag(4057, ts2.DiagnosticCategory.Error, "Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0_4057", "Return type of method from exported interface has or is using private name '{0}'."),
      Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: diag(4058, ts2.DiagnosticCategory.Error, "Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named_4058", "Return type of exported function has or is using name '{0}' from external module {1} but cannot be named."),
      Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1: diag(4059, ts2.DiagnosticCategory.Error, "Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1_4059", "Return type of exported function has or is using name '{0}' from private module '{1}'."),
      Return_type_of_exported_function_has_or_is_using_private_name_0: diag(4060, ts2.DiagnosticCategory.Error, "Return_type_of_exported_function_has_or_is_using_private_name_0_4060", "Return type of exported function has or is using private name '{0}'."),
      Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4061, ts2.DiagnosticCategory.Error, "Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_can_4061", "Parameter '{0}' of constructor from exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4062, ts2.DiagnosticCategory.Error, "Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2_4062", "Parameter '{0}' of constructor from exported class has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1: diag(4063, ts2.DiagnosticCategory.Error, "Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1_4063", "Parameter '{0}' of constructor from exported class has or is using private name '{1}'."),
      Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: diag(4064, ts2.DiagnosticCategory.Error, "Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_mod_4064", "Parameter '{0}' of constructor signature from exported interface has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: diag(4065, ts2.DiagnosticCategory.Error, "Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1_4065", "Parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'."),
      Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: diag(4066, ts2.DiagnosticCategory.Error, "Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4066", "Parameter '{0}' of call signature from exported interface has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: diag(4067, ts2.DiagnosticCategory.Error, "Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1_4067", "Parameter '{0}' of call signature from exported interface has or is using private name '{1}'."),
      Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4068, ts2.DiagnosticCategory.Error, "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module__4068", "Parameter '{0}' of public static method from exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4069, ts2.DiagnosticCategory.Error, "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2_4069", "Parameter '{0}' of public static method from exported class has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: diag(4070, ts2.DiagnosticCategory.Error, "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1_4070", "Parameter '{0}' of public static method from exported class has or is using private name '{1}'."),
      Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4071, ts2.DiagnosticCategory.Error, "Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_c_4071", "Parameter '{0}' of public method from exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4072, ts2.DiagnosticCategory.Error, "Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2_4072", "Parameter '{0}' of public method from exported class has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: diag(4073, ts2.DiagnosticCategory.Error, "Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1_4073", "Parameter '{0}' of public method from exported class has or is using private name '{1}'."),
      Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2: diag(4074, ts2.DiagnosticCategory.Error, "Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4074", "Parameter '{0}' of method from exported interface has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: diag(4075, ts2.DiagnosticCategory.Error, "Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1_4075", "Parameter '{0}' of method from exported interface has or is using private name '{1}'."),
      Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4076, ts2.DiagnosticCategory.Error, "Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4076", "Parameter '{0}' of exported function has or is using name '{1}' from external module {2} but cannot be named."),
      Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2: diag(4077, ts2.DiagnosticCategory.Error, "Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2_4077", "Parameter '{0}' of exported function has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_exported_function_has_or_is_using_private_name_1: diag(4078, ts2.DiagnosticCategory.Error, "Parameter_0_of_exported_function_has_or_is_using_private_name_1_4078", "Parameter '{0}' of exported function has or is using private name '{1}'."),
      Exported_type_alias_0_has_or_is_using_private_name_1: diag(4081, ts2.DiagnosticCategory.Error, "Exported_type_alias_0_has_or_is_using_private_name_1_4081", "Exported type alias '{0}' has or is using private name '{1}'."),
      Default_export_of_the_module_has_or_is_using_private_name_0: diag(4082, ts2.DiagnosticCategory.Error, "Default_export_of_the_module_has_or_is_using_private_name_0_4082", "Default export of the module has or is using private name '{0}'."),
      Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1: diag(4083, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1_4083", "Type parameter '{0}' of exported type alias has or is using private name '{1}'."),
      Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2: diag(4084, ts2.DiagnosticCategory.Error, "Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2_4084", "Exported type alias '{0}' has or is using private name '{1}' from module {2}."),
      Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_library_to_resolve_the_conflict: diag(4090, ts2.DiagnosticCategory.Error, "Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_librar_4090", "Conflicting definitions for '{0}' found at '{1}' and '{2}'. Consider installing a specific version of this library to resolve the conflict."),
      Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: diag(4091, ts2.DiagnosticCategory.Error, "Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4091", "Parameter '{0}' of index signature from exported interface has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1: diag(4092, ts2.DiagnosticCategory.Error, "Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1_4092", "Parameter '{0}' of index signature from exported interface has or is using private name '{1}'."),
      Property_0_of_exported_class_expression_may_not_be_private_or_protected: diag(4094, ts2.DiagnosticCategory.Error, "Property_0_of_exported_class_expression_may_not_be_private_or_protected_4094", "Property '{0}' of exported class expression may not be private or protected."),
      Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4095, ts2.DiagnosticCategory.Error, "Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_4095", "Public static method '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4096, ts2.DiagnosticCategory.Error, "Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4096", "Public static method '{0}' of exported class has or is using name '{1}' from private module '{2}'."),
      Public_static_method_0_of_exported_class_has_or_is_using_private_name_1: diag(4097, ts2.DiagnosticCategory.Error, "Public_static_method_0_of_exported_class_has_or_is_using_private_name_1_4097", "Public static method '{0}' of exported class has or is using private name '{1}'."),
      Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4098, ts2.DiagnosticCategory.Error, "Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4098", "Public method '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named."),
      Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: diag(4099, ts2.DiagnosticCategory.Error, "Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4099", "Public method '{0}' of exported class has or is using name '{1}' from private module '{2}'."),
      Public_method_0_of_exported_class_has_or_is_using_private_name_1: diag(4100, ts2.DiagnosticCategory.Error, "Public_method_0_of_exported_class_has_or_is_using_private_name_1_4100", "Public method '{0}' of exported class has or is using private name '{1}'."),
      Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: diag(4101, ts2.DiagnosticCategory.Error, "Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2_4101", "Method '{0}' of exported interface has or is using name '{1}' from private module '{2}'."),
      Method_0_of_exported_interface_has_or_is_using_private_name_1: diag(4102, ts2.DiagnosticCategory.Error, "Method_0_of_exported_interface_has_or_is_using_private_name_1_4102", "Method '{0}' of exported interface has or is using private name '{1}'."),
      Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1: diag(4103, ts2.DiagnosticCategory.Error, "Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1_4103", "Type parameter '{0}' of exported mapped object type is using private name '{1}'."),
      The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1: diag(4104, ts2.DiagnosticCategory.Error, "The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1_4104", "The type '{0}' is 'readonly' and cannot be assigned to the mutable type '{1}'."),
      Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter: diag(4105, ts2.DiagnosticCategory.Error, "Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter_4105", "Private or protected member '{0}' cannot be accessed on a type parameter."),
      Parameter_0_of_accessor_has_or_is_using_private_name_1: diag(4106, ts2.DiagnosticCategory.Error, "Parameter_0_of_accessor_has_or_is_using_private_name_1_4106", "Parameter '{0}' of accessor has or is using private name '{1}'."),
      Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2: diag(4107, ts2.DiagnosticCategory.Error, "Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2_4107", "Parameter '{0}' of accessor has or is using name '{1}' from private module '{2}'."),
      Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: diag(4108, ts2.DiagnosticCategory.Error, "Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4108", "Parameter '{0}' of accessor has or is using name '{1}' from external module '{2}' but cannot be named."),
      Type_arguments_for_0_circularly_reference_themselves: diag(4109, ts2.DiagnosticCategory.Error, "Type_arguments_for_0_circularly_reference_themselves_4109", "Type arguments for '{0}' circularly reference themselves."),
      Tuple_type_arguments_circularly_reference_themselves: diag(4110, ts2.DiagnosticCategory.Error, "Tuple_type_arguments_circularly_reference_themselves_4110", "Tuple type arguments circularly reference themselves."),
      Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0: diag(4111, ts2.DiagnosticCategory.Error, "Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0_4111", "Property '{0}' comes from an index signature, so it must be accessed with ['{0}']."),
      This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class: diag(4112, ts2.DiagnosticCategory.Error, "This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another__4112", "This member cannot have an 'override' modifier because its containing class '{0}' does not extend another class."),
      This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0: diag(4113, ts2.DiagnosticCategory.Error, "This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_4113", "This member cannot have an 'override' modifier because it is not declared in the base class '{0}'."),
      This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0: diag(4114, ts2.DiagnosticCategory.Error, "This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0_4114", "This member must have an 'override' modifier because it overrides a member in the base class '{0}'."),
      This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0: diag(4115, ts2.DiagnosticCategory.Error, "This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0_4115", "This parameter property must have an 'override' modifier because it overrides a member in base class '{0}'."),
      This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0: diag(4116, ts2.DiagnosticCategory.Error, "This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared__4116", "This member must have an 'override' modifier because it overrides an abstract method that is declared in the base class '{0}'."),
      This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1: diag(4117, ts2.DiagnosticCategory.Error, "This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you__4117", "This member cannot have an 'override' modifier because it is not declared in the base class '{0}'. Did you mean '{1}'?"),
      The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized: diag(4118, ts2.DiagnosticCategory.Error, "The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized_4118", "The type of this node cannot be serialized because its property '{0}' cannot be serialized."),
      This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0: diag(4119, ts2.DiagnosticCategory.Error, "This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_4119", "This member must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'."),
      This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0: diag(4120, ts2.DiagnosticCategory.Error, "This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_4120", "This parameter property must have a JSDoc comment with an '@override' tag because it overrides a member in the base class '{0}'."),
      This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class: diag(4121, ts2.DiagnosticCategory.Error, "This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_4121", "This member cannot have a JSDoc comment with an '@override' tag because its containing class '{0}' does not extend another class."),
      This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0: diag(4122, ts2.DiagnosticCategory.Error, "This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base__4122", "This member cannot have a JSDoc comment with an '@override' tag because it is not declared in the base class '{0}'."),
      This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1: diag(4123, ts2.DiagnosticCategory.Error, "This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base__4123", "This member cannot have a JSDoc comment with an 'override' tag because it is not declared in the base class '{0}'. Did you mean '{1}'?"),
      Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next: diag(4124, ts2.DiagnosticCategory.Error, "Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_w_4124", "Compiler option '{0}' of value '{1}' is unstable. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'."),
      The_current_host_does_not_support_the_0_option: diag(5001, ts2.DiagnosticCategory.Error, "The_current_host_does_not_support_the_0_option_5001", "The current host does not support the '{0}' option."),
      Cannot_find_the_common_subdirectory_path_for_the_input_files: diag(5009, ts2.DiagnosticCategory.Error, "Cannot_find_the_common_subdirectory_path_for_the_input_files_5009", "Cannot find the common subdirectory path for the input files."),
      File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0: diag(5010, ts2.DiagnosticCategory.Error, "File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0_5010", "File specification cannot end in a recursive directory wildcard ('**'): '{0}'."),
      Cannot_read_file_0_Colon_1: diag(5012, ts2.DiagnosticCategory.Error, "Cannot_read_file_0_Colon_1_5012", "Cannot read file '{0}': {1}."),
      Failed_to_parse_file_0_Colon_1: diag(5014, ts2.DiagnosticCategory.Error, "Failed_to_parse_file_0_Colon_1_5014", "Failed to parse file '{0}': {1}."),
      Unknown_compiler_option_0: diag(5023, ts2.DiagnosticCategory.Error, "Unknown_compiler_option_0_5023", "Unknown compiler option '{0}'."),
      Compiler_option_0_requires_a_value_of_type_1: diag(5024, ts2.DiagnosticCategory.Error, "Compiler_option_0_requires_a_value_of_type_1_5024", "Compiler option '{0}' requires a value of type {1}."),
      Unknown_compiler_option_0_Did_you_mean_1: diag(5025, ts2.DiagnosticCategory.Error, "Unknown_compiler_option_0_Did_you_mean_1_5025", "Unknown compiler option '{0}'. Did you mean '{1}'?"),
      Could_not_write_file_0_Colon_1: diag(5033, ts2.DiagnosticCategory.Error, "Could_not_write_file_0_Colon_1_5033", "Could not write file '{0}': {1}."),
      Option_project_cannot_be_mixed_with_source_files_on_a_command_line: diag(5042, ts2.DiagnosticCategory.Error, "Option_project_cannot_be_mixed_with_source_files_on_a_command_line_5042", "Option 'project' cannot be mixed with source files on a command line."),
      Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher: diag(5047, ts2.DiagnosticCategory.Error, "Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES_5047", "Option 'isolatedModules' can only be used when either option '--module' is provided or option 'target' is 'ES2015' or higher."),
      Option_0_cannot_be_specified_when_option_target_is_ES3: diag(5048, ts2.DiagnosticCategory.Error, "Option_0_cannot_be_specified_when_option_target_is_ES3_5048", "Option '{0}' cannot be specified when option 'target' is 'ES3'."),
      Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: diag(5051, ts2.DiagnosticCategory.Error, "Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided_5051", "Option '{0} can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided."),
      Option_0_cannot_be_specified_without_specifying_option_1: diag(5052, ts2.DiagnosticCategory.Error, "Option_0_cannot_be_specified_without_specifying_option_1_5052", "Option '{0}' cannot be specified without specifying option '{1}'."),
      Option_0_cannot_be_specified_with_option_1: diag(5053, ts2.DiagnosticCategory.Error, "Option_0_cannot_be_specified_with_option_1_5053", "Option '{0}' cannot be specified with option '{1}'."),
      A_tsconfig_json_file_is_already_defined_at_Colon_0: diag(5054, ts2.DiagnosticCategory.Error, "A_tsconfig_json_file_is_already_defined_at_Colon_0_5054", "A 'tsconfig.json' file is already defined at: '{0}'."),
      Cannot_write_file_0_because_it_would_overwrite_input_file: diag(5055, ts2.DiagnosticCategory.Error, "Cannot_write_file_0_because_it_would_overwrite_input_file_5055", "Cannot write file '{0}' because it would overwrite input file."),
      Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files: diag(5056, ts2.DiagnosticCategory.Error, "Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files_5056", "Cannot write file '{0}' because it would be overwritten by multiple input files."),
      Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0: diag(5057, ts2.DiagnosticCategory.Error, "Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0_5057", "Cannot find a tsconfig.json file at the specified directory: '{0}'."),
      The_specified_path_does_not_exist_Colon_0: diag(5058, ts2.DiagnosticCategory.Error, "The_specified_path_does_not_exist_Colon_0_5058", "The specified path does not exist: '{0}'."),
      Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier: diag(5059, ts2.DiagnosticCategory.Error, "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059", "Invalid value for '--reactNamespace'. '{0}' is not a valid identifier."),
      Pattern_0_can_have_at_most_one_Asterisk_character: diag(5061, ts2.DiagnosticCategory.Error, "Pattern_0_can_have_at_most_one_Asterisk_character_5061", "Pattern '{0}' can have at most one '*' character."),
      Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character: diag(5062, ts2.DiagnosticCategory.Error, "Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character_5062", "Substitution '{0}' in pattern '{1}' can have at most one '*' character."),
      Substitutions_for_pattern_0_should_be_an_array: diag(5063, ts2.DiagnosticCategory.Error, "Substitutions_for_pattern_0_should_be_an_array_5063", "Substitutions for pattern '{0}' should be an array."),
      Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2: diag(5064, ts2.DiagnosticCategory.Error, "Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2_5064", "Substitution '{0}' for pattern '{1}' has incorrect type, expected 'string', got '{2}'."),
      File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0: diag(5065, ts2.DiagnosticCategory.Error, "File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildca_5065", "File specification cannot contain a parent directory ('..') that appears after a recursive directory wildcard ('**'): '{0}'."),
      Substitutions_for_pattern_0_shouldn_t_be_an_empty_array: diag(5066, ts2.DiagnosticCategory.Error, "Substitutions_for_pattern_0_shouldn_t_be_an_empty_array_5066", "Substitutions for pattern '{0}' shouldn't be an empty array."),
      Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name: diag(5067, ts2.DiagnosticCategory.Error, "Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name_5067", "Invalid value for 'jsxFactory'. '{0}' is not a valid identifier or qualified-name."),
      Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript_files_Learn_more_at_https_Colon_Slash_Slashaka_ms_Slashtsconfig: diag(5068, ts2.DiagnosticCategory.Error, "Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript__5068", "Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig."),
      Option_0_cannot_be_specified_without_specifying_option_1_or_option_2: diag(5069, ts2.DiagnosticCategory.Error, "Option_0_cannot_be_specified_without_specifying_option_1_or_option_2_5069", "Option '{0}' cannot be specified without specifying option '{1}' or option '{2}'."),
      Option_resolveJsonModule_cannot_be_specified_without_node_module_resolution_strategy: diag(5070, ts2.DiagnosticCategory.Error, "Option_resolveJsonModule_cannot_be_specified_without_node_module_resolution_strategy_5070", "Option '--resolveJsonModule' cannot be specified without 'node' module resolution strategy."),
      Option_resolveJsonModule_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_esNext: diag(5071, ts2.DiagnosticCategory.Error, "Option_resolveJsonModule_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_5071", "Option '--resolveJsonModule' can only be specified when module code generation is 'commonjs', 'amd', 'es2015' or 'esNext'."),
      Unknown_build_option_0: diag(5072, ts2.DiagnosticCategory.Error, "Unknown_build_option_0_5072", "Unknown build option '{0}'."),
      Build_option_0_requires_a_value_of_type_1: diag(5073, ts2.DiagnosticCategory.Error, "Build_option_0_requires_a_value_of_type_1_5073", "Build option '{0}' requires a value of type {1}."),
      Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBuildInfoFile_is_specified: diag(5074, ts2.DiagnosticCategory.Error, "Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBui_5074", "Option '--incremental' can only be specified using tsconfig, emitting to single file or when option '--tsBuildInfoFile' is specified."),
      _0_is_assignable_to_the_constraint_of_type_1_but_1_could_be_instantiated_with_a_different_subtype_of_constraint_2: diag(5075, ts2.DiagnosticCategory.Error, "_0_is_assignable_to_the_constraint_of_type_1_but_1_could_be_instantiated_with_a_different_subtype_of_5075", "'{0}' is assignable to the constraint of type '{1}', but '{1}' could be instantiated with a different subtype of constraint '{2}'."),
      _0_and_1_operations_cannot_be_mixed_without_parentheses: diag(5076, ts2.DiagnosticCategory.Error, "_0_and_1_operations_cannot_be_mixed_without_parentheses_5076", "'{0}' and '{1}' operations cannot be mixed without parentheses."),
      Unknown_build_option_0_Did_you_mean_1: diag(5077, ts2.DiagnosticCategory.Error, "Unknown_build_option_0_Did_you_mean_1_5077", "Unknown build option '{0}'. Did you mean '{1}'?"),
      Unknown_watch_option_0: diag(5078, ts2.DiagnosticCategory.Error, "Unknown_watch_option_0_5078", "Unknown watch option '{0}'."),
      Unknown_watch_option_0_Did_you_mean_1: diag(5079, ts2.DiagnosticCategory.Error, "Unknown_watch_option_0_Did_you_mean_1_5079", "Unknown watch option '{0}'. Did you mean '{1}'?"),
      Watch_option_0_requires_a_value_of_type_1: diag(5080, ts2.DiagnosticCategory.Error, "Watch_option_0_requires_a_value_of_type_1_5080", "Watch option '{0}' requires a value of type {1}."),
      Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0: diag(5081, ts2.DiagnosticCategory.Error, "Cannot_find_a_tsconfig_json_file_at_the_current_directory_Colon_0_5081", "Cannot find a tsconfig.json file at the current directory: {0}."),
      _0_could_be_instantiated_with_an_arbitrary_type_which_could_be_unrelated_to_1: diag(5082, ts2.DiagnosticCategory.Error, "_0_could_be_instantiated_with_an_arbitrary_type_which_could_be_unrelated_to_1_5082", "'{0}' could be instantiated with an arbitrary type which could be unrelated to '{1}'."),
      Cannot_read_file_0: diag(5083, ts2.DiagnosticCategory.Error, "Cannot_read_file_0_5083", "Cannot read file '{0}'."),
      Tuple_members_must_all_have_names_or_all_not_have_names: diag(5084, ts2.DiagnosticCategory.Error, "Tuple_members_must_all_have_names_or_all_not_have_names_5084", "Tuple members must all have names or all not have names."),
      A_tuple_member_cannot_be_both_optional_and_rest: diag(5085, ts2.DiagnosticCategory.Error, "A_tuple_member_cannot_be_both_optional_and_rest_5085", "A tuple member cannot be both optional and rest."),
      A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_colon_rather_than_after_the_type: diag(5086, ts2.DiagnosticCategory.Error, "A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_c_5086", "A labeled tuple element is declared as optional with a question mark after the name and before the colon, rather than after the type."),
      A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type: diag(5087, ts2.DiagnosticCategory.Error, "A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type_5087", "A labeled tuple element is declared as rest with a '...' before the name, rather than before the type."),
      The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialized_A_type_annotation_is_necessary: diag(5088, ts2.DiagnosticCategory.Error, "The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialize_5088", "The inferred type of '{0}' references a type with a cyclic structure which cannot be trivially serialized. A type annotation is necessary."),
      Option_0_cannot_be_specified_when_option_jsx_is_1: diag(5089, ts2.DiagnosticCategory.Error, "Option_0_cannot_be_specified_when_option_jsx_is_1_5089", "Option '{0}' cannot be specified when option 'jsx' is '{1}'."),
      Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash: diag(5090, ts2.DiagnosticCategory.Error, "Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash_5090", "Non-relative paths are not allowed when 'baseUrl' is not set. Did you forget a leading './'?"),
      Option_preserveConstEnums_cannot_be_disabled_when_isolatedModules_is_enabled: diag(5091, ts2.DiagnosticCategory.Error, "Option_preserveConstEnums_cannot_be_disabled_when_isolatedModules_is_enabled_5091", "Option 'preserveConstEnums' cannot be disabled when 'isolatedModules' is enabled."),
      The_root_value_of_a_0_file_must_be_an_object: diag(5092, ts2.DiagnosticCategory.Error, "The_root_value_of_a_0_file_must_be_an_object_5092", "The root value of a '{0}' file must be an object."),
      Compiler_option_0_may_only_be_used_with_build: diag(5093, ts2.DiagnosticCategory.Error, "Compiler_option_0_may_only_be_used_with_build_5093", "Compiler option '--{0}' may only be used with '--build'."),
      Compiler_option_0_may_not_be_used_with_build: diag(5094, ts2.DiagnosticCategory.Error, "Compiler_option_0_may_not_be_used_with_build_5094", "Compiler option '--{0}' may not be used with '--build'."),
      Option_preserveValueImports_can_only_be_used_when_module_is_set_to_es2015_or_later: diag(5095, ts2.DiagnosticCategory.Error, "Option_preserveValueImports_can_only_be_used_when_module_is_set_to_es2015_or_later_5095", "Option 'preserveValueImports' can only be used when 'module' is set to 'es2015' or later."),
      Generates_a_sourcemap_for_each_corresponding_d_ts_file: diag(6e3, ts2.DiagnosticCategory.Message, "Generates_a_sourcemap_for_each_corresponding_d_ts_file_6000", "Generates a sourcemap for each corresponding '.d.ts' file."),
      Concatenate_and_emit_output_to_single_file: diag(6001, ts2.DiagnosticCategory.Message, "Concatenate_and_emit_output_to_single_file_6001", "Concatenate and emit output to single file."),
      Generates_corresponding_d_ts_file: diag(6002, ts2.DiagnosticCategory.Message, "Generates_corresponding_d_ts_file_6002", "Generates corresponding '.d.ts' file."),
      Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: diag(6004, ts2.DiagnosticCategory.Message, "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004", "Specify the location where debugger should locate TypeScript files instead of source locations."),
      Watch_input_files: diag(6005, ts2.DiagnosticCategory.Message, "Watch_input_files_6005", "Watch input files."),
      Redirect_output_structure_to_the_directory: diag(6006, ts2.DiagnosticCategory.Message, "Redirect_output_structure_to_the_directory_6006", "Redirect output structure to the directory."),
      Do_not_erase_const_enum_declarations_in_generated_code: diag(6007, ts2.DiagnosticCategory.Message, "Do_not_erase_const_enum_declarations_in_generated_code_6007", "Do not erase const enum declarations in generated code."),
      Do_not_emit_outputs_if_any_errors_were_reported: diag(6008, ts2.DiagnosticCategory.Message, "Do_not_emit_outputs_if_any_errors_were_reported_6008", "Do not emit outputs if any errors were reported."),
      Do_not_emit_comments_to_output: diag(6009, ts2.DiagnosticCategory.Message, "Do_not_emit_comments_to_output_6009", "Do not emit comments to output."),
      Do_not_emit_outputs: diag(6010, ts2.DiagnosticCategory.Message, "Do_not_emit_outputs_6010", "Do not emit outputs."),
      Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typechecking: diag(6011, ts2.DiagnosticCategory.Message, "Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typech_6011", "Allow default imports from modules with no default export. This does not affect code emit, just typechecking."),
      Skip_type_checking_of_declaration_files: diag(6012, ts2.DiagnosticCategory.Message, "Skip_type_checking_of_declaration_files_6012", "Skip type checking of declaration files."),
      Do_not_resolve_the_real_path_of_symlinks: diag(6013, ts2.DiagnosticCategory.Message, "Do_not_resolve_the_real_path_of_symlinks_6013", "Do not resolve the real path of symlinks."),
      Only_emit_d_ts_declaration_files: diag(6014, ts2.DiagnosticCategory.Message, "Only_emit_d_ts_declaration_files_6014", "Only emit '.d.ts' declaration files."),
      Specify_ECMAScript_target_version: diag(6015, ts2.DiagnosticCategory.Message, "Specify_ECMAScript_target_version_6015", "Specify ECMAScript target version."),
      Specify_module_code_generation: diag(6016, ts2.DiagnosticCategory.Message, "Specify_module_code_generation_6016", "Specify module code generation."),
      Print_this_message: diag(6017, ts2.DiagnosticCategory.Message, "Print_this_message_6017", "Print this message."),
      Print_the_compiler_s_version: diag(6019, ts2.DiagnosticCategory.Message, "Print_the_compiler_s_version_6019", "Print the compiler's version."),
      Compile_the_project_given_the_path_to_its_configuration_file_or_to_a_folder_with_a_tsconfig_json: diag(6020, ts2.DiagnosticCategory.Message, "Compile_the_project_given_the_path_to_its_configuration_file_or_to_a_folder_with_a_tsconfig_json_6020", "Compile the project given the path to its configuration file, or to a folder with a 'tsconfig.json'."),
      Syntax_Colon_0: diag(6023, ts2.DiagnosticCategory.Message, "Syntax_Colon_0_6023", "Syntax: {0}"),
      options: diag(6024, ts2.DiagnosticCategory.Message, "options_6024", "options"),
      file: diag(6025, ts2.DiagnosticCategory.Message, "file_6025", "file"),
      Examples_Colon_0: diag(6026, ts2.DiagnosticCategory.Message, "Examples_Colon_0_6026", "Examples: {0}"),
      Options_Colon: diag(6027, ts2.DiagnosticCategory.Message, "Options_Colon_6027", "Options:"),
      Version_0: diag(6029, ts2.DiagnosticCategory.Message, "Version_0_6029", "Version {0}"),
      Insert_command_line_options_and_files_from_a_file: diag(6030, ts2.DiagnosticCategory.Message, "Insert_command_line_options_and_files_from_a_file_6030", "Insert command line options and files from a file."),
      Starting_compilation_in_watch_mode: diag(6031, ts2.DiagnosticCategory.Message, "Starting_compilation_in_watch_mode_6031", "Starting compilation in watch mode..."),
      File_change_detected_Starting_incremental_compilation: diag(6032, ts2.DiagnosticCategory.Message, "File_change_detected_Starting_incremental_compilation_6032", "File change detected. Starting incremental compilation..."),
      KIND: diag(6034, ts2.DiagnosticCategory.Message, "KIND_6034", "KIND"),
      FILE: diag(6035, ts2.DiagnosticCategory.Message, "FILE_6035", "FILE"),
      VERSION: diag(6036, ts2.DiagnosticCategory.Message, "VERSION_6036", "VERSION"),
      LOCATION: diag(6037, ts2.DiagnosticCategory.Message, "LOCATION_6037", "LOCATION"),
      DIRECTORY: diag(6038, ts2.DiagnosticCategory.Message, "DIRECTORY_6038", "DIRECTORY"),
      STRATEGY: diag(6039, ts2.DiagnosticCategory.Message, "STRATEGY_6039", "STRATEGY"),
      FILE_OR_DIRECTORY: diag(6040, ts2.DiagnosticCategory.Message, "FILE_OR_DIRECTORY_6040", "FILE OR DIRECTORY"),
      Generates_corresponding_map_file: diag(6043, ts2.DiagnosticCategory.Message, "Generates_corresponding_map_file_6043", "Generates corresponding '.map' file."),
      Compiler_option_0_expects_an_argument: diag(6044, ts2.DiagnosticCategory.Error, "Compiler_option_0_expects_an_argument_6044", "Compiler option '{0}' expects an argument."),
      Unterminated_quoted_string_in_response_file_0: diag(6045, ts2.DiagnosticCategory.Error, "Unterminated_quoted_string_in_response_file_0_6045", "Unterminated quoted string in response file '{0}'."),
      Argument_for_0_option_must_be_Colon_1: diag(6046, ts2.DiagnosticCategory.Error, "Argument_for_0_option_must_be_Colon_1_6046", "Argument for '{0}' option must be: {1}."),
      Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1: diag(6048, ts2.DiagnosticCategory.Error, "Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1_6048", "Locale must be of the form <language> or <language>-<territory>. For example '{0}' or '{1}'."),
      Unable_to_open_file_0: diag(6050, ts2.DiagnosticCategory.Error, "Unable_to_open_file_0_6050", "Unable to open file '{0}'."),
      Corrupted_locale_file_0: diag(6051, ts2.DiagnosticCategory.Error, "Corrupted_locale_file_0_6051", "Corrupted locale file {0}."),
      Raise_error_on_expressions_and_declarations_with_an_implied_any_type: diag(6052, ts2.DiagnosticCategory.Message, "Raise_error_on_expressions_and_declarations_with_an_implied_any_type_6052", "Raise error on expressions and declarations with an implied 'any' type."),
      File_0_not_found: diag(6053, ts2.DiagnosticCategory.Error, "File_0_not_found_6053", "File '{0}' not found."),
      File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1: diag(6054, ts2.DiagnosticCategory.Error, "File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1_6054", "File '{0}' has an unsupported extension. The only supported extensions are {1}."),
      Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: diag(6055, ts2.DiagnosticCategory.Message, "Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures_6055", "Suppress noImplicitAny errors for indexing objects lacking index signatures."),
      Do_not_emit_declarations_for_code_that_has_an_internal_annotation: diag(6056, ts2.DiagnosticCategory.Message, "Do_not_emit_declarations_for_code_that_has_an_internal_annotation_6056", "Do not emit declarations for code that has an '@internal' annotation."),
      Specify_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir: diag(6058, ts2.DiagnosticCategory.Message, "Specify_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir_6058", "Specify the root directory of input files. Use to control the output directory structure with --outDir."),
      File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files: diag(6059, ts2.DiagnosticCategory.Error, "File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files_6059", "File '{0}' is not under 'rootDir' '{1}'. 'rootDir' is expected to contain all source files."),
      Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix: diag(6060, ts2.DiagnosticCategory.Message, "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060", "Specify the end of line sequence to be used when emitting files: 'CRLF' (dos) or 'LF' (unix)."),
      NEWLINE: diag(6061, ts2.DiagnosticCategory.Message, "NEWLINE_6061", "NEWLINE"),
      Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_null_on_command_line: diag(6064, ts2.DiagnosticCategory.Error, "Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_null_on_command_line_6064", "Option '{0}' can only be specified in 'tsconfig.json' file or set to 'null' on command line."),
      Enables_experimental_support_for_ES7_decorators: diag(6065, ts2.DiagnosticCategory.Message, "Enables_experimental_support_for_ES7_decorators_6065", "Enables experimental support for ES7 decorators."),
      Enables_experimental_support_for_emitting_type_metadata_for_decorators: diag(6066, ts2.DiagnosticCategory.Message, "Enables_experimental_support_for_emitting_type_metadata_for_decorators_6066", "Enables experimental support for emitting type metadata for decorators."),
      Specify_module_resolution_strategy_Colon_node_Node_js_or_classic_TypeScript_pre_1_6: diag(6069, ts2.DiagnosticCategory.Message, "Specify_module_resolution_strategy_Colon_node_Node_js_or_classic_TypeScript_pre_1_6_6069", "Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6)."),
      Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file: diag(6070, ts2.DiagnosticCategory.Message, "Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file_6070", "Initializes a TypeScript project and creates a tsconfig.json file."),
      Successfully_created_a_tsconfig_json_file: diag(6071, ts2.DiagnosticCategory.Message, "Successfully_created_a_tsconfig_json_file_6071", "Successfully created a tsconfig.json file."),
      Suppress_excess_property_checks_for_object_literals: diag(6072, ts2.DiagnosticCategory.Message, "Suppress_excess_property_checks_for_object_literals_6072", "Suppress excess property checks for object literals."),
      Stylize_errors_and_messages_using_color_and_context_experimental: diag(6073, ts2.DiagnosticCategory.Message, "Stylize_errors_and_messages_using_color_and_context_experimental_6073", "Stylize errors and messages using color and context (experimental)."),
      Do_not_report_errors_on_unused_labels: diag(6074, ts2.DiagnosticCategory.Message, "Do_not_report_errors_on_unused_labels_6074", "Do not report errors on unused labels."),
      Report_error_when_not_all_code_paths_in_function_return_a_value: diag(6075, ts2.DiagnosticCategory.Message, "Report_error_when_not_all_code_paths_in_function_return_a_value_6075", "Report error when not all code paths in function return a value."),
      Report_errors_for_fallthrough_cases_in_switch_statement: diag(6076, ts2.DiagnosticCategory.Message, "Report_errors_for_fallthrough_cases_in_switch_statement_6076", "Report errors for fallthrough cases in switch statement."),
      Do_not_report_errors_on_unreachable_code: diag(6077, ts2.DiagnosticCategory.Message, "Do_not_report_errors_on_unreachable_code_6077", "Do not report errors on unreachable code."),
      Disallow_inconsistently_cased_references_to_the_same_file: diag(6078, ts2.DiagnosticCategory.Message, "Disallow_inconsistently_cased_references_to_the_same_file_6078", "Disallow inconsistently-cased references to the same file."),
      Specify_library_files_to_be_included_in_the_compilation: diag(6079, ts2.DiagnosticCategory.Message, "Specify_library_files_to_be_included_in_the_compilation_6079", "Specify library files to be included in the compilation."),
      Specify_JSX_code_generation: diag(6080, ts2.DiagnosticCategory.Message, "Specify_JSX_code_generation_6080", "Specify JSX code generation."),
      File_0_has_an_unsupported_extension_so_skipping_it: diag(6081, ts2.DiagnosticCategory.Message, "File_0_has_an_unsupported_extension_so_skipping_it_6081", "File '{0}' has an unsupported extension, so skipping it."),
      Only_amd_and_system_modules_are_supported_alongside_0: diag(6082, ts2.DiagnosticCategory.Error, "Only_amd_and_system_modules_are_supported_alongside_0_6082", "Only 'amd' and 'system' modules are supported alongside --{0}."),
      Base_directory_to_resolve_non_absolute_module_names: diag(6083, ts2.DiagnosticCategory.Message, "Base_directory_to_resolve_non_absolute_module_names_6083", "Base directory to resolve non-absolute module names."),
      Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react_JSX_emit: diag(6084, ts2.DiagnosticCategory.Message, "Deprecated_Use_jsxFactory_instead_Specify_the_object_invoked_for_createElement_when_targeting_react__6084", "[Deprecated] Use '--jsxFactory' instead. Specify the object invoked for createElement when targeting 'react' JSX emit"),
      Enable_tracing_of_the_name_resolution_process: diag(6085, ts2.DiagnosticCategory.Message, "Enable_tracing_of_the_name_resolution_process_6085", "Enable tracing of the name resolution process."),
      Resolving_module_0_from_1: diag(6086, ts2.DiagnosticCategory.Message, "Resolving_module_0_from_1_6086", "======== Resolving module '{0}' from '{1}'. ========"),
      Explicitly_specified_module_resolution_kind_Colon_0: diag(6087, ts2.DiagnosticCategory.Message, "Explicitly_specified_module_resolution_kind_Colon_0_6087", "Explicitly specified module resolution kind: '{0}'."),
      Module_resolution_kind_is_not_specified_using_0: diag(6088, ts2.DiagnosticCategory.Message, "Module_resolution_kind_is_not_specified_using_0_6088", "Module resolution kind is not specified, using '{0}'."),
      Module_name_0_was_successfully_resolved_to_1: diag(6089, ts2.DiagnosticCategory.Message, "Module_name_0_was_successfully_resolved_to_1_6089", "======== Module name '{0}' was successfully resolved to '{1}'. ========"),
      Module_name_0_was_not_resolved: diag(6090, ts2.DiagnosticCategory.Message, "Module_name_0_was_not_resolved_6090", "======== Module name '{0}' was not resolved. ========"),
      paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0: diag(6091, ts2.DiagnosticCategory.Message, "paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0_6091", "'paths' option is specified, looking for a pattern to match module name '{0}'."),
      Module_name_0_matched_pattern_1: diag(6092, ts2.DiagnosticCategory.Message, "Module_name_0_matched_pattern_1_6092", "Module name '{0}', matched pattern '{1}'."),
      Trying_substitution_0_candidate_module_location_Colon_1: diag(6093, ts2.DiagnosticCategory.Message, "Trying_substitution_0_candidate_module_location_Colon_1_6093", "Trying substitution '{0}', candidate module location: '{1}'."),
      Resolving_module_name_0_relative_to_base_url_1_2: diag(6094, ts2.DiagnosticCategory.Message, "Resolving_module_name_0_relative_to_base_url_1_2_6094", "Resolving module name '{0}' relative to base url '{1}' - '{2}'."),
      Loading_module_as_file_Slash_folder_candidate_module_location_0_target_file_type_1: diag(6095, ts2.DiagnosticCategory.Message, "Loading_module_as_file_Slash_folder_candidate_module_location_0_target_file_type_1_6095", "Loading module as file / folder, candidate module location '{0}', target file type '{1}'."),
      File_0_does_not_exist: diag(6096, ts2.DiagnosticCategory.Message, "File_0_does_not_exist_6096", "File '{0}' does not exist."),
      File_0_exist_use_it_as_a_name_resolution_result: diag(6097, ts2.DiagnosticCategory.Message, "File_0_exist_use_it_as_a_name_resolution_result_6097", "File '{0}' exist - use it as a name resolution result."),
      Loading_module_0_from_node_modules_folder_target_file_type_1: diag(6098, ts2.DiagnosticCategory.Message, "Loading_module_0_from_node_modules_folder_target_file_type_1_6098", "Loading module '{0}' from 'node_modules' folder, target file type '{1}'."),
      Found_package_json_at_0: diag(6099, ts2.DiagnosticCategory.Message, "Found_package_json_at_0_6099", "Found 'package.json' at '{0}'."),
      package_json_does_not_have_a_0_field: diag(6100, ts2.DiagnosticCategory.Message, "package_json_does_not_have_a_0_field_6100", "'package.json' does not have a '{0}' field."),
      package_json_has_0_field_1_that_references_2: diag(6101, ts2.DiagnosticCategory.Message, "package_json_has_0_field_1_that_references_2_6101", "'package.json' has '{0}' field '{1}' that references '{2}'."),
      Allow_javascript_files_to_be_compiled: diag(6102, ts2.DiagnosticCategory.Message, "Allow_javascript_files_to_be_compiled_6102", "Allow javascript files to be compiled."),
      Checking_if_0_is_the_longest_matching_prefix_for_1_2: diag(6104, ts2.DiagnosticCategory.Message, "Checking_if_0_is_the_longest_matching_prefix_for_1_2_6104", "Checking if '{0}' is the longest matching prefix for '{1}' - '{2}'."),
      Expected_type_of_0_field_in_package_json_to_be_1_got_2: diag(6105, ts2.DiagnosticCategory.Message, "Expected_type_of_0_field_in_package_json_to_be_1_got_2_6105", "Expected type of '{0}' field in 'package.json' to be '{1}', got '{2}'."),
      baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1: diag(6106, ts2.DiagnosticCategory.Message, "baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1_6106", "'baseUrl' option is set to '{0}', using this value to resolve non-relative module name '{1}'."),
      rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0: diag(6107, ts2.DiagnosticCategory.Message, "rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0_6107", "'rootDirs' option is set, using it to resolve relative module name '{0}'."),
      Longest_matching_prefix_for_0_is_1: diag(6108, ts2.DiagnosticCategory.Message, "Longest_matching_prefix_for_0_is_1_6108", "Longest matching prefix for '{0}' is '{1}'."),
      Loading_0_from_the_root_dir_1_candidate_location_2: diag(6109, ts2.DiagnosticCategory.Message, "Loading_0_from_the_root_dir_1_candidate_location_2_6109", "Loading '{0}' from the root dir '{1}', candidate location '{2}'."),
      Trying_other_entries_in_rootDirs: diag(6110, ts2.DiagnosticCategory.Message, "Trying_other_entries_in_rootDirs_6110", "Trying other entries in 'rootDirs'."),
      Module_resolution_using_rootDirs_has_failed: diag(6111, ts2.DiagnosticCategory.Message, "Module_resolution_using_rootDirs_has_failed_6111", "Module resolution using 'rootDirs' has failed."),
      Do_not_emit_use_strict_directives_in_module_output: diag(6112, ts2.DiagnosticCategory.Message, "Do_not_emit_use_strict_directives_in_module_output_6112", "Do not emit 'use strict' directives in module output."),
      Enable_strict_null_checks: diag(6113, ts2.DiagnosticCategory.Message, "Enable_strict_null_checks_6113", "Enable strict null checks."),
      Unknown_option_excludes_Did_you_mean_exclude: diag(6114, ts2.DiagnosticCategory.Error, "Unknown_option_excludes_Did_you_mean_exclude_6114", "Unknown option 'excludes'. Did you mean 'exclude'?"),
      Raise_error_on_this_expressions_with_an_implied_any_type: diag(6115, ts2.DiagnosticCategory.Message, "Raise_error_on_this_expressions_with_an_implied_any_type_6115", "Raise error on 'this' expressions with an implied 'any' type."),
      Resolving_type_reference_directive_0_containing_file_1_root_directory_2: diag(6116, ts2.DiagnosticCategory.Message, "Resolving_type_reference_directive_0_containing_file_1_root_directory_2_6116", "======== Resolving type reference directive '{0}', containing file '{1}', root directory '{2}'. ========"),
      Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2: diag(6119, ts2.DiagnosticCategory.Message, "Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2_6119", "======== Type reference directive '{0}' was successfully resolved to '{1}', primary: {2}. ========"),
      Type_reference_directive_0_was_not_resolved: diag(6120, ts2.DiagnosticCategory.Message, "Type_reference_directive_0_was_not_resolved_6120", "======== Type reference directive '{0}' was not resolved. ========"),
      Resolving_with_primary_search_path_0: diag(6121, ts2.DiagnosticCategory.Message, "Resolving_with_primary_search_path_0_6121", "Resolving with primary search path '{0}'."),
      Root_directory_cannot_be_determined_skipping_primary_search_paths: diag(6122, ts2.DiagnosticCategory.Message, "Root_directory_cannot_be_determined_skipping_primary_search_paths_6122", "Root directory cannot be determined, skipping primary search paths."),
      Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set: diag(6123, ts2.DiagnosticCategory.Message, "Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set_6123", "======== Resolving type reference directive '{0}', containing file '{1}', root directory not set. ========"),
      Type_declaration_files_to_be_included_in_compilation: diag(6124, ts2.DiagnosticCategory.Message, "Type_declaration_files_to_be_included_in_compilation_6124", "Type declaration files to be included in compilation."),
      Looking_up_in_node_modules_folder_initial_location_0: diag(6125, ts2.DiagnosticCategory.Message, "Looking_up_in_node_modules_folder_initial_location_0_6125", "Looking up in 'node_modules' folder, initial location '{0}'."),
      Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_modules_folder: diag(6126, ts2.DiagnosticCategory.Message, "Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_mod_6126", "Containing file is not specified and root directory cannot be determined, skipping lookup in 'node_modules' folder."),
      Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1: diag(6127, ts2.DiagnosticCategory.Message, "Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1_6127", "======== Resolving type reference directive '{0}', containing file not set, root directory '{1}'. ========"),
      Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set: diag(6128, ts2.DiagnosticCategory.Message, "Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set_6128", "======== Resolving type reference directive '{0}', containing file not set, root directory not set. ========"),
      Resolving_real_path_for_0_result_1: diag(6130, ts2.DiagnosticCategory.Message, "Resolving_real_path_for_0_result_1_6130", "Resolving real path for '{0}', result '{1}'."),
      Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: diag(6131, ts2.DiagnosticCategory.Error, "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'."),
      File_name_0_has_a_1_extension_stripping_it: diag(6132, ts2.DiagnosticCategory.Message, "File_name_0_has_a_1_extension_stripping_it_6132", "File name '{0}' has a '{1}' extension - stripping it."),
      _0_is_declared_but_its_value_is_never_read: diag(6133, ts2.DiagnosticCategory.Error, "_0_is_declared_but_its_value_is_never_read_6133", "'{0}' is declared but its value is never read.", true),
      Report_errors_on_unused_locals: diag(6134, ts2.DiagnosticCategory.Message, "Report_errors_on_unused_locals_6134", "Report errors on unused locals."),
      Report_errors_on_unused_parameters: diag(6135, ts2.DiagnosticCategory.Message, "Report_errors_on_unused_parameters_6135", "Report errors on unused parameters."),
      The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: diag(6136, ts2.DiagnosticCategory.Message, "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", "The maximum dependency depth to search under node_modules and load JavaScript files."),
      Cannot_import_type_declaration_files_Consider_importing_0_instead_of_1: diag(6137, ts2.DiagnosticCategory.Error, "Cannot_import_type_declaration_files_Consider_importing_0_instead_of_1_6137", "Cannot import type declaration files. Consider importing '{0}' instead of '{1}'."),
      Property_0_is_declared_but_its_value_is_never_read: diag(6138, ts2.DiagnosticCategory.Error, "Property_0_is_declared_but_its_value_is_never_read_6138", "Property '{0}' is declared but its value is never read.", true),
      Import_emit_helpers_from_tslib: diag(6139, ts2.DiagnosticCategory.Message, "Import_emit_helpers_from_tslib_6139", "Import emit helpers from 'tslib'."),
      Auto_discovery_for_typings_is_enabled_in_project_0_Running_extra_resolution_pass_for_module_1_using_cache_location_2: diag(6140, ts2.DiagnosticCategory.Error, "Auto_discovery_for_typings_is_enabled_in_project_0_Running_extra_resolution_pass_for_module_1_using__6140", "Auto discovery for typings is enabled in project '{0}'. Running extra resolution pass for module '{1}' using cache location '{2}'."),
      Parse_in_strict_mode_and_emit_use_strict_for_each_source_file: diag(6141, ts2.DiagnosticCategory.Message, "Parse_in_strict_mode_and_emit_use_strict_for_each_source_file_6141", 'Parse in strict mode and emit "use strict" for each source file.'),
      Module_0_was_resolved_to_1_but_jsx_is_not_set: diag(6142, ts2.DiagnosticCategory.Error, "Module_0_was_resolved_to_1_but_jsx_is_not_set_6142", "Module '{0}' was resolved to '{1}', but '--jsx' is not set."),
      Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1: diag(6144, ts2.DiagnosticCategory.Message, "Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1_6144", "Module '{0}' was resolved as locally declared ambient module in file '{1}'."),
      Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified: diag(6145, ts2.DiagnosticCategory.Message, "Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified_6145", "Module '{0}' was resolved as ambient module declared in '{1}' since this file was not modified."),
      Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h: diag(6146, ts2.DiagnosticCategory.Message, "Specify_the_JSX_factory_function_to_use_when_targeting_react_JSX_emit_e_g_React_createElement_or_h_6146", "Specify the JSX factory function to use when targeting 'react' JSX emit, e.g. 'React.createElement' or 'h'."),
      Resolution_for_module_0_was_found_in_cache_from_location_1: diag(6147, ts2.DiagnosticCategory.Message, "Resolution_for_module_0_was_found_in_cache_from_location_1_6147", "Resolution for module '{0}' was found in cache from location '{1}'."),
      Directory_0_does_not_exist_skipping_all_lookups_in_it: diag(6148, ts2.DiagnosticCategory.Message, "Directory_0_does_not_exist_skipping_all_lookups_in_it_6148", "Directory '{0}' does not exist, skipping all lookups in it."),
      Show_diagnostic_information: diag(6149, ts2.DiagnosticCategory.Message, "Show_diagnostic_information_6149", "Show diagnostic information."),
      Show_verbose_diagnostic_information: diag(6150, ts2.DiagnosticCategory.Message, "Show_verbose_diagnostic_information_6150", "Show verbose diagnostic information."),
      Emit_a_single_file_with_source_maps_instead_of_having_a_separate_file: diag(6151, ts2.DiagnosticCategory.Message, "Emit_a_single_file_with_source_maps_instead_of_having_a_separate_file_6151", "Emit a single file with source maps instead of having a separate file."),
      Emit_the_source_alongside_the_sourcemaps_within_a_single_file_requires_inlineSourceMap_or_sourceMap_to_be_set: diag(6152, ts2.DiagnosticCategory.Message, "Emit_the_source_alongside_the_sourcemaps_within_a_single_file_requires_inlineSourceMap_or_sourceMap__6152", "Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set."),
      Transpile_each_file_as_a_separate_module_similar_to_ts_transpileModule: diag(6153, ts2.DiagnosticCategory.Message, "Transpile_each_file_as_a_separate_module_similar_to_ts_transpileModule_6153", "Transpile each file as a separate module (similar to 'ts.transpileModule')."),
      Print_names_of_generated_files_part_of_the_compilation: diag(6154, ts2.DiagnosticCategory.Message, "Print_names_of_generated_files_part_of_the_compilation_6154", "Print names of generated files part of the compilation."),
      Print_names_of_files_part_of_the_compilation: diag(6155, ts2.DiagnosticCategory.Message, "Print_names_of_files_part_of_the_compilation_6155", "Print names of files part of the compilation."),
      The_locale_used_when_displaying_messages_to_the_user_e_g_en_us: diag(6156, ts2.DiagnosticCategory.Message, "The_locale_used_when_displaying_messages_to_the_user_e_g_en_us_6156", "The locale used when displaying messages to the user (e.g. 'en-us')"),
      Do_not_generate_custom_helper_functions_like_extends_in_compiled_output: diag(6157, ts2.DiagnosticCategory.Message, "Do_not_generate_custom_helper_functions_like_extends_in_compiled_output_6157", "Do not generate custom helper functions like '__extends' in compiled output."),
      Do_not_include_the_default_library_file_lib_d_ts: diag(6158, ts2.DiagnosticCategory.Message, "Do_not_include_the_default_library_file_lib_d_ts_6158", "Do not include the default library file (lib.d.ts)."),
      Do_not_add_triple_slash_references_or_imported_modules_to_the_list_of_compiled_files: diag(6159, ts2.DiagnosticCategory.Message, "Do_not_add_triple_slash_references_or_imported_modules_to_the_list_of_compiled_files_6159", "Do not add triple-slash references or imported modules to the list of compiled files."),
      Deprecated_Use_skipLibCheck_instead_Skip_type_checking_of_default_library_declaration_files: diag(6160, ts2.DiagnosticCategory.Message, "Deprecated_Use_skipLibCheck_instead_Skip_type_checking_of_default_library_declaration_files_6160", "[Deprecated] Use '--skipLibCheck' instead. Skip type checking of default library declaration files."),
      List_of_folders_to_include_type_definitions_from: diag(6161, ts2.DiagnosticCategory.Message, "List_of_folders_to_include_type_definitions_from_6161", "List of folders to include type definitions from."),
      Disable_size_limitations_on_JavaScript_projects: diag(6162, ts2.DiagnosticCategory.Message, "Disable_size_limitations_on_JavaScript_projects_6162", "Disable size limitations on JavaScript projects."),
      The_character_set_of_the_input_files: diag(6163, ts2.DiagnosticCategory.Message, "The_character_set_of_the_input_files_6163", "The character set of the input files."),
      Do_not_truncate_error_messages: diag(6165, ts2.DiagnosticCategory.Message, "Do_not_truncate_error_messages_6165", "Do not truncate error messages."),
      Output_directory_for_generated_declaration_files: diag(6166, ts2.DiagnosticCategory.Message, "Output_directory_for_generated_declaration_files_6166", "Output directory for generated declaration files."),
      A_series_of_entries_which_re_map_imports_to_lookup_locations_relative_to_the_baseUrl: diag(6167, ts2.DiagnosticCategory.Message, "A_series_of_entries_which_re_map_imports_to_lookup_locations_relative_to_the_baseUrl_6167", "A series of entries which re-map imports to lookup locations relative to the 'baseUrl'."),
      List_of_root_folders_whose_combined_content_represents_the_structure_of_the_project_at_runtime: diag(6168, ts2.DiagnosticCategory.Message, "List_of_root_folders_whose_combined_content_represents_the_structure_of_the_project_at_runtime_6168", "List of root folders whose combined content represents the structure of the project at runtime."),
      Show_all_compiler_options: diag(6169, ts2.DiagnosticCategory.Message, "Show_all_compiler_options_6169", "Show all compiler options."),
      Deprecated_Use_outFile_instead_Concatenate_and_emit_output_to_single_file: diag(6170, ts2.DiagnosticCategory.Message, "Deprecated_Use_outFile_instead_Concatenate_and_emit_output_to_single_file_6170", "[Deprecated] Use '--outFile' instead. Concatenate and emit output to single file"),
      Command_line_Options: diag(6171, ts2.DiagnosticCategory.Message, "Command_line_Options_6171", "Command-line Options"),
      Provide_full_support_for_iterables_in_for_of_spread_and_destructuring_when_targeting_ES5_or_ES3: diag(6179, ts2.DiagnosticCategory.Message, "Provide_full_support_for_iterables_in_for_of_spread_and_destructuring_when_targeting_ES5_or_ES3_6179", "Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'."),
      Enable_all_strict_type_checking_options: diag(6180, ts2.DiagnosticCategory.Message, "Enable_all_strict_type_checking_options_6180", "Enable all strict type-checking options."),
      List_of_language_service_plugins: diag(6181, ts2.DiagnosticCategory.Message, "List_of_language_service_plugins_6181", "List of language service plugins."),
      Scoped_package_detected_looking_in_0: diag(6182, ts2.DiagnosticCategory.Message, "Scoped_package_detected_looking_in_0_6182", "Scoped package detected, looking in '{0}'"),
      Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2: diag(6183, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_6183", "Reusing resolution of module '{0}' from '{1}' of old program, it was successfully resolved to '{2}'."),
      Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3: diag(6184, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package__6184", "Reusing resolution of module '{0}' from '{1}' of old program, it was successfully resolved to '{2}' with Package ID '{3}'."),
      Enable_strict_checking_of_function_types: diag(6186, ts2.DiagnosticCategory.Message, "Enable_strict_checking_of_function_types_6186", "Enable strict checking of function types."),
      Enable_strict_checking_of_property_initialization_in_classes: diag(6187, ts2.DiagnosticCategory.Message, "Enable_strict_checking_of_property_initialization_in_classes_6187", "Enable strict checking of property initialization in classes."),
      Numeric_separators_are_not_allowed_here: diag(6188, ts2.DiagnosticCategory.Error, "Numeric_separators_are_not_allowed_here_6188", "Numeric separators are not allowed here."),
      Multiple_consecutive_numeric_separators_are_not_permitted: diag(6189, ts2.DiagnosticCategory.Error, "Multiple_consecutive_numeric_separators_are_not_permitted_6189", "Multiple consecutive numeric separators are not permitted."),
      Whether_to_keep_outdated_console_output_in_watch_mode_instead_of_clearing_the_screen: diag(6191, ts2.DiagnosticCategory.Message, "Whether_to_keep_outdated_console_output_in_watch_mode_instead_of_clearing_the_screen_6191", "Whether to keep outdated console output in watch mode instead of clearing the screen."),
      All_imports_in_import_declaration_are_unused: diag(6192, ts2.DiagnosticCategory.Error, "All_imports_in_import_declaration_are_unused_6192", "All imports in import declaration are unused.", true),
      Found_1_error_Watching_for_file_changes: diag(6193, ts2.DiagnosticCategory.Message, "Found_1_error_Watching_for_file_changes_6193", "Found 1 error. Watching for file changes."),
      Found_0_errors_Watching_for_file_changes: diag(6194, ts2.DiagnosticCategory.Message, "Found_0_errors_Watching_for_file_changes_6194", "Found {0} errors. Watching for file changes."),
      Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols: diag(6195, ts2.DiagnosticCategory.Message, "Resolve_keyof_to_string_valued_property_names_only_no_numbers_or_symbols_6195", "Resolve 'keyof' to string valued property names only (no numbers or symbols)."),
      _0_is_declared_but_never_used: diag(6196, ts2.DiagnosticCategory.Error, "_0_is_declared_but_never_used_6196", "'{0}' is declared but never used.", true),
      Include_modules_imported_with_json_extension: diag(6197, ts2.DiagnosticCategory.Message, "Include_modules_imported_with_json_extension_6197", "Include modules imported with '.json' extension"),
      All_destructured_elements_are_unused: diag(6198, ts2.DiagnosticCategory.Error, "All_destructured_elements_are_unused_6198", "All destructured elements are unused.", true),
      All_variables_are_unused: diag(6199, ts2.DiagnosticCategory.Error, "All_variables_are_unused_6199", "All variables are unused.", true),
      Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0: diag(6200, ts2.DiagnosticCategory.Error, "Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0_6200", "Definitions of the following identifiers conflict with those in another file: {0}"),
      Conflicts_are_in_this_file: diag(6201, ts2.DiagnosticCategory.Message, "Conflicts_are_in_this_file_6201", "Conflicts are in this file."),
      Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0: diag(6202, ts2.DiagnosticCategory.Error, "Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0_6202", "Project references may not form a circular graph. Cycle detected: {0}"),
      _0_was_also_declared_here: diag(6203, ts2.DiagnosticCategory.Message, "_0_was_also_declared_here_6203", "'{0}' was also declared here."),
      and_here: diag(6204, ts2.DiagnosticCategory.Message, "and_here_6204", "and here."),
      All_type_parameters_are_unused: diag(6205, ts2.DiagnosticCategory.Error, "All_type_parameters_are_unused_6205", "All type parameters are unused."),
      package_json_has_a_typesVersions_field_with_version_specific_path_mappings: diag(6206, ts2.DiagnosticCategory.Message, "package_json_has_a_typesVersions_field_with_version_specific_path_mappings_6206", "'package.json' has a 'typesVersions' field with version-specific path mappings."),
      package_json_does_not_have_a_typesVersions_entry_that_matches_version_0: diag(6207, ts2.DiagnosticCategory.Message, "package_json_does_not_have_a_typesVersions_entry_that_matches_version_0_6207", "'package.json' does not have a 'typesVersions' entry that matches version '{0}'."),
      package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_match_module_name_2: diag(6208, ts2.DiagnosticCategory.Message, "package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_ma_6208", "'package.json' has a 'typesVersions' entry '{0}' that matches compiler version '{1}', looking for a pattern to match module name '{2}'."),
      package_json_has_a_typesVersions_entry_0_that_is_not_a_valid_semver_range: diag(6209, ts2.DiagnosticCategory.Message, "package_json_has_a_typesVersions_entry_0_that_is_not_a_valid_semver_range_6209", "'package.json' has a 'typesVersions' entry '{0}' that is not a valid semver range."),
      An_argument_for_0_was_not_provided: diag(6210, ts2.DiagnosticCategory.Message, "An_argument_for_0_was_not_provided_6210", "An argument for '{0}' was not provided."),
      An_argument_matching_this_binding_pattern_was_not_provided: diag(6211, ts2.DiagnosticCategory.Message, "An_argument_matching_this_binding_pattern_was_not_provided_6211", "An argument matching this binding pattern was not provided."),
      Did_you_mean_to_call_this_expression: diag(6212, ts2.DiagnosticCategory.Message, "Did_you_mean_to_call_this_expression_6212", "Did you mean to call this expression?"),
      Did_you_mean_to_use_new_with_this_expression: diag(6213, ts2.DiagnosticCategory.Message, "Did_you_mean_to_use_new_with_this_expression_6213", "Did you mean to use 'new' with this expression?"),
      Enable_strict_bind_call_and_apply_methods_on_functions: diag(6214, ts2.DiagnosticCategory.Message, "Enable_strict_bind_call_and_apply_methods_on_functions_6214", "Enable strict 'bind', 'call', and 'apply' methods on functions."),
      Using_compiler_options_of_project_reference_redirect_0: diag(6215, ts2.DiagnosticCategory.Message, "Using_compiler_options_of_project_reference_redirect_0_6215", "Using compiler options of project reference redirect '{0}'."),
      Found_1_error: diag(6216, ts2.DiagnosticCategory.Message, "Found_1_error_6216", "Found 1 error."),
      Found_0_errors: diag(6217, ts2.DiagnosticCategory.Message, "Found_0_errors_6217", "Found {0} errors."),
      Module_name_0_was_successfully_resolved_to_1_with_Package_ID_2: diag(6218, ts2.DiagnosticCategory.Message, "Module_name_0_was_successfully_resolved_to_1_with_Package_ID_2_6218", "======== Module name '{0}' was successfully resolved to '{1}' with Package ID '{2}'. ========"),
      Type_reference_directive_0_was_successfully_resolved_to_1_with_Package_ID_2_primary_Colon_3: diag(6219, ts2.DiagnosticCategory.Message, "Type_reference_directive_0_was_successfully_resolved_to_1_with_Package_ID_2_primary_Colon_3_6219", "======== Type reference directive '{0}' was successfully resolved to '{1}' with Package ID '{2}', primary: {3}. ========"),
      package_json_had_a_falsy_0_field: diag(6220, ts2.DiagnosticCategory.Message, "package_json_had_a_falsy_0_field_6220", "'package.json' had a falsy '{0}' field."),
      Disable_use_of_source_files_instead_of_declaration_files_from_referenced_projects: diag(6221, ts2.DiagnosticCategory.Message, "Disable_use_of_source_files_instead_of_declaration_files_from_referenced_projects_6221", "Disable use of source files instead of declaration files from referenced projects."),
      Emit_class_fields_with_Define_instead_of_Set: diag(6222, ts2.DiagnosticCategory.Message, "Emit_class_fields_with_Define_instead_of_Set_6222", "Emit class fields with Define instead of Set."),
      Generates_a_CPU_profile: diag(6223, ts2.DiagnosticCategory.Message, "Generates_a_CPU_profile_6223", "Generates a CPU profile."),
      Disable_solution_searching_for_this_project: diag(6224, ts2.DiagnosticCategory.Message, "Disable_solution_searching_for_this_project_6224", "Disable solution searching for this project."),
      Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_DynamicPriorityPolling_FixedChunkSizePolling_UseFsEvents_UseFsEventsOnParentDirectory: diag(6225, ts2.DiagnosticCategory.Message, "Specify_strategy_for_watching_file_Colon_FixedPollingInterval_default_PriorityPollingInterval_Dynami_6225", "Specify strategy for watching file: 'FixedPollingInterval' (default), 'PriorityPollingInterval', 'DynamicPriorityPolling', 'FixedChunkSizePolling', 'UseFsEvents', 'UseFsEventsOnParentDirectory'."),
      Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively_Colon_UseFsEvents_default_FixedPollingInterval_DynamicPriorityPolling_FixedChunkSizePolling: diag(6226, ts2.DiagnosticCategory.Message, "Specify_strategy_for_watching_directory_on_platforms_that_don_t_support_recursive_watching_natively__6226", "Specify strategy for watching directory on platforms that don't support recursive watching natively: 'UseFsEvents' (default), 'FixedPollingInterval', 'DynamicPriorityPolling', 'FixedChunkSizePolling'."),
      Specify_strategy_for_creating_a_polling_watch_when_it_fails_to_create_using_file_system_events_Colon_FixedInterval_default_PriorityInterval_DynamicPriority_FixedChunkSize: diag(6227, ts2.DiagnosticCategory.Message, "Specify_strategy_for_creating_a_polling_watch_when_it_fails_to_create_using_file_system_events_Colon_6227", "Specify strategy for creating a polling watch when it fails to create using file system events: 'FixedInterval' (default), 'PriorityInterval', 'DynamicPriority', 'FixedChunkSize'."),
      Tag_0_expects_at_least_1_arguments_but_the_JSX_factory_2_provides_at_most_3: diag(6229, ts2.DiagnosticCategory.Error, "Tag_0_expects_at_least_1_arguments_but_the_JSX_factory_2_provides_at_most_3_6229", "Tag '{0}' expects at least '{1}' arguments, but the JSX factory '{2}' provides at most '{3}'."),
      Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_false_or_null_on_command_line: diag(6230, ts2.DiagnosticCategory.Error, "Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_false_or_null_on_command_line_6230", "Option '{0}' can only be specified in 'tsconfig.json' file or set to 'false' or 'null' on command line."),
      Could_not_resolve_the_path_0_with_the_extensions_Colon_1: diag(6231, ts2.DiagnosticCategory.Error, "Could_not_resolve_the_path_0_with_the_extensions_Colon_1_6231", "Could not resolve the path '{0}' with the extensions: {1}."),
      Declaration_augments_declaration_in_another_file_This_cannot_be_serialized: diag(6232, ts2.DiagnosticCategory.Error, "Declaration_augments_declaration_in_another_file_This_cannot_be_serialized_6232", "Declaration augments declaration in another file. This cannot be serialized."),
      This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_file: diag(6233, ts2.DiagnosticCategory.Error, "This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_fil_6233", "This is the declaration being augmented. Consider moving the augmenting declaration into the same file."),
      This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without: diag(6234, ts2.DiagnosticCategory.Error, "This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without_6234", "This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'?"),
      Disable_loading_referenced_projects: diag(6235, ts2.DiagnosticCategory.Message, "Disable_loading_referenced_projects_6235", "Disable loading referenced projects."),
      Arguments_for_the_rest_parameter_0_were_not_provided: diag(6236, ts2.DiagnosticCategory.Error, "Arguments_for_the_rest_parameter_0_were_not_provided_6236", "Arguments for the rest parameter '{0}' were not provided."),
      Generates_an_event_trace_and_a_list_of_types: diag(6237, ts2.DiagnosticCategory.Message, "Generates_an_event_trace_and_a_list_of_types_6237", "Generates an event trace and a list of types."),
      Specify_the_module_specifier_to_be_used_to_import_the_jsx_and_jsxs_factory_functions_from_eg_react: diag(6238, ts2.DiagnosticCategory.Error, "Specify_the_module_specifier_to_be_used_to_import_the_jsx_and_jsxs_factory_functions_from_eg_react_6238", "Specify the module specifier to be used to import the 'jsx' and 'jsxs' factory functions from. eg, react"),
      File_0_exists_according_to_earlier_cached_lookups: diag(6239, ts2.DiagnosticCategory.Message, "File_0_exists_according_to_earlier_cached_lookups_6239", "File '{0}' exists according to earlier cached lookups."),
      File_0_does_not_exist_according_to_earlier_cached_lookups: diag(6240, ts2.DiagnosticCategory.Message, "File_0_does_not_exist_according_to_earlier_cached_lookups_6240", "File '{0}' does not exist according to earlier cached lookups."),
      Resolution_for_type_reference_directive_0_was_found_in_cache_from_location_1: diag(6241, ts2.DiagnosticCategory.Message, "Resolution_for_type_reference_directive_0_was_found_in_cache_from_location_1_6241", "Resolution for type reference directive '{0}' was found in cache from location '{1}'."),
      Resolving_type_reference_directive_0_containing_file_1: diag(6242, ts2.DiagnosticCategory.Message, "Resolving_type_reference_directive_0_containing_file_1_6242", "======== Resolving type reference directive '{0}', containing file '{1}'. ========"),
      Interpret_optional_property_types_as_written_rather_than_adding_undefined: diag(6243, ts2.DiagnosticCategory.Message, "Interpret_optional_property_types_as_written_rather_than_adding_undefined_6243", "Interpret optional property types as written, rather than adding 'undefined'."),
      Modules: diag(6244, ts2.DiagnosticCategory.Message, "Modules_6244", "Modules"),
      File_Management: diag(6245, ts2.DiagnosticCategory.Message, "File_Management_6245", "File Management"),
      Emit: diag(6246, ts2.DiagnosticCategory.Message, "Emit_6246", "Emit"),
      JavaScript_Support: diag(6247, ts2.DiagnosticCategory.Message, "JavaScript_Support_6247", "JavaScript Support"),
      Type_Checking: diag(6248, ts2.DiagnosticCategory.Message, "Type_Checking_6248", "Type Checking"),
      Editor_Support: diag(6249, ts2.DiagnosticCategory.Message, "Editor_Support_6249", "Editor Support"),
      Watch_and_Build_Modes: diag(6250, ts2.DiagnosticCategory.Message, "Watch_and_Build_Modes_6250", "Watch and Build Modes"),
      Compiler_Diagnostics: diag(6251, ts2.DiagnosticCategory.Message, "Compiler_Diagnostics_6251", "Compiler Diagnostics"),
      Interop_Constraints: diag(6252, ts2.DiagnosticCategory.Message, "Interop_Constraints_6252", "Interop Constraints"),
      Backwards_Compatibility: diag(6253, ts2.DiagnosticCategory.Message, "Backwards_Compatibility_6253", "Backwards Compatibility"),
      Language_and_Environment: diag(6254, ts2.DiagnosticCategory.Message, "Language_and_Environment_6254", "Language and Environment"),
      Projects: diag(6255, ts2.DiagnosticCategory.Message, "Projects_6255", "Projects"),
      Output_Formatting: diag(6256, ts2.DiagnosticCategory.Message, "Output_Formatting_6256", "Output Formatting"),
      Completeness: diag(6257, ts2.DiagnosticCategory.Message, "Completeness_6257", "Completeness"),
      _0_should_be_set_inside_the_compilerOptions_object_of_the_config_json_file: diag(6258, ts2.DiagnosticCategory.Error, "_0_should_be_set_inside_the_compilerOptions_object_of_the_config_json_file_6258", "'{0}' should be set inside the 'compilerOptions' object of the config json file"),
      Directory_0_has_no_containing_package_json_scope_Imports_will_not_resolve: diag(6270, ts2.DiagnosticCategory.Message, "Directory_0_has_no_containing_package_json_scope_Imports_will_not_resolve_6270", "Directory '{0}' has no containing package.json scope. Imports will not resolve."),
      Import_specifier_0_does_not_exist_in_package_json_scope_at_path_1: diag(6271, ts2.DiagnosticCategory.Message, "Import_specifier_0_does_not_exist_in_package_json_scope_at_path_1_6271", "Import specifier '{0}' does not exist in package.json scope at path '{1}'."),
      Invalid_import_specifier_0_has_no_possible_resolutions: diag(6272, ts2.DiagnosticCategory.Message, "Invalid_import_specifier_0_has_no_possible_resolutions_6272", "Invalid import specifier '{0}' has no possible resolutions."),
      package_json_scope_0_has_no_imports_defined: diag(6273, ts2.DiagnosticCategory.Message, "package_json_scope_0_has_no_imports_defined_6273", "package.json scope '{0}' has no imports defined."),
      package_json_scope_0_explicitly_maps_specifier_1_to_null: diag(6274, ts2.DiagnosticCategory.Message, "package_json_scope_0_explicitly_maps_specifier_1_to_null_6274", "package.json scope '{0}' explicitly maps specifier '{1}' to null."),
      package_json_scope_0_has_invalid_type_for_target_of_specifier_1: diag(6275, ts2.DiagnosticCategory.Message, "package_json_scope_0_has_invalid_type_for_target_of_specifier_1_6275", "package.json scope '{0}' has invalid type for target of specifier '{1}'"),
      Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1: diag(6276, ts2.DiagnosticCategory.Message, "Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1_6276", "Export specifier '{0}' does not exist in package.json scope at path '{1}'."),
      Enable_project_compilation: diag(6302, ts2.DiagnosticCategory.Message, "Enable_project_compilation_6302", "Enable project compilation"),
      Composite_projects_may_not_disable_declaration_emit: diag(6304, ts2.DiagnosticCategory.Error, "Composite_projects_may_not_disable_declaration_emit_6304", "Composite projects may not disable declaration emit."),
      Output_file_0_has_not_been_built_from_source_file_1: diag(6305, ts2.DiagnosticCategory.Error, "Output_file_0_has_not_been_built_from_source_file_1_6305", "Output file '{0}' has not been built from source file '{1}'."),
      Referenced_project_0_must_have_setting_composite_Colon_true: diag(6306, ts2.DiagnosticCategory.Error, "Referenced_project_0_must_have_setting_composite_Colon_true_6306", `Referenced project '{0}' must have setting "composite": true.`),
      File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_include_pattern: diag(6307, ts2.DiagnosticCategory.Error, "File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_includ_6307", "File '{0}' is not listed within the file list of project '{1}'. Projects must list all files or use an 'include' pattern."),
      Cannot_prepend_project_0_because_it_does_not_have_outFile_set: diag(6308, ts2.DiagnosticCategory.Error, "Cannot_prepend_project_0_because_it_does_not_have_outFile_set_6308", "Cannot prepend project '{0}' because it does not have 'outFile' set"),
      Output_file_0_from_project_1_does_not_exist: diag(6309, ts2.DiagnosticCategory.Error, "Output_file_0_from_project_1_does_not_exist_6309", "Output file '{0}' from project '{1}' does not exist"),
      Referenced_project_0_may_not_disable_emit: diag(6310, ts2.DiagnosticCategory.Error, "Referenced_project_0_may_not_disable_emit_6310", "Referenced project '{0}' may not disable emit."),
      Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2: diag(6350, ts2.DiagnosticCategory.Message, "Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2_6350", "Project '{0}' is out of date because oldest output '{1}' is older than newest input '{2}'"),
      Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2: diag(6351, ts2.DiagnosticCategory.Message, "Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2_6351", "Project '{0}' is up to date because newest input '{1}' is older than oldest output '{2}'"),
      Project_0_is_out_of_date_because_output_file_1_does_not_exist: diag(6352, ts2.DiagnosticCategory.Message, "Project_0_is_out_of_date_because_output_file_1_does_not_exist_6352", "Project '{0}' is out of date because output file '{1}' does not exist"),
      Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date: diag(6353, ts2.DiagnosticCategory.Message, "Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date_6353", "Project '{0}' is out of date because its dependency '{1}' is out of date"),
      Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies: diag(6354, ts2.DiagnosticCategory.Message, "Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies_6354", "Project '{0}' is up to date with .d.ts files from its dependencies"),
      Projects_in_this_build_Colon_0: diag(6355, ts2.DiagnosticCategory.Message, "Projects_in_this_build_Colon_0_6355", "Projects in this build: {0}"),
      A_non_dry_build_would_delete_the_following_files_Colon_0: diag(6356, ts2.DiagnosticCategory.Message, "A_non_dry_build_would_delete_the_following_files_Colon_0_6356", "A non-dry build would delete the following files: {0}"),
      A_non_dry_build_would_build_project_0: diag(6357, ts2.DiagnosticCategory.Message, "A_non_dry_build_would_build_project_0_6357", "A non-dry build would build project '{0}'"),
      Building_project_0: diag(6358, ts2.DiagnosticCategory.Message, "Building_project_0_6358", "Building project '{0}'..."),
      Updating_output_timestamps_of_project_0: diag(6359, ts2.DiagnosticCategory.Message, "Updating_output_timestamps_of_project_0_6359", "Updating output timestamps of project '{0}'..."),
      Project_0_is_up_to_date: diag(6361, ts2.DiagnosticCategory.Message, "Project_0_is_up_to_date_6361", "Project '{0}' is up to date"),
      Skipping_build_of_project_0_because_its_dependency_1_has_errors: diag(6362, ts2.DiagnosticCategory.Message, "Skipping_build_of_project_0_because_its_dependency_1_has_errors_6362", "Skipping build of project '{0}' because its dependency '{1}' has errors"),
      Project_0_can_t_be_built_because_its_dependency_1_has_errors: diag(6363, ts2.DiagnosticCategory.Message, "Project_0_can_t_be_built_because_its_dependency_1_has_errors_6363", "Project '{0}' can't be built because its dependency '{1}' has errors"),
      Build_one_or_more_projects_and_their_dependencies_if_out_of_date: diag(6364, ts2.DiagnosticCategory.Message, "Build_one_or_more_projects_and_their_dependencies_if_out_of_date_6364", "Build one or more projects and their dependencies, if out of date"),
      Delete_the_outputs_of_all_projects: diag(6365, ts2.DiagnosticCategory.Message, "Delete_the_outputs_of_all_projects_6365", "Delete the outputs of all projects"),
      Show_what_would_be_built_or_deleted_if_specified_with_clean: diag(6367, ts2.DiagnosticCategory.Message, "Show_what_would_be_built_or_deleted_if_specified_with_clean_6367", "Show what would be built (or deleted, if specified with '--clean')"),
      Option_build_must_be_the_first_command_line_argument: diag(6369, ts2.DiagnosticCategory.Error, "Option_build_must_be_the_first_command_line_argument_6369", "Option '--build' must be the first command line argument."),
      Options_0_and_1_cannot_be_combined: diag(6370, ts2.DiagnosticCategory.Error, "Options_0_and_1_cannot_be_combined_6370", "Options '{0}' and '{1}' cannot be combined."),
      Updating_unchanged_output_timestamps_of_project_0: diag(6371, ts2.DiagnosticCategory.Message, "Updating_unchanged_output_timestamps_of_project_0_6371", "Updating unchanged output timestamps of project '{0}'..."),
      Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed: diag(6372, ts2.DiagnosticCategory.Message, "Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed_6372", "Project '{0}' is out of date because output of its dependency '{1}' has changed"),
      Updating_output_of_project_0: diag(6373, ts2.DiagnosticCategory.Message, "Updating_output_of_project_0_6373", "Updating output of project '{0}'..."),
      A_non_dry_build_would_update_timestamps_for_output_of_project_0: diag(6374, ts2.DiagnosticCategory.Message, "A_non_dry_build_would_update_timestamps_for_output_of_project_0_6374", "A non-dry build would update timestamps for output of project '{0}'"),
      A_non_dry_build_would_update_output_of_project_0: diag(6375, ts2.DiagnosticCategory.Message, "A_non_dry_build_would_update_output_of_project_0_6375", "A non-dry build would update output of project '{0}'"),
      Cannot_update_output_of_project_0_because_there_was_error_reading_file_1: diag(6376, ts2.DiagnosticCategory.Message, "Cannot_update_output_of_project_0_because_there_was_error_reading_file_1_6376", "Cannot update output of project '{0}' because there was error reading file '{1}'"),
      Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1: diag(6377, ts2.DiagnosticCategory.Error, "Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1_6377", "Cannot write file '{0}' because it will overwrite '.tsbuildinfo' file generated by referenced project '{1}'"),
      Enable_incremental_compilation: diag(6378, ts2.DiagnosticCategory.Message, "Enable_incremental_compilation_6378", "Enable incremental compilation"),
      Composite_projects_may_not_disable_incremental_compilation: diag(6379, ts2.DiagnosticCategory.Error, "Composite_projects_may_not_disable_incremental_compilation_6379", "Composite projects may not disable incremental compilation."),
      Specify_file_to_store_incremental_compilation_information: diag(6380, ts2.DiagnosticCategory.Message, "Specify_file_to_store_incremental_compilation_information_6380", "Specify file to store incremental compilation information"),
      Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_current_version_2: diag(6381, ts2.DiagnosticCategory.Message, "Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_curren_6381", "Project '{0}' is out of date because output for it was generated with version '{1}' that differs with current version '{2}'"),
      Skipping_build_of_project_0_because_its_dependency_1_was_not_built: diag(6382, ts2.DiagnosticCategory.Message, "Skipping_build_of_project_0_because_its_dependency_1_was_not_built_6382", "Skipping build of project '{0}' because its dependency '{1}' was not built"),
      Project_0_can_t_be_built_because_its_dependency_1_was_not_built: diag(6383, ts2.DiagnosticCategory.Message, "Project_0_can_t_be_built_because_its_dependency_1_was_not_built_6383", "Project '{0}' can't be built because its dependency '{1}' was not built"),
      Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_directly_depending_on_it: diag(6384, ts2.DiagnosticCategory.Message, "Have_recompiles_in_incremental_and_watch_assume_that_changes_within_a_file_will_only_affect_files_di_6384", "Have recompiles in '--incremental' and '--watch' assume that changes within a file will only affect files directly depending on it."),
      _0_is_deprecated: diag(6385, ts2.DiagnosticCategory.Suggestion, "_0_is_deprecated_6385", "'{0}' is deprecated.", void 0, void 0, true),
      Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_native_implementation_of_the_Web_Performance_API_could_not_be_found: diag(6386, ts2.DiagnosticCategory.Message, "Performance_timings_for_diagnostics_or_extendedDiagnostics_are_not_available_in_this_session_A_nativ_6386", "Performance timings for '--diagnostics' or '--extendedDiagnostics' are not available in this session. A native implementation of the Web Performance API could not be found."),
      The_signature_0_of_1_is_deprecated: diag(6387, ts2.DiagnosticCategory.Suggestion, "The_signature_0_of_1_is_deprecated_6387", "The signature '{0}' of '{1}' is deprecated.", void 0, void 0, true),
      Project_0_is_being_forcibly_rebuilt: diag(6388, ts2.DiagnosticCategory.Message, "Project_0_is_being_forcibly_rebuilt_6388", "Project '{0}' is being forcibly rebuilt"),
      Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved: diag(6389, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved_6389", "Reusing resolution of module '{0}' from '{1}' of old program, it was not resolved."),
      Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2: diag(6390, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved__6390", "Reusing resolution of type reference directive '{0}' from '{1}' of old program, it was successfully resolved to '{2}'."),
      Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3: diag(6391, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved__6391", "Reusing resolution of type reference directive '{0}' from '{1}' of old program, it was successfully resolved to '{2}' with Package ID '{3}'."),
      Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved: diag(6392, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved_6392", "Reusing resolution of type reference directive '{0}' from '{1}' of old program, it was not resolved."),
      Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3: diag(6393, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_6393", "Reusing resolution of module '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}'."),
      Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3_with_Package_ID_4: diag(6394, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_6394", "Reusing resolution of module '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}' with Package ID '{4}'."),
      Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_not_resolved: diag(6395, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_not_resolved_6395", "Reusing resolution of module '{0}' from '{1}' found in cache from location '{2}', it was not resolved."),
      Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3: diag(6396, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_succes_6396", "Reusing resolution of type reference directive '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}'."),
      Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3_with_Package_ID_4: diag(6397, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_succes_6397", "Reusing resolution of type reference directive '{0}' from '{1}' found in cache from location '{2}', it was successfully resolved to '{3}' with Package ID '{4}'."),
      Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_not_resolved: diag(6398, ts2.DiagnosticCategory.Message, "Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_not_re_6398", "Reusing resolution of type reference directive '{0}' from '{1}' found in cache from location '{2}', it was not resolved."),
      The_expected_type_comes_from_property_0_which_is_declared_here_on_type_1: diag(6500, ts2.DiagnosticCategory.Message, "The_expected_type_comes_from_property_0_which_is_declared_here_on_type_1_6500", "The expected type comes from property '{0}' which is declared here on type '{1}'"),
      The_expected_type_comes_from_this_index_signature: diag(6501, ts2.DiagnosticCategory.Message, "The_expected_type_comes_from_this_index_signature_6501", "The expected type comes from this index signature."),
      The_expected_type_comes_from_the_return_type_of_this_signature: diag(6502, ts2.DiagnosticCategory.Message, "The_expected_type_comes_from_the_return_type_of_this_signature_6502", "The expected type comes from the return type of this signature."),
      Print_names_of_files_that_are_part_of_the_compilation_and_then_stop_processing: diag(6503, ts2.DiagnosticCategory.Message, "Print_names_of_files_that_are_part_of_the_compilation_and_then_stop_processing_6503", "Print names of files that are part of the compilation and then stop processing."),
      File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option: diag(6504, ts2.DiagnosticCategory.Error, "File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option_6504", "File '{0}' is a JavaScript file. Did you mean to enable the 'allowJs' option?"),
      Print_names_of_files_and_the_reason_they_are_part_of_the_compilation: diag(6505, ts2.DiagnosticCategory.Message, "Print_names_of_files_and_the_reason_they_are_part_of_the_compilation_6505", "Print names of files and the reason they are part of the compilation."),
      Consider_adding_a_declare_modifier_to_this_class: diag(6506, ts2.DiagnosticCategory.Message, "Consider_adding_a_declare_modifier_to_this_class_6506", "Consider adding a 'declare' modifier to this class."),
      Allow_JavaScript_files_to_be_a_part_of_your_program_Use_the_checkJS_option_to_get_errors_from_these_files: diag(6600, ts2.DiagnosticCategory.Message, "Allow_JavaScript_files_to_be_a_part_of_your_program_Use_the_checkJS_option_to_get_errors_from_these__6600", "Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files."),
      Allow_import_x_from_y_when_a_module_doesn_t_have_a_default_export: diag(6601, ts2.DiagnosticCategory.Message, "Allow_import_x_from_y_when_a_module_doesn_t_have_a_default_export_6601", "Allow 'import x from y' when a module doesn't have a default export."),
      Allow_accessing_UMD_globals_from_modules: diag(6602, ts2.DiagnosticCategory.Message, "Allow_accessing_UMD_globals_from_modules_6602", "Allow accessing UMD globals from modules."),
      Disable_error_reporting_for_unreachable_code: diag(6603, ts2.DiagnosticCategory.Message, "Disable_error_reporting_for_unreachable_code_6603", "Disable error reporting for unreachable code."),
      Disable_error_reporting_for_unused_labels: diag(6604, ts2.DiagnosticCategory.Message, "Disable_error_reporting_for_unused_labels_6604", "Disable error reporting for unused labels."),
      Ensure_use_strict_is_always_emitted: diag(6605, ts2.DiagnosticCategory.Message, "Ensure_use_strict_is_always_emitted_6605", "Ensure 'use strict' is always emitted."),
      Have_recompiles_in_projects_that_use_incremental_and_watch_mode_assume_that_changes_within_a_file_will_only_affect_files_directly_depending_on_it: diag(6606, ts2.DiagnosticCategory.Message, "Have_recompiles_in_projects_that_use_incremental_and_watch_mode_assume_that_changes_within_a_file_wi_6606", "Have recompiles in projects that use `incremental` and `watch` mode assume that changes within a file will only affect files directly depending on it."),
      Specify_the_base_directory_to_resolve_non_relative_module_names: diag(6607, ts2.DiagnosticCategory.Message, "Specify_the_base_directory_to_resolve_non_relative_module_names_6607", "Specify the base directory to resolve non-relative module names."),
      No_longer_supported_In_early_versions_manually_set_the_text_encoding_for_reading_files: diag(6608, ts2.DiagnosticCategory.Message, "No_longer_supported_In_early_versions_manually_set_the_text_encoding_for_reading_files_6608", "No longer supported. In early versions, manually set the text encoding for reading files."),
      Enable_error_reporting_in_type_checked_JavaScript_files: diag(6609, ts2.DiagnosticCategory.Message, "Enable_error_reporting_in_type_checked_JavaScript_files_6609", "Enable error reporting in type-checked JavaScript files."),
      Enable_constraints_that_allow_a_TypeScript_project_to_be_used_with_project_references: diag(6611, ts2.DiagnosticCategory.Message, "Enable_constraints_that_allow_a_TypeScript_project_to_be_used_with_project_references_6611", "Enable constraints that allow a TypeScript project to be used with project references."),
      Generate_d_ts_files_from_TypeScript_and_JavaScript_files_in_your_project: diag(6612, ts2.DiagnosticCategory.Message, "Generate_d_ts_files_from_TypeScript_and_JavaScript_files_in_your_project_6612", "Generate .d.ts files from TypeScript and JavaScript files in your project."),
      Specify_the_output_directory_for_generated_declaration_files: diag(6613, ts2.DiagnosticCategory.Message, "Specify_the_output_directory_for_generated_declaration_files_6613", "Specify the output directory for generated declaration files."),
      Create_sourcemaps_for_d_ts_files: diag(6614, ts2.DiagnosticCategory.Message, "Create_sourcemaps_for_d_ts_files_6614", "Create sourcemaps for d.ts files."),
      Output_compiler_performance_information_after_building: diag(6615, ts2.DiagnosticCategory.Message, "Output_compiler_performance_information_after_building_6615", "Output compiler performance information after building."),
      Disables_inference_for_type_acquisition_by_looking_at_filenames_in_a_project: diag(6616, ts2.DiagnosticCategory.Message, "Disables_inference_for_type_acquisition_by_looking_at_filenames_in_a_project_6616", "Disables inference for type acquisition by looking at filenames in a project."),
      Reduce_the_number_of_projects_loaded_automatically_by_TypeScript: diag(6617, ts2.DiagnosticCategory.Message, "Reduce_the_number_of_projects_loaded_automatically_by_TypeScript_6617", "Reduce the number of projects loaded automatically by TypeScript."),
      Remove_the_20mb_cap_on_total_source_code_size_for_JavaScript_files_in_the_TypeScript_language_server: diag(6618, ts2.DiagnosticCategory.Message, "Remove_the_20mb_cap_on_total_source_code_size_for_JavaScript_files_in_the_TypeScript_language_server_6618", "Remove the 20mb cap on total source code size for JavaScript files in the TypeScript language server."),
      Opt_a_project_out_of_multi_project_reference_checking_when_editing: diag(6619, ts2.DiagnosticCategory.Message, "Opt_a_project_out_of_multi_project_reference_checking_when_editing_6619", "Opt a project out of multi-project reference checking when editing."),
      Disable_preferring_source_files_instead_of_declaration_files_when_referencing_composite_projects: diag(6620, ts2.DiagnosticCategory.Message, "Disable_preferring_source_files_instead_of_declaration_files_when_referencing_composite_projects_6620", "Disable preferring source files instead of declaration files when referencing composite projects"),
      Emit_more_compliant_but_verbose_and_less_performant_JavaScript_for_iteration: diag(6621, ts2.DiagnosticCategory.Message, "Emit_more_compliant_but_verbose_and_less_performant_JavaScript_for_iteration_6621", "Emit more compliant, but verbose and less performant JavaScript for iteration."),
      Emit_a_UTF_8_Byte_Order_Mark_BOM_in_the_beginning_of_output_files: diag(6622, ts2.DiagnosticCategory.Message, "Emit_a_UTF_8_Byte_Order_Mark_BOM_in_the_beginning_of_output_files_6622", "Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files."),
      Only_output_d_ts_files_and_not_JavaScript_files: diag(6623, ts2.DiagnosticCategory.Message, "Only_output_d_ts_files_and_not_JavaScript_files_6623", "Only output d.ts files and not JavaScript files."),
      Emit_design_type_metadata_for_decorated_declarations_in_source_files: diag(6624, ts2.DiagnosticCategory.Message, "Emit_design_type_metadata_for_decorated_declarations_in_source_files_6624", "Emit design-type metadata for decorated declarations in source files."),
      Disable_the_type_acquisition_for_JavaScript_projects: diag(6625, ts2.DiagnosticCategory.Message, "Disable_the_type_acquisition_for_JavaScript_projects_6625", "Disable the type acquisition for JavaScript projects"),
      Emit_additional_JavaScript_to_ease_support_for_importing_CommonJS_modules_This_enables_allowSyntheticDefaultImports_for_type_compatibility: diag(6626, ts2.DiagnosticCategory.Message, "Emit_additional_JavaScript_to_ease_support_for_importing_CommonJS_modules_This_enables_allowSyntheti_6626", "Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility."),
      Filters_results_from_the_include_option: diag(6627, ts2.DiagnosticCategory.Message, "Filters_results_from_the_include_option_6627", "Filters results from the `include` option."),
      Remove_a_list_of_directories_from_the_watch_process: diag(6628, ts2.DiagnosticCategory.Message, "Remove_a_list_of_directories_from_the_watch_process_6628", "Remove a list of directories from the watch process."),
      Remove_a_list_of_files_from_the_watch_mode_s_processing: diag(6629, ts2.DiagnosticCategory.Message, "Remove_a_list_of_files_from_the_watch_mode_s_processing_6629", "Remove a list of files from the watch mode's processing."),
      Enable_experimental_support_for_TC39_stage_2_draft_decorators: diag(6630, ts2.DiagnosticCategory.Message, "Enable_experimental_support_for_TC39_stage_2_draft_decorators_6630", "Enable experimental support for TC39 stage 2 draft decorators."),
      Print_files_read_during_the_compilation_including_why_it_was_included: diag(6631, ts2.DiagnosticCategory.Message, "Print_files_read_during_the_compilation_including_why_it_was_included_6631", "Print files read during the compilation including why it was included."),
      Output_more_detailed_compiler_performance_information_after_building: diag(6632, ts2.DiagnosticCategory.Message, "Output_more_detailed_compiler_performance_information_after_building_6632", "Output more detailed compiler performance information after building."),
      Specify_one_or_more_path_or_node_module_references_to_base_configuration_files_from_which_settings_are_inherited: diag(6633, ts2.DiagnosticCategory.Message, "Specify_one_or_more_path_or_node_module_references_to_base_configuration_files_from_which_settings_a_6633", "Specify one or more path or node module references to base configuration files from which settings are inherited."),
      Specify_what_approach_the_watcher_should_use_if_the_system_runs_out_of_native_file_watchers: diag(6634, ts2.DiagnosticCategory.Message, "Specify_what_approach_the_watcher_should_use_if_the_system_runs_out_of_native_file_watchers_6634", "Specify what approach the watcher should use if the system runs out of native file watchers."),
      Include_a_list_of_files_This_does_not_support_glob_patterns_as_opposed_to_include: diag(6635, ts2.DiagnosticCategory.Message, "Include_a_list_of_files_This_does_not_support_glob_patterns_as_opposed_to_include_6635", "Include a list of files. This does not support glob patterns, as opposed to `include`."),
      Build_all_projects_including_those_that_appear_to_be_up_to_date: diag(6636, ts2.DiagnosticCategory.Message, "Build_all_projects_including_those_that_appear_to_be_up_to_date_6636", "Build all projects, including those that appear to be up to date"),
      Ensure_that_casing_is_correct_in_imports: diag(6637, ts2.DiagnosticCategory.Message, "Ensure_that_casing_is_correct_in_imports_6637", "Ensure that casing is correct in imports."),
      Emit_a_v8_CPU_profile_of_the_compiler_run_for_debugging: diag(6638, ts2.DiagnosticCategory.Message, "Emit_a_v8_CPU_profile_of_the_compiler_run_for_debugging_6638", "Emit a v8 CPU profile of the compiler run for debugging."),
      Allow_importing_helper_functions_from_tslib_once_per_project_instead_of_including_them_per_file: diag(6639, ts2.DiagnosticCategory.Message, "Allow_importing_helper_functions_from_tslib_once_per_project_instead_of_including_them_per_file_6639", "Allow importing helper functions from tslib once per project, instead of including them per-file."),
      Specify_a_list_of_glob_patterns_that_match_files_to_be_included_in_compilation: diag(6641, ts2.DiagnosticCategory.Message, "Specify_a_list_of_glob_patterns_that_match_files_to_be_included_in_compilation_6641", "Specify a list of glob patterns that match files to be included in compilation."),
      Save_tsbuildinfo_files_to_allow_for_incremental_compilation_of_projects: diag(6642, ts2.DiagnosticCategory.Message, "Save_tsbuildinfo_files_to_allow_for_incremental_compilation_of_projects_6642", "Save .tsbuildinfo files to allow for incremental compilation of projects."),
      Include_sourcemap_files_inside_the_emitted_JavaScript: diag(6643, ts2.DiagnosticCategory.Message, "Include_sourcemap_files_inside_the_emitted_JavaScript_6643", "Include sourcemap files inside the emitted JavaScript."),
      Include_source_code_in_the_sourcemaps_inside_the_emitted_JavaScript: diag(6644, ts2.DiagnosticCategory.Message, "Include_source_code_in_the_sourcemaps_inside_the_emitted_JavaScript_6644", "Include source code in the sourcemaps inside the emitted JavaScript."),
      Ensure_that_each_file_can_be_safely_transpiled_without_relying_on_other_imports: diag(6645, ts2.DiagnosticCategory.Message, "Ensure_that_each_file_can_be_safely_transpiled_without_relying_on_other_imports_6645", "Ensure that each file can be safely transpiled without relying on other imports."),
      Specify_what_JSX_code_is_generated: diag(6646, ts2.DiagnosticCategory.Message, "Specify_what_JSX_code_is_generated_6646", "Specify what JSX code is generated."),
      Specify_the_JSX_factory_function_used_when_targeting_React_JSX_emit_e_g_React_createElement_or_h: diag(6647, ts2.DiagnosticCategory.Message, "Specify_the_JSX_factory_function_used_when_targeting_React_JSX_emit_e_g_React_createElement_or_h_6647", "Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'"),
      Specify_the_JSX_Fragment_reference_used_for_fragments_when_targeting_React_JSX_emit_e_g_React_Fragment_or_Fragment: diag(6648, ts2.DiagnosticCategory.Message, "Specify_the_JSX_Fragment_reference_used_for_fragments_when_targeting_React_JSX_emit_e_g_React_Fragme_6648", "Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'."),
      Specify_module_specifier_used_to_import_the_JSX_factory_functions_when_using_jsx_Colon_react_jsx_Asterisk: diag(6649, ts2.DiagnosticCategory.Message, "Specify_module_specifier_used_to_import_the_JSX_factory_functions_when_using_jsx_Colon_react_jsx_Ast_6649", "Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.`"),
      Make_keyof_only_return_strings_instead_of_string_numbers_or_symbols_Legacy_option: diag(6650, ts2.DiagnosticCategory.Message, "Make_keyof_only_return_strings_instead_of_string_numbers_or_symbols_Legacy_option_6650", "Make keyof only return strings instead of string, numbers or symbols. Legacy option."),
      Specify_a_set_of_bundled_library_declaration_files_that_describe_the_target_runtime_environment: diag(6651, ts2.DiagnosticCategory.Message, "Specify_a_set_of_bundled_library_declaration_files_that_describe_the_target_runtime_environment_6651", "Specify a set of bundled library declaration files that describe the target runtime environment."),
      Print_the_names_of_emitted_files_after_a_compilation: diag(6652, ts2.DiagnosticCategory.Message, "Print_the_names_of_emitted_files_after_a_compilation_6652", "Print the names of emitted files after a compilation."),
      Print_all_of_the_files_read_during_the_compilation: diag(6653, ts2.DiagnosticCategory.Message, "Print_all_of_the_files_read_during_the_compilation_6653", "Print all of the files read during the compilation."),
      Set_the_language_of_the_messaging_from_TypeScript_This_does_not_affect_emit: diag(6654, ts2.DiagnosticCategory.Message, "Set_the_language_of_the_messaging_from_TypeScript_This_does_not_affect_emit_6654", "Set the language of the messaging from TypeScript. This does not affect emit."),
      Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: diag(6655, ts2.DiagnosticCategory.Message, "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6655", "Specify the location where debugger should locate map files instead of generated locations."),
      Specify_the_maximum_folder_depth_used_for_checking_JavaScript_files_from_node_modules_Only_applicable_with_allowJs: diag(6656, ts2.DiagnosticCategory.Message, "Specify_the_maximum_folder_depth_used_for_checking_JavaScript_files_from_node_modules_Only_applicabl_6656", "Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`."),
      Specify_what_module_code_is_generated: diag(6657, ts2.DiagnosticCategory.Message, "Specify_what_module_code_is_generated_6657", "Specify what module code is generated."),
      Specify_how_TypeScript_looks_up_a_file_from_a_given_module_specifier: diag(6658, ts2.DiagnosticCategory.Message, "Specify_how_TypeScript_looks_up_a_file_from_a_given_module_specifier_6658", "Specify how TypeScript looks up a file from a given module specifier."),
      Set_the_newline_character_for_emitting_files: diag(6659, ts2.DiagnosticCategory.Message, "Set_the_newline_character_for_emitting_files_6659", "Set the newline character for emitting files."),
      Disable_emitting_files_from_a_compilation: diag(6660, ts2.DiagnosticCategory.Message, "Disable_emitting_files_from_a_compilation_6660", "Disable emitting files from a compilation."),
      Disable_generating_custom_helper_functions_like_extends_in_compiled_output: diag(6661, ts2.DiagnosticCategory.Message, "Disable_generating_custom_helper_functions_like_extends_in_compiled_output_6661", "Disable generating custom helper functions like `__extends` in compiled output."),
      Disable_emitting_files_if_any_type_checking_errors_are_reported: diag(6662, ts2.DiagnosticCategory.Message, "Disable_emitting_files_if_any_type_checking_errors_are_reported_6662", "Disable emitting files if any type checking errors are reported."),
      Disable_truncating_types_in_error_messages: diag(6663, ts2.DiagnosticCategory.Message, "Disable_truncating_types_in_error_messages_6663", "Disable truncating types in error messages."),
      Enable_error_reporting_for_fallthrough_cases_in_switch_statements: diag(6664, ts2.DiagnosticCategory.Message, "Enable_error_reporting_for_fallthrough_cases_in_switch_statements_6664", "Enable error reporting for fallthrough cases in switch statements."),
      Enable_error_reporting_for_expressions_and_declarations_with_an_implied_any_type: diag(6665, ts2.DiagnosticCategory.Message, "Enable_error_reporting_for_expressions_and_declarations_with_an_implied_any_type_6665", "Enable error reporting for expressions and declarations with an implied `any` type.."),
      Ensure_overriding_members_in_derived_classes_are_marked_with_an_override_modifier: diag(6666, ts2.DiagnosticCategory.Message, "Ensure_overriding_members_in_derived_classes_are_marked_with_an_override_modifier_6666", "Ensure overriding members in derived classes are marked with an override modifier."),
      Enable_error_reporting_for_codepaths_that_do_not_explicitly_return_in_a_function: diag(6667, ts2.DiagnosticCategory.Message, "Enable_error_reporting_for_codepaths_that_do_not_explicitly_return_in_a_function_6667", "Enable error reporting for codepaths that do not explicitly return in a function."),
      Enable_error_reporting_when_this_is_given_the_type_any: diag(6668, ts2.DiagnosticCategory.Message, "Enable_error_reporting_when_this_is_given_the_type_any_6668", "Enable error reporting when `this` is given the type `any`."),
      Disable_adding_use_strict_directives_in_emitted_JavaScript_files: diag(6669, ts2.DiagnosticCategory.Message, "Disable_adding_use_strict_directives_in_emitted_JavaScript_files_6669", "Disable adding 'use strict' directives in emitted JavaScript files."),
      Disable_including_any_library_files_including_the_default_lib_d_ts: diag(6670, ts2.DiagnosticCategory.Message, "Disable_including_any_library_files_including_the_default_lib_d_ts_6670", "Disable including any library files, including the default lib.d.ts."),
      Enforces_using_indexed_accessors_for_keys_declared_using_an_indexed_type: diag(6671, ts2.DiagnosticCategory.Message, "Enforces_using_indexed_accessors_for_keys_declared_using_an_indexed_type_6671", "Enforces using indexed accessors for keys declared using an indexed type"),
      Disallow_import_s_require_s_or_reference_s_from_expanding_the_number_of_files_TypeScript_should_add_to_a_project: diag(6672, ts2.DiagnosticCategory.Message, "Disallow_import_s_require_s_or_reference_s_from_expanding_the_number_of_files_TypeScript_should_add__6672", "Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project."),
      Disable_strict_checking_of_generic_signatures_in_function_types: diag(6673, ts2.DiagnosticCategory.Message, "Disable_strict_checking_of_generic_signatures_in_function_types_6673", "Disable strict checking of generic signatures in function types."),
      Add_undefined_to_a_type_when_accessed_using_an_index: diag(6674, ts2.DiagnosticCategory.Message, "Add_undefined_to_a_type_when_accessed_using_an_index_6674", "Add `undefined` to a type when accessed using an index."),
      Enable_error_reporting_when_a_local_variables_aren_t_read: diag(6675, ts2.DiagnosticCategory.Message, "Enable_error_reporting_when_a_local_variables_aren_t_read_6675", "Enable error reporting when a local variables aren't read."),
      Raise_an_error_when_a_function_parameter_isn_t_read: diag(6676, ts2.DiagnosticCategory.Message, "Raise_an_error_when_a_function_parameter_isn_t_read_6676", "Raise an error when a function parameter isn't read"),
      Deprecated_setting_Use_outFile_instead: diag(6677, ts2.DiagnosticCategory.Message, "Deprecated_setting_Use_outFile_instead_6677", "Deprecated setting. Use `outFile` instead."),
      Specify_an_output_folder_for_all_emitted_files: diag(6678, ts2.DiagnosticCategory.Message, "Specify_an_output_folder_for_all_emitted_files_6678", "Specify an output folder for all emitted files."),
      Specify_a_file_that_bundles_all_outputs_into_one_JavaScript_file_If_declaration_is_true_also_designates_a_file_that_bundles_all_d_ts_output: diag(6679, ts2.DiagnosticCategory.Message, "Specify_a_file_that_bundles_all_outputs_into_one_JavaScript_file_If_declaration_is_true_also_designa_6679", "Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output."),
      Specify_a_set_of_entries_that_re_map_imports_to_additional_lookup_locations: diag(6680, ts2.DiagnosticCategory.Message, "Specify_a_set_of_entries_that_re_map_imports_to_additional_lookup_locations_6680", "Specify a set of entries that re-map imports to additional lookup locations."),
      Specify_a_list_of_language_service_plugins_to_include: diag(6681, ts2.DiagnosticCategory.Message, "Specify_a_list_of_language_service_plugins_to_include_6681", "Specify a list of language service plugins to include."),
      Disable_erasing_const_enum_declarations_in_generated_code: diag(6682, ts2.DiagnosticCategory.Message, "Disable_erasing_const_enum_declarations_in_generated_code_6682", "Disable erasing `const enum` declarations in generated code."),
      Disable_resolving_symlinks_to_their_realpath_This_correlates_to_the_same_flag_in_node: diag(6683, ts2.DiagnosticCategory.Message, "Disable_resolving_symlinks_to_their_realpath_This_correlates_to_the_same_flag_in_node_6683", "Disable resolving symlinks to their realpath. This correlates to the same flag in node."),
      Disable_wiping_the_console_in_watch_mode: diag(6684, ts2.DiagnosticCategory.Message, "Disable_wiping_the_console_in_watch_mode_6684", "Disable wiping the console in watch mode"),
      Enable_color_and_formatting_in_TypeScript_s_output_to_make_compiler_errors_easier_to_read: diag(6685, ts2.DiagnosticCategory.Message, "Enable_color_and_formatting_in_TypeScript_s_output_to_make_compiler_errors_easier_to_read_6685", "Enable color and formatting in TypeScript's output to make compiler errors easier to read"),
      Specify_the_object_invoked_for_createElement_This_only_applies_when_targeting_react_JSX_emit: diag(6686, ts2.DiagnosticCategory.Message, "Specify_the_object_invoked_for_createElement_This_only_applies_when_targeting_react_JSX_emit_6686", "Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit."),
      Specify_an_array_of_objects_that_specify_paths_for_projects_Used_in_project_references: diag(6687, ts2.DiagnosticCategory.Message, "Specify_an_array_of_objects_that_specify_paths_for_projects_Used_in_project_references_6687", "Specify an array of objects that specify paths for projects. Used in project references."),
      Disable_emitting_comments: diag(6688, ts2.DiagnosticCategory.Message, "Disable_emitting_comments_6688", "Disable emitting comments."),
      Enable_importing_json_files: diag(6689, ts2.DiagnosticCategory.Message, "Enable_importing_json_files_6689", "Enable importing .json files"),
      Specify_the_root_folder_within_your_source_files: diag(6690, ts2.DiagnosticCategory.Message, "Specify_the_root_folder_within_your_source_files_6690", "Specify the root folder within your source files."),
      Allow_multiple_folders_to_be_treated_as_one_when_resolving_modules: diag(6691, ts2.DiagnosticCategory.Message, "Allow_multiple_folders_to_be_treated_as_one_when_resolving_modules_6691", "Allow multiple folders to be treated as one when resolving modules."),
      Skip_type_checking_d_ts_files_that_are_included_with_TypeScript: diag(6692, ts2.DiagnosticCategory.Message, "Skip_type_checking_d_ts_files_that_are_included_with_TypeScript_6692", "Skip type checking .d.ts files that are included with TypeScript."),
      Skip_type_checking_all_d_ts_files: diag(6693, ts2.DiagnosticCategory.Message, "Skip_type_checking_all_d_ts_files_6693", "Skip type checking all .d.ts files."),
      Create_source_map_files_for_emitted_JavaScript_files: diag(6694, ts2.DiagnosticCategory.Message, "Create_source_map_files_for_emitted_JavaScript_files_6694", "Create source map files for emitted JavaScript files."),
      Specify_the_root_path_for_debuggers_to_find_the_reference_source_code: diag(6695, ts2.DiagnosticCategory.Message, "Specify_the_root_path_for_debuggers_to_find_the_reference_source_code_6695", "Specify the root path for debuggers to find the reference source code."),
      Check_that_the_arguments_for_bind_call_and_apply_methods_match_the_original_function: diag(6697, ts2.DiagnosticCategory.Message, "Check_that_the_arguments_for_bind_call_and_apply_methods_match_the_original_function_6697", "Check that the arguments for `bind`, `call`, and `apply` methods match the original function."),
      When_assigning_functions_check_to_ensure_parameters_and_the_return_values_are_subtype_compatible: diag(6698, ts2.DiagnosticCategory.Message, "When_assigning_functions_check_to_ensure_parameters_and_the_return_values_are_subtype_compatible_6698", "When assigning functions, check to ensure parameters and the return values are subtype-compatible."),
      When_type_checking_take_into_account_null_and_undefined: diag(6699, ts2.DiagnosticCategory.Message, "When_type_checking_take_into_account_null_and_undefined_6699", "When type checking, take into account `null` and `undefined`."),
      Check_for_class_properties_that_are_declared_but_not_set_in_the_constructor: diag(6700, ts2.DiagnosticCategory.Message, "Check_for_class_properties_that_are_declared_but_not_set_in_the_constructor_6700", "Check for class properties that are declared but not set in the constructor."),
      Disable_emitting_declarations_that_have_internal_in_their_JSDoc_comments: diag(6701, ts2.DiagnosticCategory.Message, "Disable_emitting_declarations_that_have_internal_in_their_JSDoc_comments_6701", "Disable emitting declarations that have `@internal` in their JSDoc comments."),
      Disable_reporting_of_excess_property_errors_during_the_creation_of_object_literals: diag(6702, ts2.DiagnosticCategory.Message, "Disable_reporting_of_excess_property_errors_during_the_creation_of_object_literals_6702", "Disable reporting of excess property errors during the creation of object literals."),
      Suppress_noImplicitAny_errors_when_indexing_objects_that_lack_index_signatures: diag(6703, ts2.DiagnosticCategory.Message, "Suppress_noImplicitAny_errors_when_indexing_objects_that_lack_index_signatures_6703", "Suppress `noImplicitAny` errors when indexing objects that lack index signatures."),
      Synchronously_call_callbacks_and_update_the_state_of_directory_watchers_on_platforms_that_don_t_support_recursive_watching_natively: diag(6704, ts2.DiagnosticCategory.Message, "Synchronously_call_callbacks_and_update_the_state_of_directory_watchers_on_platforms_that_don_t_supp_6704", "Synchronously call callbacks and update the state of directory watchers on platforms that don`t support recursive watching natively."),
      Set_the_JavaScript_language_version_for_emitted_JavaScript_and_include_compatible_library_declarations: diag(6705, ts2.DiagnosticCategory.Message, "Set_the_JavaScript_language_version_for_emitted_JavaScript_and_include_compatible_library_declaratio_6705", "Set the JavaScript language version for emitted JavaScript and include compatible library declarations."),
      Log_paths_used_during_the_moduleResolution_process: diag(6706, ts2.DiagnosticCategory.Message, "Log_paths_used_during_the_moduleResolution_process_6706", "Log paths used during the `moduleResolution` process."),
      Specify_the_folder_for_tsbuildinfo_incremental_compilation_files: diag(6707, ts2.DiagnosticCategory.Message, "Specify_the_folder_for_tsbuildinfo_incremental_compilation_files_6707", "Specify the folder for .tsbuildinfo incremental compilation files."),
      Specify_options_for_automatic_acquisition_of_declaration_files: diag(6709, ts2.DiagnosticCategory.Message, "Specify_options_for_automatic_acquisition_of_declaration_files_6709", "Specify options for automatic acquisition of declaration files."),
      Specify_multiple_folders_that_act_like_Slashnode_modules_Slash_types: diag(6710, ts2.DiagnosticCategory.Message, "Specify_multiple_folders_that_act_like_Slashnode_modules_Slash_types_6710", "Specify multiple folders that act like `./node_modules/@types`."),
      Specify_type_package_names_to_be_included_without_being_referenced_in_a_source_file: diag(6711, ts2.DiagnosticCategory.Message, "Specify_type_package_names_to_be_included_without_being_referenced_in_a_source_file_6711", "Specify type package names to be included without being referenced in a source file."),
      Emit_ECMAScript_standard_compliant_class_fields: diag(6712, ts2.DiagnosticCategory.Message, "Emit_ECMAScript_standard_compliant_class_fields_6712", "Emit ECMAScript-standard-compliant class fields."),
      Enable_verbose_logging: diag(6713, ts2.DiagnosticCategory.Message, "Enable_verbose_logging_6713", "Enable verbose logging"),
      Specify_how_directories_are_watched_on_systems_that_lack_recursive_file_watching_functionality: diag(6714, ts2.DiagnosticCategory.Message, "Specify_how_directories_are_watched_on_systems_that_lack_recursive_file_watching_functionality_6714", "Specify how directories are watched on systems that lack recursive file-watching functionality."),
      Specify_how_the_TypeScript_watch_mode_works: diag(6715, ts2.DiagnosticCategory.Message, "Specify_how_the_TypeScript_watch_mode_works_6715", "Specify how the TypeScript watch mode works."),
      Include_undefined_in_index_signature_results: diag(6716, ts2.DiagnosticCategory.Message, "Include_undefined_in_index_signature_results_6716", "Include 'undefined' in index signature results"),
      Require_undeclared_properties_from_index_signatures_to_use_element_accesses: diag(6717, ts2.DiagnosticCategory.Message, "Require_undeclared_properties_from_index_signatures_to_use_element_accesses_6717", "Require undeclared properties from index signatures to use element accesses."),
      Specify_emit_Slashchecking_behavior_for_imports_that_are_only_used_for_types: diag(6718, ts2.DiagnosticCategory.Message, "Specify_emit_Slashchecking_behavior_for_imports_that_are_only_used_for_types_6718", "Specify emit/checking behavior for imports that are only used for types"),
      Type_catch_clause_variables_as_unknown_instead_of_any: diag(6803, ts2.DiagnosticCategory.Message, "Type_catch_clause_variables_as_unknown_instead_of_any_6803", "Type catch clause variables as 'unknown' instead of 'any'."),
      one_of_Colon: diag(6900, ts2.DiagnosticCategory.Message, "one_of_Colon_6900", "one of:"),
      one_or_more_Colon: diag(6901, ts2.DiagnosticCategory.Message, "one_or_more_Colon_6901", "one or more:"),
      type_Colon: diag(6902, ts2.DiagnosticCategory.Message, "type_Colon_6902", "type:"),
      default_Colon: diag(6903, ts2.DiagnosticCategory.Message, "default_Colon_6903", "default:"),
      module_system_or_esModuleInterop: diag(6904, ts2.DiagnosticCategory.Message, "module_system_or_esModuleInterop_6904", 'module === "system" or esModuleInterop'),
      false_unless_strict_is_set: diag(6905, ts2.DiagnosticCategory.Message, "false_unless_strict_is_set_6905", "`false`, unless `strict` is set"),
      false_unless_composite_is_set: diag(6906, ts2.DiagnosticCategory.Message, "false_unless_composite_is_set_6906", "`false`, unless `composite` is set"),
      node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified: diag(6907, ts2.DiagnosticCategory.Message, "node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified_6907", '`["node_modules", "bower_components", "jspm_packages"]`, plus the value of `outDir` if one is specified.'),
      if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk: diag(6908, ts2.DiagnosticCategory.Message, "if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk_6908", '`[]` if `files` is specified, otherwise `["**/*"]`'),
      true_if_composite_false_otherwise: diag(6909, ts2.DiagnosticCategory.Message, "true_if_composite_false_otherwise_6909", "`true` if `composite`, `false` otherwise"),
      module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node: diag(69010, ts2.DiagnosticCategory.Message, "module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node_69010", "module === `AMD` or `UMD` or `System` or `ES6`, then `Classic`, Otherwise `Node`"),
      Computed_from_the_list_of_input_files: diag(6911, ts2.DiagnosticCategory.Message, "Computed_from_the_list_of_input_files_6911", "Computed from the list of input files"),
      Platform_specific: diag(6912, ts2.DiagnosticCategory.Message, "Platform_specific_6912", "Platform specific"),
      You_can_learn_about_all_of_the_compiler_options_at_0: diag(6913, ts2.DiagnosticCategory.Message, "You_can_learn_about_all_of_the_compiler_options_at_0_6913", "You can learn about all of the compiler options at {0}"),
      Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_config_watch_mode_with_Colon: diag(6914, ts2.DiagnosticCategory.Message, "Including_watch_w_will_start_watching_the_current_project_for_the_file_changes_Once_set_you_can_conf_6914", "Including --watch, -w will start watching the current project for the file changes. Once set, you can config watch mode with:"),
      Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_trigger_building_composite_projects_which_you_can_learn_more_about_at_0: diag(6915, ts2.DiagnosticCategory.Message, "Using_build_b_will_make_tsc_behave_more_like_a_build_orchestrator_than_a_compiler_This_is_used_to_tr_6915", "Using --build, -b will make tsc behave more like a build orchestrator than a compiler. This is used to trigger building composite projects which you can learn more about at {0}"),
      COMMON_COMMANDS: diag(6916, ts2.DiagnosticCategory.Message, "COMMON_COMMANDS_6916", "COMMON COMMANDS"),
      ALL_COMPILER_OPTIONS: diag(6917, ts2.DiagnosticCategory.Message, "ALL_COMPILER_OPTIONS_6917", "ALL COMPILER OPTIONS"),
      WATCH_OPTIONS: diag(6918, ts2.DiagnosticCategory.Message, "WATCH_OPTIONS_6918", "WATCH OPTIONS"),
      BUILD_OPTIONS: diag(6919, ts2.DiagnosticCategory.Message, "BUILD_OPTIONS_6919", "BUILD OPTIONS"),
      COMMON_COMPILER_OPTIONS: diag(6920, ts2.DiagnosticCategory.Message, "COMMON_COMPILER_OPTIONS_6920", "COMMON COMPILER OPTIONS"),
      COMMAND_LINE_FLAGS: diag(6921, ts2.DiagnosticCategory.Message, "COMMAND_LINE_FLAGS_6921", "COMMAND LINE FLAGS"),
      tsc_Colon_The_TypeScript_Compiler: diag(6922, ts2.DiagnosticCategory.Message, "tsc_Colon_The_TypeScript_Compiler_6922", "tsc: The TypeScript Compiler"),
      Compiles_the_current_project_tsconfig_json_in_the_working_directory: diag(6923, ts2.DiagnosticCategory.Message, "Compiles_the_current_project_tsconfig_json_in_the_working_directory_6923", "Compiles the current project (tsconfig.json in the working directory.)"),
      Ignoring_tsconfig_json_compiles_the_specified_files_with_default_compiler_options: diag(6924, ts2.DiagnosticCategory.Message, "Ignoring_tsconfig_json_compiles_the_specified_files_with_default_compiler_options_6924", "Ignoring tsconfig.json, compiles the specified files with default compiler options."),
      Build_a_composite_project_in_the_working_directory: diag(6925, ts2.DiagnosticCategory.Message, "Build_a_composite_project_in_the_working_directory_6925", "Build a composite project in the working directory."),
      Creates_a_tsconfig_json_with_the_recommended_settings_in_the_working_directory: diag(6926, ts2.DiagnosticCategory.Message, "Creates_a_tsconfig_json_with_the_recommended_settings_in_the_working_directory_6926", "Creates a tsconfig.json with the recommended settings in the working directory."),
      Compiles_the_TypeScript_project_located_at_the_specified_path: diag(6927, ts2.DiagnosticCategory.Message, "Compiles_the_TypeScript_project_located_at_the_specified_path_6927", "Compiles the TypeScript project located at the specified path."),
      An_expanded_version_of_this_information_showing_all_possible_compiler_options: diag(6928, ts2.DiagnosticCategory.Message, "An_expanded_version_of_this_information_showing_all_possible_compiler_options_6928", "An expanded version of this information, showing all possible compiler options"),
      Compiles_the_current_project_with_additional_settings: diag(6929, ts2.DiagnosticCategory.Message, "Compiles_the_current_project_with_additional_settings_6929", "Compiles the current project, with additional settings."),
      true_for_ES2022_and_above_including_ESNext: diag(6930, ts2.DiagnosticCategory.Message, "true_for_ES2022_and_above_including_ESNext_6930", "`true` for ES2022 and above, including ESNext."),
      Variable_0_implicitly_has_an_1_type: diag(7005, ts2.DiagnosticCategory.Error, "Variable_0_implicitly_has_an_1_type_7005", "Variable '{0}' implicitly has an '{1}' type."),
      Parameter_0_implicitly_has_an_1_type: diag(7006, ts2.DiagnosticCategory.Error, "Parameter_0_implicitly_has_an_1_type_7006", "Parameter '{0}' implicitly has an '{1}' type."),
      Member_0_implicitly_has_an_1_type: diag(7008, ts2.DiagnosticCategory.Error, "Member_0_implicitly_has_an_1_type_7008", "Member '{0}' implicitly has an '{1}' type."),
      new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type: diag(7009, ts2.DiagnosticCategory.Error, "new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type_7009", "'new' expression, whose target lacks a construct signature, implicitly has an 'any' type."),
      _0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type: diag(7010, ts2.DiagnosticCategory.Error, "_0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type_7010", "'{0}', which lacks return-type annotation, implicitly has an '{1}' return type."),
      Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: diag(7011, ts2.DiagnosticCategory.Error, "Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type_7011", "Function expression, which lacks return-type annotation, implicitly has an '{0}' return type."),
      Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: diag(7013, ts2.DiagnosticCategory.Error, "Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type_7013", "Construct signature, which lacks return-type annotation, implicitly has an 'any' return type."),
      Function_type_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: diag(7014, ts2.DiagnosticCategory.Error, "Function_type_which_lacks_return_type_annotation_implicitly_has_an_0_return_type_7014", "Function type, which lacks return-type annotation, implicitly has an '{0}' return type."),
      Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number: diag(7015, ts2.DiagnosticCategory.Error, "Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number_7015", "Element implicitly has an 'any' type because index expression is not of type 'number'."),
      Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type: diag(7016, ts2.DiagnosticCategory.Error, "Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type_7016", "Could not find a declaration file for module '{0}'. '{1}' implicitly has an 'any' type."),
      Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature: diag(7017, ts2.DiagnosticCategory.Error, "Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_7017", "Element implicitly has an 'any' type because type '{0}' has no index signature."),
      Object_literal_s_property_0_implicitly_has_an_1_type: diag(7018, ts2.DiagnosticCategory.Error, "Object_literal_s_property_0_implicitly_has_an_1_type_7018", "Object literal's property '{0}' implicitly has an '{1}' type."),
      Rest_parameter_0_implicitly_has_an_any_type: diag(7019, ts2.DiagnosticCategory.Error, "Rest_parameter_0_implicitly_has_an_any_type_7019", "Rest parameter '{0}' implicitly has an 'any[]' type."),
      Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: diag(7020, ts2.DiagnosticCategory.Error, "Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type_7020", "Call signature, which lacks return-type annotation, implicitly has an 'any' return type."),
      _0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer: diag(7022, ts2.DiagnosticCategory.Error, "_0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or__7022", "'{0}' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer."),
      _0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: diag(7023, ts2.DiagnosticCategory.Error, "_0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_reference_7023", "'{0}' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions."),
      Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: diag(7024, ts2.DiagnosticCategory.Error, "Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_ref_7024", "Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions."),
      Generator_implicitly_has_yield_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_type_annotation: diag(7025, ts2.DiagnosticCategory.Error, "Generator_implicitly_has_yield_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_retu_7025", "Generator implicitly has yield type '{0}' because it does not yield any values. Consider supplying a return type annotation."),
      JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists: diag(7026, ts2.DiagnosticCategory.Error, "JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists_7026", "JSX element implicitly has type 'any' because no interface 'JSX.{0}' exists."),
      Unreachable_code_detected: diag(7027, ts2.DiagnosticCategory.Error, "Unreachable_code_detected_7027", "Unreachable code detected.", true),
      Unused_label: diag(7028, ts2.DiagnosticCategory.Error, "Unused_label_7028", "Unused label.", true),
      Fallthrough_case_in_switch: diag(7029, ts2.DiagnosticCategory.Error, "Fallthrough_case_in_switch_7029", "Fallthrough case in switch."),
      Not_all_code_paths_return_a_value: diag(7030, ts2.DiagnosticCategory.Error, "Not_all_code_paths_return_a_value_7030", "Not all code paths return a value."),
      Binding_element_0_implicitly_has_an_1_type: diag(7031, ts2.DiagnosticCategory.Error, "Binding_element_0_implicitly_has_an_1_type_7031", "Binding element '{0}' implicitly has an '{1}' type."),
      Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation: diag(7032, ts2.DiagnosticCategory.Error, "Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation_7032", "Property '{0}' implicitly has type 'any', because its set accessor lacks a parameter type annotation."),
      Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation: diag(7033, ts2.DiagnosticCategory.Error, "Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation_7033", "Property '{0}' implicitly has type 'any', because its get accessor lacks a return type annotation."),
      Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined: diag(7034, ts2.DiagnosticCategory.Error, "Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined_7034", "Variable '{0}' implicitly has type '{1}' in some locations where its type cannot be determined."),
      Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0: diag(7035, ts2.DiagnosticCategory.Error, "Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare__7035", "Try `npm i --save-dev @types/{1}` if it exists or add a new declaration (.d.ts) file containing `declare module '{0}';`"),
      Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0: diag(7036, ts2.DiagnosticCategory.Error, "Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0_7036", "Dynamic import's specifier must be of type 'string', but here has type '{0}'."),
      Enables_emit_interoperability_between_CommonJS_and_ES_Modules_via_creation_of_namespace_objects_for_all_imports_Implies_allowSyntheticDefaultImports: diag(7037, ts2.DiagnosticCategory.Message, "Enables_emit_interoperability_between_CommonJS_and_ES_Modules_via_creation_of_namespace_objects_for__7037", "Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'."),
      Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cause_a_failure_at_runtime_Consider_using_a_default_import_or_import_require_here_instead: diag(7038, ts2.DiagnosticCategory.Message, "Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cau_7038", "Type originates at this import. A namespace-style import cannot be called or constructed, and will cause a failure at runtime. Consider using a default import or import require here instead."),
      Mapped_object_type_implicitly_has_an_any_template_type: diag(7039, ts2.DiagnosticCategory.Error, "Mapped_object_type_implicitly_has_an_any_template_type_7039", "Mapped object type implicitly has an 'any' template type."),
      If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_1: diag(7040, ts2.DiagnosticCategory.Error, "If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_S_7040", "If the '{0}' package actually exposes this module, consider sending a pull request to amend 'https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/{1}'"),
      The_containing_arrow_function_captures_the_global_value_of_this: diag(7041, ts2.DiagnosticCategory.Error, "The_containing_arrow_function_captures_the_global_value_of_this_7041", "The containing arrow function captures the global value of 'this'."),
      Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used: diag(7042, ts2.DiagnosticCategory.Error, "Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used_7042", "Module '{0}' was resolved to '{1}', but '--resolveJsonModule' is not used."),
      Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage: diag(7043, ts2.DiagnosticCategory.Suggestion, "Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage_7043", "Variable '{0}' implicitly has an '{1}' type, but a better type may be inferred from usage."),
      Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage: diag(7044, ts2.DiagnosticCategory.Suggestion, "Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage_7044", "Parameter '{0}' implicitly has an '{1}' type, but a better type may be inferred from usage."),
      Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage: diag(7045, ts2.DiagnosticCategory.Suggestion, "Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage_7045", "Member '{0}' implicitly has an '{1}' type, but a better type may be inferred from usage."),
      Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage: diag(7046, ts2.DiagnosticCategory.Suggestion, "Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage_7046", "Variable '{0}' implicitly has type '{1}' in some locations, but a better type may be inferred from usage."),
      Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage: diag(7047, ts2.DiagnosticCategory.Suggestion, "Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage_7047", "Rest parameter '{0}' implicitly has an 'any[]' type, but a better type may be inferred from usage."),
      Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage: diag(7048, ts2.DiagnosticCategory.Suggestion, "Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage_7048", "Property '{0}' implicitly has type 'any', but a better type for its get accessor may be inferred from usage."),
      Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage: diag(7049, ts2.DiagnosticCategory.Suggestion, "Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage_7049", "Property '{0}' implicitly has type 'any', but a better type for its set accessor may be inferred from usage."),
      _0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage: diag(7050, ts2.DiagnosticCategory.Suggestion, "_0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage_7050", "'{0}' implicitly has an '{1}' return type, but a better type may be inferred from usage."),
      Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1: diag(7051, ts2.DiagnosticCategory.Error, "Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1_7051", "Parameter has a name but no type. Did you mean '{0}: {1}'?"),
      Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_Did_you_mean_to_call_1: diag(7052, ts2.DiagnosticCategory.Error, "Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_Did_you_mean_to_call_1_7052", "Element implicitly has an 'any' type because type '{0}' has no index signature. Did you mean to call '{1}'?"),
      Element_implicitly_has_an_any_type_because_expression_of_type_0_can_t_be_used_to_index_type_1: diag(7053, ts2.DiagnosticCategory.Error, "Element_implicitly_has_an_any_type_because_expression_of_type_0_can_t_be_used_to_index_type_1_7053", "Element implicitly has an 'any' type because expression of type '{0}' can't be used to index type '{1}'."),
      No_index_signature_with_a_parameter_of_type_0_was_found_on_type_1: diag(7054, ts2.DiagnosticCategory.Error, "No_index_signature_with_a_parameter_of_type_0_was_found_on_type_1_7054", "No index signature with a parameter of type '{0}' was found on type '{1}'."),
      _0_which_lacks_return_type_annotation_implicitly_has_an_1_yield_type: diag(7055, ts2.DiagnosticCategory.Error, "_0_which_lacks_return_type_annotation_implicitly_has_an_1_yield_type_7055", "'{0}', which lacks return-type annotation, implicitly has an '{1}' yield type."),
      The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_type_annotation_is_needed: diag(7056, ts2.DiagnosticCategory.Error, "The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_ty_7056", "The inferred type of this node exceeds the maximum length the compiler will serialize. An explicit type annotation is needed."),
      yield_expression_implicitly_results_in_an_any_type_because_its_containing_generator_lacks_a_return_type_annotation: diag(7057, ts2.DiagnosticCategory.Error, "yield_expression_implicitly_results_in_an_any_type_because_its_containing_generator_lacks_a_return_t_7057", "'yield' expression implicitly results in an 'any' type because its containing generator lacks a return-type annotation."),
      If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_declare_module_1: diag(7058, ts2.DiagnosticCategory.Error, "If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_decl_7058", "If the '{0}' package actually exposes this module, try adding a new declaration (.d.ts) file containing `declare module '{1}';`"),
      This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead: diag(7059, ts2.DiagnosticCategory.Error, "This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead_7059", "This syntax is reserved in files with the .mts or .cts extension. Use an `as` expression instead."),
      This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Add_a_trailing_comma_or_explicit_constraint: diag(7060, ts2.DiagnosticCategory.Error, "This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Add_a_trailing_comma_or_explicit_cons_7060", "This syntax is reserved in files with the .mts or .cts extension. Add a trailing comma or explicit constraint."),
      A_mapped_type_may_not_declare_properties_or_methods: diag(7061, ts2.DiagnosticCategory.Error, "A_mapped_type_may_not_declare_properties_or_methods_7061", "A mapped type may not declare properties or methods."),
      JSON_imports_are_experimental_in_ES_module_mode_imports: diag(7062, ts2.DiagnosticCategory.Error, "JSON_imports_are_experimental_in_ES_module_mode_imports_7062", "JSON imports are experimental in ES module mode imports."),
      You_cannot_rename_this_element: diag(8e3, ts2.DiagnosticCategory.Error, "You_cannot_rename_this_element_8000", "You cannot rename this element."),
      You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: diag(8001, ts2.DiagnosticCategory.Error, "You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library_8001", "You cannot rename elements that are defined in the standard TypeScript library."),
      import_can_only_be_used_in_TypeScript_files: diag(8002, ts2.DiagnosticCategory.Error, "import_can_only_be_used_in_TypeScript_files_8002", "'import ... =' can only be used in TypeScript files."),
      export_can_only_be_used_in_TypeScript_files: diag(8003, ts2.DiagnosticCategory.Error, "export_can_only_be_used_in_TypeScript_files_8003", "'export =' can only be used in TypeScript files."),
      Type_parameter_declarations_can_only_be_used_in_TypeScript_files: diag(8004, ts2.DiagnosticCategory.Error, "Type_parameter_declarations_can_only_be_used_in_TypeScript_files_8004", "Type parameter declarations can only be used in TypeScript files."),
      implements_clauses_can_only_be_used_in_TypeScript_files: diag(8005, ts2.DiagnosticCategory.Error, "implements_clauses_can_only_be_used_in_TypeScript_files_8005", "'implements' clauses can only be used in TypeScript files."),
      _0_declarations_can_only_be_used_in_TypeScript_files: diag(8006, ts2.DiagnosticCategory.Error, "_0_declarations_can_only_be_used_in_TypeScript_files_8006", "'{0}' declarations can only be used in TypeScript files."),
      Type_aliases_can_only_be_used_in_TypeScript_files: diag(8008, ts2.DiagnosticCategory.Error, "Type_aliases_can_only_be_used_in_TypeScript_files_8008", "Type aliases can only be used in TypeScript files."),
      The_0_modifier_can_only_be_used_in_TypeScript_files: diag(8009, ts2.DiagnosticCategory.Error, "The_0_modifier_can_only_be_used_in_TypeScript_files_8009", "The '{0}' modifier can only be used in TypeScript files."),
      Type_annotations_can_only_be_used_in_TypeScript_files: diag(8010, ts2.DiagnosticCategory.Error, "Type_annotations_can_only_be_used_in_TypeScript_files_8010", "Type annotations can only be used in TypeScript files."),
      Type_arguments_can_only_be_used_in_TypeScript_files: diag(8011, ts2.DiagnosticCategory.Error, "Type_arguments_can_only_be_used_in_TypeScript_files_8011", "Type arguments can only be used in TypeScript files."),
      Parameter_modifiers_can_only_be_used_in_TypeScript_files: diag(8012, ts2.DiagnosticCategory.Error, "Parameter_modifiers_can_only_be_used_in_TypeScript_files_8012", "Parameter modifiers can only be used in TypeScript files."),
      Non_null_assertions_can_only_be_used_in_TypeScript_files: diag(8013, ts2.DiagnosticCategory.Error, "Non_null_assertions_can_only_be_used_in_TypeScript_files_8013", "Non-null assertions can only be used in TypeScript files."),
      Type_assertion_expressions_can_only_be_used_in_TypeScript_files: diag(8016, ts2.DiagnosticCategory.Error, "Type_assertion_expressions_can_only_be_used_in_TypeScript_files_8016", "Type assertion expressions can only be used in TypeScript files."),
      Octal_literal_types_must_use_ES2015_syntax_Use_the_syntax_0: diag(8017, ts2.DiagnosticCategory.Error, "Octal_literal_types_must_use_ES2015_syntax_Use_the_syntax_0_8017", "Octal literal types must use ES2015 syntax. Use the syntax '{0}'."),
      Octal_literals_are_not_allowed_in_enums_members_initializer_Use_the_syntax_0: diag(8018, ts2.DiagnosticCategory.Error, "Octal_literals_are_not_allowed_in_enums_members_initializer_Use_the_syntax_0_8018", "Octal literals are not allowed in enums members initializer. Use the syntax '{0}'."),
      Report_errors_in_js_files: diag(8019, ts2.DiagnosticCategory.Message, "Report_errors_in_js_files_8019", "Report errors in .js files."),
      JSDoc_types_can_only_be_used_inside_documentation_comments: diag(8020, ts2.DiagnosticCategory.Error, "JSDoc_types_can_only_be_used_inside_documentation_comments_8020", "JSDoc types can only be used inside documentation comments."),
      JSDoc_typedef_tag_should_either_have_a_type_annotation_or_be_followed_by_property_or_member_tags: diag(8021, ts2.DiagnosticCategory.Error, "JSDoc_typedef_tag_should_either_have_a_type_annotation_or_be_followed_by_property_or_member_tags_8021", "JSDoc '@typedef' tag should either have a type annotation or be followed by '@property' or '@member' tags."),
      JSDoc_0_is_not_attached_to_a_class: diag(8022, ts2.DiagnosticCategory.Error, "JSDoc_0_is_not_attached_to_a_class_8022", "JSDoc '@{0}' is not attached to a class."),
      JSDoc_0_1_does_not_match_the_extends_2_clause: diag(8023, ts2.DiagnosticCategory.Error, "JSDoc_0_1_does_not_match_the_extends_2_clause_8023", "JSDoc '@{0} {1}' does not match the 'extends {2}' clause."),
      JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name: diag(8024, ts2.DiagnosticCategory.Error, "JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_8024", "JSDoc '@param' tag has name '{0}', but there is no parameter with that name."),
      Class_declarations_cannot_have_more_than_one_augments_or_extends_tag: diag(8025, ts2.DiagnosticCategory.Error, "Class_declarations_cannot_have_more_than_one_augments_or_extends_tag_8025", "Class declarations cannot have more than one '@augments' or '@extends' tag."),
      Expected_0_type_arguments_provide_these_with_an_extends_tag: diag(8026, ts2.DiagnosticCategory.Error, "Expected_0_type_arguments_provide_these_with_an_extends_tag_8026", "Expected {0} type arguments; provide these with an '@extends' tag."),
      Expected_0_1_type_arguments_provide_these_with_an_extends_tag: diag(8027, ts2.DiagnosticCategory.Error, "Expected_0_1_type_arguments_provide_these_with_an_extends_tag_8027", "Expected {0}-{1} type arguments; provide these with an '@extends' tag."),
      JSDoc_may_only_appear_in_the_last_parameter_of_a_signature: diag(8028, ts2.DiagnosticCategory.Error, "JSDoc_may_only_appear_in_the_last_parameter_of_a_signature_8028", "JSDoc '...' may only appear in the last parameter of a signature."),
      JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_It_would_match_arguments_if_it_had_an_array_type: diag(8029, ts2.DiagnosticCategory.Error, "JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_It_would_match_arguments_if_it_h_8029", "JSDoc '@param' tag has name '{0}', but there is no parameter with that name. It would match 'arguments' if it had an array type."),
      The_type_of_a_function_declaration_must_match_the_function_s_signature: diag(8030, ts2.DiagnosticCategory.Error, "The_type_of_a_function_declaration_must_match_the_function_s_signature_8030", "The type of a function declaration must match the function's signature."),
      You_cannot_rename_a_module_via_a_global_import: diag(8031, ts2.DiagnosticCategory.Error, "You_cannot_rename_a_module_via_a_global_import_8031", "You cannot rename a module via a global import."),
      Qualified_name_0_is_not_allowed_without_a_leading_param_object_1: diag(8032, ts2.DiagnosticCategory.Error, "Qualified_name_0_is_not_allowed_without_a_leading_param_object_1_8032", "Qualified name '{0}' is not allowed without a leading '@param {object} {1}'."),
      A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags: diag(8033, ts2.DiagnosticCategory.Error, "A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags_8033", "A JSDoc '@typedef' comment may not contain multiple '@type' tags."),
      The_tag_was_first_specified_here: diag(8034, ts2.DiagnosticCategory.Error, "The_tag_was_first_specified_here_8034", "The tag was first specified here."),
      Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit: diag(9005, ts2.DiagnosticCategory.Error, "Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_9005", "Declaration emit for this file requires using private name '{0}'. An explicit type annotation may unblock declaration emit."),
      Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotation_may_unblock_declaration_emit: diag(9006, ts2.DiagnosticCategory.Error, "Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotati_9006", "Declaration emit for this file requires using private name '{0}' from module '{1}'. An explicit type annotation may unblock declaration emit."),
      JSX_attributes_must_only_be_assigned_a_non_empty_expression: diag(17e3, ts2.DiagnosticCategory.Error, "JSX_attributes_must_only_be_assigned_a_non_empty_expression_17000", "JSX attributes must only be assigned a non-empty 'expression'."),
      JSX_elements_cannot_have_multiple_attributes_with_the_same_name: diag(17001, ts2.DiagnosticCategory.Error, "JSX_elements_cannot_have_multiple_attributes_with_the_same_name_17001", "JSX elements cannot have multiple attributes with the same name."),
      Expected_corresponding_JSX_closing_tag_for_0: diag(17002, ts2.DiagnosticCategory.Error, "Expected_corresponding_JSX_closing_tag_for_0_17002", "Expected corresponding JSX closing tag for '{0}'."),
      Cannot_use_JSX_unless_the_jsx_flag_is_provided: diag(17004, ts2.DiagnosticCategory.Error, "Cannot_use_JSX_unless_the_jsx_flag_is_provided_17004", "Cannot use JSX unless the '--jsx' flag is provided."),
      A_constructor_cannot_contain_a_super_call_when_its_class_extends_null: diag(17005, ts2.DiagnosticCategory.Error, "A_constructor_cannot_contain_a_super_call_when_its_class_extends_null_17005", "A constructor cannot contain a 'super' call when its class extends 'null'."),
      An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses: diag(17006, ts2.DiagnosticCategory.Error, "An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_ex_17006", "An unary expression with the '{0}' operator is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses."),
      A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses: diag(17007, ts2.DiagnosticCategory.Error, "A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Con_17007", "A type assertion expression is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses."),
      JSX_element_0_has_no_corresponding_closing_tag: diag(17008, ts2.DiagnosticCategory.Error, "JSX_element_0_has_no_corresponding_closing_tag_17008", "JSX element '{0}' has no corresponding closing tag."),
      super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class: diag(17009, ts2.DiagnosticCategory.Error, "super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class_17009", "'super' must be called before accessing 'this' in the constructor of a derived class."),
      Unknown_type_acquisition_option_0: diag(17010, ts2.DiagnosticCategory.Error, "Unknown_type_acquisition_option_0_17010", "Unknown type acquisition option '{0}'."),
      super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class: diag(17011, ts2.DiagnosticCategory.Error, "super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class_17011", "'super' must be called before accessing a property of 'super' in the constructor of a derived class."),
      _0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2: diag(17012, ts2.DiagnosticCategory.Error, "_0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2_17012", "'{0}' is not a valid meta-property for keyword '{1}'. Did you mean '{2}'?"),
      Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constructor: diag(17013, ts2.DiagnosticCategory.Error, "Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constru_17013", "Meta-property '{0}' is only allowed in the body of a function declaration, function expression, or constructor."),
      JSX_fragment_has_no_corresponding_closing_tag: diag(17014, ts2.DiagnosticCategory.Error, "JSX_fragment_has_no_corresponding_closing_tag_17014", "JSX fragment has no corresponding closing tag."),
      Expected_corresponding_closing_tag_for_JSX_fragment: diag(17015, ts2.DiagnosticCategory.Error, "Expected_corresponding_closing_tag_for_JSX_fragment_17015", "Expected corresponding closing tag for JSX fragment."),
      The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_compiler_option: diag(17016, ts2.DiagnosticCategory.Error, "The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_com_17016", "The 'jsxFragmentFactory' compiler option must be provided to use JSX fragments with the 'jsxFactory' compiler option."),
      An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments: diag(17017, ts2.DiagnosticCategory.Error, "An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments_17017", "An @jsxFrag pragma is required when using an @jsx pragma with JSX fragments."),
      Unknown_type_acquisition_option_0_Did_you_mean_1: diag(17018, ts2.DiagnosticCategory.Error, "Unknown_type_acquisition_option_0_Did_you_mean_1_17018", "Unknown type acquisition option '{0}'. Did you mean '{1}'?"),
      Circularity_detected_while_resolving_configuration_Colon_0: diag(18e3, ts2.DiagnosticCategory.Error, "Circularity_detected_while_resolving_configuration_Colon_0_18000", "Circularity detected while resolving configuration: {0}"),
      The_files_list_in_config_file_0_is_empty: diag(18002, ts2.DiagnosticCategory.Error, "The_files_list_in_config_file_0_is_empty_18002", "The 'files' list in config file '{0}' is empty."),
      No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2: diag(18003, ts2.DiagnosticCategory.Error, "No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2_18003", "No inputs were found in config file '{0}'. Specified 'include' paths were '{1}' and 'exclude' paths were '{2}'."),
      File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module: diag(80001, ts2.DiagnosticCategory.Suggestion, "File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module_80001", "File is a CommonJS module; it may be converted to an ES module."),
      This_constructor_function_may_be_converted_to_a_class_declaration: diag(80002, ts2.DiagnosticCategory.Suggestion, "This_constructor_function_may_be_converted_to_a_class_declaration_80002", "This constructor function may be converted to a class declaration."),
      Import_may_be_converted_to_a_default_import: diag(80003, ts2.DiagnosticCategory.Suggestion, "Import_may_be_converted_to_a_default_import_80003", "Import may be converted to a default import."),
      JSDoc_types_may_be_moved_to_TypeScript_types: diag(80004, ts2.DiagnosticCategory.Suggestion, "JSDoc_types_may_be_moved_to_TypeScript_types_80004", "JSDoc types may be moved to TypeScript types."),
      require_call_may_be_converted_to_an_import: diag(80005, ts2.DiagnosticCategory.Suggestion, "require_call_may_be_converted_to_an_import_80005", "'require' call may be converted to an import."),
      This_may_be_converted_to_an_async_function: diag(80006, ts2.DiagnosticCategory.Suggestion, "This_may_be_converted_to_an_async_function_80006", "This may be converted to an async function."),
      await_has_no_effect_on_the_type_of_this_expression: diag(80007, ts2.DiagnosticCategory.Suggestion, "await_has_no_effect_on_the_type_of_this_expression_80007", "'await' has no effect on the type of this expression."),
      Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers: diag(80008, ts2.DiagnosticCategory.Suggestion, "Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accur_80008", "Numeric literals with absolute values equal to 2^53 or greater are too large to be represented accurately as integers."),
      Add_missing_super_call: diag(90001, ts2.DiagnosticCategory.Message, "Add_missing_super_call_90001", "Add missing 'super()' call"),
      Make_super_call_the_first_statement_in_the_constructor: diag(90002, ts2.DiagnosticCategory.Message, "Make_super_call_the_first_statement_in_the_constructor_90002", "Make 'super()' call the first statement in the constructor"),
      Change_extends_to_implements: diag(90003, ts2.DiagnosticCategory.Message, "Change_extends_to_implements_90003", "Change 'extends' to 'implements'"),
      Remove_unused_declaration_for_Colon_0: diag(90004, ts2.DiagnosticCategory.Message, "Remove_unused_declaration_for_Colon_0_90004", "Remove unused declaration for: '{0}'"),
      Remove_import_from_0: diag(90005, ts2.DiagnosticCategory.Message, "Remove_import_from_0_90005", "Remove import from '{0}'"),
      Implement_interface_0: diag(90006, ts2.DiagnosticCategory.Message, "Implement_interface_0_90006", "Implement interface '{0}'"),
      Implement_inherited_abstract_class: diag(90007, ts2.DiagnosticCategory.Message, "Implement_inherited_abstract_class_90007", "Implement inherited abstract class"),
      Add_0_to_unresolved_variable: diag(90008, ts2.DiagnosticCategory.Message, "Add_0_to_unresolved_variable_90008", "Add '{0}.' to unresolved variable"),
      Remove_variable_statement: diag(90010, ts2.DiagnosticCategory.Message, "Remove_variable_statement_90010", "Remove variable statement"),
      Remove_template_tag: diag(90011, ts2.DiagnosticCategory.Message, "Remove_template_tag_90011", "Remove template tag"),
      Remove_type_parameters: diag(90012, ts2.DiagnosticCategory.Message, "Remove_type_parameters_90012", "Remove type parameters"),
      Import_0_from_module_1: diag(90013, ts2.DiagnosticCategory.Message, "Import_0_from_module_1_90013", `Import '{0}' from module "{1}"`),
      Change_0_to_1: diag(90014, ts2.DiagnosticCategory.Message, "Change_0_to_1_90014", "Change '{0}' to '{1}'"),
      Add_0_to_existing_import_declaration_from_1: diag(90015, ts2.DiagnosticCategory.Message, "Add_0_to_existing_import_declaration_from_1_90015", `Add '{0}' to existing import declaration from "{1}"`),
      Declare_property_0: diag(90016, ts2.DiagnosticCategory.Message, "Declare_property_0_90016", "Declare property '{0}'"),
      Add_index_signature_for_property_0: diag(90017, ts2.DiagnosticCategory.Message, "Add_index_signature_for_property_0_90017", "Add index signature for property '{0}'"),
      Disable_checking_for_this_file: diag(90018, ts2.DiagnosticCategory.Message, "Disable_checking_for_this_file_90018", "Disable checking for this file"),
      Ignore_this_error_message: diag(90019, ts2.DiagnosticCategory.Message, "Ignore_this_error_message_90019", "Ignore this error message"),
      Initialize_property_0_in_the_constructor: diag(90020, ts2.DiagnosticCategory.Message, "Initialize_property_0_in_the_constructor_90020", "Initialize property '{0}' in the constructor"),
      Initialize_static_property_0: diag(90021, ts2.DiagnosticCategory.Message, "Initialize_static_property_0_90021", "Initialize static property '{0}'"),
      Change_spelling_to_0: diag(90022, ts2.DiagnosticCategory.Message, "Change_spelling_to_0_90022", "Change spelling to '{0}'"),
      Declare_method_0: diag(90023, ts2.DiagnosticCategory.Message, "Declare_method_0_90023", "Declare method '{0}'"),
      Declare_static_method_0: diag(90024, ts2.DiagnosticCategory.Message, "Declare_static_method_0_90024", "Declare static method '{0}'"),
      Prefix_0_with_an_underscore: diag(90025, ts2.DiagnosticCategory.Message, "Prefix_0_with_an_underscore_90025", "Prefix '{0}' with an underscore"),
      Rewrite_as_the_indexed_access_type_0: diag(90026, ts2.DiagnosticCategory.Message, "Rewrite_as_the_indexed_access_type_0_90026", "Rewrite as the indexed access type '{0}'"),
      Declare_static_property_0: diag(90027, ts2.DiagnosticCategory.Message, "Declare_static_property_0_90027", "Declare static property '{0}'"),
      Call_decorator_expression: diag(90028, ts2.DiagnosticCategory.Message, "Call_decorator_expression_90028", "Call decorator expression"),
      Add_async_modifier_to_containing_function: diag(90029, ts2.DiagnosticCategory.Message, "Add_async_modifier_to_containing_function_90029", "Add async modifier to containing function"),
      Replace_infer_0_with_unknown: diag(90030, ts2.DiagnosticCategory.Message, "Replace_infer_0_with_unknown_90030", "Replace 'infer {0}' with 'unknown'"),
      Replace_all_unused_infer_with_unknown: diag(90031, ts2.DiagnosticCategory.Message, "Replace_all_unused_infer_with_unknown_90031", "Replace all unused 'infer' with 'unknown'"),
      Import_default_0_from_module_1: diag(90032, ts2.DiagnosticCategory.Message, "Import_default_0_from_module_1_90032", `Import default '{0}' from module "{1}"`),
      Add_default_import_0_to_existing_import_declaration_from_1: diag(90033, ts2.DiagnosticCategory.Message, "Add_default_import_0_to_existing_import_declaration_from_1_90033", `Add default import '{0}' to existing import declaration from "{1}"`),
      Add_parameter_name: diag(90034, ts2.DiagnosticCategory.Message, "Add_parameter_name_90034", "Add parameter name"),
      Declare_private_property_0: diag(90035, ts2.DiagnosticCategory.Message, "Declare_private_property_0_90035", "Declare private property '{0}'"),
      Replace_0_with_Promise_1: diag(90036, ts2.DiagnosticCategory.Message, "Replace_0_with_Promise_1_90036", "Replace '{0}' with 'Promise<{1}>'"),
      Fix_all_incorrect_return_type_of_an_async_functions: diag(90037, ts2.DiagnosticCategory.Message, "Fix_all_incorrect_return_type_of_an_async_functions_90037", "Fix all incorrect return type of an async functions"),
      Declare_private_method_0: diag(90038, ts2.DiagnosticCategory.Message, "Declare_private_method_0_90038", "Declare private method '{0}'"),
      Remove_unused_destructuring_declaration: diag(90039, ts2.DiagnosticCategory.Message, "Remove_unused_destructuring_declaration_90039", "Remove unused destructuring declaration"),
      Remove_unused_declarations_for_Colon_0: diag(90041, ts2.DiagnosticCategory.Message, "Remove_unused_declarations_for_Colon_0_90041", "Remove unused declarations for: '{0}'"),
      Declare_a_private_field_named_0: diag(90053, ts2.DiagnosticCategory.Message, "Declare_a_private_field_named_0_90053", "Declare a private field named '{0}'."),
      Includes_imports_of_types_referenced_by_0: diag(90054, ts2.DiagnosticCategory.Message, "Includes_imports_of_types_referenced_by_0_90054", "Includes imports of types referenced by '{0}'"),
      Convert_function_to_an_ES2015_class: diag(95001, ts2.DiagnosticCategory.Message, "Convert_function_to_an_ES2015_class_95001", "Convert function to an ES2015 class"),
      Convert_0_to_1_in_0: diag(95003, ts2.DiagnosticCategory.Message, "Convert_0_to_1_in_0_95003", "Convert '{0}' to '{1} in {0}'"),
      Extract_to_0_in_1: diag(95004, ts2.DiagnosticCategory.Message, "Extract_to_0_in_1_95004", "Extract to {0} in {1}"),
      Extract_function: diag(95005, ts2.DiagnosticCategory.Message, "Extract_function_95005", "Extract function"),
      Extract_constant: diag(95006, ts2.DiagnosticCategory.Message, "Extract_constant_95006", "Extract constant"),
      Extract_to_0_in_enclosing_scope: diag(95007, ts2.DiagnosticCategory.Message, "Extract_to_0_in_enclosing_scope_95007", "Extract to {0} in enclosing scope"),
      Extract_to_0_in_1_scope: diag(95008, ts2.DiagnosticCategory.Message, "Extract_to_0_in_1_scope_95008", "Extract to {0} in {1} scope"),
      Annotate_with_type_from_JSDoc: diag(95009, ts2.DiagnosticCategory.Message, "Annotate_with_type_from_JSDoc_95009", "Annotate with type from JSDoc"),
      Infer_type_of_0_from_usage: diag(95011, ts2.DiagnosticCategory.Message, "Infer_type_of_0_from_usage_95011", "Infer type of '{0}' from usage"),
      Infer_parameter_types_from_usage: diag(95012, ts2.DiagnosticCategory.Message, "Infer_parameter_types_from_usage_95012", "Infer parameter types from usage"),
      Convert_to_default_import: diag(95013, ts2.DiagnosticCategory.Message, "Convert_to_default_import_95013", "Convert to default import"),
      Install_0: diag(95014, ts2.DiagnosticCategory.Message, "Install_0_95014", "Install '{0}'"),
      Replace_import_with_0: diag(95015, ts2.DiagnosticCategory.Message, "Replace_import_with_0_95015", "Replace import with '{0}'."),
      Use_synthetic_default_member: diag(95016, ts2.DiagnosticCategory.Message, "Use_synthetic_default_member_95016", "Use synthetic 'default' member."),
      Convert_to_ES_module: diag(95017, ts2.DiagnosticCategory.Message, "Convert_to_ES_module_95017", "Convert to ES module"),
      Add_undefined_type_to_property_0: diag(95018, ts2.DiagnosticCategory.Message, "Add_undefined_type_to_property_0_95018", "Add 'undefined' type to property '{0}'"),
      Add_initializer_to_property_0: diag(95019, ts2.DiagnosticCategory.Message, "Add_initializer_to_property_0_95019", "Add initializer to property '{0}'"),
      Add_definite_assignment_assertion_to_property_0: diag(95020, ts2.DiagnosticCategory.Message, "Add_definite_assignment_assertion_to_property_0_95020", "Add definite assignment assertion to property '{0}'"),
      Convert_all_type_literals_to_mapped_type: diag(95021, ts2.DiagnosticCategory.Message, "Convert_all_type_literals_to_mapped_type_95021", "Convert all type literals to mapped type"),
      Add_all_missing_members: diag(95022, ts2.DiagnosticCategory.Message, "Add_all_missing_members_95022", "Add all missing members"),
      Infer_all_types_from_usage: diag(95023, ts2.DiagnosticCategory.Message, "Infer_all_types_from_usage_95023", "Infer all types from usage"),
      Delete_all_unused_declarations: diag(95024, ts2.DiagnosticCategory.Message, "Delete_all_unused_declarations_95024", "Delete all unused declarations"),
      Prefix_all_unused_declarations_with_where_possible: diag(95025, ts2.DiagnosticCategory.Message, "Prefix_all_unused_declarations_with_where_possible_95025", "Prefix all unused declarations with '_' where possible"),
      Fix_all_detected_spelling_errors: diag(95026, ts2.DiagnosticCategory.Message, "Fix_all_detected_spelling_errors_95026", "Fix all detected spelling errors"),
      Add_initializers_to_all_uninitialized_properties: diag(95027, ts2.DiagnosticCategory.Message, "Add_initializers_to_all_uninitialized_properties_95027", "Add initializers to all uninitialized properties"),
      Add_definite_assignment_assertions_to_all_uninitialized_properties: diag(95028, ts2.DiagnosticCategory.Message, "Add_definite_assignment_assertions_to_all_uninitialized_properties_95028", "Add definite assignment assertions to all uninitialized properties"),
      Add_undefined_type_to_all_uninitialized_properties: diag(95029, ts2.DiagnosticCategory.Message, "Add_undefined_type_to_all_uninitialized_properties_95029", "Add undefined type to all uninitialized properties"),
      Change_all_jsdoc_style_types_to_TypeScript: diag(95030, ts2.DiagnosticCategory.Message, "Change_all_jsdoc_style_types_to_TypeScript_95030", "Change all jsdoc-style types to TypeScript"),
      Change_all_jsdoc_style_types_to_TypeScript_and_add_undefined_to_nullable_types: diag(95031, ts2.DiagnosticCategory.Message, "Change_all_jsdoc_style_types_to_TypeScript_and_add_undefined_to_nullable_types_95031", "Change all jsdoc-style types to TypeScript (and add '| undefined' to nullable types)"),
      Implement_all_unimplemented_interfaces: diag(95032, ts2.DiagnosticCategory.Message, "Implement_all_unimplemented_interfaces_95032", "Implement all unimplemented interfaces"),
      Install_all_missing_types_packages: diag(95033, ts2.DiagnosticCategory.Message, "Install_all_missing_types_packages_95033", "Install all missing types packages"),
      Rewrite_all_as_indexed_access_types: diag(95034, ts2.DiagnosticCategory.Message, "Rewrite_all_as_indexed_access_types_95034", "Rewrite all as indexed access types"),
      Convert_all_to_default_imports: diag(95035, ts2.DiagnosticCategory.Message, "Convert_all_to_default_imports_95035", "Convert all to default imports"),
      Make_all_super_calls_the_first_statement_in_their_constructor: diag(95036, ts2.DiagnosticCategory.Message, "Make_all_super_calls_the_first_statement_in_their_constructor_95036", "Make all 'super()' calls the first statement in their constructor"),
      Add_qualifier_to_all_unresolved_variables_matching_a_member_name: diag(95037, ts2.DiagnosticCategory.Message, "Add_qualifier_to_all_unresolved_variables_matching_a_member_name_95037", "Add qualifier to all unresolved variables matching a member name"),
      Change_all_extended_interfaces_to_implements: diag(95038, ts2.DiagnosticCategory.Message, "Change_all_extended_interfaces_to_implements_95038", "Change all extended interfaces to 'implements'"),
      Add_all_missing_super_calls: diag(95039, ts2.DiagnosticCategory.Message, "Add_all_missing_super_calls_95039", "Add all missing super calls"),
      Implement_all_inherited_abstract_classes: diag(95040, ts2.DiagnosticCategory.Message, "Implement_all_inherited_abstract_classes_95040", "Implement all inherited abstract classes"),
      Add_all_missing_async_modifiers: diag(95041, ts2.DiagnosticCategory.Message, "Add_all_missing_async_modifiers_95041", "Add all missing 'async' modifiers"),
      Add_ts_ignore_to_all_error_messages: diag(95042, ts2.DiagnosticCategory.Message, "Add_ts_ignore_to_all_error_messages_95042", "Add '@ts-ignore' to all error messages"),
      Annotate_everything_with_types_from_JSDoc: diag(95043, ts2.DiagnosticCategory.Message, "Annotate_everything_with_types_from_JSDoc_95043", "Annotate everything with types from JSDoc"),
      Add_to_all_uncalled_decorators: diag(95044, ts2.DiagnosticCategory.Message, "Add_to_all_uncalled_decorators_95044", "Add '()' to all uncalled decorators"),
      Convert_all_constructor_functions_to_classes: diag(95045, ts2.DiagnosticCategory.Message, "Convert_all_constructor_functions_to_classes_95045", "Convert all constructor functions to classes"),
      Generate_get_and_set_accessors: diag(95046, ts2.DiagnosticCategory.Message, "Generate_get_and_set_accessors_95046", "Generate 'get' and 'set' accessors"),
      Convert_require_to_import: diag(95047, ts2.DiagnosticCategory.Message, "Convert_require_to_import_95047", "Convert 'require' to 'import'"),
      Convert_all_require_to_import: diag(95048, ts2.DiagnosticCategory.Message, "Convert_all_require_to_import_95048", "Convert all 'require' to 'import'"),
      Move_to_a_new_file: diag(95049, ts2.DiagnosticCategory.Message, "Move_to_a_new_file_95049", "Move to a new file"),
      Remove_unreachable_code: diag(95050, ts2.DiagnosticCategory.Message, "Remove_unreachable_code_95050", "Remove unreachable code"),
      Remove_all_unreachable_code: diag(95051, ts2.DiagnosticCategory.Message, "Remove_all_unreachable_code_95051", "Remove all unreachable code"),
      Add_missing_typeof: diag(95052, ts2.DiagnosticCategory.Message, "Add_missing_typeof_95052", "Add missing 'typeof'"),
      Remove_unused_label: diag(95053, ts2.DiagnosticCategory.Message, "Remove_unused_label_95053", "Remove unused label"),
      Remove_all_unused_labels: diag(95054, ts2.DiagnosticCategory.Message, "Remove_all_unused_labels_95054", "Remove all unused labels"),
      Convert_0_to_mapped_object_type: diag(95055, ts2.DiagnosticCategory.Message, "Convert_0_to_mapped_object_type_95055", "Convert '{0}' to mapped object type"),
      Convert_namespace_import_to_named_imports: diag(95056, ts2.DiagnosticCategory.Message, "Convert_namespace_import_to_named_imports_95056", "Convert namespace import to named imports"),
      Convert_named_imports_to_namespace_import: diag(95057, ts2.DiagnosticCategory.Message, "Convert_named_imports_to_namespace_import_95057", "Convert named imports to namespace import"),
      Add_or_remove_braces_in_an_arrow_function: diag(95058, ts2.DiagnosticCategory.Message, "Add_or_remove_braces_in_an_arrow_function_95058", "Add or remove braces in an arrow function"),
      Add_braces_to_arrow_function: diag(95059, ts2.DiagnosticCategory.Message, "Add_braces_to_arrow_function_95059", "Add braces to arrow function"),
      Remove_braces_from_arrow_function: diag(95060, ts2.DiagnosticCategory.Message, "Remove_braces_from_arrow_function_95060", "Remove braces from arrow function"),
      Convert_default_export_to_named_export: diag(95061, ts2.DiagnosticCategory.Message, "Convert_default_export_to_named_export_95061", "Convert default export to named export"),
      Convert_named_export_to_default_export: diag(95062, ts2.DiagnosticCategory.Message, "Convert_named_export_to_default_export_95062", "Convert named export to default export"),
      Add_missing_enum_member_0: diag(95063, ts2.DiagnosticCategory.Message, "Add_missing_enum_member_0_95063", "Add missing enum member '{0}'"),
      Add_all_missing_imports: diag(95064, ts2.DiagnosticCategory.Message, "Add_all_missing_imports_95064", "Add all missing imports"),
      Convert_to_async_function: diag(95065, ts2.DiagnosticCategory.Message, "Convert_to_async_function_95065", "Convert to async function"),
      Convert_all_to_async_functions: diag(95066, ts2.DiagnosticCategory.Message, "Convert_all_to_async_functions_95066", "Convert all to async functions"),
      Add_missing_call_parentheses: diag(95067, ts2.DiagnosticCategory.Message, "Add_missing_call_parentheses_95067", "Add missing call parentheses"),
      Add_all_missing_call_parentheses: diag(95068, ts2.DiagnosticCategory.Message, "Add_all_missing_call_parentheses_95068", "Add all missing call parentheses"),
      Add_unknown_conversion_for_non_overlapping_types: diag(95069, ts2.DiagnosticCategory.Message, "Add_unknown_conversion_for_non_overlapping_types_95069", "Add 'unknown' conversion for non-overlapping types"),
      Add_unknown_to_all_conversions_of_non_overlapping_types: diag(95070, ts2.DiagnosticCategory.Message, "Add_unknown_to_all_conversions_of_non_overlapping_types_95070", "Add 'unknown' to all conversions of non-overlapping types"),
      Add_missing_new_operator_to_call: diag(95071, ts2.DiagnosticCategory.Message, "Add_missing_new_operator_to_call_95071", "Add missing 'new' operator to call"),
      Add_missing_new_operator_to_all_calls: diag(95072, ts2.DiagnosticCategory.Message, "Add_missing_new_operator_to_all_calls_95072", "Add missing 'new' operator to all calls"),
      Add_names_to_all_parameters_without_names: diag(95073, ts2.DiagnosticCategory.Message, "Add_names_to_all_parameters_without_names_95073", "Add names to all parameters without names"),
      Enable_the_experimentalDecorators_option_in_your_configuration_file: diag(95074, ts2.DiagnosticCategory.Message, "Enable_the_experimentalDecorators_option_in_your_configuration_file_95074", "Enable the 'experimentalDecorators' option in your configuration file"),
      Convert_parameters_to_destructured_object: diag(95075, ts2.DiagnosticCategory.Message, "Convert_parameters_to_destructured_object_95075", "Convert parameters to destructured object"),
      Extract_type: diag(95077, ts2.DiagnosticCategory.Message, "Extract_type_95077", "Extract type"),
      Extract_to_type_alias: diag(95078, ts2.DiagnosticCategory.Message, "Extract_to_type_alias_95078", "Extract to type alias"),
      Extract_to_typedef: diag(95079, ts2.DiagnosticCategory.Message, "Extract_to_typedef_95079", "Extract to typedef"),
      Infer_this_type_of_0_from_usage: diag(95080, ts2.DiagnosticCategory.Message, "Infer_this_type_of_0_from_usage_95080", "Infer 'this' type of '{0}' from usage"),
      Add_const_to_unresolved_variable: diag(95081, ts2.DiagnosticCategory.Message, "Add_const_to_unresolved_variable_95081", "Add 'const' to unresolved variable"),
      Add_const_to_all_unresolved_variables: diag(95082, ts2.DiagnosticCategory.Message, "Add_const_to_all_unresolved_variables_95082", "Add 'const' to all unresolved variables"),
      Add_await: diag(95083, ts2.DiagnosticCategory.Message, "Add_await_95083", "Add 'await'"),
      Add_await_to_initializer_for_0: diag(95084, ts2.DiagnosticCategory.Message, "Add_await_to_initializer_for_0_95084", "Add 'await' to initializer for '{0}'"),
      Fix_all_expressions_possibly_missing_await: diag(95085, ts2.DiagnosticCategory.Message, "Fix_all_expressions_possibly_missing_await_95085", "Fix all expressions possibly missing 'await'"),
      Remove_unnecessary_await: diag(95086, ts2.DiagnosticCategory.Message, "Remove_unnecessary_await_95086", "Remove unnecessary 'await'"),
      Remove_all_unnecessary_uses_of_await: diag(95087, ts2.DiagnosticCategory.Message, "Remove_all_unnecessary_uses_of_await_95087", "Remove all unnecessary uses of 'await'"),
      Enable_the_jsx_flag_in_your_configuration_file: diag(95088, ts2.DiagnosticCategory.Message, "Enable_the_jsx_flag_in_your_configuration_file_95088", "Enable the '--jsx' flag in your configuration file"),
      Add_await_to_initializers: diag(95089, ts2.DiagnosticCategory.Message, "Add_await_to_initializers_95089", "Add 'await' to initializers"),
      Extract_to_interface: diag(95090, ts2.DiagnosticCategory.Message, "Extract_to_interface_95090", "Extract to interface"),
      Convert_to_a_bigint_numeric_literal: diag(95091, ts2.DiagnosticCategory.Message, "Convert_to_a_bigint_numeric_literal_95091", "Convert to a bigint numeric literal"),
      Convert_all_to_bigint_numeric_literals: diag(95092, ts2.DiagnosticCategory.Message, "Convert_all_to_bigint_numeric_literals_95092", "Convert all to bigint numeric literals"),
      Convert_const_to_let: diag(95093, ts2.DiagnosticCategory.Message, "Convert_const_to_let_95093", "Convert 'const' to 'let'"),
      Prefix_with_declare: diag(95094, ts2.DiagnosticCategory.Message, "Prefix_with_declare_95094", "Prefix with 'declare'"),
      Prefix_all_incorrect_property_declarations_with_declare: diag(95095, ts2.DiagnosticCategory.Message, "Prefix_all_incorrect_property_declarations_with_declare_95095", "Prefix all incorrect property declarations with 'declare'"),
      Convert_to_template_string: diag(95096, ts2.DiagnosticCategory.Message, "Convert_to_template_string_95096", "Convert to template string"),
      Add_export_to_make_this_file_into_a_module: diag(95097, ts2.DiagnosticCategory.Message, "Add_export_to_make_this_file_into_a_module_95097", "Add 'export {}' to make this file into a module"),
      Set_the_target_option_in_your_configuration_file_to_0: diag(95098, ts2.DiagnosticCategory.Message, "Set_the_target_option_in_your_configuration_file_to_0_95098", "Set the 'target' option in your configuration file to '{0}'"),
      Set_the_module_option_in_your_configuration_file_to_0: diag(95099, ts2.DiagnosticCategory.Message, "Set_the_module_option_in_your_configuration_file_to_0_95099", "Set the 'module' option in your configuration file to '{0}'"),
      Convert_invalid_character_to_its_html_entity_code: diag(95100, ts2.DiagnosticCategory.Message, "Convert_invalid_character_to_its_html_entity_code_95100", "Convert invalid character to its html entity code"),
      Convert_all_invalid_characters_to_HTML_entity_code: diag(95101, ts2.DiagnosticCategory.Message, "Convert_all_invalid_characters_to_HTML_entity_code_95101", "Convert all invalid characters to HTML entity code"),
      Convert_function_expression_0_to_arrow_function: diag(95105, ts2.DiagnosticCategory.Message, "Convert_function_expression_0_to_arrow_function_95105", "Convert function expression '{0}' to arrow function"),
      Convert_function_declaration_0_to_arrow_function: diag(95106, ts2.DiagnosticCategory.Message, "Convert_function_declaration_0_to_arrow_function_95106", "Convert function declaration '{0}' to arrow function"),
      Fix_all_implicit_this_errors: diag(95107, ts2.DiagnosticCategory.Message, "Fix_all_implicit_this_errors_95107", "Fix all implicit-'this' errors"),
      Wrap_invalid_character_in_an_expression_container: diag(95108, ts2.DiagnosticCategory.Message, "Wrap_invalid_character_in_an_expression_container_95108", "Wrap invalid character in an expression container"),
      Wrap_all_invalid_characters_in_an_expression_container: diag(95109, ts2.DiagnosticCategory.Message, "Wrap_all_invalid_characters_in_an_expression_container_95109", "Wrap all invalid characters in an expression container"),
      Visit_https_Colon_Slash_Slashaka_ms_Slashtsconfig_json_to_read_more_about_this_file: diag(95110, ts2.DiagnosticCategory.Message, "Visit_https_Colon_Slash_Slashaka_ms_Slashtsconfig_json_to_read_more_about_this_file_95110", "Visit https://aka.ms/tsconfig.json to read more about this file"),
      Add_a_return_statement: diag(95111, ts2.DiagnosticCategory.Message, "Add_a_return_statement_95111", "Add a return statement"),
      Remove_braces_from_arrow_function_body: diag(95112, ts2.DiagnosticCategory.Message, "Remove_braces_from_arrow_function_body_95112", "Remove braces from arrow function body"),
      Wrap_the_following_body_with_parentheses_which_should_be_an_object_literal: diag(95113, ts2.DiagnosticCategory.Message, "Wrap_the_following_body_with_parentheses_which_should_be_an_object_literal_95113", "Wrap the following body with parentheses which should be an object literal"),
      Add_all_missing_return_statement: diag(95114, ts2.DiagnosticCategory.Message, "Add_all_missing_return_statement_95114", "Add all missing return statement"),
      Remove_braces_from_all_arrow_function_bodies_with_relevant_issues: diag(95115, ts2.DiagnosticCategory.Message, "Remove_braces_from_all_arrow_function_bodies_with_relevant_issues_95115", "Remove braces from all arrow function bodies with relevant issues"),
      Wrap_all_object_literal_with_parentheses: diag(95116, ts2.DiagnosticCategory.Message, "Wrap_all_object_literal_with_parentheses_95116", "Wrap all object literal with parentheses"),
      Move_labeled_tuple_element_modifiers_to_labels: diag(95117, ts2.DiagnosticCategory.Message, "Move_labeled_tuple_element_modifiers_to_labels_95117", "Move labeled tuple element modifiers to labels"),
      Convert_overload_list_to_single_signature: diag(95118, ts2.DiagnosticCategory.Message, "Convert_overload_list_to_single_signature_95118", "Convert overload list to single signature"),
      Generate_get_and_set_accessors_for_all_overriding_properties: diag(95119, ts2.DiagnosticCategory.Message, "Generate_get_and_set_accessors_for_all_overriding_properties_95119", "Generate 'get' and 'set' accessors for all overriding properties"),
      Wrap_in_JSX_fragment: diag(95120, ts2.DiagnosticCategory.Message, "Wrap_in_JSX_fragment_95120", "Wrap in JSX fragment"),
      Wrap_all_unparented_JSX_in_JSX_fragment: diag(95121, ts2.DiagnosticCategory.Message, "Wrap_all_unparented_JSX_in_JSX_fragment_95121", "Wrap all unparented JSX in JSX fragment"),
      Convert_arrow_function_or_function_expression: diag(95122, ts2.DiagnosticCategory.Message, "Convert_arrow_function_or_function_expression_95122", "Convert arrow function or function expression"),
      Convert_to_anonymous_function: diag(95123, ts2.DiagnosticCategory.Message, "Convert_to_anonymous_function_95123", "Convert to anonymous function"),
      Convert_to_named_function: diag(95124, ts2.DiagnosticCategory.Message, "Convert_to_named_function_95124", "Convert to named function"),
      Convert_to_arrow_function: diag(95125, ts2.DiagnosticCategory.Message, "Convert_to_arrow_function_95125", "Convert to arrow function"),
      Remove_parentheses: diag(95126, ts2.DiagnosticCategory.Message, "Remove_parentheses_95126", "Remove parentheses"),
      Could_not_find_a_containing_arrow_function: diag(95127, ts2.DiagnosticCategory.Message, "Could_not_find_a_containing_arrow_function_95127", "Could not find a containing arrow function"),
      Containing_function_is_not_an_arrow_function: diag(95128, ts2.DiagnosticCategory.Message, "Containing_function_is_not_an_arrow_function_95128", "Containing function is not an arrow function"),
      Could_not_find_export_statement: diag(95129, ts2.DiagnosticCategory.Message, "Could_not_find_export_statement_95129", "Could not find export statement"),
      This_file_already_has_a_default_export: diag(95130, ts2.DiagnosticCategory.Message, "This_file_already_has_a_default_export_95130", "This file already has a default export"),
      Could_not_find_import_clause: diag(95131, ts2.DiagnosticCategory.Message, "Could_not_find_import_clause_95131", "Could not find import clause"),
      Could_not_find_namespace_import_or_named_imports: diag(95132, ts2.DiagnosticCategory.Message, "Could_not_find_namespace_import_or_named_imports_95132", "Could not find namespace import or named imports"),
      Selection_is_not_a_valid_type_node: diag(95133, ts2.DiagnosticCategory.Message, "Selection_is_not_a_valid_type_node_95133", "Selection is not a valid type node"),
      No_type_could_be_extracted_from_this_type_node: diag(95134, ts2.DiagnosticCategory.Message, "No_type_could_be_extracted_from_this_type_node_95134", "No type could be extracted from this type node"),
      Could_not_find_property_for_which_to_generate_accessor: diag(95135, ts2.DiagnosticCategory.Message, "Could_not_find_property_for_which_to_generate_accessor_95135", "Could not find property for which to generate accessor"),
      Name_is_not_valid: diag(95136, ts2.DiagnosticCategory.Message, "Name_is_not_valid_95136", "Name is not valid"),
      Can_only_convert_property_with_modifier: diag(95137, ts2.DiagnosticCategory.Message, "Can_only_convert_property_with_modifier_95137", "Can only convert property with modifier"),
      Switch_each_misused_0_to_1: diag(95138, ts2.DiagnosticCategory.Message, "Switch_each_misused_0_to_1_95138", "Switch each misused '{0}' to '{1}'"),
      Convert_to_optional_chain_expression: diag(95139, ts2.DiagnosticCategory.Message, "Convert_to_optional_chain_expression_95139", "Convert to optional chain expression"),
      Could_not_find_convertible_access_expression: diag(95140, ts2.DiagnosticCategory.Message, "Could_not_find_convertible_access_expression_95140", "Could not find convertible access expression"),
      Could_not_find_matching_access_expressions: diag(95141, ts2.DiagnosticCategory.Message, "Could_not_find_matching_access_expressions_95141", "Could not find matching access expressions"),
      Can_only_convert_logical_AND_access_chains: diag(95142, ts2.DiagnosticCategory.Message, "Can_only_convert_logical_AND_access_chains_95142", "Can only convert logical AND access chains"),
      Add_void_to_Promise_resolved_without_a_value: diag(95143, ts2.DiagnosticCategory.Message, "Add_void_to_Promise_resolved_without_a_value_95143", "Add 'void' to Promise resolved without a value"),
      Add_void_to_all_Promises_resolved_without_a_value: diag(95144, ts2.DiagnosticCategory.Message, "Add_void_to_all_Promises_resolved_without_a_value_95144", "Add 'void' to all Promises resolved without a value"),
      Use_element_access_for_0: diag(95145, ts2.DiagnosticCategory.Message, "Use_element_access_for_0_95145", "Use element access for '{0}'"),
      Use_element_access_for_all_undeclared_properties: diag(95146, ts2.DiagnosticCategory.Message, "Use_element_access_for_all_undeclared_properties_95146", "Use element access for all undeclared properties."),
      Delete_all_unused_imports: diag(95147, ts2.DiagnosticCategory.Message, "Delete_all_unused_imports_95147", "Delete all unused imports"),
      Infer_function_return_type: diag(95148, ts2.DiagnosticCategory.Message, "Infer_function_return_type_95148", "Infer function return type"),
      Return_type_must_be_inferred_from_a_function: diag(95149, ts2.DiagnosticCategory.Message, "Return_type_must_be_inferred_from_a_function_95149", "Return type must be inferred from a function"),
      Could_not_determine_function_return_type: diag(95150, ts2.DiagnosticCategory.Message, "Could_not_determine_function_return_type_95150", "Could not determine function return type"),
      Could_not_convert_to_arrow_function: diag(95151, ts2.DiagnosticCategory.Message, "Could_not_convert_to_arrow_function_95151", "Could not convert to arrow function"),
      Could_not_convert_to_named_function: diag(95152, ts2.DiagnosticCategory.Message, "Could_not_convert_to_named_function_95152", "Could not convert to named function"),
      Could_not_convert_to_anonymous_function: diag(95153, ts2.DiagnosticCategory.Message, "Could_not_convert_to_anonymous_function_95153", "Could not convert to anonymous function"),
      Can_only_convert_string_concatenation: diag(95154, ts2.DiagnosticCategory.Message, "Can_only_convert_string_concatenation_95154", "Can only convert string concatenation"),
      Selection_is_not_a_valid_statement_or_statements: diag(95155, ts2.DiagnosticCategory.Message, "Selection_is_not_a_valid_statement_or_statements_95155", "Selection is not a valid statement or statements"),
      Add_missing_function_declaration_0: diag(95156, ts2.DiagnosticCategory.Message, "Add_missing_function_declaration_0_95156", "Add missing function declaration '{0}'"),
      Add_all_missing_function_declarations: diag(95157, ts2.DiagnosticCategory.Message, "Add_all_missing_function_declarations_95157", "Add all missing function declarations"),
      Method_not_implemented: diag(95158, ts2.DiagnosticCategory.Message, "Method_not_implemented_95158", "Method not implemented."),
      Function_not_implemented: diag(95159, ts2.DiagnosticCategory.Message, "Function_not_implemented_95159", "Function not implemented."),
      Add_override_modifier: diag(95160, ts2.DiagnosticCategory.Message, "Add_override_modifier_95160", "Add 'override' modifier"),
      Remove_override_modifier: diag(95161, ts2.DiagnosticCategory.Message, "Remove_override_modifier_95161", "Remove 'override' modifier"),
      Add_all_missing_override_modifiers: diag(95162, ts2.DiagnosticCategory.Message, "Add_all_missing_override_modifiers_95162", "Add all missing 'override' modifiers"),
      Remove_all_unnecessary_override_modifiers: diag(95163, ts2.DiagnosticCategory.Message, "Remove_all_unnecessary_override_modifiers_95163", "Remove all unnecessary 'override' modifiers"),
      Can_only_convert_named_export: diag(95164, ts2.DiagnosticCategory.Message, "Can_only_convert_named_export_95164", "Can only convert named export"),
      Add_missing_properties: diag(95165, ts2.DiagnosticCategory.Message, "Add_missing_properties_95165", "Add missing properties"),
      Add_all_missing_properties: diag(95166, ts2.DiagnosticCategory.Message, "Add_all_missing_properties_95166", "Add all missing properties"),
      Add_missing_attributes: diag(95167, ts2.DiagnosticCategory.Message, "Add_missing_attributes_95167", "Add missing attributes"),
      Add_all_missing_attributes: diag(95168, ts2.DiagnosticCategory.Message, "Add_all_missing_attributes_95168", "Add all missing attributes"),
      Add_undefined_to_optional_property_type: diag(95169, ts2.DiagnosticCategory.Message, "Add_undefined_to_optional_property_type_95169", "Add 'undefined' to optional property type"),
      No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer: diag(18004, ts2.DiagnosticCategory.Error, "No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer_18004", "No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer."),
      Classes_may_not_have_a_field_named_constructor: diag(18006, ts2.DiagnosticCategory.Error, "Classes_may_not_have_a_field_named_constructor_18006", "Classes may not have a field named 'constructor'."),
      JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array: diag(18007, ts2.DiagnosticCategory.Error, "JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array_18007", "JSX expressions may not use the comma operator. Did you mean to write an array?"),
      Private_identifiers_cannot_be_used_as_parameters: diag(18009, ts2.DiagnosticCategory.Error, "Private_identifiers_cannot_be_used_as_parameters_18009", "Private identifiers cannot be used as parameters."),
      An_accessibility_modifier_cannot_be_used_with_a_private_identifier: diag(18010, ts2.DiagnosticCategory.Error, "An_accessibility_modifier_cannot_be_used_with_a_private_identifier_18010", "An accessibility modifier cannot be used with a private identifier."),
      The_operand_of_a_delete_operator_cannot_be_a_private_identifier: diag(18011, ts2.DiagnosticCategory.Error, "The_operand_of_a_delete_operator_cannot_be_a_private_identifier_18011", "The operand of a 'delete' operator cannot be a private identifier."),
      constructor_is_a_reserved_word: diag(18012, ts2.DiagnosticCategory.Error, "constructor_is_a_reserved_word_18012", "'#constructor' is a reserved word."),
      Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier: diag(18013, ts2.DiagnosticCategory.Error, "Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier_18013", "Property '{0}' is not accessible outside class '{1}' because it has a private identifier."),
      The_property_0_cannot_be_accessed_on_type_1_within_this_class_because_it_is_shadowed_by_another_private_identifier_with_the_same_spelling: diag(18014, ts2.DiagnosticCategory.Error, "The_property_0_cannot_be_accessed_on_type_1_within_this_class_because_it_is_shadowed_by_another_priv_18014", "The property '{0}' cannot be accessed on type '{1}' within this class because it is shadowed by another private identifier with the same spelling."),
      Property_0_in_type_1_refers_to_a_different_member_that_cannot_be_accessed_from_within_type_2: diag(18015, ts2.DiagnosticCategory.Error, "Property_0_in_type_1_refers_to_a_different_member_that_cannot_be_accessed_from_within_type_2_18015", "Property '{0}' in type '{1}' refers to a different member that cannot be accessed from within type '{2}'."),
      Private_identifiers_are_not_allowed_outside_class_bodies: diag(18016, ts2.DiagnosticCategory.Error, "Private_identifiers_are_not_allowed_outside_class_bodies_18016", "Private identifiers are not allowed outside class bodies."),
      The_shadowing_declaration_of_0_is_defined_here: diag(18017, ts2.DiagnosticCategory.Error, "The_shadowing_declaration_of_0_is_defined_here_18017", "The shadowing declaration of '{0}' is defined here"),
      The_declaration_of_0_that_you_probably_intended_to_use_is_defined_here: diag(18018, ts2.DiagnosticCategory.Error, "The_declaration_of_0_that_you_probably_intended_to_use_is_defined_here_18018", "The declaration of '{0}' that you probably intended to use is defined here"),
      _0_modifier_cannot_be_used_with_a_private_identifier: diag(18019, ts2.DiagnosticCategory.Error, "_0_modifier_cannot_be_used_with_a_private_identifier_18019", "'{0}' modifier cannot be used with a private identifier."),
      An_enum_member_cannot_be_named_with_a_private_identifier: diag(18024, ts2.DiagnosticCategory.Error, "An_enum_member_cannot_be_named_with_a_private_identifier_18024", "An enum member cannot be named with a private identifier."),
      can_only_be_used_at_the_start_of_a_file: diag(18026, ts2.DiagnosticCategory.Error, "can_only_be_used_at_the_start_of_a_file_18026", "'#!' can only be used at the start of a file."),
      Compiler_reserves_name_0_when_emitting_private_identifier_downlevel: diag(18027, ts2.DiagnosticCategory.Error, "Compiler_reserves_name_0_when_emitting_private_identifier_downlevel_18027", "Compiler reserves name '{0}' when emitting private identifier downlevel."),
      Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher: diag(18028, ts2.DiagnosticCategory.Error, "Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher_18028", "Private identifiers are only available when targeting ECMAScript 2015 and higher."),
      Private_identifiers_are_not_allowed_in_variable_declarations: diag(18029, ts2.DiagnosticCategory.Error, "Private_identifiers_are_not_allowed_in_variable_declarations_18029", "Private identifiers are not allowed in variable declarations."),
      An_optional_chain_cannot_contain_private_identifiers: diag(18030, ts2.DiagnosticCategory.Error, "An_optional_chain_cannot_contain_private_identifiers_18030", "An optional chain cannot contain private identifiers."),
      The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituents: diag(18031, ts2.DiagnosticCategory.Error, "The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituent_18031", "The intersection '{0}' was reduced to 'never' because property '{1}' has conflicting types in some constituents."),
      The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_private_in_some: diag(18032, ts2.DiagnosticCategory.Error, "The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_pr_18032", "The intersection '{0}' was reduced to 'never' because property '{1}' exists in multiple constituents and is private in some."),
      Only_numeric_enums_can_have_computed_members_but_this_expression_has_type_0_If_you_do_not_need_exhaustiveness_checks_consider_using_an_object_literal_instead: diag(18033, ts2.DiagnosticCategory.Error, "Only_numeric_enums_can_have_computed_members_but_this_expression_has_type_0_If_you_do_not_need_exhau_18033", "Only numeric enums can have computed members, but this expression has type '{0}'. If you do not need exhaustiveness checks, consider using an object literal instead."),
      Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compiler_option_is_specified_e_g_Fragment: diag(18034, ts2.DiagnosticCategory.Message, "Specify_the_JSX_fragment_factory_function_to_use_when_targeting_react_JSX_emit_with_jsxFactory_compi_18034", "Specify the JSX fragment factory function to use when targeting 'react' JSX emit with 'jsxFactory' compiler option is specified, e.g. 'Fragment'."),
      Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name: diag(18035, ts2.DiagnosticCategory.Error, "Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name_18035", "Invalid value for 'jsxFragmentFactory'. '{0}' is not a valid identifier or qualified-name."),
      Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator: diag(18036, ts2.DiagnosticCategory.Error, "Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_dec_18036", "Class decorators can't be used with static private identifier. Consider removing the experimental decorator."),
      Await_expression_cannot_be_used_inside_a_class_static_block: diag(18037, ts2.DiagnosticCategory.Error, "Await_expression_cannot_be_used_inside_a_class_static_block_18037", "Await expression cannot be used inside a class static block."),
      For_await_loops_cannot_be_used_inside_a_class_static_block: diag(18038, ts2.DiagnosticCategory.Error, "For_await_loops_cannot_be_used_inside_a_class_static_block_18038", "'For await' loops cannot be used inside a class static block."),
      Invalid_use_of_0_It_cannot_be_used_inside_a_class_static_block: diag(18039, ts2.DiagnosticCategory.Error, "Invalid_use_of_0_It_cannot_be_used_inside_a_class_static_block_18039", "Invalid use of '{0}'. It cannot be used inside a class static block."),
      A_return_statement_cannot_be_used_inside_a_class_static_block: diag(18041, ts2.DiagnosticCategory.Error, "A_return_statement_cannot_be_used_inside_a_class_static_block_18041", "A 'return' statement cannot be used inside a class static block.")
    };
  })(ts || (ts = {}));
  (function(ts2) {
    var _a;
    function tokenIsIdentifierOrKeyword(token) {
      return token >= 79;
    }
    ts2.tokenIsIdentifierOrKeyword = tokenIsIdentifierOrKeyword;
    function tokenIsIdentifierOrKeywordOrGreaterThan(token) {
      return token === 31 || tokenIsIdentifierOrKeyword(token);
    }
    ts2.tokenIsIdentifierOrKeywordOrGreaterThan = tokenIsIdentifierOrKeywordOrGreaterThan;
    ts2.textToKeywordObj = (_a = {
      abstract: 126,
      any: 130,
      as: 127,
      asserts: 128,
      assert: 129,
      bigint: 157,
      boolean: 133,
      break: 81,
      case: 82,
      catch: 83,
      class: 84,
      continue: 86,
      const: 85
    }, _a["constructor"] = 134, _a.debugger = 87, _a.declare = 135, _a.default = 88, _a.delete = 89, _a.do = 90, _a.else = 91, _a.enum = 92, _a.export = 93, _a.extends = 94, _a.false = 95, _a.finally = 96, _a.for = 97, _a.from = 155, _a.function = 98, _a.get = 136, _a.if = 99, _a.implements = 117, _a.import = 100, _a.in = 101, _a.infer = 137, _a.instanceof = 102, _a.interface = 118, _a.intrinsic = 138, _a.is = 139, _a.keyof = 140, _a.let = 119, _a.module = 141, _a.namespace = 142, _a.never = 143, _a.new = 103, _a.null = 104, _a.number = 146, _a.object = 147, _a.package = 120, _a.private = 121, _a.protected = 122, _a.public = 123, _a.override = 158, _a.readonly = 144, _a.require = 145, _a.global = 156, _a.return = 105, _a.set = 148, _a.static = 124, _a.string = 149, _a.super = 106, _a.switch = 107, _a.symbol = 150, _a.this = 108, _a.throw = 109, _a.true = 110, _a.try = 111, _a.type = 151, _a.typeof = 112, _a.undefined = 152, _a.unique = 153, _a.unknown = 154, _a.var = 113, _a.void = 114, _a.while = 115, _a.with = 116, _a.yield = 125, _a.async = 131, _a.await = 132, _a.of = 159, _a);
    var textToKeyword = new ts2.Map(ts2.getEntries(ts2.textToKeywordObj));
    var textToToken = new ts2.Map(ts2.getEntries(__assign(__assign({}, ts2.textToKeywordObj), { "{": 18, "}": 19, "(": 20, ")": 21, "[": 22, "]": 23, ".": 24, "...": 25, ";": 26, ",": 27, "<": 29, ">": 31, "<=": 32, ">=": 33, "==": 34, "!=": 35, "===": 36, "!==": 37, "=>": 38, "+": 39, "-": 40, "**": 42, "*": 41, "/": 43, "%": 44, "++": 45, "--": 46, "<<": 47, "</": 30, ">>": 48, ">>>": 49, "&": 50, "|": 51, "^": 52, "!": 53, "~": 54, "&&": 55, "||": 56, "?": 57, "??": 60, "?.": 28, ":": 58, "=": 63, "+=": 64, "-=": 65, "*=": 66, "**=": 67, "/=": 68, "%=": 69, "<<=": 70, ">>=": 71, ">>>=": 72, "&=": 73, "|=": 74, "^=": 78, "||=": 75, "&&=": 76, "??=": 77, "@": 59, "#": 62, "`": 61 })));
    var unicodeES3IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1610, 1649, 1747, 1749, 1749, 1765, 1766, 1786, 1788, 1808, 1808, 1810, 1836, 1920, 1957, 2309, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2784, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3294, 3294, 3296, 3297, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3424, 3425, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3946, 3976, 3979, 4096, 4129, 4131, 4135, 4137, 4138, 4176, 4181, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6067, 6176, 6263, 6272, 6312, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8319, 8319, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12353, 12436, 12445, 12446, 12449, 12538, 12540, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65138, 65140, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500];
    var unicodeES3IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 768, 846, 864, 866, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1155, 1158, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1441, 1443, 1465, 1467, 1469, 1471, 1471, 1473, 1474, 1476, 1476, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1621, 1632, 1641, 1648, 1747, 1749, 1756, 1759, 1768, 1770, 1773, 1776, 1788, 1808, 1836, 1840, 1866, 1920, 1968, 2305, 2307, 2309, 2361, 2364, 2381, 2384, 2388, 2392, 2403, 2406, 2415, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2562, 2562, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2649, 2652, 2654, 2654, 2662, 2676, 2689, 2691, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2784, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2876, 2883, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2913, 2918, 2927, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3047, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3168, 3169, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3297, 3302, 3311, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3390, 3395, 3398, 3400, 3402, 3405, 3415, 3415, 3424, 3425, 3430, 3439, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3805, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3946, 3953, 3972, 3974, 3979, 3984, 3991, 3993, 4028, 4038, 4038, 4096, 4129, 4131, 4135, 4137, 4138, 4140, 4146, 4150, 4153, 4160, 4169, 4176, 4185, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 4969, 4977, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6099, 6112, 6121, 6160, 6169, 6176, 6263, 6272, 6313, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8319, 8319, 8400, 8412, 8417, 8417, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12346, 12353, 12436, 12441, 12442, 12445, 12446, 12449, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65056, 65059, 65075, 65076, 65101, 65103, 65136, 65138, 65140, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500];
    var unicodeES5IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6e3, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43e3, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500];
    var unicodeES5IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112, 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423, 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6e3, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272, 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43e3, 43047, 43072, 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500];
    var unicodeESNextIdentifierStart = [65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1488, 1514, 1519, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2144, 2154, 2208, 2228, 2230, 2237, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2432, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2556, 2556, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2809, 2809, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3133, 3160, 3162, 3168, 3169, 3200, 3200, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3412, 3414, 3423, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6e3, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6264, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6430, 6480, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7401, 7404, 7406, 7411, 7413, 7414, 7418, 7418, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12443, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42653, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43261, 43262, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43488, 43492, 43494, 43503, 43514, 43518, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43646, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66335, 66349, 66378, 66384, 66421, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68149, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68324, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68899, 69376, 69404, 69415, 69415, 69424, 69445, 69600, 69622, 69635, 69687, 69763, 69807, 69840, 69864, 69891, 69926, 69956, 69956, 69968, 70002, 70006, 70006, 70019, 70066, 70081, 70084, 70106, 70106, 70108, 70108, 70144, 70161, 70163, 70187, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70366, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70461, 70461, 70480, 70480, 70493, 70497, 70656, 70708, 70727, 70730, 70751, 70751, 70784, 70831, 70852, 70853, 70855, 70855, 71040, 71086, 71128, 71131, 71168, 71215, 71236, 71236, 71296, 71338, 71352, 71352, 71424, 71450, 71680, 71723, 71840, 71903, 71935, 71935, 72096, 72103, 72106, 72144, 72161, 72161, 72163, 72163, 72192, 72192, 72203, 72242, 72250, 72250, 72272, 72272, 72284, 72329, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72750, 72768, 72768, 72818, 72847, 72960, 72966, 72968, 72969, 72971, 73008, 73030, 73030, 73056, 73061, 73063, 73064, 73066, 73097, 73112, 73112, 73440, 73458, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92880, 92909, 92928, 92975, 92992, 92995, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94032, 94032, 94099, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 123136, 123180, 123191, 123197, 123214, 123214, 123584, 123627, 124928, 125124, 125184, 125251, 125259, 125259, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101];
    var unicodeESNextIdentifierPart = [48, 57, 65, 90, 95, 95, 97, 122, 170, 170, 181, 181, 183, 183, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2208, 2228, 2230, 2237, 2259, 2273, 2275, 2403, 2406, 2415, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2556, 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2809, 2815, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3168, 3171, 3174, 3183, 3200, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3328, 3331, 3333, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402, 3406, 3412, 3415, 3423, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3558, 3567, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4969, 4977, 4992, 5007, 5024, 5109, 5112, 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5880, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6e3, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6618, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6832, 6845, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7296, 7304, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7673, 7675, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8472, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12447, 12449, 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40943, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42737, 42775, 42783, 42786, 42888, 42891, 42943, 42946, 42950, 42999, 43047, 43072, 43123, 43136, 43205, 43216, 43225, 43232, 43255, 43259, 43259, 43261, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43488, 43518, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43879, 43888, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, 65856, 65908, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66378, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66513, 66517, 66560, 66717, 66720, 66729, 66736, 66771, 66776, 66811, 66816, 66855, 66864, 66915, 67072, 67382, 67392, 67413, 67424, 67431, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840, 67861, 67872, 67897, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108, 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288, 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736, 68786, 68800, 68850, 68864, 68903, 68912, 68921, 69376, 69404, 69415, 69415, 69424, 69456, 69600, 69622, 69632, 69702, 69734, 69743, 69759, 69818, 69840, 69864, 69872, 69881, 69888, 69940, 69942, 69951, 69956, 69958, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70096, 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70206, 70272, 70278, 70280, 70280, 70282, 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70384, 70393, 70400, 70403, 70405, 70412, 70415, 70416, 70419, 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480, 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70656, 70730, 70736, 70745, 70750, 70751, 70784, 70853, 70855, 70855, 70864, 70873, 71040, 71093, 71096, 71104, 71128, 71133, 71168, 71232, 71236, 71236, 71248, 71257, 71296, 71352, 71360, 71369, 71424, 71450, 71453, 71467, 71472, 71481, 71680, 71738, 71840, 71913, 71935, 71935, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263, 72263, 72272, 72345, 72349, 72349, 72384, 72440, 72704, 72712, 72714, 72758, 72760, 72768, 72784, 72793, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971, 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73040, 73049, 73056, 73061, 73063, 73064, 73066, 73102, 73104, 73105, 73107, 73112, 73120, 73129, 73440, 73462, 73728, 74649, 74752, 74862, 74880, 75075, 77824, 78894, 82944, 83526, 92160, 92728, 92736, 92766, 92768, 92777, 92880, 92909, 92912, 92916, 92928, 92982, 92992, 92995, 93008, 93017, 93027, 93047, 93053, 93071, 93760, 93823, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94179, 94208, 100343, 100352, 101106, 110592, 110878, 110928, 110930, 110948, 110951, 110960, 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210, 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, 120782, 120831, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499, 121503, 121505, 121519, 122880, 122886, 122888, 122904, 122907, 122913, 122915, 122916, 122918, 122922, 123136, 123180, 123184, 123197, 123200, 123209, 123214, 123214, 123584, 123641, 124928, 125124, 125136, 125142, 125184, 125259, 125264, 125273, 126464, 126467, 126469, 126495, 126497, 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523, 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545, 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559, 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585, 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635, 126651, 131072, 173782, 173824, 177972, 177984, 178205, 178208, 183969, 183984, 191456, 194560, 195101, 917760, 917999];
    var commentDirectiveRegExSingleLine = /^\/\/\/?\s*@(ts-expect-error|ts-ignore)/;
    var commentDirectiveRegExMultiLine = /^(?:\/|\*)*\s*@(ts-expect-error|ts-ignore)/;
    function lookupInUnicodeMap(code, map) {
      if (code < map[0]) {
        return false;
      }
      var lo = 0;
      var hi = map.length;
      var mid;
      while (lo + 1 < hi) {
        mid = lo + (hi - lo) / 2;
        mid -= mid % 2;
        if (map[mid] <= code && code <= map[mid + 1]) {
          return true;
        }
        if (code < map[mid]) {
          hi = mid;
        } else {
          lo = mid + 2;
        }
      }
      return false;
    }
    function isUnicodeIdentifierStart(code, languageVersion) {
      return languageVersion >= 2 ? lookupInUnicodeMap(code, unicodeESNextIdentifierStart) : languageVersion === 1 ? lookupInUnicodeMap(code, unicodeES5IdentifierStart) : lookupInUnicodeMap(code, unicodeES3IdentifierStart);
    }
    ts2.isUnicodeIdentifierStart = isUnicodeIdentifierStart;
    function isUnicodeIdentifierPart(code, languageVersion) {
      return languageVersion >= 2 ? lookupInUnicodeMap(code, unicodeESNextIdentifierPart) : languageVersion === 1 ? lookupInUnicodeMap(code, unicodeES5IdentifierPart) : lookupInUnicodeMap(code, unicodeES3IdentifierPart);
    }
    function makeReverseMap(source) {
      var result = [];
      source.forEach(function(value, name) {
        result[value] = name;
      });
      return result;
    }
    var tokenStrings = makeReverseMap(textToToken);
    function tokenToString(t) {
      return tokenStrings[t];
    }
    ts2.tokenToString = tokenToString;
    function stringToToken(s) {
      return textToToken.get(s);
    }
    ts2.stringToToken = stringToToken;
    function computeLineStarts(text) {
      var result = new Array();
      var pos = 0;
      var lineStart = 0;
      while (pos < text.length) {
        var ch = text.charCodeAt(pos);
        pos++;
        switch (ch) {
          case 13:
            if (text.charCodeAt(pos) === 10) {
              pos++;
            }
          case 10:
            result.push(lineStart);
            lineStart = pos;
            break;
          default:
            if (ch > 127 && isLineBreak(ch)) {
              result.push(lineStart);
              lineStart = pos;
            }
            break;
        }
      }
      result.push(lineStart);
      return result;
    }
    ts2.computeLineStarts = computeLineStarts;
    function getPositionOfLineAndCharacter(sourceFile, line, character, allowEdits) {
      return sourceFile.getPositionOfLineAndCharacter ? sourceFile.getPositionOfLineAndCharacter(line, character, allowEdits) : computePositionOfLineAndCharacter(getLineStarts(sourceFile), line, character, sourceFile.text, allowEdits);
    }
    ts2.getPositionOfLineAndCharacter = getPositionOfLineAndCharacter;
    function computePositionOfLineAndCharacter(lineStarts, line, character, debugText, allowEdits) {
      if (line < 0 || line >= lineStarts.length) {
        if (allowEdits) {
          line = line < 0 ? 0 : line >= lineStarts.length ? lineStarts.length - 1 : line;
        } else {
          ts2.Debug.fail("Bad line number. Line: ".concat(line, ", lineStarts.length: ").concat(lineStarts.length, " , line map is correct? ").concat(debugText !== void 0 ? ts2.arraysEqual(lineStarts, computeLineStarts(debugText)) : "unknown"));
        }
      }
      var res = lineStarts[line] + character;
      if (allowEdits) {
        return res > lineStarts[line + 1] ? lineStarts[line + 1] : typeof debugText === "string" && res > debugText.length ? debugText.length : res;
      }
      if (line < lineStarts.length - 1) {
        ts2.Debug.assert(res < lineStarts[line + 1]);
      } else if (debugText !== void 0) {
        ts2.Debug.assert(res <= debugText.length);
      }
      return res;
    }
    ts2.computePositionOfLineAndCharacter = computePositionOfLineAndCharacter;
    function getLineStarts(sourceFile) {
      return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text));
    }
    ts2.getLineStarts = getLineStarts;
    function computeLineAndCharacterOfPosition(lineStarts, position) {
      var lineNumber = computeLineOfPosition(lineStarts, position);
      return {
        line: lineNumber,
        character: position - lineStarts[lineNumber]
      };
    }
    ts2.computeLineAndCharacterOfPosition = computeLineAndCharacterOfPosition;
    function computeLineOfPosition(lineStarts, position, lowerBound) {
      var lineNumber = ts2.binarySearch(lineStarts, position, ts2.identity, ts2.compareValues, lowerBound);
      if (lineNumber < 0) {
        lineNumber = ~lineNumber - 1;
        ts2.Debug.assert(lineNumber !== -1, "position cannot precede the beginning of the file");
      }
      return lineNumber;
    }
    ts2.computeLineOfPosition = computeLineOfPosition;
    function getLinesBetweenPositions(sourceFile, pos1, pos2) {
      if (pos1 === pos2)
        return 0;
      var lineStarts = getLineStarts(sourceFile);
      var lower = Math.min(pos1, pos2);
      var isNegative = lower === pos2;
      var upper = isNegative ? pos1 : pos2;
      var lowerLine = computeLineOfPosition(lineStarts, lower);
      var upperLine = computeLineOfPosition(lineStarts, upper, lowerLine);
      return isNegative ? lowerLine - upperLine : upperLine - lowerLine;
    }
    ts2.getLinesBetweenPositions = getLinesBetweenPositions;
    function getLineAndCharacterOfPosition(sourceFile, position) {
      return computeLineAndCharacterOfPosition(getLineStarts(sourceFile), position);
    }
    ts2.getLineAndCharacterOfPosition = getLineAndCharacterOfPosition;
    function isWhiteSpaceLike(ch) {
      return isWhiteSpaceSingleLine(ch) || isLineBreak(ch);
    }
    ts2.isWhiteSpaceLike = isWhiteSpaceLike;
    function isWhiteSpaceSingleLine(ch) {
      return ch === 32 || ch === 9 || ch === 11 || ch === 12 || ch === 160 || ch === 133 || ch === 5760 || ch >= 8192 && ch <= 8203 || ch === 8239 || ch === 8287 || ch === 12288 || ch === 65279;
    }
    ts2.isWhiteSpaceSingleLine = isWhiteSpaceSingleLine;
    function isLineBreak(ch) {
      return ch === 10 || ch === 13 || ch === 8232 || ch === 8233;
    }
    ts2.isLineBreak = isLineBreak;
    function isDigit(ch) {
      return ch >= 48 && ch <= 57;
    }
    function isHexDigit(ch) {
      return isDigit(ch) || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102;
    }
    function isCodePoint(code) {
      return code <= 1114111;
    }
    function isOctalDigit(ch) {
      return ch >= 48 && ch <= 55;
    }
    ts2.isOctalDigit = isOctalDigit;
    function couldStartTrivia(text, pos) {
      var ch = text.charCodeAt(pos);
      switch (ch) {
        case 13:
        case 10:
        case 9:
        case 11:
        case 12:
        case 32:
        case 47:
        case 60:
        case 124:
        case 61:
        case 62:
          return true;
        case 35:
          return pos === 0;
        default:
          return ch > 127;
      }
    }
    ts2.couldStartTrivia = couldStartTrivia;
    function skipTrivia(text, pos, stopAfterLineBreak, stopAtComments, inJSDoc) {
      if (ts2.positionIsSynthesized(pos)) {
        return pos;
      }
      var canConsumeStar = false;
      while (true) {
        var ch = text.charCodeAt(pos);
        switch (ch) {
          case 13:
            if (text.charCodeAt(pos + 1) === 10) {
              pos++;
            }
          case 10:
            pos++;
            if (stopAfterLineBreak) {
              return pos;
            }
            canConsumeStar = !!inJSDoc;
            continue;
          case 9:
          case 11:
          case 12:
          case 32:
            pos++;
            continue;
          case 47:
            if (stopAtComments) {
              break;
            }
            if (text.charCodeAt(pos + 1) === 47) {
              pos += 2;
              while (pos < text.length) {
                if (isLineBreak(text.charCodeAt(pos))) {
                  break;
                }
                pos++;
              }
              canConsumeStar = false;
              continue;
            }
            if (text.charCodeAt(pos + 1) === 42) {
              pos += 2;
              while (pos < text.length) {
                if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
                  pos += 2;
                  break;
                }
                pos++;
              }
              canConsumeStar = false;
              continue;
            }
            break;
          case 60:
          case 124:
          case 61:
          case 62:
            if (isConflictMarkerTrivia(text, pos)) {
              pos = scanConflictMarkerTrivia(text, pos);
              canConsumeStar = false;
              continue;
            }
            break;
          case 35:
            if (pos === 0 && isShebangTrivia(text, pos)) {
              pos = scanShebangTrivia(text, pos);
              canConsumeStar = false;
              continue;
            }
            break;
          case 42:
            if (canConsumeStar) {
              pos++;
              canConsumeStar = false;
              continue;
            }
            break;
          default:
            if (ch > 127 && isWhiteSpaceLike(ch)) {
              pos++;
              continue;
            }
            break;
        }
        return pos;
      }
    }
    ts2.skipTrivia = skipTrivia;
    var mergeConflictMarkerLength = "<<<<<<<".length;
    function isConflictMarkerTrivia(text, pos) {
      ts2.Debug.assert(pos >= 0);
      if (pos === 0 || isLineBreak(text.charCodeAt(pos - 1))) {
        var ch = text.charCodeAt(pos);
        if (pos + mergeConflictMarkerLength < text.length) {
          for (var i = 0; i < mergeConflictMarkerLength; i++) {
            if (text.charCodeAt(pos + i) !== ch) {
              return false;
            }
          }
          return ch === 61 || text.charCodeAt(pos + mergeConflictMarkerLength) === 32;
        }
      }
      return false;
    }
    function scanConflictMarkerTrivia(text, pos, error) {
      if (error) {
        error(ts2.Diagnostics.Merge_conflict_marker_encountered, pos, mergeConflictMarkerLength);
      }
      var ch = text.charCodeAt(pos);
      var len = text.length;
      if (ch === 60 || ch === 62) {
        while (pos < len && !isLineBreak(text.charCodeAt(pos))) {
          pos++;
        }
      } else {
        ts2.Debug.assert(ch === 124 || ch === 61);
        while (pos < len) {
          var currentChar = text.charCodeAt(pos);
          if ((currentChar === 61 || currentChar === 62) && currentChar !== ch && isConflictMarkerTrivia(text, pos)) {
            break;
          }
          pos++;
        }
      }
      return pos;
    }
    var shebangTriviaRegex = /^#!.*/;
    function isShebangTrivia(text, pos) {
      ts2.Debug.assert(pos === 0);
      return shebangTriviaRegex.test(text);
    }
    ts2.isShebangTrivia = isShebangTrivia;
    function scanShebangTrivia(text, pos) {
      var shebang = shebangTriviaRegex.exec(text)[0];
      pos = pos + shebang.length;
      return pos;
    }
    ts2.scanShebangTrivia = scanShebangTrivia;
    function iterateCommentRanges(reduce, text, pos, trailing, cb, state, initial) {
      var pendingPos;
      var pendingEnd;
      var pendingKind;
      var pendingHasTrailingNewLine;
      var hasPendingCommentRange = false;
      var collecting = trailing;
      var accumulator = initial;
      if (pos === 0) {
        collecting = true;
        var shebang = getShebang(text);
        if (shebang) {
          pos = shebang.length;
        }
      }
      scan:
        while (pos >= 0 && pos < text.length) {
          var ch = text.charCodeAt(pos);
          switch (ch) {
            case 13:
              if (text.charCodeAt(pos + 1) === 10) {
                pos++;
              }
            case 10:
              pos++;
              if (trailing) {
                break scan;
              }
              collecting = true;
              if (hasPendingCommentRange) {
                pendingHasTrailingNewLine = true;
              }
              continue;
            case 9:
            case 11:
            case 12:
            case 32:
              pos++;
              continue;
            case 47:
              var nextChar = text.charCodeAt(pos + 1);
              var hasTrailingNewLine = false;
              if (nextChar === 47 || nextChar === 42) {
                var kind = nextChar === 47 ? 2 : 3;
                var startPos = pos;
                pos += 2;
                if (nextChar === 47) {
                  while (pos < text.length) {
                    if (isLineBreak(text.charCodeAt(pos))) {
                      hasTrailingNewLine = true;
                      break;
                    }
                    pos++;
                  }
                } else {
                  while (pos < text.length) {
                    if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
                      pos += 2;
                      break;
                    }
                    pos++;
                  }
                }
                if (collecting) {
                  if (hasPendingCommentRange) {
                    accumulator = cb(pendingPos, pendingEnd, pendingKind, pendingHasTrailingNewLine, state, accumulator);
                    if (!reduce && accumulator) {
                      return accumulator;
                    }
                  }
                  pendingPos = startPos;
                  pendingEnd = pos;
                  pendingKind = kind;
                  pendingHasTrailingNewLine = hasTrailingNewLine;
                  hasPendingCommentRange = true;
                }
                continue;
              }
              break scan;
            default:
              if (ch > 127 && isWhiteSpaceLike(ch)) {
                if (hasPendingCommentRange && isLineBreak(ch)) {
                  pendingHasTrailingNewLine = true;
                }
                pos++;
                continue;
              }
              break scan;
          }
        }
      if (hasPendingCommentRange) {
        accumulator = cb(pendingPos, pendingEnd, pendingKind, pendingHasTrailingNewLine, state, accumulator);
      }
      return accumulator;
    }
    function forEachLeadingCommentRange(text, pos, cb, state) {
      return iterateCommentRanges(false, text, pos, false, cb, state);
    }
    ts2.forEachLeadingCommentRange = forEachLeadingCommentRange;
    function forEachTrailingCommentRange(text, pos, cb, state) {
      return iterateCommentRanges(false, text, pos, true, cb, state);
    }
    ts2.forEachTrailingCommentRange = forEachTrailingCommentRange;
    function reduceEachLeadingCommentRange(text, pos, cb, state, initial) {
      return iterateCommentRanges(true, text, pos, false, cb, state, initial);
    }
    ts2.reduceEachLeadingCommentRange = reduceEachLeadingCommentRange;
    function reduceEachTrailingCommentRange(text, pos, cb, state, initial) {
      return iterateCommentRanges(true, text, pos, true, cb, state, initial);
    }
    ts2.reduceEachTrailingCommentRange = reduceEachTrailingCommentRange;
    function appendCommentRange(pos, end, kind, hasTrailingNewLine, _state, comments) {
      if (!comments) {
        comments = [];
      }
      comments.push({ kind, pos, end, hasTrailingNewLine });
      return comments;
    }
    function getLeadingCommentRanges(text, pos) {
      return reduceEachLeadingCommentRange(text, pos, appendCommentRange, void 0, void 0);
    }
    ts2.getLeadingCommentRanges = getLeadingCommentRanges;
    function getTrailingCommentRanges(text, pos) {
      return reduceEachTrailingCommentRange(text, pos, appendCommentRange, void 0, void 0);
    }
    ts2.getTrailingCommentRanges = getTrailingCommentRanges;
    function getShebang(text) {
      var match = shebangTriviaRegex.exec(text);
      if (match) {
        return match[0];
      }
    }
    ts2.getShebang = getShebang;
    function isIdentifierStart(ch, languageVersion) {
      return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 || ch === 36 || ch === 95 || ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
    }
    ts2.isIdentifierStart = isIdentifierStart;
    function isIdentifierPart(ch, languageVersion, identifierVariant) {
      return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 || ch >= 48 && ch <= 57 || ch === 36 || ch === 95 || (identifierVariant === 1 ? ch === 45 || ch === 58 : false) || ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
    }
    ts2.isIdentifierPart = isIdentifierPart;
    function isIdentifierText(name, languageVersion, identifierVariant) {
      var ch = codePointAt(name, 0);
      if (!isIdentifierStart(ch, languageVersion)) {
        return false;
      }
      for (var i = charSize(ch); i < name.length; i += charSize(ch)) {
        if (!isIdentifierPart(ch = codePointAt(name, i), languageVersion, identifierVariant)) {
          return false;
        }
      }
      return true;
    }
    ts2.isIdentifierText = isIdentifierText;
    function createScanner(languageVersion, skipTrivia2, languageVariant, textInitial, onError, start, length) {
      if (languageVariant === void 0) {
        languageVariant = 0;
      }
      var text = textInitial;
      var pos;
      var end;
      var startPos;
      var tokenPos;
      var token;
      var tokenValue;
      var tokenFlags;
      var commentDirectives;
      var inJSDocType = 0;
      setText(text, start, length);
      var scanner = {
        getStartPos: function() {
          return startPos;
        },
        getTextPos: function() {
          return pos;
        },
        getToken: function() {
          return token;
        },
        getTokenPos: function() {
          return tokenPos;
        },
        getTokenText: function() {
          return text.substring(tokenPos, pos);
        },
        getTokenValue: function() {
          return tokenValue;
        },
        hasUnicodeEscape: function() {
          return (tokenFlags & 1024) !== 0;
        },
        hasExtendedUnicodeEscape: function() {
          return (tokenFlags & 8) !== 0;
        },
        hasPrecedingLineBreak: function() {
          return (tokenFlags & 1) !== 0;
        },
        hasPrecedingJSDocComment: function() {
          return (tokenFlags & 2) !== 0;
        },
        isIdentifier: function() {
          return token === 79 || token > 116;
        },
        isReservedWord: function() {
          return token >= 81 && token <= 116;
        },
        isUnterminated: function() {
          return (tokenFlags & 4) !== 0;
        },
        getCommentDirectives: function() {
          return commentDirectives;
        },
        getNumericLiteralFlags: function() {
          return tokenFlags & 1008;
        },
        getTokenFlags: function() {
          return tokenFlags;
        },
        reScanGreaterToken,
        reScanAsteriskEqualsToken,
        reScanSlashToken,
        reScanTemplateToken,
        reScanTemplateHeadOrNoSubstitutionTemplate,
        scanJsxIdentifier,
        scanJsxAttributeValue,
        reScanJsxAttributeValue,
        reScanJsxToken,
        reScanLessThanToken,
        reScanHashToken,
        reScanQuestionToken,
        reScanInvalidIdentifier,
        scanJsxToken,
        scanJsDocToken,
        scan,
        getText,
        clearCommentDirectives,
        setText,
        setScriptTarget,
        setLanguageVariant,
        setOnError,
        setTextPos,
        setInJSDocType,
        tryScan,
        lookAhead,
        scanRange
      };
      if (ts2.Debug.isDebugging) {
        Object.defineProperty(scanner, "__debugShowCurrentPositionInText", {
          get: function() {
            var text2 = scanner.getText();
            return text2.slice(0, scanner.getStartPos()) + "\u2551" + text2.slice(scanner.getStartPos());
          }
        });
      }
      return scanner;
      function error(message, errPos, length2) {
        if (errPos === void 0) {
          errPos = pos;
        }
        if (onError) {
          var oldPos = pos;
          pos = errPos;
          onError(message, length2 || 0);
          pos = oldPos;
        }
      }
      function scanNumberFragment() {
        var start2 = pos;
        var allowSeparator = false;
        var isPreviousTokenSeparator = false;
        var result = "";
        while (true) {
          var ch = text.charCodeAt(pos);
          if (ch === 95) {
            tokenFlags |= 512;
            if (allowSeparator) {
              allowSeparator = false;
              isPreviousTokenSeparator = true;
              result += text.substring(start2, pos);
            } else if (isPreviousTokenSeparator) {
              error(ts2.Diagnostics.Multiple_consecutive_numeric_separators_are_not_permitted, pos, 1);
            } else {
              error(ts2.Diagnostics.Numeric_separators_are_not_allowed_here, pos, 1);
            }
            pos++;
            start2 = pos;
            continue;
          }
          if (isDigit(ch)) {
            allowSeparator = true;
            isPreviousTokenSeparator = false;
            pos++;
            continue;
          }
          break;
        }
        if (text.charCodeAt(pos - 1) === 95) {
          error(ts2.Diagnostics.Numeric_separators_are_not_allowed_here, pos - 1, 1);
        }
        return result + text.substring(start2, pos);
      }
      function scanNumber() {
        var start2 = pos;
        var mainFragment = scanNumberFragment();
        var decimalFragment;
        var scientificFragment;
        if (text.charCodeAt(pos) === 46) {
          pos++;
          decimalFragment = scanNumberFragment();
        }
        var end2 = pos;
        if (text.charCodeAt(pos) === 69 || text.charCodeAt(pos) === 101) {
          pos++;
          tokenFlags |= 16;
          if (text.charCodeAt(pos) === 43 || text.charCodeAt(pos) === 45)
            pos++;
          var preNumericPart = pos;
          var finalFragment = scanNumberFragment();
          if (!finalFragment) {
            error(ts2.Diagnostics.Digit_expected);
          } else {
            scientificFragment = text.substring(end2, preNumericPart) + finalFragment;
            end2 = pos;
          }
        }
        var result;
        if (tokenFlags & 512) {
          result = mainFragment;
          if (decimalFragment) {
            result += "." + decimalFragment;
          }
          if (scientificFragment) {
            result += scientificFragment;
          }
        } else {
          result = text.substring(start2, end2);
        }
        if (decimalFragment !== void 0 || tokenFlags & 16) {
          checkForIdentifierStartAfterNumericLiteral(start2, decimalFragment === void 0 && !!(tokenFlags & 16));
          return {
            type: 8,
            value: "" + +result
          };
        } else {
          tokenValue = result;
          var type = checkBigIntSuffix();
          checkForIdentifierStartAfterNumericLiteral(start2);
          return { type, value: tokenValue };
        }
      }
      function checkForIdentifierStartAfterNumericLiteral(numericStart, isScientific) {
        if (!isIdentifierStart(codePointAt(text, pos), languageVersion)) {
          return;
        }
        var identifierStart = pos;
        var length2 = scanIdentifierParts().length;
        if (length2 === 1 && text[identifierStart] === "n") {
          if (isScientific) {
            error(ts2.Diagnostics.A_bigint_literal_cannot_use_exponential_notation, numericStart, identifierStart - numericStart + 1);
          } else {
            error(ts2.Diagnostics.A_bigint_literal_must_be_an_integer, numericStart, identifierStart - numericStart + 1);
          }
        } else {
          error(ts2.Diagnostics.An_identifier_or_keyword_cannot_immediately_follow_a_numeric_literal, identifierStart, length2);
          pos = identifierStart;
        }
      }
      function scanOctalDigits() {
        var start2 = pos;
        while (isOctalDigit(text.charCodeAt(pos))) {
          pos++;
        }
        return +text.substring(start2, pos);
      }
      function scanExactNumberOfHexDigits(count, canHaveSeparators) {
        var valueString = scanHexDigits(count, false, canHaveSeparators);
        return valueString ? parseInt(valueString, 16) : -1;
      }
      function scanMinimumNumberOfHexDigits(count, canHaveSeparators) {
        return scanHexDigits(count, true, canHaveSeparators);
      }
      function scanHexDigits(minCount, scanAsManyAsPossible, canHaveSeparators) {
        var valueChars = [];
        var allowSeparator = false;
        var isPreviousTokenSeparator = false;
        while (valueChars.length < minCount || scanAsManyAsPossible) {
          var ch = text.charCodeAt(pos);
          if (canHaveSeparators && ch === 95) {
            tokenFlags |= 512;
            if (allowSeparator) {
              allowSeparator = false;
              isPreviousTokenSeparator = true;
            } else if (isPreviousTokenSeparator) {
              error(ts2.Diagnostics.Multiple_consecutive_numeric_separators_are_not_permitted, pos, 1);
            } else {
              error(ts2.Diagnostics.Numeric_separators_are_not_allowed_here, pos, 1);
            }
            pos++;
            continue;
          }
          allowSeparator = canHaveSeparators;
          if (ch >= 65 && ch <= 70) {
            ch += 97 - 65;
          } else if (!(ch >= 48 && ch <= 57 || ch >= 97 && ch <= 102)) {
            break;
          }
          valueChars.push(ch);
          pos++;
          isPreviousTokenSeparator = false;
        }
        if (valueChars.length < minCount) {
          valueChars = [];
        }
        if (text.charCodeAt(pos - 1) === 95) {
          error(ts2.Diagnostics.Numeric_separators_are_not_allowed_here, pos - 1, 1);
        }
        return String.fromCharCode.apply(String, valueChars);
      }
      function scanString(jsxAttributeString) {
        if (jsxAttributeString === void 0) {
          jsxAttributeString = false;
        }
        var quote = text.charCodeAt(pos);
        pos++;
        var result = "";
        var start2 = pos;
        while (true) {
          if (pos >= end) {
            result += text.substring(start2, pos);
            tokenFlags |= 4;
            error(ts2.Diagnostics.Unterminated_string_literal);
            break;
          }
          var ch = text.charCodeAt(pos);
          if (ch === quote) {
            result += text.substring(start2, pos);
            pos++;
            break;
          }
          if (ch === 92 && !jsxAttributeString) {
            result += text.substring(start2, pos);
            result += scanEscapeSequence();
            start2 = pos;
            continue;
          }
          if (isLineBreak(ch) && !jsxAttributeString) {
            result += text.substring(start2, pos);
            tokenFlags |= 4;
            error(ts2.Diagnostics.Unterminated_string_literal);
            break;
          }
          pos++;
        }
        return result;
      }
      function scanTemplateAndSetTokenValue(isTaggedTemplate) {
        var startedWithBacktick = text.charCodeAt(pos) === 96;
        pos++;
        var start2 = pos;
        var contents = "";
        var resultingToken;
        while (true) {
          if (pos >= end) {
            contents += text.substring(start2, pos);
            tokenFlags |= 4;
            error(ts2.Diagnostics.Unterminated_template_literal);
            resultingToken = startedWithBacktick ? 14 : 17;
            break;
          }
          var currChar = text.charCodeAt(pos);
          if (currChar === 96) {
            contents += text.substring(start2, pos);
            pos++;
            resultingToken = startedWithBacktick ? 14 : 17;
            break;
          }
          if (currChar === 36 && pos + 1 < end && text.charCodeAt(pos + 1) === 123) {
            contents += text.substring(start2, pos);
            pos += 2;
            resultingToken = startedWithBacktick ? 15 : 16;
            break;
          }
          if (currChar === 92) {
            contents += text.substring(start2, pos);
            contents += scanEscapeSequence(isTaggedTemplate);
            start2 = pos;
            continue;
          }
          if (currChar === 13) {
            contents += text.substring(start2, pos);
            pos++;
            if (pos < end && text.charCodeAt(pos) === 10) {
              pos++;
            }
            contents += "\n";
            start2 = pos;
            continue;
          }
          pos++;
        }
        ts2.Debug.assert(resultingToken !== void 0);
        tokenValue = contents;
        return resultingToken;
      }
      function scanEscapeSequence(isTaggedTemplate) {
        var start2 = pos;
        pos++;
        if (pos >= end) {
          error(ts2.Diagnostics.Unexpected_end_of_text);
          return "";
        }
        var ch = text.charCodeAt(pos);
        pos++;
        switch (ch) {
          case 48:
            if (isTaggedTemplate && pos < end && isDigit(text.charCodeAt(pos))) {
              pos++;
              tokenFlags |= 2048;
              return text.substring(start2, pos);
            }
            return "\0";
          case 98:
            return "\b";
          case 116:
            return "	";
          case 110:
            return "\n";
          case 118:
            return "\v";
          case 102:
            return "\f";
          case 114:
            return "\r";
          case 39:
            return "'";
          case 34:
            return '"';
          case 117:
            if (isTaggedTemplate) {
              for (var escapePos = pos; escapePos < pos + 4; escapePos++) {
                if (escapePos < end && !isHexDigit(text.charCodeAt(escapePos)) && text.charCodeAt(escapePos) !== 123) {
                  pos = escapePos;
                  tokenFlags |= 2048;
                  return text.substring(start2, pos);
                }
              }
            }
            if (pos < end && text.charCodeAt(pos) === 123) {
              pos++;
              if (isTaggedTemplate && !isHexDigit(text.charCodeAt(pos))) {
                tokenFlags |= 2048;
                return text.substring(start2, pos);
              }
              if (isTaggedTemplate) {
                var savePos = pos;
                var escapedValueString = scanMinimumNumberOfHexDigits(1, false);
                var escapedValue = escapedValueString ? parseInt(escapedValueString, 16) : -1;
                if (!isCodePoint(escapedValue) || text.charCodeAt(pos) !== 125) {
                  tokenFlags |= 2048;
                  return text.substring(start2, pos);
                } else {
                  pos = savePos;
                }
              }
              tokenFlags |= 8;
              return scanExtendedUnicodeEscape();
            }
            tokenFlags |= 1024;
            return scanHexadecimalEscape(4);
          case 120:
            if (isTaggedTemplate) {
              if (!isHexDigit(text.charCodeAt(pos))) {
                tokenFlags |= 2048;
                return text.substring(start2, pos);
              } else if (!isHexDigit(text.charCodeAt(pos + 1))) {
                pos++;
                tokenFlags |= 2048;
                return text.substring(start2, pos);
              }
            }
            return scanHexadecimalEscape(2);
          case 13:
            if (pos < end && text.charCodeAt(pos) === 10) {
              pos++;
            }
          case 10:
          case 8232:
          case 8233:
            return "";
          default:
            return String.fromCharCode(ch);
        }
      }
      function scanHexadecimalEscape(numDigits) {
        var escapedValue = scanExactNumberOfHexDigits(numDigits, false);
        if (escapedValue >= 0) {
          return String.fromCharCode(escapedValue);
        } else {
          error(ts2.Diagnostics.Hexadecimal_digit_expected);
          return "";
        }
      }
      function scanExtendedUnicodeEscape() {
        var escapedValueString = scanMinimumNumberOfHexDigits(1, false);
        var escapedValue = escapedValueString ? parseInt(escapedValueString, 16) : -1;
        var isInvalidExtendedEscape = false;
        if (escapedValue < 0) {
          error(ts2.Diagnostics.Hexadecimal_digit_expected);
          isInvalidExtendedEscape = true;
        } else if (escapedValue > 1114111) {
          error(ts2.Diagnostics.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive);
          isInvalidExtendedEscape = true;
        }
        if (pos >= end) {
          error(ts2.Diagnostics.Unexpected_end_of_text);
          isInvalidExtendedEscape = true;
        } else if (text.charCodeAt(pos) === 125) {
          pos++;
        } else {
          error(ts2.Diagnostics.Unterminated_Unicode_escape_sequence);
          isInvalidExtendedEscape = true;
        }
        if (isInvalidExtendedEscape) {
          return "";
        }
        return utf16EncodeAsString(escapedValue);
      }
      function peekUnicodeEscape() {
        if (pos + 5 < end && text.charCodeAt(pos + 1) === 117) {
          var start_1 = pos;
          pos += 2;
          var value = scanExactNumberOfHexDigits(4, false);
          pos = start_1;
          return value;
        }
        return -1;
      }
      function peekExtendedUnicodeEscape() {
        if (languageVersion >= 2 && codePointAt(text, pos + 1) === 117 && codePointAt(text, pos + 2) === 123) {
          var start_2 = pos;
          pos += 3;
          var escapedValueString = scanMinimumNumberOfHexDigits(1, false);
          var escapedValue = escapedValueString ? parseInt(escapedValueString, 16) : -1;
          pos = start_2;
          return escapedValue;
        }
        return -1;
      }
      function scanIdentifierParts() {
        var result = "";
        var start2 = pos;
        while (pos < end) {
          var ch = codePointAt(text, pos);
          if (isIdentifierPart(ch, languageVersion)) {
            pos += charSize(ch);
          } else if (ch === 92) {
            ch = peekExtendedUnicodeEscape();
            if (ch >= 0 && isIdentifierPart(ch, languageVersion)) {
              pos += 3;
              tokenFlags |= 8;
              result += scanExtendedUnicodeEscape();
              start2 = pos;
              continue;
            }
            ch = peekUnicodeEscape();
            if (!(ch >= 0 && isIdentifierPart(ch, languageVersion))) {
              break;
            }
            tokenFlags |= 1024;
            result += text.substring(start2, pos);
            result += utf16EncodeAsString(ch);
            pos += 6;
            start2 = pos;
          } else {
            break;
          }
        }
        result += text.substring(start2, pos);
        return result;
      }
      function getIdentifierToken() {
        var len = tokenValue.length;
        if (len >= 2 && len <= 12) {
          var ch = tokenValue.charCodeAt(0);
          if (ch >= 97 && ch <= 122) {
            var keyword = textToKeyword.get(tokenValue);
            if (keyword !== void 0) {
              return token = keyword;
            }
          }
        }
        return token = 79;
      }
      function scanBinaryOrOctalDigits(base) {
        var value = "";
        var separatorAllowed = false;
        var isPreviousTokenSeparator = false;
        while (true) {
          var ch = text.charCodeAt(pos);
          if (ch === 95) {
            tokenFlags |= 512;
            if (separatorAllowed) {
              separatorAllowed = false;
              isPreviousTokenSeparator = true;
            } else if (isPreviousTokenSeparator) {
              error(ts2.Diagnostics.Multiple_consecutive_numeric_separators_are_not_permitted, pos, 1);
            } else {
              error(ts2.Diagnostics.Numeric_separators_are_not_allowed_here, pos, 1);
            }
            pos++;
            continue;
          }
          separatorAllowed = true;
          if (!isDigit(ch) || ch - 48 >= base) {
            break;
          }
          value += text[pos];
          pos++;
          isPreviousTokenSeparator = false;
        }
        if (text.charCodeAt(pos - 1) === 95) {
          error(ts2.Diagnostics.Numeric_separators_are_not_allowed_here, pos - 1, 1);
        }
        return value;
      }
      function checkBigIntSuffix() {
        if (text.charCodeAt(pos) === 110) {
          tokenValue += "n";
          if (tokenFlags & 384) {
            tokenValue = ts2.parsePseudoBigInt(tokenValue) + "n";
          }
          pos++;
          return 9;
        } else {
          var numericValue = tokenFlags & 128 ? parseInt(tokenValue.slice(2), 2) : tokenFlags & 256 ? parseInt(tokenValue.slice(2), 8) : +tokenValue;
          tokenValue = "" + numericValue;
          return 8;
        }
      }
      function scan() {
        var _a2;
        startPos = pos;
        tokenFlags = 0;
        var asteriskSeen = false;
        while (true) {
          tokenPos = pos;
          if (pos >= end) {
            return token = 1;
          }
          var ch = codePointAt(text, pos);
          if (ch === 35 && pos === 0 && isShebangTrivia(text, pos)) {
            pos = scanShebangTrivia(text, pos);
            if (skipTrivia2) {
              continue;
            } else {
              return token = 6;
            }
          }
          switch (ch) {
            case 10:
            case 13:
              tokenFlags |= 1;
              if (skipTrivia2) {
                pos++;
                continue;
              } else {
                if (ch === 13 && pos + 1 < end && text.charCodeAt(pos + 1) === 10) {
                  pos += 2;
                } else {
                  pos++;
                }
                return token = 4;
              }
            case 9:
            case 11:
            case 12:
            case 32:
            case 160:
            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 8203:
            case 8239:
            case 8287:
            case 12288:
            case 65279:
              if (skipTrivia2) {
                pos++;
                continue;
              } else {
                while (pos < end && isWhiteSpaceSingleLine(text.charCodeAt(pos))) {
                  pos++;
                }
                return token = 5;
              }
            case 33:
              if (text.charCodeAt(pos + 1) === 61) {
                if (text.charCodeAt(pos + 2) === 61) {
                  return pos += 3, token = 37;
                }
                return pos += 2, token = 35;
              }
              pos++;
              return token = 53;
            case 34:
            case 39:
              tokenValue = scanString();
              return token = 10;
            case 96:
              return token = scanTemplateAndSetTokenValue(false);
            case 37:
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 69;
              }
              pos++;
              return token = 44;
            case 38:
              if (text.charCodeAt(pos + 1) === 38) {
                if (text.charCodeAt(pos + 2) === 61) {
                  return pos += 3, token = 76;
                }
                return pos += 2, token = 55;
              }
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 73;
              }
              pos++;
              return token = 50;
            case 40:
              pos++;
              return token = 20;
            case 41:
              pos++;
              return token = 21;
            case 42:
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 66;
              }
              if (text.charCodeAt(pos + 1) === 42) {
                if (text.charCodeAt(pos + 2) === 61) {
                  return pos += 3, token = 67;
                }
                return pos += 2, token = 42;
              }
              pos++;
              if (inJSDocType && !asteriskSeen && tokenFlags & 1) {
                asteriskSeen = true;
                continue;
              }
              return token = 41;
            case 43:
              if (text.charCodeAt(pos + 1) === 43) {
                return pos += 2, token = 45;
              }
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 64;
              }
              pos++;
              return token = 39;
            case 44:
              pos++;
              return token = 27;
            case 45:
              if (text.charCodeAt(pos + 1) === 45) {
                return pos += 2, token = 46;
              }
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 65;
              }
              pos++;
              return token = 40;
            case 46:
              if (isDigit(text.charCodeAt(pos + 1))) {
                tokenValue = scanNumber().value;
                return token = 8;
              }
              if (text.charCodeAt(pos + 1) === 46 && text.charCodeAt(pos + 2) === 46) {
                return pos += 3, token = 25;
              }
              pos++;
              return token = 24;
            case 47:
              if (text.charCodeAt(pos + 1) === 47) {
                pos += 2;
                while (pos < end) {
                  if (isLineBreak(text.charCodeAt(pos))) {
                    break;
                  }
                  pos++;
                }
                commentDirectives = appendIfCommentDirective(commentDirectives, text.slice(tokenPos, pos), commentDirectiveRegExSingleLine, tokenPos);
                if (skipTrivia2) {
                  continue;
                } else {
                  return token = 2;
                }
              }
              if (text.charCodeAt(pos + 1) === 42) {
                pos += 2;
                if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) !== 47) {
                  tokenFlags |= 2;
                }
                var commentClosed = false;
                var lastLineStart = tokenPos;
                while (pos < end) {
                  var ch_1 = text.charCodeAt(pos);
                  if (ch_1 === 42 && text.charCodeAt(pos + 1) === 47) {
                    pos += 2;
                    commentClosed = true;
                    break;
                  }
                  pos++;
                  if (isLineBreak(ch_1)) {
                    lastLineStart = pos;
                    tokenFlags |= 1;
                  }
                }
                commentDirectives = appendIfCommentDirective(commentDirectives, text.slice(lastLineStart, pos), commentDirectiveRegExMultiLine, lastLineStart);
                if (!commentClosed) {
                  error(ts2.Diagnostics.Asterisk_Slash_expected);
                }
                if (skipTrivia2) {
                  continue;
                } else {
                  if (!commentClosed) {
                    tokenFlags |= 4;
                  }
                  return token = 3;
                }
              }
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 68;
              }
              pos++;
              return token = 43;
            case 48:
              if (pos + 2 < end && (text.charCodeAt(pos + 1) === 88 || text.charCodeAt(pos + 1) === 120)) {
                pos += 2;
                tokenValue = scanMinimumNumberOfHexDigits(1, true);
                if (!tokenValue) {
                  error(ts2.Diagnostics.Hexadecimal_digit_expected);
                  tokenValue = "0";
                }
                tokenValue = "0x" + tokenValue;
                tokenFlags |= 64;
                return token = checkBigIntSuffix();
              } else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 66 || text.charCodeAt(pos + 1) === 98)) {
                pos += 2;
                tokenValue = scanBinaryOrOctalDigits(2);
                if (!tokenValue) {
                  error(ts2.Diagnostics.Binary_digit_expected);
                  tokenValue = "0";
                }
                tokenValue = "0b" + tokenValue;
                tokenFlags |= 128;
                return token = checkBigIntSuffix();
              } else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 79 || text.charCodeAt(pos + 1) === 111)) {
                pos += 2;
                tokenValue = scanBinaryOrOctalDigits(8);
                if (!tokenValue) {
                  error(ts2.Diagnostics.Octal_digit_expected);
                  tokenValue = "0";
                }
                tokenValue = "0o" + tokenValue;
                tokenFlags |= 256;
                return token = checkBigIntSuffix();
              }
              if (pos + 1 < end && isOctalDigit(text.charCodeAt(pos + 1))) {
                tokenValue = "" + scanOctalDigits();
                tokenFlags |= 32;
                return token = 8;
              }
            case 49:
            case 50:
            case 51:
            case 52:
            case 53:
            case 54:
            case 55:
            case 56:
            case 57:
              _a2 = scanNumber(), token = _a2.type, tokenValue = _a2.value;
              return token;
            case 58:
              pos++;
              return token = 58;
            case 59:
              pos++;
              return token = 26;
            case 60:
              if (isConflictMarkerTrivia(text, pos)) {
                pos = scanConflictMarkerTrivia(text, pos, error);
                if (skipTrivia2) {
                  continue;
                } else {
                  return token = 7;
                }
              }
              if (text.charCodeAt(pos + 1) === 60) {
                if (text.charCodeAt(pos + 2) === 61) {
                  return pos += 3, token = 70;
                }
                return pos += 2, token = 47;
              }
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 32;
              }
              if (languageVariant === 1 && text.charCodeAt(pos + 1) === 47 && text.charCodeAt(pos + 2) !== 42) {
                return pos += 2, token = 30;
              }
              pos++;
              return token = 29;
            case 61:
              if (isConflictMarkerTrivia(text, pos)) {
                pos = scanConflictMarkerTrivia(text, pos, error);
                if (skipTrivia2) {
                  continue;
                } else {
                  return token = 7;
                }
              }
              if (text.charCodeAt(pos + 1) === 61) {
                if (text.charCodeAt(pos + 2) === 61) {
                  return pos += 3, token = 36;
                }
                return pos += 2, token = 34;
              }
              if (text.charCodeAt(pos + 1) === 62) {
                return pos += 2, token = 38;
              }
              pos++;
              return token = 63;
            case 62:
              if (isConflictMarkerTrivia(text, pos)) {
                pos = scanConflictMarkerTrivia(text, pos, error);
                if (skipTrivia2) {
                  continue;
                } else {
                  return token = 7;
                }
              }
              pos++;
              return token = 31;
            case 63:
              if (text.charCodeAt(pos + 1) === 46 && !isDigit(text.charCodeAt(pos + 2))) {
                return pos += 2, token = 28;
              }
              if (text.charCodeAt(pos + 1) === 63) {
                if (text.charCodeAt(pos + 2) === 61) {
                  return pos += 3, token = 77;
                }
                return pos += 2, token = 60;
              }
              pos++;
              return token = 57;
            case 91:
              pos++;
              return token = 22;
            case 93:
              pos++;
              return token = 23;
            case 94:
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 78;
              }
              pos++;
              return token = 52;
            case 123:
              pos++;
              return token = 18;
            case 124:
              if (isConflictMarkerTrivia(text, pos)) {
                pos = scanConflictMarkerTrivia(text, pos, error);
                if (skipTrivia2) {
                  continue;
                } else {
                  return token = 7;
                }
              }
              if (text.charCodeAt(pos + 1) === 124) {
                if (text.charCodeAt(pos + 2) === 61) {
                  return pos += 3, token = 75;
                }
                return pos += 2, token = 56;
              }
              if (text.charCodeAt(pos + 1) === 61) {
                return pos += 2, token = 74;
              }
              pos++;
              return token = 51;
            case 125:
              pos++;
              return token = 19;
            case 126:
              pos++;
              return token = 54;
            case 64:
              pos++;
              return token = 59;
            case 92:
              var extendedCookedChar = peekExtendedUnicodeEscape();
              if (extendedCookedChar >= 0 && isIdentifierStart(extendedCookedChar, languageVersion)) {
                pos += 3;
                tokenFlags |= 8;
                tokenValue = scanExtendedUnicodeEscape() + scanIdentifierParts();
                return token = getIdentifierToken();
              }
              var cookedChar = peekUnicodeEscape();
              if (cookedChar >= 0 && isIdentifierStart(cookedChar, languageVersion)) {
                pos += 6;
                tokenFlags |= 1024;
                tokenValue = String.fromCharCode(cookedChar) + scanIdentifierParts();
                return token = getIdentifierToken();
              }
              error(ts2.Diagnostics.Invalid_character);
              pos++;
              return token = 0;
            case 35:
              if (pos !== 0 && text[pos + 1] === "!") {
                error(ts2.Diagnostics.can_only_be_used_at_the_start_of_a_file);
                pos++;
                return token = 0;
              }
              if (isIdentifierStart(codePointAt(text, pos + 1), languageVersion)) {
                pos++;
                scanIdentifier(codePointAt(text, pos), languageVersion);
              } else {
                tokenValue = String.fromCharCode(codePointAt(text, pos));
                error(ts2.Diagnostics.Invalid_character, pos++, charSize(ch));
              }
              return token = 80;
            default:
              var identifierKind = scanIdentifier(ch, languageVersion);
              if (identifierKind) {
                return token = identifierKind;
              } else if (isWhiteSpaceSingleLine(ch)) {
                pos += charSize(ch);
                continue;
              } else if (isLineBreak(ch)) {
                tokenFlags |= 1;
                pos += charSize(ch);
                continue;
              }
              var size = charSize(ch);
              error(ts2.Diagnostics.Invalid_character, pos, size);
              pos += size;
              return token = 0;
          }
        }
      }
      function reScanInvalidIdentifier() {
        ts2.Debug.assert(token === 0, "'reScanInvalidIdentifier' should only be called when the current token is 'SyntaxKind.Unknown'.");
        pos = tokenPos = startPos;
        tokenFlags = 0;
        var ch = codePointAt(text, pos);
        var identifierKind = scanIdentifier(ch, 99);
        if (identifierKind) {
          return token = identifierKind;
        }
        pos += charSize(ch);
        return token;
      }
      function scanIdentifier(startCharacter, languageVersion2) {
        var ch = startCharacter;
        if (isIdentifierStart(ch, languageVersion2)) {
          pos += charSize(ch);
          while (pos < end && isIdentifierPart(ch = codePointAt(text, pos), languageVersion2))
            pos += charSize(ch);
          tokenValue = text.substring(tokenPos, pos);
          if (ch === 92) {
            tokenValue += scanIdentifierParts();
          }
          return getIdentifierToken();
        }
      }
      function reScanGreaterToken() {
        if (token === 31) {
          if (text.charCodeAt(pos) === 62) {
            if (text.charCodeAt(pos + 1) === 62) {
              if (text.charCodeAt(pos + 2) === 61) {
                return pos += 3, token = 72;
              }
              return pos += 2, token = 49;
            }
            if (text.charCodeAt(pos + 1) === 61) {
              return pos += 2, token = 71;
            }
            pos++;
            return token = 48;
          }
          if (text.charCodeAt(pos) === 61) {
            pos++;
            return token = 33;
          }
        }
        return token;
      }
      function reScanAsteriskEqualsToken() {
        ts2.Debug.assert(token === 66, "'reScanAsteriskEqualsToken' should only be called on a '*='");
        pos = tokenPos + 1;
        return token = 63;
      }
      function reScanSlashToken() {
        if (token === 43 || token === 68) {
          var p = tokenPos + 1;
          var inEscape = false;
          var inCharacterClass = false;
          while (true) {
            if (p >= end) {
              tokenFlags |= 4;
              error(ts2.Diagnostics.Unterminated_regular_expression_literal);
              break;
            }
            var ch = text.charCodeAt(p);
            if (isLineBreak(ch)) {
              tokenFlags |= 4;
              error(ts2.Diagnostics.Unterminated_regular_expression_literal);
              break;
            }
            if (inEscape) {
              inEscape = false;
            } else if (ch === 47 && !inCharacterClass) {
              p++;
              break;
            } else if (ch === 91) {
              inCharacterClass = true;
            } else if (ch === 92) {
              inEscape = true;
            } else if (ch === 93) {
              inCharacterClass = false;
            }
            p++;
          }
          while (p < end && isIdentifierPart(text.charCodeAt(p), languageVersion)) {
            p++;
          }
          pos = p;
          tokenValue = text.substring(tokenPos, pos);
          token = 13;
        }
        return token;
      }
      function appendIfCommentDirective(commentDirectives2, text2, commentDirectiveRegEx, lineStart) {
        var type = getDirectiveFromComment(ts2.trimStringStart(text2), commentDirectiveRegEx);
        if (type === void 0) {
          return commentDirectives2;
        }
        return ts2.append(commentDirectives2, {
          range: { pos: lineStart, end: pos },
          type
        });
      }
      function getDirectiveFromComment(text2, commentDirectiveRegEx) {
        var match = commentDirectiveRegEx.exec(text2);
        if (!match) {
          return void 0;
        }
        switch (match[1]) {
          case "ts-expect-error":
            return 0;
          case "ts-ignore":
            return 1;
        }
        return void 0;
      }
      function reScanTemplateToken(isTaggedTemplate) {
        ts2.Debug.assert(token === 19, "'reScanTemplateToken' should only be called on a '}'");
        pos = tokenPos;
        return token = scanTemplateAndSetTokenValue(isTaggedTemplate);
      }
      function reScanTemplateHeadOrNoSubstitutionTemplate() {
        pos = tokenPos;
        return token = scanTemplateAndSetTokenValue(true);
      }
      function reScanJsxToken(allowMultilineJsxText) {
        if (allowMultilineJsxText === void 0) {
          allowMultilineJsxText = true;
        }
        pos = tokenPos = startPos;
        return token = scanJsxToken(allowMultilineJsxText);
      }
      function reScanLessThanToken() {
        if (token === 47) {
          pos = tokenPos + 1;
          return token = 29;
        }
        return token;
      }
      function reScanHashToken() {
        if (token === 80) {
          pos = tokenPos + 1;
          return token = 62;
        }
        return token;
      }
      function reScanQuestionToken() {
        ts2.Debug.assert(token === 60, "'reScanQuestionToken' should only be called on a '??'");
        pos = tokenPos + 1;
        return token = 57;
      }
      function scanJsxToken(allowMultilineJsxText) {
        if (allowMultilineJsxText === void 0) {
          allowMultilineJsxText = true;
        }
        startPos = tokenPos = pos;
        if (pos >= end) {
          return token = 1;
        }
        var char = text.charCodeAt(pos);
        if (char === 60) {
          if (text.charCodeAt(pos + 1) === 47) {
            pos += 2;
            return token = 30;
          }
          pos++;
          return token = 29;
        }
        if (char === 123) {
          pos++;
          return token = 18;
        }
        var firstNonWhitespace = 0;
        while (pos < end) {
          char = text.charCodeAt(pos);
          if (char === 123) {
            break;
          }
          if (char === 60) {
            if (isConflictMarkerTrivia(text, pos)) {
              pos = scanConflictMarkerTrivia(text, pos, error);
              return token = 7;
            }
            break;
          }
          if (char === 62) {
            error(ts2.Diagnostics.Unexpected_token_Did_you_mean_or_gt, pos, 1);
          }
          if (char === 125) {
            error(ts2.Diagnostics.Unexpected_token_Did_you_mean_or_rbrace, pos, 1);
          }
          if (isLineBreak(char) && firstNonWhitespace === 0) {
            firstNonWhitespace = -1;
          } else if (!allowMultilineJsxText && isLineBreak(char) && firstNonWhitespace > 0) {
            break;
          } else if (!isWhiteSpaceLike(char)) {
            firstNonWhitespace = pos;
          }
          pos++;
        }
        tokenValue = text.substring(startPos, pos);
        return firstNonWhitespace === -1 ? 12 : 11;
      }
      function scanJsxIdentifier() {
        if (tokenIsIdentifierOrKeyword(token)) {
          var namespaceSeparator = false;
          while (pos < end) {
            var ch = text.charCodeAt(pos);
            if (ch === 45) {
              tokenValue += "-";
              pos++;
              continue;
            } else if (ch === 58 && !namespaceSeparator) {
              tokenValue += ":";
              pos++;
              namespaceSeparator = true;
              token = 79;
              continue;
            }
            var oldPos = pos;
            tokenValue += scanIdentifierParts();
            if (pos === oldPos) {
              break;
            }
          }
          if (tokenValue.slice(-1) === ":") {
            tokenValue = tokenValue.slice(0, -1);
            pos--;
          }
        }
        return token;
      }
      function scanJsxAttributeValue() {
        startPos = pos;
        switch (text.charCodeAt(pos)) {
          case 34:
          case 39:
            tokenValue = scanString(true);
            return token = 10;
          default:
            return scan();
        }
      }
      function reScanJsxAttributeValue() {
        pos = tokenPos = startPos;
        return scanJsxAttributeValue();
      }
      function scanJsDocToken() {
        startPos = tokenPos = pos;
        tokenFlags = 0;
        if (pos >= end) {
          return token = 1;
        }
        var ch = codePointAt(text, pos);
        pos += charSize(ch);
        switch (ch) {
          case 9:
          case 11:
          case 12:
          case 32:
            while (pos < end && isWhiteSpaceSingleLine(text.charCodeAt(pos))) {
              pos++;
            }
            return token = 5;
          case 64:
            return token = 59;
          case 13:
            if (text.charCodeAt(pos) === 10) {
              pos++;
            }
          case 10:
            tokenFlags |= 1;
            return token = 4;
          case 42:
            return token = 41;
          case 123:
            return token = 18;
          case 125:
            return token = 19;
          case 91:
            return token = 22;
          case 93:
            return token = 23;
          case 60:
            return token = 29;
          case 62:
            return token = 31;
          case 61:
            return token = 63;
          case 44:
            return token = 27;
          case 46:
            return token = 24;
          case 96:
            return token = 61;
          case 35:
            return token = 62;
          case 92:
            pos--;
            var extendedCookedChar = peekExtendedUnicodeEscape();
            if (extendedCookedChar >= 0 && isIdentifierStart(extendedCookedChar, languageVersion)) {
              pos += 3;
              tokenFlags |= 8;
              tokenValue = scanExtendedUnicodeEscape() + scanIdentifierParts();
              return token = getIdentifierToken();
            }
            var cookedChar = peekUnicodeEscape();
            if (cookedChar >= 0 && isIdentifierStart(cookedChar, languageVersion)) {
              pos += 6;
              tokenFlags |= 1024;
              tokenValue = String.fromCharCode(cookedChar) + scanIdentifierParts();
              return token = getIdentifierToken();
            }
            pos++;
            return token = 0;
        }
        if (isIdentifierStart(ch, languageVersion)) {
          var char = ch;
          while (pos < end && isIdentifierPart(char = codePointAt(text, pos), languageVersion) || text.charCodeAt(pos) === 45)
            pos += charSize(char);
          tokenValue = text.substring(tokenPos, pos);
          if (char === 92) {
            tokenValue += scanIdentifierParts();
          }
          return token = getIdentifierToken();
        } else {
          return token = 0;
        }
      }
      function speculationHelper(callback, isLookahead) {
        var savePos = pos;
        var saveStartPos = startPos;
        var saveTokenPos = tokenPos;
        var saveToken = token;
        var saveTokenValue = tokenValue;
        var saveTokenFlags = tokenFlags;
        var result = callback();
        if (!result || isLookahead) {
          pos = savePos;
          startPos = saveStartPos;
          tokenPos = saveTokenPos;
          token = saveToken;
          tokenValue = saveTokenValue;
          tokenFlags = saveTokenFlags;
        }
        return result;
      }
      function scanRange(start2, length2, callback) {
        var saveEnd = end;
        var savePos = pos;
        var saveStartPos = startPos;
        var saveTokenPos = tokenPos;
        var saveToken = token;
        var saveTokenValue = tokenValue;
        var saveTokenFlags = tokenFlags;
        var saveErrorExpectations = commentDirectives;
        setText(text, start2, length2);
        var result = callback();
        end = saveEnd;
        pos = savePos;
        startPos = saveStartPos;
        tokenPos = saveTokenPos;
        token = saveToken;
        tokenValue = saveTokenValue;
        tokenFlags = saveTokenFlags;
        commentDirectives = saveErrorExpectations;
        return result;
      }
      function lookAhead(callback) {
        return speculationHelper(callback, true);
      }
      function tryScan(callback) {
        return speculationHelper(callback, false);
      }
      function getText() {
        return text;
      }
      function clearCommentDirectives() {
        commentDirectives = void 0;
      }
      function setText(newText, start2, length2) {
        text = newText || "";
        end = length2 === void 0 ? text.length : start2 + length2;
        setTextPos(start2 || 0);
      }
      function setOnError(errorCallback) {
        onError = errorCallback;
      }
      function setScriptTarget(scriptTarget) {
        languageVersion = scriptTarget;
      }
      function setLanguageVariant(variant) {
        languageVariant = variant;
      }
      function setTextPos(textPos) {
        ts2.Debug.assert(textPos >= 0);
        pos = textPos;
        startPos = textPos;
        tokenPos = textPos;
        token = 0;
        tokenValue = void 0;
        tokenFlags = 0;
      }
      function setInJSDocType(inType) {
        inJSDocType += inType ? 1 : -1;
      }
    }
    ts2.createScanner = createScanner;
    var codePointAt = String.prototype.codePointAt ? function(s, i) {
      return s.codePointAt(i);
    } : function codePointAt2(str, i) {
      var size = str.length;
      if (i < 0 || i >= size) {
        return void 0;
      }
      var first = str.charCodeAt(i);
      if (first >= 55296 && first <= 56319 && size > i + 1) {
        var second = str.charCodeAt(i + 1);
        if (second >= 56320 && second <= 57343) {
          return (first - 55296) * 1024 + second - 56320 + 65536;
        }
      }
      return first;
    };
    function charSize(ch) {
      if (ch >= 65536) {
        return 2;
      }
      return 1;
    }
    function utf16EncodeAsStringFallback(codePoint) {
      ts2.Debug.assert(0 <= codePoint && codePoint <= 1114111);
      if (codePoint <= 65535) {
        return String.fromCharCode(codePoint);
      }
      var codeUnit1 = Math.floor((codePoint - 65536) / 1024) + 55296;
      var codeUnit2 = (codePoint - 65536) % 1024 + 56320;
      return String.fromCharCode(codeUnit1, codeUnit2);
    }
    var utf16EncodeAsStringWorker = String.fromCodePoint ? function(codePoint) {
      return String.fromCodePoint(codePoint);
    } : utf16EncodeAsStringFallback;
    function utf16EncodeAsString(codePoint) {
      return utf16EncodeAsStringWorker(codePoint);
    }
    ts2.utf16EncodeAsString = utf16EncodeAsString;
  })(ts || (ts = {}));
  (function(ts2) {
    function isExternalModuleNameRelative(moduleName) {
      return ts2.pathIsRelative(moduleName) || ts2.isRootedDiskPath(moduleName);
    }
    ts2.isExternalModuleNameRelative = isExternalModuleNameRelative;
    function sortAndDeduplicateDiagnostics(diagnostics) {
      return ts2.sortAndDeduplicate(diagnostics, ts2.compareDiagnostics);
    }
    ts2.sortAndDeduplicateDiagnostics = sortAndDeduplicateDiagnostics;
    function getDefaultLibFileName(options) {
      switch (ts2.getEmitScriptTarget(options)) {
        case 99:
          return "lib.esnext.full.d.ts";
        case 8:
          return "lib.es2021.full.d.ts";
        case 7:
          return "lib.es2020.full.d.ts";
        case 6:
          return "lib.es2019.full.d.ts";
        case 5:
          return "lib.es2018.full.d.ts";
        case 4:
          return "lib.es2017.full.d.ts";
        case 3:
          return "lib.es2016.full.d.ts";
        case 2:
          return "lib.es6.d.ts";
        default:
          return "lib.d.ts";
      }
    }
    ts2.getDefaultLibFileName = getDefaultLibFileName;
    function textSpanEnd(span) {
      return span.start + span.length;
    }
    ts2.textSpanEnd = textSpanEnd;
    function textSpanIsEmpty(span) {
      return span.length === 0;
    }
    ts2.textSpanIsEmpty = textSpanIsEmpty;
    function textSpanContainsPosition(span, position) {
      return position >= span.start && position < textSpanEnd(span);
    }
    ts2.textSpanContainsPosition = textSpanContainsPosition;
    function textRangeContainsPositionInclusive(span, position) {
      return position >= span.pos && position <= span.end;
    }
    ts2.textRangeContainsPositionInclusive = textRangeContainsPositionInclusive;
    function textSpanContainsTextSpan(span, other) {
      return other.start >= span.start && textSpanEnd(other) <= textSpanEnd(span);
    }
    ts2.textSpanContainsTextSpan = textSpanContainsTextSpan;
    function textSpanOverlapsWith(span, other) {
      return textSpanOverlap(span, other) !== void 0;
    }
    ts2.textSpanOverlapsWith = textSpanOverlapsWith;
    function textSpanOverlap(span1, span2) {
      var overlap = textSpanIntersection(span1, span2);
      return overlap && overlap.length === 0 ? void 0 : overlap;
    }
    ts2.textSpanOverlap = textSpanOverlap;
    function textSpanIntersectsWithTextSpan(span, other) {
      return decodedTextSpanIntersectsWith(span.start, span.length, other.start, other.length);
    }
    ts2.textSpanIntersectsWithTextSpan = textSpanIntersectsWithTextSpan;
    function textSpanIntersectsWith(span, start, length) {
      return decodedTextSpanIntersectsWith(span.start, span.length, start, length);
    }
    ts2.textSpanIntersectsWith = textSpanIntersectsWith;
    function decodedTextSpanIntersectsWith(start1, length1, start2, length2) {
      var end1 = start1 + length1;
      var end2 = start2 + length2;
      return start2 <= end1 && end2 >= start1;
    }
    ts2.decodedTextSpanIntersectsWith = decodedTextSpanIntersectsWith;
    function textSpanIntersectsWithPosition(span, position) {
      return position <= textSpanEnd(span) && position >= span.start;
    }
    ts2.textSpanIntersectsWithPosition = textSpanIntersectsWithPosition;
    function textSpanIntersection(span1, span2) {
      var start = Math.max(span1.start, span2.start);
      var end = Math.min(textSpanEnd(span1), textSpanEnd(span2));
      return start <= end ? createTextSpanFromBounds(start, end) : void 0;
    }
    ts2.textSpanIntersection = textSpanIntersection;
    function createTextSpan(start, length) {
      if (start < 0) {
        throw new Error("start < 0");
      }
      if (length < 0) {
        throw new Error("length < 0");
      }
      return { start, length };
    }
    ts2.createTextSpan = createTextSpan;
    function createTextSpanFromBounds(start, end) {
      return createTextSpan(start, end - start);
    }
    ts2.createTextSpanFromBounds = createTextSpanFromBounds;
    function textChangeRangeNewSpan(range) {
      return createTextSpan(range.span.start, range.newLength);
    }
    ts2.textChangeRangeNewSpan = textChangeRangeNewSpan;
    function textChangeRangeIsUnchanged(range) {
      return textSpanIsEmpty(range.span) && range.newLength === 0;
    }
    ts2.textChangeRangeIsUnchanged = textChangeRangeIsUnchanged;
    function createTextChangeRange(span, newLength) {
      if (newLength < 0) {
        throw new Error("newLength < 0");
      }
      return { span, newLength };
    }
    ts2.createTextChangeRange = createTextChangeRange;
    ts2.unchangedTextChangeRange = createTextChangeRange(createTextSpan(0, 0), 0);
    function collapseTextChangeRangesAcrossMultipleVersions(changes) {
      if (changes.length === 0) {
        return ts2.unchangedTextChangeRange;
      }
      if (changes.length === 1) {
        return changes[0];
      }
      var change0 = changes[0];
      var oldStartN = change0.span.start;
      var oldEndN = textSpanEnd(change0.span);
      var newEndN = oldStartN + change0.newLength;
      for (var i = 1; i < changes.length; i++) {
        var nextChange = changes[i];
        var oldStart1 = oldStartN;
        var oldEnd1 = oldEndN;
        var newEnd1 = newEndN;
        var oldStart2 = nextChange.span.start;
        var oldEnd2 = textSpanEnd(nextChange.span);
        var newEnd2 = oldStart2 + nextChange.newLength;
        oldStartN = Math.min(oldStart1, oldStart2);
        oldEndN = Math.max(oldEnd1, oldEnd1 + (oldEnd2 - newEnd1));
        newEndN = Math.max(newEnd2, newEnd2 + (newEnd1 - oldEnd2));
      }
      return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), newEndN - oldStartN);
    }
    ts2.collapseTextChangeRangesAcrossMultipleVersions = collapseTextChangeRangesAcrossMultipleVersions;
    function getTypeParameterOwner(d) {
      if (d && d.kind === 162) {
        for (var current = d; current; current = current.parent) {
          if (isFunctionLike(current) || isClassLike(current) || current.kind === 257) {
            return current;
          }
        }
      }
    }
    ts2.getTypeParameterOwner = getTypeParameterOwner;
    function isParameterPropertyDeclaration(node, parent) {
      return ts2.hasSyntacticModifier(node, 16476) && parent.kind === 170;
    }
    ts2.isParameterPropertyDeclaration = isParameterPropertyDeclaration;
    function isEmptyBindingPattern(node) {
      if (isBindingPattern(node)) {
        return ts2.every(node.elements, isEmptyBindingElement);
      }
      return false;
    }
    ts2.isEmptyBindingPattern = isEmptyBindingPattern;
    function isEmptyBindingElement(node) {
      if (ts2.isOmittedExpression(node)) {
        return true;
      }
      return isEmptyBindingPattern(node.name);
    }
    ts2.isEmptyBindingElement = isEmptyBindingElement;
    function walkUpBindingElementsAndPatterns(binding) {
      var node = binding.parent;
      while (ts2.isBindingElement(node.parent)) {
        node = node.parent.parent;
      }
      return node.parent;
    }
    ts2.walkUpBindingElementsAndPatterns = walkUpBindingElementsAndPatterns;
    function getCombinedFlags(node, getFlags) {
      if (ts2.isBindingElement(node)) {
        node = walkUpBindingElementsAndPatterns(node);
      }
      var flags = getFlags(node);
      if (node.kind === 253) {
        node = node.parent;
      }
      if (node && node.kind === 254) {
        flags |= getFlags(node);
        node = node.parent;
      }
      if (node && node.kind === 236) {
        flags |= getFlags(node);
      }
      return flags;
    }
    function getCombinedModifierFlags(node) {
      return getCombinedFlags(node, ts2.getEffectiveModifierFlags);
    }
    ts2.getCombinedModifierFlags = getCombinedModifierFlags;
    function getCombinedNodeFlagsAlwaysIncludeJSDoc(node) {
      return getCombinedFlags(node, ts2.getEffectiveModifierFlagsAlwaysIncludeJSDoc);
    }
    ts2.getCombinedNodeFlagsAlwaysIncludeJSDoc = getCombinedNodeFlagsAlwaysIncludeJSDoc;
    function getCombinedNodeFlags(node) {
      return getCombinedFlags(node, function(n) {
        return n.flags;
      });
    }
    ts2.getCombinedNodeFlags = getCombinedNodeFlags;
    ts2.supportedLocaleDirectories = ["cs", "de", "es", "fr", "it", "ja", "ko", "pl", "pt-br", "ru", "tr", "zh-cn", "zh-tw"];
    function validateLocaleAndSetLanguage(locale, sys, errors) {
      var lowerCaseLocale = locale.toLowerCase();
      var matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(lowerCaseLocale);
      if (!matchResult) {
        if (errors) {
          errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1, "en", "ja-jp"));
        }
        return;
      }
      var language = matchResult[1];
      var territory = matchResult[3];
      if (ts2.contains(ts2.supportedLocaleDirectories, lowerCaseLocale) && !trySetLanguageAndTerritory(language, territory, errors)) {
        trySetLanguageAndTerritory(language, void 0, errors);
      }
      ts2.setUILocale(locale);
      function trySetLanguageAndTerritory(language2, territory2, errors2) {
        var compilerFilePath = ts2.normalizePath(sys.getExecutingFilePath());
        var containingDirectoryPath = ts2.getDirectoryPath(compilerFilePath);
        var filePath = ts2.combinePaths(containingDirectoryPath, language2);
        if (territory2) {
          filePath = filePath + "-" + territory2;
        }
        filePath = sys.resolvePath(ts2.combinePaths(filePath, "diagnosticMessages.generated.json"));
        if (!sys.fileExists(filePath)) {
          return false;
        }
        var fileContents = "";
        try {
          fileContents = sys.readFile(filePath);
        } catch (e) {
          if (errors2) {
            errors2.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Unable_to_open_file_0, filePath));
          }
          return false;
        }
        try {
          ts2.setLocalizedDiagnosticMessages(JSON.parse(fileContents));
        } catch (_a) {
          if (errors2) {
            errors2.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Corrupted_locale_file_0, filePath));
          }
          return false;
        }
        return true;
      }
    }
    ts2.validateLocaleAndSetLanguage = validateLocaleAndSetLanguage;
    function getOriginalNode(node, nodeTest) {
      if (node) {
        while (node.original !== void 0) {
          node = node.original;
        }
      }
      return !nodeTest || nodeTest(node) ? node : void 0;
    }
    ts2.getOriginalNode = getOriginalNode;
    function findAncestor(node, callback) {
      while (node) {
        var result = callback(node);
        if (result === "quit") {
          return void 0;
        } else if (result) {
          return node;
        }
        node = node.parent;
      }
      return void 0;
    }
    ts2.findAncestor = findAncestor;
    function isParseTreeNode(node) {
      return (node.flags & 8) === 0;
    }
    ts2.isParseTreeNode = isParseTreeNode;
    function getParseTreeNode(node, nodeTest) {
      if (node === void 0 || isParseTreeNode(node)) {
        return node;
      }
      node = node.original;
      while (node) {
        if (isParseTreeNode(node)) {
          return !nodeTest || nodeTest(node) ? node : void 0;
        }
        node = node.original;
      }
    }
    ts2.getParseTreeNode = getParseTreeNode;
    function escapeLeadingUnderscores(identifier) {
      return identifier.length >= 2 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 ? "_" + identifier : identifier;
    }
    ts2.escapeLeadingUnderscores = escapeLeadingUnderscores;
    function unescapeLeadingUnderscores(identifier) {
      var id = identifier;
      return id.length >= 3 && id.charCodeAt(0) === 95 && id.charCodeAt(1) === 95 && id.charCodeAt(2) === 95 ? id.substr(1) : id;
    }
    ts2.unescapeLeadingUnderscores = unescapeLeadingUnderscores;
    function idText(identifierOrPrivateName) {
      return unescapeLeadingUnderscores(identifierOrPrivateName.escapedText);
    }
    ts2.idText = idText;
    function symbolName(symbol) {
      if (symbol.valueDeclaration && isPrivateIdentifierClassElementDeclaration(symbol.valueDeclaration)) {
        return idText(symbol.valueDeclaration.name);
      }
      return unescapeLeadingUnderscores(symbol.escapedName);
    }
    ts2.symbolName = symbolName;
    function nameForNamelessJSDocTypedef(declaration) {
      var hostNode = declaration.parent.parent;
      if (!hostNode) {
        return void 0;
      }
      if (isDeclaration(hostNode)) {
        return getDeclarationIdentifier(hostNode);
      }
      switch (hostNode.kind) {
        case 236:
          if (hostNode.declarationList && hostNode.declarationList.declarations[0]) {
            return getDeclarationIdentifier(hostNode.declarationList.declarations[0]);
          }
          break;
        case 237:
          var expr = hostNode.expression;
          if (expr.kind === 220 && expr.operatorToken.kind === 63) {
            expr = expr.left;
          }
          switch (expr.kind) {
            case 205:
              return expr.name;
            case 206:
              var arg = expr.argumentExpression;
              if (ts2.isIdentifier(arg)) {
                return arg;
              }
          }
          break;
        case 211: {
          return getDeclarationIdentifier(hostNode.expression);
        }
        case 249: {
          if (isDeclaration(hostNode.statement) || isExpression(hostNode.statement)) {
            return getDeclarationIdentifier(hostNode.statement);
          }
          break;
        }
      }
    }
    function getDeclarationIdentifier(node) {
      var name = getNameOfDeclaration(node);
      return name && ts2.isIdentifier(name) ? name : void 0;
    }
    function nodeHasName(statement, name) {
      if (isNamedDeclaration(statement) && ts2.isIdentifier(statement.name) && idText(statement.name) === idText(name)) {
        return true;
      }
      if (ts2.isVariableStatement(statement) && ts2.some(statement.declarationList.declarations, function(d) {
        return nodeHasName(d, name);
      })) {
        return true;
      }
      return false;
    }
    ts2.nodeHasName = nodeHasName;
    function getNameOfJSDocTypedef(declaration) {
      return declaration.name || nameForNamelessJSDocTypedef(declaration);
    }
    ts2.getNameOfJSDocTypedef = getNameOfJSDocTypedef;
    function isNamedDeclaration(node) {
      return !!node.name;
    }
    ts2.isNamedDeclaration = isNamedDeclaration;
    function getNonAssignedNameOfDeclaration(declaration) {
      switch (declaration.kind) {
        case 79:
          return declaration;
        case 345:
        case 338: {
          var name = declaration.name;
          if (name.kind === 160) {
            return name.right;
          }
          break;
        }
        case 207:
        case 220: {
          var expr_1 = declaration;
          switch (ts2.getAssignmentDeclarationKind(expr_1)) {
            case 1:
            case 4:
            case 5:
            case 3:
              return ts2.getElementOrPropertyAccessArgumentExpressionOrName(expr_1.left);
            case 7:
            case 8:
            case 9:
              return expr_1.arguments[1];
            default:
              return void 0;
          }
        }
        case 343:
          return getNameOfJSDocTypedef(declaration);
        case 337:
          return nameForNamelessJSDocTypedef(declaration);
        case 270: {
          var expression = declaration.expression;
          return ts2.isIdentifier(expression) ? expression : void 0;
        }
        case 206:
          var expr = declaration;
          if (ts2.isBindableStaticElementAccessExpression(expr)) {
            return expr.argumentExpression;
          }
      }
      return declaration.name;
    }
    ts2.getNonAssignedNameOfDeclaration = getNonAssignedNameOfDeclaration;
    function getNameOfDeclaration(declaration) {
      if (declaration === void 0)
        return void 0;
      return getNonAssignedNameOfDeclaration(declaration) || (ts2.isFunctionExpression(declaration) || ts2.isArrowFunction(declaration) || ts2.isClassExpression(declaration) ? getAssignedName(declaration) : void 0);
    }
    ts2.getNameOfDeclaration = getNameOfDeclaration;
    function getAssignedName(node) {
      if (!node.parent) {
        return void 0;
      } else if (ts2.isPropertyAssignment(node.parent) || ts2.isBindingElement(node.parent)) {
        return node.parent.name;
      } else if (ts2.isBinaryExpression(node.parent) && node === node.parent.right) {
        if (ts2.isIdentifier(node.parent.left)) {
          return node.parent.left;
        } else if (ts2.isAccessExpression(node.parent.left)) {
          return ts2.getElementOrPropertyAccessArgumentExpressionOrName(node.parent.left);
        }
      } else if (ts2.isVariableDeclaration(node.parent) && ts2.isIdentifier(node.parent.name)) {
        return node.parent.name;
      }
    }
    ts2.getAssignedName = getAssignedName;
    function getJSDocParameterTagsWorker(param, noCache) {
      if (param.name) {
        if (ts2.isIdentifier(param.name)) {
          var name_1 = param.name.escapedText;
          return getJSDocTagsWorker(param.parent, noCache).filter(function(tag) {
            return ts2.isJSDocParameterTag(tag) && ts2.isIdentifier(tag.name) && tag.name.escapedText === name_1;
          });
        } else {
          var i = param.parent.parameters.indexOf(param);
          ts2.Debug.assert(i > -1, "Parameters should always be in their parents' parameter list");
          var paramTags = getJSDocTagsWorker(param.parent, noCache).filter(ts2.isJSDocParameterTag);
          if (i < paramTags.length) {
            return [paramTags[i]];
          }
        }
      }
      return ts2.emptyArray;
    }
    function getJSDocParameterTags(param) {
      return getJSDocParameterTagsWorker(param, false);
    }
    ts2.getJSDocParameterTags = getJSDocParameterTags;
    function getJSDocParameterTagsNoCache(param) {
      return getJSDocParameterTagsWorker(param, true);
    }
    ts2.getJSDocParameterTagsNoCache = getJSDocParameterTagsNoCache;
    function getJSDocTypeParameterTagsWorker(param, noCache) {
      var name = param.name.escapedText;
      return getJSDocTagsWorker(param.parent, noCache).filter(function(tag) {
        return ts2.isJSDocTemplateTag(tag) && tag.typeParameters.some(function(tp) {
          return tp.name.escapedText === name;
        });
      });
    }
    function getJSDocTypeParameterTags(param) {
      return getJSDocTypeParameterTagsWorker(param, false);
    }
    ts2.getJSDocTypeParameterTags = getJSDocTypeParameterTags;
    function getJSDocTypeParameterTagsNoCache(param) {
      return getJSDocTypeParameterTagsWorker(param, true);
    }
    ts2.getJSDocTypeParameterTagsNoCache = getJSDocTypeParameterTagsNoCache;
    function hasJSDocParameterTags(node) {
      return !!getFirstJSDocTag(node, ts2.isJSDocParameterTag);
    }
    ts2.hasJSDocParameterTags = hasJSDocParameterTags;
    function getJSDocAugmentsTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocAugmentsTag);
    }
    ts2.getJSDocAugmentsTag = getJSDocAugmentsTag;
    function getJSDocImplementsTags(node) {
      return getAllJSDocTags(node, ts2.isJSDocImplementsTag);
    }
    ts2.getJSDocImplementsTags = getJSDocImplementsTags;
    function getJSDocClassTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocClassTag);
    }
    ts2.getJSDocClassTag = getJSDocClassTag;
    function getJSDocPublicTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocPublicTag);
    }
    ts2.getJSDocPublicTag = getJSDocPublicTag;
    function getJSDocPublicTagNoCache(node) {
      return getFirstJSDocTag(node, ts2.isJSDocPublicTag, true);
    }
    ts2.getJSDocPublicTagNoCache = getJSDocPublicTagNoCache;
    function getJSDocPrivateTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocPrivateTag);
    }
    ts2.getJSDocPrivateTag = getJSDocPrivateTag;
    function getJSDocPrivateTagNoCache(node) {
      return getFirstJSDocTag(node, ts2.isJSDocPrivateTag, true);
    }
    ts2.getJSDocPrivateTagNoCache = getJSDocPrivateTagNoCache;
    function getJSDocProtectedTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocProtectedTag);
    }
    ts2.getJSDocProtectedTag = getJSDocProtectedTag;
    function getJSDocProtectedTagNoCache(node) {
      return getFirstJSDocTag(node, ts2.isJSDocProtectedTag, true);
    }
    ts2.getJSDocProtectedTagNoCache = getJSDocProtectedTagNoCache;
    function getJSDocReadonlyTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocReadonlyTag);
    }
    ts2.getJSDocReadonlyTag = getJSDocReadonlyTag;
    function getJSDocReadonlyTagNoCache(node) {
      return getFirstJSDocTag(node, ts2.isJSDocReadonlyTag, true);
    }
    ts2.getJSDocReadonlyTagNoCache = getJSDocReadonlyTagNoCache;
    function getJSDocOverrideTagNoCache(node) {
      return getFirstJSDocTag(node, ts2.isJSDocOverrideTag, true);
    }
    ts2.getJSDocOverrideTagNoCache = getJSDocOverrideTagNoCache;
    function getJSDocDeprecatedTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocDeprecatedTag);
    }
    ts2.getJSDocDeprecatedTag = getJSDocDeprecatedTag;
    function getJSDocDeprecatedTagNoCache(node) {
      return getFirstJSDocTag(node, ts2.isJSDocDeprecatedTag, true);
    }
    ts2.getJSDocDeprecatedTagNoCache = getJSDocDeprecatedTagNoCache;
    function getJSDocEnumTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocEnumTag);
    }
    ts2.getJSDocEnumTag = getJSDocEnumTag;
    function getJSDocThisTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocThisTag);
    }
    ts2.getJSDocThisTag = getJSDocThisTag;
    function getJSDocReturnTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocReturnTag);
    }
    ts2.getJSDocReturnTag = getJSDocReturnTag;
    function getJSDocTemplateTag(node) {
      return getFirstJSDocTag(node, ts2.isJSDocTemplateTag);
    }
    ts2.getJSDocTemplateTag = getJSDocTemplateTag;
    function getJSDocTypeTag(node) {
      var tag = getFirstJSDocTag(node, ts2.isJSDocTypeTag);
      if (tag && tag.typeExpression && tag.typeExpression.type) {
        return tag;
      }
      return void 0;
    }
    ts2.getJSDocTypeTag = getJSDocTypeTag;
    function getJSDocType(node) {
      var tag = getFirstJSDocTag(node, ts2.isJSDocTypeTag);
      if (!tag && ts2.isParameter(node)) {
        tag = ts2.find(getJSDocParameterTags(node), function(tag2) {
          return !!tag2.typeExpression;
        });
      }
      return tag && tag.typeExpression && tag.typeExpression.type;
    }
    ts2.getJSDocType = getJSDocType;
    function getJSDocReturnType(node) {
      var returnTag = getJSDocReturnTag(node);
      if (returnTag && returnTag.typeExpression) {
        return returnTag.typeExpression.type;
      }
      var typeTag = getJSDocTypeTag(node);
      if (typeTag && typeTag.typeExpression) {
        var type = typeTag.typeExpression.type;
        if (ts2.isTypeLiteralNode(type)) {
          var sig = ts2.find(type.members, ts2.isCallSignatureDeclaration);
          return sig && sig.type;
        }
        if (ts2.isFunctionTypeNode(type) || ts2.isJSDocFunctionType(type)) {
          return type.type;
        }
      }
    }
    ts2.getJSDocReturnType = getJSDocReturnType;
    function getJSDocTagsWorker(node, noCache) {
      var tags = node.jsDocCache;
      if (tags === void 0 || noCache) {
        var comments = ts2.getJSDocCommentsAndTags(node, noCache);
        ts2.Debug.assert(comments.length < 2 || comments[0] !== comments[1]);
        tags = ts2.flatMap(comments, function(j) {
          return ts2.isJSDoc(j) ? j.tags : j;
        });
        if (!noCache) {
          node.jsDocCache = tags;
        }
      }
      return tags;
    }
    function getJSDocTags(node) {
      return getJSDocTagsWorker(node, false);
    }
    ts2.getJSDocTags = getJSDocTags;
    function getJSDocTagsNoCache(node) {
      return getJSDocTagsWorker(node, true);
    }
    ts2.getJSDocTagsNoCache = getJSDocTagsNoCache;
    function getFirstJSDocTag(node, predicate, noCache) {
      return ts2.find(getJSDocTagsWorker(node, noCache), predicate);
    }
    function getAllJSDocTags(node, predicate) {
      return getJSDocTags(node).filter(predicate);
    }
    ts2.getAllJSDocTags = getAllJSDocTags;
    function getAllJSDocTagsOfKind(node, kind) {
      return getJSDocTags(node).filter(function(doc) {
        return doc.kind === kind;
      });
    }
    ts2.getAllJSDocTagsOfKind = getAllJSDocTagsOfKind;
    function getTextOfJSDocComment(comment) {
      return typeof comment === "string" ? comment : comment === null || comment === void 0 ? void 0 : comment.map(function(c) {
        return c.kind === 319 ? c.text : "{@link ".concat(c.name ? ts2.entityNameToString(c.name) + " " : "").concat(c.text, "}");
      }).join("");
    }
    ts2.getTextOfJSDocComment = getTextOfJSDocComment;
    function getEffectiveTypeParameterDeclarations(node) {
      if (ts2.isJSDocSignature(node)) {
        return ts2.emptyArray;
      }
      if (ts2.isJSDocTypeAlias(node)) {
        ts2.Debug.assert(node.parent.kind === 318);
        return ts2.flatMap(node.parent.tags, function(tag) {
          return ts2.isJSDocTemplateTag(tag) ? tag.typeParameters : void 0;
        });
      }
      if (node.typeParameters) {
        return node.typeParameters;
      }
      if (ts2.isInJSFile(node)) {
        var decls = ts2.getJSDocTypeParameterDeclarations(node);
        if (decls.length) {
          return decls;
        }
        var typeTag = getJSDocType(node);
        if (typeTag && ts2.isFunctionTypeNode(typeTag) && typeTag.typeParameters) {
          return typeTag.typeParameters;
        }
      }
      return ts2.emptyArray;
    }
    ts2.getEffectiveTypeParameterDeclarations = getEffectiveTypeParameterDeclarations;
    function getEffectiveConstraintOfTypeParameter(node) {
      return node.constraint ? node.constraint : ts2.isJSDocTemplateTag(node.parent) && node === node.parent.typeParameters[0] ? node.parent.constraint : void 0;
    }
    ts2.getEffectiveConstraintOfTypeParameter = getEffectiveConstraintOfTypeParameter;
    function isMemberName(node) {
      return node.kind === 79 || node.kind === 80;
    }
    ts2.isMemberName = isMemberName;
    function isGetOrSetAccessorDeclaration(node) {
      return node.kind === 172 || node.kind === 171;
    }
    ts2.isGetOrSetAccessorDeclaration = isGetOrSetAccessorDeclaration;
    function isPropertyAccessChain(node) {
      return ts2.isPropertyAccessExpression(node) && !!(node.flags & 32);
    }
    ts2.isPropertyAccessChain = isPropertyAccessChain;
    function isElementAccessChain(node) {
      return ts2.isElementAccessExpression(node) && !!(node.flags & 32);
    }
    ts2.isElementAccessChain = isElementAccessChain;
    function isCallChain(node) {
      return ts2.isCallExpression(node) && !!(node.flags & 32);
    }
    ts2.isCallChain = isCallChain;
    function isOptionalChain(node) {
      var kind = node.kind;
      return !!(node.flags & 32) && (kind === 205 || kind === 206 || kind === 207 || kind === 229);
    }
    ts2.isOptionalChain = isOptionalChain;
    function isOptionalChainRoot(node) {
      return isOptionalChain(node) && !ts2.isNonNullExpression(node) && !!node.questionDotToken;
    }
    ts2.isOptionalChainRoot = isOptionalChainRoot;
    function isExpressionOfOptionalChainRoot(node) {
      return isOptionalChainRoot(node.parent) && node.parent.expression === node;
    }
    ts2.isExpressionOfOptionalChainRoot = isExpressionOfOptionalChainRoot;
    function isOutermostOptionalChain(node) {
      return !isOptionalChain(node.parent) || isOptionalChainRoot(node.parent) || node !== node.parent.expression;
    }
    ts2.isOutermostOptionalChain = isOutermostOptionalChain;
    function isNullishCoalesce(node) {
      return node.kind === 220 && node.operatorToken.kind === 60;
    }
    ts2.isNullishCoalesce = isNullishCoalesce;
    function isConstTypeReference(node) {
      return ts2.isTypeReferenceNode(node) && ts2.isIdentifier(node.typeName) && node.typeName.escapedText === "const" && !node.typeArguments;
    }
    ts2.isConstTypeReference = isConstTypeReference;
    function skipPartiallyEmittedExpressions(node) {
      return ts2.skipOuterExpressions(node, 8);
    }
    ts2.skipPartiallyEmittedExpressions = skipPartiallyEmittedExpressions;
    function isNonNullChain(node) {
      return ts2.isNonNullExpression(node) && !!(node.flags & 32);
    }
    ts2.isNonNullChain = isNonNullChain;
    function isBreakOrContinueStatement(node) {
      return node.kind === 245 || node.kind === 244;
    }
    ts2.isBreakOrContinueStatement = isBreakOrContinueStatement;
    function isNamedExportBindings(node) {
      return node.kind === 273 || node.kind === 272;
    }
    ts2.isNamedExportBindings = isNamedExportBindings;
    function isUnparsedTextLike(node) {
      switch (node.kind) {
        case 300:
        case 301:
          return true;
        default:
          return false;
      }
    }
    ts2.isUnparsedTextLike = isUnparsedTextLike;
    function isUnparsedNode(node) {
      return isUnparsedTextLike(node) || node.kind === 298 || node.kind === 302;
    }
    ts2.isUnparsedNode = isUnparsedNode;
    function isJSDocPropertyLikeTag(node) {
      return node.kind === 345 || node.kind === 338;
    }
    ts2.isJSDocPropertyLikeTag = isJSDocPropertyLikeTag;
    function isNode(node) {
      return isNodeKind(node.kind);
    }
    ts2.isNode = isNode;
    function isNodeKind(kind) {
      return kind >= 160;
    }
    ts2.isNodeKind = isNodeKind;
    function isTokenKind(kind) {
      return kind >= 0 && kind <= 159;
    }
    ts2.isTokenKind = isTokenKind;
    function isToken(n) {
      return isTokenKind(n.kind);
    }
    ts2.isToken = isToken;
    function isNodeArray(array) {
      return array.hasOwnProperty("pos") && array.hasOwnProperty("end");
    }
    ts2.isNodeArray = isNodeArray;
    function isLiteralKind(kind) {
      return 8 <= kind && kind <= 14;
    }
    ts2.isLiteralKind = isLiteralKind;
    function isLiteralExpression(node) {
      return isLiteralKind(node.kind);
    }
    ts2.isLiteralExpression = isLiteralExpression;
    function isTemplateLiteralKind(kind) {
      return 14 <= kind && kind <= 17;
    }
    ts2.isTemplateLiteralKind = isTemplateLiteralKind;
    function isTemplateLiteralToken(node) {
      return isTemplateLiteralKind(node.kind);
    }
    ts2.isTemplateLiteralToken = isTemplateLiteralToken;
    function isTemplateMiddleOrTemplateTail(node) {
      var kind = node.kind;
      return kind === 16 || kind === 17;
    }
    ts2.isTemplateMiddleOrTemplateTail = isTemplateMiddleOrTemplateTail;
    function isImportOrExportSpecifier(node) {
      return ts2.isImportSpecifier(node) || ts2.isExportSpecifier(node);
    }
    ts2.isImportOrExportSpecifier = isImportOrExportSpecifier;
    function isTypeOnlyImportOrExportDeclaration(node) {
      switch (node.kind) {
        case 269:
        case 274:
          return node.isTypeOnly || node.parent.parent.isTypeOnly;
        case 267:
          return node.parent.isTypeOnly;
        case 266:
        case 264:
          return node.isTypeOnly;
        default:
          return false;
      }
    }
    ts2.isTypeOnlyImportOrExportDeclaration = isTypeOnlyImportOrExportDeclaration;
    function isAssertionKey(node) {
      return ts2.isStringLiteral(node) || ts2.isIdentifier(node);
    }
    ts2.isAssertionKey = isAssertionKey;
    function isStringTextContainingNode(node) {
      return node.kind === 10 || isTemplateLiteralKind(node.kind);
    }
    ts2.isStringTextContainingNode = isStringTextContainingNode;
    function isGeneratedIdentifier(node) {
      return ts2.isIdentifier(node) && (node.autoGenerateFlags & 7) > 0;
    }
    ts2.isGeneratedIdentifier = isGeneratedIdentifier;
    function isPrivateIdentifierClassElementDeclaration(node) {
      return (ts2.isPropertyDeclaration(node) || isMethodOrAccessor(node)) && ts2.isPrivateIdentifier(node.name);
    }
    ts2.isPrivateIdentifierClassElementDeclaration = isPrivateIdentifierClassElementDeclaration;
    function isPrivateIdentifierPropertyAccessExpression(node) {
      return ts2.isPropertyAccessExpression(node) && ts2.isPrivateIdentifier(node.name);
    }
    ts2.isPrivateIdentifierPropertyAccessExpression = isPrivateIdentifierPropertyAccessExpression;
    function isModifierKind(token) {
      switch (token) {
        case 126:
        case 131:
        case 85:
        case 135:
        case 88:
        case 93:
        case 123:
        case 121:
        case 122:
        case 144:
        case 124:
        case 158:
          return true;
      }
      return false;
    }
    ts2.isModifierKind = isModifierKind;
    function isParameterPropertyModifier(kind) {
      return !!(ts2.modifierToFlag(kind) & 16476);
    }
    ts2.isParameterPropertyModifier = isParameterPropertyModifier;
    function isClassMemberModifier(idToken) {
      return isParameterPropertyModifier(idToken) || idToken === 124 || idToken === 158;
    }
    ts2.isClassMemberModifier = isClassMemberModifier;
    function isModifier(node) {
      return isModifierKind(node.kind);
    }
    ts2.isModifier = isModifier;
    function isEntityName(node) {
      var kind = node.kind;
      return kind === 160 || kind === 79;
    }
    ts2.isEntityName = isEntityName;
    function isPropertyName(node) {
      var kind = node.kind;
      return kind === 79 || kind === 80 || kind === 10 || kind === 8 || kind === 161;
    }
    ts2.isPropertyName = isPropertyName;
    function isBindingName(node) {
      var kind = node.kind;
      return kind === 79 || kind === 200 || kind === 201;
    }
    ts2.isBindingName = isBindingName;
    function isFunctionLike(node) {
      return !!node && isFunctionLikeKind(node.kind);
    }
    ts2.isFunctionLike = isFunctionLike;
    function isFunctionLikeOrClassStaticBlockDeclaration(node) {
      return !!node && (isFunctionLikeKind(node.kind) || ts2.isClassStaticBlockDeclaration(node));
    }
    ts2.isFunctionLikeOrClassStaticBlockDeclaration = isFunctionLikeOrClassStaticBlockDeclaration;
    function isFunctionLikeDeclaration(node) {
      return node && isFunctionLikeDeclarationKind(node.kind);
    }
    ts2.isFunctionLikeDeclaration = isFunctionLikeDeclaration;
    function isBooleanLiteral(node) {
      return node.kind === 110 || node.kind === 95;
    }
    ts2.isBooleanLiteral = isBooleanLiteral;
    function isFunctionLikeDeclarationKind(kind) {
      switch (kind) {
        case 255:
        case 168:
        case 170:
        case 171:
        case 172:
        case 212:
        case 213:
          return true;
        default:
          return false;
      }
    }
    function isFunctionLikeKind(kind) {
      switch (kind) {
        case 167:
        case 173:
        case 321:
        case 174:
        case 175:
        case 178:
        case 315:
        case 179:
          return true;
        default:
          return isFunctionLikeDeclarationKind(kind);
      }
    }
    ts2.isFunctionLikeKind = isFunctionLikeKind;
    function isFunctionOrModuleBlock(node) {
      return ts2.isSourceFile(node) || ts2.isModuleBlock(node) || ts2.isBlock(node) && isFunctionLike(node.parent);
    }
    ts2.isFunctionOrModuleBlock = isFunctionOrModuleBlock;
    function isClassElement(node) {
      var kind = node.kind;
      return kind === 170 || kind === 166 || kind === 168 || kind === 171 || kind === 172 || kind === 175 || kind === 169 || kind === 233;
    }
    ts2.isClassElement = isClassElement;
    function isClassLike(node) {
      return node && (node.kind === 256 || node.kind === 225);
    }
    ts2.isClassLike = isClassLike;
    function isAccessor(node) {
      return node && (node.kind === 171 || node.kind === 172);
    }
    ts2.isAccessor = isAccessor;
    function isMethodOrAccessor(node) {
      switch (node.kind) {
        case 168:
        case 171:
        case 172:
          return true;
        default:
          return false;
      }
    }
    ts2.isMethodOrAccessor = isMethodOrAccessor;
    function isTypeElement(node) {
      var kind = node.kind;
      return kind === 174 || kind === 173 || kind === 165 || kind === 167 || kind === 175;
    }
    ts2.isTypeElement = isTypeElement;
    function isClassOrTypeElement(node) {
      return isTypeElement(node) || isClassElement(node);
    }
    ts2.isClassOrTypeElement = isClassOrTypeElement;
    function isObjectLiteralElementLike(node) {
      var kind = node.kind;
      return kind === 294 || kind === 295 || kind === 296 || kind === 168 || kind === 171 || kind === 172;
    }
    ts2.isObjectLiteralElementLike = isObjectLiteralElementLike;
    function isTypeNode(node) {
      return ts2.isTypeNodeKind(node.kind);
    }
    ts2.isTypeNode = isTypeNode;
    function isFunctionOrConstructorTypeNode(node) {
      switch (node.kind) {
        case 178:
        case 179:
          return true;
      }
      return false;
    }
    ts2.isFunctionOrConstructorTypeNode = isFunctionOrConstructorTypeNode;
    function isBindingPattern(node) {
      if (node) {
        var kind = node.kind;
        return kind === 201 || kind === 200;
      }
      return false;
    }
    ts2.isBindingPattern = isBindingPattern;
    function isAssignmentPattern(node) {
      var kind = node.kind;
      return kind === 203 || kind === 204;
    }
    ts2.isAssignmentPattern = isAssignmentPattern;
    function isArrayBindingElement(node) {
      var kind = node.kind;
      return kind === 202 || kind === 226;
    }
    ts2.isArrayBindingElement = isArrayBindingElement;
    function isDeclarationBindingElement(bindingElement) {
      switch (bindingElement.kind) {
        case 253:
        case 163:
        case 202:
          return true;
      }
      return false;
    }
    ts2.isDeclarationBindingElement = isDeclarationBindingElement;
    function isBindingOrAssignmentPattern(node) {
      return isObjectBindingOrAssignmentPattern(node) || isArrayBindingOrAssignmentPattern(node);
    }
    ts2.isBindingOrAssignmentPattern = isBindingOrAssignmentPattern;
    function isObjectBindingOrAssignmentPattern(node) {
      switch (node.kind) {
        case 200:
        case 204:
          return true;
      }
      return false;
    }
    ts2.isObjectBindingOrAssignmentPattern = isObjectBindingOrAssignmentPattern;
    function isObjectBindingOrAssignmentElement(node) {
      switch (node.kind) {
        case 202:
        case 294:
        case 295:
        case 296:
          return true;
      }
      return false;
    }
    ts2.isObjectBindingOrAssignmentElement = isObjectBindingOrAssignmentElement;
    function isArrayBindingOrAssignmentPattern(node) {
      switch (node.kind) {
        case 201:
        case 203:
          return true;
      }
      return false;
    }
    ts2.isArrayBindingOrAssignmentPattern = isArrayBindingOrAssignmentPattern;
    function isPropertyAccessOrQualifiedNameOrImportTypeNode(node) {
      var kind = node.kind;
      return kind === 205 || kind === 160 || kind === 199;
    }
    ts2.isPropertyAccessOrQualifiedNameOrImportTypeNode = isPropertyAccessOrQualifiedNameOrImportTypeNode;
    function isPropertyAccessOrQualifiedName(node) {
      var kind = node.kind;
      return kind === 205 || kind === 160;
    }
    ts2.isPropertyAccessOrQualifiedName = isPropertyAccessOrQualifiedName;
    function isCallLikeExpression(node) {
      switch (node.kind) {
        case 279:
        case 278:
        case 207:
        case 208:
        case 209:
        case 164:
          return true;
        default:
          return false;
      }
    }
    ts2.isCallLikeExpression = isCallLikeExpression;
    function isCallOrNewExpression(node) {
      return node.kind === 207 || node.kind === 208;
    }
    ts2.isCallOrNewExpression = isCallOrNewExpression;
    function isTemplateLiteral(node) {
      var kind = node.kind;
      return kind === 222 || kind === 14;
    }
    ts2.isTemplateLiteral = isTemplateLiteral;
    function isLeftHandSideExpression(node) {
      return isLeftHandSideExpressionKind(skipPartiallyEmittedExpressions(node).kind);
    }
    ts2.isLeftHandSideExpression = isLeftHandSideExpression;
    function isLeftHandSideExpressionKind(kind) {
      switch (kind) {
        case 205:
        case 206:
        case 208:
        case 207:
        case 277:
        case 278:
        case 281:
        case 209:
        case 203:
        case 211:
        case 204:
        case 225:
        case 212:
        case 79:
        case 80:
        case 13:
        case 8:
        case 9:
        case 10:
        case 14:
        case 222:
        case 95:
        case 104:
        case 108:
        case 110:
        case 106:
        case 229:
        case 230:
        case 100:
          return true;
        default:
          return false;
      }
    }
    function isUnaryExpression(node) {
      return isUnaryExpressionKind(skipPartiallyEmittedExpressions(node).kind);
    }
    ts2.isUnaryExpression = isUnaryExpression;
    function isUnaryExpressionKind(kind) {
      switch (kind) {
        case 218:
        case 219:
        case 214:
        case 215:
        case 216:
        case 217:
        case 210:
          return true;
        default:
          return isLeftHandSideExpressionKind(kind);
      }
    }
    function isUnaryExpressionWithWrite(expr) {
      switch (expr.kind) {
        case 219:
          return true;
        case 218:
          return expr.operator === 45 || expr.operator === 46;
        default:
          return false;
      }
    }
    ts2.isUnaryExpressionWithWrite = isUnaryExpressionWithWrite;
    function isExpression(node) {
      return isExpressionKind(skipPartiallyEmittedExpressions(node).kind);
    }
    ts2.isExpression = isExpression;
    function isExpressionKind(kind) {
      switch (kind) {
        case 221:
        case 223:
        case 213:
        case 220:
        case 224:
        case 228:
        case 226:
        case 349:
        case 348:
          return true;
        default:
          return isUnaryExpressionKind(kind);
      }
    }
    function isAssertionExpression(node) {
      var kind = node.kind;
      return kind === 210 || kind === 228;
    }
    ts2.isAssertionExpression = isAssertionExpression;
    function isNotEmittedOrPartiallyEmittedNode(node) {
      return ts2.isNotEmittedStatement(node) || ts2.isPartiallyEmittedExpression(node);
    }
    ts2.isNotEmittedOrPartiallyEmittedNode = isNotEmittedOrPartiallyEmittedNode;
    function isIterationStatement(node, lookInLabeledStatements) {
      switch (node.kind) {
        case 241:
        case 242:
        case 243:
        case 239:
        case 240:
          return true;
        case 249:
          return lookInLabeledStatements && isIterationStatement(node.statement, lookInLabeledStatements);
      }
      return false;
    }
    ts2.isIterationStatement = isIterationStatement;
    function isScopeMarker(node) {
      return ts2.isExportAssignment(node) || ts2.isExportDeclaration(node);
    }
    ts2.isScopeMarker = isScopeMarker;
    function hasScopeMarker(statements) {
      return ts2.some(statements, isScopeMarker);
    }
    ts2.hasScopeMarker = hasScopeMarker;
    function needsScopeMarker(result) {
      return !ts2.isAnyImportOrReExport(result) && !ts2.isExportAssignment(result) && !ts2.hasSyntacticModifier(result, 1) && !ts2.isAmbientModule(result);
    }
    ts2.needsScopeMarker = needsScopeMarker;
    function isExternalModuleIndicator(result) {
      return ts2.isAnyImportOrReExport(result) || ts2.isExportAssignment(result) || ts2.hasSyntacticModifier(result, 1);
    }
    ts2.isExternalModuleIndicator = isExternalModuleIndicator;
    function isForInOrOfStatement(node) {
      return node.kind === 242 || node.kind === 243;
    }
    ts2.isForInOrOfStatement = isForInOrOfStatement;
    function isConciseBody(node) {
      return ts2.isBlock(node) || isExpression(node);
    }
    ts2.isConciseBody = isConciseBody;
    function isFunctionBody(node) {
      return ts2.isBlock(node);
    }
    ts2.isFunctionBody = isFunctionBody;
    function isForInitializer(node) {
      return ts2.isVariableDeclarationList(node) || isExpression(node);
    }
    ts2.isForInitializer = isForInitializer;
    function isModuleBody(node) {
      var kind = node.kind;
      return kind === 261 || kind === 260 || kind === 79;
    }
    ts2.isModuleBody = isModuleBody;
    function isNamespaceBody(node) {
      var kind = node.kind;
      return kind === 261 || kind === 260;
    }
    ts2.isNamespaceBody = isNamespaceBody;
    function isJSDocNamespaceBody(node) {
      var kind = node.kind;
      return kind === 79 || kind === 260;
    }
    ts2.isJSDocNamespaceBody = isJSDocNamespaceBody;
    function isNamedImportBindings(node) {
      var kind = node.kind;
      return kind === 268 || kind === 267;
    }
    ts2.isNamedImportBindings = isNamedImportBindings;
    function isModuleOrEnumDeclaration(node) {
      return node.kind === 260 || node.kind === 259;
    }
    ts2.isModuleOrEnumDeclaration = isModuleOrEnumDeclaration;
    function isDeclarationKind(kind) {
      return kind === 213 || kind === 202 || kind === 256 || kind === 225 || kind === 169 || kind === 170 || kind === 259 || kind === 297 || kind === 274 || kind === 255 || kind === 212 || kind === 171 || kind === 266 || kind === 264 || kind === 269 || kind === 257 || kind === 284 || kind === 168 || kind === 167 || kind === 260 || kind === 263 || kind === 267 || kind === 273 || kind === 163 || kind === 294 || kind === 166 || kind === 165 || kind === 172 || kind === 295 || kind === 258 || kind === 162 || kind === 253 || kind === 343 || kind === 336 || kind === 345;
    }
    function isDeclarationStatementKind(kind) {
      return kind === 255 || kind === 275 || kind === 256 || kind === 257 || kind === 258 || kind === 259 || kind === 260 || kind === 265 || kind === 264 || kind === 271 || kind === 270 || kind === 263;
    }
    function isStatementKindButNotDeclarationKind(kind) {
      return kind === 245 || kind === 244 || kind === 252 || kind === 239 || kind === 237 || kind === 235 || kind === 242 || kind === 243 || kind === 241 || kind === 238 || kind === 249 || kind === 246 || kind === 248 || kind === 250 || kind === 251 || kind === 236 || kind === 240 || kind === 247 || kind === 347 || kind === 351 || kind === 350;
    }
    function isDeclaration(node) {
      if (node.kind === 162) {
        return node.parent && node.parent.kind !== 342 || ts2.isInJSFile(node);
      }
      return isDeclarationKind(node.kind);
    }
    ts2.isDeclaration = isDeclaration;
    function isDeclarationStatement(node) {
      return isDeclarationStatementKind(node.kind);
    }
    ts2.isDeclarationStatement = isDeclarationStatement;
    function isStatementButNotDeclaration(node) {
      return isStatementKindButNotDeclarationKind(node.kind);
    }
    ts2.isStatementButNotDeclaration = isStatementButNotDeclaration;
    function isStatement(node) {
      var kind = node.kind;
      return isStatementKindButNotDeclarationKind(kind) || isDeclarationStatementKind(kind) || isBlockStatement(node);
    }
    ts2.isStatement = isStatement;
    function isBlockStatement(node) {
      if (node.kind !== 234)
        return false;
      if (node.parent !== void 0) {
        if (node.parent.kind === 251 || node.parent.kind === 291) {
          return false;
        }
      }
      return !ts2.isFunctionBlock(node);
    }
    function isStatementOrBlock(node) {
      var kind = node.kind;
      return isStatementKindButNotDeclarationKind(kind) || isDeclarationStatementKind(kind) || kind === 234;
    }
    ts2.isStatementOrBlock = isStatementOrBlock;
    function isModuleReference(node) {
      var kind = node.kind;
      return kind === 276 || kind === 160 || kind === 79;
    }
    ts2.isModuleReference = isModuleReference;
    function isJsxTagNameExpression(node) {
      var kind = node.kind;
      return kind === 108 || kind === 79 || kind === 205;
    }
    ts2.isJsxTagNameExpression = isJsxTagNameExpression;
    function isJsxChild(node) {
      var kind = node.kind;
      return kind === 277 || kind === 287 || kind === 278 || kind === 11 || kind === 281;
    }
    ts2.isJsxChild = isJsxChild;
    function isJsxAttributeLike(node) {
      var kind = node.kind;
      return kind === 284 || kind === 286;
    }
    ts2.isJsxAttributeLike = isJsxAttributeLike;
    function isStringLiteralOrJsxExpression(node) {
      var kind = node.kind;
      return kind === 10 || kind === 287;
    }
    ts2.isStringLiteralOrJsxExpression = isStringLiteralOrJsxExpression;
    function isJsxOpeningLikeElement(node) {
      var kind = node.kind;
      return kind === 279 || kind === 278;
    }
    ts2.isJsxOpeningLikeElement = isJsxOpeningLikeElement;
    function isCaseOrDefaultClause(node) {
      var kind = node.kind;
      return kind === 288 || kind === 289;
    }
    ts2.isCaseOrDefaultClause = isCaseOrDefaultClause;
    function isJSDocNode(node) {
      return node.kind >= 307 && node.kind <= 345;
    }
    ts2.isJSDocNode = isJSDocNode;
    function isJSDocCommentContainingNode(node) {
      return node.kind === 318 || node.kind === 317 || node.kind === 319 || isJSDocLinkLike(node) || isJSDocTag(node) || ts2.isJSDocTypeLiteral(node) || ts2.isJSDocSignature(node);
    }
    ts2.isJSDocCommentContainingNode = isJSDocCommentContainingNode;
    function isJSDocTag(node) {
      return node.kind >= 325 && node.kind <= 345;
    }
    ts2.isJSDocTag = isJSDocTag;
    function isSetAccessor(node) {
      return node.kind === 172;
    }
    ts2.isSetAccessor = isSetAccessor;
    function isGetAccessor(node) {
      return node.kind === 171;
    }
    ts2.isGetAccessor = isGetAccessor;
    function hasJSDocNodes(node) {
      var jsDoc = node.jsDoc;
      return !!jsDoc && jsDoc.length > 0;
    }
    ts2.hasJSDocNodes = hasJSDocNodes;
    function hasType(node) {
      return !!node.type;
    }
    ts2.hasType = hasType;
    function hasInitializer(node) {
      return !!node.initializer;
    }
    ts2.hasInitializer = hasInitializer;
    function hasOnlyExpressionInitializer(node) {
      switch (node.kind) {
        case 253:
        case 163:
        case 202:
        case 165:
        case 166:
        case 294:
        case 297:
          return true;
        default:
          return false;
      }
    }
    ts2.hasOnlyExpressionInitializer = hasOnlyExpressionInitializer;
    function isObjectLiteralElement(node) {
      return node.kind === 284 || node.kind === 286 || isObjectLiteralElementLike(node);
    }
    ts2.isObjectLiteralElement = isObjectLiteralElement;
    function isTypeReferenceType(node) {
      return node.kind === 177 || node.kind === 227;
    }
    ts2.isTypeReferenceType = isTypeReferenceType;
    var MAX_SMI_X86 = 1073741823;
    function guessIndentation(lines) {
      var indentation = MAX_SMI_X86;
      for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
        var line = lines_1[_i];
        if (!line.length) {
          continue;
        }
        var i = 0;
        for (; i < line.length && i < indentation; i++) {
          if (!ts2.isWhiteSpaceLike(line.charCodeAt(i))) {
            break;
          }
        }
        if (i < indentation) {
          indentation = i;
        }
        if (indentation === 0) {
          return 0;
        }
      }
      return indentation === MAX_SMI_X86 ? void 0 : indentation;
    }
    ts2.guessIndentation = guessIndentation;
    function isStringLiteralLike(node) {
      return node.kind === 10 || node.kind === 14;
    }
    ts2.isStringLiteralLike = isStringLiteralLike;
    function isJSDocLinkLike(node) {
      return node.kind === 322 || node.kind === 323 || node.kind === 324;
    }
    ts2.isJSDocLinkLike = isJSDocLinkLike;
  })(ts || (ts = {}));
  (function(ts2) {
    ts2.resolvingEmptyArray = [];
    ts2.externalHelpersModuleNameText = "tslib";
    ts2.defaultMaximumTruncationLength = 160;
    ts2.noTruncationMaximumTruncationLength = 1e6;
    function getDeclarationOfKind(symbol, kind) {
      var declarations = symbol.declarations;
      if (declarations) {
        for (var _i = 0, declarations_1 = declarations; _i < declarations_1.length; _i++) {
          var declaration = declarations_1[_i];
          if (declaration.kind === kind) {
            return declaration;
          }
        }
      }
      return void 0;
    }
    ts2.getDeclarationOfKind = getDeclarationOfKind;
    function createUnderscoreEscapedMap() {
      return new ts2.Map();
    }
    ts2.createUnderscoreEscapedMap = createUnderscoreEscapedMap;
    function hasEntries(map) {
      return !!map && !!map.size;
    }
    ts2.hasEntries = hasEntries;
    function createSymbolTable(symbols) {
      var result = new ts2.Map();
      if (symbols) {
        for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
          var symbol = symbols_1[_i];
          result.set(symbol.escapedName, symbol);
        }
      }
      return result;
    }
    ts2.createSymbolTable = createSymbolTable;
    function isTransientSymbol(symbol) {
      return (symbol.flags & 33554432) !== 0;
    }
    ts2.isTransientSymbol = isTransientSymbol;
    var stringWriter = createSingleLineStringWriter();
    function createSingleLineStringWriter() {
      var str = "";
      var writeText = function(text) {
        return str += text;
      };
      return {
        getText: function() {
          return str;
        },
        write: writeText,
        rawWrite: writeText,
        writeKeyword: writeText,
        writeOperator: writeText,
        writePunctuation: writeText,
        writeSpace: writeText,
        writeStringLiteral: writeText,
        writeLiteral: writeText,
        writeParameter: writeText,
        writeProperty: writeText,
        writeSymbol: function(s, _) {
          return writeText(s);
        },
        writeTrailingSemicolon: writeText,
        writeComment: writeText,
        getTextPos: function() {
          return str.length;
        },
        getLine: function() {
          return 0;
        },
        getColumn: function() {
          return 0;
        },
        getIndent: function() {
          return 0;
        },
        isAtStartOfLine: function() {
          return false;
        },
        hasTrailingComment: function() {
          return false;
        },
        hasTrailingWhitespace: function() {
          return !!str.length && ts2.isWhiteSpaceLike(str.charCodeAt(str.length - 1));
        },
        writeLine: function() {
          return str += " ";
        },
        increaseIndent: ts2.noop,
        decreaseIndent: ts2.noop,
        clear: function() {
          return str = "";
        },
        trackSymbol: function() {
          return false;
        },
        reportInaccessibleThisError: ts2.noop,
        reportInaccessibleUniqueSymbolError: ts2.noop,
        reportPrivateInBaseOfClassExpression: ts2.noop
      };
    }
    function changesAffectModuleResolution(oldOptions, newOptions) {
      return oldOptions.configFilePath !== newOptions.configFilePath || optionsHaveModuleResolutionChanges(oldOptions, newOptions);
    }
    ts2.changesAffectModuleResolution = changesAffectModuleResolution;
    function optionsHaveModuleResolutionChanges(oldOptions, newOptions) {
      return optionsHaveChanges(oldOptions, newOptions, ts2.moduleResolutionOptionDeclarations);
    }
    ts2.optionsHaveModuleResolutionChanges = optionsHaveModuleResolutionChanges;
    function changesAffectingProgramStructure(oldOptions, newOptions) {
      return optionsHaveChanges(oldOptions, newOptions, ts2.optionsAffectingProgramStructure);
    }
    ts2.changesAffectingProgramStructure = changesAffectingProgramStructure;
    function optionsHaveChanges(oldOptions, newOptions, optionDeclarations) {
      return oldOptions !== newOptions && optionDeclarations.some(function(o) {
        return !isJsonEqual(getCompilerOptionValue(oldOptions, o), getCompilerOptionValue(newOptions, o));
      });
    }
    ts2.optionsHaveChanges = optionsHaveChanges;
    function forEachAncestor(node, callback) {
      while (true) {
        var res = callback(node);
        if (res === "quit")
          return void 0;
        if (res !== void 0)
          return res;
        if (ts2.isSourceFile(node))
          return void 0;
        node = node.parent;
      }
    }
    ts2.forEachAncestor = forEachAncestor;
    function forEachEntry(map, callback) {
      var iterator = map.entries();
      for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
        var _a = iterResult.value, key = _a[0], value = _a[1];
        var result = callback(value, key);
        if (result) {
          return result;
        }
      }
      return void 0;
    }
    ts2.forEachEntry = forEachEntry;
    function forEachKey(map, callback) {
      var iterator = map.keys();
      for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
        var result = callback(iterResult.value);
        if (result) {
          return result;
        }
      }
      return void 0;
    }
    ts2.forEachKey = forEachKey;
    function copyEntries(source, target) {
      source.forEach(function(value, key) {
        target.set(key, value);
      });
    }
    ts2.copyEntries = copyEntries;
    function usingSingleLineStringWriter(action) {
      var oldString = stringWriter.getText();
      try {
        action(stringWriter);
        return stringWriter.getText();
      } finally {
        stringWriter.clear();
        stringWriter.writeKeyword(oldString);
      }
    }
    ts2.usingSingleLineStringWriter = usingSingleLineStringWriter;
    function getFullWidth(node) {
      return node.end - node.pos;
    }
    ts2.getFullWidth = getFullWidth;
    function getResolvedModule(sourceFile, moduleNameText, mode) {
      return sourceFile && sourceFile.resolvedModules && sourceFile.resolvedModules.get(moduleNameText, mode);
    }
    ts2.getResolvedModule = getResolvedModule;
    function setResolvedModule(sourceFile, moduleNameText, resolvedModule, mode) {
      if (!sourceFile.resolvedModules) {
        sourceFile.resolvedModules = ts2.createModeAwareCache();
      }
      sourceFile.resolvedModules.set(moduleNameText, mode, resolvedModule);
    }
    ts2.setResolvedModule = setResolvedModule;
    function setResolvedTypeReferenceDirective(sourceFile, typeReferenceDirectiveName, resolvedTypeReferenceDirective) {
      if (!sourceFile.resolvedTypeReferenceDirectiveNames) {
        sourceFile.resolvedTypeReferenceDirectiveNames = ts2.createModeAwareCache();
      }
      sourceFile.resolvedTypeReferenceDirectiveNames.set(typeReferenceDirectiveName, void 0, resolvedTypeReferenceDirective);
    }
    ts2.setResolvedTypeReferenceDirective = setResolvedTypeReferenceDirective;
    function projectReferenceIsEqualTo(oldRef, newRef) {
      return oldRef.path === newRef.path && !oldRef.prepend === !newRef.prepend && !oldRef.circular === !newRef.circular;
    }
    ts2.projectReferenceIsEqualTo = projectReferenceIsEqualTo;
    function moduleResolutionIsEqualTo(oldResolution, newResolution) {
      return oldResolution.isExternalLibraryImport === newResolution.isExternalLibraryImport && oldResolution.extension === newResolution.extension && oldResolution.resolvedFileName === newResolution.resolvedFileName && oldResolution.originalPath === newResolution.originalPath && packageIdIsEqual(oldResolution.packageId, newResolution.packageId);
    }
    ts2.moduleResolutionIsEqualTo = moduleResolutionIsEqualTo;
    function packageIdIsEqual(a, b) {
      return a === b || !!a && !!b && a.name === b.name && a.subModuleName === b.subModuleName && a.version === b.version;
    }
    function packageIdToString(_a) {
      var name = _a.name, subModuleName = _a.subModuleName, version = _a.version;
      var fullName = subModuleName ? "".concat(name, "/").concat(subModuleName) : name;
      return "".concat(fullName, "@").concat(version);
    }
    ts2.packageIdToString = packageIdToString;
    function typeDirectiveIsEqualTo(oldResolution, newResolution) {
      return oldResolution.resolvedFileName === newResolution.resolvedFileName && oldResolution.primary === newResolution.primary && oldResolution.originalPath === newResolution.originalPath;
    }
    ts2.typeDirectiveIsEqualTo = typeDirectiveIsEqualTo;
    function hasChangesInResolutions(names, newResolutions, oldResolutions, oldSourceFile, comparer) {
      ts2.Debug.assert(names.length === newResolutions.length);
      for (var i = 0; i < names.length; i++) {
        var newResolution = newResolutions[i];
        var oldResolution = oldResolutions && oldResolutions.get(names[i], oldSourceFile && ts2.getModeForResolutionAtIndex(oldSourceFile, i));
        var changed = oldResolution ? !newResolution || !comparer(oldResolution, newResolution) : newResolution;
        if (changed) {
          return true;
        }
      }
      return false;
    }
    ts2.hasChangesInResolutions = hasChangesInResolutions;
    function containsParseError(node) {
      aggregateChildData(node);
      return (node.flags & 262144) !== 0;
    }
    ts2.containsParseError = containsParseError;
    function aggregateChildData(node) {
      if (!(node.flags & 524288)) {
        var thisNodeOrAnySubNodesHasError = (node.flags & 65536) !== 0 || ts2.forEachChild(node, containsParseError);
        if (thisNodeOrAnySubNodesHasError) {
          node.flags |= 262144;
        }
        node.flags |= 524288;
      }
    }
    function getSourceFileOfNode(node) {
      while (node && node.kind !== 303) {
        node = node.parent;
      }
      return node;
    }
    ts2.getSourceFileOfNode = getSourceFileOfNode;
    function getSourceFileOfModule(module2) {
      return getSourceFileOfNode(module2.valueDeclaration || getNonAugmentationDeclaration(module2));
    }
    ts2.getSourceFileOfModule = getSourceFileOfModule;
    function isStatementWithLocals(node) {
      switch (node.kind) {
        case 234:
        case 262:
        case 241:
        case 242:
        case 243:
          return true;
      }
      return false;
    }
    ts2.isStatementWithLocals = isStatementWithLocals;
    function getStartPositionOfLine(line, sourceFile) {
      ts2.Debug.assert(line >= 0);
      return ts2.getLineStarts(sourceFile)[line];
    }
    ts2.getStartPositionOfLine = getStartPositionOfLine;
    function nodePosToString(node) {
      var file = getSourceFileOfNode(node);
      var loc = ts2.getLineAndCharacterOfPosition(file, node.pos);
      return "".concat(file.fileName, "(").concat(loc.line + 1, ",").concat(loc.character + 1, ")");
    }
    ts2.nodePosToString = nodePosToString;
    function getEndLinePosition(line, sourceFile) {
      ts2.Debug.assert(line >= 0);
      var lineStarts = ts2.getLineStarts(sourceFile);
      var lineIndex = line;
      var sourceText = sourceFile.text;
      if (lineIndex + 1 === lineStarts.length) {
        return sourceText.length - 1;
      } else {
        var start = lineStarts[lineIndex];
        var pos = lineStarts[lineIndex + 1] - 1;
        ts2.Debug.assert(ts2.isLineBreak(sourceText.charCodeAt(pos)));
        while (start <= pos && ts2.isLineBreak(sourceText.charCodeAt(pos))) {
          pos--;
        }
        return pos;
      }
    }
    ts2.getEndLinePosition = getEndLinePosition;
    function isFileLevelUniqueName(sourceFile, name, hasGlobalName) {
      return !(hasGlobalName && hasGlobalName(name)) && !sourceFile.identifiers.has(name);
    }
    ts2.isFileLevelUniqueName = isFileLevelUniqueName;
    function nodeIsMissing(node) {
      if (node === void 0) {
        return true;
      }
      return node.pos === node.end && node.pos >= 0 && node.kind !== 1;
    }
    ts2.nodeIsMissing = nodeIsMissing;
    function nodeIsPresent(node) {
      return !nodeIsMissing(node);
    }
    ts2.nodeIsPresent = nodeIsPresent;
    function insertStatementsAfterPrologue(to, from, isPrologueDirective2) {
      if (from === void 0 || from.length === 0)
        return to;
      var statementIndex = 0;
      for (; statementIndex < to.length; ++statementIndex) {
        if (!isPrologueDirective2(to[statementIndex])) {
          break;
        }
      }
      to.splice.apply(to, __spreadArray([statementIndex, 0], from, false));
      return to;
    }
    function insertStatementAfterPrologue(to, statement, isPrologueDirective2) {
      if (statement === void 0)
        return to;
      var statementIndex = 0;
      for (; statementIndex < to.length; ++statementIndex) {
        if (!isPrologueDirective2(to[statementIndex])) {
          break;
        }
      }
      to.splice(statementIndex, 0, statement);
      return to;
    }
    function isAnyPrologueDirective(node) {
      return isPrologueDirective(node) || !!(getEmitFlags(node) & 1048576);
    }
    function insertStatementsAfterStandardPrologue(to, from) {
      return insertStatementsAfterPrologue(to, from, isPrologueDirective);
    }
    ts2.insertStatementsAfterStandardPrologue = insertStatementsAfterStandardPrologue;
    function insertStatementsAfterCustomPrologue(to, from) {
      return insertStatementsAfterPrologue(to, from, isAnyPrologueDirective);
    }
    ts2.insertStatementsAfterCustomPrologue = insertStatementsAfterCustomPrologue;
    function insertStatementAfterStandardPrologue(to, statement) {
      return insertStatementAfterPrologue(to, statement, isPrologueDirective);
    }
    ts2.insertStatementAfterStandardPrologue = insertStatementAfterStandardPrologue;
    function insertStatementAfterCustomPrologue(to, statement) {
      return insertStatementAfterPrologue(to, statement, isAnyPrologueDirective);
    }
    ts2.insertStatementAfterCustomPrologue = insertStatementAfterCustomPrologue;
    function isRecognizedTripleSlashComment(text, commentPos, commentEnd) {
      if (text.charCodeAt(commentPos + 1) === 47 && commentPos + 2 < commentEnd && text.charCodeAt(commentPos + 2) === 47) {
        var textSubStr = text.substring(commentPos, commentEnd);
        return ts2.fullTripleSlashReferencePathRegEx.test(textSubStr) || ts2.fullTripleSlashAMDReferencePathRegEx.test(textSubStr) || fullTripleSlashReferenceTypeReferenceDirectiveRegEx.test(textSubStr) || defaultLibReferenceRegEx.test(textSubStr) ? true : false;
      }
      return false;
    }
    ts2.isRecognizedTripleSlashComment = isRecognizedTripleSlashComment;
    function isPinnedComment(text, start) {
      return text.charCodeAt(start + 1) === 42 && text.charCodeAt(start + 2) === 33;
    }
    ts2.isPinnedComment = isPinnedComment;
    function createCommentDirectivesMap(sourceFile, commentDirectives) {
      var directivesByLine = new ts2.Map(commentDirectives.map(function(commentDirective) {
        return [
          "".concat(ts2.getLineAndCharacterOfPosition(sourceFile, commentDirective.range.end).line),
          commentDirective
        ];
      }));
      var usedLines = new ts2.Map();
      return { getUnusedExpectations, markUsed };
      function getUnusedExpectations() {
        return ts2.arrayFrom(directivesByLine.entries()).filter(function(_a) {
          var line = _a[0], directive = _a[1];
          return directive.type === 0 && !usedLines.get(line);
        }).map(function(_a) {
          var _ = _a[0], directive = _a[1];
          return directive;
        });
      }
      function markUsed(line) {
        if (!directivesByLine.has("".concat(line))) {
          return false;
        }
        usedLines.set("".concat(line), true);
        return true;
      }
    }
    ts2.createCommentDirectivesMap = createCommentDirectivesMap;
    function getTokenPosOfNode(node, sourceFile, includeJsDoc) {
      if (nodeIsMissing(node)) {
        return node.pos;
      }
      if (ts2.isJSDocNode(node) || node.kind === 11) {
        return ts2.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos, false, true);
      }
      if (includeJsDoc && ts2.hasJSDocNodes(node)) {
        return getTokenPosOfNode(node.jsDoc[0], sourceFile);
      }
      if (node.kind === 346 && node._children.length > 0) {
        return getTokenPosOfNode(node._children[0], sourceFile, includeJsDoc);
      }
      return ts2.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos, false, false, isInJSDoc(node));
    }
    ts2.getTokenPosOfNode = getTokenPosOfNode;
    function getNonDecoratorTokenPosOfNode(node, sourceFile) {
      if (nodeIsMissing(node) || !node.decorators) {
        return getTokenPosOfNode(node, sourceFile);
      }
      return ts2.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.decorators.end);
    }
    ts2.getNonDecoratorTokenPosOfNode = getNonDecoratorTokenPosOfNode;
    function getSourceTextOfNodeFromSourceFile(sourceFile, node, includeTrivia) {
      if (includeTrivia === void 0) {
        includeTrivia = false;
      }
      return getTextOfNodeFromSourceText(sourceFile.text, node, includeTrivia);
    }
    ts2.getSourceTextOfNodeFromSourceFile = getSourceTextOfNodeFromSourceFile;
    function isJSDocTypeExpressionOrChild(node) {
      return !!ts2.findAncestor(node, ts2.isJSDocTypeExpression);
    }
    function isExportNamespaceAsDefaultDeclaration(node) {
      return !!(ts2.isExportDeclaration(node) && node.exportClause && ts2.isNamespaceExport(node.exportClause) && node.exportClause.name.escapedText === "default");
    }
    ts2.isExportNamespaceAsDefaultDeclaration = isExportNamespaceAsDefaultDeclaration;
    function getTextOfNodeFromSourceText(sourceText, node, includeTrivia) {
      if (includeTrivia === void 0) {
        includeTrivia = false;
      }
      if (nodeIsMissing(node)) {
        return "";
      }
      var text = sourceText.substring(includeTrivia ? node.pos : ts2.skipTrivia(sourceText, node.pos), node.end);
      if (isJSDocTypeExpressionOrChild(node)) {
        text = text.split(/\r\n|\n|\r/).map(function(line) {
          return ts2.trimStringStart(line.replace(/^\s*\*/, ""));
        }).join("\n");
      }
      return text;
    }
    ts2.getTextOfNodeFromSourceText = getTextOfNodeFromSourceText;
    function getTextOfNode(node, includeTrivia) {
      if (includeTrivia === void 0) {
        includeTrivia = false;
      }
      return getSourceTextOfNodeFromSourceFile(getSourceFileOfNode(node), node, includeTrivia);
    }
    ts2.getTextOfNode = getTextOfNode;
    function getPos(range) {
      return range.pos;
    }
    function indexOfNode(nodeArray, node) {
      return ts2.binarySearch(nodeArray, node, getPos, ts2.compareValues);
    }
    ts2.indexOfNode = indexOfNode;
    function getEmitFlags(node) {
      var emitNode = node.emitNode;
      return emitNode && emitNode.flags || 0;
    }
    ts2.getEmitFlags = getEmitFlags;
    ;
    function getScriptTargetFeatures() {
      return {
        es2015: {
          Array: ["find", "findIndex", "fill", "copyWithin", "entries", "keys", "values"],
          RegExp: ["flags", "sticky", "unicode"],
          Reflect: ["apply", "construct", "defineProperty", "deleteProperty", "get", " getOwnPropertyDescriptor", "getPrototypeOf", "has", "isExtensible", "ownKeys", "preventExtensions", "set", "setPrototypeOf"],
          ArrayConstructor: ["from", "of"],
          ObjectConstructor: ["assign", "getOwnPropertySymbols", "keys", "is", "setPrototypeOf"],
          NumberConstructor: ["isFinite", "isInteger", "isNaN", "isSafeInteger", "parseFloat", "parseInt"],
          Math: ["clz32", "imul", "sign", "log10", "log2", "log1p", "expm1", "cosh", "sinh", "tanh", "acosh", "asinh", "atanh", "hypot", "trunc", "fround", "cbrt"],
          Map: ["entries", "keys", "values"],
          Set: ["entries", "keys", "values"],
          Promise: ts2.emptyArray,
          PromiseConstructor: ["all", "race", "reject", "resolve"],
          Symbol: ["for", "keyFor"],
          WeakMap: ["entries", "keys", "values"],
          WeakSet: ["entries", "keys", "values"],
          Iterator: ts2.emptyArray,
          AsyncIterator: ts2.emptyArray,
          String: ["codePointAt", "includes", "endsWith", "normalize", "repeat", "startsWith", "anchor", "big", "blink", "bold", "fixed", "fontcolor", "fontsize", "italics", "link", "small", "strike", "sub", "sup"],
          StringConstructor: ["fromCodePoint", "raw"]
        },
        es2016: {
          Array: ["includes"]
        },
        es2017: {
          Atomics: ts2.emptyArray,
          SharedArrayBuffer: ts2.emptyArray,
          String: ["padStart", "padEnd"],
          ObjectConstructor: ["values", "entries", "getOwnPropertyDescriptors"],
          DateTimeFormat: ["formatToParts"]
        },
        es2018: {
          Promise: ["finally"],
          RegExpMatchArray: ["groups"],
          RegExpExecArray: ["groups"],
          RegExp: ["dotAll"],
          Intl: ["PluralRules"],
          AsyncIterable: ts2.emptyArray,
          AsyncIterableIterator: ts2.emptyArray,
          AsyncGenerator: ts2.emptyArray,
          AsyncGeneratorFunction: ts2.emptyArray
        },
        es2019: {
          Array: ["flat", "flatMap"],
          ObjectConstructor: ["fromEntries"],
          String: ["trimStart", "trimEnd", "trimLeft", "trimRight"],
          Symbol: ["description"]
        },
        es2020: {
          BigInt: ts2.emptyArray,
          BigInt64Array: ts2.emptyArray,
          BigUint64Array: ts2.emptyArray,
          PromiseConstructor: ["allSettled"],
          SymbolConstructor: ["matchAll"],
          String: ["matchAll"],
          DataView: ["setBigInt64", "setBigUint64", "getBigInt64", "getBigUint64"],
          RelativeTimeFormat: ["format", "formatToParts", "resolvedOptions"]
        },
        es2021: {
          PromiseConstructor: ["any"],
          String: ["replaceAll"]
        },
        esnext: {
          NumberFormat: ["formatToParts"]
        }
      };
    }
    ts2.getScriptTargetFeatures = getScriptTargetFeatures;
    var GetLiteralTextFlags;
    (function(GetLiteralTextFlags2) {
      GetLiteralTextFlags2[GetLiteralTextFlags2["None"] = 0] = "None";
      GetLiteralTextFlags2[GetLiteralTextFlags2["NeverAsciiEscape"] = 1] = "NeverAsciiEscape";
      GetLiteralTextFlags2[GetLiteralTextFlags2["JsxAttributeEscape"] = 2] = "JsxAttributeEscape";
      GetLiteralTextFlags2[GetLiteralTextFlags2["TerminateUnterminatedLiterals"] = 4] = "TerminateUnterminatedLiterals";
      GetLiteralTextFlags2[GetLiteralTextFlags2["AllowNumericSeparator"] = 8] = "AllowNumericSeparator";
    })(GetLiteralTextFlags = ts2.GetLiteralTextFlags || (ts2.GetLiteralTextFlags = {}));
    function getLiteralText(node, sourceFile, flags) {
      var _a;
      if (canUseOriginalText(node, flags)) {
        return getSourceTextOfNodeFromSourceFile(sourceFile, node);
      }
      switch (node.kind) {
        case 10: {
          var escapeText = flags & 2 ? escapeJsxAttributeString : flags & 1 || getEmitFlags(node) & 16777216 ? escapeString : escapeNonAsciiString;
          if (node.singleQuote) {
            return "'" + escapeText(node.text, 39) + "'";
          } else {
            return '"' + escapeText(node.text, 34) + '"';
          }
        }
        case 14:
        case 15:
        case 16:
        case 17: {
          var escapeText = flags & 1 || getEmitFlags(node) & 16777216 ? escapeString : escapeNonAsciiString;
          var rawText = (_a = node.rawText) !== null && _a !== void 0 ? _a : escapeTemplateSubstitution(escapeText(node.text, 96));
          switch (node.kind) {
            case 14:
              return "`" + rawText + "`";
            case 15:
              return "`" + rawText + "${";
            case 16:
              return "}" + rawText + "${";
            case 17:
              return "}" + rawText + "`";
          }
          break;
        }
        case 8:
        case 9:
          return node.text;
        case 13:
          if (flags & 4 && node.isUnterminated) {
            return node.text + (node.text.charCodeAt(node.text.length - 1) === 92 ? " /" : "/");
          }
          return node.text;
      }
      return ts2.Debug.fail("Literal kind '".concat(node.kind, "' not accounted for."));
    }
    ts2.getLiteralText = getLiteralText;
    function canUseOriginalText(node, flags) {
      if (nodeIsSynthesized(node) || !node.parent || flags & 4 && node.isUnterminated) {
        return false;
      }
      if (ts2.isNumericLiteral(node) && node.numericLiteralFlags & 512) {
        return !!(flags & 8);
      }
      return !ts2.isBigIntLiteral(node);
    }
    function getTextOfConstantValue(value) {
      return ts2.isString(value) ? '"' + escapeNonAsciiString(value) + '"' : "" + value;
    }
    ts2.getTextOfConstantValue = getTextOfConstantValue;
    function makeIdentifierFromModuleName(moduleName) {
      return ts2.getBaseFileName(moduleName).replace(/^(\d)/, "_$1").replace(/\W/g, "_");
    }
    ts2.makeIdentifierFromModuleName = makeIdentifierFromModuleName;
    function isBlockOrCatchScoped(declaration) {
      return (ts2.getCombinedNodeFlags(declaration) & 3) !== 0 || isCatchClauseVariableDeclarationOrBindingElement(declaration);
    }
    ts2.isBlockOrCatchScoped = isBlockOrCatchScoped;
    function isCatchClauseVariableDeclarationOrBindingElement(declaration) {
      var node = getRootDeclaration(declaration);
      return node.kind === 253 && node.parent.kind === 291;
    }
    ts2.isCatchClauseVariableDeclarationOrBindingElement = isCatchClauseVariableDeclarationOrBindingElement;
    function isAmbientModule(node) {
      return ts2.isModuleDeclaration(node) && (node.name.kind === 10 || isGlobalScopeAugmentation(node));
    }
    ts2.isAmbientModule = isAmbientModule;
    function isModuleWithStringLiteralName(node) {
      return ts2.isModuleDeclaration(node) && node.name.kind === 10;
    }
    ts2.isModuleWithStringLiteralName = isModuleWithStringLiteralName;
    function isNonGlobalAmbientModule(node) {
      return ts2.isModuleDeclaration(node) && ts2.isStringLiteral(node.name);
    }
    ts2.isNonGlobalAmbientModule = isNonGlobalAmbientModule;
    function isEffectiveModuleDeclaration(node) {
      return ts2.isModuleDeclaration(node) || ts2.isIdentifier(node);
    }
    ts2.isEffectiveModuleDeclaration = isEffectiveModuleDeclaration;
    function isShorthandAmbientModuleSymbol(moduleSymbol) {
      return isShorthandAmbientModule(moduleSymbol.valueDeclaration);
    }
    ts2.isShorthandAmbientModuleSymbol = isShorthandAmbientModuleSymbol;
    function isShorthandAmbientModule(node) {
      return !!node && node.kind === 260 && !node.body;
    }
    function isBlockScopedContainerTopLevel(node) {
      return node.kind === 303 || node.kind === 260 || ts2.isFunctionLikeOrClassStaticBlockDeclaration(node);
    }
    ts2.isBlockScopedContainerTopLevel = isBlockScopedContainerTopLevel;
    function isGlobalScopeAugmentation(module2) {
      return !!(module2.flags & 1024);
    }
    ts2.isGlobalScopeAugmentation = isGlobalScopeAugmentation;
    function isExternalModuleAugmentation(node) {
      return isAmbientModule(node) && isModuleAugmentationExternal(node);
    }
    ts2.isExternalModuleAugmentation = isExternalModuleAugmentation;
    function isModuleAugmentationExternal(node) {
      switch (node.parent.kind) {
        case 303:
          return ts2.isExternalModule(node.parent);
        case 261:
          return isAmbientModule(node.parent.parent) && ts2.isSourceFile(node.parent.parent.parent) && !ts2.isExternalModule(node.parent.parent.parent);
      }
      return false;
    }
    ts2.isModuleAugmentationExternal = isModuleAugmentationExternal;
    function getNonAugmentationDeclaration(symbol) {
      var _a;
      return (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.find(function(d) {
        return !isExternalModuleAugmentation(d) && !(ts2.isModuleDeclaration(d) && isGlobalScopeAugmentation(d));
      });
    }
    ts2.getNonAugmentationDeclaration = getNonAugmentationDeclaration;
    function isCommonJSContainingModuleKind(kind) {
      return kind === ts2.ModuleKind.CommonJS || kind === ts2.ModuleKind.Node12 || kind === ts2.ModuleKind.NodeNext;
    }
    function isEffectiveExternalModule(node, compilerOptions) {
      return ts2.isExternalModule(node) || compilerOptions.isolatedModules || isCommonJSContainingModuleKind(getEmitModuleKind(compilerOptions)) && !!node.commonJsModuleIndicator;
    }
    ts2.isEffectiveExternalModule = isEffectiveExternalModule;
    function isEffectiveStrictModeSourceFile(node, compilerOptions) {
      switch (node.scriptKind) {
        case 1:
        case 3:
        case 2:
        case 4:
          break;
        default:
          return false;
      }
      if (node.isDeclarationFile) {
        return false;
      }
      if (getStrictOptionValue(compilerOptions, "alwaysStrict")) {
        return true;
      }
      if (ts2.startsWithUseStrict(node.statements)) {
        return true;
      }
      if (ts2.isExternalModule(node) || compilerOptions.isolatedModules) {
        if (getEmitModuleKind(compilerOptions) >= ts2.ModuleKind.ES2015) {
          return true;
        }
        return !compilerOptions.noImplicitUseStrict;
      }
      return false;
    }
    ts2.isEffectiveStrictModeSourceFile = isEffectiveStrictModeSourceFile;
    function isBlockScope(node, parentNode) {
      switch (node.kind) {
        case 303:
        case 262:
        case 291:
        case 260:
        case 241:
        case 242:
        case 243:
        case 170:
        case 168:
        case 171:
        case 172:
        case 255:
        case 212:
        case 213:
        case 166:
        case 169:
          return true;
        case 234:
          return !ts2.isFunctionLikeOrClassStaticBlockDeclaration(parentNode);
      }
      return false;
    }
    ts2.isBlockScope = isBlockScope;
    function isDeclarationWithTypeParameters(node) {
      switch (node.kind) {
        case 336:
        case 343:
        case 321:
          return true;
        default:
          ts2.assertType(node);
          return isDeclarationWithTypeParameterChildren(node);
      }
    }
    ts2.isDeclarationWithTypeParameters = isDeclarationWithTypeParameters;
    function isDeclarationWithTypeParameterChildren(node) {
      switch (node.kind) {
        case 173:
        case 174:
        case 167:
        case 175:
        case 178:
        case 179:
        case 315:
        case 256:
        case 225:
        case 257:
        case 258:
        case 342:
        case 255:
        case 168:
        case 170:
        case 171:
        case 172:
        case 212:
        case 213:
          return true;
        default:
          ts2.assertType(node);
          return false;
      }
    }
    ts2.isDeclarationWithTypeParameterChildren = isDeclarationWithTypeParameterChildren;
    function isAnyImportSyntax(node) {
      switch (node.kind) {
        case 265:
        case 264:
          return true;
        default:
          return false;
      }
    }
    ts2.isAnyImportSyntax = isAnyImportSyntax;
    function isLateVisibilityPaintedStatement(node) {
      switch (node.kind) {
        case 265:
        case 264:
        case 236:
        case 256:
        case 255:
        case 260:
        case 258:
        case 257:
        case 259:
          return true;
        default:
          return false;
      }
    }
    ts2.isLateVisibilityPaintedStatement = isLateVisibilityPaintedStatement;
    function hasPossibleExternalModuleReference(node) {
      return isAnyImportOrReExport(node) || ts2.isModuleDeclaration(node) || ts2.isImportTypeNode(node) || isImportCall(node);
    }
    ts2.hasPossibleExternalModuleReference = hasPossibleExternalModuleReference;
    function isAnyImportOrReExport(node) {
      return isAnyImportSyntax(node) || ts2.isExportDeclaration(node);
    }
    ts2.isAnyImportOrReExport = isAnyImportOrReExport;
    function getEnclosingBlockScopeContainer(node) {
      return ts2.findAncestor(node.parent, function(current) {
        return isBlockScope(current, current.parent);
      });
    }
    ts2.getEnclosingBlockScopeContainer = getEnclosingBlockScopeContainer;
    function forEachEnclosingBlockScopeContainer(node, cb) {
      var container = getEnclosingBlockScopeContainer(node);
      while (container) {
        cb(container);
        container = getEnclosingBlockScopeContainer(container);
      }
    }
    ts2.forEachEnclosingBlockScopeContainer = forEachEnclosingBlockScopeContainer;
    function declarationNameToString(name) {
      return !name || getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
    }
    ts2.declarationNameToString = declarationNameToString;
    function getNameFromIndexInfo(info) {
      return info.declaration ? declarationNameToString(info.declaration.parameters[0].name) : void 0;
    }
    ts2.getNameFromIndexInfo = getNameFromIndexInfo;
    function isComputedNonLiteralName(name) {
      return name.kind === 161 && !isStringOrNumericLiteralLike(name.expression);
    }
    ts2.isComputedNonLiteralName = isComputedNonLiteralName;
    function getTextOfPropertyName(name) {
      switch (name.kind) {
        case 79:
        case 80:
          return name.escapedText;
        case 10:
        case 8:
        case 14:
          return ts2.escapeLeadingUnderscores(name.text);
        case 161:
          if (isStringOrNumericLiteralLike(name.expression))
            return ts2.escapeLeadingUnderscores(name.expression.text);
          return ts2.Debug.fail("Text of property name cannot be read from non-literal-valued ComputedPropertyNames");
        default:
          return ts2.Debug.assertNever(name);
      }
    }
    ts2.getTextOfPropertyName = getTextOfPropertyName;
    function entityNameToString(name) {
      switch (name.kind) {
        case 108:
          return "this";
        case 80:
        case 79:
          return getFullWidth(name) === 0 ? ts2.idText(name) : getTextOfNode(name);
        case 160:
          return entityNameToString(name.left) + "." + entityNameToString(name.right);
        case 205:
          if (ts2.isIdentifier(name.name) || ts2.isPrivateIdentifier(name.name)) {
            return entityNameToString(name.expression) + "." + entityNameToString(name.name);
          } else {
            return ts2.Debug.assertNever(name.name);
          }
        case 309:
          return entityNameToString(name.left) + entityNameToString(name.right);
        default:
          return ts2.Debug.assertNever(name);
      }
    }
    ts2.entityNameToString = entityNameToString;
    function createDiagnosticForNode(node, message, arg0, arg1, arg2, arg3) {
      var sourceFile = getSourceFileOfNode(node);
      return createDiagnosticForNodeInSourceFile(sourceFile, node, message, arg0, arg1, arg2, arg3);
    }
    ts2.createDiagnosticForNode = createDiagnosticForNode;
    function createDiagnosticForNodeArray(sourceFile, nodes, message, arg0, arg1, arg2, arg3) {
      var start = ts2.skipTrivia(sourceFile.text, nodes.pos);
      return createFileDiagnostic(sourceFile, start, nodes.end - start, message, arg0, arg1, arg2, arg3);
    }
    ts2.createDiagnosticForNodeArray = createDiagnosticForNodeArray;
    function createDiagnosticForNodeInSourceFile(sourceFile, node, message, arg0, arg1, arg2, arg3) {
      var span = getErrorSpanForNode(sourceFile, node);
      return createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2, arg3);
    }
    ts2.createDiagnosticForNodeInSourceFile = createDiagnosticForNodeInSourceFile;
    function createDiagnosticForNodeFromMessageChain(node, messageChain, relatedInformation) {
      var sourceFile = getSourceFileOfNode(node);
      var span = getErrorSpanForNode(sourceFile, node);
      return createFileDiagnosticFromMessageChain(sourceFile, span.start, span.length, messageChain, relatedInformation);
    }
    ts2.createDiagnosticForNodeFromMessageChain = createDiagnosticForNodeFromMessageChain;
    function assertDiagnosticLocation(file, start, length) {
      ts2.Debug.assertGreaterThanOrEqual(start, 0);
      ts2.Debug.assertGreaterThanOrEqual(length, 0);
      if (file) {
        ts2.Debug.assertLessThanOrEqual(start, file.text.length);
        ts2.Debug.assertLessThanOrEqual(start + length, file.text.length);
      }
    }
    function createFileDiagnosticFromMessageChain(file, start, length, messageChain, relatedInformation) {
      assertDiagnosticLocation(file, start, length);
      return {
        file,
        start,
        length,
        code: messageChain.code,
        category: messageChain.category,
        messageText: messageChain.next ? messageChain : messageChain.messageText,
        relatedInformation
      };
    }
    ts2.createFileDiagnosticFromMessageChain = createFileDiagnosticFromMessageChain;
    function createDiagnosticForFileFromMessageChain(sourceFile, messageChain, relatedInformation) {
      return {
        file: sourceFile,
        start: 0,
        length: 0,
        code: messageChain.code,
        category: messageChain.category,
        messageText: messageChain.next ? messageChain : messageChain.messageText,
        relatedInformation
      };
    }
    ts2.createDiagnosticForFileFromMessageChain = createDiagnosticForFileFromMessageChain;
    function createDiagnosticForRange(sourceFile, range, message) {
      return {
        file: sourceFile,
        start: range.pos,
        length: range.end - range.pos,
        code: message.code,
        category: message.category,
        messageText: message.message
      };
    }
    ts2.createDiagnosticForRange = createDiagnosticForRange;
    function getSpanOfTokenAtPosition(sourceFile, pos) {
      var scanner = ts2.createScanner(sourceFile.languageVersion, true, sourceFile.languageVariant, sourceFile.text, void 0, pos);
      scanner.scan();
      var start = scanner.getTokenPos();
      return ts2.createTextSpanFromBounds(start, scanner.getTextPos());
    }
    ts2.getSpanOfTokenAtPosition = getSpanOfTokenAtPosition;
    function getErrorSpanForArrowFunction(sourceFile, node) {
      var pos = ts2.skipTrivia(sourceFile.text, node.pos);
      if (node.body && node.body.kind === 234) {
        var startLine = ts2.getLineAndCharacterOfPosition(sourceFile, node.body.pos).line;
        var endLine = ts2.getLineAndCharacterOfPosition(sourceFile, node.body.end).line;
        if (startLine < endLine) {
          return ts2.createTextSpan(pos, getEndLinePosition(startLine, sourceFile) - pos + 1);
        }
      }
      return ts2.createTextSpanFromBounds(pos, node.end);
    }
    function getErrorSpanForNode(sourceFile, node) {
      var errorNode = node;
      switch (node.kind) {
        case 303:
          var pos_1 = ts2.skipTrivia(sourceFile.text, 0, false);
          if (pos_1 === sourceFile.text.length) {
            return ts2.createTextSpan(0, 0);
          }
          return getSpanOfTokenAtPosition(sourceFile, pos_1);
        case 253:
        case 202:
        case 256:
        case 225:
        case 257:
        case 260:
        case 259:
        case 297:
        case 255:
        case 212:
        case 168:
        case 171:
        case 172:
        case 258:
        case 166:
        case 165:
        case 267:
          errorNode = node.name;
          break;
        case 213:
          return getErrorSpanForArrowFunction(sourceFile, node);
        case 288:
        case 289:
          var start = ts2.skipTrivia(sourceFile.text, node.pos);
          var end = node.statements.length > 0 ? node.statements[0].pos : node.end;
          return ts2.createTextSpanFromBounds(start, end);
      }
      if (errorNode === void 0) {
        return getSpanOfTokenAtPosition(sourceFile, node.pos);
      }
      ts2.Debug.assert(!ts2.isJSDoc(errorNode));
      var isMissing = nodeIsMissing(errorNode);
      var pos = isMissing || ts2.isJsxText(node) ? errorNode.pos : ts2.skipTrivia(sourceFile.text, errorNode.pos);
      if (isMissing) {
        ts2.Debug.assert(pos === errorNode.pos, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809");
        ts2.Debug.assert(pos === errorNode.end, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809");
      } else {
        ts2.Debug.assert(pos >= errorNode.pos, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809");
        ts2.Debug.assert(pos <= errorNode.end, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809");
      }
      return ts2.createTextSpanFromBounds(pos, errorNode.end);
    }
    ts2.getErrorSpanForNode = getErrorSpanForNode;
    function isExternalOrCommonJsModule(file) {
      return (file.externalModuleIndicator || file.commonJsModuleIndicator) !== void 0;
    }
    ts2.isExternalOrCommonJsModule = isExternalOrCommonJsModule;
    function isJsonSourceFile(file) {
      return file.scriptKind === 6;
    }
    ts2.isJsonSourceFile = isJsonSourceFile;
    function isEnumConst(node) {
      return !!(ts2.getCombinedModifierFlags(node) & 2048);
    }
    ts2.isEnumConst = isEnumConst;
    function isDeclarationReadonly(declaration) {
      return !!(ts2.getCombinedModifierFlags(declaration) & 64 && !ts2.isParameterPropertyDeclaration(declaration, declaration.parent));
    }
    ts2.isDeclarationReadonly = isDeclarationReadonly;
    function isVarConst(node) {
      return !!(ts2.getCombinedNodeFlags(node) & 2);
    }
    ts2.isVarConst = isVarConst;
    function isLet(node) {
      return !!(ts2.getCombinedNodeFlags(node) & 1);
    }
    ts2.isLet = isLet;
    function isSuperCall(n) {
      return n.kind === 207 && n.expression.kind === 106;
    }
    ts2.isSuperCall = isSuperCall;
    function isImportCall(n) {
      return n.kind === 207 && n.expression.kind === 100;
    }
    ts2.isImportCall = isImportCall;
    function isImportMeta(n) {
      return ts2.isMetaProperty(n) && n.keywordToken === 100 && n.name.escapedText === "meta";
    }
    ts2.isImportMeta = isImportMeta;
    function isLiteralImportTypeNode(n) {
      return ts2.isImportTypeNode(n) && ts2.isLiteralTypeNode(n.argument) && ts2.isStringLiteral(n.argument.literal);
    }
    ts2.isLiteralImportTypeNode = isLiteralImportTypeNode;
    function isPrologueDirective(node) {
      return node.kind === 237 && node.expression.kind === 10;
    }
    ts2.isPrologueDirective = isPrologueDirective;
    function isCustomPrologue(node) {
      return !!(getEmitFlags(node) & 1048576);
    }
    ts2.isCustomPrologue = isCustomPrologue;
    function isHoistedFunction(node) {
      return isCustomPrologue(node) && ts2.isFunctionDeclaration(node);
    }
    ts2.isHoistedFunction = isHoistedFunction;
    function isHoistedVariable(node) {
      return ts2.isIdentifier(node.name) && !node.initializer;
    }
    function isHoistedVariableStatement(node) {
      return isCustomPrologue(node) && ts2.isVariableStatement(node) && ts2.every(node.declarationList.declarations, isHoistedVariable);
    }
    ts2.isHoistedVariableStatement = isHoistedVariableStatement;
    function getLeadingCommentRangesOfNode(node, sourceFileOfNode) {
      return node.kind !== 11 ? ts2.getLeadingCommentRanges(sourceFileOfNode.text, node.pos) : void 0;
    }
    ts2.getLeadingCommentRangesOfNode = getLeadingCommentRangesOfNode;
    function getJSDocCommentRanges(node, text) {
      var commentRanges = node.kind === 163 || node.kind === 162 || node.kind === 212 || node.kind === 213 || node.kind === 211 || node.kind === 253 ? ts2.concatenate(ts2.getTrailingCommentRanges(text, node.pos), ts2.getLeadingCommentRanges(text, node.pos)) : ts2.getLeadingCommentRanges(text, node.pos);
      return ts2.filter(commentRanges, function(comment) {
        return text.charCodeAt(comment.pos + 1) === 42 && text.charCodeAt(comment.pos + 2) === 42 && text.charCodeAt(comment.pos + 3) !== 47;
      });
    }
    ts2.getJSDocCommentRanges = getJSDocCommentRanges;
    ts2.fullTripleSlashReferencePathRegEx = /^(\/\/\/\s*<reference\s+path\s*=\s*)(('[^']*')|("[^"]*")).*?\/>/;
    var fullTripleSlashReferenceTypeReferenceDirectiveRegEx = /^(\/\/\/\s*<reference\s+types\s*=\s*)(('[^']*')|("[^"]*")).*?\/>/;
    ts2.fullTripleSlashAMDReferencePathRegEx = /^(\/\/\/\s*<amd-dependency\s+path\s*=\s*)(('[^']*')|("[^"]*")).*?\/>/;
    var defaultLibReferenceRegEx = /^(\/\/\/\s*<reference\s+no-default-lib\s*=\s*)(('[^']*')|("[^"]*"))\s*\/>/;
    function isPartOfTypeNode(node) {
      if (176 <= node.kind && node.kind <= 199) {
        return true;
      }
      switch (node.kind) {
        case 130:
        case 154:
        case 146:
        case 157:
        case 149:
        case 133:
        case 150:
        case 147:
        case 152:
        case 143:
          return true;
        case 114:
          return node.parent.kind !== 216;
        case 227:
          return !isExpressionWithTypeArgumentsInClassExtendsClause(node);
        case 162:
          return node.parent.kind === 194 || node.parent.kind === 189;
        case 79:
          if (node.parent.kind === 160 && node.parent.right === node) {
            node = node.parent;
          } else if (node.parent.kind === 205 && node.parent.name === node) {
            node = node.parent;
          }
          ts2.Debug.assert(node.kind === 79 || node.kind === 160 || node.kind === 205, "'node' was expected to be a qualified name, identifier or property access in 'isPartOfTypeNode'.");
        case 160:
        case 205:
        case 108: {
          var parent = node.parent;
          if (parent.kind === 180) {
            return false;
          }
          if (parent.kind === 199) {
            return !parent.isTypeOf;
          }
          if (176 <= parent.kind && parent.kind <= 199) {
            return true;
          }
          switch (parent.kind) {
            case 227:
              return !isExpressionWithTypeArgumentsInClassExtendsClause(parent);
            case 162:
              return node === parent.constraint;
            case 342:
              return node === parent.constraint;
            case 166:
            case 165:
            case 163:
            case 253:
              return node === parent.type;
            case 255:
            case 212:
            case 213:
            case 170:
            case 168:
            case 167:
            case 171:
            case 172:
              return node === parent.type;
            case 173:
            case 174:
            case 175:
              return node === parent.type;
            case 210:
              return node === parent.type;
            case 207:
            case 208:
              return ts2.contains(parent.typeArguments, node);
            case 209:
              return false;
          }
        }
      }
      return false;
    }
    ts2.isPartOfTypeNode = isPartOfTypeNode;
    function isChildOfNodeWithKind(node, kind) {
      while (node) {
        if (node.kind === kind) {
          return true;
        }
        node = node.parent;
      }
      return false;
    }
    ts2.isChildOfNodeWithKind = isChildOfNodeWithKind;
    function forEachReturnStatement(body, visitor) {
      return traverse(body);
      function traverse(node) {
        switch (node.kind) {
          case 246:
            return visitor(node);
          case 262:
          case 234:
          case 238:
          case 239:
          case 240:
          case 241:
          case 242:
          case 243:
          case 247:
          case 248:
          case 288:
          case 289:
          case 249:
          case 251:
          case 291:
            return ts2.forEachChild(node, traverse);
        }
      }
    }
    ts2.forEachReturnStatement = forEachReturnStatement;
    function forEachYieldExpression(body, visitor) {
      return traverse(body);
      function traverse(node) {
        switch (node.kind) {
          case 223:
            visitor(node);
            var operand = node.expression;
            if (operand) {
              traverse(operand);
            }
            return;
          case 259:
          case 257:
          case 260:
          case 258:
            return;
          default:
            if (ts2.isFunctionLike(node)) {
              if (node.name && node.name.kind === 161) {
                traverse(node.name.expression);
                return;
              }
            } else if (!isPartOfTypeNode(node)) {
              ts2.forEachChild(node, traverse);
            }
        }
      }
    }
    ts2.forEachYieldExpression = forEachYieldExpression;
    function getRestParameterElementType(node) {
      if (node && node.kind === 182) {
        return node.elementType;
      } else if (node && node.kind === 177) {
        return ts2.singleOrUndefined(node.typeArguments);
      } else {
        return void 0;
      }
    }
    ts2.getRestParameterElementType = getRestParameterElementType;
    function getMembersOfDeclaration(node) {
      switch (node.kind) {
        case 257:
        case 256:
        case 225:
        case 181:
          return node.members;
        case 204:
          return node.properties;
      }
    }
    ts2.getMembersOfDeclaration = getMembersOfDeclaration;
    function isVariableLike(node) {
      if (node) {
        switch (node.kind) {
          case 202:
          case 297:
          case 163:
          case 294:
          case 166:
          case 165:
          case 295:
          case 253:
            return true;
        }
      }
      return false;
    }
    ts2.isVariableLike = isVariableLike;
    function isVariableLikeOrAccessor(node) {
      return isVariableLike(node) || ts2.isAccessor(node);
    }
    ts2.isVariableLikeOrAccessor = isVariableLikeOrAccessor;
    function isVariableDeclarationInVariableStatement(node) {
      return node.parent.kind === 254 && node.parent.parent.kind === 236;
    }
    ts2.isVariableDeclarationInVariableStatement = isVariableDeclarationInVariableStatement;
    function isValidESSymbolDeclaration(node) {
      return ts2.isVariableDeclaration(node) ? isVarConst(node) && ts2.isIdentifier(node.name) && isVariableDeclarationInVariableStatement(node) : ts2.isPropertyDeclaration(node) ? hasEffectiveReadonlyModifier(node) && hasStaticModifier(node) : ts2.isPropertySignature(node) && hasEffectiveReadonlyModifier(node);
    }
    ts2.isValidESSymbolDeclaration = isValidESSymbolDeclaration;
    function introducesArgumentsExoticObject(node) {
      switch (node.kind) {
        case 168:
        case 167:
        case 170:
        case 171:
        case 172:
        case 255:
        case 212:
          return true;
      }
      return false;
    }
    ts2.introducesArgumentsExoticObject = introducesArgumentsExoticObject;
    function unwrapInnermostStatementOfLabel(node, beforeUnwrapLabelCallback) {
      while (true) {
        if (beforeUnwrapLabelCallback) {
          beforeUnwrapLabelCallback(node);
        }
        if (node.statement.kind !== 249) {
          return node.statement;
        }
        node = node.statement;
      }
    }
    ts2.unwrapInnermostStatementOfLabel = unwrapInnermostStatementOfLabel;
    function isFunctionBlock(node) {
      return node && node.kind === 234 && ts2.isFunctionLike(node.parent);
    }
    ts2.isFunctionBlock = isFunctionBlock;
    function isObjectLiteralMethod(node) {
      return node && node.kind === 168 && node.parent.kind === 204;
    }
    ts2.isObjectLiteralMethod = isObjectLiteralMethod;
    function isObjectLiteralOrClassExpressionMethodOrAccessor(node) {
      return (node.kind === 168 || node.kind === 171 || node.kind === 172) && (node.parent.kind === 204 || node.parent.kind === 225);
    }
    ts2.isObjectLiteralOrClassExpressionMethodOrAccessor = isObjectLiteralOrClassExpressionMethodOrAccessor;
    function isIdentifierTypePredicate(predicate) {
      return predicate && predicate.kind === 1;
    }
    ts2.isIdentifierTypePredicate = isIdentifierTypePredicate;
    function isThisTypePredicate(predicate) {
      return predicate && predicate.kind === 0;
    }
    ts2.isThisTypePredicate = isThisTypePredicate;
    function getPropertyAssignment(objectLiteral, key, key2) {
      return objectLiteral.properties.filter(function(property) {
        if (property.kind === 294) {
          var propName = getTextOfPropertyName(property.name);
          return key === propName || !!key2 && key2 === propName;
        }
        return false;
      });
    }
    ts2.getPropertyAssignment = getPropertyAssignment;
    function getPropertyArrayElementValue(objectLiteral, propKey, elementValue) {
      return ts2.firstDefined(getPropertyAssignment(objectLiteral, propKey), function(property) {
        return ts2.isArrayLiteralExpression(property.initializer) ? ts2.find(property.initializer.elements, function(element) {
          return ts2.isStringLiteral(element) && element.text === elementValue;
        }) : void 0;
      });
    }
    ts2.getPropertyArrayElementValue = getPropertyArrayElementValue;
    function getTsConfigObjectLiteralExpression(tsConfigSourceFile) {
      if (tsConfigSourceFile && tsConfigSourceFile.statements.length) {
        var expression = tsConfigSourceFile.statements[0].expression;
        return ts2.tryCast(expression, ts2.isObjectLiteralExpression);
      }
    }
    ts2.getTsConfigObjectLiteralExpression = getTsConfigObjectLiteralExpression;
    function getTsConfigPropArrayElementValue(tsConfigSourceFile, propKey, elementValue) {
      return ts2.firstDefined(getTsConfigPropArray(tsConfigSourceFile, propKey), function(property) {
        return ts2.isArrayLiteralExpression(property.initializer) ? ts2.find(property.initializer.elements, function(element) {
          return ts2.isStringLiteral(element) && element.text === elementValue;
        }) : void 0;
      });
    }
    ts2.getTsConfigPropArrayElementValue = getTsConfigPropArrayElementValue;
    function getTsConfigPropArray(tsConfigSourceFile, propKey) {
      var jsonObjectLiteral = getTsConfigObjectLiteralExpression(tsConfigSourceFile);
      return jsonObjectLiteral ? getPropertyAssignment(jsonObjectLiteral, propKey) : ts2.emptyArray;
    }
    ts2.getTsConfigPropArray = getTsConfigPropArray;
    function getContainingFunction(node) {
      return ts2.findAncestor(node.parent, ts2.isFunctionLike);
    }
    ts2.getContainingFunction = getContainingFunction;
    function getContainingFunctionDeclaration(node) {
      return ts2.findAncestor(node.parent, ts2.isFunctionLikeDeclaration);
    }
    ts2.getContainingFunctionDeclaration = getContainingFunctionDeclaration;
    function getContainingClass(node) {
      return ts2.findAncestor(node.parent, ts2.isClassLike);
    }
    ts2.getContainingClass = getContainingClass;
    function getContainingClassStaticBlock(node) {
      return ts2.findAncestor(node.parent, function(n) {
        if (ts2.isClassLike(n) || ts2.isFunctionLike(n)) {
          return "quit";
        }
        return ts2.isClassStaticBlockDeclaration(n);
      });
    }
    ts2.getContainingClassStaticBlock = getContainingClassStaticBlock;
    function getContainingFunctionOrClassStaticBlock(node) {
      return ts2.findAncestor(node.parent, ts2.isFunctionLikeOrClassStaticBlockDeclaration);
    }
    ts2.getContainingFunctionOrClassStaticBlock = getContainingFunctionOrClassStaticBlock;
    function getThisContainer(node, includeArrowFunctions) {
      ts2.Debug.assert(node.kind !== 303);
      while (true) {
        node = node.parent;
        if (!node) {
          return ts2.Debug.fail();
        }
        switch (node.kind) {
          case 161:
            if (ts2.isClassLike(node.parent.parent)) {
              return node;
            }
            node = node.parent;
            break;
          case 164:
            if (node.parent.kind === 163 && ts2.isClassElement(node.parent.parent)) {
              node = node.parent.parent;
            } else if (ts2.isClassElement(node.parent)) {
              node = node.parent;
            }
            break;
          case 213:
            if (!includeArrowFunctions) {
              continue;
            }
          case 255:
          case 212:
          case 260:
          case 169:
          case 166:
          case 165:
          case 168:
          case 167:
          case 170:
          case 171:
          case 172:
          case 173:
          case 174:
          case 175:
          case 259:
          case 303:
            return node;
        }
      }
    }
    ts2.getThisContainer = getThisContainer;
    function isInTopLevelContext(node) {
      if (ts2.isIdentifier(node) && (ts2.isClassDeclaration(node.parent) || ts2.isFunctionDeclaration(node.parent)) && node.parent.name === node) {
        node = node.parent;
      }
      var container = getThisContainer(node, true);
      return ts2.isSourceFile(container);
    }
    ts2.isInTopLevelContext = isInTopLevelContext;
    function getNewTargetContainer(node) {
      var container = getThisContainer(node, false);
      if (container) {
        switch (container.kind) {
          case 170:
          case 255:
          case 212:
            return container;
        }
      }
      return void 0;
    }
    ts2.getNewTargetContainer = getNewTargetContainer;
    function getSuperContainer(node, stopOnFunctions) {
      while (true) {
        node = node.parent;
        if (!node) {
          return node;
        }
        switch (node.kind) {
          case 161:
            node = node.parent;
            break;
          case 255:
          case 212:
          case 213:
            if (!stopOnFunctions) {
              continue;
            }
          case 166:
          case 165:
          case 168:
          case 167:
          case 170:
          case 171:
          case 172:
          case 169:
            return node;
          case 164:
            if (node.parent.kind === 163 && ts2.isClassElement(node.parent.parent)) {
              node = node.parent.parent;
            } else if (ts2.isClassElement(node.parent)) {
              node = node.parent;
            }
            break;
        }
      }
    }
    ts2.getSuperContainer = getSuperContainer;
    function getImmediatelyInvokedFunctionExpression(func) {
      if (func.kind === 212 || func.kind === 213) {
        var prev = func;
        var parent = func.parent;
        while (parent.kind === 211) {
          prev = parent;
          parent = parent.parent;
        }
        if (parent.kind === 207 && parent.expression === prev) {
          return parent;
        }
      }
    }
    ts2.getImmediatelyInvokedFunctionExpression = getImmediatelyInvokedFunctionExpression;
    function isSuperOrSuperProperty(node) {
      return node.kind === 106 || isSuperProperty(node);
    }
    ts2.isSuperOrSuperProperty = isSuperOrSuperProperty;
    function isSuperProperty(node) {
      var kind = node.kind;
      return (kind === 205 || kind === 206) && node.expression.kind === 106;
    }
    ts2.isSuperProperty = isSuperProperty;
    function isThisProperty(node) {
      var kind = node.kind;
      return (kind === 205 || kind === 206) && node.expression.kind === 108;
    }
    ts2.isThisProperty = isThisProperty;
    function isThisInitializedDeclaration(node) {
      var _a;
      return !!node && ts2.isVariableDeclaration(node) && ((_a = node.initializer) === null || _a === void 0 ? void 0 : _a.kind) === 108;
    }
    ts2.isThisInitializedDeclaration = isThisInitializedDeclaration;
    function isThisInitializedObjectBindingExpression(node) {
      return !!node && (ts2.isShorthandPropertyAssignment(node) || ts2.isPropertyAssignment(node)) && ts2.isBinaryExpression(node.parent.parent) && node.parent.parent.operatorToken.kind === 63 && node.parent.parent.right.kind === 108;
    }
    ts2.isThisInitializedObjectBindingExpression = isThisInitializedObjectBindingExpression;
    function getEntityNameFromTypeNode(node) {
      switch (node.kind) {
        case 177:
          return node.typeName;
        case 227:
          return isEntityNameExpression(node.expression) ? node.expression : void 0;
        case 79:
        case 160:
          return node;
      }
      return void 0;
    }
    ts2.getEntityNameFromTypeNode = getEntityNameFromTypeNode;
    function getInvokedExpression(node) {
      switch (node.kind) {
        case 209:
          return node.tag;
        case 279:
        case 278:
          return node.tagName;
        default:
          return node.expression;
      }
    }
    ts2.getInvokedExpression = getInvokedExpression;
    function nodeCanBeDecorated(node, parent, grandparent) {
      if (ts2.isNamedDeclaration(node) && ts2.isPrivateIdentifier(node.name)) {
        return false;
      }
      switch (node.kind) {
        case 256:
          return true;
        case 166:
          return parent.kind === 256;
        case 171:
        case 172:
        case 168:
          return node.body !== void 0 && parent.kind === 256;
        case 163:
          return parent.body !== void 0 && (parent.kind === 170 || parent.kind === 168 || parent.kind === 172) && grandparent.kind === 256;
      }
      return false;
    }
    ts2.nodeCanBeDecorated = nodeCanBeDecorated;
    function nodeIsDecorated(node, parent, grandparent) {
      return node.decorators !== void 0 && nodeCanBeDecorated(node, parent, grandparent);
    }
    ts2.nodeIsDecorated = nodeIsDecorated;
    function nodeOrChildIsDecorated(node, parent, grandparent) {
      return nodeIsDecorated(node, parent, grandparent) || childIsDecorated(node, parent);
    }
    ts2.nodeOrChildIsDecorated = nodeOrChildIsDecorated;
    function childIsDecorated(node, parent) {
      switch (node.kind) {
        case 256:
          return ts2.some(node.members, function(m) {
            return nodeOrChildIsDecorated(m, node, parent);
          });
        case 168:
        case 172:
        case 170:
          return ts2.some(node.parameters, function(p) {
            return nodeIsDecorated(p, node, parent);
          });
        default:
          return false;
      }
    }
    ts2.childIsDecorated = childIsDecorated;
    function classOrConstructorParameterIsDecorated(node) {
      if (nodeIsDecorated(node))
        return true;
      var constructor = getFirstConstructorWithBody(node);
      return !!constructor && childIsDecorated(constructor, node);
    }
    ts2.classOrConstructorParameterIsDecorated = classOrConstructorParameterIsDecorated;
    function isJSXTagName(node) {
      var parent = node.parent;
      if (parent.kind === 279 || parent.kind === 278 || parent.kind === 280) {
        return parent.tagName === node;
      }
      return false;
    }
    ts2.isJSXTagName = isJSXTagName;
    function isExpressionNode(node) {
      switch (node.kind) {
        case 106:
        case 104:
        case 110:
        case 95:
        case 13:
        case 203:
        case 204:
        case 205:
        case 206:
        case 207:
        case 208:
        case 209:
        case 228:
        case 210:
        case 229:
        case 211:
        case 212:
        case 225:
        case 213:
        case 216:
        case 214:
        case 215:
        case 218:
        case 219:
        case 220:
        case 221:
        case 224:
        case 222:
        case 226:
        case 277:
        case 278:
        case 281:
        case 223:
        case 217:
        case 230:
          return true;
        case 160:
          while (node.parent.kind === 160) {
            node = node.parent;
          }
          return node.parent.kind === 180 || ts2.isJSDocLinkLike(node.parent) || ts2.isJSDocNameReference(node.parent) || ts2.isJSDocMemberName(node.parent) || isJSXTagName(node);
        case 309:
          while (ts2.isJSDocMemberName(node.parent)) {
            node = node.parent;
          }
          return node.parent.kind === 180 || ts2.isJSDocLinkLike(node.parent) || ts2.isJSDocNameReference(node.parent) || ts2.isJSDocMemberName(node.parent) || isJSXTagName(node);
        case 80:
          return ts2.isBinaryExpression(node.parent) && node.parent.left === node && node.parent.operatorToken.kind === 101;
        case 79:
          if (node.parent.kind === 180 || ts2.isJSDocLinkLike(node.parent) || ts2.isJSDocNameReference(node.parent) || ts2.isJSDocMemberName(node.parent) || isJSXTagName(node)) {
            return true;
          }
        case 8:
        case 9:
        case 10:
        case 14:
        case 108:
          return isInExpressionContext(node);
        default:
          return false;
      }
    }
    ts2.isExpressionNode = isExpressionNode;
    function isInExpressionContext(node) {
      var parent = node.parent;
      switch (parent.kind) {
        case 253:
        case 163:
        case 166:
        case 165:
        case 297:
        case 294:
        case 202:
          return parent.initializer === node;
        case 237:
        case 238:
        case 239:
        case 240:
        case 246:
        case 247:
        case 248:
        case 288:
        case 250:
          return parent.expression === node;
        case 241:
          var forStatement = parent;
          return forStatement.initializer === node && forStatement.initializer.kind !== 254 || forStatement.condition === node || forStatement.incrementor === node;
        case 242:
        case 243:
          var forInStatement = parent;
          return forInStatement.initializer === node && forInStatement.initializer.kind !== 254 || forInStatement.expression === node;
        case 210:
        case 228:
          return node === parent.expression;
        case 232:
          return node === parent.expression;
        case 161:
          return node === parent.expression;
        case 164:
        case 287:
        case 286:
        case 296:
          return true;
        case 227:
          return parent.expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent);
        case 295:
          return parent.objectAssignmentInitializer === node;
        default:
          return isExpressionNode(parent);
      }
    }
    ts2.isInExpressionContext = isInExpressionContext;
    function isPartOfTypeQuery(node) {
      while (node.kind === 160 || node.kind === 79) {
        node = node.parent;
      }
      return node.kind === 180;
    }
    ts2.isPartOfTypeQuery = isPartOfTypeQuery;
    function isNamespaceReexportDeclaration(node) {
      return ts2.isNamespaceExport(node) && !!node.parent.moduleSpecifier;
    }
    ts2.isNamespaceReexportDeclaration = isNamespaceReexportDeclaration;
    function isExternalModuleImportEqualsDeclaration(node) {
      return node.kind === 264 && node.moduleReference.kind === 276;
    }
    ts2.isExternalModuleImportEqualsDeclaration = isExternalModuleImportEqualsDeclaration;
    function getExternalModuleImportEqualsDeclarationExpression(node) {
      ts2.Debug.assert(isExternalModuleImportEqualsDeclaration(node));
      return node.moduleReference.expression;
    }
    ts2.getExternalModuleImportEqualsDeclarationExpression = getExternalModuleImportEqualsDeclarationExpression;
    function getExternalModuleRequireArgument(node) {
      return isVariableDeclarationInitializedToBareOrAccessedRequire(node) && getLeftmostAccessExpression(node.initializer).arguments[0];
    }
    ts2.getExternalModuleRequireArgument = getExternalModuleRequireArgument;
    function isInternalModuleImportEqualsDeclaration(node) {
      return node.kind === 264 && node.moduleReference.kind !== 276;
    }
    ts2.isInternalModuleImportEqualsDeclaration = isInternalModuleImportEqualsDeclaration;
    function isSourceFileJS(file) {
      return isInJSFile(file);
    }
    ts2.isSourceFileJS = isSourceFileJS;
    function isSourceFileNotJS(file) {
      return !isInJSFile(file);
    }
    ts2.isSourceFileNotJS = isSourceFileNotJS;
    function isInJSFile(node) {
      return !!node && !!(node.flags & 131072);
    }
    ts2.isInJSFile = isInJSFile;
    function isInJsonFile(node) {
      return !!node && !!(node.flags & 33554432);
    }
    ts2.isInJsonFile = isInJsonFile;
    function isSourceFileNotJson(file) {
      return !isJsonSourceFile(file);
    }
    ts2.isSourceFileNotJson = isSourceFileNotJson;
    function isInJSDoc(node) {
      return !!node && !!(node.flags & 4194304);
    }
    ts2.isInJSDoc = isInJSDoc;
    function isJSDocIndexSignature(node) {
      return ts2.isTypeReferenceNode(node) && ts2.isIdentifier(node.typeName) && node.typeName.escapedText === "Object" && node.typeArguments && node.typeArguments.length === 2 && (node.typeArguments[0].kind === 149 || node.typeArguments[0].kind === 146);
    }
    ts2.isJSDocIndexSignature = isJSDocIndexSignature;
    function isRequireCall(callExpression, requireStringLiteralLikeArgument) {
      if (callExpression.kind !== 207) {
        return false;
      }
      var _a = callExpression, expression = _a.expression, args = _a.arguments;
      if (expression.kind !== 79 || expression.escapedText !== "require") {
        return false;
      }
      if (args.length !== 1) {
        return false;
      }
      var arg = args[0];
      return !requireStringLiteralLikeArgument || ts2.isStringLiteralLike(arg);
    }
    ts2.isRequireCall = isRequireCall;
    function isVariableDeclarationInitializedToRequire(node) {
      return isVariableDeclarationInitializedWithRequireHelper(node, false);
    }
    ts2.isVariableDeclarationInitializedToRequire = isVariableDeclarationInitializedToRequire;
    function isVariableDeclarationInitializedToBareOrAccessedRequire(node) {
      return isVariableDeclarationInitializedWithRequireHelper(node, true);
    }
    ts2.isVariableDeclarationInitializedToBareOrAccessedRequire = isVariableDeclarationInitializedToBareOrAccessedRequire;
    function isVariableDeclarationInitializedWithRequireHelper(node, allowAccessedRequire) {
      if (node.kind === 202) {
        node = node.parent.parent;
      }
      return ts2.isVariableDeclaration(node) && !!node.initializer && isRequireCall(allowAccessedRequire ? getLeftmostAccessExpression(node.initializer) : node.initializer, true);
    }
    function isRequireVariableStatement(node) {
      return ts2.isVariableStatement(node) && node.declarationList.declarations.length > 0 && ts2.every(node.declarationList.declarations, function(decl) {
        return isVariableDeclarationInitializedToRequire(decl);
      });
    }
    ts2.isRequireVariableStatement = isRequireVariableStatement;
    function isSingleOrDoubleQuote(charCode) {
      return charCode === 39 || charCode === 34;
    }
    ts2.isSingleOrDoubleQuote = isSingleOrDoubleQuote;
    function isStringDoubleQuoted(str, sourceFile) {
      return getSourceTextOfNodeFromSourceFile(sourceFile, str).charCodeAt(0) === 34;
    }
    ts2.isStringDoubleQuoted = isStringDoubleQuoted;
    function isAssignmentDeclaration(decl) {
      return ts2.isBinaryExpression(decl) || isAccessExpression(decl) || ts2.isIdentifier(decl) || ts2.isCallExpression(decl);
    }
    ts2.isAssignmentDeclaration = isAssignmentDeclaration;
    function getEffectiveInitializer(node) {
      if (isInJSFile(node) && node.initializer && ts2.isBinaryExpression(node.initializer) && (node.initializer.operatorToken.kind === 56 || node.initializer.operatorToken.kind === 60) && node.name && isEntityNameExpression(node.name) && isSameEntityName(node.name, node.initializer.left)) {
        return node.initializer.right;
      }
      return node.initializer;
    }
    ts2.getEffectiveInitializer = getEffectiveInitializer;
    function getDeclaredExpandoInitializer(node) {
      var init = getEffectiveInitializer(node);
      return init && getExpandoInitializer(init, isPrototypeAccess(node.name));
    }
    ts2.getDeclaredExpandoInitializer = getDeclaredExpandoInitializer;
    function hasExpandoValueProperty(node, isPrototypeAssignment) {
      return ts2.forEach(node.properties, function(p) {
        return ts2.isPropertyAssignment(p) && ts2.isIdentifier(p.name) && p.name.escapedText === "value" && p.initializer && getExpandoInitializer(p.initializer, isPrototypeAssignment);
      });
    }
    function getAssignedExpandoInitializer(node) {
      if (node && node.parent && ts2.isBinaryExpression(node.parent) && node.parent.operatorToken.kind === 63) {
        var isPrototypeAssignment = isPrototypeAccess(node.parent.left);
        return getExpandoInitializer(node.parent.right, isPrototypeAssignment) || getDefaultedExpandoInitializer(node.parent.left, node.parent.right, isPrototypeAssignment);
      }
      if (node && ts2.isCallExpression(node) && isBindableObjectDefinePropertyCall(node)) {
        var result = hasExpandoValueProperty(node.arguments[2], node.arguments[1].text === "prototype");
        if (result) {
          return result;
        }
      }
    }
    ts2.getAssignedExpandoInitializer = getAssignedExpandoInitializer;
    function getExpandoInitializer(initializer, isPrototypeAssignment) {
      if (ts2.isCallExpression(initializer)) {
        var e = skipParentheses(initializer.expression);
        return e.kind === 212 || e.kind === 213 ? initializer : void 0;
      }
      if (initializer.kind === 212 || initializer.kind === 225 || initializer.kind === 213) {
        return initializer;
      }
      if (ts2.isObjectLiteralExpression(initializer) && (initializer.properties.length === 0 || isPrototypeAssignment)) {
        return initializer;
      }
    }
    ts2.getExpandoInitializer = getExpandoInitializer;
    function getDefaultedExpandoInitializer(name, initializer, isPrototypeAssignment) {
      var e = ts2.isBinaryExpression(initializer) && (initializer.operatorToken.kind === 56 || initializer.operatorToken.kind === 60) && getExpandoInitializer(initializer.right, isPrototypeAssignment);
      if (e && isSameEntityName(name, initializer.left)) {
        return e;
      }
    }
    function isDefaultedExpandoInitializer(node) {
      var name = ts2.isVariableDeclaration(node.parent) ? node.parent.name : ts2.isBinaryExpression(node.parent) && node.parent.operatorToken.kind === 63 ? node.parent.left : void 0;
      return name && getExpandoInitializer(node.right, isPrototypeAccess(name)) && isEntityNameExpression(name) && isSameEntityName(name, node.left);
    }
    ts2.isDefaultedExpandoInitializer = isDefaultedExpandoInitializer;
    function getNameOfExpando(node) {
      if (ts2.isBinaryExpression(node.parent)) {
        var parent = (node.parent.operatorToken.kind === 56 || node.parent.operatorToken.kind === 60) && ts2.isBinaryExpression(node.parent.parent) ? node.parent.parent : node.parent;
        if (parent.operatorToken.kind === 63 && ts2.isIdentifier(parent.left)) {
          return parent.left;
        }
      } else if (ts2.isVariableDeclaration(node.parent)) {
        return node.parent.name;
      }
    }
    ts2.getNameOfExpando = getNameOfExpando;
    function isSameEntityName(name, initializer) {
      if (isPropertyNameLiteral(name) && isPropertyNameLiteral(initializer)) {
        return getTextOfIdentifierOrLiteral(name) === getTextOfIdentifierOrLiteral(initializer);
      }
      if (ts2.isIdentifier(name) && isLiteralLikeAccess(initializer) && (initializer.expression.kind === 108 || ts2.isIdentifier(initializer.expression) && (initializer.expression.escapedText === "window" || initializer.expression.escapedText === "self" || initializer.expression.escapedText === "global"))) {
        var nameOrArgument = getNameOrArgument(initializer);
        if (ts2.isPrivateIdentifier(nameOrArgument)) {
          ts2.Debug.fail("Unexpected PrivateIdentifier in name expression with literal-like access.");
        }
        return isSameEntityName(name, nameOrArgument);
      }
      if (isLiteralLikeAccess(name) && isLiteralLikeAccess(initializer)) {
        return getElementOrPropertyAccessName(name) === getElementOrPropertyAccessName(initializer) && isSameEntityName(name.expression, initializer.expression);
      }
      return false;
    }
    ts2.isSameEntityName = isSameEntityName;
    function getRightMostAssignedExpression(node) {
      while (isAssignmentExpression(node, true)) {
        node = node.right;
      }
      return node;
    }
    ts2.getRightMostAssignedExpression = getRightMostAssignedExpression;
    function isExportsIdentifier(node) {
      return ts2.isIdentifier(node) && node.escapedText === "exports";
    }
    ts2.isExportsIdentifier = isExportsIdentifier;
    function isModuleIdentifier(node) {
      return ts2.isIdentifier(node) && node.escapedText === "module";
    }
    ts2.isModuleIdentifier = isModuleIdentifier;
    function isModuleExportsAccessExpression(node) {
      return (ts2.isPropertyAccessExpression(node) || isLiteralLikeElementAccess(node)) && isModuleIdentifier(node.expression) && getElementOrPropertyAccessName(node) === "exports";
    }
    ts2.isModuleExportsAccessExpression = isModuleExportsAccessExpression;
    function getAssignmentDeclarationKind(expr) {
      var special = getAssignmentDeclarationKindWorker(expr);
      return special === 5 || isInJSFile(expr) ? special : 0;
    }
    ts2.getAssignmentDeclarationKind = getAssignmentDeclarationKind;
    function isBindableObjectDefinePropertyCall(expr) {
      return ts2.length(expr.arguments) === 3 && ts2.isPropertyAccessExpression(expr.expression) && ts2.isIdentifier(expr.expression.expression) && ts2.idText(expr.expression.expression) === "Object" && ts2.idText(expr.expression.name) === "defineProperty" && isStringOrNumericLiteralLike(expr.arguments[1]) && isBindableStaticNameExpression(expr.arguments[0], true);
    }
    ts2.isBindableObjectDefinePropertyCall = isBindableObjectDefinePropertyCall;
    function isLiteralLikeAccess(node) {
      return ts2.isPropertyAccessExpression(node) || isLiteralLikeElementAccess(node);
    }
    ts2.isLiteralLikeAccess = isLiteralLikeAccess;
    function isLiteralLikeElementAccess(node) {
      return ts2.isElementAccessExpression(node) && isStringOrNumericLiteralLike(node.argumentExpression);
    }
    ts2.isLiteralLikeElementAccess = isLiteralLikeElementAccess;
    function isBindableStaticAccessExpression(node, excludeThisKeyword) {
      return ts2.isPropertyAccessExpression(node) && (!excludeThisKeyword && node.expression.kind === 108 || ts2.isIdentifier(node.name) && isBindableStaticNameExpression(node.expression, true)) || isBindableStaticElementAccessExpression(node, excludeThisKeyword);
    }
    ts2.isBindableStaticAccessExpression = isBindableStaticAccessExpression;
    function isBindableStaticElementAccessExpression(node, excludeThisKeyword) {
      return isLiteralLikeElementAccess(node) && (!excludeThisKeyword && node.expression.kind === 108 || isEntityNameExpression(node.expression) || isBindableStaticAccessExpression(node.expression, true));
    }
    ts2.isBindableStaticElementAccessExpression = isBindableStaticElementAccessExpression;
    function isBindableStaticNameExpression(node, excludeThisKeyword) {
      return isEntityNameExpression(node) || isBindableStaticAccessExpression(node, excludeThisKeyword);
    }
    ts2.isBindableStaticNameExpression = isBindableStaticNameExpression;
    function getNameOrArgument(expr) {
      if (ts2.isPropertyAccessExpression(expr)) {
        return expr.name;
      }
      return expr.argumentExpression;
    }
    ts2.getNameOrArgument = getNameOrArgument;
    function getAssignmentDeclarationKindWorker(expr) {
      if (ts2.isCallExpression(expr)) {
        if (!isBindableObjectDefinePropertyCall(expr)) {
          return 0;
        }
        var entityName = expr.arguments[0];
        if (isExportsIdentifier(entityName) || isModuleExportsAccessExpression(entityName)) {
          return 8;
        }
        if (isBindableStaticAccessExpression(entityName) && getElementOrPropertyAccessName(entityName) === "prototype") {
          return 9;
        }
        return 7;
      }
      if (expr.operatorToken.kind !== 63 || !isAccessExpression(expr.left) || isVoidZero(getRightMostAssignedExpression(expr))) {
        return 0;
      }
      if (isBindableStaticNameExpression(expr.left.expression, true) && getElementOrPropertyAccessName(expr.left) === "prototype" && ts2.isObjectLiteralExpression(getInitializerOfBinaryExpression(expr))) {
        return 6;
      }
      return getAssignmentDeclarationPropertyAccessKind(expr.left);
    }
    function isVoidZero(node) {
      return ts2.isVoidExpression(node) && ts2.isNumericLiteral(node.expression) && node.expression.text === "0";
    }
    function getElementOrPropertyAccessArgumentExpressionOrName(node) {
      if (ts2.isPropertyAccessExpression(node)) {
        return node.name;
      }
      var arg = skipParentheses(node.argumentExpression);
      if (ts2.isNumericLiteral(arg) || ts2.isStringLiteralLike(arg)) {
        return arg;
      }
      return node;
    }
    ts2.getElementOrPropertyAccessArgumentExpressionOrName = getElementOrPropertyAccessArgumentExpressionOrName;
    function getElementOrPropertyAccessName(node) {
      var name = getElementOrPropertyAccessArgumentExpressionOrName(node);
      if (name) {
        if (ts2.isIdentifier(name)) {
          return name.escapedText;
        }
        if (ts2.isStringLiteralLike(name) || ts2.isNumericLiteral(name)) {
          return ts2.escapeLeadingUnderscores(name.text);
        }
      }
      return void 0;
    }
    ts2.getElementOrPropertyAccessName = getElementOrPropertyAccessName;
    function getAssignmentDeclarationPropertyAccessKind(lhs) {
      if (lhs.expression.kind === 108) {
        return 4;
      } else if (isModuleExportsAccessExpression(lhs)) {
        return 2;
      } else if (isBindableStaticNameExpression(lhs.expression, true)) {
        if (isPrototypeAccess(lhs.expression)) {
          return 3;
        }
        var nextToLast = lhs;
        while (!ts2.isIdentifier(nextToLast.expression)) {
          nextToLast = nextToLast.expression;
        }
        var id = nextToLast.expression;
        if ((id.escapedText === "exports" || id.escapedText === "module" && getElementOrPropertyAccessName(nextToLast) === "exports") && isBindableStaticAccessExpression(lhs)) {
          return 1;
        }
        if (isBindableStaticNameExpression(lhs, true) || ts2.isElementAccessExpression(lhs) && isDynamicName(lhs)) {
          return 5;
        }
      }
      return 0;
    }
    ts2.getAssignmentDeclarationPropertyAccessKind = getAssignmentDeclarationPropertyAccessKind;
    function getInitializerOfBinaryExpression(expr) {
      while (ts2.isBinaryExpression(expr.right)) {
        expr = expr.right;
      }
      return expr.right;
    }
    ts2.getInitializerOfBinaryExpression = getInitializerOfBinaryExpression;
    function isPrototypePropertyAssignment(node) {
      return ts2.isBinaryExpression(node) && getAssignmentDeclarationKind(node) === 3;
    }
    ts2.isPrototypePropertyAssignment = isPrototypePropertyAssignment;
    function isSpecialPropertyDeclaration(expr) {
      return isInJSFile(expr) && expr.parent && expr.parent.kind === 237 && (!ts2.isElementAccessExpression(expr) || isLiteralLikeElementAccess(expr)) && !!ts2.getJSDocTypeTag(expr.parent);
    }
    ts2.isSpecialPropertyDeclaration = isSpecialPropertyDeclaration;
    function setValueDeclaration(symbol, node) {
      var valueDeclaration = symbol.valueDeclaration;
      if (!valueDeclaration || !(node.flags & 8388608 && !(valueDeclaration.flags & 8388608)) && (isAssignmentDeclaration(valueDeclaration) && !isAssignmentDeclaration(node)) || valueDeclaration.kind !== node.kind && isEffectiveModuleDeclaration(valueDeclaration)) {
        symbol.valueDeclaration = node;
      }
    }
    ts2.setValueDeclaration = setValueDeclaration;
    function isFunctionSymbol(symbol) {
      if (!symbol || !symbol.valueDeclaration) {
        return false;
      }
      var decl = symbol.valueDeclaration;
      return decl.kind === 255 || ts2.isVariableDeclaration(decl) && decl.initializer && ts2.isFunctionLike(decl.initializer);
    }
    ts2.isFunctionSymbol = isFunctionSymbol;
    function tryGetModuleSpecifierFromDeclaration(node) {
      var _a, _b, _c;
      switch (node.kind) {
        case 253:
          return node.initializer.arguments[0].text;
        case 265:
          return (_a = ts2.tryCast(node.moduleSpecifier, ts2.isStringLiteralLike)) === null || _a === void 0 ? void 0 : _a.text;
        case 264:
          return (_c = ts2.tryCast((_b = ts2.tryCast(node.moduleReference, ts2.isExternalModuleReference)) === null || _b === void 0 ? void 0 : _b.expression, ts2.isStringLiteralLike)) === null || _c === void 0 ? void 0 : _c.text;
        default:
          ts2.Debug.assertNever(node);
      }
    }
    ts2.tryGetModuleSpecifierFromDeclaration = tryGetModuleSpecifierFromDeclaration;
    function importFromModuleSpecifier(node) {
      return tryGetImportFromModuleSpecifier(node) || ts2.Debug.failBadSyntaxKind(node.parent);
    }
    ts2.importFromModuleSpecifier = importFromModuleSpecifier;
    function tryGetImportFromModuleSpecifier(node) {
      switch (node.parent.kind) {
        case 265:
        case 271:
          return node.parent;
        case 276:
          return node.parent.parent;
        case 207:
          return isImportCall(node.parent) || isRequireCall(node.parent, false) ? node.parent : void 0;
        case 195:
          ts2.Debug.assert(ts2.isStringLiteral(node));
          return ts2.tryCast(node.parent.parent, ts2.isImportTypeNode);
        default:
          return void 0;
      }
    }
    ts2.tryGetImportFromModuleSpecifier = tryGetImportFromModuleSpecifier;
    function getExternalModuleName(node) {
      switch (node.kind) {
        case 265:
        case 271:
          return node.moduleSpecifier;
        case 264:
          return node.moduleReference.kind === 276 ? node.moduleReference.expression : void 0;
        case 199:
          return isLiteralImportTypeNode(node) ? node.argument.literal : void 0;
        case 207:
          return node.arguments[0];
        case 260:
          return node.name.kind === 10 ? node.name : void 0;
        default:
          return ts2.Debug.assertNever(node);
      }
    }
    ts2.getExternalModuleName = getExternalModuleName;
    function getNamespaceDeclarationNode(node) {
      switch (node.kind) {
        case 265:
          return node.importClause && ts2.tryCast(node.importClause.namedBindings, ts2.isNamespaceImport);
        case 264:
          return node;
        case 271:
          return node.exportClause && ts2.tryCast(node.exportClause, ts2.isNamespaceExport);
        default:
          return ts2.Debug.assertNever(node);
      }
    }
    ts2.getNamespaceDeclarationNode = getNamespaceDeclarationNode;
    function isDefaultImport(node) {
      return node.kind === 265 && !!node.importClause && !!node.importClause.name;
    }
    ts2.isDefaultImport = isDefaultImport;
    function forEachImportClauseDeclaration(node, action) {
      if (node.name) {
        var result = action(node);
        if (result)
          return result;
      }
      if (node.namedBindings) {
        var result = ts2.isNamespaceImport(node.namedBindings) ? action(node.namedBindings) : ts2.forEach(node.namedBindings.elements, action);
        if (result)
          return result;
      }
    }
    ts2.forEachImportClauseDeclaration = forEachImportClauseDeclaration;
    function hasQuestionToken(node) {
      if (node) {
        switch (node.kind) {
          case 163:
          case 168:
          case 167:
          case 295:
          case 294:
          case 166:
          case 165:
            return node.questionToken !== void 0;
        }
      }
      return false;
    }
    ts2.hasQuestionToken = hasQuestionToken;
    function isJSDocConstructSignature(node) {
      var param = ts2.isJSDocFunctionType(node) ? ts2.firstOrUndefined(node.parameters) : void 0;
      var name = ts2.tryCast(param && param.name, ts2.isIdentifier);
      return !!name && name.escapedText === "new";
    }
    ts2.isJSDocConstructSignature = isJSDocConstructSignature;
    function isJSDocTypeAlias(node) {
      return node.kind === 343 || node.kind === 336 || node.kind === 337;
    }
    ts2.isJSDocTypeAlias = isJSDocTypeAlias;
    function isTypeAlias(node) {
      return isJSDocTypeAlias(node) || ts2.isTypeAliasDeclaration(node);
    }
    ts2.isTypeAlias = isTypeAlias;
    function getSourceOfAssignment(node) {
      return ts2.isExpressionStatement(node) && ts2.isBinaryExpression(node.expression) && node.expression.operatorToken.kind === 63 ? getRightMostAssignedExpression(node.expression) : void 0;
    }
    function getSourceOfDefaultedAssignment(node) {
      return ts2.isExpressionStatement(node) && ts2.isBinaryExpression(node.expression) && getAssignmentDeclarationKind(node.expression) !== 0 && ts2.isBinaryExpression(node.expression.right) && (node.expression.right.operatorToken.kind === 56 || node.expression.right.operatorToken.kind === 60) ? node.expression.right.right : void 0;
    }
    function getSingleInitializerOfVariableStatementOrPropertyDeclaration(node) {
      switch (node.kind) {
        case 236:
          var v = getSingleVariableOfVariableStatement(node);
          return v && v.initializer;
        case 166:
          return node.initializer;
        case 294:
          return node.initializer;
      }
    }
    ts2.getSingleInitializerOfVariableStatementOrPropertyDeclaration = getSingleInitializerOfVariableStatementOrPropertyDeclaration;
    function getSingleVariableOfVariableStatement(node) {
      return ts2.isVariableStatement(node) ? ts2.firstOrUndefined(node.declarationList.declarations) : void 0;
    }
    ts2.getSingleVariableOfVariableStatement = getSingleVariableOfVariableStatement;
    function getNestedModuleDeclaration(node) {
      return ts2.isModuleDeclaration(node) && node.body && node.body.kind === 260 ? node.body : void 0;
    }
    function getJSDocCommentsAndTags(hostNode, noCache) {
      var result;
      if (isVariableLike(hostNode) && ts2.hasInitializer(hostNode) && ts2.hasJSDocNodes(hostNode.initializer)) {
        result = ts2.addRange(result, filterOwnedJSDocTags(hostNode, ts2.last(hostNode.initializer.jsDoc)));
      }
      var node = hostNode;
      while (node && node.parent) {
        if (ts2.hasJSDocNodes(node)) {
          result = ts2.addRange(result, filterOwnedJSDocTags(hostNode, ts2.last(node.jsDoc)));
        }
        if (node.kind === 163) {
          result = ts2.addRange(result, (noCache ? ts2.getJSDocParameterTagsNoCache : ts2.getJSDocParameterTags)(node));
          break;
        }
        if (node.kind === 162) {
          result = ts2.addRange(result, (noCache ? ts2.getJSDocTypeParameterTagsNoCache : ts2.getJSDocTypeParameterTags)(node));
          break;
        }
        node = getNextJSDocCommentLocation(node);
      }
      return result || ts2.emptyArray;
    }
    ts2.getJSDocCommentsAndTags = getJSDocCommentsAndTags;
    function filterOwnedJSDocTags(hostNode, jsDoc) {
      if (ts2.isJSDoc(jsDoc)) {
        var ownedTags = ts2.filter(jsDoc.tags, function(tag) {
          return ownsJSDocTag(hostNode, tag);
        });
        return jsDoc.tags === ownedTags ? [jsDoc] : ownedTags;
      }
      return ownsJSDocTag(hostNode, jsDoc) ? [jsDoc] : void 0;
    }
    function ownsJSDocTag(hostNode, tag) {
      return !ts2.isJSDocTypeTag(tag) || !tag.parent || !ts2.isJSDoc(tag.parent) || !ts2.isParenthesizedExpression(tag.parent.parent) || tag.parent.parent === hostNode;
    }
    function getNextJSDocCommentLocation(node) {
      var parent = node.parent;
      if (parent.kind === 294 || parent.kind === 270 || parent.kind === 166 || parent.kind === 237 && node.kind === 205 || parent.kind === 246 || getNestedModuleDeclaration(parent) || ts2.isBinaryExpression(node) && node.operatorToken.kind === 63) {
        return parent;
      } else if (parent.parent && (getSingleVariableOfVariableStatement(parent.parent) === node || ts2.isBinaryExpression(parent) && parent.operatorToken.kind === 63)) {
        return parent.parent;
      } else if (parent.parent && parent.parent.parent && (getSingleVariableOfVariableStatement(parent.parent.parent) || getSingleInitializerOfVariableStatementOrPropertyDeclaration(parent.parent.parent) === node || getSourceOfDefaultedAssignment(parent.parent.parent))) {
        return parent.parent.parent;
      }
    }
    ts2.getNextJSDocCommentLocation = getNextJSDocCommentLocation;
    function getParameterSymbolFromJSDoc(node) {
      if (node.symbol) {
        return node.symbol;
      }
      if (!ts2.isIdentifier(node.name)) {
        return void 0;
      }
      var name = node.name.escapedText;
      var decl = getHostSignatureFromJSDoc(node);
      if (!decl) {
        return void 0;
      }
      var parameter = ts2.find(decl.parameters, function(p) {
        return p.name.kind === 79 && p.name.escapedText === name;
      });
      return parameter && parameter.symbol;
    }
    ts2.getParameterSymbolFromJSDoc = getParameterSymbolFromJSDoc;
    function getEffectiveContainerForJSDocTemplateTag(node) {
      if (ts2.isJSDoc(node.parent) && node.parent.tags) {
        var typeAlias = ts2.find(node.parent.tags, isJSDocTypeAlias);
        if (typeAlias) {
          return typeAlias;
        }
      }
      return getHostSignatureFromJSDoc(node);
    }
    ts2.getEffectiveContainerForJSDocTemplateTag = getEffectiveContainerForJSDocTemplateTag;
    function getHostSignatureFromJSDoc(node) {
      var host = getEffectiveJSDocHost(node);
      return host && ts2.isFunctionLike(host) ? host : void 0;
    }
    ts2.getHostSignatureFromJSDoc = getHostSignatureFromJSDoc;
    function getEffectiveJSDocHost(node) {
      var host = getJSDocHost(node);
      if (host) {
        return getSourceOfDefaultedAssignment(host) || getSourceOfAssignment(host) || getSingleInitializerOfVariableStatementOrPropertyDeclaration(host) || getSingleVariableOfVariableStatement(host) || getNestedModuleDeclaration(host) || host;
      }
    }
    ts2.getEffectiveJSDocHost = getEffectiveJSDocHost;
    function getJSDocHost(node) {
      var jsDoc = getJSDocRoot(node);
      if (!jsDoc) {
        return void 0;
      }
      var host = jsDoc.parent;
      if (host && host.jsDoc && jsDoc === ts2.lastOrUndefined(host.jsDoc)) {
        return host;
      }
    }
    ts2.getJSDocHost = getJSDocHost;
    function getJSDocRoot(node) {
      return ts2.findAncestor(node.parent, ts2.isJSDoc);
    }
    ts2.getJSDocRoot = getJSDocRoot;
    function getTypeParameterFromJsDoc(node) {
      var name = node.name.escapedText;
      var typeParameters = node.parent.parent.parent.typeParameters;
      return typeParameters && ts2.find(typeParameters, function(p) {
        return p.name.escapedText === name;
      });
    }
    ts2.getTypeParameterFromJsDoc = getTypeParameterFromJsDoc;
    function hasRestParameter(s) {
      var last = ts2.lastOrUndefined(s.parameters);
      return !!last && isRestParameter(last);
    }
    ts2.hasRestParameter = hasRestParameter;
    function isRestParameter(node) {
      var type = ts2.isJSDocParameterTag(node) ? node.typeExpression && node.typeExpression.type : node.type;
      return node.dotDotDotToken !== void 0 || !!type && type.kind === 316;
    }
    ts2.isRestParameter = isRestParameter;
    function hasTypeArguments(node) {
      return !!node.typeArguments;
    }
    ts2.hasTypeArguments = hasTypeArguments;
    var AssignmentKind;
    (function(AssignmentKind2) {
      AssignmentKind2[AssignmentKind2["None"] = 0] = "None";
      AssignmentKind2[AssignmentKind2["Definite"] = 1] = "Definite";
      AssignmentKind2[AssignmentKind2["Compound"] = 2] = "Compound";
    })(AssignmentKind = ts2.AssignmentKind || (ts2.AssignmentKind = {}));
    function getAssignmentTargetKind(node) {
      var parent = node.parent;
      while (true) {
        switch (parent.kind) {
          case 220:
            var binaryOperator = parent.operatorToken.kind;
            return isAssignmentOperator(binaryOperator) && parent.left === node ? binaryOperator === 63 || isLogicalOrCoalescingAssignmentOperator(binaryOperator) ? 1 : 2 : 0;
          case 218:
          case 219:
            var unaryOperator = parent.operator;
            return unaryOperator === 45 || unaryOperator === 46 ? 2 : 0;
          case 242:
          case 243:
            return parent.initializer === node ? 1 : 0;
          case 211:
          case 203:
          case 224:
          case 229:
            node = parent;
            break;
          case 296:
            node = parent.parent;
            break;
          case 295:
            if (parent.name !== node) {
              return 0;
            }
            node = parent.parent;
            break;
          case 294:
            if (parent.name === node) {
              return 0;
            }
            node = parent.parent;
            break;
          default:
            return 0;
        }
        parent = node.parent;
      }
    }
    ts2.getAssignmentTargetKind = getAssignmentTargetKind;
    function isAssignmentTarget(node) {
      return getAssignmentTargetKind(node) !== 0;
    }
    ts2.isAssignmentTarget = isAssignmentTarget;
    function isNodeWithPossibleHoistedDeclaration(node) {
      switch (node.kind) {
        case 234:
        case 236:
        case 247:
        case 238:
        case 248:
        case 262:
        case 288:
        case 289:
        case 249:
        case 241:
        case 242:
        case 243:
        case 239:
        case 240:
        case 251:
        case 291:
          return true;
      }
      return false;
    }
    ts2.isNodeWithPossibleHoistedDeclaration = isNodeWithPossibleHoistedDeclaration;
    function isValueSignatureDeclaration(node) {
      return ts2.isFunctionExpression(node) || ts2.isArrowFunction(node) || ts2.isMethodOrAccessor(node) || ts2.isFunctionDeclaration(node) || ts2.isConstructorDeclaration(node);
    }
    ts2.isValueSignatureDeclaration = isValueSignatureDeclaration;
    function walkUp(node, kind) {
      while (node && node.kind === kind) {
        node = node.parent;
      }
      return node;
    }
    function walkUpParenthesizedTypes(node) {
      return walkUp(node, 190);
    }
    ts2.walkUpParenthesizedTypes = walkUpParenthesizedTypes;
    function walkUpParenthesizedExpressions(node) {
      return walkUp(node, 211);
    }
    ts2.walkUpParenthesizedExpressions = walkUpParenthesizedExpressions;
    function walkUpParenthesizedTypesAndGetParentAndChild(node) {
      var child;
      while (node && node.kind === 190) {
        child = node;
        node = node.parent;
      }
      return [child, node];
    }
    ts2.walkUpParenthesizedTypesAndGetParentAndChild = walkUpParenthesizedTypesAndGetParentAndChild;
    function skipParentheses(node, excludeJSDocTypeAssertions) {
      var flags = excludeJSDocTypeAssertions ? 1 | 16 : 1;
      return ts2.skipOuterExpressions(node, flags);
    }
    ts2.skipParentheses = skipParentheses;
    function isDeleteTarget(node) {
      if (node.kind !== 205 && node.kind !== 206) {
        return false;
      }
      node = walkUpParenthesizedExpressions(node.parent);
      return node && node.kind === 214;
    }
    ts2.isDeleteTarget = isDeleteTarget;
    function isNodeDescendantOf(node, ancestor) {
      while (node) {
        if (node === ancestor)
          return true;
        node = node.parent;
      }
      return false;
    }
    ts2.isNodeDescendantOf = isNodeDescendantOf;
    function isDeclarationName(name) {
      return !ts2.isSourceFile(name) && !ts2.isBindingPattern(name) && ts2.isDeclaration(name.parent) && name.parent.name === name;
    }
    ts2.isDeclarationName = isDeclarationName;
    function getDeclarationFromName(name) {
      var parent = name.parent;
      switch (name.kind) {
        case 10:
        case 14:
        case 8:
          if (ts2.isComputedPropertyName(parent))
            return parent.parent;
        case 79:
          if (ts2.isDeclaration(parent)) {
            return parent.name === name ? parent : void 0;
          } else if (ts2.isQualifiedName(parent)) {
            var tag = parent.parent;
            return ts2.isJSDocParameterTag(tag) && tag.name === parent ? tag : void 0;
          } else {
            var binExp = parent.parent;
            return ts2.isBinaryExpression(binExp) && getAssignmentDeclarationKind(binExp) !== 0 && (binExp.left.symbol || binExp.symbol) && ts2.getNameOfDeclaration(binExp) === name ? binExp : void 0;
          }
        case 80:
          return ts2.isDeclaration(parent) && parent.name === name ? parent : void 0;
        default:
          return void 0;
      }
    }
    ts2.getDeclarationFromName = getDeclarationFromName;
    function isLiteralComputedPropertyDeclarationName(node) {
      return isStringOrNumericLiteralLike(node) && node.parent.kind === 161 && ts2.isDeclaration(node.parent.parent);
    }
    ts2.isLiteralComputedPropertyDeclarationName = isLiteralComputedPropertyDeclarationName;
    function isIdentifierName(node) {
      var parent = node.parent;
      switch (parent.kind) {
        case 166:
        case 165:
        case 168:
        case 167:
        case 171:
        case 172:
        case 297:
        case 294:
        case 205:
          return parent.name === node;
        case 160:
          return parent.right === node;
        case 202:
        case 269:
          return parent.propertyName === node;
        case 274:
        case 284:
          return true;
      }
      return false;
    }
    ts2.isIdentifierName = isIdentifierName;
    function isAliasSymbolDeclaration(node) {
      return node.kind === 264 || node.kind === 263 || node.kind === 266 && !!node.name || node.kind === 267 || node.kind === 273 || node.kind === 269 || node.kind === 274 || node.kind === 270 && exportAssignmentIsAlias(node) || ts2.isBinaryExpression(node) && getAssignmentDeclarationKind(node) === 2 && exportAssignmentIsAlias(node) || ts2.isPropertyAccessExpression(node) && ts2.isBinaryExpression(node.parent) && node.parent.left === node && node.parent.operatorToken.kind === 63 && isAliasableExpression(node.parent.right) || node.kind === 295 || node.kind === 294 && isAliasableExpression(node.initializer);
    }
    ts2.isAliasSymbolDeclaration = isAliasSymbolDeclaration;
    function getAliasDeclarationFromName(node) {
      switch (node.parent.kind) {
        case 266:
        case 269:
        case 267:
        case 274:
        case 270:
        case 264:
          return node.parent;
        case 160:
          do {
            node = node.parent;
          } while (node.parent.kind === 160);
          return getAliasDeclarationFromName(node);
      }
    }
    ts2.getAliasDeclarationFromName = getAliasDeclarationFromName;
    function isAliasableExpression(e) {
      return isEntityNameExpression(e) || ts2.isClassExpression(e);
    }
    ts2.isAliasableExpression = isAliasableExpression;
    function exportAssignmentIsAlias(node) {
      var e = getExportAssignmentExpression(node);
      return isAliasableExpression(e);
    }
    ts2.exportAssignmentIsAlias = exportAssignmentIsAlias;
    function getExportAssignmentExpression(node) {
      return ts2.isExportAssignment(node) ? node.expression : node.right;
    }
    ts2.getExportAssignmentExpression = getExportAssignmentExpression;
    function getPropertyAssignmentAliasLikeExpression(node) {
      return node.kind === 295 ? node.name : node.kind === 294 ? node.initializer : node.parent.right;
    }
    ts2.getPropertyAssignmentAliasLikeExpression = getPropertyAssignmentAliasLikeExpression;
    function getEffectiveBaseTypeNode(node) {
      var baseType = getClassExtendsHeritageElement(node);
      if (baseType && isInJSFile(node)) {
        var tag = ts2.getJSDocAugmentsTag(node);
        if (tag) {
          return tag.class;
        }
      }
      return baseType;
    }
    ts2.getEffectiveBaseTypeNode = getEffectiveBaseTypeNode;
    function getClassExtendsHeritageElement(node) {
      var heritageClause = getHeritageClause(node.heritageClauses, 94);
      return heritageClause && heritageClause.types.length > 0 ? heritageClause.types[0] : void 0;
    }
    ts2.getClassExtendsHeritageElement = getClassExtendsHeritageElement;
    function getEffectiveImplementsTypeNodes(node) {
      if (isInJSFile(node)) {
        return ts2.getJSDocImplementsTags(node).map(function(n) {
          return n.class;
        });
      } else {
        var heritageClause = getHeritageClause(node.heritageClauses, 117);
        return heritageClause === null || heritageClause === void 0 ? void 0 : heritageClause.types;
      }
    }
    ts2.getEffectiveImplementsTypeNodes = getEffectiveImplementsTypeNodes;
    function getAllSuperTypeNodes(node) {
      return ts2.isInterfaceDeclaration(node) ? getInterfaceBaseTypeNodes(node) || ts2.emptyArray : ts2.isClassLike(node) ? ts2.concatenate(ts2.singleElementArray(getEffectiveBaseTypeNode(node)), getEffectiveImplementsTypeNodes(node)) || ts2.emptyArray : ts2.emptyArray;
    }
    ts2.getAllSuperTypeNodes = getAllSuperTypeNodes;
    function getInterfaceBaseTypeNodes(node) {
      var heritageClause = getHeritageClause(node.heritageClauses, 94);
      return heritageClause ? heritageClause.types : void 0;
    }
    ts2.getInterfaceBaseTypeNodes = getInterfaceBaseTypeNodes;
    function getHeritageClause(clauses, kind) {
      if (clauses) {
        for (var _i = 0, clauses_1 = clauses; _i < clauses_1.length; _i++) {
          var clause = clauses_1[_i];
          if (clause.token === kind) {
            return clause;
          }
        }
      }
      return void 0;
    }
    ts2.getHeritageClause = getHeritageClause;
    function getAncestor(node, kind) {
      while (node) {
        if (node.kind === kind) {
          return node;
        }
        node = node.parent;
      }
      return void 0;
    }
    ts2.getAncestor = getAncestor;
    function isKeyword(token) {
      return 81 <= token && token <= 159;
    }
    ts2.isKeyword = isKeyword;
    function isContextualKeyword(token) {
      return 126 <= token && token <= 159;
    }
    ts2.isContextualKeyword = isContextualKeyword;
    function isNonContextualKeyword(token) {
      return isKeyword(token) && !isContextualKeyword(token);
    }
    ts2.isNonContextualKeyword = isNonContextualKeyword;
    function isFutureReservedKeyword(token) {
      return 117 <= token && token <= 125;
    }
    ts2.isFutureReservedKeyword = isFutureReservedKeyword;
    function isStringANonContextualKeyword(name) {
      var token = ts2.stringToToken(name);
      return token !== void 0 && isNonContextualKeyword(token);
    }
    ts2.isStringANonContextualKeyword = isStringANonContextualKeyword;
    function isStringAKeyword(name) {
      var token = ts2.stringToToken(name);
      return token !== void 0 && isKeyword(token);
    }
    ts2.isStringAKeyword = isStringAKeyword;
    function isIdentifierANonContextualKeyword(_a) {
      var originalKeywordKind = _a.originalKeywordKind;
      return !!originalKeywordKind && !isContextualKeyword(originalKeywordKind);
    }
    ts2.isIdentifierANonContextualKeyword = isIdentifierANonContextualKeyword;
    function isTrivia(token) {
      return 2 <= token && token <= 7;
    }
    ts2.isTrivia = isTrivia;
    var FunctionFlags;
    (function(FunctionFlags2) {
      FunctionFlags2[FunctionFlags2["Normal"] = 0] = "Normal";
      FunctionFlags2[FunctionFlags2["Generator"] = 1] = "Generator";
      FunctionFlags2[FunctionFlags2["Async"] = 2] = "Async";
      FunctionFlags2[FunctionFlags2["Invalid"] = 4] = "Invalid";
      FunctionFlags2[FunctionFlags2["AsyncGenerator"] = 3] = "AsyncGenerator";
    })(FunctionFlags = ts2.FunctionFlags || (ts2.FunctionFlags = {}));
    function getFunctionFlags(node) {
      if (!node) {
        return 4;
      }
      var flags = 0;
      switch (node.kind) {
        case 255:
        case 212:
        case 168:
          if (node.asteriskToken) {
            flags |= 1;
          }
        case 213:
          if (hasSyntacticModifier(node, 256)) {
            flags |= 2;
          }
          break;
      }
      if (!node.body) {
        flags |= 4;
      }
      return flags;
    }
    ts2.getFunctionFlags = getFunctionFlags;
    function isAsyncFunction(node) {
      switch (node.kind) {
        case 255:
        case 212:
        case 213:
        case 168:
          return node.body !== void 0 && node.asteriskToken === void 0 && hasSyntacticModifier(node, 256);
      }
      return false;
    }
    ts2.isAsyncFunction = isAsyncFunction;
    function isStringOrNumericLiteralLike(node) {
      return ts2.isStringLiteralLike(node) || ts2.isNumericLiteral(node);
    }
    ts2.isStringOrNumericLiteralLike = isStringOrNumericLiteralLike;
    function isSignedNumericLiteral(node) {
      return ts2.isPrefixUnaryExpression(node) && (node.operator === 39 || node.operator === 40) && ts2.isNumericLiteral(node.operand);
    }
    ts2.isSignedNumericLiteral = isSignedNumericLiteral;
    function hasDynamicName(declaration) {
      var name = ts2.getNameOfDeclaration(declaration);
      return !!name && isDynamicName(name);
    }
    ts2.hasDynamicName = hasDynamicName;
    function isDynamicName(name) {
      if (!(name.kind === 161 || name.kind === 206)) {
        return false;
      }
      var expr = ts2.isElementAccessExpression(name) ? skipParentheses(name.argumentExpression) : name.expression;
      return !isStringOrNumericLiteralLike(expr) && !isSignedNumericLiteral(expr);
    }
    ts2.isDynamicName = isDynamicName;
    function getPropertyNameForPropertyNameNode(name) {
      switch (name.kind) {
        case 79:
        case 80:
          return name.escapedText;
        case 10:
        case 8:
          return ts2.escapeLeadingUnderscores(name.text);
        case 161:
          var nameExpression = name.expression;
          if (isStringOrNumericLiteralLike(nameExpression)) {
            return ts2.escapeLeadingUnderscores(nameExpression.text);
          } else if (isSignedNumericLiteral(nameExpression)) {
            if (nameExpression.operator === 40) {
              return ts2.tokenToString(nameExpression.operator) + nameExpression.operand.text;
            }
            return nameExpression.operand.text;
          }
          return void 0;
        default:
          return ts2.Debug.assertNever(name);
      }
    }
    ts2.getPropertyNameForPropertyNameNode = getPropertyNameForPropertyNameNode;
    function isPropertyNameLiteral(node) {
      switch (node.kind) {
        case 79:
        case 10:
        case 14:
        case 8:
          return true;
        default:
          return false;
      }
    }
    ts2.isPropertyNameLiteral = isPropertyNameLiteral;
    function getTextOfIdentifierOrLiteral(node) {
      return ts2.isMemberName(node) ? ts2.idText(node) : node.text;
    }
    ts2.getTextOfIdentifierOrLiteral = getTextOfIdentifierOrLiteral;
    function getEscapedTextOfIdentifierOrLiteral(node) {
      return ts2.isMemberName(node) ? node.escapedText : ts2.escapeLeadingUnderscores(node.text);
    }
    ts2.getEscapedTextOfIdentifierOrLiteral = getEscapedTextOfIdentifierOrLiteral;
    function getPropertyNameForUniqueESSymbol(symbol) {
      return "__@".concat(ts2.getSymbolId(symbol), "@").concat(symbol.escapedName);
    }
    ts2.getPropertyNameForUniqueESSymbol = getPropertyNameForUniqueESSymbol;
    function getSymbolNameForPrivateIdentifier(containingClassSymbol, description) {
      return "__#".concat(ts2.getSymbolId(containingClassSymbol), "@").concat(description);
    }
    ts2.getSymbolNameForPrivateIdentifier = getSymbolNameForPrivateIdentifier;
    function isKnownSymbol(symbol) {
      return ts2.startsWith(symbol.escapedName, "__@");
    }
    ts2.isKnownSymbol = isKnownSymbol;
    function isPrivateIdentifierSymbol(symbol) {
      return ts2.startsWith(symbol.escapedName, "__#");
    }
    ts2.isPrivateIdentifierSymbol = isPrivateIdentifierSymbol;
    function isESSymbolIdentifier(node) {
      return node.kind === 79 && node.escapedText === "Symbol";
    }
    ts2.isESSymbolIdentifier = isESSymbolIdentifier;
    function isPushOrUnshiftIdentifier(node) {
      return node.escapedText === "push" || node.escapedText === "unshift";
    }
    ts2.isPushOrUnshiftIdentifier = isPushOrUnshiftIdentifier;
    function isParameterDeclaration(node) {
      var root = getRootDeclaration(node);
      return root.kind === 163;
    }
    ts2.isParameterDeclaration = isParameterDeclaration;
    function getRootDeclaration(node) {
      while (node.kind === 202) {
        node = node.parent.parent;
      }
      return node;
    }
    ts2.getRootDeclaration = getRootDeclaration;
    function nodeStartsNewLexicalEnvironment(node) {
      var kind = node.kind;
      return kind === 170 || kind === 212 || kind === 255 || kind === 213 || kind === 168 || kind === 171 || kind === 172 || kind === 260 || kind === 303;
    }
    ts2.nodeStartsNewLexicalEnvironment = nodeStartsNewLexicalEnvironment;
    function nodeIsSynthesized(range) {
      return positionIsSynthesized(range.pos) || positionIsSynthesized(range.end);
    }
    ts2.nodeIsSynthesized = nodeIsSynthesized;
    function getOriginalSourceFile(sourceFile) {
      return ts2.getParseTreeNode(sourceFile, ts2.isSourceFile) || sourceFile;
    }
    ts2.getOriginalSourceFile = getOriginalSourceFile;
    var Associativity;
    (function(Associativity2) {
      Associativity2[Associativity2["Left"] = 0] = "Left";
      Associativity2[Associativity2["Right"] = 1] = "Right";
    })(Associativity = ts2.Associativity || (ts2.Associativity = {}));
    function getExpressionAssociativity(expression) {
      var operator = getOperator(expression);
      var hasArguments = expression.kind === 208 && expression.arguments !== void 0;
      return getOperatorAssociativity(expression.kind, operator, hasArguments);
    }
    ts2.getExpressionAssociativity = getExpressionAssociativity;
    function getOperatorAssociativity(kind, operator, hasArguments) {
      switch (kind) {
        case 208:
          return hasArguments ? 0 : 1;
        case 218:
        case 215:
        case 216:
        case 214:
        case 217:
        case 221:
        case 223:
          return 1;
        case 220:
          switch (operator) {
            case 42:
            case 63:
            case 64:
            case 65:
            case 67:
            case 66:
            case 68:
            case 69:
            case 70:
            case 71:
            case 72:
            case 73:
            case 78:
            case 74:
            case 75:
            case 76:
            case 77:
              return 1;
          }
      }
      return 0;
    }
    ts2.getOperatorAssociativity = getOperatorAssociativity;
    function getExpressionPrecedence(expression) {
      var operator = getOperator(expression);
      var hasArguments = expression.kind === 208 && expression.arguments !== void 0;
      return getOperatorPrecedence(expression.kind, operator, hasArguments);
    }
    ts2.getExpressionPrecedence = getExpressionPrecedence;
    function getOperator(expression) {
      if (expression.kind === 220) {
        return expression.operatorToken.kind;
      } else if (expression.kind === 218 || expression.kind === 219) {
        return expression.operator;
      } else {
        return expression.kind;
      }
    }
    ts2.getOperator = getOperator;
    var OperatorPrecedence;
    (function(OperatorPrecedence2) {
      OperatorPrecedence2[OperatorPrecedence2["Comma"] = 0] = "Comma";
      OperatorPrecedence2[OperatorPrecedence2["Spread"] = 1] = "Spread";
      OperatorPrecedence2[OperatorPrecedence2["Yield"] = 2] = "Yield";
      OperatorPrecedence2[OperatorPrecedence2["Assignment"] = 3] = "Assignment";
      OperatorPrecedence2[OperatorPrecedence2["Conditional"] = 4] = "Conditional";
      OperatorPrecedence2[OperatorPrecedence2["Coalesce"] = 4] = "Coalesce";
      OperatorPrecedence2[OperatorPrecedence2["LogicalOR"] = 5] = "LogicalOR";
      OperatorPrecedence2[OperatorPrecedence2["LogicalAND"] = 6] = "LogicalAND";
      OperatorPrecedence2[OperatorPrecedence2["BitwiseOR"] = 7] = "BitwiseOR";
      OperatorPrecedence2[OperatorPrecedence2["BitwiseXOR"] = 8] = "BitwiseXOR";
      OperatorPrecedence2[OperatorPrecedence2["BitwiseAND"] = 9] = "BitwiseAND";
      OperatorPrecedence2[OperatorPrecedence2["Equality"] = 10] = "Equality";
      OperatorPrecedence2[OperatorPrecedence2["Relational"] = 11] = "Relational";
      OperatorPrecedence2[OperatorPrecedence2["Shift"] = 12] = "Shift";
      OperatorPrecedence2[OperatorPrecedence2["Additive"] = 13] = "Additive";
      OperatorPrecedence2[OperatorPrecedence2["Multiplicative"] = 14] = "Multiplicative";
      OperatorPrecedence2[OperatorPrecedence2["Exponentiation"] = 15] = "Exponentiation";
      OperatorPrecedence2[OperatorPrecedence2["Unary"] = 16] = "Unary";
      OperatorPrecedence2[OperatorPrecedence2["Update"] = 17] = "Update";
      OperatorPrecedence2[OperatorPrecedence2["LeftHandSide"] = 18] = "LeftHandSide";
      OperatorPrecedence2[OperatorPrecedence2["Member"] = 19] = "Member";
      OperatorPrecedence2[OperatorPrecedence2["Primary"] = 20] = "Primary";
      OperatorPrecedence2[OperatorPrecedence2["Highest"] = 20] = "Highest";
      OperatorPrecedence2[OperatorPrecedence2["Lowest"] = 0] = "Lowest";
      OperatorPrecedence2[OperatorPrecedence2["Invalid"] = -1] = "Invalid";
    })(OperatorPrecedence = ts2.OperatorPrecedence || (ts2.OperatorPrecedence = {}));
    function getOperatorPrecedence(nodeKind, operatorKind, hasArguments) {
      switch (nodeKind) {
        case 349:
          return 0;
        case 224:
          return 1;
        case 223:
          return 2;
        case 221:
          return 4;
        case 220:
          switch (operatorKind) {
            case 27:
              return 0;
            case 63:
            case 64:
            case 65:
            case 67:
            case 66:
            case 68:
            case 69:
            case 70:
            case 71:
            case 72:
            case 73:
            case 78:
            case 74:
            case 75:
            case 76:
            case 77:
              return 3;
            default:
              return getBinaryOperatorPrecedence(operatorKind);
          }
        case 210:
        case 229:
        case 218:
        case 215:
        case 216:
        case 214:
        case 217:
          return 16;
        case 219:
          return 17;
        case 207:
          return 18;
        case 208:
          return hasArguments ? 19 : 18;
        case 209:
        case 205:
        case 206:
        case 230:
          return 19;
        case 228:
          return 11;
        case 108:
        case 106:
        case 79:
        case 80:
        case 104:
        case 110:
        case 95:
        case 8:
        case 9:
        case 10:
        case 203:
        case 204:
        case 212:
        case 213:
        case 225:
        case 13:
        case 14:
        case 222:
        case 211:
        case 226:
        case 277:
        case 278:
        case 281:
          return 20;
        default:
          return -1;
      }
    }
    ts2.getOperatorPrecedence = getOperatorPrecedence;
    function getBinaryOperatorPrecedence(kind) {
      switch (kind) {
        case 60:
          return 4;
        case 56:
          return 5;
        case 55:
          return 6;
        case 51:
          return 7;
        case 52:
          return 8;
        case 50:
          return 9;
        case 34:
        case 35:
        case 36:
        case 37:
          return 10;
        case 29:
        case 31:
        case 32:
        case 33:
        case 102:
        case 101:
        case 127:
          return 11;
        case 47:
        case 48:
        case 49:
          return 12;
        case 39:
        case 40:
          return 13;
        case 41:
        case 43:
        case 44:
          return 14;
        case 42:
          return 15;
      }
      return -1;
    }
    ts2.getBinaryOperatorPrecedence = getBinaryOperatorPrecedence;
    function getSemanticJsxChildren(children) {
      return ts2.filter(children, function(i) {
        switch (i.kind) {
          case 287:
            return !!i.expression;
          case 11:
            return !i.containsOnlyTriviaWhiteSpaces;
          default:
            return true;
        }
      });
    }
    ts2.getSemanticJsxChildren = getSemanticJsxChildren;
    function createDiagnosticCollection() {
      var nonFileDiagnostics = [];
      var filesWithDiagnostics = [];
      var fileDiagnostics = new ts2.Map();
      var hasReadNonFileDiagnostics = false;
      return {
        add,
        lookup,
        getGlobalDiagnostics,
        getDiagnostics
      };
      function lookup(diagnostic) {
        var diagnostics;
        if (diagnostic.file) {
          diagnostics = fileDiagnostics.get(diagnostic.file.fileName);
        } else {
          diagnostics = nonFileDiagnostics;
        }
        if (!diagnostics) {
          return void 0;
        }
        var result = ts2.binarySearch(diagnostics, diagnostic, ts2.identity, compareDiagnosticsSkipRelatedInformation);
        if (result >= 0) {
          return diagnostics[result];
        }
        return void 0;
      }
      function add(diagnostic) {
        var diagnostics;
        if (diagnostic.file) {
          diagnostics = fileDiagnostics.get(diagnostic.file.fileName);
          if (!diagnostics) {
            diagnostics = [];
            fileDiagnostics.set(diagnostic.file.fileName, diagnostics);
            ts2.insertSorted(filesWithDiagnostics, diagnostic.file.fileName, ts2.compareStringsCaseSensitive);
          }
        } else {
          if (hasReadNonFileDiagnostics) {
            hasReadNonFileDiagnostics = false;
            nonFileDiagnostics = nonFileDiagnostics.slice();
          }
          diagnostics = nonFileDiagnostics;
        }
        ts2.insertSorted(diagnostics, diagnostic, compareDiagnostics);
      }
      function getGlobalDiagnostics() {
        hasReadNonFileDiagnostics = true;
        return nonFileDiagnostics;
      }
      function getDiagnostics(fileName) {
        if (fileName) {
          return fileDiagnostics.get(fileName) || [];
        }
        var fileDiags = ts2.flatMapToMutable(filesWithDiagnostics, function(f) {
          return fileDiagnostics.get(f);
        });
        if (!nonFileDiagnostics.length) {
          return fileDiags;
        }
        fileDiags.unshift.apply(fileDiags, nonFileDiagnostics);
        return fileDiags;
      }
    }
    ts2.createDiagnosticCollection = createDiagnosticCollection;
    var templateSubstitutionRegExp = /\$\{/g;
    function escapeTemplateSubstitution(str) {
      return str.replace(templateSubstitutionRegExp, "\\${");
    }
    function hasInvalidEscape(template) {
      return template && !!(ts2.isNoSubstitutionTemplateLiteral(template) ? template.templateFlags : template.head.templateFlags || ts2.some(template.templateSpans, function(span) {
        return !!span.literal.templateFlags;
      }));
    }
    ts2.hasInvalidEscape = hasInvalidEscape;
    var doubleQuoteEscapedCharsRegExp = /[\\\"\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
    var singleQuoteEscapedCharsRegExp = /[\\\'\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
    var backtickQuoteEscapedCharsRegExp = /\r\n|[\\\`\u0000-\u001f\t\v\f\b\r\u2028\u2029\u0085]/g;
    var escapedCharsMap = new ts2.Map(ts2.getEntries({
      "	": "\\t",
      "\v": "\\v",
      "\f": "\\f",
      "\b": "\\b",
      "\r": "\\r",
      "\n": "\\n",
      "\\": "\\\\",
      '"': '\\"',
      "'": "\\'",
      "`": "\\`",
      "\u2028": "\\u2028",
      "\u2029": "\\u2029",
      "\x85": "\\u0085",
      "\r\n": "\\r\\n"
    }));
    function encodeUtf16EscapeSequence(charCode) {
      var hexCharCode = charCode.toString(16).toUpperCase();
      var paddedHexCode = ("0000" + hexCharCode).slice(-4);
      return "\\u" + paddedHexCode;
    }
    function getReplacement(c, offset, input) {
      if (c.charCodeAt(0) === 0) {
        var lookAhead = input.charCodeAt(offset + c.length);
        if (lookAhead >= 48 && lookAhead <= 57) {
          return "\\x00";
        }
        return "\\0";
      }
      return escapedCharsMap.get(c) || encodeUtf16EscapeSequence(c.charCodeAt(0));
    }
    function escapeString(s, quoteChar) {
      var escapedCharsRegExp = quoteChar === 96 ? backtickQuoteEscapedCharsRegExp : quoteChar === 39 ? singleQuoteEscapedCharsRegExp : doubleQuoteEscapedCharsRegExp;
      return s.replace(escapedCharsRegExp, getReplacement);
    }
    ts2.escapeString = escapeString;
    var nonAsciiCharacters = /[^\u0000-\u007F]/g;
    function escapeNonAsciiString(s, quoteChar) {
      s = escapeString(s, quoteChar);
      return nonAsciiCharacters.test(s) ? s.replace(nonAsciiCharacters, function(c) {
        return encodeUtf16EscapeSequence(c.charCodeAt(0));
      }) : s;
    }
    ts2.escapeNonAsciiString = escapeNonAsciiString;
    var jsxDoubleQuoteEscapedCharsRegExp = /[\"\u0000-\u001f\u2028\u2029\u0085]/g;
    var jsxSingleQuoteEscapedCharsRegExp = /[\'\u0000-\u001f\u2028\u2029\u0085]/g;
    var jsxEscapedCharsMap = new ts2.Map(ts2.getEntries({
      '"': "&quot;",
      "'": "&apos;"
    }));
    function encodeJsxCharacterEntity(charCode) {
      var hexCharCode = charCode.toString(16).toUpperCase();
      return "&#x" + hexCharCode + ";";
    }
    function getJsxAttributeStringReplacement(c) {
      if (c.charCodeAt(0) === 0) {
        return "&#0;";
      }
      return jsxEscapedCharsMap.get(c) || encodeJsxCharacterEntity(c.charCodeAt(0));
    }
    function escapeJsxAttributeString(s, quoteChar) {
      var escapedCharsRegExp = quoteChar === 39 ? jsxSingleQuoteEscapedCharsRegExp : jsxDoubleQuoteEscapedCharsRegExp;
      return s.replace(escapedCharsRegExp, getJsxAttributeStringReplacement);
    }
    ts2.escapeJsxAttributeString = escapeJsxAttributeString;
    function stripQuotes(name) {
      var length = name.length;
      if (length >= 2 && name.charCodeAt(0) === name.charCodeAt(length - 1) && isQuoteOrBacktick(name.charCodeAt(0))) {
        return name.substring(1, length - 1);
      }
      return name;
    }
    ts2.stripQuotes = stripQuotes;
    function isQuoteOrBacktick(charCode) {
      return charCode === 39 || charCode === 34 || charCode === 96;
    }
    function isIntrinsicJsxName(name) {
      var ch = name.charCodeAt(0);
      return ch >= 97 && ch <= 122 || ts2.stringContains(name, "-") || ts2.stringContains(name, ":");
    }
    ts2.isIntrinsicJsxName = isIntrinsicJsxName;
    var indentStrings = ["", "    "];
    function getIndentString(level) {
      var singleLevel = indentStrings[1];
      for (var current = indentStrings.length; current <= level; current++) {
        indentStrings.push(indentStrings[current - 1] + singleLevel);
      }
      return indentStrings[level];
    }
    ts2.getIndentString = getIndentString;
    function getIndentSize() {
      return indentStrings[1].length;
    }
    ts2.getIndentSize = getIndentSize;
    function createTextWriter(newLine) {
      var output;
      var indent;
      var lineStart;
      var lineCount;
      var linePos;
      var hasTrailingComment = false;
      function updateLineCountAndPosFor(s) {
        var lineStartsOfS = ts2.computeLineStarts(s);
        if (lineStartsOfS.length > 1) {
          lineCount = lineCount + lineStartsOfS.length - 1;
          linePos = output.length - s.length + ts2.last(lineStartsOfS);
          lineStart = linePos - output.length === 0;
        } else {
          lineStart = false;
        }
      }
      function writeText(s) {
        if (s && s.length) {
          if (lineStart) {
            s = getIndentString(indent) + s;
            lineStart = false;
          }
          output += s;
          updateLineCountAndPosFor(s);
        }
      }
      function write(s) {
        if (s)
          hasTrailingComment = false;
        writeText(s);
      }
      function writeComment(s) {
        if (s)
          hasTrailingComment = true;
        writeText(s);
      }
      function reset() {
        output = "";
        indent = 0;
        lineStart = true;
        lineCount = 0;
        linePos = 0;
        hasTrailingComment = false;
      }
      function rawWrite(s) {
        if (s !== void 0) {
          output += s;
          updateLineCountAndPosFor(s);
          hasTrailingComment = false;
        }
      }
      function writeLiteral(s) {
        if (s && s.length) {
          write(s);
        }
      }
      function writeLine(force) {
        if (!lineStart || force) {
          output += newLine;
          lineCount++;
          linePos = output.length;
          lineStart = true;
          hasTrailingComment = false;
        }
      }
      function getTextPosWithWriteLine() {
        return lineStart ? output.length : output.length + newLine.length;
      }
      reset();
      return {
        write,
        rawWrite,
        writeLiteral,
        writeLine,
        increaseIndent: function() {
          indent++;
        },
        decreaseIndent: function() {
          indent--;
        },
        getIndent: function() {
          return indent;
        },
        getTextPos: function() {
          return output.length;
        },
        getLine: function() {
          return lineCount;
        },
        getColumn: function() {
          return lineStart ? indent * getIndentSize() : output.length - linePos;
        },
        getText: function() {
          return output;
        },
        isAtStartOfLine: function() {
          return lineStart;
        },
        hasTrailingComment: function() {
          return hasTrailingComment;
        },
        hasTrailingWhitespace: function() {
          return !!output.length && ts2.isWhiteSpaceLike(output.charCodeAt(output.length - 1));
        },
        clear: reset,
        reportInaccessibleThisError: ts2.noop,
        reportPrivateInBaseOfClassExpression: ts2.noop,
        reportInaccessibleUniqueSymbolError: ts2.noop,
        trackSymbol: function() {
          return false;
        },
        writeKeyword: write,
        writeOperator: write,
        writeParameter: write,
        writeProperty: write,
        writePunctuation: write,
        writeSpace: write,
        writeStringLiteral: write,
        writeSymbol: function(s, _) {
          return write(s);
        },
        writeTrailingSemicolon: write,
        writeComment,
        getTextPosWithWriteLine
      };
    }
    ts2.createTextWriter = createTextWriter;
    function getTrailingSemicolonDeferringWriter(writer) {
      var pendingTrailingSemicolon = false;
      function commitPendingTrailingSemicolon() {
        if (pendingTrailingSemicolon) {
          writer.writeTrailingSemicolon(";");
          pendingTrailingSemicolon = false;
        }
      }
      return __assign(__assign({}, writer), { writeTrailingSemicolon: function() {
        pendingTrailingSemicolon = true;
      }, writeLiteral: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeLiteral(s);
      }, writeStringLiteral: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeStringLiteral(s);
      }, writeSymbol: function(s, sym) {
        commitPendingTrailingSemicolon();
        writer.writeSymbol(s, sym);
      }, writePunctuation: function(s) {
        commitPendingTrailingSemicolon();
        writer.writePunctuation(s);
      }, writeKeyword: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeKeyword(s);
      }, writeOperator: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeOperator(s);
      }, writeParameter: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeParameter(s);
      }, writeSpace: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeSpace(s);
      }, writeProperty: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeProperty(s);
      }, writeComment: function(s) {
        commitPendingTrailingSemicolon();
        writer.writeComment(s);
      }, writeLine: function() {
        commitPendingTrailingSemicolon();
        writer.writeLine();
      }, increaseIndent: function() {
        commitPendingTrailingSemicolon();
        writer.increaseIndent();
      }, decreaseIndent: function() {
        commitPendingTrailingSemicolon();
        writer.decreaseIndent();
      } });
    }
    ts2.getTrailingSemicolonDeferringWriter = getTrailingSemicolonDeferringWriter;
    function hostUsesCaseSensitiveFileNames(host) {
      return host.useCaseSensitiveFileNames ? host.useCaseSensitiveFileNames() : false;
    }
    ts2.hostUsesCaseSensitiveFileNames = hostUsesCaseSensitiveFileNames;
    function hostGetCanonicalFileName(host) {
      return ts2.createGetCanonicalFileName(hostUsesCaseSensitiveFileNames(host));
    }
    ts2.hostGetCanonicalFileName = hostGetCanonicalFileName;
    function getResolvedExternalModuleName(host, file, referenceFile) {
      return file.moduleName || getExternalModuleNameFromPath(host, file.fileName, referenceFile && referenceFile.fileName);
    }
    ts2.getResolvedExternalModuleName = getResolvedExternalModuleName;
    function getCanonicalAbsolutePath(host, path) {
      return host.getCanonicalFileName(ts2.getNormalizedAbsolutePath(path, host.getCurrentDirectory()));
    }
    function getExternalModuleNameFromDeclaration(host, resolver, declaration) {
      var file = resolver.getExternalModuleFileFromDeclaration(declaration);
      if (!file || file.isDeclarationFile) {
        return void 0;
      }
      var specifier = getExternalModuleName(declaration);
      if (specifier && ts2.isStringLiteralLike(specifier) && !ts2.pathIsRelative(specifier.text) && getCanonicalAbsolutePath(host, file.path).indexOf(getCanonicalAbsolutePath(host, ts2.ensureTrailingDirectorySeparator(host.getCommonSourceDirectory()))) === -1) {
        return void 0;
      }
      return getResolvedExternalModuleName(host, file);
    }
    ts2.getExternalModuleNameFromDeclaration = getExternalModuleNameFromDeclaration;
    function getExternalModuleNameFromPath(host, fileName, referencePath) {
      var getCanonicalFileName = function(f) {
        return host.getCanonicalFileName(f);
      };
      var dir = ts2.toPath(referencePath ? ts2.getDirectoryPath(referencePath) : host.getCommonSourceDirectory(), host.getCurrentDirectory(), getCanonicalFileName);
      var filePath = ts2.getNormalizedAbsolutePath(fileName, host.getCurrentDirectory());
      var relativePath = ts2.getRelativePathToDirectoryOrUrl(dir, filePath, dir, getCanonicalFileName, false);
      var extensionless = removeFileExtension(relativePath);
      return referencePath ? ts2.ensurePathIsNonModuleName(extensionless) : extensionless;
    }
    ts2.getExternalModuleNameFromPath = getExternalModuleNameFromPath;
    function getOwnEmitOutputFilePath(fileName, host, extension) {
      var compilerOptions = host.getCompilerOptions();
      var emitOutputFilePathWithoutExtension;
      if (compilerOptions.outDir) {
        emitOutputFilePathWithoutExtension = removeFileExtension(getSourceFilePathInNewDir(fileName, host, compilerOptions.outDir));
      } else {
        emitOutputFilePathWithoutExtension = removeFileExtension(fileName);
      }
      return emitOutputFilePathWithoutExtension + extension;
    }
    ts2.getOwnEmitOutputFilePath = getOwnEmitOutputFilePath;
    function getDeclarationEmitOutputFilePath(fileName, host) {
      return getDeclarationEmitOutputFilePathWorker(fileName, host.getCompilerOptions(), host.getCurrentDirectory(), host.getCommonSourceDirectory(), function(f) {
        return host.getCanonicalFileName(f);
      });
    }
    ts2.getDeclarationEmitOutputFilePath = getDeclarationEmitOutputFilePath;
    function getDeclarationEmitOutputFilePathWorker(fileName, options, currentDirectory, commonSourceDirectory, getCanonicalFileName) {
      var outputDir = options.declarationDir || options.outDir;
      var path = outputDir ? getSourceFilePathInNewDirWorker(fileName, outputDir, currentDirectory, commonSourceDirectory, getCanonicalFileName) : fileName;
      var declarationExtension = getDeclarationEmitExtensionForPath(path);
      return removeFileExtension(path) + declarationExtension;
    }
    ts2.getDeclarationEmitOutputFilePathWorker = getDeclarationEmitOutputFilePathWorker;
    function getDeclarationEmitExtensionForPath(path) {
      return ts2.fileExtensionIsOneOf(path, [".mjs", ".mts"]) ? ".d.mts" : ts2.fileExtensionIsOneOf(path, [".cjs", ".cts"]) ? ".d.cts" : ts2.fileExtensionIsOneOf(path, [".json"]) ? ".json.d.ts" : ".d.ts";
    }
    ts2.getDeclarationEmitExtensionForPath = getDeclarationEmitExtensionForPath;
    function outFile(options) {
      return options.outFile || options.out;
    }
    ts2.outFile = outFile;
    function getPathsBasePath(options, host) {
      var _a, _b;
      if (!options.paths)
        return void 0;
      return (_a = options.baseUrl) !== null && _a !== void 0 ? _a : ts2.Debug.checkDefined(options.pathsBasePath || ((_b = host.getCurrentDirectory) === null || _b === void 0 ? void 0 : _b.call(host)), "Encountered 'paths' without a 'baseUrl', config file, or host 'getCurrentDirectory'.");
    }
    ts2.getPathsBasePath = getPathsBasePath;
    function getSourceFilesToEmit(host, targetSourceFile, forceDtsEmit) {
      var options = host.getCompilerOptions();
      if (outFile(options)) {
        var moduleKind = getEmitModuleKind(options);
        var moduleEmitEnabled_1 = options.emitDeclarationOnly || moduleKind === ts2.ModuleKind.AMD || moduleKind === ts2.ModuleKind.System;
        return ts2.filter(host.getSourceFiles(), function(sourceFile) {
          return (moduleEmitEnabled_1 || !ts2.isExternalModule(sourceFile)) && sourceFileMayBeEmitted(sourceFile, host, forceDtsEmit);
        });
      } else {
        var sourceFiles = targetSourceFile === void 0 ? host.getSourceFiles() : [targetSourceFile];
        return ts2.filter(sourceFiles, function(sourceFile) {
          return sourceFileMayBeEmitted(sourceFile, host, forceDtsEmit);
        });
      }
    }
    ts2.getSourceFilesToEmit = getSourceFilesToEmit;
    function sourceFileMayBeEmitted(sourceFile, host, forceDtsEmit) {
      var options = host.getCompilerOptions();
      return !(options.noEmitForJsFiles && isSourceFileJS(sourceFile)) && !sourceFile.isDeclarationFile && !host.isSourceFileFromExternalLibrary(sourceFile) && (forceDtsEmit || !(isJsonSourceFile(sourceFile) && host.getResolvedProjectReferenceToRedirect(sourceFile.fileName)) && !host.isSourceOfProjectReferenceRedirect(sourceFile.fileName));
    }
    ts2.sourceFileMayBeEmitted = sourceFileMayBeEmitted;
    function getSourceFilePathInNewDir(fileName, host, newDirPath) {
      return getSourceFilePathInNewDirWorker(fileName, newDirPath, host.getCurrentDirectory(), host.getCommonSourceDirectory(), function(f) {
        return host.getCanonicalFileName(f);
      });
    }
    ts2.getSourceFilePathInNewDir = getSourceFilePathInNewDir;
    function getSourceFilePathInNewDirWorker(fileName, newDirPath, currentDirectory, commonSourceDirectory, getCanonicalFileName) {
      var sourceFilePath = ts2.getNormalizedAbsolutePath(fileName, currentDirectory);
      var isSourceFileInCommonSourceDirectory = getCanonicalFileName(sourceFilePath).indexOf(getCanonicalFileName(commonSourceDirectory)) === 0;
      sourceFilePath = isSourceFileInCommonSourceDirectory ? sourceFilePath.substring(commonSourceDirectory.length) : sourceFilePath;
      return ts2.combinePaths(newDirPath, sourceFilePath);
    }
    ts2.getSourceFilePathInNewDirWorker = getSourceFilePathInNewDirWorker;
    function writeFile(host, diagnostics, fileName, data, writeByteOrderMark, sourceFiles) {
      host.writeFile(fileName, data, writeByteOrderMark, function(hostErrorMessage) {
        diagnostics.add(createCompilerDiagnostic(ts2.Diagnostics.Could_not_write_file_0_Colon_1, fileName, hostErrorMessage));
      }, sourceFiles);
    }
    ts2.writeFile = writeFile;
    function ensureDirectoriesExist(directoryPath, createDirectory, directoryExists) {
      if (directoryPath.length > ts2.getRootLength(directoryPath) && !directoryExists(directoryPath)) {
        var parentDirectory = ts2.getDirectoryPath(directoryPath);
        ensureDirectoriesExist(parentDirectory, createDirectory, directoryExists);
        createDirectory(directoryPath);
      }
    }
    function writeFileEnsuringDirectories(path, data, writeByteOrderMark, writeFile2, createDirectory, directoryExists) {
      try {
        writeFile2(path, data, writeByteOrderMark);
      } catch (_a) {
        ensureDirectoriesExist(ts2.getDirectoryPath(ts2.normalizePath(path)), createDirectory, directoryExists);
        writeFile2(path, data, writeByteOrderMark);
      }
    }
    ts2.writeFileEnsuringDirectories = writeFileEnsuringDirectories;
    function getLineOfLocalPosition(sourceFile, pos) {
      var lineStarts = ts2.getLineStarts(sourceFile);
      return ts2.computeLineOfPosition(lineStarts, pos);
    }
    ts2.getLineOfLocalPosition = getLineOfLocalPosition;
    function getLineOfLocalPositionFromLineMap(lineMap, pos) {
      return ts2.computeLineOfPosition(lineMap, pos);
    }
    ts2.getLineOfLocalPositionFromLineMap = getLineOfLocalPositionFromLineMap;
    function getFirstConstructorWithBody(node) {
      return ts2.find(node.members, function(member) {
        return ts2.isConstructorDeclaration(member) && nodeIsPresent(member.body);
      });
    }
    ts2.getFirstConstructorWithBody = getFirstConstructorWithBody;
    function getSetAccessorValueParameter(accessor) {
      if (accessor && accessor.parameters.length > 0) {
        var hasThis = accessor.parameters.length === 2 && parameterIsThisKeyword(accessor.parameters[0]);
        return accessor.parameters[hasThis ? 1 : 0];
      }
    }
    ts2.getSetAccessorValueParameter = getSetAccessorValueParameter;
    function getSetAccessorTypeAnnotationNode(accessor) {
      var parameter = getSetAccessorValueParameter(accessor);
      return parameter && parameter.type;
    }
    ts2.getSetAccessorTypeAnnotationNode = getSetAccessorTypeAnnotationNode;
    function getThisParameter(signature) {
      if (signature.parameters.length && !ts2.isJSDocSignature(signature)) {
        var thisParameter = signature.parameters[0];
        if (parameterIsThisKeyword(thisParameter)) {
          return thisParameter;
        }
      }
    }
    ts2.getThisParameter = getThisParameter;
    function parameterIsThisKeyword(parameter) {
      return isThisIdentifier(parameter.name);
    }
    ts2.parameterIsThisKeyword = parameterIsThisKeyword;
    function isThisIdentifier(node) {
      return !!node && node.kind === 79 && identifierIsThisKeyword(node);
    }
    ts2.isThisIdentifier = isThisIdentifier;
    function isThisInTypeQuery(node) {
      if (!isThisIdentifier(node)) {
        return false;
      }
      while (ts2.isQualifiedName(node.parent) && node.parent.left === node) {
        node = node.parent;
      }
      return node.parent.kind === 180;
    }
    ts2.isThisInTypeQuery = isThisInTypeQuery;
    function identifierIsThisKeyword(id) {
      return id.originalKeywordKind === 108;
    }
    ts2.identifierIsThisKeyword = identifierIsThisKeyword;
    function getAllAccessorDeclarations(declarations, accessor) {
      var firstAccessor;
      var secondAccessor;
      var getAccessor;
      var setAccessor;
      if (hasDynamicName(accessor)) {
        firstAccessor = accessor;
        if (accessor.kind === 171) {
          getAccessor = accessor;
        } else if (accessor.kind === 172) {
          setAccessor = accessor;
        } else {
          ts2.Debug.fail("Accessor has wrong kind");
        }
      } else {
        ts2.forEach(declarations, function(member) {
          if (ts2.isAccessor(member) && isStatic(member) === isStatic(accessor)) {
            var memberName = getPropertyNameForPropertyNameNode(member.name);
            var accessorName = getPropertyNameForPropertyNameNode(accessor.name);
            if (memberName === accessorName) {
              if (!firstAccessor) {
                firstAccessor = member;
              } else if (!secondAccessor) {
                secondAccessor = member;
              }
              if (member.kind === 171 && !getAccessor) {
                getAccessor = member;
              }
              if (member.kind === 172 && !setAccessor) {
                setAccessor = member;
              }
            }
          }
        });
      }
      return {
        firstAccessor,
        secondAccessor,
        getAccessor,
        setAccessor
      };
    }
    ts2.getAllAccessorDeclarations = getAllAccessorDeclarations;
    function getEffectiveTypeAnnotationNode(node) {
      if (!isInJSFile(node) && ts2.isFunctionDeclaration(node))
        return void 0;
      var type = node.type;
      if (type || !isInJSFile(node))
        return type;
      return ts2.isJSDocPropertyLikeTag(node) ? node.typeExpression && node.typeExpression.type : ts2.getJSDocType(node);
    }
    ts2.getEffectiveTypeAnnotationNode = getEffectiveTypeAnnotationNode;
    function getTypeAnnotationNode(node) {
      return node.type;
    }
    ts2.getTypeAnnotationNode = getTypeAnnotationNode;
    function getEffectiveReturnTypeNode(node) {
      return ts2.isJSDocSignature(node) ? node.type && node.type.typeExpression && node.type.typeExpression.type : node.type || (isInJSFile(node) ? ts2.getJSDocReturnType(node) : void 0);
    }
    ts2.getEffectiveReturnTypeNode = getEffectiveReturnTypeNode;
    function getJSDocTypeParameterDeclarations(node) {
      return ts2.flatMap(ts2.getJSDocTags(node), function(tag) {
        return isNonTypeAliasTemplate(tag) ? tag.typeParameters : void 0;
      });
    }
    ts2.getJSDocTypeParameterDeclarations = getJSDocTypeParameterDeclarations;
    function isNonTypeAliasTemplate(tag) {
      return ts2.isJSDocTemplateTag(tag) && !(tag.parent.kind === 318 && tag.parent.tags.some(isJSDocTypeAlias));
    }
    function getEffectiveSetAccessorTypeAnnotationNode(node) {
      var parameter = getSetAccessorValueParameter(node);
      return parameter && getEffectiveTypeAnnotationNode(parameter);
    }
    ts2.getEffectiveSetAccessorTypeAnnotationNode = getEffectiveSetAccessorTypeAnnotationNode;
    function emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments) {
      emitNewLineBeforeLeadingCommentsOfPosition(lineMap, writer, node.pos, leadingComments);
    }
    ts2.emitNewLineBeforeLeadingComments = emitNewLineBeforeLeadingComments;
    function emitNewLineBeforeLeadingCommentsOfPosition(lineMap, writer, pos, leadingComments) {
      if (leadingComments && leadingComments.length && pos !== leadingComments[0].pos && getLineOfLocalPositionFromLineMap(lineMap, pos) !== getLineOfLocalPositionFromLineMap(lineMap, leadingComments[0].pos)) {
        writer.writeLine();
      }
    }
    ts2.emitNewLineBeforeLeadingCommentsOfPosition = emitNewLineBeforeLeadingCommentsOfPosition;
    function emitNewLineBeforeLeadingCommentOfPosition(lineMap, writer, pos, commentPos) {
      if (pos !== commentPos && getLineOfLocalPositionFromLineMap(lineMap, pos) !== getLineOfLocalPositionFromLineMap(lineMap, commentPos)) {
        writer.writeLine();
      }
    }
    ts2.emitNewLineBeforeLeadingCommentOfPosition = emitNewLineBeforeLeadingCommentOfPosition;
    function emitComments(text, lineMap, writer, comments, leadingSeparator, trailingSeparator, newLine, writeComment) {
      if (comments && comments.length > 0) {
        if (leadingSeparator) {
          writer.writeSpace(" ");
        }
        var emitInterveningSeparator = false;
        for (var _i = 0, comments_1 = comments; _i < comments_1.length; _i++) {
          var comment = comments_1[_i];
          if (emitInterveningSeparator) {
            writer.writeSpace(" ");
            emitInterveningSeparator = false;
          }
          writeComment(text, lineMap, writer, comment.pos, comment.end, newLine);
          if (comment.hasTrailingNewLine) {
            writer.writeLine();
          } else {
            emitInterveningSeparator = true;
          }
        }
        if (emitInterveningSeparator && trailingSeparator) {
          writer.writeSpace(" ");
        }
      }
    }
    ts2.emitComments = emitComments;
    function emitDetachedComments(text, lineMap, writer, writeComment, node, newLine, removeComments) {
      var leadingComments;
      var currentDetachedCommentInfo;
      if (removeComments) {
        if (node.pos === 0) {
          leadingComments = ts2.filter(ts2.getLeadingCommentRanges(text, node.pos), isPinnedCommentLocal);
        }
      } else {
        leadingComments = ts2.getLeadingCommentRanges(text, node.pos);
      }
      if (leadingComments) {
        var detachedComments = [];
        var lastComment = void 0;
        for (var _i = 0, leadingComments_1 = leadingComments; _i < leadingComments_1.length; _i++) {
          var comment = leadingComments_1[_i];
          if (lastComment) {
            var lastCommentLine = getLineOfLocalPositionFromLineMap(lineMap, lastComment.end);
            var commentLine = getLineOfLocalPositionFromLineMap(lineMap, comment.pos);
            if (commentLine >= lastCommentLine + 2) {
              break;
            }
          }
          detachedComments.push(comment);
          lastComment = comment;
        }
        if (detachedComments.length) {
          var lastCommentLine = getLineOfLocalPositionFromLineMap(lineMap, ts2.last(detachedComments).end);
          var nodeLine = getLineOfLocalPositionFromLineMap(lineMap, ts2.skipTrivia(text, node.pos));
          if (nodeLine >= lastCommentLine + 2) {
            emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments);
            emitComments(text, lineMap, writer, detachedComments, false, true, newLine, writeComment);
            currentDetachedCommentInfo = { nodePos: node.pos, detachedCommentEndPos: ts2.last(detachedComments).end };
          }
        }
      }
      return currentDetachedCommentInfo;
      function isPinnedCommentLocal(comment2) {
        return isPinnedComment(text, comment2.pos);
      }
    }
    ts2.emitDetachedComments = emitDetachedComments;
    function writeCommentRange(text, lineMap, writer, commentPos, commentEnd, newLine) {
      if (text.charCodeAt(commentPos + 1) === 42) {
        var firstCommentLineAndCharacter = ts2.computeLineAndCharacterOfPosition(lineMap, commentPos);
        var lineCount = lineMap.length;
        var firstCommentLineIndent = void 0;
        for (var pos = commentPos, currentLine = firstCommentLineAndCharacter.line; pos < commentEnd; currentLine++) {
          var nextLineStart = currentLine + 1 === lineCount ? text.length + 1 : lineMap[currentLine + 1];
          if (pos !== commentPos) {
            if (firstCommentLineIndent === void 0) {
              firstCommentLineIndent = calculateIndent(text, lineMap[firstCommentLineAndCharacter.line], commentPos);
            }
            var currentWriterIndentSpacing = writer.getIndent() * getIndentSize();
            var spacesToEmit = currentWriterIndentSpacing - firstCommentLineIndent + calculateIndent(text, pos, nextLineStart);
            if (spacesToEmit > 0) {
              var numberOfSingleSpacesToEmit = spacesToEmit % getIndentSize();
              var indentSizeSpaceString = getIndentString((spacesToEmit - numberOfSingleSpacesToEmit) / getIndentSize());
              writer.rawWrite(indentSizeSpaceString);
              while (numberOfSingleSpacesToEmit) {
                writer.rawWrite(" ");
                numberOfSingleSpacesToEmit--;
              }
            } else {
              writer.rawWrite("");
            }
          }
          writeTrimmedCurrentLine(text, commentEnd, writer, newLine, pos, nextLineStart);
          pos = nextLineStart;
        }
      } else {
        writer.writeComment(text.substring(commentPos, commentEnd));
      }
    }
    ts2.writeCommentRange = writeCommentRange;
    function writeTrimmedCurrentLine(text, commentEnd, writer, newLine, pos, nextLineStart) {
      var end = Math.min(commentEnd, nextLineStart - 1);
      var currentLineText = ts2.trimString(text.substring(pos, end));
      if (currentLineText) {
        writer.writeComment(currentLineText);
        if (end !== commentEnd) {
          writer.writeLine();
        }
      } else {
        writer.rawWrite(newLine);
      }
    }
    function calculateIndent(text, pos, end) {
      var currentLineIndent = 0;
      for (; pos < end && ts2.isWhiteSpaceSingleLine(text.charCodeAt(pos)); pos++) {
        if (text.charCodeAt(pos) === 9) {
          currentLineIndent += getIndentSize() - currentLineIndent % getIndentSize();
        } else {
          currentLineIndent++;
        }
      }
      return currentLineIndent;
    }
    function hasEffectiveModifiers(node) {
      return getEffectiveModifierFlags(node) !== 0;
    }
    ts2.hasEffectiveModifiers = hasEffectiveModifiers;
    function hasSyntacticModifiers(node) {
      return getSyntacticModifierFlags(node) !== 0;
    }
    ts2.hasSyntacticModifiers = hasSyntacticModifiers;
    function hasEffectiveModifier(node, flags) {
      return !!getSelectedEffectiveModifierFlags(node, flags);
    }
    ts2.hasEffectiveModifier = hasEffectiveModifier;
    function hasSyntacticModifier(node, flags) {
      return !!getSelectedSyntacticModifierFlags(node, flags);
    }
    ts2.hasSyntacticModifier = hasSyntacticModifier;
    function isStatic(node) {
      return ts2.isClassElement(node) && hasStaticModifier(node) || ts2.isClassStaticBlockDeclaration(node);
    }
    ts2.isStatic = isStatic;
    function hasStaticModifier(node) {
      return hasSyntacticModifier(node, 32);
    }
    ts2.hasStaticModifier = hasStaticModifier;
    function hasOverrideModifier(node) {
      return hasEffectiveModifier(node, 16384);
    }
    ts2.hasOverrideModifier = hasOverrideModifier;
    function hasAbstractModifier(node) {
      return hasSyntacticModifier(node, 128);
    }
    ts2.hasAbstractModifier = hasAbstractModifier;
    function hasAmbientModifier(node) {
      return hasSyntacticModifier(node, 2);
    }
    ts2.hasAmbientModifier = hasAmbientModifier;
    function hasEffectiveReadonlyModifier(node) {
      return hasEffectiveModifier(node, 64);
    }
    ts2.hasEffectiveReadonlyModifier = hasEffectiveReadonlyModifier;
    function getSelectedEffectiveModifierFlags(node, flags) {
      return getEffectiveModifierFlags(node) & flags;
    }
    ts2.getSelectedEffectiveModifierFlags = getSelectedEffectiveModifierFlags;
    function getSelectedSyntacticModifierFlags(node, flags) {
      return getSyntacticModifierFlags(node) & flags;
    }
    ts2.getSelectedSyntacticModifierFlags = getSelectedSyntacticModifierFlags;
    function getModifierFlagsWorker(node, includeJSDoc, alwaysIncludeJSDoc) {
      if (node.kind >= 0 && node.kind <= 159) {
        return 0;
      }
      if (!(node.modifierFlagsCache & 536870912)) {
        node.modifierFlagsCache = getSyntacticModifierFlagsNoCache(node) | 536870912;
      }
      if (includeJSDoc && !(node.modifierFlagsCache & 4096) && (alwaysIncludeJSDoc || isInJSFile(node)) && node.parent) {
        node.modifierFlagsCache |= getJSDocModifierFlagsNoCache(node) | 4096;
      }
      return node.modifierFlagsCache & ~(536870912 | 4096);
    }
    function getEffectiveModifierFlags(node) {
      return getModifierFlagsWorker(node, true);
    }
    ts2.getEffectiveModifierFlags = getEffectiveModifierFlags;
    function getEffectiveModifierFlagsAlwaysIncludeJSDoc(node) {
      return getModifierFlagsWorker(node, true, true);
    }
    ts2.getEffectiveModifierFlagsAlwaysIncludeJSDoc = getEffectiveModifierFlagsAlwaysIncludeJSDoc;
    function getSyntacticModifierFlags(node) {
      return getModifierFlagsWorker(node, false);
    }
    ts2.getSyntacticModifierFlags = getSyntacticModifierFlags;
    function getJSDocModifierFlagsNoCache(node) {
      var flags = 0;
      if (!!node.parent && !ts2.isParameter(node)) {
        if (isInJSFile(node)) {
          if (ts2.getJSDocPublicTagNoCache(node))
            flags |= 4;
          if (ts2.getJSDocPrivateTagNoCache(node))
            flags |= 8;
          if (ts2.getJSDocProtectedTagNoCache(node))
            flags |= 16;
          if (ts2.getJSDocReadonlyTagNoCache(node))
            flags |= 64;
          if (ts2.getJSDocOverrideTagNoCache(node))
            flags |= 16384;
        }
        if (ts2.getJSDocDeprecatedTagNoCache(node))
          flags |= 8192;
      }
      return flags;
    }
    function getEffectiveModifierFlagsNoCache(node) {
      return getSyntacticModifierFlagsNoCache(node) | getJSDocModifierFlagsNoCache(node);
    }
    ts2.getEffectiveModifierFlagsNoCache = getEffectiveModifierFlagsNoCache;
    function getSyntacticModifierFlagsNoCache(node) {
      var flags = modifiersToFlags(node.modifiers);
      if (node.flags & 4 || node.kind === 79 && node.isInJSDocNamespace) {
        flags |= 1;
      }
      return flags;
    }
    ts2.getSyntacticModifierFlagsNoCache = getSyntacticModifierFlagsNoCache;
    function modifiersToFlags(modifiers) {
      var flags = 0;
      if (modifiers) {
        for (var _i = 0, modifiers_1 = modifiers; _i < modifiers_1.length; _i++) {
          var modifier = modifiers_1[_i];
          flags |= modifierToFlag(modifier.kind);
        }
      }
      return flags;
    }
    ts2.modifiersToFlags = modifiersToFlags;
    function modifierToFlag(token) {
      switch (token) {
        case 124:
          return 32;
        case 123:
          return 4;
        case 122:
          return 16;
        case 121:
          return 8;
        case 126:
          return 128;
        case 93:
          return 1;
        case 135:
          return 2;
        case 85:
          return 2048;
        case 88:
          return 512;
        case 131:
          return 256;
        case 144:
          return 64;
        case 158:
          return 16384;
      }
      return 0;
    }
    ts2.modifierToFlag = modifierToFlag;
    function createModifiers(modifierFlags) {
      return modifierFlags ? ts2.factory.createNodeArray(ts2.factory.createModifiersFromModifierFlags(modifierFlags)) : void 0;
    }
    ts2.createModifiers = createModifiers;
    function isLogicalOperator(token) {
      return token === 56 || token === 55 || token === 53;
    }
    ts2.isLogicalOperator = isLogicalOperator;
    function isLogicalOrCoalescingAssignmentOperator(token) {
      return token === 75 || token === 76 || token === 77;
    }
    ts2.isLogicalOrCoalescingAssignmentOperator = isLogicalOrCoalescingAssignmentOperator;
    function isLogicalOrCoalescingAssignmentExpression(expr) {
      return isLogicalOrCoalescingAssignmentOperator(expr.operatorToken.kind);
    }
    ts2.isLogicalOrCoalescingAssignmentExpression = isLogicalOrCoalescingAssignmentExpression;
    function isAssignmentOperator(token) {
      return token >= 63 && token <= 78;
    }
    ts2.isAssignmentOperator = isAssignmentOperator;
    function tryGetClassExtendingExpressionWithTypeArguments(node) {
      var cls = tryGetClassImplementingOrExtendingExpressionWithTypeArguments(node);
      return cls && !cls.isImplements ? cls.class : void 0;
    }
    ts2.tryGetClassExtendingExpressionWithTypeArguments = tryGetClassExtendingExpressionWithTypeArguments;
    function tryGetClassImplementingOrExtendingExpressionWithTypeArguments(node) {
      return ts2.isExpressionWithTypeArguments(node) && ts2.isHeritageClause(node.parent) && ts2.isClassLike(node.parent.parent) ? { class: node.parent.parent, isImplements: node.parent.token === 117 } : void 0;
    }
    ts2.tryGetClassImplementingOrExtendingExpressionWithTypeArguments = tryGetClassImplementingOrExtendingExpressionWithTypeArguments;
    function isAssignmentExpression(node, excludeCompoundAssignment) {
      return ts2.isBinaryExpression(node) && (excludeCompoundAssignment ? node.operatorToken.kind === 63 : isAssignmentOperator(node.operatorToken.kind)) && ts2.isLeftHandSideExpression(node.left);
    }
    ts2.isAssignmentExpression = isAssignmentExpression;
    function isLeftHandSideOfAssignment(node) {
      return isAssignmentExpression(node.parent) && node.parent.left === node;
    }
    ts2.isLeftHandSideOfAssignment = isLeftHandSideOfAssignment;
    function isDestructuringAssignment(node) {
      if (isAssignmentExpression(node, true)) {
        var kind = node.left.kind;
        return kind === 204 || kind === 203;
      }
      return false;
    }
    ts2.isDestructuringAssignment = isDestructuringAssignment;
    function isExpressionWithTypeArgumentsInClassExtendsClause(node) {
      return tryGetClassExtendingExpressionWithTypeArguments(node) !== void 0;
    }
    ts2.isExpressionWithTypeArgumentsInClassExtendsClause = isExpressionWithTypeArgumentsInClassExtendsClause;
    function isEntityNameExpression(node) {
      return node.kind === 79 || isPropertyAccessEntityNameExpression(node);
    }
    ts2.isEntityNameExpression = isEntityNameExpression;
    function getFirstIdentifier(node) {
      switch (node.kind) {
        case 79:
          return node;
        case 160:
          do {
            node = node.left;
          } while (node.kind !== 79);
          return node;
        case 205:
          do {
            node = node.expression;
          } while (node.kind !== 79);
          return node;
      }
    }
    ts2.getFirstIdentifier = getFirstIdentifier;
    function isDottedName(node) {
      return node.kind === 79 || node.kind === 108 || node.kind === 106 || node.kind === 230 || node.kind === 205 && isDottedName(node.expression) || node.kind === 211 && isDottedName(node.expression);
    }
    ts2.isDottedName = isDottedName;
    function isPropertyAccessEntityNameExpression(node) {
      return ts2.isPropertyAccessExpression(node) && ts2.isIdentifier(node.name) && isEntityNameExpression(node.expression);
    }
    ts2.isPropertyAccessEntityNameExpression = isPropertyAccessEntityNameExpression;
    function tryGetPropertyAccessOrIdentifierToString(expr) {
      if (ts2.isPropertyAccessExpression(expr)) {
        var baseStr = tryGetPropertyAccessOrIdentifierToString(expr.expression);
        if (baseStr !== void 0) {
          return baseStr + "." + entityNameToString(expr.name);
        }
      } else if (ts2.isElementAccessExpression(expr)) {
        var baseStr = tryGetPropertyAccessOrIdentifierToString(expr.expression);
        if (baseStr !== void 0 && ts2.isPropertyName(expr.argumentExpression)) {
          return baseStr + "." + getPropertyNameForPropertyNameNode(expr.argumentExpression);
        }
      } else if (ts2.isIdentifier(expr)) {
        return ts2.unescapeLeadingUnderscores(expr.escapedText);
      }
      return void 0;
    }
    ts2.tryGetPropertyAccessOrIdentifierToString = tryGetPropertyAccessOrIdentifierToString;
    function isPrototypeAccess(node) {
      return isBindableStaticAccessExpression(node) && getElementOrPropertyAccessName(node) === "prototype";
    }
    ts2.isPrototypeAccess = isPrototypeAccess;
    function isRightSideOfQualifiedNameOrPropertyAccess(node) {
      return node.parent.kind === 160 && node.parent.right === node || node.parent.kind === 205 && node.parent.name === node;
    }
    ts2.isRightSideOfQualifiedNameOrPropertyAccess = isRightSideOfQualifiedNameOrPropertyAccess;
    function isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName(node) {
      return ts2.isQualifiedName(node.parent) && node.parent.right === node || ts2.isPropertyAccessExpression(node.parent) && node.parent.name === node || ts2.isJSDocMemberName(node.parent) && node.parent.right === node;
    }
    ts2.isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName = isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName;
    function isEmptyObjectLiteral(expression) {
      return expression.kind === 204 && expression.properties.length === 0;
    }
    ts2.isEmptyObjectLiteral = isEmptyObjectLiteral;
    function isEmptyArrayLiteral(expression) {
      return expression.kind === 203 && expression.elements.length === 0;
    }
    ts2.isEmptyArrayLiteral = isEmptyArrayLiteral;
    function getLocalSymbolForExportDefault(symbol) {
      if (!isExportDefaultSymbol(symbol) || !symbol.declarations)
        return void 0;
      for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
        var decl = _a[_i];
        if (decl.localSymbol)
          return decl.localSymbol;
      }
      return void 0;
    }
    ts2.getLocalSymbolForExportDefault = getLocalSymbolForExportDefault;
    function isExportDefaultSymbol(symbol) {
      return symbol && ts2.length(symbol.declarations) > 0 && hasSyntacticModifier(symbol.declarations[0], 512);
    }
    function tryExtractTSExtension(fileName) {
      return ts2.find(supportedTSExtensionsForExtractExtension, function(extension) {
        return ts2.fileExtensionIs(fileName, extension);
      });
    }
    ts2.tryExtractTSExtension = tryExtractTSExtension;
    function getExpandedCharCodes(input) {
      var output = [];
      var length = input.length;
      for (var i = 0; i < length; i++) {
        var charCode = input.charCodeAt(i);
        if (charCode < 128) {
          output.push(charCode);
        } else if (charCode < 2048) {
          output.push(charCode >> 6 | 192);
          output.push(charCode & 63 | 128);
        } else if (charCode < 65536) {
          output.push(charCode >> 12 | 224);
          output.push(charCode >> 6 & 63 | 128);
          output.push(charCode & 63 | 128);
        } else if (charCode < 131072) {
          output.push(charCode >> 18 | 240);
          output.push(charCode >> 12 & 63 | 128);
          output.push(charCode >> 6 & 63 | 128);
          output.push(charCode & 63 | 128);
        } else {
          ts2.Debug.assert(false, "Unexpected code point");
        }
      }
      return output;
    }
    var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    function convertToBase64(input) {
      var result = "";
      var charCodes = getExpandedCharCodes(input);
      var i = 0;
      var length = charCodes.length;
      var byte1, byte2, byte3, byte4;
      while (i < length) {
        byte1 = charCodes[i] >> 2;
        byte2 = (charCodes[i] & 3) << 4 | charCodes[i + 1] >> 4;
        byte3 = (charCodes[i + 1] & 15) << 2 | charCodes[i + 2] >> 6;
        byte4 = charCodes[i + 2] & 63;
        if (i + 1 >= length) {
          byte3 = byte4 = 64;
        } else if (i + 2 >= length) {
          byte4 = 64;
        }
        result += base64Digits.charAt(byte1) + base64Digits.charAt(byte2) + base64Digits.charAt(byte3) + base64Digits.charAt(byte4);
        i += 3;
      }
      return result;
    }
    ts2.convertToBase64 = convertToBase64;
    function getStringFromExpandedCharCodes(codes) {
      var output = "";
      var i = 0;
      var length = codes.length;
      while (i < length) {
        var charCode = codes[i];
        if (charCode < 128) {
          output += String.fromCharCode(charCode);
          i++;
        } else if ((charCode & 192) === 192) {
          var value = charCode & 63;
          i++;
          var nextCode = codes[i];
          while ((nextCode & 192) === 128) {
            value = value << 6 | nextCode & 63;
            i++;
            nextCode = codes[i];
          }
          output += String.fromCharCode(value);
        } else {
          output += String.fromCharCode(charCode);
          i++;
        }
      }
      return output;
    }
    function base64encode(host, input) {
      if (host && host.base64encode) {
        return host.base64encode(input);
      }
      return convertToBase64(input);
    }
    ts2.base64encode = base64encode;
    function base64decode(host, input) {
      if (host && host.base64decode) {
        return host.base64decode(input);
      }
      var length = input.length;
      var expandedCharCodes = [];
      var i = 0;
      while (i < length) {
        if (input.charCodeAt(i) === base64Digits.charCodeAt(64)) {
          break;
        }
        var ch1 = base64Digits.indexOf(input[i]);
        var ch2 = base64Digits.indexOf(input[i + 1]);
        var ch3 = base64Digits.indexOf(input[i + 2]);
        var ch4 = base64Digits.indexOf(input[i + 3]);
        var code1 = (ch1 & 63) << 2 | ch2 >> 4 & 3;
        var code2 = (ch2 & 15) << 4 | ch3 >> 2 & 15;
        var code3 = (ch3 & 3) << 6 | ch4 & 63;
        if (code2 === 0 && ch3 !== 0) {
          expandedCharCodes.push(code1);
        } else if (code3 === 0 && ch4 !== 0) {
          expandedCharCodes.push(code1, code2);
        } else {
          expandedCharCodes.push(code1, code2, code3);
        }
        i += 4;
      }
      return getStringFromExpandedCharCodes(expandedCharCodes);
    }
    ts2.base64decode = base64decode;
    function readJson(path, host) {
      try {
        var jsonText = host.readFile(path);
        if (!jsonText)
          return {};
        var result = ts2.parseConfigFileTextToJson(path, jsonText);
        if (result.error) {
          return {};
        }
        return result.config;
      } catch (e) {
        return {};
      }
    }
    ts2.readJson = readJson;
    function directoryProbablyExists(directoryName, host) {
      return !host.directoryExists || host.directoryExists(directoryName);
    }
    ts2.directoryProbablyExists = directoryProbablyExists;
    var carriageReturnLineFeed = "\r\n";
    var lineFeed = "\n";
    function getNewLineCharacter(options, getNewLine) {
      switch (options.newLine) {
        case 0:
          return carriageReturnLineFeed;
        case 1:
          return lineFeed;
      }
      return getNewLine ? getNewLine() : ts2.sys ? ts2.sys.newLine : carriageReturnLineFeed;
    }
    ts2.getNewLineCharacter = getNewLineCharacter;
    function createRange(pos, end) {
      if (end === void 0) {
        end = pos;
      }
      ts2.Debug.assert(end >= pos || end === -1);
      return { pos, end };
    }
    ts2.createRange = createRange;
    function moveRangeEnd(range, end) {
      return createRange(range.pos, end);
    }
    ts2.moveRangeEnd = moveRangeEnd;
    function moveRangePos(range, pos) {
      return createRange(pos, range.end);
    }
    ts2.moveRangePos = moveRangePos;
    function moveRangePastDecorators(node) {
      return node.decorators && node.decorators.length > 0 ? moveRangePos(node, node.decorators.end) : node;
    }
    ts2.moveRangePastDecorators = moveRangePastDecorators;
    function moveRangePastModifiers(node) {
      return node.modifiers && node.modifiers.length > 0 ? moveRangePos(node, node.modifiers.end) : moveRangePastDecorators(node);
    }
    ts2.moveRangePastModifiers = moveRangePastModifiers;
    function isCollapsedRange(range) {
      return range.pos === range.end;
    }
    ts2.isCollapsedRange = isCollapsedRange;
    function createTokenRange(pos, token) {
      return createRange(pos, pos + ts2.tokenToString(token).length);
    }
    ts2.createTokenRange = createTokenRange;
    function rangeIsOnSingleLine(range, sourceFile) {
      return rangeStartIsOnSameLineAsRangeEnd(range, range, sourceFile);
    }
    ts2.rangeIsOnSingleLine = rangeIsOnSingleLine;
    function rangeStartPositionsAreOnSameLine(range1, range2, sourceFile) {
      return positionsAreOnSameLine(getStartPositionOfRange(range1, sourceFile, false), getStartPositionOfRange(range2, sourceFile, false), sourceFile);
    }
    ts2.rangeStartPositionsAreOnSameLine = rangeStartPositionsAreOnSameLine;
    function rangeEndPositionsAreOnSameLine(range1, range2, sourceFile) {
      return positionsAreOnSameLine(range1.end, range2.end, sourceFile);
    }
    ts2.rangeEndPositionsAreOnSameLine = rangeEndPositionsAreOnSameLine;
    function rangeStartIsOnSameLineAsRangeEnd(range1, range2, sourceFile) {
      return positionsAreOnSameLine(getStartPositionOfRange(range1, sourceFile, false), range2.end, sourceFile);
    }
    ts2.rangeStartIsOnSameLineAsRangeEnd = rangeStartIsOnSameLineAsRangeEnd;
    function rangeEndIsOnSameLineAsRangeStart(range1, range2, sourceFile) {
      return positionsAreOnSameLine(range1.end, getStartPositionOfRange(range2, sourceFile, false), sourceFile);
    }
    ts2.rangeEndIsOnSameLineAsRangeStart = rangeEndIsOnSameLineAsRangeStart;
    function getLinesBetweenRangeEndAndRangeStart(range1, range2, sourceFile, includeSecondRangeComments) {
      var range2Start = getStartPositionOfRange(range2, sourceFile, includeSecondRangeComments);
      return ts2.getLinesBetweenPositions(sourceFile, range1.end, range2Start);
    }
    ts2.getLinesBetweenRangeEndAndRangeStart = getLinesBetweenRangeEndAndRangeStart;
    function getLinesBetweenRangeEndPositions(range1, range2, sourceFile) {
      return ts2.getLinesBetweenPositions(sourceFile, range1.end, range2.end);
    }
    ts2.getLinesBetweenRangeEndPositions = getLinesBetweenRangeEndPositions;
    function isNodeArrayMultiLine(list, sourceFile) {
      return !positionsAreOnSameLine(list.pos, list.end, sourceFile);
    }
    ts2.isNodeArrayMultiLine = isNodeArrayMultiLine;
    function positionsAreOnSameLine(pos1, pos2, sourceFile) {
      return ts2.getLinesBetweenPositions(sourceFile, pos1, pos2) === 0;
    }
    ts2.positionsAreOnSameLine = positionsAreOnSameLine;
    function getStartPositionOfRange(range, sourceFile, includeComments) {
      return positionIsSynthesized(range.pos) ? -1 : ts2.skipTrivia(sourceFile.text, range.pos, false, includeComments);
    }
    ts2.getStartPositionOfRange = getStartPositionOfRange;
    function getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter(pos, stopPos, sourceFile, includeComments) {
      var startPos = ts2.skipTrivia(sourceFile.text, pos, false, includeComments);
      var prevPos = getPreviousNonWhitespacePosition(startPos, stopPos, sourceFile);
      return ts2.getLinesBetweenPositions(sourceFile, prevPos !== null && prevPos !== void 0 ? prevPos : stopPos, startPos);
    }
    ts2.getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter = getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter;
    function getLinesBetweenPositionAndNextNonWhitespaceCharacter(pos, stopPos, sourceFile, includeComments) {
      var nextPos = ts2.skipTrivia(sourceFile.text, pos, false, includeComments);
      return ts2.getLinesBetweenPositions(sourceFile, pos, Math.min(stopPos, nextPos));
    }
    ts2.getLinesBetweenPositionAndNextNonWhitespaceCharacter = getLinesBetweenPositionAndNextNonWhitespaceCharacter;
    function getPreviousNonWhitespacePosition(pos, stopPos, sourceFile) {
      if (stopPos === void 0) {
        stopPos = 0;
      }
      while (pos-- > stopPos) {
        if (!ts2.isWhiteSpaceLike(sourceFile.text.charCodeAt(pos))) {
          return pos;
        }
      }
    }
    function isDeclarationNameOfEnumOrNamespace(node) {
      var parseNode = ts2.getParseTreeNode(node);
      if (parseNode) {
        switch (parseNode.parent.kind) {
          case 259:
          case 260:
            return parseNode === parseNode.parent.name;
        }
      }
      return false;
    }
    ts2.isDeclarationNameOfEnumOrNamespace = isDeclarationNameOfEnumOrNamespace;
    function getInitializedVariables(node) {
      return ts2.filter(node.declarations, isInitializedVariable);
    }
    ts2.getInitializedVariables = getInitializedVariables;
    function isInitializedVariable(node) {
      return node.initializer !== void 0;
    }
    function isWatchSet(options) {
      return options.watch && options.hasOwnProperty("watch");
    }
    ts2.isWatchSet = isWatchSet;
    function closeFileWatcher(watcher) {
      watcher.close();
    }
    ts2.closeFileWatcher = closeFileWatcher;
    function getCheckFlags(symbol) {
      return symbol.flags & 33554432 ? symbol.checkFlags : 0;
    }
    ts2.getCheckFlags = getCheckFlags;
    function getDeclarationModifierFlagsFromSymbol(s, isWrite) {
      if (isWrite === void 0) {
        isWrite = false;
      }
      if (s.valueDeclaration) {
        var declaration = isWrite && s.declarations && ts2.find(s.declarations, function(d) {
          return d.kind === 172;
        }) || s.valueDeclaration;
        var flags = ts2.getCombinedModifierFlags(declaration);
        return s.parent && s.parent.flags & 32 ? flags : flags & ~28;
      }
      if (getCheckFlags(s) & 6) {
        var checkFlags = s.checkFlags;
        var accessModifier = checkFlags & 1024 ? 8 : checkFlags & 256 ? 4 : 16;
        var staticModifier = checkFlags & 2048 ? 32 : 0;
        return accessModifier | staticModifier;
      }
      if (s.flags & 4194304) {
        return 4 | 32;
      }
      return 0;
    }
    ts2.getDeclarationModifierFlagsFromSymbol = getDeclarationModifierFlagsFromSymbol;
    function skipAlias(symbol, checker) {
      return symbol.flags & 2097152 ? checker.getAliasedSymbol(symbol) : symbol;
    }
    ts2.skipAlias = skipAlias;
    function getCombinedLocalAndExportSymbolFlags(symbol) {
      return symbol.exportSymbol ? symbol.exportSymbol.flags | symbol.flags : symbol.flags;
    }
    ts2.getCombinedLocalAndExportSymbolFlags = getCombinedLocalAndExportSymbolFlags;
    function isWriteOnlyAccess(node) {
      return accessKind(node) === 1;
    }
    ts2.isWriteOnlyAccess = isWriteOnlyAccess;
    function isWriteAccess(node) {
      return accessKind(node) !== 0;
    }
    ts2.isWriteAccess = isWriteAccess;
    var AccessKind;
    (function(AccessKind2) {
      AccessKind2[AccessKind2["Read"] = 0] = "Read";
      AccessKind2[AccessKind2["Write"] = 1] = "Write";
      AccessKind2[AccessKind2["ReadWrite"] = 2] = "ReadWrite";
    })(AccessKind || (AccessKind = {}));
    function accessKind(node) {
      var parent = node.parent;
      if (!parent)
        return 0;
      switch (parent.kind) {
        case 211:
          return accessKind(parent);
        case 219:
        case 218:
          var operator = parent.operator;
          return operator === 45 || operator === 46 ? writeOrReadWrite() : 0;
        case 220:
          var _a = parent, left = _a.left, operatorToken = _a.operatorToken;
          return left === node && isAssignmentOperator(operatorToken.kind) ? operatorToken.kind === 63 ? 1 : writeOrReadWrite() : 0;
        case 205:
          return parent.name !== node ? 0 : accessKind(parent);
        case 294: {
          var parentAccess = accessKind(parent.parent);
          return node === parent.name ? reverseAccessKind(parentAccess) : parentAccess;
        }
        case 295:
          return node === parent.objectAssignmentInitializer ? 0 : accessKind(parent.parent);
        case 203:
          return accessKind(parent);
        default:
          return 0;
      }
      function writeOrReadWrite() {
        return parent.parent && walkUpParenthesizedExpressions(parent.parent).kind === 237 ? 1 : 2;
      }
    }
    function reverseAccessKind(a) {
      switch (a) {
        case 0:
          return 1;
        case 1:
          return 0;
        case 2:
          return 2;
        default:
          return ts2.Debug.assertNever(a);
      }
    }
    function compareDataObjects(dst, src) {
      if (!dst || !src || Object.keys(dst).length !== Object.keys(src).length) {
        return false;
      }
      for (var e in dst) {
        if (typeof dst[e] === "object") {
          if (!compareDataObjects(dst[e], src[e])) {
            return false;
          }
        } else if (typeof dst[e] !== "function") {
          if (dst[e] !== src[e]) {
            return false;
          }
        }
      }
      return true;
    }
    ts2.compareDataObjects = compareDataObjects;
    function clearMap(map, onDeleteValue) {
      map.forEach(onDeleteValue);
      map.clear();
    }
    ts2.clearMap = clearMap;
    function mutateMapSkippingNewValues(map, newMap, options) {
      var onDeleteValue = options.onDeleteValue, onExistingValue = options.onExistingValue;
      map.forEach(function(existingValue, key) {
        var valueInNewMap = newMap.get(key);
        if (valueInNewMap === void 0) {
          map.delete(key);
          onDeleteValue(existingValue, key);
        } else if (onExistingValue) {
          onExistingValue(existingValue, valueInNewMap, key);
        }
      });
    }
    ts2.mutateMapSkippingNewValues = mutateMapSkippingNewValues;
    function mutateMap(map, newMap, options) {
      mutateMapSkippingNewValues(map, newMap, options);
      var createNewValue = options.createNewValue;
      newMap.forEach(function(valueInNewMap, key) {
        if (!map.has(key)) {
          map.set(key, createNewValue(key, valueInNewMap));
        }
      });
    }
    ts2.mutateMap = mutateMap;
    function isAbstractConstructorSymbol(symbol) {
      if (symbol.flags & 32) {
        var declaration = getClassLikeDeclarationOfSymbol(symbol);
        return !!declaration && hasSyntacticModifier(declaration, 128);
      }
      return false;
    }
    ts2.isAbstractConstructorSymbol = isAbstractConstructorSymbol;
    function getClassLikeDeclarationOfSymbol(symbol) {
      var _a;
      return (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isClassLike);
    }
    ts2.getClassLikeDeclarationOfSymbol = getClassLikeDeclarationOfSymbol;
    function getObjectFlags(type) {
      return type.flags & 3899393 ? type.objectFlags : 0;
    }
    ts2.getObjectFlags = getObjectFlags;
    function typeHasCallOrConstructSignatures(type, checker) {
      return checker.getSignaturesOfType(type, 0).length !== 0 || checker.getSignaturesOfType(type, 1).length !== 0;
    }
    ts2.typeHasCallOrConstructSignatures = typeHasCallOrConstructSignatures;
    function forSomeAncestorDirectory(directory, callback) {
      return !!ts2.forEachAncestorDirectory(directory, function(d) {
        return callback(d) ? true : void 0;
      });
    }
    ts2.forSomeAncestorDirectory = forSomeAncestorDirectory;
    function isUMDExportSymbol(symbol) {
      return !!symbol && !!symbol.declarations && !!symbol.declarations[0] && ts2.isNamespaceExportDeclaration(symbol.declarations[0]);
    }
    ts2.isUMDExportSymbol = isUMDExportSymbol;
    function showModuleSpecifier(_a) {
      var moduleSpecifier = _a.moduleSpecifier;
      return ts2.isStringLiteral(moduleSpecifier) ? moduleSpecifier.text : getTextOfNode(moduleSpecifier);
    }
    ts2.showModuleSpecifier = showModuleSpecifier;
    function getLastChild(node) {
      var lastChild;
      ts2.forEachChild(node, function(child) {
        if (nodeIsPresent(child))
          lastChild = child;
      }, function(children) {
        for (var i = children.length - 1; i >= 0; i--) {
          if (nodeIsPresent(children[i])) {
            lastChild = children[i];
            break;
          }
        }
      });
      return lastChild;
    }
    ts2.getLastChild = getLastChild;
    function addToSeen(seen, key, value) {
      if (value === void 0) {
        value = true;
      }
      if (seen.has(key)) {
        return false;
      }
      seen.set(key, value);
      return true;
    }
    ts2.addToSeen = addToSeen;
    function isObjectTypeDeclaration(node) {
      return ts2.isClassLike(node) || ts2.isInterfaceDeclaration(node) || ts2.isTypeLiteralNode(node);
    }
    ts2.isObjectTypeDeclaration = isObjectTypeDeclaration;
    function isTypeNodeKind(kind) {
      return kind >= 176 && kind <= 199 || kind === 130 || kind === 154 || kind === 146 || kind === 157 || kind === 147 || kind === 133 || kind === 149 || kind === 150 || kind === 114 || kind === 152 || kind === 143 || kind === 227 || kind === 310 || kind === 311 || kind === 312 || kind === 313 || kind === 314 || kind === 315 || kind === 316;
    }
    ts2.isTypeNodeKind = isTypeNodeKind;
    function isAccessExpression(node) {
      return node.kind === 205 || node.kind === 206;
    }
    ts2.isAccessExpression = isAccessExpression;
    function getNameOfAccessExpression(node) {
      if (node.kind === 205) {
        return node.name;
      }
      ts2.Debug.assert(node.kind === 206);
      return node.argumentExpression;
    }
    ts2.getNameOfAccessExpression = getNameOfAccessExpression;
    function isBundleFileTextLike(section) {
      switch (section.kind) {
        case "text":
        case "internal":
          return true;
        default:
          return false;
      }
    }
    ts2.isBundleFileTextLike = isBundleFileTextLike;
    function isNamedImportsOrExports(node) {
      return node.kind === 268 || node.kind === 272;
    }
    ts2.isNamedImportsOrExports = isNamedImportsOrExports;
    function getLeftmostAccessExpression(expr) {
      while (isAccessExpression(expr)) {
        expr = expr.expression;
      }
      return expr;
    }
    ts2.getLeftmostAccessExpression = getLeftmostAccessExpression;
    function getLeftmostExpression(node, stopAtCallExpressions) {
      while (true) {
        switch (node.kind) {
          case 219:
            node = node.operand;
            continue;
          case 220:
            node = node.left;
            continue;
          case 221:
            node = node.condition;
            continue;
          case 209:
            node = node.tag;
            continue;
          case 207:
            if (stopAtCallExpressions) {
              return node;
            }
          case 228:
          case 206:
          case 205:
          case 229:
          case 348:
            node = node.expression;
            continue;
        }
        return node;
      }
    }
    ts2.getLeftmostExpression = getLeftmostExpression;
    function Symbol2(flags, name) {
      this.flags = flags;
      this.escapedName = name;
      this.declarations = void 0;
      this.valueDeclaration = void 0;
      this.id = void 0;
      this.mergeId = void 0;
      this.parent = void 0;
    }
    function Type(checker, flags) {
      this.flags = flags;
      if (ts2.Debug.isDebugging || ts2.tracing) {
        this.checker = checker;
      }
    }
    function Signature(checker, flags) {
      this.flags = flags;
      if (ts2.Debug.isDebugging) {
        this.checker = checker;
      }
    }
    function Node(kind, pos, end) {
      this.pos = pos;
      this.end = end;
      this.kind = kind;
      this.id = 0;
      this.flags = 0;
      this.modifierFlagsCache = 0;
      this.transformFlags = 0;
      this.parent = void 0;
      this.original = void 0;
    }
    function Token(kind, pos, end) {
      this.pos = pos;
      this.end = end;
      this.kind = kind;
      this.id = 0;
      this.flags = 0;
      this.transformFlags = 0;
      this.parent = void 0;
    }
    function Identifier(kind, pos, end) {
      this.pos = pos;
      this.end = end;
      this.kind = kind;
      this.id = 0;
      this.flags = 0;
      this.transformFlags = 0;
      this.parent = void 0;
      this.original = void 0;
      this.flowNode = void 0;
    }
    function SourceMapSource(fileName, text, skipTrivia) {
      this.fileName = fileName;
      this.text = text;
      this.skipTrivia = skipTrivia || function(pos) {
        return pos;
      };
    }
    ts2.objectAllocator = {
      getNodeConstructor: function() {
        return Node;
      },
      getTokenConstructor: function() {
        return Token;
      },
      getIdentifierConstructor: function() {
        return Identifier;
      },
      getPrivateIdentifierConstructor: function() {
        return Node;
      },
      getSourceFileConstructor: function() {
        return Node;
      },
      getSymbolConstructor: function() {
        return Symbol2;
      },
      getTypeConstructor: function() {
        return Type;
      },
      getSignatureConstructor: function() {
        return Signature;
      },
      getSourceMapSourceConstructor: function() {
        return SourceMapSource;
      }
    };
    function setObjectAllocator(alloc) {
      ts2.objectAllocator = alloc;
    }
    ts2.setObjectAllocator = setObjectAllocator;
    function formatStringFromArgs(text, args, baseIndex) {
      if (baseIndex === void 0) {
        baseIndex = 0;
      }
      return text.replace(/{(\d+)}/g, function(_match, index) {
        return "" + ts2.Debug.checkDefined(args[+index + baseIndex]);
      });
    }
    ts2.formatStringFromArgs = formatStringFromArgs;
    function setLocalizedDiagnosticMessages(messages) {
      ts2.localizedDiagnosticMessages = messages;
    }
    ts2.setLocalizedDiagnosticMessages = setLocalizedDiagnosticMessages;
    function getLocaleSpecificMessage(message) {
      return ts2.localizedDiagnosticMessages && ts2.localizedDiagnosticMessages[message.key] || message.message;
    }
    ts2.getLocaleSpecificMessage = getLocaleSpecificMessage;
    function createDetachedDiagnostic(fileName, start, length, message) {
      assertDiagnosticLocation(void 0, start, length);
      var text = getLocaleSpecificMessage(message);
      if (arguments.length > 4) {
        text = formatStringFromArgs(text, arguments, 4);
      }
      return {
        file: void 0,
        start,
        length,
        messageText: text,
        category: message.category,
        code: message.code,
        reportsUnnecessary: message.reportsUnnecessary,
        fileName
      };
    }
    ts2.createDetachedDiagnostic = createDetachedDiagnostic;
    function isDiagnosticWithDetachedLocation(diagnostic) {
      return diagnostic.file === void 0 && diagnostic.start !== void 0 && diagnostic.length !== void 0 && typeof diagnostic.fileName === "string";
    }
    function attachFileToDiagnostic(diagnostic, file) {
      var fileName = file.fileName || "";
      var length = file.text.length;
      ts2.Debug.assertEqual(diagnostic.fileName, fileName);
      ts2.Debug.assertLessThanOrEqual(diagnostic.start, length);
      ts2.Debug.assertLessThanOrEqual(diagnostic.start + diagnostic.length, length);
      var diagnosticWithLocation = {
        file,
        start: diagnostic.start,
        length: diagnostic.length,
        messageText: diagnostic.messageText,
        category: diagnostic.category,
        code: diagnostic.code,
        reportsUnnecessary: diagnostic.reportsUnnecessary
      };
      if (diagnostic.relatedInformation) {
        diagnosticWithLocation.relatedInformation = [];
        for (var _i = 0, _a = diagnostic.relatedInformation; _i < _a.length; _i++) {
          var related = _a[_i];
          if (isDiagnosticWithDetachedLocation(related) && related.fileName === fileName) {
            ts2.Debug.assertLessThanOrEqual(related.start, length);
            ts2.Debug.assertLessThanOrEqual(related.start + related.length, length);
            diagnosticWithLocation.relatedInformation.push(attachFileToDiagnostic(related, file));
          } else {
            diagnosticWithLocation.relatedInformation.push(related);
          }
        }
      }
      return diagnosticWithLocation;
    }
    function attachFileToDiagnostics(diagnostics, file) {
      var diagnosticsWithLocation = [];
      for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) {
        var diagnostic = diagnostics_1[_i];
        diagnosticsWithLocation.push(attachFileToDiagnostic(diagnostic, file));
      }
      return diagnosticsWithLocation;
    }
    ts2.attachFileToDiagnostics = attachFileToDiagnostics;
    function createFileDiagnostic(file, start, length, message) {
      assertDiagnosticLocation(file, start, length);
      var text = getLocaleSpecificMessage(message);
      if (arguments.length > 4) {
        text = formatStringFromArgs(text, arguments, 4);
      }
      return {
        file,
        start,
        length,
        messageText: text,
        category: message.category,
        code: message.code,
        reportsUnnecessary: message.reportsUnnecessary,
        reportsDeprecated: message.reportsDeprecated
      };
    }
    ts2.createFileDiagnostic = createFileDiagnostic;
    function formatMessage(_dummy, message) {
      var text = getLocaleSpecificMessage(message);
      if (arguments.length > 2) {
        text = formatStringFromArgs(text, arguments, 2);
      }
      return text;
    }
    ts2.formatMessage = formatMessage;
    function createCompilerDiagnostic(message) {
      var text = getLocaleSpecificMessage(message);
      if (arguments.length > 1) {
        text = formatStringFromArgs(text, arguments, 1);
      }
      return {
        file: void 0,
        start: void 0,
        length: void 0,
        messageText: text,
        category: message.category,
        code: message.code,
        reportsUnnecessary: message.reportsUnnecessary,
        reportsDeprecated: message.reportsDeprecated
      };
    }
    ts2.createCompilerDiagnostic = createCompilerDiagnostic;
    function createCompilerDiagnosticFromMessageChain(chain, relatedInformation) {
      return {
        file: void 0,
        start: void 0,
        length: void 0,
        code: chain.code,
        category: chain.category,
        messageText: chain.next ? chain : chain.messageText,
        relatedInformation
      };
    }
    ts2.createCompilerDiagnosticFromMessageChain = createCompilerDiagnosticFromMessageChain;
    function chainDiagnosticMessages(details, message) {
      var text = getLocaleSpecificMessage(message);
      if (arguments.length > 2) {
        text = formatStringFromArgs(text, arguments, 2);
      }
      return {
        messageText: text,
        category: message.category,
        code: message.code,
        next: details === void 0 || Array.isArray(details) ? details : [details]
      };
    }
    ts2.chainDiagnosticMessages = chainDiagnosticMessages;
    function concatenateDiagnosticMessageChains(headChain, tailChain) {
      var lastChain = headChain;
      while (lastChain.next) {
        lastChain = lastChain.next[0];
      }
      lastChain.next = [tailChain];
    }
    ts2.concatenateDiagnosticMessageChains = concatenateDiagnosticMessageChains;
    function getDiagnosticFilePath(diagnostic) {
      return diagnostic.file ? diagnostic.file.path : void 0;
    }
    function compareDiagnostics(d1, d2) {
      return compareDiagnosticsSkipRelatedInformation(d1, d2) || compareRelatedInformation(d1, d2) || 0;
    }
    ts2.compareDiagnostics = compareDiagnostics;
    function compareDiagnosticsSkipRelatedInformation(d1, d2) {
      return ts2.compareStringsCaseSensitive(getDiagnosticFilePath(d1), getDiagnosticFilePath(d2)) || ts2.compareValues(d1.start, d2.start) || ts2.compareValues(d1.length, d2.length) || ts2.compareValues(d1.code, d2.code) || compareMessageText(d1.messageText, d2.messageText) || 0;
    }
    ts2.compareDiagnosticsSkipRelatedInformation = compareDiagnosticsSkipRelatedInformation;
    function compareRelatedInformation(d1, d2) {
      if (!d1.relatedInformation && !d2.relatedInformation) {
        return 0;
      }
      if (d1.relatedInformation && d2.relatedInformation) {
        return ts2.compareValues(d1.relatedInformation.length, d2.relatedInformation.length) || ts2.forEach(d1.relatedInformation, function(d1i, index) {
          var d2i = d2.relatedInformation[index];
          return compareDiagnostics(d1i, d2i);
        }) || 0;
      }
      return d1.relatedInformation ? -1 : 1;
    }
    function compareMessageText(t1, t2) {
      if (typeof t1 === "string" && typeof t2 === "string") {
        return ts2.compareStringsCaseSensitive(t1, t2);
      } else if (typeof t1 === "string") {
        return -1;
      } else if (typeof t2 === "string") {
        return 1;
      }
      var res = ts2.compareStringsCaseSensitive(t1.messageText, t2.messageText);
      if (res) {
        return res;
      }
      if (!t1.next && !t2.next) {
        return 0;
      }
      if (!t1.next) {
        return -1;
      }
      if (!t2.next) {
        return 1;
      }
      var len = Math.min(t1.next.length, t2.next.length);
      for (var i = 0; i < len; i++) {
        res = compareMessageText(t1.next[i], t2.next[i]);
        if (res) {
          return res;
        }
      }
      if (t1.next.length < t2.next.length) {
        return -1;
      } else if (t1.next.length > t2.next.length) {
        return 1;
      }
      return 0;
    }
    function getLanguageVariant(scriptKind) {
      return scriptKind === 4 || scriptKind === 2 || scriptKind === 1 || scriptKind === 6 ? 1 : 0;
    }
    ts2.getLanguageVariant = getLanguageVariant;
    function getEmitScriptTarget(compilerOptions) {
      return compilerOptions.target || compilerOptions.module === ts2.ModuleKind.Node12 && 7 || compilerOptions.module === ts2.ModuleKind.NodeNext && 99 || 0;
    }
    ts2.getEmitScriptTarget = getEmitScriptTarget;
    function getEmitModuleKind(compilerOptions) {
      return typeof compilerOptions.module === "number" ? compilerOptions.module : getEmitScriptTarget(compilerOptions) >= 2 ? ts2.ModuleKind.ES2015 : ts2.ModuleKind.CommonJS;
    }
    ts2.getEmitModuleKind = getEmitModuleKind;
    function getEmitModuleResolutionKind(compilerOptions) {
      var moduleResolution = compilerOptions.moduleResolution;
      if (moduleResolution === void 0) {
        switch (getEmitModuleKind(compilerOptions)) {
          case ts2.ModuleKind.CommonJS:
            moduleResolution = ts2.ModuleResolutionKind.NodeJs;
            break;
          case ts2.ModuleKind.Node12:
            moduleResolution = ts2.ModuleResolutionKind.Node12;
            break;
          case ts2.ModuleKind.NodeNext:
            moduleResolution = ts2.ModuleResolutionKind.NodeNext;
            break;
          default:
            moduleResolution = ts2.ModuleResolutionKind.Classic;
            break;
        }
      }
      return moduleResolution;
    }
    ts2.getEmitModuleResolutionKind = getEmitModuleResolutionKind;
    function hasJsonModuleEmitEnabled(options) {
      switch (getEmitModuleKind(options)) {
        case ts2.ModuleKind.CommonJS:
        case ts2.ModuleKind.AMD:
        case ts2.ModuleKind.ES2015:
        case ts2.ModuleKind.ES2020:
        case ts2.ModuleKind.ES2022:
        case ts2.ModuleKind.ESNext:
        case ts2.ModuleKind.Node12:
        case ts2.ModuleKind.NodeNext:
          return true;
        default:
          return false;
      }
    }
    ts2.hasJsonModuleEmitEnabled = hasJsonModuleEmitEnabled;
    function unreachableCodeIsError(options) {
      return options.allowUnreachableCode === false;
    }
    ts2.unreachableCodeIsError = unreachableCodeIsError;
    function unusedLabelIsError(options) {
      return options.allowUnusedLabels === false;
    }
    ts2.unusedLabelIsError = unusedLabelIsError;
    function getAreDeclarationMapsEnabled(options) {
      return !!(getEmitDeclarations(options) && options.declarationMap);
    }
    ts2.getAreDeclarationMapsEnabled = getAreDeclarationMapsEnabled;
    function getESModuleInterop(compilerOptions) {
      if (compilerOptions.esModuleInterop !== void 0) {
        return compilerOptions.esModuleInterop;
      }
      switch (getEmitModuleKind(compilerOptions)) {
        case ts2.ModuleKind.Node12:
        case ts2.ModuleKind.NodeNext:
          return true;
      }
      return void 0;
    }
    ts2.getESModuleInterop = getESModuleInterop;
    function getAllowSyntheticDefaultImports(compilerOptions) {
      var moduleKind = getEmitModuleKind(compilerOptions);
      return compilerOptions.allowSyntheticDefaultImports !== void 0 ? compilerOptions.allowSyntheticDefaultImports : getESModuleInterop(compilerOptions) || moduleKind === ts2.ModuleKind.System;
    }
    ts2.getAllowSyntheticDefaultImports = getAllowSyntheticDefaultImports;
    function getEmitDeclarations(compilerOptions) {
      return !!(compilerOptions.declaration || compilerOptions.composite);
    }
    ts2.getEmitDeclarations = getEmitDeclarations;
    function shouldPreserveConstEnums(compilerOptions) {
      return !!(compilerOptions.preserveConstEnums || compilerOptions.isolatedModules);
    }
    ts2.shouldPreserveConstEnums = shouldPreserveConstEnums;
    function isIncrementalCompilation(options) {
      return !!(options.incremental || options.composite);
    }
    ts2.isIncrementalCompilation = isIncrementalCompilation;
    function getStrictOptionValue(compilerOptions, flag) {
      return compilerOptions[flag] === void 0 ? !!compilerOptions.strict : !!compilerOptions[flag];
    }
    ts2.getStrictOptionValue = getStrictOptionValue;
    function getAllowJSCompilerOption(compilerOptions) {
      return compilerOptions.allowJs === void 0 ? !!compilerOptions.checkJs : compilerOptions.allowJs;
    }
    ts2.getAllowJSCompilerOption = getAllowJSCompilerOption;
    function getUseDefineForClassFields(compilerOptions) {
      return compilerOptions.useDefineForClassFields === void 0 ? getEmitScriptTarget(compilerOptions) === 99 : compilerOptions.useDefineForClassFields;
    }
    ts2.getUseDefineForClassFields = getUseDefineForClassFields;
    function compilerOptionsAffectSemanticDiagnostics(newOptions, oldOptions) {
      return optionsHaveChanges(oldOptions, newOptions, ts2.semanticDiagnosticsOptionDeclarations);
    }
    ts2.compilerOptionsAffectSemanticDiagnostics = compilerOptionsAffectSemanticDiagnostics;
    function compilerOptionsAffectEmit(newOptions, oldOptions) {
      return optionsHaveChanges(oldOptions, newOptions, ts2.affectsEmitOptionDeclarations);
    }
    ts2.compilerOptionsAffectEmit = compilerOptionsAffectEmit;
    function getCompilerOptionValue(options, option) {
      return option.strictFlag ? getStrictOptionValue(options, option.name) : options[option.name];
    }
    ts2.getCompilerOptionValue = getCompilerOptionValue;
    function getJSXTransformEnabled(options) {
      var jsx = options.jsx;
      return jsx === 2 || jsx === 4 || jsx === 5;
    }
    ts2.getJSXTransformEnabled = getJSXTransformEnabled;
    function getJSXImplicitImportBase(compilerOptions, file) {
      var jsxImportSourcePragmas = file === null || file === void 0 ? void 0 : file.pragmas.get("jsximportsource");
      var jsxImportSourcePragma = ts2.isArray(jsxImportSourcePragmas) ? jsxImportSourcePragmas[jsxImportSourcePragmas.length - 1] : jsxImportSourcePragmas;
      return compilerOptions.jsx === 4 || compilerOptions.jsx === 5 || compilerOptions.jsxImportSource || jsxImportSourcePragma ? (jsxImportSourcePragma === null || jsxImportSourcePragma === void 0 ? void 0 : jsxImportSourcePragma.arguments.factory) || compilerOptions.jsxImportSource || "react" : void 0;
    }
    ts2.getJSXImplicitImportBase = getJSXImplicitImportBase;
    function getJSXRuntimeImport(base, options) {
      return base ? "".concat(base, "/").concat(options.jsx === 5 ? "jsx-dev-runtime" : "jsx-runtime") : void 0;
    }
    ts2.getJSXRuntimeImport = getJSXRuntimeImport;
    function hasZeroOrOneAsteriskCharacter(str) {
      var seenAsterisk = false;
      for (var i = 0; i < str.length; i++) {
        if (str.charCodeAt(i) === 42) {
          if (!seenAsterisk) {
            seenAsterisk = true;
          } else {
            return false;
          }
        }
      }
      return true;
    }
    ts2.hasZeroOrOneAsteriskCharacter = hasZeroOrOneAsteriskCharacter;
    function createSymlinkCache(cwd, getCanonicalFileName) {
      var symlinkedDirectories;
      var symlinkedDirectoriesByRealpath;
      var symlinkedFiles;
      var hasProcessedResolutions = false;
      return {
        getSymlinkedFiles: function() {
          return symlinkedFiles;
        },
        getSymlinkedDirectories: function() {
          return symlinkedDirectories;
        },
        getSymlinkedDirectoriesByRealpath: function() {
          return symlinkedDirectoriesByRealpath;
        },
        setSymlinkedFile: function(path, real) {
          return (symlinkedFiles || (symlinkedFiles = new ts2.Map())).set(path, real);
        },
        setSymlinkedDirectory: function(symlink, real) {
          var symlinkPath = ts2.toPath(symlink, cwd, getCanonicalFileName);
          if (!containsIgnoredPath(symlinkPath)) {
            symlinkPath = ts2.ensureTrailingDirectorySeparator(symlinkPath);
            if (real !== false && !(symlinkedDirectories === null || symlinkedDirectories === void 0 ? void 0 : symlinkedDirectories.has(symlinkPath))) {
              (symlinkedDirectoriesByRealpath || (symlinkedDirectoriesByRealpath = ts2.createMultiMap())).add(ts2.ensureTrailingDirectorySeparator(real.realPath), symlink);
            }
            (symlinkedDirectories || (symlinkedDirectories = new ts2.Map())).set(symlinkPath, real);
          }
        },
        setSymlinkedDirectoryFromSymlinkedFile: function(symlink, real) {
          this.setSymlinkedFile(ts2.toPath(symlink, cwd, getCanonicalFileName), real);
          var _a = guessDirectorySymlink(real, symlink, cwd, getCanonicalFileName) || ts2.emptyArray, commonResolved = _a[0], commonOriginal = _a[1];
          if (commonResolved && commonOriginal) {
            this.setSymlinkedDirectory(commonOriginal, {
              real: commonResolved,
              realPath: ts2.toPath(commonResolved, cwd, getCanonicalFileName)
            });
          }
        },
        setSymlinksFromResolutions: function(files, typeReferenceDirectives) {
          var _this = this;
          var _a;
          ts2.Debug.assert(!hasProcessedResolutions);
          hasProcessedResolutions = true;
          for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
            var file = files_1[_i];
            (_a = file.resolvedModules) === null || _a === void 0 ? void 0 : _a.forEach(function(resolution) {
              return processResolution(_this, resolution);
            });
          }
          typeReferenceDirectives === null || typeReferenceDirectives === void 0 ? void 0 : typeReferenceDirectives.forEach(function(resolution) {
            return processResolution(_this, resolution);
          });
        },
        hasProcessedResolutions: function() {
          return hasProcessedResolutions;
        }
      };
      function processResolution(cache, resolution) {
        if (!resolution || !resolution.originalPath || !resolution.resolvedFileName)
          return;
        var resolvedFileName = resolution.resolvedFileName, originalPath = resolution.originalPath;
        cache.setSymlinkedFile(ts2.toPath(originalPath, cwd, getCanonicalFileName), resolvedFileName);
        var _a = guessDirectorySymlink(resolvedFileName, originalPath, cwd, getCanonicalFileName) || ts2.emptyArray, commonResolved = _a[0], commonOriginal = _a[1];
        if (commonResolved && commonOriginal) {
          cache.setSymlinkedDirectory(commonOriginal, { real: commonResolved, realPath: ts2.toPath(commonResolved, cwd, getCanonicalFileName) });
        }
      }
    }
    ts2.createSymlinkCache = createSymlinkCache;
    function guessDirectorySymlink(a, b, cwd, getCanonicalFileName) {
      var aParts = ts2.getPathComponents(ts2.getNormalizedAbsolutePath(a, cwd));
      var bParts = ts2.getPathComponents(ts2.getNormalizedAbsolutePath(b, cwd));
      var isDirectory = false;
      while (aParts.length >= 2 && bParts.length >= 2 && !isNodeModulesOrScopedPackageDirectory(aParts[aParts.length - 2], getCanonicalFileName) && !isNodeModulesOrScopedPackageDirectory(bParts[bParts.length - 2], getCanonicalFileName) && getCanonicalFileName(aParts[aParts.length - 1]) === getCanonicalFileName(bParts[bParts.length - 1])) {
        aParts.pop();
        bParts.pop();
        isDirectory = true;
      }
      return isDirectory ? [ts2.getPathFromPathComponents(aParts), ts2.getPathFromPathComponents(bParts)] : void 0;
    }
    function isNodeModulesOrScopedPackageDirectory(s, getCanonicalFileName) {
      return s !== void 0 && (getCanonicalFileName(s) === "node_modules" || ts2.startsWith(s, "@"));
    }
    function stripLeadingDirectorySeparator(s) {
      return ts2.isAnyDirectorySeparator(s.charCodeAt(0)) ? s.slice(1) : void 0;
    }
    function tryRemoveDirectoryPrefix(path, dirPath, getCanonicalFileName) {
      var withoutPrefix = ts2.tryRemovePrefix(path, dirPath, getCanonicalFileName);
      return withoutPrefix === void 0 ? void 0 : stripLeadingDirectorySeparator(withoutPrefix);
    }
    ts2.tryRemoveDirectoryPrefix = tryRemoveDirectoryPrefix;
    var reservedCharacterPattern = /[^\w\s\/]/g;
    function regExpEscape(text) {
      return text.replace(reservedCharacterPattern, escapeRegExpCharacter);
    }
    ts2.regExpEscape = regExpEscape;
    function escapeRegExpCharacter(match) {
      return "\\" + match;
    }
    var wildcardCharCodes = [42, 63];
    ts2.commonPackageFolders = ["node_modules", "bower_components", "jspm_packages"];
    var implicitExcludePathRegexPattern = "(?!(".concat(ts2.commonPackageFolders.join("|"), ")(/|$))");
    var filesMatcher = {
      singleAsteriskRegexFragment: "([^./]|(\\.(?!min\\.js$))?)*",
      doubleAsteriskRegexFragment: "(/".concat(implicitExcludePathRegexPattern, "[^/.][^/]*)*?"),
      replaceWildcardCharacter: function(match) {
        return replaceWildcardCharacter(match, filesMatcher.singleAsteriskRegexFragment);
      }
    };
    var directoriesMatcher = {
      singleAsteriskRegexFragment: "[^/]*",
      doubleAsteriskRegexFragment: "(/".concat(implicitExcludePathRegexPattern, "[^/.][^/]*)*?"),
      replaceWildcardCharacter: function(match) {
        return replaceWildcardCharacter(match, directoriesMatcher.singleAsteriskRegexFragment);
      }
    };
    var excludeMatcher = {
      singleAsteriskRegexFragment: "[^/]*",
      doubleAsteriskRegexFragment: "(/.+?)?",
      replaceWildcardCharacter: function(match) {
        return replaceWildcardCharacter(match, excludeMatcher.singleAsteriskRegexFragment);
      }
    };
    var wildcardMatchers = {
      files: filesMatcher,
      directories: directoriesMatcher,
      exclude: excludeMatcher
    };
    function getRegularExpressionForWildcard(specs, basePath, usage) {
      var patterns = getRegularExpressionsForWildcards(specs, basePath, usage);
      if (!patterns || !patterns.length) {
        return void 0;
      }
      var pattern = patterns.map(function(pattern2) {
        return "(".concat(pattern2, ")");
      }).join("|");
      var terminator = usage === "exclude" ? "($|/)" : "$";
      return "^(".concat(pattern, ")").concat(terminator);
    }
    ts2.getRegularExpressionForWildcard = getRegularExpressionForWildcard;
    function getRegularExpressionsForWildcards(specs, basePath, usage) {
      if (specs === void 0 || specs.length === 0) {
        return void 0;
      }
      return ts2.flatMap(specs, function(spec) {
        return spec && getSubPatternFromSpec(spec, basePath, usage, wildcardMatchers[usage]);
      });
    }
    ts2.getRegularExpressionsForWildcards = getRegularExpressionsForWildcards;
    function isImplicitGlob(lastPathComponent) {
      return !/[.*?]/.test(lastPathComponent);
    }
    ts2.isImplicitGlob = isImplicitGlob;
    function getPatternFromSpec(spec, basePath, usage) {
      var pattern = spec && getSubPatternFromSpec(spec, basePath, usage, wildcardMatchers[usage]);
      return pattern && "^(".concat(pattern, ")").concat(usage === "exclude" ? "($|/)" : "$");
    }
    ts2.getPatternFromSpec = getPatternFromSpec;
    function getSubPatternFromSpec(spec, basePath, usage, _a) {
      var singleAsteriskRegexFragment = _a.singleAsteriskRegexFragment, doubleAsteriskRegexFragment = _a.doubleAsteriskRegexFragment, replaceWildcardCharacter2 = _a.replaceWildcardCharacter;
      var subpattern = "";
      var hasWrittenComponent = false;
      var components = ts2.getNormalizedPathComponents(spec, basePath);
      var lastComponent = ts2.last(components);
      if (usage !== "exclude" && lastComponent === "**") {
        return void 0;
      }
      components[0] = ts2.removeTrailingDirectorySeparator(components[0]);
      if (isImplicitGlob(lastComponent)) {
        components.push("**", "*");
      }
      var optionalCount = 0;
      for (var _i = 0, components_1 = components; _i < components_1.length; _i++) {
        var component = components_1[_i];
        if (component === "**") {
          subpattern += doubleAsteriskRegexFragment;
        } else {
          if (usage === "directories") {
            subpattern += "(";
            optionalCount++;
          }
          if (hasWrittenComponent) {
            subpattern += ts2.directorySeparator;
          }
          if (usage !== "exclude") {
            var componentPattern = "";
            if (component.charCodeAt(0) === 42) {
              componentPattern += "([^./]" + singleAsteriskRegexFragment + ")?";
              component = component.substr(1);
            } else if (component.charCodeAt(0) === 63) {
              componentPattern += "[^./]";
              component = component.substr(1);
            }
            componentPattern += component.replace(reservedCharacterPattern, replaceWildcardCharacter2);
            if (componentPattern !== component) {
              subpattern += implicitExcludePathRegexPattern;
            }
            subpattern += componentPattern;
          } else {
            subpattern += component.replace(reservedCharacterPattern, replaceWildcardCharacter2);
          }
        }
        hasWrittenComponent = true;
      }
      while (optionalCount > 0) {
        subpattern += ")?";
        optionalCount--;
      }
      return subpattern;
    }
    function replaceWildcardCharacter(match, singleAsteriskRegexFragment) {
      return match === "*" ? singleAsteriskRegexFragment : match === "?" ? "[^/]" : "\\" + match;
    }
    function getFileMatcherPatterns(path, excludes, includes, useCaseSensitiveFileNames, currentDirectory) {
      path = ts2.normalizePath(path);
      currentDirectory = ts2.normalizePath(currentDirectory);
      var absolutePath = ts2.combinePaths(currentDirectory, path);
      return {
        includeFilePatterns: ts2.map(getRegularExpressionsForWildcards(includes, absolutePath, "files"), function(pattern) {
          return "^".concat(pattern, "$");
        }),
        includeFilePattern: getRegularExpressionForWildcard(includes, absolutePath, "files"),
        includeDirectoryPattern: getRegularExpressionForWildcard(includes, absolutePath, "directories"),
        excludePattern: getRegularExpressionForWildcard(excludes, absolutePath, "exclude"),
        basePaths: getBasePaths(path, includes, useCaseSensitiveFileNames)
      };
    }
    ts2.getFileMatcherPatterns = getFileMatcherPatterns;
    function getRegexFromPattern(pattern, useCaseSensitiveFileNames) {
      return new RegExp(pattern, useCaseSensitiveFileNames ? "" : "i");
    }
    ts2.getRegexFromPattern = getRegexFromPattern;
    function matchFiles(path, extensions, excludes, includes, useCaseSensitiveFileNames, currentDirectory, depth, getFileSystemEntries, realpath) {
      path = ts2.normalizePath(path);
      currentDirectory = ts2.normalizePath(currentDirectory);
      var patterns = getFileMatcherPatterns(path, excludes, includes, useCaseSensitiveFileNames, currentDirectory);
      var includeFileRegexes = patterns.includeFilePatterns && patterns.includeFilePatterns.map(function(pattern) {
        return getRegexFromPattern(pattern, useCaseSensitiveFileNames);
      });
      var includeDirectoryRegex = patterns.includeDirectoryPattern && getRegexFromPattern(patterns.includeDirectoryPattern, useCaseSensitiveFileNames);
      var excludeRegex = patterns.excludePattern && getRegexFromPattern(patterns.excludePattern, useCaseSensitiveFileNames);
      var results = includeFileRegexes ? includeFileRegexes.map(function() {
        return [];
      }) : [[]];
      var visited = new ts2.Map();
      var toCanonical = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      for (var _i = 0, _a = patterns.basePaths; _i < _a.length; _i++) {
        var basePath = _a[_i];
        visitDirectory(basePath, ts2.combinePaths(currentDirectory, basePath), depth);
      }
      return ts2.flatten(results);
      function visitDirectory(path2, absolutePath, depth2) {
        var canonicalPath = toCanonical(realpath(absolutePath));
        if (visited.has(canonicalPath))
          return;
        visited.set(canonicalPath, true);
        var _a2 = getFileSystemEntries(path2), files = _a2.files, directories = _a2.directories;
        var _loop_1 = function(current2) {
          var name2 = ts2.combinePaths(path2, current2);
          var absoluteName2 = ts2.combinePaths(absolutePath, current2);
          if (extensions && !ts2.fileExtensionIsOneOf(name2, extensions))
            return "continue";
          if (excludeRegex && excludeRegex.test(absoluteName2))
            return "continue";
          if (!includeFileRegexes) {
            results[0].push(name2);
          } else {
            var includeIndex = ts2.findIndex(includeFileRegexes, function(re) {
              return re.test(absoluteName2);
            });
            if (includeIndex !== -1) {
              results[includeIndex].push(name2);
            }
          }
        };
        for (var _i2 = 0, _b = ts2.sort(files, ts2.compareStringsCaseSensitive); _i2 < _b.length; _i2++) {
          var current = _b[_i2];
          _loop_1(current);
        }
        if (depth2 !== void 0) {
          depth2--;
          if (depth2 === 0) {
            return;
          }
        }
        for (var _c = 0, _d = ts2.sort(directories, ts2.compareStringsCaseSensitive); _c < _d.length; _c++) {
          var current = _d[_c];
          var name = ts2.combinePaths(path2, current);
          var absoluteName = ts2.combinePaths(absolutePath, current);
          if ((!includeDirectoryRegex || includeDirectoryRegex.test(absoluteName)) && (!excludeRegex || !excludeRegex.test(absoluteName))) {
            visitDirectory(name, absoluteName, depth2);
          }
        }
      }
    }
    ts2.matchFiles = matchFiles;
    function getBasePaths(path, includes, useCaseSensitiveFileNames) {
      var basePaths = [path];
      if (includes) {
        var includeBasePaths = [];
        for (var _i = 0, includes_1 = includes; _i < includes_1.length; _i++) {
          var include = includes_1[_i];
          var absolute = ts2.isRootedDiskPath(include) ? include : ts2.normalizePath(ts2.combinePaths(path, include));
          includeBasePaths.push(getIncludeBasePath(absolute));
        }
        includeBasePaths.sort(ts2.getStringComparer(!useCaseSensitiveFileNames));
        var _loop_2 = function(includeBasePath2) {
          if (ts2.every(basePaths, function(basePath) {
            return !ts2.containsPath(basePath, includeBasePath2, path, !useCaseSensitiveFileNames);
          })) {
            basePaths.push(includeBasePath2);
          }
        };
        for (var _a = 0, includeBasePaths_1 = includeBasePaths; _a < includeBasePaths_1.length; _a++) {
          var includeBasePath = includeBasePaths_1[_a];
          _loop_2(includeBasePath);
        }
      }
      return basePaths;
    }
    function getIncludeBasePath(absolute) {
      var wildcardOffset = ts2.indexOfAnyCharCode(absolute, wildcardCharCodes);
      if (wildcardOffset < 0) {
        return !ts2.hasExtension(absolute) ? absolute : ts2.removeTrailingDirectorySeparator(ts2.getDirectoryPath(absolute));
      }
      return absolute.substring(0, absolute.lastIndexOf(ts2.directorySeparator, wildcardOffset));
    }
    function ensureScriptKind(fileName, scriptKind) {
      return scriptKind || getScriptKindFromFileName(fileName) || 3;
    }
    ts2.ensureScriptKind = ensureScriptKind;
    function getScriptKindFromFileName(fileName) {
      var ext = fileName.substr(fileName.lastIndexOf("."));
      switch (ext.toLowerCase()) {
        case ".js":
        case ".cjs":
        case ".mjs":
          return 1;
        case ".jsx":
          return 2;
        case ".ts":
        case ".cts":
        case ".mts":
          return 3;
        case ".tsx":
          return 4;
        case ".json":
          return 6;
        default:
          return 0;
      }
    }
    ts2.getScriptKindFromFileName = getScriptKindFromFileName;
    ts2.supportedTSExtensions = [[".ts", ".tsx", ".d.ts"], [".cts", ".d.cts"], [".mts", ".d.mts"]];
    ts2.supportedTSExtensionsFlat = ts2.flatten(ts2.supportedTSExtensions);
    var supportedTSExtensionsWithJson = __spreadArray(__spreadArray([], ts2.supportedTSExtensions, true), [[".json"]], false);
    var supportedTSExtensionsForExtractExtension = [".d.ts", ".d.cts", ".d.mts", ".cts", ".mts", ".ts", ".tsx", ".cts", ".mts"];
    ts2.supportedJSExtensions = [[".js", ".jsx"], [".mjs"], [".cjs"]];
    ts2.supportedJSExtensionsFlat = ts2.flatten(ts2.supportedJSExtensions);
    var allSupportedExtensions = [[".ts", ".tsx", ".d.ts", ".js", ".jsx"], [".cts", ".d.cts", ".cjs"], [".mts", ".d.mts", ".mjs"]];
    var allSupportedExtensionsWithJson = __spreadArray(__spreadArray([], allSupportedExtensions, true), [[".json"]], false);
    function getSupportedExtensions(options, extraFileExtensions) {
      var needJsExtensions = options && getAllowJSCompilerOption(options);
      if (!extraFileExtensions || extraFileExtensions.length === 0) {
        return needJsExtensions ? allSupportedExtensions : ts2.supportedTSExtensions;
      }
      var builtins = needJsExtensions ? allSupportedExtensions : ts2.supportedTSExtensions;
      var flatBuiltins = ts2.flatten(builtins);
      var extensions = __spreadArray(__spreadArray([], builtins, true), ts2.mapDefined(extraFileExtensions, function(x) {
        return x.scriptKind === 7 || needJsExtensions && isJSLike(x.scriptKind) && flatBuiltins.indexOf(x.extension) === -1 ? [x.extension] : void 0;
      }), true);
      return extensions;
    }
    ts2.getSupportedExtensions = getSupportedExtensions;
    function getSupportedExtensionsWithJsonIfResolveJsonModule(options, supportedExtensions) {
      if (!options || !options.resolveJsonModule)
        return supportedExtensions;
      if (supportedExtensions === allSupportedExtensions)
        return allSupportedExtensionsWithJson;
      if (supportedExtensions === ts2.supportedTSExtensions)
        return supportedTSExtensionsWithJson;
      return __spreadArray(__spreadArray([], supportedExtensions, true), [[".json"]], false);
    }
    ts2.getSupportedExtensionsWithJsonIfResolveJsonModule = getSupportedExtensionsWithJsonIfResolveJsonModule;
    function isJSLike(scriptKind) {
      return scriptKind === 1 || scriptKind === 2;
    }
    function hasJSFileExtension(fileName) {
      return ts2.some(ts2.supportedJSExtensionsFlat, function(extension) {
        return ts2.fileExtensionIs(fileName, extension);
      });
    }
    ts2.hasJSFileExtension = hasJSFileExtension;
    function hasTSFileExtension(fileName) {
      return ts2.some(ts2.supportedTSExtensionsFlat, function(extension) {
        return ts2.fileExtensionIs(fileName, extension);
      });
    }
    ts2.hasTSFileExtension = hasTSFileExtension;
    function isSupportedSourceFileName(fileName, compilerOptions, extraFileExtensions) {
      if (!fileName)
        return false;
      var supportedExtensions = getSupportedExtensions(compilerOptions, extraFileExtensions);
      for (var _i = 0, _a = ts2.flatten(getSupportedExtensionsWithJsonIfResolveJsonModule(compilerOptions, supportedExtensions)); _i < _a.length; _i++) {
        var extension = _a[_i];
        if (ts2.fileExtensionIs(fileName, extension)) {
          return true;
        }
      }
      return false;
    }
    ts2.isSupportedSourceFileName = isSupportedSourceFileName;
    function numberOfDirectorySeparators(str) {
      var match = str.match(/\//g);
      return match ? match.length : 0;
    }
    function compareNumberOfDirectorySeparators(path1, path2) {
      return ts2.compareValues(numberOfDirectorySeparators(path1), numberOfDirectorySeparators(path2));
    }
    ts2.compareNumberOfDirectorySeparators = compareNumberOfDirectorySeparators;
    var extensionsToRemove = [".d.ts", ".d.mts", ".d.cts", ".mjs", ".mts", ".cjs", ".cts", ".ts", ".js", ".tsx", ".jsx", ".json"];
    function removeFileExtension(path) {
      for (var _i = 0, extensionsToRemove_1 = extensionsToRemove; _i < extensionsToRemove_1.length; _i++) {
        var ext = extensionsToRemove_1[_i];
        var extensionless = tryRemoveExtension(path, ext);
        if (extensionless !== void 0) {
          return extensionless;
        }
      }
      return path;
    }
    ts2.removeFileExtension = removeFileExtension;
    function tryRemoveExtension(path, extension) {
      return ts2.fileExtensionIs(path, extension) ? removeExtension(path, extension) : void 0;
    }
    ts2.tryRemoveExtension = tryRemoveExtension;
    function removeExtension(path, extension) {
      return path.substring(0, path.length - extension.length);
    }
    ts2.removeExtension = removeExtension;
    function changeExtension(path, newExtension) {
      return ts2.changeAnyExtension(path, newExtension, extensionsToRemove, false);
    }
    ts2.changeExtension = changeExtension;
    function tryParsePattern(pattern) {
      var indexOfStar = pattern.indexOf("*");
      if (indexOfStar === -1) {
        return pattern;
      }
      return pattern.indexOf("*", indexOfStar + 1) !== -1 ? void 0 : {
        prefix: pattern.substr(0, indexOfStar),
        suffix: pattern.substr(indexOfStar + 1)
      };
    }
    ts2.tryParsePattern = tryParsePattern;
    function tryParsePatterns(paths) {
      return ts2.mapDefined(ts2.getOwnKeys(paths), function(path) {
        return tryParsePattern(path);
      });
    }
    ts2.tryParsePatterns = tryParsePatterns;
    function positionIsSynthesized(pos) {
      return !(pos >= 0);
    }
    ts2.positionIsSynthesized = positionIsSynthesized;
    function extensionIsTS(ext) {
      return ext === ".ts" || ext === ".tsx" || ext === ".d.ts" || ext === ".cts" || ext === ".mts" || ext === ".d.mts" || ext === ".d.cts";
    }
    ts2.extensionIsTS = extensionIsTS;
    function resolutionExtensionIsTSOrJson(ext) {
      return extensionIsTS(ext) || ext === ".json";
    }
    ts2.resolutionExtensionIsTSOrJson = resolutionExtensionIsTSOrJson;
    function extensionFromPath(path) {
      var ext = tryGetExtensionFromPath(path);
      return ext !== void 0 ? ext : ts2.Debug.fail("File ".concat(path, " has unknown extension."));
    }
    ts2.extensionFromPath = extensionFromPath;
    function isAnySupportedFileExtension(path) {
      return tryGetExtensionFromPath(path) !== void 0;
    }
    ts2.isAnySupportedFileExtension = isAnySupportedFileExtension;
    function tryGetExtensionFromPath(path) {
      return ts2.find(extensionsToRemove, function(e) {
        return ts2.fileExtensionIs(path, e);
      });
    }
    ts2.tryGetExtensionFromPath = tryGetExtensionFromPath;
    function isCheckJsEnabledForFile(sourceFile, compilerOptions) {
      return sourceFile.checkJsDirective ? sourceFile.checkJsDirective.enabled : compilerOptions.checkJs;
    }
    ts2.isCheckJsEnabledForFile = isCheckJsEnabledForFile;
    ts2.emptyFileSystemEntries = {
      files: ts2.emptyArray,
      directories: ts2.emptyArray
    };
    function matchPatternOrExact(patternOrStrings, candidate) {
      var patterns = [];
      for (var _i = 0, patternOrStrings_1 = patternOrStrings; _i < patternOrStrings_1.length; _i++) {
        var patternOrString = patternOrStrings_1[_i];
        if (patternOrString === candidate) {
          return candidate;
        }
        if (!ts2.isString(patternOrString)) {
          patterns.push(patternOrString);
        }
      }
      return ts2.findBestPatternMatch(patterns, function(_) {
        return _;
      }, candidate);
    }
    ts2.matchPatternOrExact = matchPatternOrExact;
    function sliceAfter(arr, value) {
      var index = arr.indexOf(value);
      ts2.Debug.assert(index !== -1);
      return arr.slice(index);
    }
    ts2.sliceAfter = sliceAfter;
    function addRelatedInfo(diagnostic) {
      var _a;
      var relatedInformation = [];
      for (var _i = 1; _i < arguments.length; _i++) {
        relatedInformation[_i - 1] = arguments[_i];
      }
      if (!relatedInformation.length) {
        return diagnostic;
      }
      if (!diagnostic.relatedInformation) {
        diagnostic.relatedInformation = [];
      }
      ts2.Debug.assert(diagnostic.relatedInformation !== ts2.emptyArray, "Diagnostic had empty array singleton for related info, but is still being constructed!");
      (_a = diagnostic.relatedInformation).push.apply(_a, relatedInformation);
      return diagnostic;
    }
    ts2.addRelatedInfo = addRelatedInfo;
    function minAndMax(arr, getValue) {
      ts2.Debug.assert(arr.length !== 0);
      var min = getValue(arr[0]);
      var max = min;
      for (var i = 1; i < arr.length; i++) {
        var value = getValue(arr[i]);
        if (value < min) {
          min = value;
        } else if (value > max) {
          max = value;
        }
      }
      return { min, max };
    }
    ts2.minAndMax = minAndMax;
    function rangeOfNode(node) {
      return { pos: getTokenPosOfNode(node), end: node.end };
    }
    ts2.rangeOfNode = rangeOfNode;
    function rangeOfTypeParameters(sourceFile, typeParameters) {
      var pos = typeParameters.pos - 1;
      var end = ts2.skipTrivia(sourceFile.text, typeParameters.end) + 1;
      return { pos, end };
    }
    ts2.rangeOfTypeParameters = rangeOfTypeParameters;
    function skipTypeChecking(sourceFile, options, host) {
      return options.skipLibCheck && sourceFile.isDeclarationFile || options.skipDefaultLibCheck && sourceFile.hasNoDefaultLib || host.isSourceOfProjectReferenceRedirect(sourceFile.fileName);
    }
    ts2.skipTypeChecking = skipTypeChecking;
    function isJsonEqual(a, b) {
      return a === b || typeof a === "object" && a !== null && typeof b === "object" && b !== null && ts2.equalOwnProperties(a, b, isJsonEqual);
    }
    ts2.isJsonEqual = isJsonEqual;
    function parsePseudoBigInt(stringValue) {
      var log2Base;
      switch (stringValue.charCodeAt(1)) {
        case 98:
        case 66:
          log2Base = 1;
          break;
        case 111:
        case 79:
          log2Base = 3;
          break;
        case 120:
        case 88:
          log2Base = 4;
          break;
        default:
          var nIndex = stringValue.length - 1;
          var nonZeroStart = 0;
          while (stringValue.charCodeAt(nonZeroStart) === 48) {
            nonZeroStart++;
          }
          return stringValue.slice(nonZeroStart, nIndex) || "0";
      }
      var startIndex = 2, endIndex = stringValue.length - 1;
      var bitsNeeded = (endIndex - startIndex) * log2Base;
      var segments = new Uint16Array((bitsNeeded >>> 4) + (bitsNeeded & 15 ? 1 : 0));
      for (var i = endIndex - 1, bitOffset = 0; i >= startIndex; i--, bitOffset += log2Base) {
        var segment = bitOffset >>> 4;
        var digitChar = stringValue.charCodeAt(i);
        var digit = digitChar <= 57 ? digitChar - 48 : 10 + digitChar - (digitChar <= 70 ? 65 : 97);
        var shiftedDigit = digit << (bitOffset & 15);
        segments[segment] |= shiftedDigit;
        var residual = shiftedDigit >>> 16;
        if (residual)
          segments[segment + 1] |= residual;
      }
      var base10Value = "";
      var firstNonzeroSegment = segments.length - 1;
      var segmentsRemaining = true;
      while (segmentsRemaining) {
        var mod10 = 0;
        segmentsRemaining = false;
        for (var segment = firstNonzeroSegment; segment >= 0; segment--) {
          var newSegment = mod10 << 16 | segments[segment];
          var segmentValue = newSegment / 10 | 0;
          segments[segment] = segmentValue;
          mod10 = newSegment - segmentValue * 10;
          if (segmentValue && !segmentsRemaining) {
            firstNonzeroSegment = segment;
            segmentsRemaining = true;
          }
        }
        base10Value = mod10 + base10Value;
      }
      return base10Value;
    }
    ts2.parsePseudoBigInt = parsePseudoBigInt;
    function pseudoBigIntToString(_a) {
      var negative = _a.negative, base10Value = _a.base10Value;
      return (negative && base10Value !== "0" ? "-" : "") + base10Value;
    }
    ts2.pseudoBigIntToString = pseudoBigIntToString;
    function isValidTypeOnlyAliasUseSite(useSite) {
      return !!(useSite.flags & 8388608) || isPartOfTypeQuery(useSite) || isIdentifierInNonEmittingHeritageClause(useSite) || isPartOfPossiblyValidTypeOrAbstractComputedPropertyName(useSite) || !(isExpressionNode(useSite) || isShorthandPropertyNameUseSite(useSite));
    }
    ts2.isValidTypeOnlyAliasUseSite = isValidTypeOnlyAliasUseSite;
    function isShorthandPropertyNameUseSite(useSite) {
      return ts2.isIdentifier(useSite) && ts2.isShorthandPropertyAssignment(useSite.parent) && useSite.parent.name === useSite;
    }
    function isPartOfPossiblyValidTypeOrAbstractComputedPropertyName(node) {
      while (node.kind === 79 || node.kind === 205) {
        node = node.parent;
      }
      if (node.kind !== 161) {
        return false;
      }
      if (hasSyntacticModifier(node.parent, 128)) {
        return true;
      }
      var containerKind = node.parent.parent.kind;
      return containerKind === 257 || containerKind === 181;
    }
    function isIdentifierInNonEmittingHeritageClause(node) {
      if (node.kind !== 79)
        return false;
      var heritageClause = ts2.findAncestor(node.parent, function(parent) {
        switch (parent.kind) {
          case 290:
            return true;
          case 205:
          case 227:
            return false;
          default:
            return "quit";
        }
      });
      return (heritageClause === null || heritageClause === void 0 ? void 0 : heritageClause.token) === 117 || (heritageClause === null || heritageClause === void 0 ? void 0 : heritageClause.parent.kind) === 257;
    }
    function isIdentifierTypeReference(node) {
      return ts2.isTypeReferenceNode(node) && ts2.isIdentifier(node.typeName);
    }
    ts2.isIdentifierTypeReference = isIdentifierTypeReference;
    function arrayIsHomogeneous(array, comparer) {
      if (comparer === void 0) {
        comparer = ts2.equateValues;
      }
      if (array.length < 2)
        return true;
      var first = array[0];
      for (var i = 1, length_1 = array.length; i < length_1; i++) {
        var target = array[i];
        if (!comparer(first, target))
          return false;
      }
      return true;
    }
    ts2.arrayIsHomogeneous = arrayIsHomogeneous;
    function setTextRangePos(range, pos) {
      range.pos = pos;
      return range;
    }
    ts2.setTextRangePos = setTextRangePos;
    function setTextRangeEnd(range, end) {
      range.end = end;
      return range;
    }
    ts2.setTextRangeEnd = setTextRangeEnd;
    function setTextRangePosEnd(range, pos, end) {
      return setTextRangeEnd(setTextRangePos(range, pos), end);
    }
    ts2.setTextRangePosEnd = setTextRangePosEnd;
    function setTextRangePosWidth(range, pos, width) {
      return setTextRangePosEnd(range, pos, pos + width);
    }
    ts2.setTextRangePosWidth = setTextRangePosWidth;
    function setNodeFlags(node, newFlags) {
      if (node) {
        node.flags = newFlags;
      }
      return node;
    }
    ts2.setNodeFlags = setNodeFlags;
    function setParent(child, parent) {
      if (child && parent) {
        child.parent = parent;
      }
      return child;
    }
    ts2.setParent = setParent;
    function setEachParent(children, parent) {
      if (children) {
        for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
          var child = children_1[_i];
          setParent(child, parent);
        }
      }
      return children;
    }
    ts2.setEachParent = setEachParent;
    function setParentRecursive(rootNode, incremental) {
      if (!rootNode)
        return rootNode;
      ts2.forEachChildRecursively(rootNode, ts2.isJSDocNode(rootNode) ? bindParentToChildIgnoringJSDoc : bindParentToChild);
      return rootNode;
      function bindParentToChildIgnoringJSDoc(child, parent) {
        if (incremental && child.parent === parent) {
          return "skip";
        }
        setParent(child, parent);
      }
      function bindJSDoc(child) {
        if (ts2.hasJSDocNodes(child)) {
          for (var _i = 0, _a = child.jsDoc; _i < _a.length; _i++) {
            var doc = _a[_i];
            bindParentToChildIgnoringJSDoc(doc, child);
            ts2.forEachChildRecursively(doc, bindParentToChildIgnoringJSDoc);
          }
        }
      }
      function bindParentToChild(child, parent) {
        return bindParentToChildIgnoringJSDoc(child, parent) || bindJSDoc(child);
      }
    }
    ts2.setParentRecursive = setParentRecursive;
    function isPackedElement(node) {
      return !ts2.isOmittedExpression(node);
    }
    function isPackedArrayLiteral(node) {
      return ts2.isArrayLiteralExpression(node) && ts2.every(node.elements, isPackedElement);
    }
    ts2.isPackedArrayLiteral = isPackedArrayLiteral;
    function expressionResultIsUnused(node) {
      ts2.Debug.assertIsDefined(node.parent);
      while (true) {
        var parent = node.parent;
        if (ts2.isParenthesizedExpression(parent)) {
          node = parent;
          continue;
        }
        if (ts2.isExpressionStatement(parent) || ts2.isVoidExpression(parent) || ts2.isForStatement(parent) && (parent.initializer === node || parent.incrementor === node)) {
          return true;
        }
        if (ts2.isCommaListExpression(parent)) {
          if (node !== ts2.last(parent.elements))
            return true;
          node = parent;
          continue;
        }
        if (ts2.isBinaryExpression(parent) && parent.operatorToken.kind === 27) {
          if (node === parent.left)
            return true;
          node = parent;
          continue;
        }
        return false;
      }
    }
    ts2.expressionResultIsUnused = expressionResultIsUnused;
    function containsIgnoredPath(path) {
      return ts2.some(ts2.ignoredPaths, function(p) {
        return ts2.stringContains(path, p);
      });
    }
    ts2.containsIgnoredPath = containsIgnoredPath;
    function getContainingNodeArray(node) {
      if (!node.parent)
        return void 0;
      switch (node.kind) {
        case 162:
          var parent_1 = node.parent;
          return parent_1.kind === 189 ? void 0 : parent_1.typeParameters;
        case 163:
          return node.parent.parameters;
        case 198:
          return node.parent.templateSpans;
        case 232:
          return node.parent.templateSpans;
        case 164:
          return node.parent.decorators;
        case 290:
          return node.parent.heritageClauses;
      }
      var parent = node.parent;
      if (ts2.isJSDocTag(node)) {
        return ts2.isJSDocTypeLiteral(node.parent) ? void 0 : node.parent.tags;
      }
      switch (parent.kind) {
        case 181:
        case 257:
          return ts2.isTypeElement(node) ? parent.members : void 0;
        case 186:
        case 187:
          return parent.types;
        case 183:
        case 203:
        case 349:
        case 268:
        case 272:
          return parent.elements;
        case 204:
        case 285:
          return parent.properties;
        case 207:
        case 208:
          return ts2.isTypeNode(node) ? parent.typeArguments : parent.expression === node ? void 0 : parent.arguments;
        case 277:
        case 281:
          return ts2.isJsxChild(node) ? parent.children : void 0;
        case 279:
        case 278:
          return ts2.isTypeNode(node) ? parent.typeArguments : void 0;
        case 234:
        case 288:
        case 289:
        case 261:
          return parent.statements;
        case 262:
          return parent.clauses;
        case 256:
        case 225:
          return ts2.isClassElement(node) ? parent.members : void 0;
        case 259:
          return ts2.isEnumMember(node) ? parent.members : void 0;
        case 303:
          return parent.statements;
      }
    }
    ts2.getContainingNodeArray = getContainingNodeArray;
    function hasContextSensitiveParameters(node) {
      if (!node.typeParameters) {
        if (ts2.some(node.parameters, function(p) {
          return !getEffectiveTypeAnnotationNode(p);
        })) {
          return true;
        }
        if (node.kind !== 213) {
          var parameter = ts2.firstOrUndefined(node.parameters);
          if (!(parameter && parameterIsThisKeyword(parameter))) {
            return true;
          }
        }
      }
      return false;
    }
    ts2.hasContextSensitiveParameters = hasContextSensitiveParameters;
    function isInfinityOrNaNString(name) {
      return name === "Infinity" || name === "-Infinity" || name === "NaN";
    }
    ts2.isInfinityOrNaNString = isInfinityOrNaNString;
    function isCatchClauseVariableDeclaration(node) {
      return node.kind === 253 && node.parent.kind === 291;
    }
    ts2.isCatchClauseVariableDeclaration = isCatchClauseVariableDeclaration;
    function isParameterOrCatchClauseVariable(symbol) {
      var declaration = symbol.valueDeclaration && getRootDeclaration(symbol.valueDeclaration);
      return !!declaration && (ts2.isParameter(declaration) || isCatchClauseVariableDeclaration(declaration));
    }
    ts2.isParameterOrCatchClauseVariable = isParameterOrCatchClauseVariable;
    function isFunctionExpressionOrArrowFunction(node) {
      return node.kind === 212 || node.kind === 213;
    }
    ts2.isFunctionExpressionOrArrowFunction = isFunctionExpressionOrArrowFunction;
    function escapeSnippetText(text) {
      return text.replace(/\$/gm, "\\$");
    }
    ts2.escapeSnippetText = escapeSnippetText;
  })(ts || (ts = {}));
  (function(ts2) {
    function createBaseNodeFactory() {
      var NodeConstructor;
      var TokenConstructor;
      var IdentifierConstructor;
      var PrivateIdentifierConstructor;
      var SourceFileConstructor;
      return {
        createBaseSourceFileNode,
        createBaseIdentifierNode,
        createBasePrivateIdentifierNode,
        createBaseTokenNode,
        createBaseNode
      };
      function createBaseSourceFileNode(kind) {
        return new (SourceFileConstructor || (SourceFileConstructor = ts2.objectAllocator.getSourceFileConstructor()))(kind, -1, -1);
      }
      function createBaseIdentifierNode(kind) {
        return new (IdentifierConstructor || (IdentifierConstructor = ts2.objectAllocator.getIdentifierConstructor()))(kind, -1, -1);
      }
      function createBasePrivateIdentifierNode(kind) {
        return new (PrivateIdentifierConstructor || (PrivateIdentifierConstructor = ts2.objectAllocator.getPrivateIdentifierConstructor()))(kind, -1, -1);
      }
      function createBaseTokenNode(kind) {
        return new (TokenConstructor || (TokenConstructor = ts2.objectAllocator.getTokenConstructor()))(kind, -1, -1);
      }
      function createBaseNode(kind) {
        return new (NodeConstructor || (NodeConstructor = ts2.objectAllocator.getNodeConstructor()))(kind, -1, -1);
      }
    }
    ts2.createBaseNodeFactory = createBaseNodeFactory;
  })(ts || (ts = {}));
  (function(ts2) {
    function createParenthesizerRules(factory) {
      var binaryLeftOperandParenthesizerCache;
      var binaryRightOperandParenthesizerCache;
      return {
        getParenthesizeLeftSideOfBinaryForOperator,
        getParenthesizeRightSideOfBinaryForOperator,
        parenthesizeLeftSideOfBinary,
        parenthesizeRightSideOfBinary,
        parenthesizeExpressionOfComputedPropertyName,
        parenthesizeConditionOfConditionalExpression,
        parenthesizeBranchOfConditionalExpression,
        parenthesizeExpressionOfExportDefault,
        parenthesizeExpressionOfNew,
        parenthesizeLeftSideOfAccess,
        parenthesizeOperandOfPostfixUnary,
        parenthesizeOperandOfPrefixUnary,
        parenthesizeExpressionsOfCommaDelimitedList,
        parenthesizeExpressionForDisallowedComma,
        parenthesizeExpressionOfExpressionStatement,
        parenthesizeConciseBodyOfArrowFunction,
        parenthesizeMemberOfConditionalType,
        parenthesizeMemberOfElementType,
        parenthesizeElementTypeOfArrayType,
        parenthesizeConstituentTypesOfUnionOrIntersectionType,
        parenthesizeTypeArguments
      };
      function getParenthesizeLeftSideOfBinaryForOperator(operatorKind) {
        binaryLeftOperandParenthesizerCache || (binaryLeftOperandParenthesizerCache = new ts2.Map());
        var parenthesizerRule = binaryLeftOperandParenthesizerCache.get(operatorKind);
        if (!parenthesizerRule) {
          parenthesizerRule = function(node) {
            return parenthesizeLeftSideOfBinary(operatorKind, node);
          };
          binaryLeftOperandParenthesizerCache.set(operatorKind, parenthesizerRule);
        }
        return parenthesizerRule;
      }
      function getParenthesizeRightSideOfBinaryForOperator(operatorKind) {
        binaryRightOperandParenthesizerCache || (binaryRightOperandParenthesizerCache = new ts2.Map());
        var parenthesizerRule = binaryRightOperandParenthesizerCache.get(operatorKind);
        if (!parenthesizerRule) {
          parenthesizerRule = function(node) {
            return parenthesizeRightSideOfBinary(operatorKind, void 0, node);
          };
          binaryRightOperandParenthesizerCache.set(operatorKind, parenthesizerRule);
        }
        return parenthesizerRule;
      }
      function binaryOperandNeedsParentheses(binaryOperator, operand, isLeftSideOfBinary, leftOperand) {
        var binaryOperatorPrecedence = ts2.getOperatorPrecedence(220, binaryOperator);
        var binaryOperatorAssociativity = ts2.getOperatorAssociativity(220, binaryOperator);
        var emittedOperand = ts2.skipPartiallyEmittedExpressions(operand);
        if (!isLeftSideOfBinary && operand.kind === 213 && binaryOperatorPrecedence > 3) {
          return true;
        }
        var operandPrecedence = ts2.getExpressionPrecedence(emittedOperand);
        switch (ts2.compareValues(operandPrecedence, binaryOperatorPrecedence)) {
          case -1:
            if (!isLeftSideOfBinary && binaryOperatorAssociativity === 1 && operand.kind === 223) {
              return false;
            }
            return true;
          case 1:
            return false;
          case 0:
            if (isLeftSideOfBinary) {
              return binaryOperatorAssociativity === 1;
            } else {
              if (ts2.isBinaryExpression(emittedOperand) && emittedOperand.operatorToken.kind === binaryOperator) {
                if (operatorHasAssociativeProperty(binaryOperator)) {
                  return false;
                }
                if (binaryOperator === 39) {
                  var leftKind = leftOperand ? getLiteralKindOfBinaryPlusOperand(leftOperand) : 0;
                  if (ts2.isLiteralKind(leftKind) && leftKind === getLiteralKindOfBinaryPlusOperand(emittedOperand)) {
                    return false;
                  }
                }
              }
              var operandAssociativity = ts2.getExpressionAssociativity(emittedOperand);
              return operandAssociativity === 0;
            }
        }
      }
      function operatorHasAssociativeProperty(binaryOperator) {
        return binaryOperator === 41 || binaryOperator === 51 || binaryOperator === 50 || binaryOperator === 52;
      }
      function getLiteralKindOfBinaryPlusOperand(node) {
        node = ts2.skipPartiallyEmittedExpressions(node);
        if (ts2.isLiteralKind(node.kind)) {
          return node.kind;
        }
        if (node.kind === 220 && node.operatorToken.kind === 39) {
          if (node.cachedLiteralKind !== void 0) {
            return node.cachedLiteralKind;
          }
          var leftKind = getLiteralKindOfBinaryPlusOperand(node.left);
          var literalKind = ts2.isLiteralKind(leftKind) && leftKind === getLiteralKindOfBinaryPlusOperand(node.right) ? leftKind : 0;
          node.cachedLiteralKind = literalKind;
          return literalKind;
        }
        return 0;
      }
      function parenthesizeBinaryOperand(binaryOperator, operand, isLeftSideOfBinary, leftOperand) {
        var skipped = ts2.skipPartiallyEmittedExpressions(operand);
        if (skipped.kind === 211) {
          return operand;
        }
        return binaryOperandNeedsParentheses(binaryOperator, operand, isLeftSideOfBinary, leftOperand) ? factory.createParenthesizedExpression(operand) : operand;
      }
      function parenthesizeLeftSideOfBinary(binaryOperator, leftSide) {
        return parenthesizeBinaryOperand(binaryOperator, leftSide, true);
      }
      function parenthesizeRightSideOfBinary(binaryOperator, leftSide, rightSide) {
        return parenthesizeBinaryOperand(binaryOperator, rightSide, false, leftSide);
      }
      function parenthesizeExpressionOfComputedPropertyName(expression) {
        return ts2.isCommaSequence(expression) ? factory.createParenthesizedExpression(expression) : expression;
      }
      function parenthesizeConditionOfConditionalExpression(condition) {
        var conditionalPrecedence = ts2.getOperatorPrecedence(221, 57);
        var emittedCondition = ts2.skipPartiallyEmittedExpressions(condition);
        var conditionPrecedence = ts2.getExpressionPrecedence(emittedCondition);
        if (ts2.compareValues(conditionPrecedence, conditionalPrecedence) !== 1) {
          return factory.createParenthesizedExpression(condition);
        }
        return condition;
      }
      function parenthesizeBranchOfConditionalExpression(branch) {
        var emittedExpression = ts2.skipPartiallyEmittedExpressions(branch);
        return ts2.isCommaSequence(emittedExpression) ? factory.createParenthesizedExpression(branch) : branch;
      }
      function parenthesizeExpressionOfExportDefault(expression) {
        var check = ts2.skipPartiallyEmittedExpressions(expression);
        var needsParens = ts2.isCommaSequence(check);
        if (!needsParens) {
          switch (ts2.getLeftmostExpression(check, false).kind) {
            case 225:
            case 212:
              needsParens = true;
          }
        }
        return needsParens ? factory.createParenthesizedExpression(expression) : expression;
      }
      function parenthesizeExpressionOfNew(expression) {
        var leftmostExpr = ts2.getLeftmostExpression(expression, true);
        switch (leftmostExpr.kind) {
          case 207:
            return factory.createParenthesizedExpression(expression);
          case 208:
            return !leftmostExpr.arguments ? factory.createParenthesizedExpression(expression) : expression;
        }
        return parenthesizeLeftSideOfAccess(expression);
      }
      function parenthesizeLeftSideOfAccess(expression) {
        var emittedExpression = ts2.skipPartiallyEmittedExpressions(expression);
        if (ts2.isLeftHandSideExpression(emittedExpression) && (emittedExpression.kind !== 208 || emittedExpression.arguments)) {
          return expression;
        }
        return ts2.setTextRange(factory.createParenthesizedExpression(expression), expression);
      }
      function parenthesizeOperandOfPostfixUnary(operand) {
        return ts2.isLeftHandSideExpression(operand) ? operand : ts2.setTextRange(factory.createParenthesizedExpression(operand), operand);
      }
      function parenthesizeOperandOfPrefixUnary(operand) {
        return ts2.isUnaryExpression(operand) ? operand : ts2.setTextRange(factory.createParenthesizedExpression(operand), operand);
      }
      function parenthesizeExpressionsOfCommaDelimitedList(elements) {
        var result = ts2.sameMap(elements, parenthesizeExpressionForDisallowedComma);
        return ts2.setTextRange(factory.createNodeArray(result, elements.hasTrailingComma), elements);
      }
      function parenthesizeExpressionForDisallowedComma(expression) {
        var emittedExpression = ts2.skipPartiallyEmittedExpressions(expression);
        var expressionPrecedence = ts2.getExpressionPrecedence(emittedExpression);
        var commaPrecedence = ts2.getOperatorPrecedence(220, 27);
        return expressionPrecedence > commaPrecedence ? expression : ts2.setTextRange(factory.createParenthesizedExpression(expression), expression);
      }
      function parenthesizeExpressionOfExpressionStatement(expression) {
        var emittedExpression = ts2.skipPartiallyEmittedExpressions(expression);
        if (ts2.isCallExpression(emittedExpression)) {
          var callee = emittedExpression.expression;
          var kind = ts2.skipPartiallyEmittedExpressions(callee).kind;
          if (kind === 212 || kind === 213) {
            var updated = factory.updateCallExpression(emittedExpression, ts2.setTextRange(factory.createParenthesizedExpression(callee), callee), emittedExpression.typeArguments, emittedExpression.arguments);
            return factory.restoreOuterExpressions(expression, updated, 8);
          }
        }
        var leftmostExpressionKind = ts2.getLeftmostExpression(emittedExpression, false).kind;
        if (leftmostExpressionKind === 204 || leftmostExpressionKind === 212) {
          return ts2.setTextRange(factory.createParenthesizedExpression(expression), expression);
        }
        return expression;
      }
      function parenthesizeConciseBodyOfArrowFunction(body) {
        if (!ts2.isBlock(body) && (ts2.isCommaSequence(body) || ts2.getLeftmostExpression(body, false).kind === 204)) {
          return ts2.setTextRange(factory.createParenthesizedExpression(body), body);
        }
        return body;
      }
      function parenthesizeMemberOfConditionalType(member) {
        return member.kind === 188 ? factory.createParenthesizedType(member) : member;
      }
      function parenthesizeMemberOfElementType(member) {
        switch (member.kind) {
          case 186:
          case 187:
          case 178:
          case 179:
            return factory.createParenthesizedType(member);
        }
        return parenthesizeMemberOfConditionalType(member);
      }
      function parenthesizeElementTypeOfArrayType(member) {
        switch (member.kind) {
          case 180:
          case 192:
          case 189:
            return factory.createParenthesizedType(member);
        }
        return parenthesizeMemberOfElementType(member);
      }
      function parenthesizeConstituentTypesOfUnionOrIntersectionType(members) {
        return factory.createNodeArray(ts2.sameMap(members, parenthesizeMemberOfElementType));
      }
      function parenthesizeOrdinalTypeArgument(node, i) {
        return i === 0 && ts2.isFunctionOrConstructorTypeNode(node) && node.typeParameters ? factory.createParenthesizedType(node) : node;
      }
      function parenthesizeTypeArguments(typeArguments) {
        if (ts2.some(typeArguments)) {
          return factory.createNodeArray(ts2.sameMap(typeArguments, parenthesizeOrdinalTypeArgument));
        }
      }
    }
    ts2.createParenthesizerRules = createParenthesizerRules;
    ts2.nullParenthesizerRules = {
      getParenthesizeLeftSideOfBinaryForOperator: function(_) {
        return ts2.identity;
      },
      getParenthesizeRightSideOfBinaryForOperator: function(_) {
        return ts2.identity;
      },
      parenthesizeLeftSideOfBinary: function(_binaryOperator, leftSide) {
        return leftSide;
      },
      parenthesizeRightSideOfBinary: function(_binaryOperator, _leftSide, rightSide) {
        return rightSide;
      },
      parenthesizeExpressionOfComputedPropertyName: ts2.identity,
      parenthesizeConditionOfConditionalExpression: ts2.identity,
      parenthesizeBranchOfConditionalExpression: ts2.identity,
      parenthesizeExpressionOfExportDefault: ts2.identity,
      parenthesizeExpressionOfNew: function(expression) {
        return ts2.cast(expression, ts2.isLeftHandSideExpression);
      },
      parenthesizeLeftSideOfAccess: function(expression) {
        return ts2.cast(expression, ts2.isLeftHandSideExpression);
      },
      parenthesizeOperandOfPostfixUnary: function(operand) {
        return ts2.cast(operand, ts2.isLeftHandSideExpression);
      },
      parenthesizeOperandOfPrefixUnary: function(operand) {
        return ts2.cast(operand, ts2.isUnaryExpression);
      },
      parenthesizeExpressionsOfCommaDelimitedList: function(nodes) {
        return ts2.cast(nodes, ts2.isNodeArray);
      },
      parenthesizeExpressionForDisallowedComma: ts2.identity,
      parenthesizeExpressionOfExpressionStatement: ts2.identity,
      parenthesizeConciseBodyOfArrowFunction: ts2.identity,
      parenthesizeMemberOfConditionalType: ts2.identity,
      parenthesizeMemberOfElementType: ts2.identity,
      parenthesizeElementTypeOfArrayType: ts2.identity,
      parenthesizeConstituentTypesOfUnionOrIntersectionType: function(nodes) {
        return ts2.cast(nodes, ts2.isNodeArray);
      },
      parenthesizeTypeArguments: function(nodes) {
        return nodes && ts2.cast(nodes, ts2.isNodeArray);
      }
    };
  })(ts || (ts = {}));
  (function(ts2) {
    function createNodeConverters(factory) {
      return {
        convertToFunctionBlock,
        convertToFunctionExpression,
        convertToArrayAssignmentElement,
        convertToObjectAssignmentElement,
        convertToAssignmentPattern,
        convertToObjectAssignmentPattern,
        convertToArrayAssignmentPattern,
        convertToAssignmentElementTarget
      };
      function convertToFunctionBlock(node, multiLine) {
        if (ts2.isBlock(node))
          return node;
        var returnStatement = factory.createReturnStatement(node);
        ts2.setTextRange(returnStatement, node);
        var body = factory.createBlock([returnStatement], multiLine);
        ts2.setTextRange(body, node);
        return body;
      }
      function convertToFunctionExpression(node) {
        if (!node.body)
          return ts2.Debug.fail("Cannot convert a FunctionDeclaration without a body");
        var updated = factory.createFunctionExpression(node.modifiers, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body);
        ts2.setOriginalNode(updated, node);
        ts2.setTextRange(updated, node);
        if (ts2.getStartsOnNewLine(node)) {
          ts2.setStartsOnNewLine(updated, true);
        }
        return updated;
      }
      function convertToArrayAssignmentElement(element) {
        if (ts2.isBindingElement(element)) {
          if (element.dotDotDotToken) {
            ts2.Debug.assertNode(element.name, ts2.isIdentifier);
            return ts2.setOriginalNode(ts2.setTextRange(factory.createSpreadElement(element.name), element), element);
          }
          var expression = convertToAssignmentElementTarget(element.name);
          return element.initializer ? ts2.setOriginalNode(ts2.setTextRange(factory.createAssignment(expression, element.initializer), element), element) : expression;
        }
        return ts2.cast(element, ts2.isExpression);
      }
      function convertToObjectAssignmentElement(element) {
        if (ts2.isBindingElement(element)) {
          if (element.dotDotDotToken) {
            ts2.Debug.assertNode(element.name, ts2.isIdentifier);
            return ts2.setOriginalNode(ts2.setTextRange(factory.createSpreadAssignment(element.name), element), element);
          }
          if (element.propertyName) {
            var expression = convertToAssignmentElementTarget(element.name);
            return ts2.setOriginalNode(ts2.setTextRange(factory.createPropertyAssignment(element.propertyName, element.initializer ? factory.createAssignment(expression, element.initializer) : expression), element), element);
          }
          ts2.Debug.assertNode(element.name, ts2.isIdentifier);
          return ts2.setOriginalNode(ts2.setTextRange(factory.createShorthandPropertyAssignment(element.name, element.initializer), element), element);
        }
        return ts2.cast(element, ts2.isObjectLiteralElementLike);
      }
      function convertToAssignmentPattern(node) {
        switch (node.kind) {
          case 201:
          case 203:
            return convertToArrayAssignmentPattern(node);
          case 200:
          case 204:
            return convertToObjectAssignmentPattern(node);
        }
      }
      function convertToObjectAssignmentPattern(node) {
        if (ts2.isObjectBindingPattern(node)) {
          return ts2.setOriginalNode(ts2.setTextRange(factory.createObjectLiteralExpression(ts2.map(node.elements, convertToObjectAssignmentElement)), node), node);
        }
        return ts2.cast(node, ts2.isObjectLiteralExpression);
      }
      function convertToArrayAssignmentPattern(node) {
        if (ts2.isArrayBindingPattern(node)) {
          return ts2.setOriginalNode(ts2.setTextRange(factory.createArrayLiteralExpression(ts2.map(node.elements, convertToArrayAssignmentElement)), node), node);
        }
        return ts2.cast(node, ts2.isArrayLiteralExpression);
      }
      function convertToAssignmentElementTarget(node) {
        if (ts2.isBindingPattern(node)) {
          return convertToAssignmentPattern(node);
        }
        return ts2.cast(node, ts2.isExpression);
      }
    }
    ts2.createNodeConverters = createNodeConverters;
    ts2.nullNodeConverters = {
      convertToFunctionBlock: ts2.notImplemented,
      convertToFunctionExpression: ts2.notImplemented,
      convertToArrayAssignmentElement: ts2.notImplemented,
      convertToObjectAssignmentElement: ts2.notImplemented,
      convertToAssignmentPattern: ts2.notImplemented,
      convertToObjectAssignmentPattern: ts2.notImplemented,
      convertToArrayAssignmentPattern: ts2.notImplemented,
      convertToAssignmentElementTarget: ts2.notImplemented
    };
  })(ts || (ts = {}));
  (function(ts2) {
    var nextAutoGenerateId = 0;
    var NodeFactoryFlags;
    (function(NodeFactoryFlags2) {
      NodeFactoryFlags2[NodeFactoryFlags2["None"] = 0] = "None";
      NodeFactoryFlags2[NodeFactoryFlags2["NoParenthesizerRules"] = 1] = "NoParenthesizerRules";
      NodeFactoryFlags2[NodeFactoryFlags2["NoNodeConverters"] = 2] = "NoNodeConverters";
      NodeFactoryFlags2[NodeFactoryFlags2["NoIndentationOnFreshPropertyAccess"] = 4] = "NoIndentationOnFreshPropertyAccess";
      NodeFactoryFlags2[NodeFactoryFlags2["NoOriginalNode"] = 8] = "NoOriginalNode";
    })(NodeFactoryFlags = ts2.NodeFactoryFlags || (ts2.NodeFactoryFlags = {}));
    function createNodeFactory(flags, baseFactory2) {
      var update = flags & 8 ? updateWithoutOriginal : updateWithOriginal;
      var parenthesizerRules = ts2.memoize(function() {
        return flags & 1 ? ts2.nullParenthesizerRules : ts2.createParenthesizerRules(factory);
      });
      var converters = ts2.memoize(function() {
        return flags & 2 ? ts2.nullNodeConverters : ts2.createNodeConverters(factory);
      });
      var getBinaryCreateFunction = ts2.memoizeOne(function(operator) {
        return function(left, right) {
          return createBinaryExpression(left, operator, right);
        };
      });
      var getPrefixUnaryCreateFunction = ts2.memoizeOne(function(operator) {
        return function(operand) {
          return createPrefixUnaryExpression(operator, operand);
        };
      });
      var getPostfixUnaryCreateFunction = ts2.memoizeOne(function(operator) {
        return function(operand) {
          return createPostfixUnaryExpression(operand, operator);
        };
      });
      var getJSDocPrimaryTypeCreateFunction = ts2.memoizeOne(function(kind) {
        return function() {
          return createJSDocPrimaryTypeWorker(kind);
        };
      });
      var getJSDocUnaryTypeCreateFunction = ts2.memoizeOne(function(kind) {
        return function(type) {
          return createJSDocUnaryTypeWorker(kind, type);
        };
      });
      var getJSDocUnaryTypeUpdateFunction = ts2.memoizeOne(function(kind) {
        return function(node, type) {
          return updateJSDocUnaryTypeWorker(kind, node, type);
        };
      });
      var getJSDocSimpleTagCreateFunction = ts2.memoizeOne(function(kind) {
        return function(tagName, comment) {
          return createJSDocSimpleTagWorker(kind, tagName, comment);
        };
      });
      var getJSDocSimpleTagUpdateFunction = ts2.memoizeOne(function(kind) {
        return function(node, tagName, comment) {
          return updateJSDocSimpleTagWorker(kind, node, tagName, comment);
        };
      });
      var getJSDocTypeLikeTagCreateFunction = ts2.memoizeOne(function(kind) {
        return function(tagName, typeExpression, comment) {
          return createJSDocTypeLikeTagWorker(kind, tagName, typeExpression, comment);
        };
      });
      var getJSDocTypeLikeTagUpdateFunction = ts2.memoizeOne(function(kind) {
        return function(node, tagName, typeExpression, comment) {
          return updateJSDocTypeLikeTagWorker(kind, node, tagName, typeExpression, comment);
        };
      });
      var factory = {
        get parenthesizer() {
          return parenthesizerRules();
        },
        get converters() {
          return converters();
        },
        createNodeArray,
        createNumericLiteral,
        createBigIntLiteral,
        createStringLiteral,
        createStringLiteralFromNode,
        createRegularExpressionLiteral,
        createLiteralLikeNode,
        createIdentifier,
        updateIdentifier,
        createTempVariable,
        createLoopVariable,
        createUniqueName,
        getGeneratedNameForNode,
        createPrivateIdentifier,
        createToken,
        createSuper,
        createThis,
        createNull,
        createTrue,
        createFalse,
        createModifier,
        createModifiersFromModifierFlags,
        createQualifiedName,
        updateQualifiedName,
        createComputedPropertyName,
        updateComputedPropertyName,
        createTypeParameterDeclaration,
        updateTypeParameterDeclaration,
        createParameterDeclaration,
        updateParameterDeclaration,
        createDecorator,
        updateDecorator,
        createPropertySignature,
        updatePropertySignature,
        createPropertyDeclaration,
        updatePropertyDeclaration,
        createMethodSignature,
        updateMethodSignature,
        createMethodDeclaration,
        updateMethodDeclaration,
        createConstructorDeclaration,
        updateConstructorDeclaration,
        createGetAccessorDeclaration,
        updateGetAccessorDeclaration,
        createSetAccessorDeclaration,
        updateSetAccessorDeclaration,
        createCallSignature,
        updateCallSignature,
        createConstructSignature,
        updateConstructSignature,
        createIndexSignature,
        updateIndexSignature,
        createClassStaticBlockDeclaration,
        updateClassStaticBlockDeclaration,
        createTemplateLiteralTypeSpan,
        updateTemplateLiteralTypeSpan,
        createKeywordTypeNode,
        createTypePredicateNode,
        updateTypePredicateNode,
        createTypeReferenceNode,
        updateTypeReferenceNode,
        createFunctionTypeNode,
        updateFunctionTypeNode,
        createConstructorTypeNode,
        updateConstructorTypeNode,
        createTypeQueryNode,
        updateTypeQueryNode,
        createTypeLiteralNode,
        updateTypeLiteralNode,
        createArrayTypeNode,
        updateArrayTypeNode,
        createTupleTypeNode,
        updateTupleTypeNode,
        createNamedTupleMember,
        updateNamedTupleMember,
        createOptionalTypeNode,
        updateOptionalTypeNode,
        createRestTypeNode,
        updateRestTypeNode,
        createUnionTypeNode,
        updateUnionTypeNode,
        createIntersectionTypeNode,
        updateIntersectionTypeNode,
        createConditionalTypeNode,
        updateConditionalTypeNode,
        createInferTypeNode,
        updateInferTypeNode,
        createImportTypeNode,
        updateImportTypeNode,
        createParenthesizedType,
        updateParenthesizedType,
        createThisTypeNode,
        createTypeOperatorNode,
        updateTypeOperatorNode,
        createIndexedAccessTypeNode,
        updateIndexedAccessTypeNode,
        createMappedTypeNode,
        updateMappedTypeNode,
        createLiteralTypeNode,
        updateLiteralTypeNode,
        createTemplateLiteralType,
        updateTemplateLiteralType,
        createObjectBindingPattern,
        updateObjectBindingPattern,
        createArrayBindingPattern,
        updateArrayBindingPattern,
        createBindingElement,
        updateBindingElement,
        createArrayLiteralExpression,
        updateArrayLiteralExpression,
        createObjectLiteralExpression,
        updateObjectLiteralExpression,
        createPropertyAccessExpression: flags & 4 ? function(expression, name) {
          return ts2.setEmitFlags(createPropertyAccessExpression(expression, name), 131072);
        } : createPropertyAccessExpression,
        updatePropertyAccessExpression,
        createPropertyAccessChain: flags & 4 ? function(expression, questionDotToken, name) {
          return ts2.setEmitFlags(createPropertyAccessChain(expression, questionDotToken, name), 131072);
        } : createPropertyAccessChain,
        updatePropertyAccessChain,
        createElementAccessExpression,
        updateElementAccessExpression,
        createElementAccessChain,
        updateElementAccessChain,
        createCallExpression,
        updateCallExpression,
        createCallChain,
        updateCallChain,
        createNewExpression,
        updateNewExpression,
        createTaggedTemplateExpression,
        updateTaggedTemplateExpression,
        createTypeAssertion,
        updateTypeAssertion,
        createParenthesizedExpression,
        updateParenthesizedExpression,
        createFunctionExpression,
        updateFunctionExpression,
        createArrowFunction,
        updateArrowFunction,
        createDeleteExpression,
        updateDeleteExpression,
        createTypeOfExpression,
        updateTypeOfExpression,
        createVoidExpression,
        updateVoidExpression,
        createAwaitExpression,
        updateAwaitExpression,
        createPrefixUnaryExpression,
        updatePrefixUnaryExpression,
        createPostfixUnaryExpression,
        updatePostfixUnaryExpression,
        createBinaryExpression,
        updateBinaryExpression,
        createConditionalExpression,
        updateConditionalExpression,
        createTemplateExpression,
        updateTemplateExpression,
        createTemplateHead,
        createTemplateMiddle,
        createTemplateTail,
        createNoSubstitutionTemplateLiteral,
        createTemplateLiteralLikeNode,
        createYieldExpression,
        updateYieldExpression,
        createSpreadElement,
        updateSpreadElement,
        createClassExpression,
        updateClassExpression,
        createOmittedExpression,
        createExpressionWithTypeArguments,
        updateExpressionWithTypeArguments,
        createAsExpression,
        updateAsExpression,
        createNonNullExpression,
        updateNonNullExpression,
        createNonNullChain,
        updateNonNullChain,
        createMetaProperty,
        updateMetaProperty,
        createTemplateSpan,
        updateTemplateSpan,
        createSemicolonClassElement,
        createBlock,
        updateBlock,
        createVariableStatement,
        updateVariableStatement,
        createEmptyStatement,
        createExpressionStatement,
        updateExpressionStatement,
        createIfStatement,
        updateIfStatement,
        createDoStatement,
        updateDoStatement,
        createWhileStatement,
        updateWhileStatement,
        createForStatement,
        updateForStatement,
        createForInStatement,
        updateForInStatement,
        createForOfStatement,
        updateForOfStatement,
        createContinueStatement,
        updateContinueStatement,
        createBreakStatement,
        updateBreakStatement,
        createReturnStatement,
        updateReturnStatement,
        createWithStatement,
        updateWithStatement,
        createSwitchStatement,
        updateSwitchStatement,
        createLabeledStatement,
        updateLabeledStatement,
        createThrowStatement,
        updateThrowStatement,
        createTryStatement,
        updateTryStatement,
        createDebuggerStatement,
        createVariableDeclaration,
        updateVariableDeclaration,
        createVariableDeclarationList,
        updateVariableDeclarationList,
        createFunctionDeclaration,
        updateFunctionDeclaration,
        createClassDeclaration,
        updateClassDeclaration,
        createInterfaceDeclaration,
        updateInterfaceDeclaration,
        createTypeAliasDeclaration,
        updateTypeAliasDeclaration,
        createEnumDeclaration,
        updateEnumDeclaration,
        createModuleDeclaration,
        updateModuleDeclaration,
        createModuleBlock,
        updateModuleBlock,
        createCaseBlock,
        updateCaseBlock,
        createNamespaceExportDeclaration,
        updateNamespaceExportDeclaration,
        createImportEqualsDeclaration,
        updateImportEqualsDeclaration,
        createImportDeclaration,
        updateImportDeclaration,
        createImportClause,
        updateImportClause,
        createAssertClause,
        updateAssertClause,
        createAssertEntry,
        updateAssertEntry,
        createNamespaceImport,
        updateNamespaceImport,
        createNamespaceExport,
        updateNamespaceExport,
        createNamedImports,
        updateNamedImports,
        createImportSpecifier,
        updateImportSpecifier,
        createExportAssignment,
        updateExportAssignment,
        createExportDeclaration,
        updateExportDeclaration,
        createNamedExports,
        updateNamedExports,
        createExportSpecifier,
        updateExportSpecifier,
        createMissingDeclaration,
        createExternalModuleReference,
        updateExternalModuleReference,
        get createJSDocAllType() {
          return getJSDocPrimaryTypeCreateFunction(310);
        },
        get createJSDocUnknownType() {
          return getJSDocPrimaryTypeCreateFunction(311);
        },
        get createJSDocNonNullableType() {
          return getJSDocUnaryTypeCreateFunction(313);
        },
        get updateJSDocNonNullableType() {
          return getJSDocUnaryTypeUpdateFunction(313);
        },
        get createJSDocNullableType() {
          return getJSDocUnaryTypeCreateFunction(312);
        },
        get updateJSDocNullableType() {
          return getJSDocUnaryTypeUpdateFunction(312);
        },
        get createJSDocOptionalType() {
          return getJSDocUnaryTypeCreateFunction(314);
        },
        get updateJSDocOptionalType() {
          return getJSDocUnaryTypeUpdateFunction(314);
        },
        get createJSDocVariadicType() {
          return getJSDocUnaryTypeCreateFunction(316);
        },
        get updateJSDocVariadicType() {
          return getJSDocUnaryTypeUpdateFunction(316);
        },
        get createJSDocNamepathType() {
          return getJSDocUnaryTypeCreateFunction(317);
        },
        get updateJSDocNamepathType() {
          return getJSDocUnaryTypeUpdateFunction(317);
        },
        createJSDocFunctionType,
        updateJSDocFunctionType,
        createJSDocTypeLiteral,
        updateJSDocTypeLiteral,
        createJSDocTypeExpression,
        updateJSDocTypeExpression,
        createJSDocSignature,
        updateJSDocSignature,
        createJSDocTemplateTag,
        updateJSDocTemplateTag,
        createJSDocTypedefTag,
        updateJSDocTypedefTag,
        createJSDocParameterTag,
        updateJSDocParameterTag,
        createJSDocPropertyTag,
        updateJSDocPropertyTag,
        createJSDocCallbackTag,
        updateJSDocCallbackTag,
        createJSDocAugmentsTag,
        updateJSDocAugmentsTag,
        createJSDocImplementsTag,
        updateJSDocImplementsTag,
        createJSDocSeeTag,
        updateJSDocSeeTag,
        createJSDocNameReference,
        updateJSDocNameReference,
        createJSDocMemberName,
        updateJSDocMemberName,
        createJSDocLink,
        updateJSDocLink,
        createJSDocLinkCode,
        updateJSDocLinkCode,
        createJSDocLinkPlain,
        updateJSDocLinkPlain,
        get createJSDocTypeTag() {
          return getJSDocTypeLikeTagCreateFunction(341);
        },
        get updateJSDocTypeTag() {
          return getJSDocTypeLikeTagUpdateFunction(341);
        },
        get createJSDocReturnTag() {
          return getJSDocTypeLikeTagCreateFunction(339);
        },
        get updateJSDocReturnTag() {
          return getJSDocTypeLikeTagUpdateFunction(339);
        },
        get createJSDocThisTag() {
          return getJSDocTypeLikeTagCreateFunction(340);
        },
        get updateJSDocThisTag() {
          return getJSDocTypeLikeTagUpdateFunction(340);
        },
        get createJSDocEnumTag() {
          return getJSDocTypeLikeTagCreateFunction(337);
        },
        get updateJSDocEnumTag() {
          return getJSDocTypeLikeTagUpdateFunction(337);
        },
        get createJSDocAuthorTag() {
          return getJSDocSimpleTagCreateFunction(328);
        },
        get updateJSDocAuthorTag() {
          return getJSDocSimpleTagUpdateFunction(328);
        },
        get createJSDocClassTag() {
          return getJSDocSimpleTagCreateFunction(330);
        },
        get updateJSDocClassTag() {
          return getJSDocSimpleTagUpdateFunction(330);
        },
        get createJSDocPublicTag() {
          return getJSDocSimpleTagCreateFunction(331);
        },
        get updateJSDocPublicTag() {
          return getJSDocSimpleTagUpdateFunction(331);
        },
        get createJSDocPrivateTag() {
          return getJSDocSimpleTagCreateFunction(332);
        },
        get updateJSDocPrivateTag() {
          return getJSDocSimpleTagUpdateFunction(332);
        },
        get createJSDocProtectedTag() {
          return getJSDocSimpleTagCreateFunction(333);
        },
        get updateJSDocProtectedTag() {
          return getJSDocSimpleTagUpdateFunction(333);
        },
        get createJSDocReadonlyTag() {
          return getJSDocSimpleTagCreateFunction(334);
        },
        get updateJSDocReadonlyTag() {
          return getJSDocSimpleTagUpdateFunction(334);
        },
        get createJSDocOverrideTag() {
          return getJSDocSimpleTagCreateFunction(335);
        },
        get updateJSDocOverrideTag() {
          return getJSDocSimpleTagUpdateFunction(335);
        },
        get createJSDocDeprecatedTag() {
          return getJSDocSimpleTagCreateFunction(329);
        },
        get updateJSDocDeprecatedTag() {
          return getJSDocSimpleTagUpdateFunction(329);
        },
        createJSDocUnknownTag,
        updateJSDocUnknownTag,
        createJSDocText,
        updateJSDocText,
        createJSDocComment,
        updateJSDocComment,
        createJsxElement,
        updateJsxElement,
        createJsxSelfClosingElement,
        updateJsxSelfClosingElement,
        createJsxOpeningElement,
        updateJsxOpeningElement,
        createJsxClosingElement,
        updateJsxClosingElement,
        createJsxFragment,
        createJsxText,
        updateJsxText,
        createJsxOpeningFragment,
        createJsxJsxClosingFragment,
        updateJsxFragment,
        createJsxAttribute,
        updateJsxAttribute,
        createJsxAttributes,
        updateJsxAttributes,
        createJsxSpreadAttribute,
        updateJsxSpreadAttribute,
        createJsxExpression,
        updateJsxExpression,
        createCaseClause,
        updateCaseClause,
        createDefaultClause,
        updateDefaultClause,
        createHeritageClause,
        updateHeritageClause,
        createCatchClause,
        updateCatchClause,
        createPropertyAssignment,
        updatePropertyAssignment,
        createShorthandPropertyAssignment,
        updateShorthandPropertyAssignment,
        createSpreadAssignment,
        updateSpreadAssignment,
        createEnumMember,
        updateEnumMember,
        createSourceFile,
        updateSourceFile,
        createBundle,
        updateBundle,
        createUnparsedSource,
        createUnparsedPrologue,
        createUnparsedPrepend,
        createUnparsedTextLike,
        createUnparsedSyntheticReference,
        createInputFiles: createInputFiles2,
        createSyntheticExpression,
        createSyntaxList,
        createNotEmittedStatement,
        createPartiallyEmittedExpression,
        updatePartiallyEmittedExpression,
        createCommaListExpression,
        updateCommaListExpression,
        createEndOfDeclarationMarker,
        createMergeDeclarationMarker,
        createSyntheticReferenceExpression,
        updateSyntheticReferenceExpression,
        cloneNode,
        get createComma() {
          return getBinaryCreateFunction(27);
        },
        get createAssignment() {
          return getBinaryCreateFunction(63);
        },
        get createLogicalOr() {
          return getBinaryCreateFunction(56);
        },
        get createLogicalAnd() {
          return getBinaryCreateFunction(55);
        },
        get createBitwiseOr() {
          return getBinaryCreateFunction(51);
        },
        get createBitwiseXor() {
          return getBinaryCreateFunction(52);
        },
        get createBitwiseAnd() {
          return getBinaryCreateFunction(50);
        },
        get createStrictEquality() {
          return getBinaryCreateFunction(36);
        },
        get createStrictInequality() {
          return getBinaryCreateFunction(37);
        },
        get createEquality() {
          return getBinaryCreateFunction(34);
        },
        get createInequality() {
          return getBinaryCreateFunction(35);
        },
        get createLessThan() {
          return getBinaryCreateFunction(29);
        },
        get createLessThanEquals() {
          return getBinaryCreateFunction(32);
        },
        get createGreaterThan() {
          return getBinaryCreateFunction(31);
        },
        get createGreaterThanEquals() {
          return getBinaryCreateFunction(33);
        },
        get createLeftShift() {
          return getBinaryCreateFunction(47);
        },
        get createRightShift() {
          return getBinaryCreateFunction(48);
        },
        get createUnsignedRightShift() {
          return getBinaryCreateFunction(49);
        },
        get createAdd() {
          return getBinaryCreateFunction(39);
        },
        get createSubtract() {
          return getBinaryCreateFunction(40);
        },
        get createMultiply() {
          return getBinaryCreateFunction(41);
        },
        get createDivide() {
          return getBinaryCreateFunction(43);
        },
        get createModulo() {
          return getBinaryCreateFunction(44);
        },
        get createExponent() {
          return getBinaryCreateFunction(42);
        },
        get createPrefixPlus() {
          return getPrefixUnaryCreateFunction(39);
        },
        get createPrefixMinus() {
          return getPrefixUnaryCreateFunction(40);
        },
        get createPrefixIncrement() {
          return getPrefixUnaryCreateFunction(45);
        },
        get createPrefixDecrement() {
          return getPrefixUnaryCreateFunction(46);
        },
        get createBitwiseNot() {
          return getPrefixUnaryCreateFunction(54);
        },
        get createLogicalNot() {
          return getPrefixUnaryCreateFunction(53);
        },
        get createPostfixIncrement() {
          return getPostfixUnaryCreateFunction(45);
        },
        get createPostfixDecrement() {
          return getPostfixUnaryCreateFunction(46);
        },
        createImmediatelyInvokedFunctionExpression,
        createImmediatelyInvokedArrowFunction,
        createVoidZero,
        createExportDefault,
        createExternalModuleExport,
        createTypeCheck,
        createMethodCall,
        createGlobalMethodCall,
        createFunctionBindCall,
        createFunctionCallCall,
        createFunctionApplyCall,
        createArraySliceCall,
        createArrayConcatCall,
        createObjectDefinePropertyCall,
        createReflectGetCall,
        createReflectSetCall,
        createPropertyDescriptor,
        createCallBinding,
        createAssignmentTargetWrapper,
        inlineExpressions,
        getInternalName,
        getLocalName,
        getExportName,
        getDeclarationName,
        getNamespaceMemberName,
        getExternalModuleOrNamespaceExportName,
        restoreOuterExpressions,
        restoreEnclosingLabel,
        createUseStrictPrologue,
        copyPrologue,
        copyStandardPrologue,
        copyCustomPrologue,
        ensureUseStrict,
        liftToBlock,
        mergeLexicalEnvironment,
        updateModifiers
      };
      return factory;
      function createNodeArray(elements, hasTrailingComma) {
        if (elements === void 0 || elements === ts2.emptyArray) {
          elements = [];
        } else if (ts2.isNodeArray(elements)) {
          if (hasTrailingComma === void 0 || elements.hasTrailingComma === hasTrailingComma) {
            if (elements.transformFlags === void 0) {
              aggregateChildrenFlags(elements);
            }
            ts2.Debug.attachNodeArrayDebugInfo(elements);
            return elements;
          }
          var array_8 = elements.slice();
          array_8.pos = elements.pos;
          array_8.end = elements.end;
          array_8.hasTrailingComma = hasTrailingComma;
          array_8.transformFlags = elements.transformFlags;
          ts2.Debug.attachNodeArrayDebugInfo(array_8);
          return array_8;
        }
        var length = elements.length;
        var array = length >= 1 && length <= 4 ? elements.slice() : elements;
        ts2.setTextRangePosEnd(array, -1, -1);
        array.hasTrailingComma = !!hasTrailingComma;
        aggregateChildrenFlags(array);
        ts2.Debug.attachNodeArrayDebugInfo(array);
        return array;
      }
      function createBaseNode(kind) {
        return baseFactory2.createBaseNode(kind);
      }
      function createBaseDeclaration(kind, decorators, modifiers) {
        var node = createBaseNode(kind);
        node.decorators = asNodeArray(decorators);
        node.modifiers = asNodeArray(modifiers);
        node.transformFlags |= propagateChildrenFlags(node.decorators) | propagateChildrenFlags(node.modifiers);
        node.symbol = void 0;
        node.localSymbol = void 0;
        node.locals = void 0;
        node.nextContainer = void 0;
        return node;
      }
      function createBaseNamedDeclaration(kind, decorators, modifiers, name) {
        var node = createBaseDeclaration(kind, decorators, modifiers);
        name = asName(name);
        node.name = name;
        if (name) {
          switch (node.kind) {
            case 168:
            case 171:
            case 172:
            case 166:
            case 294:
              if (ts2.isIdentifier(name)) {
                node.transformFlags |= propagateIdentifierNameFlags(name);
                break;
              }
            default:
              node.transformFlags |= propagateChildFlags(name);
              break;
          }
        }
        return node;
      }
      function createBaseGenericNamedDeclaration(kind, decorators, modifiers, name, typeParameters) {
        var node = createBaseNamedDeclaration(kind, decorators, modifiers, name);
        node.typeParameters = asNodeArray(typeParameters);
        node.transformFlags |= propagateChildrenFlags(node.typeParameters);
        if (typeParameters)
          node.transformFlags |= 1;
        return node;
      }
      function createBaseSignatureDeclaration(kind, decorators, modifiers, name, typeParameters, parameters, type) {
        var node = createBaseGenericNamedDeclaration(kind, decorators, modifiers, name, typeParameters);
        node.parameters = createNodeArray(parameters);
        node.type = type;
        node.transformFlags |= propagateChildrenFlags(node.parameters) | propagateChildFlags(node.type);
        if (type)
          node.transformFlags |= 1;
        return node;
      }
      function updateBaseSignatureDeclaration(updated, original) {
        if (original.typeArguments)
          updated.typeArguments = original.typeArguments;
        return update(updated, original);
      }
      function createBaseFunctionLikeDeclaration(kind, decorators, modifiers, name, typeParameters, parameters, type, body) {
        var node = createBaseSignatureDeclaration(kind, decorators, modifiers, name, typeParameters, parameters, type);
        node.body = body;
        node.transformFlags |= propagateChildFlags(node.body) & ~16777216;
        if (!body)
          node.transformFlags |= 1;
        return node;
      }
      function updateBaseFunctionLikeDeclaration(updated, original) {
        if (original.exclamationToken)
          updated.exclamationToken = original.exclamationToken;
        if (original.typeArguments)
          updated.typeArguments = original.typeArguments;
        return updateBaseSignatureDeclaration(updated, original);
      }
      function createBaseInterfaceOrClassLikeDeclaration(kind, decorators, modifiers, name, typeParameters, heritageClauses) {
        var node = createBaseGenericNamedDeclaration(kind, decorators, modifiers, name, typeParameters);
        node.heritageClauses = asNodeArray(heritageClauses);
        node.transformFlags |= propagateChildrenFlags(node.heritageClauses);
        return node;
      }
      function createBaseClassLikeDeclaration(kind, decorators, modifiers, name, typeParameters, heritageClauses, members) {
        var node = createBaseInterfaceOrClassLikeDeclaration(kind, decorators, modifiers, name, typeParameters, heritageClauses);
        node.members = createNodeArray(members);
        node.transformFlags |= propagateChildrenFlags(node.members);
        return node;
      }
      function createBaseBindingLikeDeclaration(kind, decorators, modifiers, name, initializer) {
        var node = createBaseNamedDeclaration(kind, decorators, modifiers, name);
        node.initializer = initializer;
        node.transformFlags |= propagateChildFlags(node.initializer);
        return node;
      }
      function createBaseVariableLikeDeclaration(kind, decorators, modifiers, name, type, initializer) {
        var node = createBaseBindingLikeDeclaration(kind, decorators, modifiers, name, initializer);
        node.type = type;
        node.transformFlags |= propagateChildFlags(type);
        if (type)
          node.transformFlags |= 1;
        return node;
      }
      function createBaseLiteral(kind, text) {
        var node = createBaseToken(kind);
        node.text = text;
        return node;
      }
      function createNumericLiteral(value, numericLiteralFlags) {
        if (numericLiteralFlags === void 0) {
          numericLiteralFlags = 0;
        }
        var node = createBaseLiteral(8, typeof value === "number" ? value + "" : value);
        node.numericLiteralFlags = numericLiteralFlags;
        if (numericLiteralFlags & 384)
          node.transformFlags |= 512;
        return node;
      }
      function createBigIntLiteral(value) {
        var node = createBaseLiteral(9, typeof value === "string" ? value : ts2.pseudoBigIntToString(value) + "n");
        node.transformFlags |= 4;
        return node;
      }
      function createBaseStringLiteral(text, isSingleQuote) {
        var node = createBaseLiteral(10, text);
        node.singleQuote = isSingleQuote;
        return node;
      }
      function createStringLiteral(text, isSingleQuote, hasExtendedUnicodeEscape) {
        var node = createBaseStringLiteral(text, isSingleQuote);
        node.hasExtendedUnicodeEscape = hasExtendedUnicodeEscape;
        if (hasExtendedUnicodeEscape)
          node.transformFlags |= 512;
        return node;
      }
      function createStringLiteralFromNode(sourceNode) {
        var node = createBaseStringLiteral(ts2.getTextOfIdentifierOrLiteral(sourceNode), void 0);
        node.textSourceNode = sourceNode;
        return node;
      }
      function createRegularExpressionLiteral(text) {
        var node = createBaseLiteral(13, text);
        return node;
      }
      function createLiteralLikeNode(kind, text) {
        switch (kind) {
          case 8:
            return createNumericLiteral(text, 0);
          case 9:
            return createBigIntLiteral(text);
          case 10:
            return createStringLiteral(text, void 0);
          case 11:
            return createJsxText(text, false);
          case 12:
            return createJsxText(text, true);
          case 13:
            return createRegularExpressionLiteral(text);
          case 14:
            return createTemplateLiteralLikeNode(kind, text, void 0, 0);
        }
      }
      function createBaseIdentifier(text, originalKeywordKind) {
        if (originalKeywordKind === void 0 && text) {
          originalKeywordKind = ts2.stringToToken(text);
        }
        if (originalKeywordKind === 79) {
          originalKeywordKind = void 0;
        }
        var node = baseFactory2.createBaseIdentifierNode(79);
        node.originalKeywordKind = originalKeywordKind;
        node.escapedText = ts2.escapeLeadingUnderscores(text);
        return node;
      }
      function createBaseGeneratedIdentifier(text, autoGenerateFlags) {
        var node = createBaseIdentifier(text, void 0);
        node.autoGenerateFlags = autoGenerateFlags;
        node.autoGenerateId = nextAutoGenerateId;
        nextAutoGenerateId++;
        return node;
      }
      function createIdentifier(text, typeArguments, originalKeywordKind) {
        var node = createBaseIdentifier(text, originalKeywordKind);
        if (typeArguments) {
          node.typeArguments = createNodeArray(typeArguments);
        }
        if (node.originalKeywordKind === 132) {
          node.transformFlags |= 16777216;
        }
        return node;
      }
      function updateIdentifier(node, typeArguments) {
        return node.typeArguments !== typeArguments ? update(createIdentifier(ts2.idText(node), typeArguments), node) : node;
      }
      function createTempVariable(recordTempVariable, reservedInNestedScopes) {
        var flags2 = 1;
        if (reservedInNestedScopes)
          flags2 |= 8;
        var name = createBaseGeneratedIdentifier("", flags2);
        if (recordTempVariable) {
          recordTempVariable(name);
        }
        return name;
      }
      function createLoopVariable(reservedInNestedScopes) {
        var flags2 = 2;
        if (reservedInNestedScopes)
          flags2 |= 8;
        return createBaseGeneratedIdentifier("", flags2);
      }
      function createUniqueName(text, flags2) {
        if (flags2 === void 0) {
          flags2 = 0;
        }
        ts2.Debug.assert(!(flags2 & 7), "Argument out of range: flags");
        ts2.Debug.assert((flags2 & (16 | 32)) !== 32, "GeneratedIdentifierFlags.FileLevel cannot be set without also setting GeneratedIdentifierFlags.Optimistic");
        return createBaseGeneratedIdentifier(text, 3 | flags2);
      }
      function getGeneratedNameForNode(node, flags2) {
        if (flags2 === void 0) {
          flags2 = 0;
        }
        ts2.Debug.assert(!(flags2 & 7), "Argument out of range: flags");
        var name = createBaseGeneratedIdentifier(node && ts2.isIdentifier(node) ? ts2.idText(node) : "", 4 | flags2);
        name.original = node;
        return name;
      }
      function createPrivateIdentifier(text) {
        if (!ts2.startsWith(text, "#"))
          ts2.Debug.fail("First character of private identifier must be #: " + text);
        var node = baseFactory2.createBasePrivateIdentifierNode(80);
        node.escapedText = ts2.escapeLeadingUnderscores(text);
        node.transformFlags |= 8388608;
        return node;
      }
      function createBaseToken(kind) {
        return baseFactory2.createBaseTokenNode(kind);
      }
      function createToken(token) {
        ts2.Debug.assert(token >= 0 && token <= 159, "Invalid token");
        ts2.Debug.assert(token <= 14 || token >= 17, "Invalid token. Use 'createTemplateLiteralLikeNode' to create template literals.");
        ts2.Debug.assert(token <= 8 || token >= 14, "Invalid token. Use 'createLiteralLikeNode' to create literals.");
        ts2.Debug.assert(token !== 79, "Invalid token. Use 'createIdentifier' to create identifiers");
        var node = createBaseToken(token);
        var transformFlags = 0;
        switch (token) {
          case 131:
            transformFlags = 128 | 64;
            break;
          case 123:
          case 121:
          case 122:
          case 144:
          case 126:
          case 135:
          case 85:
          case 130:
          case 146:
          case 157:
          case 143:
          case 147:
          case 158:
          case 149:
          case 133:
          case 150:
          case 114:
          case 154:
          case 152:
            transformFlags = 1;
            break;
          case 106:
            transformFlags = 512 | 33554432;
            break;
          case 124:
            transformFlags = 512;
            break;
          case 108:
            transformFlags = 8192;
            break;
        }
        if (transformFlags) {
          node.transformFlags |= transformFlags;
        }
        return node;
      }
      function createSuper() {
        return createToken(106);
      }
      function createThis() {
        return createToken(108);
      }
      function createNull() {
        return createToken(104);
      }
      function createTrue() {
        return createToken(110);
      }
      function createFalse() {
        return createToken(95);
      }
      function createModifier(kind) {
        return createToken(kind);
      }
      function createModifiersFromModifierFlags(flags2) {
        var result = [];
        if (flags2 & 1)
          result.push(createModifier(93));
        if (flags2 & 2)
          result.push(createModifier(135));
        if (flags2 & 512)
          result.push(createModifier(88));
        if (flags2 & 2048)
          result.push(createModifier(85));
        if (flags2 & 4)
          result.push(createModifier(123));
        if (flags2 & 8)
          result.push(createModifier(121));
        if (flags2 & 16)
          result.push(createModifier(122));
        if (flags2 & 128)
          result.push(createModifier(126));
        if (flags2 & 32)
          result.push(createModifier(124));
        if (flags2 & 16384)
          result.push(createModifier(158));
        if (flags2 & 64)
          result.push(createModifier(144));
        if (flags2 & 256)
          result.push(createModifier(131));
        return result;
      }
      function createQualifiedName(left, right) {
        var node = createBaseNode(160);
        node.left = left;
        node.right = asName(right);
        node.transformFlags |= propagateChildFlags(node.left) | propagateIdentifierNameFlags(node.right);
        return node;
      }
      function updateQualifiedName(node, left, right) {
        return node.left !== left || node.right !== right ? update(createQualifiedName(left, right), node) : node;
      }
      function createComputedPropertyName(expression) {
        var node = createBaseNode(161);
        node.expression = parenthesizerRules().parenthesizeExpressionOfComputedPropertyName(expression);
        node.transformFlags |= propagateChildFlags(node.expression) | 512 | 65536;
        return node;
      }
      function updateComputedPropertyName(node, expression) {
        return node.expression !== expression ? update(createComputedPropertyName(expression), node) : node;
      }
      function createTypeParameterDeclaration(name, constraint, defaultType) {
        var node = createBaseNamedDeclaration(162, void 0, void 0, name);
        node.constraint = constraint;
        node.default = defaultType;
        node.transformFlags = 1;
        return node;
      }
      function updateTypeParameterDeclaration(node, name, constraint, defaultType) {
        return node.name !== name || node.constraint !== constraint || node.default !== defaultType ? update(createTypeParameterDeclaration(name, constraint, defaultType), node) : node;
      }
      function createParameterDeclaration(decorators, modifiers, dotDotDotToken, name, questionToken, type, initializer) {
        var node = createBaseVariableLikeDeclaration(163, decorators, modifiers, name, type, initializer && parenthesizerRules().parenthesizeExpressionForDisallowedComma(initializer));
        node.dotDotDotToken = dotDotDotToken;
        node.questionToken = questionToken;
        if (ts2.isThisIdentifier(node.name)) {
          node.transformFlags = 1;
        } else {
          node.transformFlags |= propagateChildFlags(node.dotDotDotToken) | propagateChildFlags(node.questionToken);
          if (questionToken)
            node.transformFlags |= 1;
          if (ts2.modifiersToFlags(node.modifiers) & 16476)
            node.transformFlags |= 4096;
          if (initializer || dotDotDotToken)
            node.transformFlags |= 512;
        }
        return node;
      }
      function updateParameterDeclaration(node, decorators, modifiers, dotDotDotToken, name, questionToken, type, initializer) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.dotDotDotToken !== dotDotDotToken || node.name !== name || node.questionToken !== questionToken || node.type !== type || node.initializer !== initializer ? update(createParameterDeclaration(decorators, modifiers, dotDotDotToken, name, questionToken, type, initializer), node) : node;
      }
      function createDecorator(expression) {
        var node = createBaseNode(164);
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.transformFlags |= propagateChildFlags(node.expression) | 1 | 4096;
        return node;
      }
      function updateDecorator(node, expression) {
        return node.expression !== expression ? update(createDecorator(expression), node) : node;
      }
      function createPropertySignature(modifiers, name, questionToken, type) {
        var node = createBaseNamedDeclaration(165, void 0, modifiers, name);
        node.type = type;
        node.questionToken = questionToken;
        node.transformFlags = 1;
        return node;
      }
      function updatePropertySignature(node, modifiers, name, questionToken, type) {
        return node.modifiers !== modifiers || node.name !== name || node.questionToken !== questionToken || node.type !== type ? update(createPropertySignature(modifiers, name, questionToken, type), node) : node;
      }
      function createPropertyDeclaration(decorators, modifiers, name, questionOrExclamationToken, type, initializer) {
        var node = createBaseVariableLikeDeclaration(166, decorators, modifiers, name, type, initializer);
        node.questionToken = questionOrExclamationToken && ts2.isQuestionToken(questionOrExclamationToken) ? questionOrExclamationToken : void 0;
        node.exclamationToken = questionOrExclamationToken && ts2.isExclamationToken(questionOrExclamationToken) ? questionOrExclamationToken : void 0;
        node.transformFlags |= propagateChildFlags(node.questionToken) | propagateChildFlags(node.exclamationToken) | 8388608;
        if (ts2.isComputedPropertyName(node.name) || ts2.hasStaticModifier(node) && node.initializer) {
          node.transformFlags |= 4096;
        }
        if (questionOrExclamationToken || ts2.modifiersToFlags(node.modifiers) & 2) {
          node.transformFlags |= 1;
        }
        return node;
      }
      function updatePropertyDeclaration(node, decorators, modifiers, name, questionOrExclamationToken, type, initializer) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.questionToken !== (questionOrExclamationToken !== void 0 && ts2.isQuestionToken(questionOrExclamationToken) ? questionOrExclamationToken : void 0) || node.exclamationToken !== (questionOrExclamationToken !== void 0 && ts2.isExclamationToken(questionOrExclamationToken) ? questionOrExclamationToken : void 0) || node.type !== type || node.initializer !== initializer ? update(createPropertyDeclaration(decorators, modifiers, name, questionOrExclamationToken, type, initializer), node) : node;
      }
      function createMethodSignature(modifiers, name, questionToken, typeParameters, parameters, type) {
        var node = createBaseSignatureDeclaration(167, void 0, modifiers, name, typeParameters, parameters, type);
        node.questionToken = questionToken;
        node.transformFlags = 1;
        return node;
      }
      function updateMethodSignature(node, modifiers, name, questionToken, typeParameters, parameters, type) {
        return node.modifiers !== modifiers || node.name !== name || node.questionToken !== questionToken || node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type ? updateBaseSignatureDeclaration(createMethodSignature(modifiers, name, questionToken, typeParameters, parameters, type), node) : node;
      }
      function createMethodDeclaration(decorators, modifiers, asteriskToken, name, questionToken, typeParameters, parameters, type, body) {
        var node = createBaseFunctionLikeDeclaration(168, decorators, modifiers, name, typeParameters, parameters, type, body);
        node.asteriskToken = asteriskToken;
        node.questionToken = questionToken;
        node.transformFlags |= propagateChildFlags(node.asteriskToken) | propagateChildFlags(node.questionToken) | 512;
        if (questionToken) {
          node.transformFlags |= 1;
        }
        if (ts2.modifiersToFlags(node.modifiers) & 256) {
          if (asteriskToken) {
            node.transformFlags |= 64;
          } else {
            node.transformFlags |= 128;
          }
        } else if (asteriskToken) {
          node.transformFlags |= 1024;
        }
        return node;
      }
      function updateMethodDeclaration(node, decorators, modifiers, asteriskToken, name, questionToken, typeParameters, parameters, type, body) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.asteriskToken !== asteriskToken || node.name !== name || node.questionToken !== questionToken || node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type || node.body !== body ? updateBaseFunctionLikeDeclaration(createMethodDeclaration(decorators, modifiers, asteriskToken, name, questionToken, typeParameters, parameters, type, body), node) : node;
      }
      function createClassStaticBlockDeclaration(decorators, modifiers, body) {
        var node = createBaseGenericNamedDeclaration(169, decorators, modifiers, void 0, void 0);
        node.body = body;
        node.transformFlags = propagateChildFlags(body) | 8388608;
        return node;
      }
      function updateClassStaticBlockDeclaration(node, decorators, modifiers, body) {
        return node.decorators !== decorators || node.modifier !== modifiers || node.body !== body ? update(createClassStaticBlockDeclaration(decorators, modifiers, body), node) : node;
      }
      function createConstructorDeclaration(decorators, modifiers, parameters, body) {
        var node = createBaseFunctionLikeDeclaration(170, decorators, modifiers, void 0, void 0, parameters, void 0, body);
        node.transformFlags |= 512;
        return node;
      }
      function updateConstructorDeclaration(node, decorators, modifiers, parameters, body) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.parameters !== parameters || node.body !== body ? updateBaseFunctionLikeDeclaration(createConstructorDeclaration(decorators, modifiers, parameters, body), node) : node;
      }
      function createGetAccessorDeclaration(decorators, modifiers, name, parameters, type, body) {
        return createBaseFunctionLikeDeclaration(171, decorators, modifiers, name, void 0, parameters, type, body);
      }
      function updateGetAccessorDeclaration(node, decorators, modifiers, name, parameters, type, body) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.parameters !== parameters || node.type !== type || node.body !== body ? updateBaseFunctionLikeDeclaration(createGetAccessorDeclaration(decorators, modifiers, name, parameters, type, body), node) : node;
      }
      function createSetAccessorDeclaration(decorators, modifiers, name, parameters, body) {
        return createBaseFunctionLikeDeclaration(172, decorators, modifiers, name, void 0, parameters, void 0, body);
      }
      function updateSetAccessorDeclaration(node, decorators, modifiers, name, parameters, body) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.parameters !== parameters || node.body !== body ? updateBaseFunctionLikeDeclaration(createSetAccessorDeclaration(decorators, modifiers, name, parameters, body), node) : node;
      }
      function createCallSignature(typeParameters, parameters, type) {
        var node = createBaseSignatureDeclaration(173, void 0, void 0, void 0, typeParameters, parameters, type);
        node.transformFlags = 1;
        return node;
      }
      function updateCallSignature(node, typeParameters, parameters, type) {
        return node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type ? updateBaseSignatureDeclaration(createCallSignature(typeParameters, parameters, type), node) : node;
      }
      function createConstructSignature(typeParameters, parameters, type) {
        var node = createBaseSignatureDeclaration(174, void 0, void 0, void 0, typeParameters, parameters, type);
        node.transformFlags = 1;
        return node;
      }
      function updateConstructSignature(node, typeParameters, parameters, type) {
        return node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type ? updateBaseSignatureDeclaration(createConstructSignature(typeParameters, parameters, type), node) : node;
      }
      function createIndexSignature(decorators, modifiers, parameters, type) {
        var node = createBaseSignatureDeclaration(175, decorators, modifiers, void 0, void 0, parameters, type);
        node.transformFlags = 1;
        return node;
      }
      function updateIndexSignature(node, decorators, modifiers, parameters, type) {
        return node.parameters !== parameters || node.type !== type || node.decorators !== decorators || node.modifiers !== modifiers ? updateBaseSignatureDeclaration(createIndexSignature(decorators, modifiers, parameters, type), node) : node;
      }
      function createTemplateLiteralTypeSpan(type, literal) {
        var node = createBaseNode(198);
        node.type = type;
        node.literal = literal;
        node.transformFlags = 1;
        return node;
      }
      function updateTemplateLiteralTypeSpan(node, type, literal) {
        return node.type !== type || node.literal !== literal ? update(createTemplateLiteralTypeSpan(type, literal), node) : node;
      }
      function createKeywordTypeNode(kind) {
        return createToken(kind);
      }
      function createTypePredicateNode(assertsModifier, parameterName, type) {
        var node = createBaseNode(176);
        node.assertsModifier = assertsModifier;
        node.parameterName = asName(parameterName);
        node.type = type;
        node.transformFlags = 1;
        return node;
      }
      function updateTypePredicateNode(node, assertsModifier, parameterName, type) {
        return node.assertsModifier !== assertsModifier || node.parameterName !== parameterName || node.type !== type ? update(createTypePredicateNode(assertsModifier, parameterName, type), node) : node;
      }
      function createTypeReferenceNode(typeName, typeArguments) {
        var node = createBaseNode(177);
        node.typeName = asName(typeName);
        node.typeArguments = typeArguments && parenthesizerRules().parenthesizeTypeArguments(createNodeArray(typeArguments));
        node.transformFlags = 1;
        return node;
      }
      function updateTypeReferenceNode(node, typeName, typeArguments) {
        return node.typeName !== typeName || node.typeArguments !== typeArguments ? update(createTypeReferenceNode(typeName, typeArguments), node) : node;
      }
      function createFunctionTypeNode(typeParameters, parameters, type) {
        var node = createBaseSignatureDeclaration(178, void 0, void 0, void 0, typeParameters, parameters, type);
        node.transformFlags = 1;
        return node;
      }
      function updateFunctionTypeNode(node, typeParameters, parameters, type) {
        return node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type ? updateBaseSignatureDeclaration(createFunctionTypeNode(typeParameters, parameters, type), node) : node;
      }
      function createConstructorTypeNode() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i];
        }
        return args.length === 4 ? createConstructorTypeNode1.apply(void 0, args) : args.length === 3 ? createConstructorTypeNode2.apply(void 0, args) : ts2.Debug.fail("Incorrect number of arguments specified.");
      }
      function createConstructorTypeNode1(modifiers, typeParameters, parameters, type) {
        var node = createBaseSignatureDeclaration(179, void 0, modifiers, void 0, typeParameters, parameters, type);
        node.transformFlags = 1;
        return node;
      }
      function createConstructorTypeNode2(typeParameters, parameters, type) {
        return createConstructorTypeNode1(void 0, typeParameters, parameters, type);
      }
      function updateConstructorTypeNode() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i];
        }
        return args.length === 5 ? updateConstructorTypeNode1.apply(void 0, args) : args.length === 4 ? updateConstructorTypeNode2.apply(void 0, args) : ts2.Debug.fail("Incorrect number of arguments specified.");
      }
      function updateConstructorTypeNode1(node, modifiers, typeParameters, parameters, type) {
        return node.modifiers !== modifiers || node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type ? updateBaseSignatureDeclaration(createConstructorTypeNode(modifiers, typeParameters, parameters, type), node) : node;
      }
      function updateConstructorTypeNode2(node, typeParameters, parameters, type) {
        return updateConstructorTypeNode1(node, node.modifiers, typeParameters, parameters, type);
      }
      function createTypeQueryNode(exprName) {
        var node = createBaseNode(180);
        node.exprName = exprName;
        node.transformFlags = 1;
        return node;
      }
      function updateTypeQueryNode(node, exprName) {
        return node.exprName !== exprName ? update(createTypeQueryNode(exprName), node) : node;
      }
      function createTypeLiteralNode(members) {
        var node = createBaseNode(181);
        node.members = createNodeArray(members);
        node.transformFlags = 1;
        return node;
      }
      function updateTypeLiteralNode(node, members) {
        return node.members !== members ? update(createTypeLiteralNode(members), node) : node;
      }
      function createArrayTypeNode(elementType) {
        var node = createBaseNode(182);
        node.elementType = parenthesizerRules().parenthesizeElementTypeOfArrayType(elementType);
        node.transformFlags = 1;
        return node;
      }
      function updateArrayTypeNode(node, elementType) {
        return node.elementType !== elementType ? update(createArrayTypeNode(elementType), node) : node;
      }
      function createTupleTypeNode(elements) {
        var node = createBaseNode(183);
        node.elements = createNodeArray(elements);
        node.transformFlags = 1;
        return node;
      }
      function updateTupleTypeNode(node, elements) {
        return node.elements !== elements ? update(createTupleTypeNode(elements), node) : node;
      }
      function createNamedTupleMember(dotDotDotToken, name, questionToken, type) {
        var node = createBaseNode(196);
        node.dotDotDotToken = dotDotDotToken;
        node.name = name;
        node.questionToken = questionToken;
        node.type = type;
        node.transformFlags = 1;
        return node;
      }
      function updateNamedTupleMember(node, dotDotDotToken, name, questionToken, type) {
        return node.dotDotDotToken !== dotDotDotToken || node.name !== name || node.questionToken !== questionToken || node.type !== type ? update(createNamedTupleMember(dotDotDotToken, name, questionToken, type), node) : node;
      }
      function createOptionalTypeNode(type) {
        var node = createBaseNode(184);
        node.type = parenthesizerRules().parenthesizeElementTypeOfArrayType(type);
        node.transformFlags = 1;
        return node;
      }
      function updateOptionalTypeNode(node, type) {
        return node.type !== type ? update(createOptionalTypeNode(type), node) : node;
      }
      function createRestTypeNode(type) {
        var node = createBaseNode(185);
        node.type = type;
        node.transformFlags = 1;
        return node;
      }
      function updateRestTypeNode(node, type) {
        return node.type !== type ? update(createRestTypeNode(type), node) : node;
      }
      function createUnionOrIntersectionTypeNode(kind, types) {
        var node = createBaseNode(kind);
        node.types = parenthesizerRules().parenthesizeConstituentTypesOfUnionOrIntersectionType(types);
        node.transformFlags = 1;
        return node;
      }
      function updateUnionOrIntersectionTypeNode(node, types) {
        return node.types !== types ? update(createUnionOrIntersectionTypeNode(node.kind, types), node) : node;
      }
      function createUnionTypeNode(types) {
        return createUnionOrIntersectionTypeNode(186, types);
      }
      function updateUnionTypeNode(node, types) {
        return updateUnionOrIntersectionTypeNode(node, types);
      }
      function createIntersectionTypeNode(types) {
        return createUnionOrIntersectionTypeNode(187, types);
      }
      function updateIntersectionTypeNode(node, types) {
        return updateUnionOrIntersectionTypeNode(node, types);
      }
      function createConditionalTypeNode(checkType, extendsType, trueType, falseType) {
        var node = createBaseNode(188);
        node.checkType = parenthesizerRules().parenthesizeMemberOfConditionalType(checkType);
        node.extendsType = parenthesizerRules().parenthesizeMemberOfConditionalType(extendsType);
        node.trueType = trueType;
        node.falseType = falseType;
        node.transformFlags = 1;
        return node;
      }
      function updateConditionalTypeNode(node, checkType, extendsType, trueType, falseType) {
        return node.checkType !== checkType || node.extendsType !== extendsType || node.trueType !== trueType || node.falseType !== falseType ? update(createConditionalTypeNode(checkType, extendsType, trueType, falseType), node) : node;
      }
      function createInferTypeNode(typeParameter) {
        var node = createBaseNode(189);
        node.typeParameter = typeParameter;
        node.transformFlags = 1;
        return node;
      }
      function updateInferTypeNode(node, typeParameter) {
        return node.typeParameter !== typeParameter ? update(createInferTypeNode(typeParameter), node) : node;
      }
      function createTemplateLiteralType(head, templateSpans) {
        var node = createBaseNode(197);
        node.head = head;
        node.templateSpans = createNodeArray(templateSpans);
        node.transformFlags = 1;
        return node;
      }
      function updateTemplateLiteralType(node, head, templateSpans) {
        return node.head !== head || node.templateSpans !== templateSpans ? update(createTemplateLiteralType(head, templateSpans), node) : node;
      }
      function createImportTypeNode(argument, qualifier, typeArguments, isTypeOf) {
        if (isTypeOf === void 0) {
          isTypeOf = false;
        }
        var node = createBaseNode(199);
        node.argument = argument;
        node.qualifier = qualifier;
        node.typeArguments = typeArguments && parenthesizerRules().parenthesizeTypeArguments(typeArguments);
        node.isTypeOf = isTypeOf;
        node.transformFlags = 1;
        return node;
      }
      function updateImportTypeNode(node, argument, qualifier, typeArguments, isTypeOf) {
        if (isTypeOf === void 0) {
          isTypeOf = node.isTypeOf;
        }
        return node.argument !== argument || node.qualifier !== qualifier || node.typeArguments !== typeArguments || node.isTypeOf !== isTypeOf ? update(createImportTypeNode(argument, qualifier, typeArguments, isTypeOf), node) : node;
      }
      function createParenthesizedType(type) {
        var node = createBaseNode(190);
        node.type = type;
        node.transformFlags = 1;
        return node;
      }
      function updateParenthesizedType(node, type) {
        return node.type !== type ? update(createParenthesizedType(type), node) : node;
      }
      function createThisTypeNode() {
        var node = createBaseNode(191);
        node.transformFlags = 1;
        return node;
      }
      function createTypeOperatorNode(operator, type) {
        var node = createBaseNode(192);
        node.operator = operator;
        node.type = parenthesizerRules().parenthesizeMemberOfElementType(type);
        node.transformFlags = 1;
        return node;
      }
      function updateTypeOperatorNode(node, type) {
        return node.type !== type ? update(createTypeOperatorNode(node.operator, type), node) : node;
      }
      function createIndexedAccessTypeNode(objectType, indexType) {
        var node = createBaseNode(193);
        node.objectType = parenthesizerRules().parenthesizeMemberOfElementType(objectType);
        node.indexType = indexType;
        node.transformFlags = 1;
        return node;
      }
      function updateIndexedAccessTypeNode(node, objectType, indexType) {
        return node.objectType !== objectType || node.indexType !== indexType ? update(createIndexedAccessTypeNode(objectType, indexType), node) : node;
      }
      function createMappedTypeNode(readonlyToken, typeParameter, nameType, questionToken, type, members) {
        var node = createBaseNode(194);
        node.readonlyToken = readonlyToken;
        node.typeParameter = typeParameter;
        node.nameType = nameType;
        node.questionToken = questionToken;
        node.type = type;
        node.members = members && createNodeArray(members);
        node.transformFlags = 1;
        return node;
      }
      function updateMappedTypeNode(node, readonlyToken, typeParameter, nameType, questionToken, type, members) {
        return node.readonlyToken !== readonlyToken || node.typeParameter !== typeParameter || node.nameType !== nameType || node.questionToken !== questionToken || node.type !== type || node.members !== members ? update(createMappedTypeNode(readonlyToken, typeParameter, nameType, questionToken, type, members), node) : node;
      }
      function createLiteralTypeNode(literal) {
        var node = createBaseNode(195);
        node.literal = literal;
        node.transformFlags = 1;
        return node;
      }
      function updateLiteralTypeNode(node, literal) {
        return node.literal !== literal ? update(createLiteralTypeNode(literal), node) : node;
      }
      function createObjectBindingPattern(elements) {
        var node = createBaseNode(200);
        node.elements = createNodeArray(elements);
        node.transformFlags |= propagateChildrenFlags(node.elements) | 512 | 262144;
        if (node.transformFlags & 16384) {
          node.transformFlags |= 64 | 32768;
        }
        return node;
      }
      function updateObjectBindingPattern(node, elements) {
        return node.elements !== elements ? update(createObjectBindingPattern(elements), node) : node;
      }
      function createArrayBindingPattern(elements) {
        var node = createBaseNode(201);
        node.elements = createNodeArray(elements);
        node.transformFlags |= propagateChildrenFlags(node.elements) | 512 | 262144;
        return node;
      }
      function updateArrayBindingPattern(node, elements) {
        return node.elements !== elements ? update(createArrayBindingPattern(elements), node) : node;
      }
      function createBindingElement(dotDotDotToken, propertyName, name, initializer) {
        var node = createBaseBindingLikeDeclaration(202, void 0, void 0, name, initializer && parenthesizerRules().parenthesizeExpressionForDisallowedComma(initializer));
        node.propertyName = asName(propertyName);
        node.dotDotDotToken = dotDotDotToken;
        node.transformFlags |= propagateChildFlags(node.dotDotDotToken) | 512;
        if (node.propertyName) {
          node.transformFlags |= ts2.isIdentifier(node.propertyName) ? propagateIdentifierNameFlags(node.propertyName) : propagateChildFlags(node.propertyName);
        }
        if (dotDotDotToken)
          node.transformFlags |= 16384;
        return node;
      }
      function updateBindingElement(node, dotDotDotToken, propertyName, name, initializer) {
        return node.propertyName !== propertyName || node.dotDotDotToken !== dotDotDotToken || node.name !== name || node.initializer !== initializer ? update(createBindingElement(dotDotDotToken, propertyName, name, initializer), node) : node;
      }
      function createBaseExpression(kind) {
        var node = createBaseNode(kind);
        return node;
      }
      function createArrayLiteralExpression(elements, multiLine) {
        var node = createBaseExpression(203);
        var lastElement = elements && ts2.lastOrUndefined(elements);
        var elementsArray = createNodeArray(elements, lastElement && ts2.isOmittedExpression(lastElement) ? true : void 0);
        node.elements = parenthesizerRules().parenthesizeExpressionsOfCommaDelimitedList(elementsArray);
        node.multiLine = multiLine;
        node.transformFlags |= propagateChildrenFlags(node.elements);
        return node;
      }
      function updateArrayLiteralExpression(node, elements) {
        return node.elements !== elements ? update(createArrayLiteralExpression(elements, node.multiLine), node) : node;
      }
      function createObjectLiteralExpression(properties, multiLine) {
        var node = createBaseExpression(204);
        node.properties = createNodeArray(properties);
        node.multiLine = multiLine;
        node.transformFlags |= propagateChildrenFlags(node.properties);
        return node;
      }
      function updateObjectLiteralExpression(node, properties) {
        return node.properties !== properties ? update(createObjectLiteralExpression(properties, node.multiLine), node) : node;
      }
      function createPropertyAccessExpression(expression, name) {
        var node = createBaseExpression(205);
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.name = asName(name);
        node.transformFlags = propagateChildFlags(node.expression) | (ts2.isIdentifier(node.name) ? propagateIdentifierNameFlags(node.name) : propagateChildFlags(node.name));
        if (ts2.isSuperKeyword(expression)) {
          node.transformFlags |= 128 | 64;
        }
        return node;
      }
      function updatePropertyAccessExpression(node, expression, name) {
        if (ts2.isPropertyAccessChain(node)) {
          return updatePropertyAccessChain(node, expression, node.questionDotToken, ts2.cast(name, ts2.isIdentifier));
        }
        return node.expression !== expression || node.name !== name ? update(createPropertyAccessExpression(expression, name), node) : node;
      }
      function createPropertyAccessChain(expression, questionDotToken, name) {
        var node = createBaseExpression(205);
        node.flags |= 32;
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.questionDotToken = questionDotToken;
        node.name = asName(name);
        node.transformFlags |= 16 | propagateChildFlags(node.expression) | propagateChildFlags(node.questionDotToken) | (ts2.isIdentifier(node.name) ? propagateIdentifierNameFlags(node.name) : propagateChildFlags(node.name));
        return node;
      }
      function updatePropertyAccessChain(node, expression, questionDotToken, name) {
        ts2.Debug.assert(!!(node.flags & 32), "Cannot update a PropertyAccessExpression using updatePropertyAccessChain. Use updatePropertyAccess instead.");
        return node.expression !== expression || node.questionDotToken !== questionDotToken || node.name !== name ? update(createPropertyAccessChain(expression, questionDotToken, name), node) : node;
      }
      function createElementAccessExpression(expression, index) {
        var node = createBaseExpression(206);
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.argumentExpression = asExpression(index);
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.argumentExpression);
        if (ts2.isSuperKeyword(expression)) {
          node.transformFlags |= 128 | 64;
        }
        return node;
      }
      function updateElementAccessExpression(node, expression, argumentExpression) {
        if (ts2.isElementAccessChain(node)) {
          return updateElementAccessChain(node, expression, node.questionDotToken, argumentExpression);
        }
        return node.expression !== expression || node.argumentExpression !== argumentExpression ? update(createElementAccessExpression(expression, argumentExpression), node) : node;
      }
      function createElementAccessChain(expression, questionDotToken, index) {
        var node = createBaseExpression(206);
        node.flags |= 32;
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.questionDotToken = questionDotToken;
        node.argumentExpression = asExpression(index);
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.questionDotToken) | propagateChildFlags(node.argumentExpression) | 16;
        return node;
      }
      function updateElementAccessChain(node, expression, questionDotToken, argumentExpression) {
        ts2.Debug.assert(!!(node.flags & 32), "Cannot update a ElementAccessExpression using updateElementAccessChain. Use updateElementAccess instead.");
        return node.expression !== expression || node.questionDotToken !== questionDotToken || node.argumentExpression !== argumentExpression ? update(createElementAccessChain(expression, questionDotToken, argumentExpression), node) : node;
      }
      function createCallExpression(expression, typeArguments, argumentsArray) {
        var node = createBaseExpression(207);
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.typeArguments = asNodeArray(typeArguments);
        node.arguments = parenthesizerRules().parenthesizeExpressionsOfCommaDelimitedList(createNodeArray(argumentsArray));
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildrenFlags(node.typeArguments) | propagateChildrenFlags(node.arguments);
        if (node.typeArguments) {
          node.transformFlags |= 1;
        }
        if (ts2.isImportKeyword(node.expression)) {
          node.transformFlags |= 4194304;
        } else if (ts2.isSuperProperty(node.expression)) {
          node.transformFlags |= 8192;
        }
        return node;
      }
      function updateCallExpression(node, expression, typeArguments, argumentsArray) {
        if (ts2.isCallChain(node)) {
          return updateCallChain(node, expression, node.questionDotToken, typeArguments, argumentsArray);
        }
        return node.expression !== expression || node.typeArguments !== typeArguments || node.arguments !== argumentsArray ? update(createCallExpression(expression, typeArguments, argumentsArray), node) : node;
      }
      function createCallChain(expression, questionDotToken, typeArguments, argumentsArray) {
        var node = createBaseExpression(207);
        node.flags |= 32;
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.questionDotToken = questionDotToken;
        node.typeArguments = asNodeArray(typeArguments);
        node.arguments = parenthesizerRules().parenthesizeExpressionsOfCommaDelimitedList(createNodeArray(argumentsArray));
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.questionDotToken) | propagateChildrenFlags(node.typeArguments) | propagateChildrenFlags(node.arguments) | 16;
        if (node.typeArguments) {
          node.transformFlags |= 1;
        }
        if (ts2.isSuperProperty(node.expression)) {
          node.transformFlags |= 8192;
        }
        return node;
      }
      function updateCallChain(node, expression, questionDotToken, typeArguments, argumentsArray) {
        ts2.Debug.assert(!!(node.flags & 32), "Cannot update a CallExpression using updateCallChain. Use updateCall instead.");
        return node.expression !== expression || node.questionDotToken !== questionDotToken || node.typeArguments !== typeArguments || node.arguments !== argumentsArray ? update(createCallChain(expression, questionDotToken, typeArguments, argumentsArray), node) : node;
      }
      function createNewExpression(expression, typeArguments, argumentsArray) {
        var node = createBaseExpression(208);
        node.expression = parenthesizerRules().parenthesizeExpressionOfNew(expression);
        node.typeArguments = asNodeArray(typeArguments);
        node.arguments = argumentsArray ? parenthesizerRules().parenthesizeExpressionsOfCommaDelimitedList(argumentsArray) : void 0;
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildrenFlags(node.typeArguments) | propagateChildrenFlags(node.arguments) | 16;
        if (node.typeArguments) {
          node.transformFlags |= 1;
        }
        return node;
      }
      function updateNewExpression(node, expression, typeArguments, argumentsArray) {
        return node.expression !== expression || node.typeArguments !== typeArguments || node.arguments !== argumentsArray ? update(createNewExpression(expression, typeArguments, argumentsArray), node) : node;
      }
      function createTaggedTemplateExpression(tag, typeArguments, template) {
        var node = createBaseExpression(209);
        node.tag = parenthesizerRules().parenthesizeLeftSideOfAccess(tag);
        node.typeArguments = asNodeArray(typeArguments);
        node.template = template;
        node.transformFlags |= propagateChildFlags(node.tag) | propagateChildrenFlags(node.typeArguments) | propagateChildFlags(node.template) | 512;
        if (node.typeArguments) {
          node.transformFlags |= 1;
        }
        if (ts2.hasInvalidEscape(node.template)) {
          node.transformFlags |= 64;
        }
        return node;
      }
      function updateTaggedTemplateExpression(node, tag, typeArguments, template) {
        return node.tag !== tag || node.typeArguments !== typeArguments || node.template !== template ? update(createTaggedTemplateExpression(tag, typeArguments, template), node) : node;
      }
      function createTypeAssertion(type, expression) {
        var node = createBaseExpression(210);
        node.expression = parenthesizerRules().parenthesizeOperandOfPrefixUnary(expression);
        node.type = type;
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.type) | 1;
        return node;
      }
      function updateTypeAssertion(node, type, expression) {
        return node.type !== type || node.expression !== expression ? update(createTypeAssertion(type, expression), node) : node;
      }
      function createParenthesizedExpression(expression) {
        var node = createBaseExpression(211);
        node.expression = expression;
        node.transformFlags = propagateChildFlags(node.expression);
        return node;
      }
      function updateParenthesizedExpression(node, expression) {
        return node.expression !== expression ? update(createParenthesizedExpression(expression), node) : node;
      }
      function createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body) {
        var node = createBaseFunctionLikeDeclaration(212, void 0, modifiers, name, typeParameters, parameters, type, body);
        node.asteriskToken = asteriskToken;
        node.transformFlags |= propagateChildFlags(node.asteriskToken);
        if (node.typeParameters) {
          node.transformFlags |= 1;
        }
        if (ts2.modifiersToFlags(node.modifiers) & 256) {
          if (node.asteriskToken) {
            node.transformFlags |= 64;
          } else {
            node.transformFlags |= 128;
          }
        } else if (node.asteriskToken) {
          node.transformFlags |= 1024;
        }
        return node;
      }
      function updateFunctionExpression(node, modifiers, asteriskToken, name, typeParameters, parameters, type, body) {
        return node.name !== name || node.modifiers !== modifiers || node.asteriskToken !== asteriskToken || node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type || node.body !== body ? updateBaseFunctionLikeDeclaration(createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body), node) : node;
      }
      function createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body) {
        var node = createBaseFunctionLikeDeclaration(213, void 0, modifiers, void 0, typeParameters, parameters, type, parenthesizerRules().parenthesizeConciseBodyOfArrowFunction(body));
        node.equalsGreaterThanToken = equalsGreaterThanToken !== null && equalsGreaterThanToken !== void 0 ? equalsGreaterThanToken : createToken(38);
        node.transformFlags |= propagateChildFlags(node.equalsGreaterThanToken) | 512;
        if (ts2.modifiersToFlags(node.modifiers) & 256) {
          node.transformFlags |= 128 | 8192;
        }
        return node;
      }
      function updateArrowFunction(node, modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body) {
        return node.modifiers !== modifiers || node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type || node.equalsGreaterThanToken !== equalsGreaterThanToken || node.body !== body ? updateBaseFunctionLikeDeclaration(createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body), node) : node;
      }
      function createDeleteExpression(expression) {
        var node = createBaseExpression(214);
        node.expression = parenthesizerRules().parenthesizeOperandOfPrefixUnary(expression);
        node.transformFlags |= propagateChildFlags(node.expression);
        return node;
      }
      function updateDeleteExpression(node, expression) {
        return node.expression !== expression ? update(createDeleteExpression(expression), node) : node;
      }
      function createTypeOfExpression(expression) {
        var node = createBaseExpression(215);
        node.expression = parenthesizerRules().parenthesizeOperandOfPrefixUnary(expression);
        node.transformFlags |= propagateChildFlags(node.expression);
        return node;
      }
      function updateTypeOfExpression(node, expression) {
        return node.expression !== expression ? update(createTypeOfExpression(expression), node) : node;
      }
      function createVoidExpression(expression) {
        var node = createBaseExpression(216);
        node.expression = parenthesizerRules().parenthesizeOperandOfPrefixUnary(expression);
        node.transformFlags |= propagateChildFlags(node.expression);
        return node;
      }
      function updateVoidExpression(node, expression) {
        return node.expression !== expression ? update(createVoidExpression(expression), node) : node;
      }
      function createAwaitExpression(expression) {
        var node = createBaseExpression(217);
        node.expression = parenthesizerRules().parenthesizeOperandOfPrefixUnary(expression);
        node.transformFlags |= propagateChildFlags(node.expression) | 128 | 64 | 1048576;
        return node;
      }
      function updateAwaitExpression(node, expression) {
        return node.expression !== expression ? update(createAwaitExpression(expression), node) : node;
      }
      function createPrefixUnaryExpression(operator, operand) {
        var node = createBaseExpression(218);
        node.operator = operator;
        node.operand = parenthesizerRules().parenthesizeOperandOfPrefixUnary(operand);
        node.transformFlags |= propagateChildFlags(node.operand);
        if ((operator === 45 || operator === 46) && ts2.isIdentifier(node.operand) && !ts2.isGeneratedIdentifier(node.operand) && !ts2.isLocalName(node.operand)) {
          node.transformFlags |= 67108864;
        }
        return node;
      }
      function updatePrefixUnaryExpression(node, operand) {
        return node.operand !== operand ? update(createPrefixUnaryExpression(node.operator, operand), node) : node;
      }
      function createPostfixUnaryExpression(operand, operator) {
        var node = createBaseExpression(219);
        node.operator = operator;
        node.operand = parenthesizerRules().parenthesizeOperandOfPostfixUnary(operand);
        node.transformFlags |= propagateChildFlags(node.operand);
        if (ts2.isIdentifier(node.operand) && !ts2.isGeneratedIdentifier(node.operand) && !ts2.isLocalName(node.operand)) {
          node.transformFlags |= 67108864;
        }
        return node;
      }
      function updatePostfixUnaryExpression(node, operand) {
        return node.operand !== operand ? update(createPostfixUnaryExpression(operand, node.operator), node) : node;
      }
      function createBinaryExpression(left, operator, right) {
        var node = createBaseExpression(220);
        var operatorToken = asToken(operator);
        var operatorKind = operatorToken.kind;
        node.left = parenthesizerRules().parenthesizeLeftSideOfBinary(operatorKind, left);
        node.operatorToken = operatorToken;
        node.right = parenthesizerRules().parenthesizeRightSideOfBinary(operatorKind, node.left, right);
        node.transformFlags |= propagateChildFlags(node.left) | propagateChildFlags(node.operatorToken) | propagateChildFlags(node.right);
        if (operatorKind === 60) {
          node.transformFlags |= 16;
        } else if (operatorKind === 63) {
          if (ts2.isObjectLiteralExpression(node.left)) {
            node.transformFlags |= 512 | 64 | 2048 | propagateAssignmentPatternFlags(node.left);
          } else if (ts2.isArrayLiteralExpression(node.left)) {
            node.transformFlags |= 512 | 2048 | propagateAssignmentPatternFlags(node.left);
          }
        } else if (operatorKind === 42 || operatorKind === 67) {
          node.transformFlags |= 256;
        } else if (ts2.isLogicalOrCoalescingAssignmentOperator(operatorKind)) {
          node.transformFlags |= 8;
        }
        return node;
      }
      function propagateAssignmentPatternFlags(node) {
        if (node.transformFlags & 32768)
          return 32768;
        if (node.transformFlags & 64) {
          for (var _i = 0, _a = ts2.getElementsOfBindingOrAssignmentPattern(node); _i < _a.length; _i++) {
            var element = _a[_i];
            var target = ts2.getTargetOfBindingOrAssignmentElement(element);
            if (target && ts2.isAssignmentPattern(target)) {
              if (target.transformFlags & 32768) {
                return 32768;
              }
              if (target.transformFlags & 64) {
                var flags_1 = propagateAssignmentPatternFlags(target);
                if (flags_1)
                  return flags_1;
              }
            }
          }
        }
        return 0;
      }
      function updateBinaryExpression(node, left, operator, right) {
        return node.left !== left || node.operatorToken !== operator || node.right !== right ? update(createBinaryExpression(left, operator, right), node) : node;
      }
      function createConditionalExpression(condition, questionToken, whenTrue, colonToken, whenFalse) {
        var node = createBaseExpression(221);
        node.condition = parenthesizerRules().parenthesizeConditionOfConditionalExpression(condition);
        node.questionToken = questionToken !== null && questionToken !== void 0 ? questionToken : createToken(57);
        node.whenTrue = parenthesizerRules().parenthesizeBranchOfConditionalExpression(whenTrue);
        node.colonToken = colonToken !== null && colonToken !== void 0 ? colonToken : createToken(58);
        node.whenFalse = parenthesizerRules().parenthesizeBranchOfConditionalExpression(whenFalse);
        node.transformFlags |= propagateChildFlags(node.condition) | propagateChildFlags(node.questionToken) | propagateChildFlags(node.whenTrue) | propagateChildFlags(node.colonToken) | propagateChildFlags(node.whenFalse);
        return node;
      }
      function updateConditionalExpression(node, condition, questionToken, whenTrue, colonToken, whenFalse) {
        return node.condition !== condition || node.questionToken !== questionToken || node.whenTrue !== whenTrue || node.colonToken !== colonToken || node.whenFalse !== whenFalse ? update(createConditionalExpression(condition, questionToken, whenTrue, colonToken, whenFalse), node) : node;
      }
      function createTemplateExpression(head, templateSpans) {
        var node = createBaseExpression(222);
        node.head = head;
        node.templateSpans = createNodeArray(templateSpans);
        node.transformFlags |= propagateChildFlags(node.head) | propagateChildrenFlags(node.templateSpans) | 512;
        return node;
      }
      function updateTemplateExpression(node, head, templateSpans) {
        return node.head !== head || node.templateSpans !== templateSpans ? update(createTemplateExpression(head, templateSpans), node) : node;
      }
      function createTemplateLiteralLikeNodeChecked(kind, text, rawText, templateFlags) {
        if (templateFlags === void 0) {
          templateFlags = 0;
        }
        ts2.Debug.assert(!(templateFlags & ~2048), "Unsupported template flags.");
        var cooked = void 0;
        if (rawText !== void 0 && rawText !== text) {
          cooked = getCookedText(kind, rawText);
          if (typeof cooked === "object") {
            return ts2.Debug.fail("Invalid raw text");
          }
        }
        if (text === void 0) {
          if (cooked === void 0) {
            return ts2.Debug.fail("Arguments 'text' and 'rawText' may not both be undefined.");
          }
          text = cooked;
        } else if (cooked !== void 0) {
          ts2.Debug.assert(text === cooked, "Expected argument 'text' to be the normalized (i.e. 'cooked') version of argument 'rawText'.");
        }
        return createTemplateLiteralLikeNode(kind, text, rawText, templateFlags);
      }
      function createTemplateLiteralLikeNode(kind, text, rawText, templateFlags) {
        var node = createBaseToken(kind);
        node.text = text;
        node.rawText = rawText;
        node.templateFlags = templateFlags & 2048;
        node.transformFlags |= 512;
        if (node.templateFlags) {
          node.transformFlags |= 64;
        }
        return node;
      }
      function createTemplateHead(text, rawText, templateFlags) {
        return createTemplateLiteralLikeNodeChecked(15, text, rawText, templateFlags);
      }
      function createTemplateMiddle(text, rawText, templateFlags) {
        return createTemplateLiteralLikeNodeChecked(16, text, rawText, templateFlags);
      }
      function createTemplateTail(text, rawText, templateFlags) {
        return createTemplateLiteralLikeNodeChecked(17, text, rawText, templateFlags);
      }
      function createNoSubstitutionTemplateLiteral(text, rawText, templateFlags) {
        return createTemplateLiteralLikeNodeChecked(14, text, rawText, templateFlags);
      }
      function createYieldExpression(asteriskToken, expression) {
        ts2.Debug.assert(!asteriskToken || !!expression, "A `YieldExpression` with an asteriskToken must have an expression.");
        var node = createBaseExpression(223);
        node.expression = expression && parenthesizerRules().parenthesizeExpressionForDisallowedComma(expression);
        node.asteriskToken = asteriskToken;
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.asteriskToken) | 512 | 64 | 524288;
        return node;
      }
      function updateYieldExpression(node, asteriskToken, expression) {
        return node.expression !== expression || node.asteriskToken !== asteriskToken ? update(createYieldExpression(asteriskToken, expression), node) : node;
      }
      function createSpreadElement(expression) {
        var node = createBaseExpression(224);
        node.expression = parenthesizerRules().parenthesizeExpressionForDisallowedComma(expression);
        node.transformFlags |= propagateChildFlags(node.expression) | 512 | 16384;
        return node;
      }
      function updateSpreadElement(node, expression) {
        return node.expression !== expression ? update(createSpreadElement(expression), node) : node;
      }
      function createClassExpression(decorators, modifiers, name, typeParameters, heritageClauses, members) {
        var node = createBaseClassLikeDeclaration(225, decorators, modifiers, name, typeParameters, heritageClauses, members);
        node.transformFlags |= 512;
        return node;
      }
      function updateClassExpression(node, decorators, modifiers, name, typeParameters, heritageClauses, members) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.typeParameters !== typeParameters || node.heritageClauses !== heritageClauses || node.members !== members ? update(createClassExpression(decorators, modifiers, name, typeParameters, heritageClauses, members), node) : node;
      }
      function createOmittedExpression() {
        return createBaseExpression(226);
      }
      function createExpressionWithTypeArguments(expression, typeArguments) {
        var node = createBaseNode(227);
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.typeArguments = typeArguments && parenthesizerRules().parenthesizeTypeArguments(typeArguments);
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildrenFlags(node.typeArguments) | 512;
        return node;
      }
      function updateExpressionWithTypeArguments(node, expression, typeArguments) {
        return node.expression !== expression || node.typeArguments !== typeArguments ? update(createExpressionWithTypeArguments(expression, typeArguments), node) : node;
      }
      function createAsExpression(expression, type) {
        var node = createBaseExpression(228);
        node.expression = expression;
        node.type = type;
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.type) | 1;
        return node;
      }
      function updateAsExpression(node, expression, type) {
        return node.expression !== expression || node.type !== type ? update(createAsExpression(expression, type), node) : node;
      }
      function createNonNullExpression(expression) {
        var node = createBaseExpression(229);
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.transformFlags |= propagateChildFlags(node.expression) | 1;
        return node;
      }
      function updateNonNullExpression(node, expression) {
        if (ts2.isNonNullChain(node)) {
          return updateNonNullChain(node, expression);
        }
        return node.expression !== expression ? update(createNonNullExpression(expression), node) : node;
      }
      function createNonNullChain(expression) {
        var node = createBaseExpression(229);
        node.flags |= 32;
        node.expression = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        node.transformFlags |= propagateChildFlags(node.expression) | 1;
        return node;
      }
      function updateNonNullChain(node, expression) {
        ts2.Debug.assert(!!(node.flags & 32), "Cannot update a NonNullExpression using updateNonNullChain. Use updateNonNullExpression instead.");
        return node.expression !== expression ? update(createNonNullChain(expression), node) : node;
      }
      function createMetaProperty(keywordToken, name) {
        var node = createBaseExpression(230);
        node.keywordToken = keywordToken;
        node.name = name;
        node.transformFlags |= propagateChildFlags(node.name);
        switch (keywordToken) {
          case 103:
            node.transformFlags |= 512;
            break;
          case 100:
            node.transformFlags |= 4;
            break;
          default:
            return ts2.Debug.assertNever(keywordToken);
        }
        return node;
      }
      function updateMetaProperty(node, name) {
        return node.name !== name ? update(createMetaProperty(node.keywordToken, name), node) : node;
      }
      function createTemplateSpan(expression, literal) {
        var node = createBaseNode(232);
        node.expression = expression;
        node.literal = literal;
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.literal) | 512;
        return node;
      }
      function updateTemplateSpan(node, expression, literal) {
        return node.expression !== expression || node.literal !== literal ? update(createTemplateSpan(expression, literal), node) : node;
      }
      function createSemicolonClassElement() {
        var node = createBaseNode(233);
        node.transformFlags |= 512;
        return node;
      }
      function createBlock(statements, multiLine) {
        var node = createBaseNode(234);
        node.statements = createNodeArray(statements);
        node.multiLine = multiLine;
        node.transformFlags |= propagateChildrenFlags(node.statements);
        return node;
      }
      function updateBlock(node, statements) {
        return node.statements !== statements ? update(createBlock(statements, node.multiLine), node) : node;
      }
      function createVariableStatement(modifiers, declarationList) {
        var node = createBaseDeclaration(236, void 0, modifiers);
        node.declarationList = ts2.isArray(declarationList) ? createVariableDeclarationList(declarationList) : declarationList;
        node.transformFlags |= propagateChildFlags(node.declarationList);
        if (ts2.modifiersToFlags(node.modifiers) & 2) {
          node.transformFlags = 1;
        }
        return node;
      }
      function updateVariableStatement(node, modifiers, declarationList) {
        return node.modifiers !== modifiers || node.declarationList !== declarationList ? update(createVariableStatement(modifiers, declarationList), node) : node;
      }
      function createEmptyStatement() {
        return createBaseNode(235);
      }
      function createExpressionStatement(expression) {
        var node = createBaseNode(237);
        node.expression = parenthesizerRules().parenthesizeExpressionOfExpressionStatement(expression);
        node.transformFlags |= propagateChildFlags(node.expression);
        return node;
      }
      function updateExpressionStatement(node, expression) {
        return node.expression !== expression ? update(createExpressionStatement(expression), node) : node;
      }
      function createIfStatement(expression, thenStatement, elseStatement) {
        var node = createBaseNode(238);
        node.expression = expression;
        node.thenStatement = asEmbeddedStatement(thenStatement);
        node.elseStatement = asEmbeddedStatement(elseStatement);
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.thenStatement) | propagateChildFlags(node.elseStatement);
        return node;
      }
      function updateIfStatement(node, expression, thenStatement, elseStatement) {
        return node.expression !== expression || node.thenStatement !== thenStatement || node.elseStatement !== elseStatement ? update(createIfStatement(expression, thenStatement, elseStatement), node) : node;
      }
      function createDoStatement(statement, expression) {
        var node = createBaseNode(239);
        node.statement = asEmbeddedStatement(statement);
        node.expression = expression;
        node.transformFlags |= propagateChildFlags(node.statement) | propagateChildFlags(node.expression);
        return node;
      }
      function updateDoStatement(node, statement, expression) {
        return node.statement !== statement || node.expression !== expression ? update(createDoStatement(statement, expression), node) : node;
      }
      function createWhileStatement(expression, statement) {
        var node = createBaseNode(240);
        node.expression = expression;
        node.statement = asEmbeddedStatement(statement);
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.statement);
        return node;
      }
      function updateWhileStatement(node, expression, statement) {
        return node.expression !== expression || node.statement !== statement ? update(createWhileStatement(expression, statement), node) : node;
      }
      function createForStatement(initializer, condition, incrementor, statement) {
        var node = createBaseNode(241);
        node.initializer = initializer;
        node.condition = condition;
        node.incrementor = incrementor;
        node.statement = asEmbeddedStatement(statement);
        node.transformFlags |= propagateChildFlags(node.initializer) | propagateChildFlags(node.condition) | propagateChildFlags(node.incrementor) | propagateChildFlags(node.statement);
        return node;
      }
      function updateForStatement(node, initializer, condition, incrementor, statement) {
        return node.initializer !== initializer || node.condition !== condition || node.incrementor !== incrementor || node.statement !== statement ? update(createForStatement(initializer, condition, incrementor, statement), node) : node;
      }
      function createForInStatement(initializer, expression, statement) {
        var node = createBaseNode(242);
        node.initializer = initializer;
        node.expression = expression;
        node.statement = asEmbeddedStatement(statement);
        node.transformFlags |= propagateChildFlags(node.initializer) | propagateChildFlags(node.expression) | propagateChildFlags(node.statement);
        return node;
      }
      function updateForInStatement(node, initializer, expression, statement) {
        return node.initializer !== initializer || node.expression !== expression || node.statement !== statement ? update(createForInStatement(initializer, expression, statement), node) : node;
      }
      function createForOfStatement(awaitModifier, initializer, expression, statement) {
        var node = createBaseNode(243);
        node.awaitModifier = awaitModifier;
        node.initializer = initializer;
        node.expression = parenthesizerRules().parenthesizeExpressionForDisallowedComma(expression);
        node.statement = asEmbeddedStatement(statement);
        node.transformFlags |= propagateChildFlags(node.awaitModifier) | propagateChildFlags(node.initializer) | propagateChildFlags(node.expression) | propagateChildFlags(node.statement) | 512;
        if (awaitModifier)
          node.transformFlags |= 64;
        return node;
      }
      function updateForOfStatement(node, awaitModifier, initializer, expression, statement) {
        return node.awaitModifier !== awaitModifier || node.initializer !== initializer || node.expression !== expression || node.statement !== statement ? update(createForOfStatement(awaitModifier, initializer, expression, statement), node) : node;
      }
      function createContinueStatement(label) {
        var node = createBaseNode(244);
        node.label = asName(label);
        node.transformFlags |= propagateChildFlags(node.label) | 2097152;
        return node;
      }
      function updateContinueStatement(node, label) {
        return node.label !== label ? update(createContinueStatement(label), node) : node;
      }
      function createBreakStatement(label) {
        var node = createBaseNode(245);
        node.label = asName(label);
        node.transformFlags |= propagateChildFlags(node.label) | 2097152;
        return node;
      }
      function updateBreakStatement(node, label) {
        return node.label !== label ? update(createBreakStatement(label), node) : node;
      }
      function createReturnStatement(expression) {
        var node = createBaseNode(246);
        node.expression = expression;
        node.transformFlags |= propagateChildFlags(node.expression) | 64 | 2097152;
        return node;
      }
      function updateReturnStatement(node, expression) {
        return node.expression !== expression ? update(createReturnStatement(expression), node) : node;
      }
      function createWithStatement(expression, statement) {
        var node = createBaseNode(247);
        node.expression = expression;
        node.statement = asEmbeddedStatement(statement);
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.statement);
        return node;
      }
      function updateWithStatement(node, expression, statement) {
        return node.expression !== expression || node.statement !== statement ? update(createWithStatement(expression, statement), node) : node;
      }
      function createSwitchStatement(expression, caseBlock) {
        var node = createBaseNode(248);
        node.expression = parenthesizerRules().parenthesizeExpressionForDisallowedComma(expression);
        node.caseBlock = caseBlock;
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.caseBlock);
        return node;
      }
      function updateSwitchStatement(node, expression, caseBlock) {
        return node.expression !== expression || node.caseBlock !== caseBlock ? update(createSwitchStatement(expression, caseBlock), node) : node;
      }
      function createLabeledStatement(label, statement) {
        var node = createBaseNode(249);
        node.label = asName(label);
        node.statement = asEmbeddedStatement(statement);
        node.transformFlags |= propagateChildFlags(node.label) | propagateChildFlags(node.statement);
        return node;
      }
      function updateLabeledStatement(node, label, statement) {
        return node.label !== label || node.statement !== statement ? update(createLabeledStatement(label, statement), node) : node;
      }
      function createThrowStatement(expression) {
        var node = createBaseNode(250);
        node.expression = expression;
        node.transformFlags |= propagateChildFlags(node.expression);
        return node;
      }
      function updateThrowStatement(node, expression) {
        return node.expression !== expression ? update(createThrowStatement(expression), node) : node;
      }
      function createTryStatement(tryBlock, catchClause, finallyBlock) {
        var node = createBaseNode(251);
        node.tryBlock = tryBlock;
        node.catchClause = catchClause;
        node.finallyBlock = finallyBlock;
        node.transformFlags |= propagateChildFlags(node.tryBlock) | propagateChildFlags(node.catchClause) | propagateChildFlags(node.finallyBlock);
        return node;
      }
      function updateTryStatement(node, tryBlock, catchClause, finallyBlock) {
        return node.tryBlock !== tryBlock || node.catchClause !== catchClause || node.finallyBlock !== finallyBlock ? update(createTryStatement(tryBlock, catchClause, finallyBlock), node) : node;
      }
      function createDebuggerStatement() {
        return createBaseNode(252);
      }
      function createVariableDeclaration(name, exclamationToken, type, initializer) {
        var node = createBaseVariableLikeDeclaration(253, void 0, void 0, name, type, initializer && parenthesizerRules().parenthesizeExpressionForDisallowedComma(initializer));
        node.exclamationToken = exclamationToken;
        node.transformFlags |= propagateChildFlags(node.exclamationToken);
        if (exclamationToken) {
          node.transformFlags |= 1;
        }
        return node;
      }
      function updateVariableDeclaration(node, name, exclamationToken, type, initializer) {
        return node.name !== name || node.type !== type || node.exclamationToken !== exclamationToken || node.initializer !== initializer ? update(createVariableDeclaration(name, exclamationToken, type, initializer), node) : node;
      }
      function createVariableDeclarationList(declarations, flags2) {
        if (flags2 === void 0) {
          flags2 = 0;
        }
        var node = createBaseNode(254);
        node.flags |= flags2 & 3;
        node.declarations = createNodeArray(declarations);
        node.transformFlags |= propagateChildrenFlags(node.declarations) | 2097152;
        if (flags2 & 3) {
          node.transformFlags |= 512 | 131072;
        }
        return node;
      }
      function updateVariableDeclarationList(node, declarations) {
        return node.declarations !== declarations ? update(createVariableDeclarationList(declarations, node.flags), node) : node;
      }
      function createFunctionDeclaration(decorators, modifiers, asteriskToken, name, typeParameters, parameters, type, body) {
        var node = createBaseFunctionLikeDeclaration(255, decorators, modifiers, name, typeParameters, parameters, type, body);
        node.asteriskToken = asteriskToken;
        if (!node.body || ts2.modifiersToFlags(node.modifiers) & 2) {
          node.transformFlags = 1;
        } else {
          node.transformFlags |= propagateChildFlags(node.asteriskToken) | 2097152;
          if (ts2.modifiersToFlags(node.modifiers) & 256) {
            if (node.asteriskToken) {
              node.transformFlags |= 64;
            } else {
              node.transformFlags |= 128;
            }
          } else if (node.asteriskToken) {
            node.transformFlags |= 1024;
          }
        }
        return node;
      }
      function updateFunctionDeclaration(node, decorators, modifiers, asteriskToken, name, typeParameters, parameters, type, body) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.asteriskToken !== asteriskToken || node.name !== name || node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type || node.body !== body ? updateBaseFunctionLikeDeclaration(createFunctionDeclaration(decorators, modifiers, asteriskToken, name, typeParameters, parameters, type, body), node) : node;
      }
      function createClassDeclaration(decorators, modifiers, name, typeParameters, heritageClauses, members) {
        var node = createBaseClassLikeDeclaration(256, decorators, modifiers, name, typeParameters, heritageClauses, members);
        if (ts2.modifiersToFlags(node.modifiers) & 2) {
          node.transformFlags = 1;
        } else {
          node.transformFlags |= 512;
          if (node.transformFlags & 4096) {
            node.transformFlags |= 1;
          }
        }
        return node;
      }
      function updateClassDeclaration(node, decorators, modifiers, name, typeParameters, heritageClauses, members) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.typeParameters !== typeParameters || node.heritageClauses !== heritageClauses || node.members !== members ? update(createClassDeclaration(decorators, modifiers, name, typeParameters, heritageClauses, members), node) : node;
      }
      function createInterfaceDeclaration(decorators, modifiers, name, typeParameters, heritageClauses, members) {
        var node = createBaseInterfaceOrClassLikeDeclaration(257, decorators, modifiers, name, typeParameters, heritageClauses);
        node.members = createNodeArray(members);
        node.transformFlags = 1;
        return node;
      }
      function updateInterfaceDeclaration(node, decorators, modifiers, name, typeParameters, heritageClauses, members) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.typeParameters !== typeParameters || node.heritageClauses !== heritageClauses || node.members !== members ? update(createInterfaceDeclaration(decorators, modifiers, name, typeParameters, heritageClauses, members), node) : node;
      }
      function createTypeAliasDeclaration(decorators, modifiers, name, typeParameters, type) {
        var node = createBaseGenericNamedDeclaration(258, decorators, modifiers, name, typeParameters);
        node.type = type;
        node.transformFlags = 1;
        return node;
      }
      function updateTypeAliasDeclaration(node, decorators, modifiers, name, typeParameters, type) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.typeParameters !== typeParameters || node.type !== type ? update(createTypeAliasDeclaration(decorators, modifiers, name, typeParameters, type), node) : node;
      }
      function createEnumDeclaration(decorators, modifiers, name, members) {
        var node = createBaseNamedDeclaration(259, decorators, modifiers, name);
        node.members = createNodeArray(members);
        node.transformFlags |= propagateChildrenFlags(node.members) | 1;
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateEnumDeclaration(node, decorators, modifiers, name, members) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.members !== members ? update(createEnumDeclaration(decorators, modifiers, name, members), node) : node;
      }
      function createModuleDeclaration(decorators, modifiers, name, body, flags2) {
        if (flags2 === void 0) {
          flags2 = 0;
        }
        var node = createBaseDeclaration(260, decorators, modifiers);
        node.flags |= flags2 & (16 | 4 | 1024);
        node.name = name;
        node.body = body;
        if (ts2.modifiersToFlags(node.modifiers) & 2) {
          node.transformFlags = 1;
        } else {
          node.transformFlags |= propagateChildFlags(node.name) | propagateChildFlags(node.body) | 1;
        }
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateModuleDeclaration(node, decorators, modifiers, name, body) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.name !== name || node.body !== body ? update(createModuleDeclaration(decorators, modifiers, name, body, node.flags), node) : node;
      }
      function createModuleBlock(statements) {
        var node = createBaseNode(261);
        node.statements = createNodeArray(statements);
        node.transformFlags |= propagateChildrenFlags(node.statements);
        return node;
      }
      function updateModuleBlock(node, statements) {
        return node.statements !== statements ? update(createModuleBlock(statements), node) : node;
      }
      function createCaseBlock(clauses) {
        var node = createBaseNode(262);
        node.clauses = createNodeArray(clauses);
        node.transformFlags |= propagateChildrenFlags(node.clauses);
        return node;
      }
      function updateCaseBlock(node, clauses) {
        return node.clauses !== clauses ? update(createCaseBlock(clauses), node) : node;
      }
      function createNamespaceExportDeclaration(name) {
        var node = createBaseNamedDeclaration(263, void 0, void 0, name);
        node.transformFlags = 1;
        return node;
      }
      function updateNamespaceExportDeclaration(node, name) {
        return node.name !== name ? update(createNamespaceExportDeclaration(name), node) : node;
      }
      function createImportEqualsDeclaration(decorators, modifiers, isTypeOnly, name, moduleReference) {
        var node = createBaseNamedDeclaration(264, decorators, modifiers, name);
        node.isTypeOnly = isTypeOnly;
        node.moduleReference = moduleReference;
        node.transformFlags |= propagateChildFlags(node.moduleReference);
        if (!ts2.isExternalModuleReference(node.moduleReference))
          node.transformFlags |= 1;
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateImportEqualsDeclaration(node, decorators, modifiers, isTypeOnly, name, moduleReference) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.isTypeOnly !== isTypeOnly || node.name !== name || node.moduleReference !== moduleReference ? update(createImportEqualsDeclaration(decorators, modifiers, isTypeOnly, name, moduleReference), node) : node;
      }
      function createImportDeclaration(decorators, modifiers, importClause, moduleSpecifier, assertClause) {
        var node = createBaseDeclaration(265, decorators, modifiers);
        node.importClause = importClause;
        node.moduleSpecifier = moduleSpecifier;
        node.assertClause = assertClause;
        node.transformFlags |= propagateChildFlags(node.importClause) | propagateChildFlags(node.moduleSpecifier);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateImportDeclaration(node, decorators, modifiers, importClause, moduleSpecifier, assertClause) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.importClause !== importClause || node.moduleSpecifier !== moduleSpecifier || node.assertClause !== assertClause ? update(createImportDeclaration(decorators, modifiers, importClause, moduleSpecifier, assertClause), node) : node;
      }
      function createImportClause(isTypeOnly, name, namedBindings) {
        var node = createBaseNode(266);
        node.isTypeOnly = isTypeOnly;
        node.name = name;
        node.namedBindings = namedBindings;
        node.transformFlags |= propagateChildFlags(node.name) | propagateChildFlags(node.namedBindings);
        if (isTypeOnly) {
          node.transformFlags |= 1;
        }
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateImportClause(node, isTypeOnly, name, namedBindings) {
        return node.isTypeOnly !== isTypeOnly || node.name !== name || node.namedBindings !== namedBindings ? update(createImportClause(isTypeOnly, name, namedBindings), node) : node;
      }
      function createAssertClause(elements, multiLine) {
        var node = createBaseNode(292);
        node.elements = elements;
        node.multiLine = multiLine;
        node.transformFlags |= 4;
        return node;
      }
      function updateAssertClause(node, elements, multiLine) {
        return node.elements !== elements || node.multiLine !== multiLine ? update(createAssertClause(elements, multiLine), node) : node;
      }
      function createAssertEntry(name, value) {
        var node = createBaseNode(293);
        node.name = name;
        node.value = value;
        node.transformFlags |= 4;
        return node;
      }
      function updateAssertEntry(node, name, value) {
        return node.name !== name || node.value !== value ? update(createAssertEntry(name, value), node) : node;
      }
      function createNamespaceImport(name) {
        var node = createBaseNode(267);
        node.name = name;
        node.transformFlags |= propagateChildFlags(node.name);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateNamespaceImport(node, name) {
        return node.name !== name ? update(createNamespaceImport(name), node) : node;
      }
      function createNamespaceExport(name) {
        var node = createBaseNode(273);
        node.name = name;
        node.transformFlags |= propagateChildFlags(node.name) | 4;
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateNamespaceExport(node, name) {
        return node.name !== name ? update(createNamespaceExport(name), node) : node;
      }
      function createNamedImports(elements) {
        var node = createBaseNode(268);
        node.elements = createNodeArray(elements);
        node.transformFlags |= propagateChildrenFlags(node.elements);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateNamedImports(node, elements) {
        return node.elements !== elements ? update(createNamedImports(elements), node) : node;
      }
      function createImportSpecifier(isTypeOnly, propertyName, name) {
        var node = createBaseNode(269);
        node.isTypeOnly = isTypeOnly;
        node.propertyName = propertyName;
        node.name = name;
        node.transformFlags |= propagateChildFlags(node.propertyName) | propagateChildFlags(node.name);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateImportSpecifier(node, isTypeOnly, propertyName, name) {
        return node.isTypeOnly !== isTypeOnly || node.propertyName !== propertyName || node.name !== name ? update(createImportSpecifier(isTypeOnly, propertyName, name), node) : node;
      }
      function createExportAssignment(decorators, modifiers, isExportEquals, expression) {
        var node = createBaseDeclaration(270, decorators, modifiers);
        node.isExportEquals = isExportEquals;
        node.expression = isExportEquals ? parenthesizerRules().parenthesizeRightSideOfBinary(63, void 0, expression) : parenthesizerRules().parenthesizeExpressionOfExportDefault(expression);
        node.transformFlags |= propagateChildFlags(node.expression);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateExportAssignment(node, decorators, modifiers, expression) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.expression !== expression ? update(createExportAssignment(decorators, modifiers, node.isExportEquals, expression), node) : node;
      }
      function createExportDeclaration(decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier, assertClause) {
        var node = createBaseDeclaration(271, decorators, modifiers);
        node.isTypeOnly = isTypeOnly;
        node.exportClause = exportClause;
        node.moduleSpecifier = moduleSpecifier;
        node.assertClause = assertClause;
        node.transformFlags |= propagateChildFlags(node.exportClause) | propagateChildFlags(node.moduleSpecifier);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateExportDeclaration(node, decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier, assertClause) {
        return node.decorators !== decorators || node.modifiers !== modifiers || node.isTypeOnly !== isTypeOnly || node.exportClause !== exportClause || node.moduleSpecifier !== moduleSpecifier || node.assertClause !== assertClause ? update(createExportDeclaration(decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier, assertClause), node) : node;
      }
      function createNamedExports(elements) {
        var node = createBaseNode(272);
        node.elements = createNodeArray(elements);
        node.transformFlags |= propagateChildrenFlags(node.elements);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateNamedExports(node, elements) {
        return node.elements !== elements ? update(createNamedExports(elements), node) : node;
      }
      function createExportSpecifier(isTypeOnly, propertyName, name) {
        var node = createBaseNode(274);
        node.isTypeOnly = isTypeOnly;
        node.propertyName = asName(propertyName);
        node.name = asName(name);
        node.transformFlags |= propagateChildFlags(node.propertyName) | propagateChildFlags(node.name);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateExportSpecifier(node, isTypeOnly, propertyName, name) {
        return node.isTypeOnly !== isTypeOnly || node.propertyName !== propertyName || node.name !== name ? update(createExportSpecifier(isTypeOnly, propertyName, name), node) : node;
      }
      function createMissingDeclaration() {
        var node = createBaseDeclaration(275, void 0, void 0);
        return node;
      }
      function createExternalModuleReference(expression) {
        var node = createBaseNode(276);
        node.expression = expression;
        node.transformFlags |= propagateChildFlags(node.expression);
        node.transformFlags &= ~16777216;
        return node;
      }
      function updateExternalModuleReference(node, expression) {
        return node.expression !== expression ? update(createExternalModuleReference(expression), node) : node;
      }
      function createJSDocPrimaryTypeWorker(kind) {
        return createBaseNode(kind);
      }
      function createJSDocUnaryTypeWorker(kind, type) {
        var node = createBaseNode(kind);
        node.type = type;
        return node;
      }
      function updateJSDocUnaryTypeWorker(kind, node, type) {
        return node.type !== type ? update(createJSDocUnaryTypeWorker(kind, type), node) : node;
      }
      function createJSDocFunctionType(parameters, type) {
        var node = createBaseSignatureDeclaration(315, void 0, void 0, void 0, void 0, parameters, type);
        return node;
      }
      function updateJSDocFunctionType(node, parameters, type) {
        return node.parameters !== parameters || node.type !== type ? update(createJSDocFunctionType(parameters, type), node) : node;
      }
      function createJSDocTypeLiteral(propertyTags, isArrayType) {
        if (isArrayType === void 0) {
          isArrayType = false;
        }
        var node = createBaseNode(320);
        node.jsDocPropertyTags = asNodeArray(propertyTags);
        node.isArrayType = isArrayType;
        return node;
      }
      function updateJSDocTypeLiteral(node, propertyTags, isArrayType) {
        return node.jsDocPropertyTags !== propertyTags || node.isArrayType !== isArrayType ? update(createJSDocTypeLiteral(propertyTags, isArrayType), node) : node;
      }
      function createJSDocTypeExpression(type) {
        var node = createBaseNode(307);
        node.type = type;
        return node;
      }
      function updateJSDocTypeExpression(node, type) {
        return node.type !== type ? update(createJSDocTypeExpression(type), node) : node;
      }
      function createJSDocSignature(typeParameters, parameters, type) {
        var node = createBaseNode(321);
        node.typeParameters = asNodeArray(typeParameters);
        node.parameters = createNodeArray(parameters);
        node.type = type;
        return node;
      }
      function updateJSDocSignature(node, typeParameters, parameters, type) {
        return node.typeParameters !== typeParameters || node.parameters !== parameters || node.type !== type ? update(createJSDocSignature(typeParameters, parameters, type), node) : node;
      }
      function getDefaultTagName(node) {
        var defaultTagName = getDefaultTagNameForKind(node.kind);
        return node.tagName.escapedText === ts2.escapeLeadingUnderscores(defaultTagName) ? node.tagName : createIdentifier(defaultTagName);
      }
      function createBaseJSDocTag(kind, tagName, comment) {
        var node = createBaseNode(kind);
        node.tagName = tagName;
        node.comment = comment;
        return node;
      }
      function createJSDocTemplateTag(tagName, constraint, typeParameters, comment) {
        var node = createBaseJSDocTag(342, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("template"), comment);
        node.constraint = constraint;
        node.typeParameters = createNodeArray(typeParameters);
        return node;
      }
      function updateJSDocTemplateTag(node, tagName, constraint, typeParameters, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.constraint !== constraint || node.typeParameters !== typeParameters || node.comment !== comment ? update(createJSDocTemplateTag(tagName, constraint, typeParameters, comment), node) : node;
      }
      function createJSDocTypedefTag(tagName, typeExpression, fullName, comment) {
        var node = createBaseJSDocTag(343, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("typedef"), comment);
        node.typeExpression = typeExpression;
        node.fullName = fullName;
        node.name = ts2.getJSDocTypeAliasName(fullName);
        return node;
      }
      function updateJSDocTypedefTag(node, tagName, typeExpression, fullName, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.typeExpression !== typeExpression || node.fullName !== fullName || node.comment !== comment ? update(createJSDocTypedefTag(tagName, typeExpression, fullName, comment), node) : node;
      }
      function createJSDocParameterTag(tagName, name, isBracketed, typeExpression, isNameFirst, comment) {
        var node = createBaseJSDocTag(338, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("param"), comment);
        node.typeExpression = typeExpression;
        node.name = name;
        node.isNameFirst = !!isNameFirst;
        node.isBracketed = isBracketed;
        return node;
      }
      function updateJSDocParameterTag(node, tagName, name, isBracketed, typeExpression, isNameFirst, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.name !== name || node.isBracketed !== isBracketed || node.typeExpression !== typeExpression || node.isNameFirst !== isNameFirst || node.comment !== comment ? update(createJSDocParameterTag(tagName, name, isBracketed, typeExpression, isNameFirst, comment), node) : node;
      }
      function createJSDocPropertyTag(tagName, name, isBracketed, typeExpression, isNameFirst, comment) {
        var node = createBaseJSDocTag(345, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("prop"), comment);
        node.typeExpression = typeExpression;
        node.name = name;
        node.isNameFirst = !!isNameFirst;
        node.isBracketed = isBracketed;
        return node;
      }
      function updateJSDocPropertyTag(node, tagName, name, isBracketed, typeExpression, isNameFirst, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.name !== name || node.isBracketed !== isBracketed || node.typeExpression !== typeExpression || node.isNameFirst !== isNameFirst || node.comment !== comment ? update(createJSDocPropertyTag(tagName, name, isBracketed, typeExpression, isNameFirst, comment), node) : node;
      }
      function createJSDocCallbackTag(tagName, typeExpression, fullName, comment) {
        var node = createBaseJSDocTag(336, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("callback"), comment);
        node.typeExpression = typeExpression;
        node.fullName = fullName;
        node.name = ts2.getJSDocTypeAliasName(fullName);
        return node;
      }
      function updateJSDocCallbackTag(node, tagName, typeExpression, fullName, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.typeExpression !== typeExpression || node.fullName !== fullName || node.comment !== comment ? update(createJSDocCallbackTag(tagName, typeExpression, fullName, comment), node) : node;
      }
      function createJSDocAugmentsTag(tagName, className, comment) {
        var node = createBaseJSDocTag(326, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("augments"), comment);
        node.class = className;
        return node;
      }
      function updateJSDocAugmentsTag(node, tagName, className, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.class !== className || node.comment !== comment ? update(createJSDocAugmentsTag(tagName, className, comment), node) : node;
      }
      function createJSDocImplementsTag(tagName, className, comment) {
        var node = createBaseJSDocTag(327, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("implements"), comment);
        node.class = className;
        return node;
      }
      function createJSDocSeeTag(tagName, name, comment) {
        var node = createBaseJSDocTag(344, tagName !== null && tagName !== void 0 ? tagName : createIdentifier("see"), comment);
        node.name = name;
        return node;
      }
      function updateJSDocSeeTag(node, tagName, name, comment) {
        return node.tagName !== tagName || node.name !== name || node.comment !== comment ? update(createJSDocSeeTag(tagName, name, comment), node) : node;
      }
      function createJSDocNameReference(name) {
        var node = createBaseNode(308);
        node.name = name;
        return node;
      }
      function updateJSDocNameReference(node, name) {
        return node.name !== name ? update(createJSDocNameReference(name), node) : node;
      }
      function createJSDocMemberName(left, right) {
        var node = createBaseNode(309);
        node.left = left;
        node.right = right;
        node.transformFlags |= propagateChildFlags(node.left) | propagateChildFlags(node.right);
        return node;
      }
      function updateJSDocMemberName(node, left, right) {
        return node.left !== left || node.right !== right ? update(createJSDocMemberName(left, right), node) : node;
      }
      function createJSDocLink(name, text) {
        var node = createBaseNode(322);
        node.name = name;
        node.text = text;
        return node;
      }
      function updateJSDocLink(node, name, text) {
        return node.name !== name ? update(createJSDocLink(name, text), node) : node;
      }
      function createJSDocLinkCode(name, text) {
        var node = createBaseNode(323);
        node.name = name;
        node.text = text;
        return node;
      }
      function updateJSDocLinkCode(node, name, text) {
        return node.name !== name ? update(createJSDocLinkCode(name, text), node) : node;
      }
      function createJSDocLinkPlain(name, text) {
        var node = createBaseNode(324);
        node.name = name;
        node.text = text;
        return node;
      }
      function updateJSDocLinkPlain(node, name, text) {
        return node.name !== name ? update(createJSDocLinkPlain(name, text), node) : node;
      }
      function updateJSDocImplementsTag(node, tagName, className, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.class !== className || node.comment !== comment ? update(createJSDocImplementsTag(tagName, className, comment), node) : node;
      }
      function createJSDocSimpleTagWorker(kind, tagName, comment) {
        var node = createBaseJSDocTag(kind, tagName !== null && tagName !== void 0 ? tagName : createIdentifier(getDefaultTagNameForKind(kind)), comment);
        return node;
      }
      function updateJSDocSimpleTagWorker(kind, node, tagName, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.comment !== comment ? update(createJSDocSimpleTagWorker(kind, tagName, comment), node) : node;
      }
      function createJSDocTypeLikeTagWorker(kind, tagName, typeExpression, comment) {
        var node = createBaseJSDocTag(kind, tagName !== null && tagName !== void 0 ? tagName : createIdentifier(getDefaultTagNameForKind(kind)), comment);
        node.typeExpression = typeExpression;
        return node;
      }
      function updateJSDocTypeLikeTagWorker(kind, node, tagName, typeExpression, comment) {
        if (tagName === void 0) {
          tagName = getDefaultTagName(node);
        }
        return node.tagName !== tagName || node.typeExpression !== typeExpression || node.comment !== comment ? update(createJSDocTypeLikeTagWorker(kind, tagName, typeExpression, comment), node) : node;
      }
      function createJSDocUnknownTag(tagName, comment) {
        var node = createBaseJSDocTag(325, tagName, comment);
        return node;
      }
      function updateJSDocUnknownTag(node, tagName, comment) {
        return node.tagName !== tagName || node.comment !== comment ? update(createJSDocUnknownTag(tagName, comment), node) : node;
      }
      function createJSDocText(text) {
        var node = createBaseNode(319);
        node.text = text;
        return node;
      }
      function updateJSDocText(node, text) {
        return node.text !== text ? update(createJSDocText(text), node) : node;
      }
      function createJSDocComment(comment, tags) {
        var node = createBaseNode(318);
        node.comment = comment;
        node.tags = asNodeArray(tags);
        return node;
      }
      function updateJSDocComment(node, comment, tags) {
        return node.comment !== comment || node.tags !== tags ? update(createJSDocComment(comment, tags), node) : node;
      }
      function createJsxElement(openingElement, children, closingElement) {
        var node = createBaseNode(277);
        node.openingElement = openingElement;
        node.children = createNodeArray(children);
        node.closingElement = closingElement;
        node.transformFlags |= propagateChildFlags(node.openingElement) | propagateChildrenFlags(node.children) | propagateChildFlags(node.closingElement) | 2;
        return node;
      }
      function updateJsxElement(node, openingElement, children, closingElement) {
        return node.openingElement !== openingElement || node.children !== children || node.closingElement !== closingElement ? update(createJsxElement(openingElement, children, closingElement), node) : node;
      }
      function createJsxSelfClosingElement(tagName, typeArguments, attributes) {
        var node = createBaseNode(278);
        node.tagName = tagName;
        node.typeArguments = asNodeArray(typeArguments);
        node.attributes = attributes;
        node.transformFlags |= propagateChildFlags(node.tagName) | propagateChildrenFlags(node.typeArguments) | propagateChildFlags(node.attributes) | 2;
        if (node.typeArguments) {
          node.transformFlags |= 1;
        }
        return node;
      }
      function updateJsxSelfClosingElement(node, tagName, typeArguments, attributes) {
        return node.tagName !== tagName || node.typeArguments !== typeArguments || node.attributes !== attributes ? update(createJsxSelfClosingElement(tagName, typeArguments, attributes), node) : node;
      }
      function createJsxOpeningElement(tagName, typeArguments, attributes) {
        var node = createBaseNode(279);
        node.tagName = tagName;
        node.typeArguments = asNodeArray(typeArguments);
        node.attributes = attributes;
        node.transformFlags |= propagateChildFlags(node.tagName) | propagateChildrenFlags(node.typeArguments) | propagateChildFlags(node.attributes) | 2;
        if (typeArguments) {
          node.transformFlags |= 1;
        }
        return node;
      }
      function updateJsxOpeningElement(node, tagName, typeArguments, attributes) {
        return node.tagName !== tagName || node.typeArguments !== typeArguments || node.attributes !== attributes ? update(createJsxOpeningElement(tagName, typeArguments, attributes), node) : node;
      }
      function createJsxClosingElement(tagName) {
        var node = createBaseNode(280);
        node.tagName = tagName;
        node.transformFlags |= propagateChildFlags(node.tagName) | 2;
        return node;
      }
      function updateJsxClosingElement(node, tagName) {
        return node.tagName !== tagName ? update(createJsxClosingElement(tagName), node) : node;
      }
      function createJsxFragment(openingFragment, children, closingFragment) {
        var node = createBaseNode(281);
        node.openingFragment = openingFragment;
        node.children = createNodeArray(children);
        node.closingFragment = closingFragment;
        node.transformFlags |= propagateChildFlags(node.openingFragment) | propagateChildrenFlags(node.children) | propagateChildFlags(node.closingFragment) | 2;
        return node;
      }
      function updateJsxFragment(node, openingFragment, children, closingFragment) {
        return node.openingFragment !== openingFragment || node.children !== children || node.closingFragment !== closingFragment ? update(createJsxFragment(openingFragment, children, closingFragment), node) : node;
      }
      function createJsxText(text, containsOnlyTriviaWhiteSpaces) {
        var node = createBaseNode(11);
        node.text = text;
        node.containsOnlyTriviaWhiteSpaces = !!containsOnlyTriviaWhiteSpaces;
        node.transformFlags |= 2;
        return node;
      }
      function updateJsxText(node, text, containsOnlyTriviaWhiteSpaces) {
        return node.text !== text || node.containsOnlyTriviaWhiteSpaces !== containsOnlyTriviaWhiteSpaces ? update(createJsxText(text, containsOnlyTriviaWhiteSpaces), node) : node;
      }
      function createJsxOpeningFragment() {
        var node = createBaseNode(282);
        node.transformFlags |= 2;
        return node;
      }
      function createJsxJsxClosingFragment() {
        var node = createBaseNode(283);
        node.transformFlags |= 2;
        return node;
      }
      function createJsxAttribute(name, initializer) {
        var node = createBaseNode(284);
        node.name = name;
        node.initializer = initializer;
        node.transformFlags |= propagateChildFlags(node.name) | propagateChildFlags(node.initializer) | 2;
        return node;
      }
      function updateJsxAttribute(node, name, initializer) {
        return node.name !== name || node.initializer !== initializer ? update(createJsxAttribute(name, initializer), node) : node;
      }
      function createJsxAttributes(properties) {
        var node = createBaseNode(285);
        node.properties = createNodeArray(properties);
        node.transformFlags |= propagateChildrenFlags(node.properties) | 2;
        return node;
      }
      function updateJsxAttributes(node, properties) {
        return node.properties !== properties ? update(createJsxAttributes(properties), node) : node;
      }
      function createJsxSpreadAttribute(expression) {
        var node = createBaseNode(286);
        node.expression = expression;
        node.transformFlags |= propagateChildFlags(node.expression) | 2;
        return node;
      }
      function updateJsxSpreadAttribute(node, expression) {
        return node.expression !== expression ? update(createJsxSpreadAttribute(expression), node) : node;
      }
      function createJsxExpression(dotDotDotToken, expression) {
        var node = createBaseNode(287);
        node.dotDotDotToken = dotDotDotToken;
        node.expression = expression;
        node.transformFlags |= propagateChildFlags(node.dotDotDotToken) | propagateChildFlags(node.expression) | 2;
        return node;
      }
      function updateJsxExpression(node, expression) {
        return node.expression !== expression ? update(createJsxExpression(node.dotDotDotToken, expression), node) : node;
      }
      function createCaseClause(expression, statements) {
        var node = createBaseNode(288);
        node.expression = parenthesizerRules().parenthesizeExpressionForDisallowedComma(expression);
        node.statements = createNodeArray(statements);
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildrenFlags(node.statements);
        return node;
      }
      function updateCaseClause(node, expression, statements) {
        return node.expression !== expression || node.statements !== statements ? update(createCaseClause(expression, statements), node) : node;
      }
      function createDefaultClause(statements) {
        var node = createBaseNode(289);
        node.statements = createNodeArray(statements);
        node.transformFlags = propagateChildrenFlags(node.statements);
        return node;
      }
      function updateDefaultClause(node, statements) {
        return node.statements !== statements ? update(createDefaultClause(statements), node) : node;
      }
      function createHeritageClause(token, types) {
        var node = createBaseNode(290);
        node.token = token;
        node.types = createNodeArray(types);
        node.transformFlags |= propagateChildrenFlags(node.types);
        switch (token) {
          case 94:
            node.transformFlags |= 512;
            break;
          case 117:
            node.transformFlags |= 1;
            break;
          default:
            return ts2.Debug.assertNever(token);
        }
        return node;
      }
      function updateHeritageClause(node, types) {
        return node.types !== types ? update(createHeritageClause(node.token, types), node) : node;
      }
      function createCatchClause(variableDeclaration, block) {
        var node = createBaseNode(291);
        if (typeof variableDeclaration === "string" || variableDeclaration && !ts2.isVariableDeclaration(variableDeclaration)) {
          variableDeclaration = createVariableDeclaration(variableDeclaration, void 0, void 0, void 0);
        }
        node.variableDeclaration = variableDeclaration;
        node.block = block;
        node.transformFlags |= propagateChildFlags(node.variableDeclaration) | propagateChildFlags(node.block);
        if (!variableDeclaration)
          node.transformFlags |= 32;
        return node;
      }
      function updateCatchClause(node, variableDeclaration, block) {
        return node.variableDeclaration !== variableDeclaration || node.block !== block ? update(createCatchClause(variableDeclaration, block), node) : node;
      }
      function createPropertyAssignment(name, initializer) {
        var node = createBaseNamedDeclaration(294, void 0, void 0, name);
        node.initializer = parenthesizerRules().parenthesizeExpressionForDisallowedComma(initializer);
        node.transformFlags |= propagateChildFlags(node.name) | propagateChildFlags(node.initializer);
        return node;
      }
      function finishUpdatePropertyAssignment(updated, original) {
        if (original.decorators)
          updated.decorators = original.decorators;
        if (original.modifiers)
          updated.modifiers = original.modifiers;
        if (original.questionToken)
          updated.questionToken = original.questionToken;
        if (original.exclamationToken)
          updated.exclamationToken = original.exclamationToken;
        return update(updated, original);
      }
      function updatePropertyAssignment(node, name, initializer) {
        return node.name !== name || node.initializer !== initializer ? finishUpdatePropertyAssignment(createPropertyAssignment(name, initializer), node) : node;
      }
      function createShorthandPropertyAssignment(name, objectAssignmentInitializer) {
        var node = createBaseNamedDeclaration(295, void 0, void 0, name);
        node.objectAssignmentInitializer = objectAssignmentInitializer && parenthesizerRules().parenthesizeExpressionForDisallowedComma(objectAssignmentInitializer);
        node.transformFlags |= propagateChildFlags(node.objectAssignmentInitializer) | 512;
        return node;
      }
      function finishUpdateShorthandPropertyAssignment(updated, original) {
        if (original.decorators)
          updated.decorators = original.decorators;
        if (original.modifiers)
          updated.modifiers = original.modifiers;
        if (original.equalsToken)
          updated.equalsToken = original.equalsToken;
        if (original.questionToken)
          updated.questionToken = original.questionToken;
        if (original.exclamationToken)
          updated.exclamationToken = original.exclamationToken;
        return update(updated, original);
      }
      function updateShorthandPropertyAssignment(node, name, objectAssignmentInitializer) {
        return node.name !== name || node.objectAssignmentInitializer !== objectAssignmentInitializer ? finishUpdateShorthandPropertyAssignment(createShorthandPropertyAssignment(name, objectAssignmentInitializer), node) : node;
      }
      function createSpreadAssignment(expression) {
        var node = createBaseNode(296);
        node.expression = parenthesizerRules().parenthesizeExpressionForDisallowedComma(expression);
        node.transformFlags |= propagateChildFlags(node.expression) | 64 | 32768;
        return node;
      }
      function updateSpreadAssignment(node, expression) {
        return node.expression !== expression ? update(createSpreadAssignment(expression), node) : node;
      }
      function createEnumMember(name, initializer) {
        var node = createBaseNode(297);
        node.name = asName(name);
        node.initializer = initializer && parenthesizerRules().parenthesizeExpressionForDisallowedComma(initializer);
        node.transformFlags |= propagateChildFlags(node.name) | propagateChildFlags(node.initializer) | 1;
        return node;
      }
      function updateEnumMember(node, name, initializer) {
        return node.name !== name || node.initializer !== initializer ? update(createEnumMember(name, initializer), node) : node;
      }
      function createSourceFile(statements, endOfFileToken, flags2) {
        var node = baseFactory2.createBaseSourceFileNode(303);
        node.statements = createNodeArray(statements);
        node.endOfFileToken = endOfFileToken;
        node.flags |= flags2;
        node.fileName = "";
        node.text = "";
        node.languageVersion = 0;
        node.languageVariant = 0;
        node.scriptKind = 0;
        node.isDeclarationFile = false;
        node.hasNoDefaultLib = false;
        node.transformFlags |= propagateChildrenFlags(node.statements) | propagateChildFlags(node.endOfFileToken);
        return node;
      }
      function cloneSourceFileWithChanges(source, statements, isDeclarationFile, referencedFiles, typeReferences, hasNoDefaultLib, libReferences) {
        var node = baseFactory2.createBaseSourceFileNode(303);
        for (var p in source) {
          if (p === "emitNode" || ts2.hasProperty(node, p) || !ts2.hasProperty(source, p))
            continue;
          node[p] = source[p];
        }
        node.flags |= source.flags;
        node.statements = createNodeArray(statements);
        node.endOfFileToken = source.endOfFileToken;
        node.isDeclarationFile = isDeclarationFile;
        node.referencedFiles = referencedFiles;
        node.typeReferenceDirectives = typeReferences;
        node.hasNoDefaultLib = hasNoDefaultLib;
        node.libReferenceDirectives = libReferences;
        node.transformFlags = propagateChildrenFlags(node.statements) | propagateChildFlags(node.endOfFileToken);
        node.impliedNodeFormat = source.impliedNodeFormat;
        return node;
      }
      function updateSourceFile(node, statements, isDeclarationFile, referencedFiles, typeReferenceDirectives, hasNoDefaultLib, libReferenceDirectives) {
        if (isDeclarationFile === void 0) {
          isDeclarationFile = node.isDeclarationFile;
        }
        if (referencedFiles === void 0) {
          referencedFiles = node.referencedFiles;
        }
        if (typeReferenceDirectives === void 0) {
          typeReferenceDirectives = node.typeReferenceDirectives;
        }
        if (hasNoDefaultLib === void 0) {
          hasNoDefaultLib = node.hasNoDefaultLib;
        }
        if (libReferenceDirectives === void 0) {
          libReferenceDirectives = node.libReferenceDirectives;
        }
        return node.statements !== statements || node.isDeclarationFile !== isDeclarationFile || node.referencedFiles !== referencedFiles || node.typeReferenceDirectives !== typeReferenceDirectives || node.hasNoDefaultLib !== hasNoDefaultLib || node.libReferenceDirectives !== libReferenceDirectives ? update(cloneSourceFileWithChanges(node, statements, isDeclarationFile, referencedFiles, typeReferenceDirectives, hasNoDefaultLib, libReferenceDirectives), node) : node;
      }
      function createBundle(sourceFiles, prepends) {
        if (prepends === void 0) {
          prepends = ts2.emptyArray;
        }
        var node = createBaseNode(304);
        node.prepends = prepends;
        node.sourceFiles = sourceFiles;
        return node;
      }
      function updateBundle(node, sourceFiles, prepends) {
        if (prepends === void 0) {
          prepends = ts2.emptyArray;
        }
        return node.sourceFiles !== sourceFiles || node.prepends !== prepends ? update(createBundle(sourceFiles, prepends), node) : node;
      }
      function createUnparsedSource(prologues, syntheticReferences, texts) {
        var node = createBaseNode(305);
        node.prologues = prologues;
        node.syntheticReferences = syntheticReferences;
        node.texts = texts;
        node.fileName = "";
        node.text = "";
        node.referencedFiles = ts2.emptyArray;
        node.libReferenceDirectives = ts2.emptyArray;
        node.getLineAndCharacterOfPosition = function(pos) {
          return ts2.getLineAndCharacterOfPosition(node, pos);
        };
        return node;
      }
      function createBaseUnparsedNode(kind, data) {
        var node = createBaseNode(kind);
        node.data = data;
        return node;
      }
      function createUnparsedPrologue(data) {
        return createBaseUnparsedNode(298, data);
      }
      function createUnparsedPrepend(data, texts) {
        var node = createBaseUnparsedNode(299, data);
        node.texts = texts;
        return node;
      }
      function createUnparsedTextLike(data, internal) {
        return createBaseUnparsedNode(internal ? 301 : 300, data);
      }
      function createUnparsedSyntheticReference(section) {
        var node = createBaseNode(302);
        node.data = section.data;
        node.section = section;
        return node;
      }
      function createInputFiles2() {
        var node = createBaseNode(306);
        node.javascriptText = "";
        node.declarationText = "";
        return node;
      }
      function createSyntheticExpression(type, isSpread, tupleNameSource) {
        if (isSpread === void 0) {
          isSpread = false;
        }
        var node = createBaseNode(231);
        node.type = type;
        node.isSpread = isSpread;
        node.tupleNameSource = tupleNameSource;
        return node;
      }
      function createSyntaxList(children) {
        var node = createBaseNode(346);
        node._children = children;
        return node;
      }
      function createNotEmittedStatement(original) {
        var node = createBaseNode(347);
        node.original = original;
        ts2.setTextRange(node, original);
        return node;
      }
      function createPartiallyEmittedExpression(expression, original) {
        var node = createBaseNode(348);
        node.expression = expression;
        node.original = original;
        node.transformFlags |= propagateChildFlags(node.expression) | 1;
        ts2.setTextRange(node, original);
        return node;
      }
      function updatePartiallyEmittedExpression(node, expression) {
        return node.expression !== expression ? update(createPartiallyEmittedExpression(expression, node.original), node) : node;
      }
      function flattenCommaElements(node) {
        if (ts2.nodeIsSynthesized(node) && !ts2.isParseTreeNode(node) && !node.original && !node.emitNode && !node.id) {
          if (ts2.isCommaListExpression(node)) {
            return node.elements;
          }
          if (ts2.isBinaryExpression(node) && ts2.isCommaToken(node.operatorToken)) {
            return [node.left, node.right];
          }
        }
        return node;
      }
      function createCommaListExpression(elements) {
        var node = createBaseNode(349);
        node.elements = createNodeArray(ts2.sameFlatMap(elements, flattenCommaElements));
        node.transformFlags |= propagateChildrenFlags(node.elements);
        return node;
      }
      function updateCommaListExpression(node, elements) {
        return node.elements !== elements ? update(createCommaListExpression(elements), node) : node;
      }
      function createEndOfDeclarationMarker(original) {
        var node = createBaseNode(351);
        node.emitNode = {};
        node.original = original;
        return node;
      }
      function createMergeDeclarationMarker(original) {
        var node = createBaseNode(350);
        node.emitNode = {};
        node.original = original;
        return node;
      }
      function createSyntheticReferenceExpression(expression, thisArg) {
        var node = createBaseNode(352);
        node.expression = expression;
        node.thisArg = thisArg;
        node.transformFlags |= propagateChildFlags(node.expression) | propagateChildFlags(node.thisArg);
        return node;
      }
      function updateSyntheticReferenceExpression(node, expression, thisArg) {
        return node.expression !== expression || node.thisArg !== thisArg ? update(createSyntheticReferenceExpression(expression, thisArg), node) : node;
      }
      function cloneNode(node) {
        if (node === void 0) {
          return node;
        }
        var clone = ts2.isSourceFile(node) ? baseFactory2.createBaseSourceFileNode(303) : ts2.isIdentifier(node) ? baseFactory2.createBaseIdentifierNode(79) : ts2.isPrivateIdentifier(node) ? baseFactory2.createBasePrivateIdentifierNode(80) : !ts2.isNodeKind(node.kind) ? baseFactory2.createBaseTokenNode(node.kind) : baseFactory2.createBaseNode(node.kind);
        clone.flags |= node.flags & ~8;
        clone.transformFlags = node.transformFlags;
        setOriginalNode(clone, node);
        for (var key in node) {
          if (clone.hasOwnProperty(key) || !node.hasOwnProperty(key)) {
            continue;
          }
          clone[key] = node[key];
        }
        return clone;
      }
      function createImmediatelyInvokedFunctionExpression(statements, param, paramValue) {
        return createCallExpression(createFunctionExpression(void 0, void 0, void 0, void 0, param ? [param] : [], void 0, createBlock(statements, true)), void 0, paramValue ? [paramValue] : []);
      }
      function createImmediatelyInvokedArrowFunction(statements, param, paramValue) {
        return createCallExpression(createArrowFunction(void 0, void 0, param ? [param] : [], void 0, void 0, createBlock(statements, true)), void 0, paramValue ? [paramValue] : []);
      }
      function createVoidZero() {
        return createVoidExpression(createNumericLiteral("0"));
      }
      function createExportDefault(expression) {
        return createExportAssignment(void 0, void 0, false, expression);
      }
      function createExternalModuleExport(exportName) {
        return createExportDeclaration(void 0, void 0, false, createNamedExports([
          createExportSpecifier(false, void 0, exportName)
        ]));
      }
      function createTypeCheck(value, tag) {
        return tag === "undefined" ? factory.createStrictEquality(value, createVoidZero()) : factory.createStrictEquality(createTypeOfExpression(value), createStringLiteral(tag));
      }
      function createMethodCall(object, methodName, argumentsList) {
        if (ts2.isCallChain(object)) {
          return createCallChain(createPropertyAccessChain(object, void 0, methodName), void 0, void 0, argumentsList);
        }
        return createCallExpression(createPropertyAccessExpression(object, methodName), void 0, argumentsList);
      }
      function createFunctionBindCall(target, thisArg, argumentsList) {
        return createMethodCall(target, "bind", __spreadArray([thisArg], argumentsList, true));
      }
      function createFunctionCallCall(target, thisArg, argumentsList) {
        return createMethodCall(target, "call", __spreadArray([thisArg], argumentsList, true));
      }
      function createFunctionApplyCall(target, thisArg, argumentsExpression) {
        return createMethodCall(target, "apply", [thisArg, argumentsExpression]);
      }
      function createGlobalMethodCall(globalObjectName, methodName, argumentsList) {
        return createMethodCall(createIdentifier(globalObjectName), methodName, argumentsList);
      }
      function createArraySliceCall(array, start) {
        return createMethodCall(array, "slice", start === void 0 ? [] : [asExpression(start)]);
      }
      function createArrayConcatCall(array, argumentsList) {
        return createMethodCall(array, "concat", argumentsList);
      }
      function createObjectDefinePropertyCall(target, propertyName, attributes) {
        return createGlobalMethodCall("Object", "defineProperty", [target, asExpression(propertyName), attributes]);
      }
      function createReflectGetCall(target, propertyKey, receiver) {
        return createGlobalMethodCall("Reflect", "get", receiver ? [target, propertyKey, receiver] : [target, propertyKey]);
      }
      function createReflectSetCall(target, propertyKey, value, receiver) {
        return createGlobalMethodCall("Reflect", "set", receiver ? [target, propertyKey, value, receiver] : [target, propertyKey, value]);
      }
      function tryAddPropertyAssignment(properties, propertyName, expression) {
        if (expression) {
          properties.push(createPropertyAssignment(propertyName, expression));
          return true;
        }
        return false;
      }
      function createPropertyDescriptor(attributes, singleLine) {
        var properties = [];
        tryAddPropertyAssignment(properties, "enumerable", asExpression(attributes.enumerable));
        tryAddPropertyAssignment(properties, "configurable", asExpression(attributes.configurable));
        var isData = tryAddPropertyAssignment(properties, "writable", asExpression(attributes.writable));
        isData = tryAddPropertyAssignment(properties, "value", attributes.value) || isData;
        var isAccessor = tryAddPropertyAssignment(properties, "get", attributes.get);
        isAccessor = tryAddPropertyAssignment(properties, "set", attributes.set) || isAccessor;
        ts2.Debug.assert(!(isData && isAccessor), "A PropertyDescriptor may not be both an accessor descriptor and a data descriptor.");
        return createObjectLiteralExpression(properties, !singleLine);
      }
      function updateOuterExpression(outerExpression, expression) {
        switch (outerExpression.kind) {
          case 211:
            return updateParenthesizedExpression(outerExpression, expression);
          case 210:
            return updateTypeAssertion(outerExpression, outerExpression.type, expression);
          case 228:
            return updateAsExpression(outerExpression, expression, outerExpression.type);
          case 229:
            return updateNonNullExpression(outerExpression, expression);
          case 348:
            return updatePartiallyEmittedExpression(outerExpression, expression);
        }
      }
      function isIgnorableParen(node) {
        return ts2.isParenthesizedExpression(node) && ts2.nodeIsSynthesized(node) && ts2.nodeIsSynthesized(ts2.getSourceMapRange(node)) && ts2.nodeIsSynthesized(ts2.getCommentRange(node)) && !ts2.some(ts2.getSyntheticLeadingComments(node)) && !ts2.some(ts2.getSyntheticTrailingComments(node));
      }
      function restoreOuterExpressions(outerExpression, innerExpression, kinds) {
        if (kinds === void 0) {
          kinds = 15;
        }
        if (outerExpression && ts2.isOuterExpression(outerExpression, kinds) && !isIgnorableParen(outerExpression)) {
          return updateOuterExpression(outerExpression, restoreOuterExpressions(outerExpression.expression, innerExpression));
        }
        return innerExpression;
      }
      function restoreEnclosingLabel(node, outermostLabeledStatement, afterRestoreLabelCallback) {
        if (!outermostLabeledStatement) {
          return node;
        }
        var updated = updateLabeledStatement(outermostLabeledStatement, outermostLabeledStatement.label, ts2.isLabeledStatement(outermostLabeledStatement.statement) ? restoreEnclosingLabel(node, outermostLabeledStatement.statement) : node);
        if (afterRestoreLabelCallback) {
          afterRestoreLabelCallback(outermostLabeledStatement);
        }
        return updated;
      }
      function shouldBeCapturedInTempVariable(node, cacheIdentifiers) {
        var target = ts2.skipParentheses(node);
        switch (target.kind) {
          case 79:
            return cacheIdentifiers;
          case 108:
          case 8:
          case 9:
          case 10:
            return false;
          case 203:
            var elements = target.elements;
            if (elements.length === 0) {
              return false;
            }
            return true;
          case 204:
            return target.properties.length > 0;
          default:
            return true;
        }
      }
      function createCallBinding(expression, recordTempVariable, languageVersion, cacheIdentifiers) {
        if (cacheIdentifiers === void 0) {
          cacheIdentifiers = false;
        }
        var callee = ts2.skipOuterExpressions(expression, 15);
        var thisArg;
        var target;
        if (ts2.isSuperProperty(callee)) {
          thisArg = createThis();
          target = callee;
        } else if (ts2.isSuperKeyword(callee)) {
          thisArg = createThis();
          target = languageVersion !== void 0 && languageVersion < 2 ? ts2.setTextRange(createIdentifier("_super"), callee) : callee;
        } else if (ts2.getEmitFlags(callee) & 4096) {
          thisArg = createVoidZero();
          target = parenthesizerRules().parenthesizeLeftSideOfAccess(callee);
        } else if (ts2.isPropertyAccessExpression(callee)) {
          if (shouldBeCapturedInTempVariable(callee.expression, cacheIdentifiers)) {
            thisArg = createTempVariable(recordTempVariable);
            target = createPropertyAccessExpression(ts2.setTextRange(factory.createAssignment(thisArg, callee.expression), callee.expression), callee.name);
            ts2.setTextRange(target, callee);
          } else {
            thisArg = callee.expression;
            target = callee;
          }
        } else if (ts2.isElementAccessExpression(callee)) {
          if (shouldBeCapturedInTempVariable(callee.expression, cacheIdentifiers)) {
            thisArg = createTempVariable(recordTempVariable);
            target = createElementAccessExpression(ts2.setTextRange(factory.createAssignment(thisArg, callee.expression), callee.expression), callee.argumentExpression);
            ts2.setTextRange(target, callee);
          } else {
            thisArg = callee.expression;
            target = callee;
          }
        } else {
          thisArg = createVoidZero();
          target = parenthesizerRules().parenthesizeLeftSideOfAccess(expression);
        }
        return { target, thisArg };
      }
      function createAssignmentTargetWrapper(paramName, expression) {
        return createPropertyAccessExpression(createParenthesizedExpression(createObjectLiteralExpression([
          createSetAccessorDeclaration(void 0, void 0, "value", [createParameterDeclaration(void 0, void 0, void 0, paramName, void 0, void 0, void 0)], createBlock([
            createExpressionStatement(expression)
          ]))
        ])), "value");
      }
      function inlineExpressions(expressions) {
        return expressions.length > 10 ? createCommaListExpression(expressions) : ts2.reduceLeft(expressions, factory.createComma);
      }
      function getName(node, allowComments, allowSourceMaps, emitFlags) {
        if (emitFlags === void 0) {
          emitFlags = 0;
        }
        var nodeName = ts2.getNameOfDeclaration(node);
        if (nodeName && ts2.isIdentifier(nodeName) && !ts2.isGeneratedIdentifier(nodeName)) {
          var name = ts2.setParent(ts2.setTextRange(cloneNode(nodeName), nodeName), nodeName.parent);
          emitFlags |= ts2.getEmitFlags(nodeName);
          if (!allowSourceMaps)
            emitFlags |= 48;
          if (!allowComments)
            emitFlags |= 1536;
          if (emitFlags)
            ts2.setEmitFlags(name, emitFlags);
          return name;
        }
        return getGeneratedNameForNode(node);
      }
      function getInternalName(node, allowComments, allowSourceMaps) {
        return getName(node, allowComments, allowSourceMaps, 16384 | 32768);
      }
      function getLocalName(node, allowComments, allowSourceMaps) {
        return getName(node, allowComments, allowSourceMaps, 16384);
      }
      function getExportName(node, allowComments, allowSourceMaps) {
        return getName(node, allowComments, allowSourceMaps, 8192);
      }
      function getDeclarationName(node, allowComments, allowSourceMaps) {
        return getName(node, allowComments, allowSourceMaps);
      }
      function getNamespaceMemberName(ns, name, allowComments, allowSourceMaps) {
        var qualifiedName = createPropertyAccessExpression(ns, ts2.nodeIsSynthesized(name) ? name : cloneNode(name));
        ts2.setTextRange(qualifiedName, name);
        var emitFlags = 0;
        if (!allowSourceMaps)
          emitFlags |= 48;
        if (!allowComments)
          emitFlags |= 1536;
        if (emitFlags)
          ts2.setEmitFlags(qualifiedName, emitFlags);
        return qualifiedName;
      }
      function getExternalModuleOrNamespaceExportName(ns, node, allowComments, allowSourceMaps) {
        if (ns && ts2.hasSyntacticModifier(node, 1)) {
          return getNamespaceMemberName(ns, getName(node), allowComments, allowSourceMaps);
        }
        return getExportName(node, allowComments, allowSourceMaps);
      }
      function copyPrologue(source, target, ensureUseStrict2, visitor) {
        var offset = copyStandardPrologue(source, target, ensureUseStrict2);
        return copyCustomPrologue(source, target, offset, visitor);
      }
      function isUseStrictPrologue(node) {
        return ts2.isStringLiteral(node.expression) && node.expression.text === "use strict";
      }
      function createUseStrictPrologue() {
        return ts2.startOnNewLine(createExpressionStatement(createStringLiteral("use strict")));
      }
      function copyStandardPrologue(source, target, ensureUseStrict2) {
        ts2.Debug.assert(target.length === 0, "Prologue directives should be at the first statement in the target statements array");
        var foundUseStrict = false;
        var statementOffset = 0;
        var numStatements = source.length;
        while (statementOffset < numStatements) {
          var statement = source[statementOffset];
          if (ts2.isPrologueDirective(statement)) {
            if (isUseStrictPrologue(statement)) {
              foundUseStrict = true;
            }
            target.push(statement);
          } else {
            break;
          }
          statementOffset++;
        }
        if (ensureUseStrict2 && !foundUseStrict) {
          target.push(createUseStrictPrologue());
        }
        return statementOffset;
      }
      function copyCustomPrologue(source, target, statementOffset, visitor, filter) {
        if (filter === void 0) {
          filter = ts2.returnTrue;
        }
        var numStatements = source.length;
        while (statementOffset !== void 0 && statementOffset < numStatements) {
          var statement = source[statementOffset];
          if (ts2.getEmitFlags(statement) & 1048576 && filter(statement)) {
            ts2.append(target, visitor ? ts2.visitNode(statement, visitor, ts2.isStatement) : statement);
          } else {
            break;
          }
          statementOffset++;
        }
        return statementOffset;
      }
      function ensureUseStrict(statements) {
        var foundUseStrict = ts2.findUseStrictPrologue(statements);
        if (!foundUseStrict) {
          return ts2.setTextRange(createNodeArray(__spreadArray([createUseStrictPrologue()], statements, true)), statements);
        }
        return statements;
      }
      function liftToBlock(nodes) {
        ts2.Debug.assert(ts2.every(nodes, ts2.isStatementOrBlock), "Cannot lift nodes to a Block.");
        return ts2.singleOrUndefined(nodes) || createBlock(nodes);
      }
      function findSpanEnd(array, test, start) {
        var i = start;
        while (i < array.length && test(array[i])) {
          i++;
        }
        return i;
      }
      function mergeLexicalEnvironment(statements, declarations) {
        if (!ts2.some(declarations)) {
          return statements;
        }
        var leftStandardPrologueEnd = findSpanEnd(statements, ts2.isPrologueDirective, 0);
        var leftHoistedFunctionsEnd = findSpanEnd(statements, ts2.isHoistedFunction, leftStandardPrologueEnd);
        var leftHoistedVariablesEnd = findSpanEnd(statements, ts2.isHoistedVariableStatement, leftHoistedFunctionsEnd);
        var rightStandardPrologueEnd = findSpanEnd(declarations, ts2.isPrologueDirective, 0);
        var rightHoistedFunctionsEnd = findSpanEnd(declarations, ts2.isHoistedFunction, rightStandardPrologueEnd);
        var rightHoistedVariablesEnd = findSpanEnd(declarations, ts2.isHoistedVariableStatement, rightHoistedFunctionsEnd);
        var rightCustomPrologueEnd = findSpanEnd(declarations, ts2.isCustomPrologue, rightHoistedVariablesEnd);
        ts2.Debug.assert(rightCustomPrologueEnd === declarations.length, "Expected declarations to be valid standard or custom prologues");
        var left = ts2.isNodeArray(statements) ? statements.slice() : statements;
        if (rightCustomPrologueEnd > rightHoistedVariablesEnd) {
          left.splice.apply(left, __spreadArray([leftHoistedVariablesEnd, 0], declarations.slice(rightHoistedVariablesEnd, rightCustomPrologueEnd), false));
        }
        if (rightHoistedVariablesEnd > rightHoistedFunctionsEnd) {
          left.splice.apply(left, __spreadArray([leftHoistedFunctionsEnd, 0], declarations.slice(rightHoistedFunctionsEnd, rightHoistedVariablesEnd), false));
        }
        if (rightHoistedFunctionsEnd > rightStandardPrologueEnd) {
          left.splice.apply(left, __spreadArray([leftStandardPrologueEnd, 0], declarations.slice(rightStandardPrologueEnd, rightHoistedFunctionsEnd), false));
        }
        if (rightStandardPrologueEnd > 0) {
          if (leftStandardPrologueEnd === 0) {
            left.splice.apply(left, __spreadArray([0, 0], declarations.slice(0, rightStandardPrologueEnd), false));
          } else {
            var leftPrologues = new ts2.Map();
            for (var i = 0; i < leftStandardPrologueEnd; i++) {
              var leftPrologue = statements[i];
              leftPrologues.set(leftPrologue.expression.text, true);
            }
            for (var i = rightStandardPrologueEnd - 1; i >= 0; i--) {
              var rightPrologue = declarations[i];
              if (!leftPrologues.has(rightPrologue.expression.text)) {
                left.unshift(rightPrologue);
              }
            }
          }
        }
        if (ts2.isNodeArray(statements)) {
          return ts2.setTextRange(createNodeArray(left, statements.hasTrailingComma), statements);
        }
        return statements;
      }
      function updateModifiers(node, modifiers) {
        var _a;
        if (typeof modifiers === "number") {
          modifiers = createModifiersFromModifierFlags(modifiers);
        }
        return ts2.isParameter(node) ? updateParameterDeclaration(node, node.decorators, modifiers, node.dotDotDotToken, node.name, node.questionToken, node.type, node.initializer) : ts2.isPropertySignature(node) ? updatePropertySignature(node, modifiers, node.name, node.questionToken, node.type) : ts2.isPropertyDeclaration(node) ? updatePropertyDeclaration(node, node.decorators, modifiers, node.name, (_a = node.questionToken) !== null && _a !== void 0 ? _a : node.exclamationToken, node.type, node.initializer) : ts2.isMethodSignature(node) ? updateMethodSignature(node, modifiers, node.name, node.questionToken, node.typeParameters, node.parameters, node.type) : ts2.isMethodDeclaration(node) ? updateMethodDeclaration(node, node.decorators, modifiers, node.asteriskToken, node.name, node.questionToken, node.typeParameters, node.parameters, node.type, node.body) : ts2.isConstructorDeclaration(node) ? updateConstructorDeclaration(node, node.decorators, modifiers, node.parameters, node.body) : ts2.isGetAccessorDeclaration(node) ? updateGetAccessorDeclaration(node, node.decorators, modifiers, node.name, node.parameters, node.type, node.body) : ts2.isSetAccessorDeclaration(node) ? updateSetAccessorDeclaration(node, node.decorators, modifiers, node.name, node.parameters, node.body) : ts2.isIndexSignatureDeclaration(node) ? updateIndexSignature(node, node.decorators, modifiers, node.parameters, node.type) : ts2.isFunctionExpression(node) ? updateFunctionExpression(node, modifiers, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body) : ts2.isArrowFunction(node) ? updateArrowFunction(node, modifiers, node.typeParameters, node.parameters, node.type, node.equalsGreaterThanToken, node.body) : ts2.isClassExpression(node) ? updateClassExpression(node, node.decorators, modifiers, node.name, node.typeParameters, node.heritageClauses, node.members) : ts2.isVariableStatement(node) ? updateVariableStatement(node, modifiers, node.declarationList) : ts2.isFunctionDeclaration(node) ? updateFunctionDeclaration(node, node.decorators, modifiers, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, node.body) : ts2.isClassDeclaration(node) ? updateClassDeclaration(node, node.decorators, modifiers, node.name, node.typeParameters, node.heritageClauses, node.members) : ts2.isInterfaceDeclaration(node) ? updateInterfaceDeclaration(node, node.decorators, modifiers, node.name, node.typeParameters, node.heritageClauses, node.members) : ts2.isTypeAliasDeclaration(node) ? updateTypeAliasDeclaration(node, node.decorators, modifiers, node.name, node.typeParameters, node.type) : ts2.isEnumDeclaration(node) ? updateEnumDeclaration(node, node.decorators, modifiers, node.name, node.members) : ts2.isModuleDeclaration(node) ? updateModuleDeclaration(node, node.decorators, modifiers, node.name, node.body) : ts2.isImportEqualsDeclaration(node) ? updateImportEqualsDeclaration(node, node.decorators, modifiers, node.isTypeOnly, node.name, node.moduleReference) : ts2.isImportDeclaration(node) ? updateImportDeclaration(node, node.decorators, modifiers, node.importClause, node.moduleSpecifier, node.assertClause) : ts2.isExportAssignment(node) ? updateExportAssignment(node, node.decorators, modifiers, node.expression) : ts2.isExportDeclaration(node) ? updateExportDeclaration(node, node.decorators, modifiers, node.isTypeOnly, node.exportClause, node.moduleSpecifier, node.assertClause) : ts2.Debug.assertNever(node);
      }
      function asNodeArray(array) {
        return array ? createNodeArray(array) : void 0;
      }
      function asName(name) {
        return typeof name === "string" ? createIdentifier(name) : name;
      }
      function asExpression(value) {
        return typeof value === "string" ? createStringLiteral(value) : typeof value === "number" ? createNumericLiteral(value) : typeof value === "boolean" ? value ? createTrue() : createFalse() : value;
      }
      function asToken(value) {
        return typeof value === "number" ? createToken(value) : value;
      }
      function asEmbeddedStatement(statement) {
        return statement && ts2.isNotEmittedStatement(statement) ? ts2.setTextRange(setOriginalNode(createEmptyStatement(), statement), statement) : statement;
      }
    }
    ts2.createNodeFactory = createNodeFactory;
    function updateWithoutOriginal(updated, original) {
      if (updated !== original) {
        ts2.setTextRange(updated, original);
      }
      return updated;
    }
    function updateWithOriginal(updated, original) {
      if (updated !== original) {
        setOriginalNode(updated, original);
        ts2.setTextRange(updated, original);
      }
      return updated;
    }
    function getDefaultTagNameForKind(kind) {
      switch (kind) {
        case 341:
          return "type";
        case 339:
          return "returns";
        case 340:
          return "this";
        case 337:
          return "enum";
        case 328:
          return "author";
        case 330:
          return "class";
        case 331:
          return "public";
        case 332:
          return "private";
        case 333:
          return "protected";
        case 334:
          return "readonly";
        case 335:
          return "override";
        case 342:
          return "template";
        case 343:
          return "typedef";
        case 338:
          return "param";
        case 345:
          return "prop";
        case 336:
          return "callback";
        case 326:
          return "augments";
        case 327:
          return "implements";
        default:
          return ts2.Debug.fail("Unsupported kind: ".concat(ts2.Debug.formatSyntaxKind(kind)));
      }
    }
    var rawTextScanner;
    var invalidValueSentinel = {};
    function getCookedText(kind, rawText) {
      if (!rawTextScanner) {
        rawTextScanner = ts2.createScanner(99, false, 0);
      }
      switch (kind) {
        case 14:
          rawTextScanner.setText("`" + rawText + "`");
          break;
        case 15:
          rawTextScanner.setText("`" + rawText + "${");
          break;
        case 16:
          rawTextScanner.setText("}" + rawText + "${");
          break;
        case 17:
          rawTextScanner.setText("}" + rawText + "`");
          break;
      }
      var token = rawTextScanner.scan();
      if (token === 19) {
        token = rawTextScanner.reScanTemplateToken(false);
      }
      if (rawTextScanner.isUnterminated()) {
        rawTextScanner.setText(void 0);
        return invalidValueSentinel;
      }
      var tokenValue;
      switch (token) {
        case 14:
        case 15:
        case 16:
        case 17:
          tokenValue = rawTextScanner.getTokenValue();
          break;
      }
      if (tokenValue === void 0 || rawTextScanner.scan() !== 1) {
        rawTextScanner.setText(void 0);
        return invalidValueSentinel;
      }
      rawTextScanner.setText(void 0);
      return tokenValue;
    }
    function propagateIdentifierNameFlags(node) {
      return propagateChildFlags(node) & ~16777216;
    }
    function propagatePropertyNameFlagsOfChild(node, transformFlags) {
      return transformFlags | node.transformFlags & 33562624;
    }
    function propagateChildFlags(child) {
      if (!child)
        return 0;
      var childFlags = child.transformFlags & ~getTransformFlagsSubtreeExclusions(child.kind);
      return ts2.isNamedDeclaration(child) && ts2.isPropertyName(child.name) ? propagatePropertyNameFlagsOfChild(child.name, childFlags) : childFlags;
    }
    function propagateChildrenFlags(children) {
      return children ? children.transformFlags : 0;
    }
    function aggregateChildrenFlags(children) {
      var subtreeFlags = 0;
      for (var _i = 0, children_2 = children; _i < children_2.length; _i++) {
        var child = children_2[_i];
        subtreeFlags |= propagateChildFlags(child);
      }
      children.transformFlags = subtreeFlags;
    }
    function getTransformFlagsSubtreeExclusions(kind) {
      if (kind >= 176 && kind <= 199) {
        return -2;
      }
      switch (kind) {
        case 207:
        case 208:
        case 203:
          return 536887296;
        case 260:
          return 589443072;
        case 163:
          return 536870912;
        case 213:
          return 557748224;
        case 212:
        case 255:
          return 591310848;
        case 254:
          return 537165824;
        case 256:
        case 225:
          return 536940544;
        case 170:
          return 591306752;
        case 166:
          return 570433536;
        case 168:
        case 171:
        case 172:
          return 574529536;
        case 130:
        case 146:
        case 157:
        case 143:
        case 149:
        case 147:
        case 133:
        case 150:
        case 114:
        case 162:
        case 165:
        case 167:
        case 173:
        case 174:
        case 175:
        case 257:
        case 258:
          return -2;
        case 204:
          return 536973312;
        case 291:
          return 536903680;
        case 200:
        case 201:
          return 536887296;
        case 210:
        case 228:
        case 348:
        case 211:
        case 106:
          return 536870912;
        case 205:
        case 206:
          return 536870912;
        default:
          return 536870912;
      }
    }
    ts2.getTransformFlagsSubtreeExclusions = getTransformFlagsSubtreeExclusions;
    var baseFactory = ts2.createBaseNodeFactory();
    function makeSynthetic(node) {
      node.flags |= 8;
      return node;
    }
    var syntheticFactory = {
      createBaseSourceFileNode: function(kind) {
        return makeSynthetic(baseFactory.createBaseSourceFileNode(kind));
      },
      createBaseIdentifierNode: function(kind) {
        return makeSynthetic(baseFactory.createBaseIdentifierNode(kind));
      },
      createBasePrivateIdentifierNode: function(kind) {
        return makeSynthetic(baseFactory.createBasePrivateIdentifierNode(kind));
      },
      createBaseTokenNode: function(kind) {
        return makeSynthetic(baseFactory.createBaseTokenNode(kind));
      },
      createBaseNode: function(kind) {
        return makeSynthetic(baseFactory.createBaseNode(kind));
      }
    };
    ts2.factory = createNodeFactory(4, syntheticFactory);
    function createUnparsedSourceFile(textOrInputFiles, mapPathOrType, mapTextOrStripInternal) {
      var stripInternal;
      var bundleFileInfo;
      var fileName;
      var text;
      var length;
      var sourceMapPath;
      var sourceMapText;
      var getText;
      var getSourceMapText;
      var oldFileOfCurrentEmit;
      if (!ts2.isString(textOrInputFiles)) {
        ts2.Debug.assert(mapPathOrType === "js" || mapPathOrType === "dts");
        fileName = (mapPathOrType === "js" ? textOrInputFiles.javascriptPath : textOrInputFiles.declarationPath) || "";
        sourceMapPath = mapPathOrType === "js" ? textOrInputFiles.javascriptMapPath : textOrInputFiles.declarationMapPath;
        getText = function() {
          return mapPathOrType === "js" ? textOrInputFiles.javascriptText : textOrInputFiles.declarationText;
        };
        getSourceMapText = function() {
          return mapPathOrType === "js" ? textOrInputFiles.javascriptMapText : textOrInputFiles.declarationMapText;
        };
        length = function() {
          return getText().length;
        };
        if (textOrInputFiles.buildInfo && textOrInputFiles.buildInfo.bundle) {
          ts2.Debug.assert(mapTextOrStripInternal === void 0 || typeof mapTextOrStripInternal === "boolean");
          stripInternal = mapTextOrStripInternal;
          bundleFileInfo = mapPathOrType === "js" ? textOrInputFiles.buildInfo.bundle.js : textOrInputFiles.buildInfo.bundle.dts;
          oldFileOfCurrentEmit = textOrInputFiles.oldFileOfCurrentEmit;
        }
      } else {
        fileName = "";
        text = textOrInputFiles;
        length = textOrInputFiles.length;
        sourceMapPath = mapPathOrType;
        sourceMapText = mapTextOrStripInternal;
      }
      var node = oldFileOfCurrentEmit ? parseOldFileOfCurrentEmit(ts2.Debug.assertDefined(bundleFileInfo)) : parseUnparsedSourceFile(bundleFileInfo, stripInternal, length);
      node.fileName = fileName;
      node.sourceMapPath = sourceMapPath;
      node.oldFileOfCurrentEmit = oldFileOfCurrentEmit;
      if (getText && getSourceMapText) {
        Object.defineProperty(node, "text", { get: getText });
        Object.defineProperty(node, "sourceMapText", { get: getSourceMapText });
      } else {
        ts2.Debug.assert(!oldFileOfCurrentEmit);
        node.text = text !== null && text !== void 0 ? text : "";
        node.sourceMapText = sourceMapText;
      }
      return node;
    }
    ts2.createUnparsedSourceFile = createUnparsedSourceFile;
    function parseUnparsedSourceFile(bundleFileInfo, stripInternal, length) {
      var prologues;
      var helpers;
      var referencedFiles;
      var typeReferenceDirectives;
      var libReferenceDirectives;
      var prependChildren;
      var texts;
      var hasNoDefaultLib;
      for (var _i = 0, _a = bundleFileInfo ? bundleFileInfo.sections : ts2.emptyArray; _i < _a.length; _i++) {
        var section = _a[_i];
        switch (section.kind) {
          case "prologue":
            prologues = ts2.append(prologues, ts2.setTextRange(ts2.factory.createUnparsedPrologue(section.data), section));
            break;
          case "emitHelpers":
            helpers = ts2.append(helpers, ts2.getAllUnscopedEmitHelpers().get(section.data));
            break;
          case "no-default-lib":
            hasNoDefaultLib = true;
            break;
          case "reference":
            referencedFiles = ts2.append(referencedFiles, { pos: -1, end: -1, fileName: section.data });
            break;
          case "type":
            typeReferenceDirectives = ts2.append(typeReferenceDirectives, section.data);
            break;
          case "lib":
            libReferenceDirectives = ts2.append(libReferenceDirectives, { pos: -1, end: -1, fileName: section.data });
            break;
          case "prepend":
            var prependTexts = void 0;
            for (var _b = 0, _c = section.texts; _b < _c.length; _b++) {
              var text = _c[_b];
              if (!stripInternal || text.kind !== "internal") {
                prependTexts = ts2.append(prependTexts, ts2.setTextRange(ts2.factory.createUnparsedTextLike(text.data, text.kind === "internal"), text));
              }
            }
            prependChildren = ts2.addRange(prependChildren, prependTexts);
            texts = ts2.append(texts, ts2.factory.createUnparsedPrepend(section.data, prependTexts !== null && prependTexts !== void 0 ? prependTexts : ts2.emptyArray));
            break;
          case "internal":
            if (stripInternal) {
              if (!texts)
                texts = [];
              break;
            }
          case "text":
            texts = ts2.append(texts, ts2.setTextRange(ts2.factory.createUnparsedTextLike(section.data, section.kind === "internal"), section));
            break;
          default:
            ts2.Debug.assertNever(section);
        }
      }
      if (!texts) {
        var textNode = ts2.factory.createUnparsedTextLike(void 0, false);
        ts2.setTextRangePosWidth(textNode, 0, typeof length === "function" ? length() : length);
        texts = [textNode];
      }
      var node = ts2.parseNodeFactory.createUnparsedSource(prologues !== null && prologues !== void 0 ? prologues : ts2.emptyArray, void 0, texts);
      ts2.setEachParent(prologues, node);
      ts2.setEachParent(texts, node);
      ts2.setEachParent(prependChildren, node);
      node.hasNoDefaultLib = hasNoDefaultLib;
      node.helpers = helpers;
      node.referencedFiles = referencedFiles || ts2.emptyArray;
      node.typeReferenceDirectives = typeReferenceDirectives;
      node.libReferenceDirectives = libReferenceDirectives || ts2.emptyArray;
      return node;
    }
    function parseOldFileOfCurrentEmit(bundleFileInfo) {
      var texts;
      var syntheticReferences;
      for (var _i = 0, _a = bundleFileInfo.sections; _i < _a.length; _i++) {
        var section = _a[_i];
        switch (section.kind) {
          case "internal":
          case "text":
            texts = ts2.append(texts, ts2.setTextRange(ts2.factory.createUnparsedTextLike(section.data, section.kind === "internal"), section));
            break;
          case "no-default-lib":
          case "reference":
          case "type":
          case "lib":
            syntheticReferences = ts2.append(syntheticReferences, ts2.setTextRange(ts2.factory.createUnparsedSyntheticReference(section), section));
            break;
          case "prologue":
          case "emitHelpers":
          case "prepend":
            break;
          default:
            ts2.Debug.assertNever(section);
        }
      }
      var node = ts2.factory.createUnparsedSource(ts2.emptyArray, syntheticReferences, texts !== null && texts !== void 0 ? texts : ts2.emptyArray);
      ts2.setEachParent(syntheticReferences, node);
      ts2.setEachParent(texts, node);
      node.helpers = ts2.map(bundleFileInfo.sources && bundleFileInfo.sources.helpers, function(name) {
        return ts2.getAllUnscopedEmitHelpers().get(name);
      });
      return node;
    }
    function createInputFiles(javascriptTextOrReadFileText, declarationTextOrJavascriptPath, javascriptMapPath, javascriptMapTextOrDeclarationPath, declarationMapPath, declarationMapTextOrBuildInfoPath, javascriptPath, declarationPath, buildInfoPath, buildInfo, oldFileOfCurrentEmit) {
      var node = ts2.parseNodeFactory.createInputFiles();
      if (!ts2.isString(javascriptTextOrReadFileText)) {
        var cache_1 = new ts2.Map();
        var textGetter_1 = function(path) {
          if (path === void 0)
            return void 0;
          var value = cache_1.get(path);
          if (value === void 0) {
            value = javascriptTextOrReadFileText(path);
            cache_1.set(path, value !== void 0 ? value : false);
          }
          return value !== false ? value : void 0;
        };
        var definedTextGetter_1 = function(path) {
          var result = textGetter_1(path);
          return result !== void 0 ? result : "/* Input file ".concat(path, " was missing */\r\n");
        };
        var buildInfo_1;
        var getAndCacheBuildInfo_1 = function(getText) {
          if (buildInfo_1 === void 0) {
            var result = getText();
            buildInfo_1 = result !== void 0 ? ts2.getBuildInfo(result) : false;
          }
          return buildInfo_1 || void 0;
        };
        node.javascriptPath = declarationTextOrJavascriptPath;
        node.javascriptMapPath = javascriptMapPath;
        node.declarationPath = ts2.Debug.assertDefined(javascriptMapTextOrDeclarationPath);
        node.declarationMapPath = declarationMapPath;
        node.buildInfoPath = declarationMapTextOrBuildInfoPath;
        Object.defineProperties(node, {
          javascriptText: { get: function() {
            return definedTextGetter_1(declarationTextOrJavascriptPath);
          } },
          javascriptMapText: { get: function() {
            return textGetter_1(javascriptMapPath);
          } },
          declarationText: { get: function() {
            return definedTextGetter_1(ts2.Debug.assertDefined(javascriptMapTextOrDeclarationPath));
          } },
          declarationMapText: { get: function() {
            return textGetter_1(declarationMapPath);
          } },
          buildInfo: { get: function() {
            return getAndCacheBuildInfo_1(function() {
              return textGetter_1(declarationMapTextOrBuildInfoPath);
            });
          } }
        });
      } else {
        node.javascriptText = javascriptTextOrReadFileText;
        node.javascriptMapPath = javascriptMapPath;
        node.javascriptMapText = javascriptMapTextOrDeclarationPath;
        node.declarationText = declarationTextOrJavascriptPath;
        node.declarationMapPath = declarationMapPath;
        node.declarationMapText = declarationMapTextOrBuildInfoPath;
        node.javascriptPath = javascriptPath;
        node.declarationPath = declarationPath;
        node.buildInfoPath = buildInfoPath;
        node.buildInfo = buildInfo;
        node.oldFileOfCurrentEmit = oldFileOfCurrentEmit;
      }
      return node;
    }
    ts2.createInputFiles = createInputFiles;
    var SourceMapSource;
    function createSourceMapSource(fileName, text, skipTrivia) {
      return new (SourceMapSource || (SourceMapSource = ts2.objectAllocator.getSourceMapSourceConstructor()))(fileName, text, skipTrivia);
    }
    ts2.createSourceMapSource = createSourceMapSource;
    function setOriginalNode(node, original) {
      node.original = original;
      if (original) {
        var emitNode = original.emitNode;
        if (emitNode)
          node.emitNode = mergeEmitNode(emitNode, node.emitNode);
      }
      return node;
    }
    ts2.setOriginalNode = setOriginalNode;
    function mergeEmitNode(sourceEmitNode, destEmitNode) {
      var flags = sourceEmitNode.flags, leadingComments = sourceEmitNode.leadingComments, trailingComments = sourceEmitNode.trailingComments, commentRange = sourceEmitNode.commentRange, sourceMapRange = sourceEmitNode.sourceMapRange, tokenSourceMapRanges = sourceEmitNode.tokenSourceMapRanges, constantValue = sourceEmitNode.constantValue, helpers = sourceEmitNode.helpers, startsOnNewLine = sourceEmitNode.startsOnNewLine;
      if (!destEmitNode)
        destEmitNode = {};
      if (leadingComments)
        destEmitNode.leadingComments = ts2.addRange(leadingComments.slice(), destEmitNode.leadingComments);
      if (trailingComments)
        destEmitNode.trailingComments = ts2.addRange(trailingComments.slice(), destEmitNode.trailingComments);
      if (flags)
        destEmitNode.flags = flags & ~268435456;
      if (commentRange)
        destEmitNode.commentRange = commentRange;
      if (sourceMapRange)
        destEmitNode.sourceMapRange = sourceMapRange;
      if (tokenSourceMapRanges)
        destEmitNode.tokenSourceMapRanges = mergeTokenSourceMapRanges(tokenSourceMapRanges, destEmitNode.tokenSourceMapRanges);
      if (constantValue !== void 0)
        destEmitNode.constantValue = constantValue;
      if (helpers) {
        for (var _i = 0, helpers_1 = helpers; _i < helpers_1.length; _i++) {
          var helper = helpers_1[_i];
          destEmitNode.helpers = ts2.appendIfUnique(destEmitNode.helpers, helper);
        }
      }
      if (startsOnNewLine !== void 0)
        destEmitNode.startsOnNewLine = startsOnNewLine;
      return destEmitNode;
    }
    function mergeTokenSourceMapRanges(sourceRanges, destRanges) {
      if (!destRanges)
        destRanges = [];
      for (var key in sourceRanges) {
        destRanges[key] = sourceRanges[key];
      }
      return destRanges;
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function getOrCreateEmitNode(node) {
      var _a;
      if (!node.emitNode) {
        if (ts2.isParseTreeNode(node)) {
          if (node.kind === 303) {
            return node.emitNode = { annotatedNodes: [node] };
          }
          var sourceFile = (_a = ts2.getSourceFileOfNode(ts2.getParseTreeNode(ts2.getSourceFileOfNode(node)))) !== null && _a !== void 0 ? _a : ts2.Debug.fail("Could not determine parsed source file.");
          getOrCreateEmitNode(sourceFile).annotatedNodes.push(node);
        }
        node.emitNode = {};
      } else {
        ts2.Debug.assert(!(node.emitNode.flags & 268435456), "Invalid attempt to mutate an immutable node.");
      }
      return node.emitNode;
    }
    ts2.getOrCreateEmitNode = getOrCreateEmitNode;
    function disposeEmitNodes(sourceFile) {
      var _a, _b;
      var annotatedNodes = (_b = (_a = ts2.getSourceFileOfNode(ts2.getParseTreeNode(sourceFile))) === null || _a === void 0 ? void 0 : _a.emitNode) === null || _b === void 0 ? void 0 : _b.annotatedNodes;
      if (annotatedNodes) {
        for (var _i = 0, annotatedNodes_1 = annotatedNodes; _i < annotatedNodes_1.length; _i++) {
          var node = annotatedNodes_1[_i];
          node.emitNode = void 0;
        }
      }
    }
    ts2.disposeEmitNodes = disposeEmitNodes;
    function removeAllComments(node) {
      var emitNode = getOrCreateEmitNode(node);
      emitNode.flags |= 1536;
      emitNode.leadingComments = void 0;
      emitNode.trailingComments = void 0;
      return node;
    }
    ts2.removeAllComments = removeAllComments;
    function setEmitFlags(node, emitFlags) {
      getOrCreateEmitNode(node).flags = emitFlags;
      return node;
    }
    ts2.setEmitFlags = setEmitFlags;
    function addEmitFlags(node, emitFlags) {
      var emitNode = getOrCreateEmitNode(node);
      emitNode.flags = emitNode.flags | emitFlags;
      return node;
    }
    ts2.addEmitFlags = addEmitFlags;
    function getSourceMapRange(node) {
      var _a, _b;
      return (_b = (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.sourceMapRange) !== null && _b !== void 0 ? _b : node;
    }
    ts2.getSourceMapRange = getSourceMapRange;
    function setSourceMapRange(node, range) {
      getOrCreateEmitNode(node).sourceMapRange = range;
      return node;
    }
    ts2.setSourceMapRange = setSourceMapRange;
    function getTokenSourceMapRange(node, token) {
      var _a, _b;
      return (_b = (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.tokenSourceMapRanges) === null || _b === void 0 ? void 0 : _b[token];
    }
    ts2.getTokenSourceMapRange = getTokenSourceMapRange;
    function setTokenSourceMapRange(node, token, range) {
      var _a;
      var emitNode = getOrCreateEmitNode(node);
      var tokenSourceMapRanges = (_a = emitNode.tokenSourceMapRanges) !== null && _a !== void 0 ? _a : emitNode.tokenSourceMapRanges = [];
      tokenSourceMapRanges[token] = range;
      return node;
    }
    ts2.setTokenSourceMapRange = setTokenSourceMapRange;
    function getStartsOnNewLine(node) {
      var _a;
      return (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.startsOnNewLine;
    }
    ts2.getStartsOnNewLine = getStartsOnNewLine;
    function setStartsOnNewLine(node, newLine) {
      getOrCreateEmitNode(node).startsOnNewLine = newLine;
      return node;
    }
    ts2.setStartsOnNewLine = setStartsOnNewLine;
    function getCommentRange(node) {
      var _a, _b;
      return (_b = (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.commentRange) !== null && _b !== void 0 ? _b : node;
    }
    ts2.getCommentRange = getCommentRange;
    function setCommentRange(node, range) {
      getOrCreateEmitNode(node).commentRange = range;
      return node;
    }
    ts2.setCommentRange = setCommentRange;
    function getSyntheticLeadingComments(node) {
      var _a;
      return (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.leadingComments;
    }
    ts2.getSyntheticLeadingComments = getSyntheticLeadingComments;
    function setSyntheticLeadingComments(node, comments) {
      getOrCreateEmitNode(node).leadingComments = comments;
      return node;
    }
    ts2.setSyntheticLeadingComments = setSyntheticLeadingComments;
    function addSyntheticLeadingComment(node, kind, text, hasTrailingNewLine) {
      return setSyntheticLeadingComments(node, ts2.append(getSyntheticLeadingComments(node), { kind, pos: -1, end: -1, hasTrailingNewLine, text }));
    }
    ts2.addSyntheticLeadingComment = addSyntheticLeadingComment;
    function getSyntheticTrailingComments(node) {
      var _a;
      return (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.trailingComments;
    }
    ts2.getSyntheticTrailingComments = getSyntheticTrailingComments;
    function setSyntheticTrailingComments(node, comments) {
      getOrCreateEmitNode(node).trailingComments = comments;
      return node;
    }
    ts2.setSyntheticTrailingComments = setSyntheticTrailingComments;
    function addSyntheticTrailingComment(node, kind, text, hasTrailingNewLine) {
      return setSyntheticTrailingComments(node, ts2.append(getSyntheticTrailingComments(node), { kind, pos: -1, end: -1, hasTrailingNewLine, text }));
    }
    ts2.addSyntheticTrailingComment = addSyntheticTrailingComment;
    function moveSyntheticComments(node, original) {
      setSyntheticLeadingComments(node, getSyntheticLeadingComments(original));
      setSyntheticTrailingComments(node, getSyntheticTrailingComments(original));
      var emit = getOrCreateEmitNode(original);
      emit.leadingComments = void 0;
      emit.trailingComments = void 0;
      return node;
    }
    ts2.moveSyntheticComments = moveSyntheticComments;
    function getConstantValue(node) {
      var _a;
      return (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.constantValue;
    }
    ts2.getConstantValue = getConstantValue;
    function setConstantValue(node, value) {
      var emitNode = getOrCreateEmitNode(node);
      emitNode.constantValue = value;
      return node;
    }
    ts2.setConstantValue = setConstantValue;
    function addEmitHelper(node, helper) {
      var emitNode = getOrCreateEmitNode(node);
      emitNode.helpers = ts2.append(emitNode.helpers, helper);
      return node;
    }
    ts2.addEmitHelper = addEmitHelper;
    function addEmitHelpers(node, helpers) {
      if (ts2.some(helpers)) {
        var emitNode = getOrCreateEmitNode(node);
        for (var _i = 0, helpers_2 = helpers; _i < helpers_2.length; _i++) {
          var helper = helpers_2[_i];
          emitNode.helpers = ts2.appendIfUnique(emitNode.helpers, helper);
        }
      }
      return node;
    }
    ts2.addEmitHelpers = addEmitHelpers;
    function removeEmitHelper(node, helper) {
      var _a;
      var helpers = (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.helpers;
      if (helpers) {
        return ts2.orderedRemoveItem(helpers, helper);
      }
      return false;
    }
    ts2.removeEmitHelper = removeEmitHelper;
    function getEmitHelpers(node) {
      var _a;
      return (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.helpers;
    }
    ts2.getEmitHelpers = getEmitHelpers;
    function moveEmitHelpers(source, target, predicate) {
      var sourceEmitNode = source.emitNode;
      var sourceEmitHelpers = sourceEmitNode && sourceEmitNode.helpers;
      if (!ts2.some(sourceEmitHelpers))
        return;
      var targetEmitNode = getOrCreateEmitNode(target);
      var helpersRemoved = 0;
      for (var i = 0; i < sourceEmitHelpers.length; i++) {
        var helper = sourceEmitHelpers[i];
        if (predicate(helper)) {
          helpersRemoved++;
          targetEmitNode.helpers = ts2.appendIfUnique(targetEmitNode.helpers, helper);
        } else if (helpersRemoved > 0) {
          sourceEmitHelpers[i - helpersRemoved] = helper;
        }
      }
      if (helpersRemoved > 0) {
        sourceEmitHelpers.length -= helpersRemoved;
      }
    }
    ts2.moveEmitHelpers = moveEmitHelpers;
    function getSnippetElement(node) {
      var _a;
      return (_a = node.emitNode) === null || _a === void 0 ? void 0 : _a.snippetElement;
    }
    ts2.getSnippetElement = getSnippetElement;
    function setSnippetElement(node, snippet) {
      var emitNode = getOrCreateEmitNode(node);
      emitNode.snippetElement = snippet;
      return node;
    }
    ts2.setSnippetElement = setSnippetElement;
    function ignoreSourceNewlines(node) {
      getOrCreateEmitNode(node).flags |= 134217728;
      return node;
    }
    ts2.ignoreSourceNewlines = ignoreSourceNewlines;
  })(ts || (ts = {}));
  (function(ts2) {
    function createEmitHelperFactory(context) {
      var factory = context.factory;
      var immutableTrue = ts2.memoize(function() {
        return ts2.setEmitFlags(factory.createTrue(), 268435456);
      });
      var immutableFalse = ts2.memoize(function() {
        return ts2.setEmitFlags(factory.createFalse(), 268435456);
      });
      return {
        getUnscopedHelperName,
        createDecorateHelper,
        createMetadataHelper,
        createParamHelper,
        createAssignHelper,
        createAwaitHelper,
        createAsyncGeneratorHelper,
        createAsyncDelegatorHelper,
        createAsyncValuesHelper,
        createRestHelper,
        createAwaiterHelper,
        createExtendsHelper,
        createTemplateObjectHelper,
        createSpreadArrayHelper,
        createValuesHelper,
        createReadHelper,
        createGeneratorHelper,
        createCreateBindingHelper,
        createImportStarHelper,
        createImportStarCallbackHelper,
        createImportDefaultHelper,
        createExportStarHelper,
        createClassPrivateFieldGetHelper,
        createClassPrivateFieldSetHelper,
        createClassPrivateFieldInHelper
      };
      function getUnscopedHelperName(name) {
        return ts2.setEmitFlags(factory.createIdentifier(name), 4096 | 2);
      }
      function createDecorateHelper(decoratorExpressions, target, memberName, descriptor) {
        context.requestEmitHelper(ts2.decorateHelper);
        var argumentsArray = [];
        argumentsArray.push(factory.createArrayLiteralExpression(decoratorExpressions, true));
        argumentsArray.push(target);
        if (memberName) {
          argumentsArray.push(memberName);
          if (descriptor) {
            argumentsArray.push(descriptor);
          }
        }
        return factory.createCallExpression(getUnscopedHelperName("__decorate"), void 0, argumentsArray);
      }
      function createMetadataHelper(metadataKey, metadataValue) {
        context.requestEmitHelper(ts2.metadataHelper);
        return factory.createCallExpression(getUnscopedHelperName("__metadata"), void 0, [
          factory.createStringLiteral(metadataKey),
          metadataValue
        ]);
      }
      function createParamHelper(expression, parameterOffset, location) {
        context.requestEmitHelper(ts2.paramHelper);
        return ts2.setTextRange(factory.createCallExpression(getUnscopedHelperName("__param"), void 0, [
          factory.createNumericLiteral(parameterOffset + ""),
          expression
        ]), location);
      }
      function createAssignHelper(attributesSegments) {
        if (ts2.getEmitScriptTarget(context.getCompilerOptions()) >= 2) {
          return factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("Object"), "assign"), void 0, attributesSegments);
        }
        context.requestEmitHelper(ts2.assignHelper);
        return factory.createCallExpression(getUnscopedHelperName("__assign"), void 0, attributesSegments);
      }
      function createAwaitHelper(expression) {
        context.requestEmitHelper(ts2.awaitHelper);
        return factory.createCallExpression(getUnscopedHelperName("__await"), void 0, [expression]);
      }
      function createAsyncGeneratorHelper(generatorFunc, hasLexicalThis) {
        context.requestEmitHelper(ts2.awaitHelper);
        context.requestEmitHelper(ts2.asyncGeneratorHelper);
        (generatorFunc.emitNode || (generatorFunc.emitNode = {})).flags |= 262144 | 524288;
        return factory.createCallExpression(getUnscopedHelperName("__asyncGenerator"), void 0, [
          hasLexicalThis ? factory.createThis() : factory.createVoidZero(),
          factory.createIdentifier("arguments"),
          generatorFunc
        ]);
      }
      function createAsyncDelegatorHelper(expression) {
        context.requestEmitHelper(ts2.awaitHelper);
        context.requestEmitHelper(ts2.asyncDelegator);
        return factory.createCallExpression(getUnscopedHelperName("__asyncDelegator"), void 0, [expression]);
      }
      function createAsyncValuesHelper(expression) {
        context.requestEmitHelper(ts2.asyncValues);
        return factory.createCallExpression(getUnscopedHelperName("__asyncValues"), void 0, [expression]);
      }
      function createRestHelper(value, elements, computedTempVariables, location) {
        context.requestEmitHelper(ts2.restHelper);
        var propertyNames = [];
        var computedTempVariableOffset = 0;
        for (var i = 0; i < elements.length - 1; i++) {
          var propertyName = ts2.getPropertyNameOfBindingOrAssignmentElement(elements[i]);
          if (propertyName) {
            if (ts2.isComputedPropertyName(propertyName)) {
              ts2.Debug.assertIsDefined(computedTempVariables, "Encountered computed property name but 'computedTempVariables' argument was not provided.");
              var temp = computedTempVariables[computedTempVariableOffset];
              computedTempVariableOffset++;
              propertyNames.push(factory.createConditionalExpression(factory.createTypeCheck(temp, "symbol"), void 0, temp, void 0, factory.createAdd(temp, factory.createStringLiteral(""))));
            } else {
              propertyNames.push(factory.createStringLiteralFromNode(propertyName));
            }
          }
        }
        return factory.createCallExpression(getUnscopedHelperName("__rest"), void 0, [
          value,
          ts2.setTextRange(factory.createArrayLiteralExpression(propertyNames), location)
        ]);
      }
      function createAwaiterHelper(hasLexicalThis, hasLexicalArguments, promiseConstructor, body) {
        context.requestEmitHelper(ts2.awaiterHelper);
        var generatorFunc = factory.createFunctionExpression(void 0, factory.createToken(41), void 0, void 0, [], void 0, body);
        (generatorFunc.emitNode || (generatorFunc.emitNode = {})).flags |= 262144 | 524288;
        return factory.createCallExpression(getUnscopedHelperName("__awaiter"), void 0, [
          hasLexicalThis ? factory.createThis() : factory.createVoidZero(),
          hasLexicalArguments ? factory.createIdentifier("arguments") : factory.createVoidZero(),
          promiseConstructor ? ts2.createExpressionFromEntityName(factory, promiseConstructor) : factory.createVoidZero(),
          generatorFunc
        ]);
      }
      function createExtendsHelper(name) {
        context.requestEmitHelper(ts2.extendsHelper);
        return factory.createCallExpression(getUnscopedHelperName("__extends"), void 0, [name, factory.createUniqueName("_super", 16 | 32)]);
      }
      function createTemplateObjectHelper(cooked, raw) {
        context.requestEmitHelper(ts2.templateObjectHelper);
        return factory.createCallExpression(getUnscopedHelperName("__makeTemplateObject"), void 0, [cooked, raw]);
      }
      function createSpreadArrayHelper(to, from, packFrom) {
        context.requestEmitHelper(ts2.spreadArrayHelper);
        return factory.createCallExpression(getUnscopedHelperName("__spreadArray"), void 0, [to, from, packFrom ? immutableTrue() : immutableFalse()]);
      }
      function createValuesHelper(expression) {
        context.requestEmitHelper(ts2.valuesHelper);
        return factory.createCallExpression(getUnscopedHelperName("__values"), void 0, [expression]);
      }
      function createReadHelper(iteratorRecord, count) {
        context.requestEmitHelper(ts2.readHelper);
        return factory.createCallExpression(getUnscopedHelperName("__read"), void 0, count !== void 0 ? [iteratorRecord, factory.createNumericLiteral(count + "")] : [iteratorRecord]);
      }
      function createGeneratorHelper(body) {
        context.requestEmitHelper(ts2.generatorHelper);
        return factory.createCallExpression(getUnscopedHelperName("__generator"), void 0, [factory.createThis(), body]);
      }
      function createCreateBindingHelper(module2, inputName, outputName) {
        context.requestEmitHelper(ts2.createBindingHelper);
        return factory.createCallExpression(getUnscopedHelperName("__createBinding"), void 0, __spreadArray([factory.createIdentifier("exports"), module2, inputName], outputName ? [outputName] : [], true));
      }
      function createImportStarHelper(expression) {
        context.requestEmitHelper(ts2.importStarHelper);
        return factory.createCallExpression(getUnscopedHelperName("__importStar"), void 0, [expression]);
      }
      function createImportStarCallbackHelper() {
        context.requestEmitHelper(ts2.importStarHelper);
        return getUnscopedHelperName("__importStar");
      }
      function createImportDefaultHelper(expression) {
        context.requestEmitHelper(ts2.importDefaultHelper);
        return factory.createCallExpression(getUnscopedHelperName("__importDefault"), void 0, [expression]);
      }
      function createExportStarHelper(moduleExpression, exportsExpression) {
        if (exportsExpression === void 0) {
          exportsExpression = factory.createIdentifier("exports");
        }
        context.requestEmitHelper(ts2.exportStarHelper);
        context.requestEmitHelper(ts2.createBindingHelper);
        return factory.createCallExpression(getUnscopedHelperName("__exportStar"), void 0, [moduleExpression, exportsExpression]);
      }
      function createClassPrivateFieldGetHelper(receiver, state, kind, f) {
        context.requestEmitHelper(ts2.classPrivateFieldGetHelper);
        var args;
        if (!f) {
          args = [receiver, state, factory.createStringLiteral(kind)];
        } else {
          args = [receiver, state, factory.createStringLiteral(kind), f];
        }
        return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldGet"), void 0, args);
      }
      function createClassPrivateFieldSetHelper(receiver, state, value, kind, f) {
        context.requestEmitHelper(ts2.classPrivateFieldSetHelper);
        var args;
        if (!f) {
          args = [receiver, state, value, factory.createStringLiteral(kind)];
        } else {
          args = [receiver, state, value, factory.createStringLiteral(kind), f];
        }
        return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldSet"), void 0, args);
      }
      function createClassPrivateFieldInHelper(state, receiver) {
        context.requestEmitHelper(ts2.classPrivateFieldInHelper);
        return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldIn"), void 0, [state, receiver]);
      }
    }
    ts2.createEmitHelperFactory = createEmitHelperFactory;
    function compareEmitHelpers(x, y) {
      if (x === y)
        return 0;
      if (x.priority === y.priority)
        return 0;
      if (x.priority === void 0)
        return 1;
      if (y.priority === void 0)
        return -1;
      return ts2.compareValues(x.priority, y.priority);
    }
    ts2.compareEmitHelpers = compareEmitHelpers;
    function helperString(input) {
      var args = [];
      for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
      }
      return function(uniqueName) {
        var result = "";
        for (var i = 0; i < args.length; i++) {
          result += input[i];
          result += uniqueName(args[i]);
        }
        result += input[input.length - 1];
        return result;
      };
    }
    ts2.helperString = helperString;
    ts2.decorateHelper = {
      name: "typescript:decorate",
      importName: "__decorate",
      scoped: false,
      priority: 2,
      text: '\n            var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n                var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n                if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\n                else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n                return c > 3 && r && Object.defineProperty(target, key, r), r;\n            };'
    };
    ts2.metadataHelper = {
      name: "typescript:metadata",
      importName: "__metadata",
      scoped: false,
      priority: 3,
      text: '\n            var __metadata = (this && this.__metadata) || function (k, v) {\n                if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);\n            };'
    };
    ts2.paramHelper = {
      name: "typescript:param",
      importName: "__param",
      scoped: false,
      priority: 4,
      text: "\n            var __param = (this && this.__param) || function (paramIndex, decorator) {\n                return function (target, key) { decorator(target, key, paramIndex); }\n            };"
    };
    ts2.assignHelper = {
      name: "typescript:assign",
      importName: "__assign",
      scoped: false,
      priority: 1,
      text: "\n            var __assign = (this && this.__assign) || function () {\n                __assign = Object.assign || function(t) {\n                    for (var s, i = 1, n = arguments.length; i < n; i++) {\n                        s = arguments[i];\n                        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                            t[p] = s[p];\n                    }\n                    return t;\n                };\n                return __assign.apply(this, arguments);\n            };"
    };
    ts2.awaitHelper = {
      name: "typescript:await",
      importName: "__await",
      scoped: false,
      text: "\n            var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }"
    };
    ts2.asyncGeneratorHelper = {
      name: "typescript:asyncGenerator",
      importName: "__asyncGenerator",
      scoped: false,
      dependencies: [ts2.awaitHelper],
      text: '\n            var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {\n                if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n                var g = generator.apply(thisArg, _arguments || []), i, q = [];\n                return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;\n                function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n                function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n                function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n                function fulfill(value) { resume("next", value); }\n                function reject(value) { resume("throw", value); }\n                function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n            };'
    };
    ts2.asyncDelegator = {
      name: "typescript:asyncDelegator",
      importName: "__asyncDelegator",
      scoped: false,
      dependencies: [ts2.awaitHelper],
      text: '\n            var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {\n                var i, p;\n                return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;\n                function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }\n            };'
    };
    ts2.asyncValues = {
      name: "typescript:asyncValues",
      importName: "__asyncValues",
      scoped: false,
      text: '\n            var __asyncValues = (this && this.__asyncValues) || function (o) {\n                if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\n                var m = o[Symbol.asyncIterator], i;\n                return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);\n                function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n                function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n            };'
    };
    ts2.restHelper = {
      name: "typescript:rest",
      importName: "__rest",
      scoped: false,
      text: '\n            var __rest = (this && this.__rest) || function (s, e) {\n                var t = {};\n                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n                    t[p] = s[p];\n                if (s != null && typeof Object.getOwnPropertySymbols === "function")\n                    for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n                        if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                            t[p[i]] = s[p[i]];\n                    }\n                return t;\n            };'
    };
    ts2.awaiterHelper = {
      name: "typescript:awaiter",
      importName: "__awaiter",
      scoped: false,
      priority: 5,
      text: '\n            var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n                function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n                return new (P || (P = Promise))(function (resolve, reject) {\n                    function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n                    function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\n                    function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n                    step((generator = generator.apply(thisArg, _arguments || [])).next());\n                });\n            };'
    };
    ts2.extendsHelper = {
      name: "typescript:extends",
      importName: "__extends",
      scoped: false,
      priority: 0,
      text: '\n            var __extends = (this && this.__extends) || (function () {\n                var extendStatics = function (d, b) {\n                    extendStatics = Object.setPrototypeOf ||\n                        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n                        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n                    return extendStatics(d, b);\n                };\n\n                return function (d, b) {\n                    if (typeof b !== "function" && b !== null)\n                        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\n                    extendStatics(d, b);\n                    function __() { this.constructor = d; }\n                    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n                };\n            })();'
    };
    ts2.templateObjectHelper = {
      name: "typescript:makeTemplateObject",
      importName: "__makeTemplateObject",
      scoped: false,
      priority: 0,
      text: '\n            var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {\n                if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }\n                return cooked;\n            };'
    };
    ts2.readHelper = {
      name: "typescript:read",
      importName: "__read",
      scoped: false,
      text: '\n            var __read = (this && this.__read) || function (o, n) {\n                var m = typeof Symbol === "function" && o[Symbol.iterator];\n                if (!m) return o;\n                var i = m.call(o), r, ar = [], e;\n                try {\n                    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n                }\n                catch (error) { e = { error: error }; }\n                finally {\n                    try {\n                        if (r && !r.done && (m = i["return"])) m.call(i);\n                    }\n                    finally { if (e) throw e.error; }\n                }\n                return ar;\n            };'
    };
    ts2.spreadArrayHelper = {
      name: "typescript:spreadArray",
      importName: "__spreadArray",
      scoped: false,
      text: "\n            var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n                if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n                    if (ar || !(i in from)) {\n                        if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n                        ar[i] = from[i];\n                    }\n                }\n                return to.concat(ar || Array.prototype.slice.call(from));\n            };"
    };
    ts2.valuesHelper = {
      name: "typescript:values",
      importName: "__values",
      scoped: false,
      text: '\n            var __values = (this && this.__values) || function(o) {\n                var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;\n                if (m) return m.call(o);\n                if (o && typeof o.length === "number") return {\n                    next: function () {\n                        if (o && i >= o.length) o = void 0;\n                        return { value: o && o[i++], done: !o };\n                    }\n                };\n                throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\n            };'
    };
    ts2.generatorHelper = {
      name: "typescript:generator",
      importName: "__generator",
      scoped: false,
      priority: 6,
      text: '\n            var __generator = (this && this.__generator) || function (thisArg, body) {\n                var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n                return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\n                function verb(n) { return function (v) { return step([n, v]); }; }\n                function step(op) {\n                    if (f) throw new TypeError("Generator is already executing.");\n                    while (_) try {\n                        if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n                        if (y = 0, t) op = [op[0] & 2, t.value];\n                        switch (op[0]) {\n                            case 0: case 1: t = op; break;\n                            case 4: _.label++; return { value: op[1], done: false };\n                            case 5: _.label++; y = op[1]; op = [0]; continue;\n                            case 7: op = _.ops.pop(); _.trys.pop(); continue;\n                            default:\n                                if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                                if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                                if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                                if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                                if (t[2]) _.ops.pop();\n                                _.trys.pop(); continue;\n                        }\n                        op = body.call(thisArg, _);\n                    } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n                    if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n                }\n            };'
    };
    ts2.createBindingHelper = {
      name: "typescript:commonjscreatebinding",
      importName: "__createBinding",
      scoped: false,
      priority: 1,
      text: "\n            var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n                if (k2 === undefined) k2 = k;\n                Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n            }) : (function(o, m, k, k2) {\n                if (k2 === undefined) k2 = k;\n                o[k2] = m[k];\n            }));"
    };
    ts2.setModuleDefaultHelper = {
      name: "typescript:commonjscreatevalue",
      importName: "__setModuleDefault",
      scoped: false,
      priority: 1,
      text: '\n            var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n                Object.defineProperty(o, "default", { enumerable: true, value: v });\n            }) : function(o, v) {\n                o["default"] = v;\n            });'
    };
    ts2.importStarHelper = {
      name: "typescript:commonjsimportstar",
      importName: "__importStar",
      scoped: false,
      dependencies: [ts2.createBindingHelper, ts2.setModuleDefaultHelper],
      priority: 2,
      text: '\n            var __importStar = (this && this.__importStar) || function (mod) {\n                if (mod && mod.__esModule) return mod;\n                var result = {};\n                if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n                __setModuleDefault(result, mod);\n                return result;\n            };'
    };
    ts2.importDefaultHelper = {
      name: "typescript:commonjsimportdefault",
      importName: "__importDefault",
      scoped: false,
      text: '\n            var __importDefault = (this && this.__importDefault) || function (mod) {\n                return (mod && mod.__esModule) ? mod : { "default": mod };\n            };'
    };
    ts2.exportStarHelper = {
      name: "typescript:export-star",
      importName: "__exportStar",
      scoped: false,
      dependencies: [ts2.createBindingHelper],
      priority: 2,
      text: '\n            var __exportStar = (this && this.__exportStar) || function(m, exports) {\n                for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n            };'
    };
    ts2.classPrivateFieldGetHelper = {
      name: "typescript:classPrivateFieldGet",
      importName: "__classPrivateFieldGet",
      scoped: false,
      text: '\n            var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n                if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\n                if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\n                return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\n            };'
    };
    ts2.classPrivateFieldSetHelper = {
      name: "typescript:classPrivateFieldSet",
      importName: "__classPrivateFieldSet",
      scoped: false,
      text: '\n            var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {\n                if (kind === "m") throw new TypeError("Private method is not writable");\n                if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\n                if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\n                return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n            };'
    };
    ts2.classPrivateFieldInHelper = {
      name: "typescript:classPrivateFieldIn",
      importName: "__classPrivateFieldIn",
      scoped: false,
      text: `
            var __classPrivateFieldIn = (this && this.__classPrivateFieldIn) || function(state, receiver) {
                if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
                return typeof state === "function" ? receiver === state : state.has(receiver);
            };`
    };
    var allUnscopedEmitHelpers;
    function getAllUnscopedEmitHelpers() {
      return allUnscopedEmitHelpers || (allUnscopedEmitHelpers = ts2.arrayToMap([
        ts2.decorateHelper,
        ts2.metadataHelper,
        ts2.paramHelper,
        ts2.assignHelper,
        ts2.awaitHelper,
        ts2.asyncGeneratorHelper,
        ts2.asyncDelegator,
        ts2.asyncValues,
        ts2.restHelper,
        ts2.awaiterHelper,
        ts2.extendsHelper,
        ts2.templateObjectHelper,
        ts2.spreadArrayHelper,
        ts2.valuesHelper,
        ts2.readHelper,
        ts2.generatorHelper,
        ts2.importStarHelper,
        ts2.importDefaultHelper,
        ts2.exportStarHelper,
        ts2.classPrivateFieldGetHelper,
        ts2.classPrivateFieldSetHelper,
        ts2.classPrivateFieldInHelper,
        ts2.createBindingHelper,
        ts2.setModuleDefaultHelper
      ], function(helper) {
        return helper.name;
      }));
    }
    ts2.getAllUnscopedEmitHelpers = getAllUnscopedEmitHelpers;
    ts2.asyncSuperHelper = {
      name: "typescript:async-super",
      scoped: true,
      text: helperString(__makeTemplateObject(["\n            const ", " = name => super[name];"], ["\n            const ", " = name => super[name];"]), "_superIndex")
    };
    ts2.advancedAsyncSuperHelper = {
      name: "typescript:advanced-async-super",
      scoped: true,
      text: helperString(__makeTemplateObject(["\n            const ", " = (function (geti, seti) {\n                const cache = Object.create(null);\n                return name => cache[name] || (cache[name] = { get value() { return geti(name); }, set value(v) { seti(name, v); } });\n            })(name => super[name], (name, value) => super[name] = value);"], ["\n            const ", " = (function (geti, seti) {\n                const cache = Object.create(null);\n                return name => cache[name] || (cache[name] = { get value() { return geti(name); }, set value(v) { seti(name, v); } });\n            })(name => super[name], (name, value) => super[name] = value);"]), "_superIndex")
    };
    function isCallToHelper(firstSegment, helperName) {
      return ts2.isCallExpression(firstSegment) && ts2.isIdentifier(firstSegment.expression) && (ts2.getEmitFlags(firstSegment.expression) & 4096) !== 0 && firstSegment.expression.escapedText === helperName;
    }
    ts2.isCallToHelper = isCallToHelper;
  })(ts || (ts = {}));
  (function(ts2) {
    function isNumericLiteral(node) {
      return node.kind === 8;
    }
    ts2.isNumericLiteral = isNumericLiteral;
    function isBigIntLiteral(node) {
      return node.kind === 9;
    }
    ts2.isBigIntLiteral = isBigIntLiteral;
    function isStringLiteral(node) {
      return node.kind === 10;
    }
    ts2.isStringLiteral = isStringLiteral;
    function isJsxText(node) {
      return node.kind === 11;
    }
    ts2.isJsxText = isJsxText;
    function isRegularExpressionLiteral(node) {
      return node.kind === 13;
    }
    ts2.isRegularExpressionLiteral = isRegularExpressionLiteral;
    function isNoSubstitutionTemplateLiteral(node) {
      return node.kind === 14;
    }
    ts2.isNoSubstitutionTemplateLiteral = isNoSubstitutionTemplateLiteral;
    function isTemplateHead(node) {
      return node.kind === 15;
    }
    ts2.isTemplateHead = isTemplateHead;
    function isTemplateMiddle(node) {
      return node.kind === 16;
    }
    ts2.isTemplateMiddle = isTemplateMiddle;
    function isTemplateTail(node) {
      return node.kind === 17;
    }
    ts2.isTemplateTail = isTemplateTail;
    function isDotDotDotToken(node) {
      return node.kind === 25;
    }
    ts2.isDotDotDotToken = isDotDotDotToken;
    function isCommaToken(node) {
      return node.kind === 27;
    }
    ts2.isCommaToken = isCommaToken;
    function isPlusToken(node) {
      return node.kind === 39;
    }
    ts2.isPlusToken = isPlusToken;
    function isMinusToken(node) {
      return node.kind === 40;
    }
    ts2.isMinusToken = isMinusToken;
    function isAsteriskToken(node) {
      return node.kind === 41;
    }
    ts2.isAsteriskToken = isAsteriskToken;
    function isExclamationToken(node) {
      return node.kind === 53;
    }
    ts2.isExclamationToken = isExclamationToken;
    function isQuestionToken(node) {
      return node.kind === 57;
    }
    ts2.isQuestionToken = isQuestionToken;
    function isColonToken(node) {
      return node.kind === 58;
    }
    ts2.isColonToken = isColonToken;
    function isQuestionDotToken(node) {
      return node.kind === 28;
    }
    ts2.isQuestionDotToken = isQuestionDotToken;
    function isEqualsGreaterThanToken(node) {
      return node.kind === 38;
    }
    ts2.isEqualsGreaterThanToken = isEqualsGreaterThanToken;
    function isIdentifier(node) {
      return node.kind === 79;
    }
    ts2.isIdentifier = isIdentifier;
    function isPrivateIdentifier(node) {
      return node.kind === 80;
    }
    ts2.isPrivateIdentifier = isPrivateIdentifier;
    function isExportModifier(node) {
      return node.kind === 93;
    }
    ts2.isExportModifier = isExportModifier;
    function isAsyncModifier(node) {
      return node.kind === 131;
    }
    ts2.isAsyncModifier = isAsyncModifier;
    function isAssertsKeyword(node) {
      return node.kind === 128;
    }
    ts2.isAssertsKeyword = isAssertsKeyword;
    function isAwaitKeyword(node) {
      return node.kind === 132;
    }
    ts2.isAwaitKeyword = isAwaitKeyword;
    function isReadonlyKeyword(node) {
      return node.kind === 144;
    }
    ts2.isReadonlyKeyword = isReadonlyKeyword;
    function isStaticModifier(node) {
      return node.kind === 124;
    }
    ts2.isStaticModifier = isStaticModifier;
    function isAbstractModifier(node) {
      return node.kind === 126;
    }
    ts2.isAbstractModifier = isAbstractModifier;
    function isSuperKeyword(node) {
      return node.kind === 106;
    }
    ts2.isSuperKeyword = isSuperKeyword;
    function isImportKeyword(node) {
      return node.kind === 100;
    }
    ts2.isImportKeyword = isImportKeyword;
    function isQualifiedName(node) {
      return node.kind === 160;
    }
    ts2.isQualifiedName = isQualifiedName;
    function isComputedPropertyName(node) {
      return node.kind === 161;
    }
    ts2.isComputedPropertyName = isComputedPropertyName;
    function isTypeParameterDeclaration(node) {
      return node.kind === 162;
    }
    ts2.isTypeParameterDeclaration = isTypeParameterDeclaration;
    function isParameter(node) {
      return node.kind === 163;
    }
    ts2.isParameter = isParameter;
    function isDecorator(node) {
      return node.kind === 164;
    }
    ts2.isDecorator = isDecorator;
    function isPropertySignature(node) {
      return node.kind === 165;
    }
    ts2.isPropertySignature = isPropertySignature;
    function isPropertyDeclaration(node) {
      return node.kind === 166;
    }
    ts2.isPropertyDeclaration = isPropertyDeclaration;
    function isMethodSignature(node) {
      return node.kind === 167;
    }
    ts2.isMethodSignature = isMethodSignature;
    function isMethodDeclaration(node) {
      return node.kind === 168;
    }
    ts2.isMethodDeclaration = isMethodDeclaration;
    function isClassStaticBlockDeclaration(node) {
      return node.kind === 169;
    }
    ts2.isClassStaticBlockDeclaration = isClassStaticBlockDeclaration;
    function isConstructorDeclaration(node) {
      return node.kind === 170;
    }
    ts2.isConstructorDeclaration = isConstructorDeclaration;
    function isGetAccessorDeclaration(node) {
      return node.kind === 171;
    }
    ts2.isGetAccessorDeclaration = isGetAccessorDeclaration;
    function isSetAccessorDeclaration(node) {
      return node.kind === 172;
    }
    ts2.isSetAccessorDeclaration = isSetAccessorDeclaration;
    function isCallSignatureDeclaration(node) {
      return node.kind === 173;
    }
    ts2.isCallSignatureDeclaration = isCallSignatureDeclaration;
    function isConstructSignatureDeclaration(node) {
      return node.kind === 174;
    }
    ts2.isConstructSignatureDeclaration = isConstructSignatureDeclaration;
    function isIndexSignatureDeclaration(node) {
      return node.kind === 175;
    }
    ts2.isIndexSignatureDeclaration = isIndexSignatureDeclaration;
    function isTypePredicateNode(node) {
      return node.kind === 176;
    }
    ts2.isTypePredicateNode = isTypePredicateNode;
    function isTypeReferenceNode(node) {
      return node.kind === 177;
    }
    ts2.isTypeReferenceNode = isTypeReferenceNode;
    function isFunctionTypeNode(node) {
      return node.kind === 178;
    }
    ts2.isFunctionTypeNode = isFunctionTypeNode;
    function isConstructorTypeNode(node) {
      return node.kind === 179;
    }
    ts2.isConstructorTypeNode = isConstructorTypeNode;
    function isTypeQueryNode(node) {
      return node.kind === 180;
    }
    ts2.isTypeQueryNode = isTypeQueryNode;
    function isTypeLiteralNode(node) {
      return node.kind === 181;
    }
    ts2.isTypeLiteralNode = isTypeLiteralNode;
    function isArrayTypeNode(node) {
      return node.kind === 182;
    }
    ts2.isArrayTypeNode = isArrayTypeNode;
    function isTupleTypeNode(node) {
      return node.kind === 183;
    }
    ts2.isTupleTypeNode = isTupleTypeNode;
    function isNamedTupleMember(node) {
      return node.kind === 196;
    }
    ts2.isNamedTupleMember = isNamedTupleMember;
    function isOptionalTypeNode(node) {
      return node.kind === 184;
    }
    ts2.isOptionalTypeNode = isOptionalTypeNode;
    function isRestTypeNode(node) {
      return node.kind === 185;
    }
    ts2.isRestTypeNode = isRestTypeNode;
    function isUnionTypeNode(node) {
      return node.kind === 186;
    }
    ts2.isUnionTypeNode = isUnionTypeNode;
    function isIntersectionTypeNode(node) {
      return node.kind === 187;
    }
    ts2.isIntersectionTypeNode = isIntersectionTypeNode;
    function isConditionalTypeNode(node) {
      return node.kind === 188;
    }
    ts2.isConditionalTypeNode = isConditionalTypeNode;
    function isInferTypeNode(node) {
      return node.kind === 189;
    }
    ts2.isInferTypeNode = isInferTypeNode;
    function isParenthesizedTypeNode(node) {
      return node.kind === 190;
    }
    ts2.isParenthesizedTypeNode = isParenthesizedTypeNode;
    function isThisTypeNode(node) {
      return node.kind === 191;
    }
    ts2.isThisTypeNode = isThisTypeNode;
    function isTypeOperatorNode(node) {
      return node.kind === 192;
    }
    ts2.isTypeOperatorNode = isTypeOperatorNode;
    function isIndexedAccessTypeNode(node) {
      return node.kind === 193;
    }
    ts2.isIndexedAccessTypeNode = isIndexedAccessTypeNode;
    function isMappedTypeNode(node) {
      return node.kind === 194;
    }
    ts2.isMappedTypeNode = isMappedTypeNode;
    function isLiteralTypeNode(node) {
      return node.kind === 195;
    }
    ts2.isLiteralTypeNode = isLiteralTypeNode;
    function isImportTypeNode(node) {
      return node.kind === 199;
    }
    ts2.isImportTypeNode = isImportTypeNode;
    function isTemplateLiteralTypeSpan(node) {
      return node.kind === 198;
    }
    ts2.isTemplateLiteralTypeSpan = isTemplateLiteralTypeSpan;
    function isTemplateLiteralTypeNode(node) {
      return node.kind === 197;
    }
    ts2.isTemplateLiteralTypeNode = isTemplateLiteralTypeNode;
    function isObjectBindingPattern(node) {
      return node.kind === 200;
    }
    ts2.isObjectBindingPattern = isObjectBindingPattern;
    function isArrayBindingPattern(node) {
      return node.kind === 201;
    }
    ts2.isArrayBindingPattern = isArrayBindingPattern;
    function isBindingElement(node) {
      return node.kind === 202;
    }
    ts2.isBindingElement = isBindingElement;
    function isArrayLiteralExpression(node) {
      return node.kind === 203;
    }
    ts2.isArrayLiteralExpression = isArrayLiteralExpression;
    function isObjectLiteralExpression(node) {
      return node.kind === 204;
    }
    ts2.isObjectLiteralExpression = isObjectLiteralExpression;
    function isPropertyAccessExpression(node) {
      return node.kind === 205;
    }
    ts2.isPropertyAccessExpression = isPropertyAccessExpression;
    function isElementAccessExpression(node) {
      return node.kind === 206;
    }
    ts2.isElementAccessExpression = isElementAccessExpression;
    function isCallExpression(node) {
      return node.kind === 207;
    }
    ts2.isCallExpression = isCallExpression;
    function isNewExpression(node) {
      return node.kind === 208;
    }
    ts2.isNewExpression = isNewExpression;
    function isTaggedTemplateExpression(node) {
      return node.kind === 209;
    }
    ts2.isTaggedTemplateExpression = isTaggedTemplateExpression;
    function isTypeAssertionExpression(node) {
      return node.kind === 210;
    }
    ts2.isTypeAssertionExpression = isTypeAssertionExpression;
    function isParenthesizedExpression(node) {
      return node.kind === 211;
    }
    ts2.isParenthesizedExpression = isParenthesizedExpression;
    function isFunctionExpression(node) {
      return node.kind === 212;
    }
    ts2.isFunctionExpression = isFunctionExpression;
    function isArrowFunction(node) {
      return node.kind === 213;
    }
    ts2.isArrowFunction = isArrowFunction;
    function isDeleteExpression(node) {
      return node.kind === 214;
    }
    ts2.isDeleteExpression = isDeleteExpression;
    function isTypeOfExpression(node) {
      return node.kind === 215;
    }
    ts2.isTypeOfExpression = isTypeOfExpression;
    function isVoidExpression(node) {
      return node.kind === 216;
    }
    ts2.isVoidExpression = isVoidExpression;
    function isAwaitExpression(node) {
      return node.kind === 217;
    }
    ts2.isAwaitExpression = isAwaitExpression;
    function isPrefixUnaryExpression(node) {
      return node.kind === 218;
    }
    ts2.isPrefixUnaryExpression = isPrefixUnaryExpression;
    function isPostfixUnaryExpression(node) {
      return node.kind === 219;
    }
    ts2.isPostfixUnaryExpression = isPostfixUnaryExpression;
    function isBinaryExpression(node) {
      return node.kind === 220;
    }
    ts2.isBinaryExpression = isBinaryExpression;
    function isConditionalExpression(node) {
      return node.kind === 221;
    }
    ts2.isConditionalExpression = isConditionalExpression;
    function isTemplateExpression(node) {
      return node.kind === 222;
    }
    ts2.isTemplateExpression = isTemplateExpression;
    function isYieldExpression(node) {
      return node.kind === 223;
    }
    ts2.isYieldExpression = isYieldExpression;
    function isSpreadElement(node) {
      return node.kind === 224;
    }
    ts2.isSpreadElement = isSpreadElement;
    function isClassExpression(node) {
      return node.kind === 225;
    }
    ts2.isClassExpression = isClassExpression;
    function isOmittedExpression(node) {
      return node.kind === 226;
    }
    ts2.isOmittedExpression = isOmittedExpression;
    function isExpressionWithTypeArguments(node) {
      return node.kind === 227;
    }
    ts2.isExpressionWithTypeArguments = isExpressionWithTypeArguments;
    function isAsExpression(node) {
      return node.kind === 228;
    }
    ts2.isAsExpression = isAsExpression;
    function isNonNullExpression(node) {
      return node.kind === 229;
    }
    ts2.isNonNullExpression = isNonNullExpression;
    function isMetaProperty(node) {
      return node.kind === 230;
    }
    ts2.isMetaProperty = isMetaProperty;
    function isSyntheticExpression(node) {
      return node.kind === 231;
    }
    ts2.isSyntheticExpression = isSyntheticExpression;
    function isPartiallyEmittedExpression(node) {
      return node.kind === 348;
    }
    ts2.isPartiallyEmittedExpression = isPartiallyEmittedExpression;
    function isCommaListExpression(node) {
      return node.kind === 349;
    }
    ts2.isCommaListExpression = isCommaListExpression;
    function isTemplateSpan(node) {
      return node.kind === 232;
    }
    ts2.isTemplateSpan = isTemplateSpan;
    function isSemicolonClassElement(node) {
      return node.kind === 233;
    }
    ts2.isSemicolonClassElement = isSemicolonClassElement;
    function isBlock(node) {
      return node.kind === 234;
    }
    ts2.isBlock = isBlock;
    function isVariableStatement(node) {
      return node.kind === 236;
    }
    ts2.isVariableStatement = isVariableStatement;
    function isEmptyStatement(node) {
      return node.kind === 235;
    }
    ts2.isEmptyStatement = isEmptyStatement;
    function isExpressionStatement(node) {
      return node.kind === 237;
    }
    ts2.isExpressionStatement = isExpressionStatement;
    function isIfStatement(node) {
      return node.kind === 238;
    }
    ts2.isIfStatement = isIfStatement;
    function isDoStatement(node) {
      return node.kind === 239;
    }
    ts2.isDoStatement = isDoStatement;
    function isWhileStatement(node) {
      return node.kind === 240;
    }
    ts2.isWhileStatement = isWhileStatement;
    function isForStatement(node) {
      return node.kind === 241;
    }
    ts2.isForStatement = isForStatement;
    function isForInStatement(node) {
      return node.kind === 242;
    }
    ts2.isForInStatement = isForInStatement;
    function isForOfStatement(node) {
      return node.kind === 243;
    }
    ts2.isForOfStatement = isForOfStatement;
    function isContinueStatement(node) {
      return node.kind === 244;
    }
    ts2.isContinueStatement = isContinueStatement;
    function isBreakStatement(node) {
      return node.kind === 245;
    }
    ts2.isBreakStatement = isBreakStatement;
    function isReturnStatement(node) {
      return node.kind === 246;
    }
    ts2.isReturnStatement = isReturnStatement;
    function isWithStatement(node) {
      return node.kind === 247;
    }
    ts2.isWithStatement = isWithStatement;
    function isSwitchStatement(node) {
      return node.kind === 248;
    }
    ts2.isSwitchStatement = isSwitchStatement;
    function isLabeledStatement(node) {
      return node.kind === 249;
    }
    ts2.isLabeledStatement = isLabeledStatement;
    function isThrowStatement(node) {
      return node.kind === 250;
    }
    ts2.isThrowStatement = isThrowStatement;
    function isTryStatement(node) {
      return node.kind === 251;
    }
    ts2.isTryStatement = isTryStatement;
    function isDebuggerStatement(node) {
      return node.kind === 252;
    }
    ts2.isDebuggerStatement = isDebuggerStatement;
    function isVariableDeclaration(node) {
      return node.kind === 253;
    }
    ts2.isVariableDeclaration = isVariableDeclaration;
    function isVariableDeclarationList(node) {
      return node.kind === 254;
    }
    ts2.isVariableDeclarationList = isVariableDeclarationList;
    function isFunctionDeclaration(node) {
      return node.kind === 255;
    }
    ts2.isFunctionDeclaration = isFunctionDeclaration;
    function isClassDeclaration(node) {
      return node.kind === 256;
    }
    ts2.isClassDeclaration = isClassDeclaration;
    function isInterfaceDeclaration(node) {
      return node.kind === 257;
    }
    ts2.isInterfaceDeclaration = isInterfaceDeclaration;
    function isTypeAliasDeclaration(node) {
      return node.kind === 258;
    }
    ts2.isTypeAliasDeclaration = isTypeAliasDeclaration;
    function isEnumDeclaration(node) {
      return node.kind === 259;
    }
    ts2.isEnumDeclaration = isEnumDeclaration;
    function isModuleDeclaration(node) {
      return node.kind === 260;
    }
    ts2.isModuleDeclaration = isModuleDeclaration;
    function isModuleBlock(node) {
      return node.kind === 261;
    }
    ts2.isModuleBlock = isModuleBlock;
    function isCaseBlock(node) {
      return node.kind === 262;
    }
    ts2.isCaseBlock = isCaseBlock;
    function isNamespaceExportDeclaration(node) {
      return node.kind === 263;
    }
    ts2.isNamespaceExportDeclaration = isNamespaceExportDeclaration;
    function isImportEqualsDeclaration(node) {
      return node.kind === 264;
    }
    ts2.isImportEqualsDeclaration = isImportEqualsDeclaration;
    function isImportDeclaration(node) {
      return node.kind === 265;
    }
    ts2.isImportDeclaration = isImportDeclaration;
    function isImportClause(node) {
      return node.kind === 266;
    }
    ts2.isImportClause = isImportClause;
    function isAssertClause(node) {
      return node.kind === 292;
    }
    ts2.isAssertClause = isAssertClause;
    function isAssertEntry(node) {
      return node.kind === 293;
    }
    ts2.isAssertEntry = isAssertEntry;
    function isNamespaceImport(node) {
      return node.kind === 267;
    }
    ts2.isNamespaceImport = isNamespaceImport;
    function isNamespaceExport(node) {
      return node.kind === 273;
    }
    ts2.isNamespaceExport = isNamespaceExport;
    function isNamedImports(node) {
      return node.kind === 268;
    }
    ts2.isNamedImports = isNamedImports;
    function isImportSpecifier(node) {
      return node.kind === 269;
    }
    ts2.isImportSpecifier = isImportSpecifier;
    function isExportAssignment(node) {
      return node.kind === 270;
    }
    ts2.isExportAssignment = isExportAssignment;
    function isExportDeclaration(node) {
      return node.kind === 271;
    }
    ts2.isExportDeclaration = isExportDeclaration;
    function isNamedExports(node) {
      return node.kind === 272;
    }
    ts2.isNamedExports = isNamedExports;
    function isExportSpecifier(node) {
      return node.kind === 274;
    }
    ts2.isExportSpecifier = isExportSpecifier;
    function isMissingDeclaration(node) {
      return node.kind === 275;
    }
    ts2.isMissingDeclaration = isMissingDeclaration;
    function isNotEmittedStatement(node) {
      return node.kind === 347;
    }
    ts2.isNotEmittedStatement = isNotEmittedStatement;
    function isSyntheticReference(node) {
      return node.kind === 352;
    }
    ts2.isSyntheticReference = isSyntheticReference;
    function isMergeDeclarationMarker(node) {
      return node.kind === 350;
    }
    ts2.isMergeDeclarationMarker = isMergeDeclarationMarker;
    function isEndOfDeclarationMarker(node) {
      return node.kind === 351;
    }
    ts2.isEndOfDeclarationMarker = isEndOfDeclarationMarker;
    function isExternalModuleReference(node) {
      return node.kind === 276;
    }
    ts2.isExternalModuleReference = isExternalModuleReference;
    function isJsxElement(node) {
      return node.kind === 277;
    }
    ts2.isJsxElement = isJsxElement;
    function isJsxSelfClosingElement(node) {
      return node.kind === 278;
    }
    ts2.isJsxSelfClosingElement = isJsxSelfClosingElement;
    function isJsxOpeningElement(node) {
      return node.kind === 279;
    }
    ts2.isJsxOpeningElement = isJsxOpeningElement;
    function isJsxClosingElement(node) {
      return node.kind === 280;
    }
    ts2.isJsxClosingElement = isJsxClosingElement;
    function isJsxFragment(node) {
      return node.kind === 281;
    }
    ts2.isJsxFragment = isJsxFragment;
    function isJsxOpeningFragment(node) {
      return node.kind === 282;
    }
    ts2.isJsxOpeningFragment = isJsxOpeningFragment;
    function isJsxClosingFragment(node) {
      return node.kind === 283;
    }
    ts2.isJsxClosingFragment = isJsxClosingFragment;
    function isJsxAttribute(node) {
      return node.kind === 284;
    }
    ts2.isJsxAttribute = isJsxAttribute;
    function isJsxAttributes(node) {
      return node.kind === 285;
    }
    ts2.isJsxAttributes = isJsxAttributes;
    function isJsxSpreadAttribute(node) {
      return node.kind === 286;
    }
    ts2.isJsxSpreadAttribute = isJsxSpreadAttribute;
    function isJsxExpression(node) {
      return node.kind === 287;
    }
    ts2.isJsxExpression = isJsxExpression;
    function isCaseClause(node) {
      return node.kind === 288;
    }
    ts2.isCaseClause = isCaseClause;
    function isDefaultClause(node) {
      return node.kind === 289;
    }
    ts2.isDefaultClause = isDefaultClause;
    function isHeritageClause(node) {
      return node.kind === 290;
    }
    ts2.isHeritageClause = isHeritageClause;
    function isCatchClause(node) {
      return node.kind === 291;
    }
    ts2.isCatchClause = isCatchClause;
    function isPropertyAssignment(node) {
      return node.kind === 294;
    }
    ts2.isPropertyAssignment = isPropertyAssignment;
    function isShorthandPropertyAssignment(node) {
      return node.kind === 295;
    }
    ts2.isShorthandPropertyAssignment = isShorthandPropertyAssignment;
    function isSpreadAssignment(node) {
      return node.kind === 296;
    }
    ts2.isSpreadAssignment = isSpreadAssignment;
    function isEnumMember(node) {
      return node.kind === 297;
    }
    ts2.isEnumMember = isEnumMember;
    function isUnparsedPrepend(node) {
      return node.kind === 299;
    }
    ts2.isUnparsedPrepend = isUnparsedPrepend;
    function isSourceFile(node) {
      return node.kind === 303;
    }
    ts2.isSourceFile = isSourceFile;
    function isBundle(node) {
      return node.kind === 304;
    }
    ts2.isBundle = isBundle;
    function isUnparsedSource(node) {
      return node.kind === 305;
    }
    ts2.isUnparsedSource = isUnparsedSource;
    function isJSDocTypeExpression(node) {
      return node.kind === 307;
    }
    ts2.isJSDocTypeExpression = isJSDocTypeExpression;
    function isJSDocNameReference(node) {
      return node.kind === 308;
    }
    ts2.isJSDocNameReference = isJSDocNameReference;
    function isJSDocMemberName(node) {
      return node.kind === 309;
    }
    ts2.isJSDocMemberName = isJSDocMemberName;
    function isJSDocLink(node) {
      return node.kind === 322;
    }
    ts2.isJSDocLink = isJSDocLink;
    function isJSDocLinkCode(node) {
      return node.kind === 323;
    }
    ts2.isJSDocLinkCode = isJSDocLinkCode;
    function isJSDocLinkPlain(node) {
      return node.kind === 324;
    }
    ts2.isJSDocLinkPlain = isJSDocLinkPlain;
    function isJSDocAllType(node) {
      return node.kind === 310;
    }
    ts2.isJSDocAllType = isJSDocAllType;
    function isJSDocUnknownType(node) {
      return node.kind === 311;
    }
    ts2.isJSDocUnknownType = isJSDocUnknownType;
    function isJSDocNullableType(node) {
      return node.kind === 312;
    }
    ts2.isJSDocNullableType = isJSDocNullableType;
    function isJSDocNonNullableType(node) {
      return node.kind === 313;
    }
    ts2.isJSDocNonNullableType = isJSDocNonNullableType;
    function isJSDocOptionalType(node) {
      return node.kind === 314;
    }
    ts2.isJSDocOptionalType = isJSDocOptionalType;
    function isJSDocFunctionType(node) {
      return node.kind === 315;
    }
    ts2.isJSDocFunctionType = isJSDocFunctionType;
    function isJSDocVariadicType(node) {
      return node.kind === 316;
    }
    ts2.isJSDocVariadicType = isJSDocVariadicType;
    function isJSDocNamepathType(node) {
      return node.kind === 317;
    }
    ts2.isJSDocNamepathType = isJSDocNamepathType;
    function isJSDoc(node) {
      return node.kind === 318;
    }
    ts2.isJSDoc = isJSDoc;
    function isJSDocTypeLiteral(node) {
      return node.kind === 320;
    }
    ts2.isJSDocTypeLiteral = isJSDocTypeLiteral;
    function isJSDocSignature(node) {
      return node.kind === 321;
    }
    ts2.isJSDocSignature = isJSDocSignature;
    function isJSDocAugmentsTag(node) {
      return node.kind === 326;
    }
    ts2.isJSDocAugmentsTag = isJSDocAugmentsTag;
    function isJSDocAuthorTag(node) {
      return node.kind === 328;
    }
    ts2.isJSDocAuthorTag = isJSDocAuthorTag;
    function isJSDocClassTag(node) {
      return node.kind === 330;
    }
    ts2.isJSDocClassTag = isJSDocClassTag;
    function isJSDocCallbackTag(node) {
      return node.kind === 336;
    }
    ts2.isJSDocCallbackTag = isJSDocCallbackTag;
    function isJSDocPublicTag(node) {
      return node.kind === 331;
    }
    ts2.isJSDocPublicTag = isJSDocPublicTag;
    function isJSDocPrivateTag(node) {
      return node.kind === 332;
    }
    ts2.isJSDocPrivateTag = isJSDocPrivateTag;
    function isJSDocProtectedTag(node) {
      return node.kind === 333;
    }
    ts2.isJSDocProtectedTag = isJSDocProtectedTag;
    function isJSDocReadonlyTag(node) {
      return node.kind === 334;
    }
    ts2.isJSDocReadonlyTag = isJSDocReadonlyTag;
    function isJSDocOverrideTag(node) {
      return node.kind === 335;
    }
    ts2.isJSDocOverrideTag = isJSDocOverrideTag;
    function isJSDocDeprecatedTag(node) {
      return node.kind === 329;
    }
    ts2.isJSDocDeprecatedTag = isJSDocDeprecatedTag;
    function isJSDocSeeTag(node) {
      return node.kind === 344;
    }
    ts2.isJSDocSeeTag = isJSDocSeeTag;
    function isJSDocEnumTag(node) {
      return node.kind === 337;
    }
    ts2.isJSDocEnumTag = isJSDocEnumTag;
    function isJSDocParameterTag(node) {
      return node.kind === 338;
    }
    ts2.isJSDocParameterTag = isJSDocParameterTag;
    function isJSDocReturnTag(node) {
      return node.kind === 339;
    }
    ts2.isJSDocReturnTag = isJSDocReturnTag;
    function isJSDocThisTag(node) {
      return node.kind === 340;
    }
    ts2.isJSDocThisTag = isJSDocThisTag;
    function isJSDocTypeTag(node) {
      return node.kind === 341;
    }
    ts2.isJSDocTypeTag = isJSDocTypeTag;
    function isJSDocTemplateTag(node) {
      return node.kind === 342;
    }
    ts2.isJSDocTemplateTag = isJSDocTemplateTag;
    function isJSDocTypedefTag(node) {
      return node.kind === 343;
    }
    ts2.isJSDocTypedefTag = isJSDocTypedefTag;
    function isJSDocUnknownTag(node) {
      return node.kind === 325;
    }
    ts2.isJSDocUnknownTag = isJSDocUnknownTag;
    function isJSDocPropertyTag(node) {
      return node.kind === 345;
    }
    ts2.isJSDocPropertyTag = isJSDocPropertyTag;
    function isJSDocImplementsTag(node) {
      return node.kind === 327;
    }
    ts2.isJSDocImplementsTag = isJSDocImplementsTag;
    function isSyntaxList(n) {
      return n.kind === 346;
    }
    ts2.isSyntaxList = isSyntaxList;
  })(ts || (ts = {}));
  (function(ts2) {
    function createEmptyExports(factory) {
      return factory.createExportDeclaration(void 0, void 0, false, factory.createNamedExports([]), void 0);
    }
    ts2.createEmptyExports = createEmptyExports;
    function createMemberAccessForPropertyName(factory, target, memberName, location) {
      if (ts2.isComputedPropertyName(memberName)) {
        return ts2.setTextRange(factory.createElementAccessExpression(target, memberName.expression), location);
      } else {
        var expression = ts2.setTextRange(ts2.isMemberName(memberName) ? factory.createPropertyAccessExpression(target, memberName) : factory.createElementAccessExpression(target, memberName), memberName);
        ts2.getOrCreateEmitNode(expression).flags |= 64;
        return expression;
      }
    }
    ts2.createMemberAccessForPropertyName = createMemberAccessForPropertyName;
    function createReactNamespace(reactNamespace, parent) {
      var react = ts2.parseNodeFactory.createIdentifier(reactNamespace || "React");
      ts2.setParent(react, ts2.getParseTreeNode(parent));
      return react;
    }
    function createJsxFactoryExpressionFromEntityName(factory, jsxFactory, parent) {
      if (ts2.isQualifiedName(jsxFactory)) {
        var left = createJsxFactoryExpressionFromEntityName(factory, jsxFactory.left, parent);
        var right = factory.createIdentifier(ts2.idText(jsxFactory.right));
        right.escapedText = jsxFactory.right.escapedText;
        return factory.createPropertyAccessExpression(left, right);
      } else {
        return createReactNamespace(ts2.idText(jsxFactory), parent);
      }
    }
    function createJsxFactoryExpression(factory, jsxFactoryEntity, reactNamespace, parent) {
      return jsxFactoryEntity ? createJsxFactoryExpressionFromEntityName(factory, jsxFactoryEntity, parent) : factory.createPropertyAccessExpression(createReactNamespace(reactNamespace, parent), "createElement");
    }
    ts2.createJsxFactoryExpression = createJsxFactoryExpression;
    function createJsxFragmentFactoryExpression(factory, jsxFragmentFactoryEntity, reactNamespace, parent) {
      return jsxFragmentFactoryEntity ? createJsxFactoryExpressionFromEntityName(factory, jsxFragmentFactoryEntity, parent) : factory.createPropertyAccessExpression(createReactNamespace(reactNamespace, parent), "Fragment");
    }
    function createExpressionForJsxElement(factory, callee, tagName, props, children, location) {
      var argumentsList = [tagName];
      if (props) {
        argumentsList.push(props);
      }
      if (children && children.length > 0) {
        if (!props) {
          argumentsList.push(factory.createNull());
        }
        if (children.length > 1) {
          for (var _i = 0, children_3 = children; _i < children_3.length; _i++) {
            var child = children_3[_i];
            startOnNewLine(child);
            argumentsList.push(child);
          }
        } else {
          argumentsList.push(children[0]);
        }
      }
      return ts2.setTextRange(factory.createCallExpression(callee, void 0, argumentsList), location);
    }
    ts2.createExpressionForJsxElement = createExpressionForJsxElement;
    function createExpressionForJsxFragment(factory, jsxFactoryEntity, jsxFragmentFactoryEntity, reactNamespace, children, parentElement, location) {
      var tagName = createJsxFragmentFactoryExpression(factory, jsxFragmentFactoryEntity, reactNamespace, parentElement);
      var argumentsList = [tagName, factory.createNull()];
      if (children && children.length > 0) {
        if (children.length > 1) {
          for (var _i = 0, children_4 = children; _i < children_4.length; _i++) {
            var child = children_4[_i];
            startOnNewLine(child);
            argumentsList.push(child);
          }
        } else {
          argumentsList.push(children[0]);
        }
      }
      return ts2.setTextRange(factory.createCallExpression(createJsxFactoryExpression(factory, jsxFactoryEntity, reactNamespace, parentElement), void 0, argumentsList), location);
    }
    ts2.createExpressionForJsxFragment = createExpressionForJsxFragment;
    function createForOfBindingStatement(factory, node, boundValue) {
      if (ts2.isVariableDeclarationList(node)) {
        var firstDeclaration = ts2.first(node.declarations);
        var updatedDeclaration = factory.updateVariableDeclaration(firstDeclaration, firstDeclaration.name, void 0, void 0, boundValue);
        return ts2.setTextRange(factory.createVariableStatement(void 0, factory.updateVariableDeclarationList(node, [updatedDeclaration])), node);
      } else {
        var updatedExpression = ts2.setTextRange(factory.createAssignment(node, boundValue), node);
        return ts2.setTextRange(factory.createExpressionStatement(updatedExpression), node);
      }
    }
    ts2.createForOfBindingStatement = createForOfBindingStatement;
    function insertLeadingStatement(factory, dest, source) {
      if (ts2.isBlock(dest)) {
        return factory.updateBlock(dest, ts2.setTextRange(factory.createNodeArray(__spreadArray([source], dest.statements, true)), dest.statements));
      } else {
        return factory.createBlock(factory.createNodeArray([dest, source]), true);
      }
    }
    ts2.insertLeadingStatement = insertLeadingStatement;
    function createExpressionFromEntityName(factory, node) {
      if (ts2.isQualifiedName(node)) {
        var left = createExpressionFromEntityName(factory, node.left);
        var right = ts2.setParent(ts2.setTextRange(factory.cloneNode(node.right), node.right), node.right.parent);
        return ts2.setTextRange(factory.createPropertyAccessExpression(left, right), node);
      } else {
        return ts2.setParent(ts2.setTextRange(factory.cloneNode(node), node), node.parent);
      }
    }
    ts2.createExpressionFromEntityName = createExpressionFromEntityName;
    function createExpressionForPropertyName(factory, memberName) {
      if (ts2.isIdentifier(memberName)) {
        return factory.createStringLiteralFromNode(memberName);
      } else if (ts2.isComputedPropertyName(memberName)) {
        return ts2.setParent(ts2.setTextRange(factory.cloneNode(memberName.expression), memberName.expression), memberName.expression.parent);
      } else {
        return ts2.setParent(ts2.setTextRange(factory.cloneNode(memberName), memberName), memberName.parent);
      }
    }
    ts2.createExpressionForPropertyName = createExpressionForPropertyName;
    function createExpressionForAccessorDeclaration(factory, properties, property, receiver, multiLine) {
      var _a = ts2.getAllAccessorDeclarations(properties, property), firstAccessor = _a.firstAccessor, getAccessor = _a.getAccessor, setAccessor = _a.setAccessor;
      if (property === firstAccessor) {
        return ts2.setTextRange(factory.createObjectDefinePropertyCall(receiver, createExpressionForPropertyName(factory, property.name), factory.createPropertyDescriptor({
          enumerable: factory.createFalse(),
          configurable: true,
          get: getAccessor && ts2.setTextRange(ts2.setOriginalNode(factory.createFunctionExpression(getAccessor.modifiers, void 0, void 0, void 0, getAccessor.parameters, void 0, getAccessor.body), getAccessor), getAccessor),
          set: setAccessor && ts2.setTextRange(ts2.setOriginalNode(factory.createFunctionExpression(setAccessor.modifiers, void 0, void 0, void 0, setAccessor.parameters, void 0, setAccessor.body), setAccessor), setAccessor)
        }, !multiLine)), firstAccessor);
      }
      return void 0;
    }
    function createExpressionForPropertyAssignment(factory, property, receiver) {
      return ts2.setOriginalNode(ts2.setTextRange(factory.createAssignment(createMemberAccessForPropertyName(factory, receiver, property.name, property.name), property.initializer), property), property);
    }
    function createExpressionForShorthandPropertyAssignment(factory, property, receiver) {
      return ts2.setOriginalNode(ts2.setTextRange(factory.createAssignment(createMemberAccessForPropertyName(factory, receiver, property.name, property.name), factory.cloneNode(property.name)), property), property);
    }
    function createExpressionForMethodDeclaration(factory, method, receiver) {
      return ts2.setOriginalNode(ts2.setTextRange(factory.createAssignment(createMemberAccessForPropertyName(factory, receiver, method.name, method.name), ts2.setOriginalNode(ts2.setTextRange(factory.createFunctionExpression(method.modifiers, method.asteriskToken, void 0, void 0, method.parameters, void 0, method.body), method), method)), method), method);
    }
    function createExpressionForObjectLiteralElementLike(factory, node, property, receiver) {
      if (property.name && ts2.isPrivateIdentifier(property.name)) {
        ts2.Debug.failBadSyntaxKind(property.name, "Private identifiers are not allowed in object literals.");
      }
      switch (property.kind) {
        case 171:
        case 172:
          return createExpressionForAccessorDeclaration(factory, node.properties, property, receiver, !!node.multiLine);
        case 294:
          return createExpressionForPropertyAssignment(factory, property, receiver);
        case 295:
          return createExpressionForShorthandPropertyAssignment(factory, property, receiver);
        case 168:
          return createExpressionForMethodDeclaration(factory, property, receiver);
      }
    }
    ts2.createExpressionForObjectLiteralElementLike = createExpressionForObjectLiteralElementLike;
    function expandPreOrPostfixIncrementOrDecrementExpression(factory, node, expression, recordTempVariable, resultVariable) {
      var operator = node.operator;
      ts2.Debug.assert(operator === 45 || operator === 46, "Expected 'node' to be a pre- or post-increment or pre- or post-decrement expression");
      var temp = factory.createTempVariable(recordTempVariable);
      expression = factory.createAssignment(temp, expression);
      ts2.setTextRange(expression, node.operand);
      var operation = ts2.isPrefixUnaryExpression(node) ? factory.createPrefixUnaryExpression(operator, temp) : factory.createPostfixUnaryExpression(temp, operator);
      ts2.setTextRange(operation, node);
      if (resultVariable) {
        operation = factory.createAssignment(resultVariable, operation);
        ts2.setTextRange(operation, node);
      }
      expression = factory.createComma(expression, operation);
      ts2.setTextRange(expression, node);
      if (ts2.isPostfixUnaryExpression(node)) {
        expression = factory.createComma(expression, temp);
        ts2.setTextRange(expression, node);
      }
      return expression;
    }
    ts2.expandPreOrPostfixIncrementOrDecrementExpression = expandPreOrPostfixIncrementOrDecrementExpression;
    function isInternalName(node) {
      return (ts2.getEmitFlags(node) & 32768) !== 0;
    }
    ts2.isInternalName = isInternalName;
    function isLocalName(node) {
      return (ts2.getEmitFlags(node) & 16384) !== 0;
    }
    ts2.isLocalName = isLocalName;
    function isExportName(node) {
      return (ts2.getEmitFlags(node) & 8192) !== 0;
    }
    ts2.isExportName = isExportName;
    function isUseStrictPrologue(node) {
      return ts2.isStringLiteral(node.expression) && node.expression.text === "use strict";
    }
    function findUseStrictPrologue(statements) {
      for (var _i = 0, statements_1 = statements; _i < statements_1.length; _i++) {
        var statement = statements_1[_i];
        if (ts2.isPrologueDirective(statement)) {
          if (isUseStrictPrologue(statement)) {
            return statement;
          }
        } else {
          break;
        }
      }
      return void 0;
    }
    ts2.findUseStrictPrologue = findUseStrictPrologue;
    function startsWithUseStrict(statements) {
      var firstStatement = ts2.firstOrUndefined(statements);
      return firstStatement !== void 0 && ts2.isPrologueDirective(firstStatement) && isUseStrictPrologue(firstStatement);
    }
    ts2.startsWithUseStrict = startsWithUseStrict;
    function isCommaSequence(node) {
      return node.kind === 220 && node.operatorToken.kind === 27 || node.kind === 349;
    }
    ts2.isCommaSequence = isCommaSequence;
    function isJSDocTypeAssertion(node) {
      return ts2.isParenthesizedExpression(node) && ts2.isInJSFile(node) && !!ts2.getJSDocTypeTag(node);
    }
    ts2.isJSDocTypeAssertion = isJSDocTypeAssertion;
    function getJSDocTypeAssertionType(node) {
      var type = ts2.getJSDocType(node);
      ts2.Debug.assertIsDefined(type);
      return type;
    }
    ts2.getJSDocTypeAssertionType = getJSDocTypeAssertionType;
    function isOuterExpression(node, kinds) {
      if (kinds === void 0) {
        kinds = 15;
      }
      switch (node.kind) {
        case 211:
          if (kinds & 16 && isJSDocTypeAssertion(node)) {
            return false;
          }
          return (kinds & 1) !== 0;
        case 210:
        case 228:
          return (kinds & 2) !== 0;
        case 229:
          return (kinds & 4) !== 0;
        case 348:
          return (kinds & 8) !== 0;
      }
      return false;
    }
    ts2.isOuterExpression = isOuterExpression;
    function skipOuterExpressions(node, kinds) {
      if (kinds === void 0) {
        kinds = 15;
      }
      while (isOuterExpression(node, kinds)) {
        node = node.expression;
      }
      return node;
    }
    ts2.skipOuterExpressions = skipOuterExpressions;
    function skipAssertions(node) {
      return skipOuterExpressions(node, 6);
    }
    ts2.skipAssertions = skipAssertions;
    function startOnNewLine(node) {
      return ts2.setStartsOnNewLine(node, true);
    }
    ts2.startOnNewLine = startOnNewLine;
    function getExternalHelpersModuleName(node) {
      var parseNode = ts2.getOriginalNode(node, ts2.isSourceFile);
      var emitNode = parseNode && parseNode.emitNode;
      return emitNode && emitNode.externalHelpersModuleName;
    }
    ts2.getExternalHelpersModuleName = getExternalHelpersModuleName;
    function hasRecordedExternalHelpers(sourceFile) {
      var parseNode = ts2.getOriginalNode(sourceFile, ts2.isSourceFile);
      var emitNode = parseNode && parseNode.emitNode;
      return !!emitNode && (!!emitNode.externalHelpersModuleName || !!emitNode.externalHelpers);
    }
    ts2.hasRecordedExternalHelpers = hasRecordedExternalHelpers;
    function createExternalHelpersImportDeclarationIfNeeded(nodeFactory, helperFactory, sourceFile, compilerOptions, hasExportStarsToExportValues, hasImportStar, hasImportDefault) {
      if (compilerOptions.importHelpers && ts2.isEffectiveExternalModule(sourceFile, compilerOptions)) {
        var namedBindings = void 0;
        var moduleKind = ts2.getEmitModuleKind(compilerOptions);
        if (moduleKind >= ts2.ModuleKind.ES2015 && moduleKind <= ts2.ModuleKind.ESNext || sourceFile.impliedNodeFormat === ts2.ModuleKind.ESNext) {
          var helpers = ts2.getEmitHelpers(sourceFile);
          if (helpers) {
            var helperNames = [];
            for (var _i = 0, helpers_3 = helpers; _i < helpers_3.length; _i++) {
              var helper = helpers_3[_i];
              if (!helper.scoped) {
                var importName = helper.importName;
                if (importName) {
                  ts2.pushIfUnique(helperNames, importName);
                }
              }
            }
            if (ts2.some(helperNames)) {
              helperNames.sort(ts2.compareStringsCaseSensitive);
              namedBindings = nodeFactory.createNamedImports(ts2.map(helperNames, function(name) {
                return ts2.isFileLevelUniqueName(sourceFile, name) ? nodeFactory.createImportSpecifier(false, void 0, nodeFactory.createIdentifier(name)) : nodeFactory.createImportSpecifier(false, nodeFactory.createIdentifier(name), helperFactory.getUnscopedHelperName(name));
              }));
              var parseNode = ts2.getOriginalNode(sourceFile, ts2.isSourceFile);
              var emitNode = ts2.getOrCreateEmitNode(parseNode);
              emitNode.externalHelpers = true;
            }
          }
        } else {
          var externalHelpersModuleName = getOrCreateExternalHelpersModuleNameIfNeeded(nodeFactory, sourceFile, compilerOptions, hasExportStarsToExportValues, hasImportStar || hasImportDefault);
          if (externalHelpersModuleName) {
            namedBindings = nodeFactory.createNamespaceImport(externalHelpersModuleName);
          }
        }
        if (namedBindings) {
          var externalHelpersImportDeclaration = nodeFactory.createImportDeclaration(void 0, void 0, nodeFactory.createImportClause(false, void 0, namedBindings), nodeFactory.createStringLiteral(ts2.externalHelpersModuleNameText), void 0);
          ts2.addEmitFlags(externalHelpersImportDeclaration, 67108864);
          return externalHelpersImportDeclaration;
        }
      }
    }
    ts2.createExternalHelpersImportDeclarationIfNeeded = createExternalHelpersImportDeclarationIfNeeded;
    function getOrCreateExternalHelpersModuleNameIfNeeded(factory, node, compilerOptions, hasExportStarsToExportValues, hasImportStarOrImportDefault) {
      if (compilerOptions.importHelpers && ts2.isEffectiveExternalModule(node, compilerOptions)) {
        var externalHelpersModuleName = getExternalHelpersModuleName(node);
        if (externalHelpersModuleName) {
          return externalHelpersModuleName;
        }
        var moduleKind = ts2.getEmitModuleKind(compilerOptions);
        var create2 = (hasExportStarsToExportValues || ts2.getESModuleInterop(compilerOptions) && hasImportStarOrImportDefault) && moduleKind !== ts2.ModuleKind.System && (moduleKind < ts2.ModuleKind.ES2015 || node.impliedNodeFormat === ts2.ModuleKind.CommonJS);
        if (!create2) {
          var helpers = ts2.getEmitHelpers(node);
          if (helpers) {
            for (var _i = 0, helpers_4 = helpers; _i < helpers_4.length; _i++) {
              var helper = helpers_4[_i];
              if (!helper.scoped) {
                create2 = true;
                break;
              }
            }
          }
        }
        if (create2) {
          var parseNode = ts2.getOriginalNode(node, ts2.isSourceFile);
          var emitNode = ts2.getOrCreateEmitNode(parseNode);
          return emitNode.externalHelpersModuleName || (emitNode.externalHelpersModuleName = factory.createUniqueName(ts2.externalHelpersModuleNameText));
        }
      }
    }
    ts2.getOrCreateExternalHelpersModuleNameIfNeeded = getOrCreateExternalHelpersModuleNameIfNeeded;
    function getLocalNameForExternalImport(factory, node, sourceFile) {
      var namespaceDeclaration = ts2.getNamespaceDeclarationNode(node);
      if (namespaceDeclaration && !ts2.isDefaultImport(node) && !ts2.isExportNamespaceAsDefaultDeclaration(node)) {
        var name = namespaceDeclaration.name;
        return ts2.isGeneratedIdentifier(name) ? name : factory.createIdentifier(ts2.getSourceTextOfNodeFromSourceFile(sourceFile, name) || ts2.idText(name));
      }
      if (node.kind === 265 && node.importClause) {
        return factory.getGeneratedNameForNode(node);
      }
      if (node.kind === 271 && node.moduleSpecifier) {
        return factory.getGeneratedNameForNode(node);
      }
      return void 0;
    }
    ts2.getLocalNameForExternalImport = getLocalNameForExternalImport;
    function getExternalModuleNameLiteral(factory, importNode, sourceFile, host, resolver, compilerOptions) {
      var moduleName = ts2.getExternalModuleName(importNode);
      if (moduleName && ts2.isStringLiteral(moduleName)) {
        return tryGetModuleNameFromDeclaration(importNode, host, factory, resolver, compilerOptions) || tryRenameExternalModule(factory, moduleName, sourceFile) || factory.cloneNode(moduleName);
      }
      return void 0;
    }
    ts2.getExternalModuleNameLiteral = getExternalModuleNameLiteral;
    function tryRenameExternalModule(factory, moduleName, sourceFile) {
      var rename = sourceFile.renamedDependencies && sourceFile.renamedDependencies.get(moduleName.text);
      return rename ? factory.createStringLiteral(rename) : void 0;
    }
    function tryGetModuleNameFromFile(factory, file, host, options) {
      if (!file) {
        return void 0;
      }
      if (file.moduleName) {
        return factory.createStringLiteral(file.moduleName);
      }
      if (!file.isDeclarationFile && ts2.outFile(options)) {
        return factory.createStringLiteral(ts2.getExternalModuleNameFromPath(host, file.fileName));
      }
      return void 0;
    }
    ts2.tryGetModuleNameFromFile = tryGetModuleNameFromFile;
    function tryGetModuleNameFromDeclaration(declaration, host, factory, resolver, compilerOptions) {
      return tryGetModuleNameFromFile(factory, resolver.getExternalModuleFileFromDeclaration(declaration), host, compilerOptions);
    }
    function getInitializerOfBindingOrAssignmentElement(bindingElement) {
      if (ts2.isDeclarationBindingElement(bindingElement)) {
        return bindingElement.initializer;
      }
      if (ts2.isPropertyAssignment(bindingElement)) {
        var initializer = bindingElement.initializer;
        return ts2.isAssignmentExpression(initializer, true) ? initializer.right : void 0;
      }
      if (ts2.isShorthandPropertyAssignment(bindingElement)) {
        return bindingElement.objectAssignmentInitializer;
      }
      if (ts2.isAssignmentExpression(bindingElement, true)) {
        return bindingElement.right;
      }
      if (ts2.isSpreadElement(bindingElement)) {
        return getInitializerOfBindingOrAssignmentElement(bindingElement.expression);
      }
    }
    ts2.getInitializerOfBindingOrAssignmentElement = getInitializerOfBindingOrAssignmentElement;
    function getTargetOfBindingOrAssignmentElement(bindingElement) {
      if (ts2.isDeclarationBindingElement(bindingElement)) {
        return bindingElement.name;
      }
      if (ts2.isObjectLiteralElementLike(bindingElement)) {
        switch (bindingElement.kind) {
          case 294:
            return getTargetOfBindingOrAssignmentElement(bindingElement.initializer);
          case 295:
            return bindingElement.name;
          case 296:
            return getTargetOfBindingOrAssignmentElement(bindingElement.expression);
        }
        return void 0;
      }
      if (ts2.isAssignmentExpression(bindingElement, true)) {
        return getTargetOfBindingOrAssignmentElement(bindingElement.left);
      }
      if (ts2.isSpreadElement(bindingElement)) {
        return getTargetOfBindingOrAssignmentElement(bindingElement.expression);
      }
      return bindingElement;
    }
    ts2.getTargetOfBindingOrAssignmentElement = getTargetOfBindingOrAssignmentElement;
    function getRestIndicatorOfBindingOrAssignmentElement(bindingElement) {
      switch (bindingElement.kind) {
        case 163:
        case 202:
          return bindingElement.dotDotDotToken;
        case 224:
        case 296:
          return bindingElement;
      }
      return void 0;
    }
    ts2.getRestIndicatorOfBindingOrAssignmentElement = getRestIndicatorOfBindingOrAssignmentElement;
    function getPropertyNameOfBindingOrAssignmentElement(bindingElement) {
      var propertyName = tryGetPropertyNameOfBindingOrAssignmentElement(bindingElement);
      ts2.Debug.assert(!!propertyName || ts2.isSpreadAssignment(bindingElement), "Invalid property name for binding element.");
      return propertyName;
    }
    ts2.getPropertyNameOfBindingOrAssignmentElement = getPropertyNameOfBindingOrAssignmentElement;
    function tryGetPropertyNameOfBindingOrAssignmentElement(bindingElement) {
      switch (bindingElement.kind) {
        case 202:
          if (bindingElement.propertyName) {
            var propertyName = bindingElement.propertyName;
            if (ts2.isPrivateIdentifier(propertyName)) {
              return ts2.Debug.failBadSyntaxKind(propertyName);
            }
            return ts2.isComputedPropertyName(propertyName) && isStringOrNumericLiteral(propertyName.expression) ? propertyName.expression : propertyName;
          }
          break;
        case 294:
          if (bindingElement.name) {
            var propertyName = bindingElement.name;
            if (ts2.isPrivateIdentifier(propertyName)) {
              return ts2.Debug.failBadSyntaxKind(propertyName);
            }
            return ts2.isComputedPropertyName(propertyName) && isStringOrNumericLiteral(propertyName.expression) ? propertyName.expression : propertyName;
          }
          break;
        case 296:
          if (bindingElement.name && ts2.isPrivateIdentifier(bindingElement.name)) {
            return ts2.Debug.failBadSyntaxKind(bindingElement.name);
          }
          return bindingElement.name;
      }
      var target = getTargetOfBindingOrAssignmentElement(bindingElement);
      if (target && ts2.isPropertyName(target)) {
        return target;
      }
    }
    ts2.tryGetPropertyNameOfBindingOrAssignmentElement = tryGetPropertyNameOfBindingOrAssignmentElement;
    function isStringOrNumericLiteral(node) {
      var kind = node.kind;
      return kind === 10 || kind === 8;
    }
    function getElementsOfBindingOrAssignmentPattern(name) {
      switch (name.kind) {
        case 200:
        case 201:
        case 203:
          return name.elements;
        case 204:
          return name.properties;
      }
    }
    ts2.getElementsOfBindingOrAssignmentPattern = getElementsOfBindingOrAssignmentPattern;
    function getJSDocTypeAliasName(fullName) {
      if (fullName) {
        var rightNode = fullName;
        while (true) {
          if (ts2.isIdentifier(rightNode) || !rightNode.body) {
            return ts2.isIdentifier(rightNode) ? rightNode : rightNode.name;
          }
          rightNode = rightNode.body;
        }
      }
    }
    ts2.getJSDocTypeAliasName = getJSDocTypeAliasName;
    function canHaveModifiers(node) {
      var kind = node.kind;
      return kind === 163 || kind === 165 || kind === 166 || kind === 167 || kind === 168 || kind === 170 || kind === 171 || kind === 172 || kind === 175 || kind === 212 || kind === 213 || kind === 225 || kind === 236 || kind === 255 || kind === 256 || kind === 257 || kind === 258 || kind === 259 || kind === 260 || kind === 264 || kind === 265 || kind === 270 || kind === 271;
    }
    ts2.canHaveModifiers = canHaveModifiers;
    ts2.isTypeNodeOrTypeParameterDeclaration = ts2.or(ts2.isTypeNode, ts2.isTypeParameterDeclaration);
    ts2.isQuestionOrExclamationToken = ts2.or(ts2.isQuestionToken, ts2.isExclamationToken);
    ts2.isIdentifierOrThisTypeNode = ts2.or(ts2.isIdentifier, ts2.isThisTypeNode);
    ts2.isReadonlyKeywordOrPlusOrMinusToken = ts2.or(ts2.isReadonlyKeyword, ts2.isPlusToken, ts2.isMinusToken);
    ts2.isQuestionOrPlusOrMinusToken = ts2.or(ts2.isQuestionToken, ts2.isPlusToken, ts2.isMinusToken);
    ts2.isModuleName = ts2.or(ts2.isIdentifier, ts2.isStringLiteral);
    function isLiteralTypeLikeExpression(node) {
      var kind = node.kind;
      return kind === 104 || kind === 110 || kind === 95 || ts2.isLiteralExpression(node) || ts2.isPrefixUnaryExpression(node);
    }
    ts2.isLiteralTypeLikeExpression = isLiteralTypeLikeExpression;
    function isExponentiationOperator(kind) {
      return kind === 42;
    }
    function isMultiplicativeOperator(kind) {
      return kind === 41 || kind === 43 || kind === 44;
    }
    function isMultiplicativeOperatorOrHigher(kind) {
      return isExponentiationOperator(kind) || isMultiplicativeOperator(kind);
    }
    function isAdditiveOperator(kind) {
      return kind === 39 || kind === 40;
    }
    function isAdditiveOperatorOrHigher(kind) {
      return isAdditiveOperator(kind) || isMultiplicativeOperatorOrHigher(kind);
    }
    function isShiftOperator(kind) {
      return kind === 47 || kind === 48 || kind === 49;
    }
    function isShiftOperatorOrHigher(kind) {
      return isShiftOperator(kind) || isAdditiveOperatorOrHigher(kind);
    }
    function isRelationalOperator(kind) {
      return kind === 29 || kind === 32 || kind === 31 || kind === 33 || kind === 102 || kind === 101;
    }
    function isRelationalOperatorOrHigher(kind) {
      return isRelationalOperator(kind) || isShiftOperatorOrHigher(kind);
    }
    function isEqualityOperator(kind) {
      return kind === 34 || kind === 36 || kind === 35 || kind === 37;
    }
    function isEqualityOperatorOrHigher(kind) {
      return isEqualityOperator(kind) || isRelationalOperatorOrHigher(kind);
    }
    function isBitwiseOperator(kind) {
      return kind === 50 || kind === 51 || kind === 52;
    }
    function isBitwiseOperatorOrHigher(kind) {
      return isBitwiseOperator(kind) || isEqualityOperatorOrHigher(kind);
    }
    function isLogicalOperator(kind) {
      return kind === 55 || kind === 56;
    }
    function isLogicalOperatorOrHigher(kind) {
      return isLogicalOperator(kind) || isBitwiseOperatorOrHigher(kind);
    }
    function isAssignmentOperatorOrHigher(kind) {
      return kind === 60 || isLogicalOperatorOrHigher(kind) || ts2.isAssignmentOperator(kind);
    }
    function isBinaryOperator(kind) {
      return isAssignmentOperatorOrHigher(kind) || kind === 27;
    }
    function isBinaryOperatorToken(node) {
      return isBinaryOperator(node.kind);
    }
    ts2.isBinaryOperatorToken = isBinaryOperatorToken;
    var BinaryExpressionState;
    (function(BinaryExpressionState2) {
      function enter(machine, stackIndex, stateStack, nodeStack, userStateStack, _resultHolder, outerState) {
        var prevUserState = stackIndex > 0 ? userStateStack[stackIndex - 1] : void 0;
        ts2.Debug.assertEqual(stateStack[stackIndex], enter);
        userStateStack[stackIndex] = machine.onEnter(nodeStack[stackIndex], prevUserState, outerState);
        stateStack[stackIndex] = nextState(machine, enter);
        return stackIndex;
      }
      BinaryExpressionState2.enter = enter;
      function left(machine, stackIndex, stateStack, nodeStack, userStateStack, _resultHolder, _outerState) {
        ts2.Debug.assertEqual(stateStack[stackIndex], left);
        ts2.Debug.assertIsDefined(machine.onLeft);
        stateStack[stackIndex] = nextState(machine, left);
        var nextNode = machine.onLeft(nodeStack[stackIndex].left, userStateStack[stackIndex], nodeStack[stackIndex]);
        if (nextNode) {
          checkCircularity(stackIndex, nodeStack, nextNode);
          return pushStack(stackIndex, stateStack, nodeStack, userStateStack, nextNode);
        }
        return stackIndex;
      }
      BinaryExpressionState2.left = left;
      function operator(machine, stackIndex, stateStack, nodeStack, userStateStack, _resultHolder, _outerState) {
        ts2.Debug.assertEqual(stateStack[stackIndex], operator);
        ts2.Debug.assertIsDefined(machine.onOperator);
        stateStack[stackIndex] = nextState(machine, operator);
        machine.onOperator(nodeStack[stackIndex].operatorToken, userStateStack[stackIndex], nodeStack[stackIndex]);
        return stackIndex;
      }
      BinaryExpressionState2.operator = operator;
      function right(machine, stackIndex, stateStack, nodeStack, userStateStack, _resultHolder, _outerState) {
        ts2.Debug.assertEqual(stateStack[stackIndex], right);
        ts2.Debug.assertIsDefined(machine.onRight);
        stateStack[stackIndex] = nextState(machine, right);
        var nextNode = machine.onRight(nodeStack[stackIndex].right, userStateStack[stackIndex], nodeStack[stackIndex]);
        if (nextNode) {
          checkCircularity(stackIndex, nodeStack, nextNode);
          return pushStack(stackIndex, stateStack, nodeStack, userStateStack, nextNode);
        }
        return stackIndex;
      }
      BinaryExpressionState2.right = right;
      function exit(machine, stackIndex, stateStack, nodeStack, userStateStack, resultHolder, _outerState) {
        ts2.Debug.assertEqual(stateStack[stackIndex], exit);
        stateStack[stackIndex] = nextState(machine, exit);
        var result = machine.onExit(nodeStack[stackIndex], userStateStack[stackIndex]);
        if (stackIndex > 0) {
          stackIndex--;
          if (machine.foldState) {
            var side = stateStack[stackIndex] === exit ? "right" : "left";
            userStateStack[stackIndex] = machine.foldState(userStateStack[stackIndex], result, side);
          }
        } else {
          resultHolder.value = result;
        }
        return stackIndex;
      }
      BinaryExpressionState2.exit = exit;
      function done(_machine, stackIndex, stateStack, _nodeStack, _userStateStack, _resultHolder, _outerState) {
        ts2.Debug.assertEqual(stateStack[stackIndex], done);
        return stackIndex;
      }
      BinaryExpressionState2.done = done;
      function nextState(machine, currentState) {
        switch (currentState) {
          case enter:
            if (machine.onLeft)
              return left;
          case left:
            if (machine.onOperator)
              return operator;
          case operator:
            if (machine.onRight)
              return right;
          case right:
            return exit;
          case exit:
            return done;
          case done:
            return done;
          default:
            ts2.Debug.fail("Invalid state");
        }
      }
      BinaryExpressionState2.nextState = nextState;
      function pushStack(stackIndex, stateStack, nodeStack, userStateStack, node) {
        stackIndex++;
        stateStack[stackIndex] = enter;
        nodeStack[stackIndex] = node;
        userStateStack[stackIndex] = void 0;
        return stackIndex;
      }
      function checkCircularity(stackIndex, nodeStack, node) {
        if (ts2.Debug.shouldAssert(2)) {
          while (stackIndex >= 0) {
            ts2.Debug.assert(nodeStack[stackIndex] !== node, "Circular traversal detected.");
            stackIndex--;
          }
        }
      }
    })(BinaryExpressionState || (BinaryExpressionState = {}));
    var BinaryExpressionStateMachine = function() {
      function BinaryExpressionStateMachine2(onEnter, onLeft, onOperator, onRight, onExit, foldState) {
        this.onEnter = onEnter;
        this.onLeft = onLeft;
        this.onOperator = onOperator;
        this.onRight = onRight;
        this.onExit = onExit;
        this.foldState = foldState;
      }
      return BinaryExpressionStateMachine2;
    }();
    function createBinaryExpressionTrampoline(onEnter, onLeft, onOperator, onRight, onExit, foldState) {
      var machine = new BinaryExpressionStateMachine(onEnter, onLeft, onOperator, onRight, onExit, foldState);
      return trampoline;
      function trampoline(node, outerState) {
        var resultHolder = { value: void 0 };
        var stateStack = [BinaryExpressionState.enter];
        var nodeStack = [node];
        var userStateStack = [void 0];
        var stackIndex = 0;
        while (stateStack[stackIndex] !== BinaryExpressionState.done) {
          stackIndex = stateStack[stackIndex](machine, stackIndex, stateStack, nodeStack, userStateStack, resultHolder, outerState);
        }
        ts2.Debug.assertEqual(stackIndex, 0);
        return resultHolder.value;
      }
    }
    ts2.createBinaryExpressionTrampoline = createBinaryExpressionTrampoline;
  })(ts || (ts = {}));
  (function(ts2) {
    function setTextRange(range, location) {
      return location ? ts2.setTextRangePosEnd(range, location.pos, location.end) : range;
    }
    ts2.setTextRange = setTextRange;
  })(ts || (ts = {}));
  (function(ts2) {
    var SignatureFlags;
    (function(SignatureFlags2) {
      SignatureFlags2[SignatureFlags2["None"] = 0] = "None";
      SignatureFlags2[SignatureFlags2["Yield"] = 1] = "Yield";
      SignatureFlags2[SignatureFlags2["Await"] = 2] = "Await";
      SignatureFlags2[SignatureFlags2["Type"] = 4] = "Type";
      SignatureFlags2[SignatureFlags2["IgnoreMissingOpenBrace"] = 16] = "IgnoreMissingOpenBrace";
      SignatureFlags2[SignatureFlags2["JSDoc"] = 32] = "JSDoc";
    })(SignatureFlags || (SignatureFlags = {}));
    var SpeculationKind;
    (function(SpeculationKind2) {
      SpeculationKind2[SpeculationKind2["TryParse"] = 0] = "TryParse";
      SpeculationKind2[SpeculationKind2["Lookahead"] = 1] = "Lookahead";
      SpeculationKind2[SpeculationKind2["Reparse"] = 2] = "Reparse";
    })(SpeculationKind || (SpeculationKind = {}));
    var NodeConstructor;
    var TokenConstructor;
    var IdentifierConstructor;
    var PrivateIdentifierConstructor;
    var SourceFileConstructor;
    ts2.parseBaseNodeFactory = {
      createBaseSourceFileNode: function(kind) {
        return new (SourceFileConstructor || (SourceFileConstructor = ts2.objectAllocator.getSourceFileConstructor()))(kind, -1, -1);
      },
      createBaseIdentifierNode: function(kind) {
        return new (IdentifierConstructor || (IdentifierConstructor = ts2.objectAllocator.getIdentifierConstructor()))(kind, -1, -1);
      },
      createBasePrivateIdentifierNode: function(kind) {
        return new (PrivateIdentifierConstructor || (PrivateIdentifierConstructor = ts2.objectAllocator.getPrivateIdentifierConstructor()))(kind, -1, -1);
      },
      createBaseTokenNode: function(kind) {
        return new (TokenConstructor || (TokenConstructor = ts2.objectAllocator.getTokenConstructor()))(kind, -1, -1);
      },
      createBaseNode: function(kind) {
        return new (NodeConstructor || (NodeConstructor = ts2.objectAllocator.getNodeConstructor()))(kind, -1, -1);
      }
    };
    ts2.parseNodeFactory = ts2.createNodeFactory(1, ts2.parseBaseNodeFactory);
    function visitNode(cbNode, node) {
      return node && cbNode(node);
    }
    function visitNodes(cbNode, cbNodes, nodes) {
      if (nodes) {
        if (cbNodes) {
          return cbNodes(nodes);
        }
        for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
          var node = nodes_1[_i];
          var result = cbNode(node);
          if (result) {
            return result;
          }
        }
      }
    }
    function isJSDocLikeText(text, start) {
      return text.charCodeAt(start + 1) === 42 && text.charCodeAt(start + 2) === 42 && text.charCodeAt(start + 3) !== 47;
    }
    ts2.isJSDocLikeText = isJSDocLikeText;
    function forEachChild(node, cbNode, cbNodes) {
      if (!node || node.kind <= 159) {
        return;
      }
      switch (node.kind) {
        case 160:
          return visitNode(cbNode, node.left) || visitNode(cbNode, node.right);
        case 162:
          return visitNode(cbNode, node.name) || visitNode(cbNode, node.constraint) || visitNode(cbNode, node.default) || visitNode(cbNode, node.expression);
        case 295:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.exclamationToken) || visitNode(cbNode, node.equalsToken) || visitNode(cbNode, node.objectAssignmentInitializer);
        case 296:
          return visitNode(cbNode, node.expression);
        case 163:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.dotDotDotToken) || visitNode(cbNode, node.name) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.type) || visitNode(cbNode, node.initializer);
        case 166:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.exclamationToken) || visitNode(cbNode, node.type) || visitNode(cbNode, node.initializer);
        case 165:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.type) || visitNode(cbNode, node.initializer);
        case 294:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.initializer);
        case 253:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNode(cbNode, node.exclamationToken) || visitNode(cbNode, node.type) || visitNode(cbNode, node.initializer);
        case 202:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.dotDotDotToken) || visitNode(cbNode, node.propertyName) || visitNode(cbNode, node.name) || visitNode(cbNode, node.initializer);
        case 178:
        case 179:
        case 173:
        case 174:
        case 175:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNodes(cbNode, cbNodes, node.typeParameters) || visitNodes(cbNode, cbNodes, node.parameters) || visitNode(cbNode, node.type);
        case 168:
        case 167:
        case 170:
        case 171:
        case 172:
        case 212:
        case 255:
        case 213:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.asteriskToken) || visitNode(cbNode, node.name) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.exclamationToken) || visitNodes(cbNode, cbNodes, node.typeParameters) || visitNodes(cbNode, cbNodes, node.parameters) || visitNode(cbNode, node.type) || visitNode(cbNode, node.equalsGreaterThanToken) || visitNode(cbNode, node.body);
        case 169:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.body);
        case 177:
          return visitNode(cbNode, node.typeName) || visitNodes(cbNode, cbNodes, node.typeArguments);
        case 176:
          return visitNode(cbNode, node.assertsModifier) || visitNode(cbNode, node.parameterName) || visitNode(cbNode, node.type);
        case 180:
          return visitNode(cbNode, node.exprName);
        case 181:
          return visitNodes(cbNode, cbNodes, node.members);
        case 182:
          return visitNode(cbNode, node.elementType);
        case 183:
          return visitNodes(cbNode, cbNodes, node.elements);
        case 186:
        case 187:
          return visitNodes(cbNode, cbNodes, node.types);
        case 188:
          return visitNode(cbNode, node.checkType) || visitNode(cbNode, node.extendsType) || visitNode(cbNode, node.trueType) || visitNode(cbNode, node.falseType);
        case 189:
          return visitNode(cbNode, node.typeParameter);
        case 199:
          return visitNode(cbNode, node.argument) || visitNode(cbNode, node.qualifier) || visitNodes(cbNode, cbNodes, node.typeArguments);
        case 190:
        case 192:
          return visitNode(cbNode, node.type);
        case 193:
          return visitNode(cbNode, node.objectType) || visitNode(cbNode, node.indexType);
        case 194:
          return visitNode(cbNode, node.readonlyToken) || visitNode(cbNode, node.typeParameter) || visitNode(cbNode, node.nameType) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.type) || visitNodes(cbNode, cbNodes, node.members);
        case 195:
          return visitNode(cbNode, node.literal);
        case 196:
          return visitNode(cbNode, node.dotDotDotToken) || visitNode(cbNode, node.name) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.type);
        case 200:
        case 201:
          return visitNodes(cbNode, cbNodes, node.elements);
        case 203:
          return visitNodes(cbNode, cbNodes, node.elements);
        case 204:
          return visitNodes(cbNode, cbNodes, node.properties);
        case 205:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.questionDotToken) || visitNode(cbNode, node.name);
        case 206:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.questionDotToken) || visitNode(cbNode, node.argumentExpression);
        case 207:
        case 208:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.questionDotToken) || visitNodes(cbNode, cbNodes, node.typeArguments) || visitNodes(cbNode, cbNodes, node.arguments);
        case 209:
          return visitNode(cbNode, node.tag) || visitNode(cbNode, node.questionDotToken) || visitNodes(cbNode, cbNodes, node.typeArguments) || visitNode(cbNode, node.template);
        case 210:
          return visitNode(cbNode, node.type) || visitNode(cbNode, node.expression);
        case 211:
          return visitNode(cbNode, node.expression);
        case 214:
          return visitNode(cbNode, node.expression);
        case 215:
          return visitNode(cbNode, node.expression);
        case 216:
          return visitNode(cbNode, node.expression);
        case 218:
          return visitNode(cbNode, node.operand);
        case 223:
          return visitNode(cbNode, node.asteriskToken) || visitNode(cbNode, node.expression);
        case 217:
          return visitNode(cbNode, node.expression);
        case 219:
          return visitNode(cbNode, node.operand);
        case 220:
          return visitNode(cbNode, node.left) || visitNode(cbNode, node.operatorToken) || visitNode(cbNode, node.right);
        case 228:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.type);
        case 229:
          return visitNode(cbNode, node.expression);
        case 230:
          return visitNode(cbNode, node.name);
        case 221:
          return visitNode(cbNode, node.condition) || visitNode(cbNode, node.questionToken) || visitNode(cbNode, node.whenTrue) || visitNode(cbNode, node.colonToken) || visitNode(cbNode, node.whenFalse);
        case 224:
          return visitNode(cbNode, node.expression);
        case 234:
        case 261:
          return visitNodes(cbNode, cbNodes, node.statements);
        case 303:
          return visitNodes(cbNode, cbNodes, node.statements) || visitNode(cbNode, node.endOfFileToken);
        case 236:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.declarationList);
        case 254:
          return visitNodes(cbNode, cbNodes, node.declarations);
        case 237:
          return visitNode(cbNode, node.expression);
        case 238:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.thenStatement) || visitNode(cbNode, node.elseStatement);
        case 239:
          return visitNode(cbNode, node.statement) || visitNode(cbNode, node.expression);
        case 240:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.statement);
        case 241:
          return visitNode(cbNode, node.initializer) || visitNode(cbNode, node.condition) || visitNode(cbNode, node.incrementor) || visitNode(cbNode, node.statement);
        case 242:
          return visitNode(cbNode, node.initializer) || visitNode(cbNode, node.expression) || visitNode(cbNode, node.statement);
        case 243:
          return visitNode(cbNode, node.awaitModifier) || visitNode(cbNode, node.initializer) || visitNode(cbNode, node.expression) || visitNode(cbNode, node.statement);
        case 244:
        case 245:
          return visitNode(cbNode, node.label);
        case 246:
          return visitNode(cbNode, node.expression);
        case 247:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.statement);
        case 248:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.caseBlock);
        case 262:
          return visitNodes(cbNode, cbNodes, node.clauses);
        case 288:
          return visitNode(cbNode, node.expression) || visitNodes(cbNode, cbNodes, node.statements);
        case 289:
          return visitNodes(cbNode, cbNodes, node.statements);
        case 249:
          return visitNode(cbNode, node.label) || visitNode(cbNode, node.statement);
        case 250:
          return visitNode(cbNode, node.expression);
        case 251:
          return visitNode(cbNode, node.tryBlock) || visitNode(cbNode, node.catchClause) || visitNode(cbNode, node.finallyBlock);
        case 291:
          return visitNode(cbNode, node.variableDeclaration) || visitNode(cbNode, node.block);
        case 164:
          return visitNode(cbNode, node.expression);
        case 256:
        case 225:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNodes(cbNode, cbNodes, node.typeParameters) || visitNodes(cbNode, cbNodes, node.heritageClauses) || visitNodes(cbNode, cbNodes, node.members);
        case 257:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNodes(cbNode, cbNodes, node.typeParameters) || visitNodes(cbNode, cbNodes, node.heritageClauses) || visitNodes(cbNode, cbNodes, node.members);
        case 258:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNodes(cbNode, cbNodes, node.typeParameters) || visitNode(cbNode, node.type);
        case 259:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNodes(cbNode, cbNodes, node.members);
        case 297:
          return visitNode(cbNode, node.name) || visitNode(cbNode, node.initializer);
        case 260:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNode(cbNode, node.body);
        case 264:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.name) || visitNode(cbNode, node.moduleReference);
        case 265:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.importClause) || visitNode(cbNode, node.moduleSpecifier) || visitNode(cbNode, node.assertClause);
        case 266:
          return visitNode(cbNode, node.name) || visitNode(cbNode, node.namedBindings);
        case 292:
          return visitNodes(cbNode, cbNodes, node.elements);
        case 293:
          return visitNode(cbNode, node.name) || visitNode(cbNode, node.value);
        case 263:
          return visitNode(cbNode, node.name);
        case 267:
          return visitNode(cbNode, node.name);
        case 273:
          return visitNode(cbNode, node.name);
        case 268:
        case 272:
          return visitNodes(cbNode, cbNodes, node.elements);
        case 271:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.exportClause) || visitNode(cbNode, node.moduleSpecifier) || visitNode(cbNode, node.assertClause);
        case 269:
        case 274:
          return visitNode(cbNode, node.propertyName) || visitNode(cbNode, node.name);
        case 270:
          return visitNodes(cbNode, cbNodes, node.decorators) || visitNodes(cbNode, cbNodes, node.modifiers) || visitNode(cbNode, node.expression);
        case 222:
          return visitNode(cbNode, node.head) || visitNodes(cbNode, cbNodes, node.templateSpans);
        case 232:
          return visitNode(cbNode, node.expression) || visitNode(cbNode, node.literal);
        case 197:
          return visitNode(cbNode, node.head) || visitNodes(cbNode, cbNodes, node.templateSpans);
        case 198:
          return visitNode(cbNode, node.type) || visitNode(cbNode, node.literal);
        case 161:
          return visitNode(cbNode, node.expression);
        case 290:
          return visitNodes(cbNode, cbNodes, node.types);
        case 227:
          return visitNode(cbNode, node.expression) || visitNodes(cbNode, cbNodes, node.typeArguments);
        case 276:
          return visitNode(cbNode, node.expression);
        case 275:
          return visitNodes(cbNode, cbNodes, node.decorators);
        case 349:
          return visitNodes(cbNode, cbNodes, node.elements);
        case 277:
          return visitNode(cbNode, node.openingElement) || visitNodes(cbNode, cbNodes, node.children) || visitNode(cbNode, node.closingElement);
        case 281:
          return visitNode(cbNode, node.openingFragment) || visitNodes(cbNode, cbNodes, node.children) || visitNode(cbNode, node.closingFragment);
        case 278:
        case 279:
          return visitNode(cbNode, node.tagName) || visitNodes(cbNode, cbNodes, node.typeArguments) || visitNode(cbNode, node.attributes);
        case 285:
          return visitNodes(cbNode, cbNodes, node.properties);
        case 284:
          return visitNode(cbNode, node.name) || visitNode(cbNode, node.initializer);
        case 286:
          return visitNode(cbNode, node.expression);
        case 287:
          return visitNode(cbNode, node.dotDotDotToken) || visitNode(cbNode, node.expression);
        case 280:
          return visitNode(cbNode, node.tagName);
        case 184:
        case 185:
        case 307:
        case 313:
        case 312:
        case 314:
        case 316:
          return visitNode(cbNode, node.type);
        case 315:
          return visitNodes(cbNode, cbNodes, node.parameters) || visitNode(cbNode, node.type);
        case 318:
          return (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment)) || visitNodes(cbNode, cbNodes, node.tags);
        case 344:
          return visitNode(cbNode, node.tagName) || visitNode(cbNode, node.name) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 308:
          return visitNode(cbNode, node.name);
        case 309:
          return visitNode(cbNode, node.left) || visitNode(cbNode, node.right);
        case 338:
        case 345:
          return visitNode(cbNode, node.tagName) || (node.isNameFirst ? visitNode(cbNode, node.name) || visitNode(cbNode, node.typeExpression) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment)) : visitNode(cbNode, node.typeExpression) || visitNode(cbNode, node.name) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment)));
        case 328:
          return visitNode(cbNode, node.tagName) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 327:
          return visitNode(cbNode, node.tagName) || visitNode(cbNode, node.class) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 326:
          return visitNode(cbNode, node.tagName) || visitNode(cbNode, node.class) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 342:
          return visitNode(cbNode, node.tagName) || visitNode(cbNode, node.constraint) || visitNodes(cbNode, cbNodes, node.typeParameters) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 343:
          return visitNode(cbNode, node.tagName) || (node.typeExpression && node.typeExpression.kind === 307 ? visitNode(cbNode, node.typeExpression) || visitNode(cbNode, node.fullName) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment)) : visitNode(cbNode, node.fullName) || visitNode(cbNode, node.typeExpression) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment)));
        case 336:
          return visitNode(cbNode, node.tagName) || visitNode(cbNode, node.fullName) || visitNode(cbNode, node.typeExpression) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 339:
        case 341:
        case 340:
        case 337:
          return visitNode(cbNode, node.tagName) || visitNode(cbNode, node.typeExpression) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 321:
          return ts2.forEach(node.typeParameters, cbNode) || ts2.forEach(node.parameters, cbNode) || visitNode(cbNode, node.type);
        case 322:
        case 323:
        case 324:
          return visitNode(cbNode, node.name);
        case 320:
          return ts2.forEach(node.jsDocPropertyTags, cbNode);
        case 325:
        case 330:
        case 331:
        case 332:
        case 333:
        case 334:
        case 329:
          return visitNode(cbNode, node.tagName) || (typeof node.comment === "string" ? void 0 : visitNodes(cbNode, cbNodes, node.comment));
        case 348:
          return visitNode(cbNode, node.expression);
      }
    }
    ts2.forEachChild = forEachChild;
    function forEachChildRecursively(rootNode, cbNode, cbNodes) {
      var queue = gatherPossibleChildren(rootNode);
      var parents = [];
      while (parents.length < queue.length) {
        parents.push(rootNode);
      }
      while (queue.length !== 0) {
        var current = queue.pop();
        var parent = parents.pop();
        if (ts2.isArray(current)) {
          if (cbNodes) {
            var res = cbNodes(current, parent);
            if (res) {
              if (res === "skip")
                continue;
              return res;
            }
          }
          for (var i = current.length - 1; i >= 0; --i) {
            queue.push(current[i]);
            parents.push(parent);
          }
        } else {
          var res = cbNode(current, parent);
          if (res) {
            if (res === "skip")
              continue;
            return res;
          }
          if (current.kind >= 160) {
            for (var _i = 0, _a = gatherPossibleChildren(current); _i < _a.length; _i++) {
              var child = _a[_i];
              queue.push(child);
              parents.push(current);
            }
          }
        }
      }
    }
    ts2.forEachChildRecursively = forEachChildRecursively;
    function gatherPossibleChildren(node) {
      var children = [];
      forEachChild(node, addWorkItem, addWorkItem);
      return children;
      function addWorkItem(n) {
        children.unshift(n);
      }
    }
    function createSourceFile(fileName, sourceText, languageVersion, setParentNodes, scriptKind) {
      if (setParentNodes === void 0) {
        setParentNodes = false;
      }
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("parse", "createSourceFile", { path: fileName }, true);
      ts2.performance.mark("beforeParse");
      var result;
      ts2.perfLogger.logStartParseSourceFile(fileName);
      if (languageVersion === 100) {
        result = Parser.parseSourceFile(fileName, sourceText, languageVersion, void 0, setParentNodes, 6);
      } else {
        result = Parser.parseSourceFile(fileName, sourceText, languageVersion, void 0, setParentNodes, scriptKind);
      }
      ts2.perfLogger.logStopParseSourceFile();
      ts2.performance.mark("afterParse");
      ts2.performance.measure("Parse", "beforeParse", "afterParse");
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      return result;
    }
    ts2.createSourceFile = createSourceFile;
    function parseIsolatedEntityName(text, languageVersion) {
      return Parser.parseIsolatedEntityName(text, languageVersion);
    }
    ts2.parseIsolatedEntityName = parseIsolatedEntityName;
    function parseJsonText(fileName, sourceText) {
      return Parser.parseJsonText(fileName, sourceText);
    }
    ts2.parseJsonText = parseJsonText;
    function isExternalModule(file) {
      return file.externalModuleIndicator !== void 0;
    }
    ts2.isExternalModule = isExternalModule;
    function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
      if (aggressiveChecks === void 0) {
        aggressiveChecks = false;
      }
      var newSourceFile = IncrementalParser.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
      newSourceFile.flags |= sourceFile.flags & 3145728;
      return newSourceFile;
    }
    ts2.updateSourceFile = updateSourceFile;
    function parseIsolatedJSDocComment(content, start, length) {
      var result = Parser.JSDocParser.parseIsolatedJSDocComment(content, start, length);
      if (result && result.jsDoc) {
        Parser.fixupParentReferences(result.jsDoc);
      }
      return result;
    }
    ts2.parseIsolatedJSDocComment = parseIsolatedJSDocComment;
    function parseJSDocTypeExpressionForTests(content, start, length) {
      return Parser.JSDocParser.parseJSDocTypeExpressionForTests(content, start, length);
    }
    ts2.parseJSDocTypeExpressionForTests = parseJSDocTypeExpressionForTests;
    var Parser;
    (function(Parser2) {
      var scanner = ts2.createScanner(99, true);
      var disallowInAndDecoratorContext = 4096 | 16384;
      var NodeConstructor2;
      var TokenConstructor2;
      var IdentifierConstructor2;
      var PrivateIdentifierConstructor2;
      var SourceFileConstructor2;
      function countNode(node) {
        nodeCount++;
        return node;
      }
      var baseNodeFactory = {
        createBaseSourceFileNode: function(kind) {
          return countNode(new SourceFileConstructor2(kind, 0, 0));
        },
        createBaseIdentifierNode: function(kind) {
          return countNode(new IdentifierConstructor2(kind, 0, 0));
        },
        createBasePrivateIdentifierNode: function(kind) {
          return countNode(new PrivateIdentifierConstructor2(kind, 0, 0));
        },
        createBaseTokenNode: function(kind) {
          return countNode(new TokenConstructor2(kind, 0, 0));
        },
        createBaseNode: function(kind) {
          return countNode(new NodeConstructor2(kind, 0, 0));
        }
      };
      var factory = ts2.createNodeFactory(1 | 2 | 8, baseNodeFactory);
      var fileName;
      var sourceFlags;
      var sourceText;
      var languageVersion;
      var scriptKind;
      var languageVariant;
      var parseDiagnostics;
      var jsDocDiagnostics;
      var syntaxCursor;
      var currentToken;
      var nodeCount;
      var identifiers;
      var privateIdentifiers;
      var identifierCount;
      var parsingContext;
      var notParenthesizedArrow;
      var contextFlags;
      var topLevel = true;
      var parseErrorBeforeNextFinishedNode = false;
      function parseSourceFile(fileName2, sourceText2, languageVersion2, syntaxCursor2, setParentNodes, scriptKind2) {
        var _a;
        if (setParentNodes === void 0) {
          setParentNodes = false;
        }
        scriptKind2 = ts2.ensureScriptKind(fileName2, scriptKind2);
        if (scriptKind2 === 6) {
          var result_3 = parseJsonText2(fileName2, sourceText2, languageVersion2, syntaxCursor2, setParentNodes);
          ts2.convertToObjectWorker(result_3, (_a = result_3.statements[0]) === null || _a === void 0 ? void 0 : _a.expression, result_3.parseDiagnostics, false, void 0, void 0);
          result_3.referencedFiles = ts2.emptyArray;
          result_3.typeReferenceDirectives = ts2.emptyArray;
          result_3.libReferenceDirectives = ts2.emptyArray;
          result_3.amdDependencies = ts2.emptyArray;
          result_3.hasNoDefaultLib = false;
          result_3.pragmas = ts2.emptyMap;
          return result_3;
        }
        initializeState(fileName2, sourceText2, languageVersion2, syntaxCursor2, scriptKind2);
        var result = parseSourceFileWorker(languageVersion2, setParentNodes, scriptKind2);
        clearState();
        return result;
      }
      Parser2.parseSourceFile = parseSourceFile;
      function parseIsolatedEntityName2(content, languageVersion2) {
        initializeState("", content, languageVersion2, void 0, 1);
        nextToken();
        var entityName = parseEntityName(true);
        var isInvalid = token() === 1 && !parseDiagnostics.length;
        clearState();
        return isInvalid ? entityName : void 0;
      }
      Parser2.parseIsolatedEntityName = parseIsolatedEntityName2;
      function parseJsonText2(fileName2, sourceText2, languageVersion2, syntaxCursor2, setParentNodes) {
        if (languageVersion2 === void 0) {
          languageVersion2 = 2;
        }
        if (setParentNodes === void 0) {
          setParentNodes = false;
        }
        initializeState(fileName2, sourceText2, languageVersion2, syntaxCursor2, 6);
        sourceFlags = contextFlags;
        nextToken();
        var pos = getNodePos();
        var statements, endOfFileToken;
        if (token() === 1) {
          statements = createNodeArray([], pos, pos);
          endOfFileToken = parseTokenNode();
        } else {
          var expressions = void 0;
          while (token() !== 1) {
            var expression_1 = void 0;
            switch (token()) {
              case 22:
                expression_1 = parseArrayLiteralExpression();
                break;
              case 110:
              case 95:
              case 104:
                expression_1 = parseTokenNode();
                break;
              case 40:
                if (lookAhead(function() {
                  return nextToken() === 8 && nextToken() !== 58;
                })) {
                  expression_1 = parsePrefixUnaryExpression();
                } else {
                  expression_1 = parseObjectLiteralExpression();
                }
                break;
              case 8:
              case 10:
                if (lookAhead(function() {
                  return nextToken() !== 58;
                })) {
                  expression_1 = parseLiteralNode();
                  break;
                }
              default:
                expression_1 = parseObjectLiteralExpression();
                break;
            }
            if (expressions && ts2.isArray(expressions)) {
              expressions.push(expression_1);
            } else if (expressions) {
              expressions = [expressions, expression_1];
            } else {
              expressions = expression_1;
              if (token() !== 1) {
                parseErrorAtCurrentToken(ts2.Diagnostics.Unexpected_token);
              }
            }
          }
          var expression = ts2.isArray(expressions) ? finishNode(factory.createArrayLiteralExpression(expressions), pos) : ts2.Debug.checkDefined(expressions);
          var statement = factory.createExpressionStatement(expression);
          finishNode(statement, pos);
          statements = createNodeArray([statement], pos);
          endOfFileToken = parseExpectedToken(1, ts2.Diagnostics.Unexpected_token);
        }
        var sourceFile = createSourceFile2(fileName2, 2, 6, false, statements, endOfFileToken, sourceFlags);
        if (setParentNodes) {
          fixupParentReferences(sourceFile);
        }
        sourceFile.nodeCount = nodeCount;
        sourceFile.identifierCount = identifierCount;
        sourceFile.identifiers = identifiers;
        sourceFile.parseDiagnostics = ts2.attachFileToDiagnostics(parseDiagnostics, sourceFile);
        if (jsDocDiagnostics) {
          sourceFile.jsDocDiagnostics = ts2.attachFileToDiagnostics(jsDocDiagnostics, sourceFile);
        }
        var result = sourceFile;
        clearState();
        return result;
      }
      Parser2.parseJsonText = parseJsonText2;
      function initializeState(_fileName, _sourceText, _languageVersion, _syntaxCursor, _scriptKind) {
        NodeConstructor2 = ts2.objectAllocator.getNodeConstructor();
        TokenConstructor2 = ts2.objectAllocator.getTokenConstructor();
        IdentifierConstructor2 = ts2.objectAllocator.getIdentifierConstructor();
        PrivateIdentifierConstructor2 = ts2.objectAllocator.getPrivateIdentifierConstructor();
        SourceFileConstructor2 = ts2.objectAllocator.getSourceFileConstructor();
        fileName = ts2.normalizePath(_fileName);
        sourceText = _sourceText;
        languageVersion = _languageVersion;
        syntaxCursor = _syntaxCursor;
        scriptKind = _scriptKind;
        languageVariant = ts2.getLanguageVariant(_scriptKind);
        parseDiagnostics = [];
        parsingContext = 0;
        identifiers = new ts2.Map();
        privateIdentifiers = new ts2.Map();
        identifierCount = 0;
        nodeCount = 0;
        sourceFlags = 0;
        topLevel = true;
        switch (scriptKind) {
          case 1:
          case 2:
            contextFlags = 131072;
            break;
          case 6:
            contextFlags = 131072 | 33554432;
            break;
          default:
            contextFlags = 0;
            break;
        }
        parseErrorBeforeNextFinishedNode = false;
        scanner.setText(sourceText);
        scanner.setOnError(scanError);
        scanner.setScriptTarget(languageVersion);
        scanner.setLanguageVariant(languageVariant);
      }
      function clearState() {
        scanner.clearCommentDirectives();
        scanner.setText("");
        scanner.setOnError(void 0);
        sourceText = void 0;
        languageVersion = void 0;
        syntaxCursor = void 0;
        scriptKind = void 0;
        languageVariant = void 0;
        sourceFlags = 0;
        parseDiagnostics = void 0;
        jsDocDiagnostics = void 0;
        parsingContext = 0;
        identifiers = void 0;
        notParenthesizedArrow = void 0;
        topLevel = true;
      }
      function parseSourceFileWorker(languageVersion2, setParentNodes, scriptKind2) {
        var isDeclarationFile = isDeclarationFileName(fileName);
        if (isDeclarationFile) {
          contextFlags |= 8388608;
        }
        sourceFlags = contextFlags;
        nextToken();
        var statements = parseList(0, parseStatement);
        ts2.Debug.assert(token() === 1);
        var endOfFileToken = addJSDocComment(parseTokenNode());
        var sourceFile = createSourceFile2(fileName, languageVersion2, scriptKind2, isDeclarationFile, statements, endOfFileToken, sourceFlags);
        processCommentPragmas(sourceFile, sourceText);
        processPragmasIntoFields(sourceFile, reportPragmaDiagnostic);
        sourceFile.commentDirectives = scanner.getCommentDirectives();
        sourceFile.nodeCount = nodeCount;
        sourceFile.identifierCount = identifierCount;
        sourceFile.identifiers = identifiers;
        sourceFile.parseDiagnostics = ts2.attachFileToDiagnostics(parseDiagnostics, sourceFile);
        if (jsDocDiagnostics) {
          sourceFile.jsDocDiagnostics = ts2.attachFileToDiagnostics(jsDocDiagnostics, sourceFile);
        }
        if (setParentNodes) {
          fixupParentReferences(sourceFile);
        }
        return sourceFile;
        function reportPragmaDiagnostic(pos, end, diagnostic) {
          parseDiagnostics.push(ts2.createDetachedDiagnostic(fileName, pos, end, diagnostic));
        }
      }
      function withJSDoc(node, hasJSDoc) {
        return hasJSDoc ? addJSDocComment(node) : node;
      }
      var hasDeprecatedTag = false;
      function addJSDocComment(node) {
        ts2.Debug.assert(!node.jsDoc);
        var jsDoc = ts2.mapDefined(ts2.getJSDocCommentRanges(node, sourceText), function(comment) {
          return JSDocParser.parseJSDocComment(node, comment.pos, comment.end - comment.pos);
        });
        if (jsDoc.length)
          node.jsDoc = jsDoc;
        if (hasDeprecatedTag) {
          hasDeprecatedTag = false;
          node.flags |= 134217728;
        }
        return node;
      }
      function reparseTopLevelAwait(sourceFile) {
        var savedSyntaxCursor = syntaxCursor;
        var baseSyntaxCursor = IncrementalParser.createSyntaxCursor(sourceFile);
        syntaxCursor = { currentNode: currentNode2 };
        var statements = [];
        var savedParseDiagnostics = parseDiagnostics;
        parseDiagnostics = [];
        var pos = 0;
        var start = findNextStatementWithAwait(sourceFile.statements, 0);
        var _loop_3 = function() {
          var prevStatement = sourceFile.statements[pos];
          var nextStatement = sourceFile.statements[start];
          ts2.addRange(statements, sourceFile.statements, pos, start);
          pos = findNextStatementWithoutAwait(sourceFile.statements, start);
          var diagnosticStart2 = ts2.findIndex(savedParseDiagnostics, function(diagnostic) {
            return diagnostic.start >= prevStatement.pos;
          });
          var diagnosticEnd = diagnosticStart2 >= 0 ? ts2.findIndex(savedParseDiagnostics, function(diagnostic) {
            return diagnostic.start >= nextStatement.pos;
          }, diagnosticStart2) : -1;
          if (diagnosticStart2 >= 0) {
            ts2.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart2, diagnosticEnd >= 0 ? diagnosticEnd : void 0);
          }
          speculationHelper(function() {
            var savedContextFlags = contextFlags;
            contextFlags |= 32768;
            scanner.setTextPos(nextStatement.pos);
            nextToken();
            while (token() !== 1) {
              var startPos = scanner.getStartPos();
              var statement = parseListElement(0, parseStatement);
              statements.push(statement);
              if (startPos === scanner.getStartPos()) {
                nextToken();
              }
              if (pos >= 0) {
                var nonAwaitStatement = sourceFile.statements[pos];
                if (statement.end === nonAwaitStatement.pos) {
                  break;
                }
                if (statement.end > nonAwaitStatement.pos) {
                  pos = findNextStatementWithoutAwait(sourceFile.statements, pos + 1);
                }
              }
            }
            contextFlags = savedContextFlags;
          }, 2);
          start = pos >= 0 ? findNextStatementWithAwait(sourceFile.statements, pos) : -1;
        };
        while (start !== -1) {
          _loop_3();
        }
        if (pos >= 0) {
          var prevStatement_1 = sourceFile.statements[pos];
          ts2.addRange(statements, sourceFile.statements, pos);
          var diagnosticStart = ts2.findIndex(savedParseDiagnostics, function(diagnostic) {
            return diagnostic.start >= prevStatement_1.pos;
          });
          if (diagnosticStart >= 0) {
            ts2.addRange(parseDiagnostics, savedParseDiagnostics, diagnosticStart);
          }
        }
        syntaxCursor = savedSyntaxCursor;
        return factory.updateSourceFile(sourceFile, ts2.setTextRange(factory.createNodeArray(statements), sourceFile.statements));
        function containsPossibleTopLevelAwait(node) {
          return !(node.flags & 32768) && !!(node.transformFlags & 16777216);
        }
        function findNextStatementWithAwait(statements2, start2) {
          for (var i = start2; i < statements2.length; i++) {
            if (containsPossibleTopLevelAwait(statements2[i])) {
              return i;
            }
          }
          return -1;
        }
        function findNextStatementWithoutAwait(statements2, start2) {
          for (var i = start2; i < statements2.length; i++) {
            if (!containsPossibleTopLevelAwait(statements2[i])) {
              return i;
            }
          }
          return -1;
        }
        function currentNode2(position) {
          var node = baseSyntaxCursor.currentNode(position);
          if (topLevel && node && containsPossibleTopLevelAwait(node)) {
            node.intersectsChange = true;
          }
          return node;
        }
      }
      function fixupParentReferences(rootNode) {
        ts2.setParentRecursive(rootNode, true);
      }
      Parser2.fixupParentReferences = fixupParentReferences;
      function createSourceFile2(fileName2, languageVersion2, scriptKind2, isDeclarationFile, statements, endOfFileToken, flags) {
        var sourceFile = factory.createSourceFile(statements, endOfFileToken, flags);
        ts2.setTextRangePosWidth(sourceFile, 0, sourceText.length);
        setExternalModuleIndicator(sourceFile);
        if (!isDeclarationFile && isExternalModule(sourceFile) && sourceFile.transformFlags & 16777216) {
          sourceFile = reparseTopLevelAwait(sourceFile);
        }
        sourceFile.text = sourceText;
        sourceFile.bindDiagnostics = [];
        sourceFile.bindSuggestionDiagnostics = void 0;
        sourceFile.languageVersion = languageVersion2;
        sourceFile.fileName = fileName2;
        sourceFile.languageVariant = ts2.getLanguageVariant(scriptKind2);
        sourceFile.isDeclarationFile = isDeclarationFile;
        sourceFile.scriptKind = scriptKind2;
        return sourceFile;
      }
      function setContextFlag(val, flag) {
        if (val) {
          contextFlags |= flag;
        } else {
          contextFlags &= ~flag;
        }
      }
      function setDisallowInContext(val) {
        setContextFlag(val, 4096);
      }
      function setYieldContext(val) {
        setContextFlag(val, 8192);
      }
      function setDecoratorContext(val) {
        setContextFlag(val, 16384);
      }
      function setAwaitContext(val) {
        setContextFlag(val, 32768);
      }
      function doOutsideOfContext(context, func) {
        var contextFlagsToClear = context & contextFlags;
        if (contextFlagsToClear) {
          setContextFlag(false, contextFlagsToClear);
          var result = func();
          setContextFlag(true, contextFlagsToClear);
          return result;
        }
        return func();
      }
      function doInsideOfContext(context, func) {
        var contextFlagsToSet = context & ~contextFlags;
        if (contextFlagsToSet) {
          setContextFlag(true, contextFlagsToSet);
          var result = func();
          setContextFlag(false, contextFlagsToSet);
          return result;
        }
        return func();
      }
      function allowInAnd(func) {
        return doOutsideOfContext(4096, func);
      }
      function disallowInAnd(func) {
        return doInsideOfContext(4096, func);
      }
      function doInYieldContext(func) {
        return doInsideOfContext(8192, func);
      }
      function doInDecoratorContext(func) {
        return doInsideOfContext(16384, func);
      }
      function doInAwaitContext(func) {
        return doInsideOfContext(32768, func);
      }
      function doOutsideOfAwaitContext(func) {
        return doOutsideOfContext(32768, func);
      }
      function doInYieldAndAwaitContext(func) {
        return doInsideOfContext(8192 | 32768, func);
      }
      function doOutsideOfYieldAndAwaitContext(func) {
        return doOutsideOfContext(8192 | 32768, func);
      }
      function inContext(flags) {
        return (contextFlags & flags) !== 0;
      }
      function inYieldContext() {
        return inContext(8192);
      }
      function inDisallowInContext() {
        return inContext(4096);
      }
      function inDecoratorContext() {
        return inContext(16384);
      }
      function inAwaitContext() {
        return inContext(32768);
      }
      function parseErrorAtCurrentToken(message, arg0) {
        parseErrorAt(scanner.getTokenPos(), scanner.getTextPos(), message, arg0);
      }
      function parseErrorAtPosition(start, length, message, arg0) {
        var lastError = ts2.lastOrUndefined(parseDiagnostics);
        if (!lastError || start !== lastError.start) {
          parseDiagnostics.push(ts2.createDetachedDiagnostic(fileName, start, length, message, arg0));
        }
        parseErrorBeforeNextFinishedNode = true;
      }
      function parseErrorAt(start, end, message, arg0) {
        parseErrorAtPosition(start, end - start, message, arg0);
      }
      function parseErrorAtRange(range, message, arg0) {
        parseErrorAt(range.pos, range.end, message, arg0);
      }
      function scanError(message, length) {
        parseErrorAtPosition(scanner.getTextPos(), length, message);
      }
      function getNodePos() {
        return scanner.getStartPos();
      }
      function hasPrecedingJSDocComment() {
        return scanner.hasPrecedingJSDocComment();
      }
      function token() {
        return currentToken;
      }
      function nextTokenWithoutCheck() {
        return currentToken = scanner.scan();
      }
      function nextTokenAnd(func) {
        nextToken();
        return func();
      }
      function nextToken() {
        if (ts2.isKeyword(currentToken) && (scanner.hasUnicodeEscape() || scanner.hasExtendedUnicodeEscape())) {
          parseErrorAt(scanner.getTokenPos(), scanner.getTextPos(), ts2.Diagnostics.Keywords_cannot_contain_escape_characters);
        }
        return nextTokenWithoutCheck();
      }
      function nextTokenJSDoc() {
        return currentToken = scanner.scanJsDocToken();
      }
      function reScanGreaterToken() {
        return currentToken = scanner.reScanGreaterToken();
      }
      function reScanSlashToken() {
        return currentToken = scanner.reScanSlashToken();
      }
      function reScanTemplateToken(isTaggedTemplate) {
        return currentToken = scanner.reScanTemplateToken(isTaggedTemplate);
      }
      function reScanTemplateHeadOrNoSubstitutionTemplate() {
        return currentToken = scanner.reScanTemplateHeadOrNoSubstitutionTemplate();
      }
      function reScanLessThanToken() {
        return currentToken = scanner.reScanLessThanToken();
      }
      function reScanHashToken() {
        return currentToken = scanner.reScanHashToken();
      }
      function scanJsxIdentifier() {
        return currentToken = scanner.scanJsxIdentifier();
      }
      function scanJsxText() {
        return currentToken = scanner.scanJsxToken();
      }
      function scanJsxAttributeValue() {
        return currentToken = scanner.scanJsxAttributeValue();
      }
      function speculationHelper(callback, speculationKind) {
        var saveToken = currentToken;
        var saveParseDiagnosticsLength = parseDiagnostics.length;
        var saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode;
        var saveContextFlags = contextFlags;
        var result = speculationKind !== 0 ? scanner.lookAhead(callback) : scanner.tryScan(callback);
        ts2.Debug.assert(saveContextFlags === contextFlags);
        if (!result || speculationKind !== 0) {
          currentToken = saveToken;
          if (speculationKind !== 2) {
            parseDiagnostics.length = saveParseDiagnosticsLength;
          }
          parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode;
        }
        return result;
      }
      function lookAhead(callback) {
        return speculationHelper(callback, 1);
      }
      function tryParse(callback) {
        return speculationHelper(callback, 0);
      }
      function isBindingIdentifier() {
        if (token() === 79) {
          return true;
        }
        return token() > 116;
      }
      function isIdentifier() {
        if (token() === 79) {
          return true;
        }
        if (token() === 125 && inYieldContext()) {
          return false;
        }
        if (token() === 132 && inAwaitContext()) {
          return false;
        }
        return token() > 116;
      }
      function parseExpected(kind, diagnosticMessage, shouldAdvance) {
        if (shouldAdvance === void 0) {
          shouldAdvance = true;
        }
        if (token() === kind) {
          if (shouldAdvance) {
            nextToken();
          }
          return true;
        }
        if (diagnosticMessage) {
          parseErrorAtCurrentToken(diagnosticMessage);
        } else {
          parseErrorAtCurrentToken(ts2.Diagnostics._0_expected, ts2.tokenToString(kind));
        }
        return false;
      }
      var viableKeywordSuggestions = Object.keys(ts2.textToKeywordObj).filter(function(keyword) {
        return keyword.length > 2;
      });
      function parseErrorForMissingSemicolonAfter(node) {
        var _a;
        if (ts2.isTaggedTemplateExpression(node)) {
          parseErrorAt(ts2.skipTrivia(sourceText, node.template.pos), node.template.end, ts2.Diagnostics.Module_declaration_names_may_only_use_or_quoted_strings);
          return;
        }
        var expressionText = ts2.isIdentifier(node) ? ts2.idText(node) : void 0;
        if (!expressionText || !ts2.isIdentifierText(expressionText, languageVersion)) {
          parseErrorAtCurrentToken(ts2.Diagnostics._0_expected, ts2.tokenToString(26));
          return;
        }
        var pos = ts2.skipTrivia(sourceText, node.pos);
        switch (expressionText) {
          case "const":
          case "let":
          case "var":
            parseErrorAt(pos, node.end, ts2.Diagnostics.Variable_declaration_not_allowed_at_this_location);
            return;
          case "declare":
            return;
          case "interface":
            parseErrorForInvalidName(ts2.Diagnostics.Interface_name_cannot_be_0, ts2.Diagnostics.Interface_must_be_given_a_name, 18);
            return;
          case "is":
            parseErrorAt(pos, scanner.getTextPos(), ts2.Diagnostics.A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods);
            return;
          case "module":
          case "namespace":
            parseErrorForInvalidName(ts2.Diagnostics.Namespace_name_cannot_be_0, ts2.Diagnostics.Namespace_must_be_given_a_name, 18);
            return;
          case "type":
            parseErrorForInvalidName(ts2.Diagnostics.Type_alias_name_cannot_be_0, ts2.Diagnostics.Type_alias_must_be_given_a_name, 63);
            return;
        }
        var suggestion = (_a = ts2.getSpellingSuggestion(expressionText, viableKeywordSuggestions, function(n) {
          return n;
        })) !== null && _a !== void 0 ? _a : getSpaceSuggestion(expressionText);
        if (suggestion) {
          parseErrorAt(pos, node.end, ts2.Diagnostics.Unknown_keyword_or_identifier_Did_you_mean_0, suggestion);
          return;
        }
        if (token() === 0) {
          return;
        }
        parseErrorAt(pos, node.end, ts2.Diagnostics.Unexpected_keyword_or_identifier);
      }
      function parseErrorForInvalidName(nameDiagnostic, blankDiagnostic, tokenIfBlankName) {
        if (token() === tokenIfBlankName) {
          parseErrorAtCurrentToken(blankDiagnostic);
        } else {
          parseErrorAtCurrentToken(nameDiagnostic, scanner.getTokenValue());
        }
      }
      function getSpaceSuggestion(expressionText) {
        for (var _i = 0, viableKeywordSuggestions_1 = viableKeywordSuggestions; _i < viableKeywordSuggestions_1.length; _i++) {
          var keyword = viableKeywordSuggestions_1[_i];
          if (expressionText.length > keyword.length + 2 && ts2.startsWith(expressionText, keyword)) {
            return "".concat(keyword, " ").concat(expressionText.slice(keyword.length));
          }
        }
        return void 0;
      }
      function parseSemicolonAfterPropertyName(name, type, initializer) {
        if (token() === 59 && !scanner.hasPrecedingLineBreak()) {
          parseErrorAtCurrentToken(ts2.Diagnostics.Decorators_must_precede_the_name_and_all_keywords_of_property_declarations);
          return;
        }
        if (token() === 20) {
          parseErrorAtCurrentToken(ts2.Diagnostics.Cannot_start_a_function_call_in_a_type_annotation);
          nextToken();
          return;
        }
        if (type && !canParseSemicolon()) {
          if (initializer) {
            parseErrorAtCurrentToken(ts2.Diagnostics._0_expected, ts2.tokenToString(26));
          } else {
            parseErrorAtCurrentToken(ts2.Diagnostics.Expected_for_property_initializer);
          }
          return;
        }
        if (tryParseSemicolon()) {
          return;
        }
        if (initializer) {
          if (token() === 18) {
            parseErrorAtCurrentToken(ts2.Diagnostics._0_expected, ts2.tokenToString(26));
          }
          return;
        }
        parseErrorForMissingSemicolonAfter(name);
      }
      function parseExpectedJSDoc(kind) {
        if (token() === kind) {
          nextTokenJSDoc();
          return true;
        }
        parseErrorAtCurrentToken(ts2.Diagnostics._0_expected, ts2.tokenToString(kind));
        return false;
      }
      function parseOptional(t) {
        if (token() === t) {
          nextToken();
          return true;
        }
        return false;
      }
      function parseOptionalToken(t) {
        if (token() === t) {
          return parseTokenNode();
        }
        return void 0;
      }
      function parseOptionalTokenJSDoc(t) {
        if (token() === t) {
          return parseTokenNodeJSDoc();
        }
        return void 0;
      }
      function parseExpectedToken(t, diagnosticMessage, arg0) {
        return parseOptionalToken(t) || createMissingNode(t, false, diagnosticMessage || ts2.Diagnostics._0_expected, arg0 || ts2.tokenToString(t));
      }
      function parseExpectedTokenJSDoc(t) {
        return parseOptionalTokenJSDoc(t) || createMissingNode(t, false, ts2.Diagnostics._0_expected, ts2.tokenToString(t));
      }
      function parseTokenNode() {
        var pos = getNodePos();
        var kind = token();
        nextToken();
        return finishNode(factory.createToken(kind), pos);
      }
      function parseTokenNodeJSDoc() {
        var pos = getNodePos();
        var kind = token();
        nextTokenJSDoc();
        return finishNode(factory.createToken(kind), pos);
      }
      function canParseSemicolon() {
        if (token() === 26) {
          return true;
        }
        return token() === 19 || token() === 1 || scanner.hasPrecedingLineBreak();
      }
      function tryParseSemicolon() {
        if (!canParseSemicolon()) {
          return false;
        }
        if (token() === 26) {
          nextToken();
        }
        return true;
      }
      function parseSemicolon() {
        return tryParseSemicolon() || parseExpected(26);
      }
      function createNodeArray(elements, pos, end, hasTrailingComma) {
        var array = factory.createNodeArray(elements, hasTrailingComma);
        ts2.setTextRangePosEnd(array, pos, end !== null && end !== void 0 ? end : scanner.getStartPos());
        return array;
      }
      function finishNode(node, pos, end) {
        ts2.setTextRangePosEnd(node, pos, end !== null && end !== void 0 ? end : scanner.getStartPos());
        if (contextFlags) {
          node.flags |= contextFlags;
        }
        if (parseErrorBeforeNextFinishedNode) {
          parseErrorBeforeNextFinishedNode = false;
          node.flags |= 65536;
        }
        return node;
      }
      function createMissingNode(kind, reportAtCurrentPosition, diagnosticMessage, arg0) {
        if (reportAtCurrentPosition) {
          parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0);
        } else if (diagnosticMessage) {
          parseErrorAtCurrentToken(diagnosticMessage, arg0);
        }
        var pos = getNodePos();
        var result = kind === 79 ? factory.createIdentifier("", void 0, void 0) : ts2.isTemplateLiteralKind(kind) ? factory.createTemplateLiteralLikeNode(kind, "", "", void 0) : kind === 8 ? factory.createNumericLiteral("", void 0) : kind === 10 ? factory.createStringLiteral("", void 0) : kind === 275 ? factory.createMissingDeclaration() : factory.createToken(kind);
        return finishNode(result, pos);
      }
      function internIdentifier(text) {
        var identifier = identifiers.get(text);
        if (identifier === void 0) {
          identifiers.set(text, identifier = text);
        }
        return identifier;
      }
      function createIdentifier(isIdentifier2, diagnosticMessage, privateIdentifierDiagnosticMessage) {
        if (isIdentifier2) {
          identifierCount++;
          var pos = getNodePos();
          var originalKeywordKind = token();
          var text = internIdentifier(scanner.getTokenValue());
          nextTokenWithoutCheck();
          return finishNode(factory.createIdentifier(text, void 0, originalKeywordKind), pos);
        }
        if (token() === 80) {
          parseErrorAtCurrentToken(privateIdentifierDiagnosticMessage || ts2.Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies);
          return createIdentifier(true);
        }
        if (token() === 0 && scanner.tryScan(function() {
          return scanner.reScanInvalidIdentifier() === 79;
        })) {
          return createIdentifier(true);
        }
        identifierCount++;
        var reportAtCurrentPosition = token() === 1;
        var isReservedWord = scanner.isReservedWord();
        var msgArg = scanner.getTokenText();
        var defaultMessage = isReservedWord ? ts2.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here : ts2.Diagnostics.Identifier_expected;
        return createMissingNode(79, reportAtCurrentPosition, diagnosticMessage || defaultMessage, msgArg);
      }
      function parseBindingIdentifier(privateIdentifierDiagnosticMessage) {
        return createIdentifier(isBindingIdentifier(), void 0, privateIdentifierDiagnosticMessage);
      }
      function parseIdentifier(diagnosticMessage, privateIdentifierDiagnosticMessage) {
        return createIdentifier(isIdentifier(), diagnosticMessage, privateIdentifierDiagnosticMessage);
      }
      function parseIdentifierName(diagnosticMessage) {
        return createIdentifier(ts2.tokenIsIdentifierOrKeyword(token()), diagnosticMessage);
      }
      function isLiteralPropertyName() {
        return ts2.tokenIsIdentifierOrKeyword(token()) || token() === 10 || token() === 8;
      }
      function isAssertionKey() {
        return ts2.tokenIsIdentifierOrKeyword(token()) || token() === 10;
      }
      function parsePropertyNameWorker(allowComputedPropertyNames) {
        if (token() === 10 || token() === 8) {
          var node = parseLiteralNode();
          node.text = internIdentifier(node.text);
          return node;
        }
        if (allowComputedPropertyNames && token() === 22) {
          return parseComputedPropertyName();
        }
        if (token() === 80) {
          return parsePrivateIdentifier();
        }
        return parseIdentifierName();
      }
      function parsePropertyName() {
        return parsePropertyNameWorker(true);
      }
      function parseComputedPropertyName() {
        var pos = getNodePos();
        parseExpected(22);
        var expression = allowInAnd(parseExpression);
        parseExpected(23);
        return finishNode(factory.createComputedPropertyName(expression), pos);
      }
      function internPrivateIdentifier(text) {
        var privateIdentifier = privateIdentifiers.get(text);
        if (privateIdentifier === void 0) {
          privateIdentifiers.set(text, privateIdentifier = text);
        }
        return privateIdentifier;
      }
      function parsePrivateIdentifier() {
        var pos = getNodePos();
        var node = factory.createPrivateIdentifier(internPrivateIdentifier(scanner.getTokenText()));
        nextToken();
        return finishNode(node, pos);
      }
      function parseContextualModifier(t) {
        return token() === t && tryParse(nextTokenCanFollowModifier);
      }
      function nextTokenIsOnSameLineAndCanFollowModifier() {
        nextToken();
        if (scanner.hasPrecedingLineBreak()) {
          return false;
        }
        return canFollowModifier();
      }
      function nextTokenCanFollowModifier() {
        switch (token()) {
          case 85:
            return nextToken() === 92;
          case 93:
            nextToken();
            if (token() === 88) {
              return lookAhead(nextTokenCanFollowDefaultKeyword);
            }
            if (token() === 151) {
              return lookAhead(nextTokenCanFollowExportModifier);
            }
            return canFollowExportModifier();
          case 88:
            return nextTokenCanFollowDefaultKeyword();
          case 124:
          case 136:
          case 148:
            nextToken();
            return canFollowModifier();
          default:
            return nextTokenIsOnSameLineAndCanFollowModifier();
        }
      }
      function canFollowExportModifier() {
        return token() !== 41 && token() !== 127 && token() !== 18 && canFollowModifier();
      }
      function nextTokenCanFollowExportModifier() {
        nextToken();
        return canFollowExportModifier();
      }
      function parseAnyContextualModifier() {
        return ts2.isModifierKind(token()) && tryParse(nextTokenCanFollowModifier);
      }
      function canFollowModifier() {
        return token() === 22 || token() === 18 || token() === 41 || token() === 25 || isLiteralPropertyName();
      }
      function nextTokenCanFollowDefaultKeyword() {
        nextToken();
        return token() === 84 || token() === 98 || token() === 118 || token() === 126 && lookAhead(nextTokenIsClassKeywordOnSameLine) || token() === 131 && lookAhead(nextTokenIsFunctionKeywordOnSameLine);
      }
      function isListElement(parsingContext2, inErrorRecovery) {
        var node = currentNode(parsingContext2);
        if (node) {
          return true;
        }
        switch (parsingContext2) {
          case 0:
          case 1:
          case 3:
            return !(token() === 26 && inErrorRecovery) && isStartOfStatement();
          case 2:
            return token() === 82 || token() === 88;
          case 4:
            return lookAhead(isTypeMemberStart);
          case 5:
            return lookAhead(isClassMemberStart) || token() === 26 && !inErrorRecovery;
          case 6:
            return token() === 22 || isLiteralPropertyName();
          case 12:
            switch (token()) {
              case 22:
              case 41:
              case 25:
              case 24:
                return true;
              default:
                return isLiteralPropertyName();
            }
          case 18:
            return isLiteralPropertyName();
          case 9:
            return token() === 22 || token() === 25 || isLiteralPropertyName();
          case 24:
            return isAssertionKey();
          case 7:
            if (token() === 18) {
              return lookAhead(isValidHeritageClauseObjectLiteral);
            }
            if (!inErrorRecovery) {
              return isStartOfLeftHandSideExpression() && !isHeritageClauseExtendsOrImplementsKeyword();
            } else {
              return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword();
            }
          case 8:
            return isBindingIdentifierOrPrivateIdentifierOrPattern();
          case 10:
            return token() === 27 || token() === 25 || isBindingIdentifierOrPrivateIdentifierOrPattern();
          case 19:
            return isIdentifier();
          case 15:
            switch (token()) {
              case 27:
              case 24:
                return true;
            }
          case 11:
            return token() === 25 || isStartOfExpression();
          case 16:
            return isStartOfParameter(false);
          case 17:
            return isStartOfParameter(true);
          case 20:
          case 21:
            return token() === 27 || isStartOfType();
          case 22:
            return isHeritageClause();
          case 23:
            return ts2.tokenIsIdentifierOrKeyword(token());
          case 13:
            return ts2.tokenIsIdentifierOrKeyword(token()) || token() === 18;
          case 14:
            return true;
        }
        return ts2.Debug.fail("Non-exhaustive case in 'isListElement'.");
      }
      function isValidHeritageClauseObjectLiteral() {
        ts2.Debug.assert(token() === 18);
        if (nextToken() === 19) {
          var next = nextToken();
          return next === 27 || next === 18 || next === 94 || next === 117;
        }
        return true;
      }
      function nextTokenIsIdentifier() {
        nextToken();
        return isIdentifier();
      }
      function nextTokenIsIdentifierOrKeyword() {
        nextToken();
        return ts2.tokenIsIdentifierOrKeyword(token());
      }
      function nextTokenIsIdentifierOrKeywordOrGreaterThan() {
        nextToken();
        return ts2.tokenIsIdentifierOrKeywordOrGreaterThan(token());
      }
      function isHeritageClauseExtendsOrImplementsKeyword() {
        if (token() === 117 || token() === 94) {
          return lookAhead(nextTokenIsStartOfExpression);
        }
        return false;
      }
      function nextTokenIsStartOfExpression() {
        nextToken();
        return isStartOfExpression();
      }
      function nextTokenIsStartOfType() {
        nextToken();
        return isStartOfType();
      }
      function isListTerminator(kind) {
        if (token() === 1) {
          return true;
        }
        switch (kind) {
          case 1:
          case 2:
          case 4:
          case 5:
          case 6:
          case 12:
          case 9:
          case 23:
          case 24:
            return token() === 19;
          case 3:
            return token() === 19 || token() === 82 || token() === 88;
          case 7:
            return token() === 18 || token() === 94 || token() === 117;
          case 8:
            return isVariableDeclaratorListTerminator();
          case 19:
            return token() === 31 || token() === 20 || token() === 18 || token() === 94 || token() === 117;
          case 11:
            return token() === 21 || token() === 26;
          case 15:
          case 21:
          case 10:
            return token() === 23;
          case 17:
          case 16:
          case 18:
            return token() === 21 || token() === 23;
          case 20:
            return token() !== 27;
          case 22:
            return token() === 18 || token() === 19;
          case 13:
            return token() === 31 || token() === 43;
          case 14:
            return token() === 29 && lookAhead(nextTokenIsSlash);
          default:
            return false;
        }
      }
      function isVariableDeclaratorListTerminator() {
        if (canParseSemicolon()) {
          return true;
        }
        if (isInOrOfKeyword(token())) {
          return true;
        }
        if (token() === 38) {
          return true;
        }
        return false;
      }
      function isInSomeParsingContext() {
        for (var kind = 0; kind < 25; kind++) {
          if (parsingContext & 1 << kind) {
            if (isListElement(kind, true) || isListTerminator(kind)) {
              return true;
            }
          }
        }
        return false;
      }
      function parseList(kind, parseElement) {
        var saveParsingContext = parsingContext;
        parsingContext |= 1 << kind;
        var list = [];
        var listPos = getNodePos();
        while (!isListTerminator(kind)) {
          if (isListElement(kind, false)) {
            list.push(parseListElement(kind, parseElement));
            continue;
          }
          if (abortParsingListOrMoveToNextToken(kind)) {
            break;
          }
        }
        parsingContext = saveParsingContext;
        return createNodeArray(list, listPos);
      }
      function parseListElement(parsingContext2, parseElement) {
        var node = currentNode(parsingContext2);
        if (node) {
          return consumeNode(node);
        }
        return parseElement();
      }
      function currentNode(parsingContext2) {
        if (!syntaxCursor || !isReusableParsingContext(parsingContext2) || parseErrorBeforeNextFinishedNode) {
          return void 0;
        }
        var node = syntaxCursor.currentNode(scanner.getStartPos());
        if (ts2.nodeIsMissing(node) || node.intersectsChange || ts2.containsParseError(node)) {
          return void 0;
        }
        var nodeContextFlags = node.flags & 25358336;
        if (nodeContextFlags !== contextFlags) {
          return void 0;
        }
        if (!canReuseNode(node, parsingContext2)) {
          return void 0;
        }
        if (node.jsDocCache) {
          node.jsDocCache = void 0;
        }
        return node;
      }
      function consumeNode(node) {
        scanner.setTextPos(node.end);
        nextToken();
        return node;
      }
      function isReusableParsingContext(parsingContext2) {
        switch (parsingContext2) {
          case 5:
          case 2:
          case 0:
          case 1:
          case 3:
          case 6:
          case 4:
          case 8:
          case 17:
          case 16:
            return true;
        }
        return false;
      }
      function canReuseNode(node, parsingContext2) {
        switch (parsingContext2) {
          case 5:
            return isReusableClassMember(node);
          case 2:
            return isReusableSwitchClause(node);
          case 0:
          case 1:
          case 3:
            return isReusableStatement(node);
          case 6:
            return isReusableEnumMember(node);
          case 4:
            return isReusableTypeMember(node);
          case 8:
            return isReusableVariableDeclaration(node);
          case 17:
          case 16:
            return isReusableParameter(node);
        }
        return false;
      }
      function isReusableClassMember(node) {
        if (node) {
          switch (node.kind) {
            case 170:
            case 175:
            case 171:
            case 172:
            case 166:
            case 233:
              return true;
            case 168:
              var methodDeclaration = node;
              var nameIsConstructor = methodDeclaration.name.kind === 79 && methodDeclaration.name.originalKeywordKind === 134;
              return !nameIsConstructor;
          }
        }
        return false;
      }
      function isReusableSwitchClause(node) {
        if (node) {
          switch (node.kind) {
            case 288:
            case 289:
              return true;
          }
        }
        return false;
      }
      function isReusableStatement(node) {
        if (node) {
          switch (node.kind) {
            case 255:
            case 236:
            case 234:
            case 238:
            case 237:
            case 250:
            case 246:
            case 248:
            case 245:
            case 244:
            case 242:
            case 243:
            case 241:
            case 240:
            case 247:
            case 235:
            case 251:
            case 249:
            case 239:
            case 252:
            case 265:
            case 264:
            case 271:
            case 270:
            case 260:
            case 256:
            case 257:
            case 259:
            case 258:
              return true;
          }
        }
        return false;
      }
      function isReusableEnumMember(node) {
        return node.kind === 297;
      }
      function isReusableTypeMember(node) {
        if (node) {
          switch (node.kind) {
            case 174:
            case 167:
            case 175:
            case 165:
            case 173:
              return true;
          }
        }
        return false;
      }
      function isReusableVariableDeclaration(node) {
        if (node.kind !== 253) {
          return false;
        }
        var variableDeclarator = node;
        return variableDeclarator.initializer === void 0;
      }
      function isReusableParameter(node) {
        if (node.kind !== 163) {
          return false;
        }
        var parameter = node;
        return parameter.initializer === void 0;
      }
      function abortParsingListOrMoveToNextToken(kind) {
        parsingContextErrors(kind);
        if (isInSomeParsingContext()) {
          return true;
        }
        nextToken();
        return false;
      }
      function parsingContextErrors(context) {
        switch (context) {
          case 0:
            return token() === 88 ? parseErrorAtCurrentToken(ts2.Diagnostics._0_expected, ts2.tokenToString(93)) : parseErrorAtCurrentToken(ts2.Diagnostics.Declaration_or_statement_expected);
          case 1:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Declaration_or_statement_expected);
          case 2:
            return parseErrorAtCurrentToken(ts2.Diagnostics.case_or_default_expected);
          case 3:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Statement_expected);
          case 18:
          case 4:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Property_or_signature_expected);
          case 5:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Unexpected_token_A_constructor_method_accessor_or_property_was_expected);
          case 6:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Enum_member_expected);
          case 7:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Expression_expected);
          case 8:
            return ts2.isKeyword(token()) ? parseErrorAtCurrentToken(ts2.Diagnostics._0_is_not_allowed_as_a_variable_declaration_name, ts2.tokenToString(token())) : parseErrorAtCurrentToken(ts2.Diagnostics.Variable_declaration_expected);
          case 9:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Property_destructuring_pattern_expected);
          case 10:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Array_element_destructuring_pattern_expected);
          case 11:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Argument_expression_expected);
          case 12:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Property_assignment_expected);
          case 15:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Expression_or_comma_expected);
          case 17:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Parameter_declaration_expected);
          case 16:
            return ts2.isKeyword(token()) ? parseErrorAtCurrentToken(ts2.Diagnostics._0_is_not_allowed_as_a_parameter_name, ts2.tokenToString(token())) : parseErrorAtCurrentToken(ts2.Diagnostics.Parameter_declaration_expected);
          case 19:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Type_parameter_declaration_expected);
          case 20:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Type_argument_expected);
          case 21:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Type_expected);
          case 22:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Unexpected_token_expected);
          case 23:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Identifier_expected);
          case 13:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Identifier_expected);
          case 14:
            return parseErrorAtCurrentToken(ts2.Diagnostics.Identifier_expected);
          default:
            return [void 0];
        }
      }
      function parseDelimitedList(kind, parseElement, considerSemicolonAsDelimiter) {
        var saveParsingContext = parsingContext;
        parsingContext |= 1 << kind;
        var list = [];
        var listPos = getNodePos();
        var commaStart = -1;
        while (true) {
          if (isListElement(kind, false)) {
            var startPos = scanner.getStartPos();
            list.push(parseListElement(kind, parseElement));
            commaStart = scanner.getTokenPos();
            if (parseOptional(27)) {
              continue;
            }
            commaStart = -1;
            if (isListTerminator(kind)) {
              break;
            }
            parseExpected(27, getExpectedCommaDiagnostic(kind));
            if (considerSemicolonAsDelimiter && token() === 26 && !scanner.hasPrecedingLineBreak()) {
              nextToken();
            }
            if (startPos === scanner.getStartPos()) {
              nextToken();
            }
            continue;
          }
          if (isListTerminator(kind)) {
            break;
          }
          if (abortParsingListOrMoveToNextToken(kind)) {
            break;
          }
        }
        parsingContext = saveParsingContext;
        return createNodeArray(list, listPos, void 0, commaStart >= 0);
      }
      function getExpectedCommaDiagnostic(kind) {
        return kind === 6 ? ts2.Diagnostics.An_enum_member_name_must_be_followed_by_a_or : void 0;
      }
      function createMissingList() {
        var list = createNodeArray([], getNodePos());
        list.isMissingList = true;
        return list;
      }
      function isMissingList(arr) {
        return !!arr.isMissingList;
      }
      function parseBracketedList(kind, parseElement, open, close) {
        if (parseExpected(open)) {
          var result = parseDelimitedList(kind, parseElement);
          parseExpected(close);
          return result;
        }
        return createMissingList();
      }
      function parseEntityName(allowReservedWords, diagnosticMessage) {
        var pos = getNodePos();
        var entity = allowReservedWords ? parseIdentifierName(diagnosticMessage) : parseIdentifier(diagnosticMessage);
        var dotPos = getNodePos();
        while (parseOptional(24)) {
          if (token() === 29) {
            entity.jsdocDotPos = dotPos;
            break;
          }
          dotPos = getNodePos();
          entity = finishNode(factory.createQualifiedName(entity, parseRightSideOfDot(allowReservedWords, false)), pos);
        }
        return entity;
      }
      function createQualifiedName(entity, name) {
        return finishNode(factory.createQualifiedName(entity, name), entity.pos);
      }
      function parseRightSideOfDot(allowIdentifierNames, allowPrivateIdentifiers) {
        if (scanner.hasPrecedingLineBreak() && ts2.tokenIsIdentifierOrKeyword(token())) {
          var matchesPattern = lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine);
          if (matchesPattern) {
            return createMissingNode(79, true, ts2.Diagnostics.Identifier_expected);
          }
        }
        if (token() === 80) {
          var node = parsePrivateIdentifier();
          return allowPrivateIdentifiers ? node : createMissingNode(79, true, ts2.Diagnostics.Identifier_expected);
        }
        return allowIdentifierNames ? parseIdentifierName() : parseIdentifier();
      }
      function parseTemplateSpans(isTaggedTemplate) {
        var pos = getNodePos();
        var list = [];
        var node;
        do {
          node = parseTemplateSpan(isTaggedTemplate);
          list.push(node);
        } while (node.literal.kind === 16);
        return createNodeArray(list, pos);
      }
      function parseTemplateExpression(isTaggedTemplate) {
        var pos = getNodePos();
        return finishNode(factory.createTemplateExpression(parseTemplateHead(isTaggedTemplate), parseTemplateSpans(isTaggedTemplate)), pos);
      }
      function parseTemplateType() {
        var pos = getNodePos();
        return finishNode(factory.createTemplateLiteralType(parseTemplateHead(false), parseTemplateTypeSpans()), pos);
      }
      function parseTemplateTypeSpans() {
        var pos = getNodePos();
        var list = [];
        var node;
        do {
          node = parseTemplateTypeSpan();
          list.push(node);
        } while (node.literal.kind === 16);
        return createNodeArray(list, pos);
      }
      function parseTemplateTypeSpan() {
        var pos = getNodePos();
        return finishNode(factory.createTemplateLiteralTypeSpan(parseType(), parseLiteralOfTemplateSpan(false)), pos);
      }
      function parseLiteralOfTemplateSpan(isTaggedTemplate) {
        if (token() === 19) {
          reScanTemplateToken(isTaggedTemplate);
          return parseTemplateMiddleOrTemplateTail();
        } else {
          return parseExpectedToken(17, ts2.Diagnostics._0_expected, ts2.tokenToString(19));
        }
      }
      function parseTemplateSpan(isTaggedTemplate) {
        var pos = getNodePos();
        return finishNode(factory.createTemplateSpan(allowInAnd(parseExpression), parseLiteralOfTemplateSpan(isTaggedTemplate)), pos);
      }
      function parseLiteralNode() {
        return parseLiteralLikeNode(token());
      }
      function parseTemplateHead(isTaggedTemplate) {
        if (isTaggedTemplate) {
          reScanTemplateHeadOrNoSubstitutionTemplate();
        }
        var fragment = parseLiteralLikeNode(token());
        ts2.Debug.assert(fragment.kind === 15, "Template head has wrong token kind");
        return fragment;
      }
      function parseTemplateMiddleOrTemplateTail() {
        var fragment = parseLiteralLikeNode(token());
        ts2.Debug.assert(fragment.kind === 16 || fragment.kind === 17, "Template fragment has wrong token kind");
        return fragment;
      }
      function getTemplateLiteralRawText(kind) {
        var isLast = kind === 14 || kind === 17;
        var tokenText = scanner.getTokenText();
        return tokenText.substring(1, tokenText.length - (scanner.isUnterminated() ? 0 : isLast ? 1 : 2));
      }
      function parseLiteralLikeNode(kind) {
        var pos = getNodePos();
        var node = ts2.isTemplateLiteralKind(kind) ? factory.createTemplateLiteralLikeNode(kind, scanner.getTokenValue(), getTemplateLiteralRawText(kind), scanner.getTokenFlags() & 2048) : kind === 8 ? factory.createNumericLiteral(scanner.getTokenValue(), scanner.getNumericLiteralFlags()) : kind === 10 ? factory.createStringLiteral(scanner.getTokenValue(), void 0, scanner.hasExtendedUnicodeEscape()) : ts2.isLiteralKind(kind) ? factory.createLiteralLikeNode(kind, scanner.getTokenValue()) : ts2.Debug.fail();
        if (scanner.hasExtendedUnicodeEscape()) {
          node.hasExtendedUnicodeEscape = true;
        }
        if (scanner.isUnterminated()) {
          node.isUnterminated = true;
        }
        nextToken();
        return finishNode(node, pos);
      }
      function parseEntityNameOfTypeReference() {
        return parseEntityName(true, ts2.Diagnostics.Type_expected);
      }
      function parseTypeArgumentsOfTypeReference() {
        if (!scanner.hasPrecedingLineBreak() && reScanLessThanToken() === 29) {
          return parseBracketedList(20, parseType, 29, 31);
        }
      }
      function parseTypeReference() {
        var pos = getNodePos();
        return finishNode(factory.createTypeReferenceNode(parseEntityNameOfTypeReference(), parseTypeArgumentsOfTypeReference()), pos);
      }
      function typeHasArrowFunctionBlockingParseError(node) {
        switch (node.kind) {
          case 177:
            return ts2.nodeIsMissing(node.typeName);
          case 178:
          case 179: {
            var _a = node, parameters = _a.parameters, type = _a.type;
            return isMissingList(parameters) || typeHasArrowFunctionBlockingParseError(type);
          }
          case 190:
            return typeHasArrowFunctionBlockingParseError(node.type);
          default:
            return false;
        }
      }
      function parseThisTypePredicate(lhs) {
        nextToken();
        return finishNode(factory.createTypePredicateNode(void 0, lhs, parseType()), lhs.pos);
      }
      function parseThisTypeNode() {
        var pos = getNodePos();
        nextToken();
        return finishNode(factory.createThisTypeNode(), pos);
      }
      function parseJSDocAllType() {
        var pos = getNodePos();
        nextToken();
        return finishNode(factory.createJSDocAllType(), pos);
      }
      function parseJSDocNonNullableType() {
        var pos = getNodePos();
        nextToken();
        return finishNode(factory.createJSDocNonNullableType(parseNonArrayType()), pos);
      }
      function parseJSDocUnknownOrNullableType() {
        var pos = getNodePos();
        nextToken();
        if (token() === 27 || token() === 19 || token() === 21 || token() === 31 || token() === 63 || token() === 51) {
          return finishNode(factory.createJSDocUnknownType(), pos);
        } else {
          return finishNode(factory.createJSDocNullableType(parseType()), pos);
        }
      }
      function parseJSDocFunctionType() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        if (lookAhead(nextTokenIsOpenParen)) {
          nextToken();
          var parameters = parseParameters(4 | 32);
          var type = parseReturnType(58, false);
          return withJSDoc(finishNode(factory.createJSDocFunctionType(parameters, type), pos), hasJSDoc);
        }
        return finishNode(factory.createTypeReferenceNode(parseIdentifierName(), void 0), pos);
      }
      function parseJSDocParameter() {
        var pos = getNodePos();
        var name;
        if (token() === 108 || token() === 103) {
          name = parseIdentifierName();
          parseExpected(58);
        }
        return finishNode(factory.createParameterDeclaration(void 0, void 0, void 0, name, void 0, parseJSDocType(), void 0), pos);
      }
      function parseJSDocType() {
        scanner.setInJSDocType(true);
        var pos = getNodePos();
        if (parseOptional(141)) {
          var moduleTag = factory.createJSDocNamepathType(void 0);
          terminate:
            while (true) {
              switch (token()) {
                case 19:
                case 1:
                case 27:
                case 5:
                  break terminate;
                default:
                  nextTokenJSDoc();
              }
            }
          scanner.setInJSDocType(false);
          return finishNode(moduleTag, pos);
        }
        var hasDotDotDot = parseOptional(25);
        var type = parseTypeOrTypePredicate();
        scanner.setInJSDocType(false);
        if (hasDotDotDot) {
          type = finishNode(factory.createJSDocVariadicType(type), pos);
        }
        if (token() === 63) {
          nextToken();
          return finishNode(factory.createJSDocOptionalType(type), pos);
        }
        return type;
      }
      function parseTypeQuery() {
        var pos = getNodePos();
        parseExpected(112);
        return finishNode(factory.createTypeQueryNode(parseEntityName(true)), pos);
      }
      function parseTypeParameter() {
        var pos = getNodePos();
        var name = parseIdentifier();
        var constraint;
        var expression;
        if (parseOptional(94)) {
          if (isStartOfType() || !isStartOfExpression()) {
            constraint = parseType();
          } else {
            expression = parseUnaryExpressionOrHigher();
          }
        }
        var defaultType = parseOptional(63) ? parseType() : void 0;
        var node = factory.createTypeParameterDeclaration(name, constraint, defaultType);
        node.expression = expression;
        return finishNode(node, pos);
      }
      function parseTypeParameters() {
        if (token() === 29) {
          return parseBracketedList(19, parseTypeParameter, 29, 31);
        }
      }
      function isStartOfParameter(isJSDocParameter) {
        return token() === 25 || isBindingIdentifierOrPrivateIdentifierOrPattern() || ts2.isModifierKind(token()) || token() === 59 || isStartOfType(!isJSDocParameter);
      }
      function parseNameOfParameter(modifiers) {
        var name = parseIdentifierOrPattern(ts2.Diagnostics.Private_identifiers_cannot_be_used_as_parameters);
        if (ts2.getFullWidth(name) === 0 && !ts2.some(modifiers) && ts2.isModifierKind(token())) {
          nextToken();
        }
        return name;
      }
      function parseParameterInOuterAwaitContext() {
        return parseParameterWorker(true);
      }
      function parseParameter() {
        return parseParameterWorker(false);
      }
      function parseParameterWorker(inOuterAwaitContext) {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var decorators = inOuterAwaitContext ? doInAwaitContext(parseDecorators) : parseDecorators();
        if (token() === 108) {
          var node_1 = factory.createParameterDeclaration(decorators, void 0, void 0, createIdentifier(true), void 0, parseTypeAnnotation(), void 0);
          if (decorators) {
            parseErrorAtRange(decorators[0], ts2.Diagnostics.Decorators_may_not_be_applied_to_this_parameters);
          }
          return withJSDoc(finishNode(node_1, pos), hasJSDoc);
        }
        var savedTopLevel = topLevel;
        topLevel = false;
        var modifiers = parseModifiers();
        var node = withJSDoc(finishNode(factory.createParameterDeclaration(decorators, modifiers, parseOptionalToken(25), parseNameOfParameter(modifiers), parseOptionalToken(57), parseTypeAnnotation(), parseInitializer()), pos), hasJSDoc);
        topLevel = savedTopLevel;
        return node;
      }
      function parseReturnType(returnToken, isType) {
        if (shouldParseReturnType(returnToken, isType)) {
          return parseTypeOrTypePredicate();
        }
      }
      function shouldParseReturnType(returnToken, isType) {
        if (returnToken === 38) {
          parseExpected(returnToken);
          return true;
        } else if (parseOptional(58)) {
          return true;
        } else if (isType && token() === 38) {
          parseErrorAtCurrentToken(ts2.Diagnostics._0_expected, ts2.tokenToString(58));
          nextToken();
          return true;
        }
        return false;
      }
      function parseParametersWorker(flags) {
        var savedYieldContext = inYieldContext();
        var savedAwaitContext = inAwaitContext();
        setYieldContext(!!(flags & 1));
        setAwaitContext(!!(flags & 2));
        var parameters = flags & 32 ? parseDelimitedList(17, parseJSDocParameter) : parseDelimitedList(16, savedAwaitContext ? parseParameterInOuterAwaitContext : parseParameter);
        setYieldContext(savedYieldContext);
        setAwaitContext(savedAwaitContext);
        return parameters;
      }
      function parseParameters(flags) {
        if (!parseExpected(20)) {
          return createMissingList();
        }
        var parameters = parseParametersWorker(flags);
        parseExpected(21);
        return parameters;
      }
      function parseTypeMemberSemicolon() {
        if (parseOptional(27)) {
          return;
        }
        parseSemicolon();
      }
      function parseSignatureMember(kind) {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        if (kind === 174) {
          parseExpected(103);
        }
        var typeParameters = parseTypeParameters();
        var parameters = parseParameters(4);
        var type = parseReturnType(58, true);
        parseTypeMemberSemicolon();
        var node = kind === 173 ? factory.createCallSignature(typeParameters, parameters, type) : factory.createConstructSignature(typeParameters, parameters, type);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function isIndexSignature() {
        return token() === 22 && lookAhead(isUnambiguouslyIndexSignature);
      }
      function isUnambiguouslyIndexSignature() {
        nextToken();
        if (token() === 25 || token() === 23) {
          return true;
        }
        if (ts2.isModifierKind(token())) {
          nextToken();
          if (isIdentifier()) {
            return true;
          }
        } else if (!isIdentifier()) {
          return false;
        } else {
          nextToken();
        }
        if (token() === 58 || token() === 27) {
          return true;
        }
        if (token() !== 57) {
          return false;
        }
        nextToken();
        return token() === 58 || token() === 27 || token() === 23;
      }
      function parseIndexSignatureDeclaration(pos, hasJSDoc, decorators, modifiers) {
        var parameters = parseBracketedList(16, parseParameter, 22, 23);
        var type = parseTypeAnnotation();
        parseTypeMemberSemicolon();
        var node = factory.createIndexSignature(decorators, modifiers, parameters, type);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parsePropertyOrMethodSignature(pos, hasJSDoc, modifiers) {
        var name = parsePropertyName();
        var questionToken = parseOptionalToken(57);
        var node;
        if (token() === 20 || token() === 29) {
          var typeParameters = parseTypeParameters();
          var parameters = parseParameters(4);
          var type = parseReturnType(58, true);
          node = factory.createMethodSignature(modifiers, name, questionToken, typeParameters, parameters, type);
        } else {
          var type = parseTypeAnnotation();
          node = factory.createPropertySignature(modifiers, name, questionToken, type);
          if (token() === 63)
            node.initializer = parseInitializer();
        }
        parseTypeMemberSemicolon();
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function isTypeMemberStart() {
        if (token() === 20 || token() === 29 || token() === 136 || token() === 148) {
          return true;
        }
        var idToken = false;
        while (ts2.isModifierKind(token())) {
          idToken = true;
          nextToken();
        }
        if (token() === 22) {
          return true;
        }
        if (isLiteralPropertyName()) {
          idToken = true;
          nextToken();
        }
        if (idToken) {
          return token() === 20 || token() === 29 || token() === 57 || token() === 58 || token() === 27 || canParseSemicolon();
        }
        return false;
      }
      function parseTypeMember() {
        if (token() === 20 || token() === 29) {
          return parseSignatureMember(173);
        }
        if (token() === 103 && lookAhead(nextTokenIsOpenParenOrLessThan)) {
          return parseSignatureMember(174);
        }
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var modifiers = parseModifiers();
        if (parseContextualModifier(136)) {
          return parseAccessorDeclaration(pos, hasJSDoc, void 0, modifiers, 171);
        }
        if (parseContextualModifier(148)) {
          return parseAccessorDeclaration(pos, hasJSDoc, void 0, modifiers, 172);
        }
        if (isIndexSignature()) {
          return parseIndexSignatureDeclaration(pos, hasJSDoc, void 0, modifiers);
        }
        return parsePropertyOrMethodSignature(pos, hasJSDoc, modifiers);
      }
      function nextTokenIsOpenParenOrLessThan() {
        nextToken();
        return token() === 20 || token() === 29;
      }
      function nextTokenIsDot() {
        return nextToken() === 24;
      }
      function nextTokenIsOpenParenOrLessThanOrDot() {
        switch (nextToken()) {
          case 20:
          case 29:
          case 24:
            return true;
        }
        return false;
      }
      function parseTypeLiteral() {
        var pos = getNodePos();
        return finishNode(factory.createTypeLiteralNode(parseObjectTypeMembers()), pos);
      }
      function parseObjectTypeMembers() {
        var members;
        if (parseExpected(18)) {
          members = parseList(4, parseTypeMember);
          parseExpected(19);
        } else {
          members = createMissingList();
        }
        return members;
      }
      function isStartOfMappedType() {
        nextToken();
        if (token() === 39 || token() === 40) {
          return nextToken() === 144;
        }
        if (token() === 144) {
          nextToken();
        }
        return token() === 22 && nextTokenIsIdentifier() && nextToken() === 101;
      }
      function parseMappedTypeParameter() {
        var pos = getNodePos();
        var name = parseIdentifierName();
        parseExpected(101);
        var type = parseType();
        return finishNode(factory.createTypeParameterDeclaration(name, type, void 0), pos);
      }
      function parseMappedType() {
        var pos = getNodePos();
        parseExpected(18);
        var readonlyToken;
        if (token() === 144 || token() === 39 || token() === 40) {
          readonlyToken = parseTokenNode();
          if (readonlyToken.kind !== 144) {
            parseExpected(144);
          }
        }
        parseExpected(22);
        var typeParameter = parseMappedTypeParameter();
        var nameType = parseOptional(127) ? parseType() : void 0;
        parseExpected(23);
        var questionToken;
        if (token() === 57 || token() === 39 || token() === 40) {
          questionToken = parseTokenNode();
          if (questionToken.kind !== 57) {
            parseExpected(57);
          }
        }
        var type = parseTypeAnnotation();
        parseSemicolon();
        var members = parseList(4, parseTypeMember);
        parseExpected(19);
        return finishNode(factory.createMappedTypeNode(readonlyToken, typeParameter, nameType, questionToken, type, members), pos);
      }
      function parseTupleElementType() {
        var pos = getNodePos();
        if (parseOptional(25)) {
          return finishNode(factory.createRestTypeNode(parseType()), pos);
        }
        var type = parseType();
        if (ts2.isJSDocNullableType(type) && type.pos === type.type.pos) {
          var node = factory.createOptionalTypeNode(type.type);
          ts2.setTextRange(node, type);
          node.flags = type.flags;
          return node;
        }
        return type;
      }
      function isNextTokenColonOrQuestionColon() {
        return nextToken() === 58 || token() === 57 && nextToken() === 58;
      }
      function isTupleElementName() {
        if (token() === 25) {
          return ts2.tokenIsIdentifierOrKeyword(nextToken()) && isNextTokenColonOrQuestionColon();
        }
        return ts2.tokenIsIdentifierOrKeyword(token()) && isNextTokenColonOrQuestionColon();
      }
      function parseTupleElementNameOrTupleElementType() {
        if (lookAhead(isTupleElementName)) {
          var pos = getNodePos();
          var hasJSDoc = hasPrecedingJSDocComment();
          var dotDotDotToken = parseOptionalToken(25);
          var name = parseIdentifierName();
          var questionToken = parseOptionalToken(57);
          parseExpected(58);
          var type = parseTupleElementType();
          var node = factory.createNamedTupleMember(dotDotDotToken, name, questionToken, type);
          return withJSDoc(finishNode(node, pos), hasJSDoc);
        }
        return parseTupleElementType();
      }
      function parseTupleType() {
        var pos = getNodePos();
        return finishNode(factory.createTupleTypeNode(parseBracketedList(21, parseTupleElementNameOrTupleElementType, 22, 23)), pos);
      }
      function parseParenthesizedType() {
        var pos = getNodePos();
        parseExpected(20);
        var type = parseType();
        parseExpected(21);
        return finishNode(factory.createParenthesizedType(type), pos);
      }
      function parseModifiersForConstructorType() {
        var modifiers;
        if (token() === 126) {
          var pos = getNodePos();
          nextToken();
          var modifier = finishNode(factory.createToken(126), pos);
          modifiers = createNodeArray([modifier], pos);
        }
        return modifiers;
      }
      function parseFunctionOrConstructorType() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var modifiers = parseModifiersForConstructorType();
        var isConstructorType = parseOptional(103);
        var typeParameters = parseTypeParameters();
        var parameters = parseParameters(4);
        var type = parseReturnType(38, false);
        var node = isConstructorType ? factory.createConstructorTypeNode(modifiers, typeParameters, parameters, type) : factory.createFunctionTypeNode(typeParameters, parameters, type);
        if (!isConstructorType)
          node.modifiers = modifiers;
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseKeywordAndNoDot() {
        var node = parseTokenNode();
        return token() === 24 ? void 0 : node;
      }
      function parseLiteralTypeNode(negative) {
        var pos = getNodePos();
        if (negative) {
          nextToken();
        }
        var expression = token() === 110 || token() === 95 || token() === 104 ? parseTokenNode() : parseLiteralLikeNode(token());
        if (negative) {
          expression = finishNode(factory.createPrefixUnaryExpression(40, expression), pos);
        }
        return finishNode(factory.createLiteralTypeNode(expression), pos);
      }
      function isStartOfTypeOfImportType() {
        nextToken();
        return token() === 100;
      }
      function parseImportType() {
        sourceFlags |= 1048576;
        var pos = getNodePos();
        var isTypeOf = parseOptional(112);
        parseExpected(100);
        parseExpected(20);
        var type = parseType();
        parseExpected(21);
        var qualifier = parseOptional(24) ? parseEntityNameOfTypeReference() : void 0;
        var typeArguments = parseTypeArgumentsOfTypeReference();
        return finishNode(factory.createImportTypeNode(type, qualifier, typeArguments, isTypeOf), pos);
      }
      function nextTokenIsNumericOrBigIntLiteral() {
        nextToken();
        return token() === 8 || token() === 9;
      }
      function parseNonArrayType() {
        switch (token()) {
          case 130:
          case 154:
          case 149:
          case 146:
          case 157:
          case 150:
          case 133:
          case 152:
          case 143:
          case 147:
            return tryParse(parseKeywordAndNoDot) || parseTypeReference();
          case 66:
            scanner.reScanAsteriskEqualsToken();
          case 41:
            return parseJSDocAllType();
          case 60:
            scanner.reScanQuestionToken();
          case 57:
            return parseJSDocUnknownOrNullableType();
          case 98:
            return parseJSDocFunctionType();
          case 53:
            return parseJSDocNonNullableType();
          case 14:
          case 10:
          case 8:
          case 9:
          case 110:
          case 95:
          case 104:
            return parseLiteralTypeNode();
          case 40:
            return lookAhead(nextTokenIsNumericOrBigIntLiteral) ? parseLiteralTypeNode(true) : parseTypeReference();
          case 114:
            return parseTokenNode();
          case 108: {
            var thisKeyword = parseThisTypeNode();
            if (token() === 139 && !scanner.hasPrecedingLineBreak()) {
              return parseThisTypePredicate(thisKeyword);
            } else {
              return thisKeyword;
            }
          }
          case 112:
            return lookAhead(isStartOfTypeOfImportType) ? parseImportType() : parseTypeQuery();
          case 18:
            return lookAhead(isStartOfMappedType) ? parseMappedType() : parseTypeLiteral();
          case 22:
            return parseTupleType();
          case 20:
            return parseParenthesizedType();
          case 100:
            return parseImportType();
          case 128:
            return lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine) ? parseAssertsTypePredicate() : parseTypeReference();
          case 15:
            return parseTemplateType();
          default:
            return parseTypeReference();
        }
      }
      function isStartOfType(inStartOfParameter) {
        switch (token()) {
          case 130:
          case 154:
          case 149:
          case 146:
          case 157:
          case 133:
          case 144:
          case 150:
          case 153:
          case 114:
          case 152:
          case 104:
          case 108:
          case 112:
          case 143:
          case 18:
          case 22:
          case 29:
          case 51:
          case 50:
          case 103:
          case 10:
          case 8:
          case 9:
          case 110:
          case 95:
          case 147:
          case 41:
          case 57:
          case 53:
          case 25:
          case 137:
          case 100:
          case 128:
          case 14:
          case 15:
            return true;
          case 98:
            return !inStartOfParameter;
          case 40:
            return !inStartOfParameter && lookAhead(nextTokenIsNumericOrBigIntLiteral);
          case 20:
            return !inStartOfParameter && lookAhead(isStartOfParenthesizedOrFunctionType);
          default:
            return isIdentifier();
        }
      }
      function isStartOfParenthesizedOrFunctionType() {
        nextToken();
        return token() === 21 || isStartOfParameter(false) || isStartOfType();
      }
      function parsePostfixTypeOrHigher() {
        var pos = getNodePos();
        var type = parseNonArrayType();
        while (!scanner.hasPrecedingLineBreak()) {
          switch (token()) {
            case 53:
              nextToken();
              type = finishNode(factory.createJSDocNonNullableType(type), pos);
              break;
            case 57:
              if (lookAhead(nextTokenIsStartOfType)) {
                return type;
              }
              nextToken();
              type = finishNode(factory.createJSDocNullableType(type), pos);
              break;
            case 22:
              parseExpected(22);
              if (isStartOfType()) {
                var indexType = parseType();
                parseExpected(23);
                type = finishNode(factory.createIndexedAccessTypeNode(type, indexType), pos);
              } else {
                parseExpected(23);
                type = finishNode(factory.createArrayTypeNode(type), pos);
              }
              break;
            default:
              return type;
          }
        }
        return type;
      }
      function parseTypeOperator(operator) {
        var pos = getNodePos();
        parseExpected(operator);
        return finishNode(factory.createTypeOperatorNode(operator, parseTypeOperatorOrHigher()), pos);
      }
      function parseTypeParameterOfInferType() {
        var pos = getNodePos();
        return finishNode(factory.createTypeParameterDeclaration(parseIdentifier(), void 0, void 0), pos);
      }
      function parseInferType() {
        var pos = getNodePos();
        parseExpected(137);
        return finishNode(factory.createInferTypeNode(parseTypeParameterOfInferType()), pos);
      }
      function parseTypeOperatorOrHigher() {
        var operator = token();
        switch (operator) {
          case 140:
          case 153:
          case 144:
            return parseTypeOperator(operator);
          case 137:
            return parseInferType();
        }
        return parsePostfixTypeOrHigher();
      }
      function parseFunctionOrConstructorTypeToError(isInUnionType) {
        if (isStartOfFunctionTypeOrConstructorType()) {
          var type = parseFunctionOrConstructorType();
          var diagnostic = void 0;
          if (ts2.isFunctionTypeNode(type)) {
            diagnostic = isInUnionType ? ts2.Diagnostics.Function_type_notation_must_be_parenthesized_when_used_in_a_union_type : ts2.Diagnostics.Function_type_notation_must_be_parenthesized_when_used_in_an_intersection_type;
          } else {
            diagnostic = isInUnionType ? ts2.Diagnostics.Constructor_type_notation_must_be_parenthesized_when_used_in_a_union_type : ts2.Diagnostics.Constructor_type_notation_must_be_parenthesized_when_used_in_an_intersection_type;
          }
          parseErrorAtRange(type, diagnostic);
          return type;
        }
        return void 0;
      }
      function parseUnionOrIntersectionType(operator, parseConstituentType, createTypeNode) {
        var pos = getNodePos();
        var isUnionType = operator === 51;
        var hasLeadingOperator = parseOptional(operator);
        var type = hasLeadingOperator && parseFunctionOrConstructorTypeToError(isUnionType) || parseConstituentType();
        if (token() === operator || hasLeadingOperator) {
          var types = [type];
          while (parseOptional(operator)) {
            types.push(parseFunctionOrConstructorTypeToError(isUnionType) || parseConstituentType());
          }
          type = finishNode(createTypeNode(createNodeArray(types, pos)), pos);
        }
        return type;
      }
      function parseIntersectionTypeOrHigher() {
        return parseUnionOrIntersectionType(50, parseTypeOperatorOrHigher, factory.createIntersectionTypeNode);
      }
      function parseUnionTypeOrHigher() {
        return parseUnionOrIntersectionType(51, parseIntersectionTypeOrHigher, factory.createUnionTypeNode);
      }
      function nextTokenIsNewKeyword() {
        nextToken();
        return token() === 103;
      }
      function isStartOfFunctionTypeOrConstructorType() {
        if (token() === 29) {
          return true;
        }
        if (token() === 20 && lookAhead(isUnambiguouslyStartOfFunctionType)) {
          return true;
        }
        return token() === 103 || token() === 126 && lookAhead(nextTokenIsNewKeyword);
      }
      function skipParameterStart() {
        if (ts2.isModifierKind(token())) {
          parseModifiers();
        }
        if (isIdentifier() || token() === 108) {
          nextToken();
          return true;
        }
        if (token() === 22 || token() === 18) {
          var previousErrorCount = parseDiagnostics.length;
          parseIdentifierOrPattern();
          return previousErrorCount === parseDiagnostics.length;
        }
        return false;
      }
      function isUnambiguouslyStartOfFunctionType() {
        nextToken();
        if (token() === 21 || token() === 25) {
          return true;
        }
        if (skipParameterStart()) {
          if (token() === 58 || token() === 27 || token() === 57 || token() === 63) {
            return true;
          }
          if (token() === 21) {
            nextToken();
            if (token() === 38) {
              return true;
            }
          }
        }
        return false;
      }
      function parseTypeOrTypePredicate() {
        var pos = getNodePos();
        var typePredicateVariable = isIdentifier() && tryParse(parseTypePredicatePrefix);
        var type = parseType();
        if (typePredicateVariable) {
          return finishNode(factory.createTypePredicateNode(void 0, typePredicateVariable, type), pos);
        } else {
          return type;
        }
      }
      function parseTypePredicatePrefix() {
        var id = parseIdentifier();
        if (token() === 139 && !scanner.hasPrecedingLineBreak()) {
          nextToken();
          return id;
        }
      }
      function parseAssertsTypePredicate() {
        var pos = getNodePos();
        var assertsModifier = parseExpectedToken(128);
        var parameterName = token() === 108 ? parseThisTypeNode() : parseIdentifier();
        var type = parseOptional(139) ? parseType() : void 0;
        return finishNode(factory.createTypePredicateNode(assertsModifier, parameterName, type), pos);
      }
      function parseType() {
        return doOutsideOfContext(40960, parseTypeWorker);
      }
      function parseTypeWorker(noConditionalTypes) {
        if (isStartOfFunctionTypeOrConstructorType()) {
          return parseFunctionOrConstructorType();
        }
        var pos = getNodePos();
        var type = parseUnionTypeOrHigher();
        if (!noConditionalTypes && !scanner.hasPrecedingLineBreak() && parseOptional(94)) {
          var extendsType = parseTypeWorker(true);
          parseExpected(57);
          var trueType = parseTypeWorker();
          parseExpected(58);
          var falseType = parseTypeWorker();
          return finishNode(factory.createConditionalTypeNode(type, extendsType, trueType, falseType), pos);
        }
        return type;
      }
      function parseTypeAnnotation() {
        return parseOptional(58) ? parseType() : void 0;
      }
      function isStartOfLeftHandSideExpression() {
        switch (token()) {
          case 108:
          case 106:
          case 104:
          case 110:
          case 95:
          case 8:
          case 9:
          case 10:
          case 14:
          case 15:
          case 20:
          case 22:
          case 18:
          case 98:
          case 84:
          case 103:
          case 43:
          case 68:
          case 79:
            return true;
          case 100:
            return lookAhead(nextTokenIsOpenParenOrLessThanOrDot);
          default:
            return isIdentifier();
        }
      }
      function isStartOfExpression() {
        if (isStartOfLeftHandSideExpression()) {
          return true;
        }
        switch (token()) {
          case 39:
          case 40:
          case 54:
          case 53:
          case 89:
          case 112:
          case 114:
          case 45:
          case 46:
          case 29:
          case 132:
          case 125:
          case 80:
            return true;
          default:
            if (isBinaryOperator()) {
              return true;
            }
            return isIdentifier();
        }
      }
      function isStartOfExpressionStatement() {
        return token() !== 18 && token() !== 98 && token() !== 84 && token() !== 59 && isStartOfExpression();
      }
      function parseExpression() {
        var saveDecoratorContext = inDecoratorContext();
        if (saveDecoratorContext) {
          setDecoratorContext(false);
        }
        var pos = getNodePos();
        var expr = parseAssignmentExpressionOrHigher();
        var operatorToken;
        while (operatorToken = parseOptionalToken(27)) {
          expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher(), pos);
        }
        if (saveDecoratorContext) {
          setDecoratorContext(true);
        }
        return expr;
      }
      function parseInitializer() {
        return parseOptional(63) ? parseAssignmentExpressionOrHigher() : void 0;
      }
      function parseAssignmentExpressionOrHigher() {
        if (isYieldExpression()) {
          return parseYieldExpression();
        }
        var arrowExpression = tryParseParenthesizedArrowFunctionExpression() || tryParseAsyncSimpleArrowFunctionExpression();
        if (arrowExpression) {
          return arrowExpression;
        }
        var pos = getNodePos();
        var expr = parseBinaryExpressionOrHigher(0);
        if (expr.kind === 79 && token() === 38) {
          return parseSimpleArrowFunctionExpression(pos, expr, void 0);
        }
        if (ts2.isLeftHandSideExpression(expr) && ts2.isAssignmentOperator(reScanGreaterToken())) {
          return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher(), pos);
        }
        return parseConditionalExpressionRest(expr, pos);
      }
      function isYieldExpression() {
        if (token() === 125) {
          if (inYieldContext()) {
            return true;
          }
          return lookAhead(nextTokenIsIdentifierOrKeywordOrLiteralOnSameLine);
        }
        return false;
      }
      function nextTokenIsIdentifierOnSameLine() {
        nextToken();
        return !scanner.hasPrecedingLineBreak() && isIdentifier();
      }
      function parseYieldExpression() {
        var pos = getNodePos();
        nextToken();
        if (!scanner.hasPrecedingLineBreak() && (token() === 41 || isStartOfExpression())) {
          return finishNode(factory.createYieldExpression(parseOptionalToken(41), parseAssignmentExpressionOrHigher()), pos);
        } else {
          return finishNode(factory.createYieldExpression(void 0, void 0), pos);
        }
      }
      function parseSimpleArrowFunctionExpression(pos, identifier, asyncModifier) {
        ts2.Debug.assert(token() === 38, "parseSimpleArrowFunctionExpression should only have been called if we had a =>");
        var parameter = factory.createParameterDeclaration(void 0, void 0, void 0, identifier, void 0, void 0, void 0);
        finishNode(parameter, identifier.pos);
        var parameters = createNodeArray([parameter], parameter.pos, parameter.end);
        var equalsGreaterThanToken = parseExpectedToken(38);
        var body = parseArrowFunctionExpressionBody(!!asyncModifier);
        var node = factory.createArrowFunction(asyncModifier, void 0, parameters, void 0, equalsGreaterThanToken, body);
        return addJSDocComment(finishNode(node, pos));
      }
      function tryParseParenthesizedArrowFunctionExpression() {
        var triState = isParenthesizedArrowFunctionExpression();
        if (triState === 0) {
          return void 0;
        }
        return triState === 1 ? parseParenthesizedArrowFunctionExpression(true) : tryParse(parsePossibleParenthesizedArrowFunctionExpression);
      }
      function isParenthesizedArrowFunctionExpression() {
        if (token() === 20 || token() === 29 || token() === 131) {
          return lookAhead(isParenthesizedArrowFunctionExpressionWorker);
        }
        if (token() === 38) {
          return 1;
        }
        return 0;
      }
      function isParenthesizedArrowFunctionExpressionWorker() {
        if (token() === 131) {
          nextToken();
          if (scanner.hasPrecedingLineBreak()) {
            return 0;
          }
          if (token() !== 20 && token() !== 29) {
            return 0;
          }
        }
        var first = token();
        var second = nextToken();
        if (first === 20) {
          if (second === 21) {
            var third = nextToken();
            switch (third) {
              case 38:
              case 58:
              case 18:
                return 1;
              default:
                return 0;
            }
          }
          if (second === 22 || second === 18) {
            return 2;
          }
          if (second === 25) {
            return 1;
          }
          if (ts2.isModifierKind(second) && second !== 131 && lookAhead(nextTokenIsIdentifier)) {
            return 1;
          }
          if (!isIdentifier() && second !== 108) {
            return 0;
          }
          switch (nextToken()) {
            case 58:
              return 1;
            case 57:
              nextToken();
              if (token() === 58 || token() === 27 || token() === 63 || token() === 21) {
                return 1;
              }
              return 0;
            case 27:
            case 63:
            case 21:
              return 2;
          }
          return 0;
        } else {
          ts2.Debug.assert(first === 29);
          if (!isIdentifier()) {
            return 0;
          }
          if (languageVariant === 1) {
            var isArrowFunctionInJsx = lookAhead(function() {
              var third2 = nextToken();
              if (third2 === 94) {
                var fourth = nextToken();
                switch (fourth) {
                  case 63:
                  case 31:
                    return false;
                  default:
                    return true;
                }
              } else if (third2 === 27) {
                return true;
              }
              return false;
            });
            if (isArrowFunctionInJsx) {
              return 1;
            }
            return 0;
          }
          return 2;
        }
      }
      function parsePossibleParenthesizedArrowFunctionExpression() {
        var tokenPos = scanner.getTokenPos();
        if (notParenthesizedArrow === null || notParenthesizedArrow === void 0 ? void 0 : notParenthesizedArrow.has(tokenPos)) {
          return void 0;
        }
        var result = parseParenthesizedArrowFunctionExpression(false);
        if (!result) {
          (notParenthesizedArrow || (notParenthesizedArrow = new ts2.Set())).add(tokenPos);
        }
        return result;
      }
      function tryParseAsyncSimpleArrowFunctionExpression() {
        if (token() === 131) {
          if (lookAhead(isUnParenthesizedAsyncArrowFunctionWorker) === 1) {
            var pos = getNodePos();
            var asyncModifier = parseModifiersForArrowFunction();
            var expr = parseBinaryExpressionOrHigher(0);
            return parseSimpleArrowFunctionExpression(pos, expr, asyncModifier);
          }
        }
        return void 0;
      }
      function isUnParenthesizedAsyncArrowFunctionWorker() {
        if (token() === 131) {
          nextToken();
          if (scanner.hasPrecedingLineBreak() || token() === 38) {
            return 0;
          }
          var expr = parseBinaryExpressionOrHigher(0);
          if (!scanner.hasPrecedingLineBreak() && expr.kind === 79 && token() === 38) {
            return 1;
          }
        }
        return 0;
      }
      function parseParenthesizedArrowFunctionExpression(allowAmbiguity) {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var modifiers = parseModifiersForArrowFunction();
        var isAsync = ts2.some(modifiers, ts2.isAsyncModifier) ? 2 : 0;
        var typeParameters = parseTypeParameters();
        var parameters;
        if (!parseExpected(20)) {
          if (!allowAmbiguity) {
            return void 0;
          }
          parameters = createMissingList();
        } else {
          parameters = parseParametersWorker(isAsync);
          if (!parseExpected(21) && !allowAmbiguity) {
            return void 0;
          }
        }
        var type = parseReturnType(58, false);
        if (type && !allowAmbiguity && typeHasArrowFunctionBlockingParseError(type)) {
          return void 0;
        }
        var hasJSDocFunctionType = type && ts2.isJSDocFunctionType(type);
        if (!allowAmbiguity && token() !== 38 && (hasJSDocFunctionType || token() !== 18)) {
          return void 0;
        }
        var lastToken = token();
        var equalsGreaterThanToken = parseExpectedToken(38);
        var body = lastToken === 38 || lastToken === 18 ? parseArrowFunctionExpressionBody(ts2.some(modifiers, ts2.isAsyncModifier)) : parseIdentifier();
        var node = factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseArrowFunctionExpressionBody(isAsync) {
        if (token() === 18) {
          return parseFunctionBlock(isAsync ? 2 : 0);
        }
        if (token() !== 26 && token() !== 98 && token() !== 84 && isStartOfStatement() && !isStartOfExpressionStatement()) {
          return parseFunctionBlock(16 | (isAsync ? 2 : 0));
        }
        var savedTopLevel = topLevel;
        topLevel = false;
        var node = isAsync ? doInAwaitContext(parseAssignmentExpressionOrHigher) : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher);
        topLevel = savedTopLevel;
        return node;
      }
      function parseConditionalExpressionRest(leftOperand, pos) {
        var questionToken = parseOptionalToken(57);
        if (!questionToken) {
          return leftOperand;
        }
        var colonToken;
        return finishNode(factory.createConditionalExpression(leftOperand, questionToken, doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher), colonToken = parseExpectedToken(58), ts2.nodeIsPresent(colonToken) ? parseAssignmentExpressionOrHigher() : createMissingNode(79, false, ts2.Diagnostics._0_expected, ts2.tokenToString(58))), pos);
      }
      function parseBinaryExpressionOrHigher(precedence) {
        var pos = getNodePos();
        var leftOperand = parseUnaryExpressionOrHigher();
        return parseBinaryExpressionRest(precedence, leftOperand, pos);
      }
      function isInOrOfKeyword(t) {
        return t === 101 || t === 159;
      }
      function parseBinaryExpressionRest(precedence, leftOperand, pos) {
        while (true) {
          reScanGreaterToken();
          var newPrecedence = ts2.getBinaryOperatorPrecedence(token());
          var consumeCurrentOperator = token() === 42 ? newPrecedence >= precedence : newPrecedence > precedence;
          if (!consumeCurrentOperator) {
            break;
          }
          if (token() === 101 && inDisallowInContext()) {
            break;
          }
          if (token() === 127) {
            if (scanner.hasPrecedingLineBreak()) {
              break;
            } else {
              nextToken();
              leftOperand = makeAsExpression(leftOperand, parseType());
            }
          } else {
            leftOperand = makeBinaryExpression(leftOperand, parseTokenNode(), parseBinaryExpressionOrHigher(newPrecedence), pos);
          }
        }
        return leftOperand;
      }
      function isBinaryOperator() {
        if (inDisallowInContext() && token() === 101) {
          return false;
        }
        return ts2.getBinaryOperatorPrecedence(token()) > 0;
      }
      function makeBinaryExpression(left, operatorToken, right, pos) {
        return finishNode(factory.createBinaryExpression(left, operatorToken, right), pos);
      }
      function makeAsExpression(left, right) {
        return finishNode(factory.createAsExpression(left, right), left.pos);
      }
      function parsePrefixUnaryExpression() {
        var pos = getNodePos();
        return finishNode(factory.createPrefixUnaryExpression(token(), nextTokenAnd(parseSimpleUnaryExpression)), pos);
      }
      function parseDeleteExpression() {
        var pos = getNodePos();
        return finishNode(factory.createDeleteExpression(nextTokenAnd(parseSimpleUnaryExpression)), pos);
      }
      function parseTypeOfExpression() {
        var pos = getNodePos();
        return finishNode(factory.createTypeOfExpression(nextTokenAnd(parseSimpleUnaryExpression)), pos);
      }
      function parseVoidExpression() {
        var pos = getNodePos();
        return finishNode(factory.createVoidExpression(nextTokenAnd(parseSimpleUnaryExpression)), pos);
      }
      function isAwaitExpression() {
        if (token() === 132) {
          if (inAwaitContext()) {
            return true;
          }
          return lookAhead(nextTokenIsIdentifierOrKeywordOrLiteralOnSameLine);
        }
        return false;
      }
      function parseAwaitExpression() {
        var pos = getNodePos();
        return finishNode(factory.createAwaitExpression(nextTokenAnd(parseSimpleUnaryExpression)), pos);
      }
      function parseUnaryExpressionOrHigher() {
        if (isUpdateExpression()) {
          var pos = getNodePos();
          var updateExpression = parseUpdateExpression();
          return token() === 42 ? parseBinaryExpressionRest(ts2.getBinaryOperatorPrecedence(token()), updateExpression, pos) : updateExpression;
        }
        var unaryOperator = token();
        var simpleUnaryExpression = parseSimpleUnaryExpression();
        if (token() === 42) {
          var pos = ts2.skipTrivia(sourceText, simpleUnaryExpression.pos);
          var end = simpleUnaryExpression.end;
          if (simpleUnaryExpression.kind === 210) {
            parseErrorAt(pos, end, ts2.Diagnostics.A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses);
          } else {
            parseErrorAt(pos, end, ts2.Diagnostics.An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses, ts2.tokenToString(unaryOperator));
          }
        }
        return simpleUnaryExpression;
      }
      function parseSimpleUnaryExpression() {
        switch (token()) {
          case 39:
          case 40:
          case 54:
          case 53:
            return parsePrefixUnaryExpression();
          case 89:
            return parseDeleteExpression();
          case 112:
            return parseTypeOfExpression();
          case 114:
            return parseVoidExpression();
          case 29:
            return parseTypeAssertion();
          case 132:
            if (isAwaitExpression()) {
              return parseAwaitExpression();
            }
          default:
            return parseUpdateExpression();
        }
      }
      function isUpdateExpression() {
        switch (token()) {
          case 39:
          case 40:
          case 54:
          case 53:
          case 89:
          case 112:
          case 114:
          case 132:
            return false;
          case 29:
            if (languageVariant !== 1) {
              return false;
            }
          default:
            return true;
        }
      }
      function parseUpdateExpression() {
        if (token() === 45 || token() === 46) {
          var pos = getNodePos();
          return finishNode(factory.createPrefixUnaryExpression(token(), nextTokenAnd(parseLeftHandSideExpressionOrHigher)), pos);
        } else if (languageVariant === 1 && token() === 29 && lookAhead(nextTokenIsIdentifierOrKeywordOrGreaterThan)) {
          return parseJsxElementOrSelfClosingElementOrFragment(true);
        }
        var expression = parseLeftHandSideExpressionOrHigher();
        ts2.Debug.assert(ts2.isLeftHandSideExpression(expression));
        if ((token() === 45 || token() === 46) && !scanner.hasPrecedingLineBreak()) {
          var operator = token();
          nextToken();
          return finishNode(factory.createPostfixUnaryExpression(expression, operator), expression.pos);
        }
        return expression;
      }
      function parseLeftHandSideExpressionOrHigher() {
        var pos = getNodePos();
        var expression;
        if (token() === 100) {
          if (lookAhead(nextTokenIsOpenParenOrLessThan)) {
            sourceFlags |= 1048576;
            expression = parseTokenNode();
          } else if (lookAhead(nextTokenIsDot)) {
            nextToken();
            nextToken();
            expression = finishNode(factory.createMetaProperty(100, parseIdentifierName()), pos);
            sourceFlags |= 2097152;
          } else {
            expression = parseMemberExpressionOrHigher();
          }
        } else {
          expression = token() === 106 ? parseSuperExpression() : parseMemberExpressionOrHigher();
        }
        return parseCallExpressionRest(pos, expression);
      }
      function parseMemberExpressionOrHigher() {
        var pos = getNodePos();
        var expression = parsePrimaryExpression();
        return parseMemberExpressionRest(pos, expression, true);
      }
      function parseSuperExpression() {
        var pos = getNodePos();
        var expression = parseTokenNode();
        if (token() === 29) {
          var startPos = getNodePos();
          var typeArguments = tryParse(parseTypeArgumentsInExpression);
          if (typeArguments !== void 0) {
            parseErrorAt(startPos, getNodePos(), ts2.Diagnostics.super_may_not_use_type_arguments);
          }
        }
        if (token() === 20 || token() === 24 || token() === 22) {
          return expression;
        }
        parseExpectedToken(24, ts2.Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access);
        return finishNode(factory.createPropertyAccessExpression(expression, parseRightSideOfDot(true, true)), pos);
      }
      function parseJsxElementOrSelfClosingElementOrFragment(inExpressionContext, topInvalidNodePosition, openingTag) {
        var pos = getNodePos();
        var opening = parseJsxOpeningOrSelfClosingElementOrOpeningFragment(inExpressionContext);
        var result;
        if (opening.kind === 279) {
          var children = parseJsxChildren(opening);
          var closingElement = void 0;
          var lastChild = children[children.length - 1];
          if ((lastChild === null || lastChild === void 0 ? void 0 : lastChild.kind) === 277 && !tagNamesAreEquivalent(lastChild.openingElement.tagName, lastChild.closingElement.tagName) && tagNamesAreEquivalent(opening.tagName, lastChild.closingElement.tagName)) {
            var end = lastChild.children.end;
            var newLast = finishNode(factory.createJsxElement(lastChild.openingElement, lastChild.children, finishNode(factory.createJsxClosingElement(finishNode(factory.createIdentifier(""), end, end)), end, end)), lastChild.openingElement.pos, end);
            children = createNodeArray(__spreadArray(__spreadArray([], children.slice(0, children.length - 1), true), [newLast], false), children.pos, end);
            closingElement = lastChild.closingElement;
          } else {
            closingElement = parseJsxClosingElement(opening, inExpressionContext);
            if (!tagNamesAreEquivalent(opening.tagName, closingElement.tagName)) {
              if (openingTag && ts2.isJsxOpeningElement(openingTag) && tagNamesAreEquivalent(closingElement.tagName, openingTag.tagName)) {
                parseErrorAtRange(opening.tagName, ts2.Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, ts2.getTextOfNodeFromSourceText(sourceText, opening.tagName));
              } else {
                parseErrorAtRange(closingElement.tagName, ts2.Diagnostics.Expected_corresponding_JSX_closing_tag_for_0, ts2.getTextOfNodeFromSourceText(sourceText, opening.tagName));
              }
            }
          }
          result = finishNode(factory.createJsxElement(opening, children, closingElement), pos);
        } else if (opening.kind === 282) {
          result = finishNode(factory.createJsxFragment(opening, parseJsxChildren(opening), parseJsxClosingFragment(inExpressionContext)), pos);
        } else {
          ts2.Debug.assert(opening.kind === 278);
          result = opening;
        }
        if (inExpressionContext && token() === 29) {
          var topBadPos_1 = typeof topInvalidNodePosition === "undefined" ? result.pos : topInvalidNodePosition;
          var invalidElement = tryParse(function() {
            return parseJsxElementOrSelfClosingElementOrFragment(true, topBadPos_1);
          });
          if (invalidElement) {
            var operatorToken = createMissingNode(27, false);
            ts2.setTextRangePosWidth(operatorToken, invalidElement.pos, 0);
            parseErrorAt(ts2.skipTrivia(sourceText, topBadPos_1), invalidElement.end, ts2.Diagnostics.JSX_expressions_must_have_one_parent_element);
            return finishNode(factory.createBinaryExpression(result, operatorToken, invalidElement), pos);
          }
        }
        return result;
      }
      function parseJsxText() {
        var pos = getNodePos();
        var node = factory.createJsxText(scanner.getTokenValue(), currentToken === 12);
        currentToken = scanner.scanJsxToken();
        return finishNode(node, pos);
      }
      function parseJsxChild(openingTag, token2) {
        switch (token2) {
          case 1:
            if (ts2.isJsxOpeningFragment(openingTag)) {
              parseErrorAtRange(openingTag, ts2.Diagnostics.JSX_fragment_has_no_corresponding_closing_tag);
            } else {
              var tag = openingTag.tagName;
              var start = ts2.skipTrivia(sourceText, tag.pos);
              parseErrorAt(start, tag.end, ts2.Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, ts2.getTextOfNodeFromSourceText(sourceText, openingTag.tagName));
            }
            return void 0;
          case 30:
          case 7:
            return void 0;
          case 11:
          case 12:
            return parseJsxText();
          case 18:
            return parseJsxExpression(false);
          case 29:
            return parseJsxElementOrSelfClosingElementOrFragment(false, void 0, openingTag);
          default:
            return ts2.Debug.assertNever(token2);
        }
      }
      function parseJsxChildren(openingTag) {
        var list = [];
        var listPos = getNodePos();
        var saveParsingContext = parsingContext;
        parsingContext |= 1 << 14;
        while (true) {
          var child = parseJsxChild(openingTag, currentToken = scanner.reScanJsxToken());
          if (!child)
            break;
          list.push(child);
          if (ts2.isJsxOpeningElement(openingTag) && (child === null || child === void 0 ? void 0 : child.kind) === 277 && !tagNamesAreEquivalent(child.openingElement.tagName, child.closingElement.tagName) && tagNamesAreEquivalent(openingTag.tagName, child.closingElement.tagName)) {
            break;
          }
        }
        parsingContext = saveParsingContext;
        return createNodeArray(list, listPos);
      }
      function parseJsxAttributes() {
        var pos = getNodePos();
        return finishNode(factory.createJsxAttributes(parseList(13, parseJsxAttribute)), pos);
      }
      function parseJsxOpeningOrSelfClosingElementOrOpeningFragment(inExpressionContext) {
        var pos = getNodePos();
        parseExpected(29);
        if (token() === 31) {
          scanJsxText();
          return finishNode(factory.createJsxOpeningFragment(), pos);
        }
        var tagName = parseJsxElementName();
        var typeArguments = (contextFlags & 131072) === 0 ? tryParseTypeArguments() : void 0;
        var attributes = parseJsxAttributes();
        var node;
        if (token() === 31) {
          scanJsxText();
          node = factory.createJsxOpeningElement(tagName, typeArguments, attributes);
        } else {
          parseExpected(43);
          if (parseExpected(31, void 0, false)) {
            if (inExpressionContext) {
              nextToken();
            } else {
              scanJsxText();
            }
          }
          node = factory.createJsxSelfClosingElement(tagName, typeArguments, attributes);
        }
        return finishNode(node, pos);
      }
      function parseJsxElementName() {
        var pos = getNodePos();
        scanJsxIdentifier();
        var expression = token() === 108 ? parseTokenNode() : parseIdentifierName();
        while (parseOptional(24)) {
          expression = finishNode(factory.createPropertyAccessExpression(expression, parseRightSideOfDot(true, false)), pos);
        }
        return expression;
      }
      function parseJsxExpression(inExpressionContext) {
        var pos = getNodePos();
        if (!parseExpected(18)) {
          return void 0;
        }
        var dotDotDotToken;
        var expression;
        if (token() !== 19) {
          dotDotDotToken = parseOptionalToken(25);
          expression = parseExpression();
        }
        if (inExpressionContext) {
          parseExpected(19);
        } else {
          if (parseExpected(19, void 0, false)) {
            scanJsxText();
          }
        }
        return finishNode(factory.createJsxExpression(dotDotDotToken, expression), pos);
      }
      function parseJsxAttribute() {
        if (token() === 18) {
          return parseJsxSpreadAttribute();
        }
        scanJsxIdentifier();
        var pos = getNodePos();
        return finishNode(factory.createJsxAttribute(parseIdentifierName(), token() !== 63 ? void 0 : scanJsxAttributeValue() === 10 ? parseLiteralNode() : parseJsxExpression(true)), pos);
      }
      function parseJsxSpreadAttribute() {
        var pos = getNodePos();
        parseExpected(18);
        parseExpected(25);
        var expression = parseExpression();
        parseExpected(19);
        return finishNode(factory.createJsxSpreadAttribute(expression), pos);
      }
      function parseJsxClosingElement(open, inExpressionContext) {
        var pos = getNodePos();
        parseExpected(30);
        var tagName = parseJsxElementName();
        if (parseExpected(31, void 0, false)) {
          if (inExpressionContext || !tagNamesAreEquivalent(open.tagName, tagName)) {
            nextToken();
          } else {
            scanJsxText();
          }
        }
        return finishNode(factory.createJsxClosingElement(tagName), pos);
      }
      function parseJsxClosingFragment(inExpressionContext) {
        var pos = getNodePos();
        parseExpected(30);
        if (ts2.tokenIsIdentifierOrKeyword(token())) {
          parseErrorAtRange(parseJsxElementName(), ts2.Diagnostics.Expected_corresponding_closing_tag_for_JSX_fragment);
        }
        if (parseExpected(31, void 0, false)) {
          if (inExpressionContext) {
            nextToken();
          } else {
            scanJsxText();
          }
        }
        return finishNode(factory.createJsxJsxClosingFragment(), pos);
      }
      function parseTypeAssertion() {
        var pos = getNodePos();
        parseExpected(29);
        var type = parseType();
        parseExpected(31);
        var expression = parseSimpleUnaryExpression();
        return finishNode(factory.createTypeAssertion(type, expression), pos);
      }
      function nextTokenIsIdentifierOrKeywordOrOpenBracketOrTemplate() {
        nextToken();
        return ts2.tokenIsIdentifierOrKeyword(token()) || token() === 22 || isTemplateStartOfTaggedTemplate();
      }
      function isStartOfOptionalPropertyOrElementAccessChain() {
        return token() === 28 && lookAhead(nextTokenIsIdentifierOrKeywordOrOpenBracketOrTemplate);
      }
      function tryReparseOptionalChain(node) {
        if (node.flags & 32) {
          return true;
        }
        if (ts2.isNonNullExpression(node)) {
          var expr = node.expression;
          while (ts2.isNonNullExpression(expr) && !(expr.flags & 32)) {
            expr = expr.expression;
          }
          if (expr.flags & 32) {
            while (ts2.isNonNullExpression(node)) {
              node.flags |= 32;
              node = node.expression;
            }
            return true;
          }
        }
        return false;
      }
      function parsePropertyAccessExpressionRest(pos, expression, questionDotToken) {
        var name = parseRightSideOfDot(true, true);
        var isOptionalChain = questionDotToken || tryReparseOptionalChain(expression);
        var propertyAccess = isOptionalChain ? factory.createPropertyAccessChain(expression, questionDotToken, name) : factory.createPropertyAccessExpression(expression, name);
        if (isOptionalChain && ts2.isPrivateIdentifier(propertyAccess.name)) {
          parseErrorAtRange(propertyAccess.name, ts2.Diagnostics.An_optional_chain_cannot_contain_private_identifiers);
        }
        return finishNode(propertyAccess, pos);
      }
      function parseElementAccessExpressionRest(pos, expression, questionDotToken) {
        var argumentExpression;
        if (token() === 23) {
          argumentExpression = createMissingNode(79, true, ts2.Diagnostics.An_element_access_expression_should_take_an_argument);
        } else {
          var argument = allowInAnd(parseExpression);
          if (ts2.isStringOrNumericLiteralLike(argument)) {
            argument.text = internIdentifier(argument.text);
          }
          argumentExpression = argument;
        }
        parseExpected(23);
        var indexedAccess = questionDotToken || tryReparseOptionalChain(expression) ? factory.createElementAccessChain(expression, questionDotToken, argumentExpression) : factory.createElementAccessExpression(expression, argumentExpression);
        return finishNode(indexedAccess, pos);
      }
      function parseMemberExpressionRest(pos, expression, allowOptionalChain) {
        while (true) {
          var questionDotToken = void 0;
          var isPropertyAccess = false;
          if (allowOptionalChain && isStartOfOptionalPropertyOrElementAccessChain()) {
            questionDotToken = parseExpectedToken(28);
            isPropertyAccess = ts2.tokenIsIdentifierOrKeyword(token());
          } else {
            isPropertyAccess = parseOptional(24);
          }
          if (isPropertyAccess) {
            expression = parsePropertyAccessExpressionRest(pos, expression, questionDotToken);
            continue;
          }
          if (!questionDotToken && token() === 53 && !scanner.hasPrecedingLineBreak()) {
            nextToken();
            expression = finishNode(factory.createNonNullExpression(expression), pos);
            continue;
          }
          if ((questionDotToken || !inDecoratorContext()) && parseOptional(22)) {
            expression = parseElementAccessExpressionRest(pos, expression, questionDotToken);
            continue;
          }
          if (isTemplateStartOfTaggedTemplate()) {
            expression = parseTaggedTemplateRest(pos, expression, questionDotToken, void 0);
            continue;
          }
          return expression;
        }
      }
      function isTemplateStartOfTaggedTemplate() {
        return token() === 14 || token() === 15;
      }
      function parseTaggedTemplateRest(pos, tag, questionDotToken, typeArguments) {
        var tagExpression = factory.createTaggedTemplateExpression(tag, typeArguments, token() === 14 ? (reScanTemplateHeadOrNoSubstitutionTemplate(), parseLiteralNode()) : parseTemplateExpression(true));
        if (questionDotToken || tag.flags & 32) {
          tagExpression.flags |= 32;
        }
        tagExpression.questionDotToken = questionDotToken;
        return finishNode(tagExpression, pos);
      }
      function parseCallExpressionRest(pos, expression) {
        while (true) {
          expression = parseMemberExpressionRest(pos, expression, true);
          var questionDotToken = parseOptionalToken(28);
          if ((contextFlags & 131072) === 0 && (token() === 29 || token() === 47)) {
            var typeArguments = tryParse(parseTypeArgumentsInExpression);
            if (typeArguments) {
              if (isTemplateStartOfTaggedTemplate()) {
                expression = parseTaggedTemplateRest(pos, expression, questionDotToken, typeArguments);
                continue;
              }
              var argumentList = parseArgumentList();
              var callExpr = questionDotToken || tryReparseOptionalChain(expression) ? factory.createCallChain(expression, questionDotToken, typeArguments, argumentList) : factory.createCallExpression(expression, typeArguments, argumentList);
              expression = finishNode(callExpr, pos);
              continue;
            }
          } else if (token() === 20) {
            var argumentList = parseArgumentList();
            var callExpr = questionDotToken || tryReparseOptionalChain(expression) ? factory.createCallChain(expression, questionDotToken, void 0, argumentList) : factory.createCallExpression(expression, void 0, argumentList);
            expression = finishNode(callExpr, pos);
            continue;
          }
          if (questionDotToken) {
            var name = createMissingNode(79, false, ts2.Diagnostics.Identifier_expected);
            expression = finishNode(factory.createPropertyAccessChain(expression, questionDotToken, name), pos);
          }
          break;
        }
        return expression;
      }
      function parseArgumentList() {
        parseExpected(20);
        var result = parseDelimitedList(11, parseArgumentExpression);
        parseExpected(21);
        return result;
      }
      function parseTypeArgumentsInExpression() {
        if ((contextFlags & 131072) !== 0) {
          return void 0;
        }
        if (reScanLessThanToken() !== 29) {
          return void 0;
        }
        nextToken();
        var typeArguments = parseDelimitedList(20, parseType);
        if (!parseExpected(31)) {
          return void 0;
        }
        return typeArguments && canFollowTypeArgumentsInExpression() ? typeArguments : void 0;
      }
      function canFollowTypeArgumentsInExpression() {
        switch (token()) {
          case 20:
          case 14:
          case 15:
          case 24:
          case 21:
          case 23:
          case 58:
          case 26:
          case 57:
          case 34:
          case 36:
          case 35:
          case 37:
          case 55:
          case 56:
          case 60:
          case 52:
          case 50:
          case 51:
          case 19:
          case 1:
            return true;
          case 27:
          case 18:
          default:
            return false;
        }
      }
      function parsePrimaryExpression() {
        switch (token()) {
          case 8:
          case 9:
          case 10:
          case 14:
            return parseLiteralNode();
          case 108:
          case 106:
          case 104:
          case 110:
          case 95:
            return parseTokenNode();
          case 20:
            return parseParenthesizedExpression();
          case 22:
            return parseArrayLiteralExpression();
          case 18:
            return parseObjectLiteralExpression();
          case 131:
            if (!lookAhead(nextTokenIsFunctionKeywordOnSameLine)) {
              break;
            }
            return parseFunctionExpression();
          case 84:
            return parseClassExpression();
          case 98:
            return parseFunctionExpression();
          case 103:
            return parseNewExpressionOrNewDotTarget();
          case 43:
          case 68:
            if (reScanSlashToken() === 13) {
              return parseLiteralNode();
            }
            break;
          case 15:
            return parseTemplateExpression(false);
          case 80:
            return parsePrivateIdentifier();
        }
        return parseIdentifier(ts2.Diagnostics.Expression_expected);
      }
      function parseParenthesizedExpression() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(20);
        var expression = allowInAnd(parseExpression);
        parseExpected(21);
        return withJSDoc(finishNode(factory.createParenthesizedExpression(expression), pos), hasJSDoc);
      }
      function parseSpreadElement() {
        var pos = getNodePos();
        parseExpected(25);
        var expression = parseAssignmentExpressionOrHigher();
        return finishNode(factory.createSpreadElement(expression), pos);
      }
      function parseArgumentOrArrayLiteralElement() {
        return token() === 25 ? parseSpreadElement() : token() === 27 ? finishNode(factory.createOmittedExpression(), getNodePos()) : parseAssignmentExpressionOrHigher();
      }
      function parseArgumentExpression() {
        return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement);
      }
      function parseArrayLiteralExpression() {
        var pos = getNodePos();
        parseExpected(22);
        var multiLine = scanner.hasPrecedingLineBreak();
        var elements = parseDelimitedList(15, parseArgumentOrArrayLiteralElement);
        parseExpected(23);
        return finishNode(factory.createArrayLiteralExpression(elements, multiLine), pos);
      }
      function parseObjectLiteralElement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        if (parseOptionalToken(25)) {
          var expression = parseAssignmentExpressionOrHigher();
          return withJSDoc(finishNode(factory.createSpreadAssignment(expression), pos), hasJSDoc);
        }
        var decorators = parseDecorators();
        var modifiers = parseModifiers();
        if (parseContextualModifier(136)) {
          return parseAccessorDeclaration(pos, hasJSDoc, decorators, modifiers, 171);
        }
        if (parseContextualModifier(148)) {
          return parseAccessorDeclaration(pos, hasJSDoc, decorators, modifiers, 172);
        }
        var asteriskToken = parseOptionalToken(41);
        var tokenIsIdentifier = isIdentifier();
        var name = parsePropertyName();
        var questionToken = parseOptionalToken(57);
        var exclamationToken = parseOptionalToken(53);
        if (asteriskToken || token() === 20 || token() === 29) {
          return parseMethodDeclaration(pos, hasJSDoc, decorators, modifiers, asteriskToken, name, questionToken, exclamationToken);
        }
        var node;
        var isShorthandPropertyAssignment = tokenIsIdentifier && token() !== 58;
        if (isShorthandPropertyAssignment) {
          var equalsToken = parseOptionalToken(63);
          var objectAssignmentInitializer = equalsToken ? allowInAnd(parseAssignmentExpressionOrHigher) : void 0;
          node = factory.createShorthandPropertyAssignment(name, objectAssignmentInitializer);
          node.equalsToken = equalsToken;
        } else {
          parseExpected(58);
          var initializer = allowInAnd(parseAssignmentExpressionOrHigher);
          node = factory.createPropertyAssignment(name, initializer);
        }
        node.decorators = decorators;
        node.modifiers = modifiers;
        node.questionToken = questionToken;
        node.exclamationToken = exclamationToken;
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseObjectLiteralExpression() {
        var pos = getNodePos();
        var openBracePosition = scanner.getTokenPos();
        parseExpected(18);
        var multiLine = scanner.hasPrecedingLineBreak();
        var properties = parseDelimitedList(12, parseObjectLiteralElement, true);
        if (!parseExpected(19)) {
          var lastError = ts2.lastOrUndefined(parseDiagnostics);
          if (lastError && lastError.code === ts2.Diagnostics._0_expected.code) {
            ts2.addRelatedInfo(lastError, ts2.createDetachedDiagnostic(fileName, openBracePosition, 1, ts2.Diagnostics.The_parser_expected_to_find_a_to_match_the_token_here));
          }
        }
        return finishNode(factory.createObjectLiteralExpression(properties, multiLine), pos);
      }
      function parseFunctionExpression() {
        var savedDecoratorContext = inDecoratorContext();
        setDecoratorContext(false);
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var modifiers = parseModifiers();
        parseExpected(98);
        var asteriskToken = parseOptionalToken(41);
        var isGenerator = asteriskToken ? 1 : 0;
        var isAsync = ts2.some(modifiers, ts2.isAsyncModifier) ? 2 : 0;
        var name = isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalBindingIdentifier) : isGenerator ? doInYieldContext(parseOptionalBindingIdentifier) : isAsync ? doInAwaitContext(parseOptionalBindingIdentifier) : parseOptionalBindingIdentifier();
        var typeParameters = parseTypeParameters();
        var parameters = parseParameters(isGenerator | isAsync);
        var type = parseReturnType(58, false);
        var body = parseFunctionBlock(isGenerator | isAsync);
        setDecoratorContext(savedDecoratorContext);
        var node = factory.createFunctionExpression(modifiers, asteriskToken, name, typeParameters, parameters, type, body);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseOptionalBindingIdentifier() {
        return isBindingIdentifier() ? parseBindingIdentifier() : void 0;
      }
      function parseNewExpressionOrNewDotTarget() {
        var pos = getNodePos();
        parseExpected(103);
        if (parseOptional(24)) {
          var name = parseIdentifierName();
          return finishNode(factory.createMetaProperty(103, name), pos);
        }
        var expressionPos = getNodePos();
        var expression = parsePrimaryExpression();
        var typeArguments;
        while (true) {
          expression = parseMemberExpressionRest(expressionPos, expression, false);
          typeArguments = tryParse(parseTypeArgumentsInExpression);
          if (isTemplateStartOfTaggedTemplate()) {
            ts2.Debug.assert(!!typeArguments, "Expected a type argument list; all plain tagged template starts should be consumed in 'parseMemberExpressionRest'");
            expression = parseTaggedTemplateRest(expressionPos, expression, void 0, typeArguments);
            typeArguments = void 0;
          }
          break;
        }
        var argumentsArray;
        if (token() === 20) {
          argumentsArray = parseArgumentList();
        } else if (typeArguments) {
          parseErrorAt(pos, scanner.getStartPos(), ts2.Diagnostics.A_new_expression_with_type_arguments_must_always_be_followed_by_a_parenthesized_argument_list);
        }
        return finishNode(factory.createNewExpression(expression, typeArguments, argumentsArray), pos);
      }
      function parseBlock(ignoreMissingOpenBrace, diagnosticMessage) {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var openBracePosition = scanner.getTokenPos();
        if (parseExpected(18, diagnosticMessage) || ignoreMissingOpenBrace) {
          var multiLine = scanner.hasPrecedingLineBreak();
          var statements = parseList(1, parseStatement);
          if (!parseExpected(19)) {
            var lastError = ts2.lastOrUndefined(parseDiagnostics);
            if (lastError && lastError.code === ts2.Diagnostics._0_expected.code) {
              ts2.addRelatedInfo(lastError, ts2.createDetachedDiagnostic(fileName, openBracePosition, 1, ts2.Diagnostics.The_parser_expected_to_find_a_to_match_the_token_here));
            }
          }
          var result = withJSDoc(finishNode(factory.createBlock(statements, multiLine), pos), hasJSDoc);
          if (token() === 63) {
            parseErrorAtCurrentToken(ts2.Diagnostics.Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_destructuring_assignment_you_might_need_to_wrap_the_the_whole_assignment_in_parentheses);
            nextToken();
          }
          return result;
        } else {
          var statements = createMissingList();
          return withJSDoc(finishNode(factory.createBlock(statements, void 0), pos), hasJSDoc);
        }
      }
      function parseFunctionBlock(flags, diagnosticMessage) {
        var savedYieldContext = inYieldContext();
        setYieldContext(!!(flags & 1));
        var savedAwaitContext = inAwaitContext();
        setAwaitContext(!!(flags & 2));
        var savedTopLevel = topLevel;
        topLevel = false;
        var saveDecoratorContext = inDecoratorContext();
        if (saveDecoratorContext) {
          setDecoratorContext(false);
        }
        var block = parseBlock(!!(flags & 16), diagnosticMessage);
        if (saveDecoratorContext) {
          setDecoratorContext(true);
        }
        topLevel = savedTopLevel;
        setYieldContext(savedYieldContext);
        setAwaitContext(savedAwaitContext);
        return block;
      }
      function parseEmptyStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(26);
        return withJSDoc(finishNode(factory.createEmptyStatement(), pos), hasJSDoc);
      }
      function parseIfStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(99);
        parseExpected(20);
        var expression = allowInAnd(parseExpression);
        parseExpected(21);
        var thenStatement = parseStatement();
        var elseStatement = parseOptional(91) ? parseStatement() : void 0;
        return withJSDoc(finishNode(factory.createIfStatement(expression, thenStatement, elseStatement), pos), hasJSDoc);
      }
      function parseDoStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(90);
        var statement = parseStatement();
        parseExpected(115);
        parseExpected(20);
        var expression = allowInAnd(parseExpression);
        parseExpected(21);
        parseOptional(26);
        return withJSDoc(finishNode(factory.createDoStatement(statement, expression), pos), hasJSDoc);
      }
      function parseWhileStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(115);
        parseExpected(20);
        var expression = allowInAnd(parseExpression);
        parseExpected(21);
        var statement = parseStatement();
        return withJSDoc(finishNode(factory.createWhileStatement(expression, statement), pos), hasJSDoc);
      }
      function parseForOrForInOrForOfStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(97);
        var awaitToken = parseOptionalToken(132);
        parseExpected(20);
        var initializer;
        if (token() !== 26) {
          if (token() === 113 || token() === 119 || token() === 85) {
            initializer = parseVariableDeclarationList(true);
          } else {
            initializer = disallowInAnd(parseExpression);
          }
        }
        var node;
        if (awaitToken ? parseExpected(159) : parseOptional(159)) {
          var expression = allowInAnd(parseAssignmentExpressionOrHigher);
          parseExpected(21);
          node = factory.createForOfStatement(awaitToken, initializer, expression, parseStatement());
        } else if (parseOptional(101)) {
          var expression = allowInAnd(parseExpression);
          parseExpected(21);
          node = factory.createForInStatement(initializer, expression, parseStatement());
        } else {
          parseExpected(26);
          var condition = token() !== 26 && token() !== 21 ? allowInAnd(parseExpression) : void 0;
          parseExpected(26);
          var incrementor = token() !== 21 ? allowInAnd(parseExpression) : void 0;
          parseExpected(21);
          node = factory.createForStatement(initializer, condition, incrementor, parseStatement());
        }
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseBreakOrContinueStatement(kind) {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(kind === 245 ? 81 : 86);
        var label = canParseSemicolon() ? void 0 : parseIdentifier();
        parseSemicolon();
        var node = kind === 245 ? factory.createBreakStatement(label) : factory.createContinueStatement(label);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseReturnStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(105);
        var expression = canParseSemicolon() ? void 0 : allowInAnd(parseExpression);
        parseSemicolon();
        return withJSDoc(finishNode(factory.createReturnStatement(expression), pos), hasJSDoc);
      }
      function parseWithStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(116);
        parseExpected(20);
        var expression = allowInAnd(parseExpression);
        parseExpected(21);
        var statement = doInsideOfContext(16777216, parseStatement);
        return withJSDoc(finishNode(factory.createWithStatement(expression, statement), pos), hasJSDoc);
      }
      function parseCaseClause() {
        var pos = getNodePos();
        parseExpected(82);
        var expression = allowInAnd(parseExpression);
        parseExpected(58);
        var statements = parseList(3, parseStatement);
        return finishNode(factory.createCaseClause(expression, statements), pos);
      }
      function parseDefaultClause() {
        var pos = getNodePos();
        parseExpected(88);
        parseExpected(58);
        var statements = parseList(3, parseStatement);
        return finishNode(factory.createDefaultClause(statements), pos);
      }
      function parseCaseOrDefaultClause() {
        return token() === 82 ? parseCaseClause() : parseDefaultClause();
      }
      function parseCaseBlock() {
        var pos = getNodePos();
        parseExpected(18);
        var clauses = parseList(2, parseCaseOrDefaultClause);
        parseExpected(19);
        return finishNode(factory.createCaseBlock(clauses), pos);
      }
      function parseSwitchStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(107);
        parseExpected(20);
        var expression = allowInAnd(parseExpression);
        parseExpected(21);
        var caseBlock = parseCaseBlock();
        return withJSDoc(finishNode(factory.createSwitchStatement(expression, caseBlock), pos), hasJSDoc);
      }
      function parseThrowStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(109);
        var expression = scanner.hasPrecedingLineBreak() ? void 0 : allowInAnd(parseExpression);
        if (expression === void 0) {
          identifierCount++;
          expression = finishNode(factory.createIdentifier(""), getNodePos());
        }
        if (!tryParseSemicolon()) {
          parseErrorForMissingSemicolonAfter(expression);
        }
        return withJSDoc(finishNode(factory.createThrowStatement(expression), pos), hasJSDoc);
      }
      function parseTryStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(111);
        var tryBlock = parseBlock(false);
        var catchClause = token() === 83 ? parseCatchClause() : void 0;
        var finallyBlock;
        if (!catchClause || token() === 96) {
          parseExpected(96);
          finallyBlock = parseBlock(false);
        }
        return withJSDoc(finishNode(factory.createTryStatement(tryBlock, catchClause, finallyBlock), pos), hasJSDoc);
      }
      function parseCatchClause() {
        var pos = getNodePos();
        parseExpected(83);
        var variableDeclaration;
        if (parseOptional(20)) {
          variableDeclaration = parseVariableDeclaration();
          parseExpected(21);
        } else {
          variableDeclaration = void 0;
        }
        var block = parseBlock(false);
        return finishNode(factory.createCatchClause(variableDeclaration, block), pos);
      }
      function parseDebuggerStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        parseExpected(87);
        parseSemicolon();
        return withJSDoc(finishNode(factory.createDebuggerStatement(), pos), hasJSDoc);
      }
      function parseExpressionOrLabeledStatement() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var node;
        var hasParen = token() === 20;
        var expression = allowInAnd(parseExpression);
        if (ts2.isIdentifier(expression) && parseOptional(58)) {
          node = factory.createLabeledStatement(expression, parseStatement());
        } else {
          if (!tryParseSemicolon()) {
            parseErrorForMissingSemicolonAfter(expression);
          }
          node = factory.createExpressionStatement(expression);
          if (hasParen) {
            hasJSDoc = false;
          }
        }
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function nextTokenIsIdentifierOrKeywordOnSameLine() {
        nextToken();
        return ts2.tokenIsIdentifierOrKeyword(token()) && !scanner.hasPrecedingLineBreak();
      }
      function nextTokenIsClassKeywordOnSameLine() {
        nextToken();
        return token() === 84 && !scanner.hasPrecedingLineBreak();
      }
      function nextTokenIsFunctionKeywordOnSameLine() {
        nextToken();
        return token() === 98 && !scanner.hasPrecedingLineBreak();
      }
      function nextTokenIsIdentifierOrKeywordOrLiteralOnSameLine() {
        nextToken();
        return (ts2.tokenIsIdentifierOrKeyword(token()) || token() === 8 || token() === 9 || token() === 10) && !scanner.hasPrecedingLineBreak();
      }
      function isDeclaration() {
        while (true) {
          switch (token()) {
            case 113:
            case 119:
            case 85:
            case 98:
            case 84:
            case 92:
              return true;
            case 118:
            case 151:
              return nextTokenIsIdentifierOnSameLine();
            case 141:
            case 142:
              return nextTokenIsIdentifierOrStringLiteralOnSameLine();
            case 126:
            case 131:
            case 135:
            case 121:
            case 122:
            case 123:
            case 144:
              nextToken();
              if (scanner.hasPrecedingLineBreak()) {
                return false;
              }
              continue;
            case 156:
              nextToken();
              return token() === 18 || token() === 79 || token() === 93;
            case 100:
              nextToken();
              return token() === 10 || token() === 41 || token() === 18 || ts2.tokenIsIdentifierOrKeyword(token());
            case 93:
              var currentToken_1 = nextToken();
              if (currentToken_1 === 151) {
                currentToken_1 = lookAhead(nextToken);
              }
              if (currentToken_1 === 63 || currentToken_1 === 41 || currentToken_1 === 18 || currentToken_1 === 88 || currentToken_1 === 127) {
                return true;
              }
              continue;
            case 124:
              nextToken();
              continue;
            default:
              return false;
          }
        }
      }
      function isStartOfDeclaration() {
        return lookAhead(isDeclaration);
      }
      function isStartOfStatement() {
        switch (token()) {
          case 59:
          case 26:
          case 18:
          case 113:
          case 119:
          case 98:
          case 84:
          case 92:
          case 99:
          case 90:
          case 115:
          case 97:
          case 86:
          case 81:
          case 105:
          case 116:
          case 107:
          case 109:
          case 111:
          case 87:
          case 83:
          case 96:
            return true;
          case 100:
            return isStartOfDeclaration() || lookAhead(nextTokenIsOpenParenOrLessThanOrDot);
          case 85:
          case 93:
            return isStartOfDeclaration();
          case 131:
          case 135:
          case 118:
          case 141:
          case 142:
          case 151:
          case 156:
            return true;
          case 123:
          case 121:
          case 122:
          case 124:
          case 144:
            return isStartOfDeclaration() || !lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine);
          default:
            return isStartOfExpression();
        }
      }
      function nextTokenIsBindingIdentifierOrStartOfDestructuring() {
        nextToken();
        return isBindingIdentifier() || token() === 18 || token() === 22;
      }
      function isLetDeclaration() {
        return lookAhead(nextTokenIsBindingIdentifierOrStartOfDestructuring);
      }
      function parseStatement() {
        switch (token()) {
          case 26:
            return parseEmptyStatement();
          case 18:
            return parseBlock(false);
          case 113:
            return parseVariableStatement(getNodePos(), hasPrecedingJSDocComment(), void 0, void 0);
          case 119:
            if (isLetDeclaration()) {
              return parseVariableStatement(getNodePos(), hasPrecedingJSDocComment(), void 0, void 0);
            }
            break;
          case 98:
            return parseFunctionDeclaration(getNodePos(), hasPrecedingJSDocComment(), void 0, void 0);
          case 84:
            return parseClassDeclaration(getNodePos(), hasPrecedingJSDocComment(), void 0, void 0);
          case 99:
            return parseIfStatement();
          case 90:
            return parseDoStatement();
          case 115:
            return parseWhileStatement();
          case 97:
            return parseForOrForInOrForOfStatement();
          case 86:
            return parseBreakOrContinueStatement(244);
          case 81:
            return parseBreakOrContinueStatement(245);
          case 105:
            return parseReturnStatement();
          case 116:
            return parseWithStatement();
          case 107:
            return parseSwitchStatement();
          case 109:
            return parseThrowStatement();
          case 111:
          case 83:
          case 96:
            return parseTryStatement();
          case 87:
            return parseDebuggerStatement();
          case 59:
            return parseDeclaration();
          case 131:
          case 118:
          case 151:
          case 141:
          case 142:
          case 135:
          case 85:
          case 92:
          case 93:
          case 100:
          case 121:
          case 122:
          case 123:
          case 126:
          case 124:
          case 144:
          case 156:
            if (isStartOfDeclaration()) {
              return parseDeclaration();
            }
            break;
        }
        return parseExpressionOrLabeledStatement();
      }
      function isDeclareModifier(modifier) {
        return modifier.kind === 135;
      }
      function parseDeclaration() {
        var isAmbient = ts2.some(lookAhead(function() {
          return parseDecorators(), parseModifiers();
        }), isDeclareModifier);
        if (isAmbient) {
          var node = tryReuseAmbientDeclaration();
          if (node) {
            return node;
          }
        }
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var decorators = parseDecorators();
        var modifiers = parseModifiers();
        if (isAmbient) {
          for (var _i = 0, _a = modifiers; _i < _a.length; _i++) {
            var m = _a[_i];
            m.flags |= 8388608;
          }
          return doInsideOfContext(8388608, function() {
            return parseDeclarationWorker(pos, hasJSDoc, decorators, modifiers);
          });
        } else {
          return parseDeclarationWorker(pos, hasJSDoc, decorators, modifiers);
        }
      }
      function tryReuseAmbientDeclaration() {
        return doInsideOfContext(8388608, function() {
          var node = currentNode(parsingContext);
          if (node) {
            return consumeNode(node);
          }
        });
      }
      function parseDeclarationWorker(pos, hasJSDoc, decorators, modifiers) {
        switch (token()) {
          case 113:
          case 119:
          case 85:
            return parseVariableStatement(pos, hasJSDoc, decorators, modifiers);
          case 98:
            return parseFunctionDeclaration(pos, hasJSDoc, decorators, modifiers);
          case 84:
            return parseClassDeclaration(pos, hasJSDoc, decorators, modifiers);
          case 118:
            return parseInterfaceDeclaration(pos, hasJSDoc, decorators, modifiers);
          case 151:
            return parseTypeAliasDeclaration(pos, hasJSDoc, decorators, modifiers);
          case 92:
            return parseEnumDeclaration(pos, hasJSDoc, decorators, modifiers);
          case 156:
          case 141:
          case 142:
            return parseModuleDeclaration(pos, hasJSDoc, decorators, modifiers);
          case 100:
            return parseImportDeclarationOrImportEqualsDeclaration(pos, hasJSDoc, decorators, modifiers);
          case 93:
            nextToken();
            switch (token()) {
              case 88:
              case 63:
                return parseExportAssignment(pos, hasJSDoc, decorators, modifiers);
              case 127:
                return parseNamespaceExportDeclaration(pos, hasJSDoc, decorators, modifiers);
              default:
                return parseExportDeclaration(pos, hasJSDoc, decorators, modifiers);
            }
          default:
            if (decorators || modifiers) {
              var missing = createMissingNode(275, true, ts2.Diagnostics.Declaration_expected);
              ts2.setTextRangePos(missing, pos);
              missing.decorators = decorators;
              missing.modifiers = modifiers;
              return missing;
            }
            return void 0;
        }
      }
      function nextTokenIsIdentifierOrStringLiteralOnSameLine() {
        nextToken();
        return !scanner.hasPrecedingLineBreak() && (isIdentifier() || token() === 10);
      }
      function parseFunctionBlockOrSemicolon(flags, diagnosticMessage) {
        if (token() !== 18 && canParseSemicolon()) {
          parseSemicolon();
          return;
        }
        return parseFunctionBlock(flags, diagnosticMessage);
      }
      function parseArrayBindingElement() {
        var pos = getNodePos();
        if (token() === 27) {
          return finishNode(factory.createOmittedExpression(), pos);
        }
        var dotDotDotToken = parseOptionalToken(25);
        var name = parseIdentifierOrPattern();
        var initializer = parseInitializer();
        return finishNode(factory.createBindingElement(dotDotDotToken, void 0, name, initializer), pos);
      }
      function parseObjectBindingElement() {
        var pos = getNodePos();
        var dotDotDotToken = parseOptionalToken(25);
        var tokenIsIdentifier = isBindingIdentifier();
        var propertyName = parsePropertyName();
        var name;
        if (tokenIsIdentifier && token() !== 58) {
          name = propertyName;
          propertyName = void 0;
        } else {
          parseExpected(58);
          name = parseIdentifierOrPattern();
        }
        var initializer = parseInitializer();
        return finishNode(factory.createBindingElement(dotDotDotToken, propertyName, name, initializer), pos);
      }
      function parseObjectBindingPattern() {
        var pos = getNodePos();
        parseExpected(18);
        var elements = parseDelimitedList(9, parseObjectBindingElement);
        parseExpected(19);
        return finishNode(factory.createObjectBindingPattern(elements), pos);
      }
      function parseArrayBindingPattern() {
        var pos = getNodePos();
        parseExpected(22);
        var elements = parseDelimitedList(10, parseArrayBindingElement);
        parseExpected(23);
        return finishNode(factory.createArrayBindingPattern(elements), pos);
      }
      function isBindingIdentifierOrPrivateIdentifierOrPattern() {
        return token() === 18 || token() === 22 || token() === 80 || isBindingIdentifier();
      }
      function parseIdentifierOrPattern(privateIdentifierDiagnosticMessage) {
        if (token() === 22) {
          return parseArrayBindingPattern();
        }
        if (token() === 18) {
          return parseObjectBindingPattern();
        }
        return parseBindingIdentifier(privateIdentifierDiagnosticMessage);
      }
      function parseVariableDeclarationAllowExclamation() {
        return parseVariableDeclaration(true);
      }
      function parseVariableDeclaration(allowExclamation) {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var name = parseIdentifierOrPattern(ts2.Diagnostics.Private_identifiers_are_not_allowed_in_variable_declarations);
        var exclamationToken;
        if (allowExclamation && name.kind === 79 && token() === 53 && !scanner.hasPrecedingLineBreak()) {
          exclamationToken = parseTokenNode();
        }
        var type = parseTypeAnnotation();
        var initializer = isInOrOfKeyword(token()) ? void 0 : parseInitializer();
        var node = factory.createVariableDeclaration(name, exclamationToken, type, initializer);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseVariableDeclarationList(inForStatementInitializer) {
        var pos = getNodePos();
        var flags = 0;
        switch (token()) {
          case 113:
            break;
          case 119:
            flags |= 1;
            break;
          case 85:
            flags |= 2;
            break;
          default:
            ts2.Debug.fail();
        }
        nextToken();
        var declarations;
        if (token() === 159 && lookAhead(canFollowContextualOfKeyword)) {
          declarations = createMissingList();
        } else {
          var savedDisallowIn = inDisallowInContext();
          setDisallowInContext(inForStatementInitializer);
          declarations = parseDelimitedList(8, inForStatementInitializer ? parseVariableDeclaration : parseVariableDeclarationAllowExclamation);
          setDisallowInContext(savedDisallowIn);
        }
        return finishNode(factory.createVariableDeclarationList(declarations, flags), pos);
      }
      function canFollowContextualOfKeyword() {
        return nextTokenIsIdentifier() && nextToken() === 21;
      }
      function parseVariableStatement(pos, hasJSDoc, decorators, modifiers) {
        var declarationList = parseVariableDeclarationList(false);
        parseSemicolon();
        var node = factory.createVariableStatement(modifiers, declarationList);
        node.decorators = decorators;
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseFunctionDeclaration(pos, hasJSDoc, decorators, modifiers) {
        var savedAwaitContext = inAwaitContext();
        var modifierFlags = ts2.modifiersToFlags(modifiers);
        parseExpected(98);
        var asteriskToken = parseOptionalToken(41);
        var name = modifierFlags & 512 ? parseOptionalBindingIdentifier() : parseBindingIdentifier();
        var isGenerator = asteriskToken ? 1 : 0;
        var isAsync = modifierFlags & 256 ? 2 : 0;
        var typeParameters = parseTypeParameters();
        if (modifierFlags & 1)
          setAwaitContext(true);
        var parameters = parseParameters(isGenerator | isAsync);
        var type = parseReturnType(58, false);
        var body = parseFunctionBlockOrSemicolon(isGenerator | isAsync, ts2.Diagnostics.or_expected);
        setAwaitContext(savedAwaitContext);
        var node = factory.createFunctionDeclaration(decorators, modifiers, asteriskToken, name, typeParameters, parameters, type, body);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseConstructorName() {
        if (token() === 134) {
          return parseExpected(134);
        }
        if (token() === 10 && lookAhead(nextToken) === 20) {
          return tryParse(function() {
            var literalNode = parseLiteralNode();
            return literalNode.text === "constructor" ? literalNode : void 0;
          });
        }
      }
      function tryParseConstructorDeclaration(pos, hasJSDoc, decorators, modifiers) {
        return tryParse(function() {
          if (parseConstructorName()) {
            var typeParameters = parseTypeParameters();
            var parameters = parseParameters(0);
            var type = parseReturnType(58, false);
            var body = parseFunctionBlockOrSemicolon(0, ts2.Diagnostics.or_expected);
            var node = factory.createConstructorDeclaration(decorators, modifiers, parameters, body);
            node.typeParameters = typeParameters;
            node.type = type;
            return withJSDoc(finishNode(node, pos), hasJSDoc);
          }
        });
      }
      function parseMethodDeclaration(pos, hasJSDoc, decorators, modifiers, asteriskToken, name, questionToken, exclamationToken, diagnosticMessage) {
        var isGenerator = asteriskToken ? 1 : 0;
        var isAsync = ts2.some(modifiers, ts2.isAsyncModifier) ? 2 : 0;
        var typeParameters = parseTypeParameters();
        var parameters = parseParameters(isGenerator | isAsync);
        var type = parseReturnType(58, false);
        var body = parseFunctionBlockOrSemicolon(isGenerator | isAsync, diagnosticMessage);
        var node = factory.createMethodDeclaration(decorators, modifiers, asteriskToken, name, questionToken, typeParameters, parameters, type, body);
        node.exclamationToken = exclamationToken;
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parsePropertyDeclaration(pos, hasJSDoc, decorators, modifiers, name, questionToken) {
        var exclamationToken = !questionToken && !scanner.hasPrecedingLineBreak() ? parseOptionalToken(53) : void 0;
        var type = parseTypeAnnotation();
        var initializer = doOutsideOfContext(8192 | 32768 | 4096, parseInitializer);
        parseSemicolonAfterPropertyName(name, type, initializer);
        var node = factory.createPropertyDeclaration(decorators, modifiers, name, questionToken || exclamationToken, type, initializer);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parsePropertyOrMethodDeclaration(pos, hasJSDoc, decorators, modifiers) {
        var asteriskToken = parseOptionalToken(41);
        var name = parsePropertyName();
        var questionToken = parseOptionalToken(57);
        if (asteriskToken || token() === 20 || token() === 29) {
          return parseMethodDeclaration(pos, hasJSDoc, decorators, modifiers, asteriskToken, name, questionToken, void 0, ts2.Diagnostics.or_expected);
        }
        return parsePropertyDeclaration(pos, hasJSDoc, decorators, modifiers, name, questionToken);
      }
      function parseAccessorDeclaration(pos, hasJSDoc, decorators, modifiers, kind) {
        var name = parsePropertyName();
        var typeParameters = parseTypeParameters();
        var parameters = parseParameters(0);
        var type = parseReturnType(58, false);
        var body = parseFunctionBlockOrSemicolon(0);
        var node = kind === 171 ? factory.createGetAccessorDeclaration(decorators, modifiers, name, parameters, type, body) : factory.createSetAccessorDeclaration(decorators, modifiers, name, parameters, body);
        node.typeParameters = typeParameters;
        if (type && node.kind === 172)
          node.type = type;
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function isClassMemberStart() {
        var idToken;
        if (token() === 59) {
          return true;
        }
        while (ts2.isModifierKind(token())) {
          idToken = token();
          if (ts2.isClassMemberModifier(idToken)) {
            return true;
          }
          nextToken();
        }
        if (token() === 41) {
          return true;
        }
        if (isLiteralPropertyName()) {
          idToken = token();
          nextToken();
        }
        if (token() === 22) {
          return true;
        }
        if (idToken !== void 0) {
          if (!ts2.isKeyword(idToken) || idToken === 148 || idToken === 136) {
            return true;
          }
          switch (token()) {
            case 20:
            case 29:
            case 53:
            case 58:
            case 63:
            case 57:
              return true;
            default:
              return canParseSemicolon();
          }
        }
        return false;
      }
      function parseClassStaticBlockDeclaration(pos, hasJSDoc, decorators, modifiers) {
        parseExpectedToken(124);
        var body = parseClassStaticBlockBody();
        return withJSDoc(finishNode(factory.createClassStaticBlockDeclaration(decorators, modifiers, body), pos), hasJSDoc);
      }
      function parseClassStaticBlockBody() {
        var savedYieldContext = inYieldContext();
        var savedAwaitContext = inAwaitContext();
        setYieldContext(false);
        setAwaitContext(true);
        var body = parseBlock(false);
        setYieldContext(savedYieldContext);
        setAwaitContext(savedAwaitContext);
        return body;
      }
      function parseDecoratorExpression() {
        if (inAwaitContext() && token() === 132) {
          var pos = getNodePos();
          var awaitExpression = parseIdentifier(ts2.Diagnostics.Expression_expected);
          nextToken();
          var memberExpression = parseMemberExpressionRest(pos, awaitExpression, true);
          return parseCallExpressionRest(pos, memberExpression);
        }
        return parseLeftHandSideExpressionOrHigher();
      }
      function tryParseDecorator() {
        var pos = getNodePos();
        if (!parseOptional(59)) {
          return void 0;
        }
        var expression = doInDecoratorContext(parseDecoratorExpression);
        return finishNode(factory.createDecorator(expression), pos);
      }
      function parseDecorators() {
        var pos = getNodePos();
        var list, decorator;
        while (decorator = tryParseDecorator()) {
          list = ts2.append(list, decorator);
        }
        return list && createNodeArray(list, pos);
      }
      function tryParseModifier(permitInvalidConstAsModifier, stopOnStartOfClassStaticBlock, hasSeenStaticModifier) {
        var pos = getNodePos();
        var kind = token();
        if (token() === 85 && permitInvalidConstAsModifier) {
          if (!tryParse(nextTokenIsOnSameLineAndCanFollowModifier)) {
            return void 0;
          }
        } else if (stopOnStartOfClassStaticBlock && token() === 124 && lookAhead(nextTokenIsOpenBrace)) {
          return void 0;
        } else if (hasSeenStaticModifier && token() === 124) {
          return void 0;
        } else {
          if (!parseAnyContextualModifier()) {
            return void 0;
          }
        }
        return finishNode(factory.createToken(kind), pos);
      }
      function parseModifiers(permitInvalidConstAsModifier, stopOnStartOfClassStaticBlock) {
        var pos = getNodePos();
        var list, modifier, hasSeenStatic = false;
        while (modifier = tryParseModifier(permitInvalidConstAsModifier, stopOnStartOfClassStaticBlock, hasSeenStatic)) {
          if (modifier.kind === 124)
            hasSeenStatic = true;
          list = ts2.append(list, modifier);
        }
        return list && createNodeArray(list, pos);
      }
      function parseModifiersForArrowFunction() {
        var modifiers;
        if (token() === 131) {
          var pos = getNodePos();
          nextToken();
          var modifier = finishNode(factory.createToken(131), pos);
          modifiers = createNodeArray([modifier], pos);
        }
        return modifiers;
      }
      function parseClassElement() {
        var pos = getNodePos();
        if (token() === 26) {
          nextToken();
          return finishNode(factory.createSemicolonClassElement(), pos);
        }
        var hasJSDoc = hasPrecedingJSDocComment();
        var decorators = parseDecorators();
        var modifiers = parseModifiers(true, true);
        if (token() === 124 && lookAhead(nextTokenIsOpenBrace)) {
          return parseClassStaticBlockDeclaration(pos, hasJSDoc, decorators, modifiers);
        }
        if (parseContextualModifier(136)) {
          return parseAccessorDeclaration(pos, hasJSDoc, decorators, modifiers, 171);
        }
        if (parseContextualModifier(148)) {
          return parseAccessorDeclaration(pos, hasJSDoc, decorators, modifiers, 172);
        }
        if (token() === 134 || token() === 10) {
          var constructorDeclaration = tryParseConstructorDeclaration(pos, hasJSDoc, decorators, modifiers);
          if (constructorDeclaration) {
            return constructorDeclaration;
          }
        }
        if (isIndexSignature()) {
          return parseIndexSignatureDeclaration(pos, hasJSDoc, decorators, modifiers);
        }
        if (ts2.tokenIsIdentifierOrKeyword(token()) || token() === 10 || token() === 8 || token() === 41 || token() === 22) {
          var isAmbient = ts2.some(modifiers, isDeclareModifier);
          if (isAmbient) {
            for (var _i = 0, _a = modifiers; _i < _a.length; _i++) {
              var m = _a[_i];
              m.flags |= 8388608;
            }
            return doInsideOfContext(8388608, function() {
              return parsePropertyOrMethodDeclaration(pos, hasJSDoc, decorators, modifiers);
            });
          } else {
            return parsePropertyOrMethodDeclaration(pos, hasJSDoc, decorators, modifiers);
          }
        }
        if (decorators || modifiers) {
          var name = createMissingNode(79, true, ts2.Diagnostics.Declaration_expected);
          return parsePropertyDeclaration(pos, hasJSDoc, decorators, modifiers, name, void 0);
        }
        return ts2.Debug.fail("Should not have attempted to parse class member declaration.");
      }
      function parseClassExpression() {
        return parseClassDeclarationOrExpression(getNodePos(), hasPrecedingJSDocComment(), void 0, void 0, 225);
      }
      function parseClassDeclaration(pos, hasJSDoc, decorators, modifiers) {
        return parseClassDeclarationOrExpression(pos, hasJSDoc, decorators, modifiers, 256);
      }
      function parseClassDeclarationOrExpression(pos, hasJSDoc, decorators, modifiers, kind) {
        var savedAwaitContext = inAwaitContext();
        parseExpected(84);
        var name = parseNameOfClassDeclarationOrExpression();
        var typeParameters = parseTypeParameters();
        if (ts2.some(modifiers, ts2.isExportModifier))
          setAwaitContext(true);
        var heritageClauses = parseHeritageClauses();
        var members;
        if (parseExpected(18)) {
          members = parseClassMembers();
          parseExpected(19);
        } else {
          members = createMissingList();
        }
        setAwaitContext(savedAwaitContext);
        var node = kind === 256 ? factory.createClassDeclaration(decorators, modifiers, name, typeParameters, heritageClauses, members) : factory.createClassExpression(decorators, modifiers, name, typeParameters, heritageClauses, members);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseNameOfClassDeclarationOrExpression() {
        return isBindingIdentifier() && !isImplementsClause() ? createIdentifier(isBindingIdentifier()) : void 0;
      }
      function isImplementsClause() {
        return token() === 117 && lookAhead(nextTokenIsIdentifierOrKeyword);
      }
      function parseHeritageClauses() {
        if (isHeritageClause()) {
          return parseList(22, parseHeritageClause);
        }
        return void 0;
      }
      function parseHeritageClause() {
        var pos = getNodePos();
        var tok = token();
        ts2.Debug.assert(tok === 94 || tok === 117);
        nextToken();
        var types = parseDelimitedList(7, parseExpressionWithTypeArguments);
        return finishNode(factory.createHeritageClause(tok, types), pos);
      }
      function parseExpressionWithTypeArguments() {
        var pos = getNodePos();
        var expression = parseLeftHandSideExpressionOrHigher();
        var typeArguments = tryParseTypeArguments();
        return finishNode(factory.createExpressionWithTypeArguments(expression, typeArguments), pos);
      }
      function tryParseTypeArguments() {
        return token() === 29 ? parseBracketedList(20, parseType, 29, 31) : void 0;
      }
      function isHeritageClause() {
        return token() === 94 || token() === 117;
      }
      function parseClassMembers() {
        return parseList(5, parseClassElement);
      }
      function parseInterfaceDeclaration(pos, hasJSDoc, decorators, modifiers) {
        parseExpected(118);
        var name = parseIdentifier();
        var typeParameters = parseTypeParameters();
        var heritageClauses = parseHeritageClauses();
        var members = parseObjectTypeMembers();
        var node = factory.createInterfaceDeclaration(decorators, modifiers, name, typeParameters, heritageClauses, members);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseTypeAliasDeclaration(pos, hasJSDoc, decorators, modifiers) {
        parseExpected(151);
        var name = parseIdentifier();
        var typeParameters = parseTypeParameters();
        parseExpected(63);
        var type = token() === 138 && tryParse(parseKeywordAndNoDot) || parseType();
        parseSemicolon();
        var node = factory.createTypeAliasDeclaration(decorators, modifiers, name, typeParameters, type);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseEnumMember() {
        var pos = getNodePos();
        var hasJSDoc = hasPrecedingJSDocComment();
        var name = parsePropertyName();
        var initializer = allowInAnd(parseInitializer);
        return withJSDoc(finishNode(factory.createEnumMember(name, initializer), pos), hasJSDoc);
      }
      function parseEnumDeclaration(pos, hasJSDoc, decorators, modifiers) {
        parseExpected(92);
        var name = parseIdentifier();
        var members;
        if (parseExpected(18)) {
          members = doOutsideOfYieldAndAwaitContext(function() {
            return parseDelimitedList(6, parseEnumMember);
          });
          parseExpected(19);
        } else {
          members = createMissingList();
        }
        var node = factory.createEnumDeclaration(decorators, modifiers, name, members);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseModuleBlock() {
        var pos = getNodePos();
        var statements;
        if (parseExpected(18)) {
          statements = parseList(1, parseStatement);
          parseExpected(19);
        } else {
          statements = createMissingList();
        }
        return finishNode(factory.createModuleBlock(statements), pos);
      }
      function parseModuleOrNamespaceDeclaration(pos, hasJSDoc, decorators, modifiers, flags) {
        var namespaceFlag = flags & 16;
        var name = parseIdentifier();
        var body = parseOptional(24) ? parseModuleOrNamespaceDeclaration(getNodePos(), false, void 0, void 0, 4 | namespaceFlag) : parseModuleBlock();
        var node = factory.createModuleDeclaration(decorators, modifiers, name, body, flags);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseAmbientExternalModuleDeclaration(pos, hasJSDoc, decorators, modifiers) {
        var flags = 0;
        var name;
        if (token() === 156) {
          name = parseIdentifier();
          flags |= 1024;
        } else {
          name = parseLiteralNode();
          name.text = internIdentifier(name.text);
        }
        var body;
        if (token() === 18) {
          body = parseModuleBlock();
        } else {
          parseSemicolon();
        }
        var node = factory.createModuleDeclaration(decorators, modifiers, name, body, flags);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseModuleDeclaration(pos, hasJSDoc, decorators, modifiers) {
        var flags = 0;
        if (token() === 156) {
          return parseAmbientExternalModuleDeclaration(pos, hasJSDoc, decorators, modifiers);
        } else if (parseOptional(142)) {
          flags |= 16;
        } else {
          parseExpected(141);
          if (token() === 10) {
            return parseAmbientExternalModuleDeclaration(pos, hasJSDoc, decorators, modifiers);
          }
        }
        return parseModuleOrNamespaceDeclaration(pos, hasJSDoc, decorators, modifiers, flags);
      }
      function isExternalModuleReference() {
        return token() === 145 && lookAhead(nextTokenIsOpenParen);
      }
      function nextTokenIsOpenParen() {
        return nextToken() === 20;
      }
      function nextTokenIsOpenBrace() {
        return nextToken() === 18;
      }
      function nextTokenIsSlash() {
        return nextToken() === 43;
      }
      function parseNamespaceExportDeclaration(pos, hasJSDoc, decorators, modifiers) {
        parseExpected(127);
        parseExpected(142);
        var name = parseIdentifier();
        parseSemicolon();
        var node = factory.createNamespaceExportDeclaration(name);
        node.decorators = decorators;
        node.modifiers = modifiers;
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseImportDeclarationOrImportEqualsDeclaration(pos, hasJSDoc, decorators, modifiers) {
        parseExpected(100);
        var afterImportPos = scanner.getStartPos();
        var identifier;
        if (isIdentifier()) {
          identifier = parseIdentifier();
        }
        var isTypeOnly = false;
        if (token() !== 155 && (identifier === null || identifier === void 0 ? void 0 : identifier.escapedText) === "type" && (isIdentifier() || tokenAfterImportDefinitelyProducesImportDeclaration())) {
          isTypeOnly = true;
          identifier = isIdentifier() ? parseIdentifier() : void 0;
        }
        if (identifier && !tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration()) {
          return parseImportEqualsDeclaration(pos, hasJSDoc, decorators, modifiers, identifier, isTypeOnly);
        }
        var importClause;
        if (identifier || token() === 41 || token() === 18) {
          importClause = parseImportClause(identifier, afterImportPos, isTypeOnly);
          parseExpected(155);
        }
        var moduleSpecifier = parseModuleSpecifier();
        var assertClause;
        if (token() === 129 && !scanner.hasPrecedingLineBreak()) {
          assertClause = parseAssertClause();
        }
        parseSemicolon();
        var node = factory.createImportDeclaration(decorators, modifiers, importClause, moduleSpecifier, assertClause);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseAssertEntry() {
        var pos = getNodePos();
        var name = ts2.tokenIsIdentifierOrKeyword(token()) ? parseIdentifierName() : parseLiteralLikeNode(10);
        parseExpected(58);
        var value = parseLiteralLikeNode(10);
        return finishNode(factory.createAssertEntry(name, value), pos);
      }
      function parseAssertClause() {
        var pos = getNodePos();
        parseExpected(129);
        var openBracePosition = scanner.getTokenPos();
        if (parseExpected(18)) {
          var multiLine = scanner.hasPrecedingLineBreak();
          var elements = parseDelimitedList(24, parseAssertEntry, true);
          if (!parseExpected(19)) {
            var lastError = ts2.lastOrUndefined(parseDiagnostics);
            if (lastError && lastError.code === ts2.Diagnostics._0_expected.code) {
              ts2.addRelatedInfo(lastError, ts2.createDetachedDiagnostic(fileName, openBracePosition, 1, ts2.Diagnostics.The_parser_expected_to_find_a_to_match_the_token_here));
            }
          }
          return finishNode(factory.createAssertClause(elements, multiLine), pos);
        } else {
          var elements = createNodeArray([], getNodePos(), void 0, false);
          return finishNode(factory.createAssertClause(elements, false), pos);
        }
      }
      function tokenAfterImportDefinitelyProducesImportDeclaration() {
        return token() === 41 || token() === 18;
      }
      function tokenAfterImportedIdentifierDefinitelyProducesImportDeclaration() {
        return token() === 27 || token() === 155;
      }
      function parseImportEqualsDeclaration(pos, hasJSDoc, decorators, modifiers, identifier, isTypeOnly) {
        parseExpected(63);
        var moduleReference = parseModuleReference();
        parseSemicolon();
        var node = factory.createImportEqualsDeclaration(decorators, modifiers, isTypeOnly, identifier, moduleReference);
        var finished = withJSDoc(finishNode(node, pos), hasJSDoc);
        return finished;
      }
      function parseImportClause(identifier, pos, isTypeOnly) {
        var namedBindings;
        if (!identifier || parseOptional(27)) {
          namedBindings = token() === 41 ? parseNamespaceImport() : parseNamedImportsOrExports(268);
        }
        return finishNode(factory.createImportClause(isTypeOnly, identifier, namedBindings), pos);
      }
      function parseModuleReference() {
        return isExternalModuleReference() ? parseExternalModuleReference() : parseEntityName(false);
      }
      function parseExternalModuleReference() {
        var pos = getNodePos();
        parseExpected(145);
        parseExpected(20);
        var expression = parseModuleSpecifier();
        parseExpected(21);
        return finishNode(factory.createExternalModuleReference(expression), pos);
      }
      function parseModuleSpecifier() {
        if (token() === 10) {
          var result = parseLiteralNode();
          result.text = internIdentifier(result.text);
          return result;
        } else {
          return parseExpression();
        }
      }
      function parseNamespaceImport() {
        var pos = getNodePos();
        parseExpected(41);
        parseExpected(127);
        var name = parseIdentifier();
        return finishNode(factory.createNamespaceImport(name), pos);
      }
      function parseNamedImportsOrExports(kind) {
        var pos = getNodePos();
        var node = kind === 268 ? factory.createNamedImports(parseBracketedList(23, parseImportSpecifier, 18, 19)) : factory.createNamedExports(parseBracketedList(23, parseExportSpecifier, 18, 19));
        return finishNode(node, pos);
      }
      function parseExportSpecifier() {
        return parseImportOrExportSpecifier(274);
      }
      function parseImportSpecifier() {
        return parseImportOrExportSpecifier(269);
      }
      function parseImportOrExportSpecifier(kind) {
        var pos = getNodePos();
        var checkIdentifierIsKeyword = ts2.isKeyword(token()) && !isIdentifier();
        var checkIdentifierStart = scanner.getTokenPos();
        var checkIdentifierEnd = scanner.getTextPos();
        var isTypeOnly = false;
        var propertyName;
        var canParseAsKeyword = true;
        var name = parseIdentifierName();
        if (name.escapedText === "type") {
          if (token() === 127) {
            var firstAs = parseIdentifierName();
            if (token() === 127) {
              var secondAs = parseIdentifierName();
              if (ts2.tokenIsIdentifierOrKeyword(token())) {
                isTypeOnly = true;
                propertyName = firstAs;
                name = parseNameWithKeywordCheck();
                canParseAsKeyword = false;
              } else {
                propertyName = name;
                name = secondAs;
                canParseAsKeyword = false;
              }
            } else if (ts2.tokenIsIdentifierOrKeyword(token())) {
              propertyName = name;
              canParseAsKeyword = false;
              name = parseNameWithKeywordCheck();
            } else {
              isTypeOnly = true;
              name = firstAs;
            }
          } else if (ts2.tokenIsIdentifierOrKeyword(token())) {
            isTypeOnly = true;
            name = parseNameWithKeywordCheck();
          }
        }
        if (canParseAsKeyword && token() === 127) {
          propertyName = name;
          parseExpected(127);
          name = parseNameWithKeywordCheck();
        }
        if (kind === 269 && checkIdentifierIsKeyword) {
          parseErrorAt(checkIdentifierStart, checkIdentifierEnd, ts2.Diagnostics.Identifier_expected);
        }
        var node = kind === 269 ? factory.createImportSpecifier(isTypeOnly, propertyName, name) : factory.createExportSpecifier(isTypeOnly, propertyName, name);
        return finishNode(node, pos);
        function parseNameWithKeywordCheck() {
          checkIdentifierIsKeyword = ts2.isKeyword(token()) && !isIdentifier();
          checkIdentifierStart = scanner.getTokenPos();
          checkIdentifierEnd = scanner.getTextPos();
          return parseIdentifierName();
        }
      }
      function parseNamespaceExport(pos) {
        return finishNode(factory.createNamespaceExport(parseIdentifierName()), pos);
      }
      function parseExportDeclaration(pos, hasJSDoc, decorators, modifiers) {
        var savedAwaitContext = inAwaitContext();
        setAwaitContext(true);
        var exportClause;
        var moduleSpecifier;
        var assertClause;
        var isTypeOnly = parseOptional(151);
        var namespaceExportPos = getNodePos();
        if (parseOptional(41)) {
          if (parseOptional(127)) {
            exportClause = parseNamespaceExport(namespaceExportPos);
          }
          parseExpected(155);
          moduleSpecifier = parseModuleSpecifier();
        } else {
          exportClause = parseNamedImportsOrExports(272);
          if (token() === 155 || token() === 10 && !scanner.hasPrecedingLineBreak()) {
            parseExpected(155);
            moduleSpecifier = parseModuleSpecifier();
          }
        }
        if (moduleSpecifier && token() === 129 && !scanner.hasPrecedingLineBreak()) {
          assertClause = parseAssertClause();
        }
        parseSemicolon();
        setAwaitContext(savedAwaitContext);
        var node = factory.createExportDeclaration(decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier, assertClause);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function parseExportAssignment(pos, hasJSDoc, decorators, modifiers) {
        var savedAwaitContext = inAwaitContext();
        setAwaitContext(true);
        var isExportEquals;
        if (parseOptional(63)) {
          isExportEquals = true;
        } else {
          parseExpected(88);
        }
        var expression = parseAssignmentExpressionOrHigher();
        parseSemicolon();
        setAwaitContext(savedAwaitContext);
        var node = factory.createExportAssignment(decorators, modifiers, isExportEquals, expression);
        return withJSDoc(finishNode(node, pos), hasJSDoc);
      }
      function setExternalModuleIndicator(sourceFile) {
        sourceFile.externalModuleIndicator = ts2.forEach(sourceFile.statements, isAnExternalModuleIndicatorNode) || getImportMetaIfNecessary(sourceFile);
      }
      function isAnExternalModuleIndicatorNode(node) {
        return hasModifierOfKind(node, 93) || ts2.isImportEqualsDeclaration(node) && ts2.isExternalModuleReference(node.moduleReference) || ts2.isImportDeclaration(node) || ts2.isExportAssignment(node) || ts2.isExportDeclaration(node) ? node : void 0;
      }
      function getImportMetaIfNecessary(sourceFile) {
        return sourceFile.flags & 2097152 ? walkTreeForExternalModuleIndicators(sourceFile) : void 0;
      }
      function walkTreeForExternalModuleIndicators(node) {
        return isImportMeta(node) ? node : forEachChild(node, walkTreeForExternalModuleIndicators);
      }
      function hasModifierOfKind(node, kind) {
        return ts2.some(node.modifiers, function(m) {
          return m.kind === kind;
        });
      }
      function isImportMeta(node) {
        return ts2.isMetaProperty(node) && node.keywordToken === 100 && node.name.escapedText === "meta";
      }
      var ParsingContext;
      (function(ParsingContext2) {
        ParsingContext2[ParsingContext2["SourceElements"] = 0] = "SourceElements";
        ParsingContext2[ParsingContext2["BlockStatements"] = 1] = "BlockStatements";
        ParsingContext2[ParsingContext2["SwitchClauses"] = 2] = "SwitchClauses";
        ParsingContext2[ParsingContext2["SwitchClauseStatements"] = 3] = "SwitchClauseStatements";
        ParsingContext2[ParsingContext2["TypeMembers"] = 4] = "TypeMembers";
        ParsingContext2[ParsingContext2["ClassMembers"] = 5] = "ClassMembers";
        ParsingContext2[ParsingContext2["EnumMembers"] = 6] = "EnumMembers";
        ParsingContext2[ParsingContext2["HeritageClauseElement"] = 7] = "HeritageClauseElement";
        ParsingContext2[ParsingContext2["VariableDeclarations"] = 8] = "VariableDeclarations";
        ParsingContext2[ParsingContext2["ObjectBindingElements"] = 9] = "ObjectBindingElements";
        ParsingContext2[ParsingContext2["ArrayBindingElements"] = 10] = "ArrayBindingElements";
        ParsingContext2[ParsingContext2["ArgumentExpressions"] = 11] = "ArgumentExpressions";
        ParsingContext2[ParsingContext2["ObjectLiteralMembers"] = 12] = "ObjectLiteralMembers";
        ParsingContext2[ParsingContext2["JsxAttributes"] = 13] = "JsxAttributes";
        ParsingContext2[ParsingContext2["JsxChildren"] = 14] = "JsxChildren";
        ParsingContext2[ParsingContext2["ArrayLiteralMembers"] = 15] = "ArrayLiteralMembers";
        ParsingContext2[ParsingContext2["Parameters"] = 16] = "Parameters";
        ParsingContext2[ParsingContext2["JSDocParameters"] = 17] = "JSDocParameters";
        ParsingContext2[ParsingContext2["RestProperties"] = 18] = "RestProperties";
        ParsingContext2[ParsingContext2["TypeParameters"] = 19] = "TypeParameters";
        ParsingContext2[ParsingContext2["TypeArguments"] = 20] = "TypeArguments";
        ParsingContext2[ParsingContext2["TupleElementTypes"] = 21] = "TupleElementTypes";
        ParsingContext2[ParsingContext2["HeritageClauses"] = 22] = "HeritageClauses";
        ParsingContext2[ParsingContext2["ImportOrExportSpecifiers"] = 23] = "ImportOrExportSpecifiers";
        ParsingContext2[ParsingContext2["AssertEntries"] = 24] = "AssertEntries";
        ParsingContext2[ParsingContext2["Count"] = 25] = "Count";
      })(ParsingContext || (ParsingContext = {}));
      var Tristate;
      (function(Tristate2) {
        Tristate2[Tristate2["False"] = 0] = "False";
        Tristate2[Tristate2["True"] = 1] = "True";
        Tristate2[Tristate2["Unknown"] = 2] = "Unknown";
      })(Tristate || (Tristate = {}));
      var JSDocParser;
      (function(JSDocParser2) {
        function parseJSDocTypeExpressionForTests2(content, start, length) {
          initializeState("file.js", content, 99, void 0, 1);
          scanner.setText(content, start, length);
          currentToken = scanner.scan();
          var jsDocTypeExpression = parseJSDocTypeExpression();
          var sourceFile = createSourceFile2("file.js", 99, 1, false, [], factory.createToken(1), 0);
          var diagnostics = ts2.attachFileToDiagnostics(parseDiagnostics, sourceFile);
          if (jsDocDiagnostics) {
            sourceFile.jsDocDiagnostics = ts2.attachFileToDiagnostics(jsDocDiagnostics, sourceFile);
          }
          clearState();
          return jsDocTypeExpression ? { jsDocTypeExpression, diagnostics } : void 0;
        }
        JSDocParser2.parseJSDocTypeExpressionForTests = parseJSDocTypeExpressionForTests2;
        function parseJSDocTypeExpression(mayOmitBraces) {
          var pos = getNodePos();
          var hasBrace = (mayOmitBraces ? parseOptional : parseExpected)(18);
          var type = doInsideOfContext(4194304, parseJSDocType);
          if (!mayOmitBraces || hasBrace) {
            parseExpectedJSDoc(19);
          }
          var result = factory.createJSDocTypeExpression(type);
          fixupParentReferences(result);
          return finishNode(result, pos);
        }
        JSDocParser2.parseJSDocTypeExpression = parseJSDocTypeExpression;
        function parseJSDocNameReference() {
          var pos = getNodePos();
          var hasBrace = parseOptional(18);
          var p2 = getNodePos();
          var entityName = parseEntityName(false);
          while (token() === 80) {
            reScanHashToken();
            nextTokenJSDoc();
            entityName = finishNode(factory.createJSDocMemberName(entityName, parseIdentifier()), p2);
          }
          if (hasBrace) {
            parseExpectedJSDoc(19);
          }
          var result = factory.createJSDocNameReference(entityName);
          fixupParentReferences(result);
          return finishNode(result, pos);
        }
        JSDocParser2.parseJSDocNameReference = parseJSDocNameReference;
        function parseIsolatedJSDocComment2(content, start, length) {
          initializeState("", content, 99, void 0, 1);
          var jsDoc = doInsideOfContext(4194304, function() {
            return parseJSDocCommentWorker(start, length);
          });
          var sourceFile = { languageVariant: 0, text: content };
          var diagnostics = ts2.attachFileToDiagnostics(parseDiagnostics, sourceFile);
          clearState();
          return jsDoc ? { jsDoc, diagnostics } : void 0;
        }
        JSDocParser2.parseIsolatedJSDocComment = parseIsolatedJSDocComment2;
        function parseJSDocComment(parent, start, length) {
          var saveToken = currentToken;
          var saveParseDiagnosticsLength = parseDiagnostics.length;
          var saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode;
          var comment = doInsideOfContext(4194304, function() {
            return parseJSDocCommentWorker(start, length);
          });
          ts2.setParent(comment, parent);
          if (contextFlags & 131072) {
            if (!jsDocDiagnostics) {
              jsDocDiagnostics = [];
            }
            jsDocDiagnostics.push.apply(jsDocDiagnostics, parseDiagnostics);
          }
          currentToken = saveToken;
          parseDiagnostics.length = saveParseDiagnosticsLength;
          parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode;
          return comment;
        }
        JSDocParser2.parseJSDocComment = parseJSDocComment;
        var JSDocState;
        (function(JSDocState2) {
          JSDocState2[JSDocState2["BeginningOfLine"] = 0] = "BeginningOfLine";
          JSDocState2[JSDocState2["SawAsterisk"] = 1] = "SawAsterisk";
          JSDocState2[JSDocState2["SavingComments"] = 2] = "SavingComments";
          JSDocState2[JSDocState2["SavingBackticks"] = 3] = "SavingBackticks";
        })(JSDocState || (JSDocState = {}));
        var PropertyLikeParse;
        (function(PropertyLikeParse2) {
          PropertyLikeParse2[PropertyLikeParse2["Property"] = 1] = "Property";
          PropertyLikeParse2[PropertyLikeParse2["Parameter"] = 2] = "Parameter";
          PropertyLikeParse2[PropertyLikeParse2["CallbackParameter"] = 4] = "CallbackParameter";
        })(PropertyLikeParse || (PropertyLikeParse = {}));
        function parseJSDocCommentWorker(start, length) {
          if (start === void 0) {
            start = 0;
          }
          var content = sourceText;
          var end = length === void 0 ? content.length : start + length;
          length = end - start;
          ts2.Debug.assert(start >= 0);
          ts2.Debug.assert(start <= end);
          ts2.Debug.assert(end <= content.length);
          if (!isJSDocLikeText(content, start)) {
            return void 0;
          }
          var tags;
          var tagsPos;
          var tagsEnd;
          var linkEnd;
          var commentsPos;
          var comments = [];
          var parts = [];
          return scanner.scanRange(start + 3, length - 5, function() {
            var state = 1;
            var margin;
            var indent = start - (content.lastIndexOf("\n", start) + 1) + 4;
            function pushComment(text) {
              if (!margin) {
                margin = indent;
              }
              comments.push(text);
              indent += text.length;
            }
            nextTokenJSDoc();
            while (parseOptionalJsdoc(5))
              ;
            if (parseOptionalJsdoc(4)) {
              state = 0;
              indent = 0;
            }
            loop:
              while (true) {
                switch (token()) {
                  case 59:
                    if (state === 0 || state === 1) {
                      removeTrailingWhitespace(comments);
                      if (!commentsPos)
                        commentsPos = getNodePos();
                      addTag(parseTag(indent));
                      state = 0;
                      margin = void 0;
                    } else {
                      pushComment(scanner.getTokenText());
                    }
                    break;
                  case 4:
                    comments.push(scanner.getTokenText());
                    state = 0;
                    indent = 0;
                    break;
                  case 41:
                    var asterisk = scanner.getTokenText();
                    if (state === 1 || state === 2) {
                      state = 2;
                      pushComment(asterisk);
                    } else {
                      state = 1;
                      indent += asterisk.length;
                    }
                    break;
                  case 5:
                    var whitespace = scanner.getTokenText();
                    if (state === 2) {
                      comments.push(whitespace);
                    } else if (margin !== void 0 && indent + whitespace.length > margin) {
                      comments.push(whitespace.slice(margin - indent));
                    }
                    indent += whitespace.length;
                    break;
                  case 1:
                    break loop;
                  case 18:
                    state = 2;
                    var commentEnd = scanner.getStartPos();
                    var linkStart = scanner.getTextPos() - 1;
                    var link = parseJSDocLink(linkStart);
                    if (link) {
                      if (!linkEnd) {
                        removeLeadingNewlines(comments);
                      }
                      parts.push(finishNode(factory.createJSDocText(comments.join("")), linkEnd !== null && linkEnd !== void 0 ? linkEnd : start, commentEnd));
                      parts.push(link);
                      comments = [];
                      linkEnd = scanner.getTextPos();
                      break;
                    }
                  default:
                    state = 2;
                    pushComment(scanner.getTokenText());
                    break;
                }
                nextTokenJSDoc();
              }
            removeTrailingWhitespace(comments);
            if (parts.length && comments.length) {
              parts.push(finishNode(factory.createJSDocText(comments.join("")), linkEnd !== null && linkEnd !== void 0 ? linkEnd : start, commentsPos));
            }
            if (parts.length && tags)
              ts2.Debug.assertIsDefined(commentsPos, "having parsed tags implies that the end of the comment span should be set");
            var tagsArray = tags && createNodeArray(tags, tagsPos, tagsEnd);
            return finishNode(factory.createJSDocComment(parts.length ? createNodeArray(parts, start, commentsPos) : comments.length ? comments.join("") : void 0, tagsArray), start, end);
          });
          function removeLeadingNewlines(comments2) {
            while (comments2.length && (comments2[0] === "\n" || comments2[0] === "\r")) {
              comments2.shift();
            }
          }
          function removeTrailingWhitespace(comments2) {
            while (comments2.length && comments2[comments2.length - 1].trim() === "") {
              comments2.pop();
            }
          }
          function isNextNonwhitespaceTokenEndOfFile() {
            while (true) {
              nextTokenJSDoc();
              if (token() === 1) {
                return true;
              }
              if (!(token() === 5 || token() === 4)) {
                return false;
              }
            }
          }
          function skipWhitespace() {
            if (token() === 5 || token() === 4) {
              if (lookAhead(isNextNonwhitespaceTokenEndOfFile)) {
                return;
              }
            }
            while (token() === 5 || token() === 4) {
              nextTokenJSDoc();
            }
          }
          function skipWhitespaceOrAsterisk() {
            if (token() === 5 || token() === 4) {
              if (lookAhead(isNextNonwhitespaceTokenEndOfFile)) {
                return "";
              }
            }
            var precedingLineBreak = scanner.hasPrecedingLineBreak();
            var seenLineBreak = false;
            var indentText = "";
            while (precedingLineBreak && token() === 41 || token() === 5 || token() === 4) {
              indentText += scanner.getTokenText();
              if (token() === 4) {
                precedingLineBreak = true;
                seenLineBreak = true;
                indentText = "";
              } else if (token() === 41) {
                precedingLineBreak = false;
              }
              nextTokenJSDoc();
            }
            return seenLineBreak ? indentText : "";
          }
          function parseTag(margin) {
            ts2.Debug.assert(token() === 59);
            var start2 = scanner.getTokenPos();
            nextTokenJSDoc();
            var tagName = parseJSDocIdentifierName(void 0);
            var indentText = skipWhitespaceOrAsterisk();
            var tag;
            switch (tagName.escapedText) {
              case "author":
                tag = parseAuthorTag(start2, tagName, margin, indentText);
                break;
              case "implements":
                tag = parseImplementsTag(start2, tagName, margin, indentText);
                break;
              case "augments":
              case "extends":
                tag = parseAugmentsTag(start2, tagName, margin, indentText);
                break;
              case "class":
              case "constructor":
                tag = parseSimpleTag(start2, factory.createJSDocClassTag, tagName, margin, indentText);
                break;
              case "public":
                tag = parseSimpleTag(start2, factory.createJSDocPublicTag, tagName, margin, indentText);
                break;
              case "private":
                tag = parseSimpleTag(start2, factory.createJSDocPrivateTag, tagName, margin, indentText);
                break;
              case "protected":
                tag = parseSimpleTag(start2, factory.createJSDocProtectedTag, tagName, margin, indentText);
                break;
              case "readonly":
                tag = parseSimpleTag(start2, factory.createJSDocReadonlyTag, tagName, margin, indentText);
                break;
              case "override":
                tag = parseSimpleTag(start2, factory.createJSDocOverrideTag, tagName, margin, indentText);
                break;
              case "deprecated":
                hasDeprecatedTag = true;
                tag = parseSimpleTag(start2, factory.createJSDocDeprecatedTag, tagName, margin, indentText);
                break;
              case "this":
                tag = parseThisTag(start2, tagName, margin, indentText);
                break;
              case "enum":
                tag = parseEnumTag(start2, tagName, margin, indentText);
                break;
              case "arg":
              case "argument":
              case "param":
                return parseParameterOrPropertyTag(start2, tagName, 2, margin);
              case "return":
              case "returns":
                tag = parseReturnTag(start2, tagName, margin, indentText);
                break;
              case "template":
                tag = parseTemplateTag(start2, tagName, margin, indentText);
                break;
              case "type":
                tag = parseTypeTag(start2, tagName, margin, indentText);
                break;
              case "typedef":
                tag = parseTypedefTag(start2, tagName, margin, indentText);
                break;
              case "callback":
                tag = parseCallbackTag(start2, tagName, margin, indentText);
                break;
              case "see":
                tag = parseSeeTag(start2, tagName, margin, indentText);
                break;
              default:
                tag = parseUnknownTag(start2, tagName, margin, indentText);
                break;
            }
            return tag;
          }
          function parseTrailingTagComments(pos, end2, margin, indentText) {
            if (!indentText) {
              margin += end2 - pos;
            }
            return parseTagComments(margin, indentText.slice(margin));
          }
          function parseTagComments(indent, initialMargin) {
            var commentsPos2 = getNodePos();
            var comments2 = [];
            var parts2 = [];
            var linkEnd2;
            var state = 0;
            var previousWhitespace = true;
            var margin;
            function pushComment(text) {
              if (!margin) {
                margin = indent;
              }
              comments2.push(text);
              indent += text.length;
            }
            if (initialMargin !== void 0) {
              if (initialMargin !== "") {
                pushComment(initialMargin);
              }
              state = 1;
            }
            var tok = token();
            loop:
              while (true) {
                switch (tok) {
                  case 4:
                    state = 0;
                    comments2.push(scanner.getTokenText());
                    indent = 0;
                    break;
                  case 59:
                    if (state === 3 || state === 2 && (!previousWhitespace || lookAhead(isNextJSDocTokenWhitespace))) {
                      comments2.push(scanner.getTokenText());
                      break;
                    }
                    scanner.setTextPos(scanner.getTextPos() - 1);
                  case 1:
                    break loop;
                  case 5:
                    if (state === 2 || state === 3) {
                      pushComment(scanner.getTokenText());
                    } else {
                      var whitespace = scanner.getTokenText();
                      if (margin !== void 0 && indent + whitespace.length > margin) {
                        comments2.push(whitespace.slice(margin - indent));
                      }
                      indent += whitespace.length;
                    }
                    break;
                  case 18:
                    state = 2;
                    var commentEnd = scanner.getStartPos();
                    var linkStart = scanner.getTextPos() - 1;
                    var link = parseJSDocLink(linkStart);
                    if (link) {
                      parts2.push(finishNode(factory.createJSDocText(comments2.join("")), linkEnd2 !== null && linkEnd2 !== void 0 ? linkEnd2 : commentsPos2, commentEnd));
                      parts2.push(link);
                      comments2 = [];
                      linkEnd2 = scanner.getTextPos();
                    } else {
                      pushComment(scanner.getTokenText());
                    }
                    break;
                  case 61:
                    if (state === 3) {
                      state = 2;
                    } else {
                      state = 3;
                    }
                    pushComment(scanner.getTokenText());
                    break;
                  case 41:
                    if (state === 0) {
                      state = 1;
                      indent += 1;
                      break;
                    }
                  default:
                    if (state !== 3) {
                      state = 2;
                    }
                    pushComment(scanner.getTokenText());
                    break;
                }
                previousWhitespace = token() === 5;
                tok = nextTokenJSDoc();
              }
            removeLeadingNewlines(comments2);
            removeTrailingWhitespace(comments2);
            if (parts2.length) {
              if (comments2.length) {
                parts2.push(finishNode(factory.createJSDocText(comments2.join("")), linkEnd2 !== null && linkEnd2 !== void 0 ? linkEnd2 : commentsPos2));
              }
              return createNodeArray(parts2, commentsPos2, scanner.getTextPos());
            } else if (comments2.length) {
              return comments2.join("");
            }
          }
          function isNextJSDocTokenWhitespace() {
            var next = nextTokenJSDoc();
            return next === 5 || next === 4;
          }
          function parseJSDocLink(start2) {
            var linkType = tryParse(parseJSDocLinkPrefix);
            if (!linkType) {
              return void 0;
            }
            nextTokenJSDoc();
            skipWhitespace();
            var p2 = getNodePos();
            var name = ts2.tokenIsIdentifierOrKeyword(token()) ? parseEntityName(true) : void 0;
            if (name) {
              while (token() === 80) {
                reScanHashToken();
                nextTokenJSDoc();
                name = finishNode(factory.createJSDocMemberName(name, parseIdentifier()), p2);
              }
            }
            var text = [];
            while (token() !== 19 && token() !== 4 && token() !== 1) {
              text.push(scanner.getTokenText());
              nextTokenJSDoc();
            }
            var create2 = linkType === "link" ? factory.createJSDocLink : linkType === "linkcode" ? factory.createJSDocLinkCode : factory.createJSDocLinkPlain;
            return finishNode(create2(name, text.join("")), start2, scanner.getTextPos());
          }
          function parseJSDocLinkPrefix() {
            skipWhitespaceOrAsterisk();
            if (token() === 18 && nextTokenJSDoc() === 59 && ts2.tokenIsIdentifierOrKeyword(nextTokenJSDoc())) {
              var kind = scanner.getTokenValue();
              if (kind === "link" || kind === "linkcode" || kind === "linkplain") {
                return kind;
              }
            }
          }
          function parseUnknownTag(start2, tagName, indent, indentText) {
            return finishNode(factory.createJSDocUnknownTag(tagName, parseTrailingTagComments(start2, getNodePos(), indent, indentText)), start2);
          }
          function addTag(tag) {
            if (!tag) {
              return;
            }
            if (!tags) {
              tags = [tag];
              tagsPos = tag.pos;
            } else {
              tags.push(tag);
            }
            tagsEnd = tag.end;
          }
          function tryParseTypeExpression() {
            skipWhitespaceOrAsterisk();
            return token() === 18 ? parseJSDocTypeExpression() : void 0;
          }
          function parseBracketNameInPropertyAndParamTag() {
            var isBracketed = parseOptionalJsdoc(22);
            if (isBracketed) {
              skipWhitespace();
            }
            var isBackquoted = parseOptionalJsdoc(61);
            var name = parseJSDocEntityName();
            if (isBackquoted) {
              parseExpectedTokenJSDoc(61);
            }
            if (isBracketed) {
              skipWhitespace();
              if (parseOptionalToken(63)) {
                parseExpression();
              }
              parseExpected(23);
            }
            return { name, isBracketed };
          }
          function isObjectOrObjectArrayTypeReference(node) {
            switch (node.kind) {
              case 147:
                return true;
              case 182:
                return isObjectOrObjectArrayTypeReference(node.elementType);
              default:
                return ts2.isTypeReferenceNode(node) && ts2.isIdentifier(node.typeName) && node.typeName.escapedText === "Object" && !node.typeArguments;
            }
          }
          function parseParameterOrPropertyTag(start2, tagName, target, indent) {
            var typeExpression = tryParseTypeExpression();
            var isNameFirst = !typeExpression;
            skipWhitespaceOrAsterisk();
            var _a = parseBracketNameInPropertyAndParamTag(), name = _a.name, isBracketed = _a.isBracketed;
            var indentText = skipWhitespaceOrAsterisk();
            if (isNameFirst && !lookAhead(parseJSDocLinkPrefix)) {
              typeExpression = tryParseTypeExpression();
            }
            var comment = parseTrailingTagComments(start2, getNodePos(), indent, indentText);
            var nestedTypeLiteral = target !== 4 && parseNestedTypeLiteral(typeExpression, name, target, indent);
            if (nestedTypeLiteral) {
              typeExpression = nestedTypeLiteral;
              isNameFirst = true;
            }
            var result = target === 1 ? factory.createJSDocPropertyTag(tagName, name, isBracketed, typeExpression, isNameFirst, comment) : factory.createJSDocParameterTag(tagName, name, isBracketed, typeExpression, isNameFirst, comment);
            return finishNode(result, start2);
          }
          function parseNestedTypeLiteral(typeExpression, name, target, indent) {
            if (typeExpression && isObjectOrObjectArrayTypeReference(typeExpression.type)) {
              var pos = getNodePos();
              var child = void 0;
              var children = void 0;
              while (child = tryParse(function() {
                return parseChildParameterOrPropertyTag(target, indent, name);
              })) {
                if (child.kind === 338 || child.kind === 345) {
                  children = ts2.append(children, child);
                }
              }
              if (children) {
                var literal = finishNode(factory.createJSDocTypeLiteral(children, typeExpression.type.kind === 182), pos);
                return finishNode(factory.createJSDocTypeExpression(literal), pos);
              }
            }
          }
          function parseReturnTag(start2, tagName, indent, indentText) {
            if (ts2.some(tags, ts2.isJSDocReturnTag)) {
              parseErrorAt(tagName.pos, scanner.getTokenPos(), ts2.Diagnostics._0_tag_already_specified, tagName.escapedText);
            }
            var typeExpression = tryParseTypeExpression();
            return finishNode(factory.createJSDocReturnTag(tagName, typeExpression, parseTrailingTagComments(start2, getNodePos(), indent, indentText)), start2);
          }
          function parseTypeTag(start2, tagName, indent, indentText) {
            if (ts2.some(tags, ts2.isJSDocTypeTag)) {
              parseErrorAt(tagName.pos, scanner.getTokenPos(), ts2.Diagnostics._0_tag_already_specified, tagName.escapedText);
            }
            var typeExpression = parseJSDocTypeExpression(true);
            var comments2 = indent !== void 0 && indentText !== void 0 ? parseTrailingTagComments(start2, getNodePos(), indent, indentText) : void 0;
            return finishNode(factory.createJSDocTypeTag(tagName, typeExpression, comments2), start2);
          }
          function parseSeeTag(start2, tagName, indent, indentText) {
            var isMarkdownOrJSDocLink = token() === 22 || lookAhead(function() {
              return nextTokenJSDoc() === 59 && ts2.tokenIsIdentifierOrKeyword(nextTokenJSDoc()) && scanner.getTokenValue() === "link";
            });
            var nameExpression = isMarkdownOrJSDocLink ? void 0 : parseJSDocNameReference();
            var comments2 = indent !== void 0 && indentText !== void 0 ? parseTrailingTagComments(start2, getNodePos(), indent, indentText) : void 0;
            return finishNode(factory.createJSDocSeeTag(tagName, nameExpression, comments2), start2);
          }
          function parseAuthorTag(start2, tagName, indent, indentText) {
            var commentStart = getNodePos();
            var textOnly = parseAuthorNameAndEmail();
            var commentEnd = scanner.getStartPos();
            var comments2 = parseTrailingTagComments(start2, commentEnd, indent, indentText);
            if (!comments2) {
              commentEnd = scanner.getStartPos();
            }
            var allParts = typeof comments2 !== "string" ? createNodeArray(ts2.concatenate([finishNode(textOnly, commentStart, commentEnd)], comments2), commentStart) : textOnly.text + comments2;
            return finishNode(factory.createJSDocAuthorTag(tagName, allParts), start2);
          }
          function parseAuthorNameAndEmail() {
            var comments2 = [];
            var inEmail = false;
            var token2 = scanner.getToken();
            while (token2 !== 1 && token2 !== 4) {
              if (token2 === 29) {
                inEmail = true;
              } else if (token2 === 59 && !inEmail) {
                break;
              } else if (token2 === 31 && inEmail) {
                comments2.push(scanner.getTokenText());
                scanner.setTextPos(scanner.getTokenPos() + 1);
                break;
              }
              comments2.push(scanner.getTokenText());
              token2 = nextTokenJSDoc();
            }
            return factory.createJSDocText(comments2.join(""));
          }
          function parseImplementsTag(start2, tagName, margin, indentText) {
            var className = parseExpressionWithTypeArgumentsForAugments();
            return finishNode(factory.createJSDocImplementsTag(tagName, className, parseTrailingTagComments(start2, getNodePos(), margin, indentText)), start2);
          }
          function parseAugmentsTag(start2, tagName, margin, indentText) {
            var className = parseExpressionWithTypeArgumentsForAugments();
            return finishNode(factory.createJSDocAugmentsTag(tagName, className, parseTrailingTagComments(start2, getNodePos(), margin, indentText)), start2);
          }
          function parseExpressionWithTypeArgumentsForAugments() {
            var usedBrace = parseOptional(18);
            var pos = getNodePos();
            var expression = parsePropertyAccessEntityNameExpression();
            var typeArguments = tryParseTypeArguments();
            var node = factory.createExpressionWithTypeArguments(expression, typeArguments);
            var res = finishNode(node, pos);
            if (usedBrace) {
              parseExpected(19);
            }
            return res;
          }
          function parsePropertyAccessEntityNameExpression() {
            var pos = getNodePos();
            var node = parseJSDocIdentifierName();
            while (parseOptional(24)) {
              var name = parseJSDocIdentifierName();
              node = finishNode(factory.createPropertyAccessExpression(node, name), pos);
            }
            return node;
          }
          function parseSimpleTag(start2, createTag, tagName, margin, indentText) {
            return finishNode(createTag(tagName, parseTrailingTagComments(start2, getNodePos(), margin, indentText)), start2);
          }
          function parseThisTag(start2, tagName, margin, indentText) {
            var typeExpression = parseJSDocTypeExpression(true);
            skipWhitespace();
            return finishNode(factory.createJSDocThisTag(tagName, typeExpression, parseTrailingTagComments(start2, getNodePos(), margin, indentText)), start2);
          }
          function parseEnumTag(start2, tagName, margin, indentText) {
            var typeExpression = parseJSDocTypeExpression(true);
            skipWhitespace();
            return finishNode(factory.createJSDocEnumTag(tagName, typeExpression, parseTrailingTagComments(start2, getNodePos(), margin, indentText)), start2);
          }
          function parseTypedefTag(start2, tagName, indent, indentText) {
            var _a;
            var typeExpression = tryParseTypeExpression();
            skipWhitespaceOrAsterisk();
            var fullName = parseJSDocTypeNameWithNamespace();
            skipWhitespace();
            var comment = parseTagComments(indent);
            var end2;
            if (!typeExpression || isObjectOrObjectArrayTypeReference(typeExpression.type)) {
              var child = void 0;
              var childTypeTag = void 0;
              var jsDocPropertyTags = void 0;
              var hasChildren = false;
              while (child = tryParse(function() {
                return parseChildPropertyTag(indent);
              })) {
                hasChildren = true;
                if (child.kind === 341) {
                  if (childTypeTag) {
                    parseErrorAtCurrentToken(ts2.Diagnostics.A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags);
                    var lastError = ts2.lastOrUndefined(parseDiagnostics);
                    if (lastError) {
                      ts2.addRelatedInfo(lastError, ts2.createDetachedDiagnostic(fileName, 0, 0, ts2.Diagnostics.The_tag_was_first_specified_here));
                    }
                    break;
                  } else {
                    childTypeTag = child;
                  }
                } else {
                  jsDocPropertyTags = ts2.append(jsDocPropertyTags, child);
                }
              }
              if (hasChildren) {
                var isArrayType = typeExpression && typeExpression.type.kind === 182;
                var jsdocTypeLiteral = factory.createJSDocTypeLiteral(jsDocPropertyTags, isArrayType);
                typeExpression = childTypeTag && childTypeTag.typeExpression && !isObjectOrObjectArrayTypeReference(childTypeTag.typeExpression.type) ? childTypeTag.typeExpression : finishNode(jsdocTypeLiteral, start2);
                end2 = typeExpression.end;
              }
            }
            end2 = end2 || comment !== void 0 ? getNodePos() : ((_a = fullName !== null && fullName !== void 0 ? fullName : typeExpression) !== null && _a !== void 0 ? _a : tagName).end;
            if (!comment) {
              comment = parseTrailingTagComments(start2, end2, indent, indentText);
            }
            var typedefTag = factory.createJSDocTypedefTag(tagName, typeExpression, fullName, comment);
            return finishNode(typedefTag, start2, end2);
          }
          function parseJSDocTypeNameWithNamespace(nested) {
            var pos = scanner.getTokenPos();
            if (!ts2.tokenIsIdentifierOrKeyword(token())) {
              return void 0;
            }
            var typeNameOrNamespaceName = parseJSDocIdentifierName();
            if (parseOptional(24)) {
              var body = parseJSDocTypeNameWithNamespace(true);
              var jsDocNamespaceNode = factory.createModuleDeclaration(void 0, void 0, typeNameOrNamespaceName, body, nested ? 4 : void 0);
              return finishNode(jsDocNamespaceNode, pos);
            }
            if (nested) {
              typeNameOrNamespaceName.isInJSDocNamespace = true;
            }
            return typeNameOrNamespaceName;
          }
          function parseCallbackTagParameters(indent) {
            var pos = getNodePos();
            var child;
            var parameters;
            while (child = tryParse(function() {
              return parseChildParameterOrPropertyTag(4, indent);
            })) {
              parameters = ts2.append(parameters, child);
            }
            return createNodeArray(parameters || [], pos);
          }
          function parseCallbackTag(start2, tagName, indent, indentText) {
            var fullName = parseJSDocTypeNameWithNamespace();
            skipWhitespace();
            var comment = parseTagComments(indent);
            var parameters = parseCallbackTagParameters(indent);
            var returnTag = tryParse(function() {
              if (parseOptionalJsdoc(59)) {
                var tag = parseTag(indent);
                if (tag && tag.kind === 339) {
                  return tag;
                }
              }
            });
            var typeExpression = finishNode(factory.createJSDocSignature(void 0, parameters, returnTag), start2);
            if (!comment) {
              comment = parseTrailingTagComments(start2, getNodePos(), indent, indentText);
            }
            return finishNode(factory.createJSDocCallbackTag(tagName, typeExpression, fullName, comment), start2);
          }
          function escapedTextsEqual(a, b) {
            while (!ts2.isIdentifier(a) || !ts2.isIdentifier(b)) {
              if (!ts2.isIdentifier(a) && !ts2.isIdentifier(b) && a.right.escapedText === b.right.escapedText) {
                a = a.left;
                b = b.left;
              } else {
                return false;
              }
            }
            return a.escapedText === b.escapedText;
          }
          function parseChildPropertyTag(indent) {
            return parseChildParameterOrPropertyTag(1, indent);
          }
          function parseChildParameterOrPropertyTag(target, indent, name) {
            var canParseTag = true;
            var seenAsterisk = false;
            while (true) {
              switch (nextTokenJSDoc()) {
                case 59:
                  if (canParseTag) {
                    var child = tryParseChildTag(target, indent);
                    if (child && (child.kind === 338 || child.kind === 345) && target !== 4 && name && (ts2.isIdentifier(child.name) || !escapedTextsEqual(name, child.name.left))) {
                      return false;
                    }
                    return child;
                  }
                  seenAsterisk = false;
                  break;
                case 4:
                  canParseTag = true;
                  seenAsterisk = false;
                  break;
                case 41:
                  if (seenAsterisk) {
                    canParseTag = false;
                  }
                  seenAsterisk = true;
                  break;
                case 79:
                  canParseTag = false;
                  break;
                case 1:
                  return false;
              }
            }
          }
          function tryParseChildTag(target, indent) {
            ts2.Debug.assert(token() === 59);
            var start2 = scanner.getStartPos();
            nextTokenJSDoc();
            var tagName = parseJSDocIdentifierName();
            skipWhitespace();
            var t;
            switch (tagName.escapedText) {
              case "type":
                return target === 1 && parseTypeTag(start2, tagName);
              case "prop":
              case "property":
                t = 1;
                break;
              case "arg":
              case "argument":
              case "param":
                t = 2 | 4;
                break;
              default:
                return false;
            }
            if (!(target & t)) {
              return false;
            }
            return parseParameterOrPropertyTag(start2, tagName, target, indent);
          }
          function parseTemplateTagTypeParameter() {
            var typeParameterPos = getNodePos();
            var isBracketed = parseOptionalJsdoc(22);
            if (isBracketed) {
              skipWhitespace();
            }
            var name = parseJSDocIdentifierName(ts2.Diagnostics.Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces);
            var defaultType;
            if (isBracketed) {
              skipWhitespace();
              parseExpected(63);
              defaultType = doInsideOfContext(4194304, parseJSDocType);
              parseExpected(23);
            }
            if (ts2.nodeIsMissing(name)) {
              return void 0;
            }
            return finishNode(factory.createTypeParameterDeclaration(name, void 0, defaultType), typeParameterPos);
          }
          function parseTemplateTagTypeParameters() {
            var pos = getNodePos();
            var typeParameters = [];
            do {
              skipWhitespace();
              var node = parseTemplateTagTypeParameter();
              if (node !== void 0) {
                typeParameters.push(node);
              }
              skipWhitespaceOrAsterisk();
            } while (parseOptionalJsdoc(27));
            return createNodeArray(typeParameters, pos);
          }
          function parseTemplateTag(start2, tagName, indent, indentText) {
            var constraint = token() === 18 ? parseJSDocTypeExpression() : void 0;
            var typeParameters = parseTemplateTagTypeParameters();
            return finishNode(factory.createJSDocTemplateTag(tagName, constraint, typeParameters, parseTrailingTagComments(start2, getNodePos(), indent, indentText)), start2);
          }
          function parseOptionalJsdoc(t) {
            if (token() === t) {
              nextTokenJSDoc();
              return true;
            }
            return false;
          }
          function parseJSDocEntityName() {
            var entity = parseJSDocIdentifierName();
            if (parseOptional(22)) {
              parseExpected(23);
            }
            while (parseOptional(24)) {
              var name = parseJSDocIdentifierName();
              if (parseOptional(22)) {
                parseExpected(23);
              }
              entity = createQualifiedName(entity, name);
            }
            return entity;
          }
          function parseJSDocIdentifierName(message) {
            if (!ts2.tokenIsIdentifierOrKeyword(token())) {
              return createMissingNode(79, !message, message || ts2.Diagnostics.Identifier_expected);
            }
            identifierCount++;
            var pos = scanner.getTokenPos();
            var end2 = scanner.getTextPos();
            var originalKeywordKind = token();
            var text = internIdentifier(scanner.getTokenValue());
            var result = finishNode(factory.createIdentifier(text, void 0, originalKeywordKind), pos, end2);
            nextTokenJSDoc();
            return result;
          }
        }
      })(JSDocParser = Parser2.JSDocParser || (Parser2.JSDocParser = {}));
    })(Parser || (Parser = {}));
    var IncrementalParser;
    (function(IncrementalParser2) {
      function updateSourceFile2(sourceFile, newText, textChangeRange, aggressiveChecks) {
        aggressiveChecks = aggressiveChecks || ts2.Debug.shouldAssert(2);
        checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks);
        if (ts2.textChangeRangeIsUnchanged(textChangeRange)) {
          return sourceFile;
        }
        if (sourceFile.statements.length === 0) {
          return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, void 0, true, sourceFile.scriptKind);
        }
        var incrementalSourceFile = sourceFile;
        ts2.Debug.assert(!incrementalSourceFile.hasBeenIncrementallyParsed);
        incrementalSourceFile.hasBeenIncrementallyParsed = true;
        Parser.fixupParentReferences(incrementalSourceFile);
        var oldText = sourceFile.text;
        var syntaxCursor = createSyntaxCursor(sourceFile);
        var changeRange = extendToAffectedRange(sourceFile, textChangeRange);
        checkChangeRange(sourceFile, newText, changeRange, aggressiveChecks);
        ts2.Debug.assert(changeRange.span.start <= textChangeRange.span.start);
        ts2.Debug.assert(ts2.textSpanEnd(changeRange.span) === ts2.textSpanEnd(textChangeRange.span));
        ts2.Debug.assert(ts2.textSpanEnd(ts2.textChangeRangeNewSpan(changeRange)) === ts2.textSpanEnd(ts2.textChangeRangeNewSpan(textChangeRange)));
        var delta = ts2.textChangeRangeNewSpan(changeRange).length - changeRange.span.length;
        updateTokenPositionsAndMarkElements(incrementalSourceFile, changeRange.span.start, ts2.textSpanEnd(changeRange.span), ts2.textSpanEnd(ts2.textChangeRangeNewSpan(changeRange)), delta, oldText, newText, aggressiveChecks);
        var result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, true, sourceFile.scriptKind);
        result.commentDirectives = getNewCommentDirectives(sourceFile.commentDirectives, result.commentDirectives, changeRange.span.start, ts2.textSpanEnd(changeRange.span), delta, oldText, newText, aggressiveChecks);
        result.impliedNodeFormat = sourceFile.impliedNodeFormat;
        return result;
      }
      IncrementalParser2.updateSourceFile = updateSourceFile2;
      function getNewCommentDirectives(oldDirectives, newDirectives, changeStart, changeRangeOldEnd, delta, oldText, newText, aggressiveChecks) {
        if (!oldDirectives)
          return newDirectives;
        var commentDirectives;
        var addedNewlyScannedDirectives = false;
        for (var _i = 0, oldDirectives_1 = oldDirectives; _i < oldDirectives_1.length; _i++) {
          var directive = oldDirectives_1[_i];
          var range = directive.range, type = directive.type;
          if (range.end < changeStart) {
            commentDirectives = ts2.append(commentDirectives, directive);
          } else if (range.pos > changeRangeOldEnd) {
            addNewlyScannedDirectives();
            var updatedDirective = {
              range: { pos: range.pos + delta, end: range.end + delta },
              type
            };
            commentDirectives = ts2.append(commentDirectives, updatedDirective);
            if (aggressiveChecks) {
              ts2.Debug.assert(oldText.substring(range.pos, range.end) === newText.substring(updatedDirective.range.pos, updatedDirective.range.end));
            }
          }
        }
        addNewlyScannedDirectives();
        return commentDirectives;
        function addNewlyScannedDirectives() {
          if (addedNewlyScannedDirectives)
            return;
          addedNewlyScannedDirectives = true;
          if (!commentDirectives) {
            commentDirectives = newDirectives;
          } else if (newDirectives) {
            commentDirectives.push.apply(commentDirectives, newDirectives);
          }
        }
      }
      function moveElementEntirelyPastChangeRange(element, isArray, delta, oldText, newText, aggressiveChecks) {
        if (isArray) {
          visitArray(element);
        } else {
          visitNode2(element);
        }
        return;
        function visitNode2(node) {
          var text = "";
          if (aggressiveChecks && shouldCheckNode(node)) {
            text = oldText.substring(node.pos, node.end);
          }
          if (node._children) {
            node._children = void 0;
          }
          ts2.setTextRangePosEnd(node, node.pos + delta, node.end + delta);
          if (aggressiveChecks && shouldCheckNode(node)) {
            ts2.Debug.assert(text === newText.substring(node.pos, node.end));
          }
          forEachChild(node, visitNode2, visitArray);
          if (ts2.hasJSDocNodes(node)) {
            for (var _i = 0, _a = node.jsDoc; _i < _a.length; _i++) {
              var jsDocComment = _a[_i];
              visitNode2(jsDocComment);
            }
          }
          checkNodePositions(node, aggressiveChecks);
        }
        function visitArray(array) {
          array._children = void 0;
          ts2.setTextRangePosEnd(array, array.pos + delta, array.end + delta);
          for (var _i = 0, array_9 = array; _i < array_9.length; _i++) {
            var node = array_9[_i];
            visitNode2(node);
          }
        }
      }
      function shouldCheckNode(node) {
        switch (node.kind) {
          case 10:
          case 8:
          case 79:
            return true;
        }
        return false;
      }
      function adjustIntersectingElement(element, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta) {
        ts2.Debug.assert(element.end >= changeStart, "Adjusting an element that was entirely before the change range");
        ts2.Debug.assert(element.pos <= changeRangeOldEnd, "Adjusting an element that was entirely after the change range");
        ts2.Debug.assert(element.pos <= element.end);
        var pos = Math.min(element.pos, changeRangeNewEnd);
        var end = element.end >= changeRangeOldEnd ? element.end + delta : Math.min(element.end, changeRangeNewEnd);
        ts2.Debug.assert(pos <= end);
        if (element.parent) {
          ts2.Debug.assertGreaterThanOrEqual(pos, element.parent.pos);
          ts2.Debug.assertLessThanOrEqual(end, element.parent.end);
        }
        ts2.setTextRangePosEnd(element, pos, end);
      }
      function checkNodePositions(node, aggressiveChecks) {
        if (aggressiveChecks) {
          var pos_2 = node.pos;
          var visitNode_1 = function(child) {
            ts2.Debug.assert(child.pos >= pos_2);
            pos_2 = child.end;
          };
          if (ts2.hasJSDocNodes(node)) {
            for (var _i = 0, _a = node.jsDoc; _i < _a.length; _i++) {
              var jsDocComment = _a[_i];
              visitNode_1(jsDocComment);
            }
          }
          forEachChild(node, visitNode_1);
          ts2.Debug.assert(pos_2 <= node.end);
        }
      }
      function updateTokenPositionsAndMarkElements(sourceFile, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta, oldText, newText, aggressiveChecks) {
        visitNode2(sourceFile);
        return;
        function visitNode2(child) {
          ts2.Debug.assert(child.pos <= child.end);
          if (child.pos > changeRangeOldEnd) {
            moveElementEntirelyPastChangeRange(child, false, delta, oldText, newText, aggressiveChecks);
            return;
          }
          var fullEnd = child.end;
          if (fullEnd >= changeStart) {
            child.intersectsChange = true;
            child._children = void 0;
            adjustIntersectingElement(child, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
            forEachChild(child, visitNode2, visitArray);
            if (ts2.hasJSDocNodes(child)) {
              for (var _i = 0, _a = child.jsDoc; _i < _a.length; _i++) {
                var jsDocComment = _a[_i];
                visitNode2(jsDocComment);
              }
            }
            checkNodePositions(child, aggressiveChecks);
            return;
          }
          ts2.Debug.assert(fullEnd < changeStart);
        }
        function visitArray(array) {
          ts2.Debug.assert(array.pos <= array.end);
          if (array.pos > changeRangeOldEnd) {
            moveElementEntirelyPastChangeRange(array, true, delta, oldText, newText, aggressiveChecks);
            return;
          }
          var fullEnd = array.end;
          if (fullEnd >= changeStart) {
            array.intersectsChange = true;
            array._children = void 0;
            adjustIntersectingElement(array, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
            for (var _i = 0, array_10 = array; _i < array_10.length; _i++) {
              var node = array_10[_i];
              visitNode2(node);
            }
            return;
          }
          ts2.Debug.assert(fullEnd < changeStart);
        }
      }
      function extendToAffectedRange(sourceFile, changeRange) {
        var maxLookahead = 1;
        var start = changeRange.span.start;
        for (var i = 0; start > 0 && i <= maxLookahead; i++) {
          var nearestNode = findNearestNodeStartingBeforeOrAtPosition(sourceFile, start);
          ts2.Debug.assert(nearestNode.pos <= start);
          var position = nearestNode.pos;
          start = Math.max(0, position - 1);
        }
        var finalSpan = ts2.createTextSpanFromBounds(start, ts2.textSpanEnd(changeRange.span));
        var finalLength = changeRange.newLength + (changeRange.span.start - start);
        return ts2.createTextChangeRange(finalSpan, finalLength);
      }
      function findNearestNodeStartingBeforeOrAtPosition(sourceFile, position) {
        var bestResult = sourceFile;
        var lastNodeEntirelyBeforePosition;
        forEachChild(sourceFile, visit);
        if (lastNodeEntirelyBeforePosition) {
          var lastChildOfLastEntireNodeBeforePosition = getLastDescendant(lastNodeEntirelyBeforePosition);
          if (lastChildOfLastEntireNodeBeforePosition.pos > bestResult.pos) {
            bestResult = lastChildOfLastEntireNodeBeforePosition;
          }
        }
        return bestResult;
        function getLastDescendant(node) {
          while (true) {
            var lastChild = ts2.getLastChild(node);
            if (lastChild) {
              node = lastChild;
            } else {
              return node;
            }
          }
        }
        function visit(child) {
          if (ts2.nodeIsMissing(child)) {
            return;
          }
          if (child.pos <= position) {
            if (child.pos >= bestResult.pos) {
              bestResult = child;
            }
            if (position < child.end) {
              forEachChild(child, visit);
              return true;
            } else {
              ts2.Debug.assert(child.end <= position);
              lastNodeEntirelyBeforePosition = child;
            }
          } else {
            ts2.Debug.assert(child.pos > position);
            return true;
          }
        }
      }
      function checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks) {
        var oldText = sourceFile.text;
        if (textChangeRange) {
          ts2.Debug.assert(oldText.length - textChangeRange.span.length + textChangeRange.newLength === newText.length);
          if (aggressiveChecks || ts2.Debug.shouldAssert(3)) {
            var oldTextPrefix = oldText.substr(0, textChangeRange.span.start);
            var newTextPrefix = newText.substr(0, textChangeRange.span.start);
            ts2.Debug.assert(oldTextPrefix === newTextPrefix);
            var oldTextSuffix = oldText.substring(ts2.textSpanEnd(textChangeRange.span), oldText.length);
            var newTextSuffix = newText.substring(ts2.textSpanEnd(ts2.textChangeRangeNewSpan(textChangeRange)), newText.length);
            ts2.Debug.assert(oldTextSuffix === newTextSuffix);
          }
        }
      }
      function createSyntaxCursor(sourceFile) {
        var currentArray = sourceFile.statements;
        var currentArrayIndex = 0;
        ts2.Debug.assert(currentArrayIndex < currentArray.length);
        var current = currentArray[currentArrayIndex];
        var lastQueriedPosition = -1;
        return {
          currentNode: function(position) {
            if (position !== lastQueriedPosition) {
              if (current && current.end === position && currentArrayIndex < currentArray.length - 1) {
                currentArrayIndex++;
                current = currentArray[currentArrayIndex];
              }
              if (!current || current.pos !== position) {
                findHighestListElementThatStartsAtPosition(position);
              }
            }
            lastQueriedPosition = position;
            ts2.Debug.assert(!current || current.pos === position);
            return current;
          }
        };
        function findHighestListElementThatStartsAtPosition(position) {
          currentArray = void 0;
          currentArrayIndex = -1;
          current = void 0;
          forEachChild(sourceFile, visitNode2, visitArray);
          return;
          function visitNode2(node) {
            if (position >= node.pos && position < node.end) {
              forEachChild(node, visitNode2, visitArray);
              return true;
            }
            return false;
          }
          function visitArray(array) {
            if (position >= array.pos && position < array.end) {
              for (var i = 0; i < array.length; i++) {
                var child = array[i];
                if (child) {
                  if (child.pos === position) {
                    currentArray = array;
                    currentArrayIndex = i;
                    current = child;
                    return true;
                  } else {
                    if (child.pos < position && position < child.end) {
                      forEachChild(child, visitNode2, visitArray);
                      return true;
                    }
                  }
                }
              }
            }
            return false;
          }
        }
      }
      IncrementalParser2.createSyntaxCursor = createSyntaxCursor;
      var InvalidPosition;
      (function(InvalidPosition2) {
        InvalidPosition2[InvalidPosition2["Value"] = -1] = "Value";
      })(InvalidPosition || (InvalidPosition = {}));
    })(IncrementalParser || (IncrementalParser = {}));
    function isDeclarationFileName(fileName) {
      return ts2.fileExtensionIsOneOf(fileName, [".d.ts", ".d.mts", ".d.cts"]);
    }
    ts2.isDeclarationFileName = isDeclarationFileName;
    function processCommentPragmas(context, sourceText) {
      var pragmas = [];
      for (var _i = 0, _a = ts2.getLeadingCommentRanges(sourceText, 0) || ts2.emptyArray; _i < _a.length; _i++) {
        var range = _a[_i];
        var comment = sourceText.substring(range.pos, range.end);
        extractPragmas(pragmas, range, comment);
      }
      context.pragmas = new ts2.Map();
      for (var _b = 0, pragmas_1 = pragmas; _b < pragmas_1.length; _b++) {
        var pragma = pragmas_1[_b];
        if (context.pragmas.has(pragma.name)) {
          var currentValue = context.pragmas.get(pragma.name);
          if (currentValue instanceof Array) {
            currentValue.push(pragma.args);
          } else {
            context.pragmas.set(pragma.name, [currentValue, pragma.args]);
          }
          continue;
        }
        context.pragmas.set(pragma.name, pragma.args);
      }
    }
    ts2.processCommentPragmas = processCommentPragmas;
    function processPragmasIntoFields(context, reportDiagnostic) {
      context.checkJsDirective = void 0;
      context.referencedFiles = [];
      context.typeReferenceDirectives = [];
      context.libReferenceDirectives = [];
      context.amdDependencies = [];
      context.hasNoDefaultLib = false;
      context.pragmas.forEach(function(entryOrList, key) {
        switch (key) {
          case "reference": {
            var referencedFiles_1 = context.referencedFiles;
            var typeReferenceDirectives_1 = context.typeReferenceDirectives;
            var libReferenceDirectives_1 = context.libReferenceDirectives;
            ts2.forEach(ts2.toArray(entryOrList), function(arg) {
              var _a = arg.arguments, types = _a.types, lib = _a.lib, path = _a.path;
              if (arg.arguments["no-default-lib"]) {
                context.hasNoDefaultLib = true;
              } else if (types) {
                typeReferenceDirectives_1.push({ pos: types.pos, end: types.end, fileName: types.value });
              } else if (lib) {
                libReferenceDirectives_1.push({ pos: lib.pos, end: lib.end, fileName: lib.value });
              } else if (path) {
                referencedFiles_1.push({ pos: path.pos, end: path.end, fileName: path.value });
              } else {
                reportDiagnostic(arg.range.pos, arg.range.end - arg.range.pos, ts2.Diagnostics.Invalid_reference_directive_syntax);
              }
            });
            break;
          }
          case "amd-dependency": {
            context.amdDependencies = ts2.map(ts2.toArray(entryOrList), function(x) {
              return { name: x.arguments.name, path: x.arguments.path };
            });
            break;
          }
          case "amd-module": {
            if (entryOrList instanceof Array) {
              for (var _i = 0, entryOrList_1 = entryOrList; _i < entryOrList_1.length; _i++) {
                var entry = entryOrList_1[_i];
                if (context.moduleName) {
                  reportDiagnostic(entry.range.pos, entry.range.end - entry.range.pos, ts2.Diagnostics.An_AMD_module_cannot_have_multiple_name_assignments);
                }
                context.moduleName = entry.arguments.name;
              }
            } else {
              context.moduleName = entryOrList.arguments.name;
            }
            break;
          }
          case "ts-nocheck":
          case "ts-check": {
            ts2.forEach(ts2.toArray(entryOrList), function(entry2) {
              if (!context.checkJsDirective || entry2.range.pos > context.checkJsDirective.pos) {
                context.checkJsDirective = {
                  enabled: key === "ts-check",
                  end: entry2.range.end,
                  pos: entry2.range.pos
                };
              }
            });
            break;
          }
          case "jsx":
          case "jsxfrag":
          case "jsximportsource":
          case "jsxruntime":
            return;
          default:
            ts2.Debug.fail("Unhandled pragma kind");
        }
      });
    }
    ts2.processPragmasIntoFields = processPragmasIntoFields;
    var namedArgRegExCache = new ts2.Map();
    function getNamedArgRegEx(name) {
      if (namedArgRegExCache.has(name)) {
        return namedArgRegExCache.get(name);
      }
      var result = new RegExp("(\\s".concat(name, `\\s*=\\s*)(?:(?:'([^']*)')|(?:"([^"]*)"))`), "im");
      namedArgRegExCache.set(name, result);
      return result;
    }
    var tripleSlashXMLCommentStartRegEx = /^\/\/\/\s*<(\S+)\s.*?\/>/im;
    var singleLinePragmaRegEx = /^\/\/\/?\s*@(\S+)\s*(.*)\s*$/im;
    function extractPragmas(pragmas, range, text) {
      var tripleSlash = range.kind === 2 && tripleSlashXMLCommentStartRegEx.exec(text);
      if (tripleSlash) {
        var name = tripleSlash[1].toLowerCase();
        var pragma = ts2.commentPragmas[name];
        if (!pragma || !(pragma.kind & 1)) {
          return;
        }
        if (pragma.args) {
          var argument = {};
          for (var _i = 0, _a = pragma.args; _i < _a.length; _i++) {
            var arg = _a[_i];
            var matcher = getNamedArgRegEx(arg.name);
            var matchResult = matcher.exec(text);
            if (!matchResult && !arg.optional) {
              return;
            } else if (matchResult) {
              var value = matchResult[2] || matchResult[3];
              if (arg.captureSpan) {
                var startPos = range.pos + matchResult.index + matchResult[1].length + 1;
                argument[arg.name] = {
                  value,
                  pos: startPos,
                  end: startPos + value.length
                };
              } else {
                argument[arg.name] = value;
              }
            }
          }
          pragmas.push({ name, args: { arguments: argument, range } });
        } else {
          pragmas.push({ name, args: { arguments: {}, range } });
        }
        return;
      }
      var singleLine = range.kind === 2 && singleLinePragmaRegEx.exec(text);
      if (singleLine) {
        return addPragmaForMatch(pragmas, range, 2, singleLine);
      }
      if (range.kind === 3) {
        var multiLinePragmaRegEx = /@(\S+)(\s+.*)?$/gim;
        var multiLineMatch = void 0;
        while (multiLineMatch = multiLinePragmaRegEx.exec(text)) {
          addPragmaForMatch(pragmas, range, 4, multiLineMatch);
        }
      }
    }
    function addPragmaForMatch(pragmas, range, kind, match) {
      if (!match)
        return;
      var name = match[1].toLowerCase();
      var pragma = ts2.commentPragmas[name];
      if (!pragma || !(pragma.kind & kind)) {
        return;
      }
      var args = match[2];
      var argument = getNamedPragmaArguments(pragma, args);
      if (argument === "fail")
        return;
      pragmas.push({ name, args: { arguments: argument, range } });
      return;
    }
    function getNamedPragmaArguments(pragma, text) {
      if (!text)
        return {};
      if (!pragma.args)
        return {};
      var args = ts2.trimString(text).split(/\s+/);
      var argMap = {};
      for (var i = 0; i < pragma.args.length; i++) {
        var argument = pragma.args[i];
        if (!args[i] && !argument.optional) {
          return "fail";
        }
        if (argument.captureSpan) {
          return ts2.Debug.fail("Capture spans not yet implemented for non-xml pragmas");
        }
        argMap[argument.name] = args[i];
      }
      return argMap;
    }
    function tagNamesAreEquivalent(lhs, rhs) {
      if (lhs.kind !== rhs.kind) {
        return false;
      }
      if (lhs.kind === 79) {
        return lhs.escapedText === rhs.escapedText;
      }
      if (lhs.kind === 108) {
        return true;
      }
      return lhs.name.escapedText === rhs.name.escapedText && tagNamesAreEquivalent(lhs.expression, rhs.expression);
    }
    ts2.tagNamesAreEquivalent = tagNamesAreEquivalent;
  })(ts || (ts = {}));
  (function(ts2) {
    ts2.compileOnSaveCommandLineOption = { name: "compileOnSave", type: "boolean", defaultValueDescription: "false" };
    var jsxOptionMap = new ts2.Map(ts2.getEntries({
      "preserve": 1,
      "react-native": 3,
      "react": 2,
      "react-jsx": 4,
      "react-jsxdev": 5
    }));
    ts2.inverseJsxOptionMap = new ts2.Map(ts2.arrayFrom(ts2.mapIterator(jsxOptionMap.entries(), function(_a) {
      var key = _a[0], value = _a[1];
      return ["" + value, key];
    })));
    var libEntries = [
      ["es5", "lib.es5.d.ts"],
      ["es6", "lib.es2015.d.ts"],
      ["es2015", "lib.es2015.d.ts"],
      ["es7", "lib.es2016.d.ts"],
      ["es2016", "lib.es2016.d.ts"],
      ["es2017", "lib.es2017.d.ts"],
      ["es2018", "lib.es2018.d.ts"],
      ["es2019", "lib.es2019.d.ts"],
      ["es2020", "lib.es2020.d.ts"],
      ["es2021", "lib.es2021.d.ts"],
      ["esnext", "lib.esnext.d.ts"],
      ["dom", "lib.dom.d.ts"],
      ["dom.iterable", "lib.dom.iterable.d.ts"],
      ["webworker", "lib.webworker.d.ts"],
      ["webworker.importscripts", "lib.webworker.importscripts.d.ts"],
      ["webworker.iterable", "lib.webworker.iterable.d.ts"],
      ["scripthost", "lib.scripthost.d.ts"],
      ["es2015.core", "lib.es2015.core.d.ts"],
      ["es2015.collection", "lib.es2015.collection.d.ts"],
      ["es2015.generator", "lib.es2015.generator.d.ts"],
      ["es2015.iterable", "lib.es2015.iterable.d.ts"],
      ["es2015.promise", "lib.es2015.promise.d.ts"],
      ["es2015.proxy", "lib.es2015.proxy.d.ts"],
      ["es2015.reflect", "lib.es2015.reflect.d.ts"],
      ["es2015.symbol", "lib.es2015.symbol.d.ts"],
      ["es2015.symbol.wellknown", "lib.es2015.symbol.wellknown.d.ts"],
      ["es2016.array.include", "lib.es2016.array.include.d.ts"],
      ["es2017.object", "lib.es2017.object.d.ts"],
      ["es2017.sharedmemory", "lib.es2017.sharedmemory.d.ts"],
      ["es2017.string", "lib.es2017.string.d.ts"],
      ["es2017.intl", "lib.es2017.intl.d.ts"],
      ["es2017.typedarrays", "lib.es2017.typedarrays.d.ts"],
      ["es2018.asyncgenerator", "lib.es2018.asyncgenerator.d.ts"],
      ["es2018.asynciterable", "lib.es2018.asynciterable.d.ts"],
      ["es2018.intl", "lib.es2018.intl.d.ts"],
      ["es2018.promise", "lib.es2018.promise.d.ts"],
      ["es2018.regexp", "lib.es2018.regexp.d.ts"],
      ["es2019.array", "lib.es2019.array.d.ts"],
      ["es2019.object", "lib.es2019.object.d.ts"],
      ["es2019.string", "lib.es2019.string.d.ts"],
      ["es2019.symbol", "lib.es2019.symbol.d.ts"],
      ["es2020.bigint", "lib.es2020.bigint.d.ts"],
      ["es2020.promise", "lib.es2020.promise.d.ts"],
      ["es2020.sharedmemory", "lib.es2020.sharedmemory.d.ts"],
      ["es2020.string", "lib.es2020.string.d.ts"],
      ["es2020.symbol.wellknown", "lib.es2020.symbol.wellknown.d.ts"],
      ["es2020.intl", "lib.es2020.intl.d.ts"],
      ["es2021.promise", "lib.es2021.promise.d.ts"],
      ["es2021.string", "lib.es2021.string.d.ts"],
      ["es2021.weakref", "lib.es2021.weakref.d.ts"],
      ["es2021.intl", "lib.es2021.intl.d.ts"],
      ["esnext.array", "lib.es2019.array.d.ts"],
      ["esnext.symbol", "lib.es2019.symbol.d.ts"],
      ["esnext.asynciterable", "lib.es2018.asynciterable.d.ts"],
      ["esnext.intl", "lib.esnext.intl.d.ts"],
      ["esnext.bigint", "lib.es2020.bigint.d.ts"],
      ["esnext.string", "lib.es2021.string.d.ts"],
      ["esnext.promise", "lib.es2021.promise.d.ts"],
      ["esnext.weakref", "lib.es2021.weakref.d.ts"]
    ];
    ts2.libs = libEntries.map(function(entry) {
      return entry[0];
    });
    ts2.libMap = new ts2.Map(libEntries);
    ts2.optionsForWatch = [
      {
        name: "watchFile",
        type: new ts2.Map(ts2.getEntries({
          fixedpollinginterval: ts2.WatchFileKind.FixedPollingInterval,
          prioritypollinginterval: ts2.WatchFileKind.PriorityPollingInterval,
          dynamicprioritypolling: ts2.WatchFileKind.DynamicPriorityPolling,
          fixedchunksizepolling: ts2.WatchFileKind.FixedChunkSizePolling,
          usefsevents: ts2.WatchFileKind.UseFsEvents,
          usefseventsonparentdirectory: ts2.WatchFileKind.UseFsEventsOnParentDirectory
        })),
        category: ts2.Diagnostics.Watch_and_Build_Modes,
        description: ts2.Diagnostics.Specify_how_the_TypeScript_watch_mode_works
      },
      {
        name: "watchDirectory",
        type: new ts2.Map(ts2.getEntries({
          usefsevents: ts2.WatchDirectoryKind.UseFsEvents,
          fixedpollinginterval: ts2.WatchDirectoryKind.FixedPollingInterval,
          dynamicprioritypolling: ts2.WatchDirectoryKind.DynamicPriorityPolling,
          fixedchunksizepolling: ts2.WatchDirectoryKind.FixedChunkSizePolling
        })),
        category: ts2.Diagnostics.Watch_and_Build_Modes,
        description: ts2.Diagnostics.Specify_how_directories_are_watched_on_systems_that_lack_recursive_file_watching_functionality
      },
      {
        name: "fallbackPolling",
        type: new ts2.Map(ts2.getEntries({
          fixedinterval: ts2.PollingWatchKind.FixedInterval,
          priorityinterval: ts2.PollingWatchKind.PriorityInterval,
          dynamicpriority: ts2.PollingWatchKind.DynamicPriority,
          fixedchunksize: ts2.PollingWatchKind.FixedChunkSize
        })),
        category: ts2.Diagnostics.Watch_and_Build_Modes,
        description: ts2.Diagnostics.Specify_what_approach_the_watcher_should_use_if_the_system_runs_out_of_native_file_watchers
      },
      {
        name: "synchronousWatchDirectory",
        type: "boolean",
        category: ts2.Diagnostics.Watch_and_Build_Modes,
        description: ts2.Diagnostics.Synchronously_call_callbacks_and_update_the_state_of_directory_watchers_on_platforms_that_don_t_support_recursive_watching_natively,
        defaultValueDescription: "false"
      },
      {
        name: "excludeDirectories",
        type: "list",
        element: {
          name: "excludeDirectory",
          type: "string",
          isFilePath: true,
          extraValidation: specToDiagnostic
        },
        category: ts2.Diagnostics.Watch_and_Build_Modes,
        description: ts2.Diagnostics.Remove_a_list_of_directories_from_the_watch_process
      },
      {
        name: "excludeFiles",
        type: "list",
        element: {
          name: "excludeFile",
          type: "string",
          isFilePath: true,
          extraValidation: specToDiagnostic
        },
        category: ts2.Diagnostics.Watch_and_Build_Modes,
        description: ts2.Diagnostics.Remove_a_list_of_files_from_the_watch_mode_s_processing
      }
    ];
    ts2.commonOptionsWithBuild = [
      {
        name: "help",
        shortName: "h",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Print_this_message,
        defaultValueDescription: "false"
      },
      {
        name: "help",
        shortName: "?",
        type: "boolean",
        defaultValueDescription: "false"
      },
      {
        name: "watch",
        shortName: "w",
        type: "boolean",
        showInSimplifiedHelpView: true,
        isCommandLineOnly: true,
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Watch_input_files,
        defaultValueDescription: "false"
      },
      {
        name: "preserveWatchOutput",
        type: "boolean",
        showInSimplifiedHelpView: false,
        category: ts2.Diagnostics.Output_Formatting,
        description: ts2.Diagnostics.Disable_wiping_the_console_in_watch_mode,
        defaultValueDescription: "false"
      },
      {
        name: "listFiles",
        type: "boolean",
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Print_all_of_the_files_read_during_the_compilation,
        defaultValueDescription: "false"
      },
      {
        name: "explainFiles",
        type: "boolean",
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Print_files_read_during_the_compilation_including_why_it_was_included,
        defaultValueDescription: "false"
      },
      {
        name: "listEmittedFiles",
        type: "boolean",
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Print_the_names_of_emitted_files_after_a_compilation,
        defaultValueDescription: "false"
      },
      {
        name: "pretty",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Output_Formatting,
        description: ts2.Diagnostics.Enable_color_and_formatting_in_TypeScript_s_output_to_make_compiler_errors_easier_to_read,
        defaultValueDescription: "true"
      },
      {
        name: "traceResolution",
        type: "boolean",
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Log_paths_used_during_the_moduleResolution_process,
        defaultValueDescription: "false"
      },
      {
        name: "diagnostics",
        type: "boolean",
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Output_compiler_performance_information_after_building,
        defaultValueDescription: "false"
      },
      {
        name: "extendedDiagnostics",
        type: "boolean",
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Output_more_detailed_compiler_performance_information_after_building,
        defaultValueDescription: "false"
      },
      {
        name: "generateCpuProfile",
        type: "string",
        isFilePath: true,
        paramType: ts2.Diagnostics.FILE_OR_DIRECTORY,
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Emit_a_v8_CPU_profile_of_the_compiler_run_for_debugging,
        defaultValueDescription: "profile.cpuprofile"
      },
      {
        name: "generateTrace",
        type: "string",
        isFilePath: true,
        isCommandLineOnly: true,
        paramType: ts2.Diagnostics.DIRECTORY,
        category: ts2.Diagnostics.Compiler_Diagnostics,
        description: ts2.Diagnostics.Generates_an_event_trace_and_a_list_of_types
      },
      {
        name: "incremental",
        shortName: "i",
        type: "boolean",
        category: ts2.Diagnostics.Projects,
        description: ts2.Diagnostics.Enable_incremental_compilation,
        transpileOptionValue: void 0,
        defaultValueDescription: ts2.Diagnostics.false_unless_composite_is_set
      },
      {
        name: "assumeChangesOnlyAffectDirectDependencies",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        affectsEmit: true,
        category: ts2.Diagnostics.Watch_and_Build_Modes,
        description: ts2.Diagnostics.Have_recompiles_in_projects_that_use_incremental_and_watch_mode_assume_that_changes_within_a_file_will_only_affect_files_directly_depending_on_it,
        defaultValueDescription: "false"
      },
      {
        name: "locale",
        type: "string",
        category: ts2.Diagnostics.Command_line_Options,
        isCommandLineOnly: true,
        description: ts2.Diagnostics.Set_the_language_of_the_messaging_from_TypeScript_This_does_not_affect_emit,
        defaultValueDescription: ts2.Diagnostics.Platform_specific
      }
    ];
    ts2.targetOptionDeclaration = {
      name: "target",
      shortName: "t",
      type: new ts2.Map(ts2.getEntries({
        es3: 0,
        es5: 1,
        es6: 2,
        es2015: 2,
        es2016: 3,
        es2017: 4,
        es2018: 5,
        es2019: 6,
        es2020: 7,
        es2021: 8,
        esnext: 99
      })),
      affectsSourceFile: true,
      affectsModuleResolution: true,
      affectsEmit: true,
      paramType: ts2.Diagnostics.VERSION,
      showInSimplifiedHelpView: true,
      category: ts2.Diagnostics.Language_and_Environment,
      description: ts2.Diagnostics.Set_the_JavaScript_language_version_for_emitted_JavaScript_and_include_compatible_library_declarations,
      defaultValueDescription: "ES3"
    };
    var commandOptionsWithoutBuild = [
      {
        name: "all",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Show_all_compiler_options,
        defaultValueDescription: "false"
      },
      {
        name: "version",
        shortName: "v",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Print_the_compiler_s_version,
        defaultValueDescription: "false"
      },
      {
        name: "init",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file,
        defaultValueDescription: "false"
      },
      {
        name: "project",
        shortName: "p",
        type: "string",
        isFilePath: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Command_line_Options,
        paramType: ts2.Diagnostics.FILE_OR_DIRECTORY,
        description: ts2.Diagnostics.Compile_the_project_given_the_path_to_its_configuration_file_or_to_a_folder_with_a_tsconfig_json
      },
      {
        name: "build",
        type: "boolean",
        shortName: "b",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Build_one_or_more_projects_and_their_dependencies_if_out_of_date,
        defaultValueDescription: "false"
      },
      {
        name: "showConfig",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Command_line_Options,
        isCommandLineOnly: true,
        description: ts2.Diagnostics.Print_the_final_configuration_instead_of_building,
        defaultValueDescription: "false"
      },
      {
        name: "listFilesOnly",
        type: "boolean",
        category: ts2.Diagnostics.Command_line_Options,
        affectsSemanticDiagnostics: true,
        affectsEmit: true,
        isCommandLineOnly: true,
        description: ts2.Diagnostics.Print_names_of_files_that_are_part_of_the_compilation_and_then_stop_processing,
        defaultValueDescription: "false"
      },
      ts2.targetOptionDeclaration,
      {
        name: "module",
        shortName: "m",
        type: new ts2.Map(ts2.getEntries({
          none: ts2.ModuleKind.None,
          commonjs: ts2.ModuleKind.CommonJS,
          amd: ts2.ModuleKind.AMD,
          system: ts2.ModuleKind.System,
          umd: ts2.ModuleKind.UMD,
          es6: ts2.ModuleKind.ES2015,
          es2015: ts2.ModuleKind.ES2015,
          es2020: ts2.ModuleKind.ES2020,
          es2022: ts2.ModuleKind.ES2022,
          esnext: ts2.ModuleKind.ESNext,
          node12: ts2.ModuleKind.Node12,
          nodenext: ts2.ModuleKind.NodeNext
        })),
        affectsModuleResolution: true,
        affectsEmit: true,
        paramType: ts2.Diagnostics.KIND,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Specify_what_module_code_is_generated
      },
      {
        name: "lib",
        type: "list",
        element: {
          name: "lib",
          type: ts2.libMap
        },
        affectsProgramStructure: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Specify_a_set_of_bundled_library_declaration_files_that_describe_the_target_runtime_environment,
        transpileOptionValue: void 0
      },
      {
        name: "allowJs",
        type: "boolean",
        affectsModuleResolution: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.JavaScript_Support,
        description: ts2.Diagnostics.Allow_JavaScript_files_to_be_a_part_of_your_program_Use_the_checkJS_option_to_get_errors_from_these_files,
        defaultValueDescription: "false"
      },
      {
        name: "checkJs",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.JavaScript_Support,
        description: ts2.Diagnostics.Enable_error_reporting_in_type_checked_JavaScript_files,
        defaultValueDescription: "false"
      },
      {
        name: "jsx",
        type: jsxOptionMap,
        affectsSourceFile: true,
        affectsEmit: true,
        affectsModuleResolution: true,
        paramType: ts2.Diagnostics.KIND,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Specify_what_JSX_code_is_generated,
        defaultValueDescription: "undefined"
      },
      {
        name: "declaration",
        shortName: "d",
        type: "boolean",
        affectsEmit: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        transpileOptionValue: void 0,
        description: ts2.Diagnostics.Generate_d_ts_files_from_TypeScript_and_JavaScript_files_in_your_project,
        defaultValueDescription: ts2.Diagnostics.false_unless_composite_is_set
      },
      {
        name: "declarationMap",
        type: "boolean",
        affectsEmit: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        transpileOptionValue: void 0,
        defaultValueDescription: "false",
        description: ts2.Diagnostics.Create_sourcemaps_for_d_ts_files
      },
      {
        name: "emitDeclarationOnly",
        type: "boolean",
        affectsEmit: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Only_output_d_ts_files_and_not_JavaScript_files,
        transpileOptionValue: void 0,
        defaultValueDescription: "false"
      },
      {
        name: "sourceMap",
        type: "boolean",
        affectsEmit: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        defaultValueDescription: "false",
        description: ts2.Diagnostics.Create_source_map_files_for_emitted_JavaScript_files
      },
      {
        name: "outFile",
        type: "string",
        affectsEmit: true,
        isFilePath: true,
        paramType: ts2.Diagnostics.FILE,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Specify_a_file_that_bundles_all_outputs_into_one_JavaScript_file_If_declaration_is_true_also_designates_a_file_that_bundles_all_d_ts_output,
        transpileOptionValue: void 0
      },
      {
        name: "outDir",
        type: "string",
        affectsEmit: true,
        isFilePath: true,
        paramType: ts2.Diagnostics.DIRECTORY,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Specify_an_output_folder_for_all_emitted_files
      },
      {
        name: "rootDir",
        type: "string",
        affectsEmit: true,
        isFilePath: true,
        paramType: ts2.Diagnostics.LOCATION,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Specify_the_root_folder_within_your_source_files,
        defaultValueDescription: ts2.Diagnostics.Computed_from_the_list_of_input_files
      },
      {
        name: "composite",
        type: "boolean",
        affectsEmit: true,
        isTSConfigOnly: true,
        category: ts2.Diagnostics.Projects,
        transpileOptionValue: void 0,
        defaultValueDescription: "false",
        description: ts2.Diagnostics.Enable_constraints_that_allow_a_TypeScript_project_to_be_used_with_project_references
      },
      {
        name: "tsBuildInfoFile",
        type: "string",
        affectsEmit: true,
        isFilePath: true,
        paramType: ts2.Diagnostics.FILE,
        category: ts2.Diagnostics.Projects,
        transpileOptionValue: void 0,
        defaultValueDescription: ".tsbuildinfo",
        description: ts2.Diagnostics.Specify_the_folder_for_tsbuildinfo_incremental_compilation_files
      },
      {
        name: "removeComments",
        type: "boolean",
        affectsEmit: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        defaultValueDescription: "false",
        description: ts2.Diagnostics.Disable_emitting_comments
      },
      {
        name: "noEmit",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Disable_emitting_files_from_a_compilation,
        transpileOptionValue: void 0,
        defaultValueDescription: "false"
      },
      {
        name: "importHelpers",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Allow_importing_helper_functions_from_tslib_once_per_project_instead_of_including_them_per_file,
        defaultValueDescription: "false"
      },
      {
        name: "importsNotUsedAsValues",
        type: new ts2.Map(ts2.getEntries({
          remove: 0,
          preserve: 1,
          error: 2
        })),
        affectsEmit: true,
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Specify_emit_Slashchecking_behavior_for_imports_that_are_only_used_for_types
      },
      {
        name: "downlevelIteration",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Emit_more_compliant_but_verbose_and_less_performant_JavaScript_for_iteration,
        defaultValueDescription: "false"
      },
      {
        name: "isolatedModules",
        type: "boolean",
        category: ts2.Diagnostics.Interop_Constraints,
        description: ts2.Diagnostics.Ensure_that_each_file_can_be_safely_transpiled_without_relying_on_other_imports,
        transpileOptionValue: true,
        defaultValueDescription: "false"
      },
      {
        name: "strict",
        type: "boolean",
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Enable_all_strict_type_checking_options,
        defaultValueDescription: "false"
      },
      {
        name: "noImplicitAny",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Enable_error_reporting_for_expressions_and_declarations_with_an_implied_any_type,
        defaultValueDescription: ts2.Diagnostics.false_unless_strict_is_set
      },
      {
        name: "strictNullChecks",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.When_type_checking_take_into_account_null_and_undefined,
        defaultValueDescription: ts2.Diagnostics.false_unless_strict_is_set
      },
      {
        name: "strictFunctionTypes",
        type: "boolean",
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.When_assigning_functions_check_to_ensure_parameters_and_the_return_values_are_subtype_compatible,
        defaultValueDescription: ts2.Diagnostics.false_unless_strict_is_set
      },
      {
        name: "strictBindCallApply",
        type: "boolean",
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Check_that_the_arguments_for_bind_call_and_apply_methods_match_the_original_function,
        defaultValueDescription: ts2.Diagnostics.false_unless_strict_is_set
      },
      {
        name: "strictPropertyInitialization",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Check_for_class_properties_that_are_declared_but_not_set_in_the_constructor,
        defaultValueDescription: ts2.Diagnostics.false_unless_strict_is_set
      },
      {
        name: "noImplicitThis",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Enable_error_reporting_when_this_is_given_the_type_any,
        defaultValueDescription: ts2.Diagnostics.false_unless_strict_is_set
      },
      {
        name: "useUnknownInCatchVariables",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Type_catch_clause_variables_as_unknown_instead_of_any,
        defaultValueDescription: "false"
      },
      {
        name: "alwaysStrict",
        type: "boolean",
        affectsSourceFile: true,
        strictFlag: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Ensure_use_strict_is_always_emitted,
        defaultValueDescription: ts2.Diagnostics.false_unless_strict_is_set
      },
      {
        name: "noUnusedLocals",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Enable_error_reporting_when_a_local_variables_aren_t_read,
        defaultValueDescription: "false"
      },
      {
        name: "noUnusedParameters",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Raise_an_error_when_a_function_parameter_isn_t_read,
        defaultValueDescription: "false"
      },
      {
        name: "exactOptionalPropertyTypes",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Interpret_optional_property_types_as_written_rather_than_adding_undefined,
        defaultValueDescription: "false"
      },
      {
        name: "noImplicitReturns",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Enable_error_reporting_for_codepaths_that_do_not_explicitly_return_in_a_function,
        defaultValueDescription: "false"
      },
      {
        name: "noFallthroughCasesInSwitch",
        type: "boolean",
        affectsBindDiagnostics: true,
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Enable_error_reporting_for_fallthrough_cases_in_switch_statements,
        defaultValueDescription: "false"
      },
      {
        name: "noUncheckedIndexedAccess",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Include_undefined_in_index_signature_results,
        defaultValueDescription: "false"
      },
      {
        name: "noImplicitOverride",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Ensure_overriding_members_in_derived_classes_are_marked_with_an_override_modifier,
        defaultValueDescription: "false"
      },
      {
        name: "noPropertyAccessFromIndexSignature",
        type: "boolean",
        showInSimplifiedHelpView: false,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Enforces_using_indexed_accessors_for_keys_declared_using_an_indexed_type,
        defaultValueDescription: "false"
      },
      {
        name: "moduleResolution",
        type: new ts2.Map(ts2.getEntries({
          node: ts2.ModuleResolutionKind.NodeJs,
          classic: ts2.ModuleResolutionKind.Classic,
          node12: ts2.ModuleResolutionKind.Node12,
          nodenext: ts2.ModuleResolutionKind.NodeNext
        })),
        affectsModuleResolution: true,
        paramType: ts2.Diagnostics.STRATEGY,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Specify_how_TypeScript_looks_up_a_file_from_a_given_module_specifier,
        defaultValueDescription: ts2.Diagnostics.module_AMD_or_UMD_or_System_or_ES6_then_Classic_Otherwise_Node
      },
      {
        name: "baseUrl",
        type: "string",
        affectsModuleResolution: true,
        isFilePath: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Specify_the_base_directory_to_resolve_non_relative_module_names
      },
      {
        name: "paths",
        type: "object",
        affectsModuleResolution: true,
        isTSConfigOnly: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Specify_a_set_of_entries_that_re_map_imports_to_additional_lookup_locations,
        transpileOptionValue: void 0
      },
      {
        name: "rootDirs",
        type: "list",
        isTSConfigOnly: true,
        element: {
          name: "rootDirs",
          type: "string",
          isFilePath: true
        },
        affectsModuleResolution: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Allow_multiple_folders_to_be_treated_as_one_when_resolving_modules,
        transpileOptionValue: void 0,
        defaultValueDescription: ts2.Diagnostics.Computed_from_the_list_of_input_files
      },
      {
        name: "typeRoots",
        type: "list",
        element: {
          name: "typeRoots",
          type: "string",
          isFilePath: true
        },
        affectsModuleResolution: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Specify_multiple_folders_that_act_like_Slashnode_modules_Slash_types
      },
      {
        name: "types",
        type: "list",
        element: {
          name: "types",
          type: "string"
        },
        affectsProgramStructure: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Specify_type_package_names_to_be_included_without_being_referenced_in_a_source_file,
        transpileOptionValue: void 0
      },
      {
        name: "allowSyntheticDefaultImports",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Interop_Constraints,
        description: ts2.Diagnostics.Allow_import_x_from_y_when_a_module_doesn_t_have_a_default_export,
        defaultValueDescription: ts2.Diagnostics.module_system_or_esModuleInterop
      },
      {
        name: "esModuleInterop",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        affectsEmit: true,
        showInSimplifiedHelpView: true,
        category: ts2.Diagnostics.Interop_Constraints,
        description: ts2.Diagnostics.Emit_additional_JavaScript_to_ease_support_for_importing_CommonJS_modules_This_enables_allowSyntheticDefaultImports_for_type_compatibility,
        defaultValueDescription: "false"
      },
      {
        name: "preserveSymlinks",
        type: "boolean",
        category: ts2.Diagnostics.Interop_Constraints,
        description: ts2.Diagnostics.Disable_resolving_symlinks_to_their_realpath_This_correlates_to_the_same_flag_in_node,
        defaultValueDescription: "false"
      },
      {
        name: "allowUmdGlobalAccess",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Allow_accessing_UMD_globals_from_modules,
        defaultValueDescription: "false"
      },
      {
        name: "sourceRoot",
        type: "string",
        affectsEmit: true,
        paramType: ts2.Diagnostics.LOCATION,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Specify_the_root_path_for_debuggers_to_find_the_reference_source_code
      },
      {
        name: "mapRoot",
        type: "string",
        affectsEmit: true,
        paramType: ts2.Diagnostics.LOCATION,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations
      },
      {
        name: "inlineSourceMap",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Include_sourcemap_files_inside_the_emitted_JavaScript,
        defaultValueDescription: "false"
      },
      {
        name: "inlineSources",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Include_source_code_in_the_sourcemaps_inside_the_emitted_JavaScript,
        defaultValueDescription: "false"
      },
      {
        name: "experimentalDecorators",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Enable_experimental_support_for_TC39_stage_2_draft_decorators,
        defaultValueDescription: "false"
      },
      {
        name: "emitDecoratorMetadata",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        affectsEmit: true,
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Emit_design_type_metadata_for_decorated_declarations_in_source_files,
        defaultValueDescription: "false"
      },
      {
        name: "jsxFactory",
        type: "string",
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Specify_the_JSX_factory_function_used_when_targeting_React_JSX_emit_e_g_React_createElement_or_h,
        defaultValueDescription: "`React.createElement`"
      },
      {
        name: "jsxFragmentFactory",
        type: "string",
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Specify_the_JSX_Fragment_reference_used_for_fragments_when_targeting_React_JSX_emit_e_g_React_Fragment_or_Fragment
      },
      {
        name: "jsxImportSource",
        type: "string",
        affectsSemanticDiagnostics: true,
        affectsEmit: true,
        affectsModuleResolution: true,
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Specify_module_specifier_used_to_import_the_JSX_factory_functions_when_using_jsx_Colon_react_jsx_Asterisk,
        defaultValueDescription: "react"
      },
      {
        name: "resolveJsonModule",
        type: "boolean",
        affectsModuleResolution: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Enable_importing_json_files,
        defaultValueDescription: "false"
      },
      {
        name: "out",
        type: "string",
        affectsEmit: true,
        isFilePath: false,
        category: ts2.Diagnostics.Backwards_Compatibility,
        paramType: ts2.Diagnostics.FILE,
        transpileOptionValue: void 0,
        description: ts2.Diagnostics.Deprecated_setting_Use_outFile_instead
      },
      {
        name: "reactNamespace",
        type: "string",
        affectsEmit: true,
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Specify_the_object_invoked_for_createElement_This_only_applies_when_targeting_react_JSX_emit,
        defaultValueDescription: "`React`"
      },
      {
        name: "skipDefaultLibCheck",
        type: "boolean",
        category: ts2.Diagnostics.Completeness,
        description: ts2.Diagnostics.Skip_type_checking_d_ts_files_that_are_included_with_TypeScript,
        defaultValueDescription: "false"
      },
      {
        name: "charset",
        type: "string",
        category: ts2.Diagnostics.Backwards_Compatibility,
        description: ts2.Diagnostics.No_longer_supported_In_early_versions_manually_set_the_text_encoding_for_reading_files,
        defaultValueDescription: "utf8"
      },
      {
        name: "emitBOM",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Emit_a_UTF_8_Byte_Order_Mark_BOM_in_the_beginning_of_output_files,
        defaultValueDescription: "false"
      },
      {
        name: "newLine",
        type: new ts2.Map(ts2.getEntries({
          crlf: 0,
          lf: 1
        })),
        affectsEmit: true,
        paramType: ts2.Diagnostics.NEWLINE,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Set_the_newline_character_for_emitting_files,
        defaultValueDescription: ts2.Diagnostics.Platform_specific
      },
      {
        name: "noErrorTruncation",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Output_Formatting,
        description: ts2.Diagnostics.Disable_truncating_types_in_error_messages,
        defaultValueDescription: "false"
      },
      {
        name: "noLib",
        type: "boolean",
        category: ts2.Diagnostics.Language_and_Environment,
        affectsProgramStructure: true,
        description: ts2.Diagnostics.Disable_including_any_library_files_including_the_default_lib_d_ts,
        transpileOptionValue: true,
        defaultValueDescription: "false"
      },
      {
        name: "noResolve",
        type: "boolean",
        affectsModuleResolution: true,
        category: ts2.Diagnostics.Modules,
        description: ts2.Diagnostics.Disallow_import_s_require_s_or_reference_s_from_expanding_the_number_of_files_TypeScript_should_add_to_a_project,
        transpileOptionValue: true,
        defaultValueDescription: "false"
      },
      {
        name: "stripInternal",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Disable_emitting_declarations_that_have_internal_in_their_JSDoc_comments,
        defaultValueDescription: "false"
      },
      {
        name: "disableSizeLimit",
        type: "boolean",
        affectsProgramStructure: true,
        category: ts2.Diagnostics.Editor_Support,
        description: ts2.Diagnostics.Remove_the_20mb_cap_on_total_source_code_size_for_JavaScript_files_in_the_TypeScript_language_server,
        defaultValueDescription: "false"
      },
      {
        name: "disableSourceOfProjectReferenceRedirect",
        type: "boolean",
        isTSConfigOnly: true,
        category: ts2.Diagnostics.Projects,
        description: ts2.Diagnostics.Disable_preferring_source_files_instead_of_declaration_files_when_referencing_composite_projects,
        defaultValueDescription: "false"
      },
      {
        name: "disableSolutionSearching",
        type: "boolean",
        isTSConfigOnly: true,
        category: ts2.Diagnostics.Projects,
        description: ts2.Diagnostics.Opt_a_project_out_of_multi_project_reference_checking_when_editing,
        defaultValueDescription: "false"
      },
      {
        name: "disableReferencedProjectLoad",
        type: "boolean",
        isTSConfigOnly: true,
        category: ts2.Diagnostics.Projects,
        description: ts2.Diagnostics.Reduce_the_number_of_projects_loaded_automatically_by_TypeScript,
        defaultValueDescription: "false"
      },
      {
        name: "noImplicitUseStrict",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Backwards_Compatibility,
        description: ts2.Diagnostics.Disable_adding_use_strict_directives_in_emitted_JavaScript_files,
        defaultValueDescription: "false"
      },
      {
        name: "noEmitHelpers",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Disable_generating_custom_helper_functions_like_extends_in_compiled_output,
        defaultValueDescription: "false"
      },
      {
        name: "noEmitOnError",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        transpileOptionValue: void 0,
        description: ts2.Diagnostics.Disable_emitting_files_if_any_type_checking_errors_are_reported,
        defaultValueDescription: "false"
      },
      {
        name: "preserveConstEnums",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Disable_erasing_const_enum_declarations_in_generated_code,
        defaultValueDescription: "false"
      },
      {
        name: "declarationDir",
        type: "string",
        affectsEmit: true,
        isFilePath: true,
        paramType: ts2.Diagnostics.DIRECTORY,
        category: ts2.Diagnostics.Emit,
        transpileOptionValue: void 0,
        description: ts2.Diagnostics.Specify_the_output_directory_for_generated_declaration_files
      },
      {
        name: "skipLibCheck",
        type: "boolean",
        category: ts2.Diagnostics.Completeness,
        description: ts2.Diagnostics.Skip_type_checking_all_d_ts_files,
        defaultValueDescription: "false"
      },
      {
        name: "allowUnusedLabels",
        type: "boolean",
        affectsBindDiagnostics: true,
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Disable_error_reporting_for_unused_labels,
        defaultValueDescription: "undefined"
      },
      {
        name: "allowUnreachableCode",
        type: "boolean",
        affectsBindDiagnostics: true,
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Type_Checking,
        description: ts2.Diagnostics.Disable_error_reporting_for_unreachable_code,
        defaultValueDescription: "undefined"
      },
      {
        name: "suppressExcessPropertyErrors",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Backwards_Compatibility,
        description: ts2.Diagnostics.Disable_reporting_of_excess_property_errors_during_the_creation_of_object_literals,
        defaultValueDescription: "false"
      },
      {
        name: "suppressImplicitAnyIndexErrors",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Backwards_Compatibility,
        description: ts2.Diagnostics.Suppress_noImplicitAny_errors_when_indexing_objects_that_lack_index_signatures,
        defaultValueDescription: "false"
      },
      {
        name: "forceConsistentCasingInFileNames",
        type: "boolean",
        affectsModuleResolution: true,
        category: ts2.Diagnostics.Interop_Constraints,
        description: ts2.Diagnostics.Ensure_that_casing_is_correct_in_imports,
        defaultValueDescription: "false"
      },
      {
        name: "maxNodeModuleJsDepth",
        type: "number",
        affectsModuleResolution: true,
        category: ts2.Diagnostics.JavaScript_Support,
        description: ts2.Diagnostics.Specify_the_maximum_folder_depth_used_for_checking_JavaScript_files_from_node_modules_Only_applicable_with_allowJs,
        defaultValueDescription: "0"
      },
      {
        name: "noStrictGenericChecks",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        category: ts2.Diagnostics.Backwards_Compatibility,
        description: ts2.Diagnostics.Disable_strict_checking_of_generic_signatures_in_function_types,
        defaultValueDescription: "false"
      },
      {
        name: "useDefineForClassFields",
        type: "boolean",
        affectsSemanticDiagnostics: true,
        affectsEmit: true,
        category: ts2.Diagnostics.Language_and_Environment,
        description: ts2.Diagnostics.Emit_ECMAScript_standard_compliant_class_fields,
        defaultValueDescription: ts2.Diagnostics.true_for_ES2022_and_above_including_ESNext
      },
      {
        name: "preserveValueImports",
        type: "boolean",
        affectsEmit: true,
        category: ts2.Diagnostics.Emit,
        description: ts2.Diagnostics.Preserve_unused_imported_values_in_the_JavaScript_output_that_would_otherwise_be_removed,
        defaultValueDescription: "false"
      },
      {
        name: "keyofStringsOnly",
        type: "boolean",
        category: ts2.Diagnostics.Backwards_Compatibility,
        description: ts2.Diagnostics.Make_keyof_only_return_strings_instead_of_string_numbers_or_symbols_Legacy_option,
        defaultValueDescription: "false"
      },
      {
        name: "plugins",
        type: "list",
        isTSConfigOnly: true,
        element: {
          name: "plugin",
          type: "object"
        },
        description: ts2.Diagnostics.List_of_language_service_plugins,
        category: ts2.Diagnostics.Editor_Support
      }
    ];
    ts2.optionDeclarations = __spreadArray(__spreadArray([], ts2.commonOptionsWithBuild, true), commandOptionsWithoutBuild, true);
    ts2.semanticDiagnosticsOptionDeclarations = ts2.optionDeclarations.filter(function(option) {
      return !!option.affectsSemanticDiagnostics;
    });
    ts2.affectsEmitOptionDeclarations = ts2.optionDeclarations.filter(function(option) {
      return !!option.affectsEmit;
    });
    ts2.moduleResolutionOptionDeclarations = ts2.optionDeclarations.filter(function(option) {
      return !!option.affectsModuleResolution;
    });
    ts2.sourceFileAffectingCompilerOptions = ts2.optionDeclarations.filter(function(option) {
      return !!option.affectsSourceFile || !!option.affectsModuleResolution || !!option.affectsBindDiagnostics;
    });
    ts2.optionsAffectingProgramStructure = ts2.optionDeclarations.filter(function(option) {
      return !!option.affectsProgramStructure;
    });
    ts2.transpileOptionValueCompilerOptions = ts2.optionDeclarations.filter(function(option) {
      return ts2.hasProperty(option, "transpileOptionValue");
    });
    ts2.optionsForBuild = [
      {
        name: "verbose",
        shortName: "v",
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Enable_verbose_logging,
        type: "boolean",
        defaultValueDescription: "false"
      },
      {
        name: "dry",
        shortName: "d",
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Show_what_would_be_built_or_deleted_if_specified_with_clean,
        type: "boolean",
        defaultValueDescription: "false"
      },
      {
        name: "force",
        shortName: "f",
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Build_all_projects_including_those_that_appear_to_be_up_to_date,
        type: "boolean",
        defaultValueDescription: "false"
      },
      {
        name: "clean",
        category: ts2.Diagnostics.Command_line_Options,
        description: ts2.Diagnostics.Delete_the_outputs_of_all_projects,
        type: "boolean",
        defaultValueDescription: "false"
      }
    ];
    ts2.buildOpts = __spreadArray(__spreadArray([], ts2.commonOptionsWithBuild, true), ts2.optionsForBuild, true);
    ts2.typeAcquisitionDeclarations = [
      {
        name: "enableAutoDiscovery",
        type: "boolean",
        defaultValueDescription: "false"
      },
      {
        name: "enable",
        type: "boolean",
        defaultValueDescription: "false"
      },
      {
        name: "include",
        type: "list",
        element: {
          name: "include",
          type: "string"
        }
      },
      {
        name: "exclude",
        type: "list",
        element: {
          name: "exclude",
          type: "string"
        }
      },
      {
        name: "disableFilenameBasedTypeAcquisition",
        type: "boolean",
        defaultValueDescription: "false"
      }
    ];
    function createOptionNameMap(optionDeclarations) {
      var optionsNameMap = new ts2.Map();
      var shortOptionNames = new ts2.Map();
      ts2.forEach(optionDeclarations, function(option) {
        optionsNameMap.set(option.name.toLowerCase(), option);
        if (option.shortName) {
          shortOptionNames.set(option.shortName, option.name);
        }
      });
      return { optionsNameMap, shortOptionNames };
    }
    ts2.createOptionNameMap = createOptionNameMap;
    var optionsNameMapCache;
    function getOptionsNameMap() {
      return optionsNameMapCache || (optionsNameMapCache = createOptionNameMap(ts2.optionDeclarations));
    }
    ts2.getOptionsNameMap = getOptionsNameMap;
    var compilerOptionsAlternateMode = {
      diagnostic: ts2.Diagnostics.Compiler_option_0_may_only_be_used_with_build,
      getOptionsNameMap: getBuildOptionsNameMap
    };
    ts2.defaultInitCompilerOptions = {
      module: ts2.ModuleKind.CommonJS,
      target: 3,
      strict: true,
      esModuleInterop: true,
      forceConsistentCasingInFileNames: true,
      skipLibCheck: true
    };
    function convertEnableAutoDiscoveryToEnable(typeAcquisition) {
      if (typeAcquisition && typeAcquisition.enableAutoDiscovery !== void 0 && typeAcquisition.enable === void 0) {
        return {
          enable: typeAcquisition.enableAutoDiscovery,
          include: typeAcquisition.include || [],
          exclude: typeAcquisition.exclude || []
        };
      }
      return typeAcquisition;
    }
    ts2.convertEnableAutoDiscoveryToEnable = convertEnableAutoDiscoveryToEnable;
    function createCompilerDiagnosticForInvalidCustomType(opt) {
      return createDiagnosticForInvalidCustomType(opt, ts2.createCompilerDiagnostic);
    }
    ts2.createCompilerDiagnosticForInvalidCustomType = createCompilerDiagnosticForInvalidCustomType;
    function createDiagnosticForInvalidCustomType(opt, createDiagnostic) {
      var namesOfType = ts2.arrayFrom(opt.type.keys()).map(function(key) {
        return "'".concat(key, "'");
      }).join(", ");
      return createDiagnostic(ts2.Diagnostics.Argument_for_0_option_must_be_Colon_1, "--".concat(opt.name), namesOfType);
    }
    function parseCustomTypeOption(opt, value, errors) {
      return convertJsonOptionOfCustomType(opt, ts2.trimString(value || ""), errors);
    }
    ts2.parseCustomTypeOption = parseCustomTypeOption;
    function parseListTypeOption(opt, value, errors) {
      if (value === void 0) {
        value = "";
      }
      value = ts2.trimString(value);
      if (ts2.startsWith(value, "-")) {
        return void 0;
      }
      if (value === "") {
        return [];
      }
      var values = value.split(",");
      switch (opt.element.type) {
        case "number":
          return ts2.mapDefined(values, function(v) {
            return validateJsonOptionValue(opt.element, parseInt(v), errors);
          });
        case "string":
          return ts2.mapDefined(values, function(v) {
            return validateJsonOptionValue(opt.element, v || "", errors);
          });
        default:
          return ts2.mapDefined(values, function(v) {
            return parseCustomTypeOption(opt.element, v, errors);
          });
      }
    }
    ts2.parseListTypeOption = parseListTypeOption;
    function getOptionName(option) {
      return option.name;
    }
    function createUnknownOptionError(unknownOption, diagnostics, createDiagnostics, unknownOptionErrorText) {
      var _a;
      if ((_a = diagnostics.alternateMode) === null || _a === void 0 ? void 0 : _a.getOptionsNameMap().optionsNameMap.has(unknownOption.toLowerCase())) {
        return createDiagnostics(diagnostics.alternateMode.diagnostic, unknownOption);
      }
      var possibleOption = ts2.getSpellingSuggestion(unknownOption, diagnostics.optionDeclarations, getOptionName);
      return possibleOption ? createDiagnostics(diagnostics.unknownDidYouMeanDiagnostic, unknownOptionErrorText || unknownOption, possibleOption.name) : createDiagnostics(diagnostics.unknownOptionDiagnostic, unknownOptionErrorText || unknownOption);
    }
    function parseCommandLineWorker(diagnostics, commandLine, readFile) {
      var options = {};
      var watchOptions;
      var fileNames = [];
      var errors = [];
      parseStrings(commandLine);
      return {
        options,
        watchOptions,
        fileNames,
        errors
      };
      function parseStrings(args) {
        var i = 0;
        while (i < args.length) {
          var s = args[i];
          i++;
          if (s.charCodeAt(0) === 64) {
            parseResponseFile(s.slice(1));
          } else if (s.charCodeAt(0) === 45) {
            var inputOptionName = s.slice(s.charCodeAt(1) === 45 ? 2 : 1);
            var opt = getOptionDeclarationFromName(diagnostics.getOptionsNameMap, inputOptionName, true);
            if (opt) {
              i = parseOptionValue(args, i, diagnostics, opt, options, errors);
            } else {
              var watchOpt = getOptionDeclarationFromName(watchOptionsDidYouMeanDiagnostics.getOptionsNameMap, inputOptionName, true);
              if (watchOpt) {
                i = parseOptionValue(args, i, watchOptionsDidYouMeanDiagnostics, watchOpt, watchOptions || (watchOptions = {}), errors);
              } else {
                errors.push(createUnknownOptionError(inputOptionName, diagnostics, ts2.createCompilerDiagnostic, s));
              }
            }
          } else {
            fileNames.push(s);
          }
        }
      }
      function parseResponseFile(fileName) {
        var text = tryReadFile(fileName, readFile || function(fileName2) {
          return ts2.sys.readFile(fileName2);
        });
        if (!ts2.isString(text)) {
          errors.push(text);
          return;
        }
        var args = [];
        var pos = 0;
        while (true) {
          while (pos < text.length && text.charCodeAt(pos) <= 32)
            pos++;
          if (pos >= text.length)
            break;
          var start = pos;
          if (text.charCodeAt(start) === 34) {
            pos++;
            while (pos < text.length && text.charCodeAt(pos) !== 34)
              pos++;
            if (pos < text.length) {
              args.push(text.substring(start + 1, pos));
              pos++;
            } else {
              errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Unterminated_quoted_string_in_response_file_0, fileName));
            }
          } else {
            while (text.charCodeAt(pos) > 32)
              pos++;
            args.push(text.substring(start, pos));
          }
        }
        parseStrings(args);
      }
    }
    ts2.parseCommandLineWorker = parseCommandLineWorker;
    function parseOptionValue(args, i, diagnostics, opt, options, errors) {
      if (opt.isTSConfigOnly) {
        var optValue = args[i];
        if (optValue === "null") {
          options[opt.name] = void 0;
          i++;
        } else if (opt.type === "boolean") {
          if (optValue === "false") {
            options[opt.name] = validateJsonOptionValue(opt, false, errors);
            i++;
          } else {
            if (optValue === "true")
              i++;
            errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_false_or_null_on_command_line, opt.name));
          }
        } else {
          errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Option_0_can_only_be_specified_in_tsconfig_json_file_or_set_to_null_on_command_line, opt.name));
          if (optValue && !ts2.startsWith(optValue, "-"))
            i++;
        }
      } else {
        if (!args[i] && opt.type !== "boolean") {
          errors.push(ts2.createCompilerDiagnostic(diagnostics.optionTypeMismatchDiagnostic, opt.name, getCompilerOptionValueTypeString(opt)));
        }
        if (args[i] !== "null") {
          switch (opt.type) {
            case "number":
              options[opt.name] = validateJsonOptionValue(opt, parseInt(args[i]), errors);
              i++;
              break;
            case "boolean":
              var optValue = args[i];
              options[opt.name] = validateJsonOptionValue(opt, optValue !== "false", errors);
              if (optValue === "false" || optValue === "true") {
                i++;
              }
              break;
            case "string":
              options[opt.name] = validateJsonOptionValue(opt, args[i] || "", errors);
              i++;
              break;
            case "list":
              var result = parseListTypeOption(opt, args[i], errors);
              options[opt.name] = result || [];
              if (result) {
                i++;
              }
              break;
            default:
              options[opt.name] = parseCustomTypeOption(opt, args[i], errors);
              i++;
              break;
          }
        } else {
          options[opt.name] = void 0;
          i++;
        }
      }
      return i;
    }
    ts2.compilerOptionsDidYouMeanDiagnostics = {
      alternateMode: compilerOptionsAlternateMode,
      getOptionsNameMap,
      optionDeclarations: ts2.optionDeclarations,
      unknownOptionDiagnostic: ts2.Diagnostics.Unknown_compiler_option_0,
      unknownDidYouMeanDiagnostic: ts2.Diagnostics.Unknown_compiler_option_0_Did_you_mean_1,
      optionTypeMismatchDiagnostic: ts2.Diagnostics.Compiler_option_0_expects_an_argument
    };
    function parseCommandLine(commandLine, readFile) {
      return parseCommandLineWorker(ts2.compilerOptionsDidYouMeanDiagnostics, commandLine, readFile);
    }
    ts2.parseCommandLine = parseCommandLine;
    function getOptionFromName(optionName, allowShort) {
      return getOptionDeclarationFromName(getOptionsNameMap, optionName, allowShort);
    }
    ts2.getOptionFromName = getOptionFromName;
    function getOptionDeclarationFromName(getOptionNameMap, optionName, allowShort) {
      if (allowShort === void 0) {
        allowShort = false;
      }
      optionName = optionName.toLowerCase();
      var _a = getOptionNameMap(), optionsNameMap = _a.optionsNameMap, shortOptionNames = _a.shortOptionNames;
      if (allowShort) {
        var short = shortOptionNames.get(optionName);
        if (short !== void 0) {
          optionName = short;
        }
      }
      return optionsNameMap.get(optionName);
    }
    var buildOptionsNameMapCache;
    function getBuildOptionsNameMap() {
      return buildOptionsNameMapCache || (buildOptionsNameMapCache = createOptionNameMap(ts2.buildOpts));
    }
    var buildOptionsAlternateMode = {
      diagnostic: ts2.Diagnostics.Compiler_option_0_may_not_be_used_with_build,
      getOptionsNameMap
    };
    var buildOptionsDidYouMeanDiagnostics = {
      alternateMode: buildOptionsAlternateMode,
      getOptionsNameMap: getBuildOptionsNameMap,
      optionDeclarations: ts2.buildOpts,
      unknownOptionDiagnostic: ts2.Diagnostics.Unknown_build_option_0,
      unknownDidYouMeanDiagnostic: ts2.Diagnostics.Unknown_build_option_0_Did_you_mean_1,
      optionTypeMismatchDiagnostic: ts2.Diagnostics.Build_option_0_requires_a_value_of_type_1
    };
    function parseBuildCommand(args) {
      var _a = parseCommandLineWorker(buildOptionsDidYouMeanDiagnostics, args), options = _a.options, watchOptions = _a.watchOptions, projects = _a.fileNames, errors = _a.errors;
      var buildOptions = options;
      if (projects.length === 0) {
        projects.push(".");
      }
      if (buildOptions.clean && buildOptions.force) {
        errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Options_0_and_1_cannot_be_combined, "clean", "force"));
      }
      if (buildOptions.clean && buildOptions.verbose) {
        errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Options_0_and_1_cannot_be_combined, "clean", "verbose"));
      }
      if (buildOptions.clean && buildOptions.watch) {
        errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Options_0_and_1_cannot_be_combined, "clean", "watch"));
      }
      if (buildOptions.watch && buildOptions.dry) {
        errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Options_0_and_1_cannot_be_combined, "watch", "dry"));
      }
      return { buildOptions, watchOptions, projects, errors };
    }
    ts2.parseBuildCommand = parseBuildCommand;
    function getDiagnosticText(_message) {
      var _args = [];
      for (var _i = 1; _i < arguments.length; _i++) {
        _args[_i - 1] = arguments[_i];
      }
      var diagnostic = ts2.createCompilerDiagnostic.apply(void 0, arguments);
      return diagnostic.messageText;
    }
    ts2.getDiagnosticText = getDiagnosticText;
    function getParsedCommandLineOfConfigFile(configFileName, optionsToExtend, host, extendedConfigCache, watchOptionsToExtend, extraFileExtensions) {
      var configFileText = tryReadFile(configFileName, function(fileName) {
        return host.readFile(fileName);
      });
      if (!ts2.isString(configFileText)) {
        host.onUnRecoverableConfigFileDiagnostic(configFileText);
        return void 0;
      }
      var result = ts2.parseJsonText(configFileName, configFileText);
      var cwd = host.getCurrentDirectory();
      result.path = ts2.toPath(configFileName, cwd, ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames));
      result.resolvedPath = result.path;
      result.originalFileName = result.fileName;
      return parseJsonSourceFileConfigFileContent(result, host, ts2.getNormalizedAbsolutePath(ts2.getDirectoryPath(configFileName), cwd), optionsToExtend, ts2.getNormalizedAbsolutePath(configFileName, cwd), void 0, extraFileExtensions, extendedConfigCache, watchOptionsToExtend);
    }
    ts2.getParsedCommandLineOfConfigFile = getParsedCommandLineOfConfigFile;
    function readConfigFile(fileName, readFile) {
      var textOrDiagnostic = tryReadFile(fileName, readFile);
      return ts2.isString(textOrDiagnostic) ? parseConfigFileTextToJson(fileName, textOrDiagnostic) : { config: {}, error: textOrDiagnostic };
    }
    ts2.readConfigFile = readConfigFile;
    function parseConfigFileTextToJson(fileName, jsonText) {
      var jsonSourceFile = ts2.parseJsonText(fileName, jsonText);
      return {
        config: convertConfigFileToObject(jsonSourceFile, jsonSourceFile.parseDiagnostics, false, void 0),
        error: jsonSourceFile.parseDiagnostics.length ? jsonSourceFile.parseDiagnostics[0] : void 0
      };
    }
    ts2.parseConfigFileTextToJson = parseConfigFileTextToJson;
    function readJsonConfigFile(fileName, readFile) {
      var textOrDiagnostic = tryReadFile(fileName, readFile);
      return ts2.isString(textOrDiagnostic) ? ts2.parseJsonText(fileName, textOrDiagnostic) : { fileName, parseDiagnostics: [textOrDiagnostic] };
    }
    ts2.readJsonConfigFile = readJsonConfigFile;
    function tryReadFile(fileName, readFile) {
      var text;
      try {
        text = readFile(fileName);
      } catch (e) {
        return ts2.createCompilerDiagnostic(ts2.Diagnostics.Cannot_read_file_0_Colon_1, fileName, e.message);
      }
      return text === void 0 ? ts2.createCompilerDiagnostic(ts2.Diagnostics.Cannot_read_file_0, fileName) : text;
    }
    ts2.tryReadFile = tryReadFile;
    function commandLineOptionsToMap(options) {
      return ts2.arrayToMap(options, getOptionName);
    }
    var typeAcquisitionDidYouMeanDiagnostics = {
      optionDeclarations: ts2.typeAcquisitionDeclarations,
      unknownOptionDiagnostic: ts2.Diagnostics.Unknown_type_acquisition_option_0,
      unknownDidYouMeanDiagnostic: ts2.Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1
    };
    var watchOptionsNameMapCache;
    function getWatchOptionsNameMap() {
      return watchOptionsNameMapCache || (watchOptionsNameMapCache = createOptionNameMap(ts2.optionsForWatch));
    }
    var watchOptionsDidYouMeanDiagnostics = {
      getOptionsNameMap: getWatchOptionsNameMap,
      optionDeclarations: ts2.optionsForWatch,
      unknownOptionDiagnostic: ts2.Diagnostics.Unknown_watch_option_0,
      unknownDidYouMeanDiagnostic: ts2.Diagnostics.Unknown_watch_option_0_Did_you_mean_1,
      optionTypeMismatchDiagnostic: ts2.Diagnostics.Watch_option_0_requires_a_value_of_type_1
    };
    var commandLineCompilerOptionsMapCache;
    function getCommandLineCompilerOptionsMap() {
      return commandLineCompilerOptionsMapCache || (commandLineCompilerOptionsMapCache = commandLineOptionsToMap(ts2.optionDeclarations));
    }
    var commandLineWatchOptionsMapCache;
    function getCommandLineWatchOptionsMap() {
      return commandLineWatchOptionsMapCache || (commandLineWatchOptionsMapCache = commandLineOptionsToMap(ts2.optionsForWatch));
    }
    var commandLineTypeAcquisitionMapCache;
    function getCommandLineTypeAcquisitionMap() {
      return commandLineTypeAcquisitionMapCache || (commandLineTypeAcquisitionMapCache = commandLineOptionsToMap(ts2.typeAcquisitionDeclarations));
    }
    var _tsconfigRootOptions;
    function getTsconfigRootOptionsMap() {
      if (_tsconfigRootOptions === void 0) {
        _tsconfigRootOptions = {
          name: void 0,
          type: "object",
          elementOptions: commandLineOptionsToMap([
            {
              name: "compilerOptions",
              type: "object",
              elementOptions: getCommandLineCompilerOptionsMap(),
              extraKeyDiagnostics: ts2.compilerOptionsDidYouMeanDiagnostics
            },
            {
              name: "watchOptions",
              type: "object",
              elementOptions: getCommandLineWatchOptionsMap(),
              extraKeyDiagnostics: watchOptionsDidYouMeanDiagnostics
            },
            {
              name: "typingOptions",
              type: "object",
              elementOptions: getCommandLineTypeAcquisitionMap(),
              extraKeyDiagnostics: typeAcquisitionDidYouMeanDiagnostics
            },
            {
              name: "typeAcquisition",
              type: "object",
              elementOptions: getCommandLineTypeAcquisitionMap(),
              extraKeyDiagnostics: typeAcquisitionDidYouMeanDiagnostics
            },
            {
              name: "extends",
              type: "string",
              category: ts2.Diagnostics.File_Management
            },
            {
              name: "references",
              type: "list",
              element: {
                name: "references",
                type: "object"
              },
              category: ts2.Diagnostics.Projects
            },
            {
              name: "files",
              type: "list",
              element: {
                name: "files",
                type: "string"
              },
              category: ts2.Diagnostics.File_Management
            },
            {
              name: "include",
              type: "list",
              element: {
                name: "include",
                type: "string"
              },
              category: ts2.Diagnostics.File_Management,
              defaultValueDescription: ts2.Diagnostics.if_files_is_specified_otherwise_Asterisk_Asterisk_Slash_Asterisk
            },
            {
              name: "exclude",
              type: "list",
              element: {
                name: "exclude",
                type: "string"
              },
              category: ts2.Diagnostics.File_Management,
              defaultValueDescription: ts2.Diagnostics.node_modules_bower_components_jspm_packages_plus_the_value_of_outDir_if_one_is_specified
            },
            ts2.compileOnSaveCommandLineOption
          ])
        };
      }
      return _tsconfigRootOptions;
    }
    function convertConfigFileToObject(sourceFile, errors, reportOptionsErrors, optionsIterator) {
      var _a;
      var rootExpression = (_a = sourceFile.statements[0]) === null || _a === void 0 ? void 0 : _a.expression;
      var knownRootOptions = reportOptionsErrors ? getTsconfigRootOptionsMap() : void 0;
      if (rootExpression && rootExpression.kind !== 204) {
        errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, rootExpression, ts2.Diagnostics.The_root_value_of_a_0_file_must_be_an_object, ts2.getBaseFileName(sourceFile.fileName) === "jsconfig.json" ? "jsconfig.json" : "tsconfig.json"));
        if (ts2.isArrayLiteralExpression(rootExpression)) {
          var firstObject = ts2.find(rootExpression.elements, ts2.isObjectLiteralExpression);
          if (firstObject) {
            return convertToObjectWorker(sourceFile, firstObject, errors, true, knownRootOptions, optionsIterator);
          }
        }
        return {};
      }
      return convertToObjectWorker(sourceFile, rootExpression, errors, true, knownRootOptions, optionsIterator);
    }
    function convertToObject(sourceFile, errors) {
      var _a;
      return convertToObjectWorker(sourceFile, (_a = sourceFile.statements[0]) === null || _a === void 0 ? void 0 : _a.expression, errors, true, void 0, void 0);
    }
    ts2.convertToObject = convertToObject;
    function convertToObjectWorker(sourceFile, rootExpression, errors, returnValue, knownRootOptions, jsonConversionNotifier) {
      if (!rootExpression) {
        return returnValue ? {} : void 0;
      }
      return convertPropertyValueToJson(rootExpression, knownRootOptions);
      function isRootOptionMap(knownOptions) {
        return knownRootOptions && knownRootOptions.elementOptions === knownOptions;
      }
      function convertObjectLiteralExpressionToJson(node, knownOptions, extraKeyDiagnostics, parentOption) {
        var result = returnValue ? {} : void 0;
        var _loop_4 = function(element2) {
          if (element2.kind !== 294) {
            errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, element2, ts2.Diagnostics.Property_assignment_expected));
            return "continue";
          }
          if (element2.questionToken) {
            errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, element2.questionToken, ts2.Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, "?"));
          }
          if (!isDoubleQuotedString(element2.name)) {
            errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, element2.name, ts2.Diagnostics.String_literal_with_double_quotes_expected));
          }
          var textOfKey = ts2.isComputedNonLiteralName(element2.name) ? void 0 : ts2.getTextOfPropertyName(element2.name);
          var keyText = textOfKey && ts2.unescapeLeadingUnderscores(textOfKey);
          var option = keyText && knownOptions ? knownOptions.get(keyText) : void 0;
          if (keyText && extraKeyDiagnostics && !option) {
            if (knownOptions) {
              errors.push(createUnknownOptionError(keyText, extraKeyDiagnostics, function(message, arg0, arg1) {
                return ts2.createDiagnosticForNodeInSourceFile(sourceFile, element2.name, message, arg0, arg1);
              }));
            } else {
              errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, element2.name, extraKeyDiagnostics.unknownOptionDiagnostic, keyText));
            }
          }
          var value = convertPropertyValueToJson(element2.initializer, option);
          if (typeof keyText !== "undefined") {
            if (returnValue) {
              result[keyText] = value;
            }
            if (jsonConversionNotifier && (parentOption || isRootOptionMap(knownOptions))) {
              var isValidOptionValue = isCompilerOptionsValue(option, value);
              if (parentOption) {
                if (isValidOptionValue) {
                  jsonConversionNotifier.onSetValidOptionKeyValueInParent(parentOption, option, value);
                }
              } else if (isRootOptionMap(knownOptions)) {
                if (isValidOptionValue) {
                  jsonConversionNotifier.onSetValidOptionKeyValueInRoot(keyText, element2.name, value, element2.initializer);
                } else if (!option) {
                  jsonConversionNotifier.onSetUnknownOptionKeyValueInRoot(keyText, element2.name, value, element2.initializer);
                }
              }
            }
          }
        };
        for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
          var element = _a[_i];
          _loop_4(element);
        }
        return result;
      }
      function convertArrayLiteralExpressionToJson(elements, elementOption) {
        if (!returnValue) {
          elements.forEach(function(element) {
            return convertPropertyValueToJson(element, elementOption);
          });
          return void 0;
        }
        return ts2.filter(elements.map(function(element) {
          return convertPropertyValueToJson(element, elementOption);
        }), function(v) {
          return v !== void 0;
        });
      }
      function convertPropertyValueToJson(valueExpression, option) {
        var invalidReported;
        switch (valueExpression.kind) {
          case 110:
            reportInvalidOptionValue(option && option.type !== "boolean");
            return validateValue(true);
          case 95:
            reportInvalidOptionValue(option && option.type !== "boolean");
            return validateValue(false);
          case 104:
            reportInvalidOptionValue(option && option.name === "extends");
            return validateValue(null);
          case 10:
            if (!isDoubleQuotedString(valueExpression)) {
              errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, valueExpression, ts2.Diagnostics.String_literal_with_double_quotes_expected));
            }
            reportInvalidOptionValue(option && (ts2.isString(option.type) && option.type !== "string"));
            var text = valueExpression.text;
            if (option && !ts2.isString(option.type)) {
              var customOption = option;
              if (!customOption.type.has(text.toLowerCase())) {
                errors.push(createDiagnosticForInvalidCustomType(customOption, function(message, arg0, arg1) {
                  return ts2.createDiagnosticForNodeInSourceFile(sourceFile, valueExpression, message, arg0, arg1);
                }));
                invalidReported = true;
              }
            }
            return validateValue(text);
          case 8:
            reportInvalidOptionValue(option && option.type !== "number");
            return validateValue(Number(valueExpression.text));
          case 218:
            if (valueExpression.operator !== 40 || valueExpression.operand.kind !== 8) {
              break;
            }
            reportInvalidOptionValue(option && option.type !== "number");
            return validateValue(-Number(valueExpression.operand.text));
          case 204:
            reportInvalidOptionValue(option && option.type !== "object");
            var objectLiteralExpression = valueExpression;
            if (option) {
              var _a = option, elementOptions = _a.elementOptions, extraKeyDiagnostics = _a.extraKeyDiagnostics, optionName = _a.name;
              return validateValue(convertObjectLiteralExpressionToJson(objectLiteralExpression, elementOptions, extraKeyDiagnostics, optionName));
            } else {
              return validateValue(convertObjectLiteralExpressionToJson(objectLiteralExpression, void 0, void 0, void 0));
            }
          case 203:
            reportInvalidOptionValue(option && option.type !== "list");
            return validateValue(convertArrayLiteralExpressionToJson(valueExpression.elements, option && option.element));
        }
        if (option) {
          reportInvalidOptionValue(true);
        } else {
          errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, valueExpression, ts2.Diagnostics.Property_value_can_only_be_string_literal_numeric_literal_true_false_null_object_literal_or_array_literal));
        }
        return void 0;
        function validateValue(value) {
          var _a2;
          if (!invalidReported) {
            var diagnostic = (_a2 = option === null || option === void 0 ? void 0 : option.extraValidation) === null || _a2 === void 0 ? void 0 : _a2.call(option, value);
            if (diagnostic) {
              errors.push(ts2.createDiagnosticForNodeInSourceFile.apply(void 0, __spreadArray([sourceFile, valueExpression], diagnostic, false)));
              return void 0;
            }
          }
          return value;
        }
        function reportInvalidOptionValue(isError) {
          if (isError) {
            errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, valueExpression, ts2.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, option.name, getCompilerOptionValueTypeString(option)));
            invalidReported = true;
          }
        }
      }
      function isDoubleQuotedString(node) {
        return ts2.isStringLiteral(node) && ts2.isStringDoubleQuoted(node, sourceFile);
      }
    }
    ts2.convertToObjectWorker = convertToObjectWorker;
    function getCompilerOptionValueTypeString(option) {
      return option.type === "list" ? "Array" : ts2.isString(option.type) ? option.type : "string";
    }
    function isCompilerOptionsValue(option, value) {
      if (option) {
        if (isNullOrUndefined(value))
          return true;
        if (option.type === "list") {
          return ts2.isArray(value);
        }
        var expectedType = ts2.isString(option.type) ? option.type : "string";
        return typeof value === expectedType;
      }
      return false;
    }
    function convertToTSConfig(configParseResult, configFileName, host) {
      var _a, _b, _c;
      var getCanonicalFileName = ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames);
      var files = ts2.map(ts2.filter(configParseResult.fileNames, !((_b = (_a = configParseResult.options.configFile) === null || _a === void 0 ? void 0 : _a.configFileSpecs) === null || _b === void 0 ? void 0 : _b.validatedIncludeSpecs) ? ts2.returnTrue : matchesSpecs(configFileName, configParseResult.options.configFile.configFileSpecs.validatedIncludeSpecs, configParseResult.options.configFile.configFileSpecs.validatedExcludeSpecs, host)), function(f) {
        return ts2.getRelativePathFromFile(ts2.getNormalizedAbsolutePath(configFileName, host.getCurrentDirectory()), ts2.getNormalizedAbsolutePath(f, host.getCurrentDirectory()), getCanonicalFileName);
      });
      var optionMap = serializeCompilerOptions(configParseResult.options, { configFilePath: ts2.getNormalizedAbsolutePath(configFileName, host.getCurrentDirectory()), useCaseSensitiveFileNames: host.useCaseSensitiveFileNames });
      var watchOptionMap = configParseResult.watchOptions && serializeWatchOptions(configParseResult.watchOptions);
      var config = __assign(__assign({ compilerOptions: __assign(__assign({}, optionMapToObject(optionMap)), { showConfig: void 0, configFile: void 0, configFilePath: void 0, help: void 0, init: void 0, listFiles: void 0, listEmittedFiles: void 0, project: void 0, build: void 0, version: void 0 }), watchOptions: watchOptionMap && optionMapToObject(watchOptionMap), references: ts2.map(configParseResult.projectReferences, function(r) {
        return __assign(__assign({}, r), { path: r.originalPath ? r.originalPath : "", originalPath: void 0 });
      }), files: ts2.length(files) ? files : void 0 }, ((_c = configParseResult.options.configFile) === null || _c === void 0 ? void 0 : _c.configFileSpecs) ? {
        include: filterSameAsDefaultInclude(configParseResult.options.configFile.configFileSpecs.validatedIncludeSpecs),
        exclude: configParseResult.options.configFile.configFileSpecs.validatedExcludeSpecs
      } : {}), { compileOnSave: !!configParseResult.compileOnSave ? true : void 0 });
      return config;
    }
    ts2.convertToTSConfig = convertToTSConfig;
    function optionMapToObject(optionMap) {
      return __assign({}, ts2.arrayFrom(optionMap.entries()).reduce(function(prev, cur) {
        var _a;
        return __assign(__assign({}, prev), (_a = {}, _a[cur[0]] = cur[1], _a));
      }, {}));
    }
    function filterSameAsDefaultInclude(specs) {
      if (!ts2.length(specs))
        return void 0;
      if (ts2.length(specs) !== 1)
        return specs;
      if (specs[0] === "**/*")
        return void 0;
      return specs;
    }
    function matchesSpecs(path, includeSpecs, excludeSpecs, host) {
      if (!includeSpecs)
        return ts2.returnTrue;
      var patterns = ts2.getFileMatcherPatterns(path, excludeSpecs, includeSpecs, host.useCaseSensitiveFileNames, host.getCurrentDirectory());
      var excludeRe = patterns.excludePattern && ts2.getRegexFromPattern(patterns.excludePattern, host.useCaseSensitiveFileNames);
      var includeRe = patterns.includeFilePattern && ts2.getRegexFromPattern(patterns.includeFilePattern, host.useCaseSensitiveFileNames);
      if (includeRe) {
        if (excludeRe) {
          return function(path2) {
            return !(includeRe.test(path2) && !excludeRe.test(path2));
          };
        }
        return function(path2) {
          return !includeRe.test(path2);
        };
      }
      if (excludeRe) {
        return function(path2) {
          return excludeRe.test(path2);
        };
      }
      return ts2.returnTrue;
    }
    function getCustomTypeMapOfCommandLineOption(optionDefinition) {
      if (optionDefinition.type === "string" || optionDefinition.type === "number" || optionDefinition.type === "boolean" || optionDefinition.type === "object") {
        return void 0;
      } else if (optionDefinition.type === "list") {
        return getCustomTypeMapOfCommandLineOption(optionDefinition.element);
      } else {
        return optionDefinition.type;
      }
    }
    function getNameOfCompilerOptionValue(value, customTypeMap) {
      return ts2.forEachEntry(customTypeMap, function(mapValue, key) {
        if (mapValue === value) {
          return key;
        }
      });
    }
    function serializeCompilerOptions(options, pathOptions) {
      return serializeOptionBaseObject(options, getOptionsNameMap(), pathOptions);
    }
    function serializeWatchOptions(options) {
      return serializeOptionBaseObject(options, getWatchOptionsNameMap());
    }
    function serializeOptionBaseObject(options, _a, pathOptions) {
      var optionsNameMap = _a.optionsNameMap;
      var result = new ts2.Map();
      var getCanonicalFileName = pathOptions && ts2.createGetCanonicalFileName(pathOptions.useCaseSensitiveFileNames);
      var _loop_5 = function(name2) {
        if (ts2.hasProperty(options, name2)) {
          if (optionsNameMap.has(name2) && (optionsNameMap.get(name2).category === ts2.Diagnostics.Command_line_Options || optionsNameMap.get(name2).category === ts2.Diagnostics.Output_Formatting)) {
            return "continue";
          }
          var value = options[name2];
          var optionDefinition = optionsNameMap.get(name2.toLowerCase());
          if (optionDefinition) {
            var customTypeMap_1 = getCustomTypeMapOfCommandLineOption(optionDefinition);
            if (!customTypeMap_1) {
              if (pathOptions && optionDefinition.isFilePath) {
                result.set(name2, ts2.getRelativePathFromFile(pathOptions.configFilePath, ts2.getNormalizedAbsolutePath(value, ts2.getDirectoryPath(pathOptions.configFilePath)), getCanonicalFileName));
              } else {
                result.set(name2, value);
              }
            } else {
              if (optionDefinition.type === "list") {
                result.set(name2, value.map(function(element) {
                  return getNameOfCompilerOptionValue(element, customTypeMap_1);
                }));
              } else {
                result.set(name2, getNameOfCompilerOptionValue(value, customTypeMap_1));
              }
            }
          }
        }
      };
      for (var name in options) {
        _loop_5(name);
      }
      return result;
    }
    function getCompilerOptionsDiffValue(options, newLine) {
      var compilerOptionsMap = getSerializedCompilerOption(options);
      return getOverwrittenDefaultOptions();
      function makePadding(paddingLength) {
        return Array(paddingLength + 1).join(" ");
      }
      function getOverwrittenDefaultOptions() {
        var result = [];
        var tab = makePadding(2);
        commandOptionsWithoutBuild.forEach(function(cmd) {
          if (!compilerOptionsMap.has(cmd.name)) {
            return;
          }
          var newValue = compilerOptionsMap.get(cmd.name);
          var defaultValue = getDefaultValueForOption(cmd);
          if (newValue !== defaultValue) {
            result.push("".concat(tab).concat(cmd.name, ": ").concat(newValue));
          } else if (ts2.hasProperty(ts2.defaultInitCompilerOptions, cmd.name)) {
            result.push("".concat(tab).concat(cmd.name, ": ").concat(defaultValue));
          }
        });
        return result.join(newLine) + newLine;
      }
    }
    ts2.getCompilerOptionsDiffValue = getCompilerOptionsDiffValue;
    function getSerializedCompilerOption(options) {
      var compilerOptions = ts2.extend(options, ts2.defaultInitCompilerOptions);
      return serializeCompilerOptions(compilerOptions);
    }
    function generateTSConfig(options, fileNames, newLine) {
      var compilerOptionsMap = getSerializedCompilerOption(options);
      return writeConfigurations();
      function makePadding(paddingLength) {
        return Array(paddingLength + 1).join(" ");
      }
      function isAllowedOptionForOutput(_a) {
        var category = _a.category, name = _a.name, isCommandLineOnly = _a.isCommandLineOnly;
        var categoriesToSkip = [ts2.Diagnostics.Command_line_Options, ts2.Diagnostics.Editor_Support, ts2.Diagnostics.Compiler_Diagnostics, ts2.Diagnostics.Backwards_Compatibility, ts2.Diagnostics.Watch_and_Build_Modes, ts2.Diagnostics.Output_Formatting];
        return !isCommandLineOnly && category !== void 0 && (!categoriesToSkip.includes(category) || compilerOptionsMap.has(name));
      }
      function writeConfigurations() {
        var categorizedOptions = ts2.createMultiMap();
        for (var _i = 0, optionDeclarations_1 = ts2.optionDeclarations; _i < optionDeclarations_1.length; _i++) {
          var option = optionDeclarations_1[_i];
          var category = option.category;
          if (isAllowedOptionForOutput(option)) {
            categorizedOptions.add(ts2.getLocaleSpecificMessage(category), option);
          }
        }
        var marginLength = 0;
        var seenKnownKeys = 0;
        var entries = [];
        categorizedOptions.forEach(function(options2, category2) {
          if (entries.length !== 0) {
            entries.push({ value: "" });
          }
          entries.push({ value: "/* ".concat(category2, " */") });
          for (var _i2 = 0, options_1 = options2; _i2 < options_1.length; _i2++) {
            var option2 = options_1[_i2];
            var optionName = void 0;
            if (compilerOptionsMap.has(option2.name)) {
              optionName = '"'.concat(option2.name, '": ').concat(JSON.stringify(compilerOptionsMap.get(option2.name))).concat((seenKnownKeys += 1) === compilerOptionsMap.size ? "" : ",");
            } else {
              optionName = '// "'.concat(option2.name, '": ').concat(JSON.stringify(getDefaultValueForOption(option2)), ",");
            }
            entries.push({
              value: optionName,
              description: "/* ".concat(option2.description && ts2.getLocaleSpecificMessage(option2.description) || option2.name, " */")
            });
            marginLength = Math.max(optionName.length, marginLength);
          }
        });
        var tab = makePadding(2);
        var result = [];
        result.push("{");
        result.push("".concat(tab, '"compilerOptions": {'));
        result.push("".concat(tab).concat(tab, "/* ").concat(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Visit_https_Colon_Slash_Slashaka_ms_Slashtsconfig_json_to_read_more_about_this_file), " */"));
        result.push("");
        for (var _a = 0, entries_2 = entries; _a < entries_2.length; _a++) {
          var entry = entries_2[_a];
          var value = entry.value, _b = entry.description, description = _b === void 0 ? "" : _b;
          result.push(value && "".concat(tab).concat(tab).concat(value).concat(description && makePadding(marginLength - value.length + 2) + description));
        }
        if (fileNames.length) {
          result.push("".concat(tab, "},"));
          result.push("".concat(tab, '"files": ['));
          for (var i = 0; i < fileNames.length; i++) {
            result.push("".concat(tab).concat(tab).concat(JSON.stringify(fileNames[i])).concat(i === fileNames.length - 1 ? "" : ","));
          }
          result.push("".concat(tab, "]"));
        } else {
          result.push("".concat(tab, "}"));
        }
        result.push("}");
        return result.join(newLine) + newLine;
      }
    }
    ts2.generateTSConfig = generateTSConfig;
    function convertToOptionsWithAbsolutePaths(options, toAbsolutePath) {
      var result = {};
      var optionsNameMap = getOptionsNameMap().optionsNameMap;
      for (var name in options) {
        if (ts2.hasProperty(options, name)) {
          result[name] = convertToOptionValueWithAbsolutePaths(optionsNameMap.get(name.toLowerCase()), options[name], toAbsolutePath);
        }
      }
      if (result.configFilePath) {
        result.configFilePath = toAbsolutePath(result.configFilePath);
      }
      return result;
    }
    ts2.convertToOptionsWithAbsolutePaths = convertToOptionsWithAbsolutePaths;
    function convertToOptionValueWithAbsolutePaths(option, value, toAbsolutePath) {
      if (option && !isNullOrUndefined(value)) {
        if (option.type === "list") {
          var values = value;
          if (option.element.isFilePath && values.length) {
            return values.map(toAbsolutePath);
          }
        } else if (option.isFilePath) {
          return toAbsolutePath(value);
        }
      }
      return value;
    }
    function parseJsonConfigFileContent(json, host, basePath, existingOptions, configFileName, resolutionStack, extraFileExtensions, extendedConfigCache, existingWatchOptions) {
      return parseJsonConfigFileContentWorker(json, void 0, host, basePath, existingOptions, existingWatchOptions, configFileName, resolutionStack, extraFileExtensions, extendedConfigCache);
    }
    ts2.parseJsonConfigFileContent = parseJsonConfigFileContent;
    function parseJsonSourceFileConfigFileContent(sourceFile, host, basePath, existingOptions, configFileName, resolutionStack, extraFileExtensions, extendedConfigCache, existingWatchOptions) {
      return parseJsonConfigFileContentWorker(void 0, sourceFile, host, basePath, existingOptions, existingWatchOptions, configFileName, resolutionStack, extraFileExtensions, extendedConfigCache);
    }
    ts2.parseJsonSourceFileConfigFileContent = parseJsonSourceFileConfigFileContent;
    function setConfigFileInOptions(options, configFile) {
      if (configFile) {
        Object.defineProperty(options, "configFile", { enumerable: false, writable: false, value: configFile });
      }
    }
    ts2.setConfigFileInOptions = setConfigFileInOptions;
    function isNullOrUndefined(x) {
      return x === void 0 || x === null;
    }
    function directoryOfCombinedPath(fileName, basePath) {
      return ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(fileName, basePath));
    }
    function parseJsonConfigFileContentWorker(json, sourceFile, host, basePath, existingOptions, existingWatchOptions, configFileName, resolutionStack, extraFileExtensions, extendedConfigCache) {
      if (existingOptions === void 0) {
        existingOptions = {};
      }
      if (resolutionStack === void 0) {
        resolutionStack = [];
      }
      if (extraFileExtensions === void 0) {
        extraFileExtensions = [];
      }
      ts2.Debug.assert(json === void 0 && sourceFile !== void 0 || json !== void 0 && sourceFile === void 0);
      var errors = [];
      var parsedConfig = parseConfig(json, sourceFile, host, basePath, configFileName, resolutionStack, errors, extendedConfigCache);
      var raw = parsedConfig.raw;
      var options = ts2.extend(existingOptions, parsedConfig.options || {});
      var watchOptions = existingWatchOptions && parsedConfig.watchOptions ? ts2.extend(existingWatchOptions, parsedConfig.watchOptions) : parsedConfig.watchOptions || existingWatchOptions;
      options.configFilePath = configFileName && ts2.normalizeSlashes(configFileName);
      var configFileSpecs = getConfigFileSpecs();
      if (sourceFile)
        sourceFile.configFileSpecs = configFileSpecs;
      setConfigFileInOptions(options, sourceFile);
      var basePathForFileNames = ts2.normalizePath(configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath);
      return {
        options,
        watchOptions,
        fileNames: getFileNames(basePathForFileNames),
        projectReferences: getProjectReferences(basePathForFileNames),
        typeAcquisition: parsedConfig.typeAcquisition || getDefaultTypeAcquisition(),
        raw,
        errors,
        wildcardDirectories: getWildcardDirectories(configFileSpecs, basePathForFileNames, host.useCaseSensitiveFileNames),
        compileOnSave: !!raw.compileOnSave
      };
      function getConfigFileSpecs() {
        var referencesOfRaw = getPropFromRaw("references", function(element) {
          return typeof element === "object";
        }, "object");
        var filesSpecs = toPropValue(getSpecsFromRaw("files"));
        if (filesSpecs) {
          var hasZeroOrNoReferences = referencesOfRaw === "no-prop" || ts2.isArray(referencesOfRaw) && referencesOfRaw.length === 0;
          var hasExtends = ts2.hasProperty(raw, "extends");
          if (filesSpecs.length === 0 && hasZeroOrNoReferences && !hasExtends) {
            if (sourceFile) {
              var fileName = configFileName || "tsconfig.json";
              var diagnosticMessage = ts2.Diagnostics.The_files_list_in_config_file_0_is_empty;
              var nodeValue = ts2.firstDefined(ts2.getTsConfigPropArray(sourceFile, "files"), function(property) {
                return property.initializer;
              });
              var error = nodeValue ? ts2.createDiagnosticForNodeInSourceFile(sourceFile, nodeValue, diagnosticMessage, fileName) : ts2.createCompilerDiagnostic(diagnosticMessage, fileName);
              errors.push(error);
            } else {
              createCompilerDiagnosticOnlyIfJson(ts2.Diagnostics.The_files_list_in_config_file_0_is_empty, configFileName || "tsconfig.json");
            }
          }
        }
        var includeSpecs = toPropValue(getSpecsFromRaw("include"));
        var excludeOfRaw = getSpecsFromRaw("exclude");
        var excludeSpecs = toPropValue(excludeOfRaw);
        if (excludeOfRaw === "no-prop" && raw.compilerOptions) {
          var outDir = raw.compilerOptions.outDir;
          var declarationDir = raw.compilerOptions.declarationDir;
          if (outDir || declarationDir) {
            excludeSpecs = [outDir, declarationDir].filter(function(d) {
              return !!d;
            });
          }
        }
        if (filesSpecs === void 0 && includeSpecs === void 0) {
          includeSpecs = ["**/*"];
        }
        var validatedIncludeSpecs, validatedExcludeSpecs;
        if (includeSpecs) {
          validatedIncludeSpecs = validateSpecs(includeSpecs, errors, true, sourceFile, "include");
        }
        if (excludeSpecs) {
          validatedExcludeSpecs = validateSpecs(excludeSpecs, errors, false, sourceFile, "exclude");
        }
        return {
          filesSpecs,
          includeSpecs,
          excludeSpecs,
          validatedFilesSpec: ts2.filter(filesSpecs, ts2.isString),
          validatedIncludeSpecs,
          validatedExcludeSpecs,
          pathPatterns: void 0
        };
      }
      function getFileNames(basePath2) {
        var fileNames = getFileNamesFromConfigSpecs(configFileSpecs, basePath2, options, host, extraFileExtensions);
        if (shouldReportNoInputFiles(fileNames, canJsonReportNoInputFiles(raw), resolutionStack)) {
          errors.push(getErrorForNoInputFiles(configFileSpecs, configFileName));
        }
        return fileNames;
      }
      function getProjectReferences(basePath2) {
        var projectReferences;
        var referencesOfRaw = getPropFromRaw("references", function(element) {
          return typeof element === "object";
        }, "object");
        if (ts2.isArray(referencesOfRaw)) {
          for (var _i = 0, referencesOfRaw_1 = referencesOfRaw; _i < referencesOfRaw_1.length; _i++) {
            var ref = referencesOfRaw_1[_i];
            if (typeof ref.path !== "string") {
              createCompilerDiagnosticOnlyIfJson(ts2.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "reference.path", "string");
            } else {
              (projectReferences || (projectReferences = [])).push({
                path: ts2.getNormalizedAbsolutePath(ref.path, basePath2),
                originalPath: ref.path,
                prepend: ref.prepend,
                circular: ref.circular
              });
            }
          }
        }
        return projectReferences;
      }
      function toPropValue(specResult) {
        return ts2.isArray(specResult) ? specResult : void 0;
      }
      function getSpecsFromRaw(prop) {
        return getPropFromRaw(prop, ts2.isString, "string");
      }
      function getPropFromRaw(prop, validateElement, elementTypeName) {
        if (ts2.hasProperty(raw, prop) && !isNullOrUndefined(raw[prop])) {
          if (ts2.isArray(raw[prop])) {
            var result = raw[prop];
            if (!sourceFile && !ts2.every(result, validateElement)) {
              errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, prop, elementTypeName));
            }
            return result;
          } else {
            createCompilerDiagnosticOnlyIfJson(ts2.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, prop, "Array");
            return "not-array";
          }
        }
        return "no-prop";
      }
      function createCompilerDiagnosticOnlyIfJson(message, arg0, arg1) {
        if (!sourceFile) {
          errors.push(ts2.createCompilerDiagnostic(message, arg0, arg1));
        }
      }
    }
    function isErrorNoInputFiles(error) {
      return error.code === ts2.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2.code;
    }
    function getErrorForNoInputFiles(_a, configFileName) {
      var includeSpecs = _a.includeSpecs, excludeSpecs = _a.excludeSpecs;
      return ts2.createCompilerDiagnostic(ts2.Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2, configFileName || "tsconfig.json", JSON.stringify(includeSpecs || []), JSON.stringify(excludeSpecs || []));
    }
    function shouldReportNoInputFiles(fileNames, canJsonReportNoInutFiles, resolutionStack) {
      return fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0);
    }
    function canJsonReportNoInputFiles(raw) {
      return !ts2.hasProperty(raw, "files") && !ts2.hasProperty(raw, "references");
    }
    ts2.canJsonReportNoInputFiles = canJsonReportNoInputFiles;
    function updateErrorForNoInputFiles(fileNames, configFileName, configFileSpecs, configParseDiagnostics, canJsonReportNoInutFiles) {
      var existingErrors = configParseDiagnostics.length;
      if (shouldReportNoInputFiles(fileNames, canJsonReportNoInutFiles)) {
        configParseDiagnostics.push(getErrorForNoInputFiles(configFileSpecs, configFileName));
      } else {
        ts2.filterMutate(configParseDiagnostics, function(error) {
          return !isErrorNoInputFiles(error);
        });
      }
      return existingErrors !== configParseDiagnostics.length;
    }
    ts2.updateErrorForNoInputFiles = updateErrorForNoInputFiles;
    function isSuccessfulParsedTsconfig(value) {
      return !!value.options;
    }
    function parseConfig(json, sourceFile, host, basePath, configFileName, resolutionStack, errors, extendedConfigCache) {
      var _a;
      basePath = ts2.normalizeSlashes(basePath);
      var resolvedPath = ts2.getNormalizedAbsolutePath(configFileName || "", basePath);
      if (resolutionStack.indexOf(resolvedPath) >= 0) {
        errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Circularity_detected_while_resolving_configuration_Colon_0, __spreadArray(__spreadArray([], resolutionStack, true), [resolvedPath], false).join(" -> ")));
        return { raw: json || convertToObject(sourceFile, errors) };
      }
      var ownConfig = json ? parseOwnConfigOfJson(json, host, basePath, configFileName, errors) : parseOwnConfigOfJsonSourceFile(sourceFile, host, basePath, configFileName, errors);
      if ((_a = ownConfig.options) === null || _a === void 0 ? void 0 : _a.paths) {
        ownConfig.options.pathsBasePath = basePath;
      }
      if (ownConfig.extendedConfigPath) {
        resolutionStack = resolutionStack.concat([resolvedPath]);
        var extendedConfig = getExtendedConfig(sourceFile, ownConfig.extendedConfigPath, host, resolutionStack, errors, extendedConfigCache);
        if (extendedConfig && isSuccessfulParsedTsconfig(extendedConfig)) {
          var baseRaw_1 = extendedConfig.raw;
          var raw_1 = ownConfig.raw;
          var relativeDifference_1;
          var setPropertyInRawIfNotUndefined = function(propertyName) {
            if (!raw_1[propertyName] && baseRaw_1[propertyName]) {
              raw_1[propertyName] = ts2.map(baseRaw_1[propertyName], function(path) {
                return ts2.isRootedDiskPath(path) ? path : ts2.combinePaths(relativeDifference_1 || (relativeDifference_1 = ts2.convertToRelativePath(ts2.getDirectoryPath(ownConfig.extendedConfigPath), basePath, ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames))), path);
              });
            }
          };
          setPropertyInRawIfNotUndefined("include");
          setPropertyInRawIfNotUndefined("exclude");
          setPropertyInRawIfNotUndefined("files");
          if (raw_1.compileOnSave === void 0) {
            raw_1.compileOnSave = baseRaw_1.compileOnSave;
          }
          ownConfig.options = ts2.assign({}, extendedConfig.options, ownConfig.options);
          ownConfig.watchOptions = ownConfig.watchOptions && extendedConfig.watchOptions ? ts2.assign({}, extendedConfig.watchOptions, ownConfig.watchOptions) : ownConfig.watchOptions || extendedConfig.watchOptions;
        }
      }
      return ownConfig;
    }
    function parseOwnConfigOfJson(json, host, basePath, configFileName, errors) {
      if (ts2.hasProperty(json, "excludes")) {
        errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Unknown_option_excludes_Did_you_mean_exclude));
      }
      var options = convertCompilerOptionsFromJsonWorker(json.compilerOptions, basePath, errors, configFileName);
      var typeAcquisition = convertTypeAcquisitionFromJsonWorker(json.typeAcquisition || json.typingOptions, basePath, errors, configFileName);
      var watchOptions = convertWatchOptionsFromJsonWorker(json.watchOptions, basePath, errors);
      json.compileOnSave = convertCompileOnSaveOptionFromJson(json, basePath, errors);
      var extendedConfigPath;
      if (json.extends) {
        if (!ts2.isString(json.extends)) {
          errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "extends", "string"));
        } else {
          var newBase = configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath;
          extendedConfigPath = getExtendsConfigPath(json.extends, host, newBase, errors, ts2.createCompilerDiagnostic);
        }
      }
      return { raw: json, options, watchOptions, typeAcquisition, extendedConfigPath };
    }
    function parseOwnConfigOfJsonSourceFile(sourceFile, host, basePath, configFileName, errors) {
      var options = getDefaultCompilerOptions(configFileName);
      var typeAcquisition, typingOptionstypeAcquisition;
      var watchOptions;
      var extendedConfigPath;
      var rootCompilerOptions;
      var optionsIterator = {
        onSetValidOptionKeyValueInParent: function(parentOption, option, value) {
          var currentOption;
          switch (parentOption) {
            case "compilerOptions":
              currentOption = options;
              break;
            case "watchOptions":
              currentOption = watchOptions || (watchOptions = {});
              break;
            case "typeAcquisition":
              currentOption = typeAcquisition || (typeAcquisition = getDefaultTypeAcquisition(configFileName));
              break;
            case "typingOptions":
              currentOption = typingOptionstypeAcquisition || (typingOptionstypeAcquisition = getDefaultTypeAcquisition(configFileName));
              break;
            default:
              ts2.Debug.fail("Unknown option");
          }
          currentOption[option.name] = normalizeOptionValue(option, basePath, value);
        },
        onSetValidOptionKeyValueInRoot: function(key, _keyNode, value, valueNode) {
          switch (key) {
            case "extends":
              var newBase = configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath;
              extendedConfigPath = getExtendsConfigPath(value, host, newBase, errors, function(message, arg0) {
                return ts2.createDiagnosticForNodeInSourceFile(sourceFile, valueNode, message, arg0);
              });
              return;
          }
        },
        onSetUnknownOptionKeyValueInRoot: function(key, keyNode, _value, _valueNode) {
          if (key === "excludes") {
            errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, keyNode, ts2.Diagnostics.Unknown_option_excludes_Did_you_mean_exclude));
          }
          if (ts2.find(commandOptionsWithoutBuild, function(opt) {
            return opt.name === key;
          })) {
            rootCompilerOptions = ts2.append(rootCompilerOptions, keyNode);
          }
        }
      };
      var json = convertConfigFileToObject(sourceFile, errors, true, optionsIterator);
      if (!typeAcquisition) {
        if (typingOptionstypeAcquisition) {
          typeAcquisition = typingOptionstypeAcquisition.enableAutoDiscovery !== void 0 ? {
            enable: typingOptionstypeAcquisition.enableAutoDiscovery,
            include: typingOptionstypeAcquisition.include,
            exclude: typingOptionstypeAcquisition.exclude
          } : typingOptionstypeAcquisition;
        } else {
          typeAcquisition = getDefaultTypeAcquisition(configFileName);
        }
      }
      if (rootCompilerOptions && json && json.compilerOptions === void 0) {
        errors.push(ts2.createDiagnosticForNodeInSourceFile(sourceFile, rootCompilerOptions[0], ts2.Diagnostics._0_should_be_set_inside_the_compilerOptions_object_of_the_config_json_file, ts2.getTextOfPropertyName(rootCompilerOptions[0])));
      }
      return { raw: json, options, watchOptions, typeAcquisition, extendedConfigPath };
    }
    function getExtendsConfigPath(extendedConfig, host, basePath, errors, createDiagnostic) {
      extendedConfig = ts2.normalizeSlashes(extendedConfig);
      if (ts2.isRootedDiskPath(extendedConfig) || ts2.startsWith(extendedConfig, "./") || ts2.startsWith(extendedConfig, "../")) {
        var extendedConfigPath = ts2.getNormalizedAbsolutePath(extendedConfig, basePath);
        if (!host.fileExists(extendedConfigPath) && !ts2.endsWith(extendedConfigPath, ".json")) {
          extendedConfigPath = "".concat(extendedConfigPath, ".json");
          if (!host.fileExists(extendedConfigPath)) {
            errors.push(createDiagnostic(ts2.Diagnostics.File_0_not_found, extendedConfig));
            return void 0;
          }
        }
        return extendedConfigPath;
      }
      var resolved = ts2.nodeModuleNameResolver(extendedConfig, ts2.combinePaths(basePath, "tsconfig.json"), { moduleResolution: ts2.ModuleResolutionKind.NodeJs }, host, void 0, void 0, true);
      if (resolved.resolvedModule) {
        return resolved.resolvedModule.resolvedFileName;
      }
      errors.push(createDiagnostic(ts2.Diagnostics.File_0_not_found, extendedConfig));
      return void 0;
    }
    function getExtendedConfig(sourceFile, extendedConfigPath, host, resolutionStack, errors, extendedConfigCache) {
      var _a;
      var path = host.useCaseSensitiveFileNames ? extendedConfigPath : ts2.toFileNameLowerCase(extendedConfigPath);
      var value;
      var extendedResult;
      var extendedConfig;
      if (extendedConfigCache && (value = extendedConfigCache.get(path))) {
        extendedResult = value.extendedResult, extendedConfig = value.extendedConfig;
      } else {
        extendedResult = readJsonConfigFile(extendedConfigPath, function(path2) {
          return host.readFile(path2);
        });
        if (!extendedResult.parseDiagnostics.length) {
          extendedConfig = parseConfig(void 0, extendedResult, host, ts2.getDirectoryPath(extendedConfigPath), ts2.getBaseFileName(extendedConfigPath), resolutionStack, errors, extendedConfigCache);
        }
        if (extendedConfigCache) {
          extendedConfigCache.set(path, { extendedResult, extendedConfig });
        }
      }
      if (sourceFile) {
        sourceFile.extendedSourceFiles = [extendedResult.fileName];
        if (extendedResult.extendedSourceFiles) {
          (_a = sourceFile.extendedSourceFiles).push.apply(_a, extendedResult.extendedSourceFiles);
        }
      }
      if (extendedResult.parseDiagnostics.length) {
        errors.push.apply(errors, extendedResult.parseDiagnostics);
        return void 0;
      }
      return extendedConfig;
    }
    function convertCompileOnSaveOptionFromJson(jsonOption, basePath, errors) {
      if (!ts2.hasProperty(jsonOption, ts2.compileOnSaveCommandLineOption.name)) {
        return false;
      }
      var result = convertJsonOption(ts2.compileOnSaveCommandLineOption, jsonOption.compileOnSave, basePath, errors);
      return typeof result === "boolean" && result;
    }
    function convertCompilerOptionsFromJson(jsonOptions, basePath, configFileName) {
      var errors = [];
      var options = convertCompilerOptionsFromJsonWorker(jsonOptions, basePath, errors, configFileName);
      return { options, errors };
    }
    ts2.convertCompilerOptionsFromJson = convertCompilerOptionsFromJson;
    function convertTypeAcquisitionFromJson(jsonOptions, basePath, configFileName) {
      var errors = [];
      var options = convertTypeAcquisitionFromJsonWorker(jsonOptions, basePath, errors, configFileName);
      return { options, errors };
    }
    ts2.convertTypeAcquisitionFromJson = convertTypeAcquisitionFromJson;
    function getDefaultCompilerOptions(configFileName) {
      var options = configFileName && ts2.getBaseFileName(configFileName) === "jsconfig.json" ? { allowJs: true, maxNodeModuleJsDepth: 2, allowSyntheticDefaultImports: true, skipLibCheck: true, noEmit: true } : {};
      return options;
    }
    function convertCompilerOptionsFromJsonWorker(jsonOptions, basePath, errors, configFileName) {
      var options = getDefaultCompilerOptions(configFileName);
      convertOptionsFromJson(getCommandLineCompilerOptionsMap(), jsonOptions, basePath, options, ts2.compilerOptionsDidYouMeanDiagnostics, errors);
      if (configFileName) {
        options.configFilePath = ts2.normalizeSlashes(configFileName);
      }
      return options;
    }
    function getDefaultTypeAcquisition(configFileName) {
      return { enable: !!configFileName && ts2.getBaseFileName(configFileName) === "jsconfig.json", include: [], exclude: [] };
    }
    function convertTypeAcquisitionFromJsonWorker(jsonOptions, basePath, errors, configFileName) {
      var options = getDefaultTypeAcquisition(configFileName);
      var typeAcquisition = convertEnableAutoDiscoveryToEnable(jsonOptions);
      convertOptionsFromJson(getCommandLineTypeAcquisitionMap(), typeAcquisition, basePath, options, typeAcquisitionDidYouMeanDiagnostics, errors);
      return options;
    }
    function convertWatchOptionsFromJsonWorker(jsonOptions, basePath, errors) {
      return convertOptionsFromJson(getCommandLineWatchOptionsMap(), jsonOptions, basePath, void 0, watchOptionsDidYouMeanDiagnostics, errors);
    }
    function convertOptionsFromJson(optionsNameMap, jsonOptions, basePath, defaultOptions, diagnostics, errors) {
      if (!jsonOptions) {
        return;
      }
      for (var id in jsonOptions) {
        var opt = optionsNameMap.get(id);
        if (opt) {
          (defaultOptions || (defaultOptions = {}))[opt.name] = convertJsonOption(opt, jsonOptions[id], basePath, errors);
        } else {
          errors.push(createUnknownOptionError(id, diagnostics, ts2.createCompilerDiagnostic));
        }
      }
      return defaultOptions;
    }
    function convertJsonOption(opt, value, basePath, errors) {
      if (isCompilerOptionsValue(opt, value)) {
        var optType = opt.type;
        if (optType === "list" && ts2.isArray(value)) {
          return convertJsonOptionOfListType(opt, value, basePath, errors);
        } else if (!ts2.isString(optType)) {
          return convertJsonOptionOfCustomType(opt, value, errors);
        }
        var validatedValue = validateJsonOptionValue(opt, value, errors);
        return isNullOrUndefined(validatedValue) ? validatedValue : normalizeNonListOptionValue(opt, basePath, validatedValue);
      } else {
        errors.push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, opt.name, getCompilerOptionValueTypeString(opt)));
      }
    }
    ts2.convertJsonOption = convertJsonOption;
    function normalizeOptionValue(option, basePath, value) {
      if (isNullOrUndefined(value))
        return void 0;
      if (option.type === "list") {
        var listOption_1 = option;
        if (listOption_1.element.isFilePath || !ts2.isString(listOption_1.element.type)) {
          return ts2.filter(ts2.map(value, function(v) {
            return normalizeOptionValue(listOption_1.element, basePath, v);
          }), function(v) {
            return !!v;
          });
        }
        return value;
      } else if (!ts2.isString(option.type)) {
        return option.type.get(ts2.isString(value) ? value.toLowerCase() : value);
      }
      return normalizeNonListOptionValue(option, basePath, value);
    }
    function normalizeNonListOptionValue(option, basePath, value) {
      if (option.isFilePath) {
        value = ts2.getNormalizedAbsolutePath(value, basePath);
        if (value === "") {
          value = ".";
        }
      }
      return value;
    }
    function validateJsonOptionValue(opt, value, errors) {
      var _a;
      if (isNullOrUndefined(value))
        return void 0;
      var d = (_a = opt.extraValidation) === null || _a === void 0 ? void 0 : _a.call(opt, value);
      if (!d)
        return value;
      errors.push(ts2.createCompilerDiagnostic.apply(void 0, d));
      return void 0;
    }
    function convertJsonOptionOfCustomType(opt, value, errors) {
      if (isNullOrUndefined(value))
        return void 0;
      var key = value.toLowerCase();
      var val = opt.type.get(key);
      if (val !== void 0) {
        return validateJsonOptionValue(opt, val, errors);
      } else {
        errors.push(createCompilerDiagnosticForInvalidCustomType(opt));
      }
    }
    function convertJsonOptionOfListType(option, values, basePath, errors) {
      return ts2.filter(ts2.map(values, function(v) {
        return convertJsonOption(option.element, v, basePath, errors);
      }), function(v) {
        return !!v;
      });
    }
    var invalidTrailingRecursionPattern = /(^|\/)\*\*\/?$/;
    var wildcardDirectoryPattern = /^[^*?]*(?=\/[^/]*[*?])/;
    function getFileNamesFromConfigSpecs(configFileSpecs, basePath, options, host, extraFileExtensions) {
      if (extraFileExtensions === void 0) {
        extraFileExtensions = ts2.emptyArray;
      }
      basePath = ts2.normalizePath(basePath);
      var keyMapper = ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames);
      var literalFileMap = new ts2.Map();
      var wildcardFileMap = new ts2.Map();
      var wildCardJsonFileMap = new ts2.Map();
      var validatedFilesSpec = configFileSpecs.validatedFilesSpec, validatedIncludeSpecs = configFileSpecs.validatedIncludeSpecs, validatedExcludeSpecs = configFileSpecs.validatedExcludeSpecs;
      var supportedExtensions = ts2.getSupportedExtensions(options, extraFileExtensions);
      var supportedExtensionsWithJsonIfResolveJsonModule = ts2.getSupportedExtensionsWithJsonIfResolveJsonModule(options, supportedExtensions);
      if (validatedFilesSpec) {
        for (var _i = 0, validatedFilesSpec_1 = validatedFilesSpec; _i < validatedFilesSpec_1.length; _i++) {
          var fileName = validatedFilesSpec_1[_i];
          var file = ts2.getNormalizedAbsolutePath(fileName, basePath);
          literalFileMap.set(keyMapper(file), file);
        }
      }
      var jsonOnlyIncludeRegexes;
      if (validatedIncludeSpecs && validatedIncludeSpecs.length > 0) {
        var _loop_6 = function(file2) {
          if (ts2.fileExtensionIs(file2, ".json")) {
            if (!jsonOnlyIncludeRegexes) {
              var includes = validatedIncludeSpecs.filter(function(s) {
                return ts2.endsWith(s, ".json");
              });
              var includeFilePatterns = ts2.map(ts2.getRegularExpressionsForWildcards(includes, basePath, "files"), function(pattern) {
                return "^".concat(pattern, "$");
              });
              jsonOnlyIncludeRegexes = includeFilePatterns ? includeFilePatterns.map(function(pattern) {
                return ts2.getRegexFromPattern(pattern, host.useCaseSensitiveFileNames);
              }) : ts2.emptyArray;
            }
            var includeIndex = ts2.findIndex(jsonOnlyIncludeRegexes, function(re) {
              return re.test(file2);
            });
            if (includeIndex !== -1) {
              var key_1 = keyMapper(file2);
              if (!literalFileMap.has(key_1) && !wildCardJsonFileMap.has(key_1)) {
                wildCardJsonFileMap.set(key_1, file2);
              }
            }
            return "continue";
          }
          if (hasFileWithHigherPriorityExtension(file2, literalFileMap, wildcardFileMap, supportedExtensions, keyMapper)) {
            return "continue";
          }
          removeWildcardFilesWithLowerPriorityExtension(file2, wildcardFileMap, supportedExtensions, keyMapper);
          var key = keyMapper(file2);
          if (!literalFileMap.has(key) && !wildcardFileMap.has(key)) {
            wildcardFileMap.set(key, file2);
          }
        };
        for (var _a = 0, _b = host.readDirectory(basePath, ts2.flatten(supportedExtensionsWithJsonIfResolveJsonModule), validatedExcludeSpecs, validatedIncludeSpecs, void 0); _a < _b.length; _a++) {
          var file = _b[_a];
          _loop_6(file);
        }
      }
      var literalFiles = ts2.arrayFrom(literalFileMap.values());
      var wildcardFiles = ts2.arrayFrom(wildcardFileMap.values());
      return literalFiles.concat(wildcardFiles, ts2.arrayFrom(wildCardJsonFileMap.values()));
    }
    ts2.getFileNamesFromConfigSpecs = getFileNamesFromConfigSpecs;
    function isExcludedFile(pathToCheck, spec, basePath, useCaseSensitiveFileNames, currentDirectory) {
      var validatedFilesSpec = spec.validatedFilesSpec, validatedIncludeSpecs = spec.validatedIncludeSpecs, validatedExcludeSpecs = spec.validatedExcludeSpecs;
      if (!ts2.length(validatedIncludeSpecs) || !ts2.length(validatedExcludeSpecs))
        return false;
      basePath = ts2.normalizePath(basePath);
      var keyMapper = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      if (validatedFilesSpec) {
        for (var _i = 0, validatedFilesSpec_2 = validatedFilesSpec; _i < validatedFilesSpec_2.length; _i++) {
          var fileName = validatedFilesSpec_2[_i];
          if (keyMapper(ts2.getNormalizedAbsolutePath(fileName, basePath)) === pathToCheck)
            return false;
        }
      }
      return matchesExcludeWorker(pathToCheck, validatedExcludeSpecs, useCaseSensitiveFileNames, currentDirectory, basePath);
    }
    ts2.isExcludedFile = isExcludedFile;
    function invalidDotDotAfterRecursiveWildcard(s) {
      var wildcardIndex = ts2.startsWith(s, "**/") ? 0 : s.indexOf("/**/");
      if (wildcardIndex === -1) {
        return false;
      }
      var lastDotIndex = ts2.endsWith(s, "/..") ? s.length : s.lastIndexOf("/../");
      return lastDotIndex > wildcardIndex;
    }
    function matchesExclude(pathToCheck, excludeSpecs, useCaseSensitiveFileNames, currentDirectory) {
      return matchesExcludeWorker(pathToCheck, ts2.filter(excludeSpecs, function(spec) {
        return !invalidDotDotAfterRecursiveWildcard(spec);
      }), useCaseSensitiveFileNames, currentDirectory);
    }
    ts2.matchesExclude = matchesExclude;
    function matchesExcludeWorker(pathToCheck, excludeSpecs, useCaseSensitiveFileNames, currentDirectory, basePath) {
      var excludePattern = ts2.getRegularExpressionForWildcard(excludeSpecs, ts2.combinePaths(ts2.normalizePath(currentDirectory), basePath), "exclude");
      var excludeRegex = excludePattern && ts2.getRegexFromPattern(excludePattern, useCaseSensitiveFileNames);
      if (!excludeRegex)
        return false;
      if (excludeRegex.test(pathToCheck))
        return true;
      return !ts2.hasExtension(pathToCheck) && excludeRegex.test(ts2.ensureTrailingDirectorySeparator(pathToCheck));
    }
    function validateSpecs(specs, errors, disallowTrailingRecursion, jsonSourceFile, specKey) {
      return specs.filter(function(spec) {
        if (!ts2.isString(spec))
          return false;
        var diag = specToDiagnostic(spec, disallowTrailingRecursion);
        if (diag !== void 0) {
          errors.push(createDiagnostic.apply(void 0, diag));
        }
        return diag === void 0;
      });
      function createDiagnostic(message, spec) {
        var element = ts2.getTsConfigPropArrayElementValue(jsonSourceFile, specKey, spec);
        return element ? ts2.createDiagnosticForNodeInSourceFile(jsonSourceFile, element, message, spec) : ts2.createCompilerDiagnostic(message, spec);
      }
    }
    function specToDiagnostic(spec, disallowTrailingRecursion) {
      if (disallowTrailingRecursion && invalidTrailingRecursionPattern.test(spec)) {
        return [ts2.Diagnostics.File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, spec];
      } else if (invalidDotDotAfterRecursiveWildcard(spec)) {
        return [ts2.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, spec];
      }
    }
    function getWildcardDirectories(_a, path, useCaseSensitiveFileNames) {
      var include = _a.validatedIncludeSpecs, exclude = _a.validatedExcludeSpecs;
      var rawExcludeRegex = ts2.getRegularExpressionForWildcard(exclude, path, "exclude");
      var excludeRegex = rawExcludeRegex && new RegExp(rawExcludeRegex, useCaseSensitiveFileNames ? "" : "i");
      var wildcardDirectories = {};
      if (include !== void 0) {
        var recursiveKeys = [];
        for (var _i = 0, include_1 = include; _i < include_1.length; _i++) {
          var file = include_1[_i];
          var spec = ts2.normalizePath(ts2.combinePaths(path, file));
          if (excludeRegex && excludeRegex.test(spec)) {
            continue;
          }
          var match = getWildcardDirectoryFromSpec(spec, useCaseSensitiveFileNames);
          if (match) {
            var key = match.key, flags = match.flags;
            var existingFlags = wildcardDirectories[key];
            if (existingFlags === void 0 || existingFlags < flags) {
              wildcardDirectories[key] = flags;
              if (flags === 1) {
                recursiveKeys.push(key);
              }
            }
          }
        }
        for (var key in wildcardDirectories) {
          if (ts2.hasProperty(wildcardDirectories, key)) {
            for (var _b = 0, recursiveKeys_1 = recursiveKeys; _b < recursiveKeys_1.length; _b++) {
              var recursiveKey = recursiveKeys_1[_b];
              if (key !== recursiveKey && ts2.containsPath(recursiveKey, key, path, !useCaseSensitiveFileNames)) {
                delete wildcardDirectories[key];
              }
            }
          }
        }
      }
      return wildcardDirectories;
    }
    function getWildcardDirectoryFromSpec(spec, useCaseSensitiveFileNames) {
      var match = wildcardDirectoryPattern.exec(spec);
      if (match) {
        var questionWildcardIndex = spec.indexOf("?");
        var starWildcardIndex = spec.indexOf("*");
        var lastDirectorySeperatorIndex = spec.lastIndexOf(ts2.directorySeparator);
        return {
          key: useCaseSensitiveFileNames ? match[0] : ts2.toFileNameLowerCase(match[0]),
          flags: questionWildcardIndex !== -1 && questionWildcardIndex < lastDirectorySeperatorIndex || starWildcardIndex !== -1 && starWildcardIndex < lastDirectorySeperatorIndex ? 1 : 0
        };
      }
      if (ts2.isImplicitGlob(spec)) {
        return {
          key: useCaseSensitiveFileNames ? spec : ts2.toFileNameLowerCase(spec),
          flags: 1
        };
      }
      return void 0;
    }
    function hasFileWithHigherPriorityExtension(file, literalFiles, wildcardFiles, extensions, keyMapper) {
      var extensionGroup = ts2.forEach(extensions, function(group) {
        return ts2.fileExtensionIsOneOf(file, group) ? group : void 0;
      });
      if (!extensionGroup) {
        return false;
      }
      for (var _i = 0, extensionGroup_1 = extensionGroup; _i < extensionGroup_1.length; _i++) {
        var ext = extensionGroup_1[_i];
        if (ts2.fileExtensionIs(file, ext)) {
          return false;
        }
        var higherPriorityPath = keyMapper(ts2.changeExtension(file, ext));
        if (literalFiles.has(higherPriorityPath) || wildcardFiles.has(higherPriorityPath)) {
          if (ext === ".d.ts" && (ts2.fileExtensionIs(file, ".js") || ts2.fileExtensionIs(file, ".jsx"))) {
            continue;
          }
          return true;
        }
      }
      return false;
    }
    function removeWildcardFilesWithLowerPriorityExtension(file, wildcardFiles, extensions, keyMapper) {
      var extensionGroup = ts2.forEach(extensions, function(group) {
        return ts2.fileExtensionIsOneOf(file, group) ? group : void 0;
      });
      if (!extensionGroup) {
        return;
      }
      for (var i = extensionGroup.length - 1; i >= 0; i--) {
        var ext = extensionGroup[i];
        if (ts2.fileExtensionIs(file, ext)) {
          return;
        }
        var lowerPriorityPath = keyMapper(ts2.changeExtension(file, ext));
        wildcardFiles.delete(lowerPriorityPath);
      }
    }
    function convertCompilerOptionsForTelemetry(opts) {
      var out = {};
      for (var key in opts) {
        if (opts.hasOwnProperty(key)) {
          var type = getOptionFromName(key);
          if (type !== void 0) {
            out[key] = getOptionValueWithEmptyStrings(opts[key], type);
          }
        }
      }
      return out;
    }
    ts2.convertCompilerOptionsForTelemetry = convertCompilerOptionsForTelemetry;
    function getOptionValueWithEmptyStrings(value, option) {
      switch (option.type) {
        case "object":
          return "";
        case "string":
          return "";
        case "number":
          return typeof value === "number" ? value : "";
        case "boolean":
          return typeof value === "boolean" ? value : "";
        case "list":
          var elementType_1 = option.element;
          return ts2.isArray(value) ? value.map(function(v) {
            return getOptionValueWithEmptyStrings(v, elementType_1);
          }) : "";
        default:
          return ts2.forEachEntry(option.type, function(optionEnumValue, optionStringValue) {
            if (optionEnumValue === value) {
              return optionStringValue;
            }
          });
      }
    }
    function getDefaultValueForOption(option) {
      switch (option.type) {
        case "number":
          return 1;
        case "boolean":
          return true;
        case "string":
          return option.isFilePath ? "./" : "";
        case "list":
          return [];
        case "object":
          return {};
        default:
          var iterResult = option.type.keys().next();
          if (!iterResult.done)
            return iterResult.value;
          return ts2.Debug.fail("Expected 'option.type' to have entries.");
      }
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function trace(host) {
      host.trace(ts2.formatMessage.apply(void 0, arguments));
    }
    ts2.trace = trace;
    function isTraceEnabled(compilerOptions, host) {
      return !!compilerOptions.traceResolution && host.trace !== void 0;
    }
    ts2.isTraceEnabled = isTraceEnabled;
    function withPackageId(packageInfo, r) {
      var packageId;
      if (r && packageInfo) {
        var packageJsonContent = packageInfo.packageJsonContent;
        if (typeof packageJsonContent.name === "string" && typeof packageJsonContent.version === "string") {
          packageId = {
            name: packageJsonContent.name,
            subModuleName: r.path.slice(packageInfo.packageDirectory.length + ts2.directorySeparator.length),
            version: packageJsonContent.version
          };
        }
      }
      return r && { path: r.path, extension: r.ext, packageId };
    }
    function noPackageId(r) {
      return withPackageId(void 0, r);
    }
    function removeIgnoredPackageId(r) {
      if (r) {
        ts2.Debug.assert(r.packageId === void 0);
        return { path: r.path, ext: r.extension };
      }
    }
    var Extensions;
    (function(Extensions2) {
      Extensions2[Extensions2["TypeScript"] = 0] = "TypeScript";
      Extensions2[Extensions2["JavaScript"] = 1] = "JavaScript";
      Extensions2[Extensions2["Json"] = 2] = "Json";
      Extensions2[Extensions2["TSConfig"] = 3] = "TSConfig";
      Extensions2[Extensions2["DtsOnly"] = 4] = "DtsOnly";
    })(Extensions || (Extensions = {}));
    function resolvedTypeScriptOnly(resolved) {
      if (!resolved) {
        return void 0;
      }
      ts2.Debug.assert(ts2.extensionIsTS(resolved.extension));
      return { fileName: resolved.path, packageId: resolved.packageId };
    }
    function createResolvedModuleWithFailedLookupLocations(resolved, isExternalLibraryImport, failedLookupLocations, resultFromCache) {
      var _a;
      if (resultFromCache) {
        (_a = resultFromCache.failedLookupLocations).push.apply(_a, failedLookupLocations);
        return resultFromCache;
      }
      return {
        resolvedModule: resolved && { resolvedFileName: resolved.path, originalPath: resolved.originalPath === true ? void 0 : resolved.originalPath, extension: resolved.extension, isExternalLibraryImport, packageId: resolved.packageId },
        failedLookupLocations
      };
    }
    function readPackageJsonField(jsonContent, fieldName, typeOfTag, state) {
      if (!ts2.hasProperty(jsonContent, fieldName)) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.package_json_does_not_have_a_0_field, fieldName);
        }
        return;
      }
      var value = jsonContent[fieldName];
      if (typeof value !== typeOfTag || value === null) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Expected_type_of_0_field_in_package_json_to_be_1_got_2, fieldName, typeOfTag, value === null ? "null" : typeof value);
        }
        return;
      }
      return value;
    }
    function readPackageJsonPathField(jsonContent, fieldName, baseDirectory, state) {
      var fileName = readPackageJsonField(jsonContent, fieldName, "string", state);
      if (fileName === void 0) {
        return;
      }
      if (!fileName) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.package_json_had_a_falsy_0_field, fieldName);
        }
        return;
      }
      var path = ts2.normalizePath(ts2.combinePaths(baseDirectory, fileName));
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.package_json_has_0_field_1_that_references_2, fieldName, fileName, path);
      }
      return path;
    }
    function readPackageJsonTypesFields(jsonContent, baseDirectory, state) {
      return readPackageJsonPathField(jsonContent, "typings", baseDirectory, state) || readPackageJsonPathField(jsonContent, "types", baseDirectory, state);
    }
    function readPackageJsonTSConfigField(jsonContent, baseDirectory, state) {
      return readPackageJsonPathField(jsonContent, "tsconfig", baseDirectory, state);
    }
    function readPackageJsonMainField(jsonContent, baseDirectory, state) {
      return readPackageJsonPathField(jsonContent, "main", baseDirectory, state);
    }
    function readPackageJsonTypesVersionsField(jsonContent, state) {
      var typesVersions = readPackageJsonField(jsonContent, "typesVersions", "object", state);
      if (typesVersions === void 0)
        return;
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.package_json_has_a_typesVersions_field_with_version_specific_path_mappings);
      }
      return typesVersions;
    }
    function readPackageJsonTypesVersionPaths(jsonContent, state) {
      var typesVersions = readPackageJsonTypesVersionsField(jsonContent, state);
      if (typesVersions === void 0)
        return;
      if (state.traceEnabled) {
        for (var key in typesVersions) {
          if (ts2.hasProperty(typesVersions, key) && !ts2.VersionRange.tryParse(key)) {
            trace(state.host, ts2.Diagnostics.package_json_has_a_typesVersions_entry_0_that_is_not_a_valid_semver_range, key);
          }
        }
      }
      var result = getPackageJsonTypesVersionsPaths(typesVersions);
      if (!result) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.package_json_does_not_have_a_typesVersions_entry_that_matches_version_0, ts2.versionMajorMinor);
        }
        return;
      }
      var bestVersionKey = result.version, bestVersionPaths = result.paths;
      if (typeof bestVersionPaths !== "object") {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Expected_type_of_0_field_in_package_json_to_be_1_got_2, "typesVersions['".concat(bestVersionKey, "']"), "object", typeof bestVersionPaths);
        }
        return;
      }
      return result;
    }
    var typeScriptVersion;
    function getPackageJsonTypesVersionsPaths(typesVersions) {
      if (!typeScriptVersion)
        typeScriptVersion = new ts2.Version(ts2.version);
      for (var key in typesVersions) {
        if (!ts2.hasProperty(typesVersions, key))
          continue;
        var keyRange = ts2.VersionRange.tryParse(key);
        if (keyRange === void 0) {
          continue;
        }
        if (keyRange.test(typeScriptVersion)) {
          return { version: key, paths: typesVersions[key] };
        }
      }
    }
    ts2.getPackageJsonTypesVersionsPaths = getPackageJsonTypesVersionsPaths;
    function getEffectiveTypeRoots(options, host) {
      if (options.typeRoots) {
        return options.typeRoots;
      }
      var currentDirectory;
      if (options.configFilePath) {
        currentDirectory = ts2.getDirectoryPath(options.configFilePath);
      } else if (host.getCurrentDirectory) {
        currentDirectory = host.getCurrentDirectory();
      }
      if (currentDirectory !== void 0) {
        return getDefaultTypeRoots(currentDirectory, host);
      }
    }
    ts2.getEffectiveTypeRoots = getEffectiveTypeRoots;
    function getDefaultTypeRoots(currentDirectory, host) {
      if (!host.directoryExists) {
        return [ts2.combinePaths(currentDirectory, nodeModulesAtTypes)];
      }
      var typeRoots;
      ts2.forEachAncestorDirectory(ts2.normalizePath(currentDirectory), function(directory) {
        var atTypes = ts2.combinePaths(directory, nodeModulesAtTypes);
        if (host.directoryExists(atTypes)) {
          (typeRoots || (typeRoots = [])).push(atTypes);
        }
        return void 0;
      });
      return typeRoots;
    }
    var nodeModulesAtTypes = ts2.combinePaths("node_modules", "@types");
    function arePathsEqual(path1, path2, host) {
      var useCaseSensitiveFileNames = typeof host.useCaseSensitiveFileNames === "function" ? host.useCaseSensitiveFileNames() : host.useCaseSensitiveFileNames;
      return ts2.comparePaths(path1, path2, !useCaseSensitiveFileNames) === 0;
    }
    function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host, redirectedReference, cache) {
      var traceEnabled = isTraceEnabled(options, host);
      if (redirectedReference) {
        options = redirectedReference.commandLine.options;
      }
      var containingDirectory = containingFile ? ts2.getDirectoryPath(containingFile) : void 0;
      var perFolderCache = containingDirectory ? cache && cache.getOrCreateCacheForDirectory(containingDirectory, redirectedReference) : void 0;
      var result = perFolderCache && perFolderCache.get(typeReferenceDirectiveName, void 0);
      if (result) {
        if (traceEnabled) {
          trace(host, ts2.Diagnostics.Resolving_type_reference_directive_0_containing_file_1, typeReferenceDirectiveName, containingFile);
          if (redirectedReference)
            trace(host, ts2.Diagnostics.Using_compiler_options_of_project_reference_redirect_0, redirectedReference.sourceFile.fileName);
          trace(host, ts2.Diagnostics.Resolution_for_type_reference_directive_0_was_found_in_cache_from_location_1, typeReferenceDirectiveName, containingDirectory);
          traceResult(result);
        }
        return result;
      }
      var typeRoots = getEffectiveTypeRoots(options, host);
      if (traceEnabled) {
        if (containingFile === void 0) {
          if (typeRoots === void 0) {
            trace(host, ts2.Diagnostics.Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set, typeReferenceDirectiveName);
          } else {
            trace(host, ts2.Diagnostics.Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1, typeReferenceDirectiveName, typeRoots);
          }
        } else {
          if (typeRoots === void 0) {
            trace(host, ts2.Diagnostics.Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set, typeReferenceDirectiveName, containingFile);
          } else {
            trace(host, ts2.Diagnostics.Resolving_type_reference_directive_0_containing_file_1_root_directory_2, typeReferenceDirectiveName, containingFile, typeRoots);
          }
        }
        if (redirectedReference) {
          trace(host, ts2.Diagnostics.Using_compiler_options_of_project_reference_redirect_0, redirectedReference.sourceFile.fileName);
        }
      }
      var failedLookupLocations = [];
      var features = ts2.getEmitModuleResolutionKind(options) === ts2.ModuleResolutionKind.Node12 ? NodeResolutionFeatures.Node12Default : ts2.getEmitModuleResolutionKind(options) === ts2.ModuleResolutionKind.NodeNext ? NodeResolutionFeatures.NodeNextDefault : NodeResolutionFeatures.None;
      var moduleResolutionState = { compilerOptions: options, host, traceEnabled, failedLookupLocations, packageJsonInfoCache: cache, features, conditions: ["node", "require", "types"] };
      var resolved = primaryLookup();
      var primary = true;
      if (!resolved) {
        resolved = secondaryLookup();
        primary = false;
      }
      var resolvedTypeReferenceDirective;
      if (resolved) {
        var fileName = resolved.fileName, packageId = resolved.packageId;
        var resolvedFileName = options.preserveSymlinks ? fileName : realPath(fileName, host, traceEnabled);
        resolvedTypeReferenceDirective = {
          primary,
          resolvedFileName,
          originalPath: arePathsEqual(fileName, resolvedFileName, host) ? void 0 : fileName,
          packageId,
          isExternalLibraryImport: pathContainsNodeModules(fileName)
        };
      }
      result = { resolvedTypeReferenceDirective, failedLookupLocations };
      perFolderCache === null || perFolderCache === void 0 ? void 0 : perFolderCache.set(typeReferenceDirectiveName, void 0, result);
      if (traceEnabled)
        traceResult(result);
      return result;
      function traceResult(result2) {
        var _a;
        if (!((_a = result2.resolvedTypeReferenceDirective) === null || _a === void 0 ? void 0 : _a.resolvedFileName)) {
          trace(host, ts2.Diagnostics.Type_reference_directive_0_was_not_resolved, typeReferenceDirectiveName);
        } else if (result2.resolvedTypeReferenceDirective.packageId) {
          trace(host, ts2.Diagnostics.Type_reference_directive_0_was_successfully_resolved_to_1_with_Package_ID_2_primary_Colon_3, typeReferenceDirectiveName, result2.resolvedTypeReferenceDirective.resolvedFileName, ts2.packageIdToString(result2.resolvedTypeReferenceDirective.packageId), result2.resolvedTypeReferenceDirective.primary);
        } else {
          trace(host, ts2.Diagnostics.Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2, typeReferenceDirectiveName, result2.resolvedTypeReferenceDirective.resolvedFileName, result2.resolvedTypeReferenceDirective.primary);
        }
      }
      function primaryLookup() {
        if (typeRoots && typeRoots.length) {
          if (traceEnabled) {
            trace(host, ts2.Diagnostics.Resolving_with_primary_search_path_0, typeRoots.join(", "));
          }
          return ts2.firstDefined(typeRoots, function(typeRoot) {
            var candidate = ts2.combinePaths(typeRoot, typeReferenceDirectiveName);
            var candidateDirectory = ts2.getDirectoryPath(candidate);
            var directoryExists = ts2.directoryProbablyExists(candidateDirectory, host);
            if (!directoryExists && traceEnabled) {
              trace(host, ts2.Diagnostics.Directory_0_does_not_exist_skipping_all_lookups_in_it, candidateDirectory);
            }
            return resolvedTypeScriptOnly(loadNodeModuleFromDirectory(Extensions.DtsOnly, candidate, !directoryExists, moduleResolutionState));
          });
        } else {
          if (traceEnabled) {
            trace(host, ts2.Diagnostics.Root_directory_cannot_be_determined_skipping_primary_search_paths);
          }
        }
      }
      function secondaryLookup() {
        var initialLocationForSecondaryLookup = containingFile && ts2.getDirectoryPath(containingFile);
        if (initialLocationForSecondaryLookup !== void 0) {
          if (traceEnabled) {
            trace(host, ts2.Diagnostics.Looking_up_in_node_modules_folder_initial_location_0, initialLocationForSecondaryLookup);
          }
          var result_4;
          if (!ts2.isExternalModuleNameRelative(typeReferenceDirectiveName)) {
            var searchResult = loadModuleFromNearestNodeModulesDirectory(Extensions.DtsOnly, typeReferenceDirectiveName, initialLocationForSecondaryLookup, moduleResolutionState, void 0, void 0);
            result_4 = searchResult && searchResult.value;
          } else {
            var candidate = ts2.normalizePathAndParts(ts2.combinePaths(initialLocationForSecondaryLookup, typeReferenceDirectiveName)).path;
            result_4 = nodeLoadModuleByRelativeName(Extensions.DtsOnly, candidate, false, moduleResolutionState, true);
          }
          return resolvedTypeScriptOnly(result_4);
        } else {
          if (traceEnabled) {
            trace(host, ts2.Diagnostics.Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_modules_folder);
          }
        }
      }
    }
    ts2.resolveTypeReferenceDirective = resolveTypeReferenceDirective;
    function getAutomaticTypeDirectiveNames(options, host) {
      if (options.types) {
        return options.types;
      }
      var result = [];
      if (host.directoryExists && host.getDirectories) {
        var typeRoots = getEffectiveTypeRoots(options, host);
        if (typeRoots) {
          for (var _i = 0, typeRoots_1 = typeRoots; _i < typeRoots_1.length; _i++) {
            var root = typeRoots_1[_i];
            if (host.directoryExists(root)) {
              for (var _a = 0, _b = host.getDirectories(root); _a < _b.length; _a++) {
                var typeDirectivePath = _b[_a];
                var normalized = ts2.normalizePath(typeDirectivePath);
                var packageJsonPath = ts2.combinePaths(root, normalized, "package.json");
                var isNotNeededPackage = host.fileExists(packageJsonPath) && ts2.readJson(packageJsonPath, host).typings === null;
                if (!isNotNeededPackage) {
                  var baseFileName = ts2.getBaseFileName(normalized);
                  if (baseFileName.charCodeAt(0) !== 46) {
                    result.push(baseFileName);
                  }
                }
              }
            }
          }
        }
      }
      return result;
    }
    ts2.getAutomaticTypeDirectiveNames = getAutomaticTypeDirectiveNames;
    function createCacheWithRedirects(options) {
      var ownMap = new ts2.Map();
      var redirectsMap = new ts2.Map();
      return {
        getOwnMap,
        redirectsMap,
        getOrCreateMapOfCacheRedirects,
        clear,
        setOwnOptions,
        setOwnMap
      };
      function getOwnMap() {
        return ownMap;
      }
      function setOwnOptions(newOptions) {
        options = newOptions;
      }
      function setOwnMap(newOwnMap) {
        ownMap = newOwnMap;
      }
      function getOrCreateMapOfCacheRedirects(redirectedReference) {
        if (!redirectedReference) {
          return ownMap;
        }
        var path = redirectedReference.sourceFile.path;
        var redirects = redirectsMap.get(path);
        if (!redirects) {
          redirects = !options || ts2.optionsHaveModuleResolutionChanges(options, redirectedReference.commandLine.options) ? new ts2.Map() : ownMap;
          redirectsMap.set(path, redirects);
        }
        return redirects;
      }
      function clear() {
        ownMap.clear();
        redirectsMap.clear();
      }
    }
    ts2.createCacheWithRedirects = createCacheWithRedirects;
    function createPackageJsonInfoCache(currentDirectory, getCanonicalFileName) {
      var cache;
      return { getPackageJsonInfo: getPackageJsonInfo2, setPackageJsonInfo, clear, entries };
      function getPackageJsonInfo2(packageJsonPath) {
        return cache === null || cache === void 0 ? void 0 : cache.get(ts2.toPath(packageJsonPath, currentDirectory, getCanonicalFileName));
      }
      function setPackageJsonInfo(packageJsonPath, info) {
        (cache || (cache = new ts2.Map())).set(ts2.toPath(packageJsonPath, currentDirectory, getCanonicalFileName), info);
      }
      function clear() {
        cache = void 0;
      }
      function entries() {
        var iter = cache === null || cache === void 0 ? void 0 : cache.entries();
        return iter ? ts2.arrayFrom(iter) : [];
      }
    }
    function getOrCreateCache(cacheWithRedirects, redirectedReference, key, create2) {
      var cache = cacheWithRedirects.getOrCreateMapOfCacheRedirects(redirectedReference);
      var result = cache.get(key);
      if (!result) {
        result = create2();
        cache.set(key, result);
      }
      return result;
    }
    function updateRedirectsMap(options, directoryToModuleNameMap, moduleNameToDirectoryMap) {
      if (!options.configFile)
        return;
      if (directoryToModuleNameMap.redirectsMap.size === 0) {
        ts2.Debug.assert(!moduleNameToDirectoryMap || moduleNameToDirectoryMap.redirectsMap.size === 0);
        ts2.Debug.assert(directoryToModuleNameMap.getOwnMap().size === 0);
        ts2.Debug.assert(!moduleNameToDirectoryMap || moduleNameToDirectoryMap.getOwnMap().size === 0);
        directoryToModuleNameMap.redirectsMap.set(options.configFile.path, directoryToModuleNameMap.getOwnMap());
        moduleNameToDirectoryMap === null || moduleNameToDirectoryMap === void 0 ? void 0 : moduleNameToDirectoryMap.redirectsMap.set(options.configFile.path, moduleNameToDirectoryMap.getOwnMap());
      } else {
        ts2.Debug.assert(!moduleNameToDirectoryMap || moduleNameToDirectoryMap.redirectsMap.size > 0);
        var ref = {
          sourceFile: options.configFile,
          commandLine: { options }
        };
        directoryToModuleNameMap.setOwnMap(directoryToModuleNameMap.getOrCreateMapOfCacheRedirects(ref));
        moduleNameToDirectoryMap === null || moduleNameToDirectoryMap === void 0 ? void 0 : moduleNameToDirectoryMap.setOwnMap(moduleNameToDirectoryMap.getOrCreateMapOfCacheRedirects(ref));
      }
      directoryToModuleNameMap.setOwnOptions(options);
      moduleNameToDirectoryMap === null || moduleNameToDirectoryMap === void 0 ? void 0 : moduleNameToDirectoryMap.setOwnOptions(options);
    }
    function createPerDirectoryResolutionCache(currentDirectory, getCanonicalFileName, directoryToModuleNameMap) {
      return {
        getOrCreateCacheForDirectory,
        clear,
        update
      };
      function clear() {
        directoryToModuleNameMap.clear();
      }
      function update(options) {
        updateRedirectsMap(options, directoryToModuleNameMap);
      }
      function getOrCreateCacheForDirectory(directoryName, redirectedReference) {
        var path = ts2.toPath(directoryName, currentDirectory, getCanonicalFileName);
        return getOrCreateCache(directoryToModuleNameMap, redirectedReference, path, function() {
          return createModeAwareCache();
        });
      }
    }
    function createModeAwareCache() {
      var underlying = new ts2.Map();
      var memoizedReverseKeys = new ts2.Map();
      var cache = {
        get: function(specifier, mode) {
          return underlying.get(getUnderlyingCacheKey(specifier, mode));
        },
        set: function(specifier, mode, value) {
          underlying.set(getUnderlyingCacheKey(specifier, mode), value);
          return cache;
        },
        delete: function(specifier, mode) {
          underlying.delete(getUnderlyingCacheKey(specifier, mode));
          return cache;
        },
        has: function(specifier, mode) {
          return underlying.has(getUnderlyingCacheKey(specifier, mode));
        },
        forEach: function(cb) {
          return underlying.forEach(function(elem, key) {
            var _a = memoizedReverseKeys.get(key), specifier = _a[0], mode = _a[1];
            return cb(elem, specifier, mode);
          });
        },
        size: function() {
          return underlying.size;
        }
      };
      return cache;
      function getUnderlyingCacheKey(specifier, mode) {
        var result = mode === void 0 ? specifier : "".concat(mode, "|").concat(specifier);
        memoizedReverseKeys.set(result, [specifier, mode]);
        return result;
      }
    }
    ts2.createModeAwareCache = createModeAwareCache;
    function zipToModeAwareCache(file, keys, values) {
      ts2.Debug.assert(keys.length === values.length);
      var map = createModeAwareCache();
      for (var i = 0; i < keys.length; ++i) {
        map.set(keys[i], ts2.getModeForResolutionAtIndex(file, i), values[i]);
      }
      return map;
    }
    ts2.zipToModeAwareCache = zipToModeAwareCache;
    function createModuleResolutionCache(currentDirectory, getCanonicalFileName, options, directoryToModuleNameMap, moduleNameToDirectoryMap) {
      var preDirectoryResolutionCache = createPerDirectoryResolutionCache(currentDirectory, getCanonicalFileName, directoryToModuleNameMap || (directoryToModuleNameMap = createCacheWithRedirects(options)));
      moduleNameToDirectoryMap || (moduleNameToDirectoryMap = createCacheWithRedirects(options));
      var packageJsonInfoCache = createPackageJsonInfoCache(currentDirectory, getCanonicalFileName);
      return __assign(__assign(__assign({}, packageJsonInfoCache), preDirectoryResolutionCache), { getOrCreateCacheForModuleName, clear, update, getPackageJsonInfoCache: function() {
        return packageJsonInfoCache;
      } });
      function clear() {
        preDirectoryResolutionCache.clear();
        moduleNameToDirectoryMap.clear();
        packageJsonInfoCache.clear();
      }
      function update(options2) {
        updateRedirectsMap(options2, directoryToModuleNameMap, moduleNameToDirectoryMap);
      }
      function getOrCreateCacheForModuleName(nonRelativeModuleName, mode, redirectedReference) {
        ts2.Debug.assert(!ts2.isExternalModuleNameRelative(nonRelativeModuleName));
        return getOrCreateCache(moduleNameToDirectoryMap, redirectedReference, mode === void 0 ? nonRelativeModuleName : "".concat(mode, "|").concat(nonRelativeModuleName), createPerModuleNameCache);
      }
      function createPerModuleNameCache() {
        var directoryPathMap = new ts2.Map();
        return { get, set };
        function get(directory) {
          return directoryPathMap.get(ts2.toPath(directory, currentDirectory, getCanonicalFileName));
        }
        function set(directory, result) {
          var path = ts2.toPath(directory, currentDirectory, getCanonicalFileName);
          if (directoryPathMap.has(path)) {
            return;
          }
          directoryPathMap.set(path, result);
          var resolvedFileName = result.resolvedModule && (result.resolvedModule.originalPath || result.resolvedModule.resolvedFileName);
          var commonPrefix = resolvedFileName && getCommonPrefix(path, resolvedFileName);
          var current = path;
          while (current !== commonPrefix) {
            var parent = ts2.getDirectoryPath(current);
            if (parent === current || directoryPathMap.has(parent)) {
              break;
            }
            directoryPathMap.set(parent, result);
            current = parent;
          }
        }
        function getCommonPrefix(directory, resolution) {
          var resolutionDirectory = ts2.toPath(ts2.getDirectoryPath(resolution), currentDirectory, getCanonicalFileName);
          var i = 0;
          var limit = Math.min(directory.length, resolutionDirectory.length);
          while (i < limit && directory.charCodeAt(i) === resolutionDirectory.charCodeAt(i)) {
            i++;
          }
          if (i === directory.length && (resolutionDirectory.length === i || resolutionDirectory[i] === ts2.directorySeparator)) {
            return directory;
          }
          var rootLength = ts2.getRootLength(directory);
          if (i < rootLength) {
            return void 0;
          }
          var sep = directory.lastIndexOf(ts2.directorySeparator, i - 1);
          if (sep === -1) {
            return void 0;
          }
          return directory.substr(0, Math.max(sep, rootLength));
        }
      }
    }
    ts2.createModuleResolutionCache = createModuleResolutionCache;
    function createTypeReferenceDirectiveResolutionCache(currentDirectory, getCanonicalFileName, options, packageJsonInfoCache, directoryToModuleNameMap) {
      var preDirectoryResolutionCache = createPerDirectoryResolutionCache(currentDirectory, getCanonicalFileName, directoryToModuleNameMap || (directoryToModuleNameMap = createCacheWithRedirects(options)));
      packageJsonInfoCache || (packageJsonInfoCache = createPackageJsonInfoCache(currentDirectory, getCanonicalFileName));
      return __assign(__assign(__assign({}, packageJsonInfoCache), preDirectoryResolutionCache), { clear });
      function clear() {
        preDirectoryResolutionCache.clear();
        packageJsonInfoCache.clear();
      }
    }
    ts2.createTypeReferenceDirectiveResolutionCache = createTypeReferenceDirectiveResolutionCache;
    function resolveModuleNameFromCache(moduleName, containingFile, cache, mode) {
      var containingDirectory = ts2.getDirectoryPath(containingFile);
      var perFolderCache = cache && cache.getOrCreateCacheForDirectory(containingDirectory);
      if (!perFolderCache)
        return void 0;
      return perFolderCache.get(moduleName, mode);
    }
    ts2.resolveModuleNameFromCache = resolveModuleNameFromCache;
    function resolveModuleName(moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode) {
      var traceEnabled = isTraceEnabled(compilerOptions, host);
      if (redirectedReference) {
        compilerOptions = redirectedReference.commandLine.options;
      }
      if (traceEnabled) {
        trace(host, ts2.Diagnostics.Resolving_module_0_from_1, moduleName, containingFile);
        if (redirectedReference) {
          trace(host, ts2.Diagnostics.Using_compiler_options_of_project_reference_redirect_0, redirectedReference.sourceFile.fileName);
        }
      }
      var containingDirectory = ts2.getDirectoryPath(containingFile);
      var perFolderCache = cache && cache.getOrCreateCacheForDirectory(containingDirectory, redirectedReference);
      var result = perFolderCache && perFolderCache.get(moduleName, resolutionMode);
      if (result) {
        if (traceEnabled) {
          trace(host, ts2.Diagnostics.Resolution_for_module_0_was_found_in_cache_from_location_1, moduleName, containingDirectory);
        }
      } else {
        var moduleResolution = compilerOptions.moduleResolution;
        if (moduleResolution === void 0) {
          switch (ts2.getEmitModuleKind(compilerOptions)) {
            case ts2.ModuleKind.CommonJS:
              moduleResolution = ts2.ModuleResolutionKind.NodeJs;
              break;
            case ts2.ModuleKind.Node12:
              moduleResolution = ts2.ModuleResolutionKind.Node12;
              break;
            case ts2.ModuleKind.NodeNext:
              moduleResolution = ts2.ModuleResolutionKind.NodeNext;
              break;
            default:
              moduleResolution = ts2.ModuleResolutionKind.Classic;
              break;
          }
          if (traceEnabled) {
            trace(host, ts2.Diagnostics.Module_resolution_kind_is_not_specified_using_0, ts2.ModuleResolutionKind[moduleResolution]);
          }
        } else {
          if (traceEnabled) {
            trace(host, ts2.Diagnostics.Explicitly_specified_module_resolution_kind_Colon_0, ts2.ModuleResolutionKind[moduleResolution]);
          }
        }
        ts2.perfLogger.logStartResolveModule(moduleName);
        switch (moduleResolution) {
          case ts2.ModuleResolutionKind.Node12:
            result = node12ModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode);
            break;
          case ts2.ModuleResolutionKind.NodeNext:
            result = nodeNextModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode);
            break;
          case ts2.ModuleResolutionKind.NodeJs:
            result = nodeModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference);
            break;
          case ts2.ModuleResolutionKind.Classic:
            result = classicNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference);
            break;
          default:
            return ts2.Debug.fail("Unexpected moduleResolution: ".concat(moduleResolution));
        }
        if (result && result.resolvedModule)
          ts2.perfLogger.logInfoEvent('Module "'.concat(moduleName, '" resolved to "').concat(result.resolvedModule.resolvedFileName, '"'));
        ts2.perfLogger.logStopResolveModule(result && result.resolvedModule ? "" + result.resolvedModule.resolvedFileName : "null");
        if (perFolderCache) {
          perFolderCache.set(moduleName, resolutionMode, result);
          if (!ts2.isExternalModuleNameRelative(moduleName)) {
            cache.getOrCreateCacheForModuleName(moduleName, resolutionMode, redirectedReference).set(containingDirectory, result);
          }
        }
      }
      if (traceEnabled) {
        if (result.resolvedModule) {
          if (result.resolvedModule.packageId) {
            trace(host, ts2.Diagnostics.Module_name_0_was_successfully_resolved_to_1_with_Package_ID_2, moduleName, result.resolvedModule.resolvedFileName, ts2.packageIdToString(result.resolvedModule.packageId));
          } else {
            trace(host, ts2.Diagnostics.Module_name_0_was_successfully_resolved_to_1, moduleName, result.resolvedModule.resolvedFileName);
          }
        } else {
          trace(host, ts2.Diagnostics.Module_name_0_was_not_resolved, moduleName);
        }
      }
      return result;
    }
    ts2.resolveModuleName = resolveModuleName;
    function tryLoadModuleUsingOptionalResolutionSettings(extensions, moduleName, containingDirectory, loader, state) {
      var resolved = tryLoadModuleUsingPathsIfEligible(extensions, moduleName, loader, state);
      if (resolved)
        return resolved.value;
      if (!ts2.isExternalModuleNameRelative(moduleName)) {
        return tryLoadModuleUsingBaseUrl(extensions, moduleName, loader, state);
      } else {
        return tryLoadModuleUsingRootDirs(extensions, moduleName, containingDirectory, loader, state);
      }
    }
    function tryLoadModuleUsingPathsIfEligible(extensions, moduleName, loader, state) {
      var _a;
      var _b = state.compilerOptions, baseUrl = _b.baseUrl, paths = _b.paths, configFile = _b.configFile;
      if (paths && !ts2.pathIsRelative(moduleName)) {
        if (state.traceEnabled) {
          if (baseUrl) {
            trace(state.host, ts2.Diagnostics.baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1, baseUrl, moduleName);
          }
          trace(state.host, ts2.Diagnostics.paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0, moduleName);
        }
        var baseDirectory = ts2.getPathsBasePath(state.compilerOptions, state.host);
        var pathPatterns = (configFile === null || configFile === void 0 ? void 0 : configFile.configFileSpecs) ? (_a = configFile.configFileSpecs).pathPatterns || (_a.pathPatterns = ts2.tryParsePatterns(paths)) : void 0;
        return tryLoadModuleUsingPaths(extensions, moduleName, baseDirectory, paths, pathPatterns, loader, false, state);
      }
    }
    function tryLoadModuleUsingRootDirs(extensions, moduleName, containingDirectory, loader, state) {
      if (!state.compilerOptions.rootDirs) {
        return void 0;
      }
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0, moduleName);
      }
      var candidate = ts2.normalizePath(ts2.combinePaths(containingDirectory, moduleName));
      var matchedRootDir;
      var matchedNormalizedPrefix;
      for (var _i = 0, _a = state.compilerOptions.rootDirs; _i < _a.length; _i++) {
        var rootDir = _a[_i];
        var normalizedRoot = ts2.normalizePath(rootDir);
        if (!ts2.endsWith(normalizedRoot, ts2.directorySeparator)) {
          normalizedRoot += ts2.directorySeparator;
        }
        var isLongestMatchingPrefix = ts2.startsWith(candidate, normalizedRoot) && (matchedNormalizedPrefix === void 0 || matchedNormalizedPrefix.length < normalizedRoot.length);
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Checking_if_0_is_the_longest_matching_prefix_for_1_2, normalizedRoot, candidate, isLongestMatchingPrefix);
        }
        if (isLongestMatchingPrefix) {
          matchedNormalizedPrefix = normalizedRoot;
          matchedRootDir = rootDir;
        }
      }
      if (matchedNormalizedPrefix) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Longest_matching_prefix_for_0_is_1, candidate, matchedNormalizedPrefix);
        }
        var suffix = candidate.substr(matchedNormalizedPrefix.length);
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Loading_0_from_the_root_dir_1_candidate_location_2, suffix, matchedNormalizedPrefix, candidate);
        }
        var resolvedFileName = loader(extensions, candidate, !ts2.directoryProbablyExists(containingDirectory, state.host), state);
        if (resolvedFileName) {
          return resolvedFileName;
        }
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Trying_other_entries_in_rootDirs);
        }
        for (var _b = 0, _c = state.compilerOptions.rootDirs; _b < _c.length; _b++) {
          var rootDir = _c[_b];
          if (rootDir === matchedRootDir) {
            continue;
          }
          var candidate_1 = ts2.combinePaths(ts2.normalizePath(rootDir), suffix);
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.Loading_0_from_the_root_dir_1_candidate_location_2, suffix, rootDir, candidate_1);
          }
          var baseDirectory = ts2.getDirectoryPath(candidate_1);
          var resolvedFileName_1 = loader(extensions, candidate_1, !ts2.directoryProbablyExists(baseDirectory, state.host), state);
          if (resolvedFileName_1) {
            return resolvedFileName_1;
          }
        }
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Module_resolution_using_rootDirs_has_failed);
        }
      }
      return void 0;
    }
    function tryLoadModuleUsingBaseUrl(extensions, moduleName, loader, state) {
      var baseUrl = state.compilerOptions.baseUrl;
      if (!baseUrl) {
        return void 0;
      }
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1, baseUrl, moduleName);
      }
      var candidate = ts2.normalizePath(ts2.combinePaths(baseUrl, moduleName));
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.Resolving_module_name_0_relative_to_base_url_1_2, moduleName, baseUrl, candidate);
      }
      return loader(extensions, candidate, !ts2.directoryProbablyExists(ts2.getDirectoryPath(candidate), state.host), state);
    }
    function resolveJSModule(moduleName, initialDir, host) {
      var _a = tryResolveJSModuleWorker(moduleName, initialDir, host), resolvedModule = _a.resolvedModule, failedLookupLocations = _a.failedLookupLocations;
      if (!resolvedModule) {
        throw new Error("Could not resolve JS module '".concat(moduleName, "' starting at '").concat(initialDir, "'. Looked in: ").concat(failedLookupLocations.join(", ")));
      }
      return resolvedModule.resolvedFileName;
    }
    ts2.resolveJSModule = resolveJSModule;
    function tryResolveJSModule(moduleName, initialDir, host) {
      return tryResolveJSModuleWorker(moduleName, initialDir, host).resolvedModule;
    }
    ts2.tryResolveJSModule = tryResolveJSModule;
    var NodeResolutionFeatures;
    (function(NodeResolutionFeatures2) {
      NodeResolutionFeatures2[NodeResolutionFeatures2["None"] = 0] = "None";
      NodeResolutionFeatures2[NodeResolutionFeatures2["Imports"] = 2] = "Imports";
      NodeResolutionFeatures2[NodeResolutionFeatures2["SelfName"] = 4] = "SelfName";
      NodeResolutionFeatures2[NodeResolutionFeatures2["Exports"] = 8] = "Exports";
      NodeResolutionFeatures2[NodeResolutionFeatures2["ExportsPatternTrailers"] = 16] = "ExportsPatternTrailers";
      NodeResolutionFeatures2[NodeResolutionFeatures2["AllFeatures"] = 30] = "AllFeatures";
      NodeResolutionFeatures2[NodeResolutionFeatures2["Node12Default"] = 14] = "Node12Default";
      NodeResolutionFeatures2[NodeResolutionFeatures2["NodeNextDefault"] = 30] = "NodeNextDefault";
      NodeResolutionFeatures2[NodeResolutionFeatures2["EsmMode"] = 32] = "EsmMode";
    })(NodeResolutionFeatures || (NodeResolutionFeatures = {}));
    function node12ModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode) {
      return nodeNextModuleNameResolverWorker(NodeResolutionFeatures.Node12Default, moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode);
    }
    function nodeNextModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode) {
      return nodeNextModuleNameResolverWorker(NodeResolutionFeatures.NodeNextDefault, moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode);
    }
    function nodeNextModuleNameResolverWorker(features, moduleName, containingFile, compilerOptions, host, cache, redirectedReference, resolutionMode) {
      var containingDirectory = ts2.getDirectoryPath(containingFile);
      var esmMode = resolutionMode === ts2.ModuleKind.ESNext ? NodeResolutionFeatures.EsmMode : 0;
      return nodeModuleNameResolverWorker(features | esmMode, moduleName, containingDirectory, compilerOptions, host, cache, compilerOptions.resolveJsonModule ? tsPlusJsonExtensions : tsExtensions, redirectedReference);
    }
    var jsOnlyExtensions = [Extensions.JavaScript];
    var tsExtensions = [Extensions.TypeScript, Extensions.JavaScript];
    var tsPlusJsonExtensions = __spreadArray(__spreadArray([], tsExtensions, true), [Extensions.Json], false);
    var tsconfigExtensions = [Extensions.TSConfig];
    function tryResolveJSModuleWorker(moduleName, initialDir, host) {
      return nodeModuleNameResolverWorker(NodeResolutionFeatures.None, moduleName, initialDir, { moduleResolution: ts2.ModuleResolutionKind.NodeJs, allowJs: true }, host, void 0, jsOnlyExtensions, void 0);
    }
    function nodeModuleNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference, lookupConfig) {
      return nodeModuleNameResolverWorker(NodeResolutionFeatures.None, moduleName, ts2.getDirectoryPath(containingFile), compilerOptions, host, cache, lookupConfig ? tsconfigExtensions : compilerOptions.resolveJsonModule ? tsPlusJsonExtensions : tsExtensions, redirectedReference);
    }
    ts2.nodeModuleNameResolver = nodeModuleNameResolver;
    function nodeModuleNameResolverWorker(features, moduleName, containingDirectory, compilerOptions, host, cache, extensions, redirectedReference) {
      var _a, _b;
      var traceEnabled = isTraceEnabled(compilerOptions, host);
      var failedLookupLocations = [];
      var state = {
        compilerOptions,
        host,
        traceEnabled,
        failedLookupLocations,
        packageJsonInfoCache: cache,
        features,
        conditions: features & NodeResolutionFeatures.EsmMode ? ["node", "import", "types"] : ["node", "require", "types"]
      };
      var result = ts2.forEach(extensions, function(ext) {
        return tryResolve(ext);
      });
      return createResolvedModuleWithFailedLookupLocations((_a = result === null || result === void 0 ? void 0 : result.value) === null || _a === void 0 ? void 0 : _a.resolved, (_b = result === null || result === void 0 ? void 0 : result.value) === null || _b === void 0 ? void 0 : _b.isExternalLibraryImport, failedLookupLocations, state.resultFromCache);
      function tryResolve(extensions2) {
        var loader = function(extensions3, candidate2, onlyRecordFailures, state2) {
          return nodeLoadModuleByRelativeName(extensions3, candidate2, onlyRecordFailures, state2, true);
        };
        var resolved = tryLoadModuleUsingOptionalResolutionSettings(extensions2, moduleName, containingDirectory, loader, state);
        if (resolved) {
          return toSearchResult({ resolved, isExternalLibraryImport: pathContainsNodeModules(resolved.path) });
        }
        if (!ts2.isExternalModuleNameRelative(moduleName)) {
          var resolved_1;
          if (features & NodeResolutionFeatures.Imports && ts2.startsWith(moduleName, "#")) {
            resolved_1 = loadModuleFromImports(extensions2, moduleName, containingDirectory, state, cache, redirectedReference);
          }
          if (!resolved_1 && features & NodeResolutionFeatures.SelfName) {
            resolved_1 = loadModuleFromSelfNameReference(extensions2, moduleName, containingDirectory, state, cache, redirectedReference);
          }
          if (!resolved_1) {
            if (traceEnabled) {
              trace(host, ts2.Diagnostics.Loading_module_0_from_node_modules_folder_target_file_type_1, moduleName, Extensions[extensions2]);
            }
            resolved_1 = loadModuleFromNearestNodeModulesDirectory(extensions2, moduleName, containingDirectory, state, cache, redirectedReference);
          }
          if (!resolved_1)
            return void 0;
          var resolvedValue = resolved_1.value;
          if (!compilerOptions.preserveSymlinks && resolvedValue && !resolvedValue.originalPath) {
            var path = realPath(resolvedValue.path, host, traceEnabled);
            var originalPath = arePathsEqual(path, resolvedValue.path, host) ? void 0 : resolvedValue.path;
            resolvedValue = __assign(__assign({}, resolvedValue), { path, originalPath });
          }
          return { value: resolvedValue && { resolved: resolvedValue, isExternalLibraryImport: true } };
        } else {
          var _a2 = ts2.normalizePathAndParts(ts2.combinePaths(containingDirectory, moduleName)), candidate = _a2.path, parts = _a2.parts;
          var resolved_2 = nodeLoadModuleByRelativeName(extensions2, candidate, false, state, true);
          return resolved_2 && toSearchResult({ resolved: resolved_2, isExternalLibraryImport: ts2.contains(parts, "node_modules") });
        }
      }
    }
    function realPath(path, host, traceEnabled) {
      if (!host.realpath) {
        return path;
      }
      var real = ts2.normalizePath(host.realpath(path));
      if (traceEnabled) {
        trace(host, ts2.Diagnostics.Resolving_real_path_for_0_result_1, path, real);
      }
      ts2.Debug.assert(host.fileExists(real), "".concat(path, " linked to nonexistent file ").concat(real));
      return real;
    }
    function nodeLoadModuleByRelativeName(extensions, candidate, onlyRecordFailures, state, considerPackageJson) {
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.Loading_module_as_file_Slash_folder_candidate_module_location_0_target_file_type_1, candidate, Extensions[extensions]);
      }
      if (!ts2.hasTrailingDirectorySeparator(candidate)) {
        if (!onlyRecordFailures) {
          var parentOfCandidate = ts2.getDirectoryPath(candidate);
          if (!ts2.directoryProbablyExists(parentOfCandidate, state.host)) {
            if (state.traceEnabled) {
              trace(state.host, ts2.Diagnostics.Directory_0_does_not_exist_skipping_all_lookups_in_it, parentOfCandidate);
            }
            onlyRecordFailures = true;
          }
        }
        var resolvedFromFile = loadModuleFromFile(extensions, candidate, onlyRecordFailures, state);
        if (resolvedFromFile) {
          var packageDirectory = considerPackageJson ? parseNodeModuleFromPath(resolvedFromFile.path) : void 0;
          var packageInfo = packageDirectory ? getPackageJsonInfo(packageDirectory, false, state) : void 0;
          return withPackageId(packageInfo, resolvedFromFile);
        }
      }
      if (!onlyRecordFailures) {
        var candidateExists = ts2.directoryProbablyExists(candidate, state.host);
        if (!candidateExists) {
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.Directory_0_does_not_exist_skipping_all_lookups_in_it, candidate);
          }
          onlyRecordFailures = true;
        }
      }
      return loadNodeModuleFromDirectory(extensions, candidate, onlyRecordFailures, state, considerPackageJson);
    }
    ts2.nodeModulesPathPart = "/node_modules/";
    function pathContainsNodeModules(path) {
      return ts2.stringContains(path, ts2.nodeModulesPathPart);
    }
    ts2.pathContainsNodeModules = pathContainsNodeModules;
    function parseNodeModuleFromPath(resolved) {
      var path = ts2.normalizePath(resolved);
      var idx = path.lastIndexOf(ts2.nodeModulesPathPart);
      if (idx === -1) {
        return void 0;
      }
      var indexAfterNodeModules = idx + ts2.nodeModulesPathPart.length;
      var indexAfterPackageName = moveToNextDirectorySeparatorIfAvailable(path, indexAfterNodeModules);
      if (path.charCodeAt(indexAfterNodeModules) === 64) {
        indexAfterPackageName = moveToNextDirectorySeparatorIfAvailable(path, indexAfterPackageName);
      }
      return path.slice(0, indexAfterPackageName);
    }
    ts2.parseNodeModuleFromPath = parseNodeModuleFromPath;
    function moveToNextDirectorySeparatorIfAvailable(path, prevSeparatorIndex) {
      var nextSeparatorIndex = path.indexOf(ts2.directorySeparator, prevSeparatorIndex + 1);
      return nextSeparatorIndex === -1 ? prevSeparatorIndex : nextSeparatorIndex;
    }
    function loadModuleFromFileNoPackageId(extensions, candidate, onlyRecordFailures, state) {
      return noPackageId(loadModuleFromFile(extensions, candidate, onlyRecordFailures, state));
    }
    function loadModuleFromFile(extensions, candidate, onlyRecordFailures, state) {
      if (extensions === Extensions.Json || extensions === Extensions.TSConfig) {
        var extensionLess = ts2.tryRemoveExtension(candidate, ".json");
        var extension = extensionLess ? candidate.substring(extensionLess.length) : "";
        return extensionLess === void 0 && extensions === Extensions.Json ? void 0 : tryAddingExtensions(extensionLess || candidate, extensions, extension, onlyRecordFailures, state);
      }
      if (!(state.features & NodeResolutionFeatures.EsmMode)) {
        var resolvedByAddingExtension = tryAddingExtensions(candidate, extensions, "", onlyRecordFailures, state);
        if (resolvedByAddingExtension) {
          return resolvedByAddingExtension;
        }
      }
      return loadModuleFromFileNoImplicitExtensions(extensions, candidate, onlyRecordFailures, state);
    }
    function loadModuleFromFileNoImplicitExtensions(extensions, candidate, onlyRecordFailures, state) {
      if (ts2.hasJSFileExtension(candidate) || ts2.fileExtensionIs(candidate, ".json") && state.compilerOptions.resolveJsonModule) {
        var extensionless = ts2.removeFileExtension(candidate);
        var extension = candidate.substring(extensionless.length);
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.File_name_0_has_a_1_extension_stripping_it, candidate, extension);
        }
        return tryAddingExtensions(extensionless, extensions, extension, onlyRecordFailures, state);
      }
    }
    function loadJSOrExactTSFileName(extensions, candidate, onlyRecordFailures, state) {
      if ((extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) && ts2.fileExtensionIsOneOf(candidate, [".d.ts", ".d.cts", ".d.mts"])) {
        var result = tryFile(candidate, onlyRecordFailures, state);
        return result !== void 0 ? { path: candidate, ext: ts2.forEach([".d.ts", ".d.cts", ".d.mts"], function(e) {
          return ts2.fileExtensionIs(candidate, e) ? e : void 0;
        }) } : void 0;
      }
      return loadModuleFromFileNoImplicitExtensions(extensions, candidate, onlyRecordFailures, state);
    }
    function tryAddingExtensions(candidate, extensions, originalExtension, onlyRecordFailures, state) {
      if (!onlyRecordFailures) {
        var directory = ts2.getDirectoryPath(candidate);
        if (directory) {
          onlyRecordFailures = !ts2.directoryProbablyExists(directory, state.host);
        }
      }
      switch (extensions) {
        case Extensions.DtsOnly:
          switch (originalExtension) {
            case ".mjs":
            case ".mts":
            case ".d.mts":
              return tryExtension(".d.mts");
            case ".cjs":
            case ".cts":
            case ".d.cts":
              return tryExtension(".d.cts");
            case ".json":
              candidate += ".json";
              return tryExtension(".d.ts");
            default:
              return tryExtension(".d.ts");
          }
        case Extensions.TypeScript:
          switch (originalExtension) {
            case ".mjs":
            case ".mts":
            case ".d.mts":
              return tryExtension(".mts") || tryExtension(".d.mts");
            case ".cjs":
            case ".cts":
            case ".d.cts":
              return tryExtension(".cts") || tryExtension(".d.cts");
            case ".json":
              candidate += ".json";
              return tryExtension(".d.ts");
            default:
              return tryExtension(".ts") || tryExtension(".tsx") || tryExtension(".d.ts");
          }
        case Extensions.JavaScript:
          switch (originalExtension) {
            case ".mjs":
            case ".mts":
            case ".d.mts":
              return tryExtension(".mjs");
            case ".cjs":
            case ".cts":
            case ".d.cts":
              return tryExtension(".cjs");
            case ".json":
              return tryExtension(".json");
            default:
              return tryExtension(".js") || tryExtension(".jsx");
          }
        case Extensions.TSConfig:
        case Extensions.Json:
          return tryExtension(".json");
      }
      function tryExtension(ext) {
        var path = tryFile(candidate + ext, onlyRecordFailures, state);
        return path === void 0 ? void 0 : { path, ext };
      }
    }
    function tryFile(fileName, onlyRecordFailures, state) {
      if (!onlyRecordFailures) {
        if (state.host.fileExists(fileName)) {
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.File_0_exist_use_it_as_a_name_resolution_result, fileName);
          }
          return fileName;
        } else {
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.File_0_does_not_exist, fileName);
          }
        }
      }
      state.failedLookupLocations.push(fileName);
      return void 0;
    }
    function loadNodeModuleFromDirectory(extensions, candidate, onlyRecordFailures, state, considerPackageJson) {
      if (considerPackageJson === void 0) {
        considerPackageJson = true;
      }
      var packageInfo = considerPackageJson ? getPackageJsonInfo(candidate, onlyRecordFailures, state) : void 0;
      var packageJsonContent = packageInfo && packageInfo.packageJsonContent;
      var versionPaths = packageInfo && packageInfo.versionPaths;
      return withPackageId(packageInfo, loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFailures, state, packageJsonContent, versionPaths));
    }
    function getPackageScopeForPath(fileName, packageJsonInfoCache, host, options) {
      var state = {
        host,
        compilerOptions: options,
        traceEnabled: isTraceEnabled(options, host),
        failedLookupLocations: [],
        packageJsonInfoCache,
        features: 0,
        conditions: []
      };
      var parts = ts2.getPathComponents(fileName);
      parts.pop();
      while (parts.length > 0) {
        var pkg = getPackageJsonInfo(ts2.getPathFromPathComponents(parts), false, state);
        if (pkg) {
          return pkg;
        }
        parts.pop();
      }
      return void 0;
    }
    ts2.getPackageScopeForPath = getPackageScopeForPath;
    function getPackageJsonInfo(packageDirectory, onlyRecordFailures, state) {
      var _a, _b, _c;
      var host = state.host, traceEnabled = state.traceEnabled;
      var packageJsonPath = ts2.combinePaths(packageDirectory, "package.json");
      if (onlyRecordFailures) {
        state.failedLookupLocations.push(packageJsonPath);
        return void 0;
      }
      var existing = (_a = state.packageJsonInfoCache) === null || _a === void 0 ? void 0 : _a.getPackageJsonInfo(packageJsonPath);
      if (existing !== void 0) {
        if (typeof existing !== "boolean") {
          if (traceEnabled)
            trace(host, ts2.Diagnostics.File_0_exists_according_to_earlier_cached_lookups, packageJsonPath);
          return existing;
        } else {
          if (existing && traceEnabled)
            trace(host, ts2.Diagnostics.File_0_does_not_exist_according_to_earlier_cached_lookups, packageJsonPath);
          state.failedLookupLocations.push(packageJsonPath);
          return void 0;
        }
      }
      var directoryExists = ts2.directoryProbablyExists(packageDirectory, host);
      if (directoryExists && host.fileExists(packageJsonPath)) {
        var packageJsonContent = ts2.readJson(packageJsonPath, host);
        if (traceEnabled) {
          trace(host, ts2.Diagnostics.Found_package_json_at_0, packageJsonPath);
        }
        var versionPaths = readPackageJsonTypesVersionPaths(packageJsonContent, state);
        var result = { packageDirectory, packageJsonContent, versionPaths };
        (_b = state.packageJsonInfoCache) === null || _b === void 0 ? void 0 : _b.setPackageJsonInfo(packageJsonPath, result);
        return result;
      } else {
        if (directoryExists && traceEnabled) {
          trace(host, ts2.Diagnostics.File_0_does_not_exist, packageJsonPath);
        }
        (_c = state.packageJsonInfoCache) === null || _c === void 0 ? void 0 : _c.setPackageJsonInfo(packageJsonPath, directoryExists);
        state.failedLookupLocations.push(packageJsonPath);
      }
    }
    ts2.getPackageJsonInfo = getPackageJsonInfo;
    function loadNodeModuleFromDirectoryWorker(extensions, candidate, onlyRecordFailures, state, jsonContent, versionPaths) {
      var packageFile;
      if (jsonContent) {
        switch (extensions) {
          case Extensions.JavaScript:
          case Extensions.Json:
            packageFile = readPackageJsonMainField(jsonContent, candidate, state);
            break;
          case Extensions.TypeScript:
            packageFile = readPackageJsonTypesFields(jsonContent, candidate, state) || readPackageJsonMainField(jsonContent, candidate, state);
            break;
          case Extensions.DtsOnly:
            packageFile = readPackageJsonTypesFields(jsonContent, candidate, state);
            break;
          case Extensions.TSConfig:
            packageFile = readPackageJsonTSConfigField(jsonContent, candidate, state);
            break;
          default:
            return ts2.Debug.assertNever(extensions);
        }
      }
      var loader = function(extensions2, candidate2, onlyRecordFailures2, state2) {
        var fromFile = tryFile(candidate2, onlyRecordFailures2, state2);
        if (fromFile) {
          var resolved = resolvedIfExtensionMatches(extensions2, fromFile);
          if (resolved) {
            return noPackageId(resolved);
          }
          if (state2.traceEnabled) {
            trace(state2.host, ts2.Diagnostics.File_0_has_an_unsupported_extension_so_skipping_it, fromFile);
          }
        }
        var nextExtensions = extensions2 === Extensions.DtsOnly ? Extensions.TypeScript : extensions2;
        return nodeLoadModuleByRelativeName(nextExtensions, candidate2, onlyRecordFailures2, state2, false);
      };
      var onlyRecordFailuresForPackageFile = packageFile ? !ts2.directoryProbablyExists(ts2.getDirectoryPath(packageFile), state.host) : void 0;
      var onlyRecordFailuresForIndex = onlyRecordFailures || !ts2.directoryProbablyExists(candidate, state.host);
      var indexPath = ts2.combinePaths(candidate, extensions === Extensions.TSConfig ? "tsconfig" : "index");
      if (versionPaths && (!packageFile || ts2.containsPath(candidate, packageFile))) {
        var moduleName = ts2.getRelativePathFromDirectory(candidate, packageFile || indexPath, false);
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_match_module_name_2, versionPaths.version, ts2.version, moduleName);
        }
        var result = tryLoadModuleUsingPaths(extensions, moduleName, candidate, versionPaths.paths, void 0, loader, onlyRecordFailuresForPackageFile || onlyRecordFailuresForIndex, state);
        if (result) {
          return removeIgnoredPackageId(result.value);
        }
      }
      var packageFileResult = packageFile && removeIgnoredPackageId(loader(extensions, packageFile, onlyRecordFailuresForPackageFile, state));
      if (packageFileResult)
        return packageFileResult;
      if (!(state.features & NodeResolutionFeatures.EsmMode)) {
        return loadModuleFromFile(extensions, indexPath, onlyRecordFailuresForIndex, state);
      }
    }
    function resolvedIfExtensionMatches(extensions, path) {
      var ext = ts2.tryGetExtensionFromPath(path);
      return ext !== void 0 && extensionIsOk(extensions, ext) ? { path, ext } : void 0;
    }
    function extensionIsOk(extensions, extension) {
      switch (extensions) {
        case Extensions.JavaScript:
          return extension === ".js" || extension === ".jsx";
        case Extensions.TSConfig:
        case Extensions.Json:
          return extension === ".json";
        case Extensions.TypeScript:
          return extension === ".ts" || extension === ".tsx" || extension === ".d.ts";
        case Extensions.DtsOnly:
          return extension === ".d.ts";
      }
    }
    function parsePackageName(moduleName) {
      var idx = moduleName.indexOf(ts2.directorySeparator);
      if (moduleName[0] === "@") {
        idx = moduleName.indexOf(ts2.directorySeparator, idx + 1);
      }
      return idx === -1 ? { packageName: moduleName, rest: "" } : { packageName: moduleName.slice(0, idx), rest: moduleName.slice(idx + 1) };
    }
    ts2.parsePackageName = parsePackageName;
    function allKeysStartWithDot(obj) {
      return ts2.every(ts2.getOwnKeys(obj), function(k) {
        return ts2.startsWith(k, ".");
      });
    }
    ts2.allKeysStartWithDot = allKeysStartWithDot;
    function noKeyStartsWithDot(obj) {
      return !ts2.some(ts2.getOwnKeys(obj), function(k) {
        return ts2.startsWith(k, ".");
      });
    }
    function loadModuleFromSelfNameReference(extensions, moduleName, directory, state, cache, redirectedReference) {
      var _a, _b;
      var useCaseSensitiveFileNames = typeof state.host.useCaseSensitiveFileNames === "function" ? state.host.useCaseSensitiveFileNames() : state.host.useCaseSensitiveFileNames;
      var directoryPath = ts2.toPath(ts2.combinePaths(directory, "dummy"), (_b = (_a = state.host).getCurrentDirectory) === null || _b === void 0 ? void 0 : _b.call(_a), ts2.createGetCanonicalFileName(useCaseSensitiveFileNames === void 0 ? true : useCaseSensitiveFileNames));
      var scope = getPackageScopeForPath(directoryPath, state.packageJsonInfoCache, state.host, state.compilerOptions);
      if (!scope || !scope.packageJsonContent.exports) {
        return void 0;
      }
      if (typeof scope.packageJsonContent.name !== "string") {
        return void 0;
      }
      var parts = ts2.getPathComponents(moduleName);
      var nameParts = ts2.getPathComponents(scope.packageJsonContent.name);
      if (!ts2.every(nameParts, function(p, i) {
        return parts[i] === p;
      })) {
        return void 0;
      }
      var trailingParts = parts.slice(nameParts.length);
      return loadModuleFromExports(scope, extensions, !ts2.length(trailingParts) ? "." : ".".concat(ts2.directorySeparator).concat(trailingParts.join(ts2.directorySeparator)), state, cache, redirectedReference);
    }
    function loadModuleFromExports(scope, extensions, subpath, state, cache, redirectedReference) {
      if (!scope.packageJsonContent.exports) {
        return void 0;
      }
      if (subpath === ".") {
        var mainExport = void 0;
        if (typeof scope.packageJsonContent.exports === "string" || Array.isArray(scope.packageJsonContent.exports) || typeof scope.packageJsonContent.exports === "object" && noKeyStartsWithDot(scope.packageJsonContent.exports)) {
          mainExport = scope.packageJsonContent.exports;
        } else if (ts2.hasProperty(scope.packageJsonContent.exports, ".")) {
          mainExport = scope.packageJsonContent.exports["."];
        }
        if (mainExport) {
          var loadModuleFromTargetImportOrExport = getLoadModuleFromTargetImportOrExport(extensions, state, cache, redirectedReference, subpath, scope, false);
          return loadModuleFromTargetImportOrExport(mainExport, "", false);
        }
      } else if (allKeysStartWithDot(scope.packageJsonContent.exports)) {
        if (typeof scope.packageJsonContent.exports !== "object") {
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1, subpath, scope.packageDirectory);
          }
          return toSearchResult(void 0);
        }
        var result = loadModuleFromImportsOrExports(extensions, state, cache, redirectedReference, subpath, scope.packageJsonContent.exports, scope, false);
        if (result) {
          return result;
        }
      }
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.Export_specifier_0_does_not_exist_in_package_json_scope_at_path_1, subpath, scope.packageDirectory);
      }
      return toSearchResult(void 0);
    }
    function loadModuleFromImports(extensions, moduleName, directory, state, cache, redirectedReference) {
      var _a, _b;
      if (moduleName === "#" || ts2.startsWith(moduleName, "#/")) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Invalid_import_specifier_0_has_no_possible_resolutions, moduleName);
        }
        return toSearchResult(void 0);
      }
      var useCaseSensitiveFileNames = typeof state.host.useCaseSensitiveFileNames === "function" ? state.host.useCaseSensitiveFileNames() : state.host.useCaseSensitiveFileNames;
      var directoryPath = ts2.toPath(ts2.combinePaths(directory, "dummy"), (_b = (_a = state.host).getCurrentDirectory) === null || _b === void 0 ? void 0 : _b.call(_a), ts2.createGetCanonicalFileName(useCaseSensitiveFileNames === void 0 ? true : useCaseSensitiveFileNames));
      var scope = getPackageScopeForPath(directoryPath, state.packageJsonInfoCache, state.host, state.compilerOptions);
      if (!scope) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Directory_0_has_no_containing_package_json_scope_Imports_will_not_resolve, directoryPath);
        }
        return toSearchResult(void 0);
      }
      if (!scope.packageJsonContent.imports) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.package_json_scope_0_has_no_imports_defined, scope.packageDirectory);
        }
        return toSearchResult(void 0);
      }
      var result = loadModuleFromImportsOrExports(extensions, state, cache, redirectedReference, moduleName, scope.packageJsonContent.imports, scope, true);
      if (result) {
        return result;
      }
      if (state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.Import_specifier_0_does_not_exist_in_package_json_scope_at_path_1, moduleName, scope.packageDirectory);
      }
      return toSearchResult(void 0);
    }
    function loadModuleFromImportsOrExports(extensions, state, cache, redirectedReference, moduleName, lookupTable, scope, isImports) {
      var loadModuleFromTargetImportOrExport = getLoadModuleFromTargetImportOrExport(extensions, state, cache, redirectedReference, moduleName, scope, isImports);
      if (!ts2.endsWith(moduleName, ts2.directorySeparator) && moduleName.indexOf("*") === -1 && ts2.hasProperty(lookupTable, moduleName)) {
        var target = lookupTable[moduleName];
        return loadModuleFromTargetImportOrExport(target, "", false);
      }
      var expandingKeys = ts2.sort(ts2.filter(ts2.getOwnKeys(lookupTable), function(k) {
        return k.indexOf("*") !== -1 || ts2.endsWith(k, "/");
      }), function(a, b) {
        return a.length - b.length;
      });
      for (var _i = 0, expandingKeys_1 = expandingKeys; _i < expandingKeys_1.length; _i++) {
        var potentialTarget = expandingKeys_1[_i];
        if (state.features & NodeResolutionFeatures.ExportsPatternTrailers && matchesPatternWithTrailer(potentialTarget, moduleName)) {
          var target = lookupTable[potentialTarget];
          var starPos = potentialTarget.indexOf("*");
          var subpath = moduleName.substring(potentialTarget.substring(0, starPos).length, moduleName.length - (potentialTarget.length - 1 - starPos));
          return loadModuleFromTargetImportOrExport(target, subpath, true);
        } else if (ts2.endsWith(potentialTarget, "*") && ts2.startsWith(moduleName, potentialTarget.substring(0, potentialTarget.length - 1))) {
          var target = lookupTable[potentialTarget];
          var subpath = moduleName.substring(potentialTarget.length - 1);
          return loadModuleFromTargetImportOrExport(target, subpath, true);
        } else if (ts2.startsWith(moduleName, potentialTarget)) {
          var target = lookupTable[potentialTarget];
          var subpath = moduleName.substring(potentialTarget.length);
          return loadModuleFromTargetImportOrExport(target, subpath, false);
        }
      }
      function matchesPatternWithTrailer(target2, name) {
        if (ts2.endsWith(target2, "*"))
          return false;
        var starPos2 = target2.indexOf("*");
        if (starPos2 === -1)
          return false;
        return ts2.startsWith(name, target2.substring(0, starPos2)) && ts2.endsWith(name, target2.substring(starPos2 + 1));
      }
    }
    function getLoadModuleFromTargetImportOrExport(extensions, state, cache, redirectedReference, moduleName, scope, isImports) {
      return loadModuleFromTargetImportOrExport;
      function loadModuleFromTargetImportOrExport(target, subpath, pattern) {
        var _a, _b;
        if (typeof target === "string") {
          if (!pattern && subpath.length > 0 && !ts2.endsWith(target, "/")) {
            if (state.traceEnabled) {
              trace(state.host, ts2.Diagnostics.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, scope.packageDirectory, moduleName);
            }
            return toSearchResult(void 0);
          }
          if (!ts2.startsWith(target, "./")) {
            if (isImports && !ts2.startsWith(target, "../") && !ts2.startsWith(target, "/") && !ts2.isRootedDiskPath(target)) {
              var combinedLookup = pattern ? target.replace(/\*/g, subpath) : target + subpath;
              var result = nodeModuleNameResolverWorker(state.features, combinedLookup, scope.packageDirectory + "/", state.compilerOptions, state.host, cache, [extensions], redirectedReference);
              return toSearchResult(result.resolvedModule ? { path: result.resolvedModule.resolvedFileName, extension: result.resolvedModule.extension, packageId: result.resolvedModule.packageId, originalPath: result.resolvedModule.originalPath } : void 0);
            }
            if (state.traceEnabled) {
              trace(state.host, ts2.Diagnostics.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, scope.packageDirectory, moduleName);
            }
            return toSearchResult(void 0);
          }
          var parts = ts2.pathIsRelative(target) ? ts2.getPathComponents(target).slice(1) : ts2.getPathComponents(target);
          var partsAfterFirst = parts.slice(1);
          if (partsAfterFirst.indexOf("..") >= 0 || partsAfterFirst.indexOf(".") >= 0 || partsAfterFirst.indexOf("node_modules") >= 0) {
            if (state.traceEnabled) {
              trace(state.host, ts2.Diagnostics.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, scope.packageDirectory, moduleName);
            }
            return toSearchResult(void 0);
          }
          var resolvedTarget = ts2.combinePaths(scope.packageDirectory, target);
          var subpathParts = ts2.getPathComponents(subpath);
          if (subpathParts.indexOf("..") >= 0 || subpathParts.indexOf(".") >= 0 || subpathParts.indexOf("node_modules") >= 0) {
            if (state.traceEnabled) {
              trace(state.host, ts2.Diagnostics.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, scope.packageDirectory, moduleName);
            }
            return toSearchResult(void 0);
          }
          var finalPath = ts2.getNormalizedAbsolutePath(pattern ? resolvedTarget.replace(/\*/g, subpath) : resolvedTarget + subpath, (_b = (_a = state.host).getCurrentDirectory) === null || _b === void 0 ? void 0 : _b.call(_a));
          return toSearchResult(withPackageId(scope, loadJSOrExactTSFileName(extensions, finalPath, false, state)));
        } else if (typeof target === "object" && target !== null) {
          if (!Array.isArray(target)) {
            for (var _i = 0, _c = ts2.getOwnKeys(target); _i < _c.length; _i++) {
              var key = _c[_i];
              if (key === "default" || state.conditions.indexOf(key) >= 0 || isApplicableVersionedTypesKey(state.conditions, key)) {
                var subTarget = target[key];
                var result = loadModuleFromTargetImportOrExport(subTarget, subpath, pattern);
                if (result) {
                  return result;
                }
              }
            }
            return void 0;
          } else {
            if (!ts2.length(target)) {
              if (state.traceEnabled) {
                trace(state.host, ts2.Diagnostics.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, scope.packageDirectory, moduleName);
              }
              return toSearchResult(void 0);
            }
            for (var _d = 0, target_1 = target; _d < target_1.length; _d++) {
              var elem = target_1[_d];
              var result = loadModuleFromTargetImportOrExport(elem, subpath, pattern);
              if (result) {
                return result;
              }
            }
          }
        } else if (target === null) {
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.package_json_scope_0_explicitly_maps_specifier_1_to_null, scope.packageDirectory, moduleName);
          }
          return toSearchResult(void 0);
        }
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.package_json_scope_0_has_invalid_type_for_target_of_specifier_1, scope.packageDirectory, moduleName);
        }
        return toSearchResult(void 0);
      }
    }
    function isApplicableVersionedTypesKey(conditions, key) {
      if (conditions.indexOf("types") === -1)
        return false;
      if (!ts2.startsWith(key, "types@"))
        return false;
      var range = ts2.VersionRange.tryParse(key.substring("types@".length));
      if (!range)
        return false;
      return range.test(ts2.version);
    }
    ts2.isApplicableVersionedTypesKey = isApplicableVersionedTypesKey;
    function loadModuleFromNearestNodeModulesDirectory(extensions, moduleName, directory, state, cache, redirectedReference) {
      return loadModuleFromNearestNodeModulesDirectoryWorker(extensions, moduleName, directory, state, false, cache, redirectedReference);
    }
    function loadModuleFromNearestNodeModulesDirectoryTypesScope(moduleName, directory, state) {
      return loadModuleFromNearestNodeModulesDirectoryWorker(Extensions.DtsOnly, moduleName, directory, state, true, void 0, void 0);
    }
    function loadModuleFromNearestNodeModulesDirectoryWorker(extensions, moduleName, directory, state, typesScopeOnly, cache, redirectedReference) {
      var perModuleNameCache = cache && cache.getOrCreateCacheForModuleName(moduleName, state.features === 0 ? void 0 : state.features & NodeResolutionFeatures.EsmMode ? ts2.ModuleKind.ESNext : ts2.ModuleKind.CommonJS, redirectedReference);
      return ts2.forEachAncestorDirectory(ts2.normalizeSlashes(directory), function(ancestorDirectory) {
        if (ts2.getBaseFileName(ancestorDirectory) !== "node_modules") {
          var resolutionFromCache = tryFindNonRelativeModuleNameInCache(perModuleNameCache, moduleName, ancestorDirectory, state);
          if (resolutionFromCache) {
            return resolutionFromCache;
          }
          return toSearchResult(loadModuleFromImmediateNodeModulesDirectory(extensions, moduleName, ancestorDirectory, state, typesScopeOnly, cache, redirectedReference));
        }
      });
    }
    function loadModuleFromImmediateNodeModulesDirectory(extensions, moduleName, directory, state, typesScopeOnly, cache, redirectedReference) {
      var nodeModulesFolder = ts2.combinePaths(directory, "node_modules");
      var nodeModulesFolderExists = ts2.directoryProbablyExists(nodeModulesFolder, state.host);
      if (!nodeModulesFolderExists && state.traceEnabled) {
        trace(state.host, ts2.Diagnostics.Directory_0_does_not_exist_skipping_all_lookups_in_it, nodeModulesFolder);
      }
      var packageResult = typesScopeOnly ? void 0 : loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesFolder, nodeModulesFolderExists, state, cache, redirectedReference);
      if (packageResult) {
        return packageResult;
      }
      if (extensions === Extensions.TypeScript || extensions === Extensions.DtsOnly) {
        var nodeModulesAtTypes_1 = ts2.combinePaths(nodeModulesFolder, "@types");
        var nodeModulesAtTypesExists = nodeModulesFolderExists;
        if (nodeModulesFolderExists && !ts2.directoryProbablyExists(nodeModulesAtTypes_1, state.host)) {
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.Directory_0_does_not_exist_skipping_all_lookups_in_it, nodeModulesAtTypes_1);
          }
          nodeModulesAtTypesExists = false;
        }
        return loadModuleFromSpecificNodeModulesDirectory(Extensions.DtsOnly, mangleScopedPackageNameWithTrace(moduleName, state), nodeModulesAtTypes_1, nodeModulesAtTypesExists, state, cache, redirectedReference);
      }
    }
    function loadModuleFromSpecificNodeModulesDirectory(extensions, moduleName, nodeModulesDirectory, nodeModulesDirectoryExists, state, cache, redirectedReference) {
      var candidate = ts2.normalizePath(ts2.combinePaths(nodeModulesDirectory, moduleName));
      var packageInfo = getPackageJsonInfo(candidate, !nodeModulesDirectoryExists, state);
      if (!(state.features & NodeResolutionFeatures.Exports)) {
        if (packageInfo) {
          var fromFile = loadModuleFromFile(extensions, candidate, !nodeModulesDirectoryExists, state);
          if (fromFile) {
            return noPackageId(fromFile);
          }
          var fromDirectory = loadNodeModuleFromDirectoryWorker(extensions, candidate, !nodeModulesDirectoryExists, state, packageInfo.packageJsonContent, packageInfo.versionPaths);
          return withPackageId(packageInfo, fromDirectory);
        }
      }
      var _a = parsePackageName(moduleName), packageName = _a.packageName, rest = _a.rest;
      var loader = function(extensions2, candidate2, onlyRecordFailures, state2) {
        var _a2;
        if (packageInfo && packageInfo.packageJsonContent.exports && state2.features & NodeResolutionFeatures.Exports) {
          return (_a2 = loadModuleFromExports(packageInfo, extensions2, ts2.combinePaths(".", rest), state2, cache, redirectedReference)) === null || _a2 === void 0 ? void 0 : _a2.value;
        }
        var pathAndExtension = loadModuleFromFile(extensions2, candidate2, onlyRecordFailures, state2) || loadNodeModuleFromDirectoryWorker(extensions2, candidate2, onlyRecordFailures, state2, packageInfo && packageInfo.packageJsonContent, packageInfo && packageInfo.versionPaths);
        return withPackageId(packageInfo, pathAndExtension);
      };
      if (rest !== "") {
        var packageDirectory = ts2.combinePaths(nodeModulesDirectory, packageName);
        packageInfo = getPackageJsonInfo(packageDirectory, !nodeModulesDirectoryExists, state);
        if (packageInfo && packageInfo.versionPaths) {
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.package_json_has_a_typesVersions_entry_0_that_matches_compiler_version_1_looking_for_a_pattern_to_match_module_name_2, packageInfo.versionPaths.version, ts2.version, rest);
          }
          var packageDirectoryExists = nodeModulesDirectoryExists && ts2.directoryProbablyExists(packageDirectory, state.host);
          var fromPaths = tryLoadModuleUsingPaths(extensions, rest, packageDirectory, packageInfo.versionPaths.paths, void 0, loader, !packageDirectoryExists, state);
          if (fromPaths) {
            return fromPaths.value;
          }
        }
      }
      return loader(extensions, candidate, !nodeModulesDirectoryExists, state);
    }
    function tryLoadModuleUsingPaths(extensions, moduleName, baseDirectory, paths, pathPatterns, loader, onlyRecordFailures, state) {
      pathPatterns || (pathPatterns = ts2.tryParsePatterns(paths));
      var matchedPattern = ts2.matchPatternOrExact(pathPatterns, moduleName);
      if (matchedPattern) {
        var matchedStar_1 = ts2.isString(matchedPattern) ? void 0 : ts2.matchedText(matchedPattern, moduleName);
        var matchedPatternText = ts2.isString(matchedPattern) ? matchedPattern : ts2.patternText(matchedPattern);
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Module_name_0_matched_pattern_1, moduleName, matchedPatternText);
        }
        var resolved = ts2.forEach(paths[matchedPatternText], function(subst) {
          var path = matchedStar_1 ? subst.replace("*", matchedStar_1) : subst;
          var candidate = ts2.normalizePath(ts2.combinePaths(baseDirectory, path));
          if (state.traceEnabled) {
            trace(state.host, ts2.Diagnostics.Trying_substitution_0_candidate_module_location_Colon_1, subst, path);
          }
          var extension = ts2.tryGetExtensionFromPath(subst);
          if (extension !== void 0) {
            var path_1 = tryFile(candidate, onlyRecordFailures, state);
            if (path_1 !== void 0) {
              return noPackageId({ path: path_1, ext: extension });
            }
          }
          return loader(extensions, candidate, onlyRecordFailures || !ts2.directoryProbablyExists(ts2.getDirectoryPath(candidate), state.host), state);
        });
        return { value: resolved };
      }
    }
    var mangledScopedPackageSeparator = "__";
    function mangleScopedPackageNameWithTrace(packageName, state) {
      var mangled = mangleScopedPackageName(packageName);
      if (state.traceEnabled && mangled !== packageName) {
        trace(state.host, ts2.Diagnostics.Scoped_package_detected_looking_in_0, mangled);
      }
      return mangled;
    }
    function getTypesPackageName(packageName) {
      return "@types/".concat(mangleScopedPackageName(packageName));
    }
    ts2.getTypesPackageName = getTypesPackageName;
    function mangleScopedPackageName(packageName) {
      if (ts2.startsWith(packageName, "@")) {
        var replaceSlash = packageName.replace(ts2.directorySeparator, mangledScopedPackageSeparator);
        if (replaceSlash !== packageName) {
          return replaceSlash.slice(1);
        }
      }
      return packageName;
    }
    ts2.mangleScopedPackageName = mangleScopedPackageName;
    function getPackageNameFromTypesPackageName(mangledName) {
      var withoutAtTypePrefix = ts2.removePrefix(mangledName, "@types/");
      if (withoutAtTypePrefix !== mangledName) {
        return unmangleScopedPackageName(withoutAtTypePrefix);
      }
      return mangledName;
    }
    ts2.getPackageNameFromTypesPackageName = getPackageNameFromTypesPackageName;
    function unmangleScopedPackageName(typesPackageName) {
      return ts2.stringContains(typesPackageName, mangledScopedPackageSeparator) ? "@" + typesPackageName.replace(mangledScopedPackageSeparator, ts2.directorySeparator) : typesPackageName;
    }
    ts2.unmangleScopedPackageName = unmangleScopedPackageName;
    function tryFindNonRelativeModuleNameInCache(cache, moduleName, containingDirectory, state) {
      var result = cache && cache.get(containingDirectory);
      if (result) {
        if (state.traceEnabled) {
          trace(state.host, ts2.Diagnostics.Resolution_for_module_0_was_found_in_cache_from_location_1, moduleName, containingDirectory);
        }
        state.resultFromCache = result;
        return { value: result.resolvedModule && { path: result.resolvedModule.resolvedFileName, originalPath: result.resolvedModule.originalPath || true, extension: result.resolvedModule.extension, packageId: result.resolvedModule.packageId } };
      }
    }
    function classicNameResolver(moduleName, containingFile, compilerOptions, host, cache, redirectedReference) {
      var traceEnabled = isTraceEnabled(compilerOptions, host);
      var failedLookupLocations = [];
      var state = { compilerOptions, host, traceEnabled, failedLookupLocations, packageJsonInfoCache: cache, features: NodeResolutionFeatures.None, conditions: [] };
      var containingDirectory = ts2.getDirectoryPath(containingFile);
      var resolved = tryResolve(Extensions.TypeScript) || tryResolve(Extensions.JavaScript);
      return createResolvedModuleWithFailedLookupLocations(resolved && resolved.value, false, failedLookupLocations, state.resultFromCache);
      function tryResolve(extensions) {
        var resolvedUsingSettings = tryLoadModuleUsingOptionalResolutionSettings(extensions, moduleName, containingDirectory, loadModuleFromFileNoPackageId, state);
        if (resolvedUsingSettings) {
          return { value: resolvedUsingSettings };
        }
        if (!ts2.isExternalModuleNameRelative(moduleName)) {
          var perModuleNameCache_1 = cache && cache.getOrCreateCacheForModuleName(moduleName, void 0, redirectedReference);
          var resolved_3 = ts2.forEachAncestorDirectory(containingDirectory, function(directory) {
            var resolutionFromCache = tryFindNonRelativeModuleNameInCache(perModuleNameCache_1, moduleName, directory, state);
            if (resolutionFromCache) {
              return resolutionFromCache;
            }
            var searchName = ts2.normalizePath(ts2.combinePaths(directory, moduleName));
            return toSearchResult(loadModuleFromFileNoPackageId(extensions, searchName, false, state));
          });
          if (resolved_3) {
            return resolved_3;
          }
          if (extensions === Extensions.TypeScript) {
            return loadModuleFromNearestNodeModulesDirectoryTypesScope(moduleName, containingDirectory, state);
          }
        } else {
          var candidate = ts2.normalizePath(ts2.combinePaths(containingDirectory, moduleName));
          return toSearchResult(loadModuleFromFileNoPackageId(extensions, candidate, false, state));
        }
      }
    }
    ts2.classicNameResolver = classicNameResolver;
    function loadModuleFromGlobalCache(moduleName, projectName, compilerOptions, host, globalCache, packageJsonInfoCache) {
      var traceEnabled = isTraceEnabled(compilerOptions, host);
      if (traceEnabled) {
        trace(host, ts2.Diagnostics.Auto_discovery_for_typings_is_enabled_in_project_0_Running_extra_resolution_pass_for_module_1_using_cache_location_2, projectName, moduleName, globalCache);
      }
      var failedLookupLocations = [];
      var state = { compilerOptions, host, traceEnabled, failedLookupLocations, packageJsonInfoCache, features: NodeResolutionFeatures.None, conditions: [] };
      var resolved = loadModuleFromImmediateNodeModulesDirectory(Extensions.DtsOnly, moduleName, globalCache, state, false, void 0, void 0);
      return createResolvedModuleWithFailedLookupLocations(resolved, true, failedLookupLocations, state.resultFromCache);
    }
    ts2.loadModuleFromGlobalCache = loadModuleFromGlobalCache;
    function toSearchResult(value) {
      return value !== void 0 ? { value } : void 0;
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var ModuleInstanceState;
    (function(ModuleInstanceState2) {
      ModuleInstanceState2[ModuleInstanceState2["NonInstantiated"] = 0] = "NonInstantiated";
      ModuleInstanceState2[ModuleInstanceState2["Instantiated"] = 1] = "Instantiated";
      ModuleInstanceState2[ModuleInstanceState2["ConstEnumOnly"] = 2] = "ConstEnumOnly";
    })(ModuleInstanceState = ts2.ModuleInstanceState || (ts2.ModuleInstanceState = {}));
    function getModuleInstanceState(node, visited) {
      if (node.body && !node.body.parent) {
        ts2.setParent(node.body, node);
        ts2.setParentRecursive(node.body, false);
      }
      return node.body ? getModuleInstanceStateCached(node.body, visited) : 1;
    }
    ts2.getModuleInstanceState = getModuleInstanceState;
    function getModuleInstanceStateCached(node, visited) {
      if (visited === void 0) {
        visited = new ts2.Map();
      }
      var nodeId = ts2.getNodeId(node);
      if (visited.has(nodeId)) {
        return visited.get(nodeId) || 0;
      }
      visited.set(nodeId, void 0);
      var result = getModuleInstanceStateWorker(node, visited);
      visited.set(nodeId, result);
      return result;
    }
    function getModuleInstanceStateWorker(node, visited) {
      switch (node.kind) {
        case 257:
        case 258:
          return 0;
        case 259:
          if (ts2.isEnumConst(node)) {
            return 2;
          }
          break;
        case 265:
        case 264:
          if (!ts2.hasSyntacticModifier(node, 1)) {
            return 0;
          }
          break;
        case 271:
          var exportDeclaration = node;
          if (!exportDeclaration.moduleSpecifier && exportDeclaration.exportClause && exportDeclaration.exportClause.kind === 272) {
            var state = 0;
            for (var _i = 0, _a = exportDeclaration.exportClause.elements; _i < _a.length; _i++) {
              var specifier = _a[_i];
              var specifierState = getModuleInstanceStateForAliasTarget(specifier, visited);
              if (specifierState > state) {
                state = specifierState;
              }
              if (state === 1) {
                return state;
              }
            }
            return state;
          }
          break;
        case 261: {
          var state_1 = 0;
          ts2.forEachChild(node, function(n) {
            var childState = getModuleInstanceStateCached(n, visited);
            switch (childState) {
              case 0:
                return;
              case 2:
                state_1 = 2;
                return;
              case 1:
                state_1 = 1;
                return true;
              default:
                ts2.Debug.assertNever(childState);
            }
          });
          return state_1;
        }
        case 260:
          return getModuleInstanceState(node, visited);
        case 79:
          if (node.isInJSDocNamespace) {
            return 0;
          }
      }
      return 1;
    }
    function getModuleInstanceStateForAliasTarget(specifier, visited) {
      var name = specifier.propertyName || specifier.name;
      var p = specifier.parent;
      while (p) {
        if (ts2.isBlock(p) || ts2.isModuleBlock(p) || ts2.isSourceFile(p)) {
          var statements = p.statements;
          var found = void 0;
          for (var _i = 0, statements_2 = statements; _i < statements_2.length; _i++) {
            var statement = statements_2[_i];
            if (ts2.nodeHasName(statement, name)) {
              if (!statement.parent) {
                ts2.setParent(statement, p);
                ts2.setParentRecursive(statement, false);
              }
              var state = getModuleInstanceStateCached(statement, visited);
              if (found === void 0 || state > found) {
                found = state;
              }
              if (found === 1) {
                return found;
              }
            }
          }
          if (found !== void 0) {
            return found;
          }
        }
        p = p.parent;
      }
      return 1;
    }
    var ContainerFlags;
    (function(ContainerFlags2) {
      ContainerFlags2[ContainerFlags2["None"] = 0] = "None";
      ContainerFlags2[ContainerFlags2["IsContainer"] = 1] = "IsContainer";
      ContainerFlags2[ContainerFlags2["IsBlockScopedContainer"] = 2] = "IsBlockScopedContainer";
      ContainerFlags2[ContainerFlags2["IsControlFlowContainer"] = 4] = "IsControlFlowContainer";
      ContainerFlags2[ContainerFlags2["IsFunctionLike"] = 8] = "IsFunctionLike";
      ContainerFlags2[ContainerFlags2["IsFunctionExpression"] = 16] = "IsFunctionExpression";
      ContainerFlags2[ContainerFlags2["HasLocals"] = 32] = "HasLocals";
      ContainerFlags2[ContainerFlags2["IsInterface"] = 64] = "IsInterface";
      ContainerFlags2[ContainerFlags2["IsObjectLiteralOrClassExpressionMethodOrAccessor"] = 128] = "IsObjectLiteralOrClassExpressionMethodOrAccessor";
    })(ContainerFlags || (ContainerFlags = {}));
    function initFlowNode(node) {
      ts2.Debug.attachFlowNodeDebugInfo(node);
      return node;
    }
    var binder = createBinder();
    function bindSourceFile(file, options) {
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("bind", "bindSourceFile", { path: file.path }, true);
      ts2.performance.mark("beforeBind");
      ts2.perfLogger.logStartBindFile("" + file.fileName);
      binder(file, options);
      ts2.perfLogger.logStopBindFile();
      ts2.performance.mark("afterBind");
      ts2.performance.measure("Bind", "beforeBind", "afterBind");
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
    }
    ts2.bindSourceFile = bindSourceFile;
    function createBinder() {
      var file;
      var options;
      var languageVersion;
      var parent;
      var container;
      var thisParentContainer;
      var blockScopeContainer;
      var lastContainer;
      var delayedTypeAliases;
      var seenThisKeyword;
      var currentFlow;
      var currentBreakTarget;
      var currentContinueTarget;
      var currentReturnTarget;
      var currentTrueTarget;
      var currentFalseTarget;
      var currentExceptionTarget;
      var preSwitchCaseFlow;
      var activeLabelList;
      var hasExplicitReturn;
      var emitFlags;
      var inStrictMode;
      var inAssignmentPattern = false;
      var symbolCount = 0;
      var Symbol2;
      var classifiableNames;
      var unreachableFlow = { flags: 1 };
      var reportedUnreachableFlow = { flags: 1 };
      var bindBinaryExpressionFlow = createBindBinaryExpressionFlow();
      function createDiagnosticForNode(node, message, arg0, arg1, arg2) {
        return ts2.createDiagnosticForNodeInSourceFile(ts2.getSourceFileOfNode(node) || file, node, message, arg0, arg1, arg2);
      }
      function bindSourceFile2(f, opts) {
        file = f;
        options = opts;
        languageVersion = ts2.getEmitScriptTarget(options);
        inStrictMode = bindInStrictMode(file, opts);
        classifiableNames = new ts2.Set();
        symbolCount = 0;
        Symbol2 = ts2.objectAllocator.getSymbolConstructor();
        ts2.Debug.attachFlowNodeDebugInfo(unreachableFlow);
        ts2.Debug.attachFlowNodeDebugInfo(reportedUnreachableFlow);
        if (!file.locals) {
          bind(file);
          file.symbolCount = symbolCount;
          file.classifiableNames = classifiableNames;
          delayedBindJSDocTypedefTag();
        }
        file = void 0;
        options = void 0;
        languageVersion = void 0;
        parent = void 0;
        container = void 0;
        thisParentContainer = void 0;
        blockScopeContainer = void 0;
        lastContainer = void 0;
        delayedTypeAliases = void 0;
        seenThisKeyword = false;
        currentFlow = void 0;
        currentBreakTarget = void 0;
        currentContinueTarget = void 0;
        currentReturnTarget = void 0;
        currentTrueTarget = void 0;
        currentFalseTarget = void 0;
        currentExceptionTarget = void 0;
        activeLabelList = void 0;
        hasExplicitReturn = false;
        inAssignmentPattern = false;
        emitFlags = 0;
      }
      return bindSourceFile2;
      function bindInStrictMode(file2, opts) {
        if (ts2.getStrictOptionValue(opts, "alwaysStrict") && !file2.isDeclarationFile) {
          return true;
        } else {
          return !!file2.externalModuleIndicator;
        }
      }
      function createSymbol(flags, name) {
        symbolCount++;
        return new Symbol2(flags, name);
      }
      function addDeclarationToSymbol(symbol, node, symbolFlags) {
        symbol.flags |= symbolFlags;
        node.symbol = symbol;
        symbol.declarations = ts2.appendIfUnique(symbol.declarations, node);
        if (symbolFlags & (32 | 384 | 1536 | 3) && !symbol.exports) {
          symbol.exports = ts2.createSymbolTable();
        }
        if (symbolFlags & (32 | 64 | 2048 | 4096) && !symbol.members) {
          symbol.members = ts2.createSymbolTable();
        }
        if (symbol.constEnumOnlyModule && symbol.flags & (16 | 32 | 256)) {
          symbol.constEnumOnlyModule = false;
        }
        if (symbolFlags & 111551) {
          ts2.setValueDeclaration(symbol, node);
        }
      }
      function getDeclarationName(node) {
        if (node.kind === 270) {
          return node.isExportEquals ? "export=" : "default";
        }
        var name = ts2.getNameOfDeclaration(node);
        if (name) {
          if (ts2.isAmbientModule(node)) {
            var moduleName = ts2.getTextOfIdentifierOrLiteral(name);
            return ts2.isGlobalScopeAugmentation(node) ? "__global" : '"'.concat(moduleName, '"');
          }
          if (name.kind === 161) {
            var nameExpression = name.expression;
            if (ts2.isStringOrNumericLiteralLike(nameExpression)) {
              return ts2.escapeLeadingUnderscores(nameExpression.text);
            }
            if (ts2.isSignedNumericLiteral(nameExpression)) {
              return ts2.tokenToString(nameExpression.operator) + nameExpression.operand.text;
            } else {
              ts2.Debug.fail("Only computed properties with literal names have declaration names");
            }
          }
          if (ts2.isPrivateIdentifier(name)) {
            var containingClass = ts2.getContainingClass(node);
            if (!containingClass) {
              return void 0;
            }
            var containingClassSymbol = containingClass.symbol;
            return ts2.getSymbolNameForPrivateIdentifier(containingClassSymbol, name.escapedText);
          }
          return ts2.isPropertyNameLiteral(name) ? ts2.getEscapedTextOfIdentifierOrLiteral(name) : void 0;
        }
        switch (node.kind) {
          case 170:
            return "__constructor";
          case 178:
          case 173:
          case 321:
            return "__call";
          case 179:
          case 174:
            return "__new";
          case 175:
            return "__index";
          case 271:
            return "__export";
          case 303:
            return "export=";
          case 220:
            if (ts2.getAssignmentDeclarationKind(node) === 2) {
              return "export=";
            }
            ts2.Debug.fail("Unknown binary declaration kind");
            break;
          case 315:
            return ts2.isJSDocConstructSignature(node) ? "__new" : "__call";
          case 163:
            ts2.Debug.assert(node.parent.kind === 315, "Impossible parameter parent kind", function() {
              return "parent is: ".concat(ts2.SyntaxKind ? ts2.SyntaxKind[node.parent.kind] : node.parent.kind, ", expected JSDocFunctionType");
            });
            var functionType = node.parent;
            var index = functionType.parameters.indexOf(node);
            return "arg" + index;
        }
      }
      function getDisplayName(node) {
        return ts2.isNamedDeclaration(node) ? ts2.declarationNameToString(node.name) : ts2.unescapeLeadingUnderscores(ts2.Debug.checkDefined(getDeclarationName(node)));
      }
      function declareSymbol(symbolTable, parent2, node, includes, excludes, isReplaceableByMethod, isComputedName) {
        ts2.Debug.assert(isComputedName || !ts2.hasDynamicName(node));
        var isDefaultExport = ts2.hasSyntacticModifier(node, 512) || ts2.isExportSpecifier(node) && node.name.escapedText === "default";
        var name = isComputedName ? "__computed" : isDefaultExport && parent2 ? "default" : getDeclarationName(node);
        var symbol;
        if (name === void 0) {
          symbol = createSymbol(0, "__missing");
        } else {
          symbol = symbolTable.get(name);
          if (includes & 2885600) {
            classifiableNames.add(name);
          }
          if (!symbol) {
            symbolTable.set(name, symbol = createSymbol(0, name));
            if (isReplaceableByMethod)
              symbol.isReplaceableByMethod = true;
          } else if (isReplaceableByMethod && !symbol.isReplaceableByMethod) {
            return symbol;
          } else if (symbol.flags & excludes) {
            if (symbol.isReplaceableByMethod) {
              symbolTable.set(name, symbol = createSymbol(0, name));
            } else if (!(includes & 3 && symbol.flags & 67108864)) {
              if (ts2.isNamedDeclaration(node)) {
                ts2.setParent(node.name, node);
              }
              var message_1 = symbol.flags & 2 ? ts2.Diagnostics.Cannot_redeclare_block_scoped_variable_0 : ts2.Diagnostics.Duplicate_identifier_0;
              var messageNeedsName_1 = true;
              if (symbol.flags & 384 || includes & 384) {
                message_1 = ts2.Diagnostics.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations;
                messageNeedsName_1 = false;
              }
              var multipleDefaultExports_1 = false;
              if (ts2.length(symbol.declarations)) {
                if (isDefaultExport) {
                  message_1 = ts2.Diagnostics.A_module_cannot_have_multiple_default_exports;
                  messageNeedsName_1 = false;
                  multipleDefaultExports_1 = true;
                } else {
                  if (symbol.declarations && symbol.declarations.length && (node.kind === 270 && !node.isExportEquals)) {
                    message_1 = ts2.Diagnostics.A_module_cannot_have_multiple_default_exports;
                    messageNeedsName_1 = false;
                    multipleDefaultExports_1 = true;
                  }
                }
              }
              var relatedInformation_1 = [];
              if (ts2.isTypeAliasDeclaration(node) && ts2.nodeIsMissing(node.type) && ts2.hasSyntacticModifier(node, 1) && symbol.flags & (2097152 | 788968 | 1920)) {
                relatedInformation_1.push(createDiagnosticForNode(node, ts2.Diagnostics.Did_you_mean_0, "export type { ".concat(ts2.unescapeLeadingUnderscores(node.name.escapedText), " }")));
              }
              var declarationName_1 = ts2.getNameOfDeclaration(node) || node;
              ts2.forEach(symbol.declarations, function(declaration, index) {
                var decl = ts2.getNameOfDeclaration(declaration) || declaration;
                var diag2 = createDiagnosticForNode(decl, message_1, messageNeedsName_1 ? getDisplayName(declaration) : void 0);
                file.bindDiagnostics.push(multipleDefaultExports_1 ? ts2.addRelatedInfo(diag2, createDiagnosticForNode(declarationName_1, index === 0 ? ts2.Diagnostics.Another_export_default_is_here : ts2.Diagnostics.and_here)) : diag2);
                if (multipleDefaultExports_1) {
                  relatedInformation_1.push(createDiagnosticForNode(decl, ts2.Diagnostics.The_first_export_default_is_here));
                }
              });
              var diag = createDiagnosticForNode(declarationName_1, message_1, messageNeedsName_1 ? getDisplayName(node) : void 0);
              file.bindDiagnostics.push(ts2.addRelatedInfo.apply(void 0, __spreadArray([diag], relatedInformation_1, false)));
              symbol = createSymbol(0, name);
            }
          }
        }
        addDeclarationToSymbol(symbol, node, includes);
        if (symbol.parent) {
          ts2.Debug.assert(symbol.parent === parent2, "Existing symbol parent should match new one");
        } else {
          symbol.parent = parent2;
        }
        return symbol;
      }
      function declareModuleMember(node, symbolFlags, symbolExcludes) {
        var hasExportModifier = !!(ts2.getCombinedModifierFlags(node) & 1) || jsdocTreatAsExported(node);
        if (symbolFlags & 2097152) {
          if (node.kind === 274 || node.kind === 264 && hasExportModifier) {
            return declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes);
          } else {
            return declareSymbol(container.locals, void 0, node, symbolFlags, symbolExcludes);
          }
        } else {
          if (ts2.isJSDocTypeAlias(node))
            ts2.Debug.assert(ts2.isInJSFile(node));
          if (!ts2.isAmbientModule(node) && (hasExportModifier || container.flags & 64)) {
            if (!container.locals || ts2.hasSyntacticModifier(node, 512) && !getDeclarationName(node)) {
              return declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes);
            }
            var exportKind = symbolFlags & 111551 ? 1048576 : 0;
            var local = declareSymbol(container.locals, void 0, node, exportKind, symbolExcludes);
            local.exportSymbol = declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes);
            node.localSymbol = local;
            return local;
          } else {
            return declareSymbol(container.locals, void 0, node, symbolFlags, symbolExcludes);
          }
        }
      }
      function jsdocTreatAsExported(node) {
        if (node.parent && ts2.isModuleDeclaration(node)) {
          node = node.parent;
        }
        if (!ts2.isJSDocTypeAlias(node))
          return false;
        if (!ts2.isJSDocEnumTag(node) && !!node.fullName)
          return true;
        var declName = ts2.getNameOfDeclaration(node);
        if (!declName)
          return false;
        if (ts2.isPropertyAccessEntityNameExpression(declName.parent) && isTopLevelNamespaceAssignment(declName.parent))
          return true;
        if (ts2.isDeclaration(declName.parent) && ts2.getCombinedModifierFlags(declName.parent) & 1)
          return true;
        return false;
      }
      function bindContainer(node, containerFlags) {
        var saveContainer = container;
        var saveThisParentContainer = thisParentContainer;
        var savedBlockScopeContainer = blockScopeContainer;
        if (containerFlags & 1) {
          if (node.kind !== 213) {
            thisParentContainer = container;
          }
          container = blockScopeContainer = node;
          if (containerFlags & 32) {
            container.locals = ts2.createSymbolTable();
          }
          addToContainerChain(container);
        } else if (containerFlags & 2) {
          blockScopeContainer = node;
          blockScopeContainer.locals = void 0;
        }
        if (containerFlags & 4) {
          var saveCurrentFlow = currentFlow;
          var saveBreakTarget = currentBreakTarget;
          var saveContinueTarget = currentContinueTarget;
          var saveReturnTarget = currentReturnTarget;
          var saveExceptionTarget = currentExceptionTarget;
          var saveActiveLabelList = activeLabelList;
          var saveHasExplicitReturn = hasExplicitReturn;
          var isIIFE = containerFlags & 16 && !ts2.hasSyntacticModifier(node, 256) && !node.asteriskToken && !!ts2.getImmediatelyInvokedFunctionExpression(node);
          if (!isIIFE) {
            currentFlow = initFlowNode({ flags: 2 });
            if (containerFlags & (16 | 128)) {
              currentFlow.node = node;
            }
          }
          currentReturnTarget = isIIFE || node.kind === 170 || node.kind === 169 || ts2.isInJSFile(node) && (node.kind === 255 || node.kind === 212) ? createBranchLabel() : void 0;
          currentExceptionTarget = void 0;
          currentBreakTarget = void 0;
          currentContinueTarget = void 0;
          activeLabelList = void 0;
          hasExplicitReturn = false;
          bindChildren(node);
          node.flags &= ~2816;
          if (!(currentFlow.flags & 1) && containerFlags & 8 && ts2.nodeIsPresent(node.body)) {
            node.flags |= 256;
            if (hasExplicitReturn)
              node.flags |= 512;
            node.endFlowNode = currentFlow;
          }
          if (node.kind === 303) {
            node.flags |= emitFlags;
            node.endFlowNode = currentFlow;
          }
          if (currentReturnTarget) {
            addAntecedent(currentReturnTarget, currentFlow);
            currentFlow = finishFlowLabel(currentReturnTarget);
            if (node.kind === 170 || node.kind === 169 || ts2.isInJSFile(node) && (node.kind === 255 || node.kind === 212)) {
              node.returnFlowNode = currentFlow;
            }
          }
          if (!isIIFE) {
            currentFlow = saveCurrentFlow;
          }
          currentBreakTarget = saveBreakTarget;
          currentContinueTarget = saveContinueTarget;
          currentReturnTarget = saveReturnTarget;
          currentExceptionTarget = saveExceptionTarget;
          activeLabelList = saveActiveLabelList;
          hasExplicitReturn = saveHasExplicitReturn;
        } else if (containerFlags & 64) {
          seenThisKeyword = false;
          bindChildren(node);
          node.flags = seenThisKeyword ? node.flags | 128 : node.flags & ~128;
        } else {
          bindChildren(node);
        }
        container = saveContainer;
        thisParentContainer = saveThisParentContainer;
        blockScopeContainer = savedBlockScopeContainer;
      }
      function bindEachFunctionsFirst(nodes) {
        bindEach(nodes, function(n) {
          return n.kind === 255 ? bind(n) : void 0;
        });
        bindEach(nodes, function(n) {
          return n.kind !== 255 ? bind(n) : void 0;
        });
      }
      function bindEach(nodes, bindFunction) {
        if (bindFunction === void 0) {
          bindFunction = bind;
        }
        if (nodes === void 0) {
          return;
        }
        ts2.forEach(nodes, bindFunction);
      }
      function bindEachChild(node) {
        ts2.forEachChild(node, bind, bindEach);
      }
      function bindChildren(node) {
        var saveInAssignmentPattern = inAssignmentPattern;
        inAssignmentPattern = false;
        if (checkUnreachable(node)) {
          bindEachChild(node);
          bindJSDoc(node);
          inAssignmentPattern = saveInAssignmentPattern;
          return;
        }
        if (node.kind >= 236 && node.kind <= 252 && !options.allowUnreachableCode) {
          node.flowNode = currentFlow;
        }
        switch (node.kind) {
          case 240:
            bindWhileStatement(node);
            break;
          case 239:
            bindDoStatement(node);
            break;
          case 241:
            bindForStatement(node);
            break;
          case 242:
          case 243:
            bindForInOrForOfStatement(node);
            break;
          case 238:
            bindIfStatement(node);
            break;
          case 246:
          case 250:
            bindReturnOrThrow(node);
            break;
          case 245:
          case 244:
            bindBreakOrContinueStatement(node);
            break;
          case 251:
            bindTryStatement(node);
            break;
          case 248:
            bindSwitchStatement(node);
            break;
          case 262:
            bindCaseBlock(node);
            break;
          case 288:
            bindCaseClause(node);
            break;
          case 237:
            bindExpressionStatement(node);
            break;
          case 249:
            bindLabeledStatement(node);
            break;
          case 218:
            bindPrefixUnaryExpressionFlow(node);
            break;
          case 219:
            bindPostfixUnaryExpressionFlow(node);
            break;
          case 220:
            if (ts2.isDestructuringAssignment(node)) {
              inAssignmentPattern = saveInAssignmentPattern;
              bindDestructuringAssignmentFlow(node);
              return;
            }
            bindBinaryExpressionFlow(node);
            break;
          case 214:
            bindDeleteExpressionFlow(node);
            break;
          case 221:
            bindConditionalExpressionFlow(node);
            break;
          case 253:
            bindVariableDeclarationFlow(node);
            break;
          case 205:
          case 206:
            bindAccessExpressionFlow(node);
            break;
          case 207:
            bindCallExpressionFlow(node);
            break;
          case 229:
            bindNonNullExpressionFlow(node);
            break;
          case 343:
          case 336:
          case 337:
            bindJSDocTypeAlias(node);
            break;
          case 303: {
            bindEachFunctionsFirst(node.statements);
            bind(node.endOfFileToken);
            break;
          }
          case 234:
          case 261:
            bindEachFunctionsFirst(node.statements);
            break;
          case 202:
            bindBindingElementFlow(node);
            break;
          case 204:
          case 203:
          case 294:
          case 224:
            inAssignmentPattern = saveInAssignmentPattern;
          default:
            bindEachChild(node);
            break;
        }
        bindJSDoc(node);
        inAssignmentPattern = saveInAssignmentPattern;
      }
      function isNarrowingExpression(expr) {
        switch (expr.kind) {
          case 79:
          case 80:
          case 108:
          case 205:
          case 206:
            return containsNarrowableReference(expr);
          case 207:
            return hasNarrowableArgument(expr);
          case 211:
          case 229:
            return isNarrowingExpression(expr.expression);
          case 220:
            return isNarrowingBinaryExpression(expr);
          case 218:
            return expr.operator === 53 && isNarrowingExpression(expr.operand);
          case 215:
            return isNarrowingExpression(expr.expression);
        }
        return false;
      }
      function isNarrowableReference(expr) {
        return ts2.isDottedName(expr) || (ts2.isPropertyAccessExpression(expr) || ts2.isNonNullExpression(expr) || ts2.isParenthesizedExpression(expr)) && isNarrowableReference(expr.expression) || ts2.isBinaryExpression(expr) && expr.operatorToken.kind === 27 && isNarrowableReference(expr.right) || ts2.isElementAccessExpression(expr) && ts2.isStringOrNumericLiteralLike(expr.argumentExpression) && isNarrowableReference(expr.expression) || ts2.isAssignmentExpression(expr) && isNarrowableReference(expr.left);
      }
      function containsNarrowableReference(expr) {
        return isNarrowableReference(expr) || ts2.isOptionalChain(expr) && containsNarrowableReference(expr.expression);
      }
      function hasNarrowableArgument(expr) {
        if (expr.arguments) {
          for (var _i = 0, _a = expr.arguments; _i < _a.length; _i++) {
            var argument = _a[_i];
            if (containsNarrowableReference(argument)) {
              return true;
            }
          }
        }
        if (expr.expression.kind === 205 && containsNarrowableReference(expr.expression.expression)) {
          return true;
        }
        return false;
      }
      function isNarrowingTypeofOperands(expr1, expr2) {
        return ts2.isTypeOfExpression(expr1) && isNarrowableOperand(expr1.expression) && ts2.isStringLiteralLike(expr2);
      }
      function isNarrowingBinaryExpression(expr) {
        switch (expr.operatorToken.kind) {
          case 63:
          case 75:
          case 76:
          case 77:
            return containsNarrowableReference(expr.left);
          case 34:
          case 35:
          case 36:
          case 37:
            return isNarrowableOperand(expr.left) || isNarrowableOperand(expr.right) || isNarrowingTypeofOperands(expr.right, expr.left) || isNarrowingTypeofOperands(expr.left, expr.right);
          case 102:
            return isNarrowableOperand(expr.left);
          case 101:
            return isNarrowingExpression(expr.right);
          case 27:
            return isNarrowingExpression(expr.right);
        }
        return false;
      }
      function isNarrowableOperand(expr) {
        switch (expr.kind) {
          case 211:
            return isNarrowableOperand(expr.expression);
          case 220:
            switch (expr.operatorToken.kind) {
              case 63:
                return isNarrowableOperand(expr.left);
              case 27:
                return isNarrowableOperand(expr.right);
            }
        }
        return containsNarrowableReference(expr);
      }
      function createBranchLabel() {
        return initFlowNode({ flags: 4, antecedents: void 0 });
      }
      function createLoopLabel() {
        return initFlowNode({ flags: 8, antecedents: void 0 });
      }
      function createReduceLabel(target, antecedents, antecedent) {
        return initFlowNode({ flags: 1024, target, antecedents, antecedent });
      }
      function setFlowNodeReferenced(flow) {
        flow.flags |= flow.flags & 2048 ? 4096 : 2048;
      }
      function addAntecedent(label, antecedent) {
        if (!(antecedent.flags & 1) && !ts2.contains(label.antecedents, antecedent)) {
          (label.antecedents || (label.antecedents = [])).push(antecedent);
          setFlowNodeReferenced(antecedent);
        }
      }
      function createFlowCondition(flags, antecedent, expression) {
        if (antecedent.flags & 1) {
          return antecedent;
        }
        if (!expression) {
          return flags & 32 ? antecedent : unreachableFlow;
        }
        if ((expression.kind === 110 && flags & 64 || expression.kind === 95 && flags & 32) && !ts2.isExpressionOfOptionalChainRoot(expression) && !ts2.isNullishCoalesce(expression.parent)) {
          return unreachableFlow;
        }
        if (!isNarrowingExpression(expression)) {
          return antecedent;
        }
        setFlowNodeReferenced(antecedent);
        return initFlowNode({ flags, antecedent, node: expression });
      }
      function createFlowSwitchClause(antecedent, switchStatement, clauseStart, clauseEnd) {
        setFlowNodeReferenced(antecedent);
        return initFlowNode({ flags: 128, antecedent, switchStatement, clauseStart, clauseEnd });
      }
      function createFlowMutation(flags, antecedent, node) {
        setFlowNodeReferenced(antecedent);
        var result = initFlowNode({ flags, antecedent, node });
        if (currentExceptionTarget) {
          addAntecedent(currentExceptionTarget, result);
        }
        return result;
      }
      function createFlowCall(antecedent, node) {
        setFlowNodeReferenced(antecedent);
        return initFlowNode({ flags: 512, antecedent, node });
      }
      function finishFlowLabel(flow) {
        var antecedents = flow.antecedents;
        if (!antecedents) {
          return unreachableFlow;
        }
        if (antecedents.length === 1) {
          return antecedents[0];
        }
        return flow;
      }
      function isStatementCondition(node) {
        var parent2 = node.parent;
        switch (parent2.kind) {
          case 238:
          case 240:
          case 239:
            return parent2.expression === node;
          case 241:
          case 221:
            return parent2.condition === node;
        }
        return false;
      }
      function isLogicalExpression(node) {
        while (true) {
          if (node.kind === 211) {
            node = node.expression;
          } else if (node.kind === 218 && node.operator === 53) {
            node = node.operand;
          } else {
            return node.kind === 220 && (node.operatorToken.kind === 55 || node.operatorToken.kind === 56 || node.operatorToken.kind === 60);
          }
        }
      }
      function isLogicalAssignmentExpression(node) {
        node = ts2.skipParentheses(node);
        return ts2.isBinaryExpression(node) && ts2.isLogicalOrCoalescingAssignmentOperator(node.operatorToken.kind);
      }
      function isTopLevelLogicalExpression(node) {
        while (ts2.isParenthesizedExpression(node.parent) || ts2.isPrefixUnaryExpression(node.parent) && node.parent.operator === 53) {
          node = node.parent;
        }
        return !isStatementCondition(node) && !isLogicalAssignmentExpression(node.parent) && !isLogicalExpression(node.parent) && !(ts2.isOptionalChain(node.parent) && node.parent.expression === node);
      }
      function doWithConditionalBranches(action, value, trueTarget, falseTarget) {
        var savedTrueTarget = currentTrueTarget;
        var savedFalseTarget = currentFalseTarget;
        currentTrueTarget = trueTarget;
        currentFalseTarget = falseTarget;
        action(value);
        currentTrueTarget = savedTrueTarget;
        currentFalseTarget = savedFalseTarget;
      }
      function bindCondition(node, trueTarget, falseTarget) {
        doWithConditionalBranches(bind, node, trueTarget, falseTarget);
        if (!node || !isLogicalAssignmentExpression(node) && !isLogicalExpression(node) && !(ts2.isOptionalChain(node) && ts2.isOutermostOptionalChain(node))) {
          addAntecedent(trueTarget, createFlowCondition(32, currentFlow, node));
          addAntecedent(falseTarget, createFlowCondition(64, currentFlow, node));
        }
      }
      function bindIterativeStatement(node, breakTarget, continueTarget) {
        var saveBreakTarget = currentBreakTarget;
        var saveContinueTarget = currentContinueTarget;
        currentBreakTarget = breakTarget;
        currentContinueTarget = continueTarget;
        bind(node);
        currentBreakTarget = saveBreakTarget;
        currentContinueTarget = saveContinueTarget;
      }
      function setContinueTarget(node, target) {
        var label = activeLabelList;
        while (label && node.parent.kind === 249) {
          label.continueTarget = target;
          label = label.next;
          node = node.parent;
        }
        return target;
      }
      function bindWhileStatement(node) {
        var preWhileLabel = setContinueTarget(node, createLoopLabel());
        var preBodyLabel = createBranchLabel();
        var postWhileLabel = createBranchLabel();
        addAntecedent(preWhileLabel, currentFlow);
        currentFlow = preWhileLabel;
        bindCondition(node.expression, preBodyLabel, postWhileLabel);
        currentFlow = finishFlowLabel(preBodyLabel);
        bindIterativeStatement(node.statement, postWhileLabel, preWhileLabel);
        addAntecedent(preWhileLabel, currentFlow);
        currentFlow = finishFlowLabel(postWhileLabel);
      }
      function bindDoStatement(node) {
        var preDoLabel = createLoopLabel();
        var preConditionLabel = setContinueTarget(node, createBranchLabel());
        var postDoLabel = createBranchLabel();
        addAntecedent(preDoLabel, currentFlow);
        currentFlow = preDoLabel;
        bindIterativeStatement(node.statement, postDoLabel, preConditionLabel);
        addAntecedent(preConditionLabel, currentFlow);
        currentFlow = finishFlowLabel(preConditionLabel);
        bindCondition(node.expression, preDoLabel, postDoLabel);
        currentFlow = finishFlowLabel(postDoLabel);
      }
      function bindForStatement(node) {
        var preLoopLabel = setContinueTarget(node, createLoopLabel());
        var preBodyLabel = createBranchLabel();
        var postLoopLabel = createBranchLabel();
        bind(node.initializer);
        addAntecedent(preLoopLabel, currentFlow);
        currentFlow = preLoopLabel;
        bindCondition(node.condition, preBodyLabel, postLoopLabel);
        currentFlow = finishFlowLabel(preBodyLabel);
        bindIterativeStatement(node.statement, postLoopLabel, preLoopLabel);
        bind(node.incrementor);
        addAntecedent(preLoopLabel, currentFlow);
        currentFlow = finishFlowLabel(postLoopLabel);
      }
      function bindForInOrForOfStatement(node) {
        var preLoopLabel = setContinueTarget(node, createLoopLabel());
        var postLoopLabel = createBranchLabel();
        bind(node.expression);
        addAntecedent(preLoopLabel, currentFlow);
        currentFlow = preLoopLabel;
        if (node.kind === 243) {
          bind(node.awaitModifier);
        }
        addAntecedent(postLoopLabel, currentFlow);
        bind(node.initializer);
        if (node.initializer.kind !== 254) {
          bindAssignmentTargetFlow(node.initializer);
        }
        bindIterativeStatement(node.statement, postLoopLabel, preLoopLabel);
        addAntecedent(preLoopLabel, currentFlow);
        currentFlow = finishFlowLabel(postLoopLabel);
      }
      function bindIfStatement(node) {
        var thenLabel = createBranchLabel();
        var elseLabel = createBranchLabel();
        var postIfLabel = createBranchLabel();
        bindCondition(node.expression, thenLabel, elseLabel);
        currentFlow = finishFlowLabel(thenLabel);
        bind(node.thenStatement);
        addAntecedent(postIfLabel, currentFlow);
        currentFlow = finishFlowLabel(elseLabel);
        bind(node.elseStatement);
        addAntecedent(postIfLabel, currentFlow);
        currentFlow = finishFlowLabel(postIfLabel);
      }
      function bindReturnOrThrow(node) {
        bind(node.expression);
        if (node.kind === 246) {
          hasExplicitReturn = true;
          if (currentReturnTarget) {
            addAntecedent(currentReturnTarget, currentFlow);
          }
        }
        currentFlow = unreachableFlow;
      }
      function findActiveLabel(name) {
        for (var label = activeLabelList; label; label = label.next) {
          if (label.name === name) {
            return label;
          }
        }
        return void 0;
      }
      function bindBreakOrContinueFlow(node, breakTarget, continueTarget) {
        var flowLabel = node.kind === 245 ? breakTarget : continueTarget;
        if (flowLabel) {
          addAntecedent(flowLabel, currentFlow);
          currentFlow = unreachableFlow;
        }
      }
      function bindBreakOrContinueStatement(node) {
        bind(node.label);
        if (node.label) {
          var activeLabel = findActiveLabel(node.label.escapedText);
          if (activeLabel) {
            activeLabel.referenced = true;
            bindBreakOrContinueFlow(node, activeLabel.breakTarget, activeLabel.continueTarget);
          }
        } else {
          bindBreakOrContinueFlow(node, currentBreakTarget, currentContinueTarget);
        }
      }
      function bindTryStatement(node) {
        var saveReturnTarget = currentReturnTarget;
        var saveExceptionTarget = currentExceptionTarget;
        var normalExitLabel = createBranchLabel();
        var returnLabel = createBranchLabel();
        var exceptionLabel = createBranchLabel();
        if (node.finallyBlock) {
          currentReturnTarget = returnLabel;
        }
        addAntecedent(exceptionLabel, currentFlow);
        currentExceptionTarget = exceptionLabel;
        bind(node.tryBlock);
        addAntecedent(normalExitLabel, currentFlow);
        if (node.catchClause) {
          currentFlow = finishFlowLabel(exceptionLabel);
          exceptionLabel = createBranchLabel();
          addAntecedent(exceptionLabel, currentFlow);
          currentExceptionTarget = exceptionLabel;
          bind(node.catchClause);
          addAntecedent(normalExitLabel, currentFlow);
        }
        currentReturnTarget = saveReturnTarget;
        currentExceptionTarget = saveExceptionTarget;
        if (node.finallyBlock) {
          var finallyLabel = createBranchLabel();
          finallyLabel.antecedents = ts2.concatenate(ts2.concatenate(normalExitLabel.antecedents, exceptionLabel.antecedents), returnLabel.antecedents);
          currentFlow = finallyLabel;
          bind(node.finallyBlock);
          if (currentFlow.flags & 1) {
            currentFlow = unreachableFlow;
          } else {
            if (currentReturnTarget && returnLabel.antecedents) {
              addAntecedent(currentReturnTarget, createReduceLabel(finallyLabel, returnLabel.antecedents, currentFlow));
            }
            if (currentExceptionTarget && exceptionLabel.antecedents) {
              addAntecedent(currentExceptionTarget, createReduceLabel(finallyLabel, exceptionLabel.antecedents, currentFlow));
            }
            currentFlow = normalExitLabel.antecedents ? createReduceLabel(finallyLabel, normalExitLabel.antecedents, currentFlow) : unreachableFlow;
          }
        } else {
          currentFlow = finishFlowLabel(normalExitLabel);
        }
      }
      function bindSwitchStatement(node) {
        var postSwitchLabel = createBranchLabel();
        bind(node.expression);
        var saveBreakTarget = currentBreakTarget;
        var savePreSwitchCaseFlow = preSwitchCaseFlow;
        currentBreakTarget = postSwitchLabel;
        preSwitchCaseFlow = currentFlow;
        bind(node.caseBlock);
        addAntecedent(postSwitchLabel, currentFlow);
        var hasDefault = ts2.forEach(node.caseBlock.clauses, function(c) {
          return c.kind === 289;
        });
        node.possiblyExhaustive = !hasDefault && !postSwitchLabel.antecedents;
        if (!hasDefault) {
          addAntecedent(postSwitchLabel, createFlowSwitchClause(preSwitchCaseFlow, node, 0, 0));
        }
        currentBreakTarget = saveBreakTarget;
        preSwitchCaseFlow = savePreSwitchCaseFlow;
        currentFlow = finishFlowLabel(postSwitchLabel);
      }
      function bindCaseBlock(node) {
        var clauses = node.clauses;
        var isNarrowingSwitch = isNarrowingExpression(node.parent.expression);
        var fallthroughFlow = unreachableFlow;
        for (var i = 0; i < clauses.length; i++) {
          var clauseStart = i;
          while (!clauses[i].statements.length && i + 1 < clauses.length) {
            bind(clauses[i]);
            i++;
          }
          var preCaseLabel = createBranchLabel();
          addAntecedent(preCaseLabel, isNarrowingSwitch ? createFlowSwitchClause(preSwitchCaseFlow, node.parent, clauseStart, i + 1) : preSwitchCaseFlow);
          addAntecedent(preCaseLabel, fallthroughFlow);
          currentFlow = finishFlowLabel(preCaseLabel);
          var clause = clauses[i];
          bind(clause);
          fallthroughFlow = currentFlow;
          if (!(currentFlow.flags & 1) && i !== clauses.length - 1 && options.noFallthroughCasesInSwitch) {
            clause.fallthroughFlowNode = currentFlow;
          }
        }
      }
      function bindCaseClause(node) {
        var saveCurrentFlow = currentFlow;
        currentFlow = preSwitchCaseFlow;
        bind(node.expression);
        currentFlow = saveCurrentFlow;
        bindEach(node.statements);
      }
      function bindExpressionStatement(node) {
        bind(node.expression);
        maybeBindExpressionFlowIfCall(node.expression);
      }
      function maybeBindExpressionFlowIfCall(node) {
        if (node.kind === 207) {
          var call = node;
          if (call.expression.kind !== 106 && ts2.isDottedName(call.expression)) {
            currentFlow = createFlowCall(currentFlow, call);
          }
        }
      }
      function bindLabeledStatement(node) {
        var postStatementLabel = createBranchLabel();
        activeLabelList = {
          next: activeLabelList,
          name: node.label.escapedText,
          breakTarget: postStatementLabel,
          continueTarget: void 0,
          referenced: false
        };
        bind(node.label);
        bind(node.statement);
        if (!activeLabelList.referenced && !options.allowUnusedLabels) {
          errorOrSuggestionOnNode(ts2.unusedLabelIsError(options), node.label, ts2.Diagnostics.Unused_label);
        }
        activeLabelList = activeLabelList.next;
        addAntecedent(postStatementLabel, currentFlow);
        currentFlow = finishFlowLabel(postStatementLabel);
      }
      function bindDestructuringTargetFlow(node) {
        if (node.kind === 220 && node.operatorToken.kind === 63) {
          bindAssignmentTargetFlow(node.left);
        } else {
          bindAssignmentTargetFlow(node);
        }
      }
      function bindAssignmentTargetFlow(node) {
        if (isNarrowableReference(node)) {
          currentFlow = createFlowMutation(16, currentFlow, node);
        } else if (node.kind === 203) {
          for (var _i = 0, _a = node.elements; _i < _a.length; _i++) {
            var e = _a[_i];
            if (e.kind === 224) {
              bindAssignmentTargetFlow(e.expression);
            } else {
              bindDestructuringTargetFlow(e);
            }
          }
        } else if (node.kind === 204) {
          for (var _b = 0, _c = node.properties; _b < _c.length; _b++) {
            var p = _c[_b];
            if (p.kind === 294) {
              bindDestructuringTargetFlow(p.initializer);
            } else if (p.kind === 295) {
              bindAssignmentTargetFlow(p.name);
            } else if (p.kind === 296) {
              bindAssignmentTargetFlow(p.expression);
            }
          }
        }
      }
      function bindLogicalLikeExpression(node, trueTarget, falseTarget) {
        var preRightLabel = createBranchLabel();
        if (node.operatorToken.kind === 55 || node.operatorToken.kind === 76) {
          bindCondition(node.left, preRightLabel, falseTarget);
        } else {
          bindCondition(node.left, trueTarget, preRightLabel);
        }
        currentFlow = finishFlowLabel(preRightLabel);
        bind(node.operatorToken);
        if (ts2.isLogicalOrCoalescingAssignmentOperator(node.operatorToken.kind)) {
          doWithConditionalBranches(bind, node.right, trueTarget, falseTarget);
          bindAssignmentTargetFlow(node.left);
          addAntecedent(trueTarget, createFlowCondition(32, currentFlow, node));
          addAntecedent(falseTarget, createFlowCondition(64, currentFlow, node));
        } else {
          bindCondition(node.right, trueTarget, falseTarget);
        }
      }
      function bindPrefixUnaryExpressionFlow(node) {
        if (node.operator === 53) {
          var saveTrueTarget = currentTrueTarget;
          currentTrueTarget = currentFalseTarget;
          currentFalseTarget = saveTrueTarget;
          bindEachChild(node);
          currentFalseTarget = currentTrueTarget;
          currentTrueTarget = saveTrueTarget;
        } else {
          bindEachChild(node);
          if (node.operator === 45 || node.operator === 46) {
            bindAssignmentTargetFlow(node.operand);
          }
        }
      }
      function bindPostfixUnaryExpressionFlow(node) {
        bindEachChild(node);
        if (node.operator === 45 || node.operator === 46) {
          bindAssignmentTargetFlow(node.operand);
        }
      }
      function bindDestructuringAssignmentFlow(node) {
        if (inAssignmentPattern) {
          inAssignmentPattern = false;
          bind(node.operatorToken);
          bind(node.right);
          inAssignmentPattern = true;
          bind(node.left);
        } else {
          inAssignmentPattern = true;
          bind(node.left);
          inAssignmentPattern = false;
          bind(node.operatorToken);
          bind(node.right);
        }
        bindAssignmentTargetFlow(node.left);
      }
      function createBindBinaryExpressionFlow() {
        return ts2.createBinaryExpressionTrampoline(onEnter, onLeft, onOperator, onRight, onExit, void 0);
        function onEnter(node, state) {
          if (state) {
            state.stackIndex++;
            ts2.setParent(node, parent);
            var saveInStrictMode = inStrictMode;
            bindWorker(node);
            var saveParent = parent;
            parent = node;
            state.skip = false;
            state.inStrictModeStack[state.stackIndex] = saveInStrictMode;
            state.parentStack[state.stackIndex] = saveParent;
          } else {
            state = {
              stackIndex: 0,
              skip: false,
              inStrictModeStack: [void 0],
              parentStack: [void 0]
            };
          }
          var operator = node.operatorToken.kind;
          if (operator === 55 || operator === 56 || operator === 60 || ts2.isLogicalOrCoalescingAssignmentOperator(operator)) {
            if (isTopLevelLogicalExpression(node)) {
              var postExpressionLabel = createBranchLabel();
              bindLogicalLikeExpression(node, postExpressionLabel, postExpressionLabel);
              currentFlow = finishFlowLabel(postExpressionLabel);
            } else {
              bindLogicalLikeExpression(node, currentTrueTarget, currentFalseTarget);
            }
            state.skip = true;
          }
          return state;
        }
        function onLeft(left, state, _node) {
          if (!state.skip) {
            return maybeBind(left);
          }
        }
        function onOperator(operatorToken, state, node) {
          if (!state.skip) {
            if (operatorToken.kind === 27) {
              maybeBindExpressionFlowIfCall(node.left);
            }
            bind(operatorToken);
          }
        }
        function onRight(right, state, _node) {
          if (!state.skip) {
            return maybeBind(right);
          }
        }
        function onExit(node, state) {
          if (!state.skip) {
            var operator = node.operatorToken.kind;
            if (ts2.isAssignmentOperator(operator) && !ts2.isAssignmentTarget(node)) {
              bindAssignmentTargetFlow(node.left);
              if (operator === 63 && node.left.kind === 206) {
                var elementAccess = node.left;
                if (isNarrowableOperand(elementAccess.expression)) {
                  currentFlow = createFlowMutation(256, currentFlow, node);
                }
              }
            }
          }
          var savedInStrictMode = state.inStrictModeStack[state.stackIndex];
          var savedParent = state.parentStack[state.stackIndex];
          if (savedInStrictMode !== void 0) {
            inStrictMode = savedInStrictMode;
          }
          if (savedParent !== void 0) {
            parent = savedParent;
          }
          state.skip = false;
          state.stackIndex--;
        }
        function maybeBind(node) {
          if (node && ts2.isBinaryExpression(node) && !ts2.isDestructuringAssignment(node)) {
            return node;
          }
          bind(node);
        }
      }
      function bindDeleteExpressionFlow(node) {
        bindEachChild(node);
        if (node.expression.kind === 205) {
          bindAssignmentTargetFlow(node.expression);
        }
      }
      function bindConditionalExpressionFlow(node) {
        var trueLabel = createBranchLabel();
        var falseLabel = createBranchLabel();
        var postExpressionLabel = createBranchLabel();
        bindCondition(node.condition, trueLabel, falseLabel);
        currentFlow = finishFlowLabel(trueLabel);
        bind(node.questionToken);
        bind(node.whenTrue);
        addAntecedent(postExpressionLabel, currentFlow);
        currentFlow = finishFlowLabel(falseLabel);
        bind(node.colonToken);
        bind(node.whenFalse);
        addAntecedent(postExpressionLabel, currentFlow);
        currentFlow = finishFlowLabel(postExpressionLabel);
      }
      function bindInitializedVariableFlow(node) {
        var name = !ts2.isOmittedExpression(node) ? node.name : void 0;
        if (ts2.isBindingPattern(name)) {
          for (var _i = 0, _a = name.elements; _i < _a.length; _i++) {
            var child = _a[_i];
            bindInitializedVariableFlow(child);
          }
        } else {
          currentFlow = createFlowMutation(16, currentFlow, node);
        }
      }
      function bindVariableDeclarationFlow(node) {
        bindEachChild(node);
        if (node.initializer || ts2.isForInOrOfStatement(node.parent.parent)) {
          bindInitializedVariableFlow(node);
        }
      }
      function bindBindingElementFlow(node) {
        if (ts2.isBindingPattern(node.name)) {
          bindEach(node.decorators);
          bindEach(node.modifiers);
          bind(node.dotDotDotToken);
          bind(node.propertyName);
          bind(node.initializer);
          bind(node.name);
        } else {
          bindEachChild(node);
        }
      }
      function bindJSDocTypeAlias(node) {
        bind(node.tagName);
        if (node.kind !== 337 && node.fullName) {
          ts2.setParent(node.fullName, node);
          ts2.setParentRecursive(node.fullName, false);
        }
        if (typeof node.comment !== "string") {
          bindEach(node.comment);
        }
      }
      function bindJSDocClassTag(node) {
        bindEachChild(node);
        var host = ts2.getHostSignatureFromJSDoc(node);
        if (host && host.kind !== 168) {
          addDeclarationToSymbol(host.symbol, host, 32);
        }
      }
      function bindOptionalExpression(node, trueTarget, falseTarget) {
        doWithConditionalBranches(bind, node, trueTarget, falseTarget);
        if (!ts2.isOptionalChain(node) || ts2.isOutermostOptionalChain(node)) {
          addAntecedent(trueTarget, createFlowCondition(32, currentFlow, node));
          addAntecedent(falseTarget, createFlowCondition(64, currentFlow, node));
        }
      }
      function bindOptionalChainRest(node) {
        switch (node.kind) {
          case 205:
            bind(node.questionDotToken);
            bind(node.name);
            break;
          case 206:
            bind(node.questionDotToken);
            bind(node.argumentExpression);
            break;
          case 207:
            bind(node.questionDotToken);
            bindEach(node.typeArguments);
            bindEach(node.arguments);
            break;
        }
      }
      function bindOptionalChain(node, trueTarget, falseTarget) {
        var preChainLabel = ts2.isOptionalChainRoot(node) ? createBranchLabel() : void 0;
        bindOptionalExpression(node.expression, preChainLabel || trueTarget, falseTarget);
        if (preChainLabel) {
          currentFlow = finishFlowLabel(preChainLabel);
        }
        doWithConditionalBranches(bindOptionalChainRest, node, trueTarget, falseTarget);
        if (ts2.isOutermostOptionalChain(node)) {
          addAntecedent(trueTarget, createFlowCondition(32, currentFlow, node));
          addAntecedent(falseTarget, createFlowCondition(64, currentFlow, node));
        }
      }
      function bindOptionalChainFlow(node) {
        if (isTopLevelLogicalExpression(node)) {
          var postExpressionLabel = createBranchLabel();
          bindOptionalChain(node, postExpressionLabel, postExpressionLabel);
          currentFlow = finishFlowLabel(postExpressionLabel);
        } else {
          bindOptionalChain(node, currentTrueTarget, currentFalseTarget);
        }
      }
      function bindNonNullExpressionFlow(node) {
        if (ts2.isOptionalChain(node)) {
          bindOptionalChainFlow(node);
        } else {
          bindEachChild(node);
        }
      }
      function bindAccessExpressionFlow(node) {
        if (ts2.isOptionalChain(node)) {
          bindOptionalChainFlow(node);
        } else {
          bindEachChild(node);
        }
      }
      function bindCallExpressionFlow(node) {
        if (ts2.isOptionalChain(node)) {
          bindOptionalChainFlow(node);
        } else {
          var expr = ts2.skipParentheses(node.expression);
          if (expr.kind === 212 || expr.kind === 213) {
            bindEach(node.typeArguments);
            bindEach(node.arguments);
            bind(node.expression);
          } else {
            bindEachChild(node);
            if (node.expression.kind === 106) {
              currentFlow = createFlowCall(currentFlow, node);
            }
          }
        }
        if (node.expression.kind === 205) {
          var propertyAccess = node.expression;
          if (ts2.isIdentifier(propertyAccess.name) && isNarrowableOperand(propertyAccess.expression) && ts2.isPushOrUnshiftIdentifier(propertyAccess.name)) {
            currentFlow = createFlowMutation(256, currentFlow, node);
          }
        }
      }
      function getContainerFlags(node) {
        switch (node.kind) {
          case 225:
          case 256:
          case 259:
          case 204:
          case 181:
          case 320:
          case 285:
            return 1;
          case 257:
            return 1 | 64;
          case 260:
          case 258:
          case 194:
            return 1 | 32;
          case 303:
            return 1 | 4 | 32;
          case 171:
          case 172:
          case 168:
            if (ts2.isObjectLiteralOrClassExpressionMethodOrAccessor(node)) {
              return 1 | 4 | 32 | 8 | 128;
            }
          case 170:
          case 255:
          case 167:
          case 173:
          case 321:
          case 315:
          case 178:
          case 174:
          case 175:
          case 179:
          case 169:
            return 1 | 4 | 32 | 8;
          case 212:
          case 213:
            return 1 | 4 | 32 | 8 | 16;
          case 261:
            return 4;
          case 166:
            return node.initializer ? 4 : 0;
          case 291:
          case 241:
          case 242:
          case 243:
          case 262:
            return 2;
          case 234:
            return ts2.isFunctionLike(node.parent) || ts2.isClassStaticBlockDeclaration(node.parent) ? 0 : 2;
        }
        return 0;
      }
      function addToContainerChain(next) {
        if (lastContainer) {
          lastContainer.nextContainer = next;
        }
        lastContainer = next;
      }
      function declareSymbolAndAddToSymbolTable(node, symbolFlags, symbolExcludes) {
        switch (container.kind) {
          case 260:
            return declareModuleMember(node, symbolFlags, symbolExcludes);
          case 303:
            return declareSourceFileMember(node, symbolFlags, symbolExcludes);
          case 225:
          case 256:
            return declareClassMember(node, symbolFlags, symbolExcludes);
          case 259:
            return declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes);
          case 181:
          case 320:
          case 204:
          case 257:
          case 285:
            return declareSymbol(container.symbol.members, container.symbol, node, symbolFlags, symbolExcludes);
          case 178:
          case 179:
          case 173:
          case 174:
          case 321:
          case 175:
          case 168:
          case 167:
          case 170:
          case 171:
          case 172:
          case 255:
          case 212:
          case 213:
          case 315:
          case 343:
          case 336:
          case 169:
          case 258:
          case 194:
            return declareSymbol(container.locals, void 0, node, symbolFlags, symbolExcludes);
        }
      }
      function declareClassMember(node, symbolFlags, symbolExcludes) {
        return ts2.isStatic(node) ? declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes) : declareSymbol(container.symbol.members, container.symbol, node, symbolFlags, symbolExcludes);
      }
      function declareSourceFileMember(node, symbolFlags, symbolExcludes) {
        return ts2.isExternalModule(file) ? declareModuleMember(node, symbolFlags, symbolExcludes) : declareSymbol(file.locals, void 0, node, symbolFlags, symbolExcludes);
      }
      function hasExportDeclarations(node) {
        var body = ts2.isSourceFile(node) ? node : ts2.tryCast(node.body, ts2.isModuleBlock);
        return !!body && body.statements.some(function(s) {
          return ts2.isExportDeclaration(s) || ts2.isExportAssignment(s);
        });
      }
      function setExportContextFlag(node) {
        if (node.flags & 8388608 && !hasExportDeclarations(node)) {
          node.flags |= 64;
        } else {
          node.flags &= ~64;
        }
      }
      function bindModuleDeclaration(node) {
        setExportContextFlag(node);
        if (ts2.isAmbientModule(node)) {
          if (ts2.hasSyntacticModifier(node, 1)) {
            errorOnFirstToken(node, ts2.Diagnostics.export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always_visible);
          }
          if (ts2.isModuleAugmentationExternal(node)) {
            declareModuleSymbol(node);
          } else {
            var pattern = void 0;
            if (node.name.kind === 10) {
              var text = node.name.text;
              pattern = ts2.tryParsePattern(text);
              if (pattern === void 0) {
                errorOnFirstToken(node.name, ts2.Diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character, text);
              }
            }
            var symbol = declareSymbolAndAddToSymbolTable(node, 512, 110735);
            file.patternAmbientModules = ts2.append(file.patternAmbientModules, pattern && !ts2.isString(pattern) ? { pattern, symbol } : void 0);
          }
        } else {
          var state = declareModuleSymbol(node);
          if (state !== 0) {
            var symbol = node.symbol;
            symbol.constEnumOnlyModule = !(symbol.flags & (16 | 32 | 256)) && state === 2 && symbol.constEnumOnlyModule !== false;
          }
        }
      }
      function declareModuleSymbol(node) {
        var state = getModuleInstanceState(node);
        var instantiated = state !== 0;
        declareSymbolAndAddToSymbolTable(node, instantiated ? 512 : 1024, instantiated ? 110735 : 0);
        return state;
      }
      function bindFunctionOrConstructorType(node) {
        var symbol = createSymbol(131072, getDeclarationName(node));
        addDeclarationToSymbol(symbol, node, 131072);
        var typeLiteralSymbol = createSymbol(2048, "__type");
        addDeclarationToSymbol(typeLiteralSymbol, node, 2048);
        typeLiteralSymbol.members = ts2.createSymbolTable();
        typeLiteralSymbol.members.set(symbol.escapedName, symbol);
      }
      function bindObjectLiteralExpression(node) {
        var ElementKind;
        (function(ElementKind2) {
          ElementKind2[ElementKind2["Property"] = 1] = "Property";
          ElementKind2[ElementKind2["Accessor"] = 2] = "Accessor";
        })(ElementKind || (ElementKind = {}));
        if (inStrictMode && !ts2.isAssignmentTarget(node)) {
          var seen = new ts2.Map();
          for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
            var prop = _a[_i];
            if (prop.kind === 296 || prop.name.kind !== 79) {
              continue;
            }
            var identifier = prop.name;
            var currentKind = prop.kind === 294 || prop.kind === 295 || prop.kind === 168 ? 1 : 2;
            var existingKind = seen.get(identifier.escapedText);
            if (!existingKind) {
              seen.set(identifier.escapedText, currentKind);
              continue;
            }
            if (currentKind === 1 && existingKind === 1) {
              var span = ts2.getErrorSpanForNode(file, identifier);
              file.bindDiagnostics.push(ts2.createFileDiagnostic(file, span.start, span.length, ts2.Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode));
            }
          }
        }
        return bindAnonymousDeclaration(node, 4096, "__object");
      }
      function bindJsxAttributes(node) {
        return bindAnonymousDeclaration(node, 4096, "__jsxAttributes");
      }
      function bindJsxAttribute(node, symbolFlags, symbolExcludes) {
        return declareSymbolAndAddToSymbolTable(node, symbolFlags, symbolExcludes);
      }
      function bindAnonymousDeclaration(node, symbolFlags, name) {
        var symbol = createSymbol(symbolFlags, name);
        if (symbolFlags & (8 | 106500)) {
          symbol.parent = container.symbol;
        }
        addDeclarationToSymbol(symbol, node, symbolFlags);
        return symbol;
      }
      function bindBlockScopedDeclaration(node, symbolFlags, symbolExcludes) {
        switch (blockScopeContainer.kind) {
          case 260:
            declareModuleMember(node, symbolFlags, symbolExcludes);
            break;
          case 303:
            if (ts2.isExternalOrCommonJsModule(container)) {
              declareModuleMember(node, symbolFlags, symbolExcludes);
              break;
            }
          default:
            if (!blockScopeContainer.locals) {
              blockScopeContainer.locals = ts2.createSymbolTable();
              addToContainerChain(blockScopeContainer);
            }
            declareSymbol(blockScopeContainer.locals, void 0, node, symbolFlags, symbolExcludes);
        }
      }
      function delayedBindJSDocTypedefTag() {
        if (!delayedTypeAliases) {
          return;
        }
        var saveContainer = container;
        var saveLastContainer = lastContainer;
        var saveBlockScopeContainer = blockScopeContainer;
        var saveParent = parent;
        var saveCurrentFlow = currentFlow;
        for (var _i = 0, delayedTypeAliases_1 = delayedTypeAliases; _i < delayedTypeAliases_1.length; _i++) {
          var typeAlias = delayedTypeAliases_1[_i];
          var host = typeAlias.parent.parent;
          container = ts2.findAncestor(host.parent, function(n) {
            return !!(getContainerFlags(n) & 1);
          }) || file;
          blockScopeContainer = ts2.getEnclosingBlockScopeContainer(host) || file;
          currentFlow = initFlowNode({ flags: 2 });
          parent = typeAlias;
          bind(typeAlias.typeExpression);
          var declName = ts2.getNameOfDeclaration(typeAlias);
          if ((ts2.isJSDocEnumTag(typeAlias) || !typeAlias.fullName) && declName && ts2.isPropertyAccessEntityNameExpression(declName.parent)) {
            var isTopLevel = isTopLevelNamespaceAssignment(declName.parent);
            if (isTopLevel) {
              bindPotentiallyMissingNamespaces(file.symbol, declName.parent, isTopLevel, !!ts2.findAncestor(declName, function(d) {
                return ts2.isPropertyAccessExpression(d) && d.name.escapedText === "prototype";
              }), false);
              var oldContainer = container;
              switch (ts2.getAssignmentDeclarationPropertyAccessKind(declName.parent)) {
                case 1:
                case 2:
                  if (!ts2.isExternalOrCommonJsModule(file)) {
                    container = void 0;
                  } else {
                    container = file;
                  }
                  break;
                case 4:
                  container = declName.parent.expression;
                  break;
                case 3:
                  container = declName.parent.expression.name;
                  break;
                case 5:
                  container = isExportsOrModuleExportsOrAlias(file, declName.parent.expression) ? file : ts2.isPropertyAccessExpression(declName.parent.expression) ? declName.parent.expression.name : declName.parent.expression;
                  break;
                case 0:
                  return ts2.Debug.fail("Shouldn't have detected typedef or enum on non-assignment declaration");
              }
              if (container) {
                declareModuleMember(typeAlias, 524288, 788968);
              }
              container = oldContainer;
            }
          } else if (ts2.isJSDocEnumTag(typeAlias) || !typeAlias.fullName || typeAlias.fullName.kind === 79) {
            parent = typeAlias.parent;
            bindBlockScopedDeclaration(typeAlias, 524288, 788968);
          } else {
            bind(typeAlias.fullName);
          }
        }
        container = saveContainer;
        lastContainer = saveLastContainer;
        blockScopeContainer = saveBlockScopeContainer;
        parent = saveParent;
        currentFlow = saveCurrentFlow;
      }
      function checkContextualIdentifier(node) {
        if (!file.parseDiagnostics.length && !(node.flags & 8388608) && !(node.flags & 4194304) && !ts2.isIdentifierName(node)) {
          if (inStrictMode && node.originalKeywordKind >= 117 && node.originalKeywordKind <= 125) {
            file.bindDiagnostics.push(createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts2.declarationNameToString(node)));
          } else if (node.originalKeywordKind === 132) {
            if (ts2.isExternalModule(file) && ts2.isInTopLevelContext(node)) {
              file.bindDiagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module, ts2.declarationNameToString(node)));
            } else if (node.flags & 32768) {
              file.bindDiagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts2.declarationNameToString(node)));
            }
          } else if (node.originalKeywordKind === 125 && node.flags & 8192) {
            file.bindDiagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here, ts2.declarationNameToString(node)));
          }
        }
      }
      function getStrictModeIdentifierMessage(node) {
        if (ts2.getContainingClass(node)) {
          return ts2.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode;
        }
        if (file.externalModuleIndicator) {
          return ts2.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode;
        }
        return ts2.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode;
      }
      function checkPrivateIdentifier(node) {
        if (node.escapedText === "#constructor") {
          if (!file.parseDiagnostics.length) {
            file.bindDiagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.constructor_is_a_reserved_word, ts2.declarationNameToString(node)));
          }
        }
      }
      function checkStrictModeBinaryExpression(node) {
        if (inStrictMode && ts2.isLeftHandSideExpression(node.left) && ts2.isAssignmentOperator(node.operatorToken.kind)) {
          checkStrictModeEvalOrArguments(node, node.left);
        }
      }
      function checkStrictModeCatchClause(node) {
        if (inStrictMode && node.variableDeclaration) {
          checkStrictModeEvalOrArguments(node, node.variableDeclaration.name);
        }
      }
      function checkStrictModeDeleteExpression(node) {
        if (inStrictMode && node.expression.kind === 79) {
          var span = ts2.getErrorSpanForNode(file, node.expression);
          file.bindDiagnostics.push(ts2.createFileDiagnostic(file, span.start, span.length, ts2.Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode));
        }
      }
      function isEvalOrArgumentsIdentifier(node) {
        return ts2.isIdentifier(node) && (node.escapedText === "eval" || node.escapedText === "arguments");
      }
      function checkStrictModeEvalOrArguments(contextNode, name) {
        if (name && name.kind === 79) {
          var identifier = name;
          if (isEvalOrArgumentsIdentifier(identifier)) {
            var span = ts2.getErrorSpanForNode(file, name);
            file.bindDiagnostics.push(ts2.createFileDiagnostic(file, span.start, span.length, getStrictModeEvalOrArgumentsMessage(contextNode), ts2.idText(identifier)));
          }
        }
      }
      function getStrictModeEvalOrArgumentsMessage(node) {
        if (ts2.getContainingClass(node)) {
          return ts2.Diagnostics.Code_contained_in_a_class_is_evaluated_in_JavaScript_s_strict_mode_which_does_not_allow_this_use_of_0_For_more_information_see_https_Colon_Slash_Slashdeveloper_mozilla_org_Slashen_US_Slashdocs_SlashWeb_SlashJavaScript_SlashReference_SlashStrict_mode;
        }
        if (file.externalModuleIndicator) {
          return ts2.Diagnostics.Invalid_use_of_0_Modules_are_automatically_in_strict_mode;
        }
        return ts2.Diagnostics.Invalid_use_of_0_in_strict_mode;
      }
      function checkStrictModeFunctionName(node) {
        if (inStrictMode) {
          checkStrictModeEvalOrArguments(node, node.name);
        }
      }
      function getStrictModeBlockScopeFunctionDeclarationMessage(node) {
        if (ts2.getContainingClass(node)) {
          return ts2.Diagnostics.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_definitions_are_automatically_in_strict_mode;
        }
        if (file.externalModuleIndicator) {
          return ts2.Diagnostics.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_are_automatically_in_strict_mode;
        }
        return ts2.Diagnostics.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5;
      }
      function checkStrictModeFunctionDeclaration(node) {
        if (languageVersion < 2) {
          if (blockScopeContainer.kind !== 303 && blockScopeContainer.kind !== 260 && !ts2.isFunctionLikeOrClassStaticBlockDeclaration(blockScopeContainer)) {
            var errorSpan = ts2.getErrorSpanForNode(file, node);
            file.bindDiagnostics.push(ts2.createFileDiagnostic(file, errorSpan.start, errorSpan.length, getStrictModeBlockScopeFunctionDeclarationMessage(node)));
          }
        }
      }
      function checkStrictModeNumericLiteral(node) {
        if (inStrictMode && node.numericLiteralFlags & 32) {
          file.bindDiagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Octal_literals_are_not_allowed_in_strict_mode));
        }
      }
      function checkStrictModePostfixUnaryExpression(node) {
        if (inStrictMode) {
          checkStrictModeEvalOrArguments(node, node.operand);
        }
      }
      function checkStrictModePrefixUnaryExpression(node) {
        if (inStrictMode) {
          if (node.operator === 45 || node.operator === 46) {
            checkStrictModeEvalOrArguments(node, node.operand);
          }
        }
      }
      function checkStrictModeWithStatement(node) {
        if (inStrictMode) {
          errorOnFirstToken(node, ts2.Diagnostics.with_statements_are_not_allowed_in_strict_mode);
        }
      }
      function checkStrictModeLabeledStatement(node) {
        if (inStrictMode && ts2.getEmitScriptTarget(options) >= 2) {
          if (ts2.isDeclarationStatement(node.statement) || ts2.isVariableStatement(node.statement)) {
            errorOnFirstToken(node.label, ts2.Diagnostics.A_label_is_not_allowed_here);
          }
        }
      }
      function errorOnFirstToken(node, message, arg0, arg1, arg2) {
        var span = ts2.getSpanOfTokenAtPosition(file, node.pos);
        file.bindDiagnostics.push(ts2.createFileDiagnostic(file, span.start, span.length, message, arg0, arg1, arg2));
      }
      function errorOrSuggestionOnNode(isError, node, message) {
        errorOrSuggestionOnRange(isError, node, node, message);
      }
      function errorOrSuggestionOnRange(isError, startNode, endNode, message) {
        addErrorOrSuggestionDiagnostic(isError, { pos: ts2.getTokenPosOfNode(startNode, file), end: endNode.end }, message);
      }
      function addErrorOrSuggestionDiagnostic(isError, range, message) {
        var diag = ts2.createFileDiagnostic(file, range.pos, range.end - range.pos, message);
        if (isError) {
          file.bindDiagnostics.push(diag);
        } else {
          file.bindSuggestionDiagnostics = ts2.append(file.bindSuggestionDiagnostics, __assign(__assign({}, diag), { category: ts2.DiagnosticCategory.Suggestion }));
        }
      }
      function bind(node) {
        if (!node) {
          return;
        }
        ts2.setParent(node, parent);
        var saveInStrictMode = inStrictMode;
        bindWorker(node);
        if (node.kind > 159) {
          var saveParent = parent;
          parent = node;
          var containerFlags = getContainerFlags(node);
          if (containerFlags === 0) {
            bindChildren(node);
          } else {
            bindContainer(node, containerFlags);
          }
          parent = saveParent;
        } else {
          var saveParent = parent;
          if (node.kind === 1)
            parent = node;
          bindJSDoc(node);
          parent = saveParent;
        }
        inStrictMode = saveInStrictMode;
      }
      function bindJSDoc(node) {
        if (ts2.hasJSDocNodes(node)) {
          if (ts2.isInJSFile(node)) {
            for (var _i = 0, _a = node.jsDoc; _i < _a.length; _i++) {
              var j = _a[_i];
              bind(j);
            }
          } else {
            for (var _b = 0, _c = node.jsDoc; _b < _c.length; _b++) {
              var j = _c[_b];
              ts2.setParent(j, node);
              ts2.setParentRecursive(j, false);
            }
          }
        }
      }
      function updateStrictModeStatementList(statements) {
        if (!inStrictMode) {
          for (var _i = 0, statements_3 = statements; _i < statements_3.length; _i++) {
            var statement = statements_3[_i];
            if (!ts2.isPrologueDirective(statement)) {
              return;
            }
            if (isUseStrictPrologueDirective(statement)) {
              inStrictMode = true;
              return;
            }
          }
        }
      }
      function isUseStrictPrologueDirective(node) {
        var nodeText = ts2.getSourceTextOfNodeFromSourceFile(file, node.expression);
        return nodeText === '"use strict"' || nodeText === "'use strict'";
      }
      function bindWorker(node) {
        switch (node.kind) {
          case 79:
            if (node.isInJSDocNamespace) {
              var parentNode = node.parent;
              while (parentNode && !ts2.isJSDocTypeAlias(parentNode)) {
                parentNode = parentNode.parent;
              }
              bindBlockScopedDeclaration(parentNode, 524288, 788968);
              break;
            }
          case 108:
            if (currentFlow && (ts2.isExpression(node) || parent.kind === 295)) {
              node.flowNode = currentFlow;
            }
            return checkContextualIdentifier(node);
          case 160:
            if (currentFlow && ts2.isPartOfTypeQuery(node)) {
              node.flowNode = currentFlow;
            }
            break;
          case 230:
          case 106:
            node.flowNode = currentFlow;
            break;
          case 80:
            return checkPrivateIdentifier(node);
          case 205:
          case 206:
            var expr = node;
            if (currentFlow && isNarrowableReference(expr)) {
              expr.flowNode = currentFlow;
            }
            if (ts2.isSpecialPropertyDeclaration(expr)) {
              bindSpecialPropertyDeclaration(expr);
            }
            if (ts2.isInJSFile(expr) && file.commonJsModuleIndicator && ts2.isModuleExportsAccessExpression(expr) && !lookupSymbolForName(blockScopeContainer, "module")) {
              declareSymbol(file.locals, void 0, expr.expression, 1 | 134217728, 111550);
            }
            break;
          case 220:
            var specialKind = ts2.getAssignmentDeclarationKind(node);
            switch (specialKind) {
              case 1:
                bindExportsPropertyAssignment(node);
                break;
              case 2:
                bindModuleExportsAssignment(node);
                break;
              case 3:
                bindPrototypePropertyAssignment(node.left, node);
                break;
              case 6:
                bindPrototypeAssignment(node);
                break;
              case 4:
                bindThisPropertyAssignment(node);
                break;
              case 5:
                var expression = node.left.expression;
                if (ts2.isInJSFile(node) && ts2.isIdentifier(expression)) {
                  var symbol = lookupSymbolForName(blockScopeContainer, expression.escapedText);
                  if (ts2.isThisInitializedDeclaration(symbol === null || symbol === void 0 ? void 0 : symbol.valueDeclaration)) {
                    bindThisPropertyAssignment(node);
                    break;
                  }
                }
                bindSpecialPropertyAssignment(node);
                break;
              case 0:
                break;
              default:
                ts2.Debug.fail("Unknown binary expression special property assignment kind");
            }
            return checkStrictModeBinaryExpression(node);
          case 291:
            return checkStrictModeCatchClause(node);
          case 214:
            return checkStrictModeDeleteExpression(node);
          case 8:
            return checkStrictModeNumericLiteral(node);
          case 219:
            return checkStrictModePostfixUnaryExpression(node);
          case 218:
            return checkStrictModePrefixUnaryExpression(node);
          case 247:
            return checkStrictModeWithStatement(node);
          case 249:
            return checkStrictModeLabeledStatement(node);
          case 191:
            seenThisKeyword = true;
            return;
          case 176:
            break;
          case 162:
            return bindTypeParameter(node);
          case 163:
            return bindParameter(node);
          case 253:
            return bindVariableDeclarationOrBindingElement(node);
          case 202:
            node.flowNode = currentFlow;
            return bindVariableDeclarationOrBindingElement(node);
          case 166:
          case 165:
            return bindPropertyWorker(node);
          case 294:
          case 295:
            return bindPropertyOrMethodOrAccessor(node, 4, 0);
          case 297:
            return bindPropertyOrMethodOrAccessor(node, 8, 900095);
          case 173:
          case 174:
          case 175:
            return declareSymbolAndAddToSymbolTable(node, 131072, 0);
          case 168:
          case 167:
            return bindPropertyOrMethodOrAccessor(node, 8192 | (node.questionToken ? 16777216 : 0), ts2.isObjectLiteralMethod(node) ? 0 : 103359);
          case 255:
            return bindFunctionDeclaration(node);
          case 170:
            return declareSymbolAndAddToSymbolTable(node, 16384, 0);
          case 171:
            return bindPropertyOrMethodOrAccessor(node, 32768, 46015);
          case 172:
            return bindPropertyOrMethodOrAccessor(node, 65536, 78783);
          case 178:
          case 315:
          case 321:
          case 179:
            return bindFunctionOrConstructorType(node);
          case 181:
          case 320:
          case 194:
            return bindAnonymousTypeWorker(node);
          case 330:
            return bindJSDocClassTag(node);
          case 204:
            return bindObjectLiteralExpression(node);
          case 212:
          case 213:
            return bindFunctionExpression(node);
          case 207:
            var assignmentKind = ts2.getAssignmentDeclarationKind(node);
            switch (assignmentKind) {
              case 7:
                return bindObjectDefinePropertyAssignment(node);
              case 8:
                return bindObjectDefinePropertyExport(node);
              case 9:
                return bindObjectDefinePrototypeProperty(node);
              case 0:
                break;
              default:
                return ts2.Debug.fail("Unknown call expression assignment declaration kind");
            }
            if (ts2.isInJSFile(node)) {
              bindCallExpression(node);
            }
            break;
          case 225:
          case 256:
            inStrictMode = true;
            return bindClassLikeDeclaration(node);
          case 257:
            return bindBlockScopedDeclaration(node, 64, 788872);
          case 258:
            return bindBlockScopedDeclaration(node, 524288, 788968);
          case 259:
            return bindEnumDeclaration(node);
          case 260:
            return bindModuleDeclaration(node);
          case 285:
            return bindJsxAttributes(node);
          case 284:
            return bindJsxAttribute(node, 4, 0);
          case 264:
          case 267:
          case 269:
          case 274:
            return declareSymbolAndAddToSymbolTable(node, 2097152, 2097152);
          case 263:
            return bindNamespaceExportDeclaration(node);
          case 266:
            return bindImportClause(node);
          case 271:
            return bindExportDeclaration(node);
          case 270:
            return bindExportAssignment(node);
          case 303:
            updateStrictModeStatementList(node.statements);
            return bindSourceFileIfExternalModule();
          case 234:
            if (!ts2.isFunctionLikeOrClassStaticBlockDeclaration(node.parent)) {
              return;
            }
          case 261:
            return updateStrictModeStatementList(node.statements);
          case 338:
            if (node.parent.kind === 321) {
              return bindParameter(node);
            }
            if (node.parent.kind !== 320) {
              break;
            }
          case 345:
            var propTag = node;
            var flags = propTag.isBracketed || propTag.typeExpression && propTag.typeExpression.type.kind === 314 ? 4 | 16777216 : 4;
            return declareSymbolAndAddToSymbolTable(propTag, flags, 0);
          case 343:
          case 336:
          case 337:
            return (delayedTypeAliases || (delayedTypeAliases = [])).push(node);
        }
      }
      function bindPropertyWorker(node) {
        return bindPropertyOrMethodOrAccessor(node, 4 | (node.questionToken ? 16777216 : 0), 0);
      }
      function bindAnonymousTypeWorker(node) {
        return bindAnonymousDeclaration(node, 2048, "__type");
      }
      function bindSourceFileIfExternalModule() {
        setExportContextFlag(file);
        if (ts2.isExternalModule(file)) {
          bindSourceFileAsExternalModule();
        } else if (ts2.isJsonSourceFile(file)) {
          bindSourceFileAsExternalModule();
          var originalSymbol = file.symbol;
          declareSymbol(file.symbol.exports, file.symbol, file, 4, 67108863);
          file.symbol = originalSymbol;
        }
      }
      function bindSourceFileAsExternalModule() {
        bindAnonymousDeclaration(file, 512, '"'.concat(ts2.removeFileExtension(file.fileName), '"'));
      }
      function bindExportAssignment(node) {
        if (!container.symbol || !container.symbol.exports) {
          bindAnonymousDeclaration(node, 111551, getDeclarationName(node));
        } else {
          var flags = ts2.exportAssignmentIsAlias(node) ? 2097152 : 4;
          var symbol = declareSymbol(container.symbol.exports, container.symbol, node, flags, 67108863);
          if (node.isExportEquals) {
            ts2.setValueDeclaration(symbol, node);
          }
        }
      }
      function bindNamespaceExportDeclaration(node) {
        if (node.modifiers && node.modifiers.length) {
          file.bindDiagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Modifiers_cannot_appear_here));
        }
        var diag = !ts2.isSourceFile(node.parent) ? ts2.Diagnostics.Global_module_exports_may_only_appear_at_top_level : !ts2.isExternalModule(node.parent) ? ts2.Diagnostics.Global_module_exports_may_only_appear_in_module_files : !node.parent.isDeclarationFile ? ts2.Diagnostics.Global_module_exports_may_only_appear_in_declaration_files : void 0;
        if (diag) {
          file.bindDiagnostics.push(createDiagnosticForNode(node, diag));
        } else {
          file.symbol.globalExports = file.symbol.globalExports || ts2.createSymbolTable();
          declareSymbol(file.symbol.globalExports, file.symbol, node, 2097152, 2097152);
        }
      }
      function bindExportDeclaration(node) {
        if (!container.symbol || !container.symbol.exports) {
          bindAnonymousDeclaration(node, 8388608, getDeclarationName(node));
        } else if (!node.exportClause) {
          declareSymbol(container.symbol.exports, container.symbol, node, 8388608, 0);
        } else if (ts2.isNamespaceExport(node.exportClause)) {
          ts2.setParent(node.exportClause, node);
          declareSymbol(container.symbol.exports, container.symbol, node.exportClause, 2097152, 2097152);
        }
      }
      function bindImportClause(node) {
        if (node.name) {
          declareSymbolAndAddToSymbolTable(node, 2097152, 2097152);
        }
      }
      function setCommonJsModuleIndicator(node) {
        if (file.externalModuleIndicator) {
          return false;
        }
        if (!file.commonJsModuleIndicator) {
          file.commonJsModuleIndicator = node;
          bindSourceFileAsExternalModule();
        }
        return true;
      }
      function bindObjectDefinePropertyExport(node) {
        if (!setCommonJsModuleIndicator(node)) {
          return;
        }
        var symbol = forEachIdentifierInEntityName(node.arguments[0], void 0, function(id, symbol2) {
          if (symbol2) {
            addDeclarationToSymbol(symbol2, id, 1536 | 67108864);
          }
          return symbol2;
        });
        if (symbol) {
          var flags = 4 | 1048576;
          declareSymbol(symbol.exports, symbol, node, flags, 0);
        }
      }
      function bindExportsPropertyAssignment(node) {
        if (!setCommonJsModuleIndicator(node)) {
          return;
        }
        var symbol = forEachIdentifierInEntityName(node.left.expression, void 0, function(id, symbol2) {
          if (symbol2) {
            addDeclarationToSymbol(symbol2, id, 1536 | 67108864);
          }
          return symbol2;
        });
        if (symbol) {
          var isAlias = ts2.isAliasableExpression(node.right) && (ts2.isExportsIdentifier(node.left.expression) || ts2.isModuleExportsAccessExpression(node.left.expression));
          var flags = isAlias ? 2097152 : 4 | 1048576;
          ts2.setParent(node.left, node);
          declareSymbol(symbol.exports, symbol, node.left, flags, 0);
        }
      }
      function bindModuleExportsAssignment(node) {
        if (!setCommonJsModuleIndicator(node)) {
          return;
        }
        var assignedExpression = ts2.getRightMostAssignedExpression(node.right);
        if (ts2.isEmptyObjectLiteral(assignedExpression) || container === file && isExportsOrModuleExportsOrAlias(file, assignedExpression)) {
          return;
        }
        if (ts2.isObjectLiteralExpression(assignedExpression) && ts2.every(assignedExpression.properties, ts2.isShorthandPropertyAssignment)) {
          ts2.forEach(assignedExpression.properties, bindExportAssignedObjectMemberAlias);
          return;
        }
        var flags = ts2.exportAssignmentIsAlias(node) ? 2097152 : 4 | 1048576 | 512;
        var symbol = declareSymbol(file.symbol.exports, file.symbol, node, flags | 67108864, 0);
        ts2.setValueDeclaration(symbol, node);
      }
      function bindExportAssignedObjectMemberAlias(node) {
        declareSymbol(file.symbol.exports, file.symbol, node, 2097152 | 67108864, 0);
      }
      function bindThisPropertyAssignment(node) {
        ts2.Debug.assert(ts2.isInJSFile(node));
        var hasPrivateIdentifier = ts2.isBinaryExpression(node) && ts2.isPropertyAccessExpression(node.left) && ts2.isPrivateIdentifier(node.left.name) || ts2.isPropertyAccessExpression(node) && ts2.isPrivateIdentifier(node.name);
        if (hasPrivateIdentifier) {
          return;
        }
        var thisContainer = ts2.getThisContainer(node, false);
        switch (thisContainer.kind) {
          case 255:
          case 212:
            var constructorSymbol = thisContainer.symbol;
            if (ts2.isBinaryExpression(thisContainer.parent) && thisContainer.parent.operatorToken.kind === 63) {
              var l = thisContainer.parent.left;
              if (ts2.isBindableStaticAccessExpression(l) && ts2.isPrototypeAccess(l.expression)) {
                constructorSymbol = lookupSymbolForPropertyAccess(l.expression.expression, thisParentContainer);
              }
            }
            if (constructorSymbol && constructorSymbol.valueDeclaration) {
              constructorSymbol.members = constructorSymbol.members || ts2.createSymbolTable();
              if (ts2.hasDynamicName(node)) {
                bindDynamicallyNamedThisPropertyAssignment(node, constructorSymbol, constructorSymbol.members);
              } else {
                declareSymbol(constructorSymbol.members, constructorSymbol, node, 4 | 67108864, 0 & ~4);
              }
              addDeclarationToSymbol(constructorSymbol, constructorSymbol.valueDeclaration, 32);
            }
            break;
          case 170:
          case 166:
          case 168:
          case 171:
          case 172:
          case 169:
            var containingClass = thisContainer.parent;
            var symbolTable = ts2.isStatic(thisContainer) ? containingClass.symbol.exports : containingClass.symbol.members;
            if (ts2.hasDynamicName(node)) {
              bindDynamicallyNamedThisPropertyAssignment(node, containingClass.symbol, symbolTable);
            } else {
              declareSymbol(symbolTable, containingClass.symbol, node, 4 | 67108864, 0, true);
            }
            break;
          case 303:
            if (ts2.hasDynamicName(node)) {
              break;
            } else if (thisContainer.commonJsModuleIndicator) {
              declareSymbol(thisContainer.symbol.exports, thisContainer.symbol, node, 4 | 1048576, 0);
            } else {
              declareSymbolAndAddToSymbolTable(node, 1, 111550);
            }
            break;
          default:
            ts2.Debug.failBadSyntaxKind(thisContainer);
        }
      }
      function bindDynamicallyNamedThisPropertyAssignment(node, symbol, symbolTable) {
        declareSymbol(symbolTable, symbol, node, 4, 0, true, true);
        addLateBoundAssignmentDeclarationToSymbol(node, symbol);
      }
      function addLateBoundAssignmentDeclarationToSymbol(node, symbol) {
        if (symbol) {
          (symbol.assignmentDeclarationMembers || (symbol.assignmentDeclarationMembers = new ts2.Map())).set(ts2.getNodeId(node), node);
        }
      }
      function bindSpecialPropertyDeclaration(node) {
        if (node.expression.kind === 108) {
          bindThisPropertyAssignment(node);
        } else if (ts2.isBindableStaticAccessExpression(node) && node.parent.parent.kind === 303) {
          if (ts2.isPrototypeAccess(node.expression)) {
            bindPrototypePropertyAssignment(node, node.parent);
          } else {
            bindStaticPropertyAssignment(node);
          }
        }
      }
      function bindPrototypeAssignment(node) {
        ts2.setParent(node.left, node);
        ts2.setParent(node.right, node);
        bindPropertyAssignment(node.left.expression, node.left, false, true);
      }
      function bindObjectDefinePrototypeProperty(node) {
        var namespaceSymbol = lookupSymbolForPropertyAccess(node.arguments[0].expression);
        if (namespaceSymbol && namespaceSymbol.valueDeclaration) {
          addDeclarationToSymbol(namespaceSymbol, namespaceSymbol.valueDeclaration, 32);
        }
        bindPotentiallyNewExpandoMemberToNamespace(node, namespaceSymbol, true);
      }
      function bindPrototypePropertyAssignment(lhs, parent2) {
        var classPrototype = lhs.expression;
        var constructorFunction = classPrototype.expression;
        ts2.setParent(constructorFunction, classPrototype);
        ts2.setParent(classPrototype, lhs);
        ts2.setParent(lhs, parent2);
        bindPropertyAssignment(constructorFunction, lhs, true, true);
      }
      function bindObjectDefinePropertyAssignment(node) {
        var namespaceSymbol = lookupSymbolForPropertyAccess(node.arguments[0]);
        var isToplevel = node.parent.parent.kind === 303;
        namespaceSymbol = bindPotentiallyMissingNamespaces(namespaceSymbol, node.arguments[0], isToplevel, false, false);
        bindPotentiallyNewExpandoMemberToNamespace(node, namespaceSymbol, false);
      }
      function bindSpecialPropertyAssignment(node) {
        var _a;
        var parentSymbol = lookupSymbolForPropertyAccess(node.left.expression, container) || lookupSymbolForPropertyAccess(node.left.expression, blockScopeContainer);
        if (!ts2.isInJSFile(node) && !ts2.isFunctionSymbol(parentSymbol)) {
          return;
        }
        var rootExpr = ts2.getLeftmostAccessExpression(node.left);
        if (ts2.isIdentifier(rootExpr) && ((_a = lookupSymbolForName(container, rootExpr.escapedText)) === null || _a === void 0 ? void 0 : _a.flags) & 2097152) {
          return;
        }
        ts2.setParent(node.left, node);
        ts2.setParent(node.right, node);
        if (ts2.isIdentifier(node.left.expression) && container === file && isExportsOrModuleExportsOrAlias(file, node.left.expression)) {
          bindExportsPropertyAssignment(node);
        } else if (ts2.hasDynamicName(node)) {
          bindAnonymousDeclaration(node, 4 | 67108864, "__computed");
          var sym = bindPotentiallyMissingNamespaces(parentSymbol, node.left.expression, isTopLevelNamespaceAssignment(node.left), false, false);
          addLateBoundAssignmentDeclarationToSymbol(node, sym);
        } else {
          bindStaticPropertyAssignment(ts2.cast(node.left, ts2.isBindableStaticNameExpression));
        }
      }
      function bindStaticPropertyAssignment(node) {
        ts2.Debug.assert(!ts2.isIdentifier(node));
        ts2.setParent(node.expression, node);
        bindPropertyAssignment(node.expression, node, false, false);
      }
      function bindPotentiallyMissingNamespaces(namespaceSymbol, entityName, isToplevel, isPrototypeProperty, containerIsClass) {
        if ((namespaceSymbol === null || namespaceSymbol === void 0 ? void 0 : namespaceSymbol.flags) & 2097152) {
          return namespaceSymbol;
        }
        if (isToplevel && !isPrototypeProperty) {
          var flags_2 = 1536 | 67108864;
          var excludeFlags_1 = 110735 & ~67108864;
          namespaceSymbol = forEachIdentifierInEntityName(entityName, namespaceSymbol, function(id, symbol, parent2) {
            if (symbol) {
              addDeclarationToSymbol(symbol, id, flags_2);
              return symbol;
            } else {
              var table = parent2 ? parent2.exports : file.jsGlobalAugmentations || (file.jsGlobalAugmentations = ts2.createSymbolTable());
              return declareSymbol(table, parent2, id, flags_2, excludeFlags_1);
            }
          });
        }
        if (containerIsClass && namespaceSymbol && namespaceSymbol.valueDeclaration) {
          addDeclarationToSymbol(namespaceSymbol, namespaceSymbol.valueDeclaration, 32);
        }
        return namespaceSymbol;
      }
      function bindPotentiallyNewExpandoMemberToNamespace(declaration, namespaceSymbol, isPrototypeProperty) {
        if (!namespaceSymbol || !isExpandoSymbol(namespaceSymbol)) {
          return;
        }
        var symbolTable = isPrototypeProperty ? namespaceSymbol.members || (namespaceSymbol.members = ts2.createSymbolTable()) : namespaceSymbol.exports || (namespaceSymbol.exports = ts2.createSymbolTable());
        var includes = 0;
        var excludes = 0;
        if (ts2.isFunctionLikeDeclaration(ts2.getAssignedExpandoInitializer(declaration))) {
          includes = 8192;
          excludes = 103359;
        } else if (ts2.isCallExpression(declaration) && ts2.isBindableObjectDefinePropertyCall(declaration)) {
          if (ts2.some(declaration.arguments[2].properties, function(p) {
            var id = ts2.getNameOfDeclaration(p);
            return !!id && ts2.isIdentifier(id) && ts2.idText(id) === "set";
          })) {
            includes |= 65536 | 4;
            excludes |= 78783;
          }
          if (ts2.some(declaration.arguments[2].properties, function(p) {
            var id = ts2.getNameOfDeclaration(p);
            return !!id && ts2.isIdentifier(id) && ts2.idText(id) === "get";
          })) {
            includes |= 32768 | 4;
            excludes |= 46015;
          }
        }
        if (includes === 0) {
          includes = 4;
          excludes = 0;
        }
        declareSymbol(symbolTable, namespaceSymbol, declaration, includes | 67108864, excludes & ~67108864);
      }
      function isTopLevelNamespaceAssignment(propertyAccess) {
        return ts2.isBinaryExpression(propertyAccess.parent) ? getParentOfBinaryExpression(propertyAccess.parent).parent.kind === 303 : propertyAccess.parent.parent.kind === 303;
      }
      function bindPropertyAssignment(name, propertyAccess, isPrototypeProperty, containerIsClass) {
        var namespaceSymbol = lookupSymbolForPropertyAccess(name, container) || lookupSymbolForPropertyAccess(name, blockScopeContainer);
        var isToplevel = isTopLevelNamespaceAssignment(propertyAccess);
        namespaceSymbol = bindPotentiallyMissingNamespaces(namespaceSymbol, propertyAccess.expression, isToplevel, isPrototypeProperty, containerIsClass);
        bindPotentiallyNewExpandoMemberToNamespace(propertyAccess, namespaceSymbol, isPrototypeProperty);
      }
      function isExpandoSymbol(symbol) {
        if (symbol.flags & (16 | 32 | 1024)) {
          return true;
        }
        var node = symbol.valueDeclaration;
        if (node && ts2.isCallExpression(node)) {
          return !!ts2.getAssignedExpandoInitializer(node);
        }
        var init = !node ? void 0 : ts2.isVariableDeclaration(node) ? node.initializer : ts2.isBinaryExpression(node) ? node.right : ts2.isPropertyAccessExpression(node) && ts2.isBinaryExpression(node.parent) ? node.parent.right : void 0;
        init = init && ts2.getRightMostAssignedExpression(init);
        if (init) {
          var isPrototypeAssignment = ts2.isPrototypeAccess(ts2.isVariableDeclaration(node) ? node.name : ts2.isBinaryExpression(node) ? node.left : node);
          return !!ts2.getExpandoInitializer(ts2.isBinaryExpression(init) && (init.operatorToken.kind === 56 || init.operatorToken.kind === 60) ? init.right : init, isPrototypeAssignment);
        }
        return false;
      }
      function getParentOfBinaryExpression(expr) {
        while (ts2.isBinaryExpression(expr.parent)) {
          expr = expr.parent;
        }
        return expr.parent;
      }
      function lookupSymbolForPropertyAccess(node, lookupContainer) {
        if (lookupContainer === void 0) {
          lookupContainer = container;
        }
        if (ts2.isIdentifier(node)) {
          return lookupSymbolForName(lookupContainer, node.escapedText);
        } else {
          var symbol = lookupSymbolForPropertyAccess(node.expression);
          return symbol && symbol.exports && symbol.exports.get(ts2.getElementOrPropertyAccessName(node));
        }
      }
      function forEachIdentifierInEntityName(e, parent2, action) {
        if (isExportsOrModuleExportsOrAlias(file, e)) {
          return file.symbol;
        } else if (ts2.isIdentifier(e)) {
          return action(e, lookupSymbolForPropertyAccess(e), parent2);
        } else {
          var s = forEachIdentifierInEntityName(e.expression, parent2, action);
          var name = ts2.getNameOrArgument(e);
          if (ts2.isPrivateIdentifier(name)) {
            ts2.Debug.fail("unexpected PrivateIdentifier");
          }
          return action(name, s && s.exports && s.exports.get(ts2.getElementOrPropertyAccessName(e)), s);
        }
      }
      function bindCallExpression(node) {
        if (!file.commonJsModuleIndicator && ts2.isRequireCall(node, false)) {
          setCommonJsModuleIndicator(node);
        }
      }
      function bindClassLikeDeclaration(node) {
        if (node.kind === 256) {
          bindBlockScopedDeclaration(node, 32, 899503);
        } else {
          var bindingName = node.name ? node.name.escapedText : "__class";
          bindAnonymousDeclaration(node, 32, bindingName);
          if (node.name) {
            classifiableNames.add(node.name.escapedText);
          }
        }
        var symbol = node.symbol;
        var prototypeSymbol = createSymbol(4 | 4194304, "prototype");
        var symbolExport = symbol.exports.get(prototypeSymbol.escapedName);
        if (symbolExport) {
          if (node.name) {
            ts2.setParent(node.name, node);
          }
          file.bindDiagnostics.push(createDiagnosticForNode(symbolExport.declarations[0], ts2.Diagnostics.Duplicate_identifier_0, ts2.symbolName(prototypeSymbol)));
        }
        symbol.exports.set(prototypeSymbol.escapedName, prototypeSymbol);
        prototypeSymbol.parent = symbol;
      }
      function bindEnumDeclaration(node) {
        return ts2.isEnumConst(node) ? bindBlockScopedDeclaration(node, 128, 899967) : bindBlockScopedDeclaration(node, 256, 899327);
      }
      function bindVariableDeclarationOrBindingElement(node) {
        if (inStrictMode) {
          checkStrictModeEvalOrArguments(node, node.name);
        }
        if (!ts2.isBindingPattern(node.name)) {
          if (ts2.isInJSFile(node) && ts2.isVariableDeclarationInitializedToBareOrAccessedRequire(node) && !ts2.getJSDocTypeTag(node)) {
            declareSymbolAndAddToSymbolTable(node, 2097152, 2097152);
          } else if (ts2.isBlockOrCatchScoped(node)) {
            bindBlockScopedDeclaration(node, 2, 111551);
          } else if (ts2.isParameterDeclaration(node)) {
            declareSymbolAndAddToSymbolTable(node, 1, 111551);
          } else {
            declareSymbolAndAddToSymbolTable(node, 1, 111550);
          }
        }
      }
      function bindParameter(node) {
        if (node.kind === 338 && container.kind !== 321) {
          return;
        }
        if (inStrictMode && !(node.flags & 8388608)) {
          checkStrictModeEvalOrArguments(node, node.name);
        }
        if (ts2.isBindingPattern(node.name)) {
          bindAnonymousDeclaration(node, 1, "__" + node.parent.parameters.indexOf(node));
        } else {
          declareSymbolAndAddToSymbolTable(node, 1, 111551);
        }
        if (ts2.isParameterPropertyDeclaration(node, node.parent)) {
          var classDeclaration = node.parent.parent;
          declareSymbol(classDeclaration.symbol.members, classDeclaration.symbol, node, 4 | (node.questionToken ? 16777216 : 0), 0);
        }
      }
      function bindFunctionDeclaration(node) {
        if (!file.isDeclarationFile && !(node.flags & 8388608)) {
          if (ts2.isAsyncFunction(node)) {
            emitFlags |= 2048;
          }
        }
        checkStrictModeFunctionName(node);
        if (inStrictMode) {
          checkStrictModeFunctionDeclaration(node);
          bindBlockScopedDeclaration(node, 16, 110991);
        } else {
          declareSymbolAndAddToSymbolTable(node, 16, 110991);
        }
      }
      function bindFunctionExpression(node) {
        if (!file.isDeclarationFile && !(node.flags & 8388608)) {
          if (ts2.isAsyncFunction(node)) {
            emitFlags |= 2048;
          }
        }
        if (currentFlow) {
          node.flowNode = currentFlow;
        }
        checkStrictModeFunctionName(node);
        var bindingName = node.name ? node.name.escapedText : "__function";
        return bindAnonymousDeclaration(node, 16, bindingName);
      }
      function bindPropertyOrMethodOrAccessor(node, symbolFlags, symbolExcludes) {
        if (!file.isDeclarationFile && !(node.flags & 8388608) && ts2.isAsyncFunction(node)) {
          emitFlags |= 2048;
        }
        if (currentFlow && ts2.isObjectLiteralOrClassExpressionMethodOrAccessor(node)) {
          node.flowNode = currentFlow;
        }
        return ts2.hasDynamicName(node) ? bindAnonymousDeclaration(node, symbolFlags, "__computed") : declareSymbolAndAddToSymbolTable(node, symbolFlags, symbolExcludes);
      }
      function getInferTypeContainer(node) {
        var extendsType = ts2.findAncestor(node, function(n) {
          return n.parent && ts2.isConditionalTypeNode(n.parent) && n.parent.extendsType === n;
        });
        return extendsType && extendsType.parent;
      }
      function bindTypeParameter(node) {
        if (ts2.isJSDocTemplateTag(node.parent)) {
          var container_1 = ts2.getEffectiveContainerForJSDocTemplateTag(node.parent);
          if (container_1) {
            if (!container_1.locals) {
              container_1.locals = ts2.createSymbolTable();
            }
            declareSymbol(container_1.locals, void 0, node, 262144, 526824);
          } else {
            declareSymbolAndAddToSymbolTable(node, 262144, 526824);
          }
        } else if (node.parent.kind === 189) {
          var container_2 = getInferTypeContainer(node.parent);
          if (container_2) {
            if (!container_2.locals) {
              container_2.locals = ts2.createSymbolTable();
            }
            declareSymbol(container_2.locals, void 0, node, 262144, 526824);
          } else {
            bindAnonymousDeclaration(node, 262144, getDeclarationName(node));
          }
        } else {
          declareSymbolAndAddToSymbolTable(node, 262144, 526824);
        }
      }
      function shouldReportErrorOnModuleDeclaration(node) {
        var instanceState = getModuleInstanceState(node);
        return instanceState === 1 || instanceState === 2 && ts2.shouldPreserveConstEnums(options);
      }
      function checkUnreachable(node) {
        if (!(currentFlow.flags & 1)) {
          return false;
        }
        if (currentFlow === unreachableFlow) {
          var reportError = ts2.isStatementButNotDeclaration(node) && node.kind !== 235 || node.kind === 256 || node.kind === 260 && shouldReportErrorOnModuleDeclaration(node);
          if (reportError) {
            currentFlow = reportedUnreachableFlow;
            if (!options.allowUnreachableCode) {
              var isError_1 = ts2.unreachableCodeIsError(options) && !(node.flags & 8388608) && (!ts2.isVariableStatement(node) || !!(ts2.getCombinedNodeFlags(node.declarationList) & 3) || node.declarationList.declarations.some(function(d) {
                return !!d.initializer;
              }));
              eachUnreachableRange(node, function(start, end) {
                return errorOrSuggestionOnRange(isError_1, start, end, ts2.Diagnostics.Unreachable_code_detected);
              });
            }
          }
        }
        return true;
      }
    }
    function eachUnreachableRange(node, cb) {
      if (ts2.isStatement(node) && isExecutableStatement(node) && ts2.isBlock(node.parent)) {
        var statements = node.parent.statements;
        var slice_1 = ts2.sliceAfter(statements, node);
        ts2.getRangesWhere(slice_1, isExecutableStatement, function(start, afterEnd) {
          return cb(slice_1[start], slice_1[afterEnd - 1]);
        });
      } else {
        cb(node, node);
      }
    }
    function isExecutableStatement(s) {
      return !ts2.isFunctionDeclaration(s) && !isPurelyTypeDeclaration(s) && !ts2.isEnumDeclaration(s) && !(ts2.isVariableStatement(s) && !(ts2.getCombinedNodeFlags(s) & (1 | 2)) && s.declarationList.declarations.some(function(d) {
        return !d.initializer;
      }));
    }
    function isPurelyTypeDeclaration(s) {
      switch (s.kind) {
        case 257:
        case 258:
          return true;
        case 260:
          return getModuleInstanceState(s) !== 1;
        case 259:
          return ts2.hasSyntacticModifier(s, 2048);
        default:
          return false;
      }
    }
    function isExportsOrModuleExportsOrAlias(sourceFile, node) {
      var i = 0;
      var q = [node];
      while (q.length && i < 100) {
        i++;
        node = q.shift();
        if (ts2.isExportsIdentifier(node) || ts2.isModuleExportsAccessExpression(node)) {
          return true;
        } else if (ts2.isIdentifier(node)) {
          var symbol = lookupSymbolForName(sourceFile, node.escapedText);
          if (!!symbol && !!symbol.valueDeclaration && ts2.isVariableDeclaration(symbol.valueDeclaration) && !!symbol.valueDeclaration.initializer) {
            var init = symbol.valueDeclaration.initializer;
            q.push(init);
            if (ts2.isAssignmentExpression(init, true)) {
              q.push(init.left);
              q.push(init.right);
            }
          }
        }
      }
      return false;
    }
    ts2.isExportsOrModuleExportsOrAlias = isExportsOrModuleExportsOrAlias;
    function lookupSymbolForName(container, name) {
      var local = container.locals && container.locals.get(name);
      if (local) {
        return local.exportSymbol || local;
      }
      if (ts2.isSourceFile(container) && container.jsGlobalAugmentations && container.jsGlobalAugmentations.has(name)) {
        return container.jsGlobalAugmentations.get(name);
      }
      return container.symbol && container.symbol.exports && container.symbol.exports.get(name);
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function createGetSymbolWalker(getRestTypeOfSignature, getTypePredicateOfSignature, getReturnTypeOfSignature, getBaseTypes, resolveStructuredTypeMembers, getTypeOfSymbol, getResolvedSymbol, getConstraintOfTypeParameter, getFirstIdentifier, getTypeArguments) {
      return getSymbolWalker;
      function getSymbolWalker(accept) {
        if (accept === void 0) {
          accept = function() {
            return true;
          };
        }
        var visitedTypes = [];
        var visitedSymbols = [];
        return {
          walkType: function(type) {
            try {
              visitType(type);
              return { visitedTypes: ts2.getOwnValues(visitedTypes), visitedSymbols: ts2.getOwnValues(visitedSymbols) };
            } finally {
              ts2.clear(visitedTypes);
              ts2.clear(visitedSymbols);
            }
          },
          walkSymbol: function(symbol) {
            try {
              visitSymbol(symbol);
              return { visitedTypes: ts2.getOwnValues(visitedTypes), visitedSymbols: ts2.getOwnValues(visitedSymbols) };
            } finally {
              ts2.clear(visitedTypes);
              ts2.clear(visitedSymbols);
            }
          }
        };
        function visitType(type) {
          if (!type) {
            return;
          }
          if (visitedTypes[type.id]) {
            return;
          }
          visitedTypes[type.id] = type;
          var shouldBail = visitSymbol(type.symbol);
          if (shouldBail)
            return;
          if (type.flags & 524288) {
            var objectType = type;
            var objectFlags = objectType.objectFlags;
            if (objectFlags & 4) {
              visitTypeReference(type);
            }
            if (objectFlags & 32) {
              visitMappedType(type);
            }
            if (objectFlags & (1 | 2)) {
              visitInterfaceType(type);
            }
            if (objectFlags & (8 | 16)) {
              visitObjectType(objectType);
            }
          }
          if (type.flags & 262144) {
            visitTypeParameter(type);
          }
          if (type.flags & 3145728) {
            visitUnionOrIntersectionType(type);
          }
          if (type.flags & 4194304) {
            visitIndexType(type);
          }
          if (type.flags & 8388608) {
            visitIndexedAccessType(type);
          }
        }
        function visitTypeReference(type) {
          visitType(type.target);
          ts2.forEach(getTypeArguments(type), visitType);
        }
        function visitTypeParameter(type) {
          visitType(getConstraintOfTypeParameter(type));
        }
        function visitUnionOrIntersectionType(type) {
          ts2.forEach(type.types, visitType);
        }
        function visitIndexType(type) {
          visitType(type.type);
        }
        function visitIndexedAccessType(type) {
          visitType(type.objectType);
          visitType(type.indexType);
          visitType(type.constraint);
        }
        function visitMappedType(type) {
          visitType(type.typeParameter);
          visitType(type.constraintType);
          visitType(type.templateType);
          visitType(type.modifiersType);
        }
        function visitSignature(signature) {
          var typePredicate = getTypePredicateOfSignature(signature);
          if (typePredicate) {
            visitType(typePredicate.type);
          }
          ts2.forEach(signature.typeParameters, visitType);
          for (var _i = 0, _a = signature.parameters; _i < _a.length; _i++) {
            var parameter = _a[_i];
            visitSymbol(parameter);
          }
          visitType(getRestTypeOfSignature(signature));
          visitType(getReturnTypeOfSignature(signature));
        }
        function visitInterfaceType(interfaceT) {
          visitObjectType(interfaceT);
          ts2.forEach(interfaceT.typeParameters, visitType);
          ts2.forEach(getBaseTypes(interfaceT), visitType);
          visitType(interfaceT.thisType);
        }
        function visitObjectType(type) {
          var resolved = resolveStructuredTypeMembers(type);
          for (var _i = 0, _a = resolved.indexInfos; _i < _a.length; _i++) {
            var info = _a[_i];
            visitType(info.keyType);
            visitType(info.type);
          }
          for (var _b = 0, _c = resolved.callSignatures; _b < _c.length; _b++) {
            var signature = _c[_b];
            visitSignature(signature);
          }
          for (var _d = 0, _e = resolved.constructSignatures; _d < _e.length; _d++) {
            var signature = _e[_d];
            visitSignature(signature);
          }
          for (var _f = 0, _g = resolved.properties; _f < _g.length; _f++) {
            var p = _g[_f];
            visitSymbol(p);
          }
        }
        function visitSymbol(symbol) {
          if (!symbol) {
            return false;
          }
          var symbolId = ts2.getSymbolId(symbol);
          if (visitedSymbols[symbolId]) {
            return false;
          }
          visitedSymbols[symbolId] = symbol;
          if (!accept(symbol)) {
            return true;
          }
          var t = getTypeOfSymbol(symbol);
          visitType(t);
          if (symbol.exports) {
            symbol.exports.forEach(visitSymbol);
          }
          ts2.forEach(symbol.declarations, function(d) {
            if (d.type && d.type.kind === 180) {
              var query = d.type;
              var entity = getResolvedSymbol(getFirstIdentifier(query.exprName));
              visitSymbol(entity);
            }
          });
          return false;
        }
      }
    }
    ts2.createGetSymbolWalker = createGetSymbolWalker;
  })(ts || (ts = {}));
  (function(ts2) {
    var ambientModuleSymbolRegex = /^".+"$/;
    var anon = "(anonymous)";
    var nextSymbolId = 1;
    var nextNodeId = 1;
    var nextMergeId = 1;
    var nextFlowId = 1;
    var IterationUse;
    (function(IterationUse2) {
      IterationUse2[IterationUse2["AllowsSyncIterablesFlag"] = 1] = "AllowsSyncIterablesFlag";
      IterationUse2[IterationUse2["AllowsAsyncIterablesFlag"] = 2] = "AllowsAsyncIterablesFlag";
      IterationUse2[IterationUse2["AllowsStringInputFlag"] = 4] = "AllowsStringInputFlag";
      IterationUse2[IterationUse2["ForOfFlag"] = 8] = "ForOfFlag";
      IterationUse2[IterationUse2["YieldStarFlag"] = 16] = "YieldStarFlag";
      IterationUse2[IterationUse2["SpreadFlag"] = 32] = "SpreadFlag";
      IterationUse2[IterationUse2["DestructuringFlag"] = 64] = "DestructuringFlag";
      IterationUse2[IterationUse2["PossiblyOutOfBounds"] = 128] = "PossiblyOutOfBounds";
      IterationUse2[IterationUse2["Element"] = 1] = "Element";
      IterationUse2[IterationUse2["Spread"] = 33] = "Spread";
      IterationUse2[IterationUse2["Destructuring"] = 65] = "Destructuring";
      IterationUse2[IterationUse2["ForOf"] = 13] = "ForOf";
      IterationUse2[IterationUse2["ForAwaitOf"] = 15] = "ForAwaitOf";
      IterationUse2[IterationUse2["YieldStar"] = 17] = "YieldStar";
      IterationUse2[IterationUse2["AsyncYieldStar"] = 19] = "AsyncYieldStar";
      IterationUse2[IterationUse2["GeneratorReturnType"] = 1] = "GeneratorReturnType";
      IterationUse2[IterationUse2["AsyncGeneratorReturnType"] = 2] = "AsyncGeneratorReturnType";
    })(IterationUse || (IterationUse = {}));
    var IterationTypeKind;
    (function(IterationTypeKind2) {
      IterationTypeKind2[IterationTypeKind2["Yield"] = 0] = "Yield";
      IterationTypeKind2[IterationTypeKind2["Return"] = 1] = "Return";
      IterationTypeKind2[IterationTypeKind2["Next"] = 2] = "Next";
    })(IterationTypeKind || (IterationTypeKind = {}));
    var WideningKind;
    (function(WideningKind2) {
      WideningKind2[WideningKind2["Normal"] = 0] = "Normal";
      WideningKind2[WideningKind2["FunctionReturn"] = 1] = "FunctionReturn";
      WideningKind2[WideningKind2["GeneratorNext"] = 2] = "GeneratorNext";
      WideningKind2[WideningKind2["GeneratorYield"] = 3] = "GeneratorYield";
    })(WideningKind || (WideningKind = {}));
    var TypeFacts;
    (function(TypeFacts2) {
      TypeFacts2[TypeFacts2["None"] = 0] = "None";
      TypeFacts2[TypeFacts2["TypeofEQString"] = 1] = "TypeofEQString";
      TypeFacts2[TypeFacts2["TypeofEQNumber"] = 2] = "TypeofEQNumber";
      TypeFacts2[TypeFacts2["TypeofEQBigInt"] = 4] = "TypeofEQBigInt";
      TypeFacts2[TypeFacts2["TypeofEQBoolean"] = 8] = "TypeofEQBoolean";
      TypeFacts2[TypeFacts2["TypeofEQSymbol"] = 16] = "TypeofEQSymbol";
      TypeFacts2[TypeFacts2["TypeofEQObject"] = 32] = "TypeofEQObject";
      TypeFacts2[TypeFacts2["TypeofEQFunction"] = 64] = "TypeofEQFunction";
      TypeFacts2[TypeFacts2["TypeofEQHostObject"] = 128] = "TypeofEQHostObject";
      TypeFacts2[TypeFacts2["TypeofNEString"] = 256] = "TypeofNEString";
      TypeFacts2[TypeFacts2["TypeofNENumber"] = 512] = "TypeofNENumber";
      TypeFacts2[TypeFacts2["TypeofNEBigInt"] = 1024] = "TypeofNEBigInt";
      TypeFacts2[TypeFacts2["TypeofNEBoolean"] = 2048] = "TypeofNEBoolean";
      TypeFacts2[TypeFacts2["TypeofNESymbol"] = 4096] = "TypeofNESymbol";
      TypeFacts2[TypeFacts2["TypeofNEObject"] = 8192] = "TypeofNEObject";
      TypeFacts2[TypeFacts2["TypeofNEFunction"] = 16384] = "TypeofNEFunction";
      TypeFacts2[TypeFacts2["TypeofNEHostObject"] = 32768] = "TypeofNEHostObject";
      TypeFacts2[TypeFacts2["EQUndefined"] = 65536] = "EQUndefined";
      TypeFacts2[TypeFacts2["EQNull"] = 131072] = "EQNull";
      TypeFacts2[TypeFacts2["EQUndefinedOrNull"] = 262144] = "EQUndefinedOrNull";
      TypeFacts2[TypeFacts2["NEUndefined"] = 524288] = "NEUndefined";
      TypeFacts2[TypeFacts2["NENull"] = 1048576] = "NENull";
      TypeFacts2[TypeFacts2["NEUndefinedOrNull"] = 2097152] = "NEUndefinedOrNull";
      TypeFacts2[TypeFacts2["Truthy"] = 4194304] = "Truthy";
      TypeFacts2[TypeFacts2["Falsy"] = 8388608] = "Falsy";
      TypeFacts2[TypeFacts2["All"] = 16777215] = "All";
      TypeFacts2[TypeFacts2["BaseStringStrictFacts"] = 3735041] = "BaseStringStrictFacts";
      TypeFacts2[TypeFacts2["BaseStringFacts"] = 12582401] = "BaseStringFacts";
      TypeFacts2[TypeFacts2["StringStrictFacts"] = 16317953] = "StringStrictFacts";
      TypeFacts2[TypeFacts2["StringFacts"] = 16776705] = "StringFacts";
      TypeFacts2[TypeFacts2["EmptyStringStrictFacts"] = 12123649] = "EmptyStringStrictFacts";
      TypeFacts2[TypeFacts2["EmptyStringFacts"] = 12582401] = "EmptyStringFacts";
      TypeFacts2[TypeFacts2["NonEmptyStringStrictFacts"] = 7929345] = "NonEmptyStringStrictFacts";
      TypeFacts2[TypeFacts2["NonEmptyStringFacts"] = 16776705] = "NonEmptyStringFacts";
      TypeFacts2[TypeFacts2["BaseNumberStrictFacts"] = 3734786] = "BaseNumberStrictFacts";
      TypeFacts2[TypeFacts2["BaseNumberFacts"] = 12582146] = "BaseNumberFacts";
      TypeFacts2[TypeFacts2["NumberStrictFacts"] = 16317698] = "NumberStrictFacts";
      TypeFacts2[TypeFacts2["NumberFacts"] = 16776450] = "NumberFacts";
      TypeFacts2[TypeFacts2["ZeroNumberStrictFacts"] = 12123394] = "ZeroNumberStrictFacts";
      TypeFacts2[TypeFacts2["ZeroNumberFacts"] = 12582146] = "ZeroNumberFacts";
      TypeFacts2[TypeFacts2["NonZeroNumberStrictFacts"] = 7929090] = "NonZeroNumberStrictFacts";
      TypeFacts2[TypeFacts2["NonZeroNumberFacts"] = 16776450] = "NonZeroNumberFacts";
      TypeFacts2[TypeFacts2["BaseBigIntStrictFacts"] = 3734276] = "BaseBigIntStrictFacts";
      TypeFacts2[TypeFacts2["BaseBigIntFacts"] = 12581636] = "BaseBigIntFacts";
      TypeFacts2[TypeFacts2["BigIntStrictFacts"] = 16317188] = "BigIntStrictFacts";
      TypeFacts2[TypeFacts2["BigIntFacts"] = 16775940] = "BigIntFacts";
      TypeFacts2[TypeFacts2["ZeroBigIntStrictFacts"] = 12122884] = "ZeroBigIntStrictFacts";
      TypeFacts2[TypeFacts2["ZeroBigIntFacts"] = 12581636] = "ZeroBigIntFacts";
      TypeFacts2[TypeFacts2["NonZeroBigIntStrictFacts"] = 7928580] = "NonZeroBigIntStrictFacts";
      TypeFacts2[TypeFacts2["NonZeroBigIntFacts"] = 16775940] = "NonZeroBigIntFacts";
      TypeFacts2[TypeFacts2["BaseBooleanStrictFacts"] = 3733256] = "BaseBooleanStrictFacts";
      TypeFacts2[TypeFacts2["BaseBooleanFacts"] = 12580616] = "BaseBooleanFacts";
      TypeFacts2[TypeFacts2["BooleanStrictFacts"] = 16316168] = "BooleanStrictFacts";
      TypeFacts2[TypeFacts2["BooleanFacts"] = 16774920] = "BooleanFacts";
      TypeFacts2[TypeFacts2["FalseStrictFacts"] = 12121864] = "FalseStrictFacts";
      TypeFacts2[TypeFacts2["FalseFacts"] = 12580616] = "FalseFacts";
      TypeFacts2[TypeFacts2["TrueStrictFacts"] = 7927560] = "TrueStrictFacts";
      TypeFacts2[TypeFacts2["TrueFacts"] = 16774920] = "TrueFacts";
      TypeFacts2[TypeFacts2["SymbolStrictFacts"] = 7925520] = "SymbolStrictFacts";
      TypeFacts2[TypeFacts2["SymbolFacts"] = 16772880] = "SymbolFacts";
      TypeFacts2[TypeFacts2["ObjectStrictFacts"] = 7888800] = "ObjectStrictFacts";
      TypeFacts2[TypeFacts2["ObjectFacts"] = 16736160] = "ObjectFacts";
      TypeFacts2[TypeFacts2["FunctionStrictFacts"] = 7880640] = "FunctionStrictFacts";
      TypeFacts2[TypeFacts2["FunctionFacts"] = 16728e3] = "FunctionFacts";
      TypeFacts2[TypeFacts2["UndefinedFacts"] = 9830144] = "UndefinedFacts";
      TypeFacts2[TypeFacts2["NullFacts"] = 9363232] = "NullFacts";
      TypeFacts2[TypeFacts2["EmptyObjectStrictFacts"] = 16318463] = "EmptyObjectStrictFacts";
      TypeFacts2[TypeFacts2["AllTypeofNE"] = 556800] = "AllTypeofNE";
      TypeFacts2[TypeFacts2["EmptyObjectFacts"] = 16777215] = "EmptyObjectFacts";
    })(TypeFacts || (TypeFacts = {}));
    var typeofEQFacts = new ts2.Map(ts2.getEntries({
      string: 1,
      number: 2,
      bigint: 4,
      boolean: 8,
      symbol: 16,
      undefined: 65536,
      object: 32,
      function: 64
    }));
    var typeofNEFacts = new ts2.Map(ts2.getEntries({
      string: 256,
      number: 512,
      bigint: 1024,
      boolean: 2048,
      symbol: 4096,
      undefined: 524288,
      object: 8192,
      function: 16384
    }));
    var TypeSystemPropertyName;
    (function(TypeSystemPropertyName2) {
      TypeSystemPropertyName2[TypeSystemPropertyName2["Type"] = 0] = "Type";
      TypeSystemPropertyName2[TypeSystemPropertyName2["ResolvedBaseConstructorType"] = 1] = "ResolvedBaseConstructorType";
      TypeSystemPropertyName2[TypeSystemPropertyName2["DeclaredType"] = 2] = "DeclaredType";
      TypeSystemPropertyName2[TypeSystemPropertyName2["ResolvedReturnType"] = 3] = "ResolvedReturnType";
      TypeSystemPropertyName2[TypeSystemPropertyName2["ImmediateBaseConstraint"] = 4] = "ImmediateBaseConstraint";
      TypeSystemPropertyName2[TypeSystemPropertyName2["EnumTagType"] = 5] = "EnumTagType";
      TypeSystemPropertyName2[TypeSystemPropertyName2["ResolvedTypeArguments"] = 6] = "ResolvedTypeArguments";
      TypeSystemPropertyName2[TypeSystemPropertyName2["ResolvedBaseTypes"] = 7] = "ResolvedBaseTypes";
    })(TypeSystemPropertyName || (TypeSystemPropertyName = {}));
    var CheckMode;
    (function(CheckMode2) {
      CheckMode2[CheckMode2["Normal"] = 0] = "Normal";
      CheckMode2[CheckMode2["Contextual"] = 1] = "Contextual";
      CheckMode2[CheckMode2["Inferential"] = 2] = "Inferential";
      CheckMode2[CheckMode2["SkipContextSensitive"] = 4] = "SkipContextSensitive";
      CheckMode2[CheckMode2["SkipGenericFunctions"] = 8] = "SkipGenericFunctions";
      CheckMode2[CheckMode2["IsForSignatureHelp"] = 16] = "IsForSignatureHelp";
    })(CheckMode || (CheckMode = {}));
    var SignatureCheckMode;
    (function(SignatureCheckMode2) {
      SignatureCheckMode2[SignatureCheckMode2["BivariantCallback"] = 1] = "BivariantCallback";
      SignatureCheckMode2[SignatureCheckMode2["StrictCallback"] = 2] = "StrictCallback";
      SignatureCheckMode2[SignatureCheckMode2["IgnoreReturnTypes"] = 4] = "IgnoreReturnTypes";
      SignatureCheckMode2[SignatureCheckMode2["StrictArity"] = 8] = "StrictArity";
      SignatureCheckMode2[SignatureCheckMode2["Callback"] = 3] = "Callback";
    })(SignatureCheckMode || (SignatureCheckMode = {}));
    var IntersectionState;
    (function(IntersectionState2) {
      IntersectionState2[IntersectionState2["None"] = 0] = "None";
      IntersectionState2[IntersectionState2["Source"] = 1] = "Source";
      IntersectionState2[IntersectionState2["Target"] = 2] = "Target";
      IntersectionState2[IntersectionState2["PropertyCheck"] = 4] = "PropertyCheck";
      IntersectionState2[IntersectionState2["UnionIntersectionCheck"] = 8] = "UnionIntersectionCheck";
      IntersectionState2[IntersectionState2["InPropertyCheck"] = 16] = "InPropertyCheck";
    })(IntersectionState || (IntersectionState = {}));
    var RecursionFlags;
    (function(RecursionFlags2) {
      RecursionFlags2[RecursionFlags2["None"] = 0] = "None";
      RecursionFlags2[RecursionFlags2["Source"] = 1] = "Source";
      RecursionFlags2[RecursionFlags2["Target"] = 2] = "Target";
      RecursionFlags2[RecursionFlags2["Both"] = 3] = "Both";
    })(RecursionFlags || (RecursionFlags = {}));
    var MappedTypeModifiers;
    (function(MappedTypeModifiers2) {
      MappedTypeModifiers2[MappedTypeModifiers2["IncludeReadonly"] = 1] = "IncludeReadonly";
      MappedTypeModifiers2[MappedTypeModifiers2["ExcludeReadonly"] = 2] = "ExcludeReadonly";
      MappedTypeModifiers2[MappedTypeModifiers2["IncludeOptional"] = 4] = "IncludeOptional";
      MappedTypeModifiers2[MappedTypeModifiers2["ExcludeOptional"] = 8] = "ExcludeOptional";
    })(MappedTypeModifiers || (MappedTypeModifiers = {}));
    var ExpandingFlags;
    (function(ExpandingFlags2) {
      ExpandingFlags2[ExpandingFlags2["None"] = 0] = "None";
      ExpandingFlags2[ExpandingFlags2["Source"] = 1] = "Source";
      ExpandingFlags2[ExpandingFlags2["Target"] = 2] = "Target";
      ExpandingFlags2[ExpandingFlags2["Both"] = 3] = "Both";
    })(ExpandingFlags || (ExpandingFlags = {}));
    var MembersOrExportsResolutionKind;
    (function(MembersOrExportsResolutionKind2) {
      MembersOrExportsResolutionKind2["resolvedExports"] = "resolvedExports";
      MembersOrExportsResolutionKind2["resolvedMembers"] = "resolvedMembers";
    })(MembersOrExportsResolutionKind || (MembersOrExportsResolutionKind = {}));
    var UnusedKind;
    (function(UnusedKind2) {
      UnusedKind2[UnusedKind2["Local"] = 0] = "Local";
      UnusedKind2[UnusedKind2["Parameter"] = 1] = "Parameter";
    })(UnusedKind || (UnusedKind = {}));
    var isNotOverloadAndNotAccessor = ts2.and(isNotOverload, isNotAccessor);
    var DeclarationMeaning;
    (function(DeclarationMeaning2) {
      DeclarationMeaning2[DeclarationMeaning2["GetAccessor"] = 1] = "GetAccessor";
      DeclarationMeaning2[DeclarationMeaning2["SetAccessor"] = 2] = "SetAccessor";
      DeclarationMeaning2[DeclarationMeaning2["PropertyAssignment"] = 4] = "PropertyAssignment";
      DeclarationMeaning2[DeclarationMeaning2["Method"] = 8] = "Method";
      DeclarationMeaning2[DeclarationMeaning2["PrivateStatic"] = 16] = "PrivateStatic";
      DeclarationMeaning2[DeclarationMeaning2["GetOrSetAccessor"] = 3] = "GetOrSetAccessor";
      DeclarationMeaning2[DeclarationMeaning2["PropertyAssignmentOrMethod"] = 12] = "PropertyAssignmentOrMethod";
    })(DeclarationMeaning || (DeclarationMeaning = {}));
    var DeclarationSpaces;
    (function(DeclarationSpaces2) {
      DeclarationSpaces2[DeclarationSpaces2["None"] = 0] = "None";
      DeclarationSpaces2[DeclarationSpaces2["ExportValue"] = 1] = "ExportValue";
      DeclarationSpaces2[DeclarationSpaces2["ExportType"] = 2] = "ExportType";
      DeclarationSpaces2[DeclarationSpaces2["ExportNamespace"] = 4] = "ExportNamespace";
    })(DeclarationSpaces || (DeclarationSpaces = {}));
    var MinArgumentCountFlags;
    (function(MinArgumentCountFlags2) {
      MinArgumentCountFlags2[MinArgumentCountFlags2["None"] = 0] = "None";
      MinArgumentCountFlags2[MinArgumentCountFlags2["StrongArityForUntypedJS"] = 1] = "StrongArityForUntypedJS";
      MinArgumentCountFlags2[MinArgumentCountFlags2["VoidIsNonOptional"] = 2] = "VoidIsNonOptional";
    })(MinArgumentCountFlags || (MinArgumentCountFlags = {}));
    var IntrinsicTypeKind;
    (function(IntrinsicTypeKind2) {
      IntrinsicTypeKind2[IntrinsicTypeKind2["Uppercase"] = 0] = "Uppercase";
      IntrinsicTypeKind2[IntrinsicTypeKind2["Lowercase"] = 1] = "Lowercase";
      IntrinsicTypeKind2[IntrinsicTypeKind2["Capitalize"] = 2] = "Capitalize";
      IntrinsicTypeKind2[IntrinsicTypeKind2["Uncapitalize"] = 3] = "Uncapitalize";
    })(IntrinsicTypeKind || (IntrinsicTypeKind = {}));
    var intrinsicTypeKinds = new ts2.Map(ts2.getEntries({
      Uppercase: 0,
      Lowercase: 1,
      Capitalize: 2,
      Uncapitalize: 3
    }));
    function SymbolLinks() {
    }
    function NodeLinks() {
      this.flags = 0;
    }
    function getNodeId(node) {
      if (!node.id) {
        node.id = nextNodeId;
        nextNodeId++;
      }
      return node.id;
    }
    ts2.getNodeId = getNodeId;
    function getSymbolId(symbol) {
      if (!symbol.id) {
        symbol.id = nextSymbolId;
        nextSymbolId++;
      }
      return symbol.id;
    }
    ts2.getSymbolId = getSymbolId;
    function isInstantiatedModule(node, preserveConstEnums) {
      var moduleState = ts2.getModuleInstanceState(node);
      return moduleState === 1 || preserveConstEnums && moduleState === 2;
    }
    ts2.isInstantiatedModule = isInstantiatedModule;
    function createTypeChecker(host, produceDiagnostics) {
      var getPackagesMap = ts2.memoize(function() {
        var map = new ts2.Map();
        host.getSourceFiles().forEach(function(sf) {
          if (!sf.resolvedModules)
            return;
          sf.resolvedModules.forEach(function(r) {
            if (r && r.packageId)
              map.set(r.packageId.name, r.extension === ".d.ts" || !!map.get(r.packageId.name));
          });
        });
        return map;
      });
      var cancellationToken;
      var requestedExternalEmitHelpers;
      var externalHelpersModule;
      var Symbol2 = ts2.objectAllocator.getSymbolConstructor();
      var Type = ts2.objectAllocator.getTypeConstructor();
      var Signature = ts2.objectAllocator.getSignatureConstructor();
      var typeCount = 0;
      var symbolCount = 0;
      var enumCount = 0;
      var totalInstantiationCount = 0;
      var instantiationCount = 0;
      var instantiationDepth = 0;
      var inlineLevel = 0;
      var currentNode;
      var emptySymbols = ts2.createSymbolTable();
      var arrayVariances = [1];
      var compilerOptions = host.getCompilerOptions();
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var moduleKind = ts2.getEmitModuleKind(compilerOptions);
      var useDefineForClassFields = ts2.getUseDefineForClassFields(compilerOptions);
      var allowSyntheticDefaultImports = ts2.getAllowSyntheticDefaultImports(compilerOptions);
      var strictNullChecks = ts2.getStrictOptionValue(compilerOptions, "strictNullChecks");
      var strictFunctionTypes = ts2.getStrictOptionValue(compilerOptions, "strictFunctionTypes");
      var strictBindCallApply = ts2.getStrictOptionValue(compilerOptions, "strictBindCallApply");
      var strictPropertyInitialization = ts2.getStrictOptionValue(compilerOptions, "strictPropertyInitialization");
      var noImplicitAny = ts2.getStrictOptionValue(compilerOptions, "noImplicitAny");
      var noImplicitThis = ts2.getStrictOptionValue(compilerOptions, "noImplicitThis");
      var useUnknownInCatchVariables = ts2.getStrictOptionValue(compilerOptions, "useUnknownInCatchVariables");
      var keyofStringsOnly = !!compilerOptions.keyofStringsOnly;
      var freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : 16384;
      var exactOptionalPropertyTypes = compilerOptions.exactOptionalPropertyTypes;
      var checkBinaryExpression = createCheckBinaryExpression();
      var emitResolver = createResolver();
      var nodeBuilder = createNodeBuilder();
      var globals = ts2.createSymbolTable();
      var undefinedSymbol = createSymbol(4, "undefined");
      undefinedSymbol.declarations = [];
      var globalThisSymbol = createSymbol(1536, "globalThis", 8);
      globalThisSymbol.exports = globals;
      globalThisSymbol.declarations = [];
      globals.set(globalThisSymbol.escapedName, globalThisSymbol);
      var argumentsSymbol = createSymbol(4, "arguments");
      var requireSymbol = createSymbol(4, "require");
      var apparentArgumentCount;
      var checker = {
        getNodeCount: function() {
          return ts2.sum(host.getSourceFiles(), "nodeCount");
        },
        getIdentifierCount: function() {
          return ts2.sum(host.getSourceFiles(), "identifierCount");
        },
        getSymbolCount: function() {
          return ts2.sum(host.getSourceFiles(), "symbolCount") + symbolCount;
        },
        getTypeCount: function() {
          return typeCount;
        },
        getInstantiationCount: function() {
          return totalInstantiationCount;
        },
        getRelationCacheSizes: function() {
          return {
            assignable: assignableRelation.size,
            identity: identityRelation.size,
            subtype: subtypeRelation.size,
            strictSubtype: strictSubtypeRelation.size
          };
        },
        isUndefinedSymbol: function(symbol) {
          return symbol === undefinedSymbol;
        },
        isArgumentsSymbol: function(symbol) {
          return symbol === argumentsSymbol;
        },
        isUnknownSymbol: function(symbol) {
          return symbol === unknownSymbol;
        },
        getMergedSymbol,
        getDiagnostics,
        getGlobalDiagnostics,
        getRecursionIdentity,
        getUnmatchedProperties,
        getTypeOfSymbolAtLocation: function(symbol, locationIn) {
          var location = ts2.getParseTreeNode(locationIn);
          return location ? getTypeOfSymbolAtLocation(symbol, location) : errorType;
        },
        getSymbolsOfParameterPropertyDeclaration: function(parameterIn, parameterName) {
          var parameter = ts2.getParseTreeNode(parameterIn, ts2.isParameter);
          if (parameter === void 0)
            return ts2.Debug.fail("Cannot get symbols of a synthetic parameter that cannot be resolved to a parse-tree node.");
          return getSymbolsOfParameterPropertyDeclaration(parameter, ts2.escapeLeadingUnderscores(parameterName));
        },
        getDeclaredTypeOfSymbol,
        getPropertiesOfType,
        getPropertyOfType: function(type, name) {
          return getPropertyOfType(type, ts2.escapeLeadingUnderscores(name));
        },
        getPrivateIdentifierPropertyOfType: function(leftType, name, location) {
          var node = ts2.getParseTreeNode(location);
          if (!node) {
            return void 0;
          }
          var propName = ts2.escapeLeadingUnderscores(name);
          var lexicallyScopedIdentifier = lookupSymbolForPrivateIdentifierDeclaration(propName, node);
          return lexicallyScopedIdentifier ? getPrivateIdentifierPropertyOfType(leftType, lexicallyScopedIdentifier) : void 0;
        },
        getTypeOfPropertyOfType: function(type, name) {
          return getTypeOfPropertyOfType(type, ts2.escapeLeadingUnderscores(name));
        },
        getIndexInfoOfType: function(type, kind) {
          return getIndexInfoOfType(type, kind === 0 ? stringType : numberType);
        },
        getIndexInfosOfType,
        getSignaturesOfType,
        getIndexTypeOfType: function(type, kind) {
          return getIndexTypeOfType(type, kind === 0 ? stringType : numberType);
        },
        getBaseTypes,
        getBaseTypeOfLiteralType,
        getWidenedType,
        getTypeFromTypeNode: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isTypeNode);
          return node ? getTypeFromTypeNode(node) : errorType;
        },
        getParameterType: getTypeAtPosition,
        getParameterIdentifierNameAtPosition,
        getPromisedTypeOfPromise,
        getAwaitedType: function(type) {
          return getAwaitedType(type);
        },
        getReturnTypeOfSignature,
        isNullableType,
        getNullableType,
        getNonNullableType,
        getNonOptionalType: removeOptionalTypeMarker,
        getTypeArguments,
        typeToTypeNode: nodeBuilder.typeToTypeNode,
        indexInfoToIndexSignatureDeclaration: nodeBuilder.indexInfoToIndexSignatureDeclaration,
        signatureToSignatureDeclaration: nodeBuilder.signatureToSignatureDeclaration,
        symbolToEntityName: nodeBuilder.symbolToEntityName,
        symbolToExpression: nodeBuilder.symbolToExpression,
        symbolToTypeParameterDeclarations: nodeBuilder.symbolToTypeParameterDeclarations,
        symbolToParameterDeclaration: nodeBuilder.symbolToParameterDeclaration,
        typeParameterToDeclaration: nodeBuilder.typeParameterToDeclaration,
        getSymbolsInScope: function(locationIn, meaning) {
          var location = ts2.getParseTreeNode(locationIn);
          return location ? getSymbolsInScope(location, meaning) : [];
        },
        getSymbolAtLocation: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn);
          return node ? getSymbolAtLocation(node, true) : void 0;
        },
        getIndexInfosAtLocation: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn);
          return node ? getIndexInfosAtLocation(node) : void 0;
        },
        getShorthandAssignmentValueSymbol: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn);
          return node ? getShorthandAssignmentValueSymbol(node) : void 0;
        },
        getExportSpecifierLocalTargetSymbol: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isExportSpecifier);
          return node ? getExportSpecifierLocalTargetSymbol(node) : void 0;
        },
        getExportSymbolOfSymbol: function(symbol) {
          return getMergedSymbol(symbol.exportSymbol || symbol);
        },
        getTypeAtLocation: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn);
          return node ? getTypeOfNode(node) : errorType;
        },
        getTypeOfAssignmentPattern: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isAssignmentPattern);
          return node && getTypeOfAssignmentPattern(node) || errorType;
        },
        getPropertySymbolOfDestructuringAssignment: function(locationIn) {
          var location = ts2.getParseTreeNode(locationIn, ts2.isIdentifier);
          return location ? getPropertySymbolOfDestructuringAssignment(location) : void 0;
        },
        signatureToString: function(signature, enclosingDeclaration, flags, kind) {
          return signatureToString(signature, ts2.getParseTreeNode(enclosingDeclaration), flags, kind);
        },
        typeToString: function(type, enclosingDeclaration, flags) {
          return typeToString(type, ts2.getParseTreeNode(enclosingDeclaration), flags);
        },
        symbolToString: function(symbol, enclosingDeclaration, meaning, flags) {
          return symbolToString(symbol, ts2.getParseTreeNode(enclosingDeclaration), meaning, flags);
        },
        typePredicateToString: function(predicate, enclosingDeclaration, flags) {
          return typePredicateToString(predicate, ts2.getParseTreeNode(enclosingDeclaration), flags);
        },
        writeSignature: function(signature, enclosingDeclaration, flags, kind, writer) {
          return signatureToString(signature, ts2.getParseTreeNode(enclosingDeclaration), flags, kind, writer);
        },
        writeType: function(type, enclosingDeclaration, flags, writer) {
          return typeToString(type, ts2.getParseTreeNode(enclosingDeclaration), flags, writer);
        },
        writeSymbol: function(symbol, enclosingDeclaration, meaning, flags, writer) {
          return symbolToString(symbol, ts2.getParseTreeNode(enclosingDeclaration), meaning, flags, writer);
        },
        writeTypePredicate: function(predicate, enclosingDeclaration, flags, writer) {
          return typePredicateToString(predicate, ts2.getParseTreeNode(enclosingDeclaration), flags, writer);
        },
        getAugmentedPropertiesOfType,
        getRootSymbols,
        getSymbolOfExpando,
        getContextualType: function(nodeIn, contextFlags) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isExpression);
          if (!node) {
            return void 0;
          }
          var containingCall = ts2.findAncestor(node, ts2.isCallLikeExpression);
          var containingCallResolvedSignature = containingCall && getNodeLinks(containingCall).resolvedSignature;
          if (contextFlags & 4 && containingCall) {
            var toMarkSkip = node;
            do {
              getNodeLinks(toMarkSkip).skipDirectInference = true;
              toMarkSkip = toMarkSkip.parent;
            } while (toMarkSkip && toMarkSkip !== containingCall);
            getNodeLinks(containingCall).resolvedSignature = void 0;
          }
          var result = getContextualType(node, contextFlags);
          if (contextFlags & 4 && containingCall) {
            var toMarkSkip = node;
            do {
              getNodeLinks(toMarkSkip).skipDirectInference = void 0;
              toMarkSkip = toMarkSkip.parent;
            } while (toMarkSkip && toMarkSkip !== containingCall);
            getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
          }
          return result;
        },
        getContextualTypeForObjectLiteralElement: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isObjectLiteralElementLike);
          return node ? getContextualTypeForObjectLiteralElement(node) : void 0;
        },
        getContextualTypeForArgumentAtIndex: function(nodeIn, argIndex) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isCallLikeExpression);
          return node && getContextualTypeForArgumentAtIndex(node, argIndex);
        },
        getContextualTypeForJsxAttribute: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isJsxAttributeLike);
          return node && getContextualTypeForJsxAttribute(node);
        },
        isContextSensitive,
        getTypeOfPropertyOfContextualType,
        getFullyQualifiedName,
        getResolvedSignature: function(node, candidatesOutArray, argumentCount) {
          return getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, 0);
        },
        getResolvedSignatureForSignatureHelp: function(node, candidatesOutArray, argumentCount) {
          return getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, 16);
        },
        getExpandedParameters,
        hasEffectiveRestParameter,
        containsArgumentsReference,
        getConstantValue: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, canHaveConstantValue);
          return node ? getConstantValue(node) : void 0;
        },
        isValidPropertyAccess: function(nodeIn, propertyName) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isPropertyAccessOrQualifiedNameOrImportTypeNode);
          return !!node && isValidPropertyAccess(node, ts2.escapeLeadingUnderscores(propertyName));
        },
        isValidPropertyAccessForCompletions: function(nodeIn, type, property) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isPropertyAccessExpression);
          return !!node && isValidPropertyAccessForCompletions(node, type, property);
        },
        getSignatureFromDeclaration: function(declarationIn) {
          var declaration = ts2.getParseTreeNode(declarationIn, ts2.isFunctionLike);
          return declaration ? getSignatureFromDeclaration(declaration) : void 0;
        },
        isImplementationOfOverload: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isFunctionLike);
          return node ? isImplementationOfOverload(node) : void 0;
        },
        getImmediateAliasedSymbol,
        getAliasedSymbol: resolveAlias,
        getEmitResolver,
        getExportsOfModule: getExportsOfModuleAsArray,
        getExportsAndPropertiesOfModule,
        forEachExportAndPropertyOfModule,
        getSymbolWalker: ts2.createGetSymbolWalker(getRestTypeOfSignature, getTypePredicateOfSignature, getReturnTypeOfSignature, getBaseTypes, resolveStructuredTypeMembers, getTypeOfSymbol, getResolvedSymbol, getConstraintOfTypeParameter, ts2.getFirstIdentifier, getTypeArguments),
        getAmbientModules,
        getJsxIntrinsicTagNamesAt,
        isOptionalParameter: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isParameter);
          return node ? isOptionalParameter(node) : false;
        },
        tryGetMemberInModuleExports: function(name, symbol) {
          return tryGetMemberInModuleExports(ts2.escapeLeadingUnderscores(name), symbol);
        },
        tryGetMemberInModuleExportsAndProperties: function(name, symbol) {
          return tryGetMemberInModuleExportsAndProperties(ts2.escapeLeadingUnderscores(name), symbol);
        },
        tryFindAmbientModule: function(moduleName) {
          return tryFindAmbientModule(moduleName, true);
        },
        tryFindAmbientModuleWithoutAugmentations: function(moduleName) {
          return tryFindAmbientModule(moduleName, false);
        },
        getApparentType,
        getUnionType,
        isTypeAssignableTo,
        createAnonymousType,
        createSignature,
        createSymbol,
        createIndexInfo,
        getAnyType: function() {
          return anyType;
        },
        getStringType: function() {
          return stringType;
        },
        getNumberType: function() {
          return numberType;
        },
        createPromiseType,
        createArrayType,
        getElementTypeOfArrayType,
        getBooleanType: function() {
          return booleanType;
        },
        getFalseType: function(fresh) {
          return fresh ? falseType : regularFalseType;
        },
        getTrueType: function(fresh) {
          return fresh ? trueType : regularTrueType;
        },
        getVoidType: function() {
          return voidType;
        },
        getUndefinedType: function() {
          return undefinedType;
        },
        getNullType: function() {
          return nullType;
        },
        getESSymbolType: function() {
          return esSymbolType;
        },
        getNeverType: function() {
          return neverType;
        },
        getOptionalType: function() {
          return optionalType;
        },
        getPromiseType: function() {
          return getGlobalPromiseType(false);
        },
        getPromiseLikeType: function() {
          return getGlobalPromiseLikeType(false);
        },
        isSymbolAccessible,
        isArrayType,
        isTupleType,
        isArrayLikeType,
        isTypeInvalidDueToUnionDiscriminant,
        getExactOptionalProperties,
        getAllPossiblePropertiesOfTypes,
        getSuggestedSymbolForNonexistentProperty,
        getSuggestionForNonexistentProperty,
        getSuggestedSymbolForNonexistentJSXAttribute,
        getSuggestedSymbolForNonexistentSymbol: function(location, name, meaning) {
          return getSuggestedSymbolForNonexistentSymbol(location, ts2.escapeLeadingUnderscores(name), meaning);
        },
        getSuggestionForNonexistentSymbol: function(location, name, meaning) {
          return getSuggestionForNonexistentSymbol(location, ts2.escapeLeadingUnderscores(name), meaning);
        },
        getSuggestedSymbolForNonexistentModule,
        getSuggestionForNonexistentExport,
        getSuggestedSymbolForNonexistentClassMember,
        getBaseConstraintOfType,
        getDefaultFromTypeParameter: function(type) {
          return type && type.flags & 262144 ? getDefaultFromTypeParameter(type) : void 0;
        },
        resolveName: function(name, location, meaning, excludeGlobals) {
          return resolveName(location, ts2.escapeLeadingUnderscores(name), meaning, void 0, void 0, false, excludeGlobals);
        },
        getJsxNamespace: function(n) {
          return ts2.unescapeLeadingUnderscores(getJsxNamespace(n));
        },
        getJsxFragmentFactory: function(n) {
          var jsxFragmentFactory = getJsxFragmentFactoryEntity(n);
          return jsxFragmentFactory && ts2.unescapeLeadingUnderscores(ts2.getFirstIdentifier(jsxFragmentFactory).escapedText);
        },
        getAccessibleSymbolChain,
        getTypePredicateOfSignature,
        resolveExternalModuleName: function(moduleSpecifierIn) {
          var moduleSpecifier = ts2.getParseTreeNode(moduleSpecifierIn, ts2.isExpression);
          return moduleSpecifier && resolveExternalModuleName(moduleSpecifier, moduleSpecifier, true);
        },
        resolveExternalModuleSymbol,
        tryGetThisTypeAt: function(nodeIn, includeGlobalThis) {
          var node = ts2.getParseTreeNode(nodeIn);
          return node && tryGetThisTypeAt(node, includeGlobalThis);
        },
        getTypeArgumentConstraint: function(nodeIn) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isTypeNode);
          return node && getTypeArgumentConstraint(node);
        },
        getSuggestionDiagnostics: function(fileIn, ct) {
          var file = ts2.getParseTreeNode(fileIn, ts2.isSourceFile) || ts2.Debug.fail("Could not determine parsed source file.");
          if (ts2.skipTypeChecking(file, compilerOptions, host)) {
            return ts2.emptyArray;
          }
          var diagnostics2;
          try {
            cancellationToken = ct;
            checkSourceFile(file);
            ts2.Debug.assert(!!(getNodeLinks(file).flags & 1));
            diagnostics2 = ts2.addRange(diagnostics2, suggestionDiagnostics.getDiagnostics(file.fileName));
            checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(file), function(containingNode, kind, diag) {
              if (!ts2.containsParseError(containingNode) && !unusedIsError(kind, !!(containingNode.flags & 8388608))) {
                (diagnostics2 || (diagnostics2 = [])).push(__assign(__assign({}, diag), { category: ts2.DiagnosticCategory.Suggestion }));
              }
            });
            return diagnostics2 || ts2.emptyArray;
          } finally {
            cancellationToken = void 0;
          }
        },
        runWithCancellationToken: function(token, callback) {
          try {
            cancellationToken = token;
            return callback(checker);
          } finally {
            cancellationToken = void 0;
          }
        },
        getLocalTypeParametersOfClassOrInterfaceOrTypeAlias,
        isDeclarationVisible,
        isPropertyAccessible,
        getTypeOnlyAliasDeclaration,
        getMemberOverrideModifierStatus
      };
      function getResolvedSignatureWorker(nodeIn, candidatesOutArray, argumentCount, checkMode) {
        var node = ts2.getParseTreeNode(nodeIn, ts2.isCallLikeExpression);
        apparentArgumentCount = argumentCount;
        var res = node ? getResolvedSignature(node, candidatesOutArray, checkMode) : void 0;
        apparentArgumentCount = void 0;
        return res;
      }
      var tupleTypes = new ts2.Map();
      var unionTypes = new ts2.Map();
      var intersectionTypes = new ts2.Map();
      var stringLiteralTypes = new ts2.Map();
      var numberLiteralTypes = new ts2.Map();
      var bigIntLiteralTypes = new ts2.Map();
      var enumLiteralTypes = new ts2.Map();
      var indexedAccessTypes = new ts2.Map();
      var templateLiteralTypes = new ts2.Map();
      var stringMappingTypes = new ts2.Map();
      var substitutionTypes = new ts2.Map();
      var subtypeReductionCache = new ts2.Map();
      var evolvingArrayTypes = [];
      var undefinedProperties = new ts2.Map();
      var unknownSymbol = createSymbol(4, "unknown");
      var resolvingSymbol = createSymbol(0, "__resolving__");
      var unresolvedSymbols = new ts2.Map();
      var errorTypes = new ts2.Map();
      var anyType = createIntrinsicType(1, "any");
      var autoType = createIntrinsicType(1, "any");
      var wildcardType = createIntrinsicType(1, "any");
      var errorType = createIntrinsicType(1, "error");
      var unresolvedType = createIntrinsicType(1, "unresolved");
      var nonInferrableAnyType = createIntrinsicType(1, "any", 131072);
      var intrinsicMarkerType = createIntrinsicType(1, "intrinsic");
      var unknownType = createIntrinsicType(2, "unknown");
      var nonNullUnknownType = createIntrinsicType(2, "unknown");
      var undefinedType = createIntrinsicType(32768, "undefined");
      var undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(32768, "undefined", 131072);
      var optionalType = createIntrinsicType(32768, "undefined");
      var missingType = exactOptionalPropertyTypes ? createIntrinsicType(32768, "undefined") : undefinedType;
      var nullType = createIntrinsicType(65536, "null");
      var nullWideningType = strictNullChecks ? nullType : createIntrinsicType(65536, "null", 131072);
      var stringType = createIntrinsicType(4, "string");
      var numberType = createIntrinsicType(8, "number");
      var bigintType = createIntrinsicType(64, "bigint");
      var falseType = createIntrinsicType(512, "false");
      var regularFalseType = createIntrinsicType(512, "false");
      var trueType = createIntrinsicType(512, "true");
      var regularTrueType = createIntrinsicType(512, "true");
      trueType.regularType = regularTrueType;
      trueType.freshType = trueType;
      regularTrueType.regularType = regularTrueType;
      regularTrueType.freshType = trueType;
      falseType.regularType = regularFalseType;
      falseType.freshType = falseType;
      regularFalseType.regularType = regularFalseType;
      regularFalseType.freshType = falseType;
      var booleanType = getUnionType([regularFalseType, regularTrueType]);
      var esSymbolType = createIntrinsicType(4096, "symbol");
      var voidType = createIntrinsicType(16384, "void");
      var neverType = createIntrinsicType(131072, "never");
      var silentNeverType = createIntrinsicType(131072, "never");
      var nonInferrableType = createIntrinsicType(131072, "never", 524288);
      var implicitNeverType = createIntrinsicType(131072, "never");
      var unreachableNeverType = createIntrinsicType(131072, "never");
      var nonPrimitiveType = createIntrinsicType(67108864, "object");
      var stringOrNumberType = getUnionType([stringType, numberType]);
      var stringNumberSymbolType = getUnionType([stringType, numberType, esSymbolType]);
      var keyofConstraintType = keyofStringsOnly ? stringType : stringNumberSymbolType;
      var numberOrBigIntType = getUnionType([numberType, bigintType]);
      var templateConstraintType = getUnionType([stringType, numberType, booleanType, bigintType, nullType, undefinedType]);
      var restrictiveMapper = makeFunctionTypeMapper(function(t) {
        return t.flags & 262144 ? getRestrictiveTypeParameter(t) : t;
      });
      var permissiveMapper = makeFunctionTypeMapper(function(t) {
        return t.flags & 262144 ? wildcardType : t;
      });
      var emptyObjectType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      var emptyJsxObjectType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      emptyJsxObjectType.objectFlags |= 2048;
      var emptyTypeLiteralSymbol = createSymbol(2048, "__type");
      emptyTypeLiteralSymbol.members = ts2.createSymbolTable();
      var emptyTypeLiteralType = createAnonymousType(emptyTypeLiteralSymbol, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      var emptyGenericType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      emptyGenericType.instantiations = new ts2.Map();
      var anyFunctionType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      anyFunctionType.objectFlags |= 524288;
      var noConstraintType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      var circularConstraintType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      var resolvingDefaultType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      var markerSuperType = createTypeParameter();
      var markerSubType = createTypeParameter();
      markerSubType.constraint = markerSuperType;
      var markerOtherType = createTypeParameter();
      var noTypePredicate = createTypePredicate(1, "<<unresolved>>", 0, anyType);
      var anySignature = createSignature(void 0, void 0, void 0, ts2.emptyArray, anyType, void 0, 0, 0);
      var unknownSignature = createSignature(void 0, void 0, void 0, ts2.emptyArray, errorType, void 0, 0, 0);
      var resolvingSignature = createSignature(void 0, void 0, void 0, ts2.emptyArray, anyType, void 0, 0, 0);
      var silentNeverSignature = createSignature(void 0, void 0, void 0, ts2.emptyArray, silentNeverType, void 0, 0, 0);
      var enumNumberIndexInfo = createIndexInfo(numberType, stringType, true);
      var iterationTypesCache = new ts2.Map();
      var noIterationTypes = {
        get yieldType() {
          return ts2.Debug.fail("Not supported");
        },
        get returnType() {
          return ts2.Debug.fail("Not supported");
        },
        get nextType() {
          return ts2.Debug.fail("Not supported");
        }
      };
      var anyIterationTypes = createIterationTypes(anyType, anyType, anyType);
      var anyIterationTypesExceptNext = createIterationTypes(anyType, anyType, unknownType);
      var defaultIterationTypes = createIterationTypes(neverType, anyType, undefinedType);
      var asyncIterationTypesResolver = {
        iterableCacheKey: "iterationTypesOfAsyncIterable",
        iteratorCacheKey: "iterationTypesOfAsyncIterator",
        iteratorSymbolName: "asyncIterator",
        getGlobalIteratorType: getGlobalAsyncIteratorType,
        getGlobalIterableType: getGlobalAsyncIterableType,
        getGlobalIterableIteratorType: getGlobalAsyncIterableIteratorType,
        getGlobalGeneratorType: getGlobalAsyncGeneratorType,
        resolveIterationType: getAwaitedType,
        mustHaveANextMethodDiagnostic: ts2.Diagnostics.An_async_iterator_must_have_a_next_method,
        mustBeAMethodDiagnostic: ts2.Diagnostics.The_0_property_of_an_async_iterator_must_be_a_method,
        mustHaveAValueDiagnostic: ts2.Diagnostics.The_type_returned_by_the_0_method_of_an_async_iterator_must_be_a_promise_for_a_type_with_a_value_property
      };
      var syncIterationTypesResolver = {
        iterableCacheKey: "iterationTypesOfIterable",
        iteratorCacheKey: "iterationTypesOfIterator",
        iteratorSymbolName: "iterator",
        getGlobalIteratorType,
        getGlobalIterableType,
        getGlobalIterableIteratorType,
        getGlobalGeneratorType,
        resolveIterationType: function(type, _errorNode) {
          return type;
        },
        mustHaveANextMethodDiagnostic: ts2.Diagnostics.An_iterator_must_have_a_next_method,
        mustBeAMethodDiagnostic: ts2.Diagnostics.The_0_property_of_an_iterator_must_be_a_method,
        mustHaveAValueDiagnostic: ts2.Diagnostics.The_type_returned_by_the_0_method_of_an_iterator_must_have_a_value_property
      };
      var amalgamatedDuplicates;
      var reverseMappedCache = new ts2.Map();
      var inInferTypeForHomomorphicMappedType = false;
      var ambientModulesCache;
      var patternAmbientModules;
      var patternAmbientModuleAugmentations;
      var globalObjectType;
      var globalFunctionType;
      var globalCallableFunctionType;
      var globalNewableFunctionType;
      var globalArrayType;
      var globalReadonlyArrayType;
      var globalStringType;
      var globalNumberType;
      var globalBooleanType;
      var globalRegExpType;
      var globalThisType;
      var anyArrayType;
      var autoArrayType;
      var anyReadonlyArrayType;
      var deferredGlobalNonNullableTypeAlias;
      var deferredGlobalESSymbolConstructorSymbol;
      var deferredGlobalESSymbolConstructorTypeSymbol;
      var deferredGlobalESSymbolType;
      var deferredGlobalTypedPropertyDescriptorType;
      var deferredGlobalPromiseType;
      var deferredGlobalPromiseLikeType;
      var deferredGlobalPromiseConstructorSymbol;
      var deferredGlobalPromiseConstructorLikeType;
      var deferredGlobalIterableType;
      var deferredGlobalIteratorType;
      var deferredGlobalIterableIteratorType;
      var deferredGlobalGeneratorType;
      var deferredGlobalIteratorYieldResultType;
      var deferredGlobalIteratorReturnResultType;
      var deferredGlobalAsyncIterableType;
      var deferredGlobalAsyncIteratorType;
      var deferredGlobalAsyncIterableIteratorType;
      var deferredGlobalAsyncGeneratorType;
      var deferredGlobalTemplateStringsArrayType;
      var deferredGlobalImportMetaType;
      var deferredGlobalImportMetaExpressionType;
      var deferredGlobalImportCallOptionsType;
      var deferredGlobalExtractSymbol;
      var deferredGlobalOmitSymbol;
      var deferredGlobalAwaitedSymbol;
      var deferredGlobalBigIntType;
      var allPotentiallyUnusedIdentifiers = new ts2.Map();
      var flowLoopStart = 0;
      var flowLoopCount = 0;
      var sharedFlowCount = 0;
      var flowAnalysisDisabled = false;
      var flowInvocationCount = 0;
      var lastFlowNode;
      var lastFlowNodeReachable;
      var flowTypeCache;
      var emptyStringType = getStringLiteralType("");
      var zeroType = getNumberLiteralType(0);
      var zeroBigIntType = getBigIntLiteralType({ negative: false, base10Value: "0" });
      var resolutionTargets = [];
      var resolutionResults = [];
      var resolutionPropertyNames = [];
      var suggestionCount = 0;
      var maximumSuggestionCount = 10;
      var mergedSymbols = [];
      var symbolLinks = [];
      var nodeLinks = [];
      var flowLoopCaches = [];
      var flowLoopNodes = [];
      var flowLoopKeys = [];
      var flowLoopTypes = [];
      var sharedFlowNodes = [];
      var sharedFlowTypes = [];
      var flowNodeReachable = [];
      var flowNodePostSuper = [];
      var potentialThisCollisions = [];
      var potentialNewTargetCollisions = [];
      var potentialWeakMapSetCollisions = [];
      var potentialReflectCollisions = [];
      var awaitedTypeStack = [];
      var diagnostics = ts2.createDiagnosticCollection();
      var suggestionDiagnostics = ts2.createDiagnosticCollection();
      var typeofTypesByName = new ts2.Map(ts2.getEntries({
        string: stringType,
        number: numberType,
        bigint: bigintType,
        boolean: booleanType,
        symbol: esSymbolType,
        undefined: undefinedType
      }));
      var typeofType = createTypeofType();
      var _jsxNamespace;
      var _jsxFactoryEntity;
      var outofbandVarianceMarkerHandler;
      var subtypeRelation = new ts2.Map();
      var strictSubtypeRelation = new ts2.Map();
      var assignableRelation = new ts2.Map();
      var comparableRelation = new ts2.Map();
      var identityRelation = new ts2.Map();
      var enumRelation = new ts2.Map();
      var builtinGlobals = ts2.createSymbolTable();
      builtinGlobals.set(undefinedSymbol.escapedName, undefinedSymbol);
      var suggestedExtensions = [
        [".mts", ".mjs"],
        [".ts", ".js"],
        [".cts", ".cjs"],
        [".mjs", ".mjs"],
        [".js", ".js"],
        [".cjs", ".cjs"],
        [".tsx", compilerOptions.jsx === 1 ? ".jsx" : ".js"],
        [".jsx", ".jsx"],
        [".json", ".json"]
      ];
      initializeTypeChecker();
      return checker;
      function getJsxNamespace(location) {
        if (location) {
          var file = ts2.getSourceFileOfNode(location);
          if (file) {
            if (ts2.isJsxOpeningFragment(location)) {
              if (file.localJsxFragmentNamespace) {
                return file.localJsxFragmentNamespace;
              }
              var jsxFragmentPragma = file.pragmas.get("jsxfrag");
              if (jsxFragmentPragma) {
                var chosenPragma = ts2.isArray(jsxFragmentPragma) ? jsxFragmentPragma[0] : jsxFragmentPragma;
                file.localJsxFragmentFactory = ts2.parseIsolatedEntityName(chosenPragma.arguments.factory, languageVersion);
                ts2.visitNode(file.localJsxFragmentFactory, markAsSynthetic);
                if (file.localJsxFragmentFactory) {
                  return file.localJsxFragmentNamespace = ts2.getFirstIdentifier(file.localJsxFragmentFactory).escapedText;
                }
              }
              var entity = getJsxFragmentFactoryEntity(location);
              if (entity) {
                file.localJsxFragmentFactory = entity;
                return file.localJsxFragmentNamespace = ts2.getFirstIdentifier(entity).escapedText;
              }
            } else {
              var localJsxNamespace = getLocalJsxNamespace(file);
              if (localJsxNamespace) {
                return file.localJsxNamespace = localJsxNamespace;
              }
            }
          }
        }
        if (!_jsxNamespace) {
          _jsxNamespace = "React";
          if (compilerOptions.jsxFactory) {
            _jsxFactoryEntity = ts2.parseIsolatedEntityName(compilerOptions.jsxFactory, languageVersion);
            ts2.visitNode(_jsxFactoryEntity, markAsSynthetic);
            if (_jsxFactoryEntity) {
              _jsxNamespace = ts2.getFirstIdentifier(_jsxFactoryEntity).escapedText;
            }
          } else if (compilerOptions.reactNamespace) {
            _jsxNamespace = ts2.escapeLeadingUnderscores(compilerOptions.reactNamespace);
          }
        }
        if (!_jsxFactoryEntity) {
          _jsxFactoryEntity = ts2.factory.createQualifiedName(ts2.factory.createIdentifier(ts2.unescapeLeadingUnderscores(_jsxNamespace)), "createElement");
        }
        return _jsxNamespace;
      }
      function getLocalJsxNamespace(file) {
        if (file.localJsxNamespace) {
          return file.localJsxNamespace;
        }
        var jsxPragma = file.pragmas.get("jsx");
        if (jsxPragma) {
          var chosenPragma = ts2.isArray(jsxPragma) ? jsxPragma[0] : jsxPragma;
          file.localJsxFactory = ts2.parseIsolatedEntityName(chosenPragma.arguments.factory, languageVersion);
          ts2.visitNode(file.localJsxFactory, markAsSynthetic);
          if (file.localJsxFactory) {
            return file.localJsxNamespace = ts2.getFirstIdentifier(file.localJsxFactory).escapedText;
          }
        }
      }
      function markAsSynthetic(node) {
        ts2.setTextRangePosEnd(node, -1, -1);
        return ts2.visitEachChild(node, markAsSynthetic, ts2.nullTransformationContext);
      }
      function getEmitResolver(sourceFile, cancellationToken2) {
        getDiagnostics(sourceFile, cancellationToken2);
        return emitResolver;
      }
      function lookupOrIssueError(location, message, arg0, arg1, arg2, arg3) {
        var diagnostic = location ? ts2.createDiagnosticForNode(location, message, arg0, arg1, arg2, arg3) : ts2.createCompilerDiagnostic(message, arg0, arg1, arg2, arg3);
        var existing = diagnostics.lookup(diagnostic);
        if (existing) {
          return existing;
        } else {
          diagnostics.add(diagnostic);
          return diagnostic;
        }
      }
      function errorSkippedOn(key, location, message, arg0, arg1, arg2, arg3) {
        var diagnostic = error(location, message, arg0, arg1, arg2, arg3);
        diagnostic.skippedOn = key;
        return diagnostic;
      }
      function createError(location, message, arg0, arg1, arg2, arg3) {
        return location ? ts2.createDiagnosticForNode(location, message, arg0, arg1, arg2, arg3) : ts2.createCompilerDiagnostic(message, arg0, arg1, arg2, arg3);
      }
      function error(location, message, arg0, arg1, arg2, arg3) {
        var diagnostic = createError(location, message, arg0, arg1, arg2, arg3);
        diagnostics.add(diagnostic);
        return diagnostic;
      }
      function addErrorOrSuggestion(isError, diagnostic) {
        if (isError) {
          diagnostics.add(diagnostic);
        } else {
          suggestionDiagnostics.add(__assign(__assign({}, diagnostic), { category: ts2.DiagnosticCategory.Suggestion }));
        }
      }
      function errorOrSuggestion(isError, location, message, arg0, arg1, arg2, arg3) {
        if (location.pos < 0 || location.end < 0) {
          if (!isError) {
            return;
          }
          var file = ts2.getSourceFileOfNode(location);
          addErrorOrSuggestion(isError, "message" in message ? ts2.createFileDiagnostic(file, 0, 0, message, arg0, arg1, arg2, arg3) : ts2.createDiagnosticForFileFromMessageChain(file, message));
          return;
        }
        addErrorOrSuggestion(isError, "message" in message ? ts2.createDiagnosticForNode(location, message, arg0, arg1, arg2, arg3) : ts2.createDiagnosticForNodeFromMessageChain(location, message));
      }
      function errorAndMaybeSuggestAwait(location, maybeMissingAwait, message, arg0, arg1, arg2, arg3) {
        var diagnostic = error(location, message, arg0, arg1, arg2, arg3);
        if (maybeMissingAwait) {
          var related = ts2.createDiagnosticForNode(location, ts2.Diagnostics.Did_you_forget_to_use_await);
          ts2.addRelatedInfo(diagnostic, related);
        }
        return diagnostic;
      }
      function addDeprecatedSuggestionWorker(declarations, diagnostic) {
        var deprecatedTag = Array.isArray(declarations) ? ts2.forEach(declarations, ts2.getJSDocDeprecatedTag) : ts2.getJSDocDeprecatedTag(declarations);
        if (deprecatedTag) {
          ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(deprecatedTag, ts2.Diagnostics.The_declaration_was_marked_as_deprecated_here));
        }
        suggestionDiagnostics.add(diagnostic);
        return diagnostic;
      }
      function addDeprecatedSuggestion(location, declarations, deprecatedEntity) {
        var diagnostic = ts2.createDiagnosticForNode(location, ts2.Diagnostics._0_is_deprecated, deprecatedEntity);
        return addDeprecatedSuggestionWorker(declarations, diagnostic);
      }
      function addDeprecatedSuggestionWithSignature(location, declaration, deprecatedEntity, signatureString) {
        var diagnostic = deprecatedEntity ? ts2.createDiagnosticForNode(location, ts2.Diagnostics.The_signature_0_of_1_is_deprecated, signatureString, deprecatedEntity) : ts2.createDiagnosticForNode(location, ts2.Diagnostics._0_is_deprecated, signatureString);
        return addDeprecatedSuggestionWorker(declaration, diagnostic);
      }
      function createSymbol(flags, name, checkFlags) {
        symbolCount++;
        var symbol = new Symbol2(flags | 33554432, name);
        symbol.checkFlags = checkFlags || 0;
        return symbol;
      }
      function getExcludedSymbolFlags(flags) {
        var result = 0;
        if (flags & 2)
          result |= 111551;
        if (flags & 1)
          result |= 111550;
        if (flags & 4)
          result |= 0;
        if (flags & 8)
          result |= 900095;
        if (flags & 16)
          result |= 110991;
        if (flags & 32)
          result |= 899503;
        if (flags & 64)
          result |= 788872;
        if (flags & 256)
          result |= 899327;
        if (flags & 128)
          result |= 899967;
        if (flags & 512)
          result |= 110735;
        if (flags & 8192)
          result |= 103359;
        if (flags & 32768)
          result |= 46015;
        if (flags & 65536)
          result |= 78783;
        if (flags & 262144)
          result |= 526824;
        if (flags & 524288)
          result |= 788968;
        if (flags & 2097152)
          result |= 2097152;
        return result;
      }
      function recordMergedSymbol(target, source) {
        if (!source.mergeId) {
          source.mergeId = nextMergeId;
          nextMergeId++;
        }
        mergedSymbols[source.mergeId] = target;
      }
      function cloneSymbol(symbol) {
        var result = createSymbol(symbol.flags, symbol.escapedName);
        result.declarations = symbol.declarations ? symbol.declarations.slice() : [];
        result.parent = symbol.parent;
        if (symbol.valueDeclaration)
          result.valueDeclaration = symbol.valueDeclaration;
        if (symbol.constEnumOnlyModule)
          result.constEnumOnlyModule = true;
        if (symbol.members)
          result.members = new ts2.Map(symbol.members);
        if (symbol.exports)
          result.exports = new ts2.Map(symbol.exports);
        recordMergedSymbol(result, symbol);
        return result;
      }
      function mergeSymbol(target, source, unidirectional) {
        if (unidirectional === void 0) {
          unidirectional = false;
        }
        if (!(target.flags & getExcludedSymbolFlags(source.flags)) || (source.flags | target.flags) & 67108864) {
          if (source === target) {
            return target;
          }
          if (!(target.flags & 33554432)) {
            var resolvedTarget = resolveSymbol(target);
            if (resolvedTarget === unknownSymbol) {
              return source;
            }
            target = cloneSymbol(resolvedTarget);
          }
          if (source.flags & 512 && target.flags & 512 && target.constEnumOnlyModule && !source.constEnumOnlyModule) {
            target.constEnumOnlyModule = false;
          }
          target.flags |= source.flags;
          if (source.valueDeclaration) {
            ts2.setValueDeclaration(target, source.valueDeclaration);
          }
          ts2.addRange(target.declarations, source.declarations);
          if (source.members) {
            if (!target.members)
              target.members = ts2.createSymbolTable();
            mergeSymbolTable(target.members, source.members, unidirectional);
          }
          if (source.exports) {
            if (!target.exports)
              target.exports = ts2.createSymbolTable();
            mergeSymbolTable(target.exports, source.exports, unidirectional);
          }
          if (!unidirectional) {
            recordMergedSymbol(target, source);
          }
        } else if (target.flags & 1024) {
          if (target !== globalThisSymbol) {
            error(source.declarations && ts2.getNameOfDeclaration(source.declarations[0]), ts2.Diagnostics.Cannot_augment_module_0_with_value_exports_because_it_resolves_to_a_non_module_entity, symbolToString(target));
          }
        } else {
          var isEitherEnum = !!(target.flags & 384 || source.flags & 384);
          var isEitherBlockScoped_1 = !!(target.flags & 2 || source.flags & 2);
          var message = isEitherEnum ? ts2.Diagnostics.Enum_declarations_can_only_merge_with_namespace_or_other_enum_declarations : isEitherBlockScoped_1 ? ts2.Diagnostics.Cannot_redeclare_block_scoped_variable_0 : ts2.Diagnostics.Duplicate_identifier_0;
          var sourceSymbolFile = source.declarations && ts2.getSourceFileOfNode(source.declarations[0]);
          var targetSymbolFile = target.declarations && ts2.getSourceFileOfNode(target.declarations[0]);
          var symbolName_1 = symbolToString(source);
          if (sourceSymbolFile && targetSymbolFile && amalgamatedDuplicates && !isEitherEnum && sourceSymbolFile !== targetSymbolFile) {
            var firstFile_1 = ts2.comparePaths(sourceSymbolFile.path, targetSymbolFile.path) === -1 ? sourceSymbolFile : targetSymbolFile;
            var secondFile_1 = firstFile_1 === sourceSymbolFile ? targetSymbolFile : sourceSymbolFile;
            var filesDuplicates = ts2.getOrUpdate(amalgamatedDuplicates, "".concat(firstFile_1.path, "|").concat(secondFile_1.path), function() {
              return { firstFile: firstFile_1, secondFile: secondFile_1, conflictingSymbols: new ts2.Map() };
            });
            var conflictingSymbolInfo = ts2.getOrUpdate(filesDuplicates.conflictingSymbols, symbolName_1, function() {
              return { isBlockScoped: isEitherBlockScoped_1, firstFileLocations: [], secondFileLocations: [] };
            });
            addDuplicateLocations(conflictingSymbolInfo.firstFileLocations, source);
            addDuplicateLocations(conflictingSymbolInfo.secondFileLocations, target);
          } else {
            addDuplicateDeclarationErrorsForSymbols(source, message, symbolName_1, target);
            addDuplicateDeclarationErrorsForSymbols(target, message, symbolName_1, source);
          }
        }
        return target;
        function addDuplicateLocations(locs, symbol) {
          if (symbol.declarations) {
            for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
              var decl = _a[_i];
              ts2.pushIfUnique(locs, decl);
            }
          }
        }
      }
      function addDuplicateDeclarationErrorsForSymbols(target, message, symbolName, source) {
        ts2.forEach(target.declarations, function(node) {
          addDuplicateDeclarationError(node, message, symbolName, source.declarations);
        });
      }
      function addDuplicateDeclarationError(node, message, symbolName, relatedNodes) {
        var errorNode = (ts2.getExpandoInitializer(node, false) ? ts2.getNameOfExpando(node) : ts2.getNameOfDeclaration(node)) || node;
        var err = lookupOrIssueError(errorNode, message, symbolName);
        var _loop_7 = function(relatedNode2) {
          var adjustedNode = (ts2.getExpandoInitializer(relatedNode2, false) ? ts2.getNameOfExpando(relatedNode2) : ts2.getNameOfDeclaration(relatedNode2)) || relatedNode2;
          if (adjustedNode === errorNode)
            return "continue";
          err.relatedInformation = err.relatedInformation || [];
          var leadingMessage = ts2.createDiagnosticForNode(adjustedNode, ts2.Diagnostics._0_was_also_declared_here, symbolName);
          var followOnMessage = ts2.createDiagnosticForNode(adjustedNode, ts2.Diagnostics.and_here);
          if (ts2.length(err.relatedInformation) >= 5 || ts2.some(err.relatedInformation, function(r) {
            return ts2.compareDiagnostics(r, followOnMessage) === 0 || ts2.compareDiagnostics(r, leadingMessage) === 0;
          }))
            return "continue";
          ts2.addRelatedInfo(err, !ts2.length(err.relatedInformation) ? leadingMessage : followOnMessage);
        };
        for (var _i = 0, _a = relatedNodes || ts2.emptyArray; _i < _a.length; _i++) {
          var relatedNode = _a[_i];
          _loop_7(relatedNode);
        }
      }
      function combineSymbolTables(first, second) {
        if (!(first === null || first === void 0 ? void 0 : first.size))
          return second;
        if (!(second === null || second === void 0 ? void 0 : second.size))
          return first;
        var combined = ts2.createSymbolTable();
        mergeSymbolTable(combined, first);
        mergeSymbolTable(combined, second);
        return combined;
      }
      function mergeSymbolTable(target, source, unidirectional) {
        if (unidirectional === void 0) {
          unidirectional = false;
        }
        source.forEach(function(sourceSymbol, id) {
          var targetSymbol = target.get(id);
          target.set(id, targetSymbol ? mergeSymbol(targetSymbol, sourceSymbol, unidirectional) : sourceSymbol);
        });
      }
      function mergeModuleAugmentation(moduleName) {
        var _a, _b, _c;
        var moduleAugmentation = moduleName.parent;
        if (((_a = moduleAugmentation.symbol.declarations) === null || _a === void 0 ? void 0 : _a[0]) !== moduleAugmentation) {
          ts2.Debug.assert(moduleAugmentation.symbol.declarations.length > 1);
          return;
        }
        if (ts2.isGlobalScopeAugmentation(moduleAugmentation)) {
          mergeSymbolTable(globals, moduleAugmentation.symbol.exports);
        } else {
          var moduleNotFoundError = !(moduleName.parent.parent.flags & 8388608) ? ts2.Diagnostics.Invalid_module_name_in_augmentation_module_0_cannot_be_found : void 0;
          var mainModule_1 = resolveExternalModuleNameWorker(moduleName, moduleName, moduleNotFoundError, true);
          if (!mainModule_1) {
            return;
          }
          mainModule_1 = resolveExternalModuleSymbol(mainModule_1);
          if (mainModule_1.flags & 1920) {
            if (ts2.some(patternAmbientModules, function(module2) {
              return mainModule_1 === module2.symbol;
            })) {
              var merged = mergeSymbol(moduleAugmentation.symbol, mainModule_1, true);
              if (!patternAmbientModuleAugmentations) {
                patternAmbientModuleAugmentations = new ts2.Map();
              }
              patternAmbientModuleAugmentations.set(moduleName.text, merged);
            } else {
              if (((_b = mainModule_1.exports) === null || _b === void 0 ? void 0 : _b.get("__export")) && ((_c = moduleAugmentation.symbol.exports) === null || _c === void 0 ? void 0 : _c.size)) {
                var resolvedExports = getResolvedMembersOrExportsOfSymbol(mainModule_1, "resolvedExports");
                for (var _i = 0, _d = ts2.arrayFrom(moduleAugmentation.symbol.exports.entries()); _i < _d.length; _i++) {
                  var _e = _d[_i], key = _e[0], value = _e[1];
                  if (resolvedExports.has(key) && !mainModule_1.exports.has(key)) {
                    mergeSymbol(resolvedExports.get(key), value);
                  }
                }
              }
              mergeSymbol(mainModule_1, moduleAugmentation.symbol);
            }
          } else {
            error(moduleName, ts2.Diagnostics.Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity, moduleName.text);
          }
        }
      }
      function addToSymbolTable(target, source, message) {
        source.forEach(function(sourceSymbol, id) {
          var targetSymbol = target.get(id);
          if (targetSymbol) {
            ts2.forEach(targetSymbol.declarations, addDeclarationDiagnostic(ts2.unescapeLeadingUnderscores(id), message));
          } else {
            target.set(id, sourceSymbol);
          }
        });
        function addDeclarationDiagnostic(id, message2) {
          return function(declaration) {
            return diagnostics.add(ts2.createDiagnosticForNode(declaration, message2, id));
          };
        }
      }
      function getSymbolLinks(symbol) {
        if (symbol.flags & 33554432)
          return symbol;
        var id = getSymbolId(symbol);
        return symbolLinks[id] || (symbolLinks[id] = new SymbolLinks());
      }
      function getNodeLinks(node) {
        var nodeId = getNodeId(node);
        return nodeLinks[nodeId] || (nodeLinks[nodeId] = new NodeLinks());
      }
      function isGlobalSourceFile(node) {
        return node.kind === 303 && !ts2.isExternalOrCommonJsModule(node);
      }
      function getSymbol(symbols, name, meaning) {
        if (meaning) {
          var symbol = getMergedSymbol(symbols.get(name));
          if (symbol) {
            ts2.Debug.assert((ts2.getCheckFlags(symbol) & 1) === 0, "Should never get an instantiated symbol here.");
            if (symbol.flags & meaning) {
              return symbol;
            }
            if (symbol.flags & 2097152) {
              var target = resolveAlias(symbol);
              if (target === unknownSymbol || target.flags & meaning) {
                return symbol;
              }
            }
          }
        }
      }
      function getSymbolsOfParameterPropertyDeclaration(parameter, parameterName) {
        var constructorDeclaration = parameter.parent;
        var classDeclaration = parameter.parent.parent;
        var parameterSymbol = getSymbol(constructorDeclaration.locals, parameterName, 111551);
        var propertySymbol = getSymbol(getMembersOfSymbol(classDeclaration.symbol), parameterName, 111551);
        if (parameterSymbol && propertySymbol) {
          return [parameterSymbol, propertySymbol];
        }
        return ts2.Debug.fail("There should exist two symbols, one as property declaration and one as parameter declaration");
      }
      function isBlockScopedNameDeclaredBeforeUse(declaration, usage) {
        var declarationFile = ts2.getSourceFileOfNode(declaration);
        var useFile = ts2.getSourceFileOfNode(usage);
        var declContainer = ts2.getEnclosingBlockScopeContainer(declaration);
        if (declarationFile !== useFile) {
          if (moduleKind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator) || !ts2.outFile(compilerOptions) || isInTypeQuery(usage) || declaration.flags & 8388608) {
            return true;
          }
          if (isUsedInFunctionOrInstanceProperty(usage, declaration)) {
            return true;
          }
          var sourceFiles = host.getSourceFiles();
          return sourceFiles.indexOf(declarationFile) <= sourceFiles.indexOf(useFile);
        }
        if (declaration.pos <= usage.pos && !(ts2.isPropertyDeclaration(declaration) && ts2.isThisProperty(usage.parent) && !declaration.initializer && !declaration.exclamationToken)) {
          if (declaration.kind === 202) {
            var errorBindingElement = ts2.getAncestor(usage, 202);
            if (errorBindingElement) {
              return ts2.findAncestor(errorBindingElement, ts2.isBindingElement) !== ts2.findAncestor(declaration, ts2.isBindingElement) || declaration.pos < errorBindingElement.pos;
            }
            return isBlockScopedNameDeclaredBeforeUse(ts2.getAncestor(declaration, 253), usage);
          } else if (declaration.kind === 253) {
            return !isImmediatelyUsedInInitializerOfBlockScopedVariable(declaration, usage);
          } else if (ts2.isClassDeclaration(declaration)) {
            return !ts2.findAncestor(usage, function(n) {
              return ts2.isComputedPropertyName(n) && n.parent.parent === declaration;
            });
          } else if (ts2.isPropertyDeclaration(declaration)) {
            return !isPropertyImmediatelyReferencedWithinDeclaration(declaration, usage, false);
          } else if (ts2.isParameterPropertyDeclaration(declaration, declaration.parent)) {
            return !(ts2.getEmitScriptTarget(compilerOptions) === 99 && useDefineForClassFields && ts2.getContainingClass(declaration) === ts2.getContainingClass(usage) && isUsedInFunctionOrInstanceProperty(usage, declaration));
          }
          return true;
        }
        if (usage.parent.kind === 274 || usage.parent.kind === 270 && usage.parent.isExportEquals) {
          return true;
        }
        if (usage.kind === 270 && usage.isExportEquals) {
          return true;
        }
        if (!!(usage.flags & 4194304) || isInTypeQuery(usage) || usageInTypeDeclaration()) {
          return true;
        }
        if (isUsedInFunctionOrInstanceProperty(usage, declaration)) {
          if (ts2.getEmitScriptTarget(compilerOptions) === 99 && useDefineForClassFields && ts2.getContainingClass(declaration) && (ts2.isPropertyDeclaration(declaration) || ts2.isParameterPropertyDeclaration(declaration, declaration.parent))) {
            return !isPropertyImmediatelyReferencedWithinDeclaration(declaration, usage, true);
          } else {
            return true;
          }
        }
        return false;
        function usageInTypeDeclaration() {
          return !!ts2.findAncestor(usage, function(node) {
            return ts2.isInterfaceDeclaration(node) || ts2.isTypeAliasDeclaration(node);
          });
        }
        function isImmediatelyUsedInInitializerOfBlockScopedVariable(declaration2, usage2) {
          switch (declaration2.parent.parent.kind) {
            case 236:
            case 241:
            case 243:
              if (isSameScopeDescendentOf(usage2, declaration2, declContainer)) {
                return true;
              }
              break;
          }
          var grandparent = declaration2.parent.parent;
          return ts2.isForInOrOfStatement(grandparent) && isSameScopeDescendentOf(usage2, grandparent.expression, declContainer);
        }
        function isUsedInFunctionOrInstanceProperty(usage2, declaration2) {
          return !!ts2.findAncestor(usage2, function(current) {
            if (current === declContainer) {
              return "quit";
            }
            if (ts2.isFunctionLike(current)) {
              return true;
            }
            if (ts2.isClassStaticBlockDeclaration(current)) {
              return declaration2.pos < usage2.pos;
            }
            var propertyDeclaration = ts2.tryCast(current.parent, ts2.isPropertyDeclaration);
            if (propertyDeclaration) {
              var initializerOfProperty = propertyDeclaration.initializer === current;
              if (initializerOfProperty) {
                if (ts2.isStatic(current.parent)) {
                  if (declaration2.kind === 168) {
                    return true;
                  }
                  if (ts2.isPropertyDeclaration(declaration2) && ts2.getContainingClass(usage2) === ts2.getContainingClass(declaration2)) {
                    var propName = declaration2.name;
                    if (ts2.isIdentifier(propName) || ts2.isPrivateIdentifier(propName)) {
                      var type = getTypeOfSymbol(getSymbolOfNode(declaration2));
                      var staticBlocks = ts2.filter(declaration2.parent.members, ts2.isClassStaticBlockDeclaration);
                      if (isPropertyInitializedInStaticBlocks(propName, type, staticBlocks, declaration2.parent.pos, current.pos)) {
                        return true;
                      }
                    }
                  }
                } else {
                  var isDeclarationInstanceProperty = declaration2.kind === 166 && !ts2.isStatic(declaration2);
                  if (!isDeclarationInstanceProperty || ts2.getContainingClass(usage2) !== ts2.getContainingClass(declaration2)) {
                    return true;
                  }
                }
              }
            }
            return false;
          });
        }
        function isPropertyImmediatelyReferencedWithinDeclaration(declaration2, usage2, stopAtAnyPropertyDeclaration) {
          if (usage2.end > declaration2.end) {
            return false;
          }
          var ancestorChangingReferenceScope = ts2.findAncestor(usage2, function(node) {
            if (node === declaration2) {
              return "quit";
            }
            switch (node.kind) {
              case 213:
                return true;
              case 166:
                return stopAtAnyPropertyDeclaration && (ts2.isPropertyDeclaration(declaration2) && node.parent === declaration2.parent || ts2.isParameterPropertyDeclaration(declaration2, declaration2.parent) && node.parent === declaration2.parent.parent) ? "quit" : true;
              case 234:
                switch (node.parent.kind) {
                  case 171:
                  case 168:
                  case 172:
                    return true;
                  default:
                    return false;
                }
              default:
                return false;
            }
          });
          return ancestorChangingReferenceScope === void 0;
        }
      }
      function useOuterVariableScopeInParameter(result, location, lastLocation) {
        var target = ts2.getEmitScriptTarget(compilerOptions);
        var functionLocation = location;
        if (ts2.isParameter(lastLocation) && functionLocation.body && result.valueDeclaration && result.valueDeclaration.pos >= functionLocation.body.pos && result.valueDeclaration.end <= functionLocation.body.end) {
          if (target >= 2) {
            var links = getNodeLinks(functionLocation);
            if (links.declarationRequiresScopeChange === void 0) {
              links.declarationRequiresScopeChange = ts2.forEach(functionLocation.parameters, requiresScopeChange) || false;
            }
            return !links.declarationRequiresScopeChange;
          }
        }
        return false;
        function requiresScopeChange(node) {
          return requiresScopeChangeWorker(node.name) || !!node.initializer && requiresScopeChangeWorker(node.initializer);
        }
        function requiresScopeChangeWorker(node) {
          switch (node.kind) {
            case 213:
            case 212:
            case 255:
            case 170:
              return false;
            case 168:
            case 171:
            case 172:
            case 294:
              return requiresScopeChangeWorker(node.name);
            case 166:
              if (ts2.hasStaticModifier(node)) {
                return target < 99 || !useDefineForClassFields;
              }
              return requiresScopeChangeWorker(node.name);
            default:
              if (ts2.isNullishCoalesce(node) || ts2.isOptionalChain(node)) {
                return target < 7;
              }
              if (ts2.isBindingElement(node) && node.dotDotDotToken && ts2.isObjectBindingPattern(node.parent)) {
                return target < 4;
              }
              if (ts2.isTypeNode(node))
                return false;
              return ts2.forEachChild(node, requiresScopeChangeWorker) || false;
          }
        }
      }
      function resolveName(location, name, meaning, nameNotFoundMessage, nameArg, isUse, excludeGlobals, getSpellingSuggstions) {
        if (excludeGlobals === void 0) {
          excludeGlobals = false;
        }
        if (getSpellingSuggstions === void 0) {
          getSpellingSuggstions = true;
        }
        return resolveNameHelper(location, name, meaning, nameNotFoundMessage, nameArg, isUse, excludeGlobals, getSpellingSuggstions, getSymbol);
      }
      function resolveNameHelper(location, name, meaning, nameNotFoundMessage, nameArg, isUse, excludeGlobals, getSpellingSuggestions, lookup) {
        var _a, _b, _c;
        var originalLocation = location;
        var result;
        var lastLocation;
        var lastSelfReferenceLocation;
        var propertyWithInvalidInitializer;
        var associatedDeclarationForContainingInitializerOrBindingName;
        var withinDeferredContext = false;
        var errorLocation = location;
        var grandparent;
        var isInExternalModule = false;
        loop:
          while (location) {
            if (location.locals && !isGlobalSourceFile(location)) {
              if (result = lookup(location.locals, name, meaning)) {
                var useResult = true;
                if (ts2.isFunctionLike(location) && lastLocation && lastLocation !== location.body) {
                  if (meaning & result.flags & 788968 && lastLocation.kind !== 318) {
                    useResult = result.flags & 262144 ? lastLocation === location.type || lastLocation.kind === 163 || lastLocation.kind === 162 : false;
                  }
                  if (meaning & result.flags & 3) {
                    if (useOuterVariableScopeInParameter(result, location, lastLocation)) {
                      useResult = false;
                    } else if (result.flags & 1) {
                      useResult = lastLocation.kind === 163 || lastLocation === location.type && !!ts2.findAncestor(result.valueDeclaration, ts2.isParameter);
                    }
                  }
                } else if (location.kind === 188) {
                  useResult = lastLocation === location.trueType;
                }
                if (useResult) {
                  break loop;
                } else {
                  result = void 0;
                }
              }
            }
            withinDeferredContext = withinDeferredContext || getIsDeferredContext(location, lastLocation);
            switch (location.kind) {
              case 303:
                if (!ts2.isExternalOrCommonJsModule(location))
                  break;
                isInExternalModule = true;
              case 260:
                var moduleExports = ((_a = getSymbolOfNode(location)) === null || _a === void 0 ? void 0 : _a.exports) || emptySymbols;
                if (location.kind === 303 || ts2.isModuleDeclaration(location) && location.flags & 8388608 && !ts2.isGlobalScopeAugmentation(location)) {
                  if (result = moduleExports.get("default")) {
                    var localSymbol = ts2.getLocalSymbolForExportDefault(result);
                    if (localSymbol && result.flags & meaning && localSymbol.escapedName === name) {
                      break loop;
                    }
                    result = void 0;
                  }
                  var moduleExport = moduleExports.get(name);
                  if (moduleExport && moduleExport.flags === 2097152 && (ts2.getDeclarationOfKind(moduleExport, 274) || ts2.getDeclarationOfKind(moduleExport, 273))) {
                    break;
                  }
                }
                if (name !== "default" && (result = lookup(moduleExports, name, meaning & 2623475))) {
                  if (ts2.isSourceFile(location) && location.commonJsModuleIndicator && !((_b = result.declarations) === null || _b === void 0 ? void 0 : _b.some(ts2.isJSDocTypeAlias))) {
                    result = void 0;
                  } else {
                    break loop;
                  }
                }
                break;
              case 259:
                if (result = lookup(((_c = getSymbolOfNode(location)) === null || _c === void 0 ? void 0 : _c.exports) || emptySymbols, name, meaning & 8)) {
                  break loop;
                }
                break;
              case 166:
                if (!ts2.isStatic(location)) {
                  var ctor = findConstructorDeclaration(location.parent);
                  if (ctor && ctor.locals) {
                    if (lookup(ctor.locals, name, meaning & 111551)) {
                      propertyWithInvalidInitializer = location;
                    }
                  }
                }
                break;
              case 256:
              case 225:
              case 257:
                if (result = lookup(getSymbolOfNode(location).members || emptySymbols, name, meaning & 788968)) {
                  if (!isTypeParameterSymbolDeclaredInContainer(result, location)) {
                    result = void 0;
                    break;
                  }
                  if (lastLocation && ts2.isStatic(lastLocation)) {
                    error(errorLocation, ts2.Diagnostics.Static_members_cannot_reference_class_type_parameters);
                    return void 0;
                  }
                  break loop;
                }
                if (location.kind === 225 && meaning & 32) {
                  var className = location.name;
                  if (className && name === className.escapedText) {
                    result = location.symbol;
                    break loop;
                  }
                }
                break;
              case 227:
                if (lastLocation === location.expression && location.parent.token === 94) {
                  var container = location.parent.parent;
                  if (ts2.isClassLike(container) && (result = lookup(getSymbolOfNode(container).members, name, meaning & 788968))) {
                    if (nameNotFoundMessage) {
                      error(errorLocation, ts2.Diagnostics.Base_class_expressions_cannot_reference_class_type_parameters);
                    }
                    return void 0;
                  }
                }
                break;
              case 161:
                grandparent = location.parent.parent;
                if (ts2.isClassLike(grandparent) || grandparent.kind === 257) {
                  if (result = lookup(getSymbolOfNode(grandparent).members, name, meaning & 788968)) {
                    error(errorLocation, ts2.Diagnostics.A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type);
                    return void 0;
                  }
                }
                break;
              case 213:
                if (ts2.getEmitScriptTarget(compilerOptions) >= 2) {
                  break;
                }
              case 168:
              case 170:
              case 171:
              case 172:
              case 255:
                if (meaning & 3 && name === "arguments") {
                  result = argumentsSymbol;
                  break loop;
                }
                break;
              case 212:
                if (meaning & 3 && name === "arguments") {
                  result = argumentsSymbol;
                  break loop;
                }
                if (meaning & 16) {
                  var functionName = location.name;
                  if (functionName && name === functionName.escapedText) {
                    result = location.symbol;
                    break loop;
                  }
                }
                break;
              case 164:
                if (location.parent && location.parent.kind === 163) {
                  location = location.parent;
                }
                if (location.parent && (ts2.isClassElement(location.parent) || location.parent.kind === 256)) {
                  location = location.parent;
                }
                break;
              case 343:
              case 336:
              case 337:
                var root = ts2.getJSDocRoot(location);
                if (root) {
                  location = root.parent;
                }
                break;
              case 163:
                if (lastLocation && (lastLocation === location.initializer || lastLocation === location.name && ts2.isBindingPattern(lastLocation))) {
                  if (!associatedDeclarationForContainingInitializerOrBindingName) {
                    associatedDeclarationForContainingInitializerOrBindingName = location;
                  }
                }
                break;
              case 202:
                if (lastLocation && (lastLocation === location.initializer || lastLocation === location.name && ts2.isBindingPattern(lastLocation))) {
                  if (ts2.isParameterDeclaration(location) && !associatedDeclarationForContainingInitializerOrBindingName) {
                    associatedDeclarationForContainingInitializerOrBindingName = location;
                  }
                }
                break;
              case 189:
                if (meaning & 262144) {
                  var parameterName = location.typeParameter.name;
                  if (parameterName && name === parameterName.escapedText) {
                    result = location.typeParameter.symbol;
                    break loop;
                  }
                }
                break;
            }
            if (isSelfReferenceLocation(location)) {
              lastSelfReferenceLocation = location;
            }
            lastLocation = location;
            location = ts2.isJSDocTemplateTag(location) ? ts2.getEffectiveContainerForJSDocTemplateTag(location) || location.parent : location.parent;
          }
        if (isUse && result && (!lastSelfReferenceLocation || result !== lastSelfReferenceLocation.symbol)) {
          result.isReferenced |= meaning;
        }
        if (!result) {
          if (lastLocation) {
            ts2.Debug.assert(lastLocation.kind === 303);
            if (lastLocation.commonJsModuleIndicator && name === "exports" && meaning & lastLocation.symbol.flags) {
              return lastLocation.symbol;
            }
          }
          if (!excludeGlobals) {
            result = lookup(globals, name, meaning);
          }
        }
        if (!result) {
          if (originalLocation && ts2.isInJSFile(originalLocation) && originalLocation.parent) {
            if (ts2.isRequireCall(originalLocation.parent, false)) {
              return requireSymbol;
            }
          }
        }
        if (!result) {
          if (nameNotFoundMessage && produceDiagnostics) {
            if (!errorLocation || !checkAndReportErrorForMissingPrefix(errorLocation, name, nameArg) && !checkAndReportErrorForExtendingInterface(errorLocation) && !checkAndReportErrorForUsingTypeAsNamespace(errorLocation, name, meaning) && !checkAndReportErrorForExportingPrimitiveType(errorLocation, name) && !checkAndReportErrorForUsingTypeAsValue(errorLocation, name, meaning) && !checkAndReportErrorForUsingNamespaceModuleAsValue(errorLocation, name, meaning) && !checkAndReportErrorForUsingValueAsType(errorLocation, name, meaning)) {
              var suggestion = void 0;
              if (getSpellingSuggestions && suggestionCount < maximumSuggestionCount) {
                suggestion = getSuggestedSymbolForNonexistentSymbol(originalLocation, name, meaning);
                var isGlobalScopeAugmentationDeclaration = (suggestion === null || suggestion === void 0 ? void 0 : suggestion.valueDeclaration) && ts2.isAmbientModule(suggestion.valueDeclaration) && ts2.isGlobalScopeAugmentation(suggestion.valueDeclaration);
                if (isGlobalScopeAugmentationDeclaration) {
                  suggestion = void 0;
                }
                if (suggestion) {
                  var suggestionName = symbolToString(suggestion);
                  var isUncheckedJS = isUncheckedJSSuggestion(originalLocation, suggestion, false);
                  var message = meaning === 1920 || nameArg && typeof nameArg !== "string" && ts2.nodeIsSynthesized(nameArg) ? ts2.Diagnostics.Cannot_find_namespace_0_Did_you_mean_1 : isUncheckedJS ? ts2.Diagnostics.Could_not_find_name_0_Did_you_mean_1 : ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_1;
                  var diagnostic = createError(errorLocation, message, diagnosticName(nameArg), suggestionName);
                  addErrorOrSuggestion(!isUncheckedJS, diagnostic);
                  if (suggestion.valueDeclaration) {
                    ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(suggestion.valueDeclaration, ts2.Diagnostics._0_is_declared_here, suggestionName));
                  }
                }
              }
              if (!suggestion) {
                if (nameArg) {
                  var lib = getSuggestedLibForNonExistentName(nameArg);
                  if (lib) {
                    error(errorLocation, nameNotFoundMessage, diagnosticName(nameArg), lib);
                  } else {
                    error(errorLocation, nameNotFoundMessage, diagnosticName(nameArg));
                  }
                }
              }
              suggestionCount++;
            }
          }
          return void 0;
        }
        if (nameNotFoundMessage && produceDiagnostics) {
          if (propertyWithInvalidInitializer && !(ts2.getEmitScriptTarget(compilerOptions) === 99 && useDefineForClassFields)) {
            var propertyName = propertyWithInvalidInitializer.name;
            error(errorLocation, ts2.Diagnostics.Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor, ts2.declarationNameToString(propertyName), diagnosticName(nameArg));
            return void 0;
          }
          if (errorLocation && (meaning & 2 || (meaning & 32 || meaning & 384) && (meaning & 111551) === 111551)) {
            var exportOrLocalSymbol = getExportSymbolOfValueSymbolIfExported(result);
            if (exportOrLocalSymbol.flags & 2 || exportOrLocalSymbol.flags & 32 || exportOrLocalSymbol.flags & 384) {
              checkResolvedBlockScopedVariable(exportOrLocalSymbol, errorLocation);
            }
          }
          if (result && isInExternalModule && (meaning & 111551) === 111551 && !(originalLocation.flags & 4194304)) {
            var merged = getMergedSymbol(result);
            if (ts2.length(merged.declarations) && ts2.every(merged.declarations, function(d) {
              return ts2.isNamespaceExportDeclaration(d) || ts2.isSourceFile(d) && !!d.symbol.globalExports;
            })) {
              errorOrSuggestion(!compilerOptions.allowUmdGlobalAccess, errorLocation, ts2.Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead, ts2.unescapeLeadingUnderscores(name));
            }
          }
          if (result && associatedDeclarationForContainingInitializerOrBindingName && !withinDeferredContext && (meaning & 111551) === 111551) {
            var candidate = getMergedSymbol(getLateBoundSymbol(result));
            var root = ts2.getRootDeclaration(associatedDeclarationForContainingInitializerOrBindingName);
            if (candidate === getSymbolOfNode(associatedDeclarationForContainingInitializerOrBindingName)) {
              error(errorLocation, ts2.Diagnostics.Parameter_0_cannot_reference_itself, ts2.declarationNameToString(associatedDeclarationForContainingInitializerOrBindingName.name));
            } else if (candidate.valueDeclaration && candidate.valueDeclaration.pos > associatedDeclarationForContainingInitializerOrBindingName.pos && root.parent.locals && lookup(root.parent.locals, candidate.escapedName, meaning) === candidate) {
              error(errorLocation, ts2.Diagnostics.Parameter_0_cannot_reference_identifier_1_declared_after_it, ts2.declarationNameToString(associatedDeclarationForContainingInitializerOrBindingName.name), ts2.declarationNameToString(errorLocation));
            }
          }
          if (result && errorLocation && meaning & 111551 && result.flags & 2097152) {
            checkSymbolUsageInExpressionContext(result, name, errorLocation);
          }
        }
        return result;
      }
      function checkSymbolUsageInExpressionContext(symbol, name, useSite) {
        if (!ts2.isValidTypeOnlyAliasUseSite(useSite)) {
          var typeOnlyDeclaration = getTypeOnlyAliasDeclaration(symbol);
          if (typeOnlyDeclaration) {
            var message = typeOnlyDeclaration.kind === 274 ? ts2.Diagnostics._0_cannot_be_used_as_a_value_because_it_was_exported_using_export_type : ts2.Diagnostics._0_cannot_be_used_as_a_value_because_it_was_imported_using_import_type;
            var unescapedName = ts2.unescapeLeadingUnderscores(name);
            addTypeOnlyDeclarationRelatedInfo(error(useSite, message, unescapedName), typeOnlyDeclaration, unescapedName);
          }
        }
      }
      function addTypeOnlyDeclarationRelatedInfo(diagnostic, typeOnlyDeclaration, unescapedName) {
        if (!typeOnlyDeclaration)
          return diagnostic;
        return ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(typeOnlyDeclaration, typeOnlyDeclaration.kind === 274 ? ts2.Diagnostics._0_was_exported_here : ts2.Diagnostics._0_was_imported_here, unescapedName));
      }
      function getIsDeferredContext(location, lastLocation) {
        if (location.kind !== 213 && location.kind !== 212) {
          return ts2.isTypeQueryNode(location) || (ts2.isFunctionLikeDeclaration(location) || location.kind === 166 && !ts2.isStatic(location)) && (!lastLocation || lastLocation !== location.name);
        }
        if (lastLocation && lastLocation === location.name) {
          return false;
        }
        if (location.asteriskToken || ts2.hasSyntacticModifier(location, 256)) {
          return true;
        }
        return !ts2.getImmediatelyInvokedFunctionExpression(location);
      }
      function isSelfReferenceLocation(node) {
        switch (node.kind) {
          case 255:
          case 256:
          case 257:
          case 259:
          case 258:
          case 260:
            return true;
          default:
            return false;
        }
      }
      function diagnosticName(nameArg) {
        return ts2.isString(nameArg) ? ts2.unescapeLeadingUnderscores(nameArg) : ts2.declarationNameToString(nameArg);
      }
      function isTypeParameterSymbolDeclaredInContainer(symbol, container) {
        if (symbol.declarations) {
          for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
            var decl = _a[_i];
            if (decl.kind === 162) {
              var parent = ts2.isJSDocTemplateTag(decl.parent) ? ts2.getJSDocHost(decl.parent) : decl.parent;
              if (parent === container) {
                return !(ts2.isJSDocTemplateTag(decl.parent) && ts2.find(decl.parent.parent.tags, ts2.isJSDocTypeAlias));
              }
            }
          }
        }
        return false;
      }
      function checkAndReportErrorForMissingPrefix(errorLocation, name, nameArg) {
        if (!ts2.isIdentifier(errorLocation) || errorLocation.escapedText !== name || isTypeReferenceIdentifier(errorLocation) || isInTypeQuery(errorLocation)) {
          return false;
        }
        var container = ts2.getThisContainer(errorLocation, false);
        var location = container;
        while (location) {
          if (ts2.isClassLike(location.parent)) {
            var classSymbol = getSymbolOfNode(location.parent);
            if (!classSymbol) {
              break;
            }
            var constructorType = getTypeOfSymbol(classSymbol);
            if (getPropertyOfType(constructorType, name)) {
              error(errorLocation, ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0, diagnosticName(nameArg), symbolToString(classSymbol));
              return true;
            }
            if (location === container && !ts2.isStatic(location)) {
              var instanceType = getDeclaredTypeOfSymbol(classSymbol).thisType;
              if (getPropertyOfType(instanceType, name)) {
                error(errorLocation, ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0, diagnosticName(nameArg));
                return true;
              }
            }
          }
          location = location.parent;
        }
        return false;
      }
      function checkAndReportErrorForExtendingInterface(errorLocation) {
        var expression = getEntityNameForExtendingInterface(errorLocation);
        if (expression && resolveEntityName(expression, 64, true)) {
          error(errorLocation, ts2.Diagnostics.Cannot_extend_an_interface_0_Did_you_mean_implements, ts2.getTextOfNode(expression));
          return true;
        }
        return false;
      }
      function getEntityNameForExtendingInterface(node) {
        switch (node.kind) {
          case 79:
          case 205:
            return node.parent ? getEntityNameForExtendingInterface(node.parent) : void 0;
          case 227:
            if (ts2.isEntityNameExpression(node.expression)) {
              return node.expression;
            }
          default:
            return void 0;
        }
      }
      function checkAndReportErrorForUsingTypeAsNamespace(errorLocation, name, meaning) {
        var namespaceMeaning = 1920 | (ts2.isInJSFile(errorLocation) ? 111551 : 0);
        if (meaning === namespaceMeaning) {
          var symbol = resolveSymbol(resolveName(errorLocation, name, 788968 & ~namespaceMeaning, void 0, void 0, false));
          var parent = errorLocation.parent;
          if (symbol) {
            if (ts2.isQualifiedName(parent)) {
              ts2.Debug.assert(parent.left === errorLocation, "Should only be resolving left side of qualified name as a namespace");
              var propName = parent.right.escapedText;
              var propType = getPropertyOfType(getDeclaredTypeOfSymbol(symbol), propName);
              if (propType) {
                error(parent, ts2.Diagnostics.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1, ts2.unescapeLeadingUnderscores(name), ts2.unescapeLeadingUnderscores(propName));
                return true;
              }
            }
            error(errorLocation, ts2.Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_namespace_here, ts2.unescapeLeadingUnderscores(name));
            return true;
          }
        }
        return false;
      }
      function checkAndReportErrorForUsingValueAsType(errorLocation, name, meaning) {
        if (meaning & (788968 & ~1920)) {
          var symbol = resolveSymbol(resolveName(errorLocation, name, ~788968 & 111551, void 0, void 0, false));
          if (symbol && !(symbol.flags & 1920)) {
            error(errorLocation, ts2.Diagnostics._0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0, ts2.unescapeLeadingUnderscores(name));
            return true;
          }
        }
        return false;
      }
      function isPrimitiveTypeName(name) {
        return name === "any" || name === "string" || name === "number" || name === "boolean" || name === "never" || name === "unknown";
      }
      function checkAndReportErrorForExportingPrimitiveType(errorLocation, name) {
        if (isPrimitiveTypeName(name) && errorLocation.parent.kind === 274) {
          error(errorLocation, ts2.Diagnostics.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, name);
          return true;
        }
        return false;
      }
      function checkAndReportErrorForUsingTypeAsValue(errorLocation, name, meaning) {
        if (meaning & (111551 & ~1024)) {
          if (isPrimitiveTypeName(name)) {
            error(errorLocation, ts2.Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here, ts2.unescapeLeadingUnderscores(name));
            return true;
          }
          var symbol = resolveSymbol(resolveName(errorLocation, name, 788968 & ~111551, void 0, void 0, false));
          if (symbol && !(symbol.flags & 1024)) {
            var rawName = ts2.unescapeLeadingUnderscores(name);
            if (isES2015OrLaterConstructorName(name)) {
              error(errorLocation, ts2.Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_es2015_or_later, rawName);
            } else if (maybeMappedType(errorLocation, symbol)) {
              error(errorLocation, ts2.Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0, rawName, rawName === "K" ? "P" : "K");
            } else {
              error(errorLocation, ts2.Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here, rawName);
            }
            return true;
          }
        }
        return false;
      }
      function maybeMappedType(node, symbol) {
        var container = ts2.findAncestor(node.parent, function(n) {
          return ts2.isComputedPropertyName(n) || ts2.isPropertySignature(n) ? false : ts2.isTypeLiteralNode(n) || "quit";
        });
        if (container && container.members.length === 1) {
          var type = getDeclaredTypeOfSymbol(symbol);
          return !!(type.flags & 1048576) && allTypesAssignableToKind(type, 384, true);
        }
        return false;
      }
      function isES2015OrLaterConstructorName(n) {
        switch (n) {
          case "Promise":
          case "Symbol":
          case "Map":
          case "WeakMap":
          case "Set":
          case "WeakSet":
            return true;
        }
        return false;
      }
      function checkAndReportErrorForUsingNamespaceModuleAsValue(errorLocation, name, meaning) {
        if (meaning & (111551 & ~1024 & ~788968)) {
          var symbol = resolveSymbol(resolveName(errorLocation, name, 1024 & ~111551, void 0, void 0, false));
          if (symbol) {
            error(errorLocation, ts2.Diagnostics.Cannot_use_namespace_0_as_a_value, ts2.unescapeLeadingUnderscores(name));
            return true;
          }
        } else if (meaning & (788968 & ~1024 & ~111551)) {
          var symbol = resolveSymbol(resolveName(errorLocation, name, (512 | 1024) & ~788968, void 0, void 0, false));
          if (symbol) {
            error(errorLocation, ts2.Diagnostics.Cannot_use_namespace_0_as_a_type, ts2.unescapeLeadingUnderscores(name));
            return true;
          }
        }
        return false;
      }
      function checkResolvedBlockScopedVariable(result, errorLocation) {
        var _a;
        ts2.Debug.assert(!!(result.flags & 2 || result.flags & 32 || result.flags & 384));
        if (result.flags & (16 | 1 | 67108864) && result.flags & 32) {
          return;
        }
        var declaration = (_a = result.declarations) === null || _a === void 0 ? void 0 : _a.find(function(d) {
          return ts2.isBlockOrCatchScoped(d) || ts2.isClassLike(d) || d.kind === 259;
        });
        if (declaration === void 0)
          return ts2.Debug.fail("checkResolvedBlockScopedVariable could not find block-scoped declaration");
        if (!(declaration.flags & 8388608) && !isBlockScopedNameDeclaredBeforeUse(declaration, errorLocation)) {
          var diagnosticMessage = void 0;
          var declarationName = ts2.declarationNameToString(ts2.getNameOfDeclaration(declaration));
          if (result.flags & 2) {
            diagnosticMessage = error(errorLocation, ts2.Diagnostics.Block_scoped_variable_0_used_before_its_declaration, declarationName);
          } else if (result.flags & 32) {
            diagnosticMessage = error(errorLocation, ts2.Diagnostics.Class_0_used_before_its_declaration, declarationName);
          } else if (result.flags & 256) {
            diagnosticMessage = error(errorLocation, ts2.Diagnostics.Enum_0_used_before_its_declaration, declarationName);
          } else {
            ts2.Debug.assert(!!(result.flags & 128));
            if (ts2.shouldPreserveConstEnums(compilerOptions)) {
              diagnosticMessage = error(errorLocation, ts2.Diagnostics.Enum_0_used_before_its_declaration, declarationName);
            }
          }
          if (diagnosticMessage) {
            ts2.addRelatedInfo(diagnosticMessage, ts2.createDiagnosticForNode(declaration, ts2.Diagnostics._0_is_declared_here, declarationName));
          }
        }
      }
      function isSameScopeDescendentOf(initial, parent, stopAt) {
        return !!parent && !!ts2.findAncestor(initial, function(n) {
          return n === stopAt || ts2.isFunctionLike(n) ? "quit" : n === parent;
        });
      }
      function getAnyImportSyntax(node) {
        switch (node.kind) {
          case 264:
            return node;
          case 266:
            return node.parent;
          case 267:
            return node.parent.parent;
          case 269:
            return node.parent.parent.parent;
          default:
            return void 0;
        }
      }
      function getDeclarationOfAliasSymbol(symbol) {
        return symbol.declarations && ts2.findLast(symbol.declarations, isAliasSymbolDeclaration);
      }
      function isAliasSymbolDeclaration(node) {
        return node.kind === 264 || node.kind === 263 || node.kind === 266 && !!node.name || node.kind === 267 || node.kind === 273 || node.kind === 269 || node.kind === 274 || node.kind === 270 && ts2.exportAssignmentIsAlias(node) || ts2.isBinaryExpression(node) && ts2.getAssignmentDeclarationKind(node) === 2 && ts2.exportAssignmentIsAlias(node) || ts2.isAccessExpression(node) && ts2.isBinaryExpression(node.parent) && node.parent.left === node && node.parent.operatorToken.kind === 63 && isAliasableOrJsExpression(node.parent.right) || node.kind === 295 || node.kind === 294 && isAliasableOrJsExpression(node.initializer) || ts2.isVariableDeclarationInitializedToBareOrAccessedRequire(node);
      }
      function isAliasableOrJsExpression(e) {
        return ts2.isAliasableExpression(e) || ts2.isFunctionExpression(e) && isJSConstructor(e);
      }
      function getTargetOfImportEqualsDeclaration(node, dontResolveAlias) {
        var commonJSPropertyAccess = getCommonJSPropertyAccess(node);
        if (commonJSPropertyAccess) {
          var name = ts2.getLeftmostAccessExpression(commonJSPropertyAccess.expression).arguments[0];
          return ts2.isIdentifier(commonJSPropertyAccess.name) ? resolveSymbol(getPropertyOfType(resolveExternalModuleTypeByLiteral(name), commonJSPropertyAccess.name.escapedText)) : void 0;
        }
        if (ts2.isVariableDeclaration(node) || node.moduleReference.kind === 276) {
          var immediate = resolveExternalModuleName(node, ts2.getExternalModuleRequireArgument(node) || ts2.getExternalModuleImportEqualsDeclarationExpression(node));
          var resolved_4 = resolveExternalModuleSymbol(immediate);
          markSymbolOfAliasDeclarationIfTypeOnly(node, immediate, resolved_4, false);
          return resolved_4;
        }
        var resolved = getSymbolOfPartOfRightHandSideOfImportEquals(node.moduleReference, dontResolveAlias);
        checkAndReportErrorForResolvingImportAliasToTypeOnlySymbol(node, resolved);
        return resolved;
      }
      function checkAndReportErrorForResolvingImportAliasToTypeOnlySymbol(node, resolved) {
        if (markSymbolOfAliasDeclarationIfTypeOnly(node, void 0, resolved, false) && !node.isTypeOnly) {
          var typeOnlyDeclaration = getTypeOnlyAliasDeclaration(getSymbolOfNode(node));
          var isExport = typeOnlyDeclaration.kind === 274;
          var message = isExport ? ts2.Diagnostics.An_import_alias_cannot_reference_a_declaration_that_was_exported_using_export_type : ts2.Diagnostics.An_import_alias_cannot_reference_a_declaration_that_was_imported_using_import_type;
          var relatedMessage = isExport ? ts2.Diagnostics._0_was_exported_here : ts2.Diagnostics._0_was_imported_here;
          var name = ts2.unescapeLeadingUnderscores(typeOnlyDeclaration.name.escapedText);
          ts2.addRelatedInfo(error(node.moduleReference, message), ts2.createDiagnosticForNode(typeOnlyDeclaration, relatedMessage, name));
        }
      }
      function resolveExportByName(moduleSymbol, name, sourceNode, dontResolveAlias) {
        var exportValue = moduleSymbol.exports.get("export=");
        var exportSymbol = exportValue ? getPropertyOfType(getTypeOfSymbol(exportValue), name) : moduleSymbol.exports.get(name);
        var resolved = resolveSymbol(exportSymbol, dontResolveAlias);
        markSymbolOfAliasDeclarationIfTypeOnly(sourceNode, exportSymbol, resolved, false);
        return resolved;
      }
      function isSyntacticDefault(node) {
        return ts2.isExportAssignment(node) && !node.isExportEquals || ts2.hasSyntacticModifier(node, 512) || ts2.isExportSpecifier(node);
      }
      function getUsageModeForExpression(usage) {
        return ts2.isStringLiteralLike(usage) ? ts2.getModeForUsageLocation(ts2.getSourceFileOfNode(usage), usage) : void 0;
      }
      function isESMFormatImportImportingCommonjsFormatFile(usageMode, targetMode) {
        return usageMode === ts2.ModuleKind.ESNext && targetMode === ts2.ModuleKind.CommonJS;
      }
      function isOnlyImportedAsDefault(usage) {
        var usageMode = getUsageModeForExpression(usage);
        return usageMode === ts2.ModuleKind.ESNext && ts2.endsWith(usage.text, ".json");
      }
      function canHaveSyntheticDefault(file, moduleSymbol, dontResolveAlias, usage) {
        var usageMode = file && getUsageModeForExpression(usage);
        if (file && usageMode !== void 0) {
          var result = isESMFormatImportImportingCommonjsFormatFile(usageMode, file.impliedNodeFormat);
          if (usageMode === ts2.ModuleKind.ESNext || result) {
            return result;
          }
        }
        if (!allowSyntheticDefaultImports) {
          return false;
        }
        if (!file || file.isDeclarationFile) {
          var defaultExportSymbol = resolveExportByName(moduleSymbol, "default", void 0, true);
          if (defaultExportSymbol && ts2.some(defaultExportSymbol.declarations, isSyntacticDefault)) {
            return false;
          }
          if (resolveExportByName(moduleSymbol, ts2.escapeLeadingUnderscores("__esModule"), void 0, dontResolveAlias)) {
            return false;
          }
          return true;
        }
        if (!ts2.isSourceFileJS(file)) {
          return hasExportAssignmentSymbol(moduleSymbol);
        }
        return !file.externalModuleIndicator && !resolveExportByName(moduleSymbol, ts2.escapeLeadingUnderscores("__esModule"), void 0, dontResolveAlias);
      }
      function getTargetOfImportClause(node, dontResolveAlias) {
        var _a;
        var moduleSymbol = resolveExternalModuleName(node, node.parent.moduleSpecifier);
        if (moduleSymbol) {
          var exportDefaultSymbol = void 0;
          if (ts2.isShorthandAmbientModuleSymbol(moduleSymbol)) {
            exportDefaultSymbol = moduleSymbol;
          } else {
            exportDefaultSymbol = resolveExportByName(moduleSymbol, "default", node, dontResolveAlias);
          }
          var file = (_a = moduleSymbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isSourceFile);
          var hasDefaultOnly = isOnlyImportedAsDefault(node.parent.moduleSpecifier);
          var hasSyntheticDefault = canHaveSyntheticDefault(file, moduleSymbol, dontResolveAlias, node.parent.moduleSpecifier);
          if (!exportDefaultSymbol && !hasSyntheticDefault && !hasDefaultOnly) {
            if (hasExportAssignmentSymbol(moduleSymbol)) {
              var compilerOptionName = moduleKind >= ts2.ModuleKind.ES2015 ? "allowSyntheticDefaultImports" : "esModuleInterop";
              var exportEqualsSymbol = moduleSymbol.exports.get("export=");
              var exportAssignment = exportEqualsSymbol.valueDeclaration;
              var err = error(node.name, ts2.Diagnostics.Module_0_can_only_be_default_imported_using_the_1_flag, symbolToString(moduleSymbol), compilerOptionName);
              if (exportAssignment) {
                ts2.addRelatedInfo(err, ts2.createDiagnosticForNode(exportAssignment, ts2.Diagnostics.This_module_is_declared_with_using_export_and_can_only_be_used_with_a_default_import_when_using_the_0_flag, compilerOptionName));
              }
            } else {
              reportNonDefaultExport(moduleSymbol, node);
            }
          } else if (hasSyntheticDefault || hasDefaultOnly) {
            var resolved = resolveExternalModuleSymbol(moduleSymbol, dontResolveAlias) || resolveSymbol(moduleSymbol, dontResolveAlias);
            markSymbolOfAliasDeclarationIfTypeOnly(node, moduleSymbol, resolved, false);
            return resolved;
          }
          markSymbolOfAliasDeclarationIfTypeOnly(node, exportDefaultSymbol, void 0, false);
          return exportDefaultSymbol;
        }
      }
      function reportNonDefaultExport(moduleSymbol, node) {
        var _a, _b, _c;
        if ((_a = moduleSymbol.exports) === null || _a === void 0 ? void 0 : _a.has(node.symbol.escapedName)) {
          error(node.name, ts2.Diagnostics.Module_0_has_no_default_export_Did_you_mean_to_use_import_1_from_0_instead, symbolToString(moduleSymbol), symbolToString(node.symbol));
        } else {
          var diagnostic = error(node.name, ts2.Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
          var exportStar = (_b = moduleSymbol.exports) === null || _b === void 0 ? void 0 : _b.get("__export");
          if (exportStar) {
            var defaultExport = (_c = exportStar.declarations) === null || _c === void 0 ? void 0 : _c.find(function(decl) {
              var _a2, _b2;
              return !!(ts2.isExportDeclaration(decl) && decl.moduleSpecifier && ((_b2 = (_a2 = resolveExternalModuleName(decl, decl.moduleSpecifier)) === null || _a2 === void 0 ? void 0 : _a2.exports) === null || _b2 === void 0 ? void 0 : _b2.has("default")));
            });
            if (defaultExport) {
              ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(defaultExport, ts2.Diagnostics.export_Asterisk_does_not_re_export_a_default));
            }
          }
        }
      }
      function getTargetOfNamespaceImport(node, dontResolveAlias) {
        var moduleSpecifier = node.parent.parent.moduleSpecifier;
        var immediate = resolveExternalModuleName(node, moduleSpecifier);
        var resolved = resolveESModuleSymbol(immediate, moduleSpecifier, dontResolveAlias, false);
        markSymbolOfAliasDeclarationIfTypeOnly(node, immediate, resolved, false);
        return resolved;
      }
      function getTargetOfNamespaceExport(node, dontResolveAlias) {
        var moduleSpecifier = node.parent.moduleSpecifier;
        var immediate = moduleSpecifier && resolveExternalModuleName(node, moduleSpecifier);
        var resolved = moduleSpecifier && resolveESModuleSymbol(immediate, moduleSpecifier, dontResolveAlias, false);
        markSymbolOfAliasDeclarationIfTypeOnly(node, immediate, resolved, false);
        return resolved;
      }
      function combineValueAndTypeSymbols(valueSymbol, typeSymbol) {
        if (valueSymbol === unknownSymbol && typeSymbol === unknownSymbol) {
          return unknownSymbol;
        }
        if (valueSymbol.flags & (788968 | 1920)) {
          return valueSymbol;
        }
        var result = createSymbol(valueSymbol.flags | typeSymbol.flags, valueSymbol.escapedName);
        result.declarations = ts2.deduplicate(ts2.concatenate(valueSymbol.declarations, typeSymbol.declarations), ts2.equateValues);
        result.parent = valueSymbol.parent || typeSymbol.parent;
        if (valueSymbol.valueDeclaration)
          result.valueDeclaration = valueSymbol.valueDeclaration;
        if (typeSymbol.members)
          result.members = new ts2.Map(typeSymbol.members);
        if (valueSymbol.exports)
          result.exports = new ts2.Map(valueSymbol.exports);
        return result;
      }
      function getExportOfModule(symbol, name, specifier, dontResolveAlias) {
        if (symbol.flags & 1536) {
          var exportSymbol = getExportsOfSymbol(symbol).get(name.escapedText);
          var resolved = resolveSymbol(exportSymbol, dontResolveAlias);
          markSymbolOfAliasDeclarationIfTypeOnly(specifier, exportSymbol, resolved, false);
          return resolved;
        }
      }
      function getPropertyOfVariable(symbol, name) {
        if (symbol.flags & 3) {
          var typeAnnotation = symbol.valueDeclaration.type;
          if (typeAnnotation) {
            return resolveSymbol(getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name));
          }
        }
      }
      function getExternalModuleMember(node, specifier, dontResolveAlias) {
        var _a, _b;
        if (dontResolveAlias === void 0) {
          dontResolveAlias = false;
        }
        var moduleSpecifier = ts2.getExternalModuleRequireArgument(node) || node.moduleSpecifier;
        var moduleSymbol = resolveExternalModuleName(node, moduleSpecifier);
        var name = !ts2.isPropertyAccessExpression(specifier) && specifier.propertyName || specifier.name;
        if (!ts2.isIdentifier(name)) {
          return void 0;
        }
        var suppressInteropError = name.escapedText === "default" && !!(compilerOptions.allowSyntheticDefaultImports || ts2.getESModuleInterop(compilerOptions));
        var targetSymbol = resolveESModuleSymbol(moduleSymbol, moduleSpecifier, false, suppressInteropError);
        if (targetSymbol) {
          if (name.escapedText) {
            if (ts2.isShorthandAmbientModuleSymbol(moduleSymbol)) {
              return moduleSymbol;
            }
            var symbolFromVariable = void 0;
            if (moduleSymbol && moduleSymbol.exports && moduleSymbol.exports.get("export=")) {
              symbolFromVariable = getPropertyOfType(getTypeOfSymbol(targetSymbol), name.escapedText, true);
            } else {
              symbolFromVariable = getPropertyOfVariable(targetSymbol, name.escapedText);
            }
            symbolFromVariable = resolveSymbol(symbolFromVariable, dontResolveAlias);
            var symbolFromModule = getExportOfModule(targetSymbol, name, specifier, dontResolveAlias);
            if (symbolFromModule === void 0 && name.escapedText === "default") {
              var file = (_a = moduleSymbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isSourceFile);
              if (isOnlyImportedAsDefault(moduleSpecifier) || canHaveSyntheticDefault(file, moduleSymbol, dontResolveAlias, moduleSpecifier)) {
                symbolFromModule = resolveExternalModuleSymbol(moduleSymbol, dontResolveAlias) || resolveSymbol(moduleSymbol, dontResolveAlias);
              }
            }
            var symbol = symbolFromModule && symbolFromVariable && symbolFromModule !== symbolFromVariable ? combineValueAndTypeSymbols(symbolFromVariable, symbolFromModule) : symbolFromModule || symbolFromVariable;
            if (!symbol) {
              var moduleName = getFullyQualifiedName(moduleSymbol, node);
              var declarationName = ts2.declarationNameToString(name);
              var suggestion = getSuggestedSymbolForNonexistentModule(name, targetSymbol);
              if (suggestion !== void 0) {
                var suggestionName = symbolToString(suggestion);
                var diagnostic = error(name, ts2.Diagnostics._0_has_no_exported_member_named_1_Did_you_mean_2, moduleName, declarationName, suggestionName);
                if (suggestion.valueDeclaration) {
                  ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(suggestion.valueDeclaration, ts2.Diagnostics._0_is_declared_here, suggestionName));
                }
              } else {
                if ((_b = moduleSymbol.exports) === null || _b === void 0 ? void 0 : _b.has("default")) {
                  error(name, ts2.Diagnostics.Module_0_has_no_exported_member_1_Did_you_mean_to_use_import_1_from_0_instead, moduleName, declarationName);
                } else {
                  reportNonExportedMember(node, name, declarationName, moduleSymbol, moduleName);
                }
              }
            }
            return symbol;
          }
        }
      }
      function reportNonExportedMember(node, name, declarationName, moduleSymbol, moduleName) {
        var _a, _b;
        var localSymbol = (_b = (_a = moduleSymbol.valueDeclaration) === null || _a === void 0 ? void 0 : _a.locals) === null || _b === void 0 ? void 0 : _b.get(name.escapedText);
        var exports = moduleSymbol.exports;
        if (localSymbol) {
          var exportedEqualsSymbol = exports === null || exports === void 0 ? void 0 : exports.get("export=");
          if (exportedEqualsSymbol) {
            getSymbolIfSameReference(exportedEqualsSymbol, localSymbol) ? reportInvalidImportEqualsExportMember(node, name, declarationName, moduleName) : error(name, ts2.Diagnostics.Module_0_has_no_exported_member_1, moduleName, declarationName);
          } else {
            var exportedSymbol = exports ? ts2.find(symbolsToArray(exports), function(symbol) {
              return !!getSymbolIfSameReference(symbol, localSymbol);
            }) : void 0;
            var diagnostic = exportedSymbol ? error(name, ts2.Diagnostics.Module_0_declares_1_locally_but_it_is_exported_as_2, moduleName, declarationName, symbolToString(exportedSymbol)) : error(name, ts2.Diagnostics.Module_0_declares_1_locally_but_it_is_not_exported, moduleName, declarationName);
            if (localSymbol.declarations) {
              ts2.addRelatedInfo.apply(void 0, __spreadArray([diagnostic], ts2.map(localSymbol.declarations, function(decl, index) {
                return ts2.createDiagnosticForNode(decl, index === 0 ? ts2.Diagnostics._0_is_declared_here : ts2.Diagnostics.and_here, declarationName);
              }), false));
            }
          }
        } else {
          error(name, ts2.Diagnostics.Module_0_has_no_exported_member_1, moduleName, declarationName);
        }
      }
      function reportInvalidImportEqualsExportMember(node, name, declarationName, moduleName) {
        if (moduleKind >= ts2.ModuleKind.ES2015) {
          var message = ts2.getESModuleInterop(compilerOptions) ? ts2.Diagnostics._0_can_only_be_imported_by_using_a_default_import : ts2.Diagnostics._0_can_only_be_imported_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import;
          error(name, message, declarationName);
        } else {
          if (ts2.isInJSFile(node)) {
            var message = ts2.getESModuleInterop(compilerOptions) ? ts2.Diagnostics._0_can_only_be_imported_by_using_a_require_call_or_by_using_a_default_import : ts2.Diagnostics._0_can_only_be_imported_by_using_a_require_call_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import;
            error(name, message, declarationName);
          } else {
            var message = ts2.getESModuleInterop(compilerOptions) ? ts2.Diagnostics._0_can_only_be_imported_by_using_import_1_require_2_or_a_default_import : ts2.Diagnostics._0_can_only_be_imported_by_using_import_1_require_2_or_by_turning_on_the_esModuleInterop_flag_and_using_a_default_import;
            error(name, message, declarationName, declarationName, moduleName);
          }
        }
      }
      function getTargetOfImportSpecifier(node, dontResolveAlias) {
        var root = ts2.isBindingElement(node) ? ts2.getRootDeclaration(node) : node.parent.parent.parent;
        var commonJSPropertyAccess = getCommonJSPropertyAccess(root);
        var resolved = getExternalModuleMember(root, commonJSPropertyAccess || node, dontResolveAlias);
        var name = node.propertyName || node.name;
        if (commonJSPropertyAccess && resolved && ts2.isIdentifier(name)) {
          return resolveSymbol(getPropertyOfType(getTypeOfSymbol(resolved), name.escapedText), dontResolveAlias);
        }
        markSymbolOfAliasDeclarationIfTypeOnly(node, void 0, resolved, false);
        return resolved;
      }
      function getCommonJSPropertyAccess(node) {
        if (ts2.isVariableDeclaration(node) && node.initializer && ts2.isPropertyAccessExpression(node.initializer)) {
          return node.initializer;
        }
      }
      function getTargetOfNamespaceExportDeclaration(node, dontResolveAlias) {
        var resolved = resolveExternalModuleSymbol(node.parent.symbol, dontResolveAlias);
        markSymbolOfAliasDeclarationIfTypeOnly(node, void 0, resolved, false);
        return resolved;
      }
      function getTargetOfExportSpecifier(node, meaning, dontResolveAlias) {
        var resolved = node.parent.parent.moduleSpecifier ? getExternalModuleMember(node.parent.parent, node, dontResolveAlias) : resolveEntityName(node.propertyName || node.name, meaning, false, dontResolveAlias);
        markSymbolOfAliasDeclarationIfTypeOnly(node, void 0, resolved, false);
        return resolved;
      }
      function getTargetOfExportAssignment(node, dontResolveAlias) {
        var expression = ts2.isExportAssignment(node) ? node.expression : node.right;
        var resolved = getTargetOfAliasLikeExpression(expression, dontResolveAlias);
        markSymbolOfAliasDeclarationIfTypeOnly(node, void 0, resolved, false);
        return resolved;
      }
      function getTargetOfAliasLikeExpression(expression, dontResolveAlias) {
        if (ts2.isClassExpression(expression)) {
          return checkExpressionCached(expression).symbol;
        }
        if (!ts2.isEntityName(expression) && !ts2.isEntityNameExpression(expression)) {
          return void 0;
        }
        var aliasLike = resolveEntityName(expression, 111551 | 788968 | 1920, true, dontResolveAlias);
        if (aliasLike) {
          return aliasLike;
        }
        checkExpressionCached(expression);
        return getNodeLinks(expression).resolvedSymbol;
      }
      function getTargetOfPropertyAssignment(node, dontRecursivelyResolve) {
        var expression = node.initializer;
        return getTargetOfAliasLikeExpression(expression, dontRecursivelyResolve);
      }
      function getTargetOfAccessExpression(node, dontRecursivelyResolve) {
        if (!(ts2.isBinaryExpression(node.parent) && node.parent.left === node && node.parent.operatorToken.kind === 63)) {
          return void 0;
        }
        return getTargetOfAliasLikeExpression(node.parent.right, dontRecursivelyResolve);
      }
      function getTargetOfAliasDeclaration(node, dontRecursivelyResolve) {
        if (dontRecursivelyResolve === void 0) {
          dontRecursivelyResolve = false;
        }
        switch (node.kind) {
          case 264:
          case 253:
            return getTargetOfImportEqualsDeclaration(node, dontRecursivelyResolve);
          case 266:
            return getTargetOfImportClause(node, dontRecursivelyResolve);
          case 267:
            return getTargetOfNamespaceImport(node, dontRecursivelyResolve);
          case 273:
            return getTargetOfNamespaceExport(node, dontRecursivelyResolve);
          case 269:
          case 202:
            return getTargetOfImportSpecifier(node, dontRecursivelyResolve);
          case 274:
            return getTargetOfExportSpecifier(node, 111551 | 788968 | 1920, dontRecursivelyResolve);
          case 270:
          case 220:
            return getTargetOfExportAssignment(node, dontRecursivelyResolve);
          case 263:
            return getTargetOfNamespaceExportDeclaration(node, dontRecursivelyResolve);
          case 295:
            return resolveEntityName(node.name, 111551 | 788968 | 1920, true, dontRecursivelyResolve);
          case 294:
            return getTargetOfPropertyAssignment(node, dontRecursivelyResolve);
          case 206:
          case 205:
            return getTargetOfAccessExpression(node, dontRecursivelyResolve);
          default:
            return ts2.Debug.fail();
        }
      }
      function isNonLocalAlias(symbol, excludes) {
        if (excludes === void 0) {
          excludes = 111551 | 788968 | 1920;
        }
        if (!symbol)
          return false;
        return (symbol.flags & (2097152 | excludes)) === 2097152 || !!(symbol.flags & 2097152 && symbol.flags & 67108864);
      }
      function resolveSymbol(symbol, dontResolveAlias) {
        return !dontResolveAlias && isNonLocalAlias(symbol) ? resolveAlias(symbol) : symbol;
      }
      function resolveAlias(symbol) {
        ts2.Debug.assert((symbol.flags & 2097152) !== 0, "Should only get Alias here.");
        var links = getSymbolLinks(symbol);
        if (!links.target) {
          links.target = resolvingSymbol;
          var node = getDeclarationOfAliasSymbol(symbol);
          if (!node)
            return ts2.Debug.fail();
          var target = getTargetOfAliasDeclaration(node);
          if (links.target === resolvingSymbol) {
            links.target = target || unknownSymbol;
          } else {
            error(node, ts2.Diagnostics.Circular_definition_of_import_alias_0, symbolToString(symbol));
          }
        } else if (links.target === resolvingSymbol) {
          links.target = unknownSymbol;
        }
        return links.target;
      }
      function tryResolveAlias(symbol) {
        var links = getSymbolLinks(symbol);
        if (links.target !== resolvingSymbol) {
          return resolveAlias(symbol);
        }
        return void 0;
      }
      function markSymbolOfAliasDeclarationIfTypeOnly(aliasDeclaration, immediateTarget, finalTarget, overwriteEmpty) {
        if (!aliasDeclaration || ts2.isPropertyAccessExpression(aliasDeclaration))
          return false;
        var sourceSymbol = getSymbolOfNode(aliasDeclaration);
        if (ts2.isTypeOnlyImportOrExportDeclaration(aliasDeclaration)) {
          var links_1 = getSymbolLinks(sourceSymbol);
          links_1.typeOnlyDeclaration = aliasDeclaration;
          return true;
        }
        var links = getSymbolLinks(sourceSymbol);
        return markSymbolOfAliasDeclarationIfTypeOnlyWorker(links, immediateTarget, overwriteEmpty) || markSymbolOfAliasDeclarationIfTypeOnlyWorker(links, finalTarget, overwriteEmpty);
      }
      function markSymbolOfAliasDeclarationIfTypeOnlyWorker(aliasDeclarationLinks, target, overwriteEmpty) {
        var _a, _b, _c;
        if (target && (aliasDeclarationLinks.typeOnlyDeclaration === void 0 || overwriteEmpty && aliasDeclarationLinks.typeOnlyDeclaration === false)) {
          var exportSymbol = (_b = (_a = target.exports) === null || _a === void 0 ? void 0 : _a.get("export=")) !== null && _b !== void 0 ? _b : target;
          var typeOnly = exportSymbol.declarations && ts2.find(exportSymbol.declarations, ts2.isTypeOnlyImportOrExportDeclaration);
          aliasDeclarationLinks.typeOnlyDeclaration = (_c = typeOnly !== null && typeOnly !== void 0 ? typeOnly : getSymbolLinks(exportSymbol).typeOnlyDeclaration) !== null && _c !== void 0 ? _c : false;
        }
        return !!aliasDeclarationLinks.typeOnlyDeclaration;
      }
      function getTypeOnlyAliasDeclaration(symbol) {
        if (!(symbol.flags & 2097152)) {
          return void 0;
        }
        var links = getSymbolLinks(symbol);
        return links.typeOnlyDeclaration || void 0;
      }
      function markExportAsReferenced(node) {
        var symbol = getSymbolOfNode(node);
        var target = resolveAlias(symbol);
        if (target) {
          var markAlias = target === unknownSymbol || target.flags & 111551 && !isConstEnumOrConstEnumOnlyModule(target) && !getTypeOnlyAliasDeclaration(symbol);
          if (markAlias) {
            markAliasSymbolAsReferenced(symbol);
          }
        }
      }
      function markAliasSymbolAsReferenced(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.referenced) {
          links.referenced = true;
          var node = getDeclarationOfAliasSymbol(symbol);
          if (!node)
            return ts2.Debug.fail();
          if (ts2.isInternalModuleImportEqualsDeclaration(node)) {
            var target = resolveSymbol(symbol);
            if (target === unknownSymbol || target.flags & 111551) {
              checkExpressionCached(node.moduleReference);
            }
          }
        }
      }
      function markConstEnumAliasAsReferenced(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.constEnumReferenced) {
          links.constEnumReferenced = true;
        }
      }
      function getSymbolOfPartOfRightHandSideOfImportEquals(entityName, dontResolveAlias) {
        if (entityName.kind === 79 && ts2.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
          entityName = entityName.parent;
        }
        if (entityName.kind === 79 || entityName.parent.kind === 160) {
          return resolveEntityName(entityName, 1920, false, dontResolveAlias);
        } else {
          ts2.Debug.assert(entityName.parent.kind === 264);
          return resolveEntityName(entityName, 111551 | 788968 | 1920, false, dontResolveAlias);
        }
      }
      function getFullyQualifiedName(symbol, containingLocation) {
        return symbol.parent ? getFullyQualifiedName(symbol.parent, containingLocation) + "." + symbolToString(symbol) : symbolToString(symbol, containingLocation, void 0, 16 | 4);
      }
      function getContainingQualifiedNameNode(node) {
        while (ts2.isQualifiedName(node.parent)) {
          node = node.parent;
        }
        return node;
      }
      function tryGetQualifiedNameAsValue(node) {
        var left = ts2.getFirstIdentifier(node);
        var symbol = resolveName(left, left.escapedText, 111551, void 0, left, true);
        if (!symbol) {
          return void 0;
        }
        while (ts2.isQualifiedName(left.parent)) {
          var type = getTypeOfSymbol(symbol);
          symbol = getPropertyOfType(type, left.parent.right.escapedText);
          if (!symbol) {
            return void 0;
          }
          left = left.parent;
        }
        return symbol;
      }
      function resolveEntityName(name, meaning, ignoreErrors, dontResolveAlias, location) {
        if (ts2.nodeIsMissing(name)) {
          return void 0;
        }
        var namespaceMeaning = 1920 | (ts2.isInJSFile(name) ? meaning & 111551 : 0);
        var symbol;
        if (name.kind === 79) {
          var message = meaning === namespaceMeaning || ts2.nodeIsSynthesized(name) ? ts2.Diagnostics.Cannot_find_namespace_0 : getCannotFindNameDiagnosticForName(ts2.getFirstIdentifier(name));
          var symbolFromJSPrototype = ts2.isInJSFile(name) && !ts2.nodeIsSynthesized(name) ? resolveEntityNameFromAssignmentDeclaration(name, meaning) : void 0;
          symbol = getMergedSymbol(resolveName(location || name, name.escapedText, meaning, ignoreErrors || symbolFromJSPrototype ? void 0 : message, name, true, false));
          if (!symbol) {
            return getMergedSymbol(symbolFromJSPrototype);
          }
        } else if (name.kind === 160 || name.kind === 205) {
          var left = name.kind === 160 ? name.left : name.expression;
          var right = name.kind === 160 ? name.right : name.name;
          var namespace = resolveEntityName(left, namespaceMeaning, ignoreErrors, false, location);
          if (!namespace || ts2.nodeIsMissing(right)) {
            return void 0;
          } else if (namespace === unknownSymbol) {
            return namespace;
          }
          if (namespace.valueDeclaration && ts2.isInJSFile(namespace.valueDeclaration) && ts2.isVariableDeclaration(namespace.valueDeclaration) && namespace.valueDeclaration.initializer && isCommonJsRequire(namespace.valueDeclaration.initializer)) {
            var moduleName = namespace.valueDeclaration.initializer.arguments[0];
            var moduleSym = resolveExternalModuleName(moduleName, moduleName);
            if (moduleSym) {
              var resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym);
              if (resolvedModuleSymbol) {
                namespace = resolvedModuleSymbol;
              }
            }
          }
          symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(namespace), right.escapedText, meaning));
          if (!symbol) {
            if (!ignoreErrors) {
              var namespaceName = getFullyQualifiedName(namespace);
              var declarationName = ts2.declarationNameToString(right);
              var suggestionForNonexistentModule = getSuggestedSymbolForNonexistentModule(right, namespace);
              if (suggestionForNonexistentModule) {
                error(right, ts2.Diagnostics._0_has_no_exported_member_named_1_Did_you_mean_2, namespaceName, declarationName, symbolToString(suggestionForNonexistentModule));
                return void 0;
              }
              var containingQualifiedName = ts2.isQualifiedName(name) && getContainingQualifiedNameNode(name);
              var canSuggestTypeof = globalObjectType && meaning & 788968 && containingQualifiedName && !ts2.isTypeOfExpression(containingQualifiedName.parent) && tryGetQualifiedNameAsValue(containingQualifiedName);
              if (canSuggestTypeof) {
                error(containingQualifiedName, ts2.Diagnostics._0_refers_to_a_value_but_is_being_used_as_a_type_here_Did_you_mean_typeof_0, ts2.entityNameToString(containingQualifiedName));
                return void 0;
              }
              if (meaning & 1920 && ts2.isQualifiedName(name.parent)) {
                var exportedTypeSymbol = getMergedSymbol(getSymbol(getExportsOfSymbol(namespace), right.escapedText, 788968));
                if (exportedTypeSymbol) {
                  error(name.parent.right, ts2.Diagnostics.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1, symbolToString(exportedTypeSymbol), ts2.unescapeLeadingUnderscores(name.parent.right.escapedText));
                  return void 0;
                }
              }
              error(right, ts2.Diagnostics.Namespace_0_has_no_exported_member_1, namespaceName, declarationName);
            }
            return void 0;
          }
        } else {
          throw ts2.Debug.assertNever(name, "Unknown entity name kind.");
        }
        ts2.Debug.assert((ts2.getCheckFlags(symbol) & 1) === 0, "Should never get an instantiated symbol here.");
        if (!ts2.nodeIsSynthesized(name) && ts2.isEntityName(name) && (symbol.flags & 2097152 || name.parent.kind === 270)) {
          markSymbolOfAliasDeclarationIfTypeOnly(ts2.getAliasDeclarationFromName(name), symbol, void 0, true);
        }
        return symbol.flags & meaning || dontResolveAlias ? symbol : resolveAlias(symbol);
      }
      function resolveEntityNameFromAssignmentDeclaration(name, meaning) {
        if (isJSDocTypeReference(name.parent)) {
          var secondaryLocation = getAssignmentDeclarationLocation(name.parent);
          if (secondaryLocation) {
            return resolveName(secondaryLocation, name.escapedText, meaning, void 0, name, true);
          }
        }
      }
      function getAssignmentDeclarationLocation(node) {
        var typeAlias = ts2.findAncestor(node, function(node2) {
          return !(ts2.isJSDocNode(node2) || node2.flags & 4194304) ? "quit" : ts2.isJSDocTypeAlias(node2);
        });
        if (typeAlias) {
          return;
        }
        var host2 = ts2.getJSDocHost(node);
        if (host2 && ts2.isExpressionStatement(host2) && ts2.isBinaryExpression(host2.expression) && ts2.getAssignmentDeclarationKind(host2.expression) === 3) {
          var symbol = getSymbolOfNode(host2.expression.left);
          if (symbol) {
            return getDeclarationOfJSPrototypeContainer(symbol);
          }
        }
        if (host2 && (ts2.isObjectLiteralMethod(host2) || ts2.isPropertyAssignment(host2)) && ts2.isBinaryExpression(host2.parent.parent) && ts2.getAssignmentDeclarationKind(host2.parent.parent) === 6) {
          var symbol = getSymbolOfNode(host2.parent.parent.left);
          if (symbol) {
            return getDeclarationOfJSPrototypeContainer(symbol);
          }
        }
        var sig = ts2.getEffectiveJSDocHost(node);
        if (sig && ts2.isFunctionLike(sig)) {
          var symbol = getSymbolOfNode(sig);
          return symbol && symbol.valueDeclaration;
        }
      }
      function getDeclarationOfJSPrototypeContainer(symbol) {
        var decl = symbol.parent.valueDeclaration;
        if (!decl) {
          return void 0;
        }
        var initializer = ts2.isAssignmentDeclaration(decl) ? ts2.getAssignedExpandoInitializer(decl) : ts2.hasOnlyExpressionInitializer(decl) ? ts2.getDeclaredExpandoInitializer(decl) : void 0;
        return initializer || decl;
      }
      function getExpandoSymbol(symbol) {
        var decl = symbol.valueDeclaration;
        if (!decl || !ts2.isInJSFile(decl) || symbol.flags & 524288 || ts2.getExpandoInitializer(decl, false)) {
          return void 0;
        }
        var init = ts2.isVariableDeclaration(decl) ? ts2.getDeclaredExpandoInitializer(decl) : ts2.getAssignedExpandoInitializer(decl);
        if (init) {
          var initSymbol = getSymbolOfNode(init);
          if (initSymbol) {
            return mergeJSSymbols(initSymbol, symbol);
          }
        }
      }
      function resolveExternalModuleName(location, moduleReferenceExpression, ignoreErrors) {
        var isClassic = ts2.getEmitModuleResolutionKind(compilerOptions) === ts2.ModuleResolutionKind.Classic;
        var errorMessage = isClassic ? ts2.Diagnostics.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_node_or_to_add_aliases_to_the_paths_option : ts2.Diagnostics.Cannot_find_module_0_or_its_corresponding_type_declarations;
        return resolveExternalModuleNameWorker(location, moduleReferenceExpression, ignoreErrors ? void 0 : errorMessage);
      }
      function resolveExternalModuleNameWorker(location, moduleReferenceExpression, moduleNotFoundError, isForAugmentation) {
        if (isForAugmentation === void 0) {
          isForAugmentation = false;
        }
        return ts2.isStringLiteralLike(moduleReferenceExpression) ? resolveExternalModule(location, moduleReferenceExpression.text, moduleNotFoundError, moduleReferenceExpression, isForAugmentation) : void 0;
      }
      function resolveExternalModule(location, moduleReference, moduleNotFoundError, errorNode, isForAugmentation) {
        var _a, _b, _c, _d, _e, _f, _g;
        if (isForAugmentation === void 0) {
          isForAugmentation = false;
        }
        if (ts2.startsWith(moduleReference, "@types/")) {
          var diag = ts2.Diagnostics.Cannot_import_type_declaration_files_Consider_importing_0_instead_of_1;
          var withoutAtTypePrefix = ts2.removePrefix(moduleReference, "@types/");
          error(errorNode, diag, withoutAtTypePrefix, moduleReference);
        }
        var ambientModule = tryFindAmbientModule(moduleReference, true);
        if (ambientModule) {
          return ambientModule;
        }
        var currentSourceFile = ts2.getSourceFileOfNode(location);
        var contextSpecifier = ts2.isStringLiteralLike(location) ? location : ((_a = ts2.findAncestor(location, ts2.isImportCall)) === null || _a === void 0 ? void 0 : _a.arguments[0]) || ((_b = ts2.findAncestor(location, ts2.isImportDeclaration)) === null || _b === void 0 ? void 0 : _b.moduleSpecifier) || ((_c = ts2.findAncestor(location, ts2.isExternalModuleImportEqualsDeclaration)) === null || _c === void 0 ? void 0 : _c.moduleReference.expression) || ((_d = ts2.findAncestor(location, ts2.isExportDeclaration)) === null || _d === void 0 ? void 0 : _d.moduleSpecifier) || ((_e = ts2.isModuleDeclaration(location) ? location : location.parent && ts2.isModuleDeclaration(location.parent) && location.parent.name === location ? location.parent : void 0) === null || _e === void 0 ? void 0 : _e.name) || ((_f = ts2.isLiteralImportTypeNode(location) ? location : void 0) === null || _f === void 0 ? void 0 : _f.argument.literal);
        var mode = contextSpecifier && ts2.isStringLiteralLike(contextSpecifier) ? ts2.getModeForUsageLocation(currentSourceFile, contextSpecifier) : currentSourceFile.impliedNodeFormat;
        var resolvedModule = ts2.getResolvedModule(currentSourceFile, moduleReference, mode);
        var resolutionDiagnostic = resolvedModule && ts2.getResolutionDiagnostic(compilerOptions, resolvedModule);
        var sourceFile = resolvedModule && !resolutionDiagnostic && host.getSourceFile(resolvedModule.resolvedFileName);
        if (sourceFile) {
          if (sourceFile.symbol) {
            if (resolvedModule.isExternalLibraryImport && !ts2.resolutionExtensionIsTSOrJson(resolvedModule.extension)) {
              errorOnImplicitAnyModule(false, errorNode, resolvedModule, moduleReference);
            }
            if (ts2.getEmitModuleResolutionKind(compilerOptions) === ts2.ModuleResolutionKind.Node12 || ts2.getEmitModuleResolutionKind(compilerOptions) === ts2.ModuleResolutionKind.NodeNext) {
              var isSyncImport = currentSourceFile.impliedNodeFormat === ts2.ModuleKind.CommonJS && !ts2.findAncestor(location, ts2.isImportCall) || !!ts2.findAncestor(location, ts2.isImportEqualsDeclaration);
              if (isSyncImport && sourceFile.impliedNodeFormat === ts2.ModuleKind.ESNext) {
                error(errorNode, ts2.Diagnostics.Module_0_cannot_be_imported_using_this_construct_The_specifier_only_resolves_to_an_ES_module_which_cannot_be_imported_synchronously_Use_dynamic_import_instead, moduleReference);
              }
              if (mode === ts2.ModuleKind.ESNext && compilerOptions.resolveJsonModule && resolvedModule.extension === ".json") {
                error(errorNode, ts2.Diagnostics.JSON_imports_are_experimental_in_ES_module_mode_imports);
              }
            }
            return getMergedSymbol(sourceFile.symbol);
          }
          if (moduleNotFoundError) {
            error(errorNode, ts2.Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
          }
          return void 0;
        }
        if (patternAmbientModules) {
          var pattern = ts2.findBestPatternMatch(patternAmbientModules, function(_) {
            return _.pattern;
          }, moduleReference);
          if (pattern) {
            var augmentation = patternAmbientModuleAugmentations && patternAmbientModuleAugmentations.get(moduleReference);
            if (augmentation) {
              return getMergedSymbol(augmentation);
            }
            return getMergedSymbol(pattern.symbol);
          }
        }
        if (resolvedModule && !ts2.resolutionExtensionIsTSOrJson(resolvedModule.extension) && resolutionDiagnostic === void 0 || resolutionDiagnostic === ts2.Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type) {
          if (isForAugmentation) {
            var diag = ts2.Diagnostics.Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented;
            error(errorNode, diag, moduleReference, resolvedModule.resolvedFileName);
          } else {
            errorOnImplicitAnyModule(noImplicitAny && !!moduleNotFoundError, errorNode, resolvedModule, moduleReference);
          }
          return void 0;
        }
        if (moduleNotFoundError) {
          if (resolvedModule) {
            var redirect = host.getProjectReferenceRedirect(resolvedModule.resolvedFileName);
            if (redirect) {
              error(errorNode, ts2.Diagnostics.Output_file_0_has_not_been_built_from_source_file_1, redirect, resolvedModule.resolvedFileName);
              return void 0;
            }
          }
          if (resolutionDiagnostic) {
            error(errorNode, resolutionDiagnostic, moduleReference, resolvedModule.resolvedFileName);
          } else {
            var tsExtension = ts2.tryExtractTSExtension(moduleReference);
            var isExtensionlessRelativePathImport = ts2.pathIsRelative(moduleReference) && !ts2.hasExtension(moduleReference);
            var moduleResolutionKind = ts2.getEmitModuleResolutionKind(compilerOptions);
            var resolutionIsNode12OrNext = moduleResolutionKind === ts2.ModuleResolutionKind.Node12 || moduleResolutionKind === ts2.ModuleResolutionKind.NodeNext;
            if (tsExtension) {
              var diag = ts2.Diagnostics.An_import_path_cannot_end_with_a_0_extension_Consider_importing_1_instead;
              var importSourceWithoutExtension = ts2.removeExtension(moduleReference, tsExtension);
              var replacedImportSource = importSourceWithoutExtension;
              if (moduleKind >= ts2.ModuleKind.ES2015) {
                replacedImportSource += tsExtension === ".mts" ? ".mjs" : tsExtension === ".cts" ? ".cjs" : ".js";
              }
              error(errorNode, diag, tsExtension, replacedImportSource);
            } else if (!compilerOptions.resolveJsonModule && ts2.fileExtensionIs(moduleReference, ".json") && ts2.getEmitModuleResolutionKind(compilerOptions) !== ts2.ModuleResolutionKind.Classic && ts2.hasJsonModuleEmitEnabled(compilerOptions)) {
              error(errorNode, ts2.Diagnostics.Cannot_find_module_0_Consider_using_resolveJsonModule_to_import_module_with_json_extension, moduleReference);
            } else if (mode === ts2.ModuleKind.ESNext && resolutionIsNode12OrNext && isExtensionlessRelativePathImport) {
              var absoluteRef_1 = ts2.getNormalizedAbsolutePath(moduleReference, ts2.getDirectoryPath(currentSourceFile.path));
              var suggestedExt = (_g = suggestedExtensions.find(function(_a2) {
                var actualExt = _a2[0], _importExt = _a2[1];
                return host.fileExists(absoluteRef_1 + actualExt);
              })) === null || _g === void 0 ? void 0 : _g[1];
              if (suggestedExt) {
                error(errorNode, ts2.Diagnostics.Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node12_or_nodenext_Did_you_mean_0, moduleReference + suggestedExt);
              } else {
                error(errorNode, ts2.Diagnostics.Relative_import_paths_need_explicit_file_extensions_in_EcmaScript_imports_when_moduleResolution_is_node12_or_nodenext_Consider_adding_an_extension_to_the_import_path);
              }
            } else {
              error(errorNode, moduleNotFoundError, moduleReference);
            }
          }
        }
        return void 0;
      }
      function errorOnImplicitAnyModule(isError, errorNode, _a, moduleReference) {
        var packageId = _a.packageId, resolvedFileName = _a.resolvedFileName;
        var errorInfo = !ts2.isExternalModuleNameRelative(moduleReference) && packageId ? typesPackageExists(packageId.name) ? ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.If_the_0_package_actually_exposes_this_module_consider_sending_a_pull_request_to_amend_https_Colon_Slash_Slashgithub_com_SlashDefinitelyTyped_SlashDefinitelyTyped_Slashtree_Slashmaster_Slashtypes_Slash_1, packageId.name, ts2.mangleScopedPackageName(packageId.name)) : packageBundlesTypes(packageId.name) ? ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.If_the_0_package_actually_exposes_this_module_try_adding_a_new_declaration_d_ts_file_containing_declare_module_1, packageId.name, moduleReference) : ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Try_npm_i_save_dev_types_Slash_1_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0, moduleReference, ts2.mangleScopedPackageName(packageId.name)) : void 0;
        errorOrSuggestion(isError, errorNode, ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type, moduleReference, resolvedFileName));
      }
      function typesPackageExists(packageName) {
        return getPackagesMap().has(ts2.getTypesPackageName(packageName));
      }
      function packageBundlesTypes(packageName) {
        return !!getPackagesMap().get(packageName);
      }
      function resolveExternalModuleSymbol(moduleSymbol, dontResolveAlias) {
        if (moduleSymbol === null || moduleSymbol === void 0 ? void 0 : moduleSymbol.exports) {
          var exportEquals = resolveSymbol(moduleSymbol.exports.get("export="), dontResolveAlias);
          var exported = getCommonJsExportEquals(getMergedSymbol(exportEquals), getMergedSymbol(moduleSymbol));
          return getMergedSymbol(exported) || moduleSymbol;
        }
        return void 0;
      }
      function getCommonJsExportEquals(exported, moduleSymbol) {
        if (!exported || exported === unknownSymbol || exported === moduleSymbol || moduleSymbol.exports.size === 1 || exported.flags & 2097152) {
          return exported;
        }
        var links = getSymbolLinks(exported);
        if (links.cjsExportMerged) {
          return links.cjsExportMerged;
        }
        var merged = exported.flags & 33554432 ? exported : cloneSymbol(exported);
        merged.flags = merged.flags | 512;
        if (merged.exports === void 0) {
          merged.exports = ts2.createSymbolTable();
        }
        moduleSymbol.exports.forEach(function(s, name) {
          if (name === "export=")
            return;
          merged.exports.set(name, merged.exports.has(name) ? mergeSymbol(merged.exports.get(name), s) : s);
        });
        getSymbolLinks(merged).cjsExportMerged = merged;
        return links.cjsExportMerged = merged;
      }
      function resolveESModuleSymbol(moduleSymbol, referencingLocation, dontResolveAlias, suppressInteropError) {
        var symbol = resolveExternalModuleSymbol(moduleSymbol, dontResolveAlias);
        if (!dontResolveAlias && symbol) {
          if (!suppressInteropError && !(symbol.flags & (1536 | 3)) && !ts2.getDeclarationOfKind(symbol, 303)) {
            var compilerOptionName = moduleKind >= ts2.ModuleKind.ES2015 ? "allowSyntheticDefaultImports" : "esModuleInterop";
            error(referencingLocation, ts2.Diagnostics.This_module_can_only_be_referenced_with_ECMAScript_imports_Slashexports_by_turning_on_the_0_flag_and_referencing_its_default_export, compilerOptionName);
            return symbol;
          }
          var referenceParent = referencingLocation.parent;
          if (ts2.isImportDeclaration(referenceParent) && ts2.getNamespaceDeclarationNode(referenceParent) || ts2.isImportCall(referenceParent)) {
            var reference = ts2.isImportCall(referenceParent) ? referenceParent.arguments[0] : referenceParent.moduleSpecifier;
            var type = getTypeOfSymbol(symbol);
            var defaultOnlyType = getTypeWithSyntheticDefaultOnly(type, symbol, moduleSymbol, reference);
            if (defaultOnlyType) {
              return cloneTypeAsModuleType(symbol, defaultOnlyType, referenceParent);
            }
            if (ts2.getESModuleInterop(compilerOptions)) {
              var sigs = getSignaturesOfStructuredType(type, 0);
              if (!sigs || !sigs.length) {
                sigs = getSignaturesOfStructuredType(type, 1);
              }
              if (sigs && sigs.length || getPropertyOfType(type, "default", true)) {
                var moduleType = getTypeWithSyntheticDefaultImportType(type, symbol, moduleSymbol, reference);
                return cloneTypeAsModuleType(symbol, moduleType, referenceParent);
              }
            }
          }
        }
        return symbol;
      }
      function cloneTypeAsModuleType(symbol, moduleType, referenceParent) {
        var result = createSymbol(symbol.flags, symbol.escapedName);
        result.declarations = symbol.declarations ? symbol.declarations.slice() : [];
        result.parent = symbol.parent;
        result.target = symbol;
        result.originatingImport = referenceParent;
        if (symbol.valueDeclaration)
          result.valueDeclaration = symbol.valueDeclaration;
        if (symbol.constEnumOnlyModule)
          result.constEnumOnlyModule = true;
        if (symbol.members)
          result.members = new ts2.Map(symbol.members);
        if (symbol.exports)
          result.exports = new ts2.Map(symbol.exports);
        var resolvedModuleType = resolveStructuredTypeMembers(moduleType);
        result.type = createAnonymousType(result, resolvedModuleType.members, ts2.emptyArray, ts2.emptyArray, resolvedModuleType.indexInfos);
        return result;
      }
      function hasExportAssignmentSymbol(moduleSymbol) {
        return moduleSymbol.exports.get("export=") !== void 0;
      }
      function getExportsOfModuleAsArray(moduleSymbol) {
        return symbolsToArray(getExportsOfModule(moduleSymbol));
      }
      function getExportsAndPropertiesOfModule(moduleSymbol) {
        var exports = getExportsOfModuleAsArray(moduleSymbol);
        var exportEquals = resolveExternalModuleSymbol(moduleSymbol);
        if (exportEquals !== moduleSymbol) {
          var type = getTypeOfSymbol(exportEquals);
          if (shouldTreatPropertiesOfExternalModuleAsExports(type)) {
            ts2.addRange(exports, getPropertiesOfType(type));
          }
        }
        return exports;
      }
      function forEachExportAndPropertyOfModule(moduleSymbol, cb) {
        var exports = getExportsOfModule(moduleSymbol);
        exports.forEach(function(symbol, key) {
          if (!isReservedMemberName(key)) {
            cb(symbol, key);
          }
        });
        var exportEquals = resolveExternalModuleSymbol(moduleSymbol);
        if (exportEquals !== moduleSymbol) {
          var type = getTypeOfSymbol(exportEquals);
          if (shouldTreatPropertiesOfExternalModuleAsExports(type)) {
            forEachPropertyOfType(type, function(symbol, escapedName) {
              cb(symbol, escapedName);
            });
          }
        }
      }
      function tryGetMemberInModuleExports(memberName, moduleSymbol) {
        var symbolTable = getExportsOfModule(moduleSymbol);
        if (symbolTable) {
          return symbolTable.get(memberName);
        }
      }
      function tryGetMemberInModuleExportsAndProperties(memberName, moduleSymbol) {
        var symbol = tryGetMemberInModuleExports(memberName, moduleSymbol);
        if (symbol) {
          return symbol;
        }
        var exportEquals = resolveExternalModuleSymbol(moduleSymbol);
        if (exportEquals === moduleSymbol) {
          return void 0;
        }
        var type = getTypeOfSymbol(exportEquals);
        return shouldTreatPropertiesOfExternalModuleAsExports(type) ? getPropertyOfType(type, memberName) : void 0;
      }
      function shouldTreatPropertiesOfExternalModuleAsExports(resolvedExternalModuleType) {
        return !(resolvedExternalModuleType.flags & 131068 || ts2.getObjectFlags(resolvedExternalModuleType) & 1 || isArrayType(resolvedExternalModuleType) || isTupleType(resolvedExternalModuleType));
      }
      function getExportsOfSymbol(symbol) {
        return symbol.flags & 6256 ? getResolvedMembersOrExportsOfSymbol(symbol, "resolvedExports") : symbol.flags & 1536 ? getExportsOfModule(symbol) : symbol.exports || emptySymbols;
      }
      function getExportsOfModule(moduleSymbol) {
        var links = getSymbolLinks(moduleSymbol);
        return links.resolvedExports || (links.resolvedExports = getExportsOfModuleWorker(moduleSymbol));
      }
      function extendExportSymbols(target, source, lookupTable, exportNode) {
        if (!source)
          return;
        source.forEach(function(sourceSymbol, id) {
          if (id === "default")
            return;
          var targetSymbol = target.get(id);
          if (!targetSymbol) {
            target.set(id, sourceSymbol);
            if (lookupTable && exportNode) {
              lookupTable.set(id, {
                specifierText: ts2.getTextOfNode(exportNode.moduleSpecifier)
              });
            }
          } else if (lookupTable && exportNode && targetSymbol && resolveSymbol(targetSymbol) !== resolveSymbol(sourceSymbol)) {
            var collisionTracker = lookupTable.get(id);
            if (!collisionTracker.exportsWithDuplicate) {
              collisionTracker.exportsWithDuplicate = [exportNode];
            } else {
              collisionTracker.exportsWithDuplicate.push(exportNode);
            }
          }
        });
      }
      function getExportsOfModuleWorker(moduleSymbol) {
        var visitedSymbols = [];
        moduleSymbol = resolveExternalModuleSymbol(moduleSymbol);
        return visit(moduleSymbol) || emptySymbols;
        function visit(symbol) {
          if (!(symbol && symbol.exports && ts2.pushIfUnique(visitedSymbols, symbol))) {
            return;
          }
          var symbols = new ts2.Map(symbol.exports);
          var exportStars = symbol.exports.get("__export");
          if (exportStars) {
            var nestedSymbols = ts2.createSymbolTable();
            var lookupTable_1 = new ts2.Map();
            if (exportStars.declarations) {
              for (var _i = 0, _a = exportStars.declarations; _i < _a.length; _i++) {
                var node = _a[_i];
                var resolvedModule = resolveExternalModuleName(node, node.moduleSpecifier);
                var exportedSymbols = visit(resolvedModule);
                extendExportSymbols(nestedSymbols, exportedSymbols, lookupTable_1, node);
              }
            }
            lookupTable_1.forEach(function(_a2, id) {
              var exportsWithDuplicate = _a2.exportsWithDuplicate;
              if (id === "export=" || !(exportsWithDuplicate && exportsWithDuplicate.length) || symbols.has(id)) {
                return;
              }
              for (var _i2 = 0, exportsWithDuplicate_1 = exportsWithDuplicate; _i2 < exportsWithDuplicate_1.length; _i2++) {
                var node2 = exportsWithDuplicate_1[_i2];
                diagnostics.add(ts2.createDiagnosticForNode(node2, ts2.Diagnostics.Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambiguity, lookupTable_1.get(id).specifierText, ts2.unescapeLeadingUnderscores(id)));
              }
            });
            extendExportSymbols(symbols, nestedSymbols);
          }
          return symbols;
        }
      }
      function getMergedSymbol(symbol) {
        var merged;
        return symbol && symbol.mergeId && (merged = mergedSymbols[symbol.mergeId]) ? merged : symbol;
      }
      function getSymbolOfNode(node) {
        return getMergedSymbol(node.symbol && getLateBoundSymbol(node.symbol));
      }
      function getParentOfSymbol(symbol) {
        return getMergedSymbol(symbol.parent && getLateBoundSymbol(symbol.parent));
      }
      function getAlternativeContainingModules(symbol, enclosingDeclaration) {
        var containingFile = ts2.getSourceFileOfNode(enclosingDeclaration);
        var id = getNodeId(containingFile);
        var links = getSymbolLinks(symbol);
        var results;
        if (links.extendedContainersByFile && (results = links.extendedContainersByFile.get(id))) {
          return results;
        }
        if (containingFile && containingFile.imports) {
          for (var _i = 0, _a = containingFile.imports; _i < _a.length; _i++) {
            var importRef = _a[_i];
            if (ts2.nodeIsSynthesized(importRef))
              continue;
            var resolvedModule = resolveExternalModuleName(enclosingDeclaration, importRef, true);
            if (!resolvedModule)
              continue;
            var ref = getAliasForSymbolInContainer(resolvedModule, symbol);
            if (!ref)
              continue;
            results = ts2.append(results, resolvedModule);
          }
          if (ts2.length(results)) {
            (links.extendedContainersByFile || (links.extendedContainersByFile = new ts2.Map())).set(id, results);
            return results;
          }
        }
        if (links.extendedContainers) {
          return links.extendedContainers;
        }
        var otherFiles = host.getSourceFiles();
        for (var _b = 0, otherFiles_1 = otherFiles; _b < otherFiles_1.length; _b++) {
          var file = otherFiles_1[_b];
          if (!ts2.isExternalModule(file))
            continue;
          var sym = getSymbolOfNode(file);
          var ref = getAliasForSymbolInContainer(sym, symbol);
          if (!ref)
            continue;
          results = ts2.append(results, sym);
        }
        return links.extendedContainers = results || ts2.emptyArray;
      }
      function getContainersOfSymbol(symbol, enclosingDeclaration, meaning) {
        var container = getParentOfSymbol(symbol);
        if (container && !(symbol.flags & 262144)) {
          var additionalContainers = ts2.mapDefined(container.declarations, fileSymbolIfFileSymbolExportEqualsContainer);
          var reexportContainers = enclosingDeclaration && getAlternativeContainingModules(symbol, enclosingDeclaration);
          var objectLiteralContainer = getVariableDeclarationOfObjectLiteral(container, meaning);
          if (enclosingDeclaration && container.flags & getQualifiedLeftMeaning(meaning) && getAccessibleSymbolChain(container, enclosingDeclaration, 1920, false)) {
            return ts2.append(ts2.concatenate(ts2.concatenate([container], additionalContainers), reexportContainers), objectLiteralContainer);
          }
          var firstVariableMatch = !(container.flags & getQualifiedLeftMeaning(meaning)) && container.flags & 788968 && getDeclaredTypeOfSymbol(container).flags & 524288 && meaning === 111551 ? forEachSymbolTableInScope(enclosingDeclaration, function(t) {
            return ts2.forEachEntry(t, function(s) {
              if (s.flags & getQualifiedLeftMeaning(meaning) && getTypeOfSymbol(s) === getDeclaredTypeOfSymbol(container)) {
                return s;
              }
            });
          }) : void 0;
          var res = firstVariableMatch ? __spreadArray(__spreadArray([firstVariableMatch], additionalContainers, true), [container], false) : __spreadArray(__spreadArray([], additionalContainers, true), [container], false);
          res = ts2.append(res, objectLiteralContainer);
          res = ts2.addRange(res, reexportContainers);
          return res;
        }
        var candidates = ts2.mapDefined(symbol.declarations, function(d) {
          if (!ts2.isAmbientModule(d) && d.parent && hasNonGlobalAugmentationExternalModuleSymbol(d.parent)) {
            return getSymbolOfNode(d.parent);
          }
          if (ts2.isClassExpression(d) && ts2.isBinaryExpression(d.parent) && d.parent.operatorToken.kind === 63 && ts2.isAccessExpression(d.parent.left) && ts2.isEntityNameExpression(d.parent.left.expression)) {
            if (ts2.isModuleExportsAccessExpression(d.parent.left) || ts2.isExportsIdentifier(d.parent.left.expression)) {
              return getSymbolOfNode(ts2.getSourceFileOfNode(d));
            }
            checkExpressionCached(d.parent.left.expression);
            return getNodeLinks(d.parent.left.expression).resolvedSymbol;
          }
        });
        if (!ts2.length(candidates)) {
          return void 0;
        }
        return ts2.mapDefined(candidates, function(candidate) {
          return getAliasForSymbolInContainer(candidate, symbol) ? candidate : void 0;
        });
        function fileSymbolIfFileSymbolExportEqualsContainer(d) {
          return container && getFileSymbolIfFileSymbolExportEqualsContainer(d, container);
        }
      }
      function getVariableDeclarationOfObjectLiteral(symbol, meaning) {
        var firstDecl = !!ts2.length(symbol.declarations) && ts2.first(symbol.declarations);
        if (meaning & 111551 && firstDecl && firstDecl.parent && ts2.isVariableDeclaration(firstDecl.parent)) {
          if (ts2.isObjectLiteralExpression(firstDecl) && firstDecl === firstDecl.parent.initializer || ts2.isTypeLiteralNode(firstDecl) && firstDecl === firstDecl.parent.type) {
            return getSymbolOfNode(firstDecl.parent);
          }
        }
      }
      function getFileSymbolIfFileSymbolExportEqualsContainer(d, container) {
        var fileSymbol = getExternalModuleContainer(d);
        var exported = fileSymbol && fileSymbol.exports && fileSymbol.exports.get("export=");
        return exported && getSymbolIfSameReference(exported, container) ? fileSymbol : void 0;
      }
      function getAliasForSymbolInContainer(container, symbol) {
        if (container === getParentOfSymbol(symbol)) {
          return symbol;
        }
        var exportEquals = container.exports && container.exports.get("export=");
        if (exportEquals && getSymbolIfSameReference(exportEquals, symbol)) {
          return container;
        }
        var exports = getExportsOfSymbol(container);
        var quick = exports.get(symbol.escapedName);
        if (quick && getSymbolIfSameReference(quick, symbol)) {
          return quick;
        }
        return ts2.forEachEntry(exports, function(exported) {
          if (getSymbolIfSameReference(exported, symbol)) {
            return exported;
          }
        });
      }
      function getSymbolIfSameReference(s1, s2) {
        if (getMergedSymbol(resolveSymbol(getMergedSymbol(s1))) === getMergedSymbol(resolveSymbol(getMergedSymbol(s2)))) {
          return s1;
        }
      }
      function getExportSymbolOfValueSymbolIfExported(symbol) {
        return getMergedSymbol(symbol && (symbol.flags & 1048576) !== 0 ? symbol.exportSymbol : symbol);
      }
      function symbolIsValue(symbol) {
        return !!(symbol.flags & 111551 || symbol.flags & 2097152 && resolveAlias(symbol).flags & 111551 && !getTypeOnlyAliasDeclaration(symbol));
      }
      function findConstructorDeclaration(node) {
        var members = node.members;
        for (var _i = 0, members_3 = members; _i < members_3.length; _i++) {
          var member = members_3[_i];
          if (member.kind === 170 && ts2.nodeIsPresent(member.body)) {
            return member;
          }
        }
      }
      function createType(flags) {
        var result = new Type(checker, flags);
        typeCount++;
        result.id = typeCount;
        if (produceDiagnostics) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.recordType(result);
        }
        return result;
      }
      function createOriginType(flags) {
        return new Type(checker, flags);
      }
      function createIntrinsicType(kind, intrinsicName, objectFlags) {
        if (objectFlags === void 0) {
          objectFlags = 0;
        }
        var type = createType(kind);
        type.intrinsicName = intrinsicName;
        type.objectFlags = objectFlags;
        return type;
      }
      function createObjectType(objectFlags, symbol) {
        var type = createType(524288);
        type.objectFlags = objectFlags;
        type.symbol = symbol;
        type.members = void 0;
        type.properties = void 0;
        type.callSignatures = void 0;
        type.constructSignatures = void 0;
        type.indexInfos = void 0;
        return type;
      }
      function createTypeofType() {
        return getUnionType(ts2.arrayFrom(typeofEQFacts.keys(), getStringLiteralType));
      }
      function createTypeParameter(symbol) {
        var type = createType(262144);
        if (symbol)
          type.symbol = symbol;
        return type;
      }
      function isReservedMemberName(name) {
        return name.charCodeAt(0) === 95 && name.charCodeAt(1) === 95 && name.charCodeAt(2) !== 95 && name.charCodeAt(2) !== 64 && name.charCodeAt(2) !== 35;
      }
      function getNamedMembers(members) {
        var result;
        members.forEach(function(symbol, id) {
          if (isNamedMember(symbol, id)) {
            (result || (result = [])).push(symbol);
          }
        });
        return result || ts2.emptyArray;
      }
      function isNamedMember(member, escapedName) {
        return !isReservedMemberName(escapedName) && symbolIsValue(member);
      }
      function getNamedOrIndexSignatureMembers(members) {
        var result = getNamedMembers(members);
        var index = getIndexSymbolFromSymbolTable(members);
        return index ? ts2.concatenate(result, [index]) : result;
      }
      function setStructuredTypeMembers(type, members, callSignatures, constructSignatures, indexInfos) {
        var resolved = type;
        resolved.members = members;
        resolved.properties = ts2.emptyArray;
        resolved.callSignatures = callSignatures;
        resolved.constructSignatures = constructSignatures;
        resolved.indexInfos = indexInfos;
        if (members !== emptySymbols)
          resolved.properties = getNamedMembers(members);
        return resolved;
      }
      function createAnonymousType(symbol, members, callSignatures, constructSignatures, indexInfos) {
        return setStructuredTypeMembers(createObjectType(16, symbol), members, callSignatures, constructSignatures, indexInfos);
      }
      function getResolvedTypeWithoutAbstractConstructSignatures(type) {
        if (type.constructSignatures.length === 0)
          return type;
        if (type.objectTypeWithoutAbstractConstructSignatures)
          return type.objectTypeWithoutAbstractConstructSignatures;
        var constructSignatures = ts2.filter(type.constructSignatures, function(signature) {
          return !(signature.flags & 4);
        });
        if (type.constructSignatures === constructSignatures)
          return type;
        var typeCopy = createAnonymousType(type.symbol, type.members, type.callSignatures, ts2.some(constructSignatures) ? constructSignatures : ts2.emptyArray, type.indexInfos);
        type.objectTypeWithoutAbstractConstructSignatures = typeCopy;
        typeCopy.objectTypeWithoutAbstractConstructSignatures = typeCopy;
        return typeCopy;
      }
      function forEachSymbolTableInScope(enclosingDeclaration, callback) {
        var result;
        var _loop_8 = function(location2) {
          if (location2.locals && !isGlobalSourceFile(location2)) {
            if (result = callback(location2.locals, void 0, true, location2)) {
              return { value: result };
            }
          }
          switch (location2.kind) {
            case 303:
              if (!ts2.isExternalOrCommonJsModule(location2)) {
                break;
              }
            case 260:
              var sym = getSymbolOfNode(location2);
              if (result = callback((sym === null || sym === void 0 ? void 0 : sym.exports) || emptySymbols, void 0, true, location2)) {
                return { value: result };
              }
              break;
            case 256:
            case 225:
            case 257:
              var table_1;
              (getSymbolOfNode(location2).members || emptySymbols).forEach(function(memberSymbol, key) {
                if (memberSymbol.flags & (788968 & ~67108864)) {
                  (table_1 || (table_1 = ts2.createSymbolTable())).set(key, memberSymbol);
                }
              });
              if (table_1 && (result = callback(table_1, void 0, false, location2))) {
                return { value: result };
              }
              break;
          }
        };
        for (var location = enclosingDeclaration; location; location = location.parent) {
          var state_2 = _loop_8(location);
          if (typeof state_2 === "object")
            return state_2.value;
        }
        return callback(globals, void 0, true);
      }
      function getQualifiedLeftMeaning(rightMeaning) {
        return rightMeaning === 111551 ? 111551 : 1920;
      }
      function getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, useOnlyExternalAliasing, visitedSymbolTablesMap) {
        if (visitedSymbolTablesMap === void 0) {
          visitedSymbolTablesMap = new ts2.Map();
        }
        if (!(symbol && !isPropertyOrMethodDeclarationSymbol(symbol))) {
          return void 0;
        }
        var links = getSymbolLinks(symbol);
        var cache = links.accessibleChainCache || (links.accessibleChainCache = new ts2.Map());
        var firstRelevantLocation = forEachSymbolTableInScope(enclosingDeclaration, function(_, __, ___, node) {
          return node;
        });
        var key = "".concat(useOnlyExternalAliasing ? 0 : 1, "|").concat(firstRelevantLocation && getNodeId(firstRelevantLocation), "|").concat(meaning);
        if (cache.has(key)) {
          return cache.get(key);
        }
        var id = getSymbolId(symbol);
        var visitedSymbolTables = visitedSymbolTablesMap.get(id);
        if (!visitedSymbolTables) {
          visitedSymbolTablesMap.set(id, visitedSymbolTables = []);
        }
        var result = forEachSymbolTableInScope(enclosingDeclaration, getAccessibleSymbolChainFromSymbolTable);
        cache.set(key, result);
        return result;
        function getAccessibleSymbolChainFromSymbolTable(symbols, ignoreQualification, isLocalNameLookup) {
          if (!ts2.pushIfUnique(visitedSymbolTables, symbols)) {
            return void 0;
          }
          var result2 = trySymbolTable(symbols, ignoreQualification, isLocalNameLookup);
          visitedSymbolTables.pop();
          return result2;
        }
        function canQualifySymbol(symbolFromSymbolTable, meaning2) {
          return !needsQualification(symbolFromSymbolTable, enclosingDeclaration, meaning2) || !!getAccessibleSymbolChain(symbolFromSymbolTable.parent, enclosingDeclaration, getQualifiedLeftMeaning(meaning2), useOnlyExternalAliasing, visitedSymbolTablesMap);
        }
        function isAccessible(symbolFromSymbolTable, resolvedAliasSymbol, ignoreQualification) {
          return (symbol === (resolvedAliasSymbol || symbolFromSymbolTable) || getMergedSymbol(symbol) === getMergedSymbol(resolvedAliasSymbol || symbolFromSymbolTable)) && !ts2.some(symbolFromSymbolTable.declarations, hasNonGlobalAugmentationExternalModuleSymbol) && (ignoreQualification || canQualifySymbol(getMergedSymbol(symbolFromSymbolTable), meaning));
        }
        function trySymbolTable(symbols, ignoreQualification, isLocalNameLookup) {
          if (isAccessible(symbols.get(symbol.escapedName), void 0, ignoreQualification)) {
            return [symbol];
          }
          var result2 = ts2.forEachEntry(symbols, function(symbolFromSymbolTable) {
            if (symbolFromSymbolTable.flags & 2097152 && symbolFromSymbolTable.escapedName !== "export=" && symbolFromSymbolTable.escapedName !== "default" && !(ts2.isUMDExportSymbol(symbolFromSymbolTable) && enclosingDeclaration && ts2.isExternalModule(ts2.getSourceFileOfNode(enclosingDeclaration))) && (!useOnlyExternalAliasing || ts2.some(symbolFromSymbolTable.declarations, ts2.isExternalModuleImportEqualsDeclaration)) && (isLocalNameLookup ? !ts2.some(symbolFromSymbolTable.declarations, ts2.isNamespaceReexportDeclaration) : true) && (ignoreQualification || !ts2.getDeclarationOfKind(symbolFromSymbolTable, 274))) {
              var resolvedImportedSymbol = resolveAlias(symbolFromSymbolTable);
              var candidate = getCandidateListForSymbol(symbolFromSymbolTable, resolvedImportedSymbol, ignoreQualification);
              if (candidate) {
                return candidate;
              }
            }
            if (symbolFromSymbolTable.escapedName === symbol.escapedName && symbolFromSymbolTable.exportSymbol) {
              if (isAccessible(getMergedSymbol(symbolFromSymbolTable.exportSymbol), void 0, ignoreQualification)) {
                return [symbol];
              }
            }
          });
          return result2 || (symbols === globals ? getCandidateListForSymbol(globalThisSymbol, globalThisSymbol, ignoreQualification) : void 0);
        }
        function getCandidateListForSymbol(symbolFromSymbolTable, resolvedImportedSymbol, ignoreQualification) {
          if (isAccessible(symbolFromSymbolTable, resolvedImportedSymbol, ignoreQualification)) {
            return [symbolFromSymbolTable];
          }
          var candidateTable = getExportsOfSymbol(resolvedImportedSymbol);
          var accessibleSymbolsFromExports = candidateTable && getAccessibleSymbolChainFromSymbolTable(candidateTable, true);
          if (accessibleSymbolsFromExports && canQualifySymbol(symbolFromSymbolTable, getQualifiedLeftMeaning(meaning))) {
            return [symbolFromSymbolTable].concat(accessibleSymbolsFromExports);
          }
        }
      }
      function needsQualification(symbol, enclosingDeclaration, meaning) {
        var qualify = false;
        forEachSymbolTableInScope(enclosingDeclaration, function(symbolTable) {
          var symbolFromSymbolTable = getMergedSymbol(symbolTable.get(symbol.escapedName));
          if (!symbolFromSymbolTable) {
            return false;
          }
          if (symbolFromSymbolTable === symbol) {
            return true;
          }
          symbolFromSymbolTable = symbolFromSymbolTable.flags & 2097152 && !ts2.getDeclarationOfKind(symbolFromSymbolTable, 274) ? resolveAlias(symbolFromSymbolTable) : symbolFromSymbolTable;
          if (symbolFromSymbolTable.flags & meaning) {
            qualify = true;
            return true;
          }
          return false;
        });
        return qualify;
      }
      function isPropertyOrMethodDeclarationSymbol(symbol) {
        if (symbol.declarations && symbol.declarations.length) {
          for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            switch (declaration.kind) {
              case 166:
              case 168:
              case 171:
              case 172:
                continue;
              default:
                return false;
            }
          }
          return true;
        }
        return false;
      }
      function isTypeSymbolAccessible(typeSymbol, enclosingDeclaration) {
        var access = isSymbolAccessibleWorker(typeSymbol, enclosingDeclaration, 788968, false, true);
        return access.accessibility === 0;
      }
      function isValueSymbolAccessible(typeSymbol, enclosingDeclaration) {
        var access = isSymbolAccessibleWorker(typeSymbol, enclosingDeclaration, 111551, false, true);
        return access.accessibility === 0;
      }
      function isSymbolAccessibleByFlags(typeSymbol, enclosingDeclaration, flags) {
        var access = isSymbolAccessibleWorker(typeSymbol, enclosingDeclaration, flags, false, false);
        return access.accessibility === 0;
      }
      function isAnySymbolAccessible(symbols, enclosingDeclaration, initialSymbol, meaning, shouldComputeAliasesToMakeVisible, allowModules) {
        if (!ts2.length(symbols))
          return;
        var hadAccessibleChain;
        var earlyModuleBail = false;
        for (var _i = 0, _a = symbols; _i < _a.length; _i++) {
          var symbol = _a[_i];
          var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, false);
          if (accessibleSymbolChain) {
            hadAccessibleChain = symbol;
            var hasAccessibleDeclarations = hasVisibleDeclarations(accessibleSymbolChain[0], shouldComputeAliasesToMakeVisible);
            if (hasAccessibleDeclarations) {
              return hasAccessibleDeclarations;
            }
          }
          if (allowModules) {
            if (ts2.some(symbol.declarations, hasNonGlobalAugmentationExternalModuleSymbol)) {
              if (shouldComputeAliasesToMakeVisible) {
                earlyModuleBail = true;
                continue;
              }
              return {
                accessibility: 0
              };
            }
          }
          var containers = getContainersOfSymbol(symbol, enclosingDeclaration, meaning);
          var parentResult = isAnySymbolAccessible(containers, enclosingDeclaration, initialSymbol, initialSymbol === symbol ? getQualifiedLeftMeaning(meaning) : meaning, shouldComputeAliasesToMakeVisible, allowModules);
          if (parentResult) {
            return parentResult;
          }
        }
        if (earlyModuleBail) {
          return {
            accessibility: 0
          };
        }
        if (hadAccessibleChain) {
          return {
            accessibility: 1,
            errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
            errorModuleName: hadAccessibleChain !== initialSymbol ? symbolToString(hadAccessibleChain, enclosingDeclaration, 1920) : void 0
          };
        }
      }
      function isSymbolAccessible(symbol, enclosingDeclaration, meaning, shouldComputeAliasesToMakeVisible) {
        return isSymbolAccessibleWorker(symbol, enclosingDeclaration, meaning, shouldComputeAliasesToMakeVisible, true);
      }
      function isSymbolAccessibleWorker(symbol, enclosingDeclaration, meaning, shouldComputeAliasesToMakeVisible, allowModules) {
        if (symbol && enclosingDeclaration) {
          var result = isAnySymbolAccessible([symbol], enclosingDeclaration, symbol, meaning, shouldComputeAliasesToMakeVisible, allowModules);
          if (result) {
            return result;
          }
          var symbolExternalModule = ts2.forEach(symbol.declarations, getExternalModuleContainer);
          if (symbolExternalModule) {
            var enclosingExternalModule = getExternalModuleContainer(enclosingDeclaration);
            if (symbolExternalModule !== enclosingExternalModule) {
              return {
                accessibility: 2,
                errorSymbolName: symbolToString(symbol, enclosingDeclaration, meaning),
                errorModuleName: symbolToString(symbolExternalModule),
                errorNode: ts2.isInJSFile(enclosingDeclaration) ? enclosingDeclaration : void 0
              };
            }
          }
          return {
            accessibility: 1,
            errorSymbolName: symbolToString(symbol, enclosingDeclaration, meaning)
          };
        }
        return { accessibility: 0 };
      }
      function getExternalModuleContainer(declaration) {
        var node = ts2.findAncestor(declaration, hasExternalModuleSymbol);
        return node && getSymbolOfNode(node);
      }
      function hasExternalModuleSymbol(declaration) {
        return ts2.isAmbientModule(declaration) || declaration.kind === 303 && ts2.isExternalOrCommonJsModule(declaration);
      }
      function hasNonGlobalAugmentationExternalModuleSymbol(declaration) {
        return ts2.isModuleWithStringLiteralName(declaration) || declaration.kind === 303 && ts2.isExternalOrCommonJsModule(declaration);
      }
      function hasVisibleDeclarations(symbol, shouldComputeAliasToMakeVisible) {
        var aliasesToMakeVisible;
        if (!ts2.every(ts2.filter(symbol.declarations, function(d) {
          return d.kind !== 79;
        }), getIsDeclarationVisible)) {
          return void 0;
        }
        return { accessibility: 0, aliasesToMakeVisible };
        function getIsDeclarationVisible(declaration) {
          var _a, _b;
          if (!isDeclarationVisible(declaration)) {
            var anyImportSyntax = getAnyImportSyntax(declaration);
            if (anyImportSyntax && !ts2.hasSyntacticModifier(anyImportSyntax, 1) && isDeclarationVisible(anyImportSyntax.parent)) {
              return addVisibleAlias(declaration, anyImportSyntax);
            } else if (ts2.isVariableDeclaration(declaration) && ts2.isVariableStatement(declaration.parent.parent) && !ts2.hasSyntacticModifier(declaration.parent.parent, 1) && isDeclarationVisible(declaration.parent.parent.parent)) {
              return addVisibleAlias(declaration, declaration.parent.parent);
            } else if (ts2.isLateVisibilityPaintedStatement(declaration) && !ts2.hasSyntacticModifier(declaration, 1) && isDeclarationVisible(declaration.parent)) {
              return addVisibleAlias(declaration, declaration);
            } else if (symbol.flags & 2097152 && ts2.isBindingElement(declaration) && ts2.isInJSFile(declaration) && ((_a = declaration.parent) === null || _a === void 0 ? void 0 : _a.parent) && ts2.isVariableDeclaration(declaration.parent.parent) && ((_b = declaration.parent.parent.parent) === null || _b === void 0 ? void 0 : _b.parent) && ts2.isVariableStatement(declaration.parent.parent.parent.parent) && !ts2.hasSyntacticModifier(declaration.parent.parent.parent.parent, 1) && declaration.parent.parent.parent.parent.parent && isDeclarationVisible(declaration.parent.parent.parent.parent.parent)) {
              return addVisibleAlias(declaration, declaration.parent.parent.parent.parent);
            }
            return false;
          }
          return true;
        }
        function addVisibleAlias(declaration, aliasingStatement) {
          if (shouldComputeAliasToMakeVisible) {
            getNodeLinks(declaration).isVisible = true;
            aliasesToMakeVisible = ts2.appendIfUnique(aliasesToMakeVisible, aliasingStatement);
          }
          return true;
        }
      }
      function isEntityNameVisible(entityName, enclosingDeclaration) {
        var meaning;
        if (entityName.parent.kind === 180 || ts2.isExpressionWithTypeArgumentsInClassExtendsClause(entityName.parent) || entityName.parent.kind === 161) {
          meaning = 111551 | 1048576;
        } else if (entityName.kind === 160 || entityName.kind === 205 || entityName.parent.kind === 264) {
          meaning = 1920;
        } else {
          meaning = 788968;
        }
        var firstIdentifier = ts2.getFirstIdentifier(entityName);
        var symbol = resolveName(enclosingDeclaration, firstIdentifier.escapedText, meaning, void 0, void 0, false);
        if (symbol && symbol.flags & 262144 && meaning & 788968) {
          return { accessibility: 0 };
        }
        return symbol && hasVisibleDeclarations(symbol, true) || {
          accessibility: 1,
          errorSymbolName: ts2.getTextOfNode(firstIdentifier),
          errorNode: firstIdentifier
        };
      }
      function symbolToString(symbol, enclosingDeclaration, meaning, flags, writer) {
        if (flags === void 0) {
          flags = 4;
        }
        var nodeFlags = 70221824;
        if (flags & 2) {
          nodeFlags |= 128;
        }
        if (flags & 1) {
          nodeFlags |= 512;
        }
        if (flags & 8) {
          nodeFlags |= 16384;
        }
        if (flags & 16) {
          nodeFlags |= 134217728;
        }
        var builder = flags & 4 ? nodeBuilder.symbolToExpression : nodeBuilder.symbolToEntityName;
        return writer ? symbolToStringWorker(writer).getText() : ts2.usingSingleLineStringWriter(symbolToStringWorker);
        function symbolToStringWorker(writer2) {
          var entity = builder(symbol, meaning, enclosingDeclaration, nodeFlags);
          var printer = (enclosingDeclaration === null || enclosingDeclaration === void 0 ? void 0 : enclosingDeclaration.kind) === 303 ? ts2.createPrinter({ removeComments: true, neverAsciiEscape: true }) : ts2.createPrinter({ removeComments: true });
          var sourceFile = enclosingDeclaration && ts2.getSourceFileOfNode(enclosingDeclaration);
          printer.writeNode(4, entity, sourceFile, writer2);
          return writer2;
        }
      }
      function signatureToString(signature, enclosingDeclaration, flags, kind, writer) {
        if (flags === void 0) {
          flags = 0;
        }
        return writer ? signatureToStringWorker(writer).getText() : ts2.usingSingleLineStringWriter(signatureToStringWorker);
        function signatureToStringWorker(writer2) {
          var sigOutput;
          if (flags & 262144) {
            sigOutput = kind === 1 ? 179 : 178;
          } else {
            sigOutput = kind === 1 ? 174 : 173;
          }
          var sig = nodeBuilder.signatureToSignatureDeclaration(signature, sigOutput, enclosingDeclaration, toNodeBuilderFlags(flags) | 70221824 | 512);
          var printer = ts2.createPrinter({ removeComments: true, omitTrailingSemicolon: true });
          var sourceFile = enclosingDeclaration && ts2.getSourceFileOfNode(enclosingDeclaration);
          printer.writeNode(4, sig, sourceFile, ts2.getTrailingSemicolonDeferringWriter(writer2));
          return writer2;
        }
      }
      function typeToString(type, enclosingDeclaration, flags, writer) {
        if (flags === void 0) {
          flags = 1048576 | 16384;
        }
        if (writer === void 0) {
          writer = ts2.createTextWriter("");
        }
        var noTruncation = compilerOptions.noErrorTruncation || flags & 1;
        var typeNode = nodeBuilder.typeToTypeNode(type, enclosingDeclaration, toNodeBuilderFlags(flags) | 70221824 | (noTruncation ? 1 : 0), writer);
        if (typeNode === void 0)
          return ts2.Debug.fail("should always get typenode");
        var options = { removeComments: type !== unresolvedType };
        var printer = ts2.createPrinter(options);
        var sourceFile = enclosingDeclaration && ts2.getSourceFileOfNode(enclosingDeclaration);
        printer.writeNode(4, typeNode, sourceFile, writer);
        var result = writer.getText();
        var maxLength = noTruncation ? ts2.noTruncationMaximumTruncationLength * 2 : ts2.defaultMaximumTruncationLength * 2;
        if (maxLength && result && result.length >= maxLength) {
          return result.substr(0, maxLength - "...".length) + "...";
        }
        return result;
      }
      function getTypeNamesForErrorDisplay(left, right) {
        var leftStr = symbolValueDeclarationIsContextSensitive(left.symbol) ? typeToString(left, left.symbol.valueDeclaration) : typeToString(left);
        var rightStr = symbolValueDeclarationIsContextSensitive(right.symbol) ? typeToString(right, right.symbol.valueDeclaration) : typeToString(right);
        if (leftStr === rightStr) {
          leftStr = getTypeNameForErrorDisplay(left);
          rightStr = getTypeNameForErrorDisplay(right);
        }
        return [leftStr, rightStr];
      }
      function getTypeNameForErrorDisplay(type) {
        return typeToString(type, void 0, 64);
      }
      function symbolValueDeclarationIsContextSensitive(symbol) {
        return symbol && !!symbol.valueDeclaration && ts2.isExpression(symbol.valueDeclaration) && !isContextSensitive(symbol.valueDeclaration);
      }
      function toNodeBuilderFlags(flags) {
        if (flags === void 0) {
          flags = 0;
        }
        return flags & 814775659;
      }
      function isClassInstanceSide(type) {
        return !!type.symbol && !!(type.symbol.flags & 32) && (type === getDeclaredTypeOfClassOrInterface(type.symbol) || !!(type.flags & 524288) && !!(ts2.getObjectFlags(type) & 16777216));
      }
      function createNodeBuilder() {
        return {
          typeToTypeNode: function(type, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return typeToTypeNodeHelper(type, context);
            });
          },
          indexInfoToIndexSignatureDeclaration: function(indexInfo, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return indexInfoToIndexSignatureDeclarationHelper(indexInfo, context, void 0);
            });
          },
          signatureToSignatureDeclaration: function(signature, kind, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return signatureToSignatureDeclarationHelper(signature, kind, context);
            });
          },
          symbolToEntityName: function(symbol, meaning, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return symbolToName(symbol, context, meaning, false);
            });
          },
          symbolToExpression: function(symbol, meaning, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return symbolToExpression(symbol, context, meaning);
            });
          },
          symbolToTypeParameterDeclarations: function(symbol, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return typeParametersToTypeParameterDeclarations(symbol, context);
            });
          },
          symbolToParameterDeclaration: function(symbol, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return symbolToParameterDeclaration(symbol, context);
            });
          },
          typeParameterToDeclaration: function(parameter, enclosingDeclaration, flags, tracker) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return typeParameterToDeclaration(parameter, context);
            });
          },
          symbolTableToDeclarationStatements: function(symbolTable, enclosingDeclaration, flags, tracker, bundled) {
            return withContext(enclosingDeclaration, flags, tracker, function(context) {
              return symbolTableToDeclarationStatements(symbolTable, context, bundled);
            });
          }
        };
        function withContext(enclosingDeclaration, flags, tracker, cb) {
          var _a, _b;
          ts2.Debug.assert(enclosingDeclaration === void 0 || (enclosingDeclaration.flags & 8) === 0);
          var context = {
            enclosingDeclaration,
            flags: flags || 0,
            tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: function() {
              return false;
            }, moduleResolverHost: flags & 134217728 ? {
              getCommonSourceDirectory: !!host.getCommonSourceDirectory ? function() {
                return host.getCommonSourceDirectory();
              } : function() {
                return "";
              },
              getCurrentDirectory: function() {
                return host.getCurrentDirectory();
              },
              getSymlinkCache: ts2.maybeBind(host, host.getSymlinkCache),
              useCaseSensitiveFileNames: ts2.maybeBind(host, host.useCaseSensitiveFileNames),
              redirectTargetsMap: host.redirectTargetsMap,
              getProjectReferenceRedirect: function(fileName) {
                return host.getProjectReferenceRedirect(fileName);
              },
              isSourceOfProjectReferenceRedirect: function(fileName) {
                return host.isSourceOfProjectReferenceRedirect(fileName);
              },
              fileExists: function(fileName) {
                return host.fileExists(fileName);
              },
              getFileIncludeReasons: function() {
                return host.getFileIncludeReasons();
              },
              readFile: host.readFile ? function(fileName) {
                return host.readFile(fileName);
              } : void 0
            } : void 0 },
            encounteredError: false,
            reportedDiagnostic: false,
            visitedTypes: void 0,
            symbolDepth: void 0,
            inferTypeParameters: void 0,
            approximateLength: 0
          };
          context.tracker = wrapSymbolTrackerToReportForContext(context, context.tracker);
          var resultingNode = cb(context);
          if (context.truncating && context.flags & 1) {
            (_b = (_a = context.tracker) === null || _a === void 0 ? void 0 : _a.reportTruncationError) === null || _b === void 0 ? void 0 : _b.call(_a);
          }
          return context.encounteredError ? void 0 : resultingNode;
        }
        function wrapSymbolTrackerToReportForContext(context, tracker) {
          var oldTrackSymbol = tracker.trackSymbol;
          return __assign(__assign({}, tracker), { reportCyclicStructureError: wrapReportedDiagnostic(tracker.reportCyclicStructureError), reportInaccessibleThisError: wrapReportedDiagnostic(tracker.reportInaccessibleThisError), reportInaccessibleUniqueSymbolError: wrapReportedDiagnostic(tracker.reportInaccessibleUniqueSymbolError), reportLikelyUnsafeImportRequiredError: wrapReportedDiagnostic(tracker.reportLikelyUnsafeImportRequiredError), reportNonlocalAugmentation: wrapReportedDiagnostic(tracker.reportNonlocalAugmentation), reportPrivateInBaseOfClassExpression: wrapReportedDiagnostic(tracker.reportPrivateInBaseOfClassExpression), reportNonSerializableProperty: wrapReportedDiagnostic(tracker.reportNonSerializableProperty), trackSymbol: oldTrackSymbol && function() {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
              args[_i] = arguments[_i];
            }
            var result = oldTrackSymbol.apply(void 0, args);
            if (result) {
              context.reportedDiagnostic = true;
            }
            return result;
          } });
          function wrapReportedDiagnostic(method) {
            if (!method) {
              return method;
            }
            return function() {
              var args = [];
              for (var _i = 0; _i < arguments.length; _i++) {
                args[_i] = arguments[_i];
              }
              context.reportedDiagnostic = true;
              return method.apply(void 0, args);
            };
          }
        }
        function checkTruncationLength(context) {
          if (context.truncating)
            return context.truncating;
          return context.truncating = context.approximateLength > (context.flags & 1 ? ts2.noTruncationMaximumTruncationLength : ts2.defaultMaximumTruncationLength);
        }
        function typeToTypeNodeHelper(type, context) {
          if (cancellationToken && cancellationToken.throwIfCancellationRequested) {
            cancellationToken.throwIfCancellationRequested();
          }
          var inTypeAlias = context.flags & 8388608;
          context.flags &= ~8388608;
          if (!type) {
            if (!(context.flags & 262144)) {
              context.encounteredError = true;
              return void 0;
            }
            context.approximateLength += 3;
            return ts2.factory.createKeywordTypeNode(130);
          }
          if (!(context.flags & 536870912)) {
            type = getReducedType(type);
          }
          if (type.flags & 1) {
            if (type.aliasSymbol) {
              return ts2.factory.createTypeReferenceNode(symbolToEntityNameNode(type.aliasSymbol), mapToTypeNodes(type.aliasTypeArguments, context));
            }
            if (type === unresolvedType) {
              return ts2.addSyntheticLeadingComment(ts2.factory.createKeywordTypeNode(130), 3, "unresolved");
            }
            context.approximateLength += 3;
            return ts2.factory.createKeywordTypeNode(type === intrinsicMarkerType ? 138 : 130);
          }
          if (type.flags & 2) {
            return ts2.factory.createKeywordTypeNode(154);
          }
          if (type.flags & 4) {
            context.approximateLength += 6;
            return ts2.factory.createKeywordTypeNode(149);
          }
          if (type.flags & 8) {
            context.approximateLength += 6;
            return ts2.factory.createKeywordTypeNode(146);
          }
          if (type.flags & 64) {
            context.approximateLength += 6;
            return ts2.factory.createKeywordTypeNode(157);
          }
          if (type.flags & 16 && !type.aliasSymbol) {
            context.approximateLength += 7;
            return ts2.factory.createKeywordTypeNode(133);
          }
          if (type.flags & 1024 && !(type.flags & 1048576)) {
            var parentSymbol = getParentOfSymbol(type.symbol);
            var parentName = symbolToTypeNode(parentSymbol, context, 788968);
            if (getDeclaredTypeOfSymbol(parentSymbol) === type) {
              return parentName;
            }
            var memberName = ts2.symbolName(type.symbol);
            if (ts2.isIdentifierText(memberName, 0)) {
              return appendReferenceToType(parentName, ts2.factory.createTypeReferenceNode(memberName, void 0));
            }
            if (ts2.isImportTypeNode(parentName)) {
              parentName.isTypeOf = true;
              return ts2.factory.createIndexedAccessTypeNode(parentName, ts2.factory.createLiteralTypeNode(ts2.factory.createStringLiteral(memberName)));
            } else if (ts2.isTypeReferenceNode(parentName)) {
              return ts2.factory.createIndexedAccessTypeNode(ts2.factory.createTypeQueryNode(parentName.typeName), ts2.factory.createLiteralTypeNode(ts2.factory.createStringLiteral(memberName)));
            } else {
              return ts2.Debug.fail("Unhandled type node kind returned from `symbolToTypeNode`.");
            }
          }
          if (type.flags & 1056) {
            return symbolToTypeNode(type.symbol, context, 788968);
          }
          if (type.flags & 128) {
            context.approximateLength += type.value.length + 2;
            return ts2.factory.createLiteralTypeNode(ts2.setEmitFlags(ts2.factory.createStringLiteral(type.value, !!(context.flags & 268435456)), 16777216));
          }
          if (type.flags & 256) {
            var value = type.value;
            context.approximateLength += ("" + value).length;
            return ts2.factory.createLiteralTypeNode(value < 0 ? ts2.factory.createPrefixUnaryExpression(40, ts2.factory.createNumericLiteral(-value)) : ts2.factory.createNumericLiteral(value));
          }
          if (type.flags & 2048) {
            context.approximateLength += ts2.pseudoBigIntToString(type.value).length + 1;
            return ts2.factory.createLiteralTypeNode(ts2.factory.createBigIntLiteral(type.value));
          }
          if (type.flags & 512) {
            context.approximateLength += type.intrinsicName.length;
            return ts2.factory.createLiteralTypeNode(type.intrinsicName === "true" ? ts2.factory.createTrue() : ts2.factory.createFalse());
          }
          if (type.flags & 8192) {
            if (!(context.flags & 1048576)) {
              if (isValueSymbolAccessible(type.symbol, context.enclosingDeclaration)) {
                context.approximateLength += 6;
                return symbolToTypeNode(type.symbol, context, 111551);
              }
              if (context.tracker.reportInaccessibleUniqueSymbolError) {
                context.tracker.reportInaccessibleUniqueSymbolError();
              }
            }
            context.approximateLength += 13;
            return ts2.factory.createTypeOperatorNode(153, ts2.factory.createKeywordTypeNode(150));
          }
          if (type.flags & 16384) {
            context.approximateLength += 4;
            return ts2.factory.createKeywordTypeNode(114);
          }
          if (type.flags & 32768) {
            context.approximateLength += 9;
            return ts2.factory.createKeywordTypeNode(152);
          }
          if (type.flags & 65536) {
            context.approximateLength += 4;
            return ts2.factory.createLiteralTypeNode(ts2.factory.createNull());
          }
          if (type.flags & 131072) {
            context.approximateLength += 5;
            return ts2.factory.createKeywordTypeNode(143);
          }
          if (type.flags & 4096) {
            context.approximateLength += 6;
            return ts2.factory.createKeywordTypeNode(150);
          }
          if (type.flags & 67108864) {
            context.approximateLength += 6;
            return ts2.factory.createKeywordTypeNode(147);
          }
          if (isThisTypeParameter(type)) {
            if (context.flags & 4194304) {
              if (!context.encounteredError && !(context.flags & 32768)) {
                context.encounteredError = true;
              }
              if (context.tracker.reportInaccessibleThisError) {
                context.tracker.reportInaccessibleThisError();
              }
            }
            context.approximateLength += 4;
            return ts2.factory.createThisTypeNode();
          }
          if (!inTypeAlias && type.aliasSymbol && (context.flags & 16384 || isTypeSymbolAccessible(type.aliasSymbol, context.enclosingDeclaration))) {
            var typeArgumentNodes = mapToTypeNodes(type.aliasTypeArguments, context);
            if (isReservedMemberName(type.aliasSymbol.escapedName) && !(type.aliasSymbol.flags & 32))
              return ts2.factory.createTypeReferenceNode(ts2.factory.createIdentifier(""), typeArgumentNodes);
            return symbolToTypeNode(type.aliasSymbol, context, 788968, typeArgumentNodes);
          }
          var objectFlags = ts2.getObjectFlags(type);
          if (objectFlags & 4) {
            ts2.Debug.assert(!!(type.flags & 524288));
            return type.node ? visitAndTransformType(type, typeReferenceToTypeNode) : typeReferenceToTypeNode(type);
          }
          if (type.flags & 262144 || objectFlags & 3) {
            if (type.flags & 262144 && ts2.contains(context.inferTypeParameters, type)) {
              context.approximateLength += ts2.symbolName(type.symbol).length + 6;
              return ts2.factory.createInferTypeNode(typeParameterToDeclarationWithConstraint(type, context, void 0));
            }
            if (context.flags & 4 && type.flags & 262144 && !isTypeSymbolAccessible(type.symbol, context.enclosingDeclaration)) {
              var name = typeParameterToName(type, context);
              context.approximateLength += ts2.idText(name).length;
              return ts2.factory.createTypeReferenceNode(ts2.factory.createIdentifier(ts2.idText(name)), void 0);
            }
            return type.symbol ? symbolToTypeNode(type.symbol, context, 788968) : ts2.factory.createTypeReferenceNode(ts2.factory.createIdentifier("?"), void 0);
          }
          if (type.flags & 1048576 && type.origin) {
            type = type.origin;
          }
          if (type.flags & (1048576 | 2097152)) {
            var types = type.flags & 1048576 ? formatUnionTypes(type.types) : type.types;
            if (ts2.length(types) === 1) {
              return typeToTypeNodeHelper(types[0], context);
            }
            var typeNodes = mapToTypeNodes(types, context, true);
            if (typeNodes && typeNodes.length > 0) {
              return type.flags & 1048576 ? ts2.factory.createUnionTypeNode(typeNodes) : ts2.factory.createIntersectionTypeNode(typeNodes);
            } else {
              if (!context.encounteredError && !(context.flags & 262144)) {
                context.encounteredError = true;
              }
              return void 0;
            }
          }
          if (objectFlags & (16 | 32)) {
            ts2.Debug.assert(!!(type.flags & 524288));
            return createAnonymousTypeNode(type);
          }
          if (type.flags & 4194304) {
            var indexedType = type.type;
            context.approximateLength += 6;
            var indexTypeNode = typeToTypeNodeHelper(indexedType, context);
            return ts2.factory.createTypeOperatorNode(140, indexTypeNode);
          }
          if (type.flags & 134217728) {
            var texts_1 = type.texts;
            var types_1 = type.types;
            var templateHead = ts2.factory.createTemplateHead(texts_1[0]);
            var templateSpans = ts2.factory.createNodeArray(ts2.map(types_1, function(t, i) {
              return ts2.factory.createTemplateLiteralTypeSpan(typeToTypeNodeHelper(t, context), (i < types_1.length - 1 ? ts2.factory.createTemplateMiddle : ts2.factory.createTemplateTail)(texts_1[i + 1]));
            }));
            context.approximateLength += 2;
            return ts2.factory.createTemplateLiteralType(templateHead, templateSpans);
          }
          if (type.flags & 268435456) {
            var typeNode = typeToTypeNodeHelper(type.type, context);
            return symbolToTypeNode(type.symbol, context, 788968, [typeNode]);
          }
          if (type.flags & 8388608) {
            var objectTypeNode = typeToTypeNodeHelper(type.objectType, context);
            var indexTypeNode = typeToTypeNodeHelper(type.indexType, context);
            context.approximateLength += 2;
            return ts2.factory.createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
          }
          if (type.flags & 16777216) {
            return visitAndTransformType(type, function(type2) {
              return conditionalTypeToTypeNode(type2);
            });
          }
          if (type.flags & 33554432) {
            return typeToTypeNodeHelper(type.baseType, context);
          }
          return ts2.Debug.fail("Should be unreachable.");
          function conditionalTypeToTypeNode(type2) {
            var checkTypeNode = typeToTypeNodeHelper(type2.checkType, context);
            var saveInferTypeParameters = context.inferTypeParameters;
            context.inferTypeParameters = type2.root.inferTypeParameters;
            var extendsTypeNode = typeToTypeNodeHelper(type2.extendsType, context);
            context.inferTypeParameters = saveInferTypeParameters;
            var trueTypeNode = typeToTypeNodeOrCircularityElision(getTrueTypeFromConditionalType(type2));
            var falseTypeNode = typeToTypeNodeOrCircularityElision(getFalseTypeFromConditionalType(type2));
            context.approximateLength += 15;
            return ts2.factory.createConditionalTypeNode(checkTypeNode, extendsTypeNode, trueTypeNode, falseTypeNode);
          }
          function typeToTypeNodeOrCircularityElision(type2) {
            var _a, _b, _c;
            if (type2.flags & 1048576) {
              if ((_a = context.visitedTypes) === null || _a === void 0 ? void 0 : _a.has(getTypeId(type2))) {
                if (!(context.flags & 131072)) {
                  context.encounteredError = true;
                  (_c = (_b = context.tracker) === null || _b === void 0 ? void 0 : _b.reportCyclicStructureError) === null || _c === void 0 ? void 0 : _c.call(_b);
                }
                return createElidedInformationPlaceholder(context);
              }
              return visitAndTransformType(type2, function(type3) {
                return typeToTypeNodeHelper(type3, context);
              });
            }
            return typeToTypeNodeHelper(type2, context);
          }
          function createMappedTypeNodeFromType(type2) {
            ts2.Debug.assert(!!(type2.flags & 524288));
            var readonlyToken = type2.declaration.readonlyToken ? ts2.factory.createToken(type2.declaration.readonlyToken.kind) : void 0;
            var questionToken = type2.declaration.questionToken ? ts2.factory.createToken(type2.declaration.questionToken.kind) : void 0;
            var appropriateConstraintTypeNode;
            if (isMappedTypeWithKeyofConstraintDeclaration(type2)) {
              appropriateConstraintTypeNode = ts2.factory.createTypeOperatorNode(140, typeToTypeNodeHelper(getModifiersTypeFromMappedType(type2), context));
            } else {
              appropriateConstraintTypeNode = typeToTypeNodeHelper(getConstraintTypeFromMappedType(type2), context);
            }
            var typeParameterNode = typeParameterToDeclarationWithConstraint(getTypeParameterFromMappedType(type2), context, appropriateConstraintTypeNode);
            var nameTypeNode = type2.declaration.nameType ? typeToTypeNodeHelper(getNameTypeFromMappedType(type2), context) : void 0;
            var templateTypeNode = typeToTypeNodeHelper(removeMissingType(getTemplateTypeFromMappedType(type2), !!(getMappedTypeModifiers(type2) & 4)), context);
            var mappedTypeNode = ts2.factory.createMappedTypeNode(readonlyToken, typeParameterNode, nameTypeNode, questionToken, templateTypeNode, void 0);
            context.approximateLength += 10;
            return ts2.setEmitFlags(mappedTypeNode, 1);
          }
          function createAnonymousTypeNode(type2) {
            var _a;
            var typeId = type2.id;
            var symbol = type2.symbol;
            if (symbol) {
              var isInstanceType = isClassInstanceSide(type2) ? 788968 : 111551;
              if (isJSConstructor(symbol.valueDeclaration)) {
                return symbolToTypeNode(symbol, context, isInstanceType);
              } else if (symbol.flags & 32 && !getBaseTypeVariableOfClass(symbol) && !(symbol.valueDeclaration && symbol.valueDeclaration.kind === 225 && context.flags & 2048) || symbol.flags & (384 | 512) || shouldWriteTypeOfFunctionSymbol()) {
                return symbolToTypeNode(symbol, context, isInstanceType);
              } else if ((_a = context.visitedTypes) === null || _a === void 0 ? void 0 : _a.has(typeId)) {
                var typeAlias = getTypeAliasForTypeLiteral(type2);
                if (typeAlias) {
                  return symbolToTypeNode(typeAlias, context, 788968);
                } else {
                  return createElidedInformationPlaceholder(context);
                }
              } else {
                return visitAndTransformType(type2, createTypeNodeFromObjectType);
              }
            } else {
              return createTypeNodeFromObjectType(type2);
            }
            function shouldWriteTypeOfFunctionSymbol() {
              var _a2;
              var isStaticMethodSymbol = !!(symbol.flags & 8192) && ts2.some(symbol.declarations, function(declaration) {
                return ts2.isStatic(declaration);
              });
              var isNonLocalFunctionSymbol = !!(symbol.flags & 16) && (symbol.parent || ts2.forEach(symbol.declarations, function(declaration) {
                return declaration.parent.kind === 303 || declaration.parent.kind === 261;
              }));
              if (isStaticMethodSymbol || isNonLocalFunctionSymbol) {
                return (!!(context.flags & 4096) || ((_a2 = context.visitedTypes) === null || _a2 === void 0 ? void 0 : _a2.has(typeId))) && (!(context.flags & 8) || isValueSymbolAccessible(symbol, context.enclosingDeclaration));
              }
            }
          }
          function visitAndTransformType(type2, transform) {
            var _a, _b;
            var typeId = type2.id;
            var isConstructorObject = ts2.getObjectFlags(type2) & 16 && type2.symbol && type2.symbol.flags & 32;
            var id = ts2.getObjectFlags(type2) & 4 && type2.node ? "N" + getNodeId(type2.node) : type2.flags & 16777216 ? "N" + getNodeId(type2.root.node) : type2.symbol ? (isConstructorObject ? "+" : "") + getSymbolId(type2.symbol) : void 0;
            if (!context.visitedTypes) {
              context.visitedTypes = new ts2.Set();
            }
            if (id && !context.symbolDepth) {
              context.symbolDepth = new ts2.Map();
            }
            var links = context.enclosingDeclaration && getNodeLinks(context.enclosingDeclaration);
            var key = "".concat(getTypeId(type2), "|").concat(context.flags);
            if (links) {
              links.serializedTypes || (links.serializedTypes = new ts2.Map());
            }
            var cachedResult = (_a = links === null || links === void 0 ? void 0 : links.serializedTypes) === null || _a === void 0 ? void 0 : _a.get(key);
            if (cachedResult) {
              if (cachedResult.truncating) {
                context.truncating = true;
              }
              context.approximateLength += cachedResult.addedLength;
              return deepCloneOrReuseNode(cachedResult);
            }
            var depth;
            if (id) {
              depth = context.symbolDepth.get(id) || 0;
              if (depth > 10) {
                return createElidedInformationPlaceholder(context);
              }
              context.symbolDepth.set(id, depth + 1);
            }
            context.visitedTypes.add(typeId);
            var startLength = context.approximateLength;
            var result = transform(type2);
            var addedLength = context.approximateLength - startLength;
            if (!context.reportedDiagnostic && !context.encounteredError) {
              if (context.truncating) {
                result.truncating = true;
              }
              result.addedLength = addedLength;
              (_b = links === null || links === void 0 ? void 0 : links.serializedTypes) === null || _b === void 0 ? void 0 : _b.set(key, result);
            }
            context.visitedTypes.delete(typeId);
            if (id) {
              context.symbolDepth.set(id, depth);
            }
            return result;
            function deepCloneOrReuseNode(node) {
              if (!ts2.nodeIsSynthesized(node) && ts2.getParseTreeNode(node) === node) {
                return node;
              }
              return ts2.setTextRange(ts2.factory.cloneNode(ts2.visitEachChild(node, deepCloneOrReuseNode, ts2.nullTransformationContext)), node);
            }
          }
          function createTypeNodeFromObjectType(type2) {
            if (isGenericMappedType(type2) || type2.containsError) {
              return createMappedTypeNodeFromType(type2);
            }
            var resolved = resolveStructuredTypeMembers(type2);
            if (!resolved.properties.length && !resolved.indexInfos.length) {
              if (!resolved.callSignatures.length && !resolved.constructSignatures.length) {
                context.approximateLength += 2;
                return ts2.setEmitFlags(ts2.factory.createTypeLiteralNode(void 0), 1);
              }
              if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
                var signature = resolved.callSignatures[0];
                var signatureNode = signatureToSignatureDeclarationHelper(signature, 178, context);
                return signatureNode;
              }
              if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
                var signature = resolved.constructSignatures[0];
                var signatureNode = signatureToSignatureDeclarationHelper(signature, 179, context);
                return signatureNode;
              }
            }
            var abstractSignatures = ts2.filter(resolved.constructSignatures, function(signature2) {
              return !!(signature2.flags & 4);
            });
            if (ts2.some(abstractSignatures)) {
              var types2 = ts2.map(abstractSignatures, getOrCreateTypeFromSignature);
              var typeElementCount = resolved.callSignatures.length + (resolved.constructSignatures.length - abstractSignatures.length) + resolved.indexInfos.length + (context.flags & 2048 ? ts2.countWhere(resolved.properties, function(p) {
                return !(p.flags & 4194304);
              }) : ts2.length(resolved.properties));
              if (typeElementCount) {
                types2.push(getResolvedTypeWithoutAbstractConstructSignatures(resolved));
              }
              return typeToTypeNodeHelper(getIntersectionType(types2), context);
            }
            var savedFlags = context.flags;
            context.flags |= 4194304;
            var members = createTypeNodesFromResolvedType(resolved);
            context.flags = savedFlags;
            var typeLiteralNode = ts2.factory.createTypeLiteralNode(members);
            context.approximateLength += 2;
            ts2.setEmitFlags(typeLiteralNode, context.flags & 1024 ? 0 : 1);
            return typeLiteralNode;
          }
          function typeReferenceToTypeNode(type2) {
            var typeArguments = getTypeArguments(type2);
            if (type2.target === globalArrayType || type2.target === globalReadonlyArrayType) {
              if (context.flags & 2) {
                var typeArgumentNode = typeToTypeNodeHelper(typeArguments[0], context);
                return ts2.factory.createTypeReferenceNode(type2.target === globalArrayType ? "Array" : "ReadonlyArray", [typeArgumentNode]);
              }
              var elementType = typeToTypeNodeHelper(typeArguments[0], context);
              var arrayType = ts2.factory.createArrayTypeNode(elementType);
              return type2.target === globalArrayType ? arrayType : ts2.factory.createTypeOperatorNode(144, arrayType);
            } else if (type2.target.objectFlags & 8) {
              typeArguments = ts2.sameMap(typeArguments, function(t, i2) {
                return removeMissingType(t, !!(type2.target.elementFlags[i2] & 2));
              });
              if (typeArguments.length > 0) {
                var arity = getTypeReferenceArity(type2);
                var tupleConstituentNodes = mapToTypeNodes(typeArguments.slice(0, arity), context);
                if (tupleConstituentNodes) {
                  if (type2.target.labeledElementDeclarations) {
                    for (var i = 0; i < tupleConstituentNodes.length; i++) {
                      var flags = type2.target.elementFlags[i];
                      tupleConstituentNodes[i] = ts2.factory.createNamedTupleMember(flags & 12 ? ts2.factory.createToken(25) : void 0, ts2.factory.createIdentifier(ts2.unescapeLeadingUnderscores(getTupleElementLabel(type2.target.labeledElementDeclarations[i]))), flags & 2 ? ts2.factory.createToken(57) : void 0, flags & 4 ? ts2.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]);
                    }
                  } else {
                    for (var i = 0; i < Math.min(arity, tupleConstituentNodes.length); i++) {
                      var flags = type2.target.elementFlags[i];
                      tupleConstituentNodes[i] = flags & 12 ? ts2.factory.createRestTypeNode(flags & 4 ? ts2.factory.createArrayTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i]) : flags & 2 ? ts2.factory.createOptionalTypeNode(tupleConstituentNodes[i]) : tupleConstituentNodes[i];
                    }
                  }
                  var tupleTypeNode = ts2.setEmitFlags(ts2.factory.createTupleTypeNode(tupleConstituentNodes), 1);
                  return type2.target.readonly ? ts2.factory.createTypeOperatorNode(144, tupleTypeNode) : tupleTypeNode;
                }
              }
              if (context.encounteredError || context.flags & 524288) {
                var tupleTypeNode = ts2.setEmitFlags(ts2.factory.createTupleTypeNode([]), 1);
                return type2.target.readonly ? ts2.factory.createTypeOperatorNode(144, tupleTypeNode) : tupleTypeNode;
              }
              context.encounteredError = true;
              return void 0;
            } else if (context.flags & 2048 && type2.symbol.valueDeclaration && ts2.isClassLike(type2.symbol.valueDeclaration) && !isValueSymbolAccessible(type2.symbol, context.enclosingDeclaration)) {
              return createAnonymousTypeNode(type2);
            } else {
              var outerTypeParameters = type2.target.outerTypeParameters;
              var i = 0;
              var resultType = void 0;
              if (outerTypeParameters) {
                var length_2 = outerTypeParameters.length;
                while (i < length_2) {
                  var start = i;
                  var parent = getParentSymbolOfTypeParameter(outerTypeParameters[i]);
                  do {
                    i++;
                  } while (i < length_2 && getParentSymbolOfTypeParameter(outerTypeParameters[i]) === parent);
                  if (!ts2.rangeEquals(outerTypeParameters, typeArguments, start, i)) {
                    var typeArgumentSlice = mapToTypeNodes(typeArguments.slice(start, i), context);
                    var flags_3 = context.flags;
                    context.flags |= 16;
                    var ref = symbolToTypeNode(parent, context, 788968, typeArgumentSlice);
                    context.flags = flags_3;
                    resultType = !resultType ? ref : appendReferenceToType(resultType, ref);
                  }
                }
              }
              var typeArgumentNodes2 = void 0;
              if (typeArguments.length > 0) {
                var typeParameterCount = (type2.target.typeParameters || ts2.emptyArray).length;
                typeArgumentNodes2 = mapToTypeNodes(typeArguments.slice(i, typeParameterCount), context);
              }
              var flags = context.flags;
              context.flags |= 16;
              var finalRef = symbolToTypeNode(type2.symbol, context, 788968, typeArgumentNodes2);
              context.flags = flags;
              return !resultType ? finalRef : appendReferenceToType(resultType, finalRef);
            }
          }
          function appendReferenceToType(root, ref) {
            if (ts2.isImportTypeNode(root)) {
              var typeArguments = root.typeArguments;
              var qualifier = root.qualifier;
              if (qualifier) {
                if (ts2.isIdentifier(qualifier)) {
                  qualifier = ts2.factory.updateIdentifier(qualifier, typeArguments);
                } else {
                  qualifier = ts2.factory.updateQualifiedName(qualifier, qualifier.left, ts2.factory.updateIdentifier(qualifier.right, typeArguments));
                }
              }
              typeArguments = ref.typeArguments;
              var ids = getAccessStack(ref);
              for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
                var id = ids_1[_i];
                qualifier = qualifier ? ts2.factory.createQualifiedName(qualifier, id) : id;
              }
              return ts2.factory.updateImportTypeNode(root, root.argument, qualifier, typeArguments, root.isTypeOf);
            } else {
              var typeArguments = root.typeArguments;
              var typeName = root.typeName;
              if (ts2.isIdentifier(typeName)) {
                typeName = ts2.factory.updateIdentifier(typeName, typeArguments);
              } else {
                typeName = ts2.factory.updateQualifiedName(typeName, typeName.left, ts2.factory.updateIdentifier(typeName.right, typeArguments));
              }
              typeArguments = ref.typeArguments;
              var ids = getAccessStack(ref);
              for (var _a = 0, ids_2 = ids; _a < ids_2.length; _a++) {
                var id = ids_2[_a];
                typeName = ts2.factory.createQualifiedName(typeName, id);
              }
              return ts2.factory.updateTypeReferenceNode(root, typeName, typeArguments);
            }
          }
          function getAccessStack(ref) {
            var state = ref.typeName;
            var ids = [];
            while (!ts2.isIdentifier(state)) {
              ids.unshift(state.right);
              state = state.left;
            }
            ids.unshift(state);
            return ids;
          }
          function createTypeNodesFromResolvedType(resolvedType) {
            if (checkTruncationLength(context)) {
              return [ts2.factory.createPropertySignature(void 0, "...", void 0, void 0)];
            }
            var typeElements = [];
            for (var _i = 0, _a = resolvedType.callSignatures; _i < _a.length; _i++) {
              var signature = _a[_i];
              typeElements.push(signatureToSignatureDeclarationHelper(signature, 173, context));
            }
            for (var _b = 0, _c = resolvedType.constructSignatures; _b < _c.length; _b++) {
              var signature = _c[_b];
              if (signature.flags & 4)
                continue;
              typeElements.push(signatureToSignatureDeclarationHelper(signature, 174, context));
            }
            for (var _d = 0, _e = resolvedType.indexInfos; _d < _e.length; _d++) {
              var info = _e[_d];
              typeElements.push(indexInfoToIndexSignatureDeclarationHelper(info, context, resolvedType.objectFlags & 1024 ? createElidedInformationPlaceholder(context) : void 0));
            }
            var properties = resolvedType.properties;
            if (!properties) {
              return typeElements;
            }
            var i = 0;
            for (var _f = 0, properties_1 = properties; _f < properties_1.length; _f++) {
              var propertySymbol = properties_1[_f];
              i++;
              if (context.flags & 2048) {
                if (propertySymbol.flags & 4194304) {
                  continue;
                }
                if (ts2.getDeclarationModifierFlagsFromSymbol(propertySymbol) & (8 | 16) && context.tracker.reportPrivateInBaseOfClassExpression) {
                  context.tracker.reportPrivateInBaseOfClassExpression(ts2.unescapeLeadingUnderscores(propertySymbol.escapedName));
                }
              }
              if (checkTruncationLength(context) && i + 2 < properties.length - 1) {
                typeElements.push(ts2.factory.createPropertySignature(void 0, "... ".concat(properties.length - i, " more ..."), void 0, void 0));
                addPropertyToElementList(properties[properties.length - 1], context, typeElements);
                break;
              }
              addPropertyToElementList(propertySymbol, context, typeElements);
            }
            return typeElements.length ? typeElements : void 0;
          }
        }
        function createElidedInformationPlaceholder(context) {
          context.approximateLength += 3;
          if (!(context.flags & 1)) {
            return ts2.factory.createTypeReferenceNode(ts2.factory.createIdentifier("..."), void 0);
          }
          return ts2.factory.createKeywordTypeNode(130);
        }
        function shouldUsePlaceholderForProperty(propertySymbol, context) {
          var _a;
          return !!(ts2.getCheckFlags(propertySymbol) & 8192) && (ts2.contains(context.reverseMappedStack, propertySymbol) || ((_a = context.reverseMappedStack) === null || _a === void 0 ? void 0 : _a[0]) && !(ts2.getObjectFlags(ts2.last(context.reverseMappedStack).propertyType) & 16));
        }
        function addPropertyToElementList(propertySymbol, context, typeElements) {
          var _a, _b;
          var propertyIsReverseMapped = !!(ts2.getCheckFlags(propertySymbol) & 8192);
          var propertyType = shouldUsePlaceholderForProperty(propertySymbol, context) ? anyType : getNonMissingTypeOfSymbol(propertySymbol);
          var saveEnclosingDeclaration = context.enclosingDeclaration;
          context.enclosingDeclaration = void 0;
          if (context.tracker.trackSymbol && ts2.getCheckFlags(propertySymbol) & 4096 && isLateBoundName(propertySymbol.escapedName)) {
            if (propertySymbol.declarations) {
              var decl = ts2.first(propertySymbol.declarations);
              if (hasLateBindableName(decl)) {
                if (ts2.isBinaryExpression(decl)) {
                  var name = ts2.getNameOfDeclaration(decl);
                  if (name && ts2.isElementAccessExpression(name) && ts2.isPropertyAccessEntityNameExpression(name.argumentExpression)) {
                    trackComputedName(name.argumentExpression, saveEnclosingDeclaration, context);
                  }
                } else {
                  trackComputedName(decl.name.expression, saveEnclosingDeclaration, context);
                }
              }
            } else if ((_a = context.tracker) === null || _a === void 0 ? void 0 : _a.reportNonSerializableProperty) {
              context.tracker.reportNonSerializableProperty(symbolToString(propertySymbol));
            }
          }
          context.enclosingDeclaration = propertySymbol.valueDeclaration || ((_b = propertySymbol.declarations) === null || _b === void 0 ? void 0 : _b[0]) || saveEnclosingDeclaration;
          var propertyName = getPropertyNameNodeForSymbol(propertySymbol, context);
          context.enclosingDeclaration = saveEnclosingDeclaration;
          context.approximateLength += ts2.symbolName(propertySymbol).length + 1;
          var optionalToken = propertySymbol.flags & 16777216 ? ts2.factory.createToken(57) : void 0;
          if (propertySymbol.flags & (16 | 8192) && !getPropertiesOfObjectType(propertyType).length && !isReadonlySymbol(propertySymbol)) {
            var signatures = getSignaturesOfType(filterType(propertyType, function(t) {
              return !(t.flags & 32768);
            }), 0);
            for (var _i = 0, signatures_1 = signatures; _i < signatures_1.length; _i++) {
              var signature = signatures_1[_i];
              var methodDeclaration = signatureToSignatureDeclarationHelper(signature, 167, context, { name: propertyName, questionToken: optionalToken });
              typeElements.push(preserveCommentsOn(methodDeclaration));
            }
          } else {
            var propertyTypeNode = void 0;
            if (shouldUsePlaceholderForProperty(propertySymbol, context)) {
              propertyTypeNode = createElidedInformationPlaceholder(context);
            } else {
              if (propertyIsReverseMapped) {
                context.reverseMappedStack || (context.reverseMappedStack = []);
                context.reverseMappedStack.push(propertySymbol);
              }
              propertyTypeNode = propertyType ? serializeTypeForDeclaration(context, propertyType, propertySymbol, saveEnclosingDeclaration) : ts2.factory.createKeywordTypeNode(130);
              if (propertyIsReverseMapped) {
                context.reverseMappedStack.pop();
              }
            }
            var modifiers = isReadonlySymbol(propertySymbol) ? [ts2.factory.createToken(144)] : void 0;
            if (modifiers) {
              context.approximateLength += 9;
            }
            var propertySignature = ts2.factory.createPropertySignature(modifiers, propertyName, optionalToken, propertyTypeNode);
            typeElements.push(preserveCommentsOn(propertySignature));
          }
          function preserveCommentsOn(node) {
            var _a2;
            if (ts2.some(propertySymbol.declarations, function(d2) {
              return d2.kind === 345;
            })) {
              var d = (_a2 = propertySymbol.declarations) === null || _a2 === void 0 ? void 0 : _a2.find(function(d2) {
                return d2.kind === 345;
              });
              var commentText = ts2.getTextOfJSDocComment(d.comment);
              if (commentText) {
                ts2.setSyntheticLeadingComments(node, [{ kind: 3, text: "*\n * " + commentText.replace(/\n/g, "\n * ") + "\n ", pos: -1, end: -1, hasTrailingNewLine: true }]);
              }
            } else if (propertySymbol.valueDeclaration) {
              ts2.setCommentRange(node, propertySymbol.valueDeclaration);
            }
            return node;
          }
        }
        function mapToTypeNodes(types, context, isBareList) {
          if (ts2.some(types)) {
            if (checkTruncationLength(context)) {
              if (!isBareList) {
                return [ts2.factory.createTypeReferenceNode("...", void 0)];
              } else if (types.length > 2) {
                return [
                  typeToTypeNodeHelper(types[0], context),
                  ts2.factory.createTypeReferenceNode("... ".concat(types.length - 2, " more ..."), void 0),
                  typeToTypeNodeHelper(types[types.length - 1], context)
                ];
              }
            }
            var mayHaveNameCollisions = !(context.flags & 64);
            var seenNames = mayHaveNameCollisions ? ts2.createUnderscoreEscapedMultiMap() : void 0;
            var result_5 = [];
            var i = 0;
            for (var _i = 0, types_2 = types; _i < types_2.length; _i++) {
              var type = types_2[_i];
              i++;
              if (checkTruncationLength(context) && i + 2 < types.length - 1) {
                result_5.push(ts2.factory.createTypeReferenceNode("... ".concat(types.length - i, " more ..."), void 0));
                var typeNode_1 = typeToTypeNodeHelper(types[types.length - 1], context);
                if (typeNode_1) {
                  result_5.push(typeNode_1);
                }
                break;
              }
              context.approximateLength += 2;
              var typeNode = typeToTypeNodeHelper(type, context);
              if (typeNode) {
                result_5.push(typeNode);
                if (seenNames && ts2.isIdentifierTypeReference(typeNode)) {
                  seenNames.add(typeNode.typeName.escapedText, [type, result_5.length - 1]);
                }
              }
            }
            if (seenNames) {
              var saveContextFlags = context.flags;
              context.flags |= 64;
              seenNames.forEach(function(types2) {
                if (!ts2.arrayIsHomogeneous(types2, function(_a2, _b) {
                  var a = _a2[0];
                  var b = _b[0];
                  return typesAreSameReference(a, b);
                })) {
                  for (var _i2 = 0, types_3 = types2; _i2 < types_3.length; _i2++) {
                    var _a = types_3[_i2], type2 = _a[0], resultIndex = _a[1];
                    result_5[resultIndex] = typeToTypeNodeHelper(type2, context);
                  }
                }
              });
              context.flags = saveContextFlags;
            }
            return result_5;
          }
        }
        function typesAreSameReference(a, b) {
          return a === b || !!a.symbol && a.symbol === b.symbol || !!a.aliasSymbol && a.aliasSymbol === b.aliasSymbol;
        }
        function indexInfoToIndexSignatureDeclarationHelper(indexInfo, context, typeNode) {
          var name = ts2.getNameFromIndexInfo(indexInfo) || "x";
          var indexerTypeNode = typeToTypeNodeHelper(indexInfo.keyType, context);
          var indexingParameter = ts2.factory.createParameterDeclaration(void 0, void 0, void 0, name, void 0, indexerTypeNode, void 0);
          if (!typeNode) {
            typeNode = typeToTypeNodeHelper(indexInfo.type || anyType, context);
          }
          if (!indexInfo.type && !(context.flags & 2097152)) {
            context.encounteredError = true;
          }
          context.approximateLength += name.length + 4;
          return ts2.factory.createIndexSignature(void 0, indexInfo.isReadonly ? [ts2.factory.createToken(144)] : void 0, [indexingParameter], typeNode);
        }
        function signatureToSignatureDeclarationHelper(signature, kind, context, options) {
          var _a, _b, _c, _d;
          var suppressAny = context.flags & 256;
          if (suppressAny)
            context.flags &= ~256;
          context.approximateLength += 3;
          var typeParameters;
          var typeArguments;
          if (context.flags & 32 && signature.target && signature.mapper && signature.target.typeParameters) {
            typeArguments = signature.target.typeParameters.map(function(parameter) {
              return typeToTypeNodeHelper(instantiateType(parameter, signature.mapper), context);
            });
          } else {
            typeParameters = signature.typeParameters && signature.typeParameters.map(function(parameter) {
              return typeParameterToDeclaration(parameter, context);
            });
          }
          var expandedParams = getExpandedParameters(signature, true)[0];
          var parameters = (ts2.some(expandedParams, function(p) {
            return p !== expandedParams[expandedParams.length - 1] && !!(ts2.getCheckFlags(p) & 32768);
          }) ? signature.parameters : expandedParams).map(function(parameter) {
            return symbolToParameterDeclaration(parameter, context, kind === 170, options === null || options === void 0 ? void 0 : options.privateSymbolVisitor, options === null || options === void 0 ? void 0 : options.bundledImports);
          });
          if (signature.thisParameter) {
            var thisParameter = symbolToParameterDeclaration(signature.thisParameter, context);
            parameters.unshift(thisParameter);
          }
          var returnTypeNode;
          var typePredicate = getTypePredicateOfSignature(signature);
          if (typePredicate) {
            var assertsModifier = typePredicate.kind === 2 || typePredicate.kind === 3 ? ts2.factory.createToken(128) : void 0;
            var parameterName = typePredicate.kind === 1 || typePredicate.kind === 3 ? ts2.setEmitFlags(ts2.factory.createIdentifier(typePredicate.parameterName), 16777216) : ts2.factory.createThisTypeNode();
            var typeNode = typePredicate.type && typeToTypeNodeHelper(typePredicate.type, context);
            returnTypeNode = ts2.factory.createTypePredicateNode(assertsModifier, parameterName, typeNode);
          } else {
            var returnType = getReturnTypeOfSignature(signature);
            if (returnType && !(suppressAny && isTypeAny(returnType))) {
              returnTypeNode = serializeReturnTypeForSignature(context, returnType, signature, options === null || options === void 0 ? void 0 : options.privateSymbolVisitor, options === null || options === void 0 ? void 0 : options.bundledImports);
            } else if (!suppressAny) {
              returnTypeNode = ts2.factory.createKeywordTypeNode(130);
            }
          }
          var modifiers = options === null || options === void 0 ? void 0 : options.modifiers;
          if (kind === 179 && signature.flags & 4) {
            var flags = ts2.modifiersToFlags(modifiers);
            modifiers = ts2.factory.createModifiersFromModifierFlags(flags | 128);
          }
          var node = kind === 173 ? ts2.factory.createCallSignature(typeParameters, parameters, returnTypeNode) : kind === 174 ? ts2.factory.createConstructSignature(typeParameters, parameters, returnTypeNode) : kind === 167 ? ts2.factory.createMethodSignature(modifiers, (_a = options === null || options === void 0 ? void 0 : options.name) !== null && _a !== void 0 ? _a : ts2.factory.createIdentifier(""), options === null || options === void 0 ? void 0 : options.questionToken, typeParameters, parameters, returnTypeNode) : kind === 168 ? ts2.factory.createMethodDeclaration(void 0, modifiers, void 0, (_b = options === null || options === void 0 ? void 0 : options.name) !== null && _b !== void 0 ? _b : ts2.factory.createIdentifier(""), void 0, typeParameters, parameters, returnTypeNode, void 0) : kind === 170 ? ts2.factory.createConstructorDeclaration(void 0, modifiers, parameters, void 0) : kind === 171 ? ts2.factory.createGetAccessorDeclaration(void 0, modifiers, (_c = options === null || options === void 0 ? void 0 : options.name) !== null && _c !== void 0 ? _c : ts2.factory.createIdentifier(""), parameters, returnTypeNode, void 0) : kind === 172 ? ts2.factory.createSetAccessorDeclaration(void 0, modifiers, (_d = options === null || options === void 0 ? void 0 : options.name) !== null && _d !== void 0 ? _d : ts2.factory.createIdentifier(""), parameters, void 0) : kind === 175 ? ts2.factory.createIndexSignature(void 0, modifiers, parameters, returnTypeNode) : kind === 315 ? ts2.factory.createJSDocFunctionType(parameters, returnTypeNode) : kind === 178 ? ts2.factory.createFunctionTypeNode(typeParameters, parameters, returnTypeNode !== null && returnTypeNode !== void 0 ? returnTypeNode : ts2.factory.createTypeReferenceNode(ts2.factory.createIdentifier(""))) : kind === 179 ? ts2.factory.createConstructorTypeNode(modifiers, typeParameters, parameters, returnTypeNode !== null && returnTypeNode !== void 0 ? returnTypeNode : ts2.factory.createTypeReferenceNode(ts2.factory.createIdentifier(""))) : kind === 255 ? ts2.factory.createFunctionDeclaration(void 0, modifiers, void 0, (options === null || options === void 0 ? void 0 : options.name) ? ts2.cast(options.name, ts2.isIdentifier) : ts2.factory.createIdentifier(""), typeParameters, parameters, returnTypeNode, void 0) : kind === 212 ? ts2.factory.createFunctionExpression(modifiers, void 0, (options === null || options === void 0 ? void 0 : options.name) ? ts2.cast(options.name, ts2.isIdentifier) : ts2.factory.createIdentifier(""), typeParameters, parameters, returnTypeNode, ts2.factory.createBlock([])) : kind === 213 ? ts2.factory.createArrowFunction(modifiers, typeParameters, parameters, returnTypeNode, void 0, ts2.factory.createBlock([])) : ts2.Debug.assertNever(kind);
          if (typeArguments) {
            node.typeArguments = ts2.factory.createNodeArray(typeArguments);
          }
          return node;
        }
        function typeParameterToDeclarationWithConstraint(type, context, constraintNode) {
          var savedContextFlags = context.flags;
          context.flags &= ~512;
          var name = typeParameterToName(type, context);
          var defaultParameter = getDefaultFromTypeParameter(type);
          var defaultParameterNode = defaultParameter && typeToTypeNodeHelper(defaultParameter, context);
          context.flags = savedContextFlags;
          return ts2.factory.createTypeParameterDeclaration(name, constraintNode, defaultParameterNode);
        }
        function typeParameterToDeclaration(type, context, constraint) {
          if (constraint === void 0) {
            constraint = getConstraintOfTypeParameter(type);
          }
          var constraintNode = constraint && typeToTypeNodeHelper(constraint, context);
          return typeParameterToDeclarationWithConstraint(type, context, constraintNode);
        }
        function symbolToParameterDeclaration(parameterSymbol, context, preserveModifierFlags, privateSymbolVisitor, bundledImports) {
          var parameterDeclaration = ts2.getDeclarationOfKind(parameterSymbol, 163);
          if (!parameterDeclaration && !ts2.isTransientSymbol(parameterSymbol)) {
            parameterDeclaration = ts2.getDeclarationOfKind(parameterSymbol, 338);
          }
          var parameterType = getTypeOfSymbol(parameterSymbol);
          if (parameterDeclaration && isRequiredInitializedParameter(parameterDeclaration)) {
            parameterType = getOptionalType(parameterType);
          }
          if (context.flags & 1073741824 && parameterDeclaration && !ts2.isJSDocParameterTag(parameterDeclaration) && isOptionalUninitializedParameter(parameterDeclaration)) {
            parameterType = getTypeWithFacts(parameterType, 524288);
          }
          var parameterTypeNode = serializeTypeForDeclaration(context, parameterType, parameterSymbol, context.enclosingDeclaration, privateSymbolVisitor, bundledImports);
          var modifiers = !(context.flags & 8192) && preserveModifierFlags && parameterDeclaration && parameterDeclaration.modifiers ? parameterDeclaration.modifiers.map(ts2.factory.cloneNode) : void 0;
          var isRest = parameterDeclaration && ts2.isRestParameter(parameterDeclaration) || ts2.getCheckFlags(parameterSymbol) & 32768;
          var dotDotDotToken = isRest ? ts2.factory.createToken(25) : void 0;
          var name = parameterDeclaration ? parameterDeclaration.name ? parameterDeclaration.name.kind === 79 ? ts2.setEmitFlags(ts2.factory.cloneNode(parameterDeclaration.name), 16777216) : parameterDeclaration.name.kind === 160 ? ts2.setEmitFlags(ts2.factory.cloneNode(parameterDeclaration.name.right), 16777216) : cloneBindingName(parameterDeclaration.name) : ts2.symbolName(parameterSymbol) : ts2.symbolName(parameterSymbol);
          var isOptional = parameterDeclaration && isOptionalParameter(parameterDeclaration) || ts2.getCheckFlags(parameterSymbol) & 16384;
          var questionToken = isOptional ? ts2.factory.createToken(57) : void 0;
          var parameterNode = ts2.factory.createParameterDeclaration(void 0, modifiers, dotDotDotToken, name, questionToken, parameterTypeNode, void 0);
          context.approximateLength += ts2.symbolName(parameterSymbol).length + 3;
          return parameterNode;
          function cloneBindingName(node) {
            return elideInitializerAndSetEmitFlags(node);
            function elideInitializerAndSetEmitFlags(node2) {
              if (context.tracker.trackSymbol && ts2.isComputedPropertyName(node2) && isLateBindableName(node2)) {
                trackComputedName(node2.expression, context.enclosingDeclaration, context);
              }
              var visited = ts2.visitEachChild(node2, elideInitializerAndSetEmitFlags, ts2.nullTransformationContext, void 0, elideInitializerAndSetEmitFlags);
              if (ts2.isBindingElement(visited)) {
                visited = ts2.factory.updateBindingElement(visited, visited.dotDotDotToken, visited.propertyName, visited.name, void 0);
              }
              if (!ts2.nodeIsSynthesized(visited)) {
                visited = ts2.factory.cloneNode(visited);
              }
              return ts2.setEmitFlags(visited, 1 | 16777216);
            }
          }
        }
        function trackComputedName(accessExpression, enclosingDeclaration, context) {
          if (!context.tracker.trackSymbol)
            return;
          var firstIdentifier = ts2.getFirstIdentifier(accessExpression);
          var name = resolveName(firstIdentifier, firstIdentifier.escapedText, 111551 | 1048576, void 0, void 0, true);
          if (name) {
            context.tracker.trackSymbol(name, enclosingDeclaration, 111551);
          }
        }
        function lookupSymbolChain(symbol, context, meaning, yieldModuleSymbol) {
          context.tracker.trackSymbol(symbol, context.enclosingDeclaration, meaning);
          return lookupSymbolChainWorker(symbol, context, meaning, yieldModuleSymbol);
        }
        function lookupSymbolChainWorker(symbol, context, meaning, yieldModuleSymbol) {
          var chain;
          var isTypeParameter = symbol.flags & 262144;
          if (!isTypeParameter && (context.enclosingDeclaration || context.flags & 64) && !(context.flags & 134217728)) {
            chain = ts2.Debug.checkDefined(getSymbolChain(symbol, meaning, true));
            ts2.Debug.assert(chain && chain.length > 0);
          } else {
            chain = [symbol];
          }
          return chain;
          function getSymbolChain(symbol2, meaning2, endOfChain) {
            var accessibleSymbolChain = getAccessibleSymbolChain(symbol2, context.enclosingDeclaration, meaning2, !!(context.flags & 128));
            var parentSpecifiers;
            if (!accessibleSymbolChain || needsQualification(accessibleSymbolChain[0], context.enclosingDeclaration, accessibleSymbolChain.length === 1 ? meaning2 : getQualifiedLeftMeaning(meaning2))) {
              var parents_1 = getContainersOfSymbol(accessibleSymbolChain ? accessibleSymbolChain[0] : symbol2, context.enclosingDeclaration, meaning2);
              if (ts2.length(parents_1)) {
                parentSpecifiers = parents_1.map(function(symbol3) {
                  return ts2.some(symbol3.declarations, hasNonGlobalAugmentationExternalModuleSymbol) ? getSpecifierForModuleSymbol(symbol3, context) : void 0;
                });
                var indices = parents_1.map(function(_, i) {
                  return i;
                });
                indices.sort(sortByBestName);
                var sortedParents = indices.map(function(i) {
                  return parents_1[i];
                });
                for (var _i = 0, sortedParents_1 = sortedParents; _i < sortedParents_1.length; _i++) {
                  var parent = sortedParents_1[_i];
                  var parentChain = getSymbolChain(parent, getQualifiedLeftMeaning(meaning2), false);
                  if (parentChain) {
                    if (parent.exports && parent.exports.get("export=") && getSymbolIfSameReference(parent.exports.get("export="), symbol2)) {
                      accessibleSymbolChain = parentChain;
                      break;
                    }
                    accessibleSymbolChain = parentChain.concat(accessibleSymbolChain || [getAliasForSymbolInContainer(parent, symbol2) || symbol2]);
                    break;
                  }
                }
              }
            }
            if (accessibleSymbolChain) {
              return accessibleSymbolChain;
            }
            if (endOfChain || !(symbol2.flags & (2048 | 4096))) {
              if (!endOfChain && !yieldModuleSymbol && !!ts2.forEach(symbol2.declarations, hasNonGlobalAugmentationExternalModuleSymbol)) {
                return;
              }
              return [symbol2];
            }
            function sortByBestName(a, b) {
              var specifierA = parentSpecifiers[a];
              var specifierB = parentSpecifiers[b];
              if (specifierA && specifierB) {
                var isBRelative = ts2.pathIsRelative(specifierB);
                if (ts2.pathIsRelative(specifierA) === isBRelative) {
                  return ts2.moduleSpecifiers.countPathComponents(specifierA) - ts2.moduleSpecifiers.countPathComponents(specifierB);
                }
                if (isBRelative) {
                  return -1;
                }
                return 1;
              }
              return 0;
            }
          }
        }
        function typeParametersToTypeParameterDeclarations(symbol, context) {
          var typeParameterNodes;
          var targetSymbol = getTargetSymbol(symbol);
          if (targetSymbol.flags & (32 | 64 | 524288)) {
            typeParameterNodes = ts2.factory.createNodeArray(ts2.map(getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol), function(tp) {
              return typeParameterToDeclaration(tp, context);
            }));
          }
          return typeParameterNodes;
        }
        function lookupTypeParameterNodes(chain, index, context) {
          var _a;
          ts2.Debug.assert(chain && 0 <= index && index < chain.length);
          var symbol = chain[index];
          var symbolId = getSymbolId(symbol);
          if ((_a = context.typeParameterSymbolList) === null || _a === void 0 ? void 0 : _a.has(symbolId)) {
            return void 0;
          }
          (context.typeParameterSymbolList || (context.typeParameterSymbolList = new ts2.Set())).add(symbolId);
          var typeParameterNodes;
          if (context.flags & 512 && index < chain.length - 1) {
            var parentSymbol = symbol;
            var nextSymbol_1 = chain[index + 1];
            if (ts2.getCheckFlags(nextSymbol_1) & 1) {
              var params = getTypeParametersOfClassOrInterface(parentSymbol.flags & 2097152 ? resolveAlias(parentSymbol) : parentSymbol);
              typeParameterNodes = mapToTypeNodes(ts2.map(params, function(t) {
                return getMappedType(t, nextSymbol_1.mapper);
              }), context);
            } else {
              typeParameterNodes = typeParametersToTypeParameterDeclarations(symbol, context);
            }
          }
          return typeParameterNodes;
        }
        function getTopmostIndexedAccessType(top) {
          if (ts2.isIndexedAccessTypeNode(top.objectType)) {
            return getTopmostIndexedAccessType(top.objectType);
          }
          return top;
        }
        function getSpecifierForModuleSymbol(symbol, context) {
          var _a;
          var file = ts2.getDeclarationOfKind(symbol, 303);
          if (!file) {
            var equivalentFileSymbol = ts2.firstDefined(symbol.declarations, function(d) {
              return getFileSymbolIfFileSymbolExportEqualsContainer(d, symbol);
            });
            if (equivalentFileSymbol) {
              file = ts2.getDeclarationOfKind(equivalentFileSymbol, 303);
            }
          }
          if (file && file.moduleName !== void 0) {
            return file.moduleName;
          }
          if (!file) {
            if (context.tracker.trackReferencedAmbientModule) {
              var ambientDecls = ts2.filter(symbol.declarations, ts2.isAmbientModule);
              if (ts2.length(ambientDecls)) {
                for (var _i = 0, _b = ambientDecls; _i < _b.length; _i++) {
                  var decl = _b[_i];
                  context.tracker.trackReferencedAmbientModule(decl, symbol);
                }
              }
            }
            if (ambientModuleSymbolRegex.test(symbol.escapedName)) {
              return symbol.escapedName.substring(1, symbol.escapedName.length - 1);
            }
          }
          if (!context.enclosingDeclaration || !context.tracker.moduleResolverHost) {
            if (ambientModuleSymbolRegex.test(symbol.escapedName)) {
              return symbol.escapedName.substring(1, symbol.escapedName.length - 1);
            }
            return ts2.getSourceFileOfNode(ts2.getNonAugmentationDeclaration(symbol)).fileName;
          }
          var contextFile = ts2.getSourceFileOfNode(ts2.getOriginalNode(context.enclosingDeclaration));
          var links = getSymbolLinks(symbol);
          var specifier = links.specifierCache && links.specifierCache.get(contextFile.path);
          if (!specifier) {
            var isBundle_1 = !!ts2.outFile(compilerOptions);
            var moduleResolverHost = context.tracker.moduleResolverHost;
            var specifierCompilerOptions = isBundle_1 ? __assign(__assign({}, compilerOptions), { baseUrl: moduleResolverHost.getCommonSourceDirectory() }) : compilerOptions;
            specifier = ts2.first(ts2.moduleSpecifiers.getModuleSpecifiers(symbol, checker, specifierCompilerOptions, contextFile, moduleResolverHost, { importModuleSpecifierPreference: isBundle_1 ? "non-relative" : "project-relative", importModuleSpecifierEnding: isBundle_1 ? "minimal" : void 0 }));
            (_a = links.specifierCache) !== null && _a !== void 0 ? _a : links.specifierCache = new ts2.Map();
            links.specifierCache.set(contextFile.path, specifier);
          }
          return specifier;
        }
        function symbolToEntityNameNode(symbol) {
          var identifier = ts2.factory.createIdentifier(ts2.unescapeLeadingUnderscores(symbol.escapedName));
          return symbol.parent ? ts2.factory.createQualifiedName(symbolToEntityNameNode(symbol.parent), identifier) : identifier;
        }
        function symbolToTypeNode(symbol, context, meaning, overrideTypeArguments) {
          var chain = lookupSymbolChain(symbol, context, meaning, !(context.flags & 16384));
          var isTypeOf = meaning === 111551;
          if (ts2.some(chain[0].declarations, hasNonGlobalAugmentationExternalModuleSymbol)) {
            var nonRootParts = chain.length > 1 ? createAccessFromSymbolChain(chain, chain.length - 1, 1) : void 0;
            var typeParameterNodes = overrideTypeArguments || lookupTypeParameterNodes(chain, 0, context);
            var specifier = getSpecifierForModuleSymbol(chain[0], context);
            if (!(context.flags & 67108864) && ts2.getEmitModuleResolutionKind(compilerOptions) !== ts2.ModuleResolutionKind.Classic && specifier.indexOf("/node_modules/") >= 0) {
              context.encounteredError = true;
              if (context.tracker.reportLikelyUnsafeImportRequiredError) {
                context.tracker.reportLikelyUnsafeImportRequiredError(specifier);
              }
            }
            var lit = ts2.factory.createLiteralTypeNode(ts2.factory.createStringLiteral(specifier));
            if (context.tracker.trackExternalModuleSymbolOfImportTypeNode)
              context.tracker.trackExternalModuleSymbolOfImportTypeNode(chain[0]);
            context.approximateLength += specifier.length + 10;
            if (!nonRootParts || ts2.isEntityName(nonRootParts)) {
              if (nonRootParts) {
                var lastId = ts2.isIdentifier(nonRootParts) ? nonRootParts : nonRootParts.right;
                lastId.typeArguments = void 0;
              }
              return ts2.factory.createImportTypeNode(lit, nonRootParts, typeParameterNodes, isTypeOf);
            } else {
              var splitNode = getTopmostIndexedAccessType(nonRootParts);
              var qualifier = splitNode.objectType.typeName;
              return ts2.factory.createIndexedAccessTypeNode(ts2.factory.createImportTypeNode(lit, qualifier, typeParameterNodes, isTypeOf), splitNode.indexType);
            }
          }
          var entityName = createAccessFromSymbolChain(chain, chain.length - 1, 0);
          if (ts2.isIndexedAccessTypeNode(entityName)) {
            return entityName;
          }
          if (isTypeOf) {
            return ts2.factory.createTypeQueryNode(entityName);
          } else {
            var lastId = ts2.isIdentifier(entityName) ? entityName : entityName.right;
            var lastTypeArgs = lastId.typeArguments;
            lastId.typeArguments = void 0;
            return ts2.factory.createTypeReferenceNode(entityName, lastTypeArgs);
          }
          function createAccessFromSymbolChain(chain2, index, stopper) {
            var typeParameterNodes2 = index === chain2.length - 1 ? overrideTypeArguments : lookupTypeParameterNodes(chain2, index, context);
            var symbol2 = chain2[index];
            var parent = chain2[index - 1];
            var symbolName;
            if (index === 0) {
              context.flags |= 16777216;
              symbolName = getNameOfSymbolAsWritten(symbol2, context);
              context.approximateLength += (symbolName ? symbolName.length : 0) + 1;
              context.flags ^= 16777216;
            } else {
              if (parent && getExportsOfSymbol(parent)) {
                var exports_1 = getExportsOfSymbol(parent);
                ts2.forEachEntry(exports_1, function(ex, name) {
                  if (getSymbolIfSameReference(ex, symbol2) && !isLateBoundName(name) && name !== "export=") {
                    symbolName = ts2.unescapeLeadingUnderscores(name);
                    return true;
                  }
                });
              }
            }
            if (!symbolName) {
              symbolName = getNameOfSymbolAsWritten(symbol2, context);
            }
            context.approximateLength += symbolName.length + 1;
            if (!(context.flags & 16) && parent && getMembersOfSymbol(parent) && getMembersOfSymbol(parent).get(symbol2.escapedName) && getSymbolIfSameReference(getMembersOfSymbol(parent).get(symbol2.escapedName), symbol2)) {
              var LHS = createAccessFromSymbolChain(chain2, index - 1, stopper);
              if (ts2.isIndexedAccessTypeNode(LHS)) {
                return ts2.factory.createIndexedAccessTypeNode(LHS, ts2.factory.createLiteralTypeNode(ts2.factory.createStringLiteral(symbolName)));
              } else {
                return ts2.factory.createIndexedAccessTypeNode(ts2.factory.createTypeReferenceNode(LHS, typeParameterNodes2), ts2.factory.createLiteralTypeNode(ts2.factory.createStringLiteral(symbolName)));
              }
            }
            var identifier = ts2.setEmitFlags(ts2.factory.createIdentifier(symbolName, typeParameterNodes2), 16777216);
            identifier.symbol = symbol2;
            if (index > stopper) {
              var LHS = createAccessFromSymbolChain(chain2, index - 1, stopper);
              if (!ts2.isEntityName(LHS)) {
                return ts2.Debug.fail("Impossible construct - an export of an indexed access cannot be reachable");
              }
              return ts2.factory.createQualifiedName(LHS, identifier);
            }
            return identifier;
          }
        }
        function typeParameterShadowsNameInScope(escapedName, context, type) {
          var result = resolveName(context.enclosingDeclaration, escapedName, 788968, void 0, escapedName, false);
          if (result) {
            if (result.flags & 262144 && result === type.symbol) {
              return false;
            }
            return true;
          }
          return false;
        }
        function typeParameterToName(type, context) {
          var _a, _b;
          if (context.flags & 4 && context.typeParameterNames) {
            var cached = context.typeParameterNames.get(getTypeId(type));
            if (cached) {
              return cached;
            }
          }
          var result = symbolToName(type.symbol, context, 788968, true);
          if (!(result.kind & 79)) {
            return ts2.factory.createIdentifier("(Missing type parameter)");
          }
          if (context.flags & 4) {
            var rawtext = result.escapedText;
            var i = ((_a = context.typeParameterNamesByTextNextNameCount) === null || _a === void 0 ? void 0 : _a.get(rawtext)) || 0;
            var text = rawtext;
            while (((_b = context.typeParameterNamesByText) === null || _b === void 0 ? void 0 : _b.has(text)) || typeParameterShadowsNameInScope(text, context, type)) {
              i++;
              text = "".concat(rawtext, "_").concat(i);
            }
            if (text !== rawtext) {
              result = ts2.factory.createIdentifier(text, result.typeArguments);
            }
            (context.typeParameterNamesByTextNextNameCount || (context.typeParameterNamesByTextNextNameCount = new ts2.Map())).set(rawtext, i);
            (context.typeParameterNames || (context.typeParameterNames = new ts2.Map())).set(getTypeId(type), result);
            (context.typeParameterNamesByText || (context.typeParameterNamesByText = new ts2.Set())).add(rawtext);
          }
          return result;
        }
        function symbolToName(symbol, context, meaning, expectsIdentifier) {
          var chain = lookupSymbolChain(symbol, context, meaning);
          if (expectsIdentifier && chain.length !== 1 && !context.encounteredError && !(context.flags & 65536)) {
            context.encounteredError = true;
          }
          return createEntityNameFromSymbolChain(chain, chain.length - 1);
          function createEntityNameFromSymbolChain(chain2, index) {
            var typeParameterNodes = lookupTypeParameterNodes(chain2, index, context);
            var symbol2 = chain2[index];
            if (index === 0) {
              context.flags |= 16777216;
            }
            var symbolName = getNameOfSymbolAsWritten(symbol2, context);
            if (index === 0) {
              context.flags ^= 16777216;
            }
            var identifier = ts2.setEmitFlags(ts2.factory.createIdentifier(symbolName, typeParameterNodes), 16777216);
            identifier.symbol = symbol2;
            return index > 0 ? ts2.factory.createQualifiedName(createEntityNameFromSymbolChain(chain2, index - 1), identifier) : identifier;
          }
        }
        function symbolToExpression(symbol, context, meaning) {
          var chain = lookupSymbolChain(symbol, context, meaning);
          return createExpressionFromSymbolChain(chain, chain.length - 1);
          function createExpressionFromSymbolChain(chain2, index) {
            var typeParameterNodes = lookupTypeParameterNodes(chain2, index, context);
            var symbol2 = chain2[index];
            if (index === 0) {
              context.flags |= 16777216;
            }
            var symbolName = getNameOfSymbolAsWritten(symbol2, context);
            if (index === 0) {
              context.flags ^= 16777216;
            }
            var firstChar = symbolName.charCodeAt(0);
            if (ts2.isSingleOrDoubleQuote(firstChar) && ts2.some(symbol2.declarations, hasNonGlobalAugmentationExternalModuleSymbol)) {
              return ts2.factory.createStringLiteral(getSpecifierForModuleSymbol(symbol2, context));
            }
            var canUsePropertyAccess = firstChar === 35 ? symbolName.length > 1 && ts2.isIdentifierStart(symbolName.charCodeAt(1), languageVersion) : ts2.isIdentifierStart(firstChar, languageVersion);
            if (index === 0 || canUsePropertyAccess) {
              var identifier = ts2.setEmitFlags(ts2.factory.createIdentifier(symbolName, typeParameterNodes), 16777216);
              identifier.symbol = symbol2;
              return index > 0 ? ts2.factory.createPropertyAccessExpression(createExpressionFromSymbolChain(chain2, index - 1), identifier) : identifier;
            } else {
              if (firstChar === 91) {
                symbolName = symbolName.substring(1, symbolName.length - 1);
                firstChar = symbolName.charCodeAt(0);
              }
              var expression = void 0;
              if (ts2.isSingleOrDoubleQuote(firstChar)) {
                expression = ts2.factory.createStringLiteral(symbolName.substring(1, symbolName.length - 1).replace(/\\./g, function(s) {
                  return s.substring(1);
                }), firstChar === 39);
              } else if ("" + +symbolName === symbolName) {
                expression = ts2.factory.createNumericLiteral(+symbolName);
              }
              if (!expression) {
                expression = ts2.setEmitFlags(ts2.factory.createIdentifier(symbolName, typeParameterNodes), 16777216);
                expression.symbol = symbol2;
              }
              return ts2.factory.createElementAccessExpression(createExpressionFromSymbolChain(chain2, index - 1), expression);
            }
          }
        }
        function isStringNamed(d) {
          var name = ts2.getNameOfDeclaration(d);
          return !!name && ts2.isStringLiteral(name);
        }
        function isSingleQuotedStringNamed(d) {
          var name = ts2.getNameOfDeclaration(d);
          return !!(name && ts2.isStringLiteral(name) && (name.singleQuote || !ts2.nodeIsSynthesized(name) && ts2.startsWith(ts2.getTextOfNode(name, false), "'")));
        }
        function getPropertyNameNodeForSymbol(symbol, context) {
          var singleQuote = !!ts2.length(symbol.declarations) && ts2.every(symbol.declarations, isSingleQuotedStringNamed);
          var fromNameType = getPropertyNameNodeForSymbolFromNameType(symbol, context, singleQuote);
          if (fromNameType) {
            return fromNameType;
          }
          var rawName = ts2.unescapeLeadingUnderscores(symbol.escapedName);
          var stringNamed = !!ts2.length(symbol.declarations) && ts2.every(symbol.declarations, isStringNamed);
          return createPropertyNameNodeForIdentifierOrLiteral(rawName, stringNamed, singleQuote);
        }
        function getPropertyNameNodeForSymbolFromNameType(symbol, context, singleQuote) {
          var nameType = getSymbolLinks(symbol).nameType;
          if (nameType) {
            if (nameType.flags & 384) {
              var name = "" + nameType.value;
              if (!ts2.isIdentifierText(name, ts2.getEmitScriptTarget(compilerOptions)) && !isNumericLiteralName(name)) {
                return ts2.factory.createStringLiteral(name, !!singleQuote);
              }
              if (isNumericLiteralName(name) && ts2.startsWith(name, "-")) {
                return ts2.factory.createComputedPropertyName(ts2.factory.createNumericLiteral(+name));
              }
              return createPropertyNameNodeForIdentifierOrLiteral(name);
            }
            if (nameType.flags & 8192) {
              return ts2.factory.createComputedPropertyName(symbolToExpression(nameType.symbol, context, 111551));
            }
          }
        }
        function createPropertyNameNodeForIdentifierOrLiteral(name, stringNamed, singleQuote) {
          return ts2.isIdentifierText(name, ts2.getEmitScriptTarget(compilerOptions)) ? ts2.factory.createIdentifier(name) : !stringNamed && isNumericLiteralName(name) && +name >= 0 ? ts2.factory.createNumericLiteral(+name) : ts2.factory.createStringLiteral(name, !!singleQuote);
        }
        function cloneNodeBuilderContext(context) {
          var initial = __assign({}, context);
          if (initial.typeParameterNames) {
            initial.typeParameterNames = new ts2.Map(initial.typeParameterNames);
          }
          if (initial.typeParameterNamesByText) {
            initial.typeParameterNamesByText = new ts2.Set(initial.typeParameterNamesByText);
          }
          if (initial.typeParameterSymbolList) {
            initial.typeParameterSymbolList = new ts2.Set(initial.typeParameterSymbolList);
          }
          initial.tracker = wrapSymbolTrackerToReportForContext(initial, initial.tracker);
          return initial;
        }
        function getDeclarationWithTypeAnnotation(symbol, enclosingDeclaration) {
          return symbol.declarations && ts2.find(symbol.declarations, function(s) {
            return !!ts2.getEffectiveTypeAnnotationNode(s) && (!enclosingDeclaration || !!ts2.findAncestor(s, function(n) {
              return n === enclosingDeclaration;
            }));
          });
        }
        function existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(existing, type) {
          return !(ts2.getObjectFlags(type) & 4) || !ts2.isTypeReferenceNode(existing) || ts2.length(existing.typeArguments) >= getMinTypeArgumentCount(type.target.typeParameters);
        }
        function serializeTypeForDeclaration(context, type, symbol, enclosingDeclaration, includePrivateSymbol, bundled) {
          if (!isErrorType(type) && enclosingDeclaration) {
            var declWithExistingAnnotation = getDeclarationWithTypeAnnotation(symbol, enclosingDeclaration);
            if (declWithExistingAnnotation && !ts2.isFunctionLikeDeclaration(declWithExistingAnnotation) && !ts2.isGetAccessorDeclaration(declWithExistingAnnotation)) {
              var existing = ts2.getEffectiveTypeAnnotationNode(declWithExistingAnnotation);
              if (getTypeFromTypeNode(existing) === type && existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(existing, type)) {
                var result_6 = serializeExistingTypeNode(context, existing, includePrivateSymbol, bundled);
                if (result_6) {
                  return result_6;
                }
              }
            }
          }
          var oldFlags = context.flags;
          if (type.flags & 8192 && type.symbol === symbol && (!context.enclosingDeclaration || ts2.some(symbol.declarations, function(d) {
            return ts2.getSourceFileOfNode(d) === ts2.getSourceFileOfNode(context.enclosingDeclaration);
          }))) {
            context.flags |= 1048576;
          }
          var result = typeToTypeNodeHelper(type, context);
          context.flags = oldFlags;
          return result;
        }
        function serializeReturnTypeForSignature(context, type, signature, includePrivateSymbol, bundled) {
          if (!isErrorType(type) && context.enclosingDeclaration) {
            var annotation = signature.declaration && ts2.getEffectiveReturnTypeNode(signature.declaration);
            if (!!ts2.findAncestor(annotation, function(n) {
              return n === context.enclosingDeclaration;
            }) && annotation) {
              var annotated = getTypeFromTypeNode(annotation);
              var thisInstantiated = annotated.flags & 262144 && annotated.isThisType ? instantiateType(annotated, signature.mapper) : annotated;
              if (thisInstantiated === type && existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(annotation, type)) {
                var result = serializeExistingTypeNode(context, annotation, includePrivateSymbol, bundled);
                if (result) {
                  return result;
                }
              }
            }
          }
          return typeToTypeNodeHelper(type, context);
        }
        function trackExistingEntityName(node, context, includePrivateSymbol) {
          var _a, _b;
          var introducesError = false;
          var leftmost = ts2.getFirstIdentifier(node);
          if (ts2.isInJSFile(node) && (ts2.isExportsIdentifier(leftmost) || ts2.isModuleExportsAccessExpression(leftmost.parent) || ts2.isQualifiedName(leftmost.parent) && ts2.isModuleIdentifier(leftmost.parent.left) && ts2.isExportsIdentifier(leftmost.parent.right))) {
            introducesError = true;
            return { introducesError, node };
          }
          var sym = resolveEntityName(leftmost, 67108863, true, true);
          if (sym) {
            if (isSymbolAccessible(sym, context.enclosingDeclaration, 67108863, false).accessibility !== 0) {
              introducesError = true;
            } else {
              (_b = (_a = context.tracker) === null || _a === void 0 ? void 0 : _a.trackSymbol) === null || _b === void 0 ? void 0 : _b.call(_a, sym, context.enclosingDeclaration, 67108863);
              includePrivateSymbol === null || includePrivateSymbol === void 0 ? void 0 : includePrivateSymbol(sym);
            }
            if (ts2.isIdentifier(node)) {
              var name = sym.flags & 262144 ? typeParameterToName(getDeclaredTypeOfSymbol(sym), context) : ts2.factory.cloneNode(node);
              name.symbol = sym;
              return { introducesError, node: ts2.setEmitFlags(ts2.setOriginalNode(name, node), 16777216) };
            }
          }
          return { introducesError, node };
        }
        function serializeExistingTypeNode(context, existing, includePrivateSymbol, bundled) {
          if (cancellationToken && cancellationToken.throwIfCancellationRequested) {
            cancellationToken.throwIfCancellationRequested();
          }
          var hadError = false;
          var file = ts2.getSourceFileOfNode(existing);
          var transformed = ts2.visitNode(existing, visitExistingNodeTreeSymbols);
          if (hadError) {
            return void 0;
          }
          return transformed === existing ? ts2.setTextRange(ts2.factory.cloneNode(existing), existing) : transformed;
          function visitExistingNodeTreeSymbols(node) {
            if (ts2.isJSDocAllType(node) || node.kind === 317) {
              return ts2.factory.createKeywordTypeNode(130);
            }
            if (ts2.isJSDocUnknownType(node)) {
              return ts2.factory.createKeywordTypeNode(154);
            }
            if (ts2.isJSDocNullableType(node)) {
              return ts2.factory.createUnionTypeNode([ts2.visitNode(node.type, visitExistingNodeTreeSymbols), ts2.factory.createLiteralTypeNode(ts2.factory.createNull())]);
            }
            if (ts2.isJSDocOptionalType(node)) {
              return ts2.factory.createUnionTypeNode([ts2.visitNode(node.type, visitExistingNodeTreeSymbols), ts2.factory.createKeywordTypeNode(152)]);
            }
            if (ts2.isJSDocNonNullableType(node)) {
              return ts2.visitNode(node.type, visitExistingNodeTreeSymbols);
            }
            if (ts2.isJSDocVariadicType(node)) {
              return ts2.factory.createArrayTypeNode(ts2.visitNode(node.type, visitExistingNodeTreeSymbols));
            }
            if (ts2.isJSDocTypeLiteral(node)) {
              return ts2.factory.createTypeLiteralNode(ts2.map(node.jsDocPropertyTags, function(t) {
                var name = ts2.isIdentifier(t.name) ? t.name : t.name.right;
                var typeViaParent = getTypeOfPropertyOfType(getTypeFromTypeNode(node), name.escapedText);
                var overrideTypeNode = typeViaParent && t.typeExpression && getTypeFromTypeNode(t.typeExpression.type) !== typeViaParent ? typeToTypeNodeHelper(typeViaParent, context) : void 0;
                return ts2.factory.createPropertySignature(void 0, name, t.isBracketed || t.typeExpression && ts2.isJSDocOptionalType(t.typeExpression.type) ? ts2.factory.createToken(57) : void 0, overrideTypeNode || t.typeExpression && ts2.visitNode(t.typeExpression.type, visitExistingNodeTreeSymbols) || ts2.factory.createKeywordTypeNode(130));
              }));
            }
            if (ts2.isTypeReferenceNode(node) && ts2.isIdentifier(node.typeName) && node.typeName.escapedText === "") {
              return ts2.setOriginalNode(ts2.factory.createKeywordTypeNode(130), node);
            }
            if ((ts2.isExpressionWithTypeArguments(node) || ts2.isTypeReferenceNode(node)) && ts2.isJSDocIndexSignature(node)) {
              return ts2.factory.createTypeLiteralNode([ts2.factory.createIndexSignature(void 0, void 0, [ts2.factory.createParameterDeclaration(void 0, void 0, void 0, "x", void 0, ts2.visitNode(node.typeArguments[0], visitExistingNodeTreeSymbols))], ts2.visitNode(node.typeArguments[1], visitExistingNodeTreeSymbols))]);
            }
            if (ts2.isJSDocFunctionType(node)) {
              if (ts2.isJSDocConstructSignature(node)) {
                var newTypeNode_1;
                return ts2.factory.createConstructorTypeNode(node.modifiers, ts2.visitNodes(node.typeParameters, visitExistingNodeTreeSymbols), ts2.mapDefined(node.parameters, function(p, i) {
                  return p.name && ts2.isIdentifier(p.name) && p.name.escapedText === "new" ? (newTypeNode_1 = p.type, void 0) : ts2.factory.createParameterDeclaration(void 0, void 0, getEffectiveDotDotDotForParameter(p), getNameForJSDocFunctionParameter(p, i), p.questionToken, ts2.visitNode(p.type, visitExistingNodeTreeSymbols), void 0);
                }), ts2.visitNode(newTypeNode_1 || node.type, visitExistingNodeTreeSymbols) || ts2.factory.createKeywordTypeNode(130));
              } else {
                return ts2.factory.createFunctionTypeNode(ts2.visitNodes(node.typeParameters, visitExistingNodeTreeSymbols), ts2.map(node.parameters, function(p, i) {
                  return ts2.factory.createParameterDeclaration(void 0, void 0, getEffectiveDotDotDotForParameter(p), getNameForJSDocFunctionParameter(p, i), p.questionToken, ts2.visitNode(p.type, visitExistingNodeTreeSymbols), void 0);
                }), ts2.visitNode(node.type, visitExistingNodeTreeSymbols) || ts2.factory.createKeywordTypeNode(130));
              }
            }
            if (ts2.isTypeReferenceNode(node) && ts2.isInJSDoc(node) && (!existingTypeNodeIsNotReferenceOrIsReferenceWithCompatibleTypeArgumentCount(node, getTypeFromTypeNode(node)) || getIntendedTypeFromJSDocTypeReference(node) || unknownSymbol === resolveTypeReferenceName(node, 788968, true))) {
              return ts2.setOriginalNode(typeToTypeNodeHelper(getTypeFromTypeNode(node), context), node);
            }
            if (ts2.isLiteralImportTypeNode(node)) {
              var nodeSymbol = getNodeLinks(node).resolvedSymbol;
              if (ts2.isInJSDoc(node) && nodeSymbol && (!node.isTypeOf && !(nodeSymbol.flags & 788968) || !(ts2.length(node.typeArguments) >= getMinTypeArgumentCount(getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(nodeSymbol))))) {
                return ts2.setOriginalNode(typeToTypeNodeHelper(getTypeFromTypeNode(node), context), node);
              }
              return ts2.factory.updateImportTypeNode(node, ts2.factory.updateLiteralTypeNode(node.argument, rewriteModuleSpecifier(node, node.argument.literal)), node.qualifier, ts2.visitNodes(node.typeArguments, visitExistingNodeTreeSymbols, ts2.isTypeNode), node.isTypeOf);
            }
            if (ts2.isEntityName(node) || ts2.isEntityNameExpression(node)) {
              var _a = trackExistingEntityName(node, context, includePrivateSymbol), introducesError = _a.introducesError, result = _a.node;
              hadError = hadError || introducesError;
              if (result !== node) {
                return result;
              }
            }
            if (file && ts2.isTupleTypeNode(node) && ts2.getLineAndCharacterOfPosition(file, node.pos).line === ts2.getLineAndCharacterOfPosition(file, node.end).line) {
              ts2.setEmitFlags(node, 1);
            }
            return ts2.visitEachChild(node, visitExistingNodeTreeSymbols, ts2.nullTransformationContext);
            function getEffectiveDotDotDotForParameter(p) {
              return p.dotDotDotToken || (p.type && ts2.isJSDocVariadicType(p.type) ? ts2.factory.createToken(25) : void 0);
            }
            function getNameForJSDocFunctionParameter(p, index) {
              return p.name && ts2.isIdentifier(p.name) && p.name.escapedText === "this" ? "this" : getEffectiveDotDotDotForParameter(p) ? "args" : "arg".concat(index);
            }
            function rewriteModuleSpecifier(parent, lit) {
              if (bundled) {
                if (context.tracker && context.tracker.moduleResolverHost) {
                  var targetFile = getExternalModuleFileFromDeclaration(parent);
                  if (targetFile) {
                    var getCanonicalFileName = ts2.createGetCanonicalFileName(!!host.useCaseSensitiveFileNames);
                    var resolverHost = {
                      getCanonicalFileName,
                      getCurrentDirectory: function() {
                        return context.tracker.moduleResolverHost.getCurrentDirectory();
                      },
                      getCommonSourceDirectory: function() {
                        return context.tracker.moduleResolverHost.getCommonSourceDirectory();
                      }
                    };
                    var newName = ts2.getResolvedExternalModuleName(resolverHost, targetFile);
                    return ts2.factory.createStringLiteral(newName);
                  }
                }
              } else {
                if (context.tracker && context.tracker.trackExternalModuleSymbolOfImportTypeNode) {
                  var moduleSym = resolveExternalModuleNameWorker(lit, lit, void 0);
                  if (moduleSym) {
                    context.tracker.trackExternalModuleSymbolOfImportTypeNode(moduleSym);
                  }
                }
              }
              return lit;
            }
          }
        }
        function symbolTableToDeclarationStatements(symbolTable, context, bundled) {
          var serializePropertySymbolForClass = makeSerializePropertySymbol(ts2.factory.createPropertyDeclaration, 168, true);
          var serializePropertySymbolForInterfaceWorker = makeSerializePropertySymbol(function(_decorators, mods, name, question, type) {
            return ts2.factory.createPropertySignature(mods, name, question, type);
          }, 167, false);
          var enclosingDeclaration = context.enclosingDeclaration;
          var results = [];
          var visitedSymbols = new ts2.Set();
          var deferredPrivatesStack = [];
          var oldcontext = context;
          context = __assign(__assign({}, oldcontext), { usedSymbolNames: new ts2.Set(oldcontext.usedSymbolNames), remappedSymbolNames: new ts2.Map(), tracker: __assign(__assign({}, oldcontext.tracker), { trackSymbol: function(sym, decl, meaning) {
            var accessibleResult = isSymbolAccessible(sym, decl, meaning, false);
            if (accessibleResult.accessibility === 0) {
              var chain = lookupSymbolChainWorker(sym, context, meaning);
              if (!(sym.flags & 4)) {
                includePrivateSymbol(chain[0]);
              }
            } else if (oldcontext.tracker && oldcontext.tracker.trackSymbol) {
              return oldcontext.tracker.trackSymbol(sym, decl, meaning);
            }
            return false;
          } }) });
          context.tracker = wrapSymbolTrackerToReportForContext(context, context.tracker);
          ts2.forEachEntry(symbolTable, function(symbol, name) {
            var baseName = ts2.unescapeLeadingUnderscores(name);
            void getInternalSymbolName(symbol, baseName);
          });
          var addingDeclare = !bundled;
          var exportEquals = symbolTable.get("export=");
          if (exportEquals && symbolTable.size > 1 && exportEquals.flags & 2097152) {
            symbolTable = ts2.createSymbolTable();
            symbolTable.set("export=", exportEquals);
          }
          visitSymbolTable(symbolTable);
          return mergeRedundantStatements(results);
          function isIdentifierAndNotUndefined(node) {
            return !!node && node.kind === 79;
          }
          function getNamesOfDeclaration(statement) {
            if (ts2.isVariableStatement(statement)) {
              return ts2.filter(ts2.map(statement.declarationList.declarations, ts2.getNameOfDeclaration), isIdentifierAndNotUndefined);
            }
            return ts2.filter([ts2.getNameOfDeclaration(statement)], isIdentifierAndNotUndefined);
          }
          function flattenExportAssignedNamespace(statements) {
            var exportAssignment = ts2.find(statements, ts2.isExportAssignment);
            var nsIndex = ts2.findIndex(statements, ts2.isModuleDeclaration);
            var ns = nsIndex !== -1 ? statements[nsIndex] : void 0;
            if (ns && exportAssignment && exportAssignment.isExportEquals && ts2.isIdentifier(exportAssignment.expression) && ts2.isIdentifier(ns.name) && ts2.idText(ns.name) === ts2.idText(exportAssignment.expression) && ns.body && ts2.isModuleBlock(ns.body)) {
              var excessExports = ts2.filter(statements, function(s) {
                return !!(ts2.getEffectiveModifierFlags(s) & 1);
              });
              var name_2 = ns.name;
              var body = ns.body;
              if (ts2.length(excessExports)) {
                ns = ts2.factory.updateModuleDeclaration(ns, ns.decorators, ns.modifiers, ns.name, body = ts2.factory.updateModuleBlock(body, ts2.factory.createNodeArray(__spreadArray(__spreadArray([], ns.body.statements, true), [ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports(ts2.map(ts2.flatMap(excessExports, function(e) {
                  return getNamesOfDeclaration(e);
                }), function(id) {
                  return ts2.factory.createExportSpecifier(false, void 0, id);
                })), void 0)], false))));
                statements = __spreadArray(__spreadArray(__spreadArray([], statements.slice(0, nsIndex), true), [ns], false), statements.slice(nsIndex + 1), true);
              }
              if (!ts2.find(statements, function(s) {
                return s !== ns && ts2.nodeHasName(s, name_2);
              })) {
                results = [];
                var mixinExportFlag_1 = !ts2.some(body.statements, function(s) {
                  return ts2.hasSyntacticModifier(s, 1) || ts2.isExportAssignment(s) || ts2.isExportDeclaration(s);
                });
                ts2.forEach(body.statements, function(s) {
                  addResult(s, mixinExportFlag_1 ? 1 : 0);
                });
                statements = __spreadArray(__spreadArray([], ts2.filter(statements, function(s) {
                  return s !== ns && s !== exportAssignment;
                }), true), results, true);
              }
            }
            return statements;
          }
          function mergeExportDeclarations(statements) {
            var exports = ts2.filter(statements, function(d) {
              return ts2.isExportDeclaration(d) && !d.moduleSpecifier && !!d.exportClause && ts2.isNamedExports(d.exportClause);
            });
            if (ts2.length(exports) > 1) {
              var nonExports = ts2.filter(statements, function(d) {
                return !ts2.isExportDeclaration(d) || !!d.moduleSpecifier || !d.exportClause;
              });
              statements = __spreadArray(__spreadArray([], nonExports, true), [ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports(ts2.flatMap(exports, function(e) {
                return ts2.cast(e.exportClause, ts2.isNamedExports).elements;
              })), void 0)], false);
            }
            var reexports = ts2.filter(statements, function(d) {
              return ts2.isExportDeclaration(d) && !!d.moduleSpecifier && !!d.exportClause && ts2.isNamedExports(d.exportClause);
            });
            if (ts2.length(reexports) > 1) {
              var groups = ts2.group(reexports, function(decl) {
                return ts2.isStringLiteral(decl.moduleSpecifier) ? ">" + decl.moduleSpecifier.text : ">";
              });
              if (groups.length !== reexports.length) {
                var _loop_9 = function(group_12) {
                  if (group_12.length > 1) {
                    statements = __spreadArray(__spreadArray([], ts2.filter(statements, function(s) {
                      return group_12.indexOf(s) === -1;
                    }), true), [
                      ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports(ts2.flatMap(group_12, function(e) {
                        return ts2.cast(e.exportClause, ts2.isNamedExports).elements;
                      })), group_12[0].moduleSpecifier)
                    ], false);
                  }
                };
                for (var _i = 0, groups_1 = groups; _i < groups_1.length; _i++) {
                  var group_1 = groups_1[_i];
                  _loop_9(group_1);
                }
              }
            }
            return statements;
          }
          function inlineExportModifiers(statements) {
            var index = ts2.findIndex(statements, function(d) {
              return ts2.isExportDeclaration(d) && !d.moduleSpecifier && !d.assertClause && !!d.exportClause && ts2.isNamedExports(d.exportClause);
            });
            if (index >= 0) {
              var exportDecl = statements[index];
              var replacements = ts2.mapDefined(exportDecl.exportClause.elements, function(e) {
                if (!e.propertyName) {
                  var indices = ts2.indicesOf(statements);
                  var associatedIndices = ts2.filter(indices, function(i) {
                    return ts2.nodeHasName(statements[i], e.name);
                  });
                  if (ts2.length(associatedIndices) && ts2.every(associatedIndices, function(i) {
                    return canHaveExportModifier(statements[i]);
                  })) {
                    for (var _i = 0, associatedIndices_1 = associatedIndices; _i < associatedIndices_1.length; _i++) {
                      var index_1 = associatedIndices_1[_i];
                      statements[index_1] = addExportModifier(statements[index_1]);
                    }
                    return void 0;
                  }
                }
                return e;
              });
              if (!ts2.length(replacements)) {
                ts2.orderedRemoveItemAt(statements, index);
              } else {
                statements[index] = ts2.factory.updateExportDeclaration(exportDecl, exportDecl.decorators, exportDecl.modifiers, exportDecl.isTypeOnly, ts2.factory.updateNamedExports(exportDecl.exportClause, replacements), exportDecl.moduleSpecifier, exportDecl.assertClause);
              }
            }
            return statements;
          }
          function mergeRedundantStatements(statements) {
            statements = flattenExportAssignedNamespace(statements);
            statements = mergeExportDeclarations(statements);
            statements = inlineExportModifiers(statements);
            if (enclosingDeclaration && (ts2.isSourceFile(enclosingDeclaration) && ts2.isExternalOrCommonJsModule(enclosingDeclaration) || ts2.isModuleDeclaration(enclosingDeclaration)) && (!ts2.some(statements, ts2.isExternalModuleIndicator) || !ts2.hasScopeMarker(statements) && ts2.some(statements, ts2.needsScopeMarker))) {
              statements.push(ts2.createEmptyExports(ts2.factory));
            }
            return statements;
          }
          function canHaveExportModifier(node) {
            return ts2.isEnumDeclaration(node) || ts2.isVariableStatement(node) || ts2.isFunctionDeclaration(node) || ts2.isClassDeclaration(node) || ts2.isModuleDeclaration(node) && !ts2.isExternalModuleAugmentation(node) && !ts2.isGlobalScopeAugmentation(node) || ts2.isInterfaceDeclaration(node) || isTypeDeclaration(node);
          }
          function addExportModifier(node) {
            var flags = (ts2.getEffectiveModifierFlags(node) | 1) & ~2;
            return ts2.factory.updateModifiers(node, flags);
          }
          function removeExportModifier(node) {
            var flags = ts2.getEffectiveModifierFlags(node) & ~1;
            return ts2.factory.updateModifiers(node, flags);
          }
          function visitSymbolTable(symbolTable2, suppressNewPrivateContext, propertyAsAlias) {
            if (!suppressNewPrivateContext) {
              deferredPrivatesStack.push(new ts2.Map());
            }
            symbolTable2.forEach(function(symbol) {
              serializeSymbol(symbol, false, !!propertyAsAlias);
            });
            if (!suppressNewPrivateContext) {
              deferredPrivatesStack[deferredPrivatesStack.length - 1].forEach(function(symbol) {
                serializeSymbol(symbol, true, !!propertyAsAlias);
              });
              deferredPrivatesStack.pop();
            }
          }
          function serializeSymbol(symbol, isPrivate, propertyAsAlias) {
            var visitedSym = getMergedSymbol(symbol);
            if (visitedSymbols.has(getSymbolId(visitedSym))) {
              return;
            }
            visitedSymbols.add(getSymbolId(visitedSym));
            var skipMembershipCheck = !isPrivate;
            if (skipMembershipCheck || !!ts2.length(symbol.declarations) && ts2.some(symbol.declarations, function(d) {
              return !!ts2.findAncestor(d, function(n) {
                return n === enclosingDeclaration;
              });
            })) {
              var oldContext = context;
              context = cloneNodeBuilderContext(context);
              var result = serializeSymbolWorker(symbol, isPrivate, propertyAsAlias);
              if (context.reportedDiagnostic) {
                oldcontext.reportedDiagnostic = context.reportedDiagnostic;
              }
              context = oldContext;
              return result;
            }
          }
          function serializeSymbolWorker(symbol, isPrivate, propertyAsAlias) {
            var _a, _b;
            var symbolName = ts2.unescapeLeadingUnderscores(symbol.escapedName);
            var isDefault = symbol.escapedName === "default";
            if (isPrivate && !(context.flags & 131072) && ts2.isStringANonContextualKeyword(symbolName) && !isDefault) {
              context.encounteredError = true;
              return;
            }
            var needsPostExportDefault = isDefault && !!(symbol.flags & -113 || symbol.flags & 16 && ts2.length(getPropertiesOfType(getTypeOfSymbol(symbol)))) && !(symbol.flags & 2097152);
            var needsExportDeclaration = !needsPostExportDefault && !isPrivate && ts2.isStringANonContextualKeyword(symbolName) && !isDefault;
            if (needsPostExportDefault || needsExportDeclaration) {
              isPrivate = true;
            }
            var modifierFlags = (!isPrivate ? 1 : 0) | (isDefault && !needsPostExportDefault ? 512 : 0);
            var isConstMergedWithNS = symbol.flags & 1536 && symbol.flags & (2 | 1 | 4) && symbol.escapedName !== "export=";
            var isConstMergedWithNSPrintableAsSignatureMerge = isConstMergedWithNS && isTypeRepresentableAsFunctionNamespaceMerge(getTypeOfSymbol(symbol), symbol);
            if (symbol.flags & (16 | 8192) || isConstMergedWithNSPrintableAsSignatureMerge) {
              serializeAsFunctionNamespaceMerge(getTypeOfSymbol(symbol), symbol, getInternalSymbolName(symbol, symbolName), modifierFlags);
            }
            if (symbol.flags & 524288) {
              serializeTypeAlias(symbol, symbolName, modifierFlags);
            }
            if (symbol.flags & (2 | 1 | 4) && symbol.escapedName !== "export=" && !(symbol.flags & 4194304) && !(symbol.flags & 32) && !isConstMergedWithNSPrintableAsSignatureMerge) {
              if (propertyAsAlias) {
                var createdExport = serializeMaybeAliasAssignment(symbol);
                if (createdExport) {
                  needsExportDeclaration = false;
                  needsPostExportDefault = false;
                }
              } else {
                var type = getTypeOfSymbol(symbol);
                var localName = getInternalSymbolName(symbol, symbolName);
                if (!(symbol.flags & 16) && isTypeRepresentableAsFunctionNamespaceMerge(type, symbol)) {
                  serializeAsFunctionNamespaceMerge(type, symbol, localName, modifierFlags);
                } else {
                  var flags = !(symbol.flags & 2) ? void 0 : isConstVariable(symbol) ? 2 : 1;
                  var name = needsPostExportDefault || !(symbol.flags & 4) ? localName : getUnusedName(localName, symbol);
                  var textRange = symbol.declarations && ts2.find(symbol.declarations, function(d) {
                    return ts2.isVariableDeclaration(d);
                  });
                  if (textRange && ts2.isVariableDeclarationList(textRange.parent) && textRange.parent.declarations.length === 1) {
                    textRange = textRange.parent.parent;
                  }
                  var propertyAccessRequire = (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isPropertyAccessExpression);
                  if (propertyAccessRequire && ts2.isBinaryExpression(propertyAccessRequire.parent) && ts2.isIdentifier(propertyAccessRequire.parent.right) && ((_b = type.symbol) === null || _b === void 0 ? void 0 : _b.valueDeclaration) && ts2.isSourceFile(type.symbol.valueDeclaration)) {
                    var alias = localName === propertyAccessRequire.parent.right.escapedText ? void 0 : propertyAccessRequire.parent.right;
                    addResult(ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports([ts2.factory.createExportSpecifier(false, alias, localName)])), 0);
                    context.tracker.trackSymbol(type.symbol, context.enclosingDeclaration, 111551);
                  } else {
                    var statement = ts2.setTextRange(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([
                      ts2.factory.createVariableDeclaration(name, void 0, serializeTypeForDeclaration(context, type, symbol, enclosingDeclaration, includePrivateSymbol, bundled))
                    ], flags)), textRange);
                    addResult(statement, name !== localName ? modifierFlags & ~1 : modifierFlags);
                    if (name !== localName && !isPrivate) {
                      addResult(ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports([ts2.factory.createExportSpecifier(false, name, localName)])), 0);
                      needsExportDeclaration = false;
                      needsPostExportDefault = false;
                    }
                  }
                }
              }
            }
            if (symbol.flags & 384) {
              serializeEnum(symbol, symbolName, modifierFlags);
            }
            if (symbol.flags & 32) {
              if (symbol.flags & 4 && symbol.valueDeclaration && ts2.isBinaryExpression(symbol.valueDeclaration.parent) && ts2.isClassExpression(symbol.valueDeclaration.parent.right)) {
                serializeAsAlias(symbol, getInternalSymbolName(symbol, symbolName), modifierFlags);
              } else {
                serializeAsClass(symbol, getInternalSymbolName(symbol, symbolName), modifierFlags);
              }
            }
            if (symbol.flags & (512 | 1024) && (!isConstMergedWithNS || isTypeOnlyNamespace(symbol)) || isConstMergedWithNSPrintableAsSignatureMerge) {
              serializeModule(symbol, symbolName, modifierFlags);
            }
            if (symbol.flags & 64 && !(symbol.flags & 32)) {
              serializeInterface(symbol, symbolName, modifierFlags);
            }
            if (symbol.flags & 2097152) {
              serializeAsAlias(symbol, getInternalSymbolName(symbol, symbolName), modifierFlags);
            }
            if (symbol.flags & 4 && symbol.escapedName === "export=") {
              serializeMaybeAliasAssignment(symbol);
            }
            if (symbol.flags & 8388608) {
              if (symbol.declarations) {
                for (var _i = 0, _c = symbol.declarations; _i < _c.length; _i++) {
                  var node = _c[_i];
                  var resolvedModule = resolveExternalModuleName(node, node.moduleSpecifier);
                  if (!resolvedModule)
                    continue;
                  addResult(ts2.factory.createExportDeclaration(void 0, void 0, false, void 0, ts2.factory.createStringLiteral(getSpecifierForModuleSymbol(resolvedModule, context))), 0);
                }
              }
            }
            if (needsPostExportDefault) {
              addResult(ts2.factory.createExportAssignment(void 0, void 0, false, ts2.factory.createIdentifier(getInternalSymbolName(symbol, symbolName))), 0);
            } else if (needsExportDeclaration) {
              addResult(ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports([ts2.factory.createExportSpecifier(false, getInternalSymbolName(symbol, symbolName), symbolName)])), 0);
            }
          }
          function includePrivateSymbol(symbol) {
            if (ts2.some(symbol.declarations, ts2.isParameterDeclaration))
              return;
            ts2.Debug.assertIsDefined(deferredPrivatesStack[deferredPrivatesStack.length - 1]);
            getUnusedName(ts2.unescapeLeadingUnderscores(symbol.escapedName), symbol);
            var isExternalImportAlias = !!(symbol.flags & 2097152) && !ts2.some(symbol.declarations, function(d) {
              return !!ts2.findAncestor(d, ts2.isExportDeclaration) || ts2.isNamespaceExport(d) || ts2.isImportEqualsDeclaration(d) && !ts2.isExternalModuleReference(d.moduleReference);
            });
            deferredPrivatesStack[isExternalImportAlias ? 0 : deferredPrivatesStack.length - 1].set(getSymbolId(symbol), symbol);
          }
          function isExportingScope(enclosingDeclaration2) {
            return ts2.isSourceFile(enclosingDeclaration2) && (ts2.isExternalOrCommonJsModule(enclosingDeclaration2) || ts2.isJsonSourceFile(enclosingDeclaration2)) || ts2.isAmbientModule(enclosingDeclaration2) && !ts2.isGlobalScopeAugmentation(enclosingDeclaration2);
          }
          function addResult(node, additionalModifierFlags) {
            if (ts2.canHaveModifiers(node)) {
              var newModifierFlags = 0;
              var enclosingDeclaration_1 = context.enclosingDeclaration && (ts2.isJSDocTypeAlias(context.enclosingDeclaration) ? ts2.getSourceFileOfNode(context.enclosingDeclaration) : context.enclosingDeclaration);
              if (additionalModifierFlags & 1 && enclosingDeclaration_1 && (isExportingScope(enclosingDeclaration_1) || ts2.isModuleDeclaration(enclosingDeclaration_1)) && canHaveExportModifier(node)) {
                newModifierFlags |= 1;
              }
              if (addingDeclare && !(newModifierFlags & 1) && (!enclosingDeclaration_1 || !(enclosingDeclaration_1.flags & 8388608)) && (ts2.isEnumDeclaration(node) || ts2.isVariableStatement(node) || ts2.isFunctionDeclaration(node) || ts2.isClassDeclaration(node) || ts2.isModuleDeclaration(node))) {
                newModifierFlags |= 2;
              }
              if (additionalModifierFlags & 512 && (ts2.isClassDeclaration(node) || ts2.isInterfaceDeclaration(node) || ts2.isFunctionDeclaration(node))) {
                newModifierFlags |= 512;
              }
              if (newModifierFlags) {
                node = ts2.factory.updateModifiers(node, newModifierFlags | ts2.getEffectiveModifierFlags(node));
              }
            }
            results.push(node);
          }
          function serializeTypeAlias(symbol, symbolName, modifierFlags) {
            var _a;
            var aliasType = getDeclaredTypeOfTypeAlias(symbol);
            var typeParams = getSymbolLinks(symbol).typeParameters;
            var typeParamDecls = ts2.map(typeParams, function(p) {
              return typeParameterToDeclaration(p, context);
            });
            var jsdocAliasDecl = (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isJSDocTypeAlias);
            var commentText = ts2.getTextOfJSDocComment(jsdocAliasDecl ? jsdocAliasDecl.comment || jsdocAliasDecl.parent.comment : void 0);
            var oldFlags = context.flags;
            context.flags |= 8388608;
            var oldEnclosingDecl = context.enclosingDeclaration;
            context.enclosingDeclaration = jsdocAliasDecl;
            var typeNode = jsdocAliasDecl && jsdocAliasDecl.typeExpression && ts2.isJSDocTypeExpression(jsdocAliasDecl.typeExpression) && serializeExistingTypeNode(context, jsdocAliasDecl.typeExpression.type, includePrivateSymbol, bundled) || typeToTypeNodeHelper(aliasType, context);
            addResult(ts2.setSyntheticLeadingComments(ts2.factory.createTypeAliasDeclaration(void 0, void 0, getInternalSymbolName(symbol, symbolName), typeParamDecls, typeNode), !commentText ? [] : [{ kind: 3, text: "*\n * " + commentText.replace(/\n/g, "\n * ") + "\n ", pos: -1, end: -1, hasTrailingNewLine: true }]), modifierFlags);
            context.flags = oldFlags;
            context.enclosingDeclaration = oldEnclosingDecl;
          }
          function serializeInterface(symbol, symbolName, modifierFlags) {
            var interfaceType = getDeclaredTypeOfClassOrInterface(symbol);
            var localParams = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
            var typeParamDecls = ts2.map(localParams, function(p) {
              return typeParameterToDeclaration(p, context);
            });
            var baseTypes = getBaseTypes(interfaceType);
            var baseType = ts2.length(baseTypes) ? getIntersectionType(baseTypes) : void 0;
            var members = ts2.flatMap(getPropertiesOfType(interfaceType), function(p) {
              return serializePropertySymbolForInterface(p, baseType);
            });
            var callSignatures = serializeSignatures(0, interfaceType, baseType, 173);
            var constructSignatures = serializeSignatures(1, interfaceType, baseType, 174);
            var indexSignatures = serializeIndexSignatures(interfaceType, baseType);
            var heritageClauses = !ts2.length(baseTypes) ? void 0 : [ts2.factory.createHeritageClause(94, ts2.mapDefined(baseTypes, function(b) {
              return trySerializeAsTypeReference(b, 111551);
            }))];
            addResult(ts2.factory.createInterfaceDeclaration(void 0, void 0, getInternalSymbolName(symbol, symbolName), typeParamDecls, heritageClauses, __spreadArray(__spreadArray(__spreadArray(__spreadArray([], indexSignatures, true), constructSignatures, true), callSignatures, true), members, true)), modifierFlags);
          }
          function getNamespaceMembersForSerialization(symbol) {
            return !symbol.exports ? [] : ts2.filter(ts2.arrayFrom(symbol.exports.values()), isNamespaceMember);
          }
          function isTypeOnlyNamespace(symbol) {
            return ts2.every(getNamespaceMembersForSerialization(symbol), function(m) {
              return !(resolveSymbol(m).flags & 111551);
            });
          }
          function serializeModule(symbol, symbolName, modifierFlags) {
            var members = getNamespaceMembersForSerialization(symbol);
            var locationMap = ts2.arrayToMultiMap(members, function(m) {
              return m.parent && m.parent === symbol ? "real" : "merged";
            });
            var realMembers = locationMap.get("real") || ts2.emptyArray;
            var mergedMembers = locationMap.get("merged") || ts2.emptyArray;
            if (ts2.length(realMembers)) {
              var localName = getInternalSymbolName(symbol, symbolName);
              serializeAsNamespaceDeclaration(realMembers, localName, modifierFlags, !!(symbol.flags & (16 | 67108864)));
            }
            if (ts2.length(mergedMembers)) {
              var containingFile_1 = ts2.getSourceFileOfNode(context.enclosingDeclaration);
              var localName = getInternalSymbolName(symbol, symbolName);
              var nsBody = ts2.factory.createModuleBlock([ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports(ts2.mapDefined(ts2.filter(mergedMembers, function(n) {
                return n.escapedName !== "export=";
              }), function(s) {
                var _a, _b;
                var name = ts2.unescapeLeadingUnderscores(s.escapedName);
                var localName2 = getInternalSymbolName(s, name);
                var aliasDecl = s.declarations && getDeclarationOfAliasSymbol(s);
                if (containingFile_1 && (aliasDecl ? containingFile_1 !== ts2.getSourceFileOfNode(aliasDecl) : !ts2.some(s.declarations, function(d) {
                  return ts2.getSourceFileOfNode(d) === containingFile_1;
                }))) {
                  (_b = (_a = context.tracker) === null || _a === void 0 ? void 0 : _a.reportNonlocalAugmentation) === null || _b === void 0 ? void 0 : _b.call(_a, containingFile_1, symbol, s);
                  return void 0;
                }
                var target = aliasDecl && getTargetOfAliasDeclaration(aliasDecl, true);
                includePrivateSymbol(target || s);
                var targetName = target ? getInternalSymbolName(target, ts2.unescapeLeadingUnderscores(target.escapedName)) : localName2;
                return ts2.factory.createExportSpecifier(false, name === targetName ? void 0 : targetName, name);
              })))]);
              addResult(ts2.factory.createModuleDeclaration(void 0, void 0, ts2.factory.createIdentifier(localName), nsBody, 16), 0);
            }
          }
          function serializeEnum(symbol, symbolName, modifierFlags) {
            addResult(ts2.factory.createEnumDeclaration(void 0, ts2.factory.createModifiersFromModifierFlags(isConstEnumSymbol(symbol) ? 2048 : 0), getInternalSymbolName(symbol, symbolName), ts2.map(ts2.filter(getPropertiesOfType(getTypeOfSymbol(symbol)), function(p) {
              return !!(p.flags & 8);
            }), function(p) {
              var initializedValue = p.declarations && p.declarations[0] && ts2.isEnumMember(p.declarations[0]) ? getConstantValue(p.declarations[0]) : void 0;
              return ts2.factory.createEnumMember(ts2.unescapeLeadingUnderscores(p.escapedName), initializedValue === void 0 ? void 0 : typeof initializedValue === "string" ? ts2.factory.createStringLiteral(initializedValue) : ts2.factory.createNumericLiteral(initializedValue));
            })), modifierFlags);
          }
          function serializeAsFunctionNamespaceMerge(type, symbol, localName, modifierFlags) {
            var signatures = getSignaturesOfType(type, 0);
            for (var _i = 0, signatures_2 = signatures; _i < signatures_2.length; _i++) {
              var sig = signatures_2[_i];
              var decl = signatureToSignatureDeclarationHelper(sig, 255, context, { name: ts2.factory.createIdentifier(localName), privateSymbolVisitor: includePrivateSymbol, bundledImports: bundled });
              addResult(ts2.setTextRange(decl, getSignatureTextRangeLocation(sig)), modifierFlags);
            }
            if (!(symbol.flags & (512 | 1024) && !!symbol.exports && !!symbol.exports.size)) {
              var props = ts2.filter(getPropertiesOfType(type), isNamespaceMember);
              serializeAsNamespaceDeclaration(props, localName, modifierFlags, true);
            }
          }
          function getSignatureTextRangeLocation(signature) {
            if (signature.declaration && signature.declaration.parent) {
              if (ts2.isBinaryExpression(signature.declaration.parent) && ts2.getAssignmentDeclarationKind(signature.declaration.parent) === 5) {
                return signature.declaration.parent;
              }
              if (ts2.isVariableDeclaration(signature.declaration.parent) && signature.declaration.parent.parent) {
                return signature.declaration.parent.parent;
              }
            }
            return signature.declaration;
          }
          function serializeAsNamespaceDeclaration(props, localName, modifierFlags, suppressNewPrivateContext) {
            if (ts2.length(props)) {
              var localVsRemoteMap = ts2.arrayToMultiMap(props, function(p) {
                return !ts2.length(p.declarations) || ts2.some(p.declarations, function(d) {
                  return ts2.getSourceFileOfNode(d) === ts2.getSourceFileOfNode(context.enclosingDeclaration);
                }) ? "local" : "remote";
              });
              var localProps = localVsRemoteMap.get("local") || ts2.emptyArray;
              var fakespace = ts2.parseNodeFactory.createModuleDeclaration(void 0, void 0, ts2.factory.createIdentifier(localName), ts2.factory.createModuleBlock([]), 16);
              ts2.setParent(fakespace, enclosingDeclaration);
              fakespace.locals = ts2.createSymbolTable(props);
              fakespace.symbol = props[0].parent;
              var oldResults = results;
              results = [];
              var oldAddingDeclare = addingDeclare;
              addingDeclare = false;
              var subcontext = __assign(__assign({}, context), { enclosingDeclaration: fakespace });
              var oldContext = context;
              context = subcontext;
              visitSymbolTable(ts2.createSymbolTable(localProps), suppressNewPrivateContext, true);
              context = oldContext;
              addingDeclare = oldAddingDeclare;
              var declarations = results;
              results = oldResults;
              var defaultReplaced = ts2.map(declarations, function(d) {
                return ts2.isExportAssignment(d) && !d.isExportEquals && ts2.isIdentifier(d.expression) ? ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports([ts2.factory.createExportSpecifier(false, d.expression, ts2.factory.createIdentifier("default"))])) : d;
              });
              var exportModifierStripped = ts2.every(defaultReplaced, function(d) {
                return ts2.hasSyntacticModifier(d, 1);
              }) ? ts2.map(defaultReplaced, removeExportModifier) : defaultReplaced;
              fakespace = ts2.factory.updateModuleDeclaration(fakespace, fakespace.decorators, fakespace.modifiers, fakespace.name, ts2.factory.createModuleBlock(exportModifierStripped));
              addResult(fakespace, modifierFlags);
            }
          }
          function isNamespaceMember(p) {
            return !!(p.flags & (788968 | 1920 | 2097152)) || !(p.flags & 4194304 || p.escapedName === "prototype" || p.valueDeclaration && ts2.isStatic(p.valueDeclaration) && ts2.isClassLike(p.valueDeclaration.parent));
          }
          function sanitizeJSDocImplements(clauses) {
            var result = ts2.mapDefined(clauses, function(e) {
              var _a;
              var oldEnclosing = context.enclosingDeclaration;
              context.enclosingDeclaration = e;
              var expr = e.expression;
              if (ts2.isEntityNameExpression(expr)) {
                if (ts2.isIdentifier(expr) && ts2.idText(expr) === "") {
                  return cleanup(void 0);
                }
                var introducesError = void 0;
                _a = trackExistingEntityName(expr, context, includePrivateSymbol), introducesError = _a.introducesError, expr = _a.node;
                if (introducesError) {
                  return cleanup(void 0);
                }
              }
              return cleanup(ts2.factory.createExpressionWithTypeArguments(expr, ts2.map(e.typeArguments, function(a) {
                return serializeExistingTypeNode(context, a, includePrivateSymbol, bundled) || typeToTypeNodeHelper(getTypeFromTypeNode(a), context);
              })));
              function cleanup(result2) {
                context.enclosingDeclaration = oldEnclosing;
                return result2;
              }
            });
            if (result.length === clauses.length) {
              return result;
            }
            return void 0;
          }
          function serializeAsClass(symbol, localName, modifierFlags) {
            var _a, _b;
            var originalDecl = (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isClassLike);
            var oldEnclosing = context.enclosingDeclaration;
            context.enclosingDeclaration = originalDecl || oldEnclosing;
            var localParams = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
            var typeParamDecls = ts2.map(localParams, function(p) {
              return typeParameterToDeclaration(p, context);
            });
            var classType = getDeclaredTypeOfClassOrInterface(symbol);
            var baseTypes = getBaseTypes(classType);
            var originalImplements = originalDecl && ts2.getEffectiveImplementsTypeNodes(originalDecl);
            var implementsExpressions = originalImplements && sanitizeJSDocImplements(originalImplements) || ts2.mapDefined(getImplementsTypes(classType), serializeImplementedType);
            var staticType = getTypeOfSymbol(symbol);
            var isClass = !!((_b = staticType.symbol) === null || _b === void 0 ? void 0 : _b.valueDeclaration) && ts2.isClassLike(staticType.symbol.valueDeclaration);
            var staticBaseType = isClass ? getBaseConstructorTypeOfClass(staticType) : anyType;
            var heritageClauses = __spreadArray(__spreadArray([], !ts2.length(baseTypes) ? [] : [ts2.factory.createHeritageClause(94, ts2.map(baseTypes, function(b) {
              return serializeBaseType(b, staticBaseType, localName);
            }))], true), !ts2.length(implementsExpressions) ? [] : [ts2.factory.createHeritageClause(117, implementsExpressions)], true);
            var symbolProps = getNonInterhitedProperties(classType, baseTypes, getPropertiesOfType(classType));
            var publicSymbolProps = ts2.filter(symbolProps, function(s) {
              var valueDecl = s.valueDeclaration;
              return !!valueDecl && !(ts2.isNamedDeclaration(valueDecl) && ts2.isPrivateIdentifier(valueDecl.name));
            });
            var hasPrivateIdentifier = ts2.some(symbolProps, function(s) {
              var valueDecl = s.valueDeclaration;
              return !!valueDecl && ts2.isNamedDeclaration(valueDecl) && ts2.isPrivateIdentifier(valueDecl.name);
            });
            var privateProperties = hasPrivateIdentifier ? [ts2.factory.createPropertyDeclaration(void 0, void 0, ts2.factory.createPrivateIdentifier("#private"), void 0, void 0, void 0)] : ts2.emptyArray;
            var publicProperties = ts2.flatMap(publicSymbolProps, function(p) {
              return serializePropertySymbolForClass(p, false, baseTypes[0]);
            });
            var staticMembers = ts2.flatMap(ts2.filter(getPropertiesOfType(staticType), function(p) {
              return !(p.flags & 4194304) && p.escapedName !== "prototype" && !isNamespaceMember(p);
            }), function(p) {
              return serializePropertySymbolForClass(p, true, staticBaseType);
            });
            var isNonConstructableClassLikeInJsFile = !isClass && !!symbol.valueDeclaration && ts2.isInJSFile(symbol.valueDeclaration) && !ts2.some(getSignaturesOfType(staticType, 1));
            var constructors = isNonConstructableClassLikeInJsFile ? [ts2.factory.createConstructorDeclaration(void 0, ts2.factory.createModifiersFromModifierFlags(8), [], void 0)] : serializeSignatures(1, staticType, staticBaseType, 170);
            var indexSignatures = serializeIndexSignatures(classType, baseTypes[0]);
            context.enclosingDeclaration = oldEnclosing;
            addResult(ts2.setTextRange(ts2.factory.createClassDeclaration(void 0, void 0, localName, typeParamDecls, heritageClauses, __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], indexSignatures, true), staticMembers, true), constructors, true), publicProperties, true), privateProperties, true)), symbol.declarations && ts2.filter(symbol.declarations, function(d) {
              return ts2.isClassDeclaration(d) || ts2.isClassExpression(d);
            })[0]), modifierFlags);
          }
          function getSomeTargetNameFromDeclarations(declarations) {
            return ts2.firstDefined(declarations, function(d) {
              if (ts2.isImportSpecifier(d) || ts2.isExportSpecifier(d)) {
                return ts2.idText(d.propertyName || d.name);
              }
              if (ts2.isBinaryExpression(d) || ts2.isExportAssignment(d)) {
                var expression = ts2.isExportAssignment(d) ? d.expression : d.right;
                if (ts2.isPropertyAccessExpression(expression)) {
                  return ts2.idText(expression.name);
                }
              }
              if (isAliasSymbolDeclaration(d)) {
                var name = ts2.getNameOfDeclaration(d);
                if (name && ts2.isIdentifier(name)) {
                  return ts2.idText(name);
                }
              }
              return void 0;
            });
          }
          function serializeAsAlias(symbol, localName, modifierFlags) {
            var _a, _b, _c, _d, _e;
            var node = getDeclarationOfAliasSymbol(symbol);
            if (!node)
              return ts2.Debug.fail();
            var target = getMergedSymbol(getTargetOfAliasDeclaration(node, true));
            if (!target) {
              return;
            }
            var verbatimTargetName = ts2.isShorthandAmbientModuleSymbol(target) && getSomeTargetNameFromDeclarations(symbol.declarations) || ts2.unescapeLeadingUnderscores(target.escapedName);
            if (verbatimTargetName === "export=" && (ts2.getESModuleInterop(compilerOptions) || compilerOptions.allowSyntheticDefaultImports)) {
              verbatimTargetName = "default";
            }
            var targetName = getInternalSymbolName(target, verbatimTargetName);
            includePrivateSymbol(target);
            switch (node.kind) {
              case 202:
                if (((_b = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.kind) === 253) {
                  var specifier_1 = getSpecifierForModuleSymbol(target.parent || target, context);
                  var propertyName = node.propertyName;
                  addResult(ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, void 0, ts2.factory.createNamedImports([ts2.factory.createImportSpecifier(false, propertyName && ts2.isIdentifier(propertyName) ? ts2.factory.createIdentifier(ts2.idText(propertyName)) : void 0, ts2.factory.createIdentifier(localName))])), ts2.factory.createStringLiteral(specifier_1), void 0), 0);
                  break;
                }
                ts2.Debug.failBadSyntaxKind(((_c = node.parent) === null || _c === void 0 ? void 0 : _c.parent) || node, "Unhandled binding element grandparent kind in declaration serialization");
                break;
              case 295:
                if (((_e = (_d = node.parent) === null || _d === void 0 ? void 0 : _d.parent) === null || _e === void 0 ? void 0 : _e.kind) === 220) {
                  serializeExportSpecifier(ts2.unescapeLeadingUnderscores(symbol.escapedName), targetName);
                }
                break;
              case 253:
                if (ts2.isPropertyAccessExpression(node.initializer)) {
                  var initializer = node.initializer;
                  var uniqueName = ts2.factory.createUniqueName(localName);
                  var specifier_2 = getSpecifierForModuleSymbol(target.parent || target, context);
                  addResult(ts2.factory.createImportEqualsDeclaration(void 0, void 0, false, uniqueName, ts2.factory.createExternalModuleReference(ts2.factory.createStringLiteral(specifier_2))), 0);
                  addResult(ts2.factory.createImportEqualsDeclaration(void 0, void 0, false, ts2.factory.createIdentifier(localName), ts2.factory.createQualifiedName(uniqueName, initializer.name)), modifierFlags);
                  break;
                }
              case 264:
                if (target.escapedName === "export=" && ts2.some(target.declarations, ts2.isJsonSourceFile)) {
                  serializeMaybeAliasAssignment(symbol);
                  break;
                }
                var isLocalImport = !(target.flags & 512) && !ts2.isVariableDeclaration(node);
                addResult(ts2.factory.createImportEqualsDeclaration(void 0, void 0, false, ts2.factory.createIdentifier(localName), isLocalImport ? symbolToName(target, context, 67108863, false) : ts2.factory.createExternalModuleReference(ts2.factory.createStringLiteral(getSpecifierForModuleSymbol(target, context)))), isLocalImport ? modifierFlags : 0);
                break;
              case 263:
                addResult(ts2.factory.createNamespaceExportDeclaration(ts2.idText(node.name)), 0);
                break;
              case 266:
                addResult(ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, ts2.factory.createIdentifier(localName), void 0), ts2.factory.createStringLiteral(getSpecifierForModuleSymbol(target.parent || target, context)), void 0), 0);
                break;
              case 267:
                addResult(ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, void 0, ts2.factory.createNamespaceImport(ts2.factory.createIdentifier(localName))), ts2.factory.createStringLiteral(getSpecifierForModuleSymbol(target, context)), void 0), 0);
                break;
              case 273:
                addResult(ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamespaceExport(ts2.factory.createIdentifier(localName)), ts2.factory.createStringLiteral(getSpecifierForModuleSymbol(target, context))), 0);
                break;
              case 269:
                addResult(ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, void 0, ts2.factory.createNamedImports([
                  ts2.factory.createImportSpecifier(false, localName !== verbatimTargetName ? ts2.factory.createIdentifier(verbatimTargetName) : void 0, ts2.factory.createIdentifier(localName))
                ])), ts2.factory.createStringLiteral(getSpecifierForModuleSymbol(target.parent || target, context)), void 0), 0);
                break;
              case 274:
                var specifier = node.parent.parent.moduleSpecifier;
                serializeExportSpecifier(ts2.unescapeLeadingUnderscores(symbol.escapedName), specifier ? verbatimTargetName : targetName, specifier && ts2.isStringLiteralLike(specifier) ? ts2.factory.createStringLiteral(specifier.text) : void 0);
                break;
              case 270:
                serializeMaybeAliasAssignment(symbol);
                break;
              case 220:
              case 205:
              case 206:
                if (symbol.escapedName === "default" || symbol.escapedName === "export=") {
                  serializeMaybeAliasAssignment(symbol);
                } else {
                  serializeExportSpecifier(localName, targetName);
                }
                break;
              default:
                return ts2.Debug.failBadSyntaxKind(node, "Unhandled alias declaration kind in symbol serializer!");
            }
          }
          function serializeExportSpecifier(localName, targetName, specifier) {
            addResult(ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports([ts2.factory.createExportSpecifier(false, localName !== targetName ? targetName : void 0, localName)]), specifier), 0);
          }
          function serializeMaybeAliasAssignment(symbol) {
            if (symbol.flags & 4194304) {
              return false;
            }
            var name = ts2.unescapeLeadingUnderscores(symbol.escapedName);
            var isExportEquals = name === "export=";
            var isDefault = name === "default";
            var isExportAssignmentCompatibleSymbolName = isExportEquals || isDefault;
            var aliasDecl = symbol.declarations && getDeclarationOfAliasSymbol(symbol);
            var target = aliasDecl && getTargetOfAliasDeclaration(aliasDecl, true);
            if (target && ts2.length(target.declarations) && ts2.some(target.declarations, function(d) {
              return ts2.getSourceFileOfNode(d) === ts2.getSourceFileOfNode(enclosingDeclaration);
            })) {
              var expr = aliasDecl && (ts2.isExportAssignment(aliasDecl) || ts2.isBinaryExpression(aliasDecl) ? ts2.getExportAssignmentExpression(aliasDecl) : ts2.getPropertyAssignmentAliasLikeExpression(aliasDecl));
              var first_1 = expr && ts2.isEntityNameExpression(expr) ? getFirstNonModuleExportsIdentifier(expr) : void 0;
              var referenced = first_1 && resolveEntityName(first_1, 67108863, true, true, enclosingDeclaration);
              if (referenced || target) {
                includePrivateSymbol(referenced || target);
              }
              var oldTrack = context.tracker.trackSymbol;
              context.tracker.trackSymbol = function() {
                return false;
              };
              if (isExportAssignmentCompatibleSymbolName) {
                results.push(ts2.factory.createExportAssignment(void 0, void 0, isExportEquals, symbolToExpression(target, context, 67108863)));
              } else {
                if (first_1 === expr && first_1) {
                  serializeExportSpecifier(name, ts2.idText(first_1));
                } else if (expr && ts2.isClassExpression(expr)) {
                  serializeExportSpecifier(name, getInternalSymbolName(target, ts2.symbolName(target)));
                } else {
                  var varName = getUnusedName(name, symbol);
                  addResult(ts2.factory.createImportEqualsDeclaration(void 0, void 0, false, ts2.factory.createIdentifier(varName), symbolToName(target, context, 67108863, false)), 0);
                  serializeExportSpecifier(name, varName);
                }
              }
              context.tracker.trackSymbol = oldTrack;
              return true;
            } else {
              var varName = getUnusedName(name, symbol);
              var typeToSerialize = getWidenedType(getTypeOfSymbol(getMergedSymbol(symbol)));
              if (isTypeRepresentableAsFunctionNamespaceMerge(typeToSerialize, symbol)) {
                serializeAsFunctionNamespaceMerge(typeToSerialize, symbol, varName, isExportAssignmentCompatibleSymbolName ? 0 : 1);
              } else {
                var statement = ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([
                  ts2.factory.createVariableDeclaration(varName, void 0, serializeTypeForDeclaration(context, typeToSerialize, symbol, enclosingDeclaration, includePrivateSymbol, bundled))
                ], 2));
                addResult(statement, target && target.flags & 4 && target.escapedName === "export=" ? 2 : name === varName ? 1 : 0);
              }
              if (isExportAssignmentCompatibleSymbolName) {
                results.push(ts2.factory.createExportAssignment(void 0, void 0, isExportEquals, ts2.factory.createIdentifier(varName)));
                return true;
              } else if (name !== varName) {
                serializeExportSpecifier(name, varName);
                return true;
              }
              return false;
            }
          }
          function isTypeRepresentableAsFunctionNamespaceMerge(typeToSerialize, hostSymbol) {
            var ctxSrc = ts2.getSourceFileOfNode(context.enclosingDeclaration);
            return ts2.getObjectFlags(typeToSerialize) & (16 | 32) && !ts2.length(getIndexInfosOfType(typeToSerialize)) && !isClassInstanceSide(typeToSerialize) && !!(ts2.length(ts2.filter(getPropertiesOfType(typeToSerialize), isNamespaceMember)) || ts2.length(getSignaturesOfType(typeToSerialize, 0))) && !ts2.length(getSignaturesOfType(typeToSerialize, 1)) && !getDeclarationWithTypeAnnotation(hostSymbol, enclosingDeclaration) && !(typeToSerialize.symbol && ts2.some(typeToSerialize.symbol.declarations, function(d) {
              return ts2.getSourceFileOfNode(d) !== ctxSrc;
            })) && !ts2.some(getPropertiesOfType(typeToSerialize), function(p) {
              return isLateBoundName(p.escapedName);
            }) && !ts2.some(getPropertiesOfType(typeToSerialize), function(p) {
              return ts2.some(p.declarations, function(d) {
                return ts2.getSourceFileOfNode(d) !== ctxSrc;
              });
            }) && ts2.every(getPropertiesOfType(typeToSerialize), function(p) {
              return ts2.isIdentifierText(ts2.symbolName(p), languageVersion);
            });
          }
          function makeSerializePropertySymbol(createProperty, methodKind, useAccessors) {
            return function serializePropertySymbol(p, isStatic, baseType) {
              var _a, _b, _c, _d, _e;
              var modifierFlags = ts2.getDeclarationModifierFlagsFromSymbol(p);
              var isPrivate = !!(modifierFlags & 8);
              if (isStatic && p.flags & (788968 | 1920 | 2097152)) {
                return [];
              }
              if (p.flags & 4194304 || baseType && getPropertyOfType(baseType, p.escapedName) && isReadonlySymbol(getPropertyOfType(baseType, p.escapedName)) === isReadonlySymbol(p) && (p.flags & 16777216) === (getPropertyOfType(baseType, p.escapedName).flags & 16777216) && isTypeIdenticalTo(getTypeOfSymbol(p), getTypeOfPropertyOfType(baseType, p.escapedName))) {
                return [];
              }
              var flag = modifierFlags & ~256 | (isStatic ? 32 : 0);
              var name = getPropertyNameNodeForSymbol(p, context);
              var firstPropertyLikeDecl = (_a = p.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.or(ts2.isPropertyDeclaration, ts2.isAccessor, ts2.isVariableDeclaration, ts2.isPropertySignature, ts2.isBinaryExpression, ts2.isPropertyAccessExpression));
              if (p.flags & 98304 && useAccessors) {
                var result = [];
                if (p.flags & 65536) {
                  result.push(ts2.setTextRange(ts2.factory.createSetAccessorDeclaration(void 0, ts2.factory.createModifiersFromModifierFlags(flag), name, [ts2.factory.createParameterDeclaration(void 0, void 0, void 0, "arg", void 0, isPrivate ? void 0 : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled))], void 0), ((_b = p.declarations) === null || _b === void 0 ? void 0 : _b.find(ts2.isSetAccessor)) || firstPropertyLikeDecl));
                }
                if (p.flags & 32768) {
                  var isPrivate_1 = modifierFlags & 8;
                  result.push(ts2.setTextRange(ts2.factory.createGetAccessorDeclaration(void 0, ts2.factory.createModifiersFromModifierFlags(flag), name, [], isPrivate_1 ? void 0 : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled), void 0), ((_c = p.declarations) === null || _c === void 0 ? void 0 : _c.find(ts2.isGetAccessor)) || firstPropertyLikeDecl));
                }
                return result;
              } else if (p.flags & (4 | 3 | 98304)) {
                return ts2.setTextRange(createProperty(void 0, ts2.factory.createModifiersFromModifierFlags((isReadonlySymbol(p) ? 64 : 0) | flag), name, p.flags & 16777216 ? ts2.factory.createToken(57) : void 0, isPrivate ? void 0 : serializeTypeForDeclaration(context, getTypeOfSymbol(p), p, enclosingDeclaration, includePrivateSymbol, bundled), void 0), ((_d = p.declarations) === null || _d === void 0 ? void 0 : _d.find(ts2.or(ts2.isPropertyDeclaration, ts2.isVariableDeclaration))) || firstPropertyLikeDecl);
              }
              if (p.flags & (8192 | 16)) {
                var type = getTypeOfSymbol(p);
                var signatures = getSignaturesOfType(type, 0);
                if (flag & 8) {
                  return ts2.setTextRange(createProperty(void 0, ts2.factory.createModifiersFromModifierFlags((isReadonlySymbol(p) ? 64 : 0) | flag), name, p.flags & 16777216 ? ts2.factory.createToken(57) : void 0, void 0, void 0), ((_e = p.declarations) === null || _e === void 0 ? void 0 : _e.find(ts2.isFunctionLikeDeclaration)) || signatures[0] && signatures[0].declaration || p.declarations && p.declarations[0]);
                }
                var results_1 = [];
                for (var _i = 0, signatures_3 = signatures; _i < signatures_3.length; _i++) {
                  var sig = signatures_3[_i];
                  var decl = signatureToSignatureDeclarationHelper(sig, methodKind, context, {
                    name,
                    questionToken: p.flags & 16777216 ? ts2.factory.createToken(57) : void 0,
                    modifiers: flag ? ts2.factory.createModifiersFromModifierFlags(flag) : void 0
                  });
                  var location = sig.declaration && ts2.isPrototypePropertyAssignment(sig.declaration.parent) ? sig.declaration.parent : sig.declaration;
                  results_1.push(ts2.setTextRange(decl, location));
                }
                return results_1;
              }
              return ts2.Debug.fail("Unhandled class member kind! ".concat(p.__debugFlags || p.flags));
            };
          }
          function serializePropertySymbolForInterface(p, baseType) {
            return serializePropertySymbolForInterfaceWorker(p, false, baseType);
          }
          function serializeSignatures(kind, input, baseType, outputKind) {
            var signatures = getSignaturesOfType(input, kind);
            if (kind === 1) {
              if (!baseType && ts2.every(signatures, function(s2) {
                return ts2.length(s2.parameters) === 0;
              })) {
                return [];
              }
              if (baseType) {
                var baseSigs = getSignaturesOfType(baseType, 1);
                if (!ts2.length(baseSigs) && ts2.every(signatures, function(s2) {
                  return ts2.length(s2.parameters) === 0;
                })) {
                  return [];
                }
                if (baseSigs.length === signatures.length) {
                  var failed = false;
                  for (var i = 0; i < baseSigs.length; i++) {
                    if (!compareSignaturesIdentical(signatures[i], baseSigs[i], false, false, true, compareTypesIdentical)) {
                      failed = true;
                      break;
                    }
                  }
                  if (!failed) {
                    return [];
                  }
                }
              }
              var privateProtected = 0;
              for (var _i = 0, signatures_4 = signatures; _i < signatures_4.length; _i++) {
                var s = signatures_4[_i];
                if (s.declaration) {
                  privateProtected |= ts2.getSelectedEffectiveModifierFlags(s.declaration, 8 | 16);
                }
              }
              if (privateProtected) {
                return [ts2.setTextRange(ts2.factory.createConstructorDeclaration(void 0, ts2.factory.createModifiersFromModifierFlags(privateProtected), [], void 0), signatures[0].declaration)];
              }
            }
            var results2 = [];
            for (var _a = 0, signatures_5 = signatures; _a < signatures_5.length; _a++) {
              var sig = signatures_5[_a];
              var decl = signatureToSignatureDeclarationHelper(sig, outputKind, context);
              results2.push(ts2.setTextRange(decl, sig.declaration));
            }
            return results2;
          }
          function serializeIndexSignatures(input, baseType) {
            var results2 = [];
            for (var _i = 0, _a = getIndexInfosOfType(input); _i < _a.length; _i++) {
              var info = _a[_i];
              if (baseType) {
                var baseInfo = getIndexInfoOfType(baseType, info.keyType);
                if (baseInfo) {
                  if (isTypeIdenticalTo(info.type, baseInfo.type)) {
                    continue;
                  }
                }
              }
              results2.push(indexInfoToIndexSignatureDeclarationHelper(info, context, void 0));
            }
            return results2;
          }
          function serializeBaseType(t, staticType, rootName) {
            var ref = trySerializeAsTypeReference(t, 111551);
            if (ref) {
              return ref;
            }
            var tempName = getUnusedName("".concat(rootName, "_base"));
            var statement = ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([
              ts2.factory.createVariableDeclaration(tempName, void 0, typeToTypeNodeHelper(staticType, context))
            ], 2));
            addResult(statement, 0);
            return ts2.factory.createExpressionWithTypeArguments(ts2.factory.createIdentifier(tempName), void 0);
          }
          function trySerializeAsTypeReference(t, flags) {
            var typeArgs;
            var reference;
            if (t.target && isSymbolAccessibleByFlags(t.target.symbol, enclosingDeclaration, flags)) {
              typeArgs = ts2.map(getTypeArguments(t), function(t2) {
                return typeToTypeNodeHelper(t2, context);
              });
              reference = symbolToExpression(t.target.symbol, context, 788968);
            } else if (t.symbol && isSymbolAccessibleByFlags(t.symbol, enclosingDeclaration, flags)) {
              reference = symbolToExpression(t.symbol, context, 788968);
            }
            if (reference) {
              return ts2.factory.createExpressionWithTypeArguments(reference, typeArgs);
            }
          }
          function serializeImplementedType(t) {
            var ref = trySerializeAsTypeReference(t, 788968);
            if (ref) {
              return ref;
            }
            if (t.symbol) {
              return ts2.factory.createExpressionWithTypeArguments(symbolToExpression(t.symbol, context, 788968), void 0);
            }
          }
          function getUnusedName(input, symbol) {
            var _a, _b;
            var id = symbol ? getSymbolId(symbol) : void 0;
            if (id) {
              if (context.remappedSymbolNames.has(id)) {
                return context.remappedSymbolNames.get(id);
              }
            }
            if (symbol) {
              input = getNameCandidateWorker(symbol, input);
            }
            var i = 0;
            var original = input;
            while ((_a = context.usedSymbolNames) === null || _a === void 0 ? void 0 : _a.has(input)) {
              i++;
              input = "".concat(original, "_").concat(i);
            }
            (_b = context.usedSymbolNames) === null || _b === void 0 ? void 0 : _b.add(input);
            if (id) {
              context.remappedSymbolNames.set(id, input);
            }
            return input;
          }
          function getNameCandidateWorker(symbol, localName) {
            if (localName === "default" || localName === "__class" || localName === "__function") {
              var flags = context.flags;
              context.flags |= 16777216;
              var nameCandidate = getNameOfSymbolAsWritten(symbol, context);
              context.flags = flags;
              localName = nameCandidate.length > 0 && ts2.isSingleOrDoubleQuote(nameCandidate.charCodeAt(0)) ? ts2.stripQuotes(nameCandidate) : nameCandidate;
            }
            if (localName === "default") {
              localName = "_default";
            } else if (localName === "export=") {
              localName = "_exports";
            }
            localName = ts2.isIdentifierText(localName, languageVersion) && !ts2.isStringANonContextualKeyword(localName) ? localName : "_" + localName.replace(/[^a-zA-Z0-9]/g, "_");
            return localName;
          }
          function getInternalSymbolName(symbol, localName) {
            var id = getSymbolId(symbol);
            if (context.remappedSymbolNames.has(id)) {
              return context.remappedSymbolNames.get(id);
            }
            localName = getNameCandidateWorker(symbol, localName);
            context.remappedSymbolNames.set(id, localName);
            return localName;
          }
        }
      }
      function typePredicateToString(typePredicate, enclosingDeclaration, flags, writer) {
        if (flags === void 0) {
          flags = 16384;
        }
        return writer ? typePredicateToStringWorker(writer).getText() : ts2.usingSingleLineStringWriter(typePredicateToStringWorker);
        function typePredicateToStringWorker(writer2) {
          var predicate = ts2.factory.createTypePredicateNode(typePredicate.kind === 2 || typePredicate.kind === 3 ? ts2.factory.createToken(128) : void 0, typePredicate.kind === 1 || typePredicate.kind === 3 ? ts2.factory.createIdentifier(typePredicate.parameterName) : ts2.factory.createThisTypeNode(), typePredicate.type && nodeBuilder.typeToTypeNode(typePredicate.type, enclosingDeclaration, toNodeBuilderFlags(flags) | 70221824 | 512));
          var printer = ts2.createPrinter({ removeComments: true });
          var sourceFile = enclosingDeclaration && ts2.getSourceFileOfNode(enclosingDeclaration);
          printer.writeNode(4, predicate, sourceFile, writer2);
          return writer2;
        }
      }
      function formatUnionTypes(types) {
        var result = [];
        var flags = 0;
        for (var i = 0; i < types.length; i++) {
          var t = types[i];
          flags |= t.flags;
          if (!(t.flags & 98304)) {
            if (t.flags & (512 | 1024)) {
              var baseType = t.flags & 512 ? booleanType : getBaseTypeOfEnumLiteralType(t);
              if (baseType.flags & 1048576) {
                var count = baseType.types.length;
                if (i + count <= types.length && getRegularTypeOfLiteralType(types[i + count - 1]) === getRegularTypeOfLiteralType(baseType.types[count - 1])) {
                  result.push(baseType);
                  i += count - 1;
                  continue;
                }
              }
            }
            result.push(t);
          }
        }
        if (flags & 65536)
          result.push(nullType);
        if (flags & 32768)
          result.push(undefinedType);
        return result || types;
      }
      function visibilityToString(flags) {
        if (flags === 8) {
          return "private";
        }
        if (flags === 16) {
          return "protected";
        }
        return "public";
      }
      function getTypeAliasForTypeLiteral(type) {
        if (type.symbol && type.symbol.flags & 2048 && type.symbol.declarations) {
          var node = ts2.walkUpParenthesizedTypes(type.symbol.declarations[0].parent);
          if (node.kind === 258) {
            return getSymbolOfNode(node);
          }
        }
        return void 0;
      }
      function isTopLevelInExternalModuleAugmentation(node) {
        return node && node.parent && node.parent.kind === 261 && ts2.isExternalModuleAugmentation(node.parent.parent);
      }
      function isDefaultBindingContext(location) {
        return location.kind === 303 || ts2.isAmbientModule(location);
      }
      function getNameOfSymbolFromNameType(symbol, context) {
        var nameType = getSymbolLinks(symbol).nameType;
        if (nameType) {
          if (nameType.flags & 384) {
            var name = "" + nameType.value;
            if (!ts2.isIdentifierText(name, ts2.getEmitScriptTarget(compilerOptions)) && !isNumericLiteralName(name)) {
              return '"'.concat(ts2.escapeString(name, 34), '"');
            }
            if (isNumericLiteralName(name) && ts2.startsWith(name, "-")) {
              return "[".concat(name, "]");
            }
            return name;
          }
          if (nameType.flags & 8192) {
            return "[".concat(getNameOfSymbolAsWritten(nameType.symbol, context), "]");
          }
        }
      }
      function getNameOfSymbolAsWritten(symbol, context) {
        if (context && symbol.escapedName === "default" && !(context.flags & 16384) && (!(context.flags & 16777216) || !symbol.declarations || context.enclosingDeclaration && ts2.findAncestor(symbol.declarations[0], isDefaultBindingContext) !== ts2.findAncestor(context.enclosingDeclaration, isDefaultBindingContext))) {
          return "default";
        }
        if (symbol.declarations && symbol.declarations.length) {
          var declaration = ts2.firstDefined(symbol.declarations, function(d) {
            return ts2.getNameOfDeclaration(d) ? d : void 0;
          });
          var name_3 = declaration && ts2.getNameOfDeclaration(declaration);
          if (declaration && name_3) {
            if (ts2.isCallExpression(declaration) && ts2.isBindableObjectDefinePropertyCall(declaration)) {
              return ts2.symbolName(symbol);
            }
            if (ts2.isComputedPropertyName(name_3) && !(ts2.getCheckFlags(symbol) & 4096)) {
              var nameType = getSymbolLinks(symbol).nameType;
              if (nameType && nameType.flags & 384) {
                var result = getNameOfSymbolFromNameType(symbol, context);
                if (result !== void 0) {
                  return result;
                }
              }
            }
            return ts2.declarationNameToString(name_3);
          }
          if (!declaration) {
            declaration = symbol.declarations[0];
          }
          if (declaration.parent && declaration.parent.kind === 253) {
            return ts2.declarationNameToString(declaration.parent.name);
          }
          switch (declaration.kind) {
            case 225:
            case 212:
            case 213:
              if (context && !context.encounteredError && !(context.flags & 131072)) {
                context.encounteredError = true;
              }
              return declaration.kind === 225 ? "(Anonymous class)" : "(Anonymous function)";
          }
        }
        var name = getNameOfSymbolFromNameType(symbol, context);
        return name !== void 0 ? name : ts2.symbolName(symbol);
      }
      function isDeclarationVisible(node) {
        if (node) {
          var links = getNodeLinks(node);
          if (links.isVisible === void 0) {
            links.isVisible = !!determineIfDeclarationIsVisible();
          }
          return links.isVisible;
        }
        return false;
        function determineIfDeclarationIsVisible() {
          switch (node.kind) {
            case 336:
            case 343:
            case 337:
              return !!(node.parent && node.parent.parent && node.parent.parent.parent && ts2.isSourceFile(node.parent.parent.parent));
            case 202:
              return isDeclarationVisible(node.parent.parent);
            case 253:
              if (ts2.isBindingPattern(node.name) && !node.name.elements.length) {
                return false;
              }
            case 260:
            case 256:
            case 257:
            case 258:
            case 255:
            case 259:
            case 264:
              if (ts2.isExternalModuleAugmentation(node)) {
                return true;
              }
              var parent = getDeclarationContainer(node);
              if (!(ts2.getCombinedModifierFlags(node) & 1) && !(node.kind !== 264 && parent.kind !== 303 && parent.flags & 8388608)) {
                return isGlobalSourceFile(parent);
              }
              return isDeclarationVisible(parent);
            case 166:
            case 165:
            case 171:
            case 172:
            case 168:
            case 167:
              if (ts2.hasEffectiveModifier(node, 8 | 16)) {
                return false;
              }
            case 170:
            case 174:
            case 173:
            case 175:
            case 163:
            case 261:
            case 178:
            case 179:
            case 181:
            case 177:
            case 182:
            case 183:
            case 186:
            case 187:
            case 190:
            case 196:
              return isDeclarationVisible(node.parent);
            case 266:
            case 267:
            case 269:
              return false;
            case 162:
            case 303:
            case 263:
              return true;
            case 270:
              return false;
            default:
              return false;
          }
        }
      }
      function collectLinkedAliases(node, setVisibility) {
        var exportSymbol;
        if (node.parent && node.parent.kind === 270) {
          exportSymbol = resolveName(node, node.escapedText, 111551 | 788968 | 1920 | 2097152, void 0, node, false);
        } else if (node.parent.kind === 274) {
          exportSymbol = getTargetOfExportSpecifier(node.parent, 111551 | 788968 | 1920 | 2097152);
        }
        var result;
        var visited;
        if (exportSymbol) {
          visited = new ts2.Set();
          visited.add(getSymbolId(exportSymbol));
          buildVisibleNodeList(exportSymbol.declarations);
        }
        return result;
        function buildVisibleNodeList(declarations) {
          ts2.forEach(declarations, function(declaration) {
            var resultNode = getAnyImportSyntax(declaration) || declaration;
            if (setVisibility) {
              getNodeLinks(declaration).isVisible = true;
            } else {
              result = result || [];
              ts2.pushIfUnique(result, resultNode);
            }
            if (ts2.isInternalModuleImportEqualsDeclaration(declaration)) {
              var internalModuleReference = declaration.moduleReference;
              var firstIdentifier = ts2.getFirstIdentifier(internalModuleReference);
              var importSymbol = resolveName(declaration, firstIdentifier.escapedText, 111551 | 788968 | 1920, void 0, void 0, false);
              if (importSymbol && visited) {
                if (ts2.tryAddToSet(visited, getSymbolId(importSymbol))) {
                  buildVisibleNodeList(importSymbol.declarations);
                }
              }
            }
          });
        }
      }
      function pushTypeResolution(target, propertyName) {
        var resolutionCycleStartIndex = findResolutionCycleStartIndex(target, propertyName);
        if (resolutionCycleStartIndex >= 0) {
          var length_3 = resolutionTargets.length;
          for (var i = resolutionCycleStartIndex; i < length_3; i++) {
            resolutionResults[i] = false;
          }
          return false;
        }
        resolutionTargets.push(target);
        resolutionResults.push(true);
        resolutionPropertyNames.push(propertyName);
        return true;
      }
      function findResolutionCycleStartIndex(target, propertyName) {
        for (var i = resolutionTargets.length - 1; i >= 0; i--) {
          if (hasType(resolutionTargets[i], resolutionPropertyNames[i])) {
            return -1;
          }
          if (resolutionTargets[i] === target && resolutionPropertyNames[i] === propertyName) {
            return i;
          }
        }
        return -1;
      }
      function hasType(target, propertyName) {
        switch (propertyName) {
          case 0:
            return !!getSymbolLinks(target).type;
          case 5:
            return !!getNodeLinks(target).resolvedEnumType;
          case 2:
            return !!getSymbolLinks(target).declaredType;
          case 1:
            return !!target.resolvedBaseConstructorType;
          case 3:
            return !!target.resolvedReturnType;
          case 4:
            return !!target.immediateBaseConstraint;
          case 6:
            return !!target.resolvedTypeArguments;
          case 7:
            return !!target.baseTypesResolved;
        }
        return ts2.Debug.assertNever(propertyName);
      }
      function popTypeResolution() {
        resolutionTargets.pop();
        resolutionPropertyNames.pop();
        return resolutionResults.pop();
      }
      function getDeclarationContainer(node) {
        return ts2.findAncestor(ts2.getRootDeclaration(node), function(node2) {
          switch (node2.kind) {
            case 253:
            case 254:
            case 269:
            case 268:
            case 267:
            case 266:
              return false;
            default:
              return true;
          }
        }).parent;
      }
      function getTypeOfPrototypeProperty(prototype) {
        var classType = getDeclaredTypeOfSymbol(getParentOfSymbol(prototype));
        return classType.typeParameters ? createTypeReference(classType, ts2.map(classType.typeParameters, function(_) {
          return anyType;
        })) : classType;
      }
      function getTypeOfPropertyOfType(type, name) {
        var prop = getPropertyOfType(type, name);
        return prop ? getTypeOfSymbol(prop) : void 0;
      }
      function getTypeOfPropertyOrIndexSignature(type, name) {
        var _a;
        return getTypeOfPropertyOfType(type, name) || ((_a = getApplicableIndexInfoForName(type, name)) === null || _a === void 0 ? void 0 : _a.type) || unknownType;
      }
      function isTypeAny(type) {
        return type && (type.flags & 1) !== 0;
      }
      function isErrorType(type) {
        return type === errorType || !!(type.flags & 1 && type.aliasSymbol);
      }
      function getTypeForBindingElementParent(node) {
        var symbol = getSymbolOfNode(node);
        return symbol && getSymbolLinks(symbol).type || getTypeForVariableLikeDeclaration(node, false);
      }
      function getRestType(source, properties, symbol) {
        source = filterType(source, function(t) {
          return !(t.flags & 98304);
        });
        if (source.flags & 131072) {
          return emptyObjectType;
        }
        if (source.flags & 1048576) {
          return mapType(source, function(t) {
            return getRestType(t, properties, symbol);
          });
        }
        var omitKeyType = getUnionType(ts2.map(properties, getLiteralTypeFromPropertyName));
        if (isGenericObjectType(source) || isGenericIndexType(omitKeyType)) {
          if (omitKeyType.flags & 131072) {
            return source;
          }
          var omitTypeAlias = getGlobalOmitSymbol();
          if (!omitTypeAlias) {
            return errorType;
          }
          return getTypeAliasInstantiation(omitTypeAlias, [source, omitKeyType]);
        }
        var members = ts2.createSymbolTable();
        for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) {
          var prop = _a[_i];
          if (!isTypeAssignableTo(getLiteralTypeFromProperty(prop, 8576), omitKeyType) && !(ts2.getDeclarationModifierFlagsFromSymbol(prop) & (8 | 16)) && isSpreadableProperty(prop)) {
            members.set(prop.escapedName, getSpreadSymbol(prop, false));
          }
        }
        var result = createAnonymousType(symbol, members, ts2.emptyArray, ts2.emptyArray, getIndexInfosOfType(source));
        result.objectFlags |= 8388608;
        return result;
      }
      function isGenericTypeWithUndefinedConstraint(type) {
        return !!(type.flags & 465829888) && maybeTypeOfKind(getBaseConstraintOfType(type) || unknownType, 32768);
      }
      function getNonUndefinedType(type) {
        var typeOrConstraint = someType(type, isGenericTypeWithUndefinedConstraint) ? mapType(type, function(t) {
          return t.flags & 465829888 ? getBaseConstraintOrType(t) : t;
        }) : type;
        return getTypeWithFacts(typeOrConstraint, 524288);
      }
      function getFlowTypeOfDestructuring(node, declaredType) {
        var reference = getSyntheticElementAccess(node);
        return reference ? getFlowTypeOfReference(reference, declaredType) : declaredType;
      }
      function getSyntheticElementAccess(node) {
        var parentAccess = getParentElementAccess(node);
        if (parentAccess && parentAccess.flowNode) {
          var propName = getDestructuringPropertyName(node);
          if (propName) {
            var literal = ts2.setTextRange(ts2.parseNodeFactory.createStringLiteral(propName), node);
            var lhsExpr = ts2.isLeftHandSideExpression(parentAccess) ? parentAccess : ts2.parseNodeFactory.createParenthesizedExpression(parentAccess);
            var result = ts2.setTextRange(ts2.parseNodeFactory.createElementAccessExpression(lhsExpr, literal), node);
            ts2.setParent(literal, result);
            ts2.setParent(result, node);
            if (lhsExpr !== parentAccess) {
              ts2.setParent(lhsExpr, result);
            }
            result.flowNode = parentAccess.flowNode;
            return result;
          }
        }
      }
      function getParentElementAccess(node) {
        var ancestor = node.parent.parent;
        switch (ancestor.kind) {
          case 202:
          case 294:
            return getSyntheticElementAccess(ancestor);
          case 203:
            return getSyntheticElementAccess(node.parent);
          case 253:
            return ancestor.initializer;
          case 220:
            return ancestor.right;
        }
      }
      function getDestructuringPropertyName(node) {
        var parent = node.parent;
        if (node.kind === 202 && parent.kind === 200) {
          return getLiteralPropertyNameText(node.propertyName || node.name);
        }
        if (node.kind === 294 || node.kind === 295) {
          return getLiteralPropertyNameText(node.name);
        }
        return "" + parent.elements.indexOf(node);
      }
      function getLiteralPropertyNameText(name) {
        var type = getLiteralTypeFromPropertyName(name);
        return type.flags & (128 | 256) ? "" + type.value : void 0;
      }
      function getTypeForBindingElement(declaration) {
        var pattern = declaration.parent;
        var parentType = getTypeForBindingElementParent(pattern.parent);
        if (!parentType || isTypeAny(parentType)) {
          return parentType;
        }
        if (strictNullChecks && declaration.flags & 8388608 && ts2.isParameterDeclaration(declaration)) {
          parentType = getNonNullableType(parentType);
        } else if (strictNullChecks && pattern.parent.initializer && !(getTypeFacts(getTypeOfInitializer(pattern.parent.initializer)) & 65536)) {
          parentType = getTypeWithFacts(parentType, 524288);
        }
        var type;
        if (pattern.kind === 200) {
          if (declaration.dotDotDotToken) {
            parentType = getReducedType(parentType);
            if (parentType.flags & 2 || !isValidSpreadType(parentType)) {
              error(declaration, ts2.Diagnostics.Rest_types_may_only_be_created_from_object_types);
              return errorType;
            }
            var literalMembers = [];
            for (var _i = 0, _a = pattern.elements; _i < _a.length; _i++) {
              var element = _a[_i];
              if (!element.dotDotDotToken) {
                literalMembers.push(element.propertyName || element.name);
              }
            }
            type = getRestType(parentType, literalMembers, declaration.symbol);
          } else {
            var name = declaration.propertyName || declaration.name;
            var indexType = getLiteralTypeFromPropertyName(name);
            var declaredType = getIndexedAccessType(parentType, indexType, 32, name);
            type = getFlowTypeOfDestructuring(declaration, declaredType);
          }
        } else {
          var elementType = checkIteratedTypeOrElementType(65 | (declaration.dotDotDotToken ? 0 : 128), parentType, undefinedType, pattern);
          var index_2 = pattern.elements.indexOf(declaration);
          if (declaration.dotDotDotToken) {
            type = everyType(parentType, isTupleType) ? mapType(parentType, function(t) {
              return sliceTupleType(t, index_2);
            }) : createArrayType(elementType);
          } else if (isArrayLikeType(parentType)) {
            var indexType = getNumberLiteralType(index_2);
            var accessFlags = 32 | (hasDefaultValue(declaration) ? 16 : 0);
            var declaredType = getIndexedAccessTypeOrUndefined(parentType, indexType, accessFlags, declaration.name) || errorType;
            type = getFlowTypeOfDestructuring(declaration, declaredType);
          } else {
            type = elementType;
          }
        }
        if (!declaration.initializer) {
          return type;
        }
        if (ts2.getEffectiveTypeAnnotationNode(ts2.walkUpBindingElementsAndPatterns(declaration))) {
          return strictNullChecks && !(getFalsyFlags(checkDeclarationInitializer(declaration)) & 32768) ? getNonUndefinedType(type) : type;
        }
        return widenTypeInferredFromInitializer(declaration, getUnionType([getNonUndefinedType(type), checkDeclarationInitializer(declaration)], 2));
      }
      function getTypeForDeclarationFromJSDocComment(declaration) {
        var jsdocType = ts2.getJSDocType(declaration);
        if (jsdocType) {
          return getTypeFromTypeNode(jsdocType);
        }
        return void 0;
      }
      function isNullOrUndefined(node) {
        var expr = ts2.skipParentheses(node, true);
        return expr.kind === 104 || expr.kind === 79 && getResolvedSymbol(expr) === undefinedSymbol;
      }
      function isEmptyArrayLiteral(node) {
        var expr = ts2.skipParentheses(node, true);
        return expr.kind === 203 && expr.elements.length === 0;
      }
      function addOptionality(type, isProperty, isOptional) {
        if (isProperty === void 0) {
          isProperty = false;
        }
        if (isOptional === void 0) {
          isOptional = true;
        }
        return strictNullChecks && isOptional ? getOptionalType(type, isProperty) : type;
      }
      function getTypeForVariableLikeDeclaration(declaration, includeOptionality) {
        if (ts2.isVariableDeclaration(declaration) && declaration.parent.parent.kind === 242) {
          var indexType = getIndexType(getNonNullableTypeIfNeeded(checkExpression(declaration.parent.parent.expression)));
          return indexType.flags & (262144 | 4194304) ? getExtractStringType(indexType) : stringType;
        }
        if (ts2.isVariableDeclaration(declaration) && declaration.parent.parent.kind === 243) {
          var forOfStatement = declaration.parent.parent;
          return checkRightHandSideOfForOf(forOfStatement) || anyType;
        }
        if (ts2.isBindingPattern(declaration.parent)) {
          return getTypeForBindingElement(declaration);
        }
        var isProperty = ts2.isPropertyDeclaration(declaration) || ts2.isPropertySignature(declaration);
        var isOptional = includeOptionality && (isProperty && !!declaration.questionToken || ts2.isParameter(declaration) && (!!declaration.questionToken || isJSDocOptionalParameter(declaration)) || isOptionalJSDocPropertyLikeTag(declaration));
        var declaredType = tryGetTypeFromEffectiveTypeNode(declaration);
        if (declaredType) {
          return addOptionality(declaredType, isProperty, isOptional);
        }
        if ((noImplicitAny || ts2.isInJSFile(declaration)) && ts2.isVariableDeclaration(declaration) && !ts2.isBindingPattern(declaration.name) && !(ts2.getCombinedModifierFlags(declaration) & 1) && !(declaration.flags & 8388608)) {
          if (!(ts2.getCombinedNodeFlags(declaration) & 2) && (!declaration.initializer || isNullOrUndefined(declaration.initializer))) {
            return autoType;
          }
          if (declaration.initializer && isEmptyArrayLiteral(declaration.initializer)) {
            return autoArrayType;
          }
        }
        if (ts2.isParameter(declaration)) {
          var func = declaration.parent;
          if (func.kind === 172 && hasBindableName(func)) {
            var getter = ts2.getDeclarationOfKind(getSymbolOfNode(declaration.parent), 171);
            if (getter) {
              var getterSignature = getSignatureFromDeclaration(getter);
              var thisParameter = getAccessorThisParameter(func);
              if (thisParameter && declaration === thisParameter) {
                ts2.Debug.assert(!thisParameter.type);
                return getTypeOfSymbol(getterSignature.thisParameter);
              }
              return getReturnTypeOfSignature(getterSignature);
            }
          }
          if (ts2.isInJSFile(declaration)) {
            var typeTag = ts2.getJSDocType(func);
            if (typeTag && ts2.isFunctionTypeNode(typeTag)) {
              var signature = getSignatureFromDeclaration(typeTag);
              var pos = func.parameters.indexOf(declaration);
              return declaration.dotDotDotToken ? getRestTypeAtPosition(signature, pos) : getTypeAtPosition(signature, pos);
            }
          }
          var type = declaration.symbol.escapedName === "this" ? getContextualThisParameterType(func) : getContextuallyTypedParameterType(declaration);
          if (type) {
            return addOptionality(type, false, isOptional);
          }
        }
        if (ts2.hasOnlyExpressionInitializer(declaration) && !!declaration.initializer) {
          if (ts2.isInJSFile(declaration) && !ts2.isParameter(declaration)) {
            var containerObjectType = getJSContainerObjectType(declaration, getSymbolOfNode(declaration), ts2.getDeclaredExpandoInitializer(declaration));
            if (containerObjectType) {
              return containerObjectType;
            }
          }
          var type = widenTypeInferredFromInitializer(declaration, checkDeclarationInitializer(declaration));
          return addOptionality(type, isProperty, isOptional);
        }
        if (ts2.isPropertyDeclaration(declaration) && (noImplicitAny || ts2.isInJSFile(declaration))) {
          if (!ts2.hasStaticModifier(declaration)) {
            var constructor = findConstructorDeclaration(declaration.parent);
            var type = constructor ? getFlowTypeInConstructor(declaration.symbol, constructor) : ts2.getEffectiveModifierFlags(declaration) & 2 ? getTypeOfPropertyInBaseClass(declaration.symbol) : void 0;
            return type && addOptionality(type, true, isOptional);
          } else {
            var staticBlocks = ts2.filter(declaration.parent.members, ts2.isClassStaticBlockDeclaration);
            var type = staticBlocks.length ? getFlowTypeInStaticBlocks(declaration.symbol, staticBlocks) : ts2.getEffectiveModifierFlags(declaration) & 2 ? getTypeOfPropertyInBaseClass(declaration.symbol) : void 0;
            return type && addOptionality(type, true, isOptional);
          }
        }
        if (ts2.isJsxAttribute(declaration)) {
          return trueType;
        }
        if (ts2.isBindingPattern(declaration.name)) {
          return getTypeFromBindingPattern(declaration.name, false, true);
        }
        return void 0;
      }
      function isConstructorDeclaredProperty(symbol) {
        if (symbol.valueDeclaration && ts2.isBinaryExpression(symbol.valueDeclaration)) {
          var links = getSymbolLinks(symbol);
          if (links.isConstructorDeclaredProperty === void 0) {
            links.isConstructorDeclaredProperty = false;
            links.isConstructorDeclaredProperty = !!getDeclaringConstructor(symbol) && ts2.every(symbol.declarations, function(declaration) {
              return ts2.isBinaryExpression(declaration) && isPossiblyAliasedThisProperty(declaration) && (declaration.left.kind !== 206 || ts2.isStringOrNumericLiteralLike(declaration.left.argumentExpression)) && !getAnnotatedTypeForAssignmentDeclaration(void 0, declaration, symbol, declaration);
            });
          }
          return links.isConstructorDeclaredProperty;
        }
        return false;
      }
      function isAutoTypedProperty(symbol) {
        var declaration = symbol.valueDeclaration;
        return declaration && ts2.isPropertyDeclaration(declaration) && !ts2.getEffectiveTypeAnnotationNode(declaration) && !declaration.initializer && (noImplicitAny || ts2.isInJSFile(declaration));
      }
      function getDeclaringConstructor(symbol) {
        if (!symbol.declarations) {
          return;
        }
        for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
          var declaration = _a[_i];
          var container = ts2.getThisContainer(declaration, false);
          if (container && (container.kind === 170 || isJSConstructor(container))) {
            return container;
          }
        }
        ;
      }
      function getFlowTypeFromCommonJSExport(symbol) {
        var file = ts2.getSourceFileOfNode(symbol.declarations[0]);
        var accessName = ts2.unescapeLeadingUnderscores(symbol.escapedName);
        var areAllModuleExports = symbol.declarations.every(function(d) {
          return ts2.isInJSFile(d) && ts2.isAccessExpression(d) && ts2.isModuleExportsAccessExpression(d.expression);
        });
        var reference = areAllModuleExports ? ts2.factory.createPropertyAccessExpression(ts2.factory.createPropertyAccessExpression(ts2.factory.createIdentifier("module"), ts2.factory.createIdentifier("exports")), accessName) : ts2.factory.createPropertyAccessExpression(ts2.factory.createIdentifier("exports"), accessName);
        if (areAllModuleExports) {
          ts2.setParent(reference.expression.expression, reference.expression);
        }
        ts2.setParent(reference.expression, reference);
        ts2.setParent(reference, file);
        reference.flowNode = file.endFlowNode;
        return getFlowTypeOfReference(reference, autoType, undefinedType);
      }
      function getFlowTypeInStaticBlocks(symbol, staticBlocks) {
        var accessName = ts2.startsWith(symbol.escapedName, "__#") ? ts2.factory.createPrivateIdentifier(symbol.escapedName.split("@")[1]) : ts2.unescapeLeadingUnderscores(symbol.escapedName);
        for (var _i = 0, staticBlocks_1 = staticBlocks; _i < staticBlocks_1.length; _i++) {
          var staticBlock = staticBlocks_1[_i];
          var reference = ts2.factory.createPropertyAccessExpression(ts2.factory.createThis(), accessName);
          ts2.setParent(reference.expression, reference);
          ts2.setParent(reference, staticBlock);
          reference.flowNode = staticBlock.returnFlowNode;
          var flowType = getFlowTypeOfProperty(reference, symbol);
          if (noImplicitAny && (flowType === autoType || flowType === autoArrayType)) {
            error(symbol.valueDeclaration, ts2.Diagnostics.Member_0_implicitly_has_an_1_type, symbolToString(symbol), typeToString(flowType));
          }
          if (everyType(flowType, isNullableType)) {
            continue;
          }
          return convertAutoToAny(flowType);
        }
      }
      function getFlowTypeInConstructor(symbol, constructor) {
        var accessName = ts2.startsWith(symbol.escapedName, "__#") ? ts2.factory.createPrivateIdentifier(symbol.escapedName.split("@")[1]) : ts2.unescapeLeadingUnderscores(symbol.escapedName);
        var reference = ts2.factory.createPropertyAccessExpression(ts2.factory.createThis(), accessName);
        ts2.setParent(reference.expression, reference);
        ts2.setParent(reference, constructor);
        reference.flowNode = constructor.returnFlowNode;
        var flowType = getFlowTypeOfProperty(reference, symbol);
        if (noImplicitAny && (flowType === autoType || flowType === autoArrayType)) {
          error(symbol.valueDeclaration, ts2.Diagnostics.Member_0_implicitly_has_an_1_type, symbolToString(symbol), typeToString(flowType));
        }
        return everyType(flowType, isNullableType) ? void 0 : convertAutoToAny(flowType);
      }
      function getFlowTypeOfProperty(reference, prop) {
        var initialType = (prop === null || prop === void 0 ? void 0 : prop.valueDeclaration) && (!isAutoTypedProperty(prop) || ts2.getEffectiveModifierFlags(prop.valueDeclaration) & 2) && getTypeOfPropertyInBaseClass(prop) || undefinedType;
        return getFlowTypeOfReference(reference, autoType, initialType);
      }
      function getWidenedTypeForAssignmentDeclaration(symbol, resolvedSymbol) {
        var container = ts2.getAssignedExpandoInitializer(symbol.valueDeclaration);
        if (container) {
          var tag = ts2.getJSDocTypeTag(container);
          if (tag && tag.typeExpression) {
            return getTypeFromTypeNode(tag.typeExpression);
          }
          var containerObjectType = symbol.valueDeclaration && getJSContainerObjectType(symbol.valueDeclaration, symbol, container);
          return containerObjectType || getWidenedLiteralType(checkExpressionCached(container));
        }
        var type;
        var definedInConstructor = false;
        var definedInMethod = false;
        if (isConstructorDeclaredProperty(symbol)) {
          type = getFlowTypeInConstructor(symbol, getDeclaringConstructor(symbol));
        }
        if (!type) {
          var types = void 0;
          if (symbol.declarations) {
            var jsdocType = void 0;
            for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
              var declaration = _a[_i];
              var expression = ts2.isBinaryExpression(declaration) || ts2.isCallExpression(declaration) ? declaration : ts2.isAccessExpression(declaration) ? ts2.isBinaryExpression(declaration.parent) ? declaration.parent : declaration : void 0;
              if (!expression) {
                continue;
              }
              var kind = ts2.isAccessExpression(expression) ? ts2.getAssignmentDeclarationPropertyAccessKind(expression) : ts2.getAssignmentDeclarationKind(expression);
              if (kind === 4 || ts2.isBinaryExpression(expression) && isPossiblyAliasedThisProperty(expression, kind)) {
                if (isDeclarationInConstructor(expression)) {
                  definedInConstructor = true;
                } else {
                  definedInMethod = true;
                }
              }
              if (!ts2.isCallExpression(expression)) {
                jsdocType = getAnnotatedTypeForAssignmentDeclaration(jsdocType, expression, symbol, declaration);
              }
              if (!jsdocType) {
                (types || (types = [])).push(ts2.isBinaryExpression(expression) || ts2.isCallExpression(expression) ? getInitializerTypeFromAssignmentDeclaration(symbol, resolvedSymbol, expression, kind) : neverType);
              }
            }
            type = jsdocType;
          }
          if (!type) {
            if (!ts2.length(types)) {
              return errorType;
            }
            var constructorTypes = definedInConstructor && symbol.declarations ? getConstructorDefinedThisAssignmentTypes(types, symbol.declarations) : void 0;
            if (definedInMethod) {
              var propType = getTypeOfPropertyInBaseClass(symbol);
              if (propType) {
                (constructorTypes || (constructorTypes = [])).push(propType);
                definedInConstructor = true;
              }
            }
            var sourceTypes = ts2.some(constructorTypes, function(t) {
              return !!(t.flags & ~98304);
            }) ? constructorTypes : types;
            type = getUnionType(sourceTypes, 2);
          }
        }
        var widened = getWidenedType(addOptionality(type, false, definedInMethod && !definedInConstructor));
        if (symbol.valueDeclaration && filterType(widened, function(t) {
          return !!(t.flags & ~98304);
        }) === neverType) {
          reportImplicitAny(symbol.valueDeclaration, anyType);
          return anyType;
        }
        return widened;
      }
      function getJSContainerObjectType(decl, symbol, init) {
        var _a, _b;
        if (!ts2.isInJSFile(decl) || !init || !ts2.isObjectLiteralExpression(init) || init.properties.length) {
          return void 0;
        }
        var exports = ts2.createSymbolTable();
        while (ts2.isBinaryExpression(decl) || ts2.isPropertyAccessExpression(decl)) {
          var s_2 = getSymbolOfNode(decl);
          if ((_a = s_2 === null || s_2 === void 0 ? void 0 : s_2.exports) === null || _a === void 0 ? void 0 : _a.size) {
            mergeSymbolTable(exports, s_2.exports);
          }
          decl = ts2.isBinaryExpression(decl) ? decl.parent : decl.parent.parent;
        }
        var s = getSymbolOfNode(decl);
        if ((_b = s === null || s === void 0 ? void 0 : s.exports) === null || _b === void 0 ? void 0 : _b.size) {
          mergeSymbolTable(exports, s.exports);
        }
        var type = createAnonymousType(symbol, exports, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
        type.objectFlags |= 8192;
        return type;
      }
      function getAnnotatedTypeForAssignmentDeclaration(declaredType, expression, symbol, declaration) {
        var _a;
        var typeNode = ts2.getEffectiveTypeAnnotationNode(expression.parent);
        if (typeNode) {
          var type = getWidenedType(getTypeFromTypeNode(typeNode));
          if (!declaredType) {
            return type;
          } else if (!isErrorType(declaredType) && !isErrorType(type) && !isTypeIdenticalTo(declaredType, type)) {
            errorNextVariableOrPropertyDeclarationMustHaveSameType(void 0, declaredType, declaration, type);
          }
        }
        if ((_a = symbol.parent) === null || _a === void 0 ? void 0 : _a.valueDeclaration) {
          var typeNode_2 = ts2.getEffectiveTypeAnnotationNode(symbol.parent.valueDeclaration);
          if (typeNode_2) {
            var annotationSymbol = getPropertyOfType(getTypeFromTypeNode(typeNode_2), symbol.escapedName);
            if (annotationSymbol) {
              return getNonMissingTypeOfSymbol(annotationSymbol);
            }
          }
        }
        return declaredType;
      }
      function getInitializerTypeFromAssignmentDeclaration(symbol, resolvedSymbol, expression, kind) {
        if (ts2.isCallExpression(expression)) {
          if (resolvedSymbol) {
            return getTypeOfSymbol(resolvedSymbol);
          }
          var objectLitType = checkExpressionCached(expression.arguments[2]);
          var valueType = getTypeOfPropertyOfType(objectLitType, "value");
          if (valueType) {
            return valueType;
          }
          var getFunc = getTypeOfPropertyOfType(objectLitType, "get");
          if (getFunc) {
            var getSig = getSingleCallSignature(getFunc);
            if (getSig) {
              return getReturnTypeOfSignature(getSig);
            }
          }
          var setFunc = getTypeOfPropertyOfType(objectLitType, "set");
          if (setFunc) {
            var setSig = getSingleCallSignature(setFunc);
            if (setSig) {
              return getTypeOfFirstParameterOfSignature(setSig);
            }
          }
          return anyType;
        }
        if (containsSameNamedThisProperty(expression.left, expression.right)) {
          return anyType;
        }
        var type = resolvedSymbol ? getTypeOfSymbol(resolvedSymbol) : getWidenedLiteralType(checkExpressionCached(expression.right));
        if (type.flags & 524288 && kind === 2 && symbol.escapedName === "export=") {
          var exportedType = resolveStructuredTypeMembers(type);
          var members_4 = ts2.createSymbolTable();
          ts2.copyEntries(exportedType.members, members_4);
          var initialSize = members_4.size;
          if (resolvedSymbol && !resolvedSymbol.exports) {
            resolvedSymbol.exports = ts2.createSymbolTable();
          }
          (resolvedSymbol || symbol).exports.forEach(function(s, name) {
            var _a;
            var exportedMember = members_4.get(name);
            if (exportedMember && exportedMember !== s) {
              if (s.flags & 111551 && exportedMember.flags & 111551) {
                if (s.valueDeclaration && exportedMember.valueDeclaration && ts2.getSourceFileOfNode(s.valueDeclaration) !== ts2.getSourceFileOfNode(exportedMember.valueDeclaration)) {
                  var unescapedName = ts2.unescapeLeadingUnderscores(s.escapedName);
                  var exportedMemberName = ((_a = ts2.tryCast(exportedMember.valueDeclaration, ts2.isNamedDeclaration)) === null || _a === void 0 ? void 0 : _a.name) || exportedMember.valueDeclaration;
                  ts2.addRelatedInfo(error(s.valueDeclaration, ts2.Diagnostics.Duplicate_identifier_0, unescapedName), ts2.createDiagnosticForNode(exportedMemberName, ts2.Diagnostics._0_was_also_declared_here, unescapedName));
                  ts2.addRelatedInfo(error(exportedMemberName, ts2.Diagnostics.Duplicate_identifier_0, unescapedName), ts2.createDiagnosticForNode(s.valueDeclaration, ts2.Diagnostics._0_was_also_declared_here, unescapedName));
                }
                var union = createSymbol(s.flags | exportedMember.flags, name);
                union.type = getUnionType([getTypeOfSymbol(s), getTypeOfSymbol(exportedMember)]);
                union.valueDeclaration = exportedMember.valueDeclaration;
                union.declarations = ts2.concatenate(exportedMember.declarations, s.declarations);
                members_4.set(name, union);
              } else {
                members_4.set(name, mergeSymbol(s, exportedMember));
              }
            } else {
              members_4.set(name, s);
            }
          });
          var result = createAnonymousType(initialSize !== members_4.size ? void 0 : exportedType.symbol, members_4, exportedType.callSignatures, exportedType.constructSignatures, exportedType.indexInfos);
          result.objectFlags |= ts2.getObjectFlags(type) & 8192;
          if (result.symbol && result.symbol.flags & 32 && type === getDeclaredTypeOfClassOrInterface(result.symbol)) {
            result.objectFlags |= 16777216;
          }
          return result;
        }
        if (isEmptyArrayLiteralType(type)) {
          reportImplicitAny(expression, anyArrayType);
          return anyArrayType;
        }
        return type;
      }
      function containsSameNamedThisProperty(thisProperty, expression) {
        return ts2.isPropertyAccessExpression(thisProperty) && thisProperty.expression.kind === 108 && ts2.forEachChildRecursively(expression, function(n) {
          return isMatchingReference(thisProperty, n);
        });
      }
      function isDeclarationInConstructor(expression) {
        var thisContainer = ts2.getThisContainer(expression, false);
        return thisContainer.kind === 170 || thisContainer.kind === 255 || thisContainer.kind === 212 && !ts2.isPrototypePropertyAssignment(thisContainer.parent);
      }
      function getConstructorDefinedThisAssignmentTypes(types, declarations) {
        ts2.Debug.assert(types.length === declarations.length);
        return types.filter(function(_, i) {
          var declaration = declarations[i];
          var expression = ts2.isBinaryExpression(declaration) ? declaration : ts2.isBinaryExpression(declaration.parent) ? declaration.parent : void 0;
          return expression && isDeclarationInConstructor(expression);
        });
      }
      function getTypeFromBindingElement(element, includePatternInType, reportErrors) {
        if (element.initializer) {
          var contextualType = ts2.isBindingPattern(element.name) ? getTypeFromBindingPattern(element.name, true, false) : unknownType;
          return addOptionality(widenTypeInferredFromInitializer(element, checkDeclarationInitializer(element, contextualType)));
        }
        if (ts2.isBindingPattern(element.name)) {
          return getTypeFromBindingPattern(element.name, includePatternInType, reportErrors);
        }
        if (reportErrors && !declarationBelongsToPrivateAmbientMember(element)) {
          reportImplicitAny(element, anyType);
        }
        return includePatternInType ? nonInferrableAnyType : anyType;
      }
      function getTypeFromObjectBindingPattern(pattern, includePatternInType, reportErrors) {
        var members = ts2.createSymbolTable();
        var stringIndexInfo;
        var objectFlags = 128 | 262144;
        ts2.forEach(pattern.elements, function(e) {
          var name = e.propertyName || e.name;
          if (e.dotDotDotToken) {
            stringIndexInfo = createIndexInfo(stringType, anyType, false);
            return;
          }
          var exprType = getLiteralTypeFromPropertyName(name);
          if (!isTypeUsableAsPropertyName(exprType)) {
            objectFlags |= 512;
            return;
          }
          var text = getPropertyNameFromType(exprType);
          var flags = 4 | (e.initializer ? 16777216 : 0);
          var symbol = createSymbol(flags, text);
          symbol.type = getTypeFromBindingElement(e, includePatternInType, reportErrors);
          symbol.bindingElement = e;
          members.set(symbol.escapedName, symbol);
        });
        var result = createAnonymousType(void 0, members, ts2.emptyArray, ts2.emptyArray, stringIndexInfo ? [stringIndexInfo] : ts2.emptyArray);
        result.objectFlags |= objectFlags;
        if (includePatternInType) {
          result.pattern = pattern;
          result.objectFlags |= 262144;
        }
        return result;
      }
      function getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors) {
        var elements = pattern.elements;
        var lastElement = ts2.lastOrUndefined(elements);
        var restElement = lastElement && lastElement.kind === 202 && lastElement.dotDotDotToken ? lastElement : void 0;
        if (elements.length === 0 || elements.length === 1 && restElement) {
          return languageVersion >= 2 ? createIterableType(anyType) : anyArrayType;
        }
        var elementTypes = ts2.map(elements, function(e) {
          return ts2.isOmittedExpression(e) ? anyType : getTypeFromBindingElement(e, includePatternInType, reportErrors);
        });
        var minLength = ts2.findLastIndex(elements, function(e) {
          return !(e === restElement || ts2.isOmittedExpression(e) || hasDefaultValue(e));
        }, elements.length - 1) + 1;
        var elementFlags = ts2.map(elements, function(e, i) {
          return e === restElement ? 4 : i >= minLength ? 2 : 1;
        });
        var result = createTupleType(elementTypes, elementFlags);
        if (includePatternInType) {
          result = cloneTypeReference(result);
          result.pattern = pattern;
          result.objectFlags |= 262144;
        }
        return result;
      }
      function getTypeFromBindingPattern(pattern, includePatternInType, reportErrors) {
        if (includePatternInType === void 0) {
          includePatternInType = false;
        }
        if (reportErrors === void 0) {
          reportErrors = false;
        }
        return pattern.kind === 200 ? getTypeFromObjectBindingPattern(pattern, includePatternInType, reportErrors) : getTypeFromArrayBindingPattern(pattern, includePatternInType, reportErrors);
      }
      function getWidenedTypeForVariableLikeDeclaration(declaration, reportErrors) {
        return widenTypeForVariableLikeDeclaration(getTypeForVariableLikeDeclaration(declaration, true), declaration, reportErrors);
      }
      function isGlobalSymbolConstructor(node) {
        var symbol = getSymbolOfNode(node);
        var globalSymbol = getGlobalESSymbolConstructorTypeSymbol(false);
        return globalSymbol && symbol && symbol === globalSymbol;
      }
      function widenTypeForVariableLikeDeclaration(type, declaration, reportErrors) {
        if (type) {
          if (type.flags & 4096 && isGlobalSymbolConstructor(declaration.parent)) {
            type = getESSymbolLikeTypeForNode(declaration);
          }
          if (reportErrors) {
            reportErrorsFromWidening(declaration, type);
          }
          if (type.flags & 8192 && (ts2.isBindingElement(declaration) || !declaration.type) && type.symbol !== getSymbolOfNode(declaration)) {
            type = esSymbolType;
          }
          return getWidenedType(type);
        }
        type = ts2.isParameter(declaration) && declaration.dotDotDotToken ? anyArrayType : anyType;
        if (reportErrors) {
          if (!declarationBelongsToPrivateAmbientMember(declaration)) {
            reportImplicitAny(declaration, type);
          }
        }
        return type;
      }
      function declarationBelongsToPrivateAmbientMember(declaration) {
        var root = ts2.getRootDeclaration(declaration);
        var memberDeclaration = root.kind === 163 ? root.parent : root;
        return isPrivateWithinAmbient(memberDeclaration);
      }
      function tryGetTypeFromEffectiveTypeNode(declaration) {
        var typeNode = ts2.getEffectiveTypeAnnotationNode(declaration);
        if (typeNode) {
          return getTypeFromTypeNode(typeNode);
        }
      }
      function getTypeOfVariableOrParameterOrProperty(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.type) {
          var type = getTypeOfVariableOrParameterOrPropertyWorker(symbol);
          if (!links.type) {
            links.type = type;
          }
        }
        return links.type;
      }
      function getTypeOfVariableOrParameterOrPropertyWorker(symbol) {
        if (symbol.flags & 4194304) {
          return getTypeOfPrototypeProperty(symbol);
        }
        if (symbol === requireSymbol) {
          return anyType;
        }
        if (symbol.flags & 134217728 && symbol.valueDeclaration) {
          var fileSymbol = getSymbolOfNode(ts2.getSourceFileOfNode(symbol.valueDeclaration));
          var result = createSymbol(fileSymbol.flags, "exports");
          result.declarations = fileSymbol.declarations ? fileSymbol.declarations.slice() : [];
          result.parent = symbol;
          result.target = fileSymbol;
          if (fileSymbol.valueDeclaration)
            result.valueDeclaration = fileSymbol.valueDeclaration;
          if (fileSymbol.members)
            result.members = new ts2.Map(fileSymbol.members);
          if (fileSymbol.exports)
            result.exports = new ts2.Map(fileSymbol.exports);
          var members = ts2.createSymbolTable();
          members.set("exports", result);
          return createAnonymousType(symbol, members, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
        }
        ts2.Debug.assertIsDefined(symbol.valueDeclaration);
        var declaration = symbol.valueDeclaration;
        if (ts2.isCatchClauseVariableDeclarationOrBindingElement(declaration)) {
          var typeNode = ts2.getEffectiveTypeAnnotationNode(declaration);
          if (typeNode === void 0) {
            return useUnknownInCatchVariables ? unknownType : anyType;
          }
          var type_1 = getTypeOfNode(typeNode);
          return isTypeAny(type_1) || type_1 === unknownType ? type_1 : errorType;
        }
        if (ts2.isSourceFile(declaration) && ts2.isJsonSourceFile(declaration)) {
          if (!declaration.statements.length) {
            return emptyObjectType;
          }
          return getWidenedType(getWidenedLiteralType(checkExpression(declaration.statements[0].expression)));
        }
        if (!pushTypeResolution(symbol, 0)) {
          if (symbol.flags & 512 && !(symbol.flags & 67108864)) {
            return getTypeOfFuncClassEnumModule(symbol);
          }
          return reportCircularityError(symbol);
        }
        var type;
        if (declaration.kind === 270) {
          type = widenTypeForVariableLikeDeclaration(tryGetTypeFromEffectiveTypeNode(declaration) || checkExpressionCached(declaration.expression), declaration);
        } else if (ts2.isBinaryExpression(declaration) || ts2.isInJSFile(declaration) && (ts2.isCallExpression(declaration) || (ts2.isPropertyAccessExpression(declaration) || ts2.isBindableStaticElementAccessExpression(declaration)) && ts2.isBinaryExpression(declaration.parent))) {
          type = getWidenedTypeForAssignmentDeclaration(symbol);
        } else if (ts2.isPropertyAccessExpression(declaration) || ts2.isElementAccessExpression(declaration) || ts2.isIdentifier(declaration) || ts2.isStringLiteralLike(declaration) || ts2.isNumericLiteral(declaration) || ts2.isClassDeclaration(declaration) || ts2.isFunctionDeclaration(declaration) || ts2.isMethodDeclaration(declaration) && !ts2.isObjectLiteralMethod(declaration) || ts2.isMethodSignature(declaration) || ts2.isSourceFile(declaration)) {
          if (symbol.flags & (16 | 8192 | 32 | 384 | 512)) {
            return getTypeOfFuncClassEnumModule(symbol);
          }
          type = ts2.isBinaryExpression(declaration.parent) ? getWidenedTypeForAssignmentDeclaration(symbol) : tryGetTypeFromEffectiveTypeNode(declaration) || anyType;
        } else if (ts2.isPropertyAssignment(declaration)) {
          type = tryGetTypeFromEffectiveTypeNode(declaration) || checkPropertyAssignment(declaration);
        } else if (ts2.isJsxAttribute(declaration)) {
          type = tryGetTypeFromEffectiveTypeNode(declaration) || checkJsxAttribute(declaration);
        } else if (ts2.isShorthandPropertyAssignment(declaration)) {
          type = tryGetTypeFromEffectiveTypeNode(declaration) || checkExpressionForMutableLocation(declaration.name, 0);
        } else if (ts2.isObjectLiteralMethod(declaration)) {
          type = tryGetTypeFromEffectiveTypeNode(declaration) || checkObjectLiteralMethod(declaration, 0);
        } else if (ts2.isParameter(declaration) || ts2.isPropertyDeclaration(declaration) || ts2.isPropertySignature(declaration) || ts2.isVariableDeclaration(declaration) || ts2.isBindingElement(declaration) || ts2.isJSDocPropertyLikeTag(declaration)) {
          type = getWidenedTypeForVariableLikeDeclaration(declaration, true);
        } else if (ts2.isEnumDeclaration(declaration)) {
          type = getTypeOfFuncClassEnumModule(symbol);
        } else if (ts2.isEnumMember(declaration)) {
          type = getTypeOfEnumMember(symbol);
        } else if (ts2.isAccessor(declaration)) {
          type = resolveTypeOfAccessors(symbol) || ts2.Debug.fail("Non-write accessor resolution must always produce a type");
        } else {
          return ts2.Debug.fail("Unhandled declaration kind! " + ts2.Debug.formatSyntaxKind(declaration.kind) + " for " + ts2.Debug.formatSymbol(symbol));
        }
        if (!popTypeResolution()) {
          if (symbol.flags & 512 && !(symbol.flags & 67108864)) {
            return getTypeOfFuncClassEnumModule(symbol);
          }
          return reportCircularityError(symbol);
        }
        return type;
      }
      function getAnnotatedAccessorTypeNode(accessor) {
        if (accessor) {
          if (accessor.kind === 171) {
            var getterTypeAnnotation = ts2.getEffectiveReturnTypeNode(accessor);
            return getterTypeAnnotation;
          } else {
            var setterTypeAnnotation = ts2.getEffectiveSetAccessorTypeAnnotationNode(accessor);
            return setterTypeAnnotation;
          }
        }
        return void 0;
      }
      function getAnnotatedAccessorType(accessor) {
        var node = getAnnotatedAccessorTypeNode(accessor);
        return node && getTypeFromTypeNode(node);
      }
      function getAnnotatedAccessorThisParameter(accessor) {
        var parameter = getAccessorThisParameter(accessor);
        return parameter && parameter.symbol;
      }
      function getThisTypeOfDeclaration(declaration) {
        return getThisTypeOfSignature(getSignatureFromDeclaration(declaration));
      }
      function getTypeOfAccessors(symbol) {
        var links = getSymbolLinks(symbol);
        return links.type || (links.type = getTypeOfAccessorsWorker(symbol) || ts2.Debug.fail("Read type of accessor must always produce a type"));
      }
      function getTypeOfSetAccessor(symbol) {
        var links = getSymbolLinks(symbol);
        return links.writeType || (links.writeType = getTypeOfAccessorsWorker(symbol, true));
      }
      function getTypeOfAccessorsWorker(symbol, writing) {
        if (writing === void 0) {
          writing = false;
        }
        if (!pushTypeResolution(symbol, 0)) {
          return errorType;
        }
        var type = resolveTypeOfAccessors(symbol, writing);
        if (!popTypeResolution()) {
          type = anyType;
          if (noImplicitAny) {
            var getter = ts2.getDeclarationOfKind(symbol, 171);
            error(getter, ts2.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
          }
        }
        return type;
      }
      function resolveTypeOfAccessors(symbol, writing) {
        if (writing === void 0) {
          writing = false;
        }
        var getter = ts2.getDeclarationOfKind(symbol, 171);
        var setter = ts2.getDeclarationOfKind(symbol, 172);
        var setterType = getAnnotatedAccessorType(setter);
        if (writing && setterType) {
          return instantiateTypeIfNeeded(setterType, symbol);
        }
        if (getter && ts2.isInJSFile(getter)) {
          var jsDocType = getTypeForDeclarationFromJSDocComment(getter);
          if (jsDocType) {
            return instantiateTypeIfNeeded(jsDocType, symbol);
          }
        }
        var getterType = getAnnotatedAccessorType(getter);
        if (getterType) {
          return instantiateTypeIfNeeded(getterType, symbol);
        }
        if (setterType) {
          return setterType;
        }
        if (getter && getter.body) {
          var returnTypeFromBody = getReturnTypeFromBody(getter);
          return instantiateTypeIfNeeded(returnTypeFromBody, symbol);
        }
        if (setter) {
          if (!isPrivateWithinAmbient(setter)) {
            errorOrSuggestion(noImplicitAny, setter, ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation, symbolToString(symbol));
          }
          return anyType;
        } else if (getter) {
          ts2.Debug.assert(!!getter, "there must exist a getter as we are current checking either setter or getter in this function");
          if (!isPrivateWithinAmbient(getter)) {
            errorOrSuggestion(noImplicitAny, getter, ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation, symbolToString(symbol));
          }
          return anyType;
        }
        return void 0;
        function instantiateTypeIfNeeded(type, symbol2) {
          if (ts2.getCheckFlags(symbol2) & 1) {
            var links = getSymbolLinks(symbol2);
            return instantiateType(type, links.mapper);
          }
          return type;
        }
      }
      function getBaseTypeVariableOfClass(symbol) {
        var baseConstructorType = getBaseConstructorTypeOfClass(getDeclaredTypeOfClassOrInterface(symbol));
        return baseConstructorType.flags & 8650752 ? baseConstructorType : baseConstructorType.flags & 2097152 ? ts2.find(baseConstructorType.types, function(t) {
          return !!(t.flags & 8650752);
        }) : void 0;
      }
      function getTypeOfFuncClassEnumModule(symbol) {
        var links = getSymbolLinks(symbol);
        var originalLinks = links;
        if (!links.type) {
          var expando = symbol.valueDeclaration && getSymbolOfExpando(symbol.valueDeclaration, false);
          if (expando) {
            var merged = mergeJSSymbols(symbol, expando);
            if (merged) {
              symbol = links = merged;
            }
          }
          originalLinks.type = links.type = getTypeOfFuncClassEnumModuleWorker(symbol);
        }
        return links.type;
      }
      function getTypeOfFuncClassEnumModuleWorker(symbol) {
        var declaration = symbol.valueDeclaration;
        if (symbol.flags & 1536 && ts2.isShorthandAmbientModuleSymbol(symbol)) {
          return anyType;
        } else if (declaration && (declaration.kind === 220 || ts2.isAccessExpression(declaration) && declaration.parent.kind === 220)) {
          return getWidenedTypeForAssignmentDeclaration(symbol);
        } else if (symbol.flags & 512 && declaration && ts2.isSourceFile(declaration) && declaration.commonJsModuleIndicator) {
          var resolvedModule = resolveExternalModuleSymbol(symbol);
          if (resolvedModule !== symbol) {
            if (!pushTypeResolution(symbol, 0)) {
              return errorType;
            }
            var exportEquals = getMergedSymbol(symbol.exports.get("export="));
            var type_2 = getWidenedTypeForAssignmentDeclaration(exportEquals, exportEquals === resolvedModule ? void 0 : resolvedModule);
            if (!popTypeResolution()) {
              return reportCircularityError(symbol);
            }
            return type_2;
          }
        }
        var type = createObjectType(16, symbol);
        if (symbol.flags & 32) {
          var baseTypeVariable = getBaseTypeVariableOfClass(symbol);
          return baseTypeVariable ? getIntersectionType([type, baseTypeVariable]) : type;
        } else {
          return strictNullChecks && symbol.flags & 16777216 ? getOptionalType(type) : type;
        }
      }
      function getTypeOfEnumMember(symbol) {
        var links = getSymbolLinks(symbol);
        return links.type || (links.type = getDeclaredTypeOfEnumMember(symbol));
      }
      function getTypeOfAlias(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.type) {
          var targetSymbol = resolveAlias(symbol);
          var exportSymbol = symbol.declarations && getTargetOfAliasDeclaration(getDeclarationOfAliasSymbol(symbol), true);
          var declaredType = ts2.firstDefined(exportSymbol === null || exportSymbol === void 0 ? void 0 : exportSymbol.declarations, function(d) {
            return ts2.isExportAssignment(d) ? tryGetTypeFromEffectiveTypeNode(d) : void 0;
          });
          links.type = (exportSymbol === null || exportSymbol === void 0 ? void 0 : exportSymbol.declarations) && isDuplicatedCommonJSExport(exportSymbol.declarations) && symbol.declarations.length ? getFlowTypeFromCommonJSExport(exportSymbol) : isDuplicatedCommonJSExport(symbol.declarations) ? autoType : declaredType ? declaredType : targetSymbol.flags & 111551 ? getTypeOfSymbol(targetSymbol) : errorType;
        }
        return links.type;
      }
      function getTypeOfInstantiatedSymbol(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.type) {
          if (!pushTypeResolution(symbol, 0)) {
            return links.type = errorType;
          }
          var type = instantiateType(getTypeOfSymbol(links.target), links.mapper);
          if (!popTypeResolution()) {
            type = reportCircularityError(symbol);
          }
          links.type = type;
        }
        return links.type;
      }
      function reportCircularityError(symbol) {
        var declaration = symbol.valueDeclaration;
        if (ts2.getEffectiveTypeAnnotationNode(declaration)) {
          error(symbol.valueDeclaration, ts2.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
          return errorType;
        }
        if (noImplicitAny && (declaration.kind !== 163 || declaration.initializer)) {
          error(symbol.valueDeclaration, ts2.Diagnostics._0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer, symbolToString(symbol));
        }
        return anyType;
      }
      function getTypeOfSymbolWithDeferredType(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.type) {
          ts2.Debug.assertIsDefined(links.deferralParent);
          ts2.Debug.assertIsDefined(links.deferralConstituents);
          links.type = links.deferralParent.flags & 1048576 ? getUnionType(links.deferralConstituents) : getIntersectionType(links.deferralConstituents);
        }
        return links.type;
      }
      function getSetAccessorTypeOfSymbol(symbol) {
        if (symbol.flags & 98304) {
          var type = getTypeOfSetAccessor(symbol);
          if (type) {
            return type;
          }
        }
        return getTypeOfSymbol(symbol);
      }
      function getTypeOfSymbol(symbol) {
        var checkFlags = ts2.getCheckFlags(symbol);
        if (checkFlags & 65536) {
          return getTypeOfSymbolWithDeferredType(symbol);
        }
        if (checkFlags & 1) {
          return getTypeOfInstantiatedSymbol(symbol);
        }
        if (checkFlags & 262144) {
          return getTypeOfMappedSymbol(symbol);
        }
        if (checkFlags & 8192) {
          return getTypeOfReverseMappedSymbol(symbol);
        }
        if (symbol.flags & (3 | 4)) {
          return getTypeOfVariableOrParameterOrProperty(symbol);
        }
        if (symbol.flags & (16 | 8192 | 32 | 384 | 512)) {
          return getTypeOfFuncClassEnumModule(symbol);
        }
        if (symbol.flags & 8) {
          return getTypeOfEnumMember(symbol);
        }
        if (symbol.flags & 98304) {
          return getTypeOfAccessors(symbol);
        }
        if (symbol.flags & 2097152) {
          return getTypeOfAlias(symbol);
        }
        return errorType;
      }
      function getNonMissingTypeOfSymbol(symbol) {
        return removeMissingType(getTypeOfSymbol(symbol), !!(symbol.flags & 16777216));
      }
      function isReferenceToType(type, target) {
        return type !== void 0 && target !== void 0 && (ts2.getObjectFlags(type) & 4) !== 0 && type.target === target;
      }
      function getTargetType(type) {
        return ts2.getObjectFlags(type) & 4 ? type.target : type;
      }
      function hasBaseType(type, checkBase) {
        return check(type);
        function check(type2) {
          if (ts2.getObjectFlags(type2) & (3 | 4)) {
            var target = getTargetType(type2);
            return target === checkBase || ts2.some(getBaseTypes(target), check);
          } else if (type2.flags & 2097152) {
            return ts2.some(type2.types, check);
          }
          return false;
        }
      }
      function appendTypeParameters(typeParameters, declarations) {
        for (var _i = 0, declarations_2 = declarations; _i < declarations_2.length; _i++) {
          var declaration = declarations_2[_i];
          typeParameters = ts2.appendIfUnique(typeParameters, getDeclaredTypeOfTypeParameter(getSymbolOfNode(declaration)));
        }
        return typeParameters;
      }
      function getOuterTypeParameters(node, includeThisTypes) {
        while (true) {
          node = node.parent;
          if (node && ts2.isBinaryExpression(node)) {
            var assignmentKind = ts2.getAssignmentDeclarationKind(node);
            if (assignmentKind === 6 || assignmentKind === 3) {
              var symbol = getSymbolOfNode(node.left);
              if (symbol && symbol.parent && !ts2.findAncestor(symbol.parent.valueDeclaration, function(d) {
                return node === d;
              })) {
                node = symbol.parent.valueDeclaration;
              }
            }
          }
          if (!node) {
            return void 0;
          }
          switch (node.kind) {
            case 256:
            case 225:
            case 257:
            case 173:
            case 174:
            case 167:
            case 178:
            case 179:
            case 315:
            case 255:
            case 168:
            case 212:
            case 213:
            case 258:
            case 342:
            case 343:
            case 337:
            case 336:
            case 194:
            case 188: {
              var outerTypeParameters = getOuterTypeParameters(node, includeThisTypes);
              if (node.kind === 194) {
                return ts2.append(outerTypeParameters, getDeclaredTypeOfTypeParameter(getSymbolOfNode(node.typeParameter)));
              } else if (node.kind === 188) {
                return ts2.concatenate(outerTypeParameters, getInferTypeParameters(node));
              }
              var outerAndOwnTypeParameters = appendTypeParameters(outerTypeParameters, ts2.getEffectiveTypeParameterDeclarations(node));
              var thisType = includeThisTypes && (node.kind === 256 || node.kind === 225 || node.kind === 257 || isJSConstructor(node)) && getDeclaredTypeOfClassOrInterface(getSymbolOfNode(node)).thisType;
              return thisType ? ts2.append(outerAndOwnTypeParameters, thisType) : outerAndOwnTypeParameters;
            }
            case 338:
              var paramSymbol = ts2.getParameterSymbolFromJSDoc(node);
              if (paramSymbol) {
                node = paramSymbol.valueDeclaration;
              }
              break;
            case 318: {
              var outerTypeParameters = getOuterTypeParameters(node, includeThisTypes);
              return node.tags ? appendTypeParameters(outerTypeParameters, ts2.flatMap(node.tags, function(t) {
                return ts2.isJSDocTemplateTag(t) ? t.typeParameters : void 0;
              })) : outerTypeParameters;
            }
          }
        }
      }
      function getOuterTypeParametersOfClassOrInterface(symbol) {
        var declaration = symbol.flags & 32 ? symbol.valueDeclaration : ts2.getDeclarationOfKind(symbol, 257);
        ts2.Debug.assert(!!declaration, "Class was missing valueDeclaration -OR- non-class had no interface declarations");
        return getOuterTypeParameters(declaration);
      }
      function getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol) {
        if (!symbol.declarations) {
          return;
        }
        var result;
        for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
          var node = _a[_i];
          if (node.kind === 257 || node.kind === 256 || node.kind === 225 || isJSConstructor(node) || ts2.isTypeAlias(node)) {
            var declaration = node;
            result = appendTypeParameters(result, ts2.getEffectiveTypeParameterDeclarations(declaration));
          }
        }
        return result;
      }
      function getTypeParametersOfClassOrInterface(symbol) {
        return ts2.concatenate(getOuterTypeParametersOfClassOrInterface(symbol), getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol));
      }
      function isMixinConstructorType(type) {
        var signatures = getSignaturesOfType(type, 1);
        if (signatures.length === 1) {
          var s = signatures[0];
          if (!s.typeParameters && s.parameters.length === 1 && signatureHasRestParameter(s)) {
            var paramType = getTypeOfParameter(s.parameters[0]);
            return isTypeAny(paramType) || getElementTypeOfArrayType(paramType) === anyType;
          }
        }
        return false;
      }
      function isConstructorType(type) {
        if (getSignaturesOfType(type, 1).length > 0) {
          return true;
        }
        if (type.flags & 8650752) {
          var constraint = getBaseConstraintOfType(type);
          return !!constraint && isMixinConstructorType(constraint);
        }
        return false;
      }
      function getBaseTypeNodeOfClass(type) {
        return ts2.getEffectiveBaseTypeNode(type.symbol.valueDeclaration);
      }
      function getConstructorsForTypeArguments(type, typeArgumentNodes, location) {
        var typeArgCount = ts2.length(typeArgumentNodes);
        var isJavascript = ts2.isInJSFile(location);
        return ts2.filter(getSignaturesOfType(type, 1), function(sig) {
          return (isJavascript || typeArgCount >= getMinTypeArgumentCount(sig.typeParameters)) && typeArgCount <= ts2.length(sig.typeParameters);
        });
      }
      function getInstantiatedConstructorsForTypeArguments(type, typeArgumentNodes, location) {
        var signatures = getConstructorsForTypeArguments(type, typeArgumentNodes, location);
        var typeArguments = ts2.map(typeArgumentNodes, getTypeFromTypeNode);
        return ts2.sameMap(signatures, function(sig) {
          return ts2.some(sig.typeParameters) ? getSignatureInstantiation(sig, typeArguments, ts2.isInJSFile(location)) : sig;
        });
      }
      function getBaseConstructorTypeOfClass(type) {
        if (!type.resolvedBaseConstructorType) {
          var decl = type.symbol.valueDeclaration;
          var extended = ts2.getEffectiveBaseTypeNode(decl);
          var baseTypeNode = getBaseTypeNodeOfClass(type);
          if (!baseTypeNode) {
            return type.resolvedBaseConstructorType = undefinedType;
          }
          if (!pushTypeResolution(type, 1)) {
            return errorType;
          }
          var baseConstructorType = checkExpression(baseTypeNode.expression);
          if (extended && baseTypeNode !== extended) {
            ts2.Debug.assert(!extended.typeArguments);
            checkExpression(extended.expression);
          }
          if (baseConstructorType.flags & (524288 | 2097152)) {
            resolveStructuredTypeMembers(baseConstructorType);
          }
          if (!popTypeResolution()) {
            error(type.symbol.valueDeclaration, ts2.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_base_expression, symbolToString(type.symbol));
            return type.resolvedBaseConstructorType = errorType;
          }
          if (!(baseConstructorType.flags & 1) && baseConstructorType !== nullWideningType && !isConstructorType(baseConstructorType)) {
            var err = error(baseTypeNode.expression, ts2.Diagnostics.Type_0_is_not_a_constructor_function_type, typeToString(baseConstructorType));
            if (baseConstructorType.flags & 262144) {
              var constraint = getConstraintFromTypeParameter(baseConstructorType);
              var ctorReturn = unknownType;
              if (constraint) {
                var ctorSig = getSignaturesOfType(constraint, 1);
                if (ctorSig[0]) {
                  ctorReturn = getReturnTypeOfSignature(ctorSig[0]);
                }
              }
              if (baseConstructorType.symbol.declarations) {
                ts2.addRelatedInfo(err, ts2.createDiagnosticForNode(baseConstructorType.symbol.declarations[0], ts2.Diagnostics.Did_you_mean_for_0_to_be_constrained_to_type_new_args_Colon_any_1, symbolToString(baseConstructorType.symbol), typeToString(ctorReturn)));
              }
            }
            return type.resolvedBaseConstructorType = errorType;
          }
          type.resolvedBaseConstructorType = baseConstructorType;
        }
        return type.resolvedBaseConstructorType;
      }
      function getImplementsTypes(type) {
        var resolvedImplementsTypes = ts2.emptyArray;
        if (type.symbol.declarations) {
          for (var _i = 0, _a = type.symbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            var implementsTypeNodes = ts2.getEffectiveImplementsTypeNodes(declaration);
            if (!implementsTypeNodes)
              continue;
            for (var _b = 0, implementsTypeNodes_1 = implementsTypeNodes; _b < implementsTypeNodes_1.length; _b++) {
              var node = implementsTypeNodes_1[_b];
              var implementsType = getTypeFromTypeNode(node);
              if (!isErrorType(implementsType)) {
                if (resolvedImplementsTypes === ts2.emptyArray) {
                  resolvedImplementsTypes = [implementsType];
                } else {
                  resolvedImplementsTypes.push(implementsType);
                }
              }
            }
          }
        }
        return resolvedImplementsTypes;
      }
      function reportCircularBaseType(node, type) {
        error(node, ts2.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, void 0, 2));
      }
      function getBaseTypes(type) {
        if (!type.baseTypesResolved) {
          if (pushTypeResolution(type, 7)) {
            if (type.objectFlags & 8) {
              type.resolvedBaseTypes = [getTupleBaseType(type)];
            } else if (type.symbol.flags & (32 | 64)) {
              if (type.symbol.flags & 32) {
                resolveBaseTypesOfClass(type);
              }
              if (type.symbol.flags & 64) {
                resolveBaseTypesOfInterface(type);
              }
            } else {
              ts2.Debug.fail("type must be class or interface");
            }
            if (!popTypeResolution() && type.symbol.declarations) {
              for (var _i = 0, _a = type.symbol.declarations; _i < _a.length; _i++) {
                var declaration = _a[_i];
                if (declaration.kind === 256 || declaration.kind === 257) {
                  reportCircularBaseType(declaration, type);
                }
              }
            }
          }
          type.baseTypesResolved = true;
        }
        return type.resolvedBaseTypes;
      }
      function getTupleBaseType(type) {
        var elementTypes = ts2.sameMap(type.typeParameters, function(t, i) {
          return type.elementFlags[i] & 8 ? getIndexedAccessType(t, numberType) : t;
        });
        return createArrayType(getUnionType(elementTypes || ts2.emptyArray), type.readonly);
      }
      function resolveBaseTypesOfClass(type) {
        type.resolvedBaseTypes = ts2.resolvingEmptyArray;
        var baseConstructorType = getApparentType(getBaseConstructorTypeOfClass(type));
        if (!(baseConstructorType.flags & (524288 | 2097152 | 1))) {
          return type.resolvedBaseTypes = ts2.emptyArray;
        }
        var baseTypeNode = getBaseTypeNodeOfClass(type);
        var baseType;
        var originalBaseType = baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) : void 0;
        if (baseConstructorType.symbol && baseConstructorType.symbol.flags & 32 && areAllOuterTypeParametersApplied(originalBaseType)) {
          baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol);
        } else if (baseConstructorType.flags & 1) {
          baseType = baseConstructorType;
        } else {
          var constructors = getInstantiatedConstructorsForTypeArguments(baseConstructorType, baseTypeNode.typeArguments, baseTypeNode);
          if (!constructors.length) {
            error(baseTypeNode.expression, ts2.Diagnostics.No_base_constructor_has_the_specified_number_of_type_arguments);
            return type.resolvedBaseTypes = ts2.emptyArray;
          }
          baseType = getReturnTypeOfSignature(constructors[0]);
        }
        if (isErrorType(baseType)) {
          return type.resolvedBaseTypes = ts2.emptyArray;
        }
        var reducedBaseType = getReducedType(baseType);
        if (!isValidBaseType(reducedBaseType)) {
          var elaboration = elaborateNeverIntersection(void 0, baseType);
          var diagnostic = ts2.chainDiagnosticMessages(elaboration, ts2.Diagnostics.Base_constructor_return_type_0_is_not_an_object_type_or_intersection_of_object_types_with_statically_known_members, typeToString(reducedBaseType));
          diagnostics.add(ts2.createDiagnosticForNodeFromMessageChain(baseTypeNode.expression, diagnostic));
          return type.resolvedBaseTypes = ts2.emptyArray;
        }
        if (type === reducedBaseType || hasBaseType(reducedBaseType, type)) {
          error(type.symbol.valueDeclaration, ts2.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, void 0, 2));
          return type.resolvedBaseTypes = ts2.emptyArray;
        }
        if (type.resolvedBaseTypes === ts2.resolvingEmptyArray) {
          type.members = void 0;
        }
        return type.resolvedBaseTypes = [reducedBaseType];
      }
      function areAllOuterTypeParametersApplied(type) {
        var outerTypeParameters = type.outerTypeParameters;
        if (outerTypeParameters) {
          var last_1 = outerTypeParameters.length - 1;
          var typeArguments = getTypeArguments(type);
          return outerTypeParameters[last_1].symbol !== typeArguments[last_1].symbol;
        }
        return true;
      }
      function isValidBaseType(type) {
        if (type.flags & 262144) {
          var constraint = getBaseConstraintOfType(type);
          if (constraint) {
            return isValidBaseType(constraint);
          }
        }
        return !!(type.flags & (524288 | 67108864 | 1) && !isGenericMappedType(type) || type.flags & 2097152 && ts2.every(type.types, isValidBaseType));
      }
      function resolveBaseTypesOfInterface(type) {
        type.resolvedBaseTypes = type.resolvedBaseTypes || ts2.emptyArray;
        if (type.symbol.declarations) {
          for (var _i = 0, _a = type.symbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            if (declaration.kind === 257 && ts2.getInterfaceBaseTypeNodes(declaration)) {
              for (var _b = 0, _c = ts2.getInterfaceBaseTypeNodes(declaration); _b < _c.length; _b++) {
                var node = _c[_b];
                var baseType = getReducedType(getTypeFromTypeNode(node));
                if (!isErrorType(baseType)) {
                  if (isValidBaseType(baseType)) {
                    if (type !== baseType && !hasBaseType(baseType, type)) {
                      if (type.resolvedBaseTypes === ts2.emptyArray) {
                        type.resolvedBaseTypes = [baseType];
                      } else {
                        type.resolvedBaseTypes.push(baseType);
                      }
                    } else {
                      reportCircularBaseType(declaration, type);
                    }
                  } else {
                    error(node, ts2.Diagnostics.An_interface_can_only_extend_an_object_type_or_intersection_of_object_types_with_statically_known_members);
                  }
                }
              }
            }
          }
        }
      }
      function isThislessInterface(symbol) {
        if (!symbol.declarations) {
          return true;
        }
        for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
          var declaration = _a[_i];
          if (declaration.kind === 257) {
            if (declaration.flags & 128) {
              return false;
            }
            var baseTypeNodes = ts2.getInterfaceBaseTypeNodes(declaration);
            if (baseTypeNodes) {
              for (var _b = 0, baseTypeNodes_1 = baseTypeNodes; _b < baseTypeNodes_1.length; _b++) {
                var node = baseTypeNodes_1[_b];
                if (ts2.isEntityNameExpression(node.expression)) {
                  var baseSymbol = resolveEntityName(node.expression, 788968, true);
                  if (!baseSymbol || !(baseSymbol.flags & 64) || getDeclaredTypeOfClassOrInterface(baseSymbol).thisType) {
                    return false;
                  }
                }
              }
            }
          }
        }
        return true;
      }
      function getDeclaredTypeOfClassOrInterface(symbol) {
        var links = getSymbolLinks(symbol);
        var originalLinks = links;
        if (!links.declaredType) {
          var kind = symbol.flags & 32 ? 1 : 2;
          var merged = mergeJSSymbols(symbol, symbol.valueDeclaration && getAssignedClassSymbol(symbol.valueDeclaration));
          if (merged) {
            symbol = links = merged;
          }
          var type = originalLinks.declaredType = links.declaredType = createObjectType(kind, symbol);
          var outerTypeParameters = getOuterTypeParametersOfClassOrInterface(symbol);
          var localTypeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
          if (outerTypeParameters || localTypeParameters || kind === 1 || !isThislessInterface(symbol)) {
            type.objectFlags |= 4;
            type.typeParameters = ts2.concatenate(outerTypeParameters, localTypeParameters);
            type.outerTypeParameters = outerTypeParameters;
            type.localTypeParameters = localTypeParameters;
            type.instantiations = new ts2.Map();
            type.instantiations.set(getTypeListId(type.typeParameters), type);
            type.target = type;
            type.resolvedTypeArguments = type.typeParameters;
            type.thisType = createTypeParameter(symbol);
            type.thisType.isThisType = true;
            type.thisType.constraint = type;
          }
        }
        return links.declaredType;
      }
      function getDeclaredTypeOfTypeAlias(symbol) {
        var _a;
        var links = getSymbolLinks(symbol);
        if (!links.declaredType) {
          if (!pushTypeResolution(symbol, 2)) {
            return errorType;
          }
          var declaration = ts2.Debug.checkDefined((_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isTypeAlias), "Type alias symbol with no valid declaration found");
          var typeNode = ts2.isJSDocTypeAlias(declaration) ? declaration.typeExpression : declaration.type;
          var type = typeNode ? getTypeFromTypeNode(typeNode) : errorType;
          if (popTypeResolution()) {
            var typeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
            if (typeParameters) {
              links.typeParameters = typeParameters;
              links.instantiations = new ts2.Map();
              links.instantiations.set(getTypeListId(typeParameters), type);
            }
          } else {
            type = errorType;
            if (declaration.kind === 337) {
              error(declaration.typeExpression.type, ts2.Diagnostics.Type_alias_0_circularly_references_itself, symbolToString(symbol));
            } else {
              error(ts2.isNamedDeclaration(declaration) ? declaration.name : declaration || declaration, ts2.Diagnostics.Type_alias_0_circularly_references_itself, symbolToString(symbol));
            }
          }
          links.declaredType = type;
        }
        return links.declaredType;
      }
      function isStringConcatExpression(expr) {
        if (ts2.isStringLiteralLike(expr)) {
          return true;
        } else if (expr.kind === 220) {
          return isStringConcatExpression(expr.left) && isStringConcatExpression(expr.right);
        }
        return false;
      }
      function isLiteralEnumMember(member) {
        var expr = member.initializer;
        if (!expr) {
          return !(member.flags & 8388608);
        }
        switch (expr.kind) {
          case 10:
          case 8:
          case 14:
            return true;
          case 218:
            return expr.operator === 40 && expr.operand.kind === 8;
          case 79:
            return ts2.nodeIsMissing(expr) || !!getSymbolOfNode(member.parent).exports.get(expr.escapedText);
          case 220:
            return isStringConcatExpression(expr);
          default:
            return false;
        }
      }
      function getEnumKind(symbol) {
        var links = getSymbolLinks(symbol);
        if (links.enumKind !== void 0) {
          return links.enumKind;
        }
        var hasNonLiteralMember = false;
        if (symbol.declarations) {
          for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            if (declaration.kind === 259) {
              for (var _b = 0, _c = declaration.members; _b < _c.length; _b++) {
                var member = _c[_b];
                if (member.initializer && ts2.isStringLiteralLike(member.initializer)) {
                  return links.enumKind = 1;
                }
                if (!isLiteralEnumMember(member)) {
                  hasNonLiteralMember = true;
                }
              }
            }
          }
        }
        return links.enumKind = hasNonLiteralMember ? 0 : 1;
      }
      function getBaseTypeOfEnumLiteralType(type) {
        return type.flags & 1024 && !(type.flags & 1048576) ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)) : type;
      }
      function getDeclaredTypeOfEnum(symbol) {
        var links = getSymbolLinks(symbol);
        if (links.declaredType) {
          return links.declaredType;
        }
        if (getEnumKind(symbol) === 1) {
          enumCount++;
          var memberTypeList = [];
          if (symbol.declarations) {
            for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
              var declaration = _a[_i];
              if (declaration.kind === 259) {
                for (var _b = 0, _c = declaration.members; _b < _c.length; _b++) {
                  var member = _c[_b];
                  var value = getEnumMemberValue(member);
                  var memberType = getFreshTypeOfLiteralType(getEnumLiteralType(value !== void 0 ? value : 0, enumCount, getSymbolOfNode(member)));
                  getSymbolLinks(getSymbolOfNode(member)).declaredType = memberType;
                  memberTypeList.push(getRegularTypeOfLiteralType(memberType));
                }
              }
            }
          }
          if (memberTypeList.length) {
            var enumType_1 = getUnionType(memberTypeList, 1, symbol, void 0);
            if (enumType_1.flags & 1048576) {
              enumType_1.flags |= 1024;
              enumType_1.symbol = symbol;
            }
            return links.declaredType = enumType_1;
          }
        }
        var enumType = createType(32);
        enumType.symbol = symbol;
        return links.declaredType = enumType;
      }
      function getDeclaredTypeOfEnumMember(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.declaredType) {
          var enumType = getDeclaredTypeOfEnum(getParentOfSymbol(symbol));
          if (!links.declaredType) {
            links.declaredType = enumType;
          }
        }
        return links.declaredType;
      }
      function getDeclaredTypeOfTypeParameter(symbol) {
        var links = getSymbolLinks(symbol);
        return links.declaredType || (links.declaredType = createTypeParameter(symbol));
      }
      function getDeclaredTypeOfAlias(symbol) {
        var links = getSymbolLinks(symbol);
        return links.declaredType || (links.declaredType = getDeclaredTypeOfSymbol(resolveAlias(symbol)));
      }
      function getDeclaredTypeOfSymbol(symbol) {
        return tryGetDeclaredTypeOfSymbol(symbol) || errorType;
      }
      function tryGetDeclaredTypeOfSymbol(symbol) {
        if (symbol.flags & (32 | 64)) {
          return getDeclaredTypeOfClassOrInterface(symbol);
        }
        if (symbol.flags & 524288) {
          return getDeclaredTypeOfTypeAlias(symbol);
        }
        if (symbol.flags & 262144) {
          return getDeclaredTypeOfTypeParameter(symbol);
        }
        if (symbol.flags & 384) {
          return getDeclaredTypeOfEnum(symbol);
        }
        if (symbol.flags & 8) {
          return getDeclaredTypeOfEnumMember(symbol);
        }
        if (symbol.flags & 2097152) {
          return getDeclaredTypeOfAlias(symbol);
        }
        return void 0;
      }
      function isThislessType(node) {
        switch (node.kind) {
          case 130:
          case 154:
          case 149:
          case 146:
          case 157:
          case 133:
          case 150:
          case 147:
          case 114:
          case 152:
          case 143:
          case 195:
            return true;
          case 182:
            return isThislessType(node.elementType);
          case 177:
            return !node.typeArguments || node.typeArguments.every(isThislessType);
        }
        return false;
      }
      function isThislessTypeParameter(node) {
        var constraint = ts2.getEffectiveConstraintOfTypeParameter(node);
        return !constraint || isThislessType(constraint);
      }
      function isThislessVariableLikeDeclaration(node) {
        var typeNode = ts2.getEffectiveTypeAnnotationNode(node);
        return typeNode ? isThislessType(typeNode) : !ts2.hasInitializer(node);
      }
      function isThislessFunctionLikeDeclaration(node) {
        var returnType = ts2.getEffectiveReturnTypeNode(node);
        var typeParameters = ts2.getEffectiveTypeParameterDeclarations(node);
        return (node.kind === 170 || !!returnType && isThislessType(returnType)) && node.parameters.every(isThislessVariableLikeDeclaration) && typeParameters.every(isThislessTypeParameter);
      }
      function isThisless(symbol) {
        if (symbol.declarations && symbol.declarations.length === 1) {
          var declaration = symbol.declarations[0];
          if (declaration) {
            switch (declaration.kind) {
              case 166:
              case 165:
                return isThislessVariableLikeDeclaration(declaration);
              case 168:
              case 167:
              case 170:
              case 171:
              case 172:
                return isThislessFunctionLikeDeclaration(declaration);
            }
          }
        }
        return false;
      }
      function createInstantiatedSymbolTable(symbols, mapper, mappingThisOnly) {
        var result = ts2.createSymbolTable();
        for (var _i = 0, symbols_2 = symbols; _i < symbols_2.length; _i++) {
          var symbol = symbols_2[_i];
          result.set(symbol.escapedName, mappingThisOnly && isThisless(symbol) ? symbol : instantiateSymbol(symbol, mapper));
        }
        return result;
      }
      function addInheritedMembers(symbols, baseSymbols) {
        for (var _i = 0, baseSymbols_1 = baseSymbols; _i < baseSymbols_1.length; _i++) {
          var s = baseSymbols_1[_i];
          if (!symbols.has(s.escapedName) && !isStaticPrivateIdentifierProperty(s)) {
            symbols.set(s.escapedName, s);
          }
        }
      }
      function isStaticPrivateIdentifierProperty(s) {
        return !!s.valueDeclaration && ts2.isPrivateIdentifierClassElementDeclaration(s.valueDeclaration) && ts2.isStatic(s.valueDeclaration);
      }
      function resolveDeclaredMembers(type) {
        if (!type.declaredProperties) {
          var symbol = type.symbol;
          var members = getMembersOfSymbol(symbol);
          type.declaredProperties = getNamedMembers(members);
          type.declaredCallSignatures = ts2.emptyArray;
          type.declaredConstructSignatures = ts2.emptyArray;
          type.declaredIndexInfos = ts2.emptyArray;
          type.declaredCallSignatures = getSignaturesOfSymbol(members.get("__call"));
          type.declaredConstructSignatures = getSignaturesOfSymbol(members.get("__new"));
          type.declaredIndexInfos = getIndexInfosOfSymbol(symbol);
        }
        return type;
      }
      function isTypeUsableAsPropertyName(type) {
        return !!(type.flags & 8576);
      }
      function isLateBindableName(node) {
        if (!ts2.isComputedPropertyName(node) && !ts2.isElementAccessExpression(node)) {
          return false;
        }
        var expr = ts2.isComputedPropertyName(node) ? node.expression : node.argumentExpression;
        return ts2.isEntityNameExpression(expr) && isTypeUsableAsPropertyName(ts2.isComputedPropertyName(node) ? checkComputedPropertyName(node) : checkExpressionCached(expr));
      }
      function isLateBoundName(name) {
        return name.charCodeAt(0) === 95 && name.charCodeAt(1) === 95 && name.charCodeAt(2) === 64;
      }
      function hasLateBindableName(node) {
        var name = ts2.getNameOfDeclaration(node);
        return !!name && isLateBindableName(name);
      }
      function hasBindableName(node) {
        return !ts2.hasDynamicName(node) || hasLateBindableName(node);
      }
      function isNonBindableDynamicName(node) {
        return ts2.isDynamicName(node) && !isLateBindableName(node);
      }
      function getPropertyNameFromType(type) {
        if (type.flags & 8192) {
          return type.escapedName;
        }
        if (type.flags & (128 | 256)) {
          return ts2.escapeLeadingUnderscores("" + type.value);
        }
        return ts2.Debug.fail();
      }
      function addDeclarationToLateBoundSymbol(symbol, member, symbolFlags) {
        ts2.Debug.assert(!!(ts2.getCheckFlags(symbol) & 4096), "Expected a late-bound symbol.");
        symbol.flags |= symbolFlags;
        getSymbolLinks(member.symbol).lateSymbol = symbol;
        if (!symbol.declarations) {
          symbol.declarations = [member];
        } else if (!member.symbol.isReplaceableByMethod) {
          symbol.declarations.push(member);
        }
        if (symbolFlags & 111551) {
          if (!symbol.valueDeclaration || symbol.valueDeclaration.kind !== member.kind) {
            symbol.valueDeclaration = member;
          }
        }
      }
      function lateBindMember(parent, earlySymbols, lateSymbols, decl) {
        ts2.Debug.assert(!!decl.symbol, "The member is expected to have a symbol.");
        var links = getNodeLinks(decl);
        if (!links.resolvedSymbol) {
          links.resolvedSymbol = decl.symbol;
          var declName = ts2.isBinaryExpression(decl) ? decl.left : decl.name;
          var type = ts2.isElementAccessExpression(declName) ? checkExpressionCached(declName.argumentExpression) : checkComputedPropertyName(declName);
          if (isTypeUsableAsPropertyName(type)) {
            var memberName = getPropertyNameFromType(type);
            var symbolFlags = decl.symbol.flags;
            var lateSymbol = lateSymbols.get(memberName);
            if (!lateSymbol)
              lateSymbols.set(memberName, lateSymbol = createSymbol(0, memberName, 4096));
            var earlySymbol = earlySymbols && earlySymbols.get(memberName);
            if (lateSymbol.flags & getExcludedSymbolFlags(symbolFlags) || earlySymbol) {
              var declarations = earlySymbol ? ts2.concatenate(earlySymbol.declarations, lateSymbol.declarations) : lateSymbol.declarations;
              var name_4 = !(type.flags & 8192) && ts2.unescapeLeadingUnderscores(memberName) || ts2.declarationNameToString(declName);
              ts2.forEach(declarations, function(declaration) {
                return error(ts2.getNameOfDeclaration(declaration) || declaration, ts2.Diagnostics.Property_0_was_also_declared_here, name_4);
              });
              error(declName || decl, ts2.Diagnostics.Duplicate_property_0, name_4);
              lateSymbol = createSymbol(0, memberName, 4096);
            }
            lateSymbol.nameType = type;
            addDeclarationToLateBoundSymbol(lateSymbol, decl, symbolFlags);
            if (lateSymbol.parent) {
              ts2.Debug.assert(lateSymbol.parent === parent, "Existing symbol parent should match new one");
            } else {
              lateSymbol.parent = parent;
            }
            return links.resolvedSymbol = lateSymbol;
          }
        }
        return links.resolvedSymbol;
      }
      function getResolvedMembersOrExportsOfSymbol(symbol, resolutionKind) {
        var links = getSymbolLinks(symbol);
        if (!links[resolutionKind]) {
          var isStatic_1 = resolutionKind === "resolvedExports";
          var earlySymbols = !isStatic_1 ? symbol.members : symbol.flags & 1536 ? getExportsOfModuleWorker(symbol) : symbol.exports;
          links[resolutionKind] = earlySymbols || emptySymbols;
          var lateSymbols = ts2.createSymbolTable();
          for (var _i = 0, _a = symbol.declarations || ts2.emptyArray; _i < _a.length; _i++) {
            var decl = _a[_i];
            var members = ts2.getMembersOfDeclaration(decl);
            if (members) {
              for (var _b = 0, members_5 = members; _b < members_5.length; _b++) {
                var member = members_5[_b];
                if (isStatic_1 === ts2.hasStaticModifier(member) && hasLateBindableName(member)) {
                  lateBindMember(symbol, earlySymbols, lateSymbols, member);
                }
              }
            }
          }
          var assignments = symbol.assignmentDeclarationMembers;
          if (assignments) {
            var decls = ts2.arrayFrom(assignments.values());
            for (var _c = 0, decls_1 = decls; _c < decls_1.length; _c++) {
              var member = decls_1[_c];
              var assignmentKind = ts2.getAssignmentDeclarationKind(member);
              var isInstanceMember = assignmentKind === 3 || ts2.isBinaryExpression(member) && isPossiblyAliasedThisProperty(member, assignmentKind) || assignmentKind === 9 || assignmentKind === 6;
              if (isStatic_1 === !isInstanceMember && hasLateBindableName(member)) {
                lateBindMember(symbol, earlySymbols, lateSymbols, member);
              }
            }
          }
          links[resolutionKind] = combineSymbolTables(earlySymbols, lateSymbols) || emptySymbols;
        }
        return links[resolutionKind];
      }
      function getMembersOfSymbol(symbol) {
        return symbol.flags & 6256 ? getResolvedMembersOrExportsOfSymbol(symbol, "resolvedMembers") : symbol.members || emptySymbols;
      }
      function getLateBoundSymbol(symbol) {
        if (symbol.flags & 106500 && symbol.escapedName === "__computed") {
          var links = getSymbolLinks(symbol);
          if (!links.lateSymbol && ts2.some(symbol.declarations, hasLateBindableName)) {
            var parent = getMergedSymbol(symbol.parent);
            if (ts2.some(symbol.declarations, ts2.hasStaticModifier)) {
              getExportsOfSymbol(parent);
            } else {
              getMembersOfSymbol(parent);
            }
          }
          return links.lateSymbol || (links.lateSymbol = symbol);
        }
        return symbol;
      }
      function getTypeWithThisArgument(type, thisArgument, needApparentType) {
        if (ts2.getObjectFlags(type) & 4) {
          var target = type.target;
          var typeArguments = getTypeArguments(type);
          if (ts2.length(target.typeParameters) === ts2.length(typeArguments)) {
            var ref = createTypeReference(target, ts2.concatenate(typeArguments, [thisArgument || target.thisType]));
            return needApparentType ? getApparentType(ref) : ref;
          }
        } else if (type.flags & 2097152) {
          var types = ts2.sameMap(type.types, function(t) {
            return getTypeWithThisArgument(t, thisArgument, needApparentType);
          });
          return types !== type.types ? getIntersectionType(types) : type;
        }
        return needApparentType ? getApparentType(type) : type;
      }
      function resolveObjectTypeMembers(type, source, typeParameters, typeArguments) {
        var mapper;
        var members;
        var callSignatures;
        var constructSignatures;
        var indexInfos;
        if (ts2.rangeEquals(typeParameters, typeArguments, 0, typeParameters.length)) {
          members = source.symbol ? getMembersOfSymbol(source.symbol) : ts2.createSymbolTable(source.declaredProperties);
          callSignatures = source.declaredCallSignatures;
          constructSignatures = source.declaredConstructSignatures;
          indexInfos = source.declaredIndexInfos;
        } else {
          mapper = createTypeMapper(typeParameters, typeArguments);
          members = createInstantiatedSymbolTable(source.declaredProperties, mapper, typeParameters.length === 1);
          callSignatures = instantiateSignatures(source.declaredCallSignatures, mapper);
          constructSignatures = instantiateSignatures(source.declaredConstructSignatures, mapper);
          indexInfos = instantiateIndexInfos(source.declaredIndexInfos, mapper);
        }
        var baseTypes = getBaseTypes(source);
        if (baseTypes.length) {
          if (source.symbol && members === getMembersOfSymbol(source.symbol)) {
            members = ts2.createSymbolTable(source.declaredProperties);
          }
          setStructuredTypeMembers(type, members, callSignatures, constructSignatures, indexInfos);
          var thisArgument = ts2.lastOrUndefined(typeArguments);
          for (var _i = 0, baseTypes_1 = baseTypes; _i < baseTypes_1.length; _i++) {
            var baseType = baseTypes_1[_i];
            var instantiatedBaseType = thisArgument ? getTypeWithThisArgument(instantiateType(baseType, mapper), thisArgument) : baseType;
            addInheritedMembers(members, getPropertiesOfType(instantiatedBaseType));
            callSignatures = ts2.concatenate(callSignatures, getSignaturesOfType(instantiatedBaseType, 0));
            constructSignatures = ts2.concatenate(constructSignatures, getSignaturesOfType(instantiatedBaseType, 1));
            var inheritedIndexInfos = instantiatedBaseType !== anyType ? getIndexInfosOfType(instantiatedBaseType) : [createIndexInfo(stringType, anyType, false)];
            indexInfos = ts2.concatenate(indexInfos, ts2.filter(inheritedIndexInfos, function(info) {
              return !findIndexInfo(indexInfos, info.keyType);
            }));
          }
        }
        setStructuredTypeMembers(type, members, callSignatures, constructSignatures, indexInfos);
      }
      function resolveClassOrInterfaceMembers(type) {
        resolveObjectTypeMembers(type, resolveDeclaredMembers(type), ts2.emptyArray, ts2.emptyArray);
      }
      function resolveTypeReferenceMembers(type) {
        var source = resolveDeclaredMembers(type.target);
        var typeParameters = ts2.concatenate(source.typeParameters, [source.thisType]);
        var typeArguments = getTypeArguments(type);
        var paddedTypeArguments = typeArguments.length === typeParameters.length ? typeArguments : ts2.concatenate(typeArguments, [type]);
        resolveObjectTypeMembers(type, source, typeParameters, paddedTypeArguments);
      }
      function createSignature(declaration, typeParameters, thisParameter, parameters, resolvedReturnType, resolvedTypePredicate, minArgumentCount, flags) {
        var sig = new Signature(checker, flags);
        sig.declaration = declaration;
        sig.typeParameters = typeParameters;
        sig.parameters = parameters;
        sig.thisParameter = thisParameter;
        sig.resolvedReturnType = resolvedReturnType;
        sig.resolvedTypePredicate = resolvedTypePredicate;
        sig.minArgumentCount = minArgumentCount;
        sig.resolvedMinArgumentCount = void 0;
        sig.target = void 0;
        sig.mapper = void 0;
        sig.compositeSignatures = void 0;
        sig.compositeKind = void 0;
        return sig;
      }
      function cloneSignature(sig) {
        var result = createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, void 0, void 0, sig.minArgumentCount, sig.flags & 39);
        result.target = sig.target;
        result.mapper = sig.mapper;
        result.compositeSignatures = sig.compositeSignatures;
        result.compositeKind = sig.compositeKind;
        return result;
      }
      function createUnionSignature(signature, unionSignatures) {
        var result = cloneSignature(signature);
        result.compositeSignatures = unionSignatures;
        result.compositeKind = 1048576;
        result.target = void 0;
        result.mapper = void 0;
        return result;
      }
      function getOptionalCallSignature(signature, callChainFlags) {
        if ((signature.flags & 24) === callChainFlags) {
          return signature;
        }
        if (!signature.optionalCallSignatureCache) {
          signature.optionalCallSignatureCache = {};
        }
        var key = callChainFlags === 8 ? "inner" : "outer";
        return signature.optionalCallSignatureCache[key] || (signature.optionalCallSignatureCache[key] = createOptionalCallSignature(signature, callChainFlags));
      }
      function createOptionalCallSignature(signature, callChainFlags) {
        ts2.Debug.assert(callChainFlags === 8 || callChainFlags === 16, "An optional call signature can either be for an inner call chain or an outer call chain, but not both.");
        var result = cloneSignature(signature);
        result.flags |= callChainFlags;
        return result;
      }
      function getExpandedParameters(sig, skipUnionExpanding) {
        if (signatureHasRestParameter(sig)) {
          var restIndex_1 = sig.parameters.length - 1;
          var restType = getTypeOfSymbol(sig.parameters[restIndex_1]);
          if (isTupleType(restType)) {
            return [expandSignatureParametersWithTupleMembers(restType, restIndex_1)];
          } else if (!skipUnionExpanding && restType.flags & 1048576 && ts2.every(restType.types, isTupleType)) {
            return ts2.map(restType.types, function(t) {
              return expandSignatureParametersWithTupleMembers(t, restIndex_1);
            });
          }
        }
        return [sig.parameters];
        function expandSignatureParametersWithTupleMembers(restType2, restIndex) {
          var elementTypes = getTypeArguments(restType2);
          var associatedNames = restType2.target.labeledElementDeclarations;
          var restParams = ts2.map(elementTypes, function(t, i) {
            var tupleLabelName = !!associatedNames && getTupleElementLabel(associatedNames[i]);
            var name = tupleLabelName || getParameterNameAtPosition(sig, restIndex + i, restType2);
            var flags = restType2.target.elementFlags[i];
            var checkFlags = flags & 12 ? 32768 : flags & 2 ? 16384 : 0;
            var symbol = createSymbol(1, name, checkFlags);
            symbol.type = flags & 4 ? createArrayType(t) : t;
            return symbol;
          });
          return ts2.concatenate(sig.parameters.slice(0, restIndex), restParams);
        }
      }
      function getDefaultConstructSignatures(classType) {
        var baseConstructorType = getBaseConstructorTypeOfClass(classType);
        var baseSignatures = getSignaturesOfType(baseConstructorType, 1);
        var declaration = ts2.getClassLikeDeclarationOfSymbol(classType.symbol);
        var isAbstract = !!declaration && ts2.hasSyntacticModifier(declaration, 128);
        if (baseSignatures.length === 0) {
          return [createSignature(void 0, classType.localTypeParameters, void 0, ts2.emptyArray, classType, void 0, 0, isAbstract ? 4 : 0)];
        }
        var baseTypeNode = getBaseTypeNodeOfClass(classType);
        var isJavaScript = ts2.isInJSFile(baseTypeNode);
        var typeArguments = typeArgumentsFromTypeReferenceNode(baseTypeNode);
        var typeArgCount = ts2.length(typeArguments);
        var result = [];
        for (var _i = 0, baseSignatures_1 = baseSignatures; _i < baseSignatures_1.length; _i++) {
          var baseSig = baseSignatures_1[_i];
          var minTypeArgumentCount = getMinTypeArgumentCount(baseSig.typeParameters);
          var typeParamCount = ts2.length(baseSig.typeParameters);
          if (isJavaScript || typeArgCount >= minTypeArgumentCount && typeArgCount <= typeParamCount) {
            var sig = typeParamCount ? createSignatureInstantiation(baseSig, fillMissingTypeArguments(typeArguments, baseSig.typeParameters, minTypeArgumentCount, isJavaScript)) : cloneSignature(baseSig);
            sig.typeParameters = classType.localTypeParameters;
            sig.resolvedReturnType = classType;
            sig.flags = isAbstract ? sig.flags | 4 : sig.flags & ~4;
            result.push(sig);
          }
        }
        return result;
      }
      function findMatchingSignature(signatureList, signature, partialMatch, ignoreThisTypes, ignoreReturnTypes) {
        for (var _i = 0, signatureList_1 = signatureList; _i < signatureList_1.length; _i++) {
          var s = signatureList_1[_i];
          if (compareSignaturesIdentical(s, signature, partialMatch, ignoreThisTypes, ignoreReturnTypes, partialMatch ? compareTypesSubtypeOf : compareTypesIdentical)) {
            return s;
          }
        }
      }
      function findMatchingSignatures(signatureLists, signature, listIndex) {
        if (signature.typeParameters) {
          if (listIndex > 0) {
            return void 0;
          }
          for (var i = 1; i < signatureLists.length; i++) {
            if (!findMatchingSignature(signatureLists[i], signature, false, false, false)) {
              return void 0;
            }
          }
          return [signature];
        }
        var result;
        for (var i = 0; i < signatureLists.length; i++) {
          var match = i === listIndex ? signature : findMatchingSignature(signatureLists[i], signature, true, false, true);
          if (!match) {
            return void 0;
          }
          result = ts2.appendIfUnique(result, match);
        }
        return result;
      }
      function getUnionSignatures(signatureLists) {
        var result;
        var indexWithLengthOverOne;
        for (var i = 0; i < signatureLists.length; i++) {
          if (signatureLists[i].length === 0)
            return ts2.emptyArray;
          if (signatureLists[i].length > 1) {
            indexWithLengthOverOne = indexWithLengthOverOne === void 0 ? i : -1;
          }
          for (var _i = 0, _a = signatureLists[i]; _i < _a.length; _i++) {
            var signature = _a[_i];
            if (!result || !findMatchingSignature(result, signature, false, false, true)) {
              var unionSignatures = findMatchingSignatures(signatureLists, signature, i);
              if (unionSignatures) {
                var s = signature;
                if (unionSignatures.length > 1) {
                  var thisParameter = signature.thisParameter;
                  var firstThisParameterOfUnionSignatures = ts2.forEach(unionSignatures, function(sig) {
                    return sig.thisParameter;
                  });
                  if (firstThisParameterOfUnionSignatures) {
                    var thisType = getIntersectionType(ts2.mapDefined(unionSignatures, function(sig) {
                      return sig.thisParameter && getTypeOfSymbol(sig.thisParameter);
                    }));
                    thisParameter = createSymbolWithType(firstThisParameterOfUnionSignatures, thisType);
                  }
                  s = createUnionSignature(signature, unionSignatures);
                  s.thisParameter = thisParameter;
                }
                (result || (result = [])).push(s);
              }
            }
          }
        }
        if (!ts2.length(result) && indexWithLengthOverOne !== -1) {
          var masterList = signatureLists[indexWithLengthOverOne !== void 0 ? indexWithLengthOverOne : 0];
          var results = masterList.slice();
          var _loop_10 = function(signatures2) {
            if (signatures2 !== masterList) {
              var signature_1 = signatures2[0];
              ts2.Debug.assert(!!signature_1, "getUnionSignatures bails early on empty signature lists and should not have empty lists on second pass");
              results = !!signature_1.typeParameters && ts2.some(results, function(s2) {
                return !!s2.typeParameters && !compareTypeParametersIdentical(signature_1.typeParameters, s2.typeParameters);
              }) ? void 0 : ts2.map(results, function(sig) {
                return combineSignaturesOfUnionMembers(sig, signature_1);
              });
              if (!results) {
                return "break";
              }
            }
          };
          for (var _b = 0, signatureLists_1 = signatureLists; _b < signatureLists_1.length; _b++) {
            var signatures = signatureLists_1[_b];
            var state_3 = _loop_10(signatures);
            if (state_3 === "break")
              break;
          }
          result = results;
        }
        return result || ts2.emptyArray;
      }
      function compareTypeParametersIdentical(sourceParams, targetParams) {
        if (ts2.length(sourceParams) !== ts2.length(targetParams)) {
          return false;
        }
        if (!sourceParams || !targetParams) {
          return true;
        }
        var mapper = createTypeMapper(targetParams, sourceParams);
        for (var i = 0; i < sourceParams.length; i++) {
          var source = sourceParams[i];
          var target = targetParams[i];
          if (source === target)
            continue;
          if (!isTypeIdenticalTo(getConstraintFromTypeParameter(source) || unknownType, instantiateType(getConstraintFromTypeParameter(target) || unknownType, mapper)))
            return false;
        }
        return true;
      }
      function combineUnionThisParam(left, right, mapper) {
        if (!left || !right) {
          return left || right;
        }
        var thisType = getIntersectionType([getTypeOfSymbol(left), instantiateType(getTypeOfSymbol(right), mapper)]);
        return createSymbolWithType(left, thisType);
      }
      function combineUnionParameters(left, right, mapper) {
        var leftCount = getParameterCount(left);
        var rightCount = getParameterCount(right);
        var longest = leftCount >= rightCount ? left : right;
        var shorter = longest === left ? right : left;
        var longestCount = longest === left ? leftCount : rightCount;
        var eitherHasEffectiveRest = hasEffectiveRestParameter(left) || hasEffectiveRestParameter(right);
        var needsExtraRestElement = eitherHasEffectiveRest && !hasEffectiveRestParameter(longest);
        var params = new Array(longestCount + (needsExtraRestElement ? 1 : 0));
        for (var i = 0; i < longestCount; i++) {
          var longestParamType = tryGetTypeAtPosition(longest, i);
          if (longest === right) {
            longestParamType = instantiateType(longestParamType, mapper);
          }
          var shorterParamType = tryGetTypeAtPosition(shorter, i) || unknownType;
          if (shorter === right) {
            shorterParamType = instantiateType(shorterParamType, mapper);
          }
          var unionParamType = getIntersectionType([longestParamType, shorterParamType]);
          var isRestParam = eitherHasEffectiveRest && !needsExtraRestElement && i === longestCount - 1;
          var isOptional = i >= getMinArgumentCount(longest) && i >= getMinArgumentCount(shorter);
          var leftName = i >= leftCount ? void 0 : getParameterNameAtPosition(left, i);
          var rightName = i >= rightCount ? void 0 : getParameterNameAtPosition(right, i);
          var paramName = leftName === rightName ? leftName : !leftName ? rightName : !rightName ? leftName : void 0;
          var paramSymbol = createSymbol(1 | (isOptional && !isRestParam ? 16777216 : 0), paramName || "arg".concat(i));
          paramSymbol.type = isRestParam ? createArrayType(unionParamType) : unionParamType;
          params[i] = paramSymbol;
        }
        if (needsExtraRestElement) {
          var restParamSymbol = createSymbol(1, "args");
          restParamSymbol.type = createArrayType(getTypeAtPosition(shorter, longestCount));
          if (shorter === right) {
            restParamSymbol.type = instantiateType(restParamSymbol.type, mapper);
          }
          params[longestCount] = restParamSymbol;
        }
        return params;
      }
      function combineSignaturesOfUnionMembers(left, right) {
        var typeParams = left.typeParameters || right.typeParameters;
        var paramMapper;
        if (left.typeParameters && right.typeParameters) {
          paramMapper = createTypeMapper(right.typeParameters, left.typeParameters);
        }
        var declaration = left.declaration;
        var params = combineUnionParameters(left, right, paramMapper);
        var thisParam = combineUnionThisParam(left.thisParameter, right.thisParameter, paramMapper);
        var minArgCount = Math.max(left.minArgumentCount, right.minArgumentCount);
        var result = createSignature(declaration, typeParams, thisParam, params, void 0, void 0, minArgCount, (left.flags | right.flags) & 39);
        result.compositeKind = 1048576;
        result.compositeSignatures = ts2.concatenate(left.compositeKind !== 2097152 && left.compositeSignatures || [left], [right]);
        if (paramMapper) {
          result.mapper = left.compositeKind !== 2097152 && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper;
        }
        return result;
      }
      function getUnionIndexInfos(types) {
        var sourceInfos = getIndexInfosOfType(types[0]);
        if (sourceInfos) {
          var result = [];
          var _loop_11 = function(info2) {
            var indexType = info2.keyType;
            if (ts2.every(types, function(t) {
              return !!getIndexInfoOfType(t, indexType);
            })) {
              result.push(createIndexInfo(indexType, getUnionType(ts2.map(types, function(t) {
                return getIndexTypeOfType(t, indexType);
              })), ts2.some(types, function(t) {
                return getIndexInfoOfType(t, indexType).isReadonly;
              })));
            }
          };
          for (var _i = 0, sourceInfos_1 = sourceInfos; _i < sourceInfos_1.length; _i++) {
            var info = sourceInfos_1[_i];
            _loop_11(info);
          }
          return result;
        }
        return ts2.emptyArray;
      }
      function resolveUnionTypeMembers(type) {
        var callSignatures = getUnionSignatures(ts2.map(type.types, function(t) {
          return t === globalFunctionType ? [unknownSignature] : getSignaturesOfType(t, 0);
        }));
        var constructSignatures = getUnionSignatures(ts2.map(type.types, function(t) {
          return getSignaturesOfType(t, 1);
        }));
        var indexInfos = getUnionIndexInfos(type.types);
        setStructuredTypeMembers(type, emptySymbols, callSignatures, constructSignatures, indexInfos);
      }
      function intersectTypes(type1, type2) {
        return !type1 ? type2 : !type2 ? type1 : getIntersectionType([type1, type2]);
      }
      function findMixins(types) {
        var constructorTypeCount = ts2.countWhere(types, function(t) {
          return getSignaturesOfType(t, 1).length > 0;
        });
        var mixinFlags = ts2.map(types, isMixinConstructorType);
        if (constructorTypeCount > 0 && constructorTypeCount === ts2.countWhere(mixinFlags, function(b) {
          return b;
        })) {
          var firstMixinIndex = mixinFlags.indexOf(true);
          mixinFlags[firstMixinIndex] = false;
        }
        return mixinFlags;
      }
      function includeMixinType(type, types, mixinFlags, index) {
        var mixedTypes = [];
        for (var i = 0; i < types.length; i++) {
          if (i === index) {
            mixedTypes.push(type);
          } else if (mixinFlags[i]) {
            mixedTypes.push(getReturnTypeOfSignature(getSignaturesOfType(types[i], 1)[0]));
          }
        }
        return getIntersectionType(mixedTypes);
      }
      function resolveIntersectionTypeMembers(type) {
        var callSignatures;
        var constructSignatures;
        var indexInfos;
        var types = type.types;
        var mixinFlags = findMixins(types);
        var mixinCount = ts2.countWhere(mixinFlags, function(b) {
          return b;
        });
        var _loop_12 = function(i2) {
          var t = type.types[i2];
          if (!mixinFlags[i2]) {
            var signatures = getSignaturesOfType(t, 1);
            if (signatures.length && mixinCount > 0) {
              signatures = ts2.map(signatures, function(s) {
                var clone = cloneSignature(s);
                clone.resolvedReturnType = includeMixinType(getReturnTypeOfSignature(s), types, mixinFlags, i2);
                return clone;
              });
            }
            constructSignatures = appendSignatures(constructSignatures, signatures);
          }
          callSignatures = appendSignatures(callSignatures, getSignaturesOfType(t, 0));
          indexInfos = ts2.reduceLeft(getIndexInfosOfType(t), function(infos, newInfo) {
            return appendIndexInfo(infos, newInfo, false);
          }, indexInfos);
        };
        for (var i = 0; i < types.length; i++) {
          _loop_12(i);
        }
        setStructuredTypeMembers(type, emptySymbols, callSignatures || ts2.emptyArray, constructSignatures || ts2.emptyArray, indexInfos || ts2.emptyArray);
      }
      function appendSignatures(signatures, newSignatures) {
        var _loop_13 = function(sig2) {
          if (!signatures || ts2.every(signatures, function(s) {
            return !compareSignaturesIdentical(s, sig2, false, false, false, compareTypesIdentical);
          })) {
            signatures = ts2.append(signatures, sig2);
          }
        };
        for (var _i = 0, newSignatures_1 = newSignatures; _i < newSignatures_1.length; _i++) {
          var sig = newSignatures_1[_i];
          _loop_13(sig);
        }
        return signatures;
      }
      function appendIndexInfo(indexInfos, newInfo, union) {
        if (indexInfos) {
          for (var i = 0; i < indexInfos.length; i++) {
            var info = indexInfos[i];
            if (info.keyType === newInfo.keyType) {
              indexInfos[i] = createIndexInfo(info.keyType, union ? getUnionType([info.type, newInfo.type]) : getIntersectionType([info.type, newInfo.type]), union ? info.isReadonly || newInfo.isReadonly : info.isReadonly && newInfo.isReadonly);
              return indexInfos;
            }
          }
        }
        return ts2.append(indexInfos, newInfo);
      }
      function resolveAnonymousTypeMembers(type) {
        var symbol = getMergedSymbol(type.symbol);
        if (type.target) {
          setStructuredTypeMembers(type, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
          var members = createInstantiatedSymbolTable(getPropertiesOfObjectType(type.target), type.mapper, false);
          var callSignatures = instantiateSignatures(getSignaturesOfType(type.target, 0), type.mapper);
          var constructSignatures = instantiateSignatures(getSignaturesOfType(type.target, 1), type.mapper);
          var indexInfos = instantiateIndexInfos(getIndexInfosOfType(type.target), type.mapper);
          setStructuredTypeMembers(type, members, callSignatures, constructSignatures, indexInfos);
        } else if (symbol.flags & 2048) {
          setStructuredTypeMembers(type, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
          var members = getMembersOfSymbol(symbol);
          var callSignatures = getSignaturesOfSymbol(members.get("__call"));
          var constructSignatures = getSignaturesOfSymbol(members.get("__new"));
          var indexInfos = getIndexInfosOfSymbol(symbol);
          setStructuredTypeMembers(type, members, callSignatures, constructSignatures, indexInfos);
        } else {
          var members = emptySymbols;
          var indexInfos = void 0;
          if (symbol.exports) {
            members = getExportsOfSymbol(symbol);
            if (symbol === globalThisSymbol) {
              var varsOnly_1 = new ts2.Map();
              members.forEach(function(p) {
                if (!(p.flags & 418)) {
                  varsOnly_1.set(p.escapedName, p);
                }
              });
              members = varsOnly_1;
            }
          }
          var baseConstructorIndexInfo = void 0;
          setStructuredTypeMembers(type, members, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
          if (symbol.flags & 32) {
            var classType = getDeclaredTypeOfClassOrInterface(symbol);
            var baseConstructorType = getBaseConstructorTypeOfClass(classType);
            if (baseConstructorType.flags & (524288 | 2097152 | 8650752)) {
              members = ts2.createSymbolTable(getNamedOrIndexSignatureMembers(members));
              addInheritedMembers(members, getPropertiesOfType(baseConstructorType));
            } else if (baseConstructorType === anyType) {
              baseConstructorIndexInfo = createIndexInfo(stringType, anyType, false);
            }
          }
          var indexSymbol = getIndexSymbolFromSymbolTable(members);
          if (indexSymbol) {
            indexInfos = getIndexInfosOfIndexSymbol(indexSymbol);
          } else {
            if (baseConstructorIndexInfo) {
              indexInfos = ts2.append(indexInfos, baseConstructorIndexInfo);
            }
            if (symbol.flags & 384 && (getDeclaredTypeOfSymbol(symbol).flags & 32 || ts2.some(type.properties, function(prop) {
              return !!(getTypeOfSymbol(prop).flags & 296);
            }))) {
              indexInfos = ts2.append(indexInfos, enumNumberIndexInfo);
            }
          }
          setStructuredTypeMembers(type, members, ts2.emptyArray, ts2.emptyArray, indexInfos || ts2.emptyArray);
          if (symbol.flags & (16 | 8192)) {
            type.callSignatures = getSignaturesOfSymbol(symbol);
          }
          if (symbol.flags & 32) {
            var classType_1 = getDeclaredTypeOfClassOrInterface(symbol);
            var constructSignatures = symbol.members ? getSignaturesOfSymbol(symbol.members.get("__constructor")) : ts2.emptyArray;
            if (symbol.flags & 16) {
              constructSignatures = ts2.addRange(constructSignatures.slice(), ts2.mapDefined(type.callSignatures, function(sig) {
                return isJSConstructor(sig.declaration) ? createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, classType_1, void 0, sig.minArgumentCount, sig.flags & 39) : void 0;
              }));
            }
            if (!constructSignatures.length) {
              constructSignatures = getDefaultConstructSignatures(classType_1);
            }
            type.constructSignatures = constructSignatures;
          }
        }
      }
      function replaceIndexedAccess(instantiable, type, replacement) {
        return instantiateType(instantiable, createTypeMapper([type.indexType, type.objectType], [getNumberLiteralType(0), createTupleType([replacement])]));
      }
      function resolveReverseMappedTypeMembers(type) {
        var indexInfo = getIndexInfoOfType(type.source, stringType);
        var modifiers = getMappedTypeModifiers(type.mappedType);
        var readonlyMask = modifiers & 1 ? false : true;
        var optionalMask = modifiers & 4 ? 0 : 16777216;
        var indexInfos = indexInfo ? [createIndexInfo(stringType, inferReverseMappedType(indexInfo.type, type.mappedType, type.constraintType), readonlyMask && indexInfo.isReadonly)] : ts2.emptyArray;
        var members = ts2.createSymbolTable();
        for (var _i = 0, _a = getPropertiesOfType(type.source); _i < _a.length; _i++) {
          var prop = _a[_i];
          var checkFlags = 8192 | (readonlyMask && isReadonlySymbol(prop) ? 8 : 0);
          var inferredProp = createSymbol(4 | prop.flags & optionalMask, prop.escapedName, checkFlags);
          inferredProp.declarations = prop.declarations;
          inferredProp.nameType = getSymbolLinks(prop).nameType;
          inferredProp.propertyType = getTypeOfSymbol(prop);
          if (type.constraintType.type.flags & 8388608 && type.constraintType.type.objectType.flags & 262144 && type.constraintType.type.indexType.flags & 262144) {
            var newTypeParam = type.constraintType.type.objectType;
            var newMappedType = replaceIndexedAccess(type.mappedType, type.constraintType.type, newTypeParam);
            inferredProp.mappedType = newMappedType;
            inferredProp.constraintType = getIndexType(newTypeParam);
          } else {
            inferredProp.mappedType = type.mappedType;
            inferredProp.constraintType = type.constraintType;
          }
          members.set(prop.escapedName, inferredProp);
        }
        setStructuredTypeMembers(type, members, ts2.emptyArray, ts2.emptyArray, indexInfos);
      }
      function getLowerBoundOfKeyType(type) {
        if (type.flags & 4194304) {
          var t = getApparentType(type.type);
          return isGenericTupleType(t) ? getKnownKeysOfTupleType(t) : getIndexType(t);
        }
        if (type.flags & 16777216) {
          if (type.root.isDistributive) {
            var checkType = type.checkType;
            var constraint = getLowerBoundOfKeyType(checkType);
            if (constraint !== checkType) {
              return getConditionalTypeInstantiation(type, prependTypeMapping(type.root.checkType, constraint, type.mapper));
            }
          }
          return type;
        }
        if (type.flags & 1048576) {
          return mapType(type, getLowerBoundOfKeyType);
        }
        if (type.flags & 2097152) {
          return getIntersectionType(ts2.sameMap(type.types, getLowerBoundOfKeyType));
        }
        return type;
      }
      function getIsLateCheckFlag(s) {
        return ts2.getCheckFlags(s) & 4096;
      }
      function forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType(type, include, stringsOnly, cb) {
        for (var _i = 0, _a = getPropertiesOfType(type); _i < _a.length; _i++) {
          var prop = _a[_i];
          cb(getLiteralTypeFromProperty(prop, include));
        }
        if (type.flags & 1) {
          cb(stringType);
        } else {
          for (var _b = 0, _c = getIndexInfosOfType(type); _b < _c.length; _b++) {
            var info = _c[_b];
            if (!stringsOnly || info.keyType.flags & (4 | 134217728)) {
              cb(info.keyType);
            }
          }
        }
      }
      function resolveMappedTypeMembers(type) {
        var members = ts2.createSymbolTable();
        var indexInfos;
        setStructuredTypeMembers(type, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
        var typeParameter = getTypeParameterFromMappedType(type);
        var constraintType = getConstraintTypeFromMappedType(type);
        var nameType = getNameTypeFromMappedType(type.target || type);
        var templateType = getTemplateTypeFromMappedType(type.target || type);
        var modifiersType = getApparentType(getModifiersTypeFromMappedType(type));
        var templateModifiers = getMappedTypeModifiers(type);
        var include = keyofStringsOnly ? 128 : 8576;
        if (isMappedTypeWithKeyofConstraintDeclaration(type)) {
          forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType(modifiersType, include, keyofStringsOnly, addMemberForKeyType);
        } else {
          forEachType(getLowerBoundOfKeyType(constraintType), addMemberForKeyType);
        }
        setStructuredTypeMembers(type, members, ts2.emptyArray, ts2.emptyArray, indexInfos || ts2.emptyArray);
        function addMemberForKeyType(keyType) {
          var propNameType = nameType ? instantiateType(nameType, appendTypeMapping(type.mapper, typeParameter, keyType)) : keyType;
          forEachType(propNameType, function(t) {
            return addMemberForKeyTypeWorker(keyType, t);
          });
        }
        function addMemberForKeyTypeWorker(keyType, propNameType) {
          if (isTypeUsableAsPropertyName(propNameType)) {
            var propName = getPropertyNameFromType(propNameType);
            var existingProp = members.get(propName);
            if (existingProp) {
              existingProp.nameType = getUnionType([existingProp.nameType, propNameType]);
              existingProp.keyType = getUnionType([existingProp.keyType, keyType]);
            } else {
              var modifiersProp = isTypeUsableAsPropertyName(keyType) ? getPropertyOfType(modifiersType, getPropertyNameFromType(keyType)) : void 0;
              var isOptional = !!(templateModifiers & 4 || !(templateModifiers & 8) && modifiersProp && modifiersProp.flags & 16777216);
              var isReadonly = !!(templateModifiers & 1 || !(templateModifiers & 2) && modifiersProp && isReadonlySymbol(modifiersProp));
              var stripOptional = strictNullChecks && !isOptional && modifiersProp && modifiersProp.flags & 16777216;
              var lateFlag = modifiersProp ? getIsLateCheckFlag(modifiersProp) : 0;
              var prop = createSymbol(4 | (isOptional ? 16777216 : 0), propName, lateFlag | 262144 | (isReadonly ? 8 : 0) | (stripOptional ? 524288 : 0));
              prop.mappedType = type;
              prop.nameType = propNameType;
              prop.keyType = keyType;
              if (modifiersProp) {
                prop.syntheticOrigin = modifiersProp;
                prop.declarations = nameType ? void 0 : modifiersProp.declarations;
              }
              members.set(propName, prop);
            }
          } else if (isValidIndexKeyType(propNameType) || propNameType.flags & (1 | 32)) {
            var indexKeyType = propNameType.flags & (1 | 4) ? stringType : propNameType.flags & (8 | 32) ? numberType : propNameType;
            var propType = instantiateType(templateType, appendTypeMapping(type.mapper, typeParameter, keyType));
            var indexInfo = createIndexInfo(indexKeyType, propType, !!(templateModifiers & 1));
            indexInfos = appendIndexInfo(indexInfos, indexInfo, true);
          }
        }
      }
      function getTypeOfMappedSymbol(symbol) {
        if (!symbol.type) {
          var mappedType = symbol.mappedType;
          if (!pushTypeResolution(symbol, 0)) {
            mappedType.containsError = true;
            return errorType;
          }
          var templateType = getTemplateTypeFromMappedType(mappedType.target || mappedType);
          var mapper = appendTypeMapping(mappedType.mapper, getTypeParameterFromMappedType(mappedType), symbol.keyType);
          var propType = instantiateType(templateType, mapper);
          var type = strictNullChecks && symbol.flags & 16777216 && !maybeTypeOfKind(propType, 32768 | 16384) ? getOptionalType(propType, true) : symbol.checkFlags & 524288 ? removeMissingOrUndefinedType(propType) : propType;
          if (!popTypeResolution()) {
            error(currentNode, ts2.Diagnostics.Type_of_property_0_circularly_references_itself_in_mapped_type_1, symbolToString(symbol), typeToString(mappedType));
            type = errorType;
          }
          symbol.type = type;
        }
        return symbol.type;
      }
      function getTypeParameterFromMappedType(type) {
        return type.typeParameter || (type.typeParameter = getDeclaredTypeOfTypeParameter(getSymbolOfNode(type.declaration.typeParameter)));
      }
      function getConstraintTypeFromMappedType(type) {
        return type.constraintType || (type.constraintType = getConstraintOfTypeParameter(getTypeParameterFromMappedType(type)) || errorType);
      }
      function getNameTypeFromMappedType(type) {
        return type.declaration.nameType ? type.nameType || (type.nameType = instantiateType(getTypeFromTypeNode(type.declaration.nameType), type.mapper)) : void 0;
      }
      function getTemplateTypeFromMappedType(type) {
        return type.templateType || (type.templateType = type.declaration.type ? instantiateType(addOptionality(getTypeFromTypeNode(type.declaration.type), true, !!(getMappedTypeModifiers(type) & 4)), type.mapper) : errorType);
      }
      function getConstraintDeclarationForMappedType(type) {
        return ts2.getEffectiveConstraintOfTypeParameter(type.declaration.typeParameter);
      }
      function isMappedTypeWithKeyofConstraintDeclaration(type) {
        var constraintDeclaration = getConstraintDeclarationForMappedType(type);
        return constraintDeclaration.kind === 192 && constraintDeclaration.operator === 140;
      }
      function getModifiersTypeFromMappedType(type) {
        if (!type.modifiersType) {
          if (isMappedTypeWithKeyofConstraintDeclaration(type)) {
            type.modifiersType = instantiateType(getTypeFromTypeNode(getConstraintDeclarationForMappedType(type).type), type.mapper);
          } else {
            var declaredType = getTypeFromMappedTypeNode(type.declaration);
            var constraint = getConstraintTypeFromMappedType(declaredType);
            var extendedConstraint = constraint && constraint.flags & 262144 ? getConstraintOfTypeParameter(constraint) : constraint;
            type.modifiersType = extendedConstraint && extendedConstraint.flags & 4194304 ? instantiateType(extendedConstraint.type, type.mapper) : unknownType;
          }
        }
        return type.modifiersType;
      }
      function getMappedTypeModifiers(type) {
        var declaration = type.declaration;
        return (declaration.readonlyToken ? declaration.readonlyToken.kind === 40 ? 2 : 1 : 0) | (declaration.questionToken ? declaration.questionToken.kind === 40 ? 8 : 4 : 0);
      }
      function getMappedTypeOptionality(type) {
        var modifiers = getMappedTypeModifiers(type);
        return modifiers & 8 ? -1 : modifiers & 4 ? 1 : 0;
      }
      function getCombinedMappedTypeOptionality(type) {
        var optionality = getMappedTypeOptionality(type);
        var modifiersType = getModifiersTypeFromMappedType(type);
        return optionality || (isGenericMappedType(modifiersType) ? getMappedTypeOptionality(modifiersType) : 0);
      }
      function isPartialMappedType(type) {
        return !!(ts2.getObjectFlags(type) & 32 && getMappedTypeModifiers(type) & 4);
      }
      function isGenericMappedType(type) {
        return !!(ts2.getObjectFlags(type) & 32) && isGenericIndexType(getConstraintTypeFromMappedType(type));
      }
      function resolveStructuredTypeMembers(type) {
        if (!type.members) {
          if (type.flags & 524288) {
            if (type.objectFlags & 4) {
              resolveTypeReferenceMembers(type);
            } else if (type.objectFlags & 3) {
              resolveClassOrInterfaceMembers(type);
            } else if (type.objectFlags & 1024) {
              resolveReverseMappedTypeMembers(type);
            } else if (type.objectFlags & 16) {
              resolveAnonymousTypeMembers(type);
            } else if (type.objectFlags & 32) {
              resolveMappedTypeMembers(type);
            }
          } else if (type.flags & 1048576) {
            resolveUnionTypeMembers(type);
          } else if (type.flags & 2097152) {
            resolveIntersectionTypeMembers(type);
          }
        }
        return type;
      }
      function getPropertiesOfObjectType(type) {
        if (type.flags & 524288) {
          return resolveStructuredTypeMembers(type).properties;
        }
        return ts2.emptyArray;
      }
      function getPropertyOfObjectType(type, name) {
        if (type.flags & 524288) {
          var resolved = resolveStructuredTypeMembers(type);
          var symbol = resolved.members.get(name);
          if (symbol && symbolIsValue(symbol)) {
            return symbol;
          }
        }
      }
      function getPropertiesOfUnionOrIntersectionType(type) {
        if (!type.resolvedProperties) {
          var members = ts2.createSymbolTable();
          for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
            var current = _a[_i];
            for (var _b = 0, _c = getPropertiesOfType(current); _b < _c.length; _b++) {
              var prop = _c[_b];
              if (!members.has(prop.escapedName)) {
                var combinedProp = getPropertyOfUnionOrIntersectionType(type, prop.escapedName);
                if (combinedProp) {
                  members.set(prop.escapedName, combinedProp);
                }
              }
            }
            if (type.flags & 1048576 && getIndexInfosOfType(current).length === 0) {
              break;
            }
          }
          type.resolvedProperties = getNamedMembers(members);
        }
        return type.resolvedProperties;
      }
      function getPropertiesOfType(type) {
        type = getReducedApparentType(type);
        return type.flags & 3145728 ? getPropertiesOfUnionOrIntersectionType(type) : getPropertiesOfObjectType(type);
      }
      function forEachPropertyOfType(type, action) {
        type = getReducedApparentType(type);
        if (type.flags & 3670016) {
          resolveStructuredTypeMembers(type).members.forEach(function(symbol, escapedName) {
            if (isNamedMember(symbol, escapedName)) {
              action(symbol, escapedName);
            }
          });
        }
      }
      function isTypeInvalidDueToUnionDiscriminant(contextualType, obj) {
        var list = obj.properties;
        return list.some(function(property) {
          var nameType = property.name && getLiteralTypeFromPropertyName(property.name);
          var name = nameType && isTypeUsableAsPropertyName(nameType) ? getPropertyNameFromType(nameType) : void 0;
          var expected = name === void 0 ? void 0 : getTypeOfPropertyOfType(contextualType, name);
          return !!expected && isLiteralType(expected) && !isTypeAssignableTo(getTypeOfNode(property), expected);
        });
      }
      function getAllPossiblePropertiesOfTypes(types) {
        var unionType = getUnionType(types);
        if (!(unionType.flags & 1048576)) {
          return getAugmentedPropertiesOfType(unionType);
        }
        var props = ts2.createSymbolTable();
        for (var _i = 0, types_4 = types; _i < types_4.length; _i++) {
          var memberType = types_4[_i];
          for (var _a = 0, _b = getAugmentedPropertiesOfType(memberType); _a < _b.length; _a++) {
            var escapedName = _b[_a].escapedName;
            if (!props.has(escapedName)) {
              var prop = createUnionOrIntersectionProperty(unionType, escapedName);
              if (prop)
                props.set(escapedName, prop);
            }
          }
        }
        return ts2.arrayFrom(props.values());
      }
      function getConstraintOfType(type) {
        return type.flags & 262144 ? getConstraintOfTypeParameter(type) : type.flags & 8388608 ? getConstraintOfIndexedAccess(type) : type.flags & 16777216 ? getConstraintOfConditionalType(type) : getBaseConstraintOfType(type);
      }
      function getConstraintOfTypeParameter(typeParameter) {
        return hasNonCircularBaseConstraint(typeParameter) ? getConstraintFromTypeParameter(typeParameter) : void 0;
      }
      function getConstraintOfIndexedAccess(type) {
        return hasNonCircularBaseConstraint(type) ? getConstraintFromIndexedAccess(type) : void 0;
      }
      function getSimplifiedTypeOrConstraint(type) {
        var simplified = getSimplifiedType(type, false);
        return simplified !== type ? simplified : getConstraintOfType(type);
      }
      function getConstraintFromIndexedAccess(type) {
        var indexConstraint = getSimplifiedTypeOrConstraint(type.indexType);
        if (indexConstraint && indexConstraint !== type.indexType) {
          var indexedAccess = getIndexedAccessTypeOrUndefined(type.objectType, indexConstraint, type.accessFlags);
          if (indexedAccess) {
            return indexedAccess;
          }
        }
        var objectConstraint = getSimplifiedTypeOrConstraint(type.objectType);
        if (objectConstraint && objectConstraint !== type.objectType) {
          return getIndexedAccessTypeOrUndefined(objectConstraint, type.indexType, type.accessFlags);
        }
        return void 0;
      }
      function getDefaultConstraintOfConditionalType(type) {
        if (!type.resolvedDefaultConstraint) {
          var trueConstraint = getInferredTrueTypeFromConditionalType(type);
          var falseConstraint = getFalseTypeFromConditionalType(type);
          type.resolvedDefaultConstraint = isTypeAny(trueConstraint) ? falseConstraint : isTypeAny(falseConstraint) ? trueConstraint : getUnionType([trueConstraint, falseConstraint]);
        }
        return type.resolvedDefaultConstraint;
      }
      function getConstraintOfDistributiveConditionalType(type) {
        if (type.root.isDistributive && type.restrictiveInstantiation !== type) {
          var simplified = getSimplifiedType(type.checkType, false);
          var constraint = simplified === type.checkType ? getConstraintOfType(simplified) : simplified;
          if (constraint && constraint !== type.checkType) {
            var instantiated = getConditionalTypeInstantiation(type, prependTypeMapping(type.root.checkType, constraint, type.mapper));
            if (!(instantiated.flags & 131072)) {
              return instantiated;
            }
          }
        }
        return void 0;
      }
      function getConstraintFromConditionalType(type) {
        return getConstraintOfDistributiveConditionalType(type) || getDefaultConstraintOfConditionalType(type);
      }
      function getConstraintOfConditionalType(type) {
        return hasNonCircularBaseConstraint(type) ? getConstraintFromConditionalType(type) : void 0;
      }
      function getEffectiveConstraintOfIntersection(types, targetIsUnion) {
        var constraints;
        var hasDisjointDomainType = false;
        for (var _i = 0, types_5 = types; _i < types_5.length; _i++) {
          var t = types_5[_i];
          if (t.flags & 465829888) {
            var constraint = getConstraintOfType(t);
            while (constraint && constraint.flags & (262144 | 4194304 | 16777216)) {
              constraint = getConstraintOfType(constraint);
            }
            if (constraint) {
              constraints = ts2.append(constraints, constraint);
              if (targetIsUnion) {
                constraints = ts2.append(constraints, t);
              }
            }
          } else if (t.flags & 469892092) {
            hasDisjointDomainType = true;
          }
        }
        if (constraints && (targetIsUnion || hasDisjointDomainType)) {
          if (hasDisjointDomainType) {
            for (var _a = 0, types_6 = types; _a < types_6.length; _a++) {
              var t = types_6[_a];
              if (t.flags & 469892092) {
                constraints = ts2.append(constraints, t);
              }
            }
          }
          return getIntersectionType(constraints);
        }
        return void 0;
      }
      function getBaseConstraintOfType(type) {
        if (type.flags & (58982400 | 3145728 | 134217728 | 268435456)) {
          var constraint = getResolvedBaseConstraint(type);
          return constraint !== noConstraintType && constraint !== circularConstraintType ? constraint : void 0;
        }
        return type.flags & 4194304 ? keyofConstraintType : void 0;
      }
      function getBaseConstraintOrType(type) {
        return getBaseConstraintOfType(type) || type;
      }
      function hasNonCircularBaseConstraint(type) {
        return getResolvedBaseConstraint(type) !== circularConstraintType;
      }
      function getResolvedBaseConstraint(type) {
        if (type.resolvedBaseConstraint) {
          return type.resolvedBaseConstraint;
        }
        var stack = [];
        return type.resolvedBaseConstraint = getTypeWithThisArgument(getImmediateBaseConstraint(type), type);
        function getImmediateBaseConstraint(t) {
          if (!t.immediateBaseConstraint) {
            if (!pushTypeResolution(t, 4)) {
              return circularConstraintType;
            }
            var result = void 0;
            if (stack.length < 10 || stack.length < 50 && !isDeeplyNestedType(t, stack, stack.length)) {
              stack.push(t);
              result = computeBaseConstraint(getSimplifiedType(t, false));
              stack.pop();
            }
            if (!popTypeResolution()) {
              if (t.flags & 262144) {
                var errorNode = getConstraintDeclaration(t);
                if (errorNode) {
                  var diagnostic = error(errorNode, ts2.Diagnostics.Type_parameter_0_has_a_circular_constraint, typeToString(t));
                  if (currentNode && !ts2.isNodeDescendantOf(errorNode, currentNode) && !ts2.isNodeDescendantOf(currentNode, errorNode)) {
                    ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(currentNode, ts2.Diagnostics.Circularity_originates_in_type_at_this_location));
                  }
                }
              }
              result = circularConstraintType;
            }
            t.immediateBaseConstraint = result || noConstraintType;
          }
          return t.immediateBaseConstraint;
        }
        function getBaseConstraint(t) {
          var c = getImmediateBaseConstraint(t);
          return c !== noConstraintType && c !== circularConstraintType ? c : void 0;
        }
        function computeBaseConstraint(t) {
          if (t.flags & 262144) {
            var constraint = getConstraintFromTypeParameter(t);
            return t.isThisType || !constraint ? constraint : getBaseConstraint(constraint);
          }
          if (t.flags & 3145728) {
            var types = t.types;
            var baseTypes = [];
            var different = false;
            for (var _i = 0, types_7 = types; _i < types_7.length; _i++) {
              var type_3 = types_7[_i];
              var baseType = getBaseConstraint(type_3);
              if (baseType) {
                if (baseType !== type_3) {
                  different = true;
                }
                baseTypes.push(baseType);
              } else {
                different = true;
              }
            }
            if (!different) {
              return t;
            }
            return t.flags & 1048576 && baseTypes.length === types.length ? getUnionType(baseTypes) : t.flags & 2097152 && baseTypes.length ? getIntersectionType(baseTypes) : void 0;
          }
          if (t.flags & 4194304) {
            return keyofConstraintType;
          }
          if (t.flags & 134217728) {
            var types = t.types;
            var constraints = ts2.mapDefined(types, getBaseConstraint);
            return constraints.length === types.length ? getTemplateLiteralType(t.texts, constraints) : stringType;
          }
          if (t.flags & 268435456) {
            var constraint = getBaseConstraint(t.type);
            return constraint ? getStringMappingType(t.symbol, constraint) : stringType;
          }
          if (t.flags & 8388608) {
            var baseObjectType = getBaseConstraint(t.objectType);
            var baseIndexType = getBaseConstraint(t.indexType);
            var baseIndexedAccess = baseObjectType && baseIndexType && getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType, t.accessFlags);
            return baseIndexedAccess && getBaseConstraint(baseIndexedAccess);
          }
          if (t.flags & 16777216) {
            var constraint = getConstraintFromConditionalType(t);
            return constraint && getBaseConstraint(constraint);
          }
          if (t.flags & 33554432) {
            return getBaseConstraint(t.substitute);
          }
          return t;
        }
      }
      function getApparentTypeOfIntersectionType(type) {
        return type.resolvedApparentType || (type.resolvedApparentType = getTypeWithThisArgument(type, type, true));
      }
      function getResolvedTypeParameterDefault(typeParameter) {
        if (!typeParameter.default) {
          if (typeParameter.target) {
            var targetDefault = getResolvedTypeParameterDefault(typeParameter.target);
            typeParameter.default = targetDefault ? instantiateType(targetDefault, typeParameter.mapper) : noConstraintType;
          } else {
            typeParameter.default = resolvingDefaultType;
            var defaultDeclaration = typeParameter.symbol && ts2.forEach(typeParameter.symbol.declarations, function(decl) {
              return ts2.isTypeParameterDeclaration(decl) && decl.default;
            });
            var defaultType = defaultDeclaration ? getTypeFromTypeNode(defaultDeclaration) : noConstraintType;
            if (typeParameter.default === resolvingDefaultType) {
              typeParameter.default = defaultType;
            }
          }
        } else if (typeParameter.default === resolvingDefaultType) {
          typeParameter.default = circularConstraintType;
        }
        return typeParameter.default;
      }
      function getDefaultFromTypeParameter(typeParameter) {
        var defaultType = getResolvedTypeParameterDefault(typeParameter);
        return defaultType !== noConstraintType && defaultType !== circularConstraintType ? defaultType : void 0;
      }
      function hasNonCircularTypeParameterDefault(typeParameter) {
        return getResolvedTypeParameterDefault(typeParameter) !== circularConstraintType;
      }
      function hasTypeParameterDefault(typeParameter) {
        return !!(typeParameter.symbol && ts2.forEach(typeParameter.symbol.declarations, function(decl) {
          return ts2.isTypeParameterDeclaration(decl) && decl.default;
        }));
      }
      function getApparentTypeOfMappedType(type) {
        return type.resolvedApparentType || (type.resolvedApparentType = getResolvedApparentTypeOfMappedType(type));
      }
      function getResolvedApparentTypeOfMappedType(type) {
        var typeVariable = getHomomorphicTypeVariable(type);
        if (typeVariable && !type.declaration.nameType) {
          var constraint = getConstraintOfTypeParameter(typeVariable);
          if (constraint && (isArrayType(constraint) || isTupleType(constraint))) {
            return instantiateType(type, prependTypeMapping(typeVariable, constraint, type.mapper));
          }
        }
        return type;
      }
      function getApparentType(type) {
        var t = type.flags & 465829888 ? getBaseConstraintOfType(type) || unknownType : type;
        return ts2.getObjectFlags(t) & 32 ? getApparentTypeOfMappedType(t) : t.flags & 2097152 ? getApparentTypeOfIntersectionType(t) : t.flags & 402653316 ? globalStringType : t.flags & 296 ? globalNumberType : t.flags & 2112 ? getGlobalBigIntType(languageVersion >= 7) : t.flags & 528 ? globalBooleanType : t.flags & 12288 ? getGlobalESSymbolType(languageVersion >= 2) : t.flags & 67108864 ? emptyObjectType : t.flags & 4194304 ? keyofConstraintType : t.flags & 2 && !strictNullChecks ? emptyObjectType : t;
      }
      function getReducedApparentType(type) {
        return getReducedType(getApparentType(getReducedType(type)));
      }
      function createUnionOrIntersectionProperty(containingType, name, skipObjectFunctionPropertyAugment) {
        var _a, _b;
        var singleProp;
        var propSet;
        var indexTypes;
        var isUnion = containingType.flags & 1048576;
        var optionalFlag = isUnion ? 0 : 16777216;
        var syntheticFlag = 4;
        var checkFlags = isUnion ? 0 : 8;
        var mergedInstantiations = false;
        for (var _i = 0, _c = containingType.types; _i < _c.length; _i++) {
          var current = _c[_i];
          var type = getApparentType(current);
          if (!(isErrorType(type) || type.flags & 131072)) {
            var prop = getPropertyOfType(type, name, skipObjectFunctionPropertyAugment);
            var modifiers = prop ? ts2.getDeclarationModifierFlagsFromSymbol(prop) : 0;
            if (prop) {
              if (isUnion) {
                optionalFlag |= prop.flags & 16777216;
              } else {
                optionalFlag &= prop.flags;
              }
              if (!singleProp) {
                singleProp = prop;
              } else if (prop !== singleProp) {
                var isInstantiation = (getTargetSymbol(prop) || prop) === (getTargetSymbol(singleProp) || singleProp);
                if (isInstantiation && compareProperties(singleProp, prop, function(a, b) {
                  return a === b ? -1 : 0;
                }) === -1) {
                  mergedInstantiations = !!singleProp.parent && !!ts2.length(getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(singleProp.parent));
                } else {
                  if (!propSet) {
                    propSet = new ts2.Map();
                    propSet.set(getSymbolId(singleProp), singleProp);
                  }
                  var id = getSymbolId(prop);
                  if (!propSet.has(id)) {
                    propSet.set(id, prop);
                  }
                }
              }
              if (isUnion && isReadonlySymbol(prop)) {
                checkFlags |= 8;
              } else if (!isUnion && !isReadonlySymbol(prop)) {
                checkFlags &= ~8;
              }
              checkFlags |= (!(modifiers & 24) ? 256 : 0) | (modifiers & 16 ? 512 : 0) | (modifiers & 8 ? 1024 : 0) | (modifiers & 32 ? 2048 : 0);
              if (!isPrototypeProperty(prop)) {
                syntheticFlag = 2;
              }
            } else if (isUnion) {
              var indexInfo = !isLateBoundName(name) && getApplicableIndexInfoForName(type, name);
              if (indexInfo) {
                checkFlags |= 32 | (indexInfo.isReadonly ? 8 : 0);
                indexTypes = ts2.append(indexTypes, isTupleType(type) ? getRestTypeOfTupleType(type) || undefinedType : indexInfo.type);
              } else if (isObjectLiteralType(type) && !(ts2.getObjectFlags(type) & 4194304)) {
                checkFlags |= 32;
                indexTypes = ts2.append(indexTypes, undefinedType);
              } else {
                checkFlags |= 16;
              }
            }
          }
        }
        if (!singleProp || isUnion && (propSet || checkFlags & 48) && checkFlags & (1024 | 512)) {
          return void 0;
        }
        if (!propSet && !(checkFlags & 16) && !indexTypes) {
          if (mergedInstantiations) {
            var clone_1 = createSymbolWithType(singleProp, singleProp.type);
            clone_1.parent = (_b = (_a = singleProp.valueDeclaration) === null || _a === void 0 ? void 0 : _a.symbol) === null || _b === void 0 ? void 0 : _b.parent;
            clone_1.containingType = containingType;
            clone_1.mapper = singleProp.mapper;
            return clone_1;
          } else {
            return singleProp;
          }
        }
        var props = propSet ? ts2.arrayFrom(propSet.values()) : [singleProp];
        var declarations;
        var firstType;
        var nameType;
        var propTypes = [];
        var firstValueDeclaration;
        var hasNonUniformValueDeclaration = false;
        for (var _d = 0, props_1 = props; _d < props_1.length; _d++) {
          var prop = props_1[_d];
          if (!firstValueDeclaration) {
            firstValueDeclaration = prop.valueDeclaration;
          } else if (prop.valueDeclaration && prop.valueDeclaration !== firstValueDeclaration) {
            hasNonUniformValueDeclaration = true;
          }
          declarations = ts2.addRange(declarations, prop.declarations);
          var type = getTypeOfSymbol(prop);
          if (!firstType) {
            firstType = type;
            nameType = getSymbolLinks(prop).nameType;
          } else if (type !== firstType) {
            checkFlags |= 64;
          }
          if (isLiteralType(type) || isPatternLiteralType(type)) {
            checkFlags |= 128;
          }
          if (type.flags & 131072) {
            checkFlags |= 131072;
          }
          propTypes.push(type);
        }
        ts2.addRange(propTypes, indexTypes);
        var result = createSymbol(4 | optionalFlag, name, syntheticFlag | checkFlags);
        result.containingType = containingType;
        if (!hasNonUniformValueDeclaration && firstValueDeclaration) {
          result.valueDeclaration = firstValueDeclaration;
          if (firstValueDeclaration.symbol.parent) {
            result.parent = firstValueDeclaration.symbol.parent;
          }
        }
        result.declarations = declarations;
        result.nameType = nameType;
        if (propTypes.length > 2) {
          result.checkFlags |= 65536;
          result.deferralParent = containingType;
          result.deferralConstituents = propTypes;
        } else {
          result.type = isUnion ? getUnionType(propTypes) : getIntersectionType(propTypes);
        }
        return result;
      }
      function getUnionOrIntersectionProperty(type, name, skipObjectFunctionPropertyAugment) {
        var _a, _b;
        var property = ((_a = type.propertyCacheWithoutObjectFunctionPropertyAugment) === null || _a === void 0 ? void 0 : _a.get(name)) || !skipObjectFunctionPropertyAugment ? (_b = type.propertyCache) === null || _b === void 0 ? void 0 : _b.get(name) : void 0;
        if (!property) {
          property = createUnionOrIntersectionProperty(type, name, skipObjectFunctionPropertyAugment);
          if (property) {
            var properties = skipObjectFunctionPropertyAugment ? type.propertyCacheWithoutObjectFunctionPropertyAugment || (type.propertyCacheWithoutObjectFunctionPropertyAugment = ts2.createSymbolTable()) : type.propertyCache || (type.propertyCache = ts2.createSymbolTable());
            properties.set(name, property);
          }
        }
        return property;
      }
      function getPropertyOfUnionOrIntersectionType(type, name, skipObjectFunctionPropertyAugment) {
        var property = getUnionOrIntersectionProperty(type, name, skipObjectFunctionPropertyAugment);
        return property && !(ts2.getCheckFlags(property) & 16) ? property : void 0;
      }
      function getReducedType(type) {
        if (type.flags & 1048576 && type.objectFlags & 33554432) {
          return type.resolvedReducedType || (type.resolvedReducedType = getReducedUnionType(type));
        } else if (type.flags & 2097152) {
          if (!(type.objectFlags & 33554432)) {
            type.objectFlags |= 33554432 | (ts2.some(getPropertiesOfUnionOrIntersectionType(type), isNeverReducedProperty) ? 67108864 : 0);
          }
          return type.objectFlags & 67108864 ? neverType : type;
        }
        return type;
      }
      function getReducedUnionType(unionType) {
        var reducedTypes = ts2.sameMap(unionType.types, getReducedType);
        if (reducedTypes === unionType.types) {
          return unionType;
        }
        var reduced = getUnionType(reducedTypes);
        if (reduced.flags & 1048576) {
          reduced.resolvedReducedType = reduced;
        }
        return reduced;
      }
      function isNeverReducedProperty(prop) {
        return isDiscriminantWithNeverType(prop) || isConflictingPrivateProperty(prop);
      }
      function isDiscriminantWithNeverType(prop) {
        return !(prop.flags & 16777216) && (ts2.getCheckFlags(prop) & (192 | 131072)) === 192 && !!(getTypeOfSymbol(prop).flags & 131072);
      }
      function isConflictingPrivateProperty(prop) {
        return !prop.valueDeclaration && !!(ts2.getCheckFlags(prop) & 1024);
      }
      function elaborateNeverIntersection(errorInfo, type) {
        if (type.flags & 2097152 && ts2.getObjectFlags(type) & 67108864) {
          var neverProp = ts2.find(getPropertiesOfUnionOrIntersectionType(type), isDiscriminantWithNeverType);
          if (neverProp) {
            return ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.The_intersection_0_was_reduced_to_never_because_property_1_has_conflicting_types_in_some_constituents, typeToString(type, void 0, 536870912), symbolToString(neverProp));
          }
          var privateProp = ts2.find(getPropertiesOfUnionOrIntersectionType(type), isConflictingPrivateProperty);
          if (privateProp) {
            return ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.The_intersection_0_was_reduced_to_never_because_property_1_exists_in_multiple_constituents_and_is_private_in_some, typeToString(type, void 0, 536870912), symbolToString(privateProp));
          }
        }
        return errorInfo;
      }
      function getPropertyOfType(type, name, skipObjectFunctionPropertyAugment) {
        type = getReducedApparentType(type);
        if (type.flags & 524288) {
          var resolved = resolveStructuredTypeMembers(type);
          var symbol = resolved.members.get(name);
          if (symbol && symbolIsValue(symbol)) {
            return symbol;
          }
          if (skipObjectFunctionPropertyAugment)
            return void 0;
          var functionType = resolved === anyFunctionType ? globalFunctionType : resolved.callSignatures.length ? globalCallableFunctionType : resolved.constructSignatures.length ? globalNewableFunctionType : void 0;
          if (functionType) {
            var symbol_1 = getPropertyOfObjectType(functionType, name);
            if (symbol_1) {
              return symbol_1;
            }
          }
          return getPropertyOfObjectType(globalObjectType, name);
        }
        if (type.flags & 3145728) {
          return getPropertyOfUnionOrIntersectionType(type, name, skipObjectFunctionPropertyAugment);
        }
        return void 0;
      }
      function getSignaturesOfStructuredType(type, kind) {
        if (type.flags & 3670016) {
          var resolved = resolveStructuredTypeMembers(type);
          return kind === 0 ? resolved.callSignatures : resolved.constructSignatures;
        }
        return ts2.emptyArray;
      }
      function getSignaturesOfType(type, kind) {
        return getSignaturesOfStructuredType(getReducedApparentType(type), kind);
      }
      function findIndexInfo(indexInfos, keyType) {
        return ts2.find(indexInfos, function(info) {
          return info.keyType === keyType;
        });
      }
      function findApplicableIndexInfo(indexInfos, keyType) {
        var stringIndexInfo;
        var applicableInfo;
        var applicableInfos;
        for (var _i = 0, indexInfos_1 = indexInfos; _i < indexInfos_1.length; _i++) {
          var info = indexInfos_1[_i];
          if (info.keyType === stringType) {
            stringIndexInfo = info;
          } else if (isApplicableIndexType(keyType, info.keyType)) {
            if (!applicableInfo) {
              applicableInfo = info;
            } else {
              (applicableInfos || (applicableInfos = [applicableInfo])).push(info);
            }
          }
        }
        return applicableInfos ? createIndexInfo(unknownType, getIntersectionType(ts2.map(applicableInfos, function(info2) {
          return info2.type;
        })), ts2.reduceLeft(applicableInfos, function(isReadonly, info2) {
          return isReadonly && info2.isReadonly;
        }, true)) : applicableInfo ? applicableInfo : stringIndexInfo && isApplicableIndexType(keyType, stringType) ? stringIndexInfo : void 0;
      }
      function isApplicableIndexType(source, target) {
        return isTypeAssignableTo(source, target) || target === stringType && isTypeAssignableTo(source, numberType) || target === numberType && !!(source.flags & 128) && isNumericLiteralName(source.value);
      }
      function getIndexInfosOfStructuredType(type) {
        if (type.flags & 3670016) {
          var resolved = resolveStructuredTypeMembers(type);
          return resolved.indexInfos;
        }
        return ts2.emptyArray;
      }
      function getIndexInfosOfType(type) {
        return getIndexInfosOfStructuredType(getReducedApparentType(type));
      }
      function getIndexInfoOfType(type, keyType) {
        return findIndexInfo(getIndexInfosOfType(type), keyType);
      }
      function getIndexTypeOfType(type, keyType) {
        var _a;
        return (_a = getIndexInfoOfType(type, keyType)) === null || _a === void 0 ? void 0 : _a.type;
      }
      function getApplicableIndexInfos(type, keyType) {
        return getIndexInfosOfType(type).filter(function(info) {
          return isApplicableIndexType(keyType, info.keyType);
        });
      }
      function getApplicableIndexInfo(type, keyType) {
        return findApplicableIndexInfo(getIndexInfosOfType(type), keyType);
      }
      function getApplicableIndexInfoForName(type, name) {
        return getApplicableIndexInfo(type, isLateBoundName(name) ? esSymbolType : getStringLiteralType(ts2.unescapeLeadingUnderscores(name)));
      }
      function getTypeParametersFromDeclaration(declaration) {
        var result;
        for (var _i = 0, _a = ts2.getEffectiveTypeParameterDeclarations(declaration); _i < _a.length; _i++) {
          var node = _a[_i];
          result = ts2.appendIfUnique(result, getDeclaredTypeOfTypeParameter(node.symbol));
        }
        return result;
      }
      function symbolsToArray(symbols) {
        var result = [];
        symbols.forEach(function(symbol, id) {
          if (!isReservedMemberName(id)) {
            result.push(symbol);
          }
        });
        return result;
      }
      function isJSDocOptionalParameter(node) {
        return ts2.isInJSFile(node) && (node.type && node.type.kind === 314 || ts2.getJSDocParameterTags(node).some(function(_a) {
          var isBracketed = _a.isBracketed, typeExpression = _a.typeExpression;
          return isBracketed || !!typeExpression && typeExpression.type.kind === 314;
        }));
      }
      function tryFindAmbientModule(moduleName, withAugmentations) {
        if (ts2.isExternalModuleNameRelative(moduleName)) {
          return void 0;
        }
        var symbol = getSymbol(globals, '"' + moduleName + '"', 512);
        return symbol && withAugmentations ? getMergedSymbol(symbol) : symbol;
      }
      function isOptionalParameter(node) {
        if (ts2.hasQuestionToken(node) || isOptionalJSDocPropertyLikeTag(node) || isJSDocOptionalParameter(node)) {
          return true;
        }
        if (node.initializer) {
          var signature = getSignatureFromDeclaration(node.parent);
          var parameterIndex = node.parent.parameters.indexOf(node);
          ts2.Debug.assert(parameterIndex >= 0);
          return parameterIndex >= getMinArgumentCount(signature, 1 | 2);
        }
        var iife = ts2.getImmediatelyInvokedFunctionExpression(node.parent);
        if (iife) {
          return !node.type && !node.dotDotDotToken && node.parent.parameters.indexOf(node) >= iife.arguments.length;
        }
        return false;
      }
      function isOptionalPropertyDeclaration(node) {
        return ts2.isPropertyDeclaration(node) && node.questionToken;
      }
      function isOptionalJSDocPropertyLikeTag(node) {
        if (!ts2.isJSDocPropertyLikeTag(node)) {
          return false;
        }
        var isBracketed = node.isBracketed, typeExpression = node.typeExpression;
        return isBracketed || !!typeExpression && typeExpression.type.kind === 314;
      }
      function createTypePredicate(kind, parameterName, parameterIndex, type) {
        return { kind, parameterName, parameterIndex, type };
      }
      function getMinTypeArgumentCount(typeParameters) {
        var minTypeArgumentCount = 0;
        if (typeParameters) {
          for (var i = 0; i < typeParameters.length; i++) {
            if (!hasTypeParameterDefault(typeParameters[i])) {
              minTypeArgumentCount = i + 1;
            }
          }
        }
        return minTypeArgumentCount;
      }
      function fillMissingTypeArguments(typeArguments, typeParameters, minTypeArgumentCount, isJavaScriptImplicitAny) {
        var numTypeParameters = ts2.length(typeParameters);
        if (!numTypeParameters) {
          return [];
        }
        var numTypeArguments = ts2.length(typeArguments);
        if (isJavaScriptImplicitAny || numTypeArguments >= minTypeArgumentCount && numTypeArguments <= numTypeParameters) {
          var result = typeArguments ? typeArguments.slice() : [];
          for (var i = numTypeArguments; i < numTypeParameters; i++) {
            result[i] = errorType;
          }
          var baseDefaultType = getDefaultTypeArgumentType(isJavaScriptImplicitAny);
          for (var i = numTypeArguments; i < numTypeParameters; i++) {
            var defaultType = getDefaultFromTypeParameter(typeParameters[i]);
            if (isJavaScriptImplicitAny && defaultType && (isTypeIdenticalTo(defaultType, unknownType) || isTypeIdenticalTo(defaultType, emptyObjectType))) {
              defaultType = anyType;
            }
            result[i] = defaultType ? instantiateType(defaultType, createTypeMapper(typeParameters, result)) : baseDefaultType;
          }
          result.length = typeParameters.length;
          return result;
        }
        return typeArguments && typeArguments.slice();
      }
      function getSignatureFromDeclaration(declaration) {
        var links = getNodeLinks(declaration);
        if (!links.resolvedSignature) {
          var parameters = [];
          var flags = 0;
          var minArgumentCount = 0;
          var thisParameter = void 0;
          var hasThisParameter = false;
          var iife = ts2.getImmediatelyInvokedFunctionExpression(declaration);
          var isJSConstructSignature = ts2.isJSDocConstructSignature(declaration);
          var isUntypedSignatureInJSFile = !iife && ts2.isInJSFile(declaration) && ts2.isValueSignatureDeclaration(declaration) && !ts2.hasJSDocParameterTags(declaration) && !ts2.getJSDocType(declaration);
          if (isUntypedSignatureInJSFile) {
            flags |= 32;
          }
          for (var i = isJSConstructSignature ? 1 : 0; i < declaration.parameters.length; i++) {
            var param = declaration.parameters[i];
            var paramSymbol = param.symbol;
            var type = ts2.isJSDocParameterTag(param) ? param.typeExpression && param.typeExpression.type : param.type;
            if (paramSymbol && !!(paramSymbol.flags & 4) && !ts2.isBindingPattern(param.name)) {
              var resolvedSymbol = resolveName(param, paramSymbol.escapedName, 111551, void 0, void 0, false);
              paramSymbol = resolvedSymbol;
            }
            if (i === 0 && paramSymbol.escapedName === "this") {
              hasThisParameter = true;
              thisParameter = param.symbol;
            } else {
              parameters.push(paramSymbol);
            }
            if (type && type.kind === 195) {
              flags |= 2;
            }
            var isOptionalParameter_1 = isOptionalJSDocPropertyLikeTag(param) || param.initializer || param.questionToken || ts2.isRestParameter(param) || iife && parameters.length > iife.arguments.length && !type || isJSDocOptionalParameter(param);
            if (!isOptionalParameter_1) {
              minArgumentCount = parameters.length;
            }
          }
          if ((declaration.kind === 171 || declaration.kind === 172) && hasBindableName(declaration) && (!hasThisParameter || !thisParameter)) {
            var otherKind = declaration.kind === 171 ? 172 : 171;
            var other = ts2.getDeclarationOfKind(getSymbolOfNode(declaration), otherKind);
            if (other) {
              thisParameter = getAnnotatedAccessorThisParameter(other);
            }
          }
          var classType = declaration.kind === 170 ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol)) : void 0;
          var typeParameters = classType ? classType.localTypeParameters : getTypeParametersFromDeclaration(declaration);
          if (ts2.hasRestParameter(declaration) || ts2.isInJSFile(declaration) && maybeAddJsSyntheticRestParameter(declaration, parameters)) {
            flags |= 1;
          }
          if (ts2.isConstructorTypeNode(declaration) && ts2.hasSyntacticModifier(declaration, 128) || ts2.isConstructorDeclaration(declaration) && ts2.hasSyntacticModifier(declaration.parent, 128)) {
            flags |= 4;
          }
          links.resolvedSignature = createSignature(declaration, typeParameters, thisParameter, parameters, void 0, void 0, minArgumentCount, flags);
        }
        return links.resolvedSignature;
      }
      function maybeAddJsSyntheticRestParameter(declaration, parameters) {
        if (ts2.isJSDocSignature(declaration) || !containsArgumentsReference(declaration)) {
          return false;
        }
        var lastParam = ts2.lastOrUndefined(declaration.parameters);
        var lastParamTags = lastParam ? ts2.getJSDocParameterTags(lastParam) : ts2.getJSDocTags(declaration).filter(ts2.isJSDocParameterTag);
        var lastParamVariadicType = ts2.firstDefined(lastParamTags, function(p) {
          return p.typeExpression && ts2.isJSDocVariadicType(p.typeExpression.type) ? p.typeExpression.type : void 0;
        });
        var syntheticArgsSymbol = createSymbol(3, "args", 32768);
        syntheticArgsSymbol.type = lastParamVariadicType ? createArrayType(getTypeFromTypeNode(lastParamVariadicType.type)) : anyArrayType;
        if (lastParamVariadicType) {
          parameters.pop();
        }
        parameters.push(syntheticArgsSymbol);
        return true;
      }
      function getSignatureOfTypeTag(node) {
        if (!(ts2.isInJSFile(node) && ts2.isFunctionLikeDeclaration(node)))
          return void 0;
        var typeTag = ts2.getJSDocTypeTag(node);
        return (typeTag === null || typeTag === void 0 ? void 0 : typeTag.typeExpression) && getSingleCallSignature(getTypeFromTypeNode(typeTag.typeExpression));
      }
      function getReturnTypeOfTypeTag(node) {
        var signature = getSignatureOfTypeTag(node);
        return signature && getReturnTypeOfSignature(signature);
      }
      function containsArgumentsReference(declaration) {
        var links = getNodeLinks(declaration);
        if (links.containsArgumentsReference === void 0) {
          if (links.flags & 8192) {
            links.containsArgumentsReference = true;
          } else {
            links.containsArgumentsReference = traverse(declaration.body);
          }
        }
        return links.containsArgumentsReference;
        function traverse(node) {
          if (!node)
            return false;
          switch (node.kind) {
            case 79:
              return node.escapedText === argumentsSymbol.escapedName && getReferencedValueSymbol(node) === argumentsSymbol;
            case 166:
            case 168:
            case 171:
            case 172:
              return node.name.kind === 161 && traverse(node.name);
            case 205:
            case 206:
              return traverse(node.expression);
            default:
              return !ts2.nodeStartsNewLexicalEnvironment(node) && !ts2.isPartOfTypeNode(node) && !!ts2.forEachChild(node, traverse);
          }
        }
      }
      function getSignaturesOfSymbol(symbol) {
        if (!symbol || !symbol.declarations)
          return ts2.emptyArray;
        var result = [];
        for (var i = 0; i < symbol.declarations.length; i++) {
          var decl = symbol.declarations[i];
          if (!ts2.isFunctionLike(decl))
            continue;
          if (i > 0 && decl.body) {
            var previous = symbol.declarations[i - 1];
            if (decl.parent === previous.parent && decl.kind === previous.kind && decl.pos === previous.end) {
              continue;
            }
          }
          result.push(getSignatureFromDeclaration(decl));
        }
        return result;
      }
      function resolveExternalModuleTypeByLiteral(name) {
        var moduleSym = resolveExternalModuleName(name, name);
        if (moduleSym) {
          var resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym);
          if (resolvedModuleSymbol) {
            return getTypeOfSymbol(resolvedModuleSymbol);
          }
        }
        return anyType;
      }
      function getThisTypeOfSignature(signature) {
        if (signature.thisParameter) {
          return getTypeOfSymbol(signature.thisParameter);
        }
      }
      function getTypePredicateOfSignature(signature) {
        if (!signature.resolvedTypePredicate) {
          if (signature.target) {
            var targetTypePredicate = getTypePredicateOfSignature(signature.target);
            signature.resolvedTypePredicate = targetTypePredicate ? instantiateTypePredicate(targetTypePredicate, signature.mapper) : noTypePredicate;
          } else if (signature.compositeSignatures) {
            signature.resolvedTypePredicate = getUnionOrIntersectionTypePredicate(signature.compositeSignatures, signature.compositeKind) || noTypePredicate;
          } else {
            var type = signature.declaration && ts2.getEffectiveReturnTypeNode(signature.declaration);
            var jsdocPredicate = void 0;
            if (!type && ts2.isInJSFile(signature.declaration)) {
              var jsdocSignature = getSignatureOfTypeTag(signature.declaration);
              if (jsdocSignature && signature !== jsdocSignature) {
                jsdocPredicate = getTypePredicateOfSignature(jsdocSignature);
              }
            }
            signature.resolvedTypePredicate = type && ts2.isTypePredicateNode(type) ? createTypePredicateFromTypePredicateNode(type, signature) : jsdocPredicate || noTypePredicate;
          }
          ts2.Debug.assert(!!signature.resolvedTypePredicate);
        }
        return signature.resolvedTypePredicate === noTypePredicate ? void 0 : signature.resolvedTypePredicate;
      }
      function createTypePredicateFromTypePredicateNode(node, signature) {
        var parameterName = node.parameterName;
        var type = node.type && getTypeFromTypeNode(node.type);
        return parameterName.kind === 191 ? createTypePredicate(node.assertsModifier ? 2 : 0, void 0, void 0, type) : createTypePredicate(node.assertsModifier ? 3 : 1, parameterName.escapedText, ts2.findIndex(signature.parameters, function(p) {
          return p.escapedName === parameterName.escapedText;
        }), type);
      }
      function getUnionOrIntersectionType(types, kind, unionReduction) {
        return kind !== 2097152 ? getUnionType(types, unionReduction) : getIntersectionType(types);
      }
      function getReturnTypeOfSignature(signature) {
        if (!signature.resolvedReturnType) {
          if (!pushTypeResolution(signature, 3)) {
            return errorType;
          }
          var type = signature.target ? instantiateType(getReturnTypeOfSignature(signature.target), signature.mapper) : signature.compositeSignatures ? instantiateType(getUnionOrIntersectionType(ts2.map(signature.compositeSignatures, getReturnTypeOfSignature), signature.compositeKind, 2), signature.mapper) : getReturnTypeFromAnnotation(signature.declaration) || (ts2.nodeIsMissing(signature.declaration.body) ? anyType : getReturnTypeFromBody(signature.declaration));
          if (signature.flags & 8) {
            type = addOptionalTypeMarker(type);
          } else if (signature.flags & 16) {
            type = getOptionalType(type);
          }
          if (!popTypeResolution()) {
            if (signature.declaration) {
              var typeNode = ts2.getEffectiveReturnTypeNode(signature.declaration);
              if (typeNode) {
                error(typeNode, ts2.Diagnostics.Return_type_annotation_circularly_references_itself);
              } else if (noImplicitAny) {
                var declaration = signature.declaration;
                var name = ts2.getNameOfDeclaration(declaration);
                if (name) {
                  error(name, ts2.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, ts2.declarationNameToString(name));
                } else {
                  error(declaration, ts2.Diagnostics.Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions);
                }
              }
            }
            type = anyType;
          }
          signature.resolvedReturnType = type;
        }
        return signature.resolvedReturnType;
      }
      function getReturnTypeFromAnnotation(declaration) {
        if (declaration.kind === 170) {
          return getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol));
        }
        if (ts2.isJSDocConstructSignature(declaration)) {
          return getTypeFromTypeNode(declaration.parameters[0].type);
        }
        var typeNode = ts2.getEffectiveReturnTypeNode(declaration);
        if (typeNode) {
          return getTypeFromTypeNode(typeNode);
        }
        if (declaration.kind === 171 && hasBindableName(declaration)) {
          var jsDocType = ts2.isInJSFile(declaration) && getTypeForDeclarationFromJSDocComment(declaration);
          if (jsDocType) {
            return jsDocType;
          }
          var setter = ts2.getDeclarationOfKind(getSymbolOfNode(declaration), 172);
          var setterType = getAnnotatedAccessorType(setter);
          if (setterType) {
            return setterType;
          }
        }
        return getReturnTypeOfTypeTag(declaration);
      }
      function isResolvingReturnTypeOfSignature(signature) {
        return !signature.resolvedReturnType && findResolutionCycleStartIndex(signature, 3) >= 0;
      }
      function getRestTypeOfSignature(signature) {
        return tryGetRestTypeOfSignature(signature) || anyType;
      }
      function tryGetRestTypeOfSignature(signature) {
        if (signatureHasRestParameter(signature)) {
          var sigRestType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
          var restType = isTupleType(sigRestType) ? getRestTypeOfTupleType(sigRestType) : sigRestType;
          return restType && getIndexTypeOfType(restType, numberType);
        }
        return void 0;
      }
      function getSignatureInstantiation(signature, typeArguments, isJavascript, inferredTypeParameters) {
        var instantiatedSignature = getSignatureInstantiationWithoutFillingInTypeArguments(signature, fillMissingTypeArguments(typeArguments, signature.typeParameters, getMinTypeArgumentCount(signature.typeParameters), isJavascript));
        if (inferredTypeParameters) {
          var returnSignature = getSingleCallOrConstructSignature(getReturnTypeOfSignature(instantiatedSignature));
          if (returnSignature) {
            var newReturnSignature = cloneSignature(returnSignature);
            newReturnSignature.typeParameters = inferredTypeParameters;
            var newInstantiatedSignature = cloneSignature(instantiatedSignature);
            newInstantiatedSignature.resolvedReturnType = getOrCreateTypeFromSignature(newReturnSignature);
            return newInstantiatedSignature;
          }
        }
        return instantiatedSignature;
      }
      function getSignatureInstantiationWithoutFillingInTypeArguments(signature, typeArguments) {
        var instantiations = signature.instantiations || (signature.instantiations = new ts2.Map());
        var id = getTypeListId(typeArguments);
        var instantiation = instantiations.get(id);
        if (!instantiation) {
          instantiations.set(id, instantiation = createSignatureInstantiation(signature, typeArguments));
        }
        return instantiation;
      }
      function createSignatureInstantiation(signature, typeArguments) {
        return instantiateSignature(signature, createSignatureTypeMapper(signature, typeArguments), true);
      }
      function createSignatureTypeMapper(signature, typeArguments) {
        return createTypeMapper(signature.typeParameters, typeArguments);
      }
      function getErasedSignature(signature) {
        return signature.typeParameters ? signature.erasedSignatureCache || (signature.erasedSignatureCache = createErasedSignature(signature)) : signature;
      }
      function createErasedSignature(signature) {
        return instantiateSignature(signature, createTypeEraser(signature.typeParameters), true);
      }
      function getCanonicalSignature(signature) {
        return signature.typeParameters ? signature.canonicalSignatureCache || (signature.canonicalSignatureCache = createCanonicalSignature(signature)) : signature;
      }
      function createCanonicalSignature(signature) {
        return getSignatureInstantiation(signature, ts2.map(signature.typeParameters, function(tp) {
          return tp.target && !getConstraintOfTypeParameter(tp.target) ? tp.target : tp;
        }), ts2.isInJSFile(signature.declaration));
      }
      function getBaseSignature(signature) {
        var typeParameters = signature.typeParameters;
        if (typeParameters) {
          if (signature.baseSignatureCache) {
            return signature.baseSignatureCache;
          }
          var typeEraser = createTypeEraser(typeParameters);
          var baseConstraintMapper_1 = createTypeMapper(typeParameters, ts2.map(typeParameters, function(tp) {
            return getConstraintOfTypeParameter(tp) || unknownType;
          }));
          var baseConstraints = ts2.map(typeParameters, function(tp) {
            return instantiateType(tp, baseConstraintMapper_1) || unknownType;
          });
          for (var i = 0; i < typeParameters.length - 1; i++) {
            baseConstraints = instantiateTypes(baseConstraints, baseConstraintMapper_1);
          }
          baseConstraints = instantiateTypes(baseConstraints, typeEraser);
          return signature.baseSignatureCache = instantiateSignature(signature, createTypeMapper(typeParameters, baseConstraints), true);
        }
        return signature;
      }
      function getOrCreateTypeFromSignature(signature) {
        if (!signature.isolatedSignatureType) {
          var kind = signature.declaration ? signature.declaration.kind : 0;
          var isConstructor = kind === 170 || kind === 174 || kind === 179;
          var type = createObjectType(16);
          type.members = emptySymbols;
          type.properties = ts2.emptyArray;
          type.callSignatures = !isConstructor ? [signature] : ts2.emptyArray;
          type.constructSignatures = isConstructor ? [signature] : ts2.emptyArray;
          type.indexInfos = ts2.emptyArray;
          signature.isolatedSignatureType = type;
        }
        return signature.isolatedSignatureType;
      }
      function getIndexSymbol(symbol) {
        return symbol.members ? getIndexSymbolFromSymbolTable(symbol.members) : void 0;
      }
      function getIndexSymbolFromSymbolTable(symbolTable) {
        return symbolTable.get("__index");
      }
      function createIndexInfo(keyType, type, isReadonly, declaration) {
        return { keyType, type, isReadonly, declaration };
      }
      function getIndexInfosOfSymbol(symbol) {
        var indexSymbol = getIndexSymbol(symbol);
        return indexSymbol ? getIndexInfosOfIndexSymbol(indexSymbol) : ts2.emptyArray;
      }
      function getIndexInfosOfIndexSymbol(indexSymbol) {
        if (indexSymbol.declarations) {
          var indexInfos_2 = [];
          var _loop_14 = function(declaration2) {
            if (declaration2.parameters.length === 1) {
              var parameter = declaration2.parameters[0];
              if (parameter.type) {
                forEachType(getTypeFromTypeNode(parameter.type), function(keyType) {
                  if (isValidIndexKeyType(keyType) && !findIndexInfo(indexInfos_2, keyType)) {
                    indexInfos_2.push(createIndexInfo(keyType, declaration2.type ? getTypeFromTypeNode(declaration2.type) : anyType, ts2.hasEffectiveModifier(declaration2, 64), declaration2));
                  }
                });
              }
            }
          };
          for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            _loop_14(declaration);
          }
          return indexInfos_2;
        }
        return ts2.emptyArray;
      }
      function isValidIndexKeyType(type) {
        return !!(type.flags & (4 | 8 | 4096)) || isPatternLiteralType(type) || !!(type.flags & 2097152) && !isGenericType(type) && ts2.some(type.types, isValidIndexKeyType);
      }
      function getConstraintDeclaration(type) {
        return ts2.mapDefined(ts2.filter(type.symbol && type.symbol.declarations, ts2.isTypeParameterDeclaration), ts2.getEffectiveConstraintOfTypeParameter)[0];
      }
      function getInferredTypeParameterConstraint(typeParameter) {
        var _a;
        var inferences;
        if ((_a = typeParameter.symbol) === null || _a === void 0 ? void 0 : _a.declarations) {
          for (var _i = 0, _b = typeParameter.symbol.declarations; _i < _b.length; _i++) {
            var declaration = _b[_i];
            if (declaration.parent.kind === 189) {
              var _c = ts2.walkUpParenthesizedTypesAndGetParentAndChild(declaration.parent.parent), _d = _c[0], childTypeParameter = _d === void 0 ? declaration.parent : _d, grandParent = _c[1];
              if (grandParent.kind === 177) {
                var typeReference = grandParent;
                var typeParameters = getTypeParametersForTypeReference(typeReference);
                if (typeParameters) {
                  var index = typeReference.typeArguments.indexOf(childTypeParameter);
                  if (index < typeParameters.length) {
                    var declaredConstraint = getConstraintOfTypeParameter(typeParameters[index]);
                    if (declaredConstraint) {
                      var mapper = createTypeMapper(typeParameters, getEffectiveTypeArguments(typeReference, typeParameters));
                      var constraint = instantiateType(declaredConstraint, mapper);
                      if (constraint !== typeParameter) {
                        inferences = ts2.append(inferences, constraint);
                      }
                    }
                  }
                }
              } else if (grandParent.kind === 163 && grandParent.dotDotDotToken || grandParent.kind === 185 || grandParent.kind === 196 && grandParent.dotDotDotToken) {
                inferences = ts2.append(inferences, createArrayType(unknownType));
              } else if (grandParent.kind === 198) {
                inferences = ts2.append(inferences, stringType);
              } else if (grandParent.kind === 162 && grandParent.parent.kind === 194) {
                inferences = ts2.append(inferences, keyofConstraintType);
              } else if (grandParent.kind === 194 && grandParent.type && ts2.skipParentheses(grandParent.type) === declaration.parent && grandParent.parent.kind === 188 && grandParent.parent.extendsType === grandParent && grandParent.parent.checkType.kind === 194 && grandParent.parent.checkType.type) {
                var checkMappedType_1 = grandParent.parent.checkType;
                var nodeType = getTypeFromTypeNode(checkMappedType_1.type);
                inferences = ts2.append(inferences, instantiateType(nodeType, makeUnaryTypeMapper(getDeclaredTypeOfTypeParameter(getSymbolOfNode(checkMappedType_1.typeParameter)), checkMappedType_1.typeParameter.constraint ? getTypeFromTypeNode(checkMappedType_1.typeParameter.constraint) : keyofConstraintType)));
              }
            }
          }
        }
        return inferences && getIntersectionType(inferences);
      }
      function getConstraintFromTypeParameter(typeParameter) {
        if (!typeParameter.constraint) {
          if (typeParameter.target) {
            var targetConstraint = getConstraintOfTypeParameter(typeParameter.target);
            typeParameter.constraint = targetConstraint ? instantiateType(targetConstraint, typeParameter.mapper) : noConstraintType;
          } else {
            var constraintDeclaration = getConstraintDeclaration(typeParameter);
            if (!constraintDeclaration) {
              typeParameter.constraint = getInferredTypeParameterConstraint(typeParameter) || noConstraintType;
            } else {
              var type = getTypeFromTypeNode(constraintDeclaration);
              if (type.flags & 1 && !isErrorType(type)) {
                type = constraintDeclaration.parent.parent.kind === 194 ? keyofConstraintType : unknownType;
              }
              typeParameter.constraint = type;
            }
          }
        }
        return typeParameter.constraint === noConstraintType ? void 0 : typeParameter.constraint;
      }
      function getParentSymbolOfTypeParameter(typeParameter) {
        var tp = ts2.getDeclarationOfKind(typeParameter.symbol, 162);
        var host2 = ts2.isJSDocTemplateTag(tp.parent) ? ts2.getEffectiveContainerForJSDocTemplateTag(tp.parent) : tp.parent;
        return host2 && getSymbolOfNode(host2);
      }
      function getTypeListId(types) {
        var result = "";
        if (types) {
          var length_4 = types.length;
          var i = 0;
          while (i < length_4) {
            var startId = types[i].id;
            var count = 1;
            while (i + count < length_4 && types[i + count].id === startId + count) {
              count++;
            }
            if (result.length) {
              result += ",";
            }
            result += startId;
            if (count > 1) {
              result += ":" + count;
            }
            i += count;
          }
        }
        return result;
      }
      function getAliasId(aliasSymbol, aliasTypeArguments) {
        return aliasSymbol ? "@".concat(getSymbolId(aliasSymbol)) + (aliasTypeArguments ? ":".concat(getTypeListId(aliasTypeArguments)) : "") : "";
      }
      function getPropagatingFlagsOfTypes(types, excludeKinds) {
        var result = 0;
        for (var _i = 0, types_8 = types; _i < types_8.length; _i++) {
          var type = types_8[_i];
          if (!(type.flags & excludeKinds)) {
            result |= ts2.getObjectFlags(type);
          }
        }
        return result & 917504;
      }
      function createTypeReference(target, typeArguments) {
        var id = getTypeListId(typeArguments);
        var type = target.instantiations.get(id);
        if (!type) {
          type = createObjectType(4, target.symbol);
          target.instantiations.set(id, type);
          type.objectFlags |= typeArguments ? getPropagatingFlagsOfTypes(typeArguments, 0) : 0;
          type.target = target;
          type.resolvedTypeArguments = typeArguments;
        }
        return type;
      }
      function cloneTypeReference(source) {
        var type = createType(source.flags);
        type.symbol = source.symbol;
        type.objectFlags = source.objectFlags;
        type.target = source.target;
        type.resolvedTypeArguments = source.resolvedTypeArguments;
        return type;
      }
      function createDeferredTypeReference(target, node, mapper, aliasSymbol, aliasTypeArguments) {
        if (!aliasSymbol) {
          aliasSymbol = getAliasSymbolForTypeNode(node);
          var localAliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
          aliasTypeArguments = mapper ? instantiateTypes(localAliasTypeArguments, mapper) : localAliasTypeArguments;
        }
        var type = createObjectType(4, target.symbol);
        type.target = target;
        type.node = node;
        type.mapper = mapper;
        type.aliasSymbol = aliasSymbol;
        type.aliasTypeArguments = aliasTypeArguments;
        return type;
      }
      function getTypeArguments(type) {
        var _a, _b;
        if (!type.resolvedTypeArguments) {
          if (!pushTypeResolution(type, 6)) {
            return ((_a = type.target.localTypeParameters) === null || _a === void 0 ? void 0 : _a.map(function() {
              return errorType;
            })) || ts2.emptyArray;
          }
          var node = type.node;
          var typeArguments = !node ? ts2.emptyArray : node.kind === 177 ? ts2.concatenate(type.target.outerTypeParameters, getEffectiveTypeArguments(node, type.target.localTypeParameters)) : node.kind === 182 ? [getTypeFromTypeNode(node.elementType)] : ts2.map(node.elements, getTypeFromTypeNode);
          if (popTypeResolution()) {
            type.resolvedTypeArguments = type.mapper ? instantiateTypes(typeArguments, type.mapper) : typeArguments;
          } else {
            type.resolvedTypeArguments = ((_b = type.target.localTypeParameters) === null || _b === void 0 ? void 0 : _b.map(function() {
              return errorType;
            })) || ts2.emptyArray;
            error(type.node || currentNode, type.target.symbol ? ts2.Diagnostics.Type_arguments_for_0_circularly_reference_themselves : ts2.Diagnostics.Tuple_type_arguments_circularly_reference_themselves, type.target.symbol && symbolToString(type.target.symbol));
          }
        }
        return type.resolvedTypeArguments;
      }
      function getTypeReferenceArity(type) {
        return ts2.length(type.target.typeParameters);
      }
      function getTypeFromClassOrInterfaceReference(node, symbol) {
        var type = getDeclaredTypeOfSymbol(getMergedSymbol(symbol));
        var typeParameters = type.localTypeParameters;
        if (typeParameters) {
          var numTypeArguments = ts2.length(node.typeArguments);
          var minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
          var isJs = ts2.isInJSFile(node);
          var isJsImplicitAny = !noImplicitAny && isJs;
          if (!isJsImplicitAny && (numTypeArguments < minTypeArgumentCount || numTypeArguments > typeParameters.length)) {
            var missingAugmentsTag = isJs && ts2.isExpressionWithTypeArguments(node) && !ts2.isJSDocAugmentsTag(node.parent);
            var diag = minTypeArgumentCount === typeParameters.length ? missingAugmentsTag ? ts2.Diagnostics.Expected_0_type_arguments_provide_these_with_an_extends_tag : ts2.Diagnostics.Generic_type_0_requires_1_type_argument_s : missingAugmentsTag ? ts2.Diagnostics.Expected_0_1_type_arguments_provide_these_with_an_extends_tag : ts2.Diagnostics.Generic_type_0_requires_between_1_and_2_type_arguments;
            var typeStr = typeToString(type, void 0, 2);
            error(node, diag, typeStr, minTypeArgumentCount, typeParameters.length);
            if (!isJs) {
              return errorType;
            }
          }
          if (node.kind === 177 && isDeferredTypeReferenceNode(node, ts2.length(node.typeArguments) !== typeParameters.length)) {
            return createDeferredTypeReference(type, node, void 0);
          }
          var typeArguments = ts2.concatenate(type.outerTypeParameters, fillMissingTypeArguments(typeArgumentsFromTypeReferenceNode(node), typeParameters, minTypeArgumentCount, isJs));
          return createTypeReference(type, typeArguments);
        }
        return checkNoTypeArguments(node, symbol) ? type : errorType;
      }
      function getTypeAliasInstantiation(symbol, typeArguments, aliasSymbol, aliasTypeArguments) {
        var type = getDeclaredTypeOfSymbol(symbol);
        if (type === intrinsicMarkerType && intrinsicTypeKinds.has(symbol.escapedName) && typeArguments && typeArguments.length === 1) {
          return getStringMappingType(symbol, typeArguments[0]);
        }
        var links = getSymbolLinks(symbol);
        var typeParameters = links.typeParameters;
        var id = getTypeListId(typeArguments) + getAliasId(aliasSymbol, aliasTypeArguments);
        var instantiation = links.instantiations.get(id);
        if (!instantiation) {
          links.instantiations.set(id, instantiation = instantiateTypeWithAlias(type, createTypeMapper(typeParameters, fillMissingTypeArguments(typeArguments, typeParameters, getMinTypeArgumentCount(typeParameters), ts2.isInJSFile(symbol.valueDeclaration))), aliasSymbol, aliasTypeArguments));
        }
        return instantiation;
      }
      function getTypeFromTypeAliasReference(node, symbol) {
        if (ts2.getCheckFlags(symbol) & 1048576) {
          var typeArguments = typeArgumentsFromTypeReferenceNode(node);
          var id = getAliasId(symbol, typeArguments);
          var errorType_1 = errorTypes.get(id);
          if (!errorType_1) {
            errorType_1 = createIntrinsicType(1, "error");
            errorType_1.aliasSymbol = symbol;
            errorType_1.aliasTypeArguments = typeArguments;
            errorTypes.set(id, errorType_1);
          }
          return errorType_1;
        }
        var type = getDeclaredTypeOfSymbol(symbol);
        var typeParameters = getSymbolLinks(symbol).typeParameters;
        if (typeParameters) {
          var numTypeArguments = ts2.length(node.typeArguments);
          var minTypeArgumentCount = getMinTypeArgumentCount(typeParameters);
          if (numTypeArguments < minTypeArgumentCount || numTypeArguments > typeParameters.length) {
            error(node, minTypeArgumentCount === typeParameters.length ? ts2.Diagnostics.Generic_type_0_requires_1_type_argument_s : ts2.Diagnostics.Generic_type_0_requires_between_1_and_2_type_arguments, symbolToString(symbol), minTypeArgumentCount, typeParameters.length);
            return errorType;
          }
          var aliasSymbol = getAliasSymbolForTypeNode(node);
          var newAliasSymbol = aliasSymbol && (isLocalTypeAlias(symbol) || !isLocalTypeAlias(aliasSymbol)) ? aliasSymbol : void 0;
          return getTypeAliasInstantiation(symbol, typeArgumentsFromTypeReferenceNode(node), newAliasSymbol, getTypeArgumentsForAliasSymbol(newAliasSymbol));
        }
        return checkNoTypeArguments(node, symbol) ? type : errorType;
      }
      function isLocalTypeAlias(symbol) {
        var _a;
        var declaration = (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isTypeAlias);
        return !!(declaration && ts2.getContainingFunction(declaration));
      }
      function getTypeReferenceName(node) {
        switch (node.kind) {
          case 177:
            return node.typeName;
          case 227:
            var expr = node.expression;
            if (ts2.isEntityNameExpression(expr)) {
              return expr;
            }
        }
        return void 0;
      }
      function getSymbolPath(symbol) {
        return symbol.parent ? "".concat(getSymbolPath(symbol.parent), ".").concat(symbol.escapedName) : symbol.escapedName;
      }
      function getUnresolvedSymbolForEntityName(name) {
        var identifier = name.kind === 160 ? name.right : name.kind === 205 ? name.name : name;
        var text = identifier.escapedText;
        if (text) {
          var parentSymbol = name.kind === 160 ? getUnresolvedSymbolForEntityName(name.left) : name.kind === 205 ? getUnresolvedSymbolForEntityName(name.expression) : void 0;
          var path = parentSymbol ? "".concat(getSymbolPath(parentSymbol), ".").concat(text) : text;
          var result = unresolvedSymbols.get(path);
          if (!result) {
            unresolvedSymbols.set(path, result = createSymbol(524288, text, 1048576));
            result.parent = parentSymbol;
            result.declaredType = unresolvedType;
          }
          return result;
        }
        return unknownSymbol;
      }
      function resolveTypeReferenceName(typeReference, meaning, ignoreErrors) {
        var name = getTypeReferenceName(typeReference);
        if (!name) {
          return unknownSymbol;
        }
        var symbol = resolveEntityName(name, meaning, ignoreErrors);
        return symbol && symbol !== unknownSymbol ? symbol : ignoreErrors ? unknownSymbol : getUnresolvedSymbolForEntityName(name);
      }
      function getTypeReferenceType(node, symbol) {
        if (symbol === unknownSymbol) {
          return errorType;
        }
        symbol = getExpandoSymbol(symbol) || symbol;
        if (symbol.flags & (32 | 64)) {
          return getTypeFromClassOrInterfaceReference(node, symbol);
        }
        if (symbol.flags & 524288) {
          return getTypeFromTypeAliasReference(node, symbol);
        }
        var res = tryGetDeclaredTypeOfSymbol(symbol);
        if (res) {
          return checkNoTypeArguments(node, symbol) ? getRegularTypeOfLiteralType(res) : errorType;
        }
        if (symbol.flags & 111551 && isJSDocTypeReference(node)) {
          var jsdocType = getTypeFromJSDocValueReference(node, symbol);
          if (jsdocType) {
            return jsdocType;
          } else {
            resolveTypeReferenceName(node, 788968);
            return getTypeOfSymbol(symbol);
          }
        }
        return errorType;
      }
      function getTypeFromJSDocValueReference(node, symbol) {
        var links = getNodeLinks(node);
        if (!links.resolvedJSDocType) {
          var valueType = getTypeOfSymbol(symbol);
          var typeType = valueType;
          if (symbol.valueDeclaration) {
            var isImportTypeWithQualifier = node.kind === 199 && node.qualifier;
            if (valueType.symbol && valueType.symbol !== symbol && isImportTypeWithQualifier) {
              typeType = getTypeReferenceType(node, valueType.symbol);
            }
          }
          links.resolvedJSDocType = typeType;
        }
        return links.resolvedJSDocType;
      }
      function getSubstitutionType(baseType, substitute) {
        if (substitute.flags & 3 || substitute === baseType) {
          return baseType;
        }
        var id = "".concat(getTypeId(baseType), ">").concat(getTypeId(substitute));
        var cached = substitutionTypes.get(id);
        if (cached) {
          return cached;
        }
        var result = createType(33554432);
        result.baseType = baseType;
        result.substitute = substitute;
        substitutionTypes.set(id, result);
        return result;
      }
      function isUnaryTupleTypeNode(node) {
        return node.kind === 183 && node.elements.length === 1;
      }
      function getImpliedConstraint(type, checkNode, extendsNode) {
        return isUnaryTupleTypeNode(checkNode) && isUnaryTupleTypeNode(extendsNode) ? getImpliedConstraint(type, checkNode.elements[0], extendsNode.elements[0]) : getActualTypeVariable(getTypeFromTypeNode(checkNode)) === type ? getTypeFromTypeNode(extendsNode) : void 0;
      }
      function getConditionalFlowTypeOfType(type, node) {
        var constraints;
        var covariant = true;
        while (node && !ts2.isStatement(node) && node.kind !== 318) {
          var parent = node.parent;
          if (parent.kind === 163) {
            covariant = !covariant;
          }
          if ((covariant || type.flags & 8650752) && parent.kind === 188 && node === parent.trueType) {
            var constraint = getImpliedConstraint(type, parent.checkType, parent.extendsType);
            if (constraint) {
              constraints = ts2.append(constraints, constraint);
            }
          }
          node = parent;
        }
        return constraints ? getSubstitutionType(type, getIntersectionType(ts2.append(constraints, type))) : type;
      }
      function isJSDocTypeReference(node) {
        return !!(node.flags & 4194304) && (node.kind === 177 || node.kind === 199);
      }
      function checkNoTypeArguments(node, symbol) {
        if (node.typeArguments) {
          error(node, ts2.Diagnostics.Type_0_is_not_generic, symbol ? symbolToString(symbol) : node.typeName ? ts2.declarationNameToString(node.typeName) : anon);
          return false;
        }
        return true;
      }
      function getIntendedTypeFromJSDocTypeReference(node) {
        if (ts2.isIdentifier(node.typeName)) {
          var typeArgs = node.typeArguments;
          switch (node.typeName.escapedText) {
            case "String":
              checkNoTypeArguments(node);
              return stringType;
            case "Number":
              checkNoTypeArguments(node);
              return numberType;
            case "Boolean":
              checkNoTypeArguments(node);
              return booleanType;
            case "Void":
              checkNoTypeArguments(node);
              return voidType;
            case "Undefined":
              checkNoTypeArguments(node);
              return undefinedType;
            case "Null":
              checkNoTypeArguments(node);
              return nullType;
            case "Function":
            case "function":
              checkNoTypeArguments(node);
              return globalFunctionType;
            case "array":
              return (!typeArgs || !typeArgs.length) && !noImplicitAny ? anyArrayType : void 0;
            case "promise":
              return (!typeArgs || !typeArgs.length) && !noImplicitAny ? createPromiseType(anyType) : void 0;
            case "Object":
              if (typeArgs && typeArgs.length === 2) {
                if (ts2.isJSDocIndexSignature(node)) {
                  var indexed = getTypeFromTypeNode(typeArgs[0]);
                  var target = getTypeFromTypeNode(typeArgs[1]);
                  var indexInfo = indexed === stringType || indexed === numberType ? [createIndexInfo(indexed, target, false)] : ts2.emptyArray;
                  return createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, indexInfo);
                }
                return anyType;
              }
              checkNoTypeArguments(node);
              return !noImplicitAny ? anyType : void 0;
          }
        }
      }
      function getTypeFromJSDocNullableTypeNode(node) {
        var type = getTypeFromTypeNode(node.type);
        return strictNullChecks ? getNullableType(type, 65536) : type;
      }
      function getTypeFromTypeReference(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          if (ts2.isConstTypeReference(node) && ts2.isAssertionExpression(node.parent)) {
            links.resolvedSymbol = unknownSymbol;
            return links.resolvedType = checkExpressionCached(node.parent.expression);
          }
          var symbol = void 0;
          var type = void 0;
          var meaning = 788968;
          if (isJSDocTypeReference(node)) {
            type = getIntendedTypeFromJSDocTypeReference(node);
            if (!type) {
              symbol = resolveTypeReferenceName(node, meaning, true);
              if (symbol === unknownSymbol) {
                symbol = resolveTypeReferenceName(node, meaning | 111551);
              } else {
                resolveTypeReferenceName(node, meaning);
              }
              type = getTypeReferenceType(node, symbol);
            }
          }
          if (!type) {
            symbol = resolveTypeReferenceName(node, meaning);
            type = getTypeReferenceType(node, symbol);
          }
          links.resolvedSymbol = symbol;
          links.resolvedType = type;
        }
        return links.resolvedType;
      }
      function typeArgumentsFromTypeReferenceNode(node) {
        return ts2.map(node.typeArguments, getTypeFromTypeNode);
      }
      function getTypeFromTypeQueryNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var type = ts2.isThisIdentifier(node.exprName) ? checkThisExpression(node.exprName) : checkExpression(node.exprName);
          links.resolvedType = getRegularTypeOfLiteralType(getWidenedType(type));
        }
        return links.resolvedType;
      }
      function getTypeOfGlobalSymbol(symbol, arity) {
        function getTypeDeclaration(symbol2) {
          var declarations = symbol2.declarations;
          if (declarations) {
            for (var _i = 0, declarations_3 = declarations; _i < declarations_3.length; _i++) {
              var declaration = declarations_3[_i];
              switch (declaration.kind) {
                case 256:
                case 257:
                case 259:
                  return declaration;
              }
            }
          }
        }
        if (!symbol) {
          return arity ? emptyGenericType : emptyObjectType;
        }
        var type = getDeclaredTypeOfSymbol(symbol);
        if (!(type.flags & 524288)) {
          error(getTypeDeclaration(symbol), ts2.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, ts2.symbolName(symbol));
          return arity ? emptyGenericType : emptyObjectType;
        }
        if (ts2.length(type.typeParameters) !== arity) {
          error(getTypeDeclaration(symbol), ts2.Diagnostics.Global_type_0_must_have_1_type_parameter_s, ts2.symbolName(symbol), arity);
          return arity ? emptyGenericType : emptyObjectType;
        }
        return type;
      }
      function getGlobalValueSymbol(name, reportErrors) {
        return getGlobalSymbol(name, 111551, reportErrors ? ts2.Diagnostics.Cannot_find_global_value_0 : void 0);
      }
      function getGlobalTypeSymbol(name, reportErrors) {
        return getGlobalSymbol(name, 788968, reportErrors ? ts2.Diagnostics.Cannot_find_global_type_0 : void 0);
      }
      function getGlobalTypeAliasSymbol(name, arity, reportErrors) {
        var symbol = getGlobalSymbol(name, 788968, reportErrors ? ts2.Diagnostics.Cannot_find_global_type_0 : void 0);
        if (symbol) {
          getDeclaredTypeOfSymbol(symbol);
          if (ts2.length(getSymbolLinks(symbol).typeParameters) !== arity) {
            var decl = symbol.declarations && ts2.find(symbol.declarations, ts2.isTypeAliasDeclaration);
            error(decl, ts2.Diagnostics.Global_type_0_must_have_1_type_parameter_s, ts2.symbolName(symbol), arity);
            return void 0;
          }
        }
        return symbol;
      }
      function getGlobalSymbol(name, meaning, diagnostic) {
        return resolveName(void 0, name, meaning, diagnostic, name, false, false, false);
      }
      function getGlobalType(name, arity, reportErrors) {
        var symbol = getGlobalTypeSymbol(name, reportErrors);
        return symbol || reportErrors ? getTypeOfGlobalSymbol(symbol, arity) : void 0;
      }
      function getGlobalTypedPropertyDescriptorType() {
        return deferredGlobalTypedPropertyDescriptorType || (deferredGlobalTypedPropertyDescriptorType = getGlobalType("TypedPropertyDescriptor", 1, true) || emptyGenericType);
      }
      function getGlobalTemplateStringsArrayType() {
        return deferredGlobalTemplateStringsArrayType || (deferredGlobalTemplateStringsArrayType = getGlobalType("TemplateStringsArray", 0, true) || emptyObjectType);
      }
      function getGlobalImportMetaType() {
        return deferredGlobalImportMetaType || (deferredGlobalImportMetaType = getGlobalType("ImportMeta", 0, true) || emptyObjectType);
      }
      function getGlobalImportMetaExpressionType() {
        if (!deferredGlobalImportMetaExpressionType) {
          var symbol = createSymbol(0, "ImportMetaExpression");
          var importMetaType = getGlobalImportMetaType();
          var metaPropertySymbol = createSymbol(4, "meta", 8);
          metaPropertySymbol.parent = symbol;
          metaPropertySymbol.type = importMetaType;
          var members = ts2.createSymbolTable([metaPropertySymbol]);
          symbol.members = members;
          deferredGlobalImportMetaExpressionType = createAnonymousType(symbol, members, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
        }
        return deferredGlobalImportMetaExpressionType;
      }
      function getGlobalImportCallOptionsType(reportErrors) {
        return deferredGlobalImportCallOptionsType || (deferredGlobalImportCallOptionsType = getGlobalType("ImportCallOptions", 0, reportErrors)) || emptyObjectType;
      }
      function getGlobalESSymbolConstructorSymbol(reportErrors) {
        return deferredGlobalESSymbolConstructorSymbol || (deferredGlobalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol", reportErrors));
      }
      function getGlobalESSymbolConstructorTypeSymbol(reportErrors) {
        return deferredGlobalESSymbolConstructorTypeSymbol || (deferredGlobalESSymbolConstructorTypeSymbol = getGlobalTypeSymbol("SymbolConstructor", reportErrors));
      }
      function getGlobalESSymbolType(reportErrors) {
        return deferredGlobalESSymbolType || (deferredGlobalESSymbolType = getGlobalType("Symbol", 0, reportErrors)) || emptyObjectType;
      }
      function getGlobalPromiseType(reportErrors) {
        return deferredGlobalPromiseType || (deferredGlobalPromiseType = getGlobalType("Promise", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalPromiseLikeType(reportErrors) {
        return deferredGlobalPromiseLikeType || (deferredGlobalPromiseLikeType = getGlobalType("PromiseLike", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalPromiseConstructorSymbol(reportErrors) {
        return deferredGlobalPromiseConstructorSymbol || (deferredGlobalPromiseConstructorSymbol = getGlobalValueSymbol("Promise", reportErrors));
      }
      function getGlobalPromiseConstructorLikeType(reportErrors) {
        return deferredGlobalPromiseConstructorLikeType || (deferredGlobalPromiseConstructorLikeType = getGlobalType("PromiseConstructorLike", 0, reportErrors)) || emptyObjectType;
      }
      function getGlobalAsyncIterableType(reportErrors) {
        return deferredGlobalAsyncIterableType || (deferredGlobalAsyncIterableType = getGlobalType("AsyncIterable", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalAsyncIteratorType(reportErrors) {
        return deferredGlobalAsyncIteratorType || (deferredGlobalAsyncIteratorType = getGlobalType("AsyncIterator", 3, reportErrors)) || emptyGenericType;
      }
      function getGlobalAsyncIterableIteratorType(reportErrors) {
        return deferredGlobalAsyncIterableIteratorType || (deferredGlobalAsyncIterableIteratorType = getGlobalType("AsyncIterableIterator", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalAsyncGeneratorType(reportErrors) {
        return deferredGlobalAsyncGeneratorType || (deferredGlobalAsyncGeneratorType = getGlobalType("AsyncGenerator", 3, reportErrors)) || emptyGenericType;
      }
      function getGlobalIterableType(reportErrors) {
        return deferredGlobalIterableType || (deferredGlobalIterableType = getGlobalType("Iterable", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalIteratorType(reportErrors) {
        return deferredGlobalIteratorType || (deferredGlobalIteratorType = getGlobalType("Iterator", 3, reportErrors)) || emptyGenericType;
      }
      function getGlobalIterableIteratorType(reportErrors) {
        return deferredGlobalIterableIteratorType || (deferredGlobalIterableIteratorType = getGlobalType("IterableIterator", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalGeneratorType(reportErrors) {
        return deferredGlobalGeneratorType || (deferredGlobalGeneratorType = getGlobalType("Generator", 3, reportErrors)) || emptyGenericType;
      }
      function getGlobalIteratorYieldResultType(reportErrors) {
        return deferredGlobalIteratorYieldResultType || (deferredGlobalIteratorYieldResultType = getGlobalType("IteratorYieldResult", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalIteratorReturnResultType(reportErrors) {
        return deferredGlobalIteratorReturnResultType || (deferredGlobalIteratorReturnResultType = getGlobalType("IteratorReturnResult", 1, reportErrors)) || emptyGenericType;
      }
      function getGlobalTypeOrUndefined(name, arity) {
        if (arity === void 0) {
          arity = 0;
        }
        var symbol = getGlobalSymbol(name, 788968, void 0);
        return symbol && getTypeOfGlobalSymbol(symbol, arity);
      }
      function getGlobalExtractSymbol() {
        deferredGlobalExtractSymbol || (deferredGlobalExtractSymbol = getGlobalTypeAliasSymbol("Extract", 2, true) || unknownSymbol);
        return deferredGlobalExtractSymbol === unknownSymbol ? void 0 : deferredGlobalExtractSymbol;
      }
      function getGlobalOmitSymbol() {
        deferredGlobalOmitSymbol || (deferredGlobalOmitSymbol = getGlobalTypeAliasSymbol("Omit", 2, true) || unknownSymbol);
        return deferredGlobalOmitSymbol === unknownSymbol ? void 0 : deferredGlobalOmitSymbol;
      }
      function getGlobalAwaitedSymbol(reportErrors) {
        deferredGlobalAwaitedSymbol || (deferredGlobalAwaitedSymbol = getGlobalTypeAliasSymbol("Awaited", 1, reportErrors) || (reportErrors ? unknownSymbol : void 0));
        return deferredGlobalAwaitedSymbol === unknownSymbol ? void 0 : deferredGlobalAwaitedSymbol;
      }
      function getGlobalBigIntType(reportErrors) {
        return deferredGlobalBigIntType || (deferredGlobalBigIntType = getGlobalType("BigInt", 0, reportErrors)) || emptyObjectType;
      }
      function createTypeFromGenericGlobalType(genericGlobalType, typeArguments) {
        return genericGlobalType !== emptyGenericType ? createTypeReference(genericGlobalType, typeArguments) : emptyObjectType;
      }
      function createTypedPropertyDescriptorType(propertyType) {
        return createTypeFromGenericGlobalType(getGlobalTypedPropertyDescriptorType(), [propertyType]);
      }
      function createIterableType(iteratedType) {
        return createTypeFromGenericGlobalType(getGlobalIterableType(true), [iteratedType]);
      }
      function createArrayType(elementType, readonly) {
        return createTypeFromGenericGlobalType(readonly ? globalReadonlyArrayType : globalArrayType, [elementType]);
      }
      function getTupleElementFlags(node) {
        switch (node.kind) {
          case 184:
            return 2;
          case 185:
            return getRestTypeElementFlags(node);
          case 196:
            return node.questionToken ? 2 : node.dotDotDotToken ? getRestTypeElementFlags(node) : 1;
          default:
            return 1;
        }
      }
      function getRestTypeElementFlags(node) {
        return getArrayElementTypeNode(node.type) ? 4 : 8;
      }
      function getArrayOrTupleTargetType(node) {
        var readonly = isReadonlyTypeOperator(node.parent);
        var elementType = getArrayElementTypeNode(node);
        if (elementType) {
          return readonly ? globalReadonlyArrayType : globalArrayType;
        }
        var elementFlags = ts2.map(node.elements, getTupleElementFlags);
        var missingName = ts2.some(node.elements, function(e) {
          return e.kind !== 196;
        });
        return getTupleTargetType(elementFlags, readonly, missingName ? void 0 : node.elements);
      }
      function isDeferredTypeReferenceNode(node, hasDefaultTypeArguments) {
        return !!getAliasSymbolForTypeNode(node) || isResolvedByTypeAlias(node) && (node.kind === 182 ? mayResolveTypeAlias(node.elementType) : node.kind === 183 ? ts2.some(node.elements, mayResolveTypeAlias) : hasDefaultTypeArguments || ts2.some(node.typeArguments, mayResolveTypeAlias));
      }
      function isResolvedByTypeAlias(node) {
        var parent = node.parent;
        switch (parent.kind) {
          case 190:
          case 196:
          case 177:
          case 186:
          case 187:
          case 193:
          case 188:
          case 192:
          case 182:
          case 183:
            return isResolvedByTypeAlias(parent);
          case 258:
            return true;
        }
        return false;
      }
      function mayResolveTypeAlias(node) {
        switch (node.kind) {
          case 177:
            return isJSDocTypeReference(node) || !!(resolveTypeReferenceName(node, 788968).flags & 524288);
          case 180:
            return true;
          case 192:
            return node.operator !== 153 && mayResolveTypeAlias(node.type);
          case 190:
          case 184:
          case 196:
          case 314:
          case 312:
          case 313:
          case 307:
            return mayResolveTypeAlias(node.type);
          case 185:
            return node.type.kind !== 182 || mayResolveTypeAlias(node.type.elementType);
          case 186:
          case 187:
            return ts2.some(node.types, mayResolveTypeAlias);
          case 193:
            return mayResolveTypeAlias(node.objectType) || mayResolveTypeAlias(node.indexType);
          case 188:
            return mayResolveTypeAlias(node.checkType) || mayResolveTypeAlias(node.extendsType) || mayResolveTypeAlias(node.trueType) || mayResolveTypeAlias(node.falseType);
        }
        return false;
      }
      function getTypeFromArrayOrTupleTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var target = getArrayOrTupleTargetType(node);
          if (target === emptyGenericType) {
            links.resolvedType = emptyObjectType;
          } else if (!(node.kind === 183 && ts2.some(node.elements, function(e) {
            return !!(getTupleElementFlags(e) & 8);
          })) && isDeferredTypeReferenceNode(node)) {
            links.resolvedType = node.kind === 183 && node.elements.length === 0 ? target : createDeferredTypeReference(target, node, void 0);
          } else {
            var elementTypes = node.kind === 182 ? [getTypeFromTypeNode(node.elementType)] : ts2.map(node.elements, getTypeFromTypeNode);
            links.resolvedType = createNormalizedTypeReference(target, elementTypes);
          }
        }
        return links.resolvedType;
      }
      function isReadonlyTypeOperator(node) {
        return ts2.isTypeOperatorNode(node) && node.operator === 144;
      }
      function createTupleType(elementTypes, elementFlags, readonly, namedMemberDeclarations) {
        if (readonly === void 0) {
          readonly = false;
        }
        var tupleTarget = getTupleTargetType(elementFlags || ts2.map(elementTypes, function(_) {
          return 1;
        }), readonly, namedMemberDeclarations);
        return tupleTarget === emptyGenericType ? emptyObjectType : elementTypes.length ? createNormalizedTypeReference(tupleTarget, elementTypes) : tupleTarget;
      }
      function getTupleTargetType(elementFlags, readonly, namedMemberDeclarations) {
        if (elementFlags.length === 1 && elementFlags[0] & 4) {
          return readonly ? globalReadonlyArrayType : globalArrayType;
        }
        var key = ts2.map(elementFlags, function(f) {
          return f & 1 ? "#" : f & 2 ? "?" : f & 4 ? "." : "*";
        }).join() + (readonly ? "R" : "") + (namedMemberDeclarations && namedMemberDeclarations.length ? "," + ts2.map(namedMemberDeclarations, getNodeId).join(",") : "");
        var type = tupleTypes.get(key);
        if (!type) {
          tupleTypes.set(key, type = createTupleTargetType(elementFlags, readonly, namedMemberDeclarations));
        }
        return type;
      }
      function createTupleTargetType(elementFlags, readonly, namedMemberDeclarations) {
        var arity = elementFlags.length;
        var minLength = ts2.countWhere(elementFlags, function(f) {
          return !!(f & (1 | 8));
        });
        var typeParameters;
        var properties = [];
        var combinedFlags = 0;
        if (arity) {
          typeParameters = new Array(arity);
          for (var i = 0; i < arity; i++) {
            var typeParameter = typeParameters[i] = createTypeParameter();
            var flags = elementFlags[i];
            combinedFlags |= flags;
            if (!(combinedFlags & 12)) {
              var property = createSymbol(4 | (flags & 2 ? 16777216 : 0), "" + i, readonly ? 8 : 0);
              property.tupleLabelDeclaration = namedMemberDeclarations === null || namedMemberDeclarations === void 0 ? void 0 : namedMemberDeclarations[i];
              property.type = typeParameter;
              properties.push(property);
            }
          }
        }
        var fixedLength = properties.length;
        var lengthSymbol = createSymbol(4, "length");
        if (combinedFlags & 12) {
          lengthSymbol.type = numberType;
        } else {
          var literalTypes = [];
          for (var i = minLength; i <= arity; i++)
            literalTypes.push(getNumberLiteralType(i));
          lengthSymbol.type = getUnionType(literalTypes);
        }
        properties.push(lengthSymbol);
        var type = createObjectType(8 | 4);
        type.typeParameters = typeParameters;
        type.outerTypeParameters = void 0;
        type.localTypeParameters = typeParameters;
        type.instantiations = new ts2.Map();
        type.instantiations.set(getTypeListId(type.typeParameters), type);
        type.target = type;
        type.resolvedTypeArguments = type.typeParameters;
        type.thisType = createTypeParameter();
        type.thisType.isThisType = true;
        type.thisType.constraint = type;
        type.declaredProperties = properties;
        type.declaredCallSignatures = ts2.emptyArray;
        type.declaredConstructSignatures = ts2.emptyArray;
        type.declaredIndexInfos = ts2.emptyArray;
        type.elementFlags = elementFlags;
        type.minLength = minLength;
        type.fixedLength = fixedLength;
        type.hasRestElement = !!(combinedFlags & 12);
        type.combinedFlags = combinedFlags;
        type.readonly = readonly;
        type.labeledElementDeclarations = namedMemberDeclarations;
        return type;
      }
      function createNormalizedTypeReference(target, typeArguments) {
        return target.objectFlags & 8 ? createNormalizedTupleType(target, typeArguments) : createTypeReference(target, typeArguments);
      }
      function createNormalizedTupleType(target, elementTypes) {
        var _a, _b, _c;
        if (!(target.combinedFlags & 14)) {
          return createTypeReference(target, elementTypes);
        }
        if (target.combinedFlags & 8) {
          var unionIndex_1 = ts2.findIndex(elementTypes, function(t, i2) {
            return !!(target.elementFlags[i2] & 8 && t.flags & (131072 | 1048576));
          });
          if (unionIndex_1 >= 0) {
            return checkCrossProductUnion(ts2.map(elementTypes, function(t, i2) {
              return target.elementFlags[i2] & 8 ? t : unknownType;
            })) ? mapType(elementTypes[unionIndex_1], function(t) {
              return createNormalizedTupleType(target, ts2.replaceElement(elementTypes, unionIndex_1, t));
            }) : errorType;
          }
        }
        var expandedTypes = [];
        var expandedFlags = [];
        var expandedDeclarations = [];
        var lastRequiredIndex = -1;
        var firstRestIndex = -1;
        var lastOptionalOrRestIndex = -1;
        var _loop_15 = function(i2) {
          var type = elementTypes[i2];
          var flags = target.elementFlags[i2];
          if (flags & 8) {
            if (type.flags & 58982400 || isGenericMappedType(type)) {
              addElement(type, 8, (_a = target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i2]);
            } else if (isTupleType(type)) {
              var elements = getTypeArguments(type);
              if (elements.length + expandedTypes.length >= 1e4) {
                error(currentNode, ts2.isPartOfTypeNode(currentNode) ? ts2.Diagnostics.Type_produces_a_tuple_type_that_is_too_large_to_represent : ts2.Diagnostics.Expression_produces_a_tuple_type_that_is_too_large_to_represent);
                return { value: errorType };
              }
              ts2.forEach(elements, function(t, n) {
                var _a2;
                return addElement(t, type.target.elementFlags[n], (_a2 = type.target.labeledElementDeclarations) === null || _a2 === void 0 ? void 0 : _a2[n]);
              });
            } else {
              addElement(isArrayLikeType(type) && getIndexTypeOfType(type, numberType) || errorType, 4, (_b = target.labeledElementDeclarations) === null || _b === void 0 ? void 0 : _b[i2]);
            }
          } else {
            addElement(type, flags, (_c = target.labeledElementDeclarations) === null || _c === void 0 ? void 0 : _c[i2]);
          }
        };
        for (var i = 0; i < elementTypes.length; i++) {
          var state_4 = _loop_15(i);
          if (typeof state_4 === "object")
            return state_4.value;
        }
        for (var i = 0; i < lastRequiredIndex; i++) {
          if (expandedFlags[i] & 2)
            expandedFlags[i] = 1;
        }
        if (firstRestIndex >= 0 && firstRestIndex < lastOptionalOrRestIndex) {
          expandedTypes[firstRestIndex] = getUnionType(ts2.sameMap(expandedTypes.slice(firstRestIndex, lastOptionalOrRestIndex + 1), function(t, i2) {
            return expandedFlags[firstRestIndex + i2] & 8 ? getIndexedAccessType(t, numberType) : t;
          }));
          expandedTypes.splice(firstRestIndex + 1, lastOptionalOrRestIndex - firstRestIndex);
          expandedFlags.splice(firstRestIndex + 1, lastOptionalOrRestIndex - firstRestIndex);
          expandedDeclarations === null || expandedDeclarations === void 0 ? void 0 : expandedDeclarations.splice(firstRestIndex + 1, lastOptionalOrRestIndex - firstRestIndex);
        }
        var tupleTarget = getTupleTargetType(expandedFlags, target.readonly, expandedDeclarations);
        return tupleTarget === emptyGenericType ? emptyObjectType : expandedFlags.length ? createTypeReference(tupleTarget, expandedTypes) : tupleTarget;
        function addElement(type, flags, declaration) {
          if (flags & 1) {
            lastRequiredIndex = expandedFlags.length;
          }
          if (flags & 4 && firstRestIndex < 0) {
            firstRestIndex = expandedFlags.length;
          }
          if (flags & (2 | 4)) {
            lastOptionalOrRestIndex = expandedFlags.length;
          }
          expandedTypes.push(type);
          expandedFlags.push(flags);
          if (expandedDeclarations && declaration) {
            expandedDeclarations.push(declaration);
          } else {
            expandedDeclarations = void 0;
          }
        }
      }
      function sliceTupleType(type, index, endSkipCount) {
        if (endSkipCount === void 0) {
          endSkipCount = 0;
        }
        var target = type.target;
        var endIndex = getTypeReferenceArity(type) - endSkipCount;
        return index > target.fixedLength ? getRestArrayTypeOfTupleType(type) || createTupleType(ts2.emptyArray) : createTupleType(getTypeArguments(type).slice(index, endIndex), target.elementFlags.slice(index, endIndex), false, target.labeledElementDeclarations && target.labeledElementDeclarations.slice(index, endIndex));
      }
      function getKnownKeysOfTupleType(type) {
        return getUnionType(ts2.append(ts2.arrayOf(type.target.fixedLength, function(i) {
          return getStringLiteralType("" + i);
        }), getIndexType(type.target.readonly ? globalReadonlyArrayType : globalArrayType)));
      }
      function getStartElementCount(type, flags) {
        var index = ts2.findIndex(type.elementFlags, function(f) {
          return !(f & flags);
        });
        return index >= 0 ? index : type.elementFlags.length;
      }
      function getEndElementCount(type, flags) {
        return type.elementFlags.length - ts2.findLastIndex(type.elementFlags, function(f) {
          return !(f & flags);
        }) - 1;
      }
      function getTypeFromOptionalTypeNode(node) {
        return addOptionality(getTypeFromTypeNode(node.type), true);
      }
      function getTypeId(type) {
        return type.id;
      }
      function containsType(types, type) {
        return ts2.binarySearch(types, type, getTypeId, ts2.compareValues) >= 0;
      }
      function insertType(types, type) {
        var index = ts2.binarySearch(types, type, getTypeId, ts2.compareValues);
        if (index < 0) {
          types.splice(~index, 0, type);
          return true;
        }
        return false;
      }
      function addTypeToUnion(typeSet, includes, type) {
        var flags = type.flags;
        if (flags & 1048576) {
          return addTypesToUnion(typeSet, includes | (isNamedUnionType(type) ? 1048576 : 0), type.types);
        }
        if (!(flags & 131072)) {
          includes |= flags & 205258751;
          if (flags & 465829888)
            includes |= 33554432;
          if (type === wildcardType)
            includes |= 8388608;
          if (!strictNullChecks && flags & 98304) {
            if (!(ts2.getObjectFlags(type) & 131072))
              includes |= 4194304;
          } else {
            var len = typeSet.length;
            var index = len && type.id > typeSet[len - 1].id ? ~len : ts2.binarySearch(typeSet, type, getTypeId, ts2.compareValues);
            if (index < 0) {
              typeSet.splice(~index, 0, type);
            }
          }
        }
        return includes;
      }
      function addTypesToUnion(typeSet, includes, types) {
        for (var _i = 0, types_9 = types; _i < types_9.length; _i++) {
          var type = types_9[_i];
          includes = addTypeToUnion(typeSet, includes, type);
        }
        return includes;
      }
      function removeSubtypes(types, hasObjectTypes) {
        var id = getTypeListId(types);
        var match = subtypeReductionCache.get(id);
        if (match) {
          return match;
        }
        var hasEmptyObject = hasObjectTypes && ts2.some(types, function(t2) {
          return !!(t2.flags & 524288) && !isGenericMappedType(t2) && isEmptyResolvedType(resolveStructuredTypeMembers(t2));
        });
        var len = types.length;
        var i = len;
        var count = 0;
        while (i > 0) {
          i--;
          var source = types[i];
          if (hasEmptyObject || source.flags & 469499904) {
            var keyProperty = source.flags & (524288 | 2097152 | 58982400) ? ts2.find(getPropertiesOfType(source), function(p) {
              return isUnitType(getTypeOfSymbol(p));
            }) : void 0;
            var keyPropertyType = keyProperty && getRegularTypeOfLiteralType(getTypeOfSymbol(keyProperty));
            for (var _i = 0, types_10 = types; _i < types_10.length; _i++) {
              var target = types_10[_i];
              if (source !== target) {
                if (count === 1e5) {
                  var estimatedCount = count / (len - i) * len;
                  if (estimatedCount > 1e6) {
                    ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("checkTypes", "removeSubtypes_DepthLimit", { typeIds: types.map(function(t2) {
                      return t2.id;
                    }) });
                    error(currentNode, ts2.Diagnostics.Expression_produces_a_union_type_that_is_too_complex_to_represent);
                    return void 0;
                  }
                }
                count++;
                if (keyProperty && target.flags & (524288 | 2097152 | 58982400)) {
                  var t = getTypeOfPropertyOfType(target, keyProperty.escapedName);
                  if (t && isUnitType(t) && getRegularTypeOfLiteralType(t) !== keyPropertyType) {
                    continue;
                  }
                }
                if (isTypeRelatedTo(source, target, strictSubtypeRelation) && (!(ts2.getObjectFlags(getTargetType(source)) & 1) || !(ts2.getObjectFlags(getTargetType(target)) & 1) || isTypeDerivedFrom(source, target))) {
                  ts2.orderedRemoveItemAt(types, i);
                  break;
                }
              }
            }
          }
        }
        subtypeReductionCache.set(id, types);
        return types;
      }
      function removeRedundantLiteralTypes(types, includes, reduceVoidUndefined) {
        var i = types.length;
        while (i > 0) {
          i--;
          var t = types[i];
          var flags = t.flags;
          var remove = flags & (128 | 134217728 | 268435456) && includes & 4 || flags & 256 && includes & 8 || flags & 2048 && includes & 64 || flags & 8192 && includes & 4096 || reduceVoidUndefined && flags & 32768 && includes & 16384 || isFreshLiteralType(t) && containsType(types, t.regularType);
          if (remove) {
            ts2.orderedRemoveItemAt(types, i);
          }
        }
      }
      function removeStringLiteralsMatchedByTemplateLiterals(types) {
        var templates = ts2.filter(types, isPatternLiteralType);
        if (templates.length) {
          var i = types.length;
          var _loop_16 = function() {
            i--;
            var t = types[i];
            if (t.flags & 128 && ts2.some(templates, function(template) {
              return isTypeMatchedByTemplateLiteralType(t, template);
            })) {
              ts2.orderedRemoveItemAt(types, i);
            }
          };
          while (i > 0) {
            _loop_16();
          }
        }
      }
      function isNamedUnionType(type) {
        return !!(type.flags & 1048576 && (type.aliasSymbol || type.origin));
      }
      function addNamedUnions(namedUnions, types) {
        for (var _i = 0, types_11 = types; _i < types_11.length; _i++) {
          var t = types_11[_i];
          if (t.flags & 1048576) {
            var origin = t.origin;
            if (t.aliasSymbol || origin && !(origin.flags & 1048576)) {
              ts2.pushIfUnique(namedUnions, t);
            } else if (origin && origin.flags & 1048576) {
              addNamedUnions(namedUnions, origin.types);
            }
          }
        }
      }
      function createOriginUnionOrIntersectionType(flags, types) {
        var result = createOriginType(flags);
        result.types = types;
        return result;
      }
      function getUnionType(types, unionReduction, aliasSymbol, aliasTypeArguments, origin) {
        if (unionReduction === void 0) {
          unionReduction = 1;
        }
        if (types.length === 0) {
          return neverType;
        }
        if (types.length === 1) {
          return types[0];
        }
        var typeSet = [];
        var includes = addTypesToUnion(typeSet, 0, types);
        if (unionReduction !== 0) {
          if (includes & 3) {
            return includes & 1 ? includes & 8388608 ? wildcardType : anyType : includes & 65536 || containsType(typeSet, unknownType) ? unknownType : nonNullUnknownType;
          }
          if (exactOptionalPropertyTypes && includes & 32768) {
            var missingIndex = ts2.binarySearch(typeSet, missingType, getTypeId, ts2.compareValues);
            if (missingIndex >= 0 && containsType(typeSet, undefinedType)) {
              ts2.orderedRemoveItemAt(typeSet, missingIndex);
            }
          }
          if (includes & (2944 | 8192 | 134217728 | 268435456) || includes & 16384 && includes & 32768) {
            removeRedundantLiteralTypes(typeSet, includes, !!(unionReduction & 2));
          }
          if (includes & 128 && includes & 134217728) {
            removeStringLiteralsMatchedByTemplateLiterals(typeSet);
          }
          if (unionReduction === 2) {
            typeSet = removeSubtypes(typeSet, !!(includes & 524288));
            if (!typeSet) {
              return errorType;
            }
          }
          if (typeSet.length === 0) {
            return includes & 65536 ? includes & 4194304 ? nullType : nullWideningType : includes & 32768 ? includes & 4194304 ? undefinedType : undefinedWideningType : neverType;
          }
        }
        if (!origin && includes & 1048576) {
          var namedUnions = [];
          addNamedUnions(namedUnions, types);
          var reducedTypes = [];
          var _loop_17 = function(t2) {
            if (!ts2.some(namedUnions, function(union) {
              return containsType(union.types, t2);
            })) {
              reducedTypes.push(t2);
            }
          };
          for (var _i = 0, typeSet_1 = typeSet; _i < typeSet_1.length; _i++) {
            var t = typeSet_1[_i];
            _loop_17(t);
          }
          if (!aliasSymbol && namedUnions.length === 1 && reducedTypes.length === 0) {
            return namedUnions[0];
          }
          var namedTypesCount = ts2.reduceLeft(namedUnions, function(sum, union) {
            return sum + union.types.length;
          }, 0);
          if (namedTypesCount + reducedTypes.length === typeSet.length) {
            for (var _a = 0, namedUnions_1 = namedUnions; _a < namedUnions_1.length; _a++) {
              var t = namedUnions_1[_a];
              insertType(reducedTypes, t);
            }
            origin = createOriginUnionOrIntersectionType(1048576, reducedTypes);
          }
        }
        var objectFlags = (includes & 36323363 ? 0 : 65536) | (includes & 2097152 ? 33554432 : 0);
        return getUnionTypeFromSortedList(typeSet, objectFlags, aliasSymbol, aliasTypeArguments, origin);
      }
      function getUnionOrIntersectionTypePredicate(signatures, kind) {
        var first;
        var types = [];
        for (var _i = 0, signatures_6 = signatures; _i < signatures_6.length; _i++) {
          var sig = signatures_6[_i];
          var pred = getTypePredicateOfSignature(sig);
          if (!pred || pred.kind === 2 || pred.kind === 3) {
            if (kind !== 2097152) {
              continue;
            } else {
              return;
            }
          }
          if (first) {
            if (!typePredicateKindsMatch(first, pred)) {
              return void 0;
            }
          } else {
            first = pred;
          }
          types.push(pred.type);
        }
        if (!first) {
          return void 0;
        }
        var compositeType = getUnionOrIntersectionType(types, kind);
        return createTypePredicate(first.kind, first.parameterName, first.parameterIndex, compositeType);
      }
      function typePredicateKindsMatch(a, b) {
        return a.kind === b.kind && a.parameterIndex === b.parameterIndex;
      }
      function getUnionTypeFromSortedList(types, objectFlags, aliasSymbol, aliasTypeArguments, origin) {
        if (types.length === 0) {
          return neverType;
        }
        if (types.length === 1) {
          return types[0];
        }
        var typeKey = !origin ? getTypeListId(types) : origin.flags & 1048576 ? "|".concat(getTypeListId(origin.types)) : origin.flags & 2097152 ? "&".concat(getTypeListId(origin.types)) : "#".concat(origin.type.id, "|").concat(getTypeListId(types));
        var id = typeKey + getAliasId(aliasSymbol, aliasTypeArguments);
        var type = unionTypes.get(id);
        if (!type) {
          type = createType(1048576);
          type.objectFlags = objectFlags | getPropagatingFlagsOfTypes(types, 98304);
          type.types = types;
          type.origin = origin;
          type.aliasSymbol = aliasSymbol;
          type.aliasTypeArguments = aliasTypeArguments;
          if (types.length === 2 && types[0].flags & 512 && types[1].flags & 512) {
            type.flags |= 16;
            type.intrinsicName = "boolean";
          }
          unionTypes.set(id, type);
        }
        return type;
      }
      function getTypeFromUnionTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var aliasSymbol = getAliasSymbolForTypeNode(node);
          links.resolvedType = getUnionType(ts2.map(node.types, getTypeFromTypeNode), 1, aliasSymbol, getTypeArgumentsForAliasSymbol(aliasSymbol));
        }
        return links.resolvedType;
      }
      function addTypeToIntersection(typeSet, includes, type) {
        var flags = type.flags;
        if (flags & 2097152) {
          return addTypesToIntersection(typeSet, includes, type.types);
        }
        if (isEmptyAnonymousObjectType(type)) {
          if (!(includes & 16777216)) {
            includes |= 16777216;
            typeSet.set(type.id.toString(), type);
          }
        } else {
          if (flags & 3) {
            if (type === wildcardType)
              includes |= 8388608;
          } else if (strictNullChecks || !(flags & 98304)) {
            if (exactOptionalPropertyTypes && type === missingType) {
              includes |= 262144;
              type = undefinedType;
            }
            if (!typeSet.has(type.id.toString())) {
              if (type.flags & 109440 && includes & 109440) {
                includes |= 67108864;
              }
              typeSet.set(type.id.toString(), type);
            }
          }
          includes |= flags & 205258751;
        }
        return includes;
      }
      function addTypesToIntersection(typeSet, includes, types) {
        for (var _i = 0, types_12 = types; _i < types_12.length; _i++) {
          var type = types_12[_i];
          includes = addTypeToIntersection(typeSet, includes, getRegularTypeOfLiteralType(type));
        }
        return includes;
      }
      function removeRedundantPrimitiveTypes(types, includes) {
        var i = types.length;
        while (i > 0) {
          i--;
          var t = types[i];
          var remove = t.flags & 4 && includes & 128 || t.flags & 8 && includes & 256 || t.flags & 64 && includes & 2048 || t.flags & 4096 && includes & 8192;
          if (remove) {
            ts2.orderedRemoveItemAt(types, i);
          }
        }
      }
      function eachUnionContains(unionTypes2, type) {
        for (var _i = 0, unionTypes_1 = unionTypes2; _i < unionTypes_1.length; _i++) {
          var u = unionTypes_1[_i];
          if (!containsType(u.types, type)) {
            var primitive = type.flags & 128 ? stringType : type.flags & 256 ? numberType : type.flags & 2048 ? bigintType : type.flags & 8192 ? esSymbolType : void 0;
            if (!primitive || !containsType(u.types, primitive)) {
              return false;
            }
          }
        }
        return true;
      }
      function extractRedundantTemplateLiterals(types) {
        var i = types.length;
        var literals = ts2.filter(types, function(t3) {
          return !!(t3.flags & 128);
        });
        while (i > 0) {
          i--;
          var t = types[i];
          if (!(t.flags & 134217728))
            continue;
          for (var _i = 0, literals_1 = literals; _i < literals_1.length; _i++) {
            var t2 = literals_1[_i];
            if (isTypeSubtypeOf(t2, t)) {
              ts2.orderedRemoveItemAt(types, i);
              break;
            } else if (isPatternLiteralType(t)) {
              return true;
            }
          }
        }
        return false;
      }
      function eachIsUnionContaining(types, flag) {
        return ts2.every(types, function(t) {
          return !!(t.flags & 1048576) && ts2.some(t.types, function(tt) {
            return !!(tt.flags & flag);
          });
        });
      }
      function removeFromEach(types, flag) {
        for (var i = 0; i < types.length; i++) {
          types[i] = filterType(types[i], function(t) {
            return !(t.flags & flag);
          });
        }
      }
      function intersectUnionsOfPrimitiveTypes(types) {
        var unionTypes2;
        var index = ts2.findIndex(types, function(t2) {
          return !!(ts2.getObjectFlags(t2) & 65536);
        });
        if (index < 0) {
          return false;
        }
        var i = index + 1;
        while (i < types.length) {
          var t = types[i];
          if (ts2.getObjectFlags(t) & 65536) {
            (unionTypes2 || (unionTypes2 = [types[index]])).push(t);
            ts2.orderedRemoveItemAt(types, i);
          } else {
            i++;
          }
        }
        if (!unionTypes2) {
          return false;
        }
        var checked = [];
        var result = [];
        for (var _i = 0, unionTypes_2 = unionTypes2; _i < unionTypes_2.length; _i++) {
          var u = unionTypes_2[_i];
          for (var _a = 0, _b = u.types; _a < _b.length; _a++) {
            var t = _b[_a];
            if (insertType(checked, t)) {
              if (eachUnionContains(unionTypes2, t)) {
                insertType(result, t);
              }
            }
          }
        }
        types[index] = getUnionTypeFromSortedList(result, 65536);
        return true;
      }
      function createIntersectionType(types, aliasSymbol, aliasTypeArguments) {
        var result = createType(2097152);
        result.objectFlags = getPropagatingFlagsOfTypes(types, 98304);
        result.types = types;
        result.aliasSymbol = aliasSymbol;
        result.aliasTypeArguments = aliasTypeArguments;
        return result;
      }
      function getIntersectionType(types, aliasSymbol, aliasTypeArguments) {
        var typeMembershipMap = new ts2.Map();
        var includes = addTypesToIntersection(typeMembershipMap, 0, types);
        var typeSet = ts2.arrayFrom(typeMembershipMap.values());
        if (includes & 131072) {
          return ts2.contains(typeSet, silentNeverType) ? silentNeverType : neverType;
        }
        if (strictNullChecks && includes & 98304 && includes & (524288 | 67108864 | 16777216) || includes & 67108864 && includes & (469892092 & ~67108864) || includes & 402653316 && includes & (469892092 & ~402653316) || includes & 296 && includes & (469892092 & ~296) || includes & 2112 && includes & (469892092 & ~2112) || includes & 12288 && includes & (469892092 & ~12288) || includes & 49152 && includes & (469892092 & ~49152)) {
          return neverType;
        }
        if (includes & 134217728 && includes & 128 && extractRedundantTemplateLiterals(typeSet)) {
          return neverType;
        }
        if (includes & 1) {
          return includes & 8388608 ? wildcardType : anyType;
        }
        if (!strictNullChecks && includes & 98304) {
          return includes & 32768 ? undefinedType : nullType;
        }
        if (includes & 4 && includes & 128 || includes & 8 && includes & 256 || includes & 64 && includes & 2048 || includes & 4096 && includes & 8192) {
          removeRedundantPrimitiveTypes(typeSet, includes);
        }
        if (includes & 16777216 && includes & 524288) {
          ts2.orderedRemoveItemAt(typeSet, ts2.findIndex(typeSet, isEmptyAnonymousObjectType));
        }
        if (includes & 262144) {
          typeSet[typeSet.indexOf(undefinedType)] = missingType;
        }
        if (typeSet.length === 0) {
          return unknownType;
        }
        if (typeSet.length === 1) {
          return typeSet[0];
        }
        var id = getTypeListId(typeSet) + getAliasId(aliasSymbol, aliasTypeArguments);
        var result = intersectionTypes.get(id);
        if (!result) {
          if (includes & 1048576) {
            if (intersectUnionsOfPrimitiveTypes(typeSet)) {
              result = getIntersectionType(typeSet, aliasSymbol, aliasTypeArguments);
            } else if (eachIsUnionContaining(typeSet, 32768)) {
              var undefinedOrMissingType = exactOptionalPropertyTypes && ts2.some(typeSet, function(t) {
                return containsType(t.types, missingType);
              }) ? missingType : undefinedType;
              removeFromEach(typeSet, 32768);
              result = getUnionType([getIntersectionType(typeSet), undefinedOrMissingType], 1, aliasSymbol, aliasTypeArguments);
            } else if (eachIsUnionContaining(typeSet, 65536)) {
              removeFromEach(typeSet, 65536);
              result = getUnionType([getIntersectionType(typeSet), nullType], 1, aliasSymbol, aliasTypeArguments);
            } else {
              if (!checkCrossProductUnion(typeSet)) {
                return errorType;
              }
              var constituents = getCrossProductIntersections(typeSet);
              var origin = ts2.some(constituents, function(t) {
                return !!(t.flags & 2097152);
              }) ? createOriginUnionOrIntersectionType(2097152, typeSet) : void 0;
              result = getUnionType(constituents, 1, aliasSymbol, aliasTypeArguments, origin);
            }
          } else {
            result = createIntersectionType(typeSet, aliasSymbol, aliasTypeArguments);
          }
          intersectionTypes.set(id, result);
        }
        return result;
      }
      function getCrossProductUnionSize(types) {
        return ts2.reduceLeft(types, function(n, t) {
          return t.flags & 1048576 ? n * t.types.length : t.flags & 131072 ? 0 : n;
        }, 1);
      }
      function checkCrossProductUnion(types) {
        var size = getCrossProductUnionSize(types);
        if (size >= 1e5) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("checkTypes", "checkCrossProductUnion_DepthLimit", { typeIds: types.map(function(t) {
            return t.id;
          }), size });
          error(currentNode, ts2.Diagnostics.Expression_produces_a_union_type_that_is_too_complex_to_represent);
          return false;
        }
        return true;
      }
      function getCrossProductIntersections(types) {
        var count = getCrossProductUnionSize(types);
        var intersections = [];
        for (var i = 0; i < count; i++) {
          var constituents = types.slice();
          var n = i;
          for (var j = types.length - 1; j >= 0; j--) {
            if (types[j].flags & 1048576) {
              var sourceTypes = types[j].types;
              var length_5 = sourceTypes.length;
              constituents[j] = sourceTypes[n % length_5];
              n = Math.floor(n / length_5);
            }
          }
          var t = getIntersectionType(constituents);
          if (!(t.flags & 131072))
            intersections.push(t);
        }
        return intersections;
      }
      function getTypeFromIntersectionTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var aliasSymbol = getAliasSymbolForTypeNode(node);
          links.resolvedType = getIntersectionType(ts2.map(node.types, getTypeFromTypeNode), aliasSymbol, getTypeArgumentsForAliasSymbol(aliasSymbol));
        }
        return links.resolvedType;
      }
      function createIndexType(type, stringsOnly) {
        var result = createType(4194304);
        result.type = type;
        result.stringsOnly = stringsOnly;
        return result;
      }
      function createOriginIndexType(type) {
        var result = createOriginType(4194304);
        result.type = type;
        return result;
      }
      function getIndexTypeForGenericType(type, stringsOnly) {
        return stringsOnly ? type.resolvedStringIndexType || (type.resolvedStringIndexType = createIndexType(type, true)) : type.resolvedIndexType || (type.resolvedIndexType = createIndexType(type, false));
      }
      function getIndexTypeForMappedType(type, stringsOnly, noIndexSignatures) {
        var typeParameter = getTypeParameterFromMappedType(type);
        var constraintType = getConstraintTypeFromMappedType(type);
        var nameType = getNameTypeFromMappedType(type.target || type);
        if (!nameType && !noIndexSignatures) {
          return constraintType;
        }
        var keyTypes = [];
        if (isMappedTypeWithKeyofConstraintDeclaration(type)) {
          if (!isGenericIndexType(constraintType)) {
            var modifiersType = getApparentType(getModifiersTypeFromMappedType(type));
            forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType(modifiersType, 8576, stringsOnly, addMemberForKeyType);
          } else {
            return getIndexTypeForGenericType(type, stringsOnly);
          }
        } else {
          forEachType(getLowerBoundOfKeyType(constraintType), addMemberForKeyType);
        }
        if (isGenericIndexType(constraintType)) {
          forEachType(constraintType, addMemberForKeyType);
        }
        var result = noIndexSignatures ? filterType(getUnionType(keyTypes), function(t) {
          return !(t.flags & (1 | 4));
        }) : getUnionType(keyTypes);
        if (result.flags & 1048576 && constraintType.flags & 1048576 && getTypeListId(result.types) === getTypeListId(constraintType.types)) {
          return constraintType;
        }
        return result;
        function addMemberForKeyType(keyType) {
          var propNameType = nameType ? instantiateType(nameType, appendTypeMapping(type.mapper, typeParameter, keyType)) : keyType;
          keyTypes.push(propNameType === stringType ? stringOrNumberType : propNameType);
        }
      }
      function hasDistributiveNameType(mappedType) {
        var typeVariable = getTypeParameterFromMappedType(mappedType);
        return isDistributive(getNameTypeFromMappedType(mappedType) || typeVariable);
        function isDistributive(type) {
          return type.flags & (3 | 131068 | 131072 | 262144 | 524288 | 67108864) ? true : type.flags & 16777216 ? type.root.isDistributive && type.checkType === typeVariable : type.flags & (3145728 | 134217728) ? ts2.every(type.types, isDistributive) : type.flags & 8388608 ? isDistributive(type.objectType) && isDistributive(type.indexType) : type.flags & 33554432 ? isDistributive(type.substitute) : type.flags & 268435456 ? isDistributive(type.type) : false;
        }
      }
      function getLiteralTypeFromPropertyName(name) {
        if (ts2.isPrivateIdentifier(name)) {
          return neverType;
        }
        return ts2.isIdentifier(name) ? getStringLiteralType(ts2.unescapeLeadingUnderscores(name.escapedText)) : getRegularTypeOfLiteralType(ts2.isComputedPropertyName(name) ? checkComputedPropertyName(name) : checkExpression(name));
      }
      function getLiteralTypeFromProperty(prop, include, includeNonPublic) {
        if (includeNonPublic || !(ts2.getDeclarationModifierFlagsFromSymbol(prop) & 24)) {
          var type = getSymbolLinks(getLateBoundSymbol(prop)).nameType;
          if (!type) {
            var name = ts2.getNameOfDeclaration(prop.valueDeclaration);
            type = prop.escapedName === "default" ? getStringLiteralType("default") : name && getLiteralTypeFromPropertyName(name) || (!ts2.isKnownSymbol(prop) ? getStringLiteralType(ts2.symbolName(prop)) : void 0);
          }
          if (type && type.flags & include) {
            return type;
          }
        }
        return neverType;
      }
      function isKeyTypeIncluded(keyType, include) {
        return !!(keyType.flags & include || keyType.flags & 2097152 && ts2.some(keyType.types, function(t) {
          return isKeyTypeIncluded(t, include);
        }));
      }
      function getLiteralTypeFromProperties(type, include, includeOrigin) {
        var origin = includeOrigin && (ts2.getObjectFlags(type) & (3 | 4) || type.aliasSymbol) ? createOriginIndexType(type) : void 0;
        var propertyTypes = ts2.map(getPropertiesOfType(type), function(prop) {
          return getLiteralTypeFromProperty(prop, include);
        });
        var indexKeyTypes = ts2.map(getIndexInfosOfType(type), function(info) {
          return info !== enumNumberIndexInfo && isKeyTypeIncluded(info.keyType, include) ? info.keyType === stringType && include & 8 ? stringOrNumberType : info.keyType : neverType;
        });
        return getUnionType(ts2.concatenate(propertyTypes, indexKeyTypes), 1, void 0, void 0, origin);
      }
      function getIndexType(type, stringsOnly, noIndexSignatures) {
        if (stringsOnly === void 0) {
          stringsOnly = keyofStringsOnly;
        }
        type = getReducedType(type);
        return type.flags & 1048576 ? getIntersectionType(ts2.map(type.types, function(t) {
          return getIndexType(t, stringsOnly, noIndexSignatures);
        })) : type.flags & 2097152 ? getUnionType(ts2.map(type.types, function(t) {
          return getIndexType(t, stringsOnly, noIndexSignatures);
        })) : type.flags & 58982400 || isGenericTupleType(type) || isGenericMappedType(type) && !hasDistributiveNameType(type) ? getIndexTypeForGenericType(type, stringsOnly) : ts2.getObjectFlags(type) & 32 ? getIndexTypeForMappedType(type, stringsOnly, noIndexSignatures) : type === wildcardType ? wildcardType : type.flags & 2 ? neverType : type.flags & (1 | 131072) ? keyofConstraintType : getLiteralTypeFromProperties(type, (noIndexSignatures ? 128 : 402653316) | (stringsOnly ? 0 : 296 | 12288), stringsOnly === keyofStringsOnly && !noIndexSignatures);
      }
      function getExtractStringType(type) {
        if (keyofStringsOnly) {
          return type;
        }
        var extractTypeAlias = getGlobalExtractSymbol();
        return extractTypeAlias ? getTypeAliasInstantiation(extractTypeAlias, [type, stringType]) : stringType;
      }
      function getIndexTypeOrString(type) {
        var indexType = getExtractStringType(getIndexType(type));
        return indexType.flags & 131072 ? stringType : indexType;
      }
      function getTypeFromTypeOperatorNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          switch (node.operator) {
            case 140:
              links.resolvedType = getIndexType(getTypeFromTypeNode(node.type));
              break;
            case 153:
              links.resolvedType = node.type.kind === 150 ? getESSymbolLikeTypeForNode(ts2.walkUpParenthesizedTypes(node.parent)) : errorType;
              break;
            case 144:
              links.resolvedType = getTypeFromTypeNode(node.type);
              break;
            default:
              throw ts2.Debug.assertNever(node.operator);
          }
        }
        return links.resolvedType;
      }
      function getTypeFromTemplateTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          links.resolvedType = getTemplateLiteralType(__spreadArray([node.head.text], ts2.map(node.templateSpans, function(span) {
            return span.literal.text;
          }), true), ts2.map(node.templateSpans, function(span) {
            return getTypeFromTypeNode(span.type);
          }));
        }
        return links.resolvedType;
      }
      function getTemplateLiteralType(texts, types) {
        var unionIndex = ts2.findIndex(types, function(t) {
          return !!(t.flags & (131072 | 1048576));
        });
        if (unionIndex >= 0) {
          return checkCrossProductUnion(types) ? mapType(types[unionIndex], function(t) {
            return getTemplateLiteralType(texts, ts2.replaceElement(types, unionIndex, t));
          }) : errorType;
        }
        if (ts2.contains(types, wildcardType)) {
          return wildcardType;
        }
        var newTypes = [];
        var newTexts = [];
        var text = texts[0];
        if (!addSpans(texts, types)) {
          return stringType;
        }
        if (newTypes.length === 0) {
          return getStringLiteralType(text);
        }
        newTexts.push(text);
        if (ts2.every(newTexts, function(t) {
          return t === "";
        }) && ts2.every(newTypes, function(t) {
          return !!(t.flags & 4);
        })) {
          return stringType;
        }
        var id = "".concat(getTypeListId(newTypes), "|").concat(ts2.map(newTexts, function(t) {
          return t.length;
        }).join(","), "|").concat(newTexts.join(""));
        var type = templateLiteralTypes.get(id);
        if (!type) {
          templateLiteralTypes.set(id, type = createTemplateLiteralType(newTexts, newTypes));
        }
        return type;
        function addSpans(texts2, types2) {
          for (var i = 0; i < types2.length; i++) {
            var t = types2[i];
            if (t.flags & (2944 | 65536 | 32768)) {
              text += getTemplateStringForType(t) || "";
              text += texts2[i + 1];
            } else if (t.flags & 134217728) {
              text += t.texts[0];
              if (!addSpans(t.texts, t.types))
                return false;
              text += texts2[i + 1];
            } else if (isGenericIndexType(t) || isPatternLiteralPlaceholderType(t)) {
              newTypes.push(t);
              newTexts.push(text);
              text = texts2[i + 1];
            } else {
              return false;
            }
          }
          return true;
        }
      }
      function getTemplateStringForType(type) {
        return type.flags & 128 ? type.value : type.flags & 256 ? "" + type.value : type.flags & 2048 ? ts2.pseudoBigIntToString(type.value) : type.flags & (512 | 98304) ? type.intrinsicName : void 0;
      }
      function createTemplateLiteralType(texts, types) {
        var type = createType(134217728);
        type.texts = texts;
        type.types = types;
        return type;
      }
      function getStringMappingType(symbol, type) {
        return type.flags & (1048576 | 131072) ? mapType(type, function(t) {
          return getStringMappingType(symbol, t);
        }) : isGenericIndexType(type) ? getStringMappingTypeForGenericType(symbol, type) : type.flags & 128 ? getStringLiteralType(applyStringMapping(symbol, type.value)) : type;
      }
      function applyStringMapping(symbol, str) {
        switch (intrinsicTypeKinds.get(symbol.escapedName)) {
          case 0:
            return str.toUpperCase();
          case 1:
            return str.toLowerCase();
          case 2:
            return str.charAt(0).toUpperCase() + str.slice(1);
          case 3:
            return str.charAt(0).toLowerCase() + str.slice(1);
        }
        return str;
      }
      function getStringMappingTypeForGenericType(symbol, type) {
        var id = "".concat(getSymbolId(symbol), ",").concat(getTypeId(type));
        var result = stringMappingTypes.get(id);
        if (!result) {
          stringMappingTypes.set(id, result = createStringMappingType(symbol, type));
        }
        return result;
      }
      function createStringMappingType(symbol, type) {
        var result = createType(268435456);
        result.symbol = symbol;
        result.type = type;
        return result;
      }
      function createIndexedAccessType(objectType, indexType, accessFlags, aliasSymbol, aliasTypeArguments) {
        var type = createType(8388608);
        type.objectType = objectType;
        type.indexType = indexType;
        type.accessFlags = accessFlags;
        type.aliasSymbol = aliasSymbol;
        type.aliasTypeArguments = aliasTypeArguments;
        return type;
      }
      function isJSLiteralType(type) {
        if (noImplicitAny) {
          return false;
        }
        if (ts2.getObjectFlags(type) & 8192) {
          return true;
        }
        if (type.flags & 1048576) {
          return ts2.every(type.types, isJSLiteralType);
        }
        if (type.flags & 2097152) {
          return ts2.some(type.types, isJSLiteralType);
        }
        if (type.flags & 465829888) {
          var constraint = getResolvedBaseConstraint(type);
          return constraint !== type && isJSLiteralType(constraint);
        }
        return false;
      }
      function getPropertyNameFromIndex(indexType, accessNode) {
        return isTypeUsableAsPropertyName(indexType) ? getPropertyNameFromType(indexType) : accessNode && ts2.isPropertyName(accessNode) ? ts2.getPropertyNameForPropertyNameNode(accessNode) : void 0;
      }
      function isUncalledFunctionReference(node, symbol) {
        if (symbol.flags & (16 | 8192)) {
          var parent = ts2.findAncestor(node.parent, function(n) {
            return !ts2.isAccessExpression(n);
          }) || node.parent;
          if (ts2.isCallLikeExpression(parent)) {
            return ts2.isCallOrNewExpression(parent) && ts2.isIdentifier(node) && hasMatchingArgument(parent, node);
          }
          return ts2.every(symbol.declarations, function(d) {
            return !ts2.isFunctionLike(d) || !!(ts2.getCombinedNodeFlags(d) & 134217728);
          });
        }
        return true;
      }
      function getPropertyTypeForIndexType(originalObjectType, objectType, indexType, fullIndexType, accessNode, accessFlags) {
        var _a;
        var accessExpression = accessNode && accessNode.kind === 206 ? accessNode : void 0;
        var propName = accessNode && ts2.isPrivateIdentifier(accessNode) ? void 0 : getPropertyNameFromIndex(indexType, accessNode);
        if (propName !== void 0) {
          if (accessFlags & 256) {
            return getTypeOfPropertyOfContextualType(objectType, propName) || anyType;
          }
          var prop = getPropertyOfType(objectType, propName);
          if (prop) {
            if (accessFlags & 64 && accessNode && prop.declarations && getDeclarationNodeFlagsFromSymbol(prop) & 134217728 && isUncalledFunctionReference(accessNode, prop)) {
              var deprecatedNode = (_a = accessExpression === null || accessExpression === void 0 ? void 0 : accessExpression.argumentExpression) !== null && _a !== void 0 ? _a : ts2.isIndexedAccessTypeNode(accessNode) ? accessNode.indexType : accessNode;
              addDeprecatedSuggestion(deprecatedNode, prop.declarations, propName);
            }
            if (accessExpression) {
              markPropertyAsReferenced(prop, accessExpression, isSelfTypeAccess(accessExpression.expression, objectType.symbol));
              if (isAssignmentToReadonlyEntity(accessExpression, prop, ts2.getAssignmentTargetKind(accessExpression))) {
                error(accessExpression.argumentExpression, ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_read_only_property, symbolToString(prop));
                return void 0;
              }
              if (accessFlags & 8) {
                getNodeLinks(accessNode).resolvedSymbol = prop;
              }
              if (isThisPropertyAccessInConstructor(accessExpression, prop)) {
                return autoType;
              }
            }
            var propType = getTypeOfSymbol(prop);
            return accessExpression && ts2.getAssignmentTargetKind(accessExpression) !== 1 ? getFlowTypeOfReference(accessExpression, propType) : propType;
          }
          if (everyType(objectType, isTupleType) && isNumericLiteralName(propName) && +propName >= 0) {
            if (accessNode && everyType(objectType, function(t) {
              return !t.target.hasRestElement;
            }) && !(accessFlags & 16)) {
              var indexNode = getIndexNodeForAccessExpression(accessNode);
              if (isTupleType(objectType)) {
                error(indexNode, ts2.Diagnostics.Tuple_type_0_of_length_1_has_no_element_at_index_2, typeToString(objectType), getTypeReferenceArity(objectType), ts2.unescapeLeadingUnderscores(propName));
              } else {
                error(indexNode, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, ts2.unescapeLeadingUnderscores(propName), typeToString(objectType));
              }
            }
            errorIfWritingToReadonlyIndex(getIndexInfoOfType(objectType, numberType));
            return mapType(objectType, function(t) {
              var restType = getRestTypeOfTupleType(t) || undefinedType;
              return accessFlags & 1 ? getUnionType([restType, undefinedType]) : restType;
            });
          }
        }
        if (!(indexType.flags & 98304) && isTypeAssignableToKind(indexType, 402653316 | 296 | 12288)) {
          if (objectType.flags & (1 | 131072)) {
            return objectType;
          }
          var indexInfo = getApplicableIndexInfo(objectType, indexType) || getIndexInfoOfType(objectType, stringType);
          if (indexInfo) {
            if (accessFlags & 2 && indexInfo.keyType !== numberType) {
              if (accessExpression) {
                error(accessExpression, ts2.Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(originalObjectType));
              }
              return void 0;
            }
            if (accessNode && indexInfo.keyType === stringType && !isTypeAssignableToKind(indexType, 4 | 8)) {
              var indexNode = getIndexNodeForAccessExpression(accessNode);
              error(indexNode, ts2.Diagnostics.Type_0_cannot_be_used_as_an_index_type, typeToString(indexType));
              return accessFlags & 1 ? getUnionType([indexInfo.type, undefinedType]) : indexInfo.type;
            }
            errorIfWritingToReadonlyIndex(indexInfo);
            return accessFlags & 1 ? getUnionType([indexInfo.type, undefinedType]) : indexInfo.type;
          }
          if (indexType.flags & 131072) {
            return neverType;
          }
          if (isJSLiteralType(objectType)) {
            return anyType;
          }
          if (accessExpression && !isConstEnumObjectType(objectType)) {
            if (isObjectLiteralType(objectType)) {
              if (noImplicitAny && indexType.flags & (128 | 256)) {
                diagnostics.add(ts2.createDiagnosticForNode(accessExpression, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, indexType.value, typeToString(objectType)));
                return undefinedType;
              } else if (indexType.flags & (8 | 4)) {
                var types = ts2.map(objectType.properties, function(property) {
                  return getTypeOfSymbol(property);
                });
                return getUnionType(ts2.append(types, undefinedType));
              }
            }
            if (objectType.symbol === globalThisSymbol && propName !== void 0 && globalThisSymbol.exports.has(propName) && globalThisSymbol.exports.get(propName).flags & 418) {
              error(accessExpression, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, ts2.unescapeLeadingUnderscores(propName), typeToString(objectType));
            } else if (noImplicitAny && !compilerOptions.suppressImplicitAnyIndexErrors && !(accessFlags & 128)) {
              if (propName !== void 0 && typeHasStaticProperty(propName, objectType)) {
                var typeName = typeToString(objectType);
                error(accessExpression, ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead, propName, typeName, typeName + "[" + ts2.getTextOfNode(accessExpression.argumentExpression) + "]");
              } else if (getIndexTypeOfType(objectType, numberType)) {
                error(accessExpression.argumentExpression, ts2.Diagnostics.Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number);
              } else {
                var suggestion = void 0;
                if (propName !== void 0 && (suggestion = getSuggestionForNonexistentProperty(propName, objectType))) {
                  if (suggestion !== void 0) {
                    error(accessExpression.argumentExpression, ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(objectType), suggestion);
                  }
                } else {
                  var suggestion_1 = getSuggestionForNonexistentIndexSignature(objectType, accessExpression, indexType);
                  if (suggestion_1 !== void 0) {
                    error(accessExpression, ts2.Diagnostics.Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature_Did_you_mean_to_call_1, typeToString(objectType), suggestion_1);
                  } else {
                    var errorInfo = void 0;
                    if (indexType.flags & 1024) {
                      errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, "[" + typeToString(indexType) + "]", typeToString(objectType));
                    } else if (indexType.flags & 8192) {
                      var symbolName_2 = getFullyQualifiedName(indexType.symbol, accessExpression);
                      errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, "[" + symbolName_2 + "]", typeToString(objectType));
                    } else if (indexType.flags & 128) {
                      errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, indexType.value, typeToString(objectType));
                    } else if (indexType.flags & 256) {
                      errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, indexType.value, typeToString(objectType));
                    } else if (indexType.flags & (8 | 4)) {
                      errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.No_index_signature_with_a_parameter_of_type_0_was_found_on_type_1, typeToString(indexType), typeToString(objectType));
                    }
                    errorInfo = ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.Element_implicitly_has_an_any_type_because_expression_of_type_0_can_t_be_used_to_index_type_1, typeToString(fullIndexType), typeToString(objectType));
                    diagnostics.add(ts2.createDiagnosticForNodeFromMessageChain(accessExpression, errorInfo));
                  }
                }
              }
            }
            return void 0;
          }
        }
        if (isJSLiteralType(objectType)) {
          return anyType;
        }
        if (accessNode) {
          var indexNode = getIndexNodeForAccessExpression(accessNode);
          if (indexType.flags & (128 | 256)) {
            error(indexNode, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, "" + indexType.value, typeToString(objectType));
          } else if (indexType.flags & (4 | 8)) {
            error(indexNode, ts2.Diagnostics.Type_0_has_no_matching_index_signature_for_type_1, typeToString(objectType), typeToString(indexType));
          } else {
            error(indexNode, ts2.Diagnostics.Type_0_cannot_be_used_as_an_index_type, typeToString(indexType));
          }
        }
        if (isTypeAny(indexType)) {
          return indexType;
        }
        return void 0;
        function errorIfWritingToReadonlyIndex(indexInfo2) {
          if (indexInfo2 && indexInfo2.isReadonly && accessExpression && (ts2.isAssignmentTarget(accessExpression) || ts2.isDeleteTarget(accessExpression))) {
            error(accessExpression, ts2.Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(objectType));
          }
        }
      }
      function getIndexNodeForAccessExpression(accessNode) {
        return accessNode.kind === 206 ? accessNode.argumentExpression : accessNode.kind === 193 ? accessNode.indexType : accessNode.kind === 161 ? accessNode.expression : accessNode;
      }
      function isPatternLiteralPlaceholderType(type) {
        return !!(type.flags & (1 | 4 | 8 | 64));
      }
      function isPatternLiteralType(type) {
        return !!(type.flags & 134217728) && ts2.every(type.types, isPatternLiteralPlaceholderType);
      }
      function isGenericType(type) {
        return !!getGenericObjectFlags(type);
      }
      function isGenericObjectType(type) {
        return !!(getGenericObjectFlags(type) & 8388608);
      }
      function isGenericIndexType(type) {
        return !!(getGenericObjectFlags(type) & 16777216);
      }
      function getGenericObjectFlags(type) {
        if (type.flags & 3145728) {
          if (!(type.objectFlags & 4194304)) {
            type.objectFlags |= 4194304 | ts2.reduceLeft(type.types, function(flags, t) {
              return flags | getGenericObjectFlags(t);
            }, 0);
          }
          return type.objectFlags & 25165824;
        }
        if (type.flags & 33554432) {
          if (!(type.objectFlags & 4194304)) {
            type.objectFlags |= 4194304 | getGenericObjectFlags(type.substitute) | getGenericObjectFlags(type.baseType);
          }
          return type.objectFlags & 25165824;
        }
        return (type.flags & 58982400 || isGenericMappedType(type) || isGenericTupleType(type) ? 8388608 : 0) | (type.flags & (58982400 | 4194304 | 134217728 | 268435456) && !isPatternLiteralType(type) ? 16777216 : 0);
      }
      function isThisTypeParameter(type) {
        return !!(type.flags & 262144 && type.isThisType);
      }
      function getSimplifiedType(type, writing) {
        return type.flags & 8388608 ? getSimplifiedIndexedAccessType(type, writing) : type.flags & 16777216 ? getSimplifiedConditionalType(type, writing) : type;
      }
      function distributeIndexOverObjectType(objectType, indexType, writing) {
        if (objectType.flags & 3145728) {
          var types = ts2.map(objectType.types, function(t) {
            return getSimplifiedType(getIndexedAccessType(t, indexType), writing);
          });
          return objectType.flags & 2097152 || writing ? getIntersectionType(types) : getUnionType(types);
        }
      }
      function distributeObjectOverIndexType(objectType, indexType, writing) {
        if (indexType.flags & 1048576) {
          var types = ts2.map(indexType.types, function(t) {
            return getSimplifiedType(getIndexedAccessType(objectType, t), writing);
          });
          return writing ? getIntersectionType(types) : getUnionType(types);
        }
      }
      function getSimplifiedIndexedAccessType(type, writing) {
        var cache = writing ? "simplifiedForWriting" : "simplifiedForReading";
        if (type[cache]) {
          return type[cache] === circularConstraintType ? type : type[cache];
        }
        type[cache] = circularConstraintType;
        var objectType = getSimplifiedType(type.objectType, writing);
        var indexType = getSimplifiedType(type.indexType, writing);
        var distributedOverIndex = distributeObjectOverIndexType(objectType, indexType, writing);
        if (distributedOverIndex) {
          return type[cache] = distributedOverIndex;
        }
        if (!(indexType.flags & 465829888)) {
          var distributedOverObject = distributeIndexOverObjectType(objectType, indexType, writing);
          if (distributedOverObject) {
            return type[cache] = distributedOverObject;
          }
        }
        if (isGenericTupleType(objectType) && indexType.flags & 296) {
          var elementType = getElementTypeOfSliceOfTupleType(objectType, indexType.flags & 8 ? 0 : objectType.target.fixedLength, 0, writing);
          if (elementType) {
            return type[cache] = elementType;
          }
        }
        if (isGenericMappedType(objectType)) {
          return type[cache] = mapType(substituteIndexedMappedType(objectType, type.indexType), function(t) {
            return getSimplifiedType(t, writing);
          });
        }
        return type[cache] = type;
      }
      function getSimplifiedConditionalType(type, writing) {
        var checkType = type.checkType;
        var extendsType = type.extendsType;
        var trueType2 = getTrueTypeFromConditionalType(type);
        var falseType2 = getFalseTypeFromConditionalType(type);
        if (falseType2.flags & 131072 && getActualTypeVariable(trueType2) === getActualTypeVariable(checkType)) {
          if (checkType.flags & 1 || isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) {
            return getSimplifiedType(trueType2, writing);
          } else if (isIntersectionEmpty(checkType, extendsType)) {
            return neverType;
          }
        } else if (trueType2.flags & 131072 && getActualTypeVariable(falseType2) === getActualTypeVariable(checkType)) {
          if (!(checkType.flags & 1) && isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(extendsType))) {
            return neverType;
          } else if (checkType.flags & 1 || isIntersectionEmpty(checkType, extendsType)) {
            return getSimplifiedType(falseType2, writing);
          }
        }
        return type;
      }
      function isIntersectionEmpty(type1, type2) {
        return !!(getUnionType([intersectTypes(type1, type2), neverType]).flags & 131072);
      }
      function substituteIndexedMappedType(objectType, index) {
        var mapper = createTypeMapper([getTypeParameterFromMappedType(objectType)], [index]);
        var templateMapper = combineTypeMappers(objectType.mapper, mapper);
        return instantiateType(getTemplateTypeFromMappedType(objectType), templateMapper);
      }
      function getIndexedAccessType(objectType, indexType, accessFlags, accessNode, aliasSymbol, aliasTypeArguments) {
        if (accessFlags === void 0) {
          accessFlags = 0;
        }
        return getIndexedAccessTypeOrUndefined(objectType, indexType, accessFlags, accessNode, aliasSymbol, aliasTypeArguments) || (accessNode ? errorType : unknownType);
      }
      function indexTypeLessThan(indexType, limit) {
        return everyType(indexType, function(t) {
          if (t.flags & 384) {
            var propName = getPropertyNameFromType(t);
            if (isNumericLiteralName(propName)) {
              var index = +propName;
              return index >= 0 && index < limit;
            }
          }
          return false;
        });
      }
      function getIndexedAccessTypeOrUndefined(objectType, indexType, accessFlags, accessNode, aliasSymbol, aliasTypeArguments) {
        if (accessFlags === void 0) {
          accessFlags = 0;
        }
        if (objectType === wildcardType || indexType === wildcardType) {
          return wildcardType;
        }
        if (isStringIndexSignatureOnlyType(objectType) && !(indexType.flags & 98304) && isTypeAssignableToKind(indexType, 4 | 8)) {
          indexType = stringType;
        }
        if (compilerOptions.noUncheckedIndexedAccess && accessFlags & 32)
          accessFlags |= 1;
        if (isGenericIndexType(indexType) || (accessNode && accessNode.kind !== 193 ? isGenericTupleType(objectType) && !indexTypeLessThan(indexType, objectType.target.fixedLength) : isGenericObjectType(objectType) && !(isTupleType(objectType) && indexTypeLessThan(indexType, objectType.target.fixedLength)))) {
          if (objectType.flags & 3) {
            return objectType;
          }
          var persistentAccessFlags = accessFlags & 1;
          var id = objectType.id + "," + indexType.id + "," + persistentAccessFlags + getAliasId(aliasSymbol, aliasTypeArguments);
          var type = indexedAccessTypes.get(id);
          if (!type) {
            indexedAccessTypes.set(id, type = createIndexedAccessType(objectType, indexType, persistentAccessFlags, aliasSymbol, aliasTypeArguments));
          }
          return type;
        }
        var apparentObjectType = getReducedApparentType(objectType);
        if (indexType.flags & 1048576 && !(indexType.flags & 16)) {
          var propTypes = [];
          var wasMissingProp = false;
          for (var _i = 0, _a = indexType.types; _i < _a.length; _i++) {
            var t = _a[_i];
            var propType = getPropertyTypeForIndexType(objectType, apparentObjectType, t, indexType, accessNode, accessFlags | (wasMissingProp ? 128 : 0));
            if (propType) {
              propTypes.push(propType);
            } else if (!accessNode) {
              return void 0;
            } else {
              wasMissingProp = true;
            }
          }
          if (wasMissingProp) {
            return void 0;
          }
          return accessFlags & 4 ? getIntersectionType(propTypes, aliasSymbol, aliasTypeArguments) : getUnionType(propTypes, 1, aliasSymbol, aliasTypeArguments);
        }
        return getPropertyTypeForIndexType(objectType, apparentObjectType, indexType, indexType, accessNode, accessFlags | 8 | 64);
      }
      function getTypeFromIndexedAccessTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var objectType = getTypeFromTypeNode(node.objectType);
          var indexType = getTypeFromTypeNode(node.indexType);
          var potentialAlias = getAliasSymbolForTypeNode(node);
          var resolved = getIndexedAccessType(objectType, indexType, 0, node, potentialAlias, getTypeArgumentsForAliasSymbol(potentialAlias));
          links.resolvedType = resolved.flags & 8388608 && resolved.objectType === objectType && resolved.indexType === indexType ? getConditionalFlowTypeOfType(resolved, node) : resolved;
        }
        return links.resolvedType;
      }
      function getTypeFromMappedTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var type = createObjectType(32, node.symbol);
          type.declaration = node;
          type.aliasSymbol = getAliasSymbolForTypeNode(node);
          type.aliasTypeArguments = getTypeArgumentsForAliasSymbol(type.aliasSymbol);
          links.resolvedType = type;
          getConstraintTypeFromMappedType(type);
        }
        return links.resolvedType;
      }
      function getActualTypeVariable(type) {
        if (type.flags & 33554432) {
          return type.baseType;
        }
        if (type.flags & 8388608 && (type.objectType.flags & 33554432 || type.indexType.flags & 33554432)) {
          return getIndexedAccessType(getActualTypeVariable(type.objectType), getActualTypeVariable(type.indexType));
        }
        return type;
      }
      function isTypicalNondistributiveConditional(root) {
        return !root.isDistributive && isSingletonTupleType(root.node.checkType) && isSingletonTupleType(root.node.extendsType);
      }
      function isSingletonTupleType(node) {
        return ts2.isTupleTypeNode(node) && ts2.length(node.elements) === 1 && !ts2.isOptionalTypeNode(node.elements[0]) && !ts2.isRestTypeNode(node.elements[0]);
      }
      function unwrapNondistributiveConditionalTuple(root, type) {
        return isTypicalNondistributiveConditional(root) && isTupleType(type) ? getTypeArguments(type)[0] : type;
      }
      function getConditionalType(root, mapper, aliasSymbol, aliasTypeArguments) {
        var result;
        var extraTypes;
        var tailCount = 0;
        while (true) {
          if (tailCount === 1e3) {
            error(currentNode, ts2.Diagnostics.Type_instantiation_is_excessively_deep_and_possibly_infinite);
            result = errorType;
            break;
          }
          var isUnwrapped = isTypicalNondistributiveConditional(root);
          var checkType = instantiateType(unwrapNondistributiveConditionalTuple(root, getActualTypeVariable(root.checkType)), mapper);
          var checkTypeInstantiable = isGenericType(checkType);
          var extendsType = instantiateType(unwrapNondistributiveConditionalTuple(root, root.extendsType), mapper);
          if (checkType === wildcardType || extendsType === wildcardType) {
            return wildcardType;
          }
          var combinedMapper = void 0;
          if (root.inferTypeParameters) {
            var context = createInferenceContext(root.inferTypeParameters, void 0, 0);
            if (!checkTypeInstantiable) {
              inferTypes(context.inferences, checkType, extendsType, 512 | 1024);
            }
            combinedMapper = mapper ? combineTypeMappers(context.mapper, mapper) : context.mapper;
          }
          var inferredExtendsType = combinedMapper ? instantiateType(unwrapNondistributiveConditionalTuple(root, root.extendsType), combinedMapper) : extendsType;
          if (!checkTypeInstantiable && !isGenericType(inferredExtendsType)) {
            if (!(inferredExtendsType.flags & 3) && (checkType.flags & 1 && !isUnwrapped || !isTypeAssignableTo(getPermissiveInstantiation(checkType), getPermissiveInstantiation(inferredExtendsType)))) {
              if (checkType.flags & 1 && !isUnwrapped) {
                (extraTypes || (extraTypes = [])).push(instantiateType(getTypeFromTypeNode(root.node.trueType), combinedMapper || mapper));
              }
              var falseType_1 = getTypeFromTypeNode(root.node.falseType);
              if (falseType_1.flags & 16777216) {
                var newRoot = falseType_1.root;
                if (newRoot.node.parent === root.node && (!newRoot.isDistributive || newRoot.checkType === root.checkType)) {
                  root = newRoot;
                  continue;
                }
                if (canTailRecurse(falseType_1, mapper)) {
                  continue;
                }
              }
              result = instantiateType(falseType_1, mapper);
              break;
            }
            if (inferredExtendsType.flags & 3 || isTypeAssignableTo(getRestrictiveInstantiation(checkType), getRestrictiveInstantiation(inferredExtendsType))) {
              var trueType_1 = getTypeFromTypeNode(root.node.trueType);
              var trueMapper = combinedMapper || mapper;
              if (canTailRecurse(trueType_1, trueMapper)) {
                continue;
              }
              result = instantiateType(trueType_1, trueMapper);
              break;
            }
          }
          result = createType(16777216);
          result.root = root;
          result.checkType = instantiateType(root.checkType, mapper);
          result.extendsType = instantiateType(root.extendsType, mapper);
          result.mapper = mapper;
          result.combinedMapper = combinedMapper;
          result.aliasSymbol = aliasSymbol || root.aliasSymbol;
          result.aliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(root.aliasTypeArguments, mapper);
          break;
        }
        return extraTypes ? getUnionType(ts2.append(extraTypes, result)) : result;
        function canTailRecurse(newType, newMapper) {
          if (newType.flags & 16777216 && newMapper) {
            var newRoot2 = newType.root;
            if (newRoot2.outerTypeParameters) {
              var typeParamMapper_1 = combineTypeMappers(newType.mapper, newMapper);
              var typeArguments = ts2.map(newRoot2.outerTypeParameters, function(t) {
                return getMappedType(t, typeParamMapper_1);
              });
              var newRootMapper = createTypeMapper(newRoot2.outerTypeParameters, typeArguments);
              var newCheckType = newRoot2.isDistributive ? getMappedType(newRoot2.checkType, newRootMapper) : void 0;
              if (!newCheckType || newCheckType === newRoot2.checkType || !(newCheckType.flags & (1048576 | 131072))) {
                root = newRoot2;
                mapper = newRootMapper;
                aliasSymbol = void 0;
                aliasTypeArguments = void 0;
                if (newRoot2.aliasSymbol) {
                  tailCount++;
                }
                return true;
              }
            }
          }
          return false;
        }
      }
      function getTrueTypeFromConditionalType(type) {
        return type.resolvedTrueType || (type.resolvedTrueType = instantiateType(getTypeFromTypeNode(type.root.node.trueType), type.mapper));
      }
      function getFalseTypeFromConditionalType(type) {
        return type.resolvedFalseType || (type.resolvedFalseType = instantiateType(getTypeFromTypeNode(type.root.node.falseType), type.mapper));
      }
      function getInferredTrueTypeFromConditionalType(type) {
        return type.resolvedInferredTrueType || (type.resolvedInferredTrueType = type.combinedMapper ? instantiateType(getTypeFromTypeNode(type.root.node.trueType), type.combinedMapper) : getTrueTypeFromConditionalType(type));
      }
      function getInferTypeParameters(node) {
        var result;
        if (node.locals) {
          node.locals.forEach(function(symbol) {
            if (symbol.flags & 262144) {
              result = ts2.append(result, getDeclaredTypeOfSymbol(symbol));
            }
          });
        }
        return result;
      }
      function isDistributionDependent(root) {
        return root.isDistributive && (isTypeParameterPossiblyReferenced(root.checkType, root.node.trueType) || isTypeParameterPossiblyReferenced(root.checkType, root.node.falseType));
      }
      function getTypeFromConditionalTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var checkType = getTypeFromTypeNode(node.checkType);
          var aliasSymbol = getAliasSymbolForTypeNode(node);
          var aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
          var allOuterTypeParameters = getOuterTypeParameters(node, true);
          var outerTypeParameters = aliasTypeArguments ? allOuterTypeParameters : ts2.filter(allOuterTypeParameters, function(tp) {
            return isTypeParameterPossiblyReferenced(tp, node);
          });
          var root = {
            node,
            checkType,
            extendsType: getTypeFromTypeNode(node.extendsType),
            isDistributive: !!(checkType.flags & 262144),
            inferTypeParameters: getInferTypeParameters(node),
            outerTypeParameters,
            instantiations: void 0,
            aliasSymbol,
            aliasTypeArguments
          };
          links.resolvedType = getConditionalType(root, void 0);
          if (outerTypeParameters) {
            root.instantiations = new ts2.Map();
            root.instantiations.set(getTypeListId(outerTypeParameters), links.resolvedType);
          }
        }
        return links.resolvedType;
      }
      function getTypeFromInferTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          links.resolvedType = getDeclaredTypeOfTypeParameter(getSymbolOfNode(node.typeParameter));
        }
        return links.resolvedType;
      }
      function getIdentifierChain(node) {
        if (ts2.isIdentifier(node)) {
          return [node];
        } else {
          return ts2.append(getIdentifierChain(node.left), node.right);
        }
      }
      function getTypeFromImportTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          if (node.isTypeOf && node.typeArguments) {
            error(node, ts2.Diagnostics.Type_arguments_cannot_be_used_here);
            links.resolvedSymbol = unknownSymbol;
            return links.resolvedType = errorType;
          }
          if (!ts2.isLiteralImportTypeNode(node)) {
            error(node.argument, ts2.Diagnostics.String_literal_expected);
            links.resolvedSymbol = unknownSymbol;
            return links.resolvedType = errorType;
          }
          var targetMeaning = node.isTypeOf ? 111551 : node.flags & 4194304 ? 111551 | 788968 : 788968;
          var innerModuleSymbol = resolveExternalModuleName(node, node.argument.literal);
          if (!innerModuleSymbol) {
            links.resolvedSymbol = unknownSymbol;
            return links.resolvedType = errorType;
          }
          var moduleSymbol = resolveExternalModuleSymbol(innerModuleSymbol, false);
          if (!ts2.nodeIsMissing(node.qualifier)) {
            var nameStack = getIdentifierChain(node.qualifier);
            var currentNamespace = moduleSymbol;
            var current = void 0;
            while (current = nameStack.shift()) {
              var meaning = nameStack.length ? 1920 : targetMeaning;
              var mergedResolvedSymbol = getMergedSymbol(resolveSymbol(currentNamespace));
              var next = node.isTypeOf ? getPropertyOfType(getTypeOfSymbol(mergedResolvedSymbol), current.escapedText) : getSymbol(getExportsOfSymbol(mergedResolvedSymbol), current.escapedText, meaning);
              if (!next) {
                error(current, ts2.Diagnostics.Namespace_0_has_no_exported_member_1, getFullyQualifiedName(currentNamespace), ts2.declarationNameToString(current));
                return links.resolvedType = errorType;
              }
              getNodeLinks(current).resolvedSymbol = next;
              getNodeLinks(current.parent).resolvedSymbol = next;
              currentNamespace = next;
            }
            links.resolvedType = resolveImportSymbolType(node, links, currentNamespace, targetMeaning);
          } else {
            if (moduleSymbol.flags & targetMeaning) {
              links.resolvedType = resolveImportSymbolType(node, links, moduleSymbol, targetMeaning);
            } else {
              var errorMessage = targetMeaning === 111551 ? ts2.Diagnostics.Module_0_does_not_refer_to_a_value_but_is_used_as_a_value_here : ts2.Diagnostics.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0;
              error(node, errorMessage, node.argument.literal.text);
              links.resolvedSymbol = unknownSymbol;
              links.resolvedType = errorType;
            }
          }
        }
        return links.resolvedType;
      }
      function resolveImportSymbolType(node, links, symbol, meaning) {
        var resolvedSymbol = resolveSymbol(symbol);
        links.resolvedSymbol = resolvedSymbol;
        if (meaning === 111551) {
          return getTypeOfSymbol(symbol);
        } else {
          return getTypeReferenceType(node, resolvedSymbol);
        }
      }
      function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          var aliasSymbol = getAliasSymbolForTypeNode(node);
          if (getMembersOfSymbol(node.symbol).size === 0 && !aliasSymbol) {
            links.resolvedType = emptyTypeLiteralType;
          } else {
            var type = createObjectType(16, node.symbol);
            type.aliasSymbol = aliasSymbol;
            type.aliasTypeArguments = getTypeArgumentsForAliasSymbol(aliasSymbol);
            if (ts2.isJSDocTypeLiteral(node) && node.isArrayType) {
              type = createArrayType(type);
            }
            links.resolvedType = type;
          }
        }
        return links.resolvedType;
      }
      function getAliasSymbolForTypeNode(node) {
        var host2 = node.parent;
        while (ts2.isParenthesizedTypeNode(host2) || ts2.isJSDocTypeExpression(host2) || ts2.isTypeOperatorNode(host2) && host2.operator === 144) {
          host2 = host2.parent;
        }
        return ts2.isTypeAlias(host2) ? getSymbolOfNode(host2) : void 0;
      }
      function getTypeArgumentsForAliasSymbol(symbol) {
        return symbol ? getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol) : void 0;
      }
      function isNonGenericObjectType(type) {
        return !!(type.flags & 524288) && !isGenericMappedType(type);
      }
      function isEmptyObjectTypeOrSpreadsIntoEmptyObject(type) {
        return isEmptyObjectType(type) || !!(type.flags & (65536 | 32768 | 528 | 296 | 2112 | 402653316 | 1056 | 67108864 | 4194304));
      }
      function tryMergeUnionOfObjectTypeAndEmptyObject(type, readonly) {
        if (!(type.flags & 1048576)) {
          return type;
        }
        if (ts2.every(type.types, isEmptyObjectTypeOrSpreadsIntoEmptyObject)) {
          return ts2.find(type.types, isEmptyObjectType) || emptyObjectType;
        }
        var firstType = ts2.find(type.types, function(t) {
          return !isEmptyObjectTypeOrSpreadsIntoEmptyObject(t);
        });
        if (!firstType) {
          return type;
        }
        var secondType = ts2.find(type.types, function(t) {
          return t !== firstType && !isEmptyObjectTypeOrSpreadsIntoEmptyObject(t);
        });
        if (secondType) {
          return type;
        }
        return getAnonymousPartialType(firstType);
        function getAnonymousPartialType(type2) {
          var members = ts2.createSymbolTable();
          for (var _i = 0, _a = getPropertiesOfType(type2); _i < _a.length; _i++) {
            var prop = _a[_i];
            if (ts2.getDeclarationModifierFlagsFromSymbol(prop) & (8 | 16)) {
            } else if (isSpreadableProperty(prop)) {
              var isSetonlyAccessor = prop.flags & 65536 && !(prop.flags & 32768);
              var flags = 4 | 16777216;
              var result = createSymbol(flags, prop.escapedName, getIsLateCheckFlag(prop) | (readonly ? 8 : 0));
              result.type = isSetonlyAccessor ? undefinedType : addOptionality(getTypeOfSymbol(prop), true);
              result.declarations = prop.declarations;
              result.nameType = getSymbolLinks(prop).nameType;
              result.syntheticOrigin = prop;
              members.set(prop.escapedName, result);
            }
          }
          var spread = createAnonymousType(type2.symbol, members, ts2.emptyArray, ts2.emptyArray, getIndexInfosOfType(type2));
          spread.objectFlags |= 128 | 262144;
          return spread;
        }
      }
      function getSpreadType(left, right, symbol, objectFlags, readonly) {
        if (left.flags & 1 || right.flags & 1) {
          return anyType;
        }
        if (left.flags & 2 || right.flags & 2) {
          return unknownType;
        }
        if (left.flags & 131072) {
          return right;
        }
        if (right.flags & 131072) {
          return left;
        }
        left = tryMergeUnionOfObjectTypeAndEmptyObject(left, readonly);
        if (left.flags & 1048576) {
          return checkCrossProductUnion([left, right]) ? mapType(left, function(t) {
            return getSpreadType(t, right, symbol, objectFlags, readonly);
          }) : errorType;
        }
        right = tryMergeUnionOfObjectTypeAndEmptyObject(right, readonly);
        if (right.flags & 1048576) {
          return checkCrossProductUnion([left, right]) ? mapType(right, function(t) {
            return getSpreadType(left, t, symbol, objectFlags, readonly);
          }) : errorType;
        }
        if (right.flags & (528 | 296 | 2112 | 402653316 | 1056 | 67108864 | 4194304)) {
          return left;
        }
        if (isGenericObjectType(left) || isGenericObjectType(right)) {
          if (isEmptyObjectType(left)) {
            return right;
          }
          if (left.flags & 2097152) {
            var types = left.types;
            var lastLeft = types[types.length - 1];
            if (isNonGenericObjectType(lastLeft) && isNonGenericObjectType(right)) {
              return getIntersectionType(ts2.concatenate(types.slice(0, types.length - 1), [getSpreadType(lastLeft, right, symbol, objectFlags, readonly)]));
            }
          }
          return getIntersectionType([left, right]);
        }
        var members = ts2.createSymbolTable();
        var skippedPrivateMembers = new ts2.Set();
        var indexInfos = left === emptyObjectType ? getIndexInfosOfType(right) : getUnionIndexInfos([left, right]);
        for (var _i = 0, _a = getPropertiesOfType(right); _i < _a.length; _i++) {
          var rightProp = _a[_i];
          if (ts2.getDeclarationModifierFlagsFromSymbol(rightProp) & (8 | 16)) {
            skippedPrivateMembers.add(rightProp.escapedName);
          } else if (isSpreadableProperty(rightProp)) {
            members.set(rightProp.escapedName, getSpreadSymbol(rightProp, readonly));
          }
        }
        for (var _b = 0, _c = getPropertiesOfType(left); _b < _c.length; _b++) {
          var leftProp = _c[_b];
          if (skippedPrivateMembers.has(leftProp.escapedName) || !isSpreadableProperty(leftProp)) {
            continue;
          }
          if (members.has(leftProp.escapedName)) {
            var rightProp = members.get(leftProp.escapedName);
            var rightType = getTypeOfSymbol(rightProp);
            if (rightProp.flags & 16777216) {
              var declarations = ts2.concatenate(leftProp.declarations, rightProp.declarations);
              var flags = 4 | leftProp.flags & 16777216;
              var result = createSymbol(flags, leftProp.escapedName);
              result.type = getUnionType([getTypeOfSymbol(leftProp), removeMissingOrUndefinedType(rightType)]);
              result.leftSpread = leftProp;
              result.rightSpread = rightProp;
              result.declarations = declarations;
              result.nameType = getSymbolLinks(leftProp).nameType;
              members.set(leftProp.escapedName, result);
            }
          } else {
            members.set(leftProp.escapedName, getSpreadSymbol(leftProp, readonly));
          }
        }
        var spread = createAnonymousType(symbol, members, ts2.emptyArray, ts2.emptyArray, ts2.sameMap(indexInfos, function(info) {
          return getIndexInfoWithReadonly(info, readonly);
        }));
        spread.objectFlags |= 128 | 262144 | 4194304 | objectFlags;
        return spread;
      }
      function isSpreadableProperty(prop) {
        var _a;
        return !ts2.some(prop.declarations, ts2.isPrivateIdentifierClassElementDeclaration) && (!(prop.flags & (8192 | 32768 | 65536)) || !((_a = prop.declarations) === null || _a === void 0 ? void 0 : _a.some(function(decl) {
          return ts2.isClassLike(decl.parent);
        })));
      }
      function getSpreadSymbol(prop, readonly) {
        var isSetonlyAccessor = prop.flags & 65536 && !(prop.flags & 32768);
        if (!isSetonlyAccessor && readonly === isReadonlySymbol(prop)) {
          return prop;
        }
        var flags = 4 | prop.flags & 16777216;
        var result = createSymbol(flags, prop.escapedName, getIsLateCheckFlag(prop) | (readonly ? 8 : 0));
        result.type = isSetonlyAccessor ? undefinedType : getTypeOfSymbol(prop);
        result.declarations = prop.declarations;
        result.nameType = getSymbolLinks(prop).nameType;
        result.syntheticOrigin = prop;
        return result;
      }
      function getIndexInfoWithReadonly(info, readonly) {
        return info.isReadonly !== readonly ? createIndexInfo(info.keyType, info.type, readonly, info.declaration) : info;
      }
      function createLiteralType(flags, value, symbol, regularType) {
        var type = createType(flags);
        type.symbol = symbol;
        type.value = value;
        type.regularType = regularType || type;
        return type;
      }
      function getFreshTypeOfLiteralType(type) {
        if (type.flags & 2944) {
          if (!type.freshType) {
            var freshType = createLiteralType(type.flags, type.value, type.symbol, type);
            freshType.freshType = freshType;
            type.freshType = freshType;
          }
          return type.freshType;
        }
        return type;
      }
      function getRegularTypeOfLiteralType(type) {
        return type.flags & 2944 ? type.regularType : type.flags & 1048576 ? type.regularType || (type.regularType = mapType(type, getRegularTypeOfLiteralType)) : type;
      }
      function isFreshLiteralType(type) {
        return !!(type.flags & 2944) && type.freshType === type;
      }
      function getStringLiteralType(value) {
        var type;
        return stringLiteralTypes.get(value) || (stringLiteralTypes.set(value, type = createLiteralType(128, value)), type);
      }
      function getNumberLiteralType(value) {
        var type;
        return numberLiteralTypes.get(value) || (numberLiteralTypes.set(value, type = createLiteralType(256, value)), type);
      }
      function getBigIntLiteralType(value) {
        var type;
        var key = ts2.pseudoBigIntToString(value);
        return bigIntLiteralTypes.get(key) || (bigIntLiteralTypes.set(key, type = createLiteralType(2048, value)), type);
      }
      function getEnumLiteralType(value, enumId, symbol) {
        var type;
        var qualifier = typeof value === "string" ? "@" : "#";
        var key = enumId + qualifier + value;
        var flags = 1024 | (typeof value === "string" ? 128 : 256);
        return enumLiteralTypes.get(key) || (enumLiteralTypes.set(key, type = createLiteralType(flags, value, symbol)), type);
      }
      function getTypeFromLiteralTypeNode(node) {
        if (node.literal.kind === 104) {
          return nullType;
        }
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          links.resolvedType = getRegularTypeOfLiteralType(checkExpression(node.literal));
        }
        return links.resolvedType;
      }
      function createUniqueESSymbolType(symbol) {
        var type = createType(8192);
        type.symbol = symbol;
        type.escapedName = "__@".concat(type.symbol.escapedName, "@").concat(getSymbolId(type.symbol));
        return type;
      }
      function getESSymbolLikeTypeForNode(node) {
        if (ts2.isValidESSymbolDeclaration(node)) {
          var symbol = getSymbolOfNode(node);
          var links = getSymbolLinks(symbol);
          return links.uniqueESSymbolType || (links.uniqueESSymbolType = createUniqueESSymbolType(symbol));
        }
        return esSymbolType;
      }
      function getThisType(node) {
        var container = ts2.getThisContainer(node, false);
        var parent = container && container.parent;
        if (parent && (ts2.isClassLike(parent) || parent.kind === 257)) {
          if (!ts2.isStatic(container) && (!ts2.isConstructorDeclaration(container) || ts2.isNodeDescendantOf(node, container.body))) {
            return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(parent)).thisType;
          }
        }
        if (parent && ts2.isObjectLiteralExpression(parent) && ts2.isBinaryExpression(parent.parent) && ts2.getAssignmentDeclarationKind(parent.parent) === 6) {
          return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(parent.parent.left).parent).thisType;
        }
        var host2 = node.flags & 4194304 ? ts2.getHostSignatureFromJSDoc(node) : void 0;
        if (host2 && ts2.isFunctionExpression(host2) && ts2.isBinaryExpression(host2.parent) && ts2.getAssignmentDeclarationKind(host2.parent) === 3) {
          return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(host2.parent.left).parent).thisType;
        }
        if (isJSConstructor(container) && ts2.isNodeDescendantOf(node, container.body)) {
          return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(container)).thisType;
        }
        error(node, ts2.Diagnostics.A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface);
        return errorType;
      }
      function getTypeFromThisTypeNode(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          links.resolvedType = getThisType(node);
        }
        return links.resolvedType;
      }
      function getTypeFromRestTypeNode(node) {
        return getTypeFromTypeNode(getArrayElementTypeNode(node.type) || node.type);
      }
      function getArrayElementTypeNode(node) {
        switch (node.kind) {
          case 190:
            return getArrayElementTypeNode(node.type);
          case 183:
            if (node.elements.length === 1) {
              node = node.elements[0];
              if (node.kind === 185 || node.kind === 196 && node.dotDotDotToken) {
                return getArrayElementTypeNode(node.type);
              }
            }
            break;
          case 182:
            return node.elementType;
        }
        return void 0;
      }
      function getTypeFromNamedTupleTypeNode(node) {
        var links = getNodeLinks(node);
        return links.resolvedType || (links.resolvedType = node.dotDotDotToken ? getTypeFromRestTypeNode(node) : addOptionality(getTypeFromTypeNode(node.type), true, !!node.questionToken));
      }
      function getTypeFromTypeNode(node) {
        return getConditionalFlowTypeOfType(getTypeFromTypeNodeWorker(node), node);
      }
      function getTypeFromTypeNodeWorker(node) {
        switch (node.kind) {
          case 130:
          case 310:
          case 311:
            return anyType;
          case 154:
            return unknownType;
          case 149:
            return stringType;
          case 146:
            return numberType;
          case 157:
            return bigintType;
          case 133:
            return booleanType;
          case 150:
            return esSymbolType;
          case 114:
            return voidType;
          case 152:
            return undefinedType;
          case 104:
            return nullType;
          case 143:
            return neverType;
          case 147:
            return node.flags & 131072 && !noImplicitAny ? anyType : nonPrimitiveType;
          case 138:
            return intrinsicMarkerType;
          case 191:
          case 108:
            return getTypeFromThisTypeNode(node);
          case 195:
            return getTypeFromLiteralTypeNode(node);
          case 177:
            return getTypeFromTypeReference(node);
          case 176:
            return node.assertsModifier ? voidType : booleanType;
          case 227:
            return getTypeFromTypeReference(node);
          case 180:
            return getTypeFromTypeQueryNode(node);
          case 182:
          case 183:
            return getTypeFromArrayOrTupleTypeNode(node);
          case 184:
            return getTypeFromOptionalTypeNode(node);
          case 186:
            return getTypeFromUnionTypeNode(node);
          case 187:
            return getTypeFromIntersectionTypeNode(node);
          case 312:
            return getTypeFromJSDocNullableTypeNode(node);
          case 314:
            return addOptionality(getTypeFromTypeNode(node.type));
          case 196:
            return getTypeFromNamedTupleTypeNode(node);
          case 190:
          case 313:
          case 307:
            return getTypeFromTypeNode(node.type);
          case 185:
            return getTypeFromRestTypeNode(node);
          case 316:
            return getTypeFromJSDocVariadicType(node);
          case 178:
          case 179:
          case 181:
          case 320:
          case 315:
          case 321:
            return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
          case 192:
            return getTypeFromTypeOperatorNode(node);
          case 193:
            return getTypeFromIndexedAccessTypeNode(node);
          case 194:
            return getTypeFromMappedTypeNode(node);
          case 188:
            return getTypeFromConditionalTypeNode(node);
          case 189:
            return getTypeFromInferTypeNode(node);
          case 197:
            return getTypeFromTemplateTypeNode(node);
          case 199:
            return getTypeFromImportTypeNode(node);
          case 79:
          case 160:
          case 205:
            var symbol = getSymbolAtLocation(node);
            return symbol ? getDeclaredTypeOfSymbol(symbol) : errorType;
          default:
            return errorType;
        }
      }
      function instantiateList(items, mapper, instantiator) {
        if (items && items.length) {
          for (var i = 0; i < items.length; i++) {
            var item = items[i];
            var mapped = instantiator(item, mapper);
            if (item !== mapped) {
              var result = i === 0 ? [] : items.slice(0, i);
              result.push(mapped);
              for (i++; i < items.length; i++) {
                result.push(instantiator(items[i], mapper));
              }
              return result;
            }
          }
        }
        return items;
      }
      function instantiateTypes(types, mapper) {
        return instantiateList(types, mapper, instantiateType);
      }
      function instantiateSignatures(signatures, mapper) {
        return instantiateList(signatures, mapper, instantiateSignature);
      }
      function instantiateIndexInfos(indexInfos, mapper) {
        return instantiateList(indexInfos, mapper, instantiateIndexInfo);
      }
      function createTypeMapper(sources, targets) {
        return sources.length === 1 ? makeUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) : makeArrayTypeMapper(sources, targets);
      }
      function getMappedType(type, mapper) {
        switch (mapper.kind) {
          case 0:
            return type === mapper.source ? mapper.target : type;
          case 1:
            var sources = mapper.sources;
            var targets = mapper.targets;
            for (var i = 0; i < sources.length; i++) {
              if (type === sources[i]) {
                return targets ? targets[i] : anyType;
              }
            }
            return type;
          case 2:
            return mapper.func(type);
          case 3:
          case 4:
            var t1 = getMappedType(type, mapper.mapper1);
            return t1 !== type && mapper.kind === 3 ? instantiateType(t1, mapper.mapper2) : getMappedType(t1, mapper.mapper2);
        }
      }
      function makeUnaryTypeMapper(source, target) {
        return { kind: 0, source, target };
      }
      function makeArrayTypeMapper(sources, targets) {
        return { kind: 1, sources, targets };
      }
      function makeFunctionTypeMapper(func) {
        return { kind: 2, func };
      }
      function makeCompositeTypeMapper(kind, mapper1, mapper2) {
        return { kind, mapper1, mapper2 };
      }
      function createTypeEraser(sources) {
        return createTypeMapper(sources, void 0);
      }
      function createBackreferenceMapper(context, index) {
        return makeFunctionTypeMapper(function(t) {
          return ts2.findIndex(context.inferences, function(info) {
            return info.typeParameter === t;
          }) >= index ? unknownType : t;
        });
      }
      function combineTypeMappers(mapper1, mapper2) {
        return mapper1 ? makeCompositeTypeMapper(3, mapper1, mapper2) : mapper2;
      }
      function mergeTypeMappers(mapper1, mapper2) {
        return mapper1 ? makeCompositeTypeMapper(4, mapper1, mapper2) : mapper2;
      }
      function prependTypeMapping(source, target, mapper) {
        return !mapper ? makeUnaryTypeMapper(source, target) : makeCompositeTypeMapper(4, makeUnaryTypeMapper(source, target), mapper);
      }
      function appendTypeMapping(mapper, source, target) {
        return !mapper ? makeUnaryTypeMapper(source, target) : makeCompositeTypeMapper(4, mapper, makeUnaryTypeMapper(source, target));
      }
      function getRestrictiveTypeParameter(tp) {
        return tp.constraint === unknownType ? tp : tp.restrictiveInstantiation || (tp.restrictiveInstantiation = createTypeParameter(tp.symbol), tp.restrictiveInstantiation.constraint = unknownType, tp.restrictiveInstantiation);
      }
      function cloneTypeParameter(typeParameter) {
        var result = createTypeParameter(typeParameter.symbol);
        result.target = typeParameter;
        return result;
      }
      function instantiateTypePredicate(predicate, mapper) {
        return createTypePredicate(predicate.kind, predicate.parameterName, predicate.parameterIndex, instantiateType(predicate.type, mapper));
      }
      function instantiateSignature(signature, mapper, eraseTypeParameters) {
        var freshTypeParameters;
        if (signature.typeParameters && !eraseTypeParameters) {
          freshTypeParameters = ts2.map(signature.typeParameters, cloneTypeParameter);
          mapper = combineTypeMappers(createTypeMapper(signature.typeParameters, freshTypeParameters), mapper);
          for (var _i = 0, freshTypeParameters_1 = freshTypeParameters; _i < freshTypeParameters_1.length; _i++) {
            var tp = freshTypeParameters_1[_i];
            tp.mapper = mapper;
          }
        }
        var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), void 0, void 0, signature.minArgumentCount, signature.flags & 39);
        result.target = signature;
        result.mapper = mapper;
        return result;
      }
      function instantiateSymbol(symbol, mapper) {
        var links = getSymbolLinks(symbol);
        if (links.type && !couldContainTypeVariables(links.type)) {
          return symbol;
        }
        if (ts2.getCheckFlags(symbol) & 1) {
          symbol = links.target;
          mapper = combineTypeMappers(links.mapper, mapper);
        }
        var result = createSymbol(symbol.flags, symbol.escapedName, 1 | ts2.getCheckFlags(symbol) & (8 | 4096 | 16384 | 32768));
        result.declarations = symbol.declarations;
        result.parent = symbol.parent;
        result.target = symbol;
        result.mapper = mapper;
        if (symbol.valueDeclaration) {
          result.valueDeclaration = symbol.valueDeclaration;
        }
        if (links.nameType) {
          result.nameType = links.nameType;
        }
        return result;
      }
      function getObjectTypeInstantiation(type, mapper, aliasSymbol, aliasTypeArguments) {
        var declaration = type.objectFlags & 4 ? type.node : type.symbol.declarations[0];
        var links = getNodeLinks(declaration);
        var target = type.objectFlags & 4 ? links.resolvedType : type.objectFlags & 64 ? type.target : type;
        var typeParameters = links.outerTypeParameters;
        if (!typeParameters) {
          var outerTypeParameters = getOuterTypeParameters(declaration, true);
          if (isJSConstructor(declaration)) {
            var templateTagParameters = getTypeParametersFromDeclaration(declaration);
            outerTypeParameters = ts2.addRange(outerTypeParameters, templateTagParameters);
          }
          typeParameters = outerTypeParameters || ts2.emptyArray;
          var allDeclarations_1 = type.objectFlags & 4 ? [declaration] : type.symbol.declarations;
          typeParameters = (target.objectFlags & 4 || target.symbol.flags & 8192 || target.symbol.flags & 2048) && !target.aliasTypeArguments ? ts2.filter(typeParameters, function(tp) {
            return ts2.some(allDeclarations_1, function(d) {
              return isTypeParameterPossiblyReferenced(tp, d);
            });
          }) : typeParameters;
          links.outerTypeParameters = typeParameters;
        }
        if (typeParameters.length) {
          var combinedMapper_1 = combineTypeMappers(type.mapper, mapper);
          var typeArguments = ts2.map(typeParameters, function(t) {
            return getMappedType(t, combinedMapper_1);
          });
          var newAliasSymbol = aliasSymbol || type.aliasSymbol;
          var newAliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper);
          var id = getTypeListId(typeArguments) + getAliasId(newAliasSymbol, newAliasTypeArguments);
          if (!target.instantiations) {
            target.instantiations = new ts2.Map();
            target.instantiations.set(getTypeListId(typeParameters) + getAliasId(target.aliasSymbol, target.aliasTypeArguments), target);
          }
          var result = target.instantiations.get(id);
          if (!result) {
            var newMapper = createTypeMapper(typeParameters, typeArguments);
            result = target.objectFlags & 4 ? createDeferredTypeReference(type.target, type.node, newMapper, newAliasSymbol, newAliasTypeArguments) : target.objectFlags & 32 ? instantiateMappedType(target, newMapper, newAliasSymbol, newAliasTypeArguments) : instantiateAnonymousType(target, newMapper, newAliasSymbol, newAliasTypeArguments);
            target.instantiations.set(id, result);
          }
          return result;
        }
        return type;
      }
      function maybeTypeParameterReference(node) {
        return !(node.parent.kind === 177 && node.parent.typeArguments && node === node.parent.typeName || node.parent.kind === 199 && node.parent.typeArguments && node === node.parent.qualifier);
      }
      function isTypeParameterPossiblyReferenced(tp, node) {
        if (tp.symbol && tp.symbol.declarations && tp.symbol.declarations.length === 1) {
          var container = tp.symbol.declarations[0].parent;
          for (var n = node; n !== container; n = n.parent) {
            if (!n || n.kind === 234 || n.kind === 188 && ts2.forEachChild(n.extendsType, containsReference)) {
              return true;
            }
          }
          return containsReference(node);
        }
        return true;
        function containsReference(node2) {
          switch (node2.kind) {
            case 191:
              return !!tp.isThisType;
            case 79:
              return !tp.isThisType && ts2.isPartOfTypeNode(node2) && maybeTypeParameterReference(node2) && getTypeFromTypeNodeWorker(node2) === tp;
            case 180:
              return true;
            case 168:
            case 167:
              return !node2.type && !!node2.body || ts2.some(node2.typeParameters, containsReference) || ts2.some(node2.parameters, containsReference) || !!node2.type && containsReference(node2.type);
          }
          return !!ts2.forEachChild(node2, containsReference);
        }
      }
      function getHomomorphicTypeVariable(type) {
        var constraintType = getConstraintTypeFromMappedType(type);
        if (constraintType.flags & 4194304) {
          var typeVariable = getActualTypeVariable(constraintType.type);
          if (typeVariable.flags & 262144) {
            return typeVariable;
          }
        }
        return void 0;
      }
      function instantiateMappedType(type, mapper, aliasSymbol, aliasTypeArguments) {
        var typeVariable = getHomomorphicTypeVariable(type);
        if (typeVariable) {
          var mappedTypeVariable = instantiateType(typeVariable, mapper);
          if (typeVariable !== mappedTypeVariable) {
            return mapTypeWithAlias(getReducedType(mappedTypeVariable), function(t) {
              if (t.flags & (3 | 58982400 | 524288 | 2097152) && t !== wildcardType && !isErrorType(t)) {
                if (!type.declaration.nameType) {
                  var constraint = void 0;
                  if (isArrayType(t) || t.flags & 1 && findResolutionCycleStartIndex(typeVariable, 4) < 0 && (constraint = getConstraintOfTypeParameter(typeVariable)) && everyType(constraint, ts2.or(isArrayType, isTupleType))) {
                    return instantiateMappedArrayType(t, type, prependTypeMapping(typeVariable, t, mapper));
                  }
                  if (isGenericTupleType(t)) {
                    return instantiateMappedGenericTupleType(t, type, typeVariable, mapper);
                  }
                  if (isTupleType(t)) {
                    return instantiateMappedTupleType(t, type, prependTypeMapping(typeVariable, t, mapper));
                  }
                }
                return instantiateAnonymousType(type, prependTypeMapping(typeVariable, t, mapper));
              }
              return t;
            }, aliasSymbol, aliasTypeArguments);
          }
        }
        return instantiateType(getConstraintTypeFromMappedType(type), mapper) === wildcardType ? wildcardType : instantiateAnonymousType(type, mapper, aliasSymbol, aliasTypeArguments);
      }
      function getModifiedReadonlyState(state, modifiers) {
        return modifiers & 1 ? true : modifiers & 2 ? false : state;
      }
      function instantiateMappedGenericTupleType(tupleType, mappedType, typeVariable, mapper) {
        var elementFlags = tupleType.target.elementFlags;
        var elementTypes = ts2.map(getTypeArguments(tupleType), function(t, i) {
          var singleton = elementFlags[i] & 8 ? t : elementFlags[i] & 4 ? createArrayType(t) : createTupleType([t], [elementFlags[i]]);
          return instantiateMappedType(mappedType, prependTypeMapping(typeVariable, singleton, mapper));
        });
        var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, getMappedTypeModifiers(mappedType));
        return createTupleType(elementTypes, ts2.map(elementTypes, function(_) {
          return 8;
        }), newReadonly);
      }
      function instantiateMappedArrayType(arrayType, mappedType, mapper) {
        var elementType = instantiateMappedTypeTemplate(mappedType, numberType, true, mapper);
        return isErrorType(elementType) ? errorType : createArrayType(elementType, getModifiedReadonlyState(isReadonlyArrayType(arrayType), getMappedTypeModifiers(mappedType)));
      }
      function instantiateMappedTupleType(tupleType, mappedType, mapper) {
        var elementFlags = tupleType.target.elementFlags;
        var elementTypes = ts2.map(getTypeArguments(tupleType), function(_, i) {
          return instantiateMappedTypeTemplate(mappedType, getStringLiteralType("" + i), !!(elementFlags[i] & 2), mapper);
        });
        var modifiers = getMappedTypeModifiers(mappedType);
        var newTupleModifiers = modifiers & 4 ? ts2.map(elementFlags, function(f) {
          return f & 1 ? 2 : f;
        }) : modifiers & 8 ? ts2.map(elementFlags, function(f) {
          return f & 2 ? 1 : f;
        }) : elementFlags;
        var newReadonly = getModifiedReadonlyState(tupleType.target.readonly, modifiers);
        return ts2.contains(elementTypes, errorType) ? errorType : createTupleType(elementTypes, newTupleModifiers, newReadonly, tupleType.target.labeledElementDeclarations);
      }
      function instantiateMappedTypeTemplate(type, key, isOptional, mapper) {
        var templateMapper = appendTypeMapping(mapper, getTypeParameterFromMappedType(type), key);
        var propType = instantiateType(getTemplateTypeFromMappedType(type.target || type), templateMapper);
        var modifiers = getMappedTypeModifiers(type);
        return strictNullChecks && modifiers & 4 && !maybeTypeOfKind(propType, 32768 | 16384) ? getOptionalType(propType, true) : strictNullChecks && modifiers & 8 && isOptional ? getTypeWithFacts(propType, 524288) : propType;
      }
      function instantiateAnonymousType(type, mapper, aliasSymbol, aliasTypeArguments) {
        var result = createObjectType(type.objectFlags | 64, type.symbol);
        if (type.objectFlags & 32) {
          result.declaration = type.declaration;
          var origTypeParameter = getTypeParameterFromMappedType(type);
          var freshTypeParameter = cloneTypeParameter(origTypeParameter);
          result.typeParameter = freshTypeParameter;
          mapper = combineTypeMappers(makeUnaryTypeMapper(origTypeParameter, freshTypeParameter), mapper);
          freshTypeParameter.mapper = mapper;
        }
        result.target = type;
        result.mapper = mapper;
        result.aliasSymbol = aliasSymbol || type.aliasSymbol;
        result.aliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper);
        return result;
      }
      function getConditionalTypeInstantiation(type, mapper, aliasSymbol, aliasTypeArguments) {
        var root = type.root;
        if (root.outerTypeParameters) {
          var typeArguments = ts2.map(root.outerTypeParameters, function(t) {
            return getMappedType(t, mapper);
          });
          var id = getTypeListId(typeArguments) + getAliasId(aliasSymbol, aliasTypeArguments);
          var result = root.instantiations.get(id);
          if (!result) {
            var newMapper_1 = createTypeMapper(root.outerTypeParameters, typeArguments);
            var checkType_1 = root.checkType;
            var distributionType = root.isDistributive ? getMappedType(checkType_1, newMapper_1) : void 0;
            result = distributionType && checkType_1 !== distributionType && distributionType.flags & (1048576 | 131072) ? mapTypeWithAlias(distributionType, function(t) {
              return getConditionalType(root, prependTypeMapping(checkType_1, t, newMapper_1));
            }, aliasSymbol, aliasTypeArguments) : getConditionalType(root, newMapper_1, aliasSymbol, aliasTypeArguments);
            root.instantiations.set(id, result);
          }
          return result;
        }
        return type;
      }
      function instantiateType(type, mapper) {
        return type && mapper ? instantiateTypeWithAlias(type, mapper, void 0, void 0) : type;
      }
      function instantiateTypeWithAlias(type, mapper, aliasSymbol, aliasTypeArguments) {
        if (!couldContainTypeVariables(type)) {
          return type;
        }
        if (instantiationDepth === 100 || instantiationCount >= 5e6) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("checkTypes", "instantiateType_DepthLimit", { typeId: type.id, instantiationDepth, instantiationCount });
          error(currentNode, ts2.Diagnostics.Type_instantiation_is_excessively_deep_and_possibly_infinite);
          return errorType;
        }
        totalInstantiationCount++;
        instantiationCount++;
        instantiationDepth++;
        var result = instantiateTypeWorker(type, mapper, aliasSymbol, aliasTypeArguments);
        instantiationDepth--;
        return result;
      }
      function instantiateTypeWorker(type, mapper, aliasSymbol, aliasTypeArguments) {
        var flags = type.flags;
        if (flags & 262144) {
          return getMappedType(type, mapper);
        }
        if (flags & 524288) {
          var objectFlags = type.objectFlags;
          if (objectFlags & (4 | 16 | 32)) {
            if (objectFlags & 4 && !type.node) {
              var resolvedTypeArguments = type.resolvedTypeArguments;
              var newTypeArguments = instantiateTypes(resolvedTypeArguments, mapper);
              return newTypeArguments !== resolvedTypeArguments ? createNormalizedTypeReference(type.target, newTypeArguments) : type;
            }
            if (objectFlags & 1024) {
              return instantiateReverseMappedType(type, mapper);
            }
            return getObjectTypeInstantiation(type, mapper, aliasSymbol, aliasTypeArguments);
          }
          return type;
        }
        if (flags & 3145728) {
          var origin = type.flags & 1048576 ? type.origin : void 0;
          var types = origin && origin.flags & 3145728 ? origin.types : type.types;
          var newTypes = instantiateTypes(types, mapper);
          if (newTypes === types && aliasSymbol === type.aliasSymbol) {
            return type;
          }
          var newAliasSymbol = aliasSymbol || type.aliasSymbol;
          var newAliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper);
          return flags & 2097152 || origin && origin.flags & 2097152 ? getIntersectionType(newTypes, newAliasSymbol, newAliasTypeArguments) : getUnionType(newTypes, 1, newAliasSymbol, newAliasTypeArguments);
        }
        if (flags & 4194304) {
          return getIndexType(instantiateType(type.type, mapper));
        }
        if (flags & 134217728) {
          return getTemplateLiteralType(type.texts, instantiateTypes(type.types, mapper));
        }
        if (flags & 268435456) {
          return getStringMappingType(type.symbol, instantiateType(type.type, mapper));
        }
        if (flags & 8388608) {
          var newAliasSymbol = aliasSymbol || type.aliasSymbol;
          var newAliasTypeArguments = aliasSymbol ? aliasTypeArguments : instantiateTypes(type.aliasTypeArguments, mapper);
          return getIndexedAccessType(instantiateType(type.objectType, mapper), instantiateType(type.indexType, mapper), type.accessFlags, void 0, newAliasSymbol, newAliasTypeArguments);
        }
        if (flags & 16777216) {
          return getConditionalTypeInstantiation(type, combineTypeMappers(type.mapper, mapper), aliasSymbol, aliasTypeArguments);
        }
        if (flags & 33554432) {
          var maybeVariable = instantiateType(type.baseType, mapper);
          if (maybeVariable.flags & 8650752) {
            return getSubstitutionType(maybeVariable, instantiateType(type.substitute, mapper));
          } else {
            var sub = instantiateType(type.substitute, mapper);
            if (sub.flags & 3 || isTypeAssignableTo(getRestrictiveInstantiation(maybeVariable), getRestrictiveInstantiation(sub))) {
              return maybeVariable;
            }
            return sub;
          }
        }
        return type;
      }
      function instantiateReverseMappedType(type, mapper) {
        var innerMappedType = instantiateType(type.mappedType, mapper);
        if (!(ts2.getObjectFlags(innerMappedType) & 32)) {
          return type;
        }
        var innerIndexType = instantiateType(type.constraintType, mapper);
        if (!(innerIndexType.flags & 4194304)) {
          return type;
        }
        var instantiated = inferTypeForHomomorphicMappedType(instantiateType(type.source, mapper), innerMappedType, innerIndexType);
        if (instantiated) {
          return instantiated;
        }
        return type;
      }
      function getPermissiveInstantiation(type) {
        return type.flags & (131068 | 3 | 131072) ? type : type.permissiveInstantiation || (type.permissiveInstantiation = instantiateType(type, permissiveMapper));
      }
      function getRestrictiveInstantiation(type) {
        if (type.flags & (131068 | 3 | 131072)) {
          return type;
        }
        if (type.restrictiveInstantiation) {
          return type.restrictiveInstantiation;
        }
        type.restrictiveInstantiation = instantiateType(type, restrictiveMapper);
        type.restrictiveInstantiation.restrictiveInstantiation = type.restrictiveInstantiation;
        return type.restrictiveInstantiation;
      }
      function instantiateIndexInfo(info, mapper) {
        return createIndexInfo(info.keyType, instantiateType(info.type, mapper), info.isReadonly, info.declaration);
      }
      function isContextSensitive(node) {
        ts2.Debug.assert(node.kind !== 168 || ts2.isObjectLiteralMethod(node));
        switch (node.kind) {
          case 212:
          case 213:
          case 168:
          case 255:
            return isContextSensitiveFunctionLikeDeclaration(node);
          case 204:
            return ts2.some(node.properties, isContextSensitive);
          case 203:
            return ts2.some(node.elements, isContextSensitive);
          case 221:
            return isContextSensitive(node.whenTrue) || isContextSensitive(node.whenFalse);
          case 220:
            return (node.operatorToken.kind === 56 || node.operatorToken.kind === 60) && (isContextSensitive(node.left) || isContextSensitive(node.right));
          case 294:
            return isContextSensitive(node.initializer);
          case 211:
            return isContextSensitive(node.expression);
          case 285:
            return ts2.some(node.properties, isContextSensitive) || ts2.isJsxOpeningElement(node.parent) && ts2.some(node.parent.parent.children, isContextSensitive);
          case 284: {
            var initializer = node.initializer;
            return !!initializer && isContextSensitive(initializer);
          }
          case 287: {
            var expression = node.expression;
            return !!expression && isContextSensitive(expression);
          }
        }
        return false;
      }
      function isContextSensitiveFunctionLikeDeclaration(node) {
        return (!ts2.isFunctionDeclaration(node) || ts2.isInJSFile(node) && !!getTypeForDeclarationFromJSDocComment(node)) && (ts2.hasContextSensitiveParameters(node) || hasContextSensitiveReturnExpression(node));
      }
      function hasContextSensitiveReturnExpression(node) {
        return !node.typeParameters && !ts2.getEffectiveReturnTypeNode(node) && !!node.body && node.body.kind !== 234 && isContextSensitive(node.body);
      }
      function isContextSensitiveFunctionOrObjectLiteralMethod(func) {
        return (ts2.isInJSFile(func) && ts2.isFunctionDeclaration(func) || ts2.isFunctionExpressionOrArrowFunction(func) || ts2.isObjectLiteralMethod(func)) && isContextSensitiveFunctionLikeDeclaration(func);
      }
      function getTypeWithoutSignatures(type) {
        if (type.flags & 524288) {
          var resolved = resolveStructuredTypeMembers(type);
          if (resolved.constructSignatures.length || resolved.callSignatures.length) {
            var result = createObjectType(16, type.symbol);
            result.members = resolved.members;
            result.properties = resolved.properties;
            result.callSignatures = ts2.emptyArray;
            result.constructSignatures = ts2.emptyArray;
            result.indexInfos = ts2.emptyArray;
            return result;
          }
        } else if (type.flags & 2097152) {
          return getIntersectionType(ts2.map(type.types, getTypeWithoutSignatures));
        }
        return type;
      }
      function isTypeIdenticalTo(source, target) {
        return isTypeRelatedTo(source, target, identityRelation);
      }
      function compareTypesIdentical(source, target) {
        return isTypeRelatedTo(source, target, identityRelation) ? -1 : 0;
      }
      function compareTypesAssignable(source, target) {
        return isTypeRelatedTo(source, target, assignableRelation) ? -1 : 0;
      }
      function compareTypesSubtypeOf(source, target) {
        return isTypeRelatedTo(source, target, subtypeRelation) ? -1 : 0;
      }
      function isTypeSubtypeOf(source, target) {
        return isTypeRelatedTo(source, target, subtypeRelation);
      }
      function isTypeAssignableTo(source, target) {
        return isTypeRelatedTo(source, target, assignableRelation);
      }
      function isTypeDerivedFrom(source, target) {
        return source.flags & 1048576 ? ts2.every(source.types, function(t) {
          return isTypeDerivedFrom(t, target);
        }) : target.flags & 1048576 ? ts2.some(target.types, function(t) {
          return isTypeDerivedFrom(source, t);
        }) : source.flags & 58982400 ? isTypeDerivedFrom(getBaseConstraintOfType(source) || unknownType, target) : target === globalObjectType ? !!(source.flags & (524288 | 67108864)) : target === globalFunctionType ? !!(source.flags & 524288) && isFunctionObjectType(source) : hasBaseType(source, getTargetType(target)) || isArrayType(target) && !isReadonlyArrayType(target) && isTypeDerivedFrom(source, globalReadonlyArrayType);
      }
      function isTypeComparableTo(source, target) {
        return isTypeRelatedTo(source, target, comparableRelation);
      }
      function areTypesComparable(type1, type2) {
        return isTypeComparableTo(type1, type2) || isTypeComparableTo(type2, type1);
      }
      function checkTypeAssignableTo(source, target, errorNode, headMessage, containingMessageChain, errorOutputObject) {
        return checkTypeRelatedTo(source, target, assignableRelation, errorNode, headMessage, containingMessageChain, errorOutputObject);
      }
      function checkTypeAssignableToAndOptionallyElaborate(source, target, errorNode, expr, headMessage, containingMessageChain) {
        return checkTypeRelatedToAndOptionallyElaborate(source, target, assignableRelation, errorNode, expr, headMessage, containingMessageChain, void 0);
      }
      function checkTypeRelatedToAndOptionallyElaborate(source, target, relation, errorNode, expr, headMessage, containingMessageChain, errorOutputContainer) {
        if (isTypeRelatedTo(source, target, relation))
          return true;
        if (!errorNode || !elaborateError(expr, source, target, relation, headMessage, containingMessageChain, errorOutputContainer)) {
          return checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain, errorOutputContainer);
        }
        return false;
      }
      function isOrHasGenericConditional(type) {
        return !!(type.flags & 16777216 || type.flags & 2097152 && ts2.some(type.types, isOrHasGenericConditional));
      }
      function elaborateError(node, source, target, relation, headMessage, containingMessageChain, errorOutputContainer) {
        if (!node || isOrHasGenericConditional(target))
          return false;
        if (!checkTypeRelatedTo(source, target, relation, void 0) && elaborateDidYouMeanToCallOrConstruct(node, source, target, relation, headMessage, containingMessageChain, errorOutputContainer)) {
          return true;
        }
        switch (node.kind) {
          case 287:
          case 211:
            return elaborateError(node.expression, source, target, relation, headMessage, containingMessageChain, errorOutputContainer);
          case 220:
            switch (node.operatorToken.kind) {
              case 63:
              case 27:
                return elaborateError(node.right, source, target, relation, headMessage, containingMessageChain, errorOutputContainer);
            }
            break;
          case 204:
            return elaborateObjectLiteral(node, source, target, relation, containingMessageChain, errorOutputContainer);
          case 203:
            return elaborateArrayLiteral(node, source, target, relation, containingMessageChain, errorOutputContainer);
          case 285:
            return elaborateJsxComponents(node, source, target, relation, containingMessageChain, errorOutputContainer);
          case 213:
            return elaborateArrowFunction(node, source, target, relation, containingMessageChain, errorOutputContainer);
        }
        return false;
      }
      function elaborateDidYouMeanToCallOrConstruct(node, source, target, relation, headMessage, containingMessageChain, errorOutputContainer) {
        var callSignatures = getSignaturesOfType(source, 0);
        var constructSignatures = getSignaturesOfType(source, 1);
        for (var _i = 0, _a = [constructSignatures, callSignatures]; _i < _a.length; _i++) {
          var signatures = _a[_i];
          if (ts2.some(signatures, function(s) {
            var returnType = getReturnTypeOfSignature(s);
            return !(returnType.flags & (1 | 131072)) && checkTypeRelatedTo(returnType, target, relation, void 0);
          })) {
            var resultObj = errorOutputContainer || {};
            checkTypeAssignableTo(source, target, node, headMessage, containingMessageChain, resultObj);
            var diagnostic = resultObj.errors[resultObj.errors.length - 1];
            ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(node, signatures === constructSignatures ? ts2.Diagnostics.Did_you_mean_to_use_new_with_this_expression : ts2.Diagnostics.Did_you_mean_to_call_this_expression));
            return true;
          }
        }
        return false;
      }
      function elaborateArrowFunction(node, source, target, relation, containingMessageChain, errorOutputContainer) {
        if (ts2.isBlock(node.body)) {
          return false;
        }
        if (ts2.some(node.parameters, ts2.hasType)) {
          return false;
        }
        var sourceSig = getSingleCallSignature(source);
        if (!sourceSig) {
          return false;
        }
        var targetSignatures = getSignaturesOfType(target, 0);
        if (!ts2.length(targetSignatures)) {
          return false;
        }
        var returnExpression = node.body;
        var sourceReturn = getReturnTypeOfSignature(sourceSig);
        var targetReturn = getUnionType(ts2.map(targetSignatures, getReturnTypeOfSignature));
        if (!checkTypeRelatedTo(sourceReturn, targetReturn, relation, void 0)) {
          var elaborated = returnExpression && elaborateError(returnExpression, sourceReturn, targetReturn, relation, void 0, containingMessageChain, errorOutputContainer);
          if (elaborated) {
            return elaborated;
          }
          var resultObj = errorOutputContainer || {};
          checkTypeRelatedTo(sourceReturn, targetReturn, relation, returnExpression, void 0, containingMessageChain, resultObj);
          if (resultObj.errors) {
            if (target.symbol && ts2.length(target.symbol.declarations)) {
              ts2.addRelatedInfo(resultObj.errors[resultObj.errors.length - 1], ts2.createDiagnosticForNode(target.symbol.declarations[0], ts2.Diagnostics.The_expected_type_comes_from_the_return_type_of_this_signature));
            }
            if ((ts2.getFunctionFlags(node) & 2) === 0 && !getTypeOfPropertyOfType(sourceReturn, "then") && checkTypeRelatedTo(createPromiseType(sourceReturn), targetReturn, relation, void 0)) {
              ts2.addRelatedInfo(resultObj.errors[resultObj.errors.length - 1], ts2.createDiagnosticForNode(node, ts2.Diagnostics.Did_you_mean_to_mark_this_function_as_async));
            }
            return true;
          }
        }
        return false;
      }
      function getBestMatchIndexedAccessTypeOrUndefined(source, target, nameType) {
        var idx = getIndexedAccessTypeOrUndefined(target, nameType);
        if (idx) {
          return idx;
        }
        if (target.flags & 1048576) {
          var best = getBestMatchingType(source, target);
          if (best) {
            return getIndexedAccessTypeOrUndefined(best, nameType);
          }
        }
      }
      function checkExpressionForMutableLocationWithContextualType(next, sourcePropType) {
        next.contextualType = sourcePropType;
        try {
          return checkExpressionForMutableLocation(next, 1, sourcePropType);
        } finally {
          next.contextualType = void 0;
        }
      }
      function elaborateElementwise(iterator, source, target, relation, containingMessageChain, errorOutputContainer) {
        var reportedError = false;
        for (var status = iterator.next(); !status.done; status = iterator.next()) {
          var _a = status.value, prop = _a.errorNode, next = _a.innerExpression, nameType = _a.nameType, errorMessage = _a.errorMessage;
          var targetPropType = getBestMatchIndexedAccessTypeOrUndefined(source, target, nameType);
          if (!targetPropType || targetPropType.flags & 8388608)
            continue;
          var sourcePropType = getIndexedAccessTypeOrUndefined(source, nameType);
          if (!sourcePropType)
            continue;
          var propName = getPropertyNameFromIndex(nameType, void 0);
          if (!checkTypeRelatedTo(sourcePropType, targetPropType, relation, void 0)) {
            var elaborated = next && elaborateError(next, sourcePropType, targetPropType, relation, void 0, containingMessageChain, errorOutputContainer);
            reportedError = true;
            if (!elaborated) {
              var resultObj = errorOutputContainer || {};
              var specificSource = next ? checkExpressionForMutableLocationWithContextualType(next, sourcePropType) : sourcePropType;
              if (exactOptionalPropertyTypes && isExactOptionalPropertyMismatch(specificSource, targetPropType)) {
                var diag = ts2.createDiagnosticForNode(prop, ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target, typeToString(specificSource), typeToString(targetPropType));
                diagnostics.add(diag);
                resultObj.errors = [diag];
              } else {
                var targetIsOptional = !!(propName && (getPropertyOfType(target, propName) || unknownSymbol).flags & 16777216);
                var sourceIsOptional = !!(propName && (getPropertyOfType(source, propName) || unknownSymbol).flags & 16777216);
                targetPropType = removeMissingType(targetPropType, targetIsOptional);
                sourcePropType = removeMissingType(sourcePropType, targetIsOptional && sourceIsOptional);
                var result = checkTypeRelatedTo(specificSource, targetPropType, relation, prop, errorMessage, containingMessageChain, resultObj);
                if (result && specificSource !== sourcePropType) {
                  checkTypeRelatedTo(sourcePropType, targetPropType, relation, prop, errorMessage, containingMessageChain, resultObj);
                }
              }
              if (resultObj.errors) {
                var reportedDiag = resultObj.errors[resultObj.errors.length - 1];
                var propertyName = isTypeUsableAsPropertyName(nameType) ? getPropertyNameFromType(nameType) : void 0;
                var targetProp = propertyName !== void 0 ? getPropertyOfType(target, propertyName) : void 0;
                var issuedElaboration = false;
                if (!targetProp) {
                  var indexInfo = getApplicableIndexInfo(target, nameType);
                  if (indexInfo && indexInfo.declaration && !ts2.getSourceFileOfNode(indexInfo.declaration).hasNoDefaultLib) {
                    issuedElaboration = true;
                    ts2.addRelatedInfo(reportedDiag, ts2.createDiagnosticForNode(indexInfo.declaration, ts2.Diagnostics.The_expected_type_comes_from_this_index_signature));
                  }
                }
                if (!issuedElaboration && (targetProp && ts2.length(targetProp.declarations) || target.symbol && ts2.length(target.symbol.declarations))) {
                  var targetNode = targetProp && ts2.length(targetProp.declarations) ? targetProp.declarations[0] : target.symbol.declarations[0];
                  if (!ts2.getSourceFileOfNode(targetNode).hasNoDefaultLib) {
                    ts2.addRelatedInfo(reportedDiag, ts2.createDiagnosticForNode(targetNode, ts2.Diagnostics.The_expected_type_comes_from_property_0_which_is_declared_here_on_type_1, propertyName && !(nameType.flags & 8192) ? ts2.unescapeLeadingUnderscores(propertyName) : typeToString(nameType), typeToString(target)));
                  }
                }
              }
            }
          }
        }
        return reportedError;
      }
      function generateJsxAttributes(node) {
        var _i, _a, prop;
        return __generator(this, function(_b) {
          switch (_b.label) {
            case 0:
              if (!ts2.length(node.properties))
                return [2];
              _i = 0, _a = node.properties;
              _b.label = 1;
            case 1:
              if (!(_i < _a.length))
                return [3, 4];
              prop = _a[_i];
              if (ts2.isJsxSpreadAttribute(prop) || isHyphenatedJsxName(ts2.idText(prop.name)))
                return [3, 3];
              return [4, { errorNode: prop.name, innerExpression: prop.initializer, nameType: getStringLiteralType(ts2.idText(prop.name)) }];
            case 2:
              _b.sent();
              _b.label = 3;
            case 3:
              _i++;
              return [3, 1];
            case 4:
              return [2];
          }
        });
      }
      function generateJsxChildren(node, getInvalidTextDiagnostic) {
        var memberOffset, i, child, nameType, elem;
        return __generator(this, function(_a) {
          switch (_a.label) {
            case 0:
              if (!ts2.length(node.children))
                return [2];
              memberOffset = 0;
              i = 0;
              _a.label = 1;
            case 1:
              if (!(i < node.children.length))
                return [3, 5];
              child = node.children[i];
              nameType = getNumberLiteralType(i - memberOffset);
              elem = getElaborationElementForJsxChild(child, nameType, getInvalidTextDiagnostic);
              if (!elem)
                return [3, 3];
              return [4, elem];
            case 2:
              _a.sent();
              return [3, 4];
            case 3:
              memberOffset++;
              _a.label = 4;
            case 4:
              i++;
              return [3, 1];
            case 5:
              return [2];
          }
        });
      }
      function getElaborationElementForJsxChild(child, nameType, getInvalidTextDiagnostic) {
        switch (child.kind) {
          case 287:
            return { errorNode: child, innerExpression: child.expression, nameType };
          case 11:
            if (child.containsOnlyTriviaWhiteSpaces) {
              break;
            }
            return { errorNode: child, innerExpression: void 0, nameType, errorMessage: getInvalidTextDiagnostic() };
          case 277:
          case 278:
          case 281:
            return { errorNode: child, innerExpression: child, nameType };
          default:
            return ts2.Debug.assertNever(child, "Found invalid jsx child");
        }
      }
      function elaborateJsxComponents(node, source, target, relation, containingMessageChain, errorOutputContainer) {
        var result = elaborateElementwise(generateJsxAttributes(node), source, target, relation, containingMessageChain, errorOutputContainer);
        var invalidTextDiagnostic;
        if (ts2.isJsxOpeningElement(node.parent) && ts2.isJsxElement(node.parent.parent)) {
          var containingElement = node.parent.parent;
          var childPropName = getJsxElementChildrenPropertyName(getJsxNamespaceAt(node));
          var childrenPropName = childPropName === void 0 ? "children" : ts2.unescapeLeadingUnderscores(childPropName);
          var childrenNameType = getStringLiteralType(childrenPropName);
          var childrenTargetType = getIndexedAccessType(target, childrenNameType);
          var validChildren = ts2.getSemanticJsxChildren(containingElement.children);
          if (!ts2.length(validChildren)) {
            return result;
          }
          var moreThanOneRealChildren = ts2.length(validChildren) > 1;
          var arrayLikeTargetParts = filterType(childrenTargetType, isArrayOrTupleLikeType);
          var nonArrayLikeTargetParts = filterType(childrenTargetType, function(t) {
            return !isArrayOrTupleLikeType(t);
          });
          if (moreThanOneRealChildren) {
            if (arrayLikeTargetParts !== neverType) {
              var realSource = createTupleType(checkJsxChildren(containingElement, 0));
              var children = generateJsxChildren(containingElement, getInvalidTextualChildDiagnostic);
              result = elaborateElementwise(children, realSource, arrayLikeTargetParts, relation, containingMessageChain, errorOutputContainer) || result;
            } else if (!isTypeRelatedTo(getIndexedAccessType(source, childrenNameType), childrenTargetType, relation)) {
              result = true;
              var diag = error(containingElement.openingElement.tagName, ts2.Diagnostics.This_JSX_tag_s_0_prop_expects_a_single_child_of_type_1_but_multiple_children_were_provided, childrenPropName, typeToString(childrenTargetType));
              if (errorOutputContainer && errorOutputContainer.skipLogging) {
                (errorOutputContainer.errors || (errorOutputContainer.errors = [])).push(diag);
              }
            }
          } else {
            if (nonArrayLikeTargetParts !== neverType) {
              var child = validChildren[0];
              var elem_1 = getElaborationElementForJsxChild(child, childrenNameType, getInvalidTextualChildDiagnostic);
              if (elem_1) {
                result = elaborateElementwise(function() {
                  return __generator(this, function(_a) {
                    switch (_a.label) {
                      case 0:
                        return [4, elem_1];
                      case 1:
                        _a.sent();
                        return [2];
                    }
                  });
                }(), source, target, relation, containingMessageChain, errorOutputContainer) || result;
              }
            } else if (!isTypeRelatedTo(getIndexedAccessType(source, childrenNameType), childrenTargetType, relation)) {
              result = true;
              var diag = error(containingElement.openingElement.tagName, ts2.Diagnostics.This_JSX_tag_s_0_prop_expects_type_1_which_requires_multiple_children_but_only_a_single_child_was_provided, childrenPropName, typeToString(childrenTargetType));
              if (errorOutputContainer && errorOutputContainer.skipLogging) {
                (errorOutputContainer.errors || (errorOutputContainer.errors = [])).push(diag);
              }
            }
          }
        }
        return result;
        function getInvalidTextualChildDiagnostic() {
          if (!invalidTextDiagnostic) {
            var tagNameText = ts2.getTextOfNode(node.parent.tagName);
            var childPropName2 = getJsxElementChildrenPropertyName(getJsxNamespaceAt(node));
            var childrenPropName2 = childPropName2 === void 0 ? "children" : ts2.unescapeLeadingUnderscores(childPropName2);
            var childrenTargetType2 = getIndexedAccessType(target, getStringLiteralType(childrenPropName2));
            var diagnostic = ts2.Diagnostics._0_components_don_t_accept_text_as_child_elements_Text_in_JSX_has_the_type_string_but_the_expected_type_of_1_is_2;
            invalidTextDiagnostic = __assign(__assign({}, diagnostic), { key: "!!ALREADY FORMATTED!!", message: ts2.formatMessage(void 0, diagnostic, tagNameText, childrenPropName2, typeToString(childrenTargetType2)) });
          }
          return invalidTextDiagnostic;
        }
      }
      function generateLimitedTupleElements(node, target) {
        var len, i, elem, nameType;
        return __generator(this, function(_a) {
          switch (_a.label) {
            case 0:
              len = ts2.length(node.elements);
              if (!len)
                return [2];
              i = 0;
              _a.label = 1;
            case 1:
              if (!(i < len))
                return [3, 4];
              if (isTupleLikeType(target) && !getPropertyOfType(target, "" + i))
                return [3, 3];
              elem = node.elements[i];
              if (ts2.isOmittedExpression(elem))
                return [3, 3];
              nameType = getNumberLiteralType(i);
              return [4, { errorNode: elem, innerExpression: elem, nameType }];
            case 2:
              _a.sent();
              _a.label = 3;
            case 3:
              i++;
              return [3, 1];
            case 4:
              return [2];
          }
        });
      }
      function elaborateArrayLiteral(node, source, target, relation, containingMessageChain, errorOutputContainer) {
        if (target.flags & 131068)
          return false;
        if (isTupleLikeType(source)) {
          return elaborateElementwise(generateLimitedTupleElements(node, target), source, target, relation, containingMessageChain, errorOutputContainer);
        }
        var oldContext = node.contextualType;
        node.contextualType = target;
        try {
          var tupleizedType = checkArrayLiteral(node, 1, true);
          node.contextualType = oldContext;
          if (isTupleLikeType(tupleizedType)) {
            return elaborateElementwise(generateLimitedTupleElements(node, target), tupleizedType, target, relation, containingMessageChain, errorOutputContainer);
          }
          return false;
        } finally {
          node.contextualType = oldContext;
        }
      }
      function generateObjectLiteralElements(node) {
        var _i, _a, prop, type, _b;
        return __generator(this, function(_c) {
          switch (_c.label) {
            case 0:
              if (!ts2.length(node.properties))
                return [2];
              _i = 0, _a = node.properties;
              _c.label = 1;
            case 1:
              if (!(_i < _a.length))
                return [3, 8];
              prop = _a[_i];
              if (ts2.isSpreadAssignment(prop))
                return [3, 7];
              type = getLiteralTypeFromProperty(getSymbolOfNode(prop), 8576);
              if (!type || type.flags & 131072) {
                return [3, 7];
              }
              _b = prop.kind;
              switch (_b) {
                case 172:
                  return [3, 2];
                case 171:
                  return [3, 2];
                case 168:
                  return [3, 2];
                case 295:
                  return [3, 2];
                case 294:
                  return [3, 4];
              }
              return [3, 6];
            case 2:
              return [4, { errorNode: prop.name, innerExpression: void 0, nameType: type }];
            case 3:
              _c.sent();
              return [3, 7];
            case 4:
              return [4, { errorNode: prop.name, innerExpression: prop.initializer, nameType: type, errorMessage: ts2.isComputedNonLiteralName(prop.name) ? ts2.Diagnostics.Type_of_computed_property_s_value_is_0_which_is_not_assignable_to_type_1 : void 0 }];
            case 5:
              _c.sent();
              return [3, 7];
            case 6:
              ts2.Debug.assertNever(prop);
              _c.label = 7;
            case 7:
              _i++;
              return [3, 1];
            case 8:
              return [2];
          }
        });
      }
      function elaborateObjectLiteral(node, source, target, relation, containingMessageChain, errorOutputContainer) {
        if (target.flags & 131068)
          return false;
        return elaborateElementwise(generateObjectLiteralElements(node), source, target, relation, containingMessageChain, errorOutputContainer);
      }
      function checkTypeComparableTo(source, target, errorNode, headMessage, containingMessageChain) {
        return checkTypeRelatedTo(source, target, comparableRelation, errorNode, headMessage, containingMessageChain);
      }
      function isSignatureAssignableTo(source, target, ignoreReturnTypes) {
        return compareSignaturesRelated(source, target, ignoreReturnTypes ? 4 : 0, false, void 0, void 0, compareTypesAssignable, void 0) !== 0;
      }
      function isAnySignature(s) {
        return !s.typeParameters && (!s.thisParameter || isTypeAny(getTypeOfParameter(s.thisParameter))) && s.parameters.length === 1 && signatureHasRestParameter(s) && (getTypeOfParameter(s.parameters[0]) === anyArrayType || isTypeAny(getTypeOfParameter(s.parameters[0]))) && isTypeAny(getReturnTypeOfSignature(s));
      }
      function compareSignaturesRelated(source, target, checkMode, reportErrors, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) {
        if (source === target) {
          return -1;
        }
        if (isAnySignature(target)) {
          return -1;
        }
        var targetCount = getParameterCount(target);
        var sourceHasMoreParameters = !hasEffectiveRestParameter(target) && (checkMode & 8 ? hasEffectiveRestParameter(source) || getParameterCount(source) > targetCount : getMinArgumentCount(source) > targetCount);
        if (sourceHasMoreParameters) {
          return 0;
        }
        if (source.typeParameters && source.typeParameters !== target.typeParameters) {
          target = getCanonicalSignature(target);
          source = instantiateSignatureInContextOf(source, target, void 0, compareTypes);
        }
        var sourceCount = getParameterCount(source);
        var sourceRestType = getNonArrayRestType(source);
        var targetRestType = getNonArrayRestType(target);
        if (sourceRestType || targetRestType) {
          void instantiateType(sourceRestType || targetRestType, reportUnreliableMarkers);
        }
        if (sourceRestType && targetRestType && sourceCount !== targetCount) {
          return 0;
        }
        var kind = target.declaration ? target.declaration.kind : 0;
        var strictVariance = !(checkMode & 3) && strictFunctionTypes && kind !== 168 && kind !== 167 && kind !== 170;
        var result = -1;
        var sourceThisType = getThisTypeOfSignature(source);
        if (sourceThisType && sourceThisType !== voidType) {
          var targetThisType = getThisTypeOfSignature(target);
          if (targetThisType) {
            var related = !strictVariance && compareTypes(sourceThisType, targetThisType, false) || compareTypes(targetThisType, sourceThisType, reportErrors);
            if (!related) {
              if (reportErrors) {
                errorReporter(ts2.Diagnostics.The_this_types_of_each_signature_are_incompatible);
              }
              return 0;
            }
            result &= related;
          }
        }
        var paramCount = sourceRestType || targetRestType ? Math.min(sourceCount, targetCount) : Math.max(sourceCount, targetCount);
        var restIndex = sourceRestType || targetRestType ? paramCount - 1 : -1;
        for (var i = 0; i < paramCount; i++) {
          var sourceType = i === restIndex ? getRestTypeAtPosition(source, i) : tryGetTypeAtPosition(source, i);
          var targetType = i === restIndex ? getRestTypeAtPosition(target, i) : tryGetTypeAtPosition(target, i);
          if (sourceType && targetType) {
            var sourceSig = checkMode & 3 ? void 0 : getSingleCallSignature(getNonNullableType(sourceType));
            var targetSig = checkMode & 3 ? void 0 : getSingleCallSignature(getNonNullableType(targetType));
            var callbacks = sourceSig && targetSig && !getTypePredicateOfSignature(sourceSig) && !getTypePredicateOfSignature(targetSig) && (getFalsyFlags(sourceType) & 98304) === (getFalsyFlags(targetType) & 98304);
            var related = callbacks ? compareSignaturesRelated(targetSig, sourceSig, checkMode & 8 | (strictVariance ? 2 : 1), reportErrors, errorReporter, incompatibleErrorReporter, compareTypes, reportUnreliableMarkers) : !(checkMode & 3) && !strictVariance && compareTypes(sourceType, targetType, false) || compareTypes(targetType, sourceType, reportErrors);
            if (related && checkMode & 8 && i >= getMinArgumentCount(source) && i < getMinArgumentCount(target) && compareTypes(sourceType, targetType, false)) {
              related = 0;
            }
            if (!related) {
              if (reportErrors) {
                errorReporter(ts2.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, ts2.unescapeLeadingUnderscores(getParameterNameAtPosition(source, i)), ts2.unescapeLeadingUnderscores(getParameterNameAtPosition(target, i)));
              }
              return 0;
            }
            result &= related;
          }
        }
        if (!(checkMode & 4)) {
          var targetReturnType = isResolvingReturnTypeOfSignature(target) ? anyType : target.declaration && isJSConstructor(target.declaration) ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(target.declaration.symbol)) : getReturnTypeOfSignature(target);
          if (targetReturnType === voidType) {
            return result;
          }
          var sourceReturnType = isResolvingReturnTypeOfSignature(source) ? anyType : source.declaration && isJSConstructor(source.declaration) ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(source.declaration.symbol)) : getReturnTypeOfSignature(source);
          var targetTypePredicate = getTypePredicateOfSignature(target);
          if (targetTypePredicate) {
            var sourceTypePredicate = getTypePredicateOfSignature(source);
            if (sourceTypePredicate) {
              result &= compareTypePredicateRelatedTo(sourceTypePredicate, targetTypePredicate, reportErrors, errorReporter, compareTypes);
            } else if (ts2.isIdentifierTypePredicate(targetTypePredicate)) {
              if (reportErrors) {
                errorReporter(ts2.Diagnostics.Signature_0_must_be_a_type_predicate, signatureToString(source));
              }
              return 0;
            }
          } else {
            result &= checkMode & 1 && compareTypes(targetReturnType, sourceReturnType, false) || compareTypes(sourceReturnType, targetReturnType, reportErrors);
            if (!result && reportErrors && incompatibleErrorReporter) {
              incompatibleErrorReporter(sourceReturnType, targetReturnType);
            }
          }
        }
        return result;
      }
      function compareTypePredicateRelatedTo(source, target, reportErrors, errorReporter, compareTypes) {
        if (source.kind !== target.kind) {
          if (reportErrors) {
            errorReporter(ts2.Diagnostics.A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard);
            errorReporter(ts2.Diagnostics.Type_predicate_0_is_not_assignable_to_1, typePredicateToString(source), typePredicateToString(target));
          }
          return 0;
        }
        if (source.kind === 1 || source.kind === 3) {
          if (source.parameterIndex !== target.parameterIndex) {
            if (reportErrors) {
              errorReporter(ts2.Diagnostics.Parameter_0_is_not_in_the_same_position_as_parameter_1, source.parameterName, target.parameterName);
              errorReporter(ts2.Diagnostics.Type_predicate_0_is_not_assignable_to_1, typePredicateToString(source), typePredicateToString(target));
            }
            return 0;
          }
        }
        var related = source.type === target.type ? -1 : source.type && target.type ? compareTypes(source.type, target.type, reportErrors) : 0;
        if (related === 0 && reportErrors) {
          errorReporter(ts2.Diagnostics.Type_predicate_0_is_not_assignable_to_1, typePredicateToString(source), typePredicateToString(target));
        }
        return related;
      }
      function isImplementationCompatibleWithOverload(implementation, overload) {
        var erasedSource = getErasedSignature(implementation);
        var erasedTarget = getErasedSignature(overload);
        var sourceReturnType = getReturnTypeOfSignature(erasedSource);
        var targetReturnType = getReturnTypeOfSignature(erasedTarget);
        if (targetReturnType === voidType || isTypeRelatedTo(targetReturnType, sourceReturnType, assignableRelation) || isTypeRelatedTo(sourceReturnType, targetReturnType, assignableRelation)) {
          return isSignatureAssignableTo(erasedSource, erasedTarget, true);
        }
        return false;
      }
      function isEmptyResolvedType(t) {
        return t !== anyFunctionType && t.properties.length === 0 && t.callSignatures.length === 0 && t.constructSignatures.length === 0 && t.indexInfos.length === 0;
      }
      function isEmptyObjectType(type) {
        return type.flags & 524288 ? !isGenericMappedType(type) && isEmptyResolvedType(resolveStructuredTypeMembers(type)) : type.flags & 67108864 ? true : type.flags & 1048576 ? ts2.some(type.types, isEmptyObjectType) : type.flags & 2097152 ? ts2.every(type.types, isEmptyObjectType) : false;
      }
      function isEmptyAnonymousObjectType(type) {
        return !!(ts2.getObjectFlags(type) & 16 && (type.members && isEmptyResolvedType(type) || type.symbol && type.symbol.flags & 2048 && getMembersOfSymbol(type.symbol).size === 0));
      }
      function isStringIndexSignatureOnlyType(type) {
        return type.flags & 524288 && !isGenericMappedType(type) && getPropertiesOfType(type).length === 0 && getIndexInfosOfType(type).length === 1 && !!getIndexInfoOfType(type, stringType) || type.flags & 3145728 && ts2.every(type.types, isStringIndexSignatureOnlyType) || false;
      }
      function isEnumTypeRelatedTo(sourceSymbol, targetSymbol, errorReporter) {
        if (sourceSymbol === targetSymbol) {
          return true;
        }
        var id = getSymbolId(sourceSymbol) + "," + getSymbolId(targetSymbol);
        var entry = enumRelation.get(id);
        if (entry !== void 0 && !(!(entry & 4) && entry & 2 && errorReporter)) {
          return !!(entry & 1);
        }
        if (sourceSymbol.escapedName !== targetSymbol.escapedName || !(sourceSymbol.flags & 256) || !(targetSymbol.flags & 256)) {
          enumRelation.set(id, 2 | 4);
          return false;
        }
        var targetEnumType = getTypeOfSymbol(targetSymbol);
        for (var _i = 0, _a = getPropertiesOfType(getTypeOfSymbol(sourceSymbol)); _i < _a.length; _i++) {
          var property = _a[_i];
          if (property.flags & 8) {
            var targetProperty = getPropertyOfType(targetEnumType, property.escapedName);
            if (!targetProperty || !(targetProperty.flags & 8)) {
              if (errorReporter) {
                errorReporter(ts2.Diagnostics.Property_0_is_missing_in_type_1, ts2.symbolName(property), typeToString(getDeclaredTypeOfSymbol(targetSymbol), void 0, 64));
                enumRelation.set(id, 2 | 4);
              } else {
                enumRelation.set(id, 2);
              }
              return false;
            }
          }
        }
        enumRelation.set(id, 1);
        return true;
      }
      function isSimpleTypeRelatedTo(source, target, relation, errorReporter) {
        var s = source.flags;
        var t = target.flags;
        if (t & 3 || s & 131072 || source === wildcardType)
          return true;
        if (t & 131072)
          return false;
        if (s & 402653316 && t & 4)
          return true;
        if (s & 128 && s & 1024 && t & 128 && !(t & 1024) && source.value === target.value)
          return true;
        if (s & 296 && t & 8)
          return true;
        if (s & 256 && s & 1024 && t & 256 && !(t & 1024) && source.value === target.value)
          return true;
        if (s & 2112 && t & 64)
          return true;
        if (s & 528 && t & 16)
          return true;
        if (s & 12288 && t & 4096)
          return true;
        if (s & 32 && t & 32 && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter))
          return true;
        if (s & 1024 && t & 1024) {
          if (s & 1048576 && t & 1048576 && isEnumTypeRelatedTo(source.symbol, target.symbol, errorReporter))
            return true;
          if (s & 2944 && t & 2944 && source.value === target.value && isEnumTypeRelatedTo(getParentOfSymbol(source.symbol), getParentOfSymbol(target.symbol), errorReporter))
            return true;
        }
        if (s & 32768 && (!strictNullChecks || t & (32768 | 16384)))
          return true;
        if (s & 65536 && (!strictNullChecks || t & 65536))
          return true;
        if (s & 524288 && t & 67108864)
          return true;
        if (relation === assignableRelation || relation === comparableRelation) {
          if (s & 1)
            return true;
          if (s & (8 | 256) && !(s & 1024) && (t & 32 || relation === assignableRelation && t & 256 && t & 1024))
            return true;
        }
        return false;
      }
      function isTypeRelatedTo(source, target, relation) {
        if (isFreshLiteralType(source)) {
          source = source.regularType;
        }
        if (isFreshLiteralType(target)) {
          target = target.regularType;
        }
        if (source === target) {
          return true;
        }
        if (relation !== identityRelation) {
          if (relation === comparableRelation && !(target.flags & 131072) && isSimpleTypeRelatedTo(target, source, relation) || isSimpleTypeRelatedTo(source, target, relation)) {
            return true;
          }
        } else {
          if (source.flags !== target.flags)
            return false;
          if (source.flags & 67358815)
            return true;
        }
        if (source.flags & 524288 && target.flags & 524288) {
          var related = relation.get(getRelationKey(source, target, 0, relation, false));
          if (related !== void 0) {
            return !!(related & 1);
          }
        }
        if (source.flags & 469499904 || target.flags & 469499904) {
          return checkTypeRelatedTo(source, target, relation, void 0);
        }
        return false;
      }
      function isIgnoredJsxProperty(source, sourceProp) {
        return ts2.getObjectFlags(source) & 2048 && isHyphenatedJsxName(sourceProp.escapedName);
      }
      function getNormalizedType(type, writing) {
        while (true) {
          var t = isFreshLiteralType(type) ? type.regularType : ts2.getObjectFlags(type) & 4 && type.node ? createTypeReference(type.target, getTypeArguments(type)) : type.flags & 3145728 ? getReducedType(type) : type.flags & 33554432 ? writing ? type.baseType : type.substitute : type.flags & 25165824 ? getSimplifiedType(type, writing) : type;
          t = getSingleBaseForNonAugmentingSubtype(t) || t;
          if (t === type)
            break;
          type = t;
        }
        return type;
      }
      function checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain, errorOutputContainer) {
        var errorInfo;
        var relatedInfo;
        var maybeKeys;
        var sourceStack;
        var targetStack;
        var maybeCount = 0;
        var sourceDepth = 0;
        var targetDepth = 0;
        var expandingFlags = 0;
        var overflow = false;
        var overrideNextErrorInfo = 0;
        var lastSkippedInfo;
        var incompatibleStack = [];
        var inPropertyCheck = false;
        ts2.Debug.assert(relation !== identityRelation || !errorNode, "no error reporting in identity checking");
        var result = isRelatedTo(source, target, 3, !!errorNode, headMessage);
        if (incompatibleStack.length) {
          reportIncompatibleStack();
        }
        if (overflow) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("checkTypes", "checkTypeRelatedTo_DepthLimit", { sourceId: source.id, targetId: target.id, depth: sourceDepth, targetDepth });
          var diag = error(errorNode || currentNode, ts2.Diagnostics.Excessive_stack_depth_comparing_types_0_and_1, typeToString(source), typeToString(target));
          if (errorOutputContainer) {
            (errorOutputContainer.errors || (errorOutputContainer.errors = [])).push(diag);
          }
        } else if (errorInfo) {
          if (containingMessageChain) {
            var chain = containingMessageChain();
            if (chain) {
              ts2.concatenateDiagnosticMessageChains(chain, errorInfo);
              errorInfo = chain;
            }
          }
          var relatedInformation = void 0;
          if (headMessage && errorNode && !result && source.symbol) {
            var links = getSymbolLinks(source.symbol);
            if (links.originatingImport && !ts2.isImportCall(links.originatingImport)) {
              var helpfulRetry = checkTypeRelatedTo(getTypeOfSymbol(links.target), target, relation, void 0);
              if (helpfulRetry) {
                var diag_1 = ts2.createDiagnosticForNode(links.originatingImport, ts2.Diagnostics.Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cause_a_failure_at_runtime_Consider_using_a_default_import_or_import_require_here_instead);
                relatedInformation = ts2.append(relatedInformation, diag_1);
              }
            }
          }
          var diag = ts2.createDiagnosticForNodeFromMessageChain(errorNode, errorInfo, relatedInformation);
          if (relatedInfo) {
            ts2.addRelatedInfo.apply(void 0, __spreadArray([diag], relatedInfo, false));
          }
          if (errorOutputContainer) {
            (errorOutputContainer.errors || (errorOutputContainer.errors = [])).push(diag);
          }
          if (!errorOutputContainer || !errorOutputContainer.skipLogging) {
            diagnostics.add(diag);
          }
        }
        if (errorNode && errorOutputContainer && errorOutputContainer.skipLogging && result === 0) {
          ts2.Debug.assert(!!errorOutputContainer.errors, "missed opportunity to interact with error.");
        }
        return result !== 0;
        function resetErrorInfo(saved) {
          errorInfo = saved.errorInfo;
          lastSkippedInfo = saved.lastSkippedInfo;
          incompatibleStack = saved.incompatibleStack;
          overrideNextErrorInfo = saved.overrideNextErrorInfo;
          relatedInfo = saved.relatedInfo;
        }
        function captureErrorCalculationState() {
          return {
            errorInfo,
            lastSkippedInfo,
            incompatibleStack: incompatibleStack.slice(),
            overrideNextErrorInfo,
            relatedInfo: !relatedInfo ? void 0 : relatedInfo.slice()
          };
        }
        function reportIncompatibleError(message, arg0, arg1, arg2, arg3) {
          overrideNextErrorInfo++;
          lastSkippedInfo = void 0;
          incompatibleStack.push([message, arg0, arg1, arg2, arg3]);
        }
        function reportIncompatibleStack() {
          var stack = incompatibleStack;
          incompatibleStack = [];
          var info = lastSkippedInfo;
          lastSkippedInfo = void 0;
          if (stack.length === 1) {
            reportError.apply(void 0, stack[0]);
            if (info) {
              reportRelationError.apply(void 0, __spreadArray([void 0], info, false));
            }
            return;
          }
          var path = "";
          var secondaryRootErrors = [];
          while (stack.length) {
            var _a = stack.pop(), msg = _a[0], args = _a.slice(1);
            switch (msg.code) {
              case ts2.Diagnostics.Types_of_property_0_are_incompatible.code: {
                if (path.indexOf("new ") === 0) {
                  path = "(".concat(path, ")");
                }
                var str = "" + args[0];
                if (path.length === 0) {
                  path = "".concat(str);
                } else if (ts2.isIdentifierText(str, ts2.getEmitScriptTarget(compilerOptions))) {
                  path = "".concat(path, ".").concat(str);
                } else if (str[0] === "[" && str[str.length - 1] === "]") {
                  path = "".concat(path).concat(str);
                } else {
                  path = "".concat(path, "[").concat(str, "]");
                }
                break;
              }
              case ts2.Diagnostics.Call_signature_return_types_0_and_1_are_incompatible.code:
              case ts2.Diagnostics.Construct_signature_return_types_0_and_1_are_incompatible.code:
              case ts2.Diagnostics.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code:
              case ts2.Diagnostics.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code: {
                if (path.length === 0) {
                  var mappedMsg = msg;
                  if (msg.code === ts2.Diagnostics.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code) {
                    mappedMsg = ts2.Diagnostics.Call_signature_return_types_0_and_1_are_incompatible;
                  } else if (msg.code === ts2.Diagnostics.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code) {
                    mappedMsg = ts2.Diagnostics.Construct_signature_return_types_0_and_1_are_incompatible;
                  }
                  secondaryRootErrors.unshift([mappedMsg, args[0], args[1]]);
                } else {
                  var prefix = msg.code === ts2.Diagnostics.Construct_signature_return_types_0_and_1_are_incompatible.code || msg.code === ts2.Diagnostics.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code ? "new " : "";
                  var params = msg.code === ts2.Diagnostics.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code || msg.code === ts2.Diagnostics.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1.code ? "" : "...";
                  path = "".concat(prefix).concat(path, "(").concat(params, ")");
                }
                break;
              }
              case ts2.Diagnostics.Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target.code: {
                secondaryRootErrors.unshift([ts2.Diagnostics.Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target, args[0], args[1]]);
                break;
              }
              case ts2.Diagnostics.Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target.code: {
                secondaryRootErrors.unshift([ts2.Diagnostics.Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target, args[0], args[1], args[2]]);
                break;
              }
              default:
                return ts2.Debug.fail("Unhandled Diagnostic: ".concat(msg.code));
            }
          }
          if (path) {
            reportError(path[path.length - 1] === ")" ? ts2.Diagnostics.The_types_returned_by_0_are_incompatible_between_these_types : ts2.Diagnostics.The_types_of_0_are_incompatible_between_these_types, path);
          } else {
            secondaryRootErrors.shift();
          }
          for (var _i = 0, secondaryRootErrors_1 = secondaryRootErrors; _i < secondaryRootErrors_1.length; _i++) {
            var _b = secondaryRootErrors_1[_i], msg = _b[0], args = _b.slice(1);
            var originalValue = msg.elidedInCompatabilityPyramid;
            msg.elidedInCompatabilityPyramid = false;
            reportError.apply(void 0, __spreadArray([msg], args, false));
            msg.elidedInCompatabilityPyramid = originalValue;
          }
          if (info) {
            reportRelationError.apply(void 0, __spreadArray([void 0], info, false));
          }
        }
        function reportError(message, arg0, arg1, arg2, arg3) {
          ts2.Debug.assert(!!errorNode);
          if (incompatibleStack.length)
            reportIncompatibleStack();
          if (message.elidedInCompatabilityPyramid)
            return;
          errorInfo = ts2.chainDiagnosticMessages(errorInfo, message, arg0, arg1, arg2, arg3);
        }
        function associateRelatedInfo(info) {
          ts2.Debug.assert(!!errorInfo);
          if (!relatedInfo) {
            relatedInfo = [info];
          } else {
            relatedInfo.push(info);
          }
        }
        function reportRelationError(message, source2, target2) {
          if (incompatibleStack.length)
            reportIncompatibleStack();
          var _a = getTypeNamesForErrorDisplay(source2, target2), sourceType = _a[0], targetType = _a[1];
          var generalizedSource = source2;
          var generalizedSourceType = sourceType;
          if (isLiteralType(source2) && !typeCouldHaveTopLevelSingletonTypes(target2)) {
            generalizedSource = getBaseTypeOfLiteralType(source2);
            ts2.Debug.assert(!isTypeAssignableTo(generalizedSource, target2), "generalized source shouldn't be assignable");
            generalizedSourceType = getTypeNameForErrorDisplay(generalizedSource);
          }
          if (target2.flags & 262144) {
            var constraint = getBaseConstraintOfType(target2);
            var needsOriginalSource = void 0;
            if (constraint && (isTypeAssignableTo(generalizedSource, constraint) || (needsOriginalSource = isTypeAssignableTo(source2, constraint)))) {
              reportError(ts2.Diagnostics._0_is_assignable_to_the_constraint_of_type_1_but_1_could_be_instantiated_with_a_different_subtype_of_constraint_2, needsOriginalSource ? sourceType : generalizedSourceType, targetType, typeToString(constraint));
            } else {
              errorInfo = void 0;
              reportError(ts2.Diagnostics._0_could_be_instantiated_with_an_arbitrary_type_which_could_be_unrelated_to_1, targetType, generalizedSourceType);
            }
          }
          if (!message) {
            if (relation === comparableRelation) {
              message = ts2.Diagnostics.Type_0_is_not_comparable_to_type_1;
            } else if (sourceType === targetType) {
              message = ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated;
            } else if (exactOptionalPropertyTypes && getExactOptionalUnassignableProperties(source2, target2).length) {
              message = ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties;
            } else {
              if (source2.flags & 128 && target2.flags & 1048576) {
                var suggestedType = getSuggestedTypeForNonexistentStringLiteralType(source2, target2);
                if (suggestedType) {
                  reportError(ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_Did_you_mean_2, generalizedSourceType, targetType, typeToString(suggestedType));
                  return;
                }
              }
              message = ts2.Diagnostics.Type_0_is_not_assignable_to_type_1;
            }
          } else if (message === ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1 && exactOptionalPropertyTypes && getExactOptionalUnassignableProperties(source2, target2).length) {
            message = ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties;
          }
          reportError(message, generalizedSourceType, targetType);
        }
        function tryElaborateErrorsForPrimitivesAndObjects(source2, target2) {
          var sourceType = symbolValueDeclarationIsContextSensitive(source2.symbol) ? typeToString(source2, source2.symbol.valueDeclaration) : typeToString(source2);
          var targetType = symbolValueDeclarationIsContextSensitive(target2.symbol) ? typeToString(target2, target2.symbol.valueDeclaration) : typeToString(target2);
          if (globalStringType === source2 && stringType === target2 || globalNumberType === source2 && numberType === target2 || globalBooleanType === source2 && booleanType === target2 || getGlobalESSymbolType(false) === source2 && esSymbolType === target2) {
            reportError(ts2.Diagnostics._0_is_a_primitive_but_1_is_a_wrapper_object_Prefer_using_0_when_possible, targetType, sourceType);
          }
        }
        function tryElaborateArrayLikeErrors(source2, target2, reportErrors) {
          if (isTupleType(source2)) {
            if (source2.target.readonly && isMutableArrayOrTuple(target2)) {
              if (reportErrors) {
                reportError(ts2.Diagnostics.The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1, typeToString(source2), typeToString(target2));
              }
              return false;
            }
            return isTupleType(target2) || isArrayType(target2);
          }
          if (isReadonlyArrayType(source2) && isMutableArrayOrTuple(target2)) {
            if (reportErrors) {
              reportError(ts2.Diagnostics.The_type_0_is_readonly_and_cannot_be_assigned_to_the_mutable_type_1, typeToString(source2), typeToString(target2));
            }
            return false;
          }
          if (isTupleType(target2)) {
            return isArrayType(source2);
          }
          return true;
        }
        function isRelatedToWorker(source2, target2, reportErrors) {
          return isRelatedTo(source2, target2, 3, reportErrors);
        }
        function isRelatedTo(originalSource, originalTarget, recursionFlags, reportErrors, headMessage2, intersectionState) {
          if (recursionFlags === void 0) {
            recursionFlags = 3;
          }
          if (reportErrors === void 0) {
            reportErrors = false;
          }
          if (intersectionState === void 0) {
            intersectionState = 0;
          }
          if (originalSource.flags & 524288 && originalTarget.flags & 131068) {
            if (isSimpleTypeRelatedTo(originalSource, originalTarget, relation, reportErrors ? reportError : void 0)) {
              return -1;
            }
            reportErrorResults(originalSource, originalTarget, 0, !!(ts2.getObjectFlags(originalSource) & 2048));
            return 0;
          }
          var source2 = getNormalizedType(originalSource, false);
          var target2 = getNormalizedType(originalTarget, true);
          if (source2 === target2)
            return -1;
          if (relation === identityRelation) {
            return isIdenticalTo(source2, target2, recursionFlags);
          }
          if (source2.flags & 262144 && getConstraintOfType(source2) === target2) {
            return -1;
          }
          if (target2.flags & 1048576 && source2.flags & 524288 && target2.types.length <= 3 && maybeTypeOfKind(target2, 98304)) {
            var nullStrippedTarget = extractTypesOfKind(target2, ~98304);
            if (!(nullStrippedTarget.flags & (1048576 | 131072))) {
              target2 = getNormalizedType(nullStrippedTarget, true);
            }
            if (source2 === nullStrippedTarget)
              return -1;
          }
          if (relation === comparableRelation && !(target2.flags & 131072) && isSimpleTypeRelatedTo(target2, source2, relation) || isSimpleTypeRelatedTo(source2, target2, relation, reportErrors ? reportError : void 0))
            return -1;
          var isComparingJsxAttributes = !!(ts2.getObjectFlags(source2) & 2048);
          var isPerformingExcessPropertyChecks = !(intersectionState & 2) && (isObjectLiteralType(source2) && ts2.getObjectFlags(source2) & 16384);
          if (isPerformingExcessPropertyChecks) {
            if (hasExcessProperties(source2, target2, reportErrors)) {
              if (reportErrors) {
                reportRelationError(headMessage2, source2, originalTarget.aliasSymbol ? originalTarget : target2);
              }
              return 0;
            }
          }
          var isPerformingCommonPropertyChecks = relation !== comparableRelation && !(intersectionState & 2) && source2.flags & (131068 | 524288 | 2097152) && source2 !== globalObjectType && target2.flags & (524288 | 2097152) && isWeakType(target2) && (getPropertiesOfType(source2).length > 0 || typeHasCallOrConstructSignatures(source2));
          if (isPerformingCommonPropertyChecks && !hasCommonProperties(source2, target2, isComparingJsxAttributes)) {
            if (reportErrors) {
              var sourceString = typeToString(originalSource.aliasSymbol ? originalSource : source2);
              var targetString = typeToString(originalTarget.aliasSymbol ? originalTarget : target2);
              var calls = getSignaturesOfType(source2, 0);
              var constructs = getSignaturesOfType(source2, 1);
              if (calls.length > 0 && isRelatedTo(getReturnTypeOfSignature(calls[0]), target2, 1, false) || constructs.length > 0 && isRelatedTo(getReturnTypeOfSignature(constructs[0]), target2, 1, false)) {
                reportError(ts2.Diagnostics.Value_of_type_0_has_no_properties_in_common_with_type_1_Did_you_mean_to_call_it, sourceString, targetString);
              } else {
                reportError(ts2.Diagnostics.Type_0_has_no_properties_in_common_with_type_1, sourceString, targetString);
              }
            }
            return 0;
          }
          traceUnionsOrIntersectionsTooLarge(source2, target2);
          var result2 = 0;
          var saveErrorInfo = captureErrorCalculationState();
          if ((source2.flags & 1048576 || target2.flags & 1048576) && getConstituentCount(source2) * getConstituentCount(target2) < 4) {
            result2 = structuredTypeRelatedTo(source2, target2, reportErrors, intersectionState | 8);
          } else if (source2.flags & 3145728 || target2.flags & 3145728) {
            result2 = recursiveTypeRelatedTo(source2, target2, reportErrors, intersectionState | 8, recursionFlags);
          }
          if (!result2 && !(source2.flags & 1048576) && (source2.flags & 469499904 || target2.flags & 469499904)) {
            if (result2 = recursiveTypeRelatedTo(source2, target2, reportErrors, intersectionState, recursionFlags)) {
              resetErrorInfo(saveErrorInfo);
            }
          }
          if (!result2 && source2.flags & (2097152 | 262144)) {
            var constraint = getEffectiveConstraintOfIntersection(source2.flags & 2097152 ? source2.types : [source2], !!(target2.flags & 1048576));
            if (constraint && (source2.flags & 2097152 || target2.flags & 1048576)) {
              if (everyType(constraint, function(c) {
                return c !== source2;
              })) {
                if (result2 = isRelatedTo(constraint, target2, 1, false, void 0, intersectionState)) {
                  resetErrorInfo(saveErrorInfo);
                }
              }
            }
          }
          if (result2 && !inPropertyCheck && (target2.flags & 2097152 && (isPerformingExcessPropertyChecks || isPerformingCommonPropertyChecks) || isNonGenericObjectType(target2) && !isArrayType(target2) && !isTupleType(target2) && source2.flags & 2097152 && getApparentType(source2).flags & 3670016 && !ts2.some(source2.types, function(t) {
            return !!(ts2.getObjectFlags(t) & 524288);
          }))) {
            inPropertyCheck = true;
            result2 &= recursiveTypeRelatedTo(source2, target2, reportErrors, 4, recursionFlags);
            inPropertyCheck = false;
          }
          reportErrorResults(source2, target2, result2, isComparingJsxAttributes);
          return result2;
          function reportErrorResults(source3, target3, result3, isComparingJsxAttributes2) {
            if (!result3 && reportErrors) {
              var sourceHasBase = !!getSingleBaseForNonAugmentingSubtype(originalSource);
              var targetHasBase = !!getSingleBaseForNonAugmentingSubtype(originalTarget);
              source3 = originalSource.aliasSymbol || sourceHasBase ? originalSource : source3;
              target3 = originalTarget.aliasSymbol || targetHasBase ? originalTarget : target3;
              var maybeSuppress = overrideNextErrorInfo > 0;
              if (maybeSuppress) {
                overrideNextErrorInfo--;
              }
              if (source3.flags & 524288 && target3.flags & 524288) {
                var currentError = errorInfo;
                tryElaborateArrayLikeErrors(source3, target3, reportErrors);
                if (errorInfo !== currentError) {
                  maybeSuppress = !!errorInfo;
                }
              }
              if (source3.flags & 524288 && target3.flags & 131068) {
                tryElaborateErrorsForPrimitivesAndObjects(source3, target3);
              } else if (source3.symbol && source3.flags & 524288 && globalObjectType === source3) {
                reportError(ts2.Diagnostics.The_Object_type_is_assignable_to_very_few_other_types_Did_you_mean_to_use_the_any_type_instead);
              } else if (isComparingJsxAttributes2 && target3.flags & 2097152) {
                var targetTypes = target3.types;
                var intrinsicAttributes = getJsxType(JsxNames.IntrinsicAttributes, errorNode);
                var intrinsicClassAttributes = getJsxType(JsxNames.IntrinsicClassAttributes, errorNode);
                if (!isErrorType(intrinsicAttributes) && !isErrorType(intrinsicClassAttributes) && (ts2.contains(targetTypes, intrinsicAttributes) || ts2.contains(targetTypes, intrinsicClassAttributes))) {
                  return result3;
                }
              } else {
                errorInfo = elaborateNeverIntersection(errorInfo, originalTarget);
              }
              if (!headMessage2 && maybeSuppress) {
                lastSkippedInfo = [source3, target3];
                return result3;
              }
              reportRelationError(headMessage2, source3, target3);
            }
          }
        }
        function traceUnionsOrIntersectionsTooLarge(source2, target2) {
          if (!ts2.tracing) {
            return;
          }
          if (source2.flags & 3145728 && target2.flags & 3145728) {
            var sourceUnionOrIntersection = source2;
            var targetUnionOrIntersection = target2;
            if (sourceUnionOrIntersection.objectFlags & targetUnionOrIntersection.objectFlags & 65536) {
              return;
            }
            var sourceSize = sourceUnionOrIntersection.types.length;
            var targetSize = targetUnionOrIntersection.types.length;
            if (sourceSize * targetSize > 1e6) {
              ts2.tracing.instant("checkTypes", "traceUnionsOrIntersectionsTooLarge_DepthLimit", {
                sourceId: source2.id,
                sourceSize,
                targetId: target2.id,
                targetSize,
                pos: errorNode === null || errorNode === void 0 ? void 0 : errorNode.pos,
                end: errorNode === null || errorNode === void 0 ? void 0 : errorNode.end
              });
            }
          }
        }
        function isIdenticalTo(source2, target2, recursionFlags) {
          if (source2.flags !== target2.flags)
            return 0;
          if (source2.flags & 67358815)
            return -1;
          traceUnionsOrIntersectionsTooLarge(source2, target2);
          if (source2.flags & 3145728) {
            var result_7 = eachTypeRelatedToSomeType(source2, target2);
            if (result_7) {
              result_7 &= eachTypeRelatedToSomeType(target2, source2);
            }
            return result_7;
          }
          return recursiveTypeRelatedTo(source2, target2, false, 0, recursionFlags);
        }
        function getTypeOfPropertyInTypes(types, name) {
          var appendPropType = function(propTypes, type) {
            var _a;
            type = getApparentType(type);
            var prop = type.flags & 3145728 ? getPropertyOfUnionOrIntersectionType(type, name) : getPropertyOfObjectType(type, name);
            var propType = prop && getTypeOfSymbol(prop) || ((_a = getApplicableIndexInfoForName(type, name)) === null || _a === void 0 ? void 0 : _a.type) || undefinedType;
            return ts2.append(propTypes, propType);
          };
          return getUnionType(ts2.reduceLeft(types, appendPropType, void 0) || ts2.emptyArray);
        }
        function hasExcessProperties(source2, target2, reportErrors) {
          var _a;
          if (!isExcessPropertyCheckTarget(target2) || !noImplicitAny && ts2.getObjectFlags(target2) & 8192) {
            return false;
          }
          var isComparingJsxAttributes = !!(ts2.getObjectFlags(source2) & 2048);
          if ((relation === assignableRelation || relation === comparableRelation) && (isTypeSubsetOf(globalObjectType, target2) || !isComparingJsxAttributes && isEmptyObjectType(target2))) {
            return false;
          }
          var reducedTarget = target2;
          var checkTypes;
          if (target2.flags & 1048576) {
            reducedTarget = findMatchingDiscriminantType(source2, target2, isRelatedTo) || filterPrimitivesIfContainsNonPrimitive(target2);
            checkTypes = reducedTarget.flags & 1048576 ? reducedTarget.types : [reducedTarget];
          }
          var _loop_18 = function(prop2) {
            if (shouldCheckAsExcessProperty(prop2, source2.symbol) && !isIgnoredJsxProperty(source2, prop2)) {
              if (!isKnownProperty(reducedTarget, prop2.escapedName, isComparingJsxAttributes)) {
                if (reportErrors) {
                  var errorTarget = filterType(reducedTarget, isExcessPropertyCheckTarget);
                  if (!errorNode)
                    return { value: ts2.Debug.fail() };
                  if (ts2.isJsxAttributes(errorNode) || ts2.isJsxOpeningLikeElement(errorNode) || ts2.isJsxOpeningLikeElement(errorNode.parent)) {
                    if (prop2.valueDeclaration && ts2.isJsxAttribute(prop2.valueDeclaration) && ts2.getSourceFileOfNode(errorNode) === ts2.getSourceFileOfNode(prop2.valueDeclaration.name)) {
                      errorNode = prop2.valueDeclaration.name;
                    }
                    var propName = symbolToString(prop2);
                    var suggestionSymbol = getSuggestedSymbolForNonexistentJSXAttribute(propName, errorTarget);
                    var suggestion = suggestionSymbol ? symbolToString(suggestionSymbol) : void 0;
                    if (suggestion) {
                      reportError(ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2, propName, typeToString(errorTarget), suggestion);
                    } else {
                      reportError(ts2.Diagnostics.Property_0_does_not_exist_on_type_1, propName, typeToString(errorTarget));
                    }
                  } else {
                    var objectLiteralDeclaration_1 = ((_a = source2.symbol) === null || _a === void 0 ? void 0 : _a.declarations) && ts2.firstOrUndefined(source2.symbol.declarations);
                    var suggestion = void 0;
                    if (prop2.valueDeclaration && ts2.findAncestor(prop2.valueDeclaration, function(d) {
                      return d === objectLiteralDeclaration_1;
                    }) && ts2.getSourceFileOfNode(objectLiteralDeclaration_1) === ts2.getSourceFileOfNode(errorNode)) {
                      var propDeclaration = prop2.valueDeclaration;
                      ts2.Debug.assertNode(propDeclaration, ts2.isObjectLiteralElementLike);
                      errorNode = propDeclaration;
                      var name = propDeclaration.name;
                      if (ts2.isIdentifier(name)) {
                        suggestion = getSuggestionForNonexistentProperty(name, errorTarget);
                      }
                    }
                    if (suggestion !== void 0) {
                      reportError(ts2.Diagnostics.Object_literal_may_only_specify_known_properties_but_0_does_not_exist_in_type_1_Did_you_mean_to_write_2, symbolToString(prop2), typeToString(errorTarget), suggestion);
                    } else {
                      reportError(ts2.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop2), typeToString(errorTarget));
                    }
                  }
                }
                return { value: true };
              }
              if (checkTypes && !isRelatedTo(getTypeOfSymbol(prop2), getTypeOfPropertyInTypes(checkTypes, prop2.escapedName), 3, reportErrors)) {
                if (reportErrors) {
                  reportIncompatibleError(ts2.Diagnostics.Types_of_property_0_are_incompatible, symbolToString(prop2));
                }
                return { value: true };
              }
            }
          };
          for (var _i = 0, _b = getPropertiesOfType(source2); _i < _b.length; _i++) {
            var prop = _b[_i];
            var state_5 = _loop_18(prop);
            if (typeof state_5 === "object")
              return state_5.value;
          }
          return false;
        }
        function shouldCheckAsExcessProperty(prop, container) {
          return prop.valueDeclaration && container.valueDeclaration && prop.valueDeclaration.parent === container.valueDeclaration;
        }
        function eachTypeRelatedToSomeType(source2, target2) {
          var result2 = -1;
          var sourceTypes = source2.types;
          for (var _i = 0, sourceTypes_1 = sourceTypes; _i < sourceTypes_1.length; _i++) {
            var sourceType = sourceTypes_1[_i];
            var related = typeRelatedToSomeType(sourceType, target2, false);
            if (!related) {
              return 0;
            }
            result2 &= related;
          }
          return result2;
        }
        function typeRelatedToSomeType(source2, target2, reportErrors) {
          var targetTypes = target2.types;
          if (target2.flags & 1048576) {
            if (containsType(targetTypes, source2)) {
              return -1;
            }
            var match = getMatchingUnionConstituentForType(target2, source2);
            if (match) {
              var related = isRelatedTo(source2, match, 2, false);
              if (related) {
                return related;
              }
            }
          }
          for (var _i = 0, targetTypes_1 = targetTypes; _i < targetTypes_1.length; _i++) {
            var type = targetTypes_1[_i];
            var related = isRelatedTo(source2, type, 2, false);
            if (related) {
              return related;
            }
          }
          if (reportErrors) {
            var bestMatchingType = getBestMatchingType(source2, target2, isRelatedTo);
            isRelatedTo(source2, bestMatchingType || targetTypes[targetTypes.length - 1], 2, true);
          }
          return 0;
        }
        function typeRelatedToEachType(source2, target2, reportErrors, intersectionState) {
          var result2 = -1;
          var targetTypes = target2.types;
          for (var _i = 0, targetTypes_2 = targetTypes; _i < targetTypes_2.length; _i++) {
            var targetType = targetTypes_2[_i];
            var related = isRelatedTo(source2, targetType, 2, reportErrors, void 0, intersectionState);
            if (!related) {
              return 0;
            }
            result2 &= related;
          }
          return result2;
        }
        function someTypeRelatedToType(source2, target2, reportErrors, intersectionState) {
          var sourceTypes = source2.types;
          if (source2.flags & 1048576 && containsType(sourceTypes, target2)) {
            return -1;
          }
          var len = sourceTypes.length;
          for (var i = 0; i < len; i++) {
            var related = isRelatedTo(sourceTypes[i], target2, 1, reportErrors && i === len - 1, void 0, intersectionState);
            if (related) {
              return related;
            }
          }
          return 0;
        }
        function getUndefinedStrippedTargetIfNeeded(source2, target2) {
          if (source2.flags & 1048576 && target2.flags & 1048576 && !(source2.types[0].flags & 32768) && target2.types[0].flags & 32768) {
            return extractTypesOfKind(target2, ~32768);
          }
          return target2;
        }
        function eachTypeRelatedToType(source2, target2, reportErrors, intersectionState) {
          var result2 = -1;
          var sourceTypes = source2.types;
          var undefinedStrippedTarget = getUndefinedStrippedTargetIfNeeded(source2, target2);
          for (var i = 0; i < sourceTypes.length; i++) {
            var sourceType = sourceTypes[i];
            if (undefinedStrippedTarget.flags & 1048576 && sourceTypes.length >= undefinedStrippedTarget.types.length && sourceTypes.length % undefinedStrippedTarget.types.length === 0) {
              var related_1 = isRelatedTo(sourceType, undefinedStrippedTarget.types[i % undefinedStrippedTarget.types.length], 3, false, void 0, intersectionState);
              if (related_1) {
                result2 &= related_1;
                continue;
              }
            }
            var related = isRelatedTo(sourceType, target2, 1, reportErrors, void 0, intersectionState);
            if (!related) {
              return 0;
            }
            result2 &= related;
          }
          return result2;
        }
        function typeArgumentsRelatedTo(sources, targets, variances, reportErrors, intersectionState) {
          if (sources === void 0) {
            sources = ts2.emptyArray;
          }
          if (targets === void 0) {
            targets = ts2.emptyArray;
          }
          if (variances === void 0) {
            variances = ts2.emptyArray;
          }
          if (sources.length !== targets.length && relation === identityRelation) {
            return 0;
          }
          var length = sources.length <= targets.length ? sources.length : targets.length;
          var result2 = -1;
          for (var i = 0; i < length; i++) {
            var varianceFlags = i < variances.length ? variances[i] : 1;
            var variance = varianceFlags & 7;
            if (variance !== 4) {
              var s = sources[i];
              var t = targets[i];
              var related = -1;
              if (varianceFlags & 8) {
                related = relation === identityRelation ? isRelatedTo(s, t, 3, false) : compareTypesIdentical(s, t);
              } else if (variance === 1) {
                related = isRelatedTo(s, t, 3, reportErrors, void 0, intersectionState);
              } else if (variance === 2) {
                related = isRelatedTo(t, s, 3, reportErrors, void 0, intersectionState);
              } else if (variance === 3) {
                related = isRelatedTo(t, s, 3, false);
                if (!related) {
                  related = isRelatedTo(s, t, 3, reportErrors, void 0, intersectionState);
                }
              } else {
                related = isRelatedTo(s, t, 3, reportErrors, void 0, intersectionState);
                if (related) {
                  related &= isRelatedTo(t, s, 3, reportErrors, void 0, intersectionState);
                }
              }
              if (!related) {
                return 0;
              }
              result2 &= related;
            }
          }
          return result2;
        }
        function recursiveTypeRelatedTo(source2, target2, reportErrors, intersectionState, recursionFlags) {
          if (overflow) {
            return 0;
          }
          var keyIntersectionState = intersectionState | (inPropertyCheck ? 16 : 0);
          var id = getRelationKey(source2, target2, keyIntersectionState, relation, false);
          var entry = relation.get(id);
          if (entry !== void 0) {
            if (reportErrors && entry & 2 && !(entry & 4)) {
            } else {
              if (outofbandVarianceMarkerHandler) {
                var saved = entry & 24;
                if (saved & 8) {
                  instantiateType(source2, makeFunctionTypeMapper(reportUnmeasurableMarkers));
                }
                if (saved & 16) {
                  instantiateType(source2, makeFunctionTypeMapper(reportUnreliableMarkers));
                }
              }
              return entry & 1 ? -1 : 0;
            }
          }
          if (!maybeKeys) {
            maybeKeys = [];
            sourceStack = [];
            targetStack = [];
          } else {
            var broadestEquivalentId = id.startsWith("*") ? getRelationKey(source2, target2, keyIntersectionState, relation, true) : void 0;
            for (var i = 0; i < maybeCount; i++) {
              if (id === maybeKeys[i] || broadestEquivalentId && broadestEquivalentId === maybeKeys[i]) {
                return 3;
              }
            }
            if (sourceDepth === 100 || targetDepth === 100) {
              overflow = true;
              return 0;
            }
          }
          var maybeStart = maybeCount;
          maybeKeys[maybeCount] = id;
          maybeCount++;
          var saveExpandingFlags = expandingFlags;
          if (recursionFlags & 1) {
            sourceStack[sourceDepth] = source2;
            sourceDepth++;
            if (!(expandingFlags & 1) && isDeeplyNestedType(source2, sourceStack, sourceDepth))
              expandingFlags |= 1;
          }
          if (recursionFlags & 2) {
            targetStack[targetDepth] = target2;
            targetDepth++;
            if (!(expandingFlags & 2) && isDeeplyNestedType(target2, targetStack, targetDepth))
              expandingFlags |= 2;
          }
          var originalHandler;
          var propagatingVarianceFlags = 0;
          if (outofbandVarianceMarkerHandler) {
            originalHandler = outofbandVarianceMarkerHandler;
            outofbandVarianceMarkerHandler = function(onlyUnreliable) {
              propagatingVarianceFlags |= onlyUnreliable ? 16 : 8;
              return originalHandler(onlyUnreliable);
            };
          }
          if (expandingFlags === 3) {
            ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("checkTypes", "recursiveTypeRelatedTo_DepthLimit", {
              sourceId: source2.id,
              sourceIdStack: sourceStack.map(function(t) {
                return t.id;
              }),
              targetId: target2.id,
              targetIdStack: targetStack.map(function(t) {
                return t.id;
              }),
              depth: sourceDepth,
              targetDepth
            });
          }
          var result2 = expandingFlags !== 3 ? structuredTypeRelatedTo(source2, target2, reportErrors, intersectionState) : 3;
          if (outofbandVarianceMarkerHandler) {
            outofbandVarianceMarkerHandler = originalHandler;
          }
          if (recursionFlags & 1) {
            sourceDepth--;
          }
          if (recursionFlags & 2) {
            targetDepth--;
          }
          expandingFlags = saveExpandingFlags;
          if (result2) {
            if (result2 === -1 || sourceDepth === 0 && targetDepth === 0) {
              if (result2 === -1 || result2 === 3) {
                for (var i = maybeStart; i < maybeCount; i++) {
                  relation.set(maybeKeys[i], 1 | propagatingVarianceFlags);
                }
              }
              maybeCount = maybeStart;
            }
          } else {
            relation.set(id, (reportErrors ? 4 : 0) | 2 | propagatingVarianceFlags);
            maybeCount = maybeStart;
          }
          return result2;
        }
        function structuredTypeRelatedTo(source2, target2, reportErrors, intersectionState) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("checkTypes", "structuredTypeRelatedTo", { sourceId: source2.id, targetId: target2.id });
          var result2 = structuredTypeRelatedToWorker(source2, target2, reportErrors, intersectionState);
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
          return result2;
        }
        function structuredTypeRelatedToWorker(source2, target2, reportErrors, intersectionState) {
          if (intersectionState & 4) {
            return propertiesRelatedTo(source2, target2, reportErrors, void 0, 0);
          }
          if (intersectionState & 8) {
            if (source2.flags & 1048576) {
              return relation === comparableRelation ? someTypeRelatedToType(source2, target2, reportErrors && !(source2.flags & 131068), intersectionState & ~8) : eachTypeRelatedToType(source2, target2, reportErrors && !(source2.flags & 131068), intersectionState & ~8);
            }
            if (target2.flags & 1048576) {
              return typeRelatedToSomeType(getRegularTypeOfObjectLiteral(source2), target2, reportErrors && !(source2.flags & 131068) && !(target2.flags & 131068));
            }
            if (target2.flags & 2097152) {
              return typeRelatedToEachType(getRegularTypeOfObjectLiteral(source2), target2, reportErrors, 2);
            }
            if (relation === comparableRelation && target2.flags & 131068) {
              var constraints = ts2.sameMap(source2.types, getBaseConstraintOrType);
              if (constraints !== source2.types) {
                source2 = getIntersectionType(constraints);
                if (!(source2.flags & 2097152)) {
                  return isRelatedTo(source2, target2, 1, false);
                }
              }
            }
            return someTypeRelatedToType(source2, target2, false, 1);
          }
          var flags = source2.flags & target2.flags;
          if (relation === identityRelation && !(flags & 524288)) {
            if (flags & 4194304) {
              return isRelatedTo(source2.type, target2.type, 3, false);
            }
            var result_8 = 0;
            if (flags & 8388608) {
              if (result_8 = isRelatedTo(source2.objectType, target2.objectType, 3, false)) {
                if (result_8 &= isRelatedTo(source2.indexType, target2.indexType, 3, false)) {
                  return result_8;
                }
              }
            }
            if (flags & 16777216) {
              if (source2.root.isDistributive === target2.root.isDistributive) {
                if (result_8 = isRelatedTo(source2.checkType, target2.checkType, 3, false)) {
                  if (result_8 &= isRelatedTo(source2.extendsType, target2.extendsType, 3, false)) {
                    if (result_8 &= isRelatedTo(getTrueTypeFromConditionalType(source2), getTrueTypeFromConditionalType(target2), 3, false)) {
                      if (result_8 &= isRelatedTo(getFalseTypeFromConditionalType(source2), getFalseTypeFromConditionalType(target2), 3, false)) {
                        return result_8;
                      }
                    }
                  }
                }
              }
            }
            if (flags & 33554432) {
              return isRelatedTo(source2.substitute, target2.substitute, 3, false);
            }
            return 0;
          }
          var result2;
          var originalErrorInfo;
          var varianceCheckFailed = false;
          var saveErrorInfo = captureErrorCalculationState();
          if (source2.flags & (524288 | 16777216) && source2.aliasSymbol && source2.aliasTypeArguments && source2.aliasSymbol === target2.aliasSymbol && !(source2.aliasTypeArgumentsContainsMarker || target2.aliasTypeArgumentsContainsMarker)) {
            var variances = getAliasVariances(source2.aliasSymbol);
            if (variances === ts2.emptyArray) {
              return 1;
            }
            var varianceResult = relateVariances(source2.aliasTypeArguments, target2.aliasTypeArguments, variances, intersectionState);
            if (varianceResult !== void 0) {
              return varianceResult;
            }
          }
          if (isSingleElementGenericTupleType(source2) && !source2.target.readonly && (result2 = isRelatedTo(getTypeArguments(source2)[0], target2, 1)) || isSingleElementGenericTupleType(target2) && (target2.target.readonly || isMutableArrayOrTuple(getBaseConstraintOfType(source2) || source2)) && (result2 = isRelatedTo(source2, getTypeArguments(target2)[0], 2))) {
            return result2;
          }
          if (target2.flags & 262144) {
            if (ts2.getObjectFlags(source2) & 32 && !source2.declaration.nameType && isRelatedTo(getIndexType(target2), getConstraintTypeFromMappedType(source2), 3)) {
              if (!(getMappedTypeModifiers(source2) & 4)) {
                var templateType = getTemplateTypeFromMappedType(source2);
                var indexedAccessType = getIndexedAccessType(target2, getTypeParameterFromMappedType(source2));
                if (result2 = isRelatedTo(templateType, indexedAccessType, 3, reportErrors)) {
                  return result2;
                }
              }
            }
          } else if (target2.flags & 4194304) {
            var targetType_1 = target2.type;
            if (source2.flags & 4194304) {
              if (result2 = isRelatedTo(targetType_1, source2.type, 3, false)) {
                return result2;
              }
            }
            if (isTupleType(targetType_1)) {
              if (result2 = isRelatedTo(source2, getKnownKeysOfTupleType(targetType_1), 2, reportErrors)) {
                return result2;
              }
            } else {
              var constraint = getSimplifiedTypeOrConstraint(targetType_1);
              if (constraint) {
                if (isRelatedTo(source2, getIndexType(constraint, target2.stringsOnly), 2, reportErrors) === -1) {
                  return -1;
                }
              } else if (isGenericMappedType(targetType_1)) {
                var nameType_1 = getNameTypeFromMappedType(targetType_1);
                var constraintType = getConstraintTypeFromMappedType(targetType_1);
                var targetKeys = void 0;
                if (nameType_1 && isMappedTypeWithKeyofConstraintDeclaration(targetType_1)) {
                  var modifiersType = getApparentType(getModifiersTypeFromMappedType(targetType_1));
                  var mappedKeys_1 = [];
                  forEachMappedTypePropertyKeyTypeAndIndexSignatureKeyType(modifiersType, 8576, false, function(t) {
                    return void mappedKeys_1.push(instantiateType(nameType_1, appendTypeMapping(targetType_1.mapper, getTypeParameterFromMappedType(targetType_1), t)));
                  });
                  targetKeys = getUnionType(__spreadArray(__spreadArray([], mappedKeys_1, true), [nameType_1], false));
                } else {
                  targetKeys = nameType_1 || constraintType;
                }
                if (isRelatedTo(source2, targetKeys, 2, reportErrors) === -1) {
                  return -1;
                }
              }
            }
          } else if (target2.flags & 8388608) {
            if (source2.flags & 8388608) {
              if (result2 = isRelatedTo(source2.objectType, target2.objectType, 3, reportErrors)) {
                result2 &= isRelatedTo(source2.indexType, target2.indexType, 3, reportErrors);
              }
              if (result2) {
                resetErrorInfo(saveErrorInfo);
                return result2;
              }
              if (reportErrors) {
                originalErrorInfo = errorInfo;
              }
            }
            if (relation === assignableRelation || relation === comparableRelation) {
              var objectType = target2.objectType;
              var indexType = target2.indexType;
              var baseObjectType = getBaseConstraintOfType(objectType) || objectType;
              var baseIndexType = getBaseConstraintOfType(indexType) || indexType;
              if (!isGenericObjectType(baseObjectType) && !isGenericIndexType(baseIndexType)) {
                var accessFlags = 4 | (baseObjectType !== objectType ? 2 : 0);
                var constraint = getIndexedAccessTypeOrUndefined(baseObjectType, baseIndexType, accessFlags);
                if (constraint) {
                  if (reportErrors && originalErrorInfo) {
                    resetErrorInfo(saveErrorInfo);
                  }
                  if (result2 = isRelatedTo(source2, constraint, 2, reportErrors)) {
                    return result2;
                  }
                  if (reportErrors && originalErrorInfo && errorInfo) {
                    errorInfo = countMessageChainBreadth([originalErrorInfo]) <= countMessageChainBreadth([errorInfo]) ? originalErrorInfo : errorInfo;
                  }
                }
              }
            }
            if (reportErrors) {
              originalErrorInfo = void 0;
            }
          } else if (isGenericMappedType(target2) && relation !== identityRelation) {
            var keysRemapped = !!target2.declaration.nameType;
            var templateType = getTemplateTypeFromMappedType(target2);
            var modifiers = getMappedTypeModifiers(target2);
            if (!(modifiers & 8)) {
              if (!keysRemapped && templateType.flags & 8388608 && templateType.objectType === source2 && templateType.indexType === getTypeParameterFromMappedType(target2)) {
                return -1;
              }
              if (!isGenericMappedType(source2)) {
                var targetKeys = keysRemapped ? getNameTypeFromMappedType(target2) : getConstraintTypeFromMappedType(target2);
                var sourceKeys = getIndexType(source2, void 0, true);
                var includeOptional = modifiers & 4;
                var filteredByApplicability = includeOptional ? intersectTypes(targetKeys, sourceKeys) : void 0;
                if (includeOptional ? !(filteredByApplicability.flags & 131072) : isRelatedTo(targetKeys, sourceKeys, 3)) {
                  var templateType_1 = getTemplateTypeFromMappedType(target2);
                  var typeParameter = getTypeParameterFromMappedType(target2);
                  var nonNullComponent = extractTypesOfKind(templateType_1, ~98304);
                  if (!keysRemapped && nonNullComponent.flags & 8388608 && nonNullComponent.indexType === typeParameter) {
                    if (result2 = isRelatedTo(source2, nonNullComponent.objectType, 2, reportErrors)) {
                      return result2;
                    }
                  } else {
                    var indexingType = keysRemapped ? filteredByApplicability || targetKeys : filteredByApplicability ? getIntersectionType([filteredByApplicability, typeParameter]) : typeParameter;
                    var indexedAccessType = getIndexedAccessType(source2, indexingType);
                    if (result2 = isRelatedTo(indexedAccessType, templateType_1, 3, reportErrors)) {
                      return result2;
                    }
                  }
                }
                originalErrorInfo = errorInfo;
                resetErrorInfo(saveErrorInfo);
              }
            }
          } else if (target2.flags & 16777216) {
            if (isDeeplyNestedType(target2, targetStack, targetDepth, 10)) {
              resetErrorInfo(saveErrorInfo);
              return 3;
            }
            var c = target2;
            if (!c.root.inferTypeParameters && !isDistributionDependent(c.root)) {
              var skipTrue = !isTypeAssignableTo(getPermissiveInstantiation(c.checkType), getPermissiveInstantiation(c.extendsType));
              var skipFalse = !skipTrue && isTypeAssignableTo(getRestrictiveInstantiation(c.checkType), getRestrictiveInstantiation(c.extendsType));
              if (result2 = skipTrue ? -1 : isRelatedTo(source2, getTrueTypeFromConditionalType(c), 2, false)) {
                result2 &= skipFalse ? -1 : isRelatedTo(source2, getFalseTypeFromConditionalType(c), 2, false);
                if (result2) {
                  resetErrorInfo(saveErrorInfo);
                  return result2;
                }
              }
            }
          } else if (target2.flags & 134217728) {
            if (source2.flags & 134217728) {
              if (relation === comparableRelation) {
                return templateLiteralTypesDefinitelyUnrelated(source2, target2) ? 0 : -1;
              }
              instantiateType(source2, makeFunctionTypeMapper(reportUnreliableMarkers));
            }
            if (isTypeMatchedByTemplateLiteralType(source2, target2)) {
              return -1;
            }
          }
          if (source2.flags & 8650752) {
            if (!(source2.flags & 8388608 && target2.flags & 8388608)) {
              var constraint = getConstraintOfType(source2);
              if (!constraint || source2.flags & 262144 && constraint.flags & 1) {
                if (result2 = isRelatedTo(emptyObjectType, extractTypesOfKind(target2, ~67108864), 3)) {
                  resetErrorInfo(saveErrorInfo);
                  return result2;
                }
              } else if (result2 = isRelatedTo(constraint, target2, 1, false, void 0, intersectionState)) {
                resetErrorInfo(saveErrorInfo);
                return result2;
              } else if (result2 = isRelatedTo(getTypeWithThisArgument(constraint, source2), target2, 1, reportErrors && !(target2.flags & source2.flags & 262144), void 0, intersectionState)) {
                resetErrorInfo(saveErrorInfo);
                return result2;
              }
            }
          } else if (source2.flags & 4194304) {
            if (result2 = isRelatedTo(keyofConstraintType, target2, 1, reportErrors)) {
              resetErrorInfo(saveErrorInfo);
              return result2;
            }
          } else if (source2.flags & 134217728 && !(target2.flags & 524288)) {
            if (!(target2.flags & 134217728)) {
              var constraint = getBaseConstraintOfType(source2);
              if (constraint && constraint !== source2 && (result2 = isRelatedTo(constraint, target2, 1, reportErrors))) {
                resetErrorInfo(saveErrorInfo);
                return result2;
              }
            }
          } else if (source2.flags & 268435456) {
            if (target2.flags & 268435456 && source2.symbol === target2.symbol) {
              if (result2 = isRelatedTo(source2.type, target2.type, 3, reportErrors)) {
                resetErrorInfo(saveErrorInfo);
                return result2;
              }
            } else {
              var constraint = getBaseConstraintOfType(source2);
              if (constraint && (result2 = isRelatedTo(constraint, target2, 1, reportErrors))) {
                resetErrorInfo(saveErrorInfo);
                return result2;
              }
            }
          } else if (source2.flags & 16777216) {
            if (isDeeplyNestedType(source2, sourceStack, sourceDepth, 10)) {
              resetErrorInfo(saveErrorInfo);
              return 3;
            }
            if (target2.flags & 16777216) {
              var sourceParams = source2.root.inferTypeParameters;
              var sourceExtends = source2.extendsType;
              var mapper = void 0;
              if (sourceParams) {
                var ctx = createInferenceContext(sourceParams, void 0, 0, isRelatedToWorker);
                inferTypes(ctx.inferences, target2.extendsType, sourceExtends, 512 | 1024);
                sourceExtends = instantiateType(sourceExtends, ctx.mapper);
                mapper = ctx.mapper;
              }
              if (isTypeIdenticalTo(sourceExtends, target2.extendsType) && (isRelatedTo(source2.checkType, target2.checkType, 3) || isRelatedTo(target2.checkType, source2.checkType, 3))) {
                if (result2 = isRelatedTo(instantiateType(getTrueTypeFromConditionalType(source2), mapper), getTrueTypeFromConditionalType(target2), 3, reportErrors)) {
                  result2 &= isRelatedTo(getFalseTypeFromConditionalType(source2), getFalseTypeFromConditionalType(target2), 3, reportErrors);
                }
                if (result2) {
                  resetErrorInfo(saveErrorInfo);
                  return result2;
                }
              }
            } else {
              var distributiveConstraint = getConstraintOfDistributiveConditionalType(source2);
              if (distributiveConstraint) {
                if (result2 = isRelatedTo(distributiveConstraint, target2, 1, reportErrors)) {
                  resetErrorInfo(saveErrorInfo);
                  return result2;
                }
              }
            }
            var defaultConstraint = getDefaultConstraintOfConditionalType(source2);
            if (defaultConstraint) {
              if (result2 = isRelatedTo(defaultConstraint, target2, 1, reportErrors)) {
                resetErrorInfo(saveErrorInfo);
                return result2;
              }
            }
          } else {
            if (relation !== subtypeRelation && relation !== strictSubtypeRelation && isPartialMappedType(target2) && isEmptyObjectType(source2)) {
              return -1;
            }
            if (isGenericMappedType(target2)) {
              if (isGenericMappedType(source2)) {
                if (result2 = mappedTypeRelatedTo(source2, target2, reportErrors)) {
                  resetErrorInfo(saveErrorInfo);
                  return result2;
                }
              }
              return 0;
            }
            var sourceIsPrimitive = !!(source2.flags & 131068);
            if (relation !== identityRelation) {
              source2 = getApparentType(source2);
            } else if (isGenericMappedType(source2)) {
              return 0;
            }
            if (ts2.getObjectFlags(source2) & 4 && ts2.getObjectFlags(target2) & 4 && source2.target === target2.target && !isTupleType(source2) && !(ts2.getObjectFlags(source2) & 4096 || ts2.getObjectFlags(target2) & 4096)) {
              var variances = getVariances(source2.target);
              if (variances === ts2.emptyArray) {
                return 1;
              }
              var varianceResult = relateVariances(getTypeArguments(source2), getTypeArguments(target2), variances, intersectionState);
              if (varianceResult !== void 0) {
                return varianceResult;
              }
            } else if (isReadonlyArrayType(target2) ? isArrayType(source2) || isTupleType(source2) : isArrayType(target2) && isTupleType(source2) && !source2.target.readonly) {
              if (relation !== identityRelation) {
                return isRelatedTo(getIndexTypeOfType(source2, numberType) || anyType, getIndexTypeOfType(target2, numberType) || anyType, 3, reportErrors);
              } else {
                return 0;
              }
            } else if ((relation === subtypeRelation || relation === strictSubtypeRelation) && isEmptyObjectType(target2) && ts2.getObjectFlags(target2) & 16384 && !isEmptyObjectType(source2)) {
              return 0;
            }
            if (source2.flags & (524288 | 2097152) && target2.flags & 524288) {
              var reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo.errorInfo && !sourceIsPrimitive;
              result2 = propertiesRelatedTo(source2, target2, reportStructuralErrors, void 0, intersectionState);
              if (result2) {
                result2 &= signaturesRelatedTo(source2, target2, 0, reportStructuralErrors);
                if (result2) {
                  result2 &= signaturesRelatedTo(source2, target2, 1, reportStructuralErrors);
                  if (result2) {
                    result2 &= indexSignaturesRelatedTo(source2, target2, sourceIsPrimitive, reportStructuralErrors, intersectionState);
                  }
                }
              }
              if (varianceCheckFailed && result2) {
                errorInfo = originalErrorInfo || errorInfo || saveErrorInfo.errorInfo;
              } else if (result2) {
                return result2;
              }
            }
            if (source2.flags & (524288 | 2097152) && target2.flags & 1048576) {
              var objectOnlyTarget = extractTypesOfKind(target2, 524288 | 2097152 | 33554432);
              if (objectOnlyTarget.flags & 1048576) {
                var result_9 = typeRelatedToDiscriminatedType(source2, objectOnlyTarget);
                if (result_9) {
                  return result_9;
                }
              }
            }
          }
          return 0;
          function countMessageChainBreadth(info) {
            if (!info)
              return 0;
            return ts2.reduceLeft(info, function(value, chain2) {
              return value + 1 + countMessageChainBreadth(chain2.next);
            }, 0);
          }
          function relateVariances(sourceTypeArguments, targetTypeArguments, variances2, intersectionState2) {
            if (result2 = typeArgumentsRelatedTo(sourceTypeArguments, targetTypeArguments, variances2, reportErrors, intersectionState2)) {
              return result2;
            }
            if (ts2.some(variances2, function(v) {
              return !!(v & 24);
            })) {
              originalErrorInfo = void 0;
              resetErrorInfo(saveErrorInfo);
              return void 0;
            }
            var allowStructuralFallback = targetTypeArguments && hasCovariantVoidArgument(targetTypeArguments, variances2);
            varianceCheckFailed = !allowStructuralFallback;
            if (variances2 !== ts2.emptyArray && !allowStructuralFallback) {
              if (varianceCheckFailed && !(reportErrors && ts2.some(variances2, function(v) {
                return (v & 7) === 0;
              }))) {
                return 0;
              }
              originalErrorInfo = errorInfo;
              resetErrorInfo(saveErrorInfo);
            }
          }
        }
        function reportUnmeasurableMarkers(p) {
          if (outofbandVarianceMarkerHandler && (p === markerSuperType || p === markerSubType || p === markerOtherType)) {
            outofbandVarianceMarkerHandler(false);
          }
          return p;
        }
        function reportUnreliableMarkers(p) {
          if (outofbandVarianceMarkerHandler && (p === markerSuperType || p === markerSubType || p === markerOtherType)) {
            outofbandVarianceMarkerHandler(true);
          }
          return p;
        }
        function mappedTypeRelatedTo(source2, target2, reportErrors) {
          var modifiersRelated = relation === comparableRelation || (relation === identityRelation ? getMappedTypeModifiers(source2) === getMappedTypeModifiers(target2) : getCombinedMappedTypeOptionality(source2) <= getCombinedMappedTypeOptionality(target2));
          if (modifiersRelated) {
            var result_10;
            var targetConstraint = getConstraintTypeFromMappedType(target2);
            var sourceConstraint = instantiateType(getConstraintTypeFromMappedType(source2), makeFunctionTypeMapper(getCombinedMappedTypeOptionality(source2) < 0 ? reportUnmeasurableMarkers : reportUnreliableMarkers));
            if (result_10 = isRelatedTo(targetConstraint, sourceConstraint, 3, reportErrors)) {
              var mapper = createTypeMapper([getTypeParameterFromMappedType(source2)], [getTypeParameterFromMappedType(target2)]);
              if (instantiateType(getNameTypeFromMappedType(source2), mapper) === instantiateType(getNameTypeFromMappedType(target2), mapper)) {
                return result_10 & isRelatedTo(instantiateType(getTemplateTypeFromMappedType(source2), mapper), getTemplateTypeFromMappedType(target2), 3, reportErrors);
              }
            }
          }
          return 0;
        }
        function typeRelatedToDiscriminatedType(source2, target2) {
          var sourceProperties = getPropertiesOfType(source2);
          var sourcePropertiesFiltered = findDiscriminantProperties(sourceProperties, target2);
          if (!sourcePropertiesFiltered)
            return 0;
          var numCombinations = 1;
          for (var _i = 0, sourcePropertiesFiltered_1 = sourcePropertiesFiltered; _i < sourcePropertiesFiltered_1.length; _i++) {
            var sourceProperty = sourcePropertiesFiltered_1[_i];
            numCombinations *= countTypes(getNonMissingTypeOfSymbol(sourceProperty));
            if (numCombinations > 25) {
              ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("checkTypes", "typeRelatedToDiscriminatedType_DepthLimit", { sourceId: source2.id, targetId: target2.id, numCombinations });
              return 0;
            }
          }
          var sourceDiscriminantTypes = new Array(sourcePropertiesFiltered.length);
          var excludedProperties = new ts2.Set();
          for (var i = 0; i < sourcePropertiesFiltered.length; i++) {
            var sourceProperty = sourcePropertiesFiltered[i];
            var sourcePropertyType = getNonMissingTypeOfSymbol(sourceProperty);
            sourceDiscriminantTypes[i] = sourcePropertyType.flags & 1048576 ? sourcePropertyType.types : [sourcePropertyType];
            excludedProperties.add(sourceProperty.escapedName);
          }
          var discriminantCombinations = ts2.cartesianProduct(sourceDiscriminantTypes);
          var matchingTypes = [];
          var _loop_19 = function(combination2) {
            var hasMatch = false;
            outer:
              for (var _c = 0, _d = target2.types; _c < _d.length; _c++) {
                var type2 = _d[_c];
                var _loop_20 = function(i3) {
                  var sourceProperty2 = sourcePropertiesFiltered[i3];
                  var targetProperty = getPropertyOfType(type2, sourceProperty2.escapedName);
                  if (!targetProperty)
                    return "continue-outer";
                  if (sourceProperty2 === targetProperty)
                    return "continue";
                  var related = propertyRelatedTo(source2, target2, sourceProperty2, targetProperty, function(_) {
                    return combination2[i3];
                  }, false, 0, strictNullChecks || relation === comparableRelation);
                  if (!related) {
                    return "continue-outer";
                  }
                };
                for (var i2 = 0; i2 < sourcePropertiesFiltered.length; i2++) {
                  var state_7 = _loop_20(i2);
                  switch (state_7) {
                    case "continue-outer":
                      continue outer;
                  }
                }
                ts2.pushIfUnique(matchingTypes, type2, ts2.equateValues);
                hasMatch = true;
              }
            if (!hasMatch) {
              return { value: 0 };
            }
          };
          for (var _a = 0, discriminantCombinations_1 = discriminantCombinations; _a < discriminantCombinations_1.length; _a++) {
            var combination = discriminantCombinations_1[_a];
            var state_6 = _loop_19(combination);
            if (typeof state_6 === "object")
              return state_6.value;
          }
          var result2 = -1;
          for (var _b = 0, matchingTypes_1 = matchingTypes; _b < matchingTypes_1.length; _b++) {
            var type = matchingTypes_1[_b];
            result2 &= propertiesRelatedTo(source2, type, false, excludedProperties, 0);
            if (result2) {
              result2 &= signaturesRelatedTo(source2, type, 0, false);
              if (result2) {
                result2 &= signaturesRelatedTo(source2, type, 1, false);
                if (result2 && !(isTupleType(source2) && isTupleType(type))) {
                  result2 &= indexSignaturesRelatedTo(source2, type, false, false, 0);
                }
              }
            }
            if (!result2) {
              return result2;
            }
          }
          return result2;
        }
        function excludeProperties(properties, excludedProperties) {
          if (!excludedProperties || properties.length === 0)
            return properties;
          var result2;
          for (var i = 0; i < properties.length; i++) {
            if (!excludedProperties.has(properties[i].escapedName)) {
              if (result2) {
                result2.push(properties[i]);
              }
            } else if (!result2) {
              result2 = properties.slice(0, i);
            }
          }
          return result2 || properties;
        }
        function isPropertySymbolTypeRelated(sourceProp, targetProp, getTypeOfSourceProperty, reportErrors, intersectionState) {
          var targetIsOptional = strictNullChecks && !!(ts2.getCheckFlags(targetProp) & 48);
          var effectiveTarget = addOptionality(getNonMissingTypeOfSymbol(targetProp), false, targetIsOptional);
          var effectiveSource = getTypeOfSourceProperty(sourceProp);
          return isRelatedTo(effectiveSource, effectiveTarget, 3, reportErrors, void 0, intersectionState);
        }
        function propertyRelatedTo(source2, target2, sourceProp, targetProp, getTypeOfSourceProperty, reportErrors, intersectionState, skipOptional) {
          var sourcePropFlags = ts2.getDeclarationModifierFlagsFromSymbol(sourceProp);
          var targetPropFlags = ts2.getDeclarationModifierFlagsFromSymbol(targetProp);
          if (sourcePropFlags & 8 || targetPropFlags & 8) {
            if (sourceProp.valueDeclaration !== targetProp.valueDeclaration) {
              if (reportErrors) {
                if (sourcePropFlags & 8 && targetPropFlags & 8) {
                  reportError(ts2.Diagnostics.Types_have_separate_declarations_of_a_private_property_0, symbolToString(targetProp));
                } else {
                  reportError(ts2.Diagnostics.Property_0_is_private_in_type_1_but_not_in_type_2, symbolToString(targetProp), typeToString(sourcePropFlags & 8 ? source2 : target2), typeToString(sourcePropFlags & 8 ? target2 : source2));
                }
              }
              return 0;
            }
          } else if (targetPropFlags & 16) {
            if (!isValidOverrideOf(sourceProp, targetProp)) {
              if (reportErrors) {
                reportError(ts2.Diagnostics.Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2, symbolToString(targetProp), typeToString(getDeclaringClass(sourceProp) || source2), typeToString(getDeclaringClass(targetProp) || target2));
              }
              return 0;
            }
          } else if (sourcePropFlags & 16) {
            if (reportErrors) {
              reportError(ts2.Diagnostics.Property_0_is_protected_in_type_1_but_public_in_type_2, symbolToString(targetProp), typeToString(source2), typeToString(target2));
            }
            return 0;
          }
          var related = isPropertySymbolTypeRelated(sourceProp, targetProp, getTypeOfSourceProperty, reportErrors, intersectionState);
          if (!related) {
            if (reportErrors) {
              reportIncompatibleError(ts2.Diagnostics.Types_of_property_0_are_incompatible, symbolToString(targetProp));
            }
            return 0;
          }
          if (!skipOptional && sourceProp.flags & 16777216 && !(targetProp.flags & 16777216)) {
            if (reportErrors) {
              reportError(ts2.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, symbolToString(targetProp), typeToString(source2), typeToString(target2));
            }
            return 0;
          }
          return related;
        }
        function reportUnmatchedProperty(source2, target2, unmatchedProperty, requireOptionalProperties) {
          var shouldSkipElaboration = false;
          if (unmatchedProperty.valueDeclaration && ts2.isNamedDeclaration(unmatchedProperty.valueDeclaration) && ts2.isPrivateIdentifier(unmatchedProperty.valueDeclaration.name) && source2.symbol && source2.symbol.flags & 32) {
            var privateIdentifierDescription = unmatchedProperty.valueDeclaration.name.escapedText;
            var symbolTableKey = ts2.getSymbolNameForPrivateIdentifier(source2.symbol, privateIdentifierDescription);
            if (symbolTableKey && getPropertyOfType(source2, symbolTableKey)) {
              var sourceName = ts2.factory.getDeclarationName(source2.symbol.valueDeclaration);
              var targetName = ts2.factory.getDeclarationName(target2.symbol.valueDeclaration);
              reportError(ts2.Diagnostics.Property_0_in_type_1_refers_to_a_different_member_that_cannot_be_accessed_from_within_type_2, diagnosticName(privateIdentifierDescription), diagnosticName(sourceName.escapedText === "" ? anon : sourceName), diagnosticName(targetName.escapedText === "" ? anon : targetName));
              return;
            }
          }
          var props = ts2.arrayFrom(getUnmatchedProperties(source2, target2, requireOptionalProperties, false));
          if (!headMessage || headMessage.code !== ts2.Diagnostics.Class_0_incorrectly_implements_interface_1.code && headMessage.code !== ts2.Diagnostics.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass.code) {
            shouldSkipElaboration = true;
          }
          if (props.length === 1) {
            var propName = symbolToString(unmatchedProperty);
            reportError.apply(void 0, __spreadArray([ts2.Diagnostics.Property_0_is_missing_in_type_1_but_required_in_type_2, propName], getTypeNamesForErrorDisplay(source2, target2), false));
            if (ts2.length(unmatchedProperty.declarations)) {
              associateRelatedInfo(ts2.createDiagnosticForNode(unmatchedProperty.declarations[0], ts2.Diagnostics._0_is_declared_here, propName));
            }
            if (shouldSkipElaboration && errorInfo) {
              overrideNextErrorInfo++;
            }
          } else if (tryElaborateArrayLikeErrors(source2, target2, false)) {
            if (props.length > 5) {
              reportError(ts2.Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more, typeToString(source2), typeToString(target2), ts2.map(props.slice(0, 4), function(p) {
                return symbolToString(p);
              }).join(", "), props.length - 4);
            } else {
              reportError(ts2.Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2, typeToString(source2), typeToString(target2), ts2.map(props, function(p) {
                return symbolToString(p);
              }).join(", "));
            }
            if (shouldSkipElaboration && errorInfo) {
              overrideNextErrorInfo++;
            }
          }
        }
        function propertiesRelatedTo(source2, target2, reportErrors, excludedProperties, intersectionState) {
          if (relation === identityRelation) {
            return propertiesIdenticalTo(source2, target2, excludedProperties);
          }
          var result2 = -1;
          if (isTupleType(target2)) {
            if (isArrayType(source2) || isTupleType(source2)) {
              if (!target2.target.readonly && (isReadonlyArrayType(source2) || isTupleType(source2) && source2.target.readonly)) {
                return 0;
              }
              var sourceArity = getTypeReferenceArity(source2);
              var targetArity = getTypeReferenceArity(target2);
              var sourceRestFlag = isTupleType(source2) ? source2.target.combinedFlags & 4 : 4;
              var targetRestFlag = target2.target.combinedFlags & 4;
              var sourceMinLength = isTupleType(source2) ? source2.target.minLength : 0;
              var targetMinLength = target2.target.minLength;
              if (!sourceRestFlag && sourceArity < targetMinLength) {
                if (reportErrors) {
                  reportError(ts2.Diagnostics.Source_has_0_element_s_but_target_requires_1, sourceArity, targetMinLength);
                }
                return 0;
              }
              if (!targetRestFlag && targetArity < sourceMinLength) {
                if (reportErrors) {
                  reportError(ts2.Diagnostics.Source_has_0_element_s_but_target_allows_only_1, sourceMinLength, targetArity);
                }
                return 0;
              }
              if (!targetRestFlag && (sourceRestFlag || targetArity < sourceArity)) {
                if (reportErrors) {
                  if (sourceMinLength < targetMinLength) {
                    reportError(ts2.Diagnostics.Target_requires_0_element_s_but_source_may_have_fewer, targetMinLength);
                  } else {
                    reportError(ts2.Diagnostics.Target_allows_only_0_element_s_but_source_may_have_more, targetArity);
                  }
                }
                return 0;
              }
              var sourceTypeArguments = getTypeArguments(source2);
              var targetTypeArguments = getTypeArguments(target2);
              var startCount = Math.min(isTupleType(source2) ? getStartElementCount(source2.target, 11) : 0, getStartElementCount(target2.target, 11));
              var endCount = Math.min(isTupleType(source2) ? getEndElementCount(source2.target, 11) : 0, targetRestFlag ? getEndElementCount(target2.target, 11) : 0);
              var canExcludeDiscriminants = !!excludedProperties;
              for (var i = 0; i < targetArity; i++) {
                var sourceIndex = i < targetArity - endCount ? i : i + sourceArity - targetArity;
                var sourceFlags = isTupleType(source2) && (i < startCount || i >= targetArity - endCount) ? source2.target.elementFlags[sourceIndex] : 4;
                var targetFlags = target2.target.elementFlags[i];
                if (targetFlags & 8 && !(sourceFlags & 8)) {
                  if (reportErrors) {
                    reportError(ts2.Diagnostics.Source_provides_no_match_for_variadic_element_at_position_0_in_target, i);
                  }
                  return 0;
                }
                if (sourceFlags & 8 && !(targetFlags & 12)) {
                  if (reportErrors) {
                    reportError(ts2.Diagnostics.Variadic_element_at_position_0_in_source_does_not_match_element_at_position_1_in_target, sourceIndex, i);
                  }
                  return 0;
                }
                if (targetFlags & 1 && !(sourceFlags & 1)) {
                  if (reportErrors) {
                    reportError(ts2.Diagnostics.Source_provides_no_match_for_required_element_at_position_0_in_target, i);
                  }
                  return 0;
                }
                if (canExcludeDiscriminants) {
                  if (sourceFlags & 12 || targetFlags & 12) {
                    canExcludeDiscriminants = false;
                  }
                  if (canExcludeDiscriminants && (excludedProperties === null || excludedProperties === void 0 ? void 0 : excludedProperties.has("" + i))) {
                    continue;
                  }
                }
                var sourceType = !isTupleType(source2) ? sourceTypeArguments[0] : i < startCount || i >= targetArity - endCount ? removeMissingType(sourceTypeArguments[sourceIndex], !!(sourceFlags & targetFlags & 2)) : getElementTypeOfSliceOfTupleType(source2, startCount, endCount) || neverType;
                var targetType = targetTypeArguments[i];
                var targetCheckType = sourceFlags & 8 && targetFlags & 4 ? createArrayType(targetType) : removeMissingType(targetType, !!(targetFlags & 2));
                var related = isRelatedTo(sourceType, targetCheckType, 3, reportErrors, void 0, intersectionState);
                if (!related) {
                  if (reportErrors && (targetArity > 1 || sourceArity > 1)) {
                    if (i < startCount || i >= targetArity - endCount || sourceArity - startCount - endCount === 1) {
                      reportIncompatibleError(ts2.Diagnostics.Type_at_position_0_in_source_is_not_compatible_with_type_at_position_1_in_target, sourceIndex, i);
                    } else {
                      reportIncompatibleError(ts2.Diagnostics.Type_at_positions_0_through_1_in_source_is_not_compatible_with_type_at_position_2_in_target, startCount, sourceArity - endCount - 1, i);
                    }
                  }
                  return 0;
                }
                result2 &= related;
              }
              return result2;
            }
            if (target2.target.combinedFlags & 12) {
              return 0;
            }
          }
          var requireOptionalProperties = (relation === subtypeRelation || relation === strictSubtypeRelation) && !isObjectLiteralType(source2) && !isEmptyArrayLiteralType(source2) && !isTupleType(source2);
          var unmatchedProperty = getUnmatchedProperty(source2, target2, requireOptionalProperties, false);
          if (unmatchedProperty) {
            if (reportErrors) {
              reportUnmatchedProperty(source2, target2, unmatchedProperty, requireOptionalProperties);
            }
            return 0;
          }
          if (isObjectLiteralType(target2)) {
            for (var _i = 0, _a = excludeProperties(getPropertiesOfType(source2), excludedProperties); _i < _a.length; _i++) {
              var sourceProp = _a[_i];
              if (!getPropertyOfObjectType(target2, sourceProp.escapedName)) {
                var sourceType = getTypeOfSymbol(sourceProp);
                if (!(sourceType.flags & 32768)) {
                  if (reportErrors) {
                    reportError(ts2.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(sourceProp), typeToString(target2));
                  }
                  return 0;
                }
              }
            }
          }
          var properties = getPropertiesOfType(target2);
          var numericNamesOnly = isTupleType(source2) && isTupleType(target2);
          for (var _b = 0, _c = excludeProperties(properties, excludedProperties); _b < _c.length; _b++) {
            var targetProp = _c[_b];
            var name = targetProp.escapedName;
            if (!(targetProp.flags & 4194304) && (!numericNamesOnly || isNumericLiteralName(name) || name === "length")) {
              var sourceProp = getPropertyOfType(source2, name);
              if (sourceProp && sourceProp !== targetProp) {
                var related = propertyRelatedTo(source2, target2, sourceProp, targetProp, getNonMissingTypeOfSymbol, reportErrors, intersectionState, relation === comparableRelation);
                if (!related) {
                  return 0;
                }
                result2 &= related;
              }
            }
          }
          return result2;
        }
        function propertiesIdenticalTo(source2, target2, excludedProperties) {
          if (!(source2.flags & 524288 && target2.flags & 524288)) {
            return 0;
          }
          var sourceProperties = excludeProperties(getPropertiesOfObjectType(source2), excludedProperties);
          var targetProperties = excludeProperties(getPropertiesOfObjectType(target2), excludedProperties);
          if (sourceProperties.length !== targetProperties.length) {
            return 0;
          }
          var result2 = -1;
          for (var _i = 0, sourceProperties_1 = sourceProperties; _i < sourceProperties_1.length; _i++) {
            var sourceProp = sourceProperties_1[_i];
            var targetProp = getPropertyOfObjectType(target2, sourceProp.escapedName);
            if (!targetProp) {
              return 0;
            }
            var related = compareProperties(sourceProp, targetProp, isRelatedTo);
            if (!related) {
              return 0;
            }
            result2 &= related;
          }
          return result2;
        }
        function signaturesRelatedTo(source2, target2, kind, reportErrors) {
          var _a, _b;
          if (relation === identityRelation) {
            return signaturesIdenticalTo(source2, target2, kind);
          }
          if (target2 === anyFunctionType || source2 === anyFunctionType) {
            return -1;
          }
          var sourceIsJSConstructor = source2.symbol && isJSConstructor(source2.symbol.valueDeclaration);
          var targetIsJSConstructor = target2.symbol && isJSConstructor(target2.symbol.valueDeclaration);
          var sourceSignatures = getSignaturesOfType(source2, sourceIsJSConstructor && kind === 1 ? 0 : kind);
          var targetSignatures = getSignaturesOfType(target2, targetIsJSConstructor && kind === 1 ? 0 : kind);
          if (kind === 1 && sourceSignatures.length && targetSignatures.length) {
            var sourceIsAbstract = !!(sourceSignatures[0].flags & 4);
            var targetIsAbstract = !!(targetSignatures[0].flags & 4);
            if (sourceIsAbstract && !targetIsAbstract) {
              if (reportErrors) {
                reportError(ts2.Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type);
              }
              return 0;
            }
            if (!constructorVisibilitiesAreCompatible(sourceSignatures[0], targetSignatures[0], reportErrors)) {
              return 0;
            }
          }
          var result2 = -1;
          var saveErrorInfo = captureErrorCalculationState();
          var incompatibleReporter = kind === 1 ? reportIncompatibleConstructSignatureReturn : reportIncompatibleCallSignatureReturn;
          var sourceObjectFlags = ts2.getObjectFlags(source2);
          var targetObjectFlags = ts2.getObjectFlags(target2);
          if (sourceObjectFlags & 64 && targetObjectFlags & 64 && source2.symbol === target2.symbol) {
            for (var i = 0; i < targetSignatures.length; i++) {
              var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], true, reportErrors, incompatibleReporter(sourceSignatures[i], targetSignatures[i]));
              if (!related) {
                return 0;
              }
              result2 &= related;
            }
          } else if (sourceSignatures.length === 1 && targetSignatures.length === 1) {
            var eraseGenerics = relation === comparableRelation || !!compilerOptions.noStrictGenericChecks;
            var sourceSignature = ts2.first(sourceSignatures);
            var targetSignature = ts2.first(targetSignatures);
            result2 = signatureRelatedTo(sourceSignature, targetSignature, eraseGenerics, reportErrors, incompatibleReporter(sourceSignature, targetSignature));
            if (!result2 && reportErrors && kind === 1 && sourceObjectFlags & targetObjectFlags && (((_a = targetSignature.declaration) === null || _a === void 0 ? void 0 : _a.kind) === 170 || ((_b = sourceSignature.declaration) === null || _b === void 0 ? void 0 : _b.kind) === 170)) {
              var constructSignatureToString = function(signature) {
                return signatureToString(signature, void 0, 262144, kind);
              };
              reportError(ts2.Diagnostics.Type_0_is_not_assignable_to_type_1, constructSignatureToString(sourceSignature), constructSignatureToString(targetSignature));
              reportError(ts2.Diagnostics.Types_of_construct_signatures_are_incompatible);
              return result2;
            }
          } else {
            outer:
              for (var _i = 0, targetSignatures_1 = targetSignatures; _i < targetSignatures_1.length; _i++) {
                var t = targetSignatures_1[_i];
                var shouldElaborateErrors = reportErrors;
                for (var _c = 0, sourceSignatures_1 = sourceSignatures; _c < sourceSignatures_1.length; _c++) {
                  var s = sourceSignatures_1[_c];
                  var related = signatureRelatedTo(s, t, true, shouldElaborateErrors, incompatibleReporter(s, t));
                  if (related) {
                    result2 &= related;
                    resetErrorInfo(saveErrorInfo);
                    continue outer;
                  }
                  shouldElaborateErrors = false;
                }
                if (shouldElaborateErrors) {
                  reportError(ts2.Diagnostics.Type_0_provides_no_match_for_the_signature_1, typeToString(source2), signatureToString(t, void 0, void 0, kind));
                }
                return 0;
              }
          }
          return result2;
        }
        function reportIncompatibleCallSignatureReturn(siga, sigb) {
          if (siga.parameters.length === 0 && sigb.parameters.length === 0) {
            return function(source2, target2) {
              return reportIncompatibleError(ts2.Diagnostics.Call_signatures_with_no_arguments_have_incompatible_return_types_0_and_1, typeToString(source2), typeToString(target2));
            };
          }
          return function(source2, target2) {
            return reportIncompatibleError(ts2.Diagnostics.Call_signature_return_types_0_and_1_are_incompatible, typeToString(source2), typeToString(target2));
          };
        }
        function reportIncompatibleConstructSignatureReturn(siga, sigb) {
          if (siga.parameters.length === 0 && sigb.parameters.length === 0) {
            return function(source2, target2) {
              return reportIncompatibleError(ts2.Diagnostics.Construct_signatures_with_no_arguments_have_incompatible_return_types_0_and_1, typeToString(source2), typeToString(target2));
            };
          }
          return function(source2, target2) {
            return reportIncompatibleError(ts2.Diagnostics.Construct_signature_return_types_0_and_1_are_incompatible, typeToString(source2), typeToString(target2));
          };
        }
        function signatureRelatedTo(source2, target2, erase, reportErrors, incompatibleReporter) {
          return compareSignaturesRelated(erase ? getErasedSignature(source2) : source2, erase ? getErasedSignature(target2) : target2, relation === strictSubtypeRelation ? 8 : 0, reportErrors, reportError, incompatibleReporter, isRelatedToWorker, makeFunctionTypeMapper(reportUnreliableMarkers));
        }
        function signaturesIdenticalTo(source2, target2, kind) {
          var sourceSignatures = getSignaturesOfType(source2, kind);
          var targetSignatures = getSignaturesOfType(target2, kind);
          if (sourceSignatures.length !== targetSignatures.length) {
            return 0;
          }
          var result2 = -1;
          for (var i = 0; i < sourceSignatures.length; i++) {
            var related = compareSignaturesIdentical(sourceSignatures[i], targetSignatures[i], false, false, false, isRelatedTo);
            if (!related) {
              return 0;
            }
            result2 &= related;
          }
          return result2;
        }
        function membersRelatedToIndexInfo(source2, targetInfo, reportErrors) {
          var result2 = -1;
          var keyType = targetInfo.keyType;
          var props = source2.flags & 2097152 ? getPropertiesOfUnionOrIntersectionType(source2) : getPropertiesOfObjectType(source2);
          for (var _i = 0, props_2 = props; _i < props_2.length; _i++) {
            var prop = props_2[_i];
            if (isIgnoredJsxProperty(source2, prop)) {
              continue;
            }
            if (isApplicableIndexType(getLiteralTypeFromProperty(prop, 8576), keyType)) {
              var propType = getNonMissingTypeOfSymbol(prop);
              var type = exactOptionalPropertyTypes || propType.flags & 32768 || keyType === numberType || !(prop.flags & 16777216) ? propType : getTypeWithFacts(propType, 524288);
              var related = isRelatedTo(type, targetInfo.type, 3, reportErrors);
              if (!related) {
                if (reportErrors) {
                  reportError(ts2.Diagnostics.Property_0_is_incompatible_with_index_signature, symbolToString(prop));
                }
                return 0;
              }
              result2 &= related;
            }
          }
          for (var _a = 0, _b = getIndexInfosOfType(source2); _a < _b.length; _a++) {
            var info = _b[_a];
            if (isApplicableIndexType(info.keyType, keyType)) {
              var related = indexInfoRelatedTo(info, targetInfo, reportErrors);
              if (!related) {
                return 0;
              }
              result2 &= related;
            }
          }
          return result2;
        }
        function indexInfoRelatedTo(sourceInfo, targetInfo, reportErrors) {
          var related = isRelatedTo(sourceInfo.type, targetInfo.type, 3, reportErrors);
          if (!related && reportErrors) {
            if (sourceInfo.keyType === targetInfo.keyType) {
              reportError(ts2.Diagnostics._0_index_signatures_are_incompatible, typeToString(sourceInfo.keyType));
            } else {
              reportError(ts2.Diagnostics._0_and_1_index_signatures_are_incompatible, typeToString(sourceInfo.keyType), typeToString(targetInfo.keyType));
            }
          }
          return related;
        }
        function indexSignaturesRelatedTo(source2, target2, sourceIsPrimitive, reportErrors, intersectionState) {
          if (relation === identityRelation) {
            return indexSignaturesIdenticalTo(source2, target2);
          }
          var indexInfos = getIndexInfosOfType(target2);
          var targetHasStringIndex = ts2.some(indexInfos, function(info) {
            return info.keyType === stringType;
          });
          var result2 = -1;
          for (var _i = 0, indexInfos_3 = indexInfos; _i < indexInfos_3.length; _i++) {
            var targetInfo = indexInfos_3[_i];
            var related = !sourceIsPrimitive && targetHasStringIndex && targetInfo.type.flags & 1 ? -1 : isGenericMappedType(source2) && targetHasStringIndex ? isRelatedTo(getTemplateTypeFromMappedType(source2), targetInfo.type, 3, reportErrors) : typeRelatedToIndexInfo(source2, targetInfo, reportErrors, intersectionState);
            if (!related) {
              return 0;
            }
            result2 &= related;
          }
          return result2;
        }
        function typeRelatedToIndexInfo(source2, targetInfo, reportErrors, intersectionState) {
          var sourceInfo = getApplicableIndexInfo(source2, targetInfo.keyType);
          if (sourceInfo) {
            return indexInfoRelatedTo(sourceInfo, targetInfo, reportErrors);
          }
          if (!(intersectionState & 1) && isObjectTypeWithInferableIndex(source2)) {
            return membersRelatedToIndexInfo(source2, targetInfo, reportErrors);
          }
          if (reportErrors) {
            reportError(ts2.Diagnostics.Index_signature_for_type_0_is_missing_in_type_1, typeToString(targetInfo.keyType), typeToString(source2));
          }
          return 0;
        }
        function indexSignaturesIdenticalTo(source2, target2) {
          var sourceInfos = getIndexInfosOfType(source2);
          var targetInfos = getIndexInfosOfType(target2);
          if (sourceInfos.length !== targetInfos.length) {
            return 0;
          }
          for (var _i = 0, targetInfos_1 = targetInfos; _i < targetInfos_1.length; _i++) {
            var targetInfo = targetInfos_1[_i];
            var sourceInfo = getIndexInfoOfType(source2, targetInfo.keyType);
            if (!(sourceInfo && isRelatedTo(sourceInfo.type, targetInfo.type, 3) && sourceInfo.isReadonly === targetInfo.isReadonly)) {
              return 0;
            }
          }
          return -1;
        }
        function constructorVisibilitiesAreCompatible(sourceSignature, targetSignature, reportErrors) {
          if (!sourceSignature.declaration || !targetSignature.declaration) {
            return true;
          }
          var sourceAccessibility = ts2.getSelectedEffectiveModifierFlags(sourceSignature.declaration, 24);
          var targetAccessibility = ts2.getSelectedEffectiveModifierFlags(targetSignature.declaration, 24);
          if (targetAccessibility === 8) {
            return true;
          }
          if (targetAccessibility === 16 && sourceAccessibility !== 8) {
            return true;
          }
          if (targetAccessibility !== 16 && !sourceAccessibility) {
            return true;
          }
          if (reportErrors) {
            reportError(ts2.Diagnostics.Cannot_assign_a_0_constructor_type_to_a_1_constructor_type, visibilityToString(sourceAccessibility), visibilityToString(targetAccessibility));
          }
          return false;
        }
      }
      function typeCouldHaveTopLevelSingletonTypes(type) {
        if (type.flags & 16) {
          return false;
        }
        if (type.flags & 3145728) {
          return !!ts2.forEach(type.types, typeCouldHaveTopLevelSingletonTypes);
        }
        if (type.flags & 465829888) {
          var constraint = getConstraintOfType(type);
          if (constraint && constraint !== type) {
            return typeCouldHaveTopLevelSingletonTypes(constraint);
          }
        }
        return isUnitType(type) || !!(type.flags & 134217728);
      }
      function getExactOptionalUnassignableProperties(source, target) {
        if (isTupleType(source) && isTupleType(target))
          return ts2.emptyArray;
        return getPropertiesOfType(target).filter(function(targetProp) {
          return isExactOptionalPropertyMismatch(getTypeOfPropertyOfType(source, targetProp.escapedName), getTypeOfSymbol(targetProp));
        });
      }
      function isExactOptionalPropertyMismatch(source, target) {
        return !!source && !!target && maybeTypeOfKind(source, 32768) && !!containsMissingType(target);
      }
      function getExactOptionalProperties(type) {
        return getPropertiesOfType(type).filter(function(targetProp) {
          return containsMissingType(getTypeOfSymbol(targetProp));
        });
      }
      function getBestMatchingType(source, target, isRelatedTo) {
        if (isRelatedTo === void 0) {
          isRelatedTo = compareTypesAssignable;
        }
        return findMatchingDiscriminantType(source, target, isRelatedTo, true) || findMatchingTypeReferenceOrTypeAliasReference(source, target) || findBestTypeForObjectLiteral(source, target) || findBestTypeForInvokable(source, target) || findMostOverlappyType(source, target);
      }
      function discriminateTypeByDiscriminableItems(target, discriminators, related, defaultValue, skipPartial) {
        var discriminable = target.types.map(function(_) {
          return void 0;
        });
        for (var _i = 0, discriminators_1 = discriminators; _i < discriminators_1.length; _i++) {
          var _a = discriminators_1[_i], getDiscriminatingType = _a[0], propertyName = _a[1];
          var targetProp = getUnionOrIntersectionProperty(target, propertyName);
          if (skipPartial && targetProp && ts2.getCheckFlags(targetProp) & 16) {
            continue;
          }
          var i = 0;
          for (var _b = 0, _c = target.types; _b < _c.length; _b++) {
            var type = _c[_b];
            var targetType = getTypeOfPropertyOfType(type, propertyName);
            if (targetType && related(getDiscriminatingType(), targetType)) {
              discriminable[i] = discriminable[i] === void 0 ? true : discriminable[i];
            } else {
              discriminable[i] = false;
            }
            i++;
          }
        }
        var match = discriminable.indexOf(true);
        if (match === -1) {
          return defaultValue;
        }
        var nextMatch = discriminable.indexOf(true, match + 1);
        while (nextMatch !== -1) {
          if (!isTypeIdenticalTo(target.types[match], target.types[nextMatch])) {
            return defaultValue;
          }
          nextMatch = discriminable.indexOf(true, nextMatch + 1);
        }
        return target.types[match];
      }
      function isWeakType(type) {
        if (type.flags & 524288) {
          var resolved = resolveStructuredTypeMembers(type);
          return resolved.callSignatures.length === 0 && resolved.constructSignatures.length === 0 && resolved.indexInfos.length === 0 && resolved.properties.length > 0 && ts2.every(resolved.properties, function(p) {
            return !!(p.flags & 16777216);
          });
        }
        if (type.flags & 2097152) {
          return ts2.every(type.types, isWeakType);
        }
        return false;
      }
      function hasCommonProperties(source, target, isComparingJsxAttributes) {
        for (var _i = 0, _a = getPropertiesOfType(source); _i < _a.length; _i++) {
          var prop = _a[_i];
          if (isKnownProperty(target, prop.escapedName, isComparingJsxAttributes)) {
            return true;
          }
        }
        return false;
      }
      function getMarkerTypeReference(type, source, target) {
        var result = createTypeReference(type, ts2.map(type.typeParameters, function(t) {
          return t === source ? target : t;
        }));
        result.objectFlags |= 4096;
        return result;
      }
      function getAliasVariances(symbol) {
        var links = getSymbolLinks(symbol);
        return getVariancesWorker(links.typeParameters, links, function(_links, param, marker) {
          var type = getTypeAliasInstantiation(symbol, instantiateTypes(links.typeParameters, makeUnaryTypeMapper(param, marker)));
          type.aliasTypeArgumentsContainsMarker = true;
          return type;
        });
      }
      function getVariancesWorker(typeParameters, cache, createMarkerType) {
        var _a, _b, _c;
        if (typeParameters === void 0) {
          typeParameters = ts2.emptyArray;
        }
        var variances = cache.variances;
        if (!variances) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("checkTypes", "getVariancesWorker", { arity: typeParameters.length, id: (_c = (_a = cache.id) !== null && _a !== void 0 ? _a : (_b = cache.declaredType) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : -1 });
          cache.variances = ts2.emptyArray;
          variances = [];
          var _loop_21 = function(tp2) {
            var unmeasurable = false;
            var unreliable = false;
            var oldHandler = outofbandVarianceMarkerHandler;
            outofbandVarianceMarkerHandler = function(onlyUnreliable) {
              return onlyUnreliable ? unreliable = true : unmeasurable = true;
            };
            var typeWithSuper = createMarkerType(cache, tp2, markerSuperType);
            var typeWithSub = createMarkerType(cache, tp2, markerSubType);
            var variance = (isTypeAssignableTo(typeWithSub, typeWithSuper) ? 1 : 0) | (isTypeAssignableTo(typeWithSuper, typeWithSub) ? 2 : 0);
            if (variance === 3 && isTypeAssignableTo(createMarkerType(cache, tp2, markerOtherType), typeWithSuper)) {
              variance = 4;
            }
            outofbandVarianceMarkerHandler = oldHandler;
            if (unmeasurable || unreliable) {
              if (unmeasurable) {
                variance |= 8;
              }
              if (unreliable) {
                variance |= 16;
              }
            }
            variances.push(variance);
          };
          for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) {
            var tp = typeParameters_1[_i];
            _loop_21(tp);
          }
          cache.variances = variances;
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        }
        return variances;
      }
      function getVariances(type) {
        if (type === globalArrayType || type === globalReadonlyArrayType || type.objectFlags & 8) {
          return arrayVariances;
        }
        return getVariancesWorker(type.typeParameters, type, getMarkerTypeReference);
      }
      function hasCovariantVoidArgument(typeArguments, variances) {
        for (var i = 0; i < variances.length; i++) {
          if ((variances[i] & 7) === 1 && typeArguments[i].flags & 16384) {
            return true;
          }
        }
        return false;
      }
      function isUnconstrainedTypeParameter(type) {
        return type.flags & 262144 && !getConstraintOfTypeParameter(type);
      }
      function isNonDeferredTypeReference(type) {
        return !!(ts2.getObjectFlags(type) & 4) && !type.node;
      }
      function isTypeReferenceWithGenericArguments(type) {
        return isNonDeferredTypeReference(type) && ts2.some(getTypeArguments(type), function(t) {
          return !!(t.flags & 262144) || isTypeReferenceWithGenericArguments(t);
        });
      }
      function getGenericTypeReferenceRelationKey(source, target, postFix, ignoreConstraints) {
        var typeParameters = [];
        var constraintMarker = "";
        var sourceId = getTypeReferenceId(source, 0);
        var targetId = getTypeReferenceId(target, 0);
        return "".concat(constraintMarker).concat(sourceId, ",").concat(targetId).concat(postFix);
        function getTypeReferenceId(type, depth) {
          if (depth === void 0) {
            depth = 0;
          }
          var result = "" + type.target.id;
          for (var _i = 0, _a = getTypeArguments(type); _i < _a.length; _i++) {
            var t = _a[_i];
            if (t.flags & 262144) {
              if (ignoreConstraints || isUnconstrainedTypeParameter(t)) {
                var index = typeParameters.indexOf(t);
                if (index < 0) {
                  index = typeParameters.length;
                  typeParameters.push(t);
                }
                result += "=" + index;
                continue;
              }
              constraintMarker = "*";
            } else if (depth < 4 && isTypeReferenceWithGenericArguments(t)) {
              result += "<" + getTypeReferenceId(t, depth + 1) + ">";
              continue;
            }
            result += "-" + t.id;
          }
          return result;
        }
      }
      function getRelationKey(source, target, intersectionState, relation, ignoreConstraints) {
        if (relation === identityRelation && source.id > target.id) {
          var temp = source;
          source = target;
          target = temp;
        }
        var postFix = intersectionState ? ":" + intersectionState : "";
        return isTypeReferenceWithGenericArguments(source) && isTypeReferenceWithGenericArguments(target) ? getGenericTypeReferenceRelationKey(source, target, postFix, ignoreConstraints) : "".concat(source.id, ",").concat(target.id).concat(postFix);
      }
      function forEachProperty(prop, callback) {
        if (ts2.getCheckFlags(prop) & 6) {
          for (var _i = 0, _a = prop.containingType.types; _i < _a.length; _i++) {
            var t = _a[_i];
            var p = getPropertyOfType(t, prop.escapedName);
            var result = p && forEachProperty(p, callback);
            if (result) {
              return result;
            }
          }
          return void 0;
        }
        return callback(prop);
      }
      function getDeclaringClass(prop) {
        return prop.parent && prop.parent.flags & 32 ? getDeclaredTypeOfSymbol(getParentOfSymbol(prop)) : void 0;
      }
      function getTypeOfPropertyInBaseClass(property) {
        var classType = getDeclaringClass(property);
        var baseClassType = classType && getBaseTypes(classType)[0];
        return baseClassType && getTypeOfPropertyOfType(baseClassType, property.escapedName);
      }
      function isPropertyInClassDerivedFrom(prop, baseClass) {
        return forEachProperty(prop, function(sp) {
          var sourceClass = getDeclaringClass(sp);
          return sourceClass ? hasBaseType(sourceClass, baseClass) : false;
        });
      }
      function isValidOverrideOf(sourceProp, targetProp) {
        return !forEachProperty(targetProp, function(tp) {
          return ts2.getDeclarationModifierFlagsFromSymbol(tp) & 16 ? !isPropertyInClassDerivedFrom(sourceProp, getDeclaringClass(tp)) : false;
        });
      }
      function isClassDerivedFromDeclaringClasses(checkClass, prop, writing) {
        return forEachProperty(prop, function(p) {
          return ts2.getDeclarationModifierFlagsFromSymbol(p, writing) & 16 ? !hasBaseType(checkClass, getDeclaringClass(p)) : false;
        }) ? void 0 : checkClass;
      }
      function isDeeplyNestedType(type, stack, depth, maxDepth) {
        if (maxDepth === void 0) {
          maxDepth = 3;
        }
        if (depth >= maxDepth) {
          var identity_1 = getRecursionIdentity(type);
          var count = 0;
          var lastTypeId = 0;
          for (var i = 0; i < depth; i++) {
            var t = stack[i];
            if (getRecursionIdentity(t) === identity_1) {
              if (t.id >= lastTypeId) {
                count++;
                if (count >= maxDepth) {
                  return true;
                }
              }
              lastTypeId = t.id;
            }
          }
        }
        return false;
      }
      function getRecursionIdentity(type) {
        if (type.flags & 524288 && !isObjectOrArrayLiteralType(type)) {
          if (ts2.getObjectFlags(type) && 4 && type.node) {
            return type.node;
          }
          if (type.symbol && !(ts2.getObjectFlags(type) & 16 && type.symbol.flags & 32)) {
            return type.symbol;
          }
          if (isTupleType(type)) {
            return type.target;
          }
        }
        if (type.flags & 262144) {
          return type.symbol;
        }
        if (type.flags & 8388608) {
          do {
            type = type.objectType;
          } while (type.flags & 8388608);
          return type;
        }
        if (type.flags & 16777216) {
          return type.root;
        }
        return type;
      }
      function isPropertyIdenticalTo(sourceProp, targetProp) {
        return compareProperties(sourceProp, targetProp, compareTypesIdentical) !== 0;
      }
      function compareProperties(sourceProp, targetProp, compareTypes) {
        if (sourceProp === targetProp) {
          return -1;
        }
        var sourcePropAccessibility = ts2.getDeclarationModifierFlagsFromSymbol(sourceProp) & 24;
        var targetPropAccessibility = ts2.getDeclarationModifierFlagsFromSymbol(targetProp) & 24;
        if (sourcePropAccessibility !== targetPropAccessibility) {
          return 0;
        }
        if (sourcePropAccessibility) {
          if (getTargetSymbol(sourceProp) !== getTargetSymbol(targetProp)) {
            return 0;
          }
        } else {
          if ((sourceProp.flags & 16777216) !== (targetProp.flags & 16777216)) {
            return 0;
          }
        }
        if (isReadonlySymbol(sourceProp) !== isReadonlySymbol(targetProp)) {
          return 0;
        }
        return compareTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
      }
      function isMatchingSignature(source, target, partialMatch) {
        var sourceParameterCount = getParameterCount(source);
        var targetParameterCount = getParameterCount(target);
        var sourceMinArgumentCount = getMinArgumentCount(source);
        var targetMinArgumentCount = getMinArgumentCount(target);
        var sourceHasRestParameter = hasEffectiveRestParameter(source);
        var targetHasRestParameter = hasEffectiveRestParameter(target);
        if (sourceParameterCount === targetParameterCount && sourceMinArgumentCount === targetMinArgumentCount && sourceHasRestParameter === targetHasRestParameter) {
          return true;
        }
        if (partialMatch && sourceMinArgumentCount <= targetMinArgumentCount) {
          return true;
        }
        return false;
      }
      function compareSignaturesIdentical(source, target, partialMatch, ignoreThisTypes, ignoreReturnTypes, compareTypes) {
        if (source === target) {
          return -1;
        }
        if (!isMatchingSignature(source, target, partialMatch)) {
          return 0;
        }
        if (ts2.length(source.typeParameters) !== ts2.length(target.typeParameters)) {
          return 0;
        }
        if (target.typeParameters) {
          var mapper = createTypeMapper(source.typeParameters, target.typeParameters);
          for (var i = 0; i < target.typeParameters.length; i++) {
            var s = source.typeParameters[i];
            var t = target.typeParameters[i];
            if (!(s === t || compareTypes(instantiateType(getConstraintFromTypeParameter(s), mapper) || unknownType, getConstraintFromTypeParameter(t) || unknownType) && compareTypes(instantiateType(getDefaultFromTypeParameter(s), mapper) || unknownType, getDefaultFromTypeParameter(t) || unknownType))) {
              return 0;
            }
          }
          source = instantiateSignature(source, mapper, true);
        }
        var result = -1;
        if (!ignoreThisTypes) {
          var sourceThisType = getThisTypeOfSignature(source);
          if (sourceThisType) {
            var targetThisType = getThisTypeOfSignature(target);
            if (targetThisType) {
              var related = compareTypes(sourceThisType, targetThisType);
              if (!related) {
                return 0;
              }
              result &= related;
            }
          }
        }
        var targetLen = getParameterCount(target);
        for (var i = 0; i < targetLen; i++) {
          var s = getTypeAtPosition(source, i);
          var t = getTypeAtPosition(target, i);
          var related = compareTypes(t, s);
          if (!related) {
            return 0;
          }
          result &= related;
        }
        if (!ignoreReturnTypes) {
          var sourceTypePredicate = getTypePredicateOfSignature(source);
          var targetTypePredicate = getTypePredicateOfSignature(target);
          result &= sourceTypePredicate || targetTypePredicate ? compareTypePredicatesIdentical(sourceTypePredicate, targetTypePredicate, compareTypes) : compareTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
        }
        return result;
      }
      function compareTypePredicatesIdentical(source, target, compareTypes) {
        return !(source && target && typePredicateKindsMatch(source, target)) ? 0 : source.type === target.type ? -1 : source.type && target.type ? compareTypes(source.type, target.type) : 0;
      }
      function literalTypesWithSameBaseType(types) {
        var commonBaseType;
        for (var _i = 0, types_13 = types; _i < types_13.length; _i++) {
          var t = types_13[_i];
          var baseType = getBaseTypeOfLiteralType(t);
          if (!commonBaseType) {
            commonBaseType = baseType;
          }
          if (baseType === t || baseType !== commonBaseType) {
            return false;
          }
        }
        return true;
      }
      function getSupertypeOrUnion(types) {
        if (types.length === 1) {
          return types[0];
        }
        return literalTypesWithSameBaseType(types) ? getUnionType(types) : ts2.reduceLeft(types, function(s, t) {
          return isTypeSubtypeOf(s, t) ? t : s;
        });
      }
      function getCommonSupertype(types) {
        if (!strictNullChecks) {
          return getSupertypeOrUnion(types);
        }
        var primaryTypes = ts2.filter(types, function(t) {
          return !(t.flags & 98304);
        });
        return primaryTypes.length ? getNullableType(getSupertypeOrUnion(primaryTypes), getFalsyFlagsOfTypes(types) & 98304) : getUnionType(types, 2);
      }
      function getCommonSubtype(types) {
        return ts2.reduceLeft(types, function(s, t) {
          return isTypeSubtypeOf(t, s) ? t : s;
        });
      }
      function isArrayType(type) {
        return !!(ts2.getObjectFlags(type) & 4) && (type.target === globalArrayType || type.target === globalReadonlyArrayType);
      }
      function isReadonlyArrayType(type) {
        return !!(ts2.getObjectFlags(type) & 4) && type.target === globalReadonlyArrayType;
      }
      function isMutableArrayOrTuple(type) {
        return isArrayType(type) && !isReadonlyArrayType(type) || isTupleType(type) && !type.target.readonly;
      }
      function getElementTypeOfArrayType(type) {
        return isArrayType(type) ? getTypeArguments(type)[0] : void 0;
      }
      function isArrayLikeType(type) {
        return isArrayType(type) || !(type.flags & 98304) && isTypeAssignableTo(type, anyReadonlyArrayType);
      }
      function getSingleBaseForNonAugmentingSubtype(type) {
        if (!(ts2.getObjectFlags(type) & 4) || !(ts2.getObjectFlags(type.target) & 3)) {
          return void 0;
        }
        if (ts2.getObjectFlags(type) & 33554432) {
          return ts2.getObjectFlags(type) & 67108864 ? type.cachedEquivalentBaseType : void 0;
        }
        type.objectFlags |= 33554432;
        var target = type.target;
        if (ts2.getObjectFlags(target) & 1) {
          var baseTypeNode = getBaseTypeNodeOfClass(target);
          if (baseTypeNode && baseTypeNode.expression.kind !== 79 && baseTypeNode.expression.kind !== 205) {
            return void 0;
          }
        }
        var bases = getBaseTypes(target);
        if (bases.length !== 1) {
          return void 0;
        }
        if (getMembersOfSymbol(type.symbol).size) {
          return void 0;
        }
        var instantiatedBase = !ts2.length(target.typeParameters) ? bases[0] : instantiateType(bases[0], createTypeMapper(target.typeParameters, getTypeArguments(type).slice(0, target.typeParameters.length)));
        if (ts2.length(getTypeArguments(type)) > ts2.length(target.typeParameters)) {
          instantiatedBase = getTypeWithThisArgument(instantiatedBase, ts2.last(getTypeArguments(type)));
        }
        type.objectFlags |= 67108864;
        return type.cachedEquivalentBaseType = instantiatedBase;
      }
      function isEmptyLiteralType(type) {
        return strictNullChecks ? type === implicitNeverType : type === undefinedWideningType;
      }
      function isEmptyArrayLiteralType(type) {
        var elementType = getElementTypeOfArrayType(type);
        return !!elementType && isEmptyLiteralType(elementType);
      }
      function isTupleLikeType(type) {
        return isTupleType(type) || !!getPropertyOfType(type, "0");
      }
      function isArrayOrTupleLikeType(type) {
        return isArrayLikeType(type) || isTupleLikeType(type);
      }
      function getTupleElementType(type, index) {
        var propType = getTypeOfPropertyOfType(type, "" + index);
        if (propType) {
          return propType;
        }
        if (everyType(type, isTupleType)) {
          return mapType(type, function(t) {
            return getRestTypeOfTupleType(t) || undefinedType;
          });
        }
        return void 0;
      }
      function isNeitherUnitTypeNorNever(type) {
        return !(type.flags & (109440 | 131072));
      }
      function isUnitType(type) {
        return !!(type.flags & 109440);
      }
      function isUnitLikeType(type) {
        return type.flags & 2097152 ? ts2.some(type.types, isUnitType) : !!(type.flags & 109440);
      }
      function extractUnitType(type) {
        return type.flags & 2097152 ? ts2.find(type.types, isUnitType) || type : type;
      }
      function isLiteralType(type) {
        return type.flags & 16 ? true : type.flags & 1048576 ? type.flags & 1024 ? true : ts2.every(type.types, isUnitType) : isUnitType(type);
      }
      function getBaseTypeOfLiteralType(type) {
        return type.flags & 1024 ? getBaseTypeOfEnumLiteralType(type) : type.flags & 128 ? stringType : type.flags & 256 ? numberType : type.flags & 2048 ? bigintType : type.flags & 512 ? booleanType : type.flags & 1048576 ? mapType(type, getBaseTypeOfLiteralType) : type;
      }
      function getWidenedLiteralType(type) {
        return type.flags & 1024 && isFreshLiteralType(type) ? getBaseTypeOfEnumLiteralType(type) : type.flags & 128 && isFreshLiteralType(type) ? stringType : type.flags & 256 && isFreshLiteralType(type) ? numberType : type.flags & 2048 && isFreshLiteralType(type) ? bigintType : type.flags & 512 && isFreshLiteralType(type) ? booleanType : type.flags & 1048576 ? mapType(type, getWidenedLiteralType) : type;
      }
      function getWidenedUniqueESSymbolType(type) {
        return type.flags & 8192 ? esSymbolType : type.flags & 1048576 ? mapType(type, getWidenedUniqueESSymbolType) : type;
      }
      function getWidenedLiteralLikeTypeForContextualType(type, contextualType) {
        if (!isLiteralOfContextualType(type, contextualType)) {
          type = getWidenedUniqueESSymbolType(getWidenedLiteralType(type));
        }
        return type;
      }
      function getWidenedLiteralLikeTypeForContextualReturnTypeIfNeeded(type, contextualSignatureReturnType, isAsync) {
        if (type && isUnitType(type)) {
          var contextualType = !contextualSignatureReturnType ? void 0 : isAsync ? getPromisedTypeOfPromise(contextualSignatureReturnType) : contextualSignatureReturnType;
          type = getWidenedLiteralLikeTypeForContextualType(type, contextualType);
        }
        return type;
      }
      function getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(type, contextualSignatureReturnType, kind, isAsyncGenerator) {
        if (type && isUnitType(type)) {
          var contextualType = !contextualSignatureReturnType ? void 0 : getIterationTypeOfGeneratorFunctionReturnType(kind, contextualSignatureReturnType, isAsyncGenerator);
          type = getWidenedLiteralLikeTypeForContextualType(type, contextualType);
        }
        return type;
      }
      function isTupleType(type) {
        return !!(ts2.getObjectFlags(type) & 4 && type.target.objectFlags & 8);
      }
      function isGenericTupleType(type) {
        return isTupleType(type) && !!(type.target.combinedFlags & 8);
      }
      function isSingleElementGenericTupleType(type) {
        return isGenericTupleType(type) && type.target.elementFlags.length === 1;
      }
      function getRestTypeOfTupleType(type) {
        return getElementTypeOfSliceOfTupleType(type, type.target.fixedLength);
      }
      function getRestArrayTypeOfTupleType(type) {
        var restType = getRestTypeOfTupleType(type);
        return restType && createArrayType(restType);
      }
      function getElementTypeOfSliceOfTupleType(type, index, endSkipCount, writing) {
        if (endSkipCount === void 0) {
          endSkipCount = 0;
        }
        if (writing === void 0) {
          writing = false;
        }
        var length = getTypeReferenceArity(type) - endSkipCount;
        if (index < length) {
          var typeArguments = getTypeArguments(type);
          var elementTypes = [];
          for (var i = index; i < length; i++) {
            var t = typeArguments[i];
            elementTypes.push(type.target.elementFlags[i] & 8 ? getIndexedAccessType(t, numberType) : t);
          }
          return writing ? getIntersectionType(elementTypes) : getUnionType(elementTypes);
        }
        return void 0;
      }
      function isTupleTypeStructureMatching(t1, t2) {
        return getTypeReferenceArity(t1) === getTypeReferenceArity(t2) && ts2.every(t1.target.elementFlags, function(f, i) {
          return (f & 12) === (t2.target.elementFlags[i] & 12);
        });
      }
      function isZeroBigInt(_a) {
        var value = _a.value;
        return value.base10Value === "0";
      }
      function getFalsyFlagsOfTypes(types) {
        var result = 0;
        for (var _i = 0, types_14 = types; _i < types_14.length; _i++) {
          var t = types_14[_i];
          result |= getFalsyFlags(t);
        }
        return result;
      }
      function getFalsyFlags(type) {
        return type.flags & 1048576 ? getFalsyFlagsOfTypes(type.types) : type.flags & 128 ? type.value === "" ? 128 : 0 : type.flags & 256 ? type.value === 0 ? 256 : 0 : type.flags & 2048 ? isZeroBigInt(type) ? 2048 : 0 : type.flags & 512 ? type === falseType || type === regularFalseType ? 512 : 0 : type.flags & 117724;
      }
      function removeDefinitelyFalsyTypes(type) {
        return getFalsyFlags(type) & 117632 ? filterType(type, function(t) {
          return !(getFalsyFlags(t) & 117632);
        }) : type;
      }
      function extractDefinitelyFalsyTypes(type) {
        return mapType(type, getDefinitelyFalsyPartOfType);
      }
      function getDefinitelyFalsyPartOfType(type) {
        return type.flags & 4 ? emptyStringType : type.flags & 8 ? zeroType : type.flags & 64 ? zeroBigIntType : type === regularFalseType || type === falseType || type.flags & (16384 | 32768 | 65536 | 3) || type.flags & 128 && type.value === "" || type.flags & 256 && type.value === 0 || type.flags & 2048 && isZeroBigInt(type) ? type : neverType;
      }
      function getNullableType(type, flags) {
        var missing = flags & ~type.flags & (32768 | 65536);
        return missing === 0 ? type : missing === 32768 ? getUnionType([type, undefinedType]) : missing === 65536 ? getUnionType([type, nullType]) : getUnionType([type, undefinedType, nullType]);
      }
      function getOptionalType(type, isProperty) {
        if (isProperty === void 0) {
          isProperty = false;
        }
        ts2.Debug.assert(strictNullChecks);
        return type.flags & 32768 ? type : getUnionType([type, isProperty ? missingType : undefinedType]);
      }
      function getGlobalNonNullableTypeInstantiation(type) {
        var reducedType = getTypeWithFacts(type, 2097152);
        if (!deferredGlobalNonNullableTypeAlias) {
          deferredGlobalNonNullableTypeAlias = getGlobalSymbol("NonNullable", 524288, void 0) || unknownSymbol;
        }
        return deferredGlobalNonNullableTypeAlias !== unknownSymbol ? getTypeAliasInstantiation(deferredGlobalNonNullableTypeAlias, [reducedType]) : reducedType;
      }
      function getNonNullableType(type) {
        return strictNullChecks ? getGlobalNonNullableTypeInstantiation(type) : type;
      }
      function addOptionalTypeMarker(type) {
        return strictNullChecks ? getUnionType([type, optionalType]) : type;
      }
      function removeOptionalTypeMarker(type) {
        return strictNullChecks ? removeType(type, optionalType) : type;
      }
      function propagateOptionalTypeMarker(type, node, wasOptional) {
        return wasOptional ? ts2.isOutermostOptionalChain(node) ? getOptionalType(type) : addOptionalTypeMarker(type) : type;
      }
      function getOptionalExpressionType(exprType, expression) {
        return ts2.isExpressionOfOptionalChainRoot(expression) ? getNonNullableType(exprType) : ts2.isOptionalChain(expression) ? removeOptionalTypeMarker(exprType) : exprType;
      }
      function removeMissingType(type, isOptional) {
        return exactOptionalPropertyTypes && isOptional ? removeType(type, missingType) : type;
      }
      function containsMissingType(type) {
        return exactOptionalPropertyTypes && (type === missingType || type.flags & 1048576 && containsType(type.types, missingType));
      }
      function removeMissingOrUndefinedType(type) {
        return exactOptionalPropertyTypes ? removeType(type, missingType) : getTypeWithFacts(type, 524288);
      }
      function isCoercibleUnderDoubleEquals(source, target) {
        return (source.flags & (8 | 4 | 512)) !== 0 && (target.flags & (8 | 4 | 16)) !== 0;
      }
      function isObjectTypeWithInferableIndex(type) {
        return type.flags & 2097152 ? ts2.every(type.types, isObjectTypeWithInferableIndex) : !!(type.symbol && (type.symbol.flags & (4096 | 2048 | 384 | 512)) !== 0 && !typeHasCallOrConstructSignatures(type)) || !!(ts2.getObjectFlags(type) & 1024 && isObjectTypeWithInferableIndex(type.source));
      }
      function createSymbolWithType(source, type) {
        var symbol = createSymbol(source.flags, source.escapedName, ts2.getCheckFlags(source) & 8);
        symbol.declarations = source.declarations;
        symbol.parent = source.parent;
        symbol.type = type;
        symbol.target = source;
        if (source.valueDeclaration) {
          symbol.valueDeclaration = source.valueDeclaration;
        }
        var nameType = getSymbolLinks(source).nameType;
        if (nameType) {
          symbol.nameType = nameType;
        }
        return symbol;
      }
      function transformTypeOfMembers(type, f) {
        var members = ts2.createSymbolTable();
        for (var _i = 0, _a = getPropertiesOfObjectType(type); _i < _a.length; _i++) {
          var property = _a[_i];
          var original = getTypeOfSymbol(property);
          var updated = f(original);
          members.set(property.escapedName, updated === original ? property : createSymbolWithType(property, updated));
        }
        return members;
      }
      function getRegularTypeOfObjectLiteral(type) {
        if (!(isObjectLiteralType(type) && ts2.getObjectFlags(type) & 16384)) {
          return type;
        }
        var regularType = type.regularType;
        if (regularType) {
          return regularType;
        }
        var resolved = type;
        var members = transformTypeOfMembers(type, getRegularTypeOfObjectLiteral);
        var regularNew = createAnonymousType(resolved.symbol, members, resolved.callSignatures, resolved.constructSignatures, resolved.indexInfos);
        regularNew.flags = resolved.flags;
        regularNew.objectFlags |= resolved.objectFlags & ~16384;
        type.regularType = regularNew;
        return regularNew;
      }
      function createWideningContext(parent, propertyName, siblings) {
        return { parent, propertyName, siblings, resolvedProperties: void 0 };
      }
      function getSiblingsOfContext(context) {
        if (!context.siblings) {
          var siblings_1 = [];
          for (var _i = 0, _a = getSiblingsOfContext(context.parent); _i < _a.length; _i++) {
            var type = _a[_i];
            if (isObjectLiteralType(type)) {
              var prop = getPropertyOfObjectType(type, context.propertyName);
              if (prop) {
                forEachType(getTypeOfSymbol(prop), function(t) {
                  siblings_1.push(t);
                });
              }
            }
          }
          context.siblings = siblings_1;
        }
        return context.siblings;
      }
      function getPropertiesOfContext(context) {
        if (!context.resolvedProperties) {
          var names = new ts2.Map();
          for (var _i = 0, _a = getSiblingsOfContext(context); _i < _a.length; _i++) {
            var t = _a[_i];
            if (isObjectLiteralType(t) && !(ts2.getObjectFlags(t) & 4194304)) {
              for (var _b = 0, _c = getPropertiesOfType(t); _b < _c.length; _b++) {
                var prop = _c[_b];
                names.set(prop.escapedName, prop);
              }
            }
          }
          context.resolvedProperties = ts2.arrayFrom(names.values());
        }
        return context.resolvedProperties;
      }
      function getWidenedProperty(prop, context) {
        if (!(prop.flags & 4)) {
          return prop;
        }
        var original = getTypeOfSymbol(prop);
        var propContext = context && createWideningContext(context, prop.escapedName, void 0);
        var widened = getWidenedTypeWithContext(original, propContext);
        return widened === original ? prop : createSymbolWithType(prop, widened);
      }
      function getUndefinedProperty(prop) {
        var cached = undefinedProperties.get(prop.escapedName);
        if (cached) {
          return cached;
        }
        var result = createSymbolWithType(prop, missingType);
        result.flags |= 16777216;
        undefinedProperties.set(prop.escapedName, result);
        return result;
      }
      function getWidenedTypeOfObjectLiteral(type, context) {
        var members = ts2.createSymbolTable();
        for (var _i = 0, _a = getPropertiesOfObjectType(type); _i < _a.length; _i++) {
          var prop = _a[_i];
          members.set(prop.escapedName, getWidenedProperty(prop, context));
        }
        if (context) {
          for (var _b = 0, _c = getPropertiesOfContext(context); _b < _c.length; _b++) {
            var prop = _c[_b];
            if (!members.has(prop.escapedName)) {
              members.set(prop.escapedName, getUndefinedProperty(prop));
            }
          }
        }
        var result = createAnonymousType(type.symbol, members, ts2.emptyArray, ts2.emptyArray, ts2.sameMap(getIndexInfosOfType(type), function(info) {
          return createIndexInfo(info.keyType, getWidenedType(info.type), info.isReadonly);
        }));
        result.objectFlags |= ts2.getObjectFlags(type) & (8192 | 524288);
        return result;
      }
      function getWidenedType(type) {
        return getWidenedTypeWithContext(type, void 0);
      }
      function getWidenedTypeWithContext(type, context) {
        if (ts2.getObjectFlags(type) & 393216) {
          if (context === void 0 && type.widened) {
            return type.widened;
          }
          var result = void 0;
          if (type.flags & (1 | 98304)) {
            result = anyType;
          } else if (isObjectLiteralType(type)) {
            result = getWidenedTypeOfObjectLiteral(type, context);
          } else if (type.flags & 1048576) {
            var unionContext_1 = context || createWideningContext(void 0, void 0, type.types);
            var widenedTypes = ts2.sameMap(type.types, function(t) {
              return t.flags & 98304 ? t : getWidenedTypeWithContext(t, unionContext_1);
            });
            result = getUnionType(widenedTypes, ts2.some(widenedTypes, isEmptyObjectType) ? 2 : 1);
          } else if (type.flags & 2097152) {
            result = getIntersectionType(ts2.sameMap(type.types, getWidenedType));
          } else if (isArrayType(type) || isTupleType(type)) {
            result = createTypeReference(type.target, ts2.sameMap(getTypeArguments(type), getWidenedType));
          }
          if (result && context === void 0) {
            type.widened = result;
          }
          return result || type;
        }
        return type;
      }
      function reportWideningErrorsInType(type) {
        var errorReported = false;
        if (ts2.getObjectFlags(type) & 131072) {
          if (type.flags & 1048576) {
            if (ts2.some(type.types, isEmptyObjectType)) {
              errorReported = true;
            } else {
              for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
                var t = _a[_i];
                if (reportWideningErrorsInType(t)) {
                  errorReported = true;
                }
              }
            }
          }
          if (isArrayType(type) || isTupleType(type)) {
            for (var _b = 0, _c = getTypeArguments(type); _b < _c.length; _b++) {
              var t = _c[_b];
              if (reportWideningErrorsInType(t)) {
                errorReported = true;
              }
            }
          }
          if (isObjectLiteralType(type)) {
            for (var _d = 0, _e = getPropertiesOfObjectType(type); _d < _e.length; _d++) {
              var p = _e[_d];
              var t = getTypeOfSymbol(p);
              if (ts2.getObjectFlags(t) & 131072) {
                if (!reportWideningErrorsInType(t)) {
                  error(p.valueDeclaration, ts2.Diagnostics.Object_literal_s_property_0_implicitly_has_an_1_type, symbolToString(p), typeToString(getWidenedType(t)));
                }
                errorReported = true;
              }
            }
          }
        }
        return errorReported;
      }
      function reportImplicitAny(declaration, type, wideningKind) {
        var typeAsString = typeToString(getWidenedType(type));
        if (ts2.isInJSFile(declaration) && !ts2.isCheckJsEnabledForFile(ts2.getSourceFileOfNode(declaration), compilerOptions)) {
          return;
        }
        var diagnostic;
        switch (declaration.kind) {
          case 220:
          case 166:
          case 165:
            diagnostic = noImplicitAny ? ts2.Diagnostics.Member_0_implicitly_has_an_1_type : ts2.Diagnostics.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage;
            break;
          case 163:
            var param = declaration;
            if (ts2.isIdentifier(param.name) && (ts2.isCallSignatureDeclaration(param.parent) || ts2.isMethodSignature(param.parent) || ts2.isFunctionTypeNode(param.parent)) && param.parent.parameters.indexOf(param) > -1 && (resolveName(param, param.name.escapedText, 788968, void 0, param.name.escapedText, true) || param.name.originalKeywordKind && ts2.isTypeNodeKind(param.name.originalKeywordKind))) {
              var newName = "arg" + param.parent.parameters.indexOf(param);
              var typeName = ts2.declarationNameToString(param.name) + (param.dotDotDotToken ? "[]" : "");
              errorOrSuggestion(noImplicitAny, declaration, ts2.Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1, newName, typeName);
              return;
            }
            diagnostic = declaration.dotDotDotToken ? noImplicitAny ? ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type : ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage : noImplicitAny ? ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type : ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage;
            break;
          case 202:
            diagnostic = ts2.Diagnostics.Binding_element_0_implicitly_has_an_1_type;
            if (!noImplicitAny) {
              return;
            }
            break;
          case 315:
            error(declaration, ts2.Diagnostics.Function_type_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, typeAsString);
            return;
          case 255:
          case 168:
          case 167:
          case 171:
          case 172:
          case 212:
          case 213:
            if (noImplicitAny && !declaration.name) {
              if (wideningKind === 3) {
                error(declaration, ts2.Diagnostics.Generator_implicitly_has_yield_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_type_annotation, typeAsString);
              } else {
                error(declaration, ts2.Diagnostics.Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, typeAsString);
              }
              return;
            }
            diagnostic = !noImplicitAny ? ts2.Diagnostics._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage : wideningKind === 3 ? ts2.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_yield_type : ts2.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type;
            break;
          case 194:
            if (noImplicitAny) {
              error(declaration, ts2.Diagnostics.Mapped_object_type_implicitly_has_an_any_template_type);
            }
            return;
          default:
            diagnostic = noImplicitAny ? ts2.Diagnostics.Variable_0_implicitly_has_an_1_type : ts2.Diagnostics.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage;
        }
        errorOrSuggestion(noImplicitAny, declaration, diagnostic, ts2.declarationNameToString(ts2.getNameOfDeclaration(declaration)), typeAsString);
      }
      function reportErrorsFromWidening(declaration, type, wideningKind) {
        if (produceDiagnostics && noImplicitAny && ts2.getObjectFlags(type) & 131072 && (!wideningKind || !getContextualSignatureForFunctionLikeDeclaration(declaration))) {
          if (!reportWideningErrorsInType(type)) {
            reportImplicitAny(declaration, type, wideningKind);
          }
        }
      }
      function applyToParameterTypes(source, target, callback) {
        var sourceCount = getParameterCount(source);
        var targetCount = getParameterCount(target);
        var sourceRestType = getEffectiveRestType(source);
        var targetRestType = getEffectiveRestType(target);
        var targetNonRestCount = targetRestType ? targetCount - 1 : targetCount;
        var paramCount = sourceRestType ? targetNonRestCount : Math.min(sourceCount, targetNonRestCount);
        var sourceThisType = getThisTypeOfSignature(source);
        if (sourceThisType) {
          var targetThisType = getThisTypeOfSignature(target);
          if (targetThisType) {
            callback(sourceThisType, targetThisType);
          }
        }
        for (var i = 0; i < paramCount; i++) {
          callback(getTypeAtPosition(source, i), getTypeAtPosition(target, i));
        }
        if (targetRestType) {
          callback(getRestTypeAtPosition(source, paramCount), targetRestType);
        }
      }
      function applyToReturnTypes(source, target, callback) {
        var sourceTypePredicate = getTypePredicateOfSignature(source);
        var targetTypePredicate = getTypePredicateOfSignature(target);
        if (sourceTypePredicate && targetTypePredicate && typePredicateKindsMatch(sourceTypePredicate, targetTypePredicate) && sourceTypePredicate.type && targetTypePredicate.type) {
          callback(sourceTypePredicate.type, targetTypePredicate.type);
        } else {
          callback(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
        }
      }
      function createInferenceContext(typeParameters, signature, flags, compareTypes) {
        return createInferenceContextWorker(typeParameters.map(createInferenceInfo), signature, flags, compareTypes || compareTypesAssignable);
      }
      function cloneInferenceContext(context, extraFlags) {
        if (extraFlags === void 0) {
          extraFlags = 0;
        }
        return context && createInferenceContextWorker(ts2.map(context.inferences, cloneInferenceInfo), context.signature, context.flags | extraFlags, context.compareTypes);
      }
      function createInferenceContextWorker(inferences, signature, flags, compareTypes) {
        var context = {
          inferences,
          signature,
          flags,
          compareTypes,
          mapper: makeFunctionTypeMapper(function(t) {
            return mapToInferredType(context, t, true);
          }),
          nonFixingMapper: makeFunctionTypeMapper(function(t) {
            return mapToInferredType(context, t, false);
          })
        };
        return context;
      }
      function mapToInferredType(context, t, fix) {
        var inferences = context.inferences;
        for (var i = 0; i < inferences.length; i++) {
          var inference = inferences[i];
          if (t === inference.typeParameter) {
            if (fix && !inference.isFixed) {
              clearCachedInferences(inferences);
              inference.isFixed = true;
            }
            return getInferredType(context, i);
          }
        }
        return t;
      }
      function clearCachedInferences(inferences) {
        for (var _i = 0, inferences_1 = inferences; _i < inferences_1.length; _i++) {
          var inference = inferences_1[_i];
          if (!inference.isFixed) {
            inference.inferredType = void 0;
          }
        }
      }
      function createInferenceInfo(typeParameter) {
        return {
          typeParameter,
          candidates: void 0,
          contraCandidates: void 0,
          inferredType: void 0,
          priority: void 0,
          topLevel: true,
          isFixed: false,
          impliedArity: void 0
        };
      }
      function cloneInferenceInfo(inference) {
        return {
          typeParameter: inference.typeParameter,
          candidates: inference.candidates && inference.candidates.slice(),
          contraCandidates: inference.contraCandidates && inference.contraCandidates.slice(),
          inferredType: inference.inferredType,
          priority: inference.priority,
          topLevel: inference.topLevel,
          isFixed: inference.isFixed,
          impliedArity: inference.impliedArity
        };
      }
      function cloneInferredPartOfContext(context) {
        var inferences = ts2.filter(context.inferences, hasInferenceCandidates);
        return inferences.length ? createInferenceContextWorker(ts2.map(inferences, cloneInferenceInfo), context.signature, context.flags, context.compareTypes) : void 0;
      }
      function getMapperFromContext(context) {
        return context && context.mapper;
      }
      function couldContainTypeVariables(type) {
        var objectFlags = ts2.getObjectFlags(type);
        if (objectFlags & 1048576) {
          return !!(objectFlags & 2097152);
        }
        var result = !!(type.flags & 465829888 || type.flags & 524288 && !isNonGenericTopLevelType(type) && (objectFlags & 4 && (type.node || ts2.forEach(getTypeArguments(type), couldContainTypeVariables)) || objectFlags & 16 && type.symbol && type.symbol.flags & (16 | 8192 | 32 | 2048 | 4096) && type.symbol.declarations || objectFlags & (32 | 1024 | 8388608)) || type.flags & 3145728 && !(type.flags & 1024) && !isNonGenericTopLevelType(type) && ts2.some(type.types, couldContainTypeVariables));
        if (type.flags & 3899393) {
          type.objectFlags |= 1048576 | (result ? 2097152 : 0);
        }
        return result;
      }
      function isNonGenericTopLevelType(type) {
        if (type.aliasSymbol && !type.aliasTypeArguments) {
          var declaration = ts2.getDeclarationOfKind(type.aliasSymbol, 258);
          return !!(declaration && ts2.findAncestor(declaration.parent, function(n) {
            return n.kind === 303 ? true : n.kind === 260 ? false : "quit";
          }));
        }
        return false;
      }
      function isTypeParameterAtTopLevel(type, typeParameter) {
        return !!(type === typeParameter || type.flags & 3145728 && ts2.some(type.types, function(t) {
          return isTypeParameterAtTopLevel(t, typeParameter);
        }) || type.flags & 16777216 && (getTrueTypeFromConditionalType(type) === typeParameter || getFalseTypeFromConditionalType(type) === typeParameter));
      }
      function createEmptyObjectTypeFromStringLiteral(type) {
        var members = ts2.createSymbolTable();
        forEachType(type, function(t) {
          if (!(t.flags & 128)) {
            return;
          }
          var name = ts2.escapeLeadingUnderscores(t.value);
          var literalProp = createSymbol(4, name);
          literalProp.type = anyType;
          if (t.symbol) {
            literalProp.declarations = t.symbol.declarations;
            literalProp.valueDeclaration = t.symbol.valueDeclaration;
          }
          members.set(name, literalProp);
        });
        var indexInfos = type.flags & 4 ? [createIndexInfo(stringType, emptyObjectType, false)] : ts2.emptyArray;
        return createAnonymousType(void 0, members, ts2.emptyArray, ts2.emptyArray, indexInfos);
      }
      function inferTypeForHomomorphicMappedType(source, target, constraint) {
        if (inInferTypeForHomomorphicMappedType) {
          return void 0;
        }
        var key = source.id + "," + target.id + "," + constraint.id;
        if (reverseMappedCache.has(key)) {
          return reverseMappedCache.get(key);
        }
        inInferTypeForHomomorphicMappedType = true;
        var type = createReverseMappedType(source, target, constraint);
        inInferTypeForHomomorphicMappedType = false;
        reverseMappedCache.set(key, type);
        return type;
      }
      function isPartiallyInferableType(type) {
        return !(ts2.getObjectFlags(type) & 524288) || isObjectLiteralType(type) && ts2.some(getPropertiesOfType(type), function(prop) {
          return isPartiallyInferableType(getTypeOfSymbol(prop));
        }) || isTupleType(type) && ts2.some(getTypeArguments(type), isPartiallyInferableType);
      }
      function createReverseMappedType(source, target, constraint) {
        if (!(getIndexInfoOfType(source, stringType) || getPropertiesOfType(source).length !== 0 && isPartiallyInferableType(source))) {
          return void 0;
        }
        if (isArrayType(source)) {
          return createArrayType(inferReverseMappedType(getTypeArguments(source)[0], target, constraint), isReadonlyArrayType(source));
        }
        if (isTupleType(source)) {
          var elementTypes = ts2.map(getTypeArguments(source), function(t) {
            return inferReverseMappedType(t, target, constraint);
          });
          var elementFlags = getMappedTypeModifiers(target) & 4 ? ts2.sameMap(source.target.elementFlags, function(f) {
            return f & 2 ? 1 : f;
          }) : source.target.elementFlags;
          return createTupleType(elementTypes, elementFlags, source.target.readonly, source.target.labeledElementDeclarations);
        }
        var reversed = createObjectType(1024 | 16, void 0);
        reversed.source = source;
        reversed.mappedType = target;
        reversed.constraintType = constraint;
        return reversed;
      }
      function getTypeOfReverseMappedSymbol(symbol) {
        var links = getSymbolLinks(symbol);
        if (!links.type) {
          links.type = inferReverseMappedType(symbol.propertyType, symbol.mappedType, symbol.constraintType);
        }
        return links.type;
      }
      function inferReverseMappedType(sourceType, target, constraint) {
        var typeParameter = getIndexedAccessType(constraint.type, getTypeParameterFromMappedType(target));
        var templateType = getTemplateTypeFromMappedType(target);
        var inference = createInferenceInfo(typeParameter);
        inferTypes([inference], sourceType, templateType);
        return getTypeFromInference(inference) || unknownType;
      }
      function getUnmatchedProperties(source, target, requireOptionalProperties, matchDiscriminantProperties) {
        var properties, _i, properties_2, targetProp, sourceProp, targetType, sourceType;
        return __generator(this, function(_a) {
          switch (_a.label) {
            case 0:
              properties = getPropertiesOfType(target);
              _i = 0, properties_2 = properties;
              _a.label = 1;
            case 1:
              if (!(_i < properties_2.length))
                return [3, 6];
              targetProp = properties_2[_i];
              if (isStaticPrivateIdentifierProperty(targetProp)) {
                return [3, 5];
              }
              if (!(requireOptionalProperties || !(targetProp.flags & 16777216 || ts2.getCheckFlags(targetProp) & 48)))
                return [3, 5];
              sourceProp = getPropertyOfType(source, targetProp.escapedName);
              if (!!sourceProp)
                return [3, 3];
              return [4, targetProp];
            case 2:
              _a.sent();
              return [3, 5];
            case 3:
              if (!matchDiscriminantProperties)
                return [3, 5];
              targetType = getTypeOfSymbol(targetProp);
              if (!(targetType.flags & 109440))
                return [3, 5];
              sourceType = getTypeOfSymbol(sourceProp);
              if (!!(sourceType.flags & 1 || getRegularTypeOfLiteralType(sourceType) === getRegularTypeOfLiteralType(targetType)))
                return [3, 5];
              return [4, targetProp];
            case 4:
              _a.sent();
              _a.label = 5;
            case 5:
              _i++;
              return [3, 1];
            case 6:
              return [2];
          }
        });
      }
      function getUnmatchedProperty(source, target, requireOptionalProperties, matchDiscriminantProperties) {
        var result = getUnmatchedProperties(source, target, requireOptionalProperties, matchDiscriminantProperties).next();
        if (!result.done)
          return result.value;
      }
      function tupleTypesDefinitelyUnrelated(source, target) {
        return !(target.target.combinedFlags & 8) && target.target.minLength > source.target.minLength || !target.target.hasRestElement && (source.target.hasRestElement || target.target.fixedLength < source.target.fixedLength);
      }
      function typesDefinitelyUnrelated(source, target) {
        return isTupleType(source) && isTupleType(target) ? tupleTypesDefinitelyUnrelated(source, target) : !!getUnmatchedProperty(source, target, false, true) && !!getUnmatchedProperty(target, source, false, false);
      }
      function getTypeFromInference(inference) {
        return inference.candidates ? getUnionType(inference.candidates, 2) : inference.contraCandidates ? getIntersectionType(inference.contraCandidates) : void 0;
      }
      function hasSkipDirectInferenceFlag(node) {
        return !!getNodeLinks(node).skipDirectInference;
      }
      function isFromInferenceBlockedSource(type) {
        return !!(type.symbol && ts2.some(type.symbol.declarations, hasSkipDirectInferenceFlag));
      }
      function templateLiteralTypesDefinitelyUnrelated(source, target) {
        var sourceStart = source.texts[0];
        var targetStart = target.texts[0];
        var sourceEnd = source.texts[source.texts.length - 1];
        var targetEnd = target.texts[target.texts.length - 1];
        var startLen = Math.min(sourceStart.length, targetStart.length);
        var endLen = Math.min(sourceEnd.length, targetEnd.length);
        return sourceStart.slice(0, startLen) !== targetStart.slice(0, startLen) || sourceEnd.slice(sourceEnd.length - endLen) !== targetEnd.slice(targetEnd.length - endLen);
      }
      function isValidBigIntString(s) {
        var scanner = ts2.createScanner(99, false);
        var success = true;
        scanner.setOnError(function() {
          return success = false;
        });
        scanner.setText(s + "n");
        var result = scanner.scan();
        if (result === 40) {
          result = scanner.scan();
        }
        var flags = scanner.getTokenFlags();
        return success && result === 9 && scanner.getTextPos() === s.length + 1 && !(flags & 512);
      }
      function isValidTypeForTemplateLiteralPlaceholder(source, target) {
        if (source === target || target.flags & (1 | 4)) {
          return true;
        }
        if (source.flags & 128) {
          var value = source.value;
          return !!(target.flags & 8 && value !== "" && isFinite(+value) || target.flags & 64 && value !== "" && isValidBigIntString(value) || target.flags & (512 | 98304) && value === target.intrinsicName);
        }
        if (source.flags & 134217728) {
          var texts = source.texts;
          return texts.length === 2 && texts[0] === "" && texts[1] === "" && isTypeAssignableTo(source.types[0], target);
        }
        return isTypeAssignableTo(source, target);
      }
      function inferTypesFromTemplateLiteralType(source, target) {
        return source.flags & 128 ? inferFromLiteralPartsToTemplateLiteral([source.value], ts2.emptyArray, target) : source.flags & 134217728 ? ts2.arraysEqual(source.texts, target.texts) ? ts2.map(source.types, getStringLikeTypeForType) : inferFromLiteralPartsToTemplateLiteral(source.texts, source.types, target) : void 0;
      }
      function isTypeMatchedByTemplateLiteralType(source, target) {
        var inferences = inferTypesFromTemplateLiteralType(source, target);
        return !!inferences && ts2.every(inferences, function(r, i) {
          return isValidTypeForTemplateLiteralPlaceholder(r, target.types[i]);
        });
      }
      function getStringLikeTypeForType(type) {
        return type.flags & (1 | 402653316) ? type : getTemplateLiteralType(["", ""], [type]);
      }
      function inferFromLiteralPartsToTemplateLiteral(sourceTexts, sourceTypes, target) {
        var lastSourceIndex = sourceTexts.length - 1;
        var sourceStartText = sourceTexts[0];
        var sourceEndText = sourceTexts[lastSourceIndex];
        var targetTexts = target.texts;
        var lastTargetIndex = targetTexts.length - 1;
        var targetStartText = targetTexts[0];
        var targetEndText = targetTexts[lastTargetIndex];
        if (lastSourceIndex === 0 && sourceStartText.length < targetStartText.length + targetEndText.length || !sourceStartText.startsWith(targetStartText) || !sourceEndText.endsWith(targetEndText))
          return void 0;
        var remainingEndText = sourceEndText.slice(0, sourceEndText.length - targetEndText.length);
        var matches = [];
        var seg = 0;
        var pos = targetStartText.length;
        for (var i = 1; i < lastTargetIndex; i++) {
          var delim = targetTexts[i];
          if (delim.length > 0) {
            var s = seg;
            var p = pos;
            while (true) {
              p = getSourceText(s).indexOf(delim, p);
              if (p >= 0)
                break;
              s++;
              if (s === sourceTexts.length)
                return void 0;
              p = 0;
            }
            addMatch(s, p);
            pos += delim.length;
          } else if (pos < getSourceText(seg).length) {
            addMatch(seg, pos + 1);
          } else if (seg < lastSourceIndex) {
            addMatch(seg + 1, 0);
          } else {
            return void 0;
          }
        }
        addMatch(lastSourceIndex, getSourceText(lastSourceIndex).length);
        return matches;
        function getSourceText(index) {
          return index < lastSourceIndex ? sourceTexts[index] : remainingEndText;
        }
        function addMatch(s2, p2) {
          var matchType = s2 === seg ? getStringLiteralType(getSourceText(s2).slice(pos, p2)) : getTemplateLiteralType(__spreadArray(__spreadArray([sourceTexts[seg].slice(pos)], sourceTexts.slice(seg + 1, s2), true), [getSourceText(s2).slice(0, p2)], false), sourceTypes.slice(seg, s2));
          matches.push(matchType);
          seg = s2;
          pos = p2;
        }
      }
      function inferTypes(inferences, originalSource, originalTarget, priority, contravariant) {
        if (priority === void 0) {
          priority = 0;
        }
        if (contravariant === void 0) {
          contravariant = false;
        }
        var bivariant = false;
        var propagationType;
        var inferencePriority = 2048;
        var allowComplexConstraintInference = true;
        var visited;
        var sourceStack;
        var targetStack;
        var expandingFlags = 0;
        inferFromTypes(originalSource, originalTarget);
        function inferFromTypes(source, target) {
          if (!couldContainTypeVariables(target)) {
            return;
          }
          if (source === wildcardType) {
            var savePropagationType = propagationType;
            propagationType = source;
            inferFromTypes(target, target);
            propagationType = savePropagationType;
            return;
          }
          if (source.aliasSymbol && source.aliasTypeArguments && source.aliasSymbol === target.aliasSymbol) {
            inferFromTypeArguments(source.aliasTypeArguments, target.aliasTypeArguments, getAliasVariances(source.aliasSymbol));
            return;
          }
          if (source === target && source.flags & 3145728) {
            for (var _i = 0, _a = source.types; _i < _a.length; _i++) {
              var t = _a[_i];
              inferFromTypes(t, t);
            }
            return;
          }
          if (target.flags & 1048576) {
            var _b = inferFromMatchingTypes(source.flags & 1048576 ? source.types : [source], target.types, isTypeOrBaseIdenticalTo), tempSources = _b[0], tempTargets = _b[1];
            var _c = inferFromMatchingTypes(tempSources, tempTargets, isTypeCloselyMatchedBy), sources = _c[0], targets = _c[1];
            if (targets.length === 0) {
              return;
            }
            target = getUnionType(targets);
            if (sources.length === 0) {
              inferWithPriority(source, target, 1);
              return;
            }
            source = getUnionType(sources);
          } else if (target.flags & 2097152 && ts2.some(target.types, function(t2) {
            return !!getInferenceInfoForType(t2) || isGenericMappedType(t2) && !!getInferenceInfoForType(getHomomorphicTypeVariable(t2) || neverType);
          })) {
            if (!(source.flags & 1048576)) {
              var _d = inferFromMatchingTypes(source.flags & 2097152 ? source.types : [source], target.types, isTypeIdenticalTo), sources = _d[0], targets = _d[1];
              if (sources.length === 0 || targets.length === 0) {
                return;
              }
              source = getIntersectionType(sources);
              target = getIntersectionType(targets);
            }
          } else if (target.flags & (8388608 | 33554432)) {
            target = getActualTypeVariable(target);
          }
          if (target.flags & 8650752) {
            if (ts2.getObjectFlags(source) & 524288 || source === nonInferrableAnyType || source === silentNeverType || priority & 128 && (source === autoType || source === autoArrayType) || isFromInferenceBlockedSource(source)) {
              return;
            }
            var inference = getInferenceInfoForType(target);
            if (inference) {
              if (!inference.isFixed) {
                if (inference.priority === void 0 || priority < inference.priority) {
                  inference.candidates = void 0;
                  inference.contraCandidates = void 0;
                  inference.topLevel = true;
                  inference.priority = priority;
                }
                if (priority === inference.priority) {
                  var candidate = propagationType || source;
                  if (contravariant && !bivariant) {
                    if (!ts2.contains(inference.contraCandidates, candidate)) {
                      inference.contraCandidates = ts2.append(inference.contraCandidates, candidate);
                      clearCachedInferences(inferences);
                    }
                  } else if (!ts2.contains(inference.candidates, candidate)) {
                    inference.candidates = ts2.append(inference.candidates, candidate);
                    clearCachedInferences(inferences);
                  }
                }
                if (!(priority & 128) && target.flags & 262144 && inference.topLevel && !isTypeParameterAtTopLevel(originalTarget, target)) {
                  inference.topLevel = false;
                  clearCachedInferences(inferences);
                }
              }
              inferencePriority = Math.min(inferencePriority, priority);
              return;
            } else {
              var simplified = getSimplifiedType(target, false);
              if (simplified !== target) {
                invokeOnce(source, simplified, inferFromTypes);
              } else if (target.flags & 8388608) {
                var indexType = getSimplifiedType(target.indexType, false);
                if (indexType.flags & 465829888) {
                  var simplified_1 = distributeIndexOverObjectType(getSimplifiedType(target.objectType, false), indexType, false);
                  if (simplified_1 && simplified_1 !== target) {
                    invokeOnce(source, simplified_1, inferFromTypes);
                  }
                }
              }
            }
          }
          if (ts2.getObjectFlags(source) & 4 && ts2.getObjectFlags(target) & 4 && (source.target === target.target || isArrayType(source) && isArrayType(target)) && !(source.node && target.node)) {
            inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances(source.target));
          } else if (source.flags & 4194304 && target.flags & 4194304) {
            contravariant = !contravariant;
            inferFromTypes(source.type, target.type);
            contravariant = !contravariant;
          } else if ((isLiteralType(source) || source.flags & 4) && target.flags & 4194304) {
            var empty = createEmptyObjectTypeFromStringLiteral(source);
            contravariant = !contravariant;
            inferWithPriority(empty, target.type, 256);
            contravariant = !contravariant;
          } else if (source.flags & 8388608 && target.flags & 8388608) {
            inferFromTypes(source.objectType, target.objectType);
            inferFromTypes(source.indexType, target.indexType);
          } else if (source.flags & 268435456 && target.flags & 268435456) {
            if (source.symbol === target.symbol) {
              inferFromTypes(source.type, target.type);
            }
          } else if (source.flags & 33554432) {
            inferFromTypes(source.baseType, target);
            var oldPriority = priority;
            priority |= 4;
            inferFromTypes(source.substitute, target);
            priority = oldPriority;
          } else if (target.flags & 16777216) {
            invokeOnce(source, target, inferToConditionalType);
          } else if (target.flags & 3145728) {
            inferToMultipleTypes(source, target.types, target.flags);
          } else if (source.flags & 1048576) {
            var sourceTypes = source.types;
            for (var _e = 0, sourceTypes_2 = sourceTypes; _e < sourceTypes_2.length; _e++) {
              var sourceType = sourceTypes_2[_e];
              inferFromTypes(sourceType, target);
            }
          } else if (target.flags & 134217728) {
            inferToTemplateLiteralType(source, target);
          } else {
            source = getReducedType(source);
            if (!(priority & 512 && source.flags & (2097152 | 465829888))) {
              var apparentSource = getApparentType(source);
              if (apparentSource !== source && allowComplexConstraintInference && !(apparentSource.flags & (524288 | 2097152))) {
                allowComplexConstraintInference = false;
                return inferFromTypes(apparentSource, target);
              }
              source = apparentSource;
            }
            if (source.flags & (524288 | 2097152)) {
              invokeOnce(source, target, inferFromObjectTypes);
            }
          }
        }
        function inferWithPriority(source, target, newPriority) {
          var savePriority = priority;
          priority |= newPriority;
          inferFromTypes(source, target);
          priority = savePriority;
        }
        function invokeOnce(source, target, action) {
          var key = source.id + "," + target.id;
          var status = visited && visited.get(key);
          if (status !== void 0) {
            inferencePriority = Math.min(inferencePriority, status);
            return;
          }
          (visited || (visited = new ts2.Map())).set(key, -1);
          var saveInferencePriority = inferencePriority;
          inferencePriority = 2048;
          var saveExpandingFlags = expandingFlags;
          var sourceIdentity = getRecursionIdentity(source);
          var targetIdentity = getRecursionIdentity(target);
          if (ts2.contains(sourceStack, sourceIdentity))
            expandingFlags |= 1;
          if (ts2.contains(targetStack, targetIdentity))
            expandingFlags |= 2;
          if (expandingFlags !== 3) {
            (sourceStack || (sourceStack = [])).push(sourceIdentity);
            (targetStack || (targetStack = [])).push(targetIdentity);
            action(source, target);
            targetStack.pop();
            sourceStack.pop();
          } else {
            inferencePriority = -1;
          }
          expandingFlags = saveExpandingFlags;
          visited.set(key, inferencePriority);
          inferencePriority = Math.min(inferencePriority, saveInferencePriority);
        }
        function inferFromMatchingTypes(sources, targets, matches) {
          var matchedSources;
          var matchedTargets;
          for (var _i = 0, targets_1 = targets; _i < targets_1.length; _i++) {
            var t = targets_1[_i];
            for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) {
              var s = sources_1[_a];
              if (matches(s, t)) {
                inferFromTypes(s, t);
                matchedSources = ts2.appendIfUnique(matchedSources, s);
                matchedTargets = ts2.appendIfUnique(matchedTargets, t);
              }
            }
          }
          return [
            matchedSources ? ts2.filter(sources, function(t2) {
              return !ts2.contains(matchedSources, t2);
            }) : sources,
            matchedTargets ? ts2.filter(targets, function(t2) {
              return !ts2.contains(matchedTargets, t2);
            }) : targets
          ];
        }
        function inferFromTypeArguments(sourceTypes, targetTypes, variances) {
          var count = sourceTypes.length < targetTypes.length ? sourceTypes.length : targetTypes.length;
          for (var i = 0; i < count; i++) {
            if (i < variances.length && (variances[i] & 7) === 2) {
              inferFromContravariantTypes(sourceTypes[i], targetTypes[i]);
            } else {
              inferFromTypes(sourceTypes[i], targetTypes[i]);
            }
          }
        }
        function inferFromContravariantTypes(source, target) {
          if (strictFunctionTypes || priority & 1024) {
            contravariant = !contravariant;
            inferFromTypes(source, target);
            contravariant = !contravariant;
          } else {
            inferFromTypes(source, target);
          }
        }
        function getInferenceInfoForType(type) {
          if (type.flags & 8650752) {
            for (var _i = 0, inferences_2 = inferences; _i < inferences_2.length; _i++) {
              var inference = inferences_2[_i];
              if (type === inference.typeParameter) {
                return inference;
              }
            }
          }
          return void 0;
        }
        function getSingleTypeVariableFromIntersectionTypes(types) {
          var typeVariable;
          for (var _i = 0, types_15 = types; _i < types_15.length; _i++) {
            var type = types_15[_i];
            var t = type.flags & 2097152 && ts2.find(type.types, function(t2) {
              return !!getInferenceInfoForType(t2);
            });
            if (!t || typeVariable && t !== typeVariable) {
              return void 0;
            }
            typeVariable = t;
          }
          return typeVariable;
        }
        function inferToMultipleTypes(source, targets, targetFlags) {
          var typeVariableCount = 0;
          if (targetFlags & 1048576) {
            var nakedTypeVariable = void 0;
            var sources = source.flags & 1048576 ? source.types : [source];
            var matched_1 = new Array(sources.length);
            var inferenceCircularity = false;
            for (var _i = 0, targets_2 = targets; _i < targets_2.length; _i++) {
              var t = targets_2[_i];
              if (getInferenceInfoForType(t)) {
                nakedTypeVariable = t;
                typeVariableCount++;
              } else {
                for (var i = 0; i < sources.length; i++) {
                  var saveInferencePriority = inferencePriority;
                  inferencePriority = 2048;
                  inferFromTypes(sources[i], t);
                  if (inferencePriority === priority)
                    matched_1[i] = true;
                  inferenceCircularity = inferenceCircularity || inferencePriority === -1;
                  inferencePriority = Math.min(inferencePriority, saveInferencePriority);
                }
              }
            }
            if (typeVariableCount === 0) {
              var intersectionTypeVariable = getSingleTypeVariableFromIntersectionTypes(targets);
              if (intersectionTypeVariable) {
                inferWithPriority(source, intersectionTypeVariable, 1);
              }
              return;
            }
            if (typeVariableCount === 1 && !inferenceCircularity) {
              var unmatched = ts2.flatMap(sources, function(s, i2) {
                return matched_1[i2] ? void 0 : s;
              });
              if (unmatched.length) {
                inferFromTypes(getUnionType(unmatched), nakedTypeVariable);
                return;
              }
            }
          } else {
            for (var _a = 0, targets_3 = targets; _a < targets_3.length; _a++) {
              var t = targets_3[_a];
              if (getInferenceInfoForType(t)) {
                typeVariableCount++;
              } else {
                inferFromTypes(source, t);
              }
            }
          }
          if (targetFlags & 2097152 ? typeVariableCount === 1 : typeVariableCount > 0) {
            for (var _b = 0, targets_4 = targets; _b < targets_4.length; _b++) {
              var t = targets_4[_b];
              if (getInferenceInfoForType(t)) {
                inferWithPriority(source, t, 1);
              }
            }
          }
        }
        function inferToMappedType(source, target, constraintType) {
          if (constraintType.flags & 1048576) {
            var result = false;
            for (var _i = 0, _a = constraintType.types; _i < _a.length; _i++) {
              var type = _a[_i];
              result = inferToMappedType(source, target, type) || result;
            }
            return result;
          }
          if (constraintType.flags & 4194304) {
            var inference = getInferenceInfoForType(constraintType.type);
            if (inference && !inference.isFixed && !isFromInferenceBlockedSource(source)) {
              var inferredType = inferTypeForHomomorphicMappedType(source, target, constraintType);
              if (inferredType) {
                inferWithPriority(inferredType, inference.typeParameter, ts2.getObjectFlags(source) & 524288 ? 16 : 8);
              }
            }
            return true;
          }
          if (constraintType.flags & 262144) {
            inferWithPriority(getIndexType(source), constraintType, 32);
            var extendedConstraint = getConstraintOfType(constraintType);
            if (extendedConstraint && inferToMappedType(source, target, extendedConstraint)) {
              return true;
            }
            var propTypes = ts2.map(getPropertiesOfType(source), getTypeOfSymbol);
            var indexTypes = ts2.map(getIndexInfosOfType(source), function(info) {
              return info !== enumNumberIndexInfo ? info.type : neverType;
            });
            inferFromTypes(getUnionType(ts2.concatenate(propTypes, indexTypes)), getTemplateTypeFromMappedType(target));
            return true;
          }
          return false;
        }
        function inferToConditionalType(source, target) {
          if (source.flags & 16777216) {
            inferFromTypes(source.checkType, target.checkType);
            inferFromTypes(source.extendsType, target.extendsType);
            inferFromTypes(getTrueTypeFromConditionalType(source), getTrueTypeFromConditionalType(target));
            inferFromTypes(getFalseTypeFromConditionalType(source), getFalseTypeFromConditionalType(target));
          } else {
            var savePriority = priority;
            priority |= contravariant ? 64 : 0;
            var targetTypes = [getTrueTypeFromConditionalType(target), getFalseTypeFromConditionalType(target)];
            inferToMultipleTypes(source, targetTypes, target.flags);
            priority = savePriority;
          }
        }
        function inferToTemplateLiteralType(source, target) {
          var matches = inferTypesFromTemplateLiteralType(source, target);
          var types = target.types;
          if (matches || ts2.every(target.texts, function(s) {
            return s.length === 0;
          })) {
            for (var i = 0; i < types.length; i++) {
              inferFromTypes(matches ? matches[i] : neverType, types[i]);
            }
          }
        }
        function inferFromObjectTypes(source, target) {
          if (ts2.getObjectFlags(source) & 4 && ts2.getObjectFlags(target) & 4 && (source.target === target.target || isArrayType(source) && isArrayType(target))) {
            inferFromTypeArguments(getTypeArguments(source), getTypeArguments(target), getVariances(source.target));
            return;
          }
          if (isGenericMappedType(source) && isGenericMappedType(target)) {
            inferFromTypes(getConstraintTypeFromMappedType(source), getConstraintTypeFromMappedType(target));
            inferFromTypes(getTemplateTypeFromMappedType(source), getTemplateTypeFromMappedType(target));
            var sourceNameType = getNameTypeFromMappedType(source);
            var targetNameType = getNameTypeFromMappedType(target);
            if (sourceNameType && targetNameType)
              inferFromTypes(sourceNameType, targetNameType);
          }
          if (ts2.getObjectFlags(target) & 32 && !target.declaration.nameType) {
            var constraintType = getConstraintTypeFromMappedType(target);
            if (inferToMappedType(source, target, constraintType)) {
              return;
            }
          }
          if (!typesDefinitelyUnrelated(source, target)) {
            if (isArrayType(source) || isTupleType(source)) {
              if (isTupleType(target)) {
                var sourceArity = getTypeReferenceArity(source);
                var targetArity = getTypeReferenceArity(target);
                var elementTypes = getTypeArguments(target);
                var elementFlags = target.target.elementFlags;
                if (isTupleType(source) && isTupleTypeStructureMatching(source, target)) {
                  for (var i = 0; i < targetArity; i++) {
                    inferFromTypes(getTypeArguments(source)[i], elementTypes[i]);
                  }
                  return;
                }
                var startLength = isTupleType(source) ? Math.min(source.target.fixedLength, target.target.fixedLength) : 0;
                var endLength = Math.min(isTupleType(source) ? getEndElementCount(source.target, 3) : 0, target.target.hasRestElement ? getEndElementCount(target.target, 3) : 0);
                for (var i = 0; i < startLength; i++) {
                  inferFromTypes(getTypeArguments(source)[i], elementTypes[i]);
                }
                if (!isTupleType(source) || sourceArity - startLength - endLength === 1 && source.target.elementFlags[startLength] & 4) {
                  var restType = getTypeArguments(source)[startLength];
                  for (var i = startLength; i < targetArity - endLength; i++) {
                    inferFromTypes(elementFlags[i] & 8 ? createArrayType(restType) : restType, elementTypes[i]);
                  }
                } else {
                  var middleLength = targetArity - startLength - endLength;
                  if (middleLength === 2 && elementFlags[startLength] & elementFlags[startLength + 1] & 8 && isTupleType(source)) {
                    var targetInfo = getInferenceInfoForType(elementTypes[startLength]);
                    if (targetInfo && targetInfo.impliedArity !== void 0) {
                      inferFromTypes(sliceTupleType(source, startLength, endLength + sourceArity - targetInfo.impliedArity), elementTypes[startLength]);
                      inferFromTypes(sliceTupleType(source, startLength + targetInfo.impliedArity, endLength), elementTypes[startLength + 1]);
                    }
                  } else if (middleLength === 1 && elementFlags[startLength] & 8) {
                    var endsInOptional = target.target.elementFlags[targetArity - 1] & 2;
                    var sourceSlice = isTupleType(source) ? sliceTupleType(source, startLength, endLength) : createArrayType(getTypeArguments(source)[0]);
                    inferWithPriority(sourceSlice, elementTypes[startLength], endsInOptional ? 2 : 0);
                  } else if (middleLength === 1 && elementFlags[startLength] & 4) {
                    var restType = isTupleType(source) ? getElementTypeOfSliceOfTupleType(source, startLength, endLength) : getTypeArguments(source)[0];
                    if (restType) {
                      inferFromTypes(restType, elementTypes[startLength]);
                    }
                  }
                }
                for (var i = 0; i < endLength; i++) {
                  inferFromTypes(getTypeArguments(source)[sourceArity - i - 1], elementTypes[targetArity - i - 1]);
                }
                return;
              }
              if (isArrayType(target)) {
                inferFromIndexTypes(source, target);
                return;
              }
            }
            inferFromProperties(source, target);
            inferFromSignatures(source, target, 0);
            inferFromSignatures(source, target, 1);
            inferFromIndexTypes(source, target);
          }
        }
        function inferFromProperties(source, target) {
          var properties = getPropertiesOfObjectType(target);
          for (var _i = 0, properties_3 = properties; _i < properties_3.length; _i++) {
            var targetProp = properties_3[_i];
            var sourceProp = getPropertyOfType(source, targetProp.escapedName);
            if (sourceProp) {
              inferFromTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
            }
          }
        }
        function inferFromSignatures(source, target, kind) {
          var sourceSignatures = getSignaturesOfType(source, kind);
          var targetSignatures = getSignaturesOfType(target, kind);
          var sourceLen = sourceSignatures.length;
          var targetLen = targetSignatures.length;
          var len = sourceLen < targetLen ? sourceLen : targetLen;
          var skipParameters = !!(ts2.getObjectFlags(source) & 524288);
          for (var i = 0; i < len; i++) {
            inferFromSignature(getBaseSignature(sourceSignatures[sourceLen - len + i]), getErasedSignature(targetSignatures[targetLen - len + i]), skipParameters);
          }
        }
        function inferFromSignature(source, target, skipParameters) {
          if (!skipParameters) {
            var saveBivariant = bivariant;
            var kind = target.declaration ? target.declaration.kind : 0;
            bivariant = bivariant || kind === 168 || kind === 167 || kind === 170;
            applyToParameterTypes(source, target, inferFromContravariantTypes);
            bivariant = saveBivariant;
          }
          applyToReturnTypes(source, target, inferFromTypes);
        }
        function inferFromIndexTypes(source, target) {
          var priority2 = ts2.getObjectFlags(source) & ts2.getObjectFlags(target) & 32 ? 8 : 0;
          var indexInfos = getIndexInfosOfType(target);
          if (isObjectTypeWithInferableIndex(source)) {
            for (var _i = 0, indexInfos_4 = indexInfos; _i < indexInfos_4.length; _i++) {
              var targetInfo = indexInfos_4[_i];
              var propTypes = [];
              for (var _a = 0, _b = getPropertiesOfType(source); _a < _b.length; _a++) {
                var prop = _b[_a];
                if (isApplicableIndexType(getLiteralTypeFromProperty(prop, 8576), targetInfo.keyType)) {
                  var propType = getTypeOfSymbol(prop);
                  propTypes.push(prop.flags & 16777216 ? removeMissingOrUndefinedType(propType) : propType);
                }
              }
              for (var _c = 0, _d = getIndexInfosOfType(source); _c < _d.length; _c++) {
                var info = _d[_c];
                if (isApplicableIndexType(info.keyType, targetInfo.keyType)) {
                  propTypes.push(info.type);
                }
              }
              if (propTypes.length) {
                inferWithPriority(getUnionType(propTypes), targetInfo.type, priority2);
              }
            }
          }
          for (var _e = 0, indexInfos_5 = indexInfos; _e < indexInfos_5.length; _e++) {
            var targetInfo = indexInfos_5[_e];
            var sourceInfo = getApplicableIndexInfo(source, targetInfo.keyType);
            if (sourceInfo) {
              inferWithPriority(sourceInfo.type, targetInfo.type, priority2);
            }
          }
        }
      }
      function isTypeOrBaseIdenticalTo(s, t) {
        return exactOptionalPropertyTypes && t === missingType ? s === t : isTypeIdenticalTo(s, t) || !!(t.flags & 4 && s.flags & 128 || t.flags & 8 && s.flags & 256);
      }
      function isTypeCloselyMatchedBy(s, t) {
        return !!(s.flags & 524288 && t.flags & 524288 && s.symbol && s.symbol === t.symbol || s.aliasSymbol && s.aliasTypeArguments && s.aliasSymbol === t.aliasSymbol);
      }
      function hasPrimitiveConstraint(type) {
        var constraint = getConstraintOfTypeParameter(type);
        return !!constraint && maybeTypeOfKind(constraint.flags & 16777216 ? getDefaultConstraintOfConditionalType(constraint) : constraint, 131068 | 4194304 | 134217728 | 268435456);
      }
      function isObjectLiteralType(type) {
        return !!(ts2.getObjectFlags(type) & 128);
      }
      function isObjectOrArrayLiteralType(type) {
        return !!(ts2.getObjectFlags(type) & (128 | 32768));
      }
      function unionObjectAndArrayLiteralCandidates(candidates) {
        if (candidates.length > 1) {
          var objectLiterals = ts2.filter(candidates, isObjectOrArrayLiteralType);
          if (objectLiterals.length) {
            var literalsType = getUnionType(objectLiterals, 2);
            return ts2.concatenate(ts2.filter(candidates, function(t) {
              return !isObjectOrArrayLiteralType(t);
            }), [literalsType]);
          }
        }
        return candidates;
      }
      function getContravariantInference(inference) {
        return inference.priority & 416 ? getIntersectionType(inference.contraCandidates) : getCommonSubtype(inference.contraCandidates);
      }
      function getCovariantInference(inference, signature) {
        var candidates = unionObjectAndArrayLiteralCandidates(inference.candidates);
        var primitiveConstraint = hasPrimitiveConstraint(inference.typeParameter);
        var widenLiteralTypes = !primitiveConstraint && inference.topLevel && (inference.isFixed || !isTypeParameterAtTopLevel(getReturnTypeOfSignature(signature), inference.typeParameter));
        var baseCandidates = primitiveConstraint ? ts2.sameMap(candidates, getRegularTypeOfLiteralType) : widenLiteralTypes ? ts2.sameMap(candidates, getWidenedLiteralType) : candidates;
        var unwidenedType = inference.priority & 416 ? getUnionType(baseCandidates, 2) : getCommonSupertype(baseCandidates);
        return getWidenedType(unwidenedType);
      }
      function getInferredType(context, index) {
        var inference = context.inferences[index];
        if (!inference.inferredType) {
          var inferredType = void 0;
          var signature = context.signature;
          if (signature) {
            var inferredCovariantType_1 = inference.candidates ? getCovariantInference(inference, signature) : void 0;
            if (inference.contraCandidates) {
              inferredType = inferredCovariantType_1 && !(inferredCovariantType_1.flags & 131072) && ts2.some(inference.contraCandidates, function(t) {
                return isTypeSubtypeOf(inferredCovariantType_1, t);
              }) ? inferredCovariantType_1 : getContravariantInference(inference);
            } else if (inferredCovariantType_1) {
              inferredType = inferredCovariantType_1;
            } else if (context.flags & 1) {
              inferredType = silentNeverType;
            } else {
              var defaultType = getDefaultFromTypeParameter(inference.typeParameter);
              if (defaultType) {
                inferredType = instantiateType(defaultType, mergeTypeMappers(createBackreferenceMapper(context, index), context.nonFixingMapper));
              }
            }
          } else {
            inferredType = getTypeFromInference(inference);
          }
          inference.inferredType = inferredType || getDefaultTypeArgumentType(!!(context.flags & 2));
          var constraint = getConstraintOfTypeParameter(inference.typeParameter);
          if (constraint) {
            var instantiatedConstraint = instantiateType(constraint, context.nonFixingMapper);
            if (!inferredType || !context.compareTypes(inferredType, getTypeWithThisArgument(instantiatedConstraint, inferredType))) {
              inference.inferredType = inferredType = instantiatedConstraint;
            }
          }
        }
        return inference.inferredType;
      }
      function getDefaultTypeArgumentType(isInJavaScriptFile) {
        return isInJavaScriptFile ? anyType : unknownType;
      }
      function getInferredTypes(context) {
        var result = [];
        for (var i = 0; i < context.inferences.length; i++) {
          result.push(getInferredType(context, i));
        }
        return result;
      }
      function getCannotFindNameDiagnosticForName(node) {
        switch (node.escapedText) {
          case "document":
          case "console":
            return ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_include_dom;
          case "$":
            return compilerOptions.types ? ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery_and_then_add_jquery_to_the_types_field_in_your_tsconfig : ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_jQuery_Try_npm_i_save_dev_types_Slashjquery;
          case "describe":
          case "suite":
          case "it":
          case "test":
            return compilerOptions.types ? ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha_and_then_add_jest_or_mocha_to_the_types_field_in_your_tsconfig : ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_a_test_runner_Try_npm_i_save_dev_types_Slashjest_or_npm_i_save_dev_types_Slashmocha;
          case "process":
          case "require":
          case "Buffer":
          case "module":
            return compilerOptions.types ? ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode_and_then_add_node_to_the_types_field_in_your_tsconfig : ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_install_type_definitions_for_node_Try_npm_i_save_dev_types_Slashnode;
          case "Map":
          case "Set":
          case "Promise":
          case "Symbol":
          case "WeakMap":
          case "WeakSet":
          case "Iterator":
          case "AsyncIterator":
          case "SharedArrayBuffer":
          case "Atomics":
          case "AsyncIterable":
          case "AsyncIterableIterator":
          case "AsyncGenerator":
          case "AsyncGeneratorFunction":
          case "BigInt":
          case "Reflect":
          case "BigInt64Array":
          case "BigUint64Array":
            return ts2.Diagnostics.Cannot_find_name_0_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_1_or_later;
          default:
            if (node.parent.kind === 295) {
              return ts2.Diagnostics.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer;
            } else {
              return ts2.Diagnostics.Cannot_find_name_0;
            }
        }
      }
      function getResolvedSymbol(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedSymbol) {
          links.resolvedSymbol = !ts2.nodeIsMissing(node) && resolveName(node, node.escapedText, 111551 | 1048576, getCannotFindNameDiagnosticForName(node), node, !ts2.isWriteOnlyAccess(node), false) || unknownSymbol;
        }
        return links.resolvedSymbol;
      }
      function isInTypeQuery(node) {
        return !!ts2.findAncestor(node, function(n) {
          return n.kind === 180 ? true : n.kind === 79 || n.kind === 160 ? false : "quit";
        });
      }
      function getFlowCacheKey(node, declaredType, initialType, flowContainer) {
        switch (node.kind) {
          case 79:
            if (!ts2.isThisInTypeQuery(node)) {
              var symbol = getResolvedSymbol(node);
              return symbol !== unknownSymbol ? "".concat(flowContainer ? getNodeId(flowContainer) : "-1", "|").concat(getTypeId(declaredType), "|").concat(getTypeId(initialType), "|").concat(getSymbolId(symbol)) : void 0;
            }
          case 108:
            return "0|".concat(flowContainer ? getNodeId(flowContainer) : "-1", "|").concat(getTypeId(declaredType), "|").concat(getTypeId(initialType));
          case 229:
          case 211:
            return getFlowCacheKey(node.expression, declaredType, initialType, flowContainer);
          case 160:
            var left = getFlowCacheKey(node.left, declaredType, initialType, flowContainer);
            return left && left + "." + node.right.escapedText;
          case 205:
          case 206:
            var propName = getAccessedPropertyName(node);
            if (propName !== void 0) {
              var key = getFlowCacheKey(node.expression, declaredType, initialType, flowContainer);
              return key && key + "." + propName;
            }
        }
        return void 0;
      }
      function isMatchingReference(source, target) {
        switch (target.kind) {
          case 211:
          case 229:
            return isMatchingReference(source, target.expression);
          case 220:
            return ts2.isAssignmentExpression(target) && isMatchingReference(source, target.left) || ts2.isBinaryExpression(target) && target.operatorToken.kind === 27 && isMatchingReference(source, target.right);
        }
        switch (source.kind) {
          case 230:
            return target.kind === 230 && source.keywordToken === target.keywordToken && source.name.escapedText === target.name.escapedText;
          case 79:
          case 80:
            return ts2.isThisInTypeQuery(source) ? target.kind === 108 : target.kind === 79 && getResolvedSymbol(source) === getResolvedSymbol(target) || (target.kind === 253 || target.kind === 202) && getExportSymbolOfValueSymbolIfExported(getResolvedSymbol(source)) === getSymbolOfNode(target);
          case 108:
            return target.kind === 108;
          case 106:
            return target.kind === 106;
          case 229:
          case 211:
            return isMatchingReference(source.expression, target);
          case 205:
          case 206:
            return ts2.isAccessExpression(target) && getAccessedPropertyName(source) === getAccessedPropertyName(target) && isMatchingReference(source.expression, target.expression);
          case 160:
            return ts2.isAccessExpression(target) && source.right.escapedText === getAccessedPropertyName(target) && isMatchingReference(source.left, target.expression);
          case 220:
            return ts2.isBinaryExpression(source) && source.operatorToken.kind === 27 && isMatchingReference(source.right, target);
        }
        return false;
      }
      function getPropertyAccess(expr) {
        if (ts2.isAccessExpression(expr)) {
          return expr;
        }
        if (ts2.isIdentifier(expr)) {
          var symbol = getResolvedSymbol(expr);
          if (isConstVariable(symbol)) {
            var declaration = symbol.valueDeclaration;
            if (ts2.isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && ts2.isAccessExpression(declaration.initializer)) {
              return declaration.initializer;
            }
            if (ts2.isBindingElement(declaration) && !declaration.initializer) {
              var parent = declaration.parent.parent;
              if (ts2.isVariableDeclaration(parent) && !parent.type && parent.initializer && (ts2.isIdentifier(parent.initializer) || ts2.isAccessExpression(parent.initializer))) {
                return declaration;
              }
            }
          }
        }
        return void 0;
      }
      function getAccessedPropertyName(access) {
        var propertyName;
        return access.kind === 205 ? access.name.escapedText : access.kind === 206 && ts2.isStringOrNumericLiteralLike(access.argumentExpression) ? ts2.escapeLeadingUnderscores(access.argumentExpression.text) : access.kind === 202 && (propertyName = getDestructuringPropertyName(access)) ? ts2.escapeLeadingUnderscores(propertyName) : void 0;
      }
      function containsMatchingReference(source, target) {
        while (ts2.isAccessExpression(source)) {
          source = source.expression;
          if (isMatchingReference(source, target)) {
            return true;
          }
        }
        return false;
      }
      function optionalChainContainsReference(source, target) {
        while (ts2.isOptionalChain(source)) {
          source = source.expression;
          if (isMatchingReference(source, target)) {
            return true;
          }
        }
        return false;
      }
      function isDiscriminantProperty(type, name) {
        if (type && type.flags & 1048576) {
          var prop = getUnionOrIntersectionProperty(type, name);
          if (prop && ts2.getCheckFlags(prop) & 2) {
            if (prop.isDiscriminantProperty === void 0) {
              prop.isDiscriminantProperty = (prop.checkFlags & 192) === 192 && !isGenericType(getTypeOfSymbol(prop));
            }
            return !!prop.isDiscriminantProperty;
          }
        }
        return false;
      }
      function findDiscriminantProperties(sourceProperties, target) {
        var result;
        for (var _i = 0, sourceProperties_2 = sourceProperties; _i < sourceProperties_2.length; _i++) {
          var sourceProperty = sourceProperties_2[_i];
          if (isDiscriminantProperty(target, sourceProperty.escapedName)) {
            if (result) {
              result.push(sourceProperty);
              continue;
            }
            result = [sourceProperty];
          }
        }
        return result;
      }
      function mapTypesByKeyProperty(types, name) {
        var map = new ts2.Map();
        var count = 0;
        var _loop_22 = function(type2) {
          if (type2.flags & (524288 | 2097152 | 58982400)) {
            var discriminant = getTypeOfPropertyOfType(type2, name);
            if (discriminant) {
              if (!isLiteralType(discriminant)) {
                return { value: void 0 };
              }
              var duplicate_1 = false;
              forEachType(discriminant, function(t) {
                var id = getTypeId(getRegularTypeOfLiteralType(t));
                var existing = map.get(id);
                if (!existing) {
                  map.set(id, type2);
                } else if (existing !== unknownType) {
                  map.set(id, unknownType);
                  duplicate_1 = true;
                }
              });
              if (!duplicate_1)
                count++;
            }
          }
        };
        for (var _i = 0, types_16 = types; _i < types_16.length; _i++) {
          var type = types_16[_i];
          var state_8 = _loop_22(type);
          if (typeof state_8 === "object")
            return state_8.value;
        }
        return count >= 10 && count * 2 >= types.length ? map : void 0;
      }
      function getKeyPropertyName(unionType) {
        var types = unionType.types;
        if (types.length < 10 || ts2.getObjectFlags(unionType) & 65536 || ts2.countWhere(types, function(t) {
          return !!(t.flags & (524288 | 58982400));
        }) < 10) {
          return void 0;
        }
        if (unionType.keyPropertyName === void 0) {
          var keyPropertyName = ts2.forEach(types, function(t) {
            return t.flags & (524288 | 58982400) ? ts2.forEach(getPropertiesOfType(t), function(p) {
              return isUnitType(getTypeOfSymbol(p)) ? p.escapedName : void 0;
            }) : void 0;
          });
          var mapByKeyProperty = keyPropertyName && mapTypesByKeyProperty(types, keyPropertyName);
          unionType.keyPropertyName = mapByKeyProperty ? keyPropertyName : "";
          unionType.constituentMap = mapByKeyProperty;
        }
        return unionType.keyPropertyName.length ? unionType.keyPropertyName : void 0;
      }
      function getConstituentTypeForKeyType(unionType, keyType) {
        var _a;
        var result = (_a = unionType.constituentMap) === null || _a === void 0 ? void 0 : _a.get(getTypeId(getRegularTypeOfLiteralType(keyType)));
        return result !== unknownType ? result : void 0;
      }
      function getMatchingUnionConstituentForType(unionType, type) {
        var keyPropertyName = getKeyPropertyName(unionType);
        var propType = keyPropertyName && getTypeOfPropertyOfType(type, keyPropertyName);
        return propType && getConstituentTypeForKeyType(unionType, propType);
      }
      function getMatchingUnionConstituentForObjectLiteral(unionType, node) {
        var keyPropertyName = getKeyPropertyName(unionType);
        var propNode = keyPropertyName && ts2.find(node.properties, function(p) {
          return p.symbol && p.kind === 294 && p.symbol.escapedName === keyPropertyName && isPossiblyDiscriminantValue(p.initializer);
        });
        var propType = propNode && getContextFreeTypeOfExpression(propNode.initializer);
        return propType && getConstituentTypeForKeyType(unionType, propType);
      }
      function isOrContainsMatchingReference(source, target) {
        return isMatchingReference(source, target) || containsMatchingReference(source, target);
      }
      function hasMatchingArgument(expression, reference) {
        if (expression.arguments) {
          for (var _i = 0, _a = expression.arguments; _i < _a.length; _i++) {
            var argument = _a[_i];
            if (isOrContainsMatchingReference(reference, argument)) {
              return true;
            }
          }
        }
        if (expression.expression.kind === 205 && isOrContainsMatchingReference(reference, expression.expression.expression)) {
          return true;
        }
        return false;
      }
      function getFlowNodeId(flow) {
        if (!flow.id || flow.id < 0) {
          flow.id = nextFlowId;
          nextFlowId++;
        }
        return flow.id;
      }
      function typeMaybeAssignableTo(source, target) {
        if (!(source.flags & 1048576)) {
          return isTypeAssignableTo(source, target);
        }
        for (var _i = 0, _a = source.types; _i < _a.length; _i++) {
          var t = _a[_i];
          if (isTypeAssignableTo(t, target)) {
            return true;
          }
        }
        return false;
      }
      function getAssignmentReducedType(declaredType, assignedType) {
        if (declaredType !== assignedType) {
          if (assignedType.flags & 131072) {
            return assignedType;
          }
          var reducedType = filterType(declaredType, function(t) {
            return typeMaybeAssignableTo(assignedType, t);
          });
          if (assignedType.flags & 512 && isFreshLiteralType(assignedType)) {
            reducedType = mapType(reducedType, getFreshTypeOfLiteralType);
          }
          if (isTypeAssignableTo(assignedType, reducedType)) {
            return reducedType;
          }
        }
        return declaredType;
      }
      function isFunctionObjectType(type) {
        var resolved = resolveStructuredTypeMembers(type);
        return !!(resolved.callSignatures.length || resolved.constructSignatures.length || resolved.members.get("bind") && isTypeSubtypeOf(type, globalFunctionType));
      }
      function getTypeFacts(type, ignoreObjects) {
        if (ignoreObjects === void 0) {
          ignoreObjects = false;
        }
        var flags = type.flags;
        if (flags & 4) {
          return strictNullChecks ? 16317953 : 16776705;
        }
        if (flags & 128) {
          var isEmpty = type.value === "";
          return strictNullChecks ? isEmpty ? 12123649 : 7929345 : isEmpty ? 12582401 : 16776705;
        }
        if (flags & (8 | 32)) {
          return strictNullChecks ? 16317698 : 16776450;
        }
        if (flags & 256) {
          var isZero = type.value === 0;
          return strictNullChecks ? isZero ? 12123394 : 7929090 : isZero ? 12582146 : 16776450;
        }
        if (flags & 64) {
          return strictNullChecks ? 16317188 : 16775940;
        }
        if (flags & 2048) {
          var isZero = isZeroBigInt(type);
          return strictNullChecks ? isZero ? 12122884 : 7928580 : isZero ? 12581636 : 16775940;
        }
        if (flags & 16) {
          return strictNullChecks ? 16316168 : 16774920;
        }
        if (flags & 528) {
          return strictNullChecks ? type === falseType || type === regularFalseType ? 12121864 : 7927560 : type === falseType || type === regularFalseType ? 12580616 : 16774920;
        }
        if (flags & 524288 && !ignoreObjects) {
          return ts2.getObjectFlags(type) & 16 && isEmptyObjectType(type) ? strictNullChecks ? 16318463 : 16777215 : isFunctionObjectType(type) ? strictNullChecks ? 7880640 : 16728e3 : strictNullChecks ? 7888800 : 16736160;
        }
        if (flags & (16384 | 32768)) {
          return 9830144;
        }
        if (flags & 65536) {
          return 9363232;
        }
        if (flags & 12288) {
          return strictNullChecks ? 7925520 : 16772880;
        }
        if (flags & 67108864) {
          return strictNullChecks ? 7888800 : 16736160;
        }
        if (flags & 131072) {
          return 0;
        }
        if (flags & 465829888) {
          return !isPatternLiteralType(type) ? getTypeFacts(getBaseConstraintOfType(type) || unknownType, ignoreObjects) : strictNullChecks ? 7929345 : 16776705;
        }
        if (flags & 1048576) {
          return ts2.reduceLeft(type.types, function(facts, t) {
            return facts | getTypeFacts(t, ignoreObjects);
          }, 0);
        }
        if (flags & 2097152) {
          ignoreObjects || (ignoreObjects = maybeTypeOfKind(type, 131068));
          return ts2.reduceLeft(type.types, function(facts, t) {
            return facts & getTypeFacts(t, ignoreObjects);
          }, 16777215);
        }
        return 16777215;
      }
      function getTypeWithFacts(type, include) {
        return filterType(type, function(t) {
          return (getTypeFacts(t) & include) !== 0;
        });
      }
      function getTypeWithDefault(type, defaultExpression) {
        return defaultExpression ? getUnionType([getNonUndefinedType(type), getTypeOfExpression(defaultExpression)]) : type;
      }
      function getTypeOfDestructuredProperty(type, name) {
        var _a;
        var nameType = getLiteralTypeFromPropertyName(name);
        if (!isTypeUsableAsPropertyName(nameType))
          return errorType;
        var text = getPropertyNameFromType(nameType);
        return getTypeOfPropertyOfType(type, text) || includeUndefinedInIndexSignature((_a = getApplicableIndexInfoForName(type, text)) === null || _a === void 0 ? void 0 : _a.type) || errorType;
      }
      function getTypeOfDestructuredArrayElement(type, index) {
        return everyType(type, isTupleLikeType) && getTupleElementType(type, index) || includeUndefinedInIndexSignature(checkIteratedTypeOrElementType(65, type, undefinedType, void 0)) || errorType;
      }
      function includeUndefinedInIndexSignature(type) {
        if (!type)
          return type;
        return compilerOptions.noUncheckedIndexedAccess ? getUnionType([type, undefinedType]) : type;
      }
      function getTypeOfDestructuredSpreadExpression(type) {
        return createArrayType(checkIteratedTypeOrElementType(65, type, undefinedType, void 0) || errorType);
      }
      function getAssignedTypeOfBinaryExpression(node) {
        var isDestructuringDefaultAssignment = node.parent.kind === 203 && isDestructuringAssignmentTarget(node.parent) || node.parent.kind === 294 && isDestructuringAssignmentTarget(node.parent.parent);
        return isDestructuringDefaultAssignment ? getTypeWithDefault(getAssignedType(node), node.right) : getTypeOfExpression(node.right);
      }
      function isDestructuringAssignmentTarget(parent) {
        return parent.parent.kind === 220 && parent.parent.left === parent || parent.parent.kind === 243 && parent.parent.initializer === parent;
      }
      function getAssignedTypeOfArrayLiteralElement(node, element) {
        return getTypeOfDestructuredArrayElement(getAssignedType(node), node.elements.indexOf(element));
      }
      function getAssignedTypeOfSpreadExpression(node) {
        return getTypeOfDestructuredSpreadExpression(getAssignedType(node.parent));
      }
      function getAssignedTypeOfPropertyAssignment(node) {
        return getTypeOfDestructuredProperty(getAssignedType(node.parent), node.name);
      }
      function getAssignedTypeOfShorthandPropertyAssignment(node) {
        return getTypeWithDefault(getAssignedTypeOfPropertyAssignment(node), node.objectAssignmentInitializer);
      }
      function getAssignedType(node) {
        var parent = node.parent;
        switch (parent.kind) {
          case 242:
            return stringType;
          case 243:
            return checkRightHandSideOfForOf(parent) || errorType;
          case 220:
            return getAssignedTypeOfBinaryExpression(parent);
          case 214:
            return undefinedType;
          case 203:
            return getAssignedTypeOfArrayLiteralElement(parent, node);
          case 224:
            return getAssignedTypeOfSpreadExpression(parent);
          case 294:
            return getAssignedTypeOfPropertyAssignment(parent);
          case 295:
            return getAssignedTypeOfShorthandPropertyAssignment(parent);
        }
        return errorType;
      }
      function getInitialTypeOfBindingElement(node) {
        var pattern = node.parent;
        var parentType = getInitialType(pattern.parent);
        var type = pattern.kind === 200 ? getTypeOfDestructuredProperty(parentType, node.propertyName || node.name) : !node.dotDotDotToken ? getTypeOfDestructuredArrayElement(parentType, pattern.elements.indexOf(node)) : getTypeOfDestructuredSpreadExpression(parentType);
        return getTypeWithDefault(type, node.initializer);
      }
      function getTypeOfInitializer(node) {
        var links = getNodeLinks(node);
        return links.resolvedType || getTypeOfExpression(node);
      }
      function getInitialTypeOfVariableDeclaration(node) {
        if (node.initializer) {
          return getTypeOfInitializer(node.initializer);
        }
        if (node.parent.parent.kind === 242) {
          return stringType;
        }
        if (node.parent.parent.kind === 243) {
          return checkRightHandSideOfForOf(node.parent.parent) || errorType;
        }
        return errorType;
      }
      function getInitialType(node) {
        return node.kind === 253 ? getInitialTypeOfVariableDeclaration(node) : getInitialTypeOfBindingElement(node);
      }
      function isEmptyArrayAssignment(node) {
        return node.kind === 253 && node.initializer && isEmptyArrayLiteral(node.initializer) || node.kind !== 202 && node.parent.kind === 220 && isEmptyArrayLiteral(node.parent.right);
      }
      function getReferenceCandidate(node) {
        switch (node.kind) {
          case 211:
            return getReferenceCandidate(node.expression);
          case 220:
            switch (node.operatorToken.kind) {
              case 63:
              case 75:
              case 76:
              case 77:
                return getReferenceCandidate(node.left);
              case 27:
                return getReferenceCandidate(node.right);
            }
        }
        return node;
      }
      function getReferenceRoot(node) {
        var parent = node.parent;
        return parent.kind === 211 || parent.kind === 220 && parent.operatorToken.kind === 63 && parent.left === node || parent.kind === 220 && parent.operatorToken.kind === 27 && parent.right === node ? getReferenceRoot(parent) : node;
      }
      function getTypeOfSwitchClause(clause) {
        if (clause.kind === 288) {
          return getRegularTypeOfLiteralType(getTypeOfExpression(clause.expression));
        }
        return neverType;
      }
      function getSwitchClauseTypes(switchStatement) {
        var links = getNodeLinks(switchStatement);
        if (!links.switchTypes) {
          links.switchTypes = [];
          for (var _i = 0, _a = switchStatement.caseBlock.clauses; _i < _a.length; _i++) {
            var clause = _a[_i];
            links.switchTypes.push(getTypeOfSwitchClause(clause));
          }
        }
        return links.switchTypes;
      }
      function getSwitchClauseTypeOfWitnesses(switchStatement, retainDefault) {
        var witnesses = [];
        for (var _i = 0, _a = switchStatement.caseBlock.clauses; _i < _a.length; _i++) {
          var clause = _a[_i];
          if (clause.kind === 288) {
            if (ts2.isStringLiteralLike(clause.expression)) {
              witnesses.push(clause.expression.text);
              continue;
            }
            return ts2.emptyArray;
          }
          if (retainDefault)
            witnesses.push(void 0);
        }
        return witnesses;
      }
      function eachTypeContainedIn(source, types) {
        return source.flags & 1048576 ? !ts2.forEach(source.types, function(t) {
          return !ts2.contains(types, t);
        }) : ts2.contains(types, source);
      }
      function isTypeSubsetOf(source, target) {
        return source === target || target.flags & 1048576 && isTypeSubsetOfUnion(source, target);
      }
      function isTypeSubsetOfUnion(source, target) {
        if (source.flags & 1048576) {
          for (var _i = 0, _a = source.types; _i < _a.length; _i++) {
            var t = _a[_i];
            if (!containsType(target.types, t)) {
              return false;
            }
          }
          return true;
        }
        if (source.flags & 1024 && getBaseTypeOfEnumLiteralType(source) === target) {
          return true;
        }
        return containsType(target.types, source);
      }
      function forEachType(type, f) {
        return type.flags & 1048576 ? ts2.forEach(type.types, f) : f(type);
      }
      function someType(type, f) {
        return type.flags & 1048576 ? ts2.some(type.types, f) : f(type);
      }
      function everyType(type, f) {
        return type.flags & 1048576 ? ts2.every(type.types, f) : f(type);
      }
      function everyContainedType(type, f) {
        return type.flags & 3145728 ? ts2.every(type.types, f) : f(type);
      }
      function filterType(type, f) {
        if (type.flags & 1048576) {
          var types = type.types;
          var filtered = ts2.filter(types, f);
          if (filtered === types) {
            return type;
          }
          var origin = type.origin;
          var newOrigin = void 0;
          if (origin && origin.flags & 1048576) {
            var originTypes = origin.types;
            var originFiltered = ts2.filter(originTypes, function(t) {
              return !!(t.flags & 1048576) || f(t);
            });
            if (originTypes.length - originFiltered.length === types.length - filtered.length) {
              if (originFiltered.length === 1) {
                return originFiltered[0];
              }
              newOrigin = createOriginUnionOrIntersectionType(1048576, originFiltered);
            }
          }
          return getUnionTypeFromSortedList(filtered, type.objectFlags, void 0, void 0, newOrigin);
        }
        return type.flags & 131072 || f(type) ? type : neverType;
      }
      function removeType(type, targetType) {
        return filterType(type, function(t) {
          return t !== targetType;
        });
      }
      function countTypes(type) {
        return type.flags & 1048576 ? type.types.length : 1;
      }
      function mapType(type, mapper, noReductions) {
        if (type.flags & 131072) {
          return type;
        }
        if (!(type.flags & 1048576)) {
          return mapper(type);
        }
        var origin = type.origin;
        var types = origin && origin.flags & 1048576 ? origin.types : type.types;
        var mappedTypes;
        var changed = false;
        for (var _i = 0, types_17 = types; _i < types_17.length; _i++) {
          var t = types_17[_i];
          var mapped = t.flags & 1048576 ? mapType(t, mapper, noReductions) : mapper(t);
          changed || (changed = t !== mapped);
          if (mapped) {
            if (!mappedTypes) {
              mappedTypes = [mapped];
            } else {
              mappedTypes.push(mapped);
            }
          }
        }
        return changed ? mappedTypes && getUnionType(mappedTypes, noReductions ? 0 : 1) : type;
      }
      function mapTypeWithAlias(type, mapper, aliasSymbol, aliasTypeArguments) {
        return type.flags & 1048576 && aliasSymbol ? getUnionType(ts2.map(type.types, mapper), 1, aliasSymbol, aliasTypeArguments) : mapType(type, mapper);
      }
      function getConstituentCount(type) {
        return type.flags & 1048576 ? type.types.length : 1;
      }
      function extractTypesOfKind(type, kind) {
        return filterType(type, function(t) {
          return (t.flags & kind) !== 0;
        });
      }
      function replacePrimitivesWithLiterals(typeWithPrimitives, typeWithLiterals) {
        if (maybeTypeOfKind(typeWithPrimitives, 4 | 134217728 | 8 | 64) && maybeTypeOfKind(typeWithLiterals, 128 | 134217728 | 268435456 | 256 | 2048)) {
          return mapType(typeWithPrimitives, function(t) {
            return t.flags & 4 ? extractTypesOfKind(typeWithLiterals, 4 | 128 | 134217728 | 268435456) : isPatternLiteralType(t) && !maybeTypeOfKind(typeWithLiterals, 4 | 134217728 | 268435456) ? extractTypesOfKind(typeWithLiterals, 128) : t.flags & 8 ? extractTypesOfKind(typeWithLiterals, 8 | 256) : t.flags & 64 ? extractTypesOfKind(typeWithLiterals, 64 | 2048) : t;
          });
        }
        return typeWithPrimitives;
      }
      function isIncomplete(flowType) {
        return flowType.flags === 0;
      }
      function getTypeFromFlowType(flowType) {
        return flowType.flags === 0 ? flowType.type : flowType;
      }
      function createFlowType(type, incomplete) {
        return incomplete ? { flags: 0, type: type.flags & 131072 ? silentNeverType : type } : type;
      }
      function createEvolvingArrayType(elementType) {
        var result = createObjectType(256);
        result.elementType = elementType;
        return result;
      }
      function getEvolvingArrayType(elementType) {
        return evolvingArrayTypes[elementType.id] || (evolvingArrayTypes[elementType.id] = createEvolvingArrayType(elementType));
      }
      function addEvolvingArrayElementType(evolvingArrayType, node) {
        var elementType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(getContextFreeTypeOfExpression(node)));
        return isTypeSubsetOf(elementType, evolvingArrayType.elementType) ? evolvingArrayType : getEvolvingArrayType(getUnionType([evolvingArrayType.elementType, elementType]));
      }
      function createFinalArrayType(elementType) {
        return elementType.flags & 131072 ? autoArrayType : createArrayType(elementType.flags & 1048576 ? getUnionType(elementType.types, 2) : elementType);
      }
      function getFinalArrayType(evolvingArrayType) {
        return evolvingArrayType.finalArrayType || (evolvingArrayType.finalArrayType = createFinalArrayType(evolvingArrayType.elementType));
      }
      function finalizeEvolvingArrayType(type) {
        return ts2.getObjectFlags(type) & 256 ? getFinalArrayType(type) : type;
      }
      function getElementTypeOfEvolvingArrayType(type) {
        return ts2.getObjectFlags(type) & 256 ? type.elementType : neverType;
      }
      function isEvolvingArrayTypeList(types) {
        var hasEvolvingArrayType = false;
        for (var _i = 0, types_18 = types; _i < types_18.length; _i++) {
          var t = types_18[_i];
          if (!(t.flags & 131072)) {
            if (!(ts2.getObjectFlags(t) & 256)) {
              return false;
            }
            hasEvolvingArrayType = true;
          }
        }
        return hasEvolvingArrayType;
      }
      function isEvolvingArrayOperationTarget(node) {
        var root = getReferenceRoot(node);
        var parent = root.parent;
        var isLengthPushOrUnshift = ts2.isPropertyAccessExpression(parent) && (parent.name.escapedText === "length" || parent.parent.kind === 207 && ts2.isIdentifier(parent.name) && ts2.isPushOrUnshiftIdentifier(parent.name));
        var isElementAssignment = parent.kind === 206 && parent.expression === root && parent.parent.kind === 220 && parent.parent.operatorToken.kind === 63 && parent.parent.left === parent && !ts2.isAssignmentTarget(parent.parent) && isTypeAssignableToKind(getTypeOfExpression(parent.argumentExpression), 296);
        return isLengthPushOrUnshift || isElementAssignment;
      }
      function isDeclarationWithExplicitTypeAnnotation(node) {
        return (ts2.isVariableDeclaration(node) || ts2.isPropertyDeclaration(node) || ts2.isPropertySignature(node) || ts2.isParameter(node)) && !!(ts2.getEffectiveTypeAnnotationNode(node) || ts2.isInJSFile(node) && ts2.hasInitializer(node) && node.initializer && ts2.isFunctionExpressionOrArrowFunction(node.initializer) && ts2.getEffectiveReturnTypeNode(node.initializer));
      }
      function getExplicitTypeOfSymbol(symbol, diagnostic) {
        if (symbol.flags & (16 | 8192 | 32 | 512)) {
          return getTypeOfSymbol(symbol);
        }
        if (symbol.flags & (3 | 4)) {
          if (ts2.getCheckFlags(symbol) & 262144) {
            var origin = symbol.syntheticOrigin;
            if (origin && getExplicitTypeOfSymbol(origin)) {
              return getTypeOfSymbol(symbol);
            }
          }
          var declaration = symbol.valueDeclaration;
          if (declaration) {
            if (isDeclarationWithExplicitTypeAnnotation(declaration)) {
              return getTypeOfSymbol(symbol);
            }
            if (ts2.isVariableDeclaration(declaration) && declaration.parent.parent.kind === 243) {
              var statement = declaration.parent.parent;
              var expressionType = getTypeOfDottedName(statement.expression, void 0);
              if (expressionType) {
                var use = statement.awaitModifier ? 15 : 13;
                return checkIteratedTypeOrElementType(use, expressionType, undefinedType, void 0);
              }
            }
            if (diagnostic) {
              ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(declaration, ts2.Diagnostics._0_needs_an_explicit_type_annotation, symbolToString(symbol)));
            }
          }
        }
      }
      function getTypeOfDottedName(node, diagnostic) {
        if (!(node.flags & 16777216)) {
          switch (node.kind) {
            case 79:
              var symbol = getExportSymbolOfValueSymbolIfExported(getResolvedSymbol(node));
              return getExplicitTypeOfSymbol(symbol.flags & 2097152 ? resolveAlias(symbol) : symbol, diagnostic);
            case 108:
              return getExplicitThisType(node);
            case 106:
              return checkSuperExpression(node);
            case 205: {
              var type = getTypeOfDottedName(node.expression, diagnostic);
              if (type) {
                var name = node.name;
                var prop = void 0;
                if (ts2.isPrivateIdentifier(name)) {
                  if (!type.symbol) {
                    return void 0;
                  }
                  prop = getPropertyOfType(type, ts2.getSymbolNameForPrivateIdentifier(type.symbol, name.escapedText));
                } else {
                  prop = getPropertyOfType(type, name.escapedText);
                }
                return prop && getExplicitTypeOfSymbol(prop, diagnostic);
              }
              return void 0;
            }
            case 211:
              return getTypeOfDottedName(node.expression, diagnostic);
          }
        }
      }
      function getEffectsSignature(node) {
        var links = getNodeLinks(node);
        var signature = links.effectsSignature;
        if (signature === void 0) {
          var funcType = void 0;
          if (node.parent.kind === 237) {
            funcType = getTypeOfDottedName(node.expression, void 0);
          } else if (node.expression.kind !== 106) {
            if (ts2.isOptionalChain(node)) {
              funcType = checkNonNullType(getOptionalExpressionType(checkExpression(node.expression), node.expression), node.expression);
            } else {
              funcType = checkNonNullExpression(node.expression);
            }
          }
          var signatures = getSignaturesOfType(funcType && getApparentType(funcType) || unknownType, 0);
          var candidate = signatures.length === 1 && !signatures[0].typeParameters ? signatures[0] : ts2.some(signatures, hasTypePredicateOrNeverReturnType) ? getResolvedSignature(node) : void 0;
          signature = links.effectsSignature = candidate && hasTypePredicateOrNeverReturnType(candidate) ? candidate : unknownSignature;
        }
        return signature === unknownSignature ? void 0 : signature;
      }
      function hasTypePredicateOrNeverReturnType(signature) {
        return !!(getTypePredicateOfSignature(signature) || signature.declaration && (getReturnTypeFromAnnotation(signature.declaration) || unknownType).flags & 131072);
      }
      function getTypePredicateArgument(predicate, callExpression) {
        if (predicate.kind === 1 || predicate.kind === 3) {
          return callExpression.arguments[predicate.parameterIndex];
        }
        var invokedExpression = ts2.skipParentheses(callExpression.expression);
        return ts2.isAccessExpression(invokedExpression) ? ts2.skipParentheses(invokedExpression.expression) : void 0;
      }
      function reportFlowControlError(node) {
        var block = ts2.findAncestor(node, ts2.isFunctionOrModuleBlock);
        var sourceFile = ts2.getSourceFileOfNode(node);
        var span = ts2.getSpanOfTokenAtPosition(sourceFile, block.statements.pos);
        diagnostics.add(ts2.createFileDiagnostic(sourceFile, span.start, span.length, ts2.Diagnostics.The_containing_function_or_module_body_is_too_large_for_control_flow_analysis));
      }
      function isReachableFlowNode(flow) {
        var result = isReachableFlowNodeWorker(flow, false);
        lastFlowNode = flow;
        lastFlowNodeReachable = result;
        return result;
      }
      function isFalseExpression(expr) {
        var node = ts2.skipParentheses(expr, true);
        return node.kind === 95 || node.kind === 220 && (node.operatorToken.kind === 55 && (isFalseExpression(node.left) || isFalseExpression(node.right)) || node.operatorToken.kind === 56 && isFalseExpression(node.left) && isFalseExpression(node.right));
      }
      function isReachableFlowNodeWorker(flow, noCacheCheck) {
        while (true) {
          if (flow === lastFlowNode) {
            return lastFlowNodeReachable;
          }
          var flags = flow.flags;
          if (flags & 4096) {
            if (!noCacheCheck) {
              var id = getFlowNodeId(flow);
              var reachable = flowNodeReachable[id];
              return reachable !== void 0 ? reachable : flowNodeReachable[id] = isReachableFlowNodeWorker(flow, true);
            }
            noCacheCheck = false;
          }
          if (flags & (16 | 96 | 256)) {
            flow = flow.antecedent;
          } else if (flags & 512) {
            var signature = getEffectsSignature(flow.node);
            if (signature) {
              var predicate = getTypePredicateOfSignature(signature);
              if (predicate && predicate.kind === 3 && !predicate.type) {
                var predicateArgument = flow.node.arguments[predicate.parameterIndex];
                if (predicateArgument && isFalseExpression(predicateArgument)) {
                  return false;
                }
              }
              if (getReturnTypeOfSignature(signature).flags & 131072) {
                return false;
              }
            }
            flow = flow.antecedent;
          } else if (flags & 4) {
            return ts2.some(flow.antecedents, function(f) {
              return isReachableFlowNodeWorker(f, false);
            });
          } else if (flags & 8) {
            var antecedents = flow.antecedents;
            if (antecedents === void 0 || antecedents.length === 0) {
              return false;
            }
            flow = antecedents[0];
          } else if (flags & 128) {
            if (flow.clauseStart === flow.clauseEnd && isExhaustiveSwitchStatement(flow.switchStatement)) {
              return false;
            }
            flow = flow.antecedent;
          } else if (flags & 1024) {
            lastFlowNode = void 0;
            var target = flow.target;
            var saveAntecedents = target.antecedents;
            target.antecedents = flow.antecedents;
            var result = isReachableFlowNodeWorker(flow.antecedent, false);
            target.antecedents = saveAntecedents;
            return result;
          } else {
            return !(flags & 1);
          }
        }
      }
      function isPostSuperFlowNode(flow, noCacheCheck) {
        while (true) {
          var flags = flow.flags;
          if (flags & 4096) {
            if (!noCacheCheck) {
              var id = getFlowNodeId(flow);
              var postSuper = flowNodePostSuper[id];
              return postSuper !== void 0 ? postSuper : flowNodePostSuper[id] = isPostSuperFlowNode(flow, true);
            }
            noCacheCheck = false;
          }
          if (flags & (16 | 96 | 256 | 128)) {
            flow = flow.antecedent;
          } else if (flags & 512) {
            if (flow.node.expression.kind === 106) {
              return true;
            }
            flow = flow.antecedent;
          } else if (flags & 4) {
            return ts2.every(flow.antecedents, function(f) {
              return isPostSuperFlowNode(f, false);
            });
          } else if (flags & 8) {
            flow = flow.antecedents[0];
          } else if (flags & 1024) {
            var target = flow.target;
            var saveAntecedents = target.antecedents;
            target.antecedents = flow.antecedents;
            var result = isPostSuperFlowNode(flow.antecedent, false);
            target.antecedents = saveAntecedents;
            return result;
          } else {
            return !!(flags & 1);
          }
        }
      }
      function isConstantReference(node) {
        switch (node.kind) {
          case 79: {
            var symbol = getResolvedSymbol(node);
            return isConstVariable(symbol) || ts2.isParameterOrCatchClauseVariable(symbol) && !isSymbolAssigned(symbol);
          }
          case 205:
          case 206:
            return isConstantReference(node.expression) && isReadonlySymbol(getNodeLinks(node).resolvedSymbol || unknownSymbol);
        }
        return false;
      }
      function getFlowTypeOfReference(reference, declaredType, initialType, flowContainer) {
        if (initialType === void 0) {
          initialType = declaredType;
        }
        var key;
        var isKeySet = false;
        var flowDepth = 0;
        if (flowAnalysisDisabled) {
          return errorType;
        }
        if (!reference.flowNode) {
          return declaredType;
        }
        flowInvocationCount++;
        var sharedFlowStart = sharedFlowCount;
        var evolvedType = getTypeFromFlowType(getTypeAtFlowNode(reference.flowNode));
        sharedFlowCount = sharedFlowStart;
        var resultType = ts2.getObjectFlags(evolvedType) & 256 && isEvolvingArrayOperationTarget(reference) ? autoArrayType : finalizeEvolvingArrayType(evolvedType);
        if (resultType === unreachableNeverType || reference.parent && reference.parent.kind === 229 && !(resultType.flags & 131072) && getTypeWithFacts(resultType, 2097152).flags & 131072) {
          return declaredType;
        }
        return resultType === nonNullUnknownType ? unknownType : resultType;
        function getOrSetCacheKey() {
          if (isKeySet) {
            return key;
          }
          isKeySet = true;
          return key = getFlowCacheKey(reference, declaredType, initialType, flowContainer);
        }
        function getTypeAtFlowNode(flow) {
          if (flowDepth === 2e3) {
            ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("checkTypes", "getTypeAtFlowNode_DepthLimit", { flowId: flow.id });
            flowAnalysisDisabled = true;
            reportFlowControlError(reference);
            return errorType;
          }
          flowDepth++;
          var sharedFlow;
          while (true) {
            var flags = flow.flags;
            if (flags & 4096) {
              for (var i = sharedFlowStart; i < sharedFlowCount; i++) {
                if (sharedFlowNodes[i] === flow) {
                  flowDepth--;
                  return sharedFlowTypes[i];
                }
              }
              sharedFlow = flow;
            }
            var type = void 0;
            if (flags & 16) {
              type = getTypeAtFlowAssignment(flow);
              if (!type) {
                flow = flow.antecedent;
                continue;
              }
            } else if (flags & 512) {
              type = getTypeAtFlowCall(flow);
              if (!type) {
                flow = flow.antecedent;
                continue;
              }
            } else if (flags & 96) {
              type = getTypeAtFlowCondition(flow);
            } else if (flags & 128) {
              type = getTypeAtSwitchClause(flow);
            } else if (flags & 12) {
              if (flow.antecedents.length === 1) {
                flow = flow.antecedents[0];
                continue;
              }
              type = flags & 4 ? getTypeAtFlowBranchLabel(flow) : getTypeAtFlowLoopLabel(flow);
            } else if (flags & 256) {
              type = getTypeAtFlowArrayMutation(flow);
              if (!type) {
                flow = flow.antecedent;
                continue;
              }
            } else if (flags & 1024) {
              var target = flow.target;
              var saveAntecedents = target.antecedents;
              target.antecedents = flow.antecedents;
              type = getTypeAtFlowNode(flow.antecedent);
              target.antecedents = saveAntecedents;
            } else if (flags & 2) {
              var container = flow.node;
              if (container && container !== flowContainer && reference.kind !== 205 && reference.kind !== 206 && reference.kind !== 108) {
                flow = container.flowNode;
                continue;
              }
              type = initialType;
            } else {
              type = convertAutoToAny(declaredType);
            }
            if (sharedFlow) {
              sharedFlowNodes[sharedFlowCount] = sharedFlow;
              sharedFlowTypes[sharedFlowCount] = type;
              sharedFlowCount++;
            }
            flowDepth--;
            return type;
          }
        }
        function getInitialOrAssignedType(flow) {
          var node = flow.node;
          return getNarrowableTypeForReference(node.kind === 253 || node.kind === 202 ? getInitialType(node) : getAssignedType(node), reference);
        }
        function getTypeAtFlowAssignment(flow) {
          var node = flow.node;
          if (isMatchingReference(reference, node)) {
            if (!isReachableFlowNode(flow)) {
              return unreachableNeverType;
            }
            if (ts2.getAssignmentTargetKind(node) === 2) {
              var flowType = getTypeAtFlowNode(flow.antecedent);
              return createFlowType(getBaseTypeOfLiteralType(getTypeFromFlowType(flowType)), isIncomplete(flowType));
            }
            if (declaredType === autoType || declaredType === autoArrayType) {
              if (isEmptyArrayAssignment(node)) {
                return getEvolvingArrayType(neverType);
              }
              var assignedType = getWidenedLiteralType(getInitialOrAssignedType(flow));
              return isTypeAssignableTo(assignedType, declaredType) ? assignedType : anyArrayType;
            }
            if (declaredType.flags & 1048576) {
              return getAssignmentReducedType(declaredType, getInitialOrAssignedType(flow));
            }
            return declaredType;
          }
          if (containsMatchingReference(reference, node)) {
            if (!isReachableFlowNode(flow)) {
              return unreachableNeverType;
            }
            if (ts2.isVariableDeclaration(node) && (ts2.isInJSFile(node) || ts2.isVarConst(node))) {
              var init = ts2.getDeclaredExpandoInitializer(node);
              if (init && (init.kind === 212 || init.kind === 213)) {
                return getTypeAtFlowNode(flow.antecedent);
              }
            }
            return declaredType;
          }
          if (ts2.isVariableDeclaration(node) && node.parent.parent.kind === 242 && isMatchingReference(reference, node.parent.parent.expression)) {
            return getNonNullableTypeIfNeeded(getTypeFromFlowType(getTypeAtFlowNode(flow.antecedent)));
          }
          return void 0;
        }
        function narrowTypeByAssertion(type, expr) {
          var node = ts2.skipParentheses(expr, true);
          if (node.kind === 95) {
            return unreachableNeverType;
          }
          if (node.kind === 220) {
            if (node.operatorToken.kind === 55) {
              return narrowTypeByAssertion(narrowTypeByAssertion(type, node.left), node.right);
            }
            if (node.operatorToken.kind === 56) {
              return getUnionType([narrowTypeByAssertion(type, node.left), narrowTypeByAssertion(type, node.right)]);
            }
          }
          return narrowType(type, node, true);
        }
        function getTypeAtFlowCall(flow) {
          var signature = getEffectsSignature(flow.node);
          if (signature) {
            var predicate = getTypePredicateOfSignature(signature);
            if (predicate && (predicate.kind === 2 || predicate.kind === 3)) {
              var flowType = getTypeAtFlowNode(flow.antecedent);
              var type = finalizeEvolvingArrayType(getTypeFromFlowType(flowType));
              var narrowedType = predicate.type ? narrowTypeByTypePredicate(type, predicate, flow.node, true) : predicate.kind === 3 && predicate.parameterIndex >= 0 && predicate.parameterIndex < flow.node.arguments.length ? narrowTypeByAssertion(type, flow.node.arguments[predicate.parameterIndex]) : type;
              return narrowedType === type ? flowType : createFlowType(narrowedType, isIncomplete(flowType));
            }
            if (getReturnTypeOfSignature(signature).flags & 131072) {
              return unreachableNeverType;
            }
          }
          return void 0;
        }
        function getTypeAtFlowArrayMutation(flow) {
          if (declaredType === autoType || declaredType === autoArrayType) {
            var node = flow.node;
            var expr = node.kind === 207 ? node.expression.expression : node.left.expression;
            if (isMatchingReference(reference, getReferenceCandidate(expr))) {
              var flowType = getTypeAtFlowNode(flow.antecedent);
              var type = getTypeFromFlowType(flowType);
              if (ts2.getObjectFlags(type) & 256) {
                var evolvedType_1 = type;
                if (node.kind === 207) {
                  for (var _i = 0, _a = node.arguments; _i < _a.length; _i++) {
                    var arg = _a[_i];
                    evolvedType_1 = addEvolvingArrayElementType(evolvedType_1, arg);
                  }
                } else {
                  var indexType = getContextFreeTypeOfExpression(node.left.argumentExpression);
                  if (isTypeAssignableToKind(indexType, 296)) {
                    evolvedType_1 = addEvolvingArrayElementType(evolvedType_1, node.right);
                  }
                }
                return evolvedType_1 === type ? flowType : createFlowType(evolvedType_1, isIncomplete(flowType));
              }
              return flowType;
            }
          }
          return void 0;
        }
        function getTypeAtFlowCondition(flow) {
          var flowType = getTypeAtFlowNode(flow.antecedent);
          var type = getTypeFromFlowType(flowType);
          if (type.flags & 131072) {
            return flowType;
          }
          var assumeTrue = (flow.flags & 32) !== 0;
          var nonEvolvingType = finalizeEvolvingArrayType(type);
          var narrowedType = narrowType(nonEvolvingType, flow.node, assumeTrue);
          if (narrowedType === nonEvolvingType) {
            return flowType;
          }
          return createFlowType(narrowedType, isIncomplete(flowType));
        }
        function getTypeAtSwitchClause(flow) {
          var expr = flow.switchStatement.expression;
          var flowType = getTypeAtFlowNode(flow.antecedent);
          var type = getTypeFromFlowType(flowType);
          if (isMatchingReference(reference, expr)) {
            type = narrowTypeBySwitchOnDiscriminant(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd);
          } else if (expr.kind === 215 && isMatchingReference(reference, expr.expression)) {
            type = narrowBySwitchOnTypeOf(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd);
          } else {
            if (strictNullChecks) {
              if (optionalChainContainsReference(expr, reference)) {
                type = narrowTypeBySwitchOptionalChainContainment(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd, function(t) {
                  return !(t.flags & (32768 | 131072));
                });
              } else if (expr.kind === 215 && optionalChainContainsReference(expr.expression, reference)) {
                type = narrowTypeBySwitchOptionalChainContainment(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd, function(t) {
                  return !(t.flags & 131072 || t.flags & 128 && t.value === "undefined");
                });
              }
            }
            var access = getDiscriminantPropertyAccess(expr, type);
            if (access) {
              type = narrowTypeBySwitchOnDiscriminantProperty(type, access, flow.switchStatement, flow.clauseStart, flow.clauseEnd);
            }
          }
          return createFlowType(type, isIncomplete(flowType));
        }
        function getTypeAtFlowBranchLabel(flow) {
          var antecedentTypes = [];
          var subtypeReduction = false;
          var seenIncomplete = false;
          var bypassFlow;
          for (var _i = 0, _a = flow.antecedents; _i < _a.length; _i++) {
            var antecedent = _a[_i];
            if (!bypassFlow && antecedent.flags & 128 && antecedent.clauseStart === antecedent.clauseEnd) {
              bypassFlow = antecedent;
              continue;
            }
            var flowType = getTypeAtFlowNode(antecedent);
            var type = getTypeFromFlowType(flowType);
            if (type === declaredType && declaredType === initialType) {
              return type;
            }
            ts2.pushIfUnique(antecedentTypes, type);
            if (!isTypeSubsetOf(type, declaredType)) {
              subtypeReduction = true;
            }
            if (isIncomplete(flowType)) {
              seenIncomplete = true;
            }
          }
          if (bypassFlow) {
            var flowType = getTypeAtFlowNode(bypassFlow);
            var type = getTypeFromFlowType(flowType);
            if (!ts2.contains(antecedentTypes, type) && !isExhaustiveSwitchStatement(bypassFlow.switchStatement)) {
              if (type === declaredType && declaredType === initialType) {
                return type;
              }
              antecedentTypes.push(type);
              if (!isTypeSubsetOf(type, declaredType)) {
                subtypeReduction = true;
              }
              if (isIncomplete(flowType)) {
                seenIncomplete = true;
              }
            }
          }
          return createFlowType(getUnionOrEvolvingArrayType(antecedentTypes, subtypeReduction ? 2 : 1), seenIncomplete);
        }
        function getTypeAtFlowLoopLabel(flow) {
          var id = getFlowNodeId(flow);
          var cache = flowLoopCaches[id] || (flowLoopCaches[id] = new ts2.Map());
          var key2 = getOrSetCacheKey();
          if (!key2) {
            return declaredType;
          }
          var cached = cache.get(key2);
          if (cached) {
            return cached;
          }
          for (var i = flowLoopStart; i < flowLoopCount; i++) {
            if (flowLoopNodes[i] === flow && flowLoopKeys[i] === key2 && flowLoopTypes[i].length) {
              return createFlowType(getUnionOrEvolvingArrayType(flowLoopTypes[i], 1), true);
            }
          }
          var antecedentTypes = [];
          var subtypeReduction = false;
          var firstAntecedentType;
          for (var _i = 0, _a = flow.antecedents; _i < _a.length; _i++) {
            var antecedent = _a[_i];
            var flowType = void 0;
            if (!firstAntecedentType) {
              flowType = firstAntecedentType = getTypeAtFlowNode(antecedent);
            } else {
              flowLoopNodes[flowLoopCount] = flow;
              flowLoopKeys[flowLoopCount] = key2;
              flowLoopTypes[flowLoopCount] = antecedentTypes;
              flowLoopCount++;
              var saveFlowTypeCache = flowTypeCache;
              flowTypeCache = void 0;
              flowType = getTypeAtFlowNode(antecedent);
              flowTypeCache = saveFlowTypeCache;
              flowLoopCount--;
              var cached_1 = cache.get(key2);
              if (cached_1) {
                return cached_1;
              }
            }
            var type = getTypeFromFlowType(flowType);
            ts2.pushIfUnique(antecedentTypes, type);
            if (!isTypeSubsetOf(type, declaredType)) {
              subtypeReduction = true;
            }
            if (type === declaredType) {
              break;
            }
          }
          var result = getUnionOrEvolvingArrayType(antecedentTypes, subtypeReduction ? 2 : 1);
          if (isIncomplete(firstAntecedentType)) {
            return createFlowType(result, true);
          }
          cache.set(key2, result);
          return result;
        }
        function getUnionOrEvolvingArrayType(types, subtypeReduction) {
          if (isEvolvingArrayTypeList(types)) {
            return getEvolvingArrayType(getUnionType(ts2.map(types, getElementTypeOfEvolvingArrayType)));
          }
          var result = getUnionType(ts2.sameMap(types, finalizeEvolvingArrayType), subtypeReduction);
          if (result !== declaredType && result.flags & declaredType.flags & 1048576 && ts2.arraysEqual(result.types, declaredType.types)) {
            return declaredType;
          }
          return result;
        }
        function getDiscriminantPropertyAccess(expr, computedType) {
          var access, name;
          var type = declaredType.flags & 1048576 ? declaredType : computedType;
          return type.flags & 1048576 && (access = getPropertyAccess(expr)) && (name = getAccessedPropertyName(access)) && isMatchingReference(reference, ts2.isAccessExpression(access) ? access.expression : access.parent.parent.initializer) && isDiscriminantProperty(type, name) ? access : void 0;
        }
        function narrowTypeByDiscriminant(type, access, narrowType2) {
          var propName = getAccessedPropertyName(access);
          if (propName === void 0) {
            return type;
          }
          var removeNullable = strictNullChecks && ts2.isOptionalChain(access) && maybeTypeOfKind(type, 98304);
          var propType = getTypeOfPropertyOfType(removeNullable ? getTypeWithFacts(type, 2097152) : type, propName);
          if (!propType) {
            return type;
          }
          propType = removeNullable ? getOptionalType(propType) : propType;
          var narrowedPropType = narrowType2(propType);
          return filterType(type, function(t) {
            var discriminantType = getTypeOfPropertyOrIndexSignature(t, propName);
            return !(narrowedPropType.flags & 131072) && isTypeComparableTo(narrowedPropType, discriminantType);
          });
        }
        function narrowTypeByDiscriminantProperty(type, access, operator, value, assumeTrue) {
          if ((operator === 36 || operator === 37) && type.flags & 1048576) {
            var keyPropertyName = getKeyPropertyName(type);
            if (keyPropertyName && keyPropertyName === getAccessedPropertyName(access)) {
              var candidate = getConstituentTypeForKeyType(type, getTypeOfExpression(value));
              if (candidate) {
                return operator === (assumeTrue ? 36 : 37) ? candidate : isUnitType(getTypeOfPropertyOfType(candidate, keyPropertyName) || unknownType) ? removeType(type, candidate) : type;
              }
            }
          }
          return narrowTypeByDiscriminant(type, access, function(t) {
            return narrowTypeByEquality(t, operator, value, assumeTrue);
          });
        }
        function narrowTypeBySwitchOnDiscriminantProperty(type, access, switchStatement, clauseStart, clauseEnd) {
          if (clauseStart < clauseEnd && type.flags & 1048576 && getKeyPropertyName(type) === getAccessedPropertyName(access)) {
            var clauseTypes = getSwitchClauseTypes(switchStatement).slice(clauseStart, clauseEnd);
            var candidate = getUnionType(ts2.map(clauseTypes, function(t) {
              return getConstituentTypeForKeyType(type, t) || unknownType;
            }));
            if (candidate !== unknownType) {
              return candidate;
            }
          }
          return narrowTypeByDiscriminant(type, access, function(t) {
            return narrowTypeBySwitchOnDiscriminant(t, switchStatement, clauseStart, clauseEnd);
          });
        }
        function narrowTypeByTruthiness(type, expr, assumeTrue) {
          if (isMatchingReference(reference, expr)) {
            return type.flags & 2 && assumeTrue ? nonNullUnknownType : getTypeWithFacts(type, assumeTrue ? 4194304 : 8388608);
          }
          if (strictNullChecks && assumeTrue && optionalChainContainsReference(expr, reference)) {
            type = getTypeWithFacts(type, 2097152);
          }
          var access = getDiscriminantPropertyAccess(expr, type);
          if (access) {
            return narrowTypeByDiscriminant(type, access, function(t) {
              return getTypeWithFacts(t, assumeTrue ? 4194304 : 8388608);
            });
          }
          return type;
        }
        function isTypePresencePossible(type, propName, assumeTrue) {
          var prop = getPropertyOfType(type, propName);
          if (prop) {
            return prop.flags & 16777216 ? true : assumeTrue;
          }
          return getApplicableIndexInfoForName(type, propName) ? true : !assumeTrue;
        }
        function narrowByInKeyword(type, name, assumeTrue) {
          if (type.flags & 1048576 || type.flags & 524288 && declaredType !== type || isThisTypeParameter(type) || type.flags & 2097152 && ts2.every(type.types, function(t) {
            return t.symbol !== globalThisSymbol;
          })) {
            return filterType(type, function(t) {
              return isTypePresencePossible(t, name, assumeTrue);
            });
          }
          return type;
        }
        function narrowTypeByBinaryExpression(type, expr, assumeTrue) {
          switch (expr.operatorToken.kind) {
            case 63:
            case 75:
            case 76:
            case 77:
              return narrowTypeByTruthiness(narrowType(type, expr.right, assumeTrue), expr.left, assumeTrue);
            case 34:
            case 35:
            case 36:
            case 37:
              var operator = expr.operatorToken.kind;
              var left = getReferenceCandidate(expr.left);
              var right = getReferenceCandidate(expr.right);
              if (left.kind === 215 && ts2.isStringLiteralLike(right)) {
                return narrowTypeByTypeof(type, left, operator, right, assumeTrue);
              }
              if (right.kind === 215 && ts2.isStringLiteralLike(left)) {
                return narrowTypeByTypeof(type, right, operator, left, assumeTrue);
              }
              if (isMatchingReference(reference, left)) {
                return narrowTypeByEquality(type, operator, right, assumeTrue);
              }
              if (isMatchingReference(reference, right)) {
                return narrowTypeByEquality(type, operator, left, assumeTrue);
              }
              if (strictNullChecks) {
                if (optionalChainContainsReference(left, reference)) {
                  type = narrowTypeByOptionalChainContainment(type, operator, right, assumeTrue);
                } else if (optionalChainContainsReference(right, reference)) {
                  type = narrowTypeByOptionalChainContainment(type, operator, left, assumeTrue);
                }
              }
              var leftAccess = getDiscriminantPropertyAccess(left, type);
              if (leftAccess) {
                return narrowTypeByDiscriminantProperty(type, leftAccess, operator, right, assumeTrue);
              }
              var rightAccess = getDiscriminantPropertyAccess(right, type);
              if (rightAccess) {
                return narrowTypeByDiscriminantProperty(type, rightAccess, operator, left, assumeTrue);
              }
              if (isMatchingConstructorReference(left)) {
                return narrowTypeByConstructor(type, operator, right, assumeTrue);
              }
              if (isMatchingConstructorReference(right)) {
                return narrowTypeByConstructor(type, operator, left, assumeTrue);
              }
              break;
            case 102:
              return narrowTypeByInstanceof(type, expr, assumeTrue);
            case 101:
              if (ts2.isPrivateIdentifier(expr.left)) {
                return narrowTypeByPrivateIdentifierInInExpression(type, expr, assumeTrue);
              }
              var target = getReferenceCandidate(expr.right);
              var leftType = getTypeOfNode(expr.left);
              if (leftType.flags & 128) {
                var name = ts2.escapeLeadingUnderscores(leftType.value);
                if (containsMissingType(type) && ts2.isAccessExpression(reference) && isMatchingReference(reference.expression, target) && getAccessedPropertyName(reference) === name) {
                  return getTypeWithFacts(type, assumeTrue ? 524288 : 65536);
                }
                if (isMatchingReference(reference, target)) {
                  return narrowByInKeyword(type, name, assumeTrue);
                }
              }
              break;
            case 27:
              return narrowType(type, expr.right, assumeTrue);
            case 55:
              return assumeTrue ? narrowType(narrowType(type, expr.left, true), expr.right, true) : getUnionType([narrowType(type, expr.left, false), narrowType(type, expr.right, false)]);
            case 56:
              return assumeTrue ? getUnionType([narrowType(type, expr.left, true), narrowType(type, expr.right, true)]) : narrowType(narrowType(type, expr.left, false), expr.right, false);
          }
          return type;
        }
        function narrowTypeByPrivateIdentifierInInExpression(type, expr, assumeTrue) {
          var target = getReferenceCandidate(expr.right);
          if (!isMatchingReference(reference, target)) {
            return type;
          }
          ts2.Debug.assertNode(expr.left, ts2.isPrivateIdentifier);
          var symbol = getSymbolForPrivateIdentifierExpression(expr.left);
          if (symbol === void 0) {
            return type;
          }
          var classSymbol = symbol.parent;
          var targetType = ts2.hasStaticModifier(ts2.Debug.checkDefined(symbol.valueDeclaration, "should always have a declaration")) ? getTypeOfSymbol(classSymbol) : getDeclaredTypeOfSymbol(classSymbol);
          return getNarrowedType(type, targetType, assumeTrue, isTypeDerivedFrom);
        }
        function narrowTypeByOptionalChainContainment(type, operator, value, assumeTrue) {
          var equalsOperator = operator === 34 || operator === 36;
          var nullableFlags = operator === 34 || operator === 35 ? 98304 : 32768;
          var valueType = getTypeOfExpression(value);
          var removeNullable = equalsOperator !== assumeTrue && everyType(valueType, function(t) {
            return !!(t.flags & nullableFlags);
          }) || equalsOperator === assumeTrue && everyType(valueType, function(t) {
            return !(t.flags & (3 | nullableFlags));
          });
          return removeNullable ? getTypeWithFacts(type, 2097152) : type;
        }
        function narrowTypeByEquality(type, operator, value, assumeTrue) {
          if (type.flags & 1) {
            return type;
          }
          if (operator === 35 || operator === 37) {
            assumeTrue = !assumeTrue;
          }
          var valueType = getTypeOfExpression(value);
          if (assumeTrue && type.flags & 2 && (operator === 34 || operator === 35) && valueType.flags & 65536) {
            return getUnionType([nullType, undefinedType]);
          }
          if (type.flags & 2 && assumeTrue && (operator === 36 || operator === 37)) {
            if (valueType.flags & (131068 | 67108864)) {
              return valueType;
            }
            if (valueType.flags & 524288) {
              return nonPrimitiveType;
            }
            return type;
          }
          if (valueType.flags & 98304) {
            if (!strictNullChecks) {
              return type;
            }
            var doubleEquals = operator === 34 || operator === 35;
            var facts = doubleEquals ? assumeTrue ? 262144 : 2097152 : valueType.flags & 65536 ? assumeTrue ? 131072 : 1048576 : assumeTrue ? 65536 : 524288;
            return type.flags & 2 && facts & (1048576 | 2097152) ? nonNullUnknownType : getTypeWithFacts(type, facts);
          }
          if (assumeTrue) {
            var filterFn = operator === 34 ? function(t) {
              return areTypesComparable(t, valueType) || isCoercibleUnderDoubleEquals(t, valueType);
            } : function(t) {
              return areTypesComparable(t, valueType);
            };
            return replacePrimitivesWithLiterals(filterType(type, filterFn), valueType);
          }
          if (isUnitType(valueType)) {
            return filterType(type, function(t) {
              return !(isUnitLikeType(t) && areTypesComparable(t, valueType));
            });
          }
          return type;
        }
        function narrowTypeByTypeof(type, typeOfExpr, operator, literal, assumeTrue) {
          if (operator === 35 || operator === 37) {
            assumeTrue = !assumeTrue;
          }
          var target = getReferenceCandidate(typeOfExpr.expression);
          if (!isMatchingReference(reference, target)) {
            if (strictNullChecks && optionalChainContainsReference(target, reference) && assumeTrue === (literal.text !== "undefined")) {
              return getTypeWithFacts(type, 2097152);
            }
            return type;
          }
          if (type.flags & 1 && literal.text === "function") {
            return type;
          }
          if (assumeTrue && type.flags & 2 && literal.text === "object") {
            return type === nonNullUnknownType ? nonPrimitiveType : getUnionType([nonPrimitiveType, nullType]);
          }
          var facts = assumeTrue ? typeofEQFacts.get(literal.text) || 128 : typeofNEFacts.get(literal.text) || 32768;
          var impliedType = getImpliedTypeFromTypeofGuard(type, literal.text);
          return getTypeWithFacts(assumeTrue && impliedType ? mapType(type, narrowUnionMemberByTypeof(impliedType)) : type, facts);
        }
        function narrowTypeBySwitchOptionalChainContainment(type, switchStatement, clauseStart, clauseEnd, clauseCheck) {
          var everyClauseChecks = clauseStart !== clauseEnd && ts2.every(getSwitchClauseTypes(switchStatement).slice(clauseStart, clauseEnd), clauseCheck);
          return everyClauseChecks ? getTypeWithFacts(type, 2097152) : type;
        }
        function narrowTypeBySwitchOnDiscriminant(type, switchStatement, clauseStart, clauseEnd) {
          var switchTypes = getSwitchClauseTypes(switchStatement);
          if (!switchTypes.length) {
            return type;
          }
          var clauseTypes = switchTypes.slice(clauseStart, clauseEnd);
          var hasDefaultClause = clauseStart === clauseEnd || ts2.contains(clauseTypes, neverType);
          if (type.flags & 2 && !hasDefaultClause) {
            var groundClauseTypes = void 0;
            for (var i = 0; i < clauseTypes.length; i += 1) {
              var t = clauseTypes[i];
              if (t.flags & (131068 | 67108864)) {
                if (groundClauseTypes !== void 0) {
                  groundClauseTypes.push(t);
                }
              } else if (t.flags & 524288) {
                if (groundClauseTypes === void 0) {
                  groundClauseTypes = clauseTypes.slice(0, i);
                }
                groundClauseTypes.push(nonPrimitiveType);
              } else {
                return type;
              }
            }
            return getUnionType(groundClauseTypes === void 0 ? clauseTypes : groundClauseTypes);
          }
          var discriminantType = getUnionType(clauseTypes);
          var caseType = discriminantType.flags & 131072 ? neverType : replacePrimitivesWithLiterals(filterType(type, function(t2) {
            return areTypesComparable(discriminantType, t2);
          }), discriminantType);
          if (!hasDefaultClause) {
            return caseType;
          }
          var defaultType = filterType(type, function(t2) {
            return !(isUnitLikeType(t2) && ts2.contains(switchTypes, getRegularTypeOfLiteralType(extractUnitType(t2))));
          });
          return caseType.flags & 131072 ? defaultType : getUnionType([caseType, defaultType]);
        }
        function getImpliedTypeFromTypeofGuard(type, text) {
          switch (text) {
            case "function":
              return type.flags & 1 ? type : globalFunctionType;
            case "object":
              return type.flags & 2 ? getUnionType([nonPrimitiveType, nullType]) : type;
            default:
              return typeofTypesByName.get(text);
          }
        }
        function narrowUnionMemberByTypeof(candidate) {
          return function(type) {
            if (isTypeSubtypeOf(type, candidate)) {
              return type;
            }
            if (isTypeSubtypeOf(candidate, type)) {
              return candidate;
            }
            if (type.flags & 465829888) {
              var constraint = getBaseConstraintOfType(type) || anyType;
              if (isTypeSubtypeOf(candidate, constraint)) {
                return getIntersectionType([type, candidate]);
              }
            }
            return type;
          };
        }
        function narrowBySwitchOnTypeOf(type, switchStatement, clauseStart, clauseEnd) {
          var switchWitnesses = getSwitchClauseTypeOfWitnesses(switchStatement, true);
          if (!switchWitnesses.length) {
            return type;
          }
          var defaultCaseLocation = ts2.findIndex(switchWitnesses, function(elem) {
            return elem === void 0;
          });
          var hasDefaultClause = clauseStart === clauseEnd || defaultCaseLocation >= clauseStart && defaultCaseLocation < clauseEnd;
          var clauseWitnesses;
          var switchFacts;
          if (defaultCaseLocation > -1) {
            var witnesses = switchWitnesses.filter(function(witness) {
              return witness !== void 0;
            });
            var fixedClauseStart = defaultCaseLocation < clauseStart ? clauseStart - 1 : clauseStart;
            var fixedClauseEnd = defaultCaseLocation < clauseEnd ? clauseEnd - 1 : clauseEnd;
            clauseWitnesses = witnesses.slice(fixedClauseStart, fixedClauseEnd);
            switchFacts = getFactsFromTypeofSwitch(fixedClauseStart, fixedClauseEnd, witnesses, hasDefaultClause);
          } else {
            clauseWitnesses = switchWitnesses.slice(clauseStart, clauseEnd);
            switchFacts = getFactsFromTypeofSwitch(clauseStart, clauseEnd, switchWitnesses, hasDefaultClause);
          }
          if (hasDefaultClause) {
            return filterType(type, function(t) {
              return (getTypeFacts(t) & switchFacts) === switchFacts;
            });
          }
          var impliedType = getTypeWithFacts(getUnionType(clauseWitnesses.map(function(text) {
            return getImpliedTypeFromTypeofGuard(type, text) || type;
          })), switchFacts);
          return getTypeWithFacts(mapType(type, narrowUnionMemberByTypeof(impliedType)), switchFacts);
        }
        function isMatchingConstructorReference(expr) {
          return (ts2.isPropertyAccessExpression(expr) && ts2.idText(expr.name) === "constructor" || ts2.isElementAccessExpression(expr) && ts2.isStringLiteralLike(expr.argumentExpression) && expr.argumentExpression.text === "constructor") && isMatchingReference(reference, expr.expression);
        }
        function narrowTypeByConstructor(type, operator, identifier, assumeTrue) {
          if (assumeTrue ? operator !== 34 && operator !== 36 : operator !== 35 && operator !== 37) {
            return type;
          }
          var identifierType = getTypeOfExpression(identifier);
          if (!isFunctionType(identifierType) && !isConstructorType(identifierType)) {
            return type;
          }
          var prototypeProperty = getPropertyOfType(identifierType, "prototype");
          if (!prototypeProperty) {
            return type;
          }
          var prototypeType = getTypeOfSymbol(prototypeProperty);
          var candidate = !isTypeAny(prototypeType) ? prototypeType : void 0;
          if (!candidate || candidate === globalObjectType || candidate === globalFunctionType) {
            return type;
          }
          if (isTypeAny(type)) {
            return candidate;
          }
          return filterType(type, function(t) {
            return isConstructedBy(t, candidate);
          });
          function isConstructedBy(source, target) {
            if (source.flags & 524288 && ts2.getObjectFlags(source) & 1 || target.flags & 524288 && ts2.getObjectFlags(target) & 1) {
              return source.symbol === target.symbol;
            }
            return isTypeSubtypeOf(source, target);
          }
        }
        function narrowTypeByInstanceof(type, expr, assumeTrue) {
          var left = getReferenceCandidate(expr.left);
          if (!isMatchingReference(reference, left)) {
            if (assumeTrue && strictNullChecks && optionalChainContainsReference(left, reference)) {
              return getTypeWithFacts(type, 2097152);
            }
            return type;
          }
          var rightType = getTypeOfExpression(expr.right);
          if (!isTypeDerivedFrom(rightType, globalFunctionType)) {
            return type;
          }
          var targetType;
          var prototypeProperty = getPropertyOfType(rightType, "prototype");
          if (prototypeProperty) {
            var prototypePropertyType = getTypeOfSymbol(prototypeProperty);
            if (!isTypeAny(prototypePropertyType)) {
              targetType = prototypePropertyType;
            }
          }
          if (isTypeAny(type) && (targetType === globalObjectType || targetType === globalFunctionType)) {
            return type;
          }
          if (!targetType) {
            var constructSignatures = getSignaturesOfType(rightType, 1);
            targetType = constructSignatures.length ? getUnionType(ts2.map(constructSignatures, function(signature) {
              return getReturnTypeOfSignature(getErasedSignature(signature));
            })) : emptyObjectType;
          }
          if (!assumeTrue && rightType.flags & 1048576) {
            var nonConstructorTypeInUnion = ts2.find(rightType.types, function(t) {
              return !isConstructorType(t);
            });
            if (!nonConstructorTypeInUnion)
              return type;
          }
          return getNarrowedType(type, targetType, assumeTrue, isTypeDerivedFrom);
        }
        function getNarrowedType(type, candidate, assumeTrue, isRelated) {
          if (!assumeTrue) {
            return filterType(type, function(t) {
              return !isRelated(t, candidate);
            });
          }
          if (type.flags & 1048576) {
            var assignableType = filterType(type, function(t) {
              return isRelated(t, candidate);
            });
            if (!(assignableType.flags & 131072)) {
              return assignableType;
            }
          }
          return isTypeSubtypeOf(candidate, type) ? candidate : isTypeAssignableTo(type, candidate) ? type : isTypeAssignableTo(candidate, type) ? candidate : getIntersectionType([type, candidate]);
        }
        function narrowTypeByCallExpression(type, callExpression, assumeTrue) {
          if (hasMatchingArgument(callExpression, reference)) {
            var signature = assumeTrue || !ts2.isCallChain(callExpression) ? getEffectsSignature(callExpression) : void 0;
            var predicate = signature && getTypePredicateOfSignature(signature);
            if (predicate && (predicate.kind === 0 || predicate.kind === 1)) {
              return narrowTypeByTypePredicate(type, predicate, callExpression, assumeTrue);
            }
          }
          if (containsMissingType(type) && ts2.isAccessExpression(reference) && ts2.isPropertyAccessExpression(callExpression.expression)) {
            var callAccess = callExpression.expression;
            if (isMatchingReference(reference.expression, getReferenceCandidate(callAccess.expression)) && ts2.isIdentifier(callAccess.name) && callAccess.name.escapedText === "hasOwnProperty" && callExpression.arguments.length === 1) {
              var argument = callExpression.arguments[0];
              if (ts2.isStringLiteralLike(argument) && getAccessedPropertyName(reference) === ts2.escapeLeadingUnderscores(argument.text)) {
                return getTypeWithFacts(type, assumeTrue ? 524288 : 65536);
              }
            }
          }
          return type;
        }
        function narrowTypeByTypePredicate(type, predicate, callExpression, assumeTrue) {
          if (predicate.type && !(isTypeAny(type) && (predicate.type === globalObjectType || predicate.type === globalFunctionType))) {
            var predicateArgument = getTypePredicateArgument(predicate, callExpression);
            if (predicateArgument) {
              if (isMatchingReference(reference, predicateArgument)) {
                return getNarrowedType(type, predicate.type, assumeTrue, isTypeSubtypeOf);
              }
              if (strictNullChecks && assumeTrue && optionalChainContainsReference(predicateArgument, reference) && !(getTypeFacts(predicate.type) & 65536)) {
                type = getTypeWithFacts(type, 2097152);
              }
              var access = getDiscriminantPropertyAccess(predicateArgument, type);
              if (access) {
                return narrowTypeByDiscriminant(type, access, function(t) {
                  return getNarrowedType(t, predicate.type, assumeTrue, isTypeSubtypeOf);
                });
              }
            }
          }
          return type;
        }
        function narrowType(type, expr, assumeTrue) {
          if (ts2.isExpressionOfOptionalChainRoot(expr) || ts2.isBinaryExpression(expr.parent) && expr.parent.operatorToken.kind === 60 && expr.parent.left === expr) {
            return narrowTypeByOptionality(type, expr, assumeTrue);
          }
          switch (expr.kind) {
            case 79:
              if (!isMatchingReference(reference, expr) && inlineLevel < 5) {
                var symbol = getResolvedSymbol(expr);
                if (isConstVariable(symbol)) {
                  var declaration = symbol.valueDeclaration;
                  if (declaration && ts2.isVariableDeclaration(declaration) && !declaration.type && declaration.initializer && isConstantReference(reference)) {
                    inlineLevel++;
                    var result = narrowType(type, declaration.initializer, assumeTrue);
                    inlineLevel--;
                    return result;
                  }
                }
              }
            case 108:
            case 106:
            case 205:
            case 206:
              return narrowTypeByTruthiness(type, expr, assumeTrue);
            case 207:
              return narrowTypeByCallExpression(type, expr, assumeTrue);
            case 211:
            case 229:
              return narrowType(type, expr.expression, assumeTrue);
            case 220:
              return narrowTypeByBinaryExpression(type, expr, assumeTrue);
            case 218:
              if (expr.operator === 53) {
                return narrowType(type, expr.operand, !assumeTrue);
              }
              break;
          }
          return type;
        }
        function narrowTypeByOptionality(type, expr, assumePresent) {
          if (isMatchingReference(reference, expr)) {
            return getTypeWithFacts(type, assumePresent ? 2097152 : 262144);
          }
          var access = getDiscriminantPropertyAccess(expr, type);
          if (access) {
            return narrowTypeByDiscriminant(type, access, function(t) {
              return getTypeWithFacts(t, assumePresent ? 2097152 : 262144);
            });
          }
          return type;
        }
      }
      function getTypeOfSymbolAtLocation(symbol, location) {
        symbol = symbol.exportSymbol || symbol;
        if (location.kind === 79 || location.kind === 80) {
          if (ts2.isRightSideOfQualifiedNameOrPropertyAccess(location)) {
            location = location.parent;
          }
          if (ts2.isExpressionNode(location) && (!ts2.isAssignmentTarget(location) || ts2.isWriteAccess(location))) {
            var type = getTypeOfExpression(location);
            if (getExportSymbolOfValueSymbolIfExported(getNodeLinks(location).resolvedSymbol) === symbol) {
              return type;
            }
          }
        }
        if (ts2.isDeclarationName(location) && ts2.isSetAccessor(location.parent) && getAnnotatedAccessorTypeNode(location.parent)) {
          return resolveTypeOfAccessors(location.parent.symbol, true);
        }
        return getNonMissingTypeOfSymbol(symbol);
      }
      function getControlFlowContainer(node) {
        return ts2.findAncestor(node.parent, function(node2) {
          return ts2.isFunctionLike(node2) && !ts2.getImmediatelyInvokedFunctionExpression(node2) || node2.kind === 261 || node2.kind === 303 || node2.kind === 166;
        });
      }
      function isSymbolAssigned(symbol) {
        if (!symbol.valueDeclaration) {
          return false;
        }
        var parent = ts2.getRootDeclaration(symbol.valueDeclaration).parent;
        var links = getNodeLinks(parent);
        if (!(links.flags & 8388608)) {
          links.flags |= 8388608;
          if (!hasParentWithAssignmentsMarked(parent)) {
            markNodeAssignments(parent);
          }
        }
        return symbol.isAssigned || false;
      }
      function hasParentWithAssignmentsMarked(node) {
        return !!ts2.findAncestor(node.parent, function(node2) {
          return (ts2.isFunctionLike(node2) || ts2.isCatchClause(node2)) && !!(getNodeLinks(node2).flags & 8388608);
        });
      }
      function markNodeAssignments(node) {
        if (node.kind === 79) {
          if (ts2.isAssignmentTarget(node)) {
            var symbol = getResolvedSymbol(node);
            if (ts2.isParameterOrCatchClauseVariable(symbol)) {
              symbol.isAssigned = true;
            }
          }
        } else {
          ts2.forEachChild(node, markNodeAssignments);
        }
      }
      function isConstVariable(symbol) {
        return symbol.flags & 3 && (getDeclarationNodeFlagsFromSymbol(symbol) & 2) !== 0;
      }
      function removeOptionalityFromDeclaredType(declaredType, declaration) {
        if (pushTypeResolution(declaration.symbol, 2)) {
          var annotationIncludesUndefined = strictNullChecks && declaration.kind === 163 && declaration.initializer && getFalsyFlags(declaredType) & 32768 && !(getFalsyFlags(checkExpression(declaration.initializer)) & 32768);
          popTypeResolution();
          return annotationIncludesUndefined ? getTypeWithFacts(declaredType, 524288) : declaredType;
        } else {
          reportCircularityError(declaration.symbol);
          return declaredType;
        }
      }
      function isConstraintPosition(type, node) {
        var parent = node.parent;
        return parent.kind === 205 || parent.kind === 207 && parent.expression === node || parent.kind === 206 && parent.expression === node && !(someType(type, isGenericTypeWithoutNullableConstraint) && isGenericIndexType(getTypeOfExpression(parent.argumentExpression)));
      }
      function isGenericTypeWithUnionConstraint(type) {
        return !!(type.flags & 465829888 && getBaseConstraintOrType(type).flags & (98304 | 1048576));
      }
      function isGenericTypeWithoutNullableConstraint(type) {
        return !!(type.flags & 465829888 && !maybeTypeOfKind(getBaseConstraintOrType(type), 98304));
      }
      function hasNonBindingPatternContextualTypeWithNoGenericTypes(node) {
        var contextualType = (ts2.isIdentifier(node) || ts2.isPropertyAccessExpression(node) || ts2.isElementAccessExpression(node)) && !((ts2.isJsxOpeningElement(node.parent) || ts2.isJsxSelfClosingElement(node.parent)) && node.parent.tagName === node) && getContextualType(node, 8);
        return contextualType && !isGenericType(contextualType);
      }
      function getNarrowableTypeForReference(type, reference, checkMode) {
        var substituteConstraints = !(checkMode && checkMode & 2) && someType(type, isGenericTypeWithUnionConstraint) && (isConstraintPosition(type, reference) || hasNonBindingPatternContextualTypeWithNoGenericTypes(reference));
        return substituteConstraints ? mapType(type, function(t) {
          return t.flags & 465829888 ? getBaseConstraintOrType(t) : t;
        }) : type;
      }
      function isExportOrExportExpression(location) {
        return !!ts2.findAncestor(location, function(n) {
          var parent = n.parent;
          if (parent === void 0) {
            return "quit";
          }
          if (ts2.isExportAssignment(parent)) {
            return parent.expression === n && ts2.isEntityNameExpression(n);
          }
          if (ts2.isExportSpecifier(parent)) {
            return parent.name === n || parent.propertyName === n;
          }
          return false;
        });
      }
      function markAliasReferenced(symbol, location) {
        if (isNonLocalAlias(symbol, 111551) && !isInTypeQuery(location) && !getTypeOnlyAliasDeclaration(symbol)) {
          var target = resolveAlias(symbol);
          if (target.flags & 111551) {
            if (compilerOptions.isolatedModules || ts2.shouldPreserveConstEnums(compilerOptions) && isExportOrExportExpression(location) || !isConstEnumOrConstEnumOnlyModule(target)) {
              markAliasSymbolAsReferenced(symbol);
            } else {
              markConstEnumAliasAsReferenced(symbol);
            }
          }
        }
      }
      function checkIdentifier(node, checkMode) {
        var symbol = getResolvedSymbol(node);
        if (symbol === unknownSymbol) {
          return errorType;
        }
        if (symbol === argumentsSymbol) {
          if (isInPropertyInitializerOrClassStaticBlock(node)) {
            error(node, ts2.Diagnostics.arguments_cannot_be_referenced_in_property_initializers);
            return errorType;
          }
          var container = ts2.getContainingFunction(node);
          if (languageVersion < 2) {
            if (container.kind === 213) {
              error(node, ts2.Diagnostics.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression);
            } else if (ts2.hasSyntacticModifier(container, 256)) {
              error(node, ts2.Diagnostics.The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_using_a_standard_function_or_method);
            }
          }
          getNodeLinks(container).flags |= 8192;
          return getTypeOfSymbol(symbol);
        }
        if (!(node.parent && ts2.isPropertyAccessExpression(node.parent) && node.parent.expression === node)) {
          markAliasReferenced(symbol, node);
        }
        var localOrExportSymbol = getExportSymbolOfValueSymbolIfExported(symbol);
        var sourceSymbol = localOrExportSymbol.flags & 2097152 ? resolveAlias(localOrExportSymbol) : localOrExportSymbol;
        if (sourceSymbol.declarations && getDeclarationNodeFlagsFromSymbol(sourceSymbol) & 134217728 && isUncalledFunctionReference(node, sourceSymbol)) {
          addDeprecatedSuggestion(node, sourceSymbol.declarations, node.escapedText);
        }
        var declaration = localOrExportSymbol.valueDeclaration;
        if (declaration && localOrExportSymbol.flags & 32) {
          if (declaration.kind === 256 && ts2.nodeIsDecorated(declaration)) {
            var container = ts2.getContainingClass(node);
            while (container !== void 0) {
              if (container === declaration && container.name !== node) {
                getNodeLinks(declaration).flags |= 16777216;
                getNodeLinks(node).flags |= 33554432;
                break;
              }
              container = ts2.getContainingClass(container);
            }
          } else if (declaration.kind === 225) {
            var container = ts2.getThisContainer(node, false);
            while (container.kind !== 303) {
              if (container.parent === declaration) {
                if (ts2.isPropertyDeclaration(container) && ts2.isStatic(container) || ts2.isClassStaticBlockDeclaration(container)) {
                  getNodeLinks(declaration).flags |= 16777216;
                  getNodeLinks(node).flags |= 33554432;
                }
                break;
              }
              container = ts2.getThisContainer(container, false);
            }
          }
        }
        checkNestedBlockScopedBinding(node, symbol);
        var type = getTypeOfSymbol(localOrExportSymbol);
        var assignmentKind = ts2.getAssignmentTargetKind(node);
        if (assignmentKind) {
          if (!(localOrExportSymbol.flags & 3) && !(ts2.isInJSFile(node) && localOrExportSymbol.flags & 512)) {
            var assignmentError = localOrExportSymbol.flags & 384 ? ts2.Diagnostics.Cannot_assign_to_0_because_it_is_an_enum : localOrExportSymbol.flags & 32 ? ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_class : localOrExportSymbol.flags & 1536 ? ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_namespace : localOrExportSymbol.flags & 16 ? ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_function : localOrExportSymbol.flags & 2097152 ? ts2.Diagnostics.Cannot_assign_to_0_because_it_is_an_import : ts2.Diagnostics.Cannot_assign_to_0_because_it_is_not_a_variable;
            error(node, assignmentError, symbolToString(symbol));
            return errorType;
          }
          if (isReadonlySymbol(localOrExportSymbol)) {
            if (localOrExportSymbol.flags & 3) {
              error(node, ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_constant, symbolToString(symbol));
            } else {
              error(node, ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_read_only_property, symbolToString(symbol));
            }
            return errorType;
          }
        }
        var isAlias = localOrExportSymbol.flags & 2097152;
        if (localOrExportSymbol.flags & 3) {
          if (assignmentKind === 1) {
            return type;
          }
        } else if (isAlias) {
          declaration = getDeclarationOfAliasSymbol(symbol);
        } else {
          return type;
        }
        if (!declaration) {
          return type;
        }
        type = getNarrowableTypeForReference(type, node, checkMode);
        var isParameter = ts2.getRootDeclaration(declaration).kind === 163;
        var declarationContainer = getControlFlowContainer(declaration);
        var flowContainer = getControlFlowContainer(node);
        var isOuterVariable = flowContainer !== declarationContainer;
        var isSpreadDestructuringAssignmentTarget = node.parent && node.parent.parent && ts2.isSpreadAssignment(node.parent) && isDestructuringAssignmentTarget(node.parent.parent);
        var isModuleExports = symbol.flags & 134217728;
        while (flowContainer !== declarationContainer && (flowContainer.kind === 212 || flowContainer.kind === 213 || ts2.isObjectLiteralOrClassExpressionMethodOrAccessor(flowContainer)) && (isConstVariable(localOrExportSymbol) && type !== autoArrayType || isParameter && !isSymbolAssigned(localOrExportSymbol))) {
          flowContainer = getControlFlowContainer(flowContainer);
        }
        var assumeInitialized = isParameter || isAlias || isOuterVariable || isSpreadDestructuringAssignmentTarget || isModuleExports || ts2.isBindingElement(declaration) || type !== autoType && type !== autoArrayType && (!strictNullChecks || (type.flags & (3 | 16384)) !== 0 || isInTypeQuery(node) || node.parent.kind === 274) || node.parent.kind === 229 || declaration.kind === 253 && declaration.exclamationToken || declaration.flags & 8388608;
        var initialType = assumeInitialized ? isParameter ? removeOptionalityFromDeclaredType(type, declaration) : type : type === autoType || type === autoArrayType ? undefinedType : getOptionalType(type);
        var flowType = getFlowTypeOfReference(node, type, initialType, flowContainer);
        if (!isEvolvingArrayOperationTarget(node) && (type === autoType || type === autoArrayType)) {
          if (flowType === autoType || flowType === autoArrayType) {
            if (noImplicitAny) {
              error(ts2.getNameOfDeclaration(declaration), ts2.Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined, symbolToString(symbol), typeToString(flowType));
              error(node, ts2.Diagnostics.Variable_0_implicitly_has_an_1_type, symbolToString(symbol), typeToString(flowType));
            }
            return convertAutoToAny(flowType);
          }
        } else if (!assumeInitialized && !(getFalsyFlags(type) & 32768) && getFalsyFlags(flowType) & 32768) {
          error(node, ts2.Diagnostics.Variable_0_is_used_before_being_assigned, symbolToString(symbol));
          return type;
        }
        return assignmentKind ? getBaseTypeOfLiteralType(flowType) : flowType;
      }
      function isInsideFunctionOrInstancePropertyInitializer(node, threshold) {
        return !!ts2.findAncestor(node, function(n) {
          return n === threshold ? "quit" : ts2.isFunctionLike(n) || n.parent && ts2.isPropertyDeclaration(n.parent) && !ts2.hasStaticModifier(n.parent) && n.parent.initializer === n;
        });
      }
      function getPartOfForStatementContainingNode(node, container) {
        return ts2.findAncestor(node, function(n) {
          return n === container ? "quit" : n === container.initializer || n === container.condition || n === container.incrementor || n === container.statement;
        });
      }
      function getEnclosingIterationStatement(node) {
        return ts2.findAncestor(node, function(n) {
          return !n || ts2.nodeStartsNewLexicalEnvironment(n) ? "quit" : ts2.isIterationStatement(n, false);
        });
      }
      function checkNestedBlockScopedBinding(node, symbol) {
        if (languageVersion >= 2 || (symbol.flags & (2 | 32)) === 0 || !symbol.valueDeclaration || ts2.isSourceFile(symbol.valueDeclaration) || symbol.valueDeclaration.parent.kind === 291) {
          return;
        }
        var container = ts2.getEnclosingBlockScopeContainer(symbol.valueDeclaration);
        var isCaptured = isInsideFunctionOrInstancePropertyInitializer(node, container);
        var enclosingIterationStatement = getEnclosingIterationStatement(container);
        if (enclosingIterationStatement) {
          if (isCaptured) {
            var capturesBlockScopeBindingInLoopBody = true;
            if (ts2.isForStatement(container)) {
              var varDeclList = ts2.getAncestor(symbol.valueDeclaration, 254);
              if (varDeclList && varDeclList.parent === container) {
                var part = getPartOfForStatementContainingNode(node.parent, container);
                if (part) {
                  var links = getNodeLinks(part);
                  links.flags |= 131072;
                  var capturedBindings = links.capturedBlockScopeBindings || (links.capturedBlockScopeBindings = []);
                  ts2.pushIfUnique(capturedBindings, symbol);
                  if (part === container.initializer) {
                    capturesBlockScopeBindingInLoopBody = false;
                  }
                }
              }
            }
            if (capturesBlockScopeBindingInLoopBody) {
              getNodeLinks(enclosingIterationStatement).flags |= 65536;
            }
          }
          if (ts2.isForStatement(container)) {
            var varDeclList = ts2.getAncestor(symbol.valueDeclaration, 254);
            if (varDeclList && varDeclList.parent === container && isAssignedInBodyOfForStatement(node, container)) {
              getNodeLinks(symbol.valueDeclaration).flags |= 4194304;
            }
          }
          getNodeLinks(symbol.valueDeclaration).flags |= 524288;
        }
        if (isCaptured) {
          getNodeLinks(symbol.valueDeclaration).flags |= 262144;
        }
      }
      function isBindingCapturedByNode(node, decl) {
        var links = getNodeLinks(node);
        return !!links && ts2.contains(links.capturedBlockScopeBindings, getSymbolOfNode(decl));
      }
      function isAssignedInBodyOfForStatement(node, container) {
        var current = node;
        while (current.parent.kind === 211) {
          current = current.parent;
        }
        var isAssigned = false;
        if (ts2.isAssignmentTarget(current)) {
          isAssigned = true;
        } else if (current.parent.kind === 218 || current.parent.kind === 219) {
          var expr = current.parent;
          isAssigned = expr.operator === 45 || expr.operator === 46;
        }
        if (!isAssigned) {
          return false;
        }
        return !!ts2.findAncestor(current, function(n) {
          return n === container ? "quit" : n === container.statement;
        });
      }
      function captureLexicalThis(node, container) {
        getNodeLinks(node).flags |= 2;
        if (container.kind === 166 || container.kind === 170) {
          var classNode = container.parent;
          getNodeLinks(classNode).flags |= 4;
        } else {
          getNodeLinks(container).flags |= 4;
        }
      }
      function findFirstSuperCall(node) {
        return ts2.isSuperCall(node) ? node : ts2.isFunctionLike(node) ? void 0 : ts2.forEachChild(node, findFirstSuperCall);
      }
      function classDeclarationExtendsNull(classDecl) {
        var classSymbol = getSymbolOfNode(classDecl);
        var classInstanceType = getDeclaredTypeOfSymbol(classSymbol);
        var baseConstructorType = getBaseConstructorTypeOfClass(classInstanceType);
        return baseConstructorType === nullWideningType;
      }
      function checkThisBeforeSuper(node, container, diagnosticMessage) {
        var containingClassDecl = container.parent;
        var baseTypeNode = ts2.getClassExtendsHeritageElement(containingClassDecl);
        if (baseTypeNode && !classDeclarationExtendsNull(containingClassDecl)) {
          if (node.flowNode && !isPostSuperFlowNode(node.flowNode, false)) {
            error(node, diagnosticMessage);
          }
        }
      }
      function checkThisInStaticClassFieldInitializerInDecoratedClass(thisExpression, container) {
        if (ts2.isPropertyDeclaration(container) && ts2.hasStaticModifier(container) && container.initializer && ts2.textRangeContainsPositionInclusive(container.initializer, thisExpression.pos) && ts2.length(container.parent.decorators)) {
          error(thisExpression, ts2.Diagnostics.Cannot_use_this_in_a_static_property_initializer_of_a_decorated_class);
        }
      }
      function checkThisExpression(node) {
        var isNodeInTypeQuery = isInTypeQuery(node);
        var container = ts2.getThisContainer(node, true);
        var capturedByArrowFunction = false;
        if (container.kind === 170) {
          checkThisBeforeSuper(node, container, ts2.Diagnostics.super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class);
        }
        if (container.kind === 213) {
          container = ts2.getThisContainer(container, false);
          capturedByArrowFunction = true;
        }
        checkThisInStaticClassFieldInitializerInDecoratedClass(node, container);
        switch (container.kind) {
          case 260:
            error(node, ts2.Diagnostics.this_cannot_be_referenced_in_a_module_or_namespace_body);
            break;
          case 259:
            error(node, ts2.Diagnostics.this_cannot_be_referenced_in_current_location);
            break;
          case 170:
            if (isInConstructorArgumentInitializer(node, container)) {
              error(node, ts2.Diagnostics.this_cannot_be_referenced_in_constructor_arguments);
            }
            break;
          case 161:
            error(node, ts2.Diagnostics.this_cannot_be_referenced_in_a_computed_property_name);
            break;
        }
        if (!isNodeInTypeQuery && capturedByArrowFunction && languageVersion < 2) {
          captureLexicalThis(node, container);
        }
        var type = tryGetThisTypeAt(node, true, container);
        if (noImplicitThis) {
          var globalThisType_1 = getTypeOfSymbol(globalThisSymbol);
          if (type === globalThisType_1 && capturedByArrowFunction) {
            error(node, ts2.Diagnostics.The_containing_arrow_function_captures_the_global_value_of_this);
          } else if (!type) {
            var diag = error(node, ts2.Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation);
            if (!ts2.isSourceFile(container)) {
              var outsideThis = tryGetThisTypeAt(container);
              if (outsideThis && outsideThis !== globalThisType_1) {
                ts2.addRelatedInfo(diag, ts2.createDiagnosticForNode(container, ts2.Diagnostics.An_outer_value_of_this_is_shadowed_by_this_container));
              }
            }
          }
        }
        return type || anyType;
      }
      function tryGetThisTypeAt(node, includeGlobalThis, container) {
        if (includeGlobalThis === void 0) {
          includeGlobalThis = true;
        }
        if (container === void 0) {
          container = ts2.getThisContainer(node, false);
        }
        var isInJS = ts2.isInJSFile(node);
        if (ts2.isFunctionLike(container) && (!isInParameterInitializerBeforeContainingFunction(node) || ts2.getThisParameter(container))) {
          var thisType = getThisTypeOfDeclaration(container) || isInJS && getTypeForThisExpressionFromJSDoc(container);
          if (!thisType) {
            var className = getClassNameFromPrototypeMethod(container);
            if (isInJS && className) {
              var classSymbol = checkExpression(className).symbol;
              if (classSymbol && classSymbol.members && classSymbol.flags & 16) {
                thisType = getDeclaredTypeOfSymbol(classSymbol).thisType;
              }
            } else if (isJSConstructor(container)) {
              thisType = getDeclaredTypeOfSymbol(getMergedSymbol(container.symbol)).thisType;
            }
            thisType || (thisType = getContextualThisParameterType(container));
          }
          if (thisType) {
            return getFlowTypeOfReference(node, thisType);
          }
        }
        if (ts2.isClassLike(container.parent)) {
          var symbol = getSymbolOfNode(container.parent);
          var type = ts2.isStatic(container) ? getTypeOfSymbol(symbol) : getDeclaredTypeOfSymbol(symbol).thisType;
          return getFlowTypeOfReference(node, type);
        }
        if (ts2.isSourceFile(container)) {
          if (container.commonJsModuleIndicator) {
            var fileSymbol = getSymbolOfNode(container);
            return fileSymbol && getTypeOfSymbol(fileSymbol);
          } else if (container.externalModuleIndicator) {
            return undefinedType;
          } else if (includeGlobalThis) {
            return getTypeOfSymbol(globalThisSymbol);
          }
        }
      }
      function getExplicitThisType(node) {
        var container = ts2.getThisContainer(node, false);
        if (ts2.isFunctionLike(container)) {
          var signature = getSignatureFromDeclaration(container);
          if (signature.thisParameter) {
            return getExplicitTypeOfSymbol(signature.thisParameter);
          }
        }
        if (ts2.isClassLike(container.parent)) {
          var symbol = getSymbolOfNode(container.parent);
          return ts2.isStatic(container) ? getTypeOfSymbol(symbol) : getDeclaredTypeOfSymbol(symbol).thisType;
        }
      }
      function getClassNameFromPrototypeMethod(container) {
        if (container.kind === 212 && ts2.isBinaryExpression(container.parent) && ts2.getAssignmentDeclarationKind(container.parent) === 3) {
          return container.parent.left.expression.expression;
        } else if (container.kind === 168 && container.parent.kind === 204 && ts2.isBinaryExpression(container.parent.parent) && ts2.getAssignmentDeclarationKind(container.parent.parent) === 6) {
          return container.parent.parent.left.expression;
        } else if (container.kind === 212 && container.parent.kind === 294 && container.parent.parent.kind === 204 && ts2.isBinaryExpression(container.parent.parent.parent) && ts2.getAssignmentDeclarationKind(container.parent.parent.parent) === 6) {
          return container.parent.parent.parent.left.expression;
        } else if (container.kind === 212 && ts2.isPropertyAssignment(container.parent) && ts2.isIdentifier(container.parent.name) && (container.parent.name.escapedText === "value" || container.parent.name.escapedText === "get" || container.parent.name.escapedText === "set") && ts2.isObjectLiteralExpression(container.parent.parent) && ts2.isCallExpression(container.parent.parent.parent) && container.parent.parent.parent.arguments[2] === container.parent.parent && ts2.getAssignmentDeclarationKind(container.parent.parent.parent) === 9) {
          return container.parent.parent.parent.arguments[0].expression;
        } else if (ts2.isMethodDeclaration(container) && ts2.isIdentifier(container.name) && (container.name.escapedText === "value" || container.name.escapedText === "get" || container.name.escapedText === "set") && ts2.isObjectLiteralExpression(container.parent) && ts2.isCallExpression(container.parent.parent) && container.parent.parent.arguments[2] === container.parent && ts2.getAssignmentDeclarationKind(container.parent.parent) === 9) {
          return container.parent.parent.arguments[0].expression;
        }
      }
      function getTypeForThisExpressionFromJSDoc(node) {
        var jsdocType = ts2.getJSDocType(node);
        if (jsdocType && jsdocType.kind === 315) {
          var jsDocFunctionType = jsdocType;
          if (jsDocFunctionType.parameters.length > 0 && jsDocFunctionType.parameters[0].name && jsDocFunctionType.parameters[0].name.escapedText === "this") {
            return getTypeFromTypeNode(jsDocFunctionType.parameters[0].type);
          }
        }
        var thisTag = ts2.getJSDocThisTag(node);
        if (thisTag && thisTag.typeExpression) {
          return getTypeFromTypeNode(thisTag.typeExpression);
        }
      }
      function isInConstructorArgumentInitializer(node, constructorDecl) {
        return !!ts2.findAncestor(node, function(n) {
          return ts2.isFunctionLikeDeclaration(n) ? "quit" : n.kind === 163 && n.parent === constructorDecl;
        });
      }
      function checkSuperExpression(node) {
        var isCallExpression = node.parent.kind === 207 && node.parent.expression === node;
        var immediateContainer = ts2.getSuperContainer(node, true);
        var container = immediateContainer;
        var needToCaptureLexicalThis = false;
        if (!isCallExpression) {
          while (container && container.kind === 213) {
            container = ts2.getSuperContainer(container, true);
            needToCaptureLexicalThis = languageVersion < 2;
          }
        }
        var canUseSuperExpression = isLegalUsageOfSuperExpression(container);
        var nodeCheckFlag = 0;
        if (!canUseSuperExpression) {
          var current = ts2.findAncestor(node, function(n) {
            return n === container ? "quit" : n.kind === 161;
          });
          if (current && current.kind === 161) {
            error(node, ts2.Diagnostics.super_cannot_be_referenced_in_a_computed_property_name);
          } else if (isCallExpression) {
            error(node, ts2.Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors);
          } else if (!container || !container.parent || !(ts2.isClassLike(container.parent) || container.parent.kind === 204)) {
            error(node, ts2.Diagnostics.super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions);
          } else {
            error(node, ts2.Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class);
          }
          return errorType;
        }
        if (!isCallExpression && immediateContainer.kind === 170) {
          checkThisBeforeSuper(node, container, ts2.Diagnostics.super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class);
        }
        if (ts2.isStatic(container) || isCallExpression) {
          nodeCheckFlag = 512;
          if (!isCallExpression && languageVersion >= 2 && languageVersion <= 8 && (ts2.isPropertyDeclaration(container) || ts2.isClassStaticBlockDeclaration(container))) {
            ts2.forEachEnclosingBlockScopeContainer(node.parent, function(current2) {
              if (!ts2.isSourceFile(current2) || ts2.isExternalOrCommonJsModule(current2)) {
                getNodeLinks(current2).flags |= 134217728;
              }
            });
          }
        } else {
          nodeCheckFlag = 256;
        }
        getNodeLinks(node).flags |= nodeCheckFlag;
        if (container.kind === 168 && ts2.hasSyntacticModifier(container, 256)) {
          if (ts2.isSuperProperty(node.parent) && ts2.isAssignmentTarget(node.parent)) {
            getNodeLinks(container).flags |= 4096;
          } else {
            getNodeLinks(container).flags |= 2048;
          }
        }
        if (needToCaptureLexicalThis) {
          captureLexicalThis(node.parent, container);
        }
        if (container.parent.kind === 204) {
          if (languageVersion < 2) {
            error(node, ts2.Diagnostics.super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_higher);
            return errorType;
          } else {
            return anyType;
          }
        }
        var classLikeDeclaration = container.parent;
        if (!ts2.getClassExtendsHeritageElement(classLikeDeclaration)) {
          error(node, ts2.Diagnostics.super_can_only_be_referenced_in_a_derived_class);
          return errorType;
        }
        var classType = getDeclaredTypeOfSymbol(getSymbolOfNode(classLikeDeclaration));
        var baseClassType = classType && getBaseTypes(classType)[0];
        if (!baseClassType) {
          return errorType;
        }
        if (container.kind === 170 && isInConstructorArgumentInitializer(node, container)) {
          error(node, ts2.Diagnostics.super_cannot_be_referenced_in_constructor_arguments);
          return errorType;
        }
        return nodeCheckFlag === 512 ? getBaseConstructorTypeOfClass(classType) : getTypeWithThisArgument(baseClassType, classType.thisType);
        function isLegalUsageOfSuperExpression(container2) {
          if (!container2) {
            return false;
          }
          if (isCallExpression) {
            return container2.kind === 170;
          } else {
            if (ts2.isClassLike(container2.parent) || container2.parent.kind === 204) {
              if (ts2.isStatic(container2)) {
                return container2.kind === 168 || container2.kind === 167 || container2.kind === 171 || container2.kind === 172 || container2.kind === 166 || container2.kind === 169;
              } else {
                return container2.kind === 168 || container2.kind === 167 || container2.kind === 171 || container2.kind === 172 || container2.kind === 166 || container2.kind === 165 || container2.kind === 170;
              }
            }
          }
          return false;
        }
      }
      function getContainingObjectLiteral(func) {
        return (func.kind === 168 || func.kind === 171 || func.kind === 172) && func.parent.kind === 204 ? func.parent : func.kind === 212 && func.parent.kind === 294 ? func.parent.parent : void 0;
      }
      function getThisTypeArgument(type) {
        return ts2.getObjectFlags(type) & 4 && type.target === globalThisType ? getTypeArguments(type)[0] : void 0;
      }
      function getThisTypeFromContextualType(type) {
        return mapType(type, function(t) {
          return t.flags & 2097152 ? ts2.forEach(t.types, getThisTypeArgument) : getThisTypeArgument(t);
        });
      }
      function getContextualThisParameterType(func) {
        if (func.kind === 213) {
          return void 0;
        }
        if (isContextSensitiveFunctionOrObjectLiteralMethod(func)) {
          var contextualSignature = getContextualSignature(func);
          if (contextualSignature) {
            var thisParameter = contextualSignature.thisParameter;
            if (thisParameter) {
              return getTypeOfSymbol(thisParameter);
            }
          }
        }
        var inJs = ts2.isInJSFile(func);
        if (noImplicitThis || inJs) {
          var containingLiteral = getContainingObjectLiteral(func);
          if (containingLiteral) {
            var contextualType = getApparentTypeOfContextualType(containingLiteral);
            var literal = containingLiteral;
            var type = contextualType;
            while (type) {
              var thisType = getThisTypeFromContextualType(type);
              if (thisType) {
                return instantiateType(thisType, getMapperFromContext(getInferenceContext(containingLiteral)));
              }
              if (literal.parent.kind !== 294) {
                break;
              }
              literal = literal.parent.parent;
              type = getApparentTypeOfContextualType(literal);
            }
            return getWidenedType(contextualType ? getNonNullableType(contextualType) : checkExpressionCached(containingLiteral));
          }
          var parent = ts2.walkUpParenthesizedExpressions(func.parent);
          if (parent.kind === 220 && parent.operatorToken.kind === 63) {
            var target = parent.left;
            if (ts2.isAccessExpression(target)) {
              var expression = target.expression;
              if (inJs && ts2.isIdentifier(expression)) {
                var sourceFile = ts2.getSourceFileOfNode(parent);
                if (sourceFile.commonJsModuleIndicator && getResolvedSymbol(expression) === sourceFile.symbol) {
                  return void 0;
                }
              }
              return getWidenedType(checkExpressionCached(expression));
            }
          }
        }
        return void 0;
      }
      function getContextuallyTypedParameterType(parameter) {
        var func = parameter.parent;
        if (!isContextSensitiveFunctionOrObjectLiteralMethod(func)) {
          return void 0;
        }
        var iife = ts2.getImmediatelyInvokedFunctionExpression(func);
        if (iife && iife.arguments) {
          var args = getEffectiveCallArguments(iife);
          var indexOfParameter = func.parameters.indexOf(parameter);
          if (parameter.dotDotDotToken) {
            return getSpreadArgumentType(args, indexOfParameter, args.length, anyType, void 0, 0);
          }
          var links = getNodeLinks(iife);
          var cached = links.resolvedSignature;
          links.resolvedSignature = anySignature;
          var type = indexOfParameter < args.length ? getWidenedLiteralType(checkExpression(args[indexOfParameter])) : parameter.initializer ? void 0 : undefinedWideningType;
          links.resolvedSignature = cached;
          return type;
        }
        var contextualSignature = getContextualSignature(func);
        if (contextualSignature) {
          var index = func.parameters.indexOf(parameter) - (ts2.getThisParameter(func) ? 1 : 0);
          return parameter.dotDotDotToken && ts2.lastOrUndefined(func.parameters) === parameter ? getRestTypeAtPosition(contextualSignature, index) : tryGetTypeAtPosition(contextualSignature, index);
        }
      }
      function getContextualTypeForVariableLikeDeclaration(declaration) {
        var typeNode = ts2.getEffectiveTypeAnnotationNode(declaration);
        if (typeNode) {
          return getTypeFromTypeNode(typeNode);
        }
        switch (declaration.kind) {
          case 163:
            return getContextuallyTypedParameterType(declaration);
          case 202:
            return getContextualTypeForBindingElement(declaration);
          case 166:
            if (ts2.isStatic(declaration)) {
              return getContextualTypeForStaticPropertyDeclaration(declaration);
            }
        }
      }
      function getContextualTypeForBindingElement(declaration) {
        var parent = declaration.parent.parent;
        var name = declaration.propertyName || declaration.name;
        var parentType = getContextualTypeForVariableLikeDeclaration(parent) || parent.kind !== 202 && parent.initializer && checkDeclarationInitializer(parent);
        if (!parentType || ts2.isBindingPattern(name) || ts2.isComputedNonLiteralName(name))
          return void 0;
        if (parent.name.kind === 201) {
          var index = ts2.indexOfNode(declaration.parent.elements, declaration);
          if (index < 0)
            return void 0;
          return getContextualTypeForElementExpression(parentType, index);
        }
        var nameType = getLiteralTypeFromPropertyName(name);
        if (isTypeUsableAsPropertyName(nameType)) {
          var text = getPropertyNameFromType(nameType);
          return getTypeOfPropertyOfType(parentType, text);
        }
      }
      function getContextualTypeForStaticPropertyDeclaration(declaration) {
        var parentType = ts2.isExpression(declaration.parent) && getContextualType(declaration.parent);
        if (!parentType)
          return void 0;
        return getTypeOfPropertyOfContextualType(parentType, getSymbolOfNode(declaration).escapedName);
      }
      function getContextualTypeForInitializerExpression(node, contextFlags) {
        var declaration = node.parent;
        if (ts2.hasInitializer(declaration) && node === declaration.initializer) {
          var result = getContextualTypeForVariableLikeDeclaration(declaration);
          if (result) {
            return result;
          }
          if (!(contextFlags & 8) && ts2.isBindingPattern(declaration.name)) {
            return getTypeFromBindingPattern(declaration.name, true, false);
          }
        }
        return void 0;
      }
      function getContextualTypeForReturnExpression(node) {
        var func = ts2.getContainingFunction(node);
        if (func) {
          var contextualReturnType = getContextualReturnType(func);
          if (contextualReturnType) {
            var functionFlags = ts2.getFunctionFlags(func);
            if (functionFlags & 1) {
              var use = functionFlags & 2 ? 2 : 1;
              var iterationTypes = getIterationTypesOfIterable(contextualReturnType, use, void 0);
              if (!iterationTypes) {
                return void 0;
              }
              contextualReturnType = iterationTypes.returnType;
            }
            if (functionFlags & 2) {
              var contextualAwaitedType = mapType(contextualReturnType, getAwaitedTypeNoAlias);
              return contextualAwaitedType && getUnionType([contextualAwaitedType, createPromiseLikeType(contextualAwaitedType)]);
            }
            return contextualReturnType;
          }
        }
        return void 0;
      }
      function getContextualTypeForAwaitOperand(node, contextFlags) {
        var contextualType = getContextualType(node, contextFlags);
        if (contextualType) {
          var contextualAwaitedType = getAwaitedTypeNoAlias(contextualType);
          return contextualAwaitedType && getUnionType([contextualAwaitedType, createPromiseLikeType(contextualAwaitedType)]);
        }
        return void 0;
      }
      function getContextualTypeForYieldOperand(node) {
        var func = ts2.getContainingFunction(node);
        if (func) {
          var functionFlags = ts2.getFunctionFlags(func);
          var contextualReturnType = getContextualReturnType(func);
          if (contextualReturnType) {
            return node.asteriskToken ? contextualReturnType : getIterationTypeOfGeneratorFunctionReturnType(0, contextualReturnType, (functionFlags & 2) !== 0);
          }
        }
        return void 0;
      }
      function isInParameterInitializerBeforeContainingFunction(node) {
        var inBindingInitializer = false;
        while (node.parent && !ts2.isFunctionLike(node.parent)) {
          if (ts2.isParameter(node.parent) && (inBindingInitializer || node.parent.initializer === node)) {
            return true;
          }
          if (ts2.isBindingElement(node.parent) && node.parent.initializer === node) {
            inBindingInitializer = true;
          }
          node = node.parent;
        }
        return false;
      }
      function getContextualIterationType(kind, functionDecl) {
        var isAsync = !!(ts2.getFunctionFlags(functionDecl) & 2);
        var contextualReturnType = getContextualReturnType(functionDecl);
        if (contextualReturnType) {
          return getIterationTypeOfGeneratorFunctionReturnType(kind, contextualReturnType, isAsync) || void 0;
        }
        return void 0;
      }
      function getContextualReturnType(functionDecl) {
        var returnType = getReturnTypeFromAnnotation(functionDecl);
        if (returnType) {
          return returnType;
        }
        var signature = getContextualSignatureForFunctionLikeDeclaration(functionDecl);
        if (signature && !isResolvingReturnTypeOfSignature(signature)) {
          return getReturnTypeOfSignature(signature);
        }
        var iife = ts2.getImmediatelyInvokedFunctionExpression(functionDecl);
        if (iife) {
          return getContextualType(iife);
        }
        return void 0;
      }
      function getContextualTypeForArgument(callTarget, arg) {
        var args = getEffectiveCallArguments(callTarget);
        var argIndex = args.indexOf(arg);
        return argIndex === -1 ? void 0 : getContextualTypeForArgumentAtIndex(callTarget, argIndex);
      }
      function getContextualTypeForArgumentAtIndex(callTarget, argIndex) {
        if (ts2.isImportCall(callTarget)) {
          return argIndex === 0 ? stringType : argIndex === 1 ? getGlobalImportCallOptionsType(false) : anyType;
        }
        var signature = getNodeLinks(callTarget).resolvedSignature === resolvingSignature ? resolvingSignature : getResolvedSignature(callTarget);
        if (ts2.isJsxOpeningLikeElement(callTarget) && argIndex === 0) {
          return getEffectiveFirstArgumentForJsxSignature(signature, callTarget);
        }
        var restIndex = signature.parameters.length - 1;
        return signatureHasRestParameter(signature) && argIndex >= restIndex ? getIndexedAccessType(getTypeOfSymbol(signature.parameters[restIndex]), getNumberLiteralType(argIndex - restIndex), 256) : getTypeAtPosition(signature, argIndex);
      }
      function getContextualTypeForSubstitutionExpression(template, substitutionExpression) {
        if (template.parent.kind === 209) {
          return getContextualTypeForArgument(template.parent, substitutionExpression);
        }
        return void 0;
      }
      function getContextualTypeForBinaryOperand(node, contextFlags) {
        var binaryExpression = node.parent;
        var left = binaryExpression.left, operatorToken = binaryExpression.operatorToken, right = binaryExpression.right;
        switch (operatorToken.kind) {
          case 63:
          case 76:
          case 75:
          case 77:
            return node === right ? getContextualTypeForAssignmentDeclaration(binaryExpression) : void 0;
          case 56:
          case 60:
            var type = getContextualType(binaryExpression, contextFlags);
            return node === right && (type && type.pattern || !type && !ts2.isDefaultedExpandoInitializer(binaryExpression)) ? getTypeOfExpression(left) : type;
          case 55:
          case 27:
            return node === right ? getContextualType(binaryExpression, contextFlags) : void 0;
          default:
            return void 0;
        }
      }
      function getSymbolForExpression(e) {
        if (e.symbol) {
          return e.symbol;
        }
        if (ts2.isIdentifier(e)) {
          return getResolvedSymbol(e);
        }
        if (ts2.isPropertyAccessExpression(e)) {
          var lhsType = getTypeOfExpression(e.expression);
          return ts2.isPrivateIdentifier(e.name) ? tryGetPrivateIdentifierPropertyOfType(lhsType, e.name) : getPropertyOfType(lhsType, e.name.escapedText);
        }
        return void 0;
        function tryGetPrivateIdentifierPropertyOfType(type, id) {
          var lexicallyScopedSymbol = lookupSymbolForPrivateIdentifierDeclaration(id.escapedText, id);
          return lexicallyScopedSymbol && getPrivateIdentifierPropertyOfType(type, lexicallyScopedSymbol);
        }
      }
      function getContextualTypeForAssignmentDeclaration(binaryExpression) {
        var _a, _b;
        var kind = ts2.getAssignmentDeclarationKind(binaryExpression);
        switch (kind) {
          case 0:
          case 4:
            var lhsSymbol = getSymbolForExpression(binaryExpression.left);
            var decl = lhsSymbol && lhsSymbol.valueDeclaration;
            if (decl && (ts2.isPropertyDeclaration(decl) || ts2.isPropertySignature(decl))) {
              var overallAnnotation = ts2.getEffectiveTypeAnnotationNode(decl);
              return overallAnnotation && instantiateType(getTypeFromTypeNode(overallAnnotation), getSymbolLinks(lhsSymbol).mapper) || decl.initializer && getTypeOfExpression(binaryExpression.left);
            }
            if (kind === 0) {
              return getTypeOfExpression(binaryExpression.left);
            }
            return getContextualTypeForThisPropertyAssignment(binaryExpression);
          case 5:
            if (isPossiblyAliasedThisProperty(binaryExpression, kind)) {
              return getContextualTypeForThisPropertyAssignment(binaryExpression);
            } else if (!binaryExpression.left.symbol) {
              return getTypeOfExpression(binaryExpression.left);
            } else {
              var decl_1 = binaryExpression.left.symbol.valueDeclaration;
              if (!decl_1) {
                return void 0;
              }
              var lhs = ts2.cast(binaryExpression.left, ts2.isAccessExpression);
              var overallAnnotation = ts2.getEffectiveTypeAnnotationNode(decl_1);
              if (overallAnnotation) {
                return getTypeFromTypeNode(overallAnnotation);
              } else if (ts2.isIdentifier(lhs.expression)) {
                var id = lhs.expression;
                var parentSymbol = resolveName(id, id.escapedText, 111551, void 0, id.escapedText, true);
                if (parentSymbol) {
                  var annotated_1 = parentSymbol.valueDeclaration && ts2.getEffectiveTypeAnnotationNode(parentSymbol.valueDeclaration);
                  if (annotated_1) {
                    var nameStr = ts2.getElementOrPropertyAccessName(lhs);
                    if (nameStr !== void 0) {
                      return getTypeOfPropertyOfContextualType(getTypeFromTypeNode(annotated_1), nameStr);
                    }
                  }
                  return void 0;
                }
              }
              return ts2.isInJSFile(decl_1) ? void 0 : getTypeOfExpression(binaryExpression.left);
            }
          case 1:
          case 6:
          case 3:
            var valueDeclaration = (_a = binaryExpression.left.symbol) === null || _a === void 0 ? void 0 : _a.valueDeclaration;
          case 2:
            valueDeclaration || (valueDeclaration = (_b = binaryExpression.symbol) === null || _b === void 0 ? void 0 : _b.valueDeclaration);
            var annotated = valueDeclaration && ts2.getEffectiveTypeAnnotationNode(valueDeclaration);
            return annotated ? getTypeFromTypeNode(annotated) : void 0;
          case 7:
          case 8:
          case 9:
            return ts2.Debug.fail("Does not apply");
          default:
            return ts2.Debug.assertNever(kind);
        }
      }
      function isPossiblyAliasedThisProperty(declaration, kind) {
        if (kind === void 0) {
          kind = ts2.getAssignmentDeclarationKind(declaration);
        }
        if (kind === 4) {
          return true;
        }
        if (!ts2.isInJSFile(declaration) || kind !== 5 || !ts2.isIdentifier(declaration.left.expression)) {
          return false;
        }
        var name = declaration.left.expression.escapedText;
        var symbol = resolveName(declaration.left, name, 111551, void 0, void 0, true, true);
        return ts2.isThisInitializedDeclaration(symbol === null || symbol === void 0 ? void 0 : symbol.valueDeclaration);
      }
      function getContextualTypeForThisPropertyAssignment(binaryExpression) {
        if (!binaryExpression.symbol)
          return getTypeOfExpression(binaryExpression.left);
        if (binaryExpression.symbol.valueDeclaration) {
          var annotated = ts2.getEffectiveTypeAnnotationNode(binaryExpression.symbol.valueDeclaration);
          if (annotated) {
            var type = getTypeFromTypeNode(annotated);
            if (type) {
              return type;
            }
          }
        }
        var thisAccess = ts2.cast(binaryExpression.left, ts2.isAccessExpression);
        if (!ts2.isObjectLiteralMethod(ts2.getThisContainer(thisAccess.expression, false))) {
          return void 0;
        }
        var thisType = checkThisExpression(thisAccess.expression);
        var nameStr = ts2.getElementOrPropertyAccessName(thisAccess);
        return nameStr !== void 0 && getTypeOfPropertyOfContextualType(thisType, nameStr) || void 0;
      }
      function isCircularMappedProperty(symbol) {
        return !!(ts2.getCheckFlags(symbol) & 262144 && !symbol.type && findResolutionCycleStartIndex(symbol, 0) >= 0);
      }
      function getTypeOfPropertyOfContextualType(type, name) {
        return mapType(type, function(t) {
          var _a;
          if (isGenericMappedType(t)) {
            var constraint = getConstraintTypeFromMappedType(t);
            var constraintOfConstraint = getBaseConstraintOfType(constraint) || constraint;
            var propertyNameType = getStringLiteralType(ts2.unescapeLeadingUnderscores(name));
            if (isTypeAssignableTo(propertyNameType, constraintOfConstraint)) {
              return substituteIndexedMappedType(t, propertyNameType);
            }
          } else if (t.flags & 3670016) {
            var prop = getPropertyOfType(t, name);
            if (prop) {
              return isCircularMappedProperty(prop) ? void 0 : getTypeOfSymbol(prop);
            }
            if (isTupleType(t)) {
              var restType = getRestTypeOfTupleType(t);
              if (restType && isNumericLiteralName(name) && +name >= 0) {
                return restType;
              }
            }
            return (_a = findApplicableIndexInfo(getIndexInfosOfStructuredType(t), getStringLiteralType(ts2.unescapeLeadingUnderscores(name)))) === null || _a === void 0 ? void 0 : _a.type;
          }
          return void 0;
        }, true);
      }
      function getContextualTypeForObjectLiteralMethod(node, contextFlags) {
        ts2.Debug.assert(ts2.isObjectLiteralMethod(node));
        if (node.flags & 16777216) {
          return void 0;
        }
        return getContextualTypeForObjectLiteralElement(node, contextFlags);
      }
      function getContextualTypeForObjectLiteralElement(element, contextFlags) {
        var objectLiteral = element.parent;
        var propertyAssignmentType = ts2.isPropertyAssignment(element) && getContextualTypeForVariableLikeDeclaration(element);
        if (propertyAssignmentType) {
          return propertyAssignmentType;
        }
        var type = getApparentTypeOfContextualType(objectLiteral, contextFlags);
        if (type) {
          if (hasBindableName(element)) {
            return getTypeOfPropertyOfContextualType(type, getSymbolOfNode(element).escapedName);
          }
          if (element.name) {
            var nameType_2 = getLiteralTypeFromPropertyName(element.name);
            return mapType(type, function(t) {
              var _a;
              return (_a = findApplicableIndexInfo(getIndexInfosOfStructuredType(t), nameType_2)) === null || _a === void 0 ? void 0 : _a.type;
            }, true);
          }
        }
        return void 0;
      }
      function getContextualTypeForElementExpression(arrayContextualType, index) {
        return arrayContextualType && (getTypeOfPropertyOfContextualType(arrayContextualType, "" + index) || mapType(arrayContextualType, function(t) {
          return getIteratedTypeOrElementType(1, t, undefinedType, void 0, false);
        }, true));
      }
      function getContextualTypeForConditionalOperand(node, contextFlags) {
        var conditional = node.parent;
        return node === conditional.whenTrue || node === conditional.whenFalse ? getContextualType(conditional, contextFlags) : void 0;
      }
      function getContextualTypeForChildJsxExpression(node, child) {
        var attributesType = getApparentTypeOfContextualType(node.openingElement.tagName);
        var jsxChildrenPropertyName = getJsxElementChildrenPropertyName(getJsxNamespaceAt(node));
        if (!(attributesType && !isTypeAny(attributesType) && jsxChildrenPropertyName && jsxChildrenPropertyName !== "")) {
          return void 0;
        }
        var realChildren = ts2.getSemanticJsxChildren(node.children);
        var childIndex = realChildren.indexOf(child);
        var childFieldType = getTypeOfPropertyOfContextualType(attributesType, jsxChildrenPropertyName);
        return childFieldType && (realChildren.length === 1 ? childFieldType : mapType(childFieldType, function(t) {
          if (isArrayLikeType(t)) {
            return getIndexedAccessType(t, getNumberLiteralType(childIndex));
          } else {
            return t;
          }
        }, true));
      }
      function getContextualTypeForJsxExpression(node) {
        var exprParent = node.parent;
        return ts2.isJsxAttributeLike(exprParent) ? getContextualType(node) : ts2.isJsxElement(exprParent) ? getContextualTypeForChildJsxExpression(exprParent, node) : void 0;
      }
      function getContextualTypeForJsxAttribute(attribute) {
        if (ts2.isJsxAttribute(attribute)) {
          var attributesType = getApparentTypeOfContextualType(attribute.parent);
          if (!attributesType || isTypeAny(attributesType)) {
            return void 0;
          }
          return getTypeOfPropertyOfContextualType(attributesType, attribute.name.escapedText);
        } else {
          return getContextualType(attribute.parent);
        }
      }
      function isPossiblyDiscriminantValue(node) {
        switch (node.kind) {
          case 10:
          case 8:
          case 9:
          case 14:
          case 110:
          case 95:
          case 104:
          case 79:
          case 152:
            return true;
          case 205:
          case 211:
            return isPossiblyDiscriminantValue(node.expression);
          case 287:
            return !node.expression || isPossiblyDiscriminantValue(node.expression);
        }
        return false;
      }
      function discriminateContextualTypeByObjectMembers(node, contextualType) {
        return getMatchingUnionConstituentForObjectLiteral(contextualType, node) || discriminateTypeByDiscriminableItems(contextualType, ts2.concatenate(ts2.map(ts2.filter(node.properties, function(p) {
          return !!p.symbol && p.kind === 294 && isPossiblyDiscriminantValue(p.initializer) && isDiscriminantProperty(contextualType, p.symbol.escapedName);
        }), function(prop) {
          return [function() {
            return getContextFreeTypeOfExpression(prop.initializer);
          }, prop.symbol.escapedName];
        }), ts2.map(ts2.filter(getPropertiesOfType(contextualType), function(s) {
          var _a;
          return !!(s.flags & 16777216) && !!((_a = node === null || node === void 0 ? void 0 : node.symbol) === null || _a === void 0 ? void 0 : _a.members) && !node.symbol.members.has(s.escapedName) && isDiscriminantProperty(contextualType, s.escapedName);
        }), function(s) {
          return [function() {
            return undefinedType;
          }, s.escapedName];
        })), isTypeAssignableTo, contextualType);
      }
      function discriminateContextualTypeByJSXAttributes(node, contextualType) {
        return discriminateTypeByDiscriminableItems(contextualType, ts2.concatenate(ts2.map(ts2.filter(node.properties, function(p) {
          return !!p.symbol && p.kind === 284 && isDiscriminantProperty(contextualType, p.symbol.escapedName) && (!p.initializer || isPossiblyDiscriminantValue(p.initializer));
        }), function(prop) {
          return [!prop.initializer ? function() {
            return trueType;
          } : function() {
            return getContextFreeTypeOfExpression(prop.initializer);
          }, prop.symbol.escapedName];
        }), ts2.map(ts2.filter(getPropertiesOfType(contextualType), function(s) {
          var _a;
          return !!(s.flags & 16777216) && !!((_a = node === null || node === void 0 ? void 0 : node.symbol) === null || _a === void 0 ? void 0 : _a.members) && !node.symbol.members.has(s.escapedName) && isDiscriminantProperty(contextualType, s.escapedName);
        }), function(s) {
          return [function() {
            return undefinedType;
          }, s.escapedName];
        })), isTypeAssignableTo, contextualType);
      }
      function getApparentTypeOfContextualType(node, contextFlags) {
        var contextualType = ts2.isObjectLiteralMethod(node) ? getContextualTypeForObjectLiteralMethod(node, contextFlags) : getContextualType(node, contextFlags);
        var instantiatedType = instantiateContextualType(contextualType, node, contextFlags);
        if (instantiatedType && !(contextFlags && contextFlags & 2 && instantiatedType.flags & 8650752)) {
          var apparentType = mapType(instantiatedType, getApparentType, true);
          return apparentType.flags & 1048576 && ts2.isObjectLiteralExpression(node) ? discriminateContextualTypeByObjectMembers(node, apparentType) : apparentType.flags & 1048576 && ts2.isJsxAttributes(node) ? discriminateContextualTypeByJSXAttributes(node, apparentType) : apparentType;
        }
      }
      function instantiateContextualType(contextualType, node, contextFlags) {
        if (contextualType && maybeTypeOfKind(contextualType, 465829888)) {
          var inferenceContext = getInferenceContext(node);
          if (inferenceContext && ts2.some(inferenceContext.inferences, hasInferenceCandidates)) {
            if (contextFlags && contextFlags & 1) {
              return instantiateInstantiableTypes(contextualType, inferenceContext.nonFixingMapper);
            }
            if (inferenceContext.returnMapper) {
              return instantiateInstantiableTypes(contextualType, inferenceContext.returnMapper);
            }
          }
        }
        return contextualType;
      }
      function instantiateInstantiableTypes(type, mapper) {
        if (type.flags & 465829888) {
          return instantiateType(type, mapper);
        }
        if (type.flags & 1048576) {
          return getUnionType(ts2.map(type.types, function(t) {
            return instantiateInstantiableTypes(t, mapper);
          }), 0);
        }
        if (type.flags & 2097152) {
          return getIntersectionType(ts2.map(type.types, function(t) {
            return instantiateInstantiableTypes(t, mapper);
          }));
        }
        return type;
      }
      function getContextualType(node, contextFlags) {
        if (node.flags & 16777216) {
          return void 0;
        }
        if (node.contextualType) {
          return node.contextualType;
        }
        var parent = node.parent;
        switch (parent.kind) {
          case 253:
          case 163:
          case 166:
          case 165:
          case 202:
            return getContextualTypeForInitializerExpression(node, contextFlags);
          case 213:
          case 246:
            return getContextualTypeForReturnExpression(node);
          case 223:
            return getContextualTypeForYieldOperand(parent);
          case 217:
            return getContextualTypeForAwaitOperand(parent, contextFlags);
          case 207:
          case 208:
            return getContextualTypeForArgument(parent, node);
          case 210:
          case 228:
            return ts2.isConstTypeReference(parent.type) ? tryFindWhenConstTypeReference(parent) : getTypeFromTypeNode(parent.type);
          case 220:
            return getContextualTypeForBinaryOperand(node, contextFlags);
          case 294:
          case 295:
            return getContextualTypeForObjectLiteralElement(parent, contextFlags);
          case 296:
            return getContextualType(parent.parent, contextFlags);
          case 203: {
            var arrayLiteral = parent;
            var type = getApparentTypeOfContextualType(arrayLiteral, contextFlags);
            return getContextualTypeForElementExpression(type, ts2.indexOfNode(arrayLiteral.elements, node));
          }
          case 221:
            return getContextualTypeForConditionalOperand(node, contextFlags);
          case 232:
            ts2.Debug.assert(parent.parent.kind === 222);
            return getContextualTypeForSubstitutionExpression(parent.parent, node);
          case 211: {
            var tag = ts2.isInJSFile(parent) ? ts2.getJSDocTypeTag(parent) : void 0;
            return !tag ? getContextualType(parent, contextFlags) : ts2.isJSDocTypeTag(tag) && ts2.isConstTypeReference(tag.typeExpression.type) ? tryFindWhenConstTypeReference(parent) : getTypeFromTypeNode(tag.typeExpression.type);
          }
          case 229:
            return getContextualType(parent, contextFlags);
          case 287:
            return getContextualTypeForJsxExpression(parent);
          case 284:
          case 286:
            return getContextualTypeForJsxAttribute(parent);
          case 279:
          case 278:
            return getContextualJsxElementAttributesType(parent, contextFlags);
        }
        return void 0;
        function tryFindWhenConstTypeReference(node2) {
          return getContextualType(node2);
        }
      }
      function getInferenceContext(node) {
        var ancestor = ts2.findAncestor(node, function(n) {
          return !!n.inferenceContext;
        });
        return ancestor && ancestor.inferenceContext;
      }
      function getContextualJsxElementAttributesType(node, contextFlags) {
        if (ts2.isJsxOpeningElement(node) && node.parent.contextualType && contextFlags !== 4) {
          return node.parent.contextualType;
        }
        return getContextualTypeForArgumentAtIndex(node, 0);
      }
      function getEffectiveFirstArgumentForJsxSignature(signature, node) {
        return getJsxReferenceKind(node) !== 0 ? getJsxPropsTypeFromCallSignature(signature, node) : getJsxPropsTypeFromClassType(signature, node);
      }
      function getJsxPropsTypeFromCallSignature(sig, context) {
        var propsType = getTypeOfFirstParameterOfSignatureWithFallback(sig, unknownType);
        propsType = getJsxManagedAttributesFromLocatedAttributes(context, getJsxNamespaceAt(context), propsType);
        var intrinsicAttribs = getJsxType(JsxNames.IntrinsicAttributes, context);
        if (!isErrorType(intrinsicAttribs)) {
          propsType = intersectTypes(intrinsicAttribs, propsType);
        }
        return propsType;
      }
      function getJsxPropsTypeForSignatureFromMember(sig, forcedLookupLocation) {
        if (sig.compositeSignatures) {
          var results = [];
          for (var _i = 0, _a = sig.compositeSignatures; _i < _a.length; _i++) {
            var signature = _a[_i];
            var instance = getReturnTypeOfSignature(signature);
            if (isTypeAny(instance)) {
              return instance;
            }
            var propType = getTypeOfPropertyOfType(instance, forcedLookupLocation);
            if (!propType) {
              return;
            }
            results.push(propType);
          }
          return getIntersectionType(results);
        }
        var instanceType = getReturnTypeOfSignature(sig);
        return isTypeAny(instanceType) ? instanceType : getTypeOfPropertyOfType(instanceType, forcedLookupLocation);
      }
      function getStaticTypeOfReferencedJsxConstructor(context) {
        if (isJsxIntrinsicIdentifier(context.tagName)) {
          var result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(context);
          var fakeSignature = createSignatureForJSXIntrinsic(context, result);
          return getOrCreateTypeFromSignature(fakeSignature);
        }
        var tagType = checkExpressionCached(context.tagName);
        if (tagType.flags & 128) {
          var result = getIntrinsicAttributesTypeFromStringLiteralType(tagType, context);
          if (!result) {
            return errorType;
          }
          var fakeSignature = createSignatureForJSXIntrinsic(context, result);
          return getOrCreateTypeFromSignature(fakeSignature);
        }
        return tagType;
      }
      function getJsxManagedAttributesFromLocatedAttributes(context, ns, attributesType) {
        var managedSym = getJsxLibraryManagedAttributes(ns);
        if (managedSym) {
          var declaredManagedType = getDeclaredTypeOfSymbol(managedSym);
          var ctorType = getStaticTypeOfReferencedJsxConstructor(context);
          if (managedSym.flags & 524288) {
            var params = getSymbolLinks(managedSym).typeParameters;
            if (ts2.length(params) >= 2) {
              var args = fillMissingTypeArguments([ctorType, attributesType], params, 2, ts2.isInJSFile(context));
              return getTypeAliasInstantiation(managedSym, args);
            }
          }
          if (ts2.length(declaredManagedType.typeParameters) >= 2) {
            var args = fillMissingTypeArguments([ctorType, attributesType], declaredManagedType.typeParameters, 2, ts2.isInJSFile(context));
            return createTypeReference(declaredManagedType, args);
          }
        }
        return attributesType;
      }
      function getJsxPropsTypeFromClassType(sig, context) {
        var ns = getJsxNamespaceAt(context);
        var forcedLookupLocation = getJsxElementPropertiesName(ns);
        var attributesType = forcedLookupLocation === void 0 ? getTypeOfFirstParameterOfSignatureWithFallback(sig, unknownType) : forcedLookupLocation === "" ? getReturnTypeOfSignature(sig) : getJsxPropsTypeForSignatureFromMember(sig, forcedLookupLocation);
        if (!attributesType) {
          if (!!forcedLookupLocation && !!ts2.length(context.attributes.properties)) {
            error(context, ts2.Diagnostics.JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property, ts2.unescapeLeadingUnderscores(forcedLookupLocation));
          }
          return unknownType;
        }
        attributesType = getJsxManagedAttributesFromLocatedAttributes(context, ns, attributesType);
        if (isTypeAny(attributesType)) {
          return attributesType;
        } else {
          var apparentAttributesType = attributesType;
          var intrinsicClassAttribs = getJsxType(JsxNames.IntrinsicClassAttributes, context);
          if (!isErrorType(intrinsicClassAttribs)) {
            var typeParams = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(intrinsicClassAttribs.symbol);
            var hostClassType = getReturnTypeOfSignature(sig);
            apparentAttributesType = intersectTypes(typeParams ? createTypeReference(intrinsicClassAttribs, fillMissingTypeArguments([hostClassType], typeParams, getMinTypeArgumentCount(typeParams), ts2.isInJSFile(context))) : intrinsicClassAttribs, apparentAttributesType);
          }
          var intrinsicAttribs = getJsxType(JsxNames.IntrinsicAttributes, context);
          if (!isErrorType(intrinsicAttribs)) {
            apparentAttributesType = intersectTypes(intrinsicAttribs, apparentAttributesType);
          }
          return apparentAttributesType;
        }
      }
      function getIntersectedSignatures(signatures) {
        return ts2.getStrictOptionValue(compilerOptions, "noImplicitAny") ? ts2.reduceLeft(signatures, function(left, right) {
          return left === right || !left ? left : compareTypeParametersIdentical(left.typeParameters, right.typeParameters) ? combineSignaturesOfIntersectionMembers(left, right) : void 0;
        }) : void 0;
      }
      function combineIntersectionThisParam(left, right, mapper) {
        if (!left || !right) {
          return left || right;
        }
        var thisType = getUnionType([getTypeOfSymbol(left), instantiateType(getTypeOfSymbol(right), mapper)]);
        return createSymbolWithType(left, thisType);
      }
      function combineIntersectionParameters(left, right, mapper) {
        var leftCount = getParameterCount(left);
        var rightCount = getParameterCount(right);
        var longest = leftCount >= rightCount ? left : right;
        var shorter = longest === left ? right : left;
        var longestCount = longest === left ? leftCount : rightCount;
        var eitherHasEffectiveRest = hasEffectiveRestParameter(left) || hasEffectiveRestParameter(right);
        var needsExtraRestElement = eitherHasEffectiveRest && !hasEffectiveRestParameter(longest);
        var params = new Array(longestCount + (needsExtraRestElement ? 1 : 0));
        for (var i = 0; i < longestCount; i++) {
          var longestParamType = tryGetTypeAtPosition(longest, i);
          if (longest === right) {
            longestParamType = instantiateType(longestParamType, mapper);
          }
          var shorterParamType = tryGetTypeAtPosition(shorter, i) || unknownType;
          if (shorter === right) {
            shorterParamType = instantiateType(shorterParamType, mapper);
          }
          var unionParamType = getUnionType([longestParamType, shorterParamType]);
          var isRestParam = eitherHasEffectiveRest && !needsExtraRestElement && i === longestCount - 1;
          var isOptional = i >= getMinArgumentCount(longest) && i >= getMinArgumentCount(shorter);
          var leftName = i >= leftCount ? void 0 : getParameterNameAtPosition(left, i);
          var rightName = i >= rightCount ? void 0 : getParameterNameAtPosition(right, i);
          var paramName = leftName === rightName ? leftName : !leftName ? rightName : !rightName ? leftName : void 0;
          var paramSymbol = createSymbol(1 | (isOptional && !isRestParam ? 16777216 : 0), paramName || "arg".concat(i));
          paramSymbol.type = isRestParam ? createArrayType(unionParamType) : unionParamType;
          params[i] = paramSymbol;
        }
        if (needsExtraRestElement) {
          var restParamSymbol = createSymbol(1, "args");
          restParamSymbol.type = createArrayType(getTypeAtPosition(shorter, longestCount));
          if (shorter === right) {
            restParamSymbol.type = instantiateType(restParamSymbol.type, mapper);
          }
          params[longestCount] = restParamSymbol;
        }
        return params;
      }
      function combineSignaturesOfIntersectionMembers(left, right) {
        var typeParams = left.typeParameters || right.typeParameters;
        var paramMapper;
        if (left.typeParameters && right.typeParameters) {
          paramMapper = createTypeMapper(right.typeParameters, left.typeParameters);
        }
        var declaration = left.declaration;
        var params = combineIntersectionParameters(left, right, paramMapper);
        var thisParam = combineIntersectionThisParam(left.thisParameter, right.thisParameter, paramMapper);
        var minArgCount = Math.max(left.minArgumentCount, right.minArgumentCount);
        var result = createSignature(declaration, typeParams, thisParam, params, void 0, void 0, minArgCount, (left.flags | right.flags) & 39);
        result.compositeKind = 2097152;
        result.compositeSignatures = ts2.concatenate(left.compositeKind === 2097152 && left.compositeSignatures || [left], [right]);
        if (paramMapper) {
          result.mapper = left.compositeKind === 2097152 && left.mapper && left.compositeSignatures ? combineTypeMappers(left.mapper, paramMapper) : paramMapper;
        }
        return result;
      }
      function getContextualCallSignature(type, node) {
        var signatures = getSignaturesOfType(type, 0);
        var applicableByArity = ts2.filter(signatures, function(s) {
          return !isAritySmaller(s, node);
        });
        return applicableByArity.length === 1 ? applicableByArity[0] : getIntersectedSignatures(applicableByArity);
      }
      function isAritySmaller(signature, target) {
        var targetParameterCount = 0;
        for (; targetParameterCount < target.parameters.length; targetParameterCount++) {
          var param = target.parameters[targetParameterCount];
          if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) {
            break;
          }
        }
        if (target.parameters.length && ts2.parameterIsThisKeyword(target.parameters[0])) {
          targetParameterCount--;
        }
        return !hasEffectiveRestParameter(signature) && getParameterCount(signature) < targetParameterCount;
      }
      function getContextualSignatureForFunctionLikeDeclaration(node) {
        return ts2.isFunctionExpressionOrArrowFunction(node) || ts2.isObjectLiteralMethod(node) ? getContextualSignature(node) : void 0;
      }
      function getContextualSignature(node) {
        ts2.Debug.assert(node.kind !== 168 || ts2.isObjectLiteralMethod(node));
        var typeTagSignature = getSignatureOfTypeTag(node);
        if (typeTagSignature) {
          return typeTagSignature;
        }
        var type = getApparentTypeOfContextualType(node, 1);
        if (!type) {
          return void 0;
        }
        if (!(type.flags & 1048576)) {
          return getContextualCallSignature(type, node);
        }
        var signatureList;
        var types = type.types;
        for (var _i = 0, types_19 = types; _i < types_19.length; _i++) {
          var current = types_19[_i];
          var signature = getContextualCallSignature(current, node);
          if (signature) {
            if (!signatureList) {
              signatureList = [signature];
            } else if (!compareSignaturesIdentical(signatureList[0], signature, false, true, true, compareTypesIdentical)) {
              return void 0;
            } else {
              signatureList.push(signature);
            }
          }
        }
        if (signatureList) {
          return signatureList.length === 1 ? signatureList[0] : createUnionSignature(signatureList[0], signatureList);
        }
      }
      function checkSpreadExpression(node, checkMode) {
        if (languageVersion < 2) {
          checkExternalEmitHelpers(node, compilerOptions.downlevelIteration ? 1536 : 1024);
        }
        var arrayOrIterableType = checkExpression(node.expression, checkMode);
        return checkIteratedTypeOrElementType(33, arrayOrIterableType, undefinedType, node.expression);
      }
      function checkSyntheticExpression(node) {
        return node.isSpread ? getIndexedAccessType(node.type, numberType) : node.type;
      }
      function hasDefaultValue(node) {
        return node.kind === 202 && !!node.initializer || node.kind === 220 && node.operatorToken.kind === 63;
      }
      function checkArrayLiteral(node, checkMode, forceTuple) {
        var elements = node.elements;
        var elementCount = elements.length;
        var elementTypes = [];
        var elementFlags = [];
        var contextualType = getApparentTypeOfContextualType(node);
        var inDestructuringPattern = ts2.isAssignmentTarget(node);
        var inConstContext = isConstContext(node);
        var hasOmittedExpression = false;
        for (var i = 0; i < elementCount; i++) {
          var e = elements[i];
          if (e.kind === 224) {
            if (languageVersion < 2) {
              checkExternalEmitHelpers(e, compilerOptions.downlevelIteration ? 1536 : 1024);
            }
            var spreadType = checkExpression(e.expression, checkMode, forceTuple);
            if (isArrayLikeType(spreadType)) {
              elementTypes.push(spreadType);
              elementFlags.push(8);
            } else if (inDestructuringPattern) {
              var restElementType = getIndexTypeOfType(spreadType, numberType) || getIteratedTypeOrElementType(65, spreadType, undefinedType, void 0, false) || unknownType;
              elementTypes.push(restElementType);
              elementFlags.push(4);
            } else {
              elementTypes.push(checkIteratedTypeOrElementType(33, spreadType, undefinedType, e.expression));
              elementFlags.push(4);
            }
          } else if (exactOptionalPropertyTypes && e.kind === 226) {
            hasOmittedExpression = true;
            elementTypes.push(missingType);
            elementFlags.push(2);
          } else {
            var elementContextualType = getContextualTypeForElementExpression(contextualType, elementTypes.length);
            var type = checkExpressionForMutableLocation(e, checkMode, elementContextualType, forceTuple);
            elementTypes.push(addOptionality(type, true, hasOmittedExpression));
            elementFlags.push(hasOmittedExpression ? 2 : 1);
          }
        }
        if (inDestructuringPattern) {
          return createTupleType(elementTypes, elementFlags);
        }
        if (forceTuple || inConstContext || contextualType && someType(contextualType, isTupleLikeType)) {
          return createArrayLiteralType(createTupleType(elementTypes, elementFlags, inConstContext));
        }
        return createArrayLiteralType(createArrayType(elementTypes.length ? getUnionType(ts2.sameMap(elementTypes, function(t, i2) {
          return elementFlags[i2] & 8 ? getIndexedAccessTypeOrUndefined(t, numberType) || anyType : t;
        }), 2) : strictNullChecks ? implicitNeverType : undefinedWideningType, inConstContext));
      }
      function createArrayLiteralType(type) {
        if (!(ts2.getObjectFlags(type) & 4)) {
          return type;
        }
        var literalType = type.literalType;
        if (!literalType) {
          literalType = type.literalType = cloneTypeReference(type);
          literalType.objectFlags |= 32768 | 262144;
        }
        return literalType;
      }
      function isNumericName(name) {
        switch (name.kind) {
          case 161:
            return isNumericComputedName(name);
          case 79:
            return isNumericLiteralName(name.escapedText);
          case 8:
          case 10:
            return isNumericLiteralName(name.text);
          default:
            return false;
        }
      }
      function isNumericComputedName(name) {
        return isTypeAssignableToKind(checkComputedPropertyName(name), 296);
      }
      function isNumericLiteralName(name) {
        return (+name).toString() === name;
      }
      function checkComputedPropertyName(node) {
        var links = getNodeLinks(node.expression);
        if (!links.resolvedType) {
          if ((ts2.isTypeLiteralNode(node.parent.parent) || ts2.isClassLike(node.parent.parent) || ts2.isInterfaceDeclaration(node.parent.parent)) && ts2.isBinaryExpression(node.expression) && node.expression.operatorToken.kind === 101) {
            return links.resolvedType = errorType;
          }
          links.resolvedType = checkExpression(node.expression);
          if (ts2.isPropertyDeclaration(node.parent) && !ts2.hasStaticModifier(node.parent) && ts2.isClassExpression(node.parent.parent)) {
            var container = ts2.getEnclosingBlockScopeContainer(node.parent.parent);
            var enclosingIterationStatement = getEnclosingIterationStatement(container);
            if (enclosingIterationStatement) {
              getNodeLinks(enclosingIterationStatement).flags |= 65536;
              getNodeLinks(node).flags |= 524288;
              getNodeLinks(node.parent.parent).flags |= 524288;
            }
          }
          if (links.resolvedType.flags & 98304 || !isTypeAssignableToKind(links.resolvedType, 402653316 | 296 | 12288) && !isTypeAssignableTo(links.resolvedType, stringNumberSymbolType)) {
            error(node, ts2.Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any);
          }
        }
        return links.resolvedType;
      }
      function isSymbolWithNumericName(symbol) {
        var _a;
        var firstDecl = (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a[0];
        return isNumericLiteralName(symbol.escapedName) || firstDecl && ts2.isNamedDeclaration(firstDecl) && isNumericName(firstDecl.name);
      }
      function isSymbolWithSymbolName(symbol) {
        var _a;
        var firstDecl = (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a[0];
        return ts2.isKnownSymbol(symbol) || firstDecl && ts2.isNamedDeclaration(firstDecl) && ts2.isComputedPropertyName(firstDecl.name) && isTypeAssignableToKind(checkComputedPropertyName(firstDecl.name), 4096);
      }
      function getObjectLiteralIndexInfo(node, offset, properties, keyType) {
        var propTypes = [];
        for (var i = offset; i < properties.length; i++) {
          var prop = properties[i];
          if (keyType === stringType && !isSymbolWithSymbolName(prop) || keyType === numberType && isSymbolWithNumericName(prop) || keyType === esSymbolType && isSymbolWithSymbolName(prop)) {
            propTypes.push(getTypeOfSymbol(properties[i]));
          }
        }
        var unionType = propTypes.length ? getUnionType(propTypes, 2) : undefinedType;
        return createIndexInfo(keyType, unionType, isConstContext(node));
      }
      function getImmediateAliasedSymbol(symbol) {
        ts2.Debug.assert((symbol.flags & 2097152) !== 0, "Should only get Alias here.");
        var links = getSymbolLinks(symbol);
        if (!links.immediateTarget) {
          var node = getDeclarationOfAliasSymbol(symbol);
          if (!node)
            return ts2.Debug.fail();
          links.immediateTarget = getTargetOfAliasDeclaration(node, true);
        }
        return links.immediateTarget;
      }
      function checkObjectLiteral(node, checkMode) {
        var inDestructuringPattern = ts2.isAssignmentTarget(node);
        checkGrammarObjectLiteralExpression(node, inDestructuringPattern);
        var allPropertiesTable = strictNullChecks ? ts2.createSymbolTable() : void 0;
        var propertiesTable = ts2.createSymbolTable();
        var propertiesArray = [];
        var spread = emptyObjectType;
        var contextualType = getApparentTypeOfContextualType(node);
        var contextualTypeHasPattern = contextualType && contextualType.pattern && (contextualType.pattern.kind === 200 || contextualType.pattern.kind === 204);
        var inConstContext = isConstContext(node);
        var checkFlags = inConstContext ? 8 : 0;
        var isInJavascript = ts2.isInJSFile(node) && !ts2.isInJsonFile(node);
        var enumTag = ts2.getJSDocEnumTag(node);
        var isJSObjectLiteral = !contextualType && isInJavascript && !enumTag;
        var objectFlags = freshObjectLiteralFlag;
        var patternWithComputedProperties = false;
        var hasComputedStringProperty = false;
        var hasComputedNumberProperty = false;
        var hasComputedSymbolProperty = false;
        for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
          var elem = _a[_i];
          if (elem.name && ts2.isComputedPropertyName(elem.name)) {
            checkComputedPropertyName(elem.name);
          }
        }
        var offset = 0;
        for (var _b = 0, _c = node.properties; _b < _c.length; _b++) {
          var memberDecl = _c[_b];
          var member = getSymbolOfNode(memberDecl);
          var computedNameType = memberDecl.name && memberDecl.name.kind === 161 ? checkComputedPropertyName(memberDecl.name) : void 0;
          if (memberDecl.kind === 294 || memberDecl.kind === 295 || ts2.isObjectLiteralMethod(memberDecl)) {
            var type = memberDecl.kind === 294 ? checkPropertyAssignment(memberDecl, checkMode) : memberDecl.kind === 295 ? checkExpressionForMutableLocation(!inDestructuringPattern && memberDecl.objectAssignmentInitializer ? memberDecl.objectAssignmentInitializer : memberDecl.name, checkMode) : checkObjectLiteralMethod(memberDecl, checkMode);
            if (isInJavascript) {
              var jsDocType = getTypeForDeclarationFromJSDocComment(memberDecl);
              if (jsDocType) {
                checkTypeAssignableTo(type, jsDocType, memberDecl);
                type = jsDocType;
              } else if (enumTag && enumTag.typeExpression) {
                checkTypeAssignableTo(type, getTypeFromTypeNode(enumTag.typeExpression), memberDecl);
              }
            }
            objectFlags |= ts2.getObjectFlags(type) & 917504;
            var nameType = computedNameType && isTypeUsableAsPropertyName(computedNameType) ? computedNameType : void 0;
            var prop = nameType ? createSymbol(4 | member.flags, getPropertyNameFromType(nameType), checkFlags | 4096) : createSymbol(4 | member.flags, member.escapedName, checkFlags);
            if (nameType) {
              prop.nameType = nameType;
            }
            if (inDestructuringPattern) {
              var isOptional = memberDecl.kind === 294 && hasDefaultValue(memberDecl.initializer) || memberDecl.kind === 295 && memberDecl.objectAssignmentInitializer;
              if (isOptional) {
                prop.flags |= 16777216;
              }
            } else if (contextualTypeHasPattern && !(ts2.getObjectFlags(contextualType) & 512)) {
              var impliedProp = getPropertyOfType(contextualType, member.escapedName);
              if (impliedProp) {
                prop.flags |= impliedProp.flags & 16777216;
              } else if (!compilerOptions.suppressExcessPropertyErrors && !getIndexInfoOfType(contextualType, stringType)) {
                error(memberDecl.name, ts2.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(member), typeToString(contextualType));
              }
            }
            prop.declarations = member.declarations;
            prop.parent = member.parent;
            if (member.valueDeclaration) {
              prop.valueDeclaration = member.valueDeclaration;
            }
            prop.type = type;
            prop.target = member;
            member = prop;
            allPropertiesTable === null || allPropertiesTable === void 0 ? void 0 : allPropertiesTable.set(prop.escapedName, prop);
          } else if (memberDecl.kind === 296) {
            if (languageVersion < 2) {
              checkExternalEmitHelpers(memberDecl, 2);
            }
            if (propertiesArray.length > 0) {
              spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, objectFlags, inConstContext);
              propertiesArray = [];
              propertiesTable = ts2.createSymbolTable();
              hasComputedStringProperty = false;
              hasComputedNumberProperty = false;
              hasComputedSymbolProperty = false;
            }
            var type = getReducedType(checkExpression(memberDecl.expression));
            if (isValidSpreadType(type)) {
              var mergedType = tryMergeUnionOfObjectTypeAndEmptyObject(type, inConstContext);
              if (allPropertiesTable) {
                checkSpreadPropOverrides(mergedType, allPropertiesTable, memberDecl);
              }
              offset = propertiesArray.length;
              if (isErrorType(spread)) {
                continue;
              }
              spread = getSpreadType(spread, mergedType, node.symbol, objectFlags, inConstContext);
            } else {
              error(memberDecl, ts2.Diagnostics.Spread_types_may_only_be_created_from_object_types);
              spread = errorType;
            }
            continue;
          } else {
            ts2.Debug.assert(memberDecl.kind === 171 || memberDecl.kind === 172);
            checkNodeDeferred(memberDecl);
          }
          if (computedNameType && !(computedNameType.flags & 8576)) {
            if (isTypeAssignableTo(computedNameType, stringNumberSymbolType)) {
              if (isTypeAssignableTo(computedNameType, numberType)) {
                hasComputedNumberProperty = true;
              } else if (isTypeAssignableTo(computedNameType, esSymbolType)) {
                hasComputedSymbolProperty = true;
              } else {
                hasComputedStringProperty = true;
              }
              if (inDestructuringPattern) {
                patternWithComputedProperties = true;
              }
            }
          } else {
            propertiesTable.set(member.escapedName, member);
          }
          propertiesArray.push(member);
        }
        if (contextualTypeHasPattern && node.parent.kind !== 296) {
          for (var _d = 0, _e = getPropertiesOfType(contextualType); _d < _e.length; _d++) {
            var prop = _e[_d];
            if (!propertiesTable.get(prop.escapedName) && !getPropertyOfType(spread, prop.escapedName)) {
              if (!(prop.flags & 16777216)) {
                error(prop.valueDeclaration || prop.bindingElement, ts2.Diagnostics.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value);
              }
              propertiesTable.set(prop.escapedName, prop);
              propertiesArray.push(prop);
            }
          }
        }
        if (isErrorType(spread)) {
          return errorType;
        }
        if (spread !== emptyObjectType) {
          if (propertiesArray.length > 0) {
            spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, objectFlags, inConstContext);
            propertiesArray = [];
            propertiesTable = ts2.createSymbolTable();
            hasComputedStringProperty = false;
            hasComputedNumberProperty = false;
          }
          return mapType(spread, function(t) {
            return t === emptyObjectType ? createObjectLiteralType() : t;
          });
        }
        return createObjectLiteralType();
        function createObjectLiteralType() {
          var indexInfos = [];
          if (hasComputedStringProperty)
            indexInfos.push(getObjectLiteralIndexInfo(node, offset, propertiesArray, stringType));
          if (hasComputedNumberProperty)
            indexInfos.push(getObjectLiteralIndexInfo(node, offset, propertiesArray, numberType));
          if (hasComputedSymbolProperty)
            indexInfos.push(getObjectLiteralIndexInfo(node, offset, propertiesArray, esSymbolType));
          var result = createAnonymousType(node.symbol, propertiesTable, ts2.emptyArray, ts2.emptyArray, indexInfos);
          result.objectFlags |= objectFlags | 128 | 262144;
          if (isJSObjectLiteral) {
            result.objectFlags |= 8192;
          }
          if (patternWithComputedProperties) {
            result.objectFlags |= 512;
          }
          if (inDestructuringPattern) {
            result.pattern = node;
          }
          return result;
        }
      }
      function isValidSpreadType(type) {
        if (type.flags & 465829888) {
          var constraint = getBaseConstraintOfType(type);
          if (constraint !== void 0) {
            return isValidSpreadType(constraint);
          }
        }
        return !!(type.flags & (1 | 67108864 | 524288 | 58982400) || getFalsyFlags(type) & 117632 && isValidSpreadType(removeDefinitelyFalsyTypes(type)) || type.flags & 3145728 && ts2.every(type.types, isValidSpreadType));
      }
      function checkJsxSelfClosingElementDeferred(node) {
        checkJsxOpeningLikeElementOrOpeningFragment(node);
      }
      function checkJsxSelfClosingElement(node, _checkMode) {
        checkNodeDeferred(node);
        return getJsxElementTypeAt(node) || anyType;
      }
      function checkJsxElementDeferred(node) {
        checkJsxOpeningLikeElementOrOpeningFragment(node.openingElement);
        if (isJsxIntrinsicIdentifier(node.closingElement.tagName)) {
          getIntrinsicTagSymbol(node.closingElement);
        } else {
          checkExpression(node.closingElement.tagName);
        }
        checkJsxChildren(node);
      }
      function checkJsxElement(node, _checkMode) {
        checkNodeDeferred(node);
        return getJsxElementTypeAt(node) || anyType;
      }
      function checkJsxFragment(node) {
        checkJsxOpeningLikeElementOrOpeningFragment(node.openingFragment);
        var nodeSourceFile = ts2.getSourceFileOfNode(node);
        if (ts2.getJSXTransformEnabled(compilerOptions) && (compilerOptions.jsxFactory || nodeSourceFile.pragmas.has("jsx")) && !compilerOptions.jsxFragmentFactory && !nodeSourceFile.pragmas.has("jsxfrag")) {
          error(node, compilerOptions.jsxFactory ? ts2.Diagnostics.The_jsxFragmentFactory_compiler_option_must_be_provided_to_use_JSX_fragments_with_the_jsxFactory_compiler_option : ts2.Diagnostics.An_jsxFrag_pragma_is_required_when_using_an_jsx_pragma_with_JSX_fragments);
        }
        checkJsxChildren(node);
        return getJsxElementTypeAt(node) || anyType;
      }
      function isHyphenatedJsxName(name) {
        return ts2.stringContains(name, "-");
      }
      function isJsxIntrinsicIdentifier(tagName) {
        return tagName.kind === 79 && ts2.isIntrinsicJsxName(tagName.escapedText);
      }
      function checkJsxAttribute(node, checkMode) {
        return node.initializer ? checkExpressionForMutableLocation(node.initializer, checkMode) : trueType;
      }
      function createJsxAttributesTypeFromAttributesProperty(openingLikeElement, checkMode) {
        var attributes = openingLikeElement.attributes;
        var allAttributesTable = strictNullChecks ? ts2.createSymbolTable() : void 0;
        var attributesTable = ts2.createSymbolTable();
        var spread = emptyJsxObjectType;
        var hasSpreadAnyType = false;
        var typeToIntersect;
        var explicitlySpecifyChildrenAttribute = false;
        var objectFlags = 2048;
        var jsxChildrenPropertyName = getJsxElementChildrenPropertyName(getJsxNamespaceAt(openingLikeElement));
        for (var _i = 0, _a = attributes.properties; _i < _a.length; _i++) {
          var attributeDecl = _a[_i];
          var member = attributeDecl.symbol;
          if (ts2.isJsxAttribute(attributeDecl)) {
            var exprType = checkJsxAttribute(attributeDecl, checkMode);
            objectFlags |= ts2.getObjectFlags(exprType) & 917504;
            var attributeSymbol = createSymbol(4 | member.flags, member.escapedName);
            attributeSymbol.declarations = member.declarations;
            attributeSymbol.parent = member.parent;
            if (member.valueDeclaration) {
              attributeSymbol.valueDeclaration = member.valueDeclaration;
            }
            attributeSymbol.type = exprType;
            attributeSymbol.target = member;
            attributesTable.set(attributeSymbol.escapedName, attributeSymbol);
            allAttributesTable === null || allAttributesTable === void 0 ? void 0 : allAttributesTable.set(attributeSymbol.escapedName, attributeSymbol);
            if (attributeDecl.name.escapedText === jsxChildrenPropertyName) {
              explicitlySpecifyChildrenAttribute = true;
            }
          } else {
            ts2.Debug.assert(attributeDecl.kind === 286);
            if (attributesTable.size > 0) {
              spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, objectFlags, false);
              attributesTable = ts2.createSymbolTable();
            }
            var exprType = getReducedType(checkExpressionCached(attributeDecl.expression, checkMode));
            if (isTypeAny(exprType)) {
              hasSpreadAnyType = true;
            }
            if (isValidSpreadType(exprType)) {
              spread = getSpreadType(spread, exprType, attributes.symbol, objectFlags, false);
              if (allAttributesTable) {
                checkSpreadPropOverrides(exprType, allAttributesTable, attributeDecl);
              }
            } else {
              typeToIntersect = typeToIntersect ? getIntersectionType([typeToIntersect, exprType]) : exprType;
            }
          }
        }
        if (!hasSpreadAnyType) {
          if (attributesTable.size > 0) {
            spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, objectFlags, false);
          }
        }
        var parent = openingLikeElement.parent.kind === 277 ? openingLikeElement.parent : void 0;
        if (parent && parent.openingElement === openingLikeElement && parent.children.length > 0) {
          var childrenTypes = checkJsxChildren(parent, checkMode);
          if (!hasSpreadAnyType && jsxChildrenPropertyName && jsxChildrenPropertyName !== "") {
            if (explicitlySpecifyChildrenAttribute) {
              error(attributes, ts2.Diagnostics._0_are_specified_twice_The_attribute_named_0_will_be_overwritten, ts2.unescapeLeadingUnderscores(jsxChildrenPropertyName));
            }
            var contextualType = getApparentTypeOfContextualType(openingLikeElement.attributes);
            var childrenContextualType = contextualType && getTypeOfPropertyOfContextualType(contextualType, jsxChildrenPropertyName);
            var childrenPropSymbol = createSymbol(4, jsxChildrenPropertyName);
            childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : childrenContextualType && someType(childrenContextualType, isTupleLikeType) ? createTupleType(childrenTypes) : createArrayType(getUnionType(childrenTypes));
            childrenPropSymbol.valueDeclaration = ts2.factory.createPropertySignature(void 0, ts2.unescapeLeadingUnderscores(jsxChildrenPropertyName), void 0, void 0);
            ts2.setParent(childrenPropSymbol.valueDeclaration, attributes);
            childrenPropSymbol.valueDeclaration.symbol = childrenPropSymbol;
            var childPropMap = ts2.createSymbolTable();
            childPropMap.set(jsxChildrenPropertyName, childrenPropSymbol);
            spread = getSpreadType(spread, createAnonymousType(attributes.symbol, childPropMap, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray), attributes.symbol, objectFlags, false);
          }
        }
        if (hasSpreadAnyType) {
          return anyType;
        }
        if (typeToIntersect && spread !== emptyJsxObjectType) {
          return getIntersectionType([typeToIntersect, spread]);
        }
        return typeToIntersect || (spread === emptyJsxObjectType ? createJsxAttributesType() : spread);
        function createJsxAttributesType() {
          objectFlags |= freshObjectLiteralFlag;
          var result = createAnonymousType(attributes.symbol, attributesTable, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
          result.objectFlags |= objectFlags | 128 | 262144;
          return result;
        }
      }
      function checkJsxChildren(node, checkMode) {
        var childrenTypes = [];
        for (var _i = 0, _a = node.children; _i < _a.length; _i++) {
          var child = _a[_i];
          if (child.kind === 11) {
            if (!child.containsOnlyTriviaWhiteSpaces) {
              childrenTypes.push(stringType);
            }
          } else if (child.kind === 287 && !child.expression) {
            continue;
          } else {
            childrenTypes.push(checkExpressionForMutableLocation(child, checkMode));
          }
        }
        return childrenTypes;
      }
      function checkSpreadPropOverrides(type, props, spread) {
        for (var _i = 0, _a = getPropertiesOfType(type); _i < _a.length; _i++) {
          var right = _a[_i];
          if (!(right.flags & 16777216)) {
            var left = props.get(right.escapedName);
            if (left) {
              var diagnostic = error(left.valueDeclaration, ts2.Diagnostics._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, ts2.unescapeLeadingUnderscores(left.escapedName));
              ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(spread, ts2.Diagnostics.This_spread_always_overwrites_this_property));
            }
          }
        }
      }
      function checkJsxAttributes(node, checkMode) {
        return createJsxAttributesTypeFromAttributesProperty(node.parent, checkMode);
      }
      function getJsxType(name, location) {
        var namespace = getJsxNamespaceAt(location);
        var exports = namespace && getExportsOfSymbol(namespace);
        var typeSymbol = exports && getSymbol(exports, name, 788968);
        return typeSymbol ? getDeclaredTypeOfSymbol(typeSymbol) : errorType;
      }
      function getIntrinsicTagSymbol(node) {
        var links = getNodeLinks(node);
        if (!links.resolvedSymbol) {
          var intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, node);
          if (!isErrorType(intrinsicElementsType)) {
            if (!ts2.isIdentifier(node.tagName))
              return ts2.Debug.fail();
            var intrinsicProp = getPropertyOfType(intrinsicElementsType, node.tagName.escapedText);
            if (intrinsicProp) {
              links.jsxFlags |= 1;
              return links.resolvedSymbol = intrinsicProp;
            }
            var indexSignatureType = getIndexTypeOfType(intrinsicElementsType, stringType);
            if (indexSignatureType) {
              links.jsxFlags |= 2;
              return links.resolvedSymbol = intrinsicElementsType.symbol;
            }
            error(node, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, ts2.idText(node.tagName), "JSX." + JsxNames.IntrinsicElements);
            return links.resolvedSymbol = unknownSymbol;
          } else {
            if (noImplicitAny) {
              error(node, ts2.Diagnostics.JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists, ts2.unescapeLeadingUnderscores(JsxNames.IntrinsicElements));
            }
            return links.resolvedSymbol = unknownSymbol;
          }
        }
        return links.resolvedSymbol;
      }
      function getJsxNamespaceContainerForImplicitImport(location) {
        var file = location && ts2.getSourceFileOfNode(location);
        var links = file && getNodeLinks(file);
        if (links && links.jsxImplicitImportContainer === false) {
          return void 0;
        }
        if (links && links.jsxImplicitImportContainer) {
          return links.jsxImplicitImportContainer;
        }
        var runtimeImportSpecifier = ts2.getJSXRuntimeImport(ts2.getJSXImplicitImportBase(compilerOptions, file), compilerOptions);
        if (!runtimeImportSpecifier) {
          return void 0;
        }
        var isClassic = ts2.getEmitModuleResolutionKind(compilerOptions) === ts2.ModuleResolutionKind.Classic;
        var errorMessage = isClassic ? ts2.Diagnostics.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_node_or_to_add_aliases_to_the_paths_option : ts2.Diagnostics.Cannot_find_module_0_or_its_corresponding_type_declarations;
        var mod = resolveExternalModule(location, runtimeImportSpecifier, errorMessage, location);
        var result = mod && mod !== unknownSymbol ? getMergedSymbol(resolveSymbol(mod)) : void 0;
        if (links) {
          links.jsxImplicitImportContainer = result || false;
        }
        return result;
      }
      function getJsxNamespaceAt(location) {
        var links = location && getNodeLinks(location);
        if (links && links.jsxNamespace) {
          return links.jsxNamespace;
        }
        if (!links || links.jsxNamespace !== false) {
          var resolvedNamespace = getJsxNamespaceContainerForImplicitImport(location);
          if (!resolvedNamespace || resolvedNamespace === unknownSymbol) {
            var namespaceName = getJsxNamespace(location);
            resolvedNamespace = resolveName(location, namespaceName, 1920, void 0, namespaceName, false);
          }
          if (resolvedNamespace) {
            var candidate = resolveSymbol(getSymbol(getExportsOfSymbol(resolveSymbol(resolvedNamespace)), JsxNames.JSX, 1920));
            if (candidate && candidate !== unknownSymbol) {
              if (links) {
                links.jsxNamespace = candidate;
              }
              return candidate;
            }
          }
          if (links) {
            links.jsxNamespace = false;
          }
        }
        var s = resolveSymbol(getGlobalSymbol(JsxNames.JSX, 1920, void 0));
        if (s === unknownSymbol) {
          return void 0;
        }
        return s;
      }
      function getNameFromJsxElementAttributesContainer(nameOfAttribPropContainer, jsxNamespace) {
        var jsxElementAttribPropInterfaceSym = jsxNamespace && getSymbol(jsxNamespace.exports, nameOfAttribPropContainer, 788968);
        var jsxElementAttribPropInterfaceType = jsxElementAttribPropInterfaceSym && getDeclaredTypeOfSymbol(jsxElementAttribPropInterfaceSym);
        var propertiesOfJsxElementAttribPropInterface = jsxElementAttribPropInterfaceType && getPropertiesOfType(jsxElementAttribPropInterfaceType);
        if (propertiesOfJsxElementAttribPropInterface) {
          if (propertiesOfJsxElementAttribPropInterface.length === 0) {
            return "";
          } else if (propertiesOfJsxElementAttribPropInterface.length === 1) {
            return propertiesOfJsxElementAttribPropInterface[0].escapedName;
          } else if (propertiesOfJsxElementAttribPropInterface.length > 1 && jsxElementAttribPropInterfaceSym.declarations) {
            error(jsxElementAttribPropInterfaceSym.declarations[0], ts2.Diagnostics.The_global_type_JSX_0_may_not_have_more_than_one_property, ts2.unescapeLeadingUnderscores(nameOfAttribPropContainer));
          }
        }
        return void 0;
      }
      function getJsxLibraryManagedAttributes(jsxNamespace) {
        return jsxNamespace && getSymbol(jsxNamespace.exports, JsxNames.LibraryManagedAttributes, 788968);
      }
      function getJsxElementPropertiesName(jsxNamespace) {
        return getNameFromJsxElementAttributesContainer(JsxNames.ElementAttributesPropertyNameContainer, jsxNamespace);
      }
      function getJsxElementChildrenPropertyName(jsxNamespace) {
        return getNameFromJsxElementAttributesContainer(JsxNames.ElementChildrenAttributeNameContainer, jsxNamespace);
      }
      function getUninstantiatedJsxSignaturesOfType(elementType, caller) {
        if (elementType.flags & 4) {
          return [anySignature];
        } else if (elementType.flags & 128) {
          var intrinsicType = getIntrinsicAttributesTypeFromStringLiteralType(elementType, caller);
          if (!intrinsicType) {
            error(caller, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, elementType.value, "JSX." + JsxNames.IntrinsicElements);
            return ts2.emptyArray;
          } else {
            var fakeSignature = createSignatureForJSXIntrinsic(caller, intrinsicType);
            return [fakeSignature];
          }
        }
        var apparentElemType = getApparentType(elementType);
        var signatures = getSignaturesOfType(apparentElemType, 1);
        if (signatures.length === 0) {
          signatures = getSignaturesOfType(apparentElemType, 0);
        }
        if (signatures.length === 0 && apparentElemType.flags & 1048576) {
          signatures = getUnionSignatures(ts2.map(apparentElemType.types, function(t) {
            return getUninstantiatedJsxSignaturesOfType(t, caller);
          }));
        }
        return signatures;
      }
      function getIntrinsicAttributesTypeFromStringLiteralType(type, location) {
        var intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, location);
        if (!isErrorType(intrinsicElementsType)) {
          var stringLiteralTypeName = type.value;
          var intrinsicProp = getPropertyOfType(intrinsicElementsType, ts2.escapeLeadingUnderscores(stringLiteralTypeName));
          if (intrinsicProp) {
            return getTypeOfSymbol(intrinsicProp);
          }
          var indexSignatureType = getIndexTypeOfType(intrinsicElementsType, stringType);
          if (indexSignatureType) {
            return indexSignatureType;
          }
          return void 0;
        }
        return anyType;
      }
      function checkJsxReturnAssignableToAppropriateBound(refKind, elemInstanceType, openingLikeElement) {
        if (refKind === 1) {
          var sfcReturnConstraint = getJsxStatelessElementTypeAt(openingLikeElement);
          if (sfcReturnConstraint) {
            checkTypeRelatedTo(elemInstanceType, sfcReturnConstraint, assignableRelation, openingLikeElement.tagName, ts2.Diagnostics.Its_return_type_0_is_not_a_valid_JSX_element, generateInitialErrorChain);
          }
        } else if (refKind === 0) {
          var classConstraint = getJsxElementClassTypeAt(openingLikeElement);
          if (classConstraint) {
            checkTypeRelatedTo(elemInstanceType, classConstraint, assignableRelation, openingLikeElement.tagName, ts2.Diagnostics.Its_instance_type_0_is_not_a_valid_JSX_element, generateInitialErrorChain);
          }
        } else {
          var sfcReturnConstraint = getJsxStatelessElementTypeAt(openingLikeElement);
          var classConstraint = getJsxElementClassTypeAt(openingLikeElement);
          if (!sfcReturnConstraint || !classConstraint) {
            return;
          }
          var combined = getUnionType([sfcReturnConstraint, classConstraint]);
          checkTypeRelatedTo(elemInstanceType, combined, assignableRelation, openingLikeElement.tagName, ts2.Diagnostics.Its_element_type_0_is_not_a_valid_JSX_element, generateInitialErrorChain);
        }
        function generateInitialErrorChain() {
          var componentName = ts2.getTextOfNode(openingLikeElement.tagName);
          return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics._0_cannot_be_used_as_a_JSX_component, componentName);
        }
      }
      function getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node) {
        ts2.Debug.assert(isJsxIntrinsicIdentifier(node.tagName));
        var links = getNodeLinks(node);
        if (!links.resolvedJsxElementAttributesType) {
          var symbol = getIntrinsicTagSymbol(node);
          if (links.jsxFlags & 1) {
            return links.resolvedJsxElementAttributesType = getTypeOfSymbol(symbol) || errorType;
          } else if (links.jsxFlags & 2) {
            return links.resolvedJsxElementAttributesType = getIndexTypeOfType(getJsxType(JsxNames.IntrinsicElements, node), stringType) || errorType;
          } else {
            return links.resolvedJsxElementAttributesType = errorType;
          }
        }
        return links.resolvedJsxElementAttributesType;
      }
      function getJsxElementClassTypeAt(location) {
        var type = getJsxType(JsxNames.ElementClass, location);
        if (isErrorType(type))
          return void 0;
        return type;
      }
      function getJsxElementTypeAt(location) {
        return getJsxType(JsxNames.Element, location);
      }
      function getJsxStatelessElementTypeAt(location) {
        var jsxElementType = getJsxElementTypeAt(location);
        if (jsxElementType) {
          return getUnionType([jsxElementType, nullType]);
        }
      }
      function getJsxIntrinsicTagNamesAt(location) {
        var intrinsics = getJsxType(JsxNames.IntrinsicElements, location);
        return intrinsics ? getPropertiesOfType(intrinsics) : ts2.emptyArray;
      }
      function checkJsxPreconditions(errorNode) {
        if ((compilerOptions.jsx || 0) === 0) {
          error(errorNode, ts2.Diagnostics.Cannot_use_JSX_unless_the_jsx_flag_is_provided);
        }
        if (getJsxElementTypeAt(errorNode) === void 0) {
          if (noImplicitAny) {
            error(errorNode, ts2.Diagnostics.JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist);
          }
        }
      }
      function checkJsxOpeningLikeElementOrOpeningFragment(node) {
        var isNodeOpeningLikeElement = ts2.isJsxOpeningLikeElement(node);
        if (isNodeOpeningLikeElement) {
          checkGrammarJsxElement(node);
        }
        checkJsxPreconditions(node);
        if (!getJsxNamespaceContainerForImplicitImport(node)) {
          var jsxFactoryRefErr = diagnostics && compilerOptions.jsx === 2 ? ts2.Diagnostics.Cannot_find_name_0 : void 0;
          var jsxFactoryNamespace = getJsxNamespace(node);
          var jsxFactoryLocation = isNodeOpeningLikeElement ? node.tagName : node;
          var jsxFactorySym = void 0;
          if (!(ts2.isJsxOpeningFragment(node) && jsxFactoryNamespace === "null")) {
            jsxFactorySym = resolveName(jsxFactoryLocation, jsxFactoryNamespace, 111551, jsxFactoryRefErr, jsxFactoryNamespace, true);
          }
          if (jsxFactorySym) {
            jsxFactorySym.isReferenced = 67108863;
            if (jsxFactorySym.flags & 2097152 && !getTypeOnlyAliasDeclaration(jsxFactorySym)) {
              markAliasSymbolAsReferenced(jsxFactorySym);
            }
          }
          if (ts2.isJsxOpeningFragment(node)) {
            var file = ts2.getSourceFileOfNode(node);
            var localJsxNamespace = getLocalJsxNamespace(file);
            if (localJsxNamespace) {
              resolveName(jsxFactoryLocation, localJsxNamespace, 111551, jsxFactoryRefErr, localJsxNamespace, true);
            }
          }
        }
        if (isNodeOpeningLikeElement) {
          var jsxOpeningLikeNode = node;
          var sig = getResolvedSignature(jsxOpeningLikeNode);
          checkDeprecatedSignature(sig, node);
          checkJsxReturnAssignableToAppropriateBound(getJsxReferenceKind(jsxOpeningLikeNode), getReturnTypeOfSignature(sig), jsxOpeningLikeNode);
        }
      }
      function isKnownProperty(targetType, name, isComparingJsxAttributes) {
        if (targetType.flags & 524288) {
          if (getPropertyOfObjectType(targetType, name) || getApplicableIndexInfoForName(targetType, name) || isLateBoundName(name) && getIndexInfoOfType(targetType, stringType) || isComparingJsxAttributes && isHyphenatedJsxName(name)) {
            return true;
          }
        } else if (targetType.flags & 3145728 && isExcessPropertyCheckTarget(targetType)) {
          for (var _i = 0, _a = targetType.types; _i < _a.length; _i++) {
            var t = _a[_i];
            if (isKnownProperty(t, name, isComparingJsxAttributes)) {
              return true;
            }
          }
        }
        return false;
      }
      function isExcessPropertyCheckTarget(type) {
        return !!(type.flags & 524288 && !(ts2.getObjectFlags(type) & 512) || type.flags & 67108864 || type.flags & 1048576 && ts2.some(type.types, isExcessPropertyCheckTarget) || type.flags & 2097152 && ts2.every(type.types, isExcessPropertyCheckTarget));
      }
      function checkJsxExpression(node, checkMode) {
        checkGrammarJsxExpression(node);
        if (node.expression) {
          var type = checkExpression(node.expression, checkMode);
          if (node.dotDotDotToken && type !== anyType && !isArrayType(type)) {
            error(node, ts2.Diagnostics.JSX_spread_child_must_be_an_array_type);
          }
          return type;
        } else {
          return errorType;
        }
      }
      function getDeclarationNodeFlagsFromSymbol(s) {
        return s.valueDeclaration ? ts2.getCombinedNodeFlags(s.valueDeclaration) : 0;
      }
      function isPrototypeProperty(symbol) {
        if (symbol.flags & 8192 || ts2.getCheckFlags(symbol) & 4) {
          return true;
        }
        if (ts2.isInJSFile(symbol.valueDeclaration)) {
          var parent = symbol.valueDeclaration.parent;
          return parent && ts2.isBinaryExpression(parent) && ts2.getAssignmentDeclarationKind(parent) === 3;
        }
      }
      function checkPropertyAccessibility(node, isSuper, writing, type, prop, reportError) {
        if (reportError === void 0) {
          reportError = true;
        }
        var errorNode = !reportError ? void 0 : node.kind === 160 ? node.right : node.kind === 199 ? node : node.kind === 202 && node.propertyName ? node.propertyName : node.name;
        return checkPropertyAccessibilityAtLocation(node, isSuper, writing, type, prop, errorNode);
      }
      function checkPropertyAccessibilityAtLocation(location, isSuper, writing, containingType, prop, errorNode) {
        var flags = ts2.getDeclarationModifierFlagsFromSymbol(prop, writing);
        if (isSuper) {
          if (languageVersion < 2) {
            if (symbolHasNonMethodDeclaration(prop)) {
              if (errorNode) {
                error(errorNode, ts2.Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword);
              }
              return false;
            }
          }
          if (flags & 128) {
            if (errorNode) {
              error(errorNode, ts2.Diagnostics.Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression, symbolToString(prop), typeToString(getDeclaringClass(prop)));
            }
            return false;
          }
        }
        if (flags & 128 && symbolHasNonMethodDeclaration(prop) && (ts2.isThisProperty(location) || ts2.isThisInitializedObjectBindingExpression(location) || ts2.isObjectBindingPattern(location.parent) && ts2.isThisInitializedDeclaration(location.parent.parent))) {
          var declaringClassDeclaration = ts2.getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop));
          if (declaringClassDeclaration && isNodeUsedDuringClassInitialization(location)) {
            if (errorNode) {
              error(errorNode, ts2.Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), ts2.getTextOfIdentifierOrLiteral(declaringClassDeclaration.name));
            }
            return false;
          }
        }
        if (!(flags & 24)) {
          return true;
        }
        if (flags & 8) {
          var declaringClassDeclaration = ts2.getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop));
          if (!isNodeWithinClass(location, declaringClassDeclaration)) {
            if (errorNode) {
              error(errorNode, ts2.Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(getDeclaringClass(prop)));
            }
            return false;
          }
          return true;
        }
        if (isSuper) {
          return true;
        }
        var enclosingClass = forEachEnclosingClass(location, function(enclosingDeclaration) {
          var enclosingClass2 = getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingDeclaration));
          return isClassDerivedFromDeclaringClasses(enclosingClass2, prop, writing) ? enclosingClass2 : void 0;
        });
        if (!enclosingClass) {
          var thisParameter = void 0;
          if (flags & 32 || !(thisParameter = getThisParameterFromNodeContext(location)) || !thisParameter.type) {
            if (errorNode) {
              error(errorNode, ts2.Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || containingType));
            }
            return false;
          }
          var thisType = getTypeFromTypeNode(thisParameter.type);
          enclosingClass = (thisType.flags & 262144 ? getConstraintOfTypeParameter(thisType) : thisType).target;
        }
        if (flags & 32) {
          return true;
        }
        if (containingType.flags & 262144) {
          containingType = containingType.isThisType ? getConstraintOfTypeParameter(containingType) : getBaseConstraintOfType(containingType);
        }
        if (!containingType || !hasBaseType(containingType, enclosingClass)) {
          if (errorNode) {
            error(errorNode, ts2.Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1_This_is_an_instance_of_class_2, symbolToString(prop), typeToString(enclosingClass), typeToString(containingType));
          }
          return false;
        }
        return true;
      }
      function getThisParameterFromNodeContext(node) {
        var thisContainer = ts2.getThisContainer(node, false);
        return thisContainer && ts2.isFunctionLike(thisContainer) ? ts2.getThisParameter(thisContainer) : void 0;
      }
      function symbolHasNonMethodDeclaration(symbol) {
        return !!forEachProperty(symbol, function(prop) {
          return !(prop.flags & 8192);
        });
      }
      function checkNonNullExpression(node) {
        return checkNonNullType(checkExpression(node), node);
      }
      function isNullableType(type) {
        return !!((strictNullChecks ? getFalsyFlags(type) : type.flags) & 98304);
      }
      function getNonNullableTypeIfNeeded(type) {
        return isNullableType(type) ? getNonNullableType(type) : type;
      }
      function reportObjectPossiblyNullOrUndefinedError(node, flags) {
        error(node, flags & 32768 ? flags & 65536 ? ts2.Diagnostics.Object_is_possibly_null_or_undefined : ts2.Diagnostics.Object_is_possibly_undefined : ts2.Diagnostics.Object_is_possibly_null);
      }
      function reportCannotInvokePossiblyNullOrUndefinedError(node, flags) {
        error(node, flags & 32768 ? flags & 65536 ? ts2.Diagnostics.Cannot_invoke_an_object_which_is_possibly_null_or_undefined : ts2.Diagnostics.Cannot_invoke_an_object_which_is_possibly_undefined : ts2.Diagnostics.Cannot_invoke_an_object_which_is_possibly_null);
      }
      function checkNonNullTypeWithReporter(type, node, reportError) {
        if (strictNullChecks && type.flags & 2) {
          error(node, ts2.Diagnostics.Object_is_of_type_unknown);
          return errorType;
        }
        var kind = (strictNullChecks ? getFalsyFlags(type) : type.flags) & 98304;
        if (kind) {
          reportError(node, kind);
          var t = getNonNullableType(type);
          return t.flags & (98304 | 131072) ? errorType : t;
        }
        return type;
      }
      function checkNonNullType(type, node) {
        return checkNonNullTypeWithReporter(type, node, reportObjectPossiblyNullOrUndefinedError);
      }
      function checkNonNullNonVoidType(type, node) {
        var nonNullType = checkNonNullType(type, node);
        if (nonNullType.flags & 16384) {
          error(node, ts2.Diagnostics.Object_is_possibly_undefined);
        }
        return nonNullType;
      }
      function checkPropertyAccessExpression(node, checkMode) {
        return node.flags & 32 ? checkPropertyAccessChain(node, checkMode) : checkPropertyAccessExpressionOrQualifiedName(node, node.expression, checkNonNullExpression(node.expression), node.name, checkMode);
      }
      function checkPropertyAccessChain(node, checkMode) {
        var leftType = checkExpression(node.expression);
        var nonOptionalType = getOptionalExpressionType(leftType, node.expression);
        return propagateOptionalTypeMarker(checkPropertyAccessExpressionOrQualifiedName(node, node.expression, checkNonNullType(nonOptionalType, node.expression), node.name, checkMode), node, nonOptionalType !== leftType);
      }
      function checkQualifiedName(node, checkMode) {
        var leftType = ts2.isPartOfTypeQuery(node) && ts2.isThisIdentifier(node.left) ? checkNonNullType(checkThisExpression(node.left), node.left) : checkNonNullExpression(node.left);
        return checkPropertyAccessExpressionOrQualifiedName(node, node.left, leftType, node.right, checkMode);
      }
      function isMethodAccessForCall(node) {
        while (node.parent.kind === 211) {
          node = node.parent;
        }
        return ts2.isCallOrNewExpression(node.parent) && node.parent.expression === node;
      }
      function lookupSymbolForPrivateIdentifierDeclaration(propName, location) {
        for (var containingClass = ts2.getContainingClass(location); !!containingClass; containingClass = ts2.getContainingClass(containingClass)) {
          var symbol = containingClass.symbol;
          var name = ts2.getSymbolNameForPrivateIdentifier(symbol, propName);
          var prop = symbol.members && symbol.members.get(name) || symbol.exports && symbol.exports.get(name);
          if (prop) {
            return prop;
          }
        }
      }
      function checkGrammarPrivateIdentifierExpression(privId) {
        if (!ts2.getContainingClass(privId)) {
          return grammarErrorOnNode(privId, ts2.Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies);
        }
        if (!ts2.isExpressionNode(privId)) {
          return grammarErrorOnNode(privId, ts2.Diagnostics.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression);
        }
        if (!getSymbolForPrivateIdentifierExpression(privId)) {
          return grammarErrorOnNode(privId, ts2.Diagnostics.Cannot_find_name_0, ts2.idText(privId));
        }
        return false;
      }
      function checkPrivateIdentifierExpression(privId) {
        checkGrammarPrivateIdentifierExpression(privId);
        var symbol = getSymbolForPrivateIdentifierExpression(privId);
        if (symbol) {
          markPropertyAsReferenced(symbol, void 0, false);
        }
        return anyType;
      }
      function getSymbolForPrivateIdentifierExpression(privId) {
        if (!ts2.isExpressionNode(privId)) {
          return void 0;
        }
        var links = getNodeLinks(privId);
        if (links.resolvedSymbol === void 0) {
          links.resolvedSymbol = lookupSymbolForPrivateIdentifierDeclaration(privId.escapedText, privId);
        }
        return links.resolvedSymbol;
      }
      function getPrivateIdentifierPropertyOfType(leftType, lexicallyScopedIdentifier) {
        return getPropertyOfType(leftType, lexicallyScopedIdentifier.escapedName);
      }
      function checkPrivateIdentifierPropertyAccess(leftType, right, lexicallyScopedIdentifier) {
        var propertyOnType;
        var properties = getPropertiesOfType(leftType);
        if (properties) {
          ts2.forEach(properties, function(symbol) {
            var decl = symbol.valueDeclaration;
            if (decl && ts2.isNamedDeclaration(decl) && ts2.isPrivateIdentifier(decl.name) && decl.name.escapedText === right.escapedText) {
              propertyOnType = symbol;
              return true;
            }
          });
        }
        var diagName = diagnosticName(right);
        if (propertyOnType) {
          var typeValueDecl = ts2.Debug.checkDefined(propertyOnType.valueDeclaration);
          var typeClass_1 = ts2.Debug.checkDefined(ts2.getContainingClass(typeValueDecl));
          if (lexicallyScopedIdentifier === null || lexicallyScopedIdentifier === void 0 ? void 0 : lexicallyScopedIdentifier.valueDeclaration) {
            var lexicalValueDecl = lexicallyScopedIdentifier.valueDeclaration;
            var lexicalClass = ts2.getContainingClass(lexicalValueDecl);
            ts2.Debug.assert(!!lexicalClass);
            if (ts2.findAncestor(lexicalClass, function(n) {
              return typeClass_1 === n;
            })) {
              var diagnostic = error(right, ts2.Diagnostics.The_property_0_cannot_be_accessed_on_type_1_within_this_class_because_it_is_shadowed_by_another_private_identifier_with_the_same_spelling, diagName, typeToString(leftType));
              ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(lexicalValueDecl, ts2.Diagnostics.The_shadowing_declaration_of_0_is_defined_here, diagName), ts2.createDiagnosticForNode(typeValueDecl, ts2.Diagnostics.The_declaration_of_0_that_you_probably_intended_to_use_is_defined_here, diagName));
              return true;
            }
          }
          error(right, ts2.Diagnostics.Property_0_is_not_accessible_outside_class_1_because_it_has_a_private_identifier, diagName, diagnosticName(typeClass_1.name || anon));
          return true;
        }
        return false;
      }
      function isThisPropertyAccessInConstructor(node, prop) {
        return (isConstructorDeclaredProperty(prop) || ts2.isThisProperty(node) && isAutoTypedProperty(prop)) && ts2.getThisContainer(node, true) === getDeclaringConstructor(prop);
      }
      function checkPropertyAccessExpressionOrQualifiedName(node, left, leftType, right, checkMode) {
        var parentSymbol = getNodeLinks(left).resolvedSymbol;
        var assignmentKind = ts2.getAssignmentTargetKind(node);
        var apparentType = getApparentType(assignmentKind !== 0 || isMethodAccessForCall(node) ? getWidenedType(leftType) : leftType);
        var isAnyLike = isTypeAny(apparentType) || apparentType === silentNeverType;
        var prop;
        if (ts2.isPrivateIdentifier(right)) {
          if (languageVersion < 99) {
            if (assignmentKind !== 0) {
              checkExternalEmitHelpers(node, 1048576);
            }
            if (assignmentKind !== 1) {
              checkExternalEmitHelpers(node, 524288);
            }
          }
          var lexicallyScopedSymbol = lookupSymbolForPrivateIdentifierDeclaration(right.escapedText, right);
          if (assignmentKind && lexicallyScopedSymbol && lexicallyScopedSymbol.valueDeclaration && ts2.isMethodDeclaration(lexicallyScopedSymbol.valueDeclaration)) {
            grammarErrorOnNode(right, ts2.Diagnostics.Cannot_assign_to_private_method_0_Private_methods_are_not_writable, ts2.idText(right));
          }
          if ((lexicallyScopedSymbol === null || lexicallyScopedSymbol === void 0 ? void 0 : lexicallyScopedSymbol.valueDeclaration) && (ts2.getEmitScriptTarget(compilerOptions) === 99 && !useDefineForClassFields)) {
            var lexicalClass_1 = ts2.getContainingClass(lexicallyScopedSymbol.valueDeclaration);
            var parentStaticFieldInitializer = ts2.findAncestor(node, function(n) {
              if (n === lexicalClass_1)
                return "quit";
              if (ts2.isPropertyDeclaration(n.parent) && ts2.hasStaticModifier(n.parent) && n.parent.initializer === n && n.parent.parent === lexicalClass_1) {
                return true;
              }
              return false;
            });
            if (parentStaticFieldInitializer) {
              var parentStaticFieldInitializerSymbol = getSymbolOfNode(parentStaticFieldInitializer.parent);
              ts2.Debug.assert(parentStaticFieldInitializerSymbol, "Initializer without declaration symbol");
              var diagnostic = error(node, ts2.Diagnostics.Property_0_may_not_be_used_in_a_static_property_s_initializer_in_the_same_class_when_target_is_esnext_and_useDefineForClassFields_is_false, ts2.symbolName(lexicallyScopedSymbol));
              ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(parentStaticFieldInitializer.parent, ts2.Diagnostics.Initializer_for_property_0, ts2.symbolName(parentStaticFieldInitializerSymbol)));
            }
          }
          if (isAnyLike) {
            if (lexicallyScopedSymbol) {
              return isErrorType(apparentType) ? errorType : apparentType;
            }
            if (!ts2.getContainingClass(right)) {
              grammarErrorOnNode(right, ts2.Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies);
              return anyType;
            }
          }
          prop = lexicallyScopedSymbol ? getPrivateIdentifierPropertyOfType(leftType, lexicallyScopedSymbol) : void 0;
          if (!prop && checkPrivateIdentifierPropertyAccess(leftType, right, lexicallyScopedSymbol)) {
            return errorType;
          } else {
            var isSetonlyAccessor = prop && prop.flags & 65536 && !(prop.flags & 32768);
            if (isSetonlyAccessor && assignmentKind !== 1) {
              error(node, ts2.Diagnostics.Private_accessor_was_defined_without_a_getter);
            }
          }
        } else {
          if (isAnyLike) {
            if (ts2.isIdentifier(left) && parentSymbol) {
              markAliasReferenced(parentSymbol, node);
            }
            return isErrorType(apparentType) ? errorType : apparentType;
            ;
          }
          prop = getPropertyOfType(apparentType, right.escapedText);
        }
        if (ts2.isIdentifier(left) && parentSymbol && (compilerOptions.isolatedModules || !(prop && isConstEnumOrConstEnumOnlyModule(prop)) || ts2.shouldPreserveConstEnums(compilerOptions) && isExportOrExportExpression(node))) {
          markAliasReferenced(parentSymbol, node);
        }
        var propType;
        if (!prop) {
          var indexInfo = !ts2.isPrivateIdentifier(right) && (assignmentKind === 0 || !isGenericObjectType(leftType) || isThisTypeParameter(leftType)) ? getApplicableIndexInfoForName(apparentType, right.escapedText) : void 0;
          if (!(indexInfo && indexInfo.type)) {
            var isUncheckedJS = isUncheckedJSSuggestion(node, leftType.symbol, true);
            if (!isUncheckedJS && isJSLiteralType(leftType)) {
              return anyType;
            }
            if (leftType.symbol === globalThisSymbol) {
              if (globalThisSymbol.exports.has(right.escapedText) && globalThisSymbol.exports.get(right.escapedText).flags & 418) {
                error(right, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, ts2.unescapeLeadingUnderscores(right.escapedText), typeToString(leftType));
              } else if (noImplicitAny) {
                error(right, ts2.Diagnostics.Element_implicitly_has_an_any_type_because_type_0_has_no_index_signature, typeToString(leftType));
              }
              return anyType;
            }
            if (right.escapedText && !checkAndReportErrorForExtendingInterface(node)) {
              reportNonexistentProperty(right, isThisTypeParameter(leftType) ? apparentType : leftType, isUncheckedJS);
            }
            return errorType;
          }
          if (indexInfo.isReadonly && (ts2.isAssignmentTarget(node) || ts2.isDeleteTarget(node))) {
            error(node, ts2.Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(apparentType));
          }
          propType = compilerOptions.noUncheckedIndexedAccess && !ts2.isAssignmentTarget(node) ? getUnionType([indexInfo.type, undefinedType]) : indexInfo.type;
          if (compilerOptions.noPropertyAccessFromIndexSignature && ts2.isPropertyAccessExpression(node)) {
            error(right, ts2.Diagnostics.Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0, ts2.unescapeLeadingUnderscores(right.escapedText));
          }
        } else {
          if (prop.declarations && getDeclarationNodeFlagsFromSymbol(prop) & 134217728 && isUncalledFunctionReference(node, prop)) {
            addDeprecatedSuggestion(right, prop.declarations, right.escapedText);
          }
          checkPropertyNotUsedBeforeDeclaration(prop, node, right);
          markPropertyAsReferenced(prop, node, isSelfTypeAccess(left, parentSymbol));
          getNodeLinks(node).resolvedSymbol = prop;
          var writing = ts2.isWriteAccess(node);
          checkPropertyAccessibility(node, left.kind === 106, writing, apparentType, prop);
          if (isAssignmentToReadonlyEntity(node, prop, assignmentKind)) {
            error(right, ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_read_only_property, ts2.idText(right));
            return errorType;
          }
          propType = isThisPropertyAccessInConstructor(node, prop) ? autoType : writing ? getSetAccessorTypeOfSymbol(prop) : getTypeOfSymbol(prop);
        }
        return getFlowTypeOfAccessExpression(node, prop, propType, right, checkMode);
      }
      function isUncheckedJSSuggestion(node, suggestion, excludeClasses) {
        var file = ts2.getSourceFileOfNode(node);
        if (file) {
          if (compilerOptions.checkJs === void 0 && file.checkJsDirective === void 0 && (file.scriptKind === 1 || file.scriptKind === 2)) {
            var declarationFile = ts2.forEach(suggestion === null || suggestion === void 0 ? void 0 : suggestion.declarations, ts2.getSourceFileOfNode);
            return !(file !== declarationFile && !!declarationFile && isGlobalSourceFile(declarationFile)) && !(excludeClasses && suggestion && suggestion.flags & 32) && !(!!node && excludeClasses && ts2.isPropertyAccessExpression(node) && node.expression.kind === 108);
          }
        }
        return false;
      }
      function getFlowTypeOfAccessExpression(node, prop, propType, errorNode, checkMode) {
        var assignmentKind = ts2.getAssignmentTargetKind(node);
        if (assignmentKind === 1) {
          return removeMissingType(propType, !!(prop && prop.flags & 16777216));
        }
        if (prop && !(prop.flags & (3 | 4 | 98304)) && !(prop.flags & 8192 && propType.flags & 1048576) && !isDuplicatedCommonJSExport(prop.declarations)) {
          return propType;
        }
        if (propType === autoType) {
          return getFlowTypeOfProperty(node, prop);
        }
        propType = getNarrowableTypeForReference(propType, node, checkMode);
        var assumeUninitialized = false;
        if (strictNullChecks && strictPropertyInitialization && ts2.isAccessExpression(node) && node.expression.kind === 108) {
          var declaration = prop && prop.valueDeclaration;
          if (declaration && isPropertyWithoutInitializer(declaration)) {
            if (!ts2.isStatic(declaration)) {
              var flowContainer = getControlFlowContainer(node);
              if (flowContainer.kind === 170 && flowContainer.parent === declaration.parent && !(declaration.flags & 8388608)) {
                assumeUninitialized = true;
              }
            }
          }
        } else if (strictNullChecks && prop && prop.valueDeclaration && ts2.isPropertyAccessExpression(prop.valueDeclaration) && ts2.getAssignmentDeclarationPropertyAccessKind(prop.valueDeclaration) && getControlFlowContainer(node) === getControlFlowContainer(prop.valueDeclaration)) {
          assumeUninitialized = true;
        }
        var flowType = getFlowTypeOfReference(node, propType, assumeUninitialized ? getOptionalType(propType) : propType);
        if (assumeUninitialized && !(getFalsyFlags(propType) & 32768) && getFalsyFlags(flowType) & 32768) {
          error(errorNode, ts2.Diagnostics.Property_0_is_used_before_being_assigned, symbolToString(prop));
          return propType;
        }
        return assignmentKind ? getBaseTypeOfLiteralType(flowType) : flowType;
      }
      function checkPropertyNotUsedBeforeDeclaration(prop, node, right) {
        var valueDeclaration = prop.valueDeclaration;
        if (!valueDeclaration || ts2.getSourceFileOfNode(node).isDeclarationFile) {
          return;
        }
        var diagnosticMessage;
        var declarationName = ts2.idText(right);
        if (isInPropertyInitializerOrClassStaticBlock(node) && !isOptionalPropertyDeclaration(valueDeclaration) && !(ts2.isAccessExpression(node) && ts2.isAccessExpression(node.expression)) && !isBlockScopedNameDeclaredBeforeUse(valueDeclaration, right) && (compilerOptions.useDefineForClassFields || !isPropertyDeclaredInAncestorClass(prop))) {
          diagnosticMessage = error(right, ts2.Diagnostics.Property_0_is_used_before_its_initialization, declarationName);
        } else if (valueDeclaration.kind === 256 && node.parent.kind !== 177 && !(valueDeclaration.flags & 8388608) && !isBlockScopedNameDeclaredBeforeUse(valueDeclaration, right)) {
          diagnosticMessage = error(right, ts2.Diagnostics.Class_0_used_before_its_declaration, declarationName);
        }
        if (diagnosticMessage) {
          ts2.addRelatedInfo(diagnosticMessage, ts2.createDiagnosticForNode(valueDeclaration, ts2.Diagnostics._0_is_declared_here, declarationName));
        }
      }
      function isInPropertyInitializerOrClassStaticBlock(node) {
        return !!ts2.findAncestor(node, function(node2) {
          switch (node2.kind) {
            case 166:
              return true;
            case 294:
            case 168:
            case 171:
            case 172:
            case 296:
            case 161:
            case 232:
            case 287:
            case 284:
            case 285:
            case 286:
            case 279:
            case 227:
            case 290:
              return false;
            case 213:
            case 237:
              return ts2.isBlock(node2.parent) && ts2.isClassStaticBlockDeclaration(node2.parent.parent) ? true : "quit";
            default:
              return ts2.isExpressionNode(node2) ? false : "quit";
          }
        });
      }
      function isPropertyDeclaredInAncestorClass(prop) {
        if (!(prop.parent.flags & 32)) {
          return false;
        }
        var classType = getTypeOfSymbol(prop.parent);
        while (true) {
          classType = classType.symbol && getSuperClass(classType);
          if (!classType) {
            return false;
          }
          var superProperty = getPropertyOfType(classType, prop.escapedName);
          if (superProperty && superProperty.valueDeclaration) {
            return true;
          }
        }
      }
      function getSuperClass(classType) {
        var x = getBaseTypes(classType);
        if (x.length === 0) {
          return void 0;
        }
        return getIntersectionType(x);
      }
      function reportNonexistentProperty(propNode, containingType, isUncheckedJS) {
        var errorInfo;
        var relatedInfo;
        if (!ts2.isPrivateIdentifier(propNode) && containingType.flags & 1048576 && !(containingType.flags & 131068)) {
          for (var _i = 0, _a = containingType.types; _i < _a.length; _i++) {
            var subtype = _a[_i];
            if (!getPropertyOfType(subtype, propNode.escapedText) && !getApplicableIndexInfoForName(subtype, propNode.escapedText)) {
              errorInfo = ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, ts2.declarationNameToString(propNode), typeToString(subtype));
              break;
            }
          }
        }
        if (typeHasStaticProperty(propNode.escapedText, containingType)) {
          var propName = ts2.declarationNameToString(propNode);
          var typeName = typeToString(containingType);
          errorInfo = ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_to_access_the_static_member_2_instead, propName, typeName, typeName + "." + propName);
        } else {
          var promisedType = getPromisedTypeOfPromise(containingType);
          if (promisedType && getPropertyOfType(promisedType, propNode.escapedText)) {
            errorInfo = ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.Property_0_does_not_exist_on_type_1, ts2.declarationNameToString(propNode), typeToString(containingType));
            relatedInfo = ts2.createDiagnosticForNode(propNode, ts2.Diagnostics.Did_you_forget_to_use_await);
          } else {
            var missingProperty = ts2.declarationNameToString(propNode);
            var container = typeToString(containingType);
            var libSuggestion = getSuggestedLibForNonExistentProperty(missingProperty, containingType);
            if (libSuggestion !== void 0) {
              errorInfo = ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Do_you_need_to_change_your_target_library_Try_changing_the_lib_compiler_option_to_2_or_later, missingProperty, container, libSuggestion);
            } else {
              var suggestion = getSuggestedSymbolForNonexistentProperty(propNode, containingType);
              if (suggestion !== void 0) {
                var suggestedName = ts2.symbolName(suggestion);
                var message = isUncheckedJS ? ts2.Diagnostics.Property_0_may_not_exist_on_type_1_Did_you_mean_2 : ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2;
                errorInfo = ts2.chainDiagnosticMessages(errorInfo, message, missingProperty, container, suggestedName);
                relatedInfo = suggestion.valueDeclaration && ts2.createDiagnosticForNode(suggestion.valueDeclaration, ts2.Diagnostics._0_is_declared_here, suggestedName);
              } else {
                var diagnostic = containerSeemsToBeEmptyDomElement(containingType) ? ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Try_changing_the_lib_compiler_option_to_include_dom : ts2.Diagnostics.Property_0_does_not_exist_on_type_1;
                errorInfo = ts2.chainDiagnosticMessages(elaborateNeverIntersection(errorInfo, containingType), diagnostic, missingProperty, container);
              }
            }
          }
        }
        var resultDiagnostic = ts2.createDiagnosticForNodeFromMessageChain(propNode, errorInfo);
        if (relatedInfo) {
          ts2.addRelatedInfo(resultDiagnostic, relatedInfo);
        }
        addErrorOrSuggestion(!isUncheckedJS || errorInfo.code !== ts2.Diagnostics.Property_0_may_not_exist_on_type_1_Did_you_mean_2.code, resultDiagnostic);
      }
      function containerSeemsToBeEmptyDomElement(containingType) {
        return compilerOptions.lib && !compilerOptions.lib.includes("dom") && everyContainedType(containingType, function(type) {
          return type.symbol && /^(EventTarget|Node|((HTML[a-zA-Z]*)?Element))$/.test(ts2.unescapeLeadingUnderscores(type.symbol.escapedName));
        }) && isEmptyObjectType(containingType);
      }
      function typeHasStaticProperty(propName, containingType) {
        var prop = containingType.symbol && getPropertyOfType(getTypeOfSymbol(containingType.symbol), propName);
        return prop !== void 0 && !!prop.valueDeclaration && ts2.isStatic(prop.valueDeclaration);
      }
      function getSuggestedLibForNonExistentName(name) {
        var missingName = diagnosticName(name);
        var allFeatures = ts2.getScriptTargetFeatures();
        var libTargets = ts2.getOwnKeys(allFeatures);
        for (var _i = 0, libTargets_1 = libTargets; _i < libTargets_1.length; _i++) {
          var libTarget = libTargets_1[_i];
          var containingTypes = ts2.getOwnKeys(allFeatures[libTarget]);
          if (containingTypes !== void 0 && ts2.contains(containingTypes, missingName)) {
            return libTarget;
          }
        }
      }
      function getSuggestedLibForNonExistentProperty(missingProperty, containingType) {
        var container = getApparentType(containingType).symbol;
        if (!container) {
          return void 0;
        }
        var allFeatures = ts2.getScriptTargetFeatures();
        var libTargets = ts2.getOwnKeys(allFeatures);
        for (var _i = 0, libTargets_2 = libTargets; _i < libTargets_2.length; _i++) {
          var libTarget = libTargets_2[_i];
          var featuresOfLib = allFeatures[libTarget];
          var featuresOfContainingType = featuresOfLib[ts2.symbolName(container)];
          if (featuresOfContainingType !== void 0 && ts2.contains(featuresOfContainingType, missingProperty)) {
            return libTarget;
          }
        }
      }
      function getSuggestedSymbolForNonexistentClassMember(name, baseType) {
        return getSpellingSuggestionForName(name, getPropertiesOfType(baseType), 106500);
      }
      function getSuggestedSymbolForNonexistentProperty(name, containingType) {
        var props = getPropertiesOfType(containingType);
        if (typeof name !== "string") {
          var parent_2 = name.parent;
          if (ts2.isPropertyAccessExpression(parent_2)) {
            props = ts2.filter(props, function(prop) {
              return isValidPropertyAccessForCompletions(parent_2, containingType, prop);
            });
          }
          name = ts2.idText(name);
        }
        return getSpellingSuggestionForName(name, props, 111551);
      }
      function getSuggestedSymbolForNonexistentJSXAttribute(name, containingType) {
        var strName = ts2.isString(name) ? name : ts2.idText(name);
        var properties = getPropertiesOfType(containingType);
        var jsxSpecific = strName === "for" ? ts2.find(properties, function(x) {
          return ts2.symbolName(x) === "htmlFor";
        }) : strName === "class" ? ts2.find(properties, function(x) {
          return ts2.symbolName(x) === "className";
        }) : void 0;
        return jsxSpecific !== null && jsxSpecific !== void 0 ? jsxSpecific : getSpellingSuggestionForName(strName, properties, 111551);
      }
      function getSuggestionForNonexistentProperty(name, containingType) {
        var suggestion = getSuggestedSymbolForNonexistentProperty(name, containingType);
        return suggestion && ts2.symbolName(suggestion);
      }
      function getSuggestedSymbolForNonexistentSymbol(location, outerName, meaning) {
        ts2.Debug.assert(outerName !== void 0, "outername should always be defined");
        var result = resolveNameHelper(location, outerName, meaning, void 0, outerName, false, false, true, function(symbols, name, meaning2) {
          ts2.Debug.assertEqual(outerName, name, "name should equal outerName");
          var symbol = getSymbol(symbols, name, meaning2);
          if (symbol)
            return symbol;
          var candidates;
          if (symbols === globals) {
            var primitives = ts2.mapDefined(["string", "number", "boolean", "object", "bigint", "symbol"], function(s) {
              return symbols.has(s.charAt(0).toUpperCase() + s.slice(1)) ? createSymbol(524288, s) : void 0;
            });
            candidates = primitives.concat(ts2.arrayFrom(symbols.values()));
          } else {
            candidates = ts2.arrayFrom(symbols.values());
          }
          return getSpellingSuggestionForName(ts2.unescapeLeadingUnderscores(name), candidates, meaning2);
        });
        return result;
      }
      function getSuggestionForNonexistentSymbol(location, outerName, meaning) {
        var symbolResult = getSuggestedSymbolForNonexistentSymbol(location, outerName, meaning);
        return symbolResult && ts2.symbolName(symbolResult);
      }
      function getSuggestedSymbolForNonexistentModule(name, targetModule) {
        return targetModule.exports && getSpellingSuggestionForName(ts2.idText(name), getExportsOfModuleAsArray(targetModule), 2623475);
      }
      function getSuggestionForNonexistentExport(name, targetModule) {
        var suggestion = getSuggestedSymbolForNonexistentModule(name, targetModule);
        return suggestion && ts2.symbolName(suggestion);
      }
      function getSuggestionForNonexistentIndexSignature(objectType, expr, keyedType) {
        function hasProp(name) {
          var prop = getPropertyOfObjectType(objectType, name);
          if (prop) {
            var s = getSingleCallSignature(getTypeOfSymbol(prop));
            return !!s && getMinArgumentCount(s) >= 1 && isTypeAssignableTo(keyedType, getTypeAtPosition(s, 0));
          }
          return false;
        }
        ;
        var suggestedMethod = ts2.isAssignmentTarget(expr) ? "set" : "get";
        if (!hasProp(suggestedMethod)) {
          return void 0;
        }
        var suggestion = ts2.tryGetPropertyAccessOrIdentifierToString(expr.expression);
        if (suggestion === void 0) {
          suggestion = suggestedMethod;
        } else {
          suggestion += "." + suggestedMethod;
        }
        return suggestion;
      }
      function getSuggestedTypeForNonexistentStringLiteralType(source, target) {
        var candidates = target.types.filter(function(type) {
          return !!(type.flags & 128);
        });
        return ts2.getSpellingSuggestion(source.value, candidates, function(type) {
          return type.value;
        });
      }
      function getSpellingSuggestionForName(name, symbols, meaning) {
        return ts2.getSpellingSuggestion(name, symbols, getCandidateName);
        function getCandidateName(candidate) {
          var candidateName = ts2.symbolName(candidate);
          if (ts2.startsWith(candidateName, '"')) {
            return void 0;
          }
          if (candidate.flags & meaning) {
            return candidateName;
          }
          if (candidate.flags & 2097152) {
            var alias = tryResolveAlias(candidate);
            if (alias && alias.flags & meaning) {
              return candidateName;
            }
          }
          return void 0;
        }
      }
      function markPropertyAsReferenced(prop, nodeForCheckWriteOnly, isSelfTypeAccess2) {
        var valueDeclaration = prop && prop.flags & 106500 && prop.valueDeclaration;
        if (!valueDeclaration) {
          return;
        }
        var hasPrivateModifier = ts2.hasEffectiveModifier(valueDeclaration, 8);
        var hasPrivateIdentifier = prop.valueDeclaration && ts2.isNamedDeclaration(prop.valueDeclaration) && ts2.isPrivateIdentifier(prop.valueDeclaration.name);
        if (!hasPrivateModifier && !hasPrivateIdentifier) {
          return;
        }
        if (nodeForCheckWriteOnly && ts2.isWriteOnlyAccess(nodeForCheckWriteOnly) && !(prop.flags & 65536)) {
          return;
        }
        if (isSelfTypeAccess2) {
          var containingMethod = ts2.findAncestor(nodeForCheckWriteOnly, ts2.isFunctionLikeDeclaration);
          if (containingMethod && containingMethod.symbol === prop) {
            return;
          }
        }
        (ts2.getCheckFlags(prop) & 1 ? getSymbolLinks(prop).target : prop).isReferenced = 67108863;
      }
      function isSelfTypeAccess(name, parent) {
        return name.kind === 108 || !!parent && ts2.isEntityNameExpression(name) && parent === getResolvedSymbol(ts2.getFirstIdentifier(name));
      }
      function isValidPropertyAccess(node, propertyName) {
        switch (node.kind) {
          case 205:
            return isValidPropertyAccessWithType(node, node.expression.kind === 106, propertyName, getWidenedType(checkExpression(node.expression)));
          case 160:
            return isValidPropertyAccessWithType(node, false, propertyName, getWidenedType(checkExpression(node.left)));
          case 199:
            return isValidPropertyAccessWithType(node, false, propertyName, getTypeFromTypeNode(node));
        }
      }
      function isValidPropertyAccessForCompletions(node, type, property) {
        return isPropertyAccessible(node, node.kind === 205 && node.expression.kind === 106, false, type, property);
      }
      function isValidPropertyAccessWithType(node, isSuper, propertyName, type) {
        if (isTypeAny(type)) {
          return true;
        }
        var prop = getPropertyOfType(type, propertyName);
        return !!prop && isPropertyAccessible(node, isSuper, false, type, prop);
      }
      function isPropertyAccessible(node, isSuper, isWrite, containingType, property) {
        if (isTypeAny(containingType)) {
          return true;
        }
        if (property.valueDeclaration && ts2.isPrivateIdentifierClassElementDeclaration(property.valueDeclaration)) {
          var declClass_1 = ts2.getContainingClass(property.valueDeclaration);
          return !ts2.isOptionalChain(node) && !!ts2.findAncestor(node, function(parent) {
            return parent === declClass_1;
          });
        }
        return checkPropertyAccessibilityAtLocation(node, isSuper, isWrite, containingType, property);
      }
      function getForInVariableSymbol(node) {
        var initializer = node.initializer;
        if (initializer.kind === 254) {
          var variable = initializer.declarations[0];
          if (variable && !ts2.isBindingPattern(variable.name)) {
            return getSymbolOfNode(variable);
          }
        } else if (initializer.kind === 79) {
          return getResolvedSymbol(initializer);
        }
        return void 0;
      }
      function hasNumericPropertyNames(type) {
        return getIndexInfosOfType(type).length === 1 && !!getIndexInfoOfType(type, numberType);
      }
      function isForInVariableForNumericPropertyNames(expr) {
        var e = ts2.skipParentheses(expr);
        if (e.kind === 79) {
          var symbol = getResolvedSymbol(e);
          if (symbol.flags & 3) {
            var child = expr;
            var node = expr.parent;
            while (node) {
              if (node.kind === 242 && child === node.statement && getForInVariableSymbol(node) === symbol && hasNumericPropertyNames(getTypeOfExpression(node.expression))) {
                return true;
              }
              child = node;
              node = node.parent;
            }
          }
        }
        return false;
      }
      function checkIndexedAccess(node, checkMode) {
        return node.flags & 32 ? checkElementAccessChain(node, checkMode) : checkElementAccessExpression(node, checkNonNullExpression(node.expression), checkMode);
      }
      function checkElementAccessChain(node, checkMode) {
        var exprType = checkExpression(node.expression);
        var nonOptionalType = getOptionalExpressionType(exprType, node.expression);
        return propagateOptionalTypeMarker(checkElementAccessExpression(node, checkNonNullType(nonOptionalType, node.expression), checkMode), node, nonOptionalType !== exprType);
      }
      function checkElementAccessExpression(node, exprType, checkMode) {
        var objectType = ts2.getAssignmentTargetKind(node) !== 0 || isMethodAccessForCall(node) ? getWidenedType(exprType) : exprType;
        var indexExpression = node.argumentExpression;
        var indexType = checkExpression(indexExpression);
        if (isErrorType(objectType) || objectType === silentNeverType) {
          return objectType;
        }
        if (isConstEnumObjectType(objectType) && !ts2.isStringLiteralLike(indexExpression)) {
          error(indexExpression, ts2.Diagnostics.A_const_enum_member_can_only_be_accessed_using_a_string_literal);
          return errorType;
        }
        var effectiveIndexType = isForInVariableForNumericPropertyNames(indexExpression) ? numberType : indexType;
        var accessFlags = ts2.isAssignmentTarget(node) ? 4 | (isGenericObjectType(objectType) && !isThisTypeParameter(objectType) ? 2 : 0) : 32;
        var indexedAccessType = getIndexedAccessTypeOrUndefined(objectType, effectiveIndexType, accessFlags, node) || errorType;
        return checkIndexedAccessIndexType(getFlowTypeOfAccessExpression(node, getNodeLinks(node).resolvedSymbol, indexedAccessType, indexExpression, checkMode), node);
      }
      function callLikeExpressionMayHaveTypeArguments(node) {
        return ts2.isCallOrNewExpression(node) || ts2.isTaggedTemplateExpression(node) || ts2.isJsxOpeningLikeElement(node);
      }
      function resolveUntypedCall(node) {
        if (callLikeExpressionMayHaveTypeArguments(node)) {
          ts2.forEach(node.typeArguments, checkSourceElement);
        }
        if (node.kind === 209) {
          checkExpression(node.template);
        } else if (ts2.isJsxOpeningLikeElement(node)) {
          checkExpression(node.attributes);
        } else if (node.kind !== 164) {
          ts2.forEach(node.arguments, function(argument) {
            checkExpression(argument);
          });
        }
        return anySignature;
      }
      function resolveErrorCall(node) {
        resolveUntypedCall(node);
        return unknownSignature;
      }
      function reorderCandidates(signatures, result, callChainFlags) {
        var lastParent;
        var lastSymbol;
        var cutoffIndex = 0;
        var index;
        var specializedIndex = -1;
        var spliceIndex;
        ts2.Debug.assert(!result.length);
        for (var _i = 0, signatures_7 = signatures; _i < signatures_7.length; _i++) {
          var signature = signatures_7[_i];
          var symbol = signature.declaration && getSymbolOfNode(signature.declaration);
          var parent = signature.declaration && signature.declaration.parent;
          if (!lastSymbol || symbol === lastSymbol) {
            if (lastParent && parent === lastParent) {
              index = index + 1;
            } else {
              lastParent = parent;
              index = cutoffIndex;
            }
          } else {
            index = cutoffIndex = result.length;
            lastParent = parent;
          }
          lastSymbol = symbol;
          if (signatureHasLiteralTypes(signature)) {
            specializedIndex++;
            spliceIndex = specializedIndex;
            cutoffIndex++;
          } else {
            spliceIndex = index;
          }
          result.splice(spliceIndex, 0, callChainFlags ? getOptionalCallSignature(signature, callChainFlags) : signature);
        }
      }
      function isSpreadArgument(arg) {
        return !!arg && (arg.kind === 224 || arg.kind === 231 && arg.isSpread);
      }
      function getSpreadArgumentIndex(args) {
        return ts2.findIndex(args, isSpreadArgument);
      }
      function acceptsVoid(t) {
        return !!(t.flags & 16384);
      }
      function acceptsVoidUndefinedUnknownOrAny(t) {
        return !!(t.flags & (16384 | 32768 | 2 | 1));
      }
      function hasCorrectArity(node, args, signature, signatureHelpTrailingComma) {
        if (signatureHelpTrailingComma === void 0) {
          signatureHelpTrailingComma = false;
        }
        var argCount;
        var callIsIncomplete = false;
        var effectiveParameterCount = getParameterCount(signature);
        var effectiveMinimumArguments = getMinArgumentCount(signature);
        if (node.kind === 209) {
          argCount = args.length;
          if (node.template.kind === 222) {
            var lastSpan = ts2.last(node.template.templateSpans);
            callIsIncomplete = ts2.nodeIsMissing(lastSpan.literal) || !!lastSpan.literal.isUnterminated;
          } else {
            var templateLiteral = node.template;
            ts2.Debug.assert(templateLiteral.kind === 14);
            callIsIncomplete = !!templateLiteral.isUnterminated;
          }
        } else if (node.kind === 164) {
          argCount = getDecoratorArgumentCount(node, signature);
        } else if (ts2.isJsxOpeningLikeElement(node)) {
          callIsIncomplete = node.attributes.end === node.end;
          if (callIsIncomplete) {
            return true;
          }
          argCount = effectiveMinimumArguments === 0 ? args.length : 1;
          effectiveParameterCount = args.length === 0 ? effectiveParameterCount : 1;
          effectiveMinimumArguments = Math.min(effectiveMinimumArguments, 1);
        } else if (!node.arguments) {
          ts2.Debug.assert(node.kind === 208);
          return getMinArgumentCount(signature) === 0;
        } else {
          argCount = signatureHelpTrailingComma ? args.length + 1 : args.length;
          callIsIncomplete = node.arguments.end === node.end;
          var spreadArgIndex = getSpreadArgumentIndex(args);
          if (spreadArgIndex >= 0) {
            return spreadArgIndex >= getMinArgumentCount(signature) && (hasEffectiveRestParameter(signature) || spreadArgIndex < getParameterCount(signature));
          }
        }
        if (!hasEffectiveRestParameter(signature) && argCount > effectiveParameterCount) {
          return false;
        }
        if (callIsIncomplete || argCount >= effectiveMinimumArguments) {
          return true;
        }
        for (var i = argCount; i < effectiveMinimumArguments; i++) {
          var type = getTypeAtPosition(signature, i);
          if (filterType(type, ts2.isInJSFile(node) && !strictNullChecks ? acceptsVoidUndefinedUnknownOrAny : acceptsVoid).flags & 131072) {
            return false;
          }
        }
        return true;
      }
      function hasCorrectTypeArgumentArity(signature, typeArguments) {
        var numTypeParameters = ts2.length(signature.typeParameters);
        var minTypeArgumentCount = getMinTypeArgumentCount(signature.typeParameters);
        return !ts2.some(typeArguments) || typeArguments.length >= minTypeArgumentCount && typeArguments.length <= numTypeParameters;
      }
      function getSingleCallSignature(type) {
        return getSingleSignature(type, 0, false);
      }
      function getSingleCallOrConstructSignature(type) {
        return getSingleSignature(type, 0, false) || getSingleSignature(type, 1, false);
      }
      function getSingleSignature(type, kind, allowMembers) {
        if (type.flags & 524288) {
          var resolved = resolveStructuredTypeMembers(type);
          if (allowMembers || resolved.properties.length === 0 && resolved.indexInfos.length === 0) {
            if (kind === 0 && resolved.callSignatures.length === 1 && resolved.constructSignatures.length === 0) {
              return resolved.callSignatures[0];
            }
            if (kind === 1 && resolved.constructSignatures.length === 1 && resolved.callSignatures.length === 0) {
              return resolved.constructSignatures[0];
            }
          }
        }
        return void 0;
      }
      function instantiateSignatureInContextOf(signature, contextualSignature, inferenceContext, compareTypes) {
        var context = createInferenceContext(signature.typeParameters, signature, 0, compareTypes);
        var restType = getEffectiveRestType(contextualSignature);
        var mapper = inferenceContext && (restType && restType.flags & 262144 ? inferenceContext.nonFixingMapper : inferenceContext.mapper);
        var sourceSignature = mapper ? instantiateSignature(contextualSignature, mapper) : contextualSignature;
        applyToParameterTypes(sourceSignature, signature, function(source, target) {
          inferTypes(context.inferences, source, target);
        });
        if (!inferenceContext) {
          applyToReturnTypes(contextualSignature, signature, function(source, target) {
            inferTypes(context.inferences, source, target, 128);
          });
        }
        return getSignatureInstantiation(signature, getInferredTypes(context), ts2.isInJSFile(contextualSignature.declaration));
      }
      function inferJsxTypeArguments(node, signature, checkMode, context) {
        var paramType = getEffectiveFirstArgumentForJsxSignature(signature, node);
        var checkAttrType = checkExpressionWithContextualType(node.attributes, paramType, context, checkMode);
        inferTypes(context.inferences, checkAttrType, paramType);
        return getInferredTypes(context);
      }
      function getThisArgumentType(thisArgumentNode) {
        if (!thisArgumentNode) {
          return voidType;
        }
        var thisArgumentType = checkExpression(thisArgumentNode);
        return ts2.isOptionalChainRoot(thisArgumentNode.parent) ? getNonNullableType(thisArgumentType) : ts2.isOptionalChain(thisArgumentNode.parent) ? removeOptionalTypeMarker(thisArgumentType) : thisArgumentType;
      }
      function inferTypeArguments(node, signature, args, checkMode, context) {
        if (ts2.isJsxOpeningLikeElement(node)) {
          return inferJsxTypeArguments(node, signature, checkMode, context);
        }
        if (node.kind !== 164) {
          var contextualType = getContextualType(node, ts2.every(signature.typeParameters, function(p) {
            return !!getDefaultFromTypeParameter(p);
          }) ? 8 : 0);
          if (contextualType) {
            var outerContext = getInferenceContext(node);
            var outerMapper = getMapperFromContext(cloneInferenceContext(outerContext, 1));
            var instantiatedType = instantiateType(contextualType, outerMapper);
            var contextualSignature = getSingleCallSignature(instantiatedType);
            var inferenceSourceType = contextualSignature && contextualSignature.typeParameters ? getOrCreateTypeFromSignature(getSignatureInstantiationWithoutFillingInTypeArguments(contextualSignature, contextualSignature.typeParameters)) : instantiatedType;
            var inferenceTargetType = getReturnTypeOfSignature(signature);
            inferTypes(context.inferences, inferenceSourceType, inferenceTargetType, 128);
            var returnContext = createInferenceContext(signature.typeParameters, signature, context.flags);
            var returnSourceType = instantiateType(contextualType, outerContext && outerContext.returnMapper);
            inferTypes(returnContext.inferences, returnSourceType, inferenceTargetType);
            context.returnMapper = ts2.some(returnContext.inferences, hasInferenceCandidates) ? getMapperFromContext(cloneInferredPartOfContext(returnContext)) : void 0;
          }
        }
        var restType = getNonArrayRestType(signature);
        var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length;
        if (restType && restType.flags & 262144) {
          var info = ts2.find(context.inferences, function(info2) {
            return info2.typeParameter === restType;
          });
          if (info) {
            info.impliedArity = ts2.findIndex(args, isSpreadArgument, argCount) < 0 ? args.length - argCount : void 0;
          }
        }
        var thisType = getThisTypeOfSignature(signature);
        if (thisType) {
          var thisArgumentNode = getThisArgumentOfCall(node);
          inferTypes(context.inferences, getThisArgumentType(thisArgumentNode), thisType);
        }
        for (var i = 0; i < argCount; i++) {
          var arg = args[i];
          if (arg.kind !== 226) {
            var paramType = getTypeAtPosition(signature, i);
            var argType = checkExpressionWithContextualType(arg, paramType, context, checkMode);
            inferTypes(context.inferences, argType, paramType);
          }
        }
        if (restType) {
          var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, context, checkMode);
          inferTypes(context.inferences, spreadType, restType);
        }
        return getInferredTypes(context);
      }
      function getMutableArrayOrTupleType(type) {
        return type.flags & 1048576 ? mapType(type, getMutableArrayOrTupleType) : type.flags & 1 || isMutableArrayOrTuple(getBaseConstraintOfType(type) || type) ? type : isTupleType(type) ? createTupleType(getTypeArguments(type), type.target.elementFlags, false, type.target.labeledElementDeclarations) : createTupleType([type], [8]);
      }
      function getSpreadArgumentType(args, index, argCount, restType, context, checkMode) {
        if (index >= argCount - 1) {
          var arg = args[argCount - 1];
          if (isSpreadArgument(arg)) {
            return getMutableArrayOrTupleType(arg.kind === 231 ? arg.type : checkExpressionWithContextualType(arg.expression, restType, context, checkMode));
          }
        }
        var types = [];
        var flags = [];
        var names = [];
        for (var i = index; i < argCount; i++) {
          var arg = args[i];
          if (isSpreadArgument(arg)) {
            var spreadType = arg.kind === 231 ? arg.type : checkExpression(arg.expression);
            if (isArrayLikeType(spreadType)) {
              types.push(spreadType);
              flags.push(8);
            } else {
              types.push(checkIteratedTypeOrElementType(33, spreadType, undefinedType, arg.kind === 224 ? arg.expression : arg));
              flags.push(4);
            }
          } else {
            var contextualType = getIndexedAccessType(restType, getNumberLiteralType(i - index), 256);
            var argType = checkExpressionWithContextualType(arg, contextualType, context, checkMode);
            var hasPrimitiveContextualType = maybeTypeOfKind(contextualType, 131068 | 4194304 | 134217728 | 268435456);
            types.push(hasPrimitiveContextualType ? getRegularTypeOfLiteralType(argType) : getWidenedLiteralType(argType));
            flags.push(1);
          }
          if (arg.kind === 231 && arg.tupleNameSource) {
            names.push(arg.tupleNameSource);
          }
        }
        return createTupleType(types, flags, false, ts2.length(names) === ts2.length(types) ? names : void 0);
      }
      function checkTypeArguments(signature, typeArgumentNodes, reportErrors, headMessage) {
        var isJavascript = ts2.isInJSFile(signature.declaration);
        var typeParameters = signature.typeParameters;
        var typeArgumentTypes = fillMissingTypeArguments(ts2.map(typeArgumentNodes, getTypeFromTypeNode), typeParameters, getMinTypeArgumentCount(typeParameters), isJavascript);
        var mapper;
        for (var i = 0; i < typeArgumentNodes.length; i++) {
          ts2.Debug.assert(typeParameters[i] !== void 0, "Should not call checkTypeArguments with too many type arguments");
          var constraint = getConstraintOfTypeParameter(typeParameters[i]);
          if (constraint) {
            var errorInfo = reportErrors && headMessage ? function() {
              return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
            } : void 0;
            var typeArgumentHeadMessage = headMessage || ts2.Diagnostics.Type_0_does_not_satisfy_the_constraint_1;
            if (!mapper) {
              mapper = createTypeMapper(typeParameters, typeArgumentTypes);
            }
            var typeArgument = typeArgumentTypes[i];
            if (!checkTypeAssignableTo(typeArgument, getTypeWithThisArgument(instantiateType(constraint, mapper), typeArgument), reportErrors ? typeArgumentNodes[i] : void 0, typeArgumentHeadMessage, errorInfo)) {
              return void 0;
            }
          }
        }
        return typeArgumentTypes;
      }
      function getJsxReferenceKind(node) {
        if (isJsxIntrinsicIdentifier(node.tagName)) {
          return 2;
        }
        var tagType = getApparentType(checkExpression(node.tagName));
        if (ts2.length(getSignaturesOfType(tagType, 1))) {
          return 0;
        }
        if (ts2.length(getSignaturesOfType(tagType, 0))) {
          return 1;
        }
        return 2;
      }
      function checkApplicableSignatureForJsxOpeningLikeElement(node, signature, relation, checkMode, reportErrors, containingMessageChain, errorOutputContainer) {
        var paramType = getEffectiveFirstArgumentForJsxSignature(signature, node);
        var attributesType = checkExpressionWithContextualType(node.attributes, paramType, void 0, checkMode);
        return checkTagNameDoesNotExpectTooManyArguments() && checkTypeRelatedToAndOptionallyElaborate(attributesType, paramType, relation, reportErrors ? node.tagName : void 0, node.attributes, void 0, containingMessageChain, errorOutputContainer);
        function checkTagNameDoesNotExpectTooManyArguments() {
          var _a;
          if (getJsxNamespaceContainerForImplicitImport(node)) {
            return true;
          }
          var tagType = ts2.isJsxOpeningElement(node) || ts2.isJsxSelfClosingElement(node) && !isJsxIntrinsicIdentifier(node.tagName) ? checkExpression(node.tagName) : void 0;
          if (!tagType) {
            return true;
          }
          var tagCallSignatures = getSignaturesOfType(tagType, 0);
          if (!ts2.length(tagCallSignatures)) {
            return true;
          }
          var factory = getJsxFactoryEntity(node);
          if (!factory) {
            return true;
          }
          var factorySymbol = resolveEntityName(factory, 111551, true, false, node);
          if (!factorySymbol) {
            return true;
          }
          var factoryType = getTypeOfSymbol(factorySymbol);
          var callSignatures = getSignaturesOfType(factoryType, 0);
          if (!ts2.length(callSignatures)) {
            return true;
          }
          var hasFirstParamSignatures = false;
          var maxParamCount = 0;
          for (var _i = 0, callSignatures_1 = callSignatures; _i < callSignatures_1.length; _i++) {
            var sig = callSignatures_1[_i];
            var firstparam = getTypeAtPosition(sig, 0);
            var signaturesOfParam = getSignaturesOfType(firstparam, 0);
            if (!ts2.length(signaturesOfParam))
              continue;
            for (var _b = 0, signaturesOfParam_1 = signaturesOfParam; _b < signaturesOfParam_1.length; _b++) {
              var paramSig = signaturesOfParam_1[_b];
              hasFirstParamSignatures = true;
              if (hasEffectiveRestParameter(paramSig)) {
                return true;
              }
              var paramCount = getParameterCount(paramSig);
              if (paramCount > maxParamCount) {
                maxParamCount = paramCount;
              }
            }
          }
          if (!hasFirstParamSignatures) {
            return true;
          }
          var absoluteMinArgCount = Infinity;
          for (var _c = 0, tagCallSignatures_1 = tagCallSignatures; _c < tagCallSignatures_1.length; _c++) {
            var tagSig = tagCallSignatures_1[_c];
            var tagRequiredArgCount = getMinArgumentCount(tagSig);
            if (tagRequiredArgCount < absoluteMinArgCount) {
              absoluteMinArgCount = tagRequiredArgCount;
            }
          }
          if (absoluteMinArgCount <= maxParamCount) {
            return true;
          }
          if (reportErrors) {
            var diag = ts2.createDiagnosticForNode(node.tagName, ts2.Diagnostics.Tag_0_expects_at_least_1_arguments_but_the_JSX_factory_2_provides_at_most_3, ts2.entityNameToString(node.tagName), absoluteMinArgCount, ts2.entityNameToString(factory), maxParamCount);
            var tagNameDeclaration = (_a = getSymbolAtLocation(node.tagName)) === null || _a === void 0 ? void 0 : _a.valueDeclaration;
            if (tagNameDeclaration) {
              ts2.addRelatedInfo(diag, ts2.createDiagnosticForNode(tagNameDeclaration, ts2.Diagnostics._0_is_declared_here, ts2.entityNameToString(node.tagName)));
            }
            if (errorOutputContainer && errorOutputContainer.skipLogging) {
              (errorOutputContainer.errors || (errorOutputContainer.errors = [])).push(diag);
            }
            if (!errorOutputContainer.skipLogging) {
              diagnostics.add(diag);
            }
          }
          return false;
        }
      }
      function getSignatureApplicabilityError(node, args, signature, relation, checkMode, reportErrors, containingMessageChain) {
        var errorOutputContainer = { errors: void 0, skipLogging: true };
        if (ts2.isJsxOpeningLikeElement(node)) {
          if (!checkApplicableSignatureForJsxOpeningLikeElement(node, signature, relation, checkMode, reportErrors, containingMessageChain, errorOutputContainer)) {
            ts2.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "jsx should have errors when reporting errors");
            return errorOutputContainer.errors || ts2.emptyArray;
          }
          return void 0;
        }
        var thisType = getThisTypeOfSignature(signature);
        if (thisType && thisType !== voidType && node.kind !== 208) {
          var thisArgumentNode = getThisArgumentOfCall(node);
          var thisArgumentType = getThisArgumentType(thisArgumentNode);
          var errorNode = reportErrors ? thisArgumentNode || node : void 0;
          var headMessage_1 = ts2.Diagnostics.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1;
          if (!checkTypeRelatedTo(thisArgumentType, thisType, relation, errorNode, headMessage_1, containingMessageChain, errorOutputContainer)) {
            ts2.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "this parameter should have errors when reporting errors");
            return errorOutputContainer.errors || ts2.emptyArray;
          }
        }
        var headMessage = ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1;
        var restType = getNonArrayRestType(signature);
        var argCount = restType ? Math.min(getParameterCount(signature) - 1, args.length) : args.length;
        for (var i = 0; i < argCount; i++) {
          var arg = args[i];
          if (arg.kind !== 226) {
            var paramType = getTypeAtPosition(signature, i);
            var argType = checkExpressionWithContextualType(arg, paramType, void 0, checkMode);
            var checkArgType = checkMode & 4 ? getRegularTypeOfObjectLiteral(argType) : argType;
            if (!checkTypeRelatedToAndOptionallyElaborate(checkArgType, paramType, relation, reportErrors ? arg : void 0, arg, headMessage, containingMessageChain, errorOutputContainer)) {
              ts2.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "parameter should have errors when reporting errors");
              maybeAddMissingAwaitInfo(arg, checkArgType, paramType);
              return errorOutputContainer.errors || ts2.emptyArray;
            }
          }
        }
        if (restType) {
          var spreadType = getSpreadArgumentType(args, argCount, args.length, restType, void 0, checkMode);
          var restArgCount = args.length - argCount;
          var errorNode = !reportErrors ? void 0 : restArgCount === 0 ? node : restArgCount === 1 ? args[argCount] : ts2.setTextRangePosEnd(createSyntheticExpression(node, spreadType), args[argCount].pos, args[args.length - 1].end);
          if (!checkTypeRelatedTo(spreadType, restType, relation, errorNode, headMessage, void 0, errorOutputContainer)) {
            ts2.Debug.assert(!reportErrors || !!errorOutputContainer.errors, "rest parameter should have errors when reporting errors");
            maybeAddMissingAwaitInfo(errorNode, spreadType, restType);
            return errorOutputContainer.errors || ts2.emptyArray;
          }
        }
        return void 0;
        function maybeAddMissingAwaitInfo(errorNode2, source, target) {
          if (errorNode2 && reportErrors && errorOutputContainer.errors && errorOutputContainer.errors.length) {
            if (getAwaitedTypeOfPromise(target)) {
              return;
            }
            var awaitedTypeOfSource = getAwaitedTypeOfPromise(source);
            if (awaitedTypeOfSource && isTypeRelatedTo(awaitedTypeOfSource, target, relation)) {
              ts2.addRelatedInfo(errorOutputContainer.errors[0], ts2.createDiagnosticForNode(errorNode2, ts2.Diagnostics.Did_you_forget_to_use_await));
            }
          }
        }
      }
      function getThisArgumentOfCall(node) {
        var expression = node.kind === 207 ? node.expression : node.kind === 209 ? node.tag : void 0;
        if (expression) {
          var callee = ts2.skipOuterExpressions(expression);
          if (ts2.isAccessExpression(callee)) {
            return callee.expression;
          }
        }
      }
      function createSyntheticExpression(parent, type, isSpread, tupleNameSource) {
        var result = ts2.parseNodeFactory.createSyntheticExpression(type, isSpread, tupleNameSource);
        ts2.setTextRange(result, parent);
        ts2.setParent(result, parent);
        return result;
      }
      function getEffectiveCallArguments(node) {
        if (node.kind === 209) {
          var template = node.template;
          var args_3 = [createSyntheticExpression(template, getGlobalTemplateStringsArrayType())];
          if (template.kind === 222) {
            ts2.forEach(template.templateSpans, function(span) {
              args_3.push(span.expression);
            });
          }
          return args_3;
        }
        if (node.kind === 164) {
          return getEffectiveDecoratorArguments(node);
        }
        if (ts2.isJsxOpeningLikeElement(node)) {
          return node.attributes.properties.length > 0 || ts2.isJsxOpeningElement(node) && node.parent.children.length > 0 ? [node.attributes] : ts2.emptyArray;
        }
        var args = node.arguments || ts2.emptyArray;
        var spreadIndex = getSpreadArgumentIndex(args);
        if (spreadIndex >= 0) {
          var effectiveArgs_1 = args.slice(0, spreadIndex);
          var _loop_23 = function(i2) {
            var arg = args[i2];
            var spreadType = arg.kind === 224 && (flowLoopCount ? checkExpression(arg.expression) : checkExpressionCached(arg.expression));
            if (spreadType && isTupleType(spreadType)) {
              ts2.forEach(getTypeArguments(spreadType), function(t, i3) {
                var _a;
                var flags = spreadType.target.elementFlags[i3];
                var syntheticArg = createSyntheticExpression(arg, flags & 4 ? createArrayType(t) : t, !!(flags & 12), (_a = spreadType.target.labeledElementDeclarations) === null || _a === void 0 ? void 0 : _a[i3]);
                effectiveArgs_1.push(syntheticArg);
              });
            } else {
              effectiveArgs_1.push(arg);
            }
          };
          for (var i = spreadIndex; i < args.length; i++) {
            _loop_23(i);
          }
          return effectiveArgs_1;
        }
        return args;
      }
      function getEffectiveDecoratorArguments(node) {
        var parent = node.parent;
        var expr = node.expression;
        switch (parent.kind) {
          case 256:
          case 225:
            return [
              createSyntheticExpression(expr, getTypeOfSymbol(getSymbolOfNode(parent)))
            ];
          case 163:
            var func = parent.parent;
            return [
              createSyntheticExpression(expr, parent.parent.kind === 170 ? getTypeOfSymbol(getSymbolOfNode(func)) : errorType),
              createSyntheticExpression(expr, anyType),
              createSyntheticExpression(expr, numberType)
            ];
          case 166:
          case 168:
          case 171:
          case 172:
            var hasPropDesc = parent.kind !== 166 && languageVersion !== 0;
            return [
              createSyntheticExpression(expr, getParentTypeOfClassElement(parent)),
              createSyntheticExpression(expr, getClassElementPropertyKeyType(parent)),
              createSyntheticExpression(expr, hasPropDesc ? createTypedPropertyDescriptorType(getTypeOfNode(parent)) : anyType)
            ];
        }
        return ts2.Debug.fail();
      }
      function getDecoratorArgumentCount(node, signature) {
        switch (node.parent.kind) {
          case 256:
          case 225:
            return 1;
          case 166:
            return 2;
          case 168:
          case 171:
          case 172:
            return languageVersion === 0 || signature.parameters.length <= 2 ? 2 : 3;
          case 163:
            return 3;
          default:
            return ts2.Debug.fail();
        }
      }
      function getDiagnosticSpanForCallNode(node, doNotIncludeArguments) {
        var start;
        var length;
        var sourceFile = ts2.getSourceFileOfNode(node);
        if (ts2.isPropertyAccessExpression(node.expression)) {
          var nameSpan = ts2.getErrorSpanForNode(sourceFile, node.expression.name);
          start = nameSpan.start;
          length = doNotIncludeArguments ? nameSpan.length : node.end - start;
        } else {
          var expressionSpan = ts2.getErrorSpanForNode(sourceFile, node.expression);
          start = expressionSpan.start;
          length = doNotIncludeArguments ? expressionSpan.length : node.end - start;
        }
        return { start, length, sourceFile };
      }
      function getDiagnosticForCallNode(node, message, arg0, arg1, arg2, arg3) {
        if (ts2.isCallExpression(node)) {
          var _a = getDiagnosticSpanForCallNode(node), sourceFile = _a.sourceFile, start = _a.start, length_6 = _a.length;
          return ts2.createFileDiagnostic(sourceFile, start, length_6, message, arg0, arg1, arg2, arg3);
        } else {
          return ts2.createDiagnosticForNode(node, message, arg0, arg1, arg2, arg3);
        }
      }
      function isPromiseResolveArityError(node) {
        if (!ts2.isCallExpression(node) || !ts2.isIdentifier(node.expression))
          return false;
        var symbol = resolveName(node.expression, node.expression.escapedText, 111551, void 0, void 0, false);
        var decl = symbol === null || symbol === void 0 ? void 0 : symbol.valueDeclaration;
        if (!decl || !ts2.isParameter(decl) || !ts2.isFunctionExpressionOrArrowFunction(decl.parent) || !ts2.isNewExpression(decl.parent.parent) || !ts2.isIdentifier(decl.parent.parent.expression)) {
          return false;
        }
        var globalPromiseSymbol = getGlobalPromiseConstructorSymbol(false);
        if (!globalPromiseSymbol)
          return false;
        var constructorSymbol = getSymbolAtLocation(decl.parent.parent.expression, true);
        return constructorSymbol === globalPromiseSymbol;
      }
      function getArgumentArityError(node, signatures, args) {
        var _a;
        var spreadIndex = getSpreadArgumentIndex(args);
        if (spreadIndex > -1) {
          return ts2.createDiagnosticForNode(args[spreadIndex], ts2.Diagnostics.A_spread_argument_must_either_have_a_tuple_type_or_be_passed_to_a_rest_parameter);
        }
        var min = Number.POSITIVE_INFINITY;
        var max = Number.NEGATIVE_INFINITY;
        var maxBelow = Number.NEGATIVE_INFINITY;
        var minAbove = Number.POSITIVE_INFINITY;
        var closestSignature;
        for (var _i = 0, signatures_8 = signatures; _i < signatures_8.length; _i++) {
          var sig = signatures_8[_i];
          var minParameter = getMinArgumentCount(sig);
          var maxParameter = getParameterCount(sig);
          if (minParameter < min) {
            min = minParameter;
            closestSignature = sig;
          }
          max = Math.max(max, maxParameter);
          if (minParameter < args.length && minParameter > maxBelow)
            maxBelow = minParameter;
          if (args.length < maxParameter && maxParameter < minAbove)
            minAbove = maxParameter;
        }
        var hasRestParameter = ts2.some(signatures, hasEffectiveRestParameter);
        var parameterRange = hasRestParameter ? min : min < max ? min + "-" + max : min;
        var error2 = hasRestParameter ? ts2.Diagnostics.Expected_at_least_0_arguments_but_got_1 : parameterRange === 1 && args.length === 0 && isPromiseResolveArityError(node) ? ts2.Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise : ts2.Diagnostics.Expected_0_arguments_but_got_1;
        if (min < args.length && args.length < max) {
          return getDiagnosticForCallNode(node, ts2.Diagnostics.No_overload_expects_0_arguments_but_overloads_do_exist_that_expect_either_1_or_2_arguments, args.length, maxBelow, minAbove);
        } else if (args.length < min) {
          var diagnostic = getDiagnosticForCallNode(node, error2, parameterRange, args.length);
          var parameter = (_a = closestSignature === null || closestSignature === void 0 ? void 0 : closestSignature.declaration) === null || _a === void 0 ? void 0 : _a.parameters[closestSignature.thisParameter ? args.length + 1 : args.length];
          if (parameter) {
            var parameterError = ts2.createDiagnosticForNode(parameter, ts2.isBindingPattern(parameter.name) ? ts2.Diagnostics.An_argument_matching_this_binding_pattern_was_not_provided : ts2.isRestParameter(parameter) ? ts2.Diagnostics.Arguments_for_the_rest_parameter_0_were_not_provided : ts2.Diagnostics.An_argument_for_0_was_not_provided, !parameter.name ? args.length : !ts2.isBindingPattern(parameter.name) ? ts2.idText(ts2.getFirstIdentifier(parameter.name)) : void 0);
            return ts2.addRelatedInfo(diagnostic, parameterError);
          }
          return diagnostic;
        } else {
          var errorSpan = ts2.factory.createNodeArray(args.slice(max));
          var pos = ts2.first(errorSpan).pos;
          var end = ts2.last(errorSpan).end;
          if (end === pos) {
            end++;
          }
          ts2.setTextRangePosEnd(errorSpan, pos, end);
          return ts2.createDiagnosticForNodeArray(ts2.getSourceFileOfNode(node), errorSpan, error2, parameterRange, args.length);
        }
      }
      function getTypeArgumentArityError(node, signatures, typeArguments) {
        var argCount = typeArguments.length;
        if (signatures.length === 1) {
          var sig = signatures[0];
          var min_1 = getMinTypeArgumentCount(sig.typeParameters);
          var max = ts2.length(sig.typeParameters);
          return ts2.createDiagnosticForNodeArray(ts2.getSourceFileOfNode(node), typeArguments, ts2.Diagnostics.Expected_0_type_arguments_but_got_1, min_1 < max ? min_1 + "-" + max : min_1, argCount);
        }
        var belowArgCount = -Infinity;
        var aboveArgCount = Infinity;
        for (var _i = 0, signatures_9 = signatures; _i < signatures_9.length; _i++) {
          var sig = signatures_9[_i];
          var min_2 = getMinTypeArgumentCount(sig.typeParameters);
          var max = ts2.length(sig.typeParameters);
          if (min_2 > argCount) {
            aboveArgCount = Math.min(aboveArgCount, min_2);
          } else if (max < argCount) {
            belowArgCount = Math.max(belowArgCount, max);
          }
        }
        if (belowArgCount !== -Infinity && aboveArgCount !== Infinity) {
          return ts2.createDiagnosticForNodeArray(ts2.getSourceFileOfNode(node), typeArguments, ts2.Diagnostics.No_overload_expects_0_type_arguments_but_overloads_do_exist_that_expect_either_1_or_2_type_arguments, argCount, belowArgCount, aboveArgCount);
        }
        return ts2.createDiagnosticForNodeArray(ts2.getSourceFileOfNode(node), typeArguments, ts2.Diagnostics.Expected_0_type_arguments_but_got_1, belowArgCount === -Infinity ? aboveArgCount : belowArgCount, argCount);
      }
      function resolveCall(node, signatures, candidatesOutArray, checkMode, callChainFlags, fallbackError) {
        var isTaggedTemplate = node.kind === 209;
        var isDecorator = node.kind === 164;
        var isJsxOpeningOrSelfClosingElement = ts2.isJsxOpeningLikeElement(node);
        var reportErrors = !candidatesOutArray && produceDiagnostics;
        var typeArguments;
        if (!isDecorator) {
          typeArguments = node.typeArguments;
          if (isTaggedTemplate || isJsxOpeningOrSelfClosingElement || node.expression.kind !== 106) {
            ts2.forEach(typeArguments, checkSourceElement);
          }
        }
        var candidates = candidatesOutArray || [];
        reorderCandidates(signatures, candidates, callChainFlags);
        if (!candidates.length) {
          if (reportErrors) {
            diagnostics.add(getDiagnosticForCallNode(node, ts2.Diagnostics.Call_target_does_not_contain_any_signatures));
          }
          return resolveErrorCall(node);
        }
        var args = getEffectiveCallArguments(node);
        var isSingleNonGenericCandidate = candidates.length === 1 && !candidates[0].typeParameters;
        var argCheckMode = !isDecorator && !isSingleNonGenericCandidate && ts2.some(args, isContextSensitive) ? 4 : 0;
        var candidatesForArgumentError;
        var candidateForArgumentArityError;
        var candidateForTypeArgumentError;
        var result;
        var signatureHelpTrailingComma = !!(checkMode & 16) && node.kind === 207 && node.arguments.hasTrailingComma;
        if (candidates.length > 1) {
          result = chooseOverload(candidates, subtypeRelation, isSingleNonGenericCandidate, signatureHelpTrailingComma);
        }
        if (!result) {
          result = chooseOverload(candidates, assignableRelation, isSingleNonGenericCandidate, signatureHelpTrailingComma);
        }
        if (result) {
          return result;
        }
        if (reportErrors) {
          if (candidatesForArgumentError) {
            if (candidatesForArgumentError.length === 1 || candidatesForArgumentError.length > 3) {
              var last_2 = candidatesForArgumentError[candidatesForArgumentError.length - 1];
              var chain_1;
              if (candidatesForArgumentError.length > 3) {
                chain_1 = ts2.chainDiagnosticMessages(chain_1, ts2.Diagnostics.The_last_overload_gave_the_following_error);
                chain_1 = ts2.chainDiagnosticMessages(chain_1, ts2.Diagnostics.No_overload_matches_this_call);
              }
              var diags = getSignatureApplicabilityError(node, args, last_2, assignableRelation, 0, true, function() {
                return chain_1;
              });
              if (diags) {
                for (var _i = 0, diags_1 = diags; _i < diags_1.length; _i++) {
                  var d = diags_1[_i];
                  if (last_2.declaration && candidatesForArgumentError.length > 3) {
                    ts2.addRelatedInfo(d, ts2.createDiagnosticForNode(last_2.declaration, ts2.Diagnostics.The_last_overload_is_declared_here));
                  }
                  addImplementationSuccessElaboration(last_2, d);
                  diagnostics.add(d);
                }
              } else {
                ts2.Debug.fail("No error for last overload signature");
              }
            } else {
              var allDiagnostics = [];
              var max = 0;
              var min_3 = Number.MAX_VALUE;
              var minIndex = 0;
              var i_1 = 0;
              var _loop_24 = function(c2) {
                var chain_2 = function() {
                  return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Overload_0_of_1_2_gave_the_following_error, i_1 + 1, candidates.length, signatureToString(c2));
                };
                var diags_2 = getSignatureApplicabilityError(node, args, c2, assignableRelation, 0, true, chain_2);
                if (diags_2) {
                  if (diags_2.length <= min_3) {
                    min_3 = diags_2.length;
                    minIndex = i_1;
                  }
                  max = Math.max(max, diags_2.length);
                  allDiagnostics.push(diags_2);
                } else {
                  ts2.Debug.fail("No error for 3 or fewer overload signatures");
                }
                i_1++;
              };
              for (var _a = 0, candidatesForArgumentError_1 = candidatesForArgumentError; _a < candidatesForArgumentError_1.length; _a++) {
                var c = candidatesForArgumentError_1[_a];
                _loop_24(c);
              }
              var diags_3 = max > 1 ? allDiagnostics[minIndex] : ts2.flatten(allDiagnostics);
              ts2.Debug.assert(diags_3.length > 0, "No errors reported for 3 or fewer overload signatures");
              var chain = ts2.chainDiagnosticMessages(ts2.map(diags_3, function(d2) {
                return typeof d2.messageText === "string" ? d2 : d2.messageText;
              }), ts2.Diagnostics.No_overload_matches_this_call);
              var related = __spreadArray([], ts2.flatMap(diags_3, function(d2) {
                return d2.relatedInformation;
              }), true);
              var diag = void 0;
              if (ts2.every(diags_3, function(d2) {
                return d2.start === diags_3[0].start && d2.length === diags_3[0].length && d2.file === diags_3[0].file;
              })) {
                var _b = diags_3[0], file = _b.file, start = _b.start, length_7 = _b.length;
                diag = { file, start, length: length_7, code: chain.code, category: chain.category, messageText: chain, relatedInformation: related };
              } else {
                diag = ts2.createDiagnosticForNodeFromMessageChain(node, chain, related);
              }
              addImplementationSuccessElaboration(candidatesForArgumentError[0], diag);
              diagnostics.add(diag);
            }
          } else if (candidateForArgumentArityError) {
            diagnostics.add(getArgumentArityError(node, [candidateForArgumentArityError], args));
          } else if (candidateForTypeArgumentError) {
            checkTypeArguments(candidateForTypeArgumentError, node.typeArguments, true, fallbackError);
          } else {
            var signaturesWithCorrectTypeArgumentArity = ts2.filter(signatures, function(s) {
              return hasCorrectTypeArgumentArity(s, typeArguments);
            });
            if (signaturesWithCorrectTypeArgumentArity.length === 0) {
              diagnostics.add(getTypeArgumentArityError(node, signatures, typeArguments));
            } else if (!isDecorator) {
              diagnostics.add(getArgumentArityError(node, signaturesWithCorrectTypeArgumentArity, args));
            } else if (fallbackError) {
              diagnostics.add(getDiagnosticForCallNode(node, fallbackError));
            }
          }
        }
        return getCandidateForOverloadFailure(node, candidates, args, !!candidatesOutArray);
        function addImplementationSuccessElaboration(failed, diagnostic) {
          var _a2, _b2;
          var oldCandidatesForArgumentError = candidatesForArgumentError;
          var oldCandidateForArgumentArityError = candidateForArgumentArityError;
          var oldCandidateForTypeArgumentError = candidateForTypeArgumentError;
          var failedSignatureDeclarations = ((_b2 = (_a2 = failed.declaration) === null || _a2 === void 0 ? void 0 : _a2.symbol) === null || _b2 === void 0 ? void 0 : _b2.declarations) || ts2.emptyArray;
          var isOverload = failedSignatureDeclarations.length > 1;
          var implDecl = isOverload ? ts2.find(failedSignatureDeclarations, function(d2) {
            return ts2.isFunctionLikeDeclaration(d2) && ts2.nodeIsPresent(d2.body);
          }) : void 0;
          if (implDecl) {
            var candidate = getSignatureFromDeclaration(implDecl);
            var isSingleNonGenericCandidate_1 = !candidate.typeParameters;
            if (chooseOverload([candidate], assignableRelation, isSingleNonGenericCandidate_1)) {
              ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(implDecl, ts2.Diagnostics.The_call_would_have_succeeded_against_this_implementation_but_implementation_signatures_of_overloads_are_not_externally_visible));
            }
          }
          candidatesForArgumentError = oldCandidatesForArgumentError;
          candidateForArgumentArityError = oldCandidateForArgumentArityError;
          candidateForTypeArgumentError = oldCandidateForTypeArgumentError;
        }
        function chooseOverload(candidates2, relation, isSingleNonGenericCandidate2, signatureHelpTrailingComma2) {
          if (signatureHelpTrailingComma2 === void 0) {
            signatureHelpTrailingComma2 = false;
          }
          candidatesForArgumentError = void 0;
          candidateForArgumentArityError = void 0;
          candidateForTypeArgumentError = void 0;
          if (isSingleNonGenericCandidate2) {
            var candidate = candidates2[0];
            if (ts2.some(typeArguments) || !hasCorrectArity(node, args, candidate, signatureHelpTrailingComma2)) {
              return void 0;
            }
            if (getSignatureApplicabilityError(node, args, candidate, relation, 0, false, void 0)) {
              candidatesForArgumentError = [candidate];
              return void 0;
            }
            return candidate;
          }
          for (var candidateIndex = 0; candidateIndex < candidates2.length; candidateIndex++) {
            var candidate = candidates2[candidateIndex];
            if (!hasCorrectTypeArgumentArity(candidate, typeArguments) || !hasCorrectArity(node, args, candidate, signatureHelpTrailingComma2)) {
              continue;
            }
            var checkCandidate = void 0;
            var inferenceContext = void 0;
            if (candidate.typeParameters) {
              var typeArgumentTypes = void 0;
              if (ts2.some(typeArguments)) {
                typeArgumentTypes = checkTypeArguments(candidate, typeArguments, false);
                if (!typeArgumentTypes) {
                  candidateForTypeArgumentError = candidate;
                  continue;
                }
              } else {
                inferenceContext = createInferenceContext(candidate.typeParameters, candidate, ts2.isInJSFile(node) ? 2 : 0);
                typeArgumentTypes = inferTypeArguments(node, candidate, args, argCheckMode | 8, inferenceContext);
                argCheckMode |= inferenceContext.flags & 4 ? 8 : 0;
              }
              checkCandidate = getSignatureInstantiation(candidate, typeArgumentTypes, ts2.isInJSFile(candidate.declaration), inferenceContext && inferenceContext.inferredTypeParameters);
              if (getNonArrayRestType(candidate) && !hasCorrectArity(node, args, checkCandidate, signatureHelpTrailingComma2)) {
                candidateForArgumentArityError = checkCandidate;
                continue;
              }
            } else {
              checkCandidate = candidate;
            }
            if (getSignatureApplicabilityError(node, args, checkCandidate, relation, argCheckMode, false, void 0)) {
              (candidatesForArgumentError || (candidatesForArgumentError = [])).push(checkCandidate);
              continue;
            }
            if (argCheckMode) {
              argCheckMode = 0;
              if (inferenceContext) {
                var typeArgumentTypes = inferTypeArguments(node, candidate, args, argCheckMode, inferenceContext);
                checkCandidate = getSignatureInstantiation(candidate, typeArgumentTypes, ts2.isInJSFile(candidate.declaration), inferenceContext && inferenceContext.inferredTypeParameters);
                if (getNonArrayRestType(candidate) && !hasCorrectArity(node, args, checkCandidate, signatureHelpTrailingComma2)) {
                  candidateForArgumentArityError = checkCandidate;
                  continue;
                }
              }
              if (getSignatureApplicabilityError(node, args, checkCandidate, relation, argCheckMode, false, void 0)) {
                (candidatesForArgumentError || (candidatesForArgumentError = [])).push(checkCandidate);
                continue;
              }
            }
            candidates2[candidateIndex] = checkCandidate;
            return checkCandidate;
          }
          return void 0;
        }
      }
      function getCandidateForOverloadFailure(node, candidates, args, hasCandidatesOutArray) {
        ts2.Debug.assert(candidates.length > 0);
        checkNodeDeferred(node);
        return hasCandidatesOutArray || candidates.length === 1 || candidates.some(function(c) {
          return !!c.typeParameters;
        }) ? pickLongestCandidateSignature(node, candidates, args) : createUnionOfSignaturesForOverloadFailure(candidates);
      }
      function createUnionOfSignaturesForOverloadFailure(candidates) {
        var thisParameters = ts2.mapDefined(candidates, function(c) {
          return c.thisParameter;
        });
        var thisParameter;
        if (thisParameters.length) {
          thisParameter = createCombinedSymbolFromTypes(thisParameters, thisParameters.map(getTypeOfParameter));
        }
        var _a = ts2.minAndMax(candidates, getNumNonRestParameters), minArgumentCount = _a.min, maxNonRestParam = _a.max;
        var parameters = [];
        var _loop_25 = function(i2) {
          var symbols = ts2.mapDefined(candidates, function(s) {
            return signatureHasRestParameter(s) ? i2 < s.parameters.length - 1 ? s.parameters[i2] : ts2.last(s.parameters) : i2 < s.parameters.length ? s.parameters[i2] : void 0;
          });
          ts2.Debug.assert(symbols.length !== 0);
          parameters.push(createCombinedSymbolFromTypes(symbols, ts2.mapDefined(candidates, function(candidate) {
            return tryGetTypeAtPosition(candidate, i2);
          })));
        };
        for (var i = 0; i < maxNonRestParam; i++) {
          _loop_25(i);
        }
        var restParameterSymbols = ts2.mapDefined(candidates, function(c) {
          return signatureHasRestParameter(c) ? ts2.last(c.parameters) : void 0;
        });
        var flags = 0;
        if (restParameterSymbols.length !== 0) {
          var type = createArrayType(getUnionType(ts2.mapDefined(candidates, tryGetRestTypeOfSignature), 2));
          parameters.push(createCombinedSymbolForOverloadFailure(restParameterSymbols, type));
          flags |= 1;
        }
        if (candidates.some(signatureHasLiteralTypes)) {
          flags |= 2;
        }
        return createSignature(candidates[0].declaration, void 0, thisParameter, parameters, getIntersectionType(candidates.map(getReturnTypeOfSignature)), void 0, minArgumentCount, flags);
      }
      function getNumNonRestParameters(signature) {
        var numParams = signature.parameters.length;
        return signatureHasRestParameter(signature) ? numParams - 1 : numParams;
      }
      function createCombinedSymbolFromTypes(sources, types) {
        return createCombinedSymbolForOverloadFailure(sources, getUnionType(types, 2));
      }
      function createCombinedSymbolForOverloadFailure(sources, type) {
        return createSymbolWithType(ts2.first(sources), type);
      }
      function pickLongestCandidateSignature(node, candidates, args) {
        var bestIndex = getLongestCandidateIndex(candidates, apparentArgumentCount === void 0 ? args.length : apparentArgumentCount);
        var candidate = candidates[bestIndex];
        var typeParameters = candidate.typeParameters;
        if (!typeParameters) {
          return candidate;
        }
        var typeArgumentNodes = callLikeExpressionMayHaveTypeArguments(node) ? node.typeArguments : void 0;
        var instantiated = typeArgumentNodes ? createSignatureInstantiation(candidate, getTypeArgumentsFromNodes(typeArgumentNodes, typeParameters, ts2.isInJSFile(node))) : inferSignatureInstantiationForOverloadFailure(node, typeParameters, candidate, args);
        candidates[bestIndex] = instantiated;
        return instantiated;
      }
      function getTypeArgumentsFromNodes(typeArgumentNodes, typeParameters, isJs) {
        var typeArguments = typeArgumentNodes.map(getTypeOfNode);
        while (typeArguments.length > typeParameters.length) {
          typeArguments.pop();
        }
        while (typeArguments.length < typeParameters.length) {
          typeArguments.push(getConstraintOfTypeParameter(typeParameters[typeArguments.length]) || getDefaultTypeArgumentType(isJs));
        }
        return typeArguments;
      }
      function inferSignatureInstantiationForOverloadFailure(node, typeParameters, candidate, args) {
        var inferenceContext = createInferenceContext(typeParameters, candidate, ts2.isInJSFile(node) ? 2 : 0);
        var typeArgumentTypes = inferTypeArguments(node, candidate, args, 4 | 8, inferenceContext);
        return createSignatureInstantiation(candidate, typeArgumentTypes);
      }
      function getLongestCandidateIndex(candidates, argsCount) {
        var maxParamsIndex = -1;
        var maxParams = -1;
        for (var i = 0; i < candidates.length; i++) {
          var candidate = candidates[i];
          var paramCount = getParameterCount(candidate);
          if (hasEffectiveRestParameter(candidate) || paramCount >= argsCount) {
            return i;
          }
          if (paramCount > maxParams) {
            maxParams = paramCount;
            maxParamsIndex = i;
          }
        }
        return maxParamsIndex;
      }
      function resolveCallExpression(node, candidatesOutArray, checkMode) {
        if (node.expression.kind === 106) {
          var superType = checkSuperExpression(node.expression);
          if (isTypeAny(superType)) {
            for (var _i = 0, _a = node.arguments; _i < _a.length; _i++) {
              var arg = _a[_i];
              checkExpression(arg);
            }
            return anySignature;
          }
          if (!isErrorType(superType)) {
            var baseTypeNode = ts2.getEffectiveBaseTypeNode(ts2.getContainingClass(node));
            if (baseTypeNode) {
              var baseConstructors = getInstantiatedConstructorsForTypeArguments(superType, baseTypeNode.typeArguments, baseTypeNode);
              return resolveCall(node, baseConstructors, candidatesOutArray, checkMode, 0);
            }
          }
          return resolveUntypedCall(node);
        }
        var callChainFlags;
        var funcType = checkExpression(node.expression);
        if (ts2.isCallChain(node)) {
          var nonOptionalType = getOptionalExpressionType(funcType, node.expression);
          callChainFlags = nonOptionalType === funcType ? 0 : ts2.isOutermostOptionalChain(node) ? 16 : 8;
          funcType = nonOptionalType;
        } else {
          callChainFlags = 0;
        }
        funcType = checkNonNullTypeWithReporter(funcType, node.expression, reportCannotInvokePossiblyNullOrUndefinedError);
        if (funcType === silentNeverType) {
          return silentNeverSignature;
        }
        var apparentType = getApparentType(funcType);
        if (isErrorType(apparentType)) {
          return resolveErrorCall(node);
        }
        var callSignatures = getSignaturesOfType(apparentType, 0);
        var numConstructSignatures = getSignaturesOfType(apparentType, 1).length;
        if (isUntypedFunctionCall(funcType, apparentType, callSignatures.length, numConstructSignatures)) {
          if (!isErrorType(funcType) && node.typeArguments) {
            error(node, ts2.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
          }
          return resolveUntypedCall(node);
        }
        if (!callSignatures.length) {
          if (numConstructSignatures) {
            error(node, ts2.Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
          } else {
            var relatedInformation = void 0;
            if (node.arguments.length === 1) {
              var text = ts2.getSourceFileOfNode(node).text;
              if (ts2.isLineBreak(text.charCodeAt(ts2.skipTrivia(text, node.expression.end, true) - 1))) {
                relatedInformation = ts2.createDiagnosticForNode(node.expression, ts2.Diagnostics.Are_you_missing_a_semicolon);
              }
            }
            invocationError(node.expression, apparentType, 0, relatedInformation);
          }
          return resolveErrorCall(node);
        }
        if (checkMode & 8 && !node.typeArguments && callSignatures.some(isGenericFunctionReturningFunction)) {
          skippedGenericFunction(node, checkMode);
          return resolvingSignature;
        }
        if (callSignatures.some(function(sig) {
          return ts2.isInJSFile(sig.declaration) && !!ts2.getJSDocClassTag(sig.declaration);
        })) {
          error(node, ts2.Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
          return resolveErrorCall(node);
        }
        return resolveCall(node, callSignatures, candidatesOutArray, checkMode, callChainFlags);
      }
      function isGenericFunctionReturningFunction(signature) {
        return !!(signature.typeParameters && isFunctionType(getReturnTypeOfSignature(signature)));
      }
      function isUntypedFunctionCall(funcType, apparentFuncType, numCallSignatures, numConstructSignatures) {
        return isTypeAny(funcType) || isTypeAny(apparentFuncType) && !!(funcType.flags & 262144) || !numCallSignatures && !numConstructSignatures && !(apparentFuncType.flags & 1048576) && !(getReducedType(apparentFuncType).flags & 131072) && isTypeAssignableTo(funcType, globalFunctionType);
      }
      function resolveNewExpression(node, candidatesOutArray, checkMode) {
        if (node.arguments && languageVersion < 1) {
          var spreadIndex = getSpreadArgumentIndex(node.arguments);
          if (spreadIndex >= 0) {
            error(node.arguments[spreadIndex], ts2.Diagnostics.Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher);
          }
        }
        var expressionType = checkNonNullExpression(node.expression);
        if (expressionType === silentNeverType) {
          return silentNeverSignature;
        }
        expressionType = getApparentType(expressionType);
        if (isErrorType(expressionType)) {
          return resolveErrorCall(node);
        }
        if (isTypeAny(expressionType)) {
          if (node.typeArguments) {
            error(node, ts2.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
          }
          return resolveUntypedCall(node);
        }
        var constructSignatures = getSignaturesOfType(expressionType, 1);
        if (constructSignatures.length) {
          if (!isConstructorAccessible(node, constructSignatures[0])) {
            return resolveErrorCall(node);
          }
          if (constructSignatures.some(function(signature2) {
            return signature2.flags & 4;
          })) {
            error(node, ts2.Diagnostics.Cannot_create_an_instance_of_an_abstract_class);
            return resolveErrorCall(node);
          }
          var valueDecl = expressionType.symbol && ts2.getClassLikeDeclarationOfSymbol(expressionType.symbol);
          if (valueDecl && ts2.hasSyntacticModifier(valueDecl, 128)) {
            error(node, ts2.Diagnostics.Cannot_create_an_instance_of_an_abstract_class);
            return resolveErrorCall(node);
          }
          return resolveCall(node, constructSignatures, candidatesOutArray, checkMode, 0);
        }
        var callSignatures = getSignaturesOfType(expressionType, 0);
        if (callSignatures.length) {
          var signature = resolveCall(node, callSignatures, candidatesOutArray, checkMode, 0);
          if (!noImplicitAny) {
            if (signature.declaration && !isJSConstructor(signature.declaration) && getReturnTypeOfSignature(signature) !== voidType) {
              error(node, ts2.Diagnostics.Only_a_void_function_can_be_called_with_the_new_keyword);
            }
            if (getThisTypeOfSignature(signature) === voidType) {
              error(node, ts2.Diagnostics.A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void);
            }
          }
          return signature;
        }
        invocationError(node.expression, expressionType, 1);
        return resolveErrorCall(node);
      }
      function typeHasProtectedAccessibleBase(target, type) {
        var baseTypes = getBaseTypes(type);
        if (!ts2.length(baseTypes)) {
          return false;
        }
        var firstBase = baseTypes[0];
        if (firstBase.flags & 2097152) {
          var types = firstBase.types;
          var mixinFlags = findMixins(types);
          var i = 0;
          for (var _i = 0, _a = firstBase.types; _i < _a.length; _i++) {
            var intersectionMember = _a[_i];
            if (!mixinFlags[i]) {
              if (ts2.getObjectFlags(intersectionMember) & (1 | 2)) {
                if (intersectionMember.symbol === target) {
                  return true;
                }
                if (typeHasProtectedAccessibleBase(target, intersectionMember)) {
                  return true;
                }
              }
            }
            i++;
          }
          return false;
        }
        if (firstBase.symbol === target) {
          return true;
        }
        return typeHasProtectedAccessibleBase(target, firstBase);
      }
      function isConstructorAccessible(node, signature) {
        if (!signature || !signature.declaration) {
          return true;
        }
        var declaration = signature.declaration;
        var modifiers = ts2.getSelectedEffectiveModifierFlags(declaration, 24);
        if (!modifiers || declaration.kind !== 170) {
          return true;
        }
        var declaringClassDeclaration = ts2.getClassLikeDeclarationOfSymbol(declaration.parent.symbol);
        var declaringClass = getDeclaredTypeOfSymbol(declaration.parent.symbol);
        if (!isNodeWithinClass(node, declaringClassDeclaration)) {
          var containingClass = ts2.getContainingClass(node);
          if (containingClass && modifiers & 16) {
            var containingType = getTypeOfNode(containingClass);
            if (typeHasProtectedAccessibleBase(declaration.parent.symbol, containingType)) {
              return true;
            }
          }
          if (modifiers & 8) {
            error(node, ts2.Diagnostics.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration, typeToString(declaringClass));
          }
          if (modifiers & 16) {
            error(node, ts2.Diagnostics.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration, typeToString(declaringClass));
          }
          return false;
        }
        return true;
      }
      function invocationErrorDetails(errorTarget, apparentType, kind) {
        var errorInfo;
        var isCall = kind === 0;
        var awaitedType = getAwaitedType(apparentType);
        var maybeMissingAwait = awaitedType && getSignaturesOfType(awaitedType, kind).length > 0;
        if (apparentType.flags & 1048576) {
          var types = apparentType.types;
          var hasSignatures = false;
          for (var _i = 0, types_20 = types; _i < types_20.length; _i++) {
            var constituent = types_20[_i];
            var signatures = getSignaturesOfType(constituent, kind);
            if (signatures.length !== 0) {
              hasSignatures = true;
              if (errorInfo) {
                break;
              }
            } else {
              if (!errorInfo) {
                errorInfo = ts2.chainDiagnosticMessages(errorInfo, isCall ? ts2.Diagnostics.Type_0_has_no_call_signatures : ts2.Diagnostics.Type_0_has_no_construct_signatures, typeToString(constituent));
                errorInfo = ts2.chainDiagnosticMessages(errorInfo, isCall ? ts2.Diagnostics.Not_all_constituents_of_type_0_are_callable : ts2.Diagnostics.Not_all_constituents_of_type_0_are_constructable, typeToString(apparentType));
              }
              if (hasSignatures) {
                break;
              }
            }
          }
          if (!hasSignatures) {
            errorInfo = ts2.chainDiagnosticMessages(void 0, isCall ? ts2.Diagnostics.No_constituent_of_type_0_is_callable : ts2.Diagnostics.No_constituent_of_type_0_is_constructable, typeToString(apparentType));
          }
          if (!errorInfo) {
            errorInfo = ts2.chainDiagnosticMessages(errorInfo, isCall ? ts2.Diagnostics.Each_member_of_the_union_type_0_has_signatures_but_none_of_those_signatures_are_compatible_with_each_other : ts2.Diagnostics.Each_member_of_the_union_type_0_has_construct_signatures_but_none_of_those_signatures_are_compatible_with_each_other, typeToString(apparentType));
          }
        } else {
          errorInfo = ts2.chainDiagnosticMessages(errorInfo, isCall ? ts2.Diagnostics.Type_0_has_no_call_signatures : ts2.Diagnostics.Type_0_has_no_construct_signatures, typeToString(apparentType));
        }
        var headMessage = isCall ? ts2.Diagnostics.This_expression_is_not_callable : ts2.Diagnostics.This_expression_is_not_constructable;
        if (ts2.isCallExpression(errorTarget.parent) && errorTarget.parent.arguments.length === 0) {
          var resolvedSymbol = getNodeLinks(errorTarget).resolvedSymbol;
          if (resolvedSymbol && resolvedSymbol.flags & 32768) {
            headMessage = ts2.Diagnostics.This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without;
          }
        }
        return {
          messageChain: ts2.chainDiagnosticMessages(errorInfo, headMessage),
          relatedMessage: maybeMissingAwait ? ts2.Diagnostics.Did_you_forget_to_use_await : void 0
        };
      }
      function invocationError(errorTarget, apparentType, kind, relatedInformation) {
        var _a = invocationErrorDetails(errorTarget, apparentType, kind), messageChain = _a.messageChain, relatedInfo = _a.relatedMessage;
        var diagnostic = ts2.createDiagnosticForNodeFromMessageChain(errorTarget, messageChain);
        if (relatedInfo) {
          ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(errorTarget, relatedInfo));
        }
        if (ts2.isCallExpression(errorTarget.parent)) {
          var _b = getDiagnosticSpanForCallNode(errorTarget.parent, true), start = _b.start, length_8 = _b.length;
          diagnostic.start = start;
          diagnostic.length = length_8;
        }
        diagnostics.add(diagnostic);
        invocationErrorRecovery(apparentType, kind, relatedInformation ? ts2.addRelatedInfo(diagnostic, relatedInformation) : diagnostic);
      }
      function invocationErrorRecovery(apparentType, kind, diagnostic) {
        if (!apparentType.symbol) {
          return;
        }
        var importNode = getSymbolLinks(apparentType.symbol).originatingImport;
        if (importNode && !ts2.isImportCall(importNode)) {
          var sigs = getSignaturesOfType(getTypeOfSymbol(getSymbolLinks(apparentType.symbol).target), kind);
          if (!sigs || !sigs.length)
            return;
          ts2.addRelatedInfo(diagnostic, ts2.createDiagnosticForNode(importNode, ts2.Diagnostics.Type_originates_at_this_import_A_namespace_style_import_cannot_be_called_or_constructed_and_will_cause_a_failure_at_runtime_Consider_using_a_default_import_or_import_require_here_instead));
        }
      }
      function resolveTaggedTemplateExpression(node, candidatesOutArray, checkMode) {
        var tagType = checkExpression(node.tag);
        var apparentType = getApparentType(tagType);
        if (isErrorType(apparentType)) {
          return resolveErrorCall(node);
        }
        var callSignatures = getSignaturesOfType(apparentType, 0);
        var numConstructSignatures = getSignaturesOfType(apparentType, 1).length;
        if (isUntypedFunctionCall(tagType, apparentType, callSignatures.length, numConstructSignatures)) {
          return resolveUntypedCall(node);
        }
        if (!callSignatures.length) {
          if (ts2.isArrayLiteralExpression(node.parent)) {
            var diagnostic = ts2.createDiagnosticForNode(node.tag, ts2.Diagnostics.It_is_likely_that_you_are_missing_a_comma_to_separate_these_two_template_expressions_They_form_a_tagged_template_expression_which_cannot_be_invoked);
            diagnostics.add(diagnostic);
            return resolveErrorCall(node);
          }
          invocationError(node.tag, apparentType, 0);
          return resolveErrorCall(node);
        }
        return resolveCall(node, callSignatures, candidatesOutArray, checkMode, 0);
      }
      function getDiagnosticHeadMessageForDecoratorResolution(node) {
        switch (node.parent.kind) {
          case 256:
          case 225:
            return ts2.Diagnostics.Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression;
          case 163:
            return ts2.Diagnostics.Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression;
          case 166:
            return ts2.Diagnostics.Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression;
          case 168:
          case 171:
          case 172:
            return ts2.Diagnostics.Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression;
          default:
            return ts2.Debug.fail();
        }
      }
      function resolveDecorator(node, candidatesOutArray, checkMode) {
        var funcType = checkExpression(node.expression);
        var apparentType = getApparentType(funcType);
        if (isErrorType(apparentType)) {
          return resolveErrorCall(node);
        }
        var callSignatures = getSignaturesOfType(apparentType, 0);
        var numConstructSignatures = getSignaturesOfType(apparentType, 1).length;
        if (isUntypedFunctionCall(funcType, apparentType, callSignatures.length, numConstructSignatures)) {
          return resolveUntypedCall(node);
        }
        if (isPotentiallyUncalledDecorator(node, callSignatures)) {
          var nodeStr = ts2.getTextOfNode(node.expression, false);
          error(node, ts2.Diagnostics._0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write_0, nodeStr);
          return resolveErrorCall(node);
        }
        var headMessage = getDiagnosticHeadMessageForDecoratorResolution(node);
        if (!callSignatures.length) {
          var errorDetails = invocationErrorDetails(node.expression, apparentType, 0);
          var messageChain = ts2.chainDiagnosticMessages(errorDetails.messageChain, headMessage);
          var diag = ts2.createDiagnosticForNodeFromMessageChain(node.expression, messageChain);
          if (errorDetails.relatedMessage) {
            ts2.addRelatedInfo(diag, ts2.createDiagnosticForNode(node.expression, errorDetails.relatedMessage));
          }
          diagnostics.add(diag);
          invocationErrorRecovery(apparentType, 0, diag);
          return resolveErrorCall(node);
        }
        return resolveCall(node, callSignatures, candidatesOutArray, checkMode, 0, headMessage);
      }
      function createSignatureForJSXIntrinsic(node, result) {
        var namespace = getJsxNamespaceAt(node);
        var exports = namespace && getExportsOfSymbol(namespace);
        var typeSymbol = exports && getSymbol(exports, JsxNames.Element, 788968);
        var returnNode = typeSymbol && nodeBuilder.symbolToEntityName(typeSymbol, 788968, node);
        var declaration = ts2.factory.createFunctionTypeNode(void 0, [ts2.factory.createParameterDeclaration(void 0, void 0, void 0, "props", void 0, nodeBuilder.typeToTypeNode(result, node))], returnNode ? ts2.factory.createTypeReferenceNode(returnNode, void 0) : ts2.factory.createKeywordTypeNode(130));
        var parameterSymbol = createSymbol(1, "props");
        parameterSymbol.type = result;
        return createSignature(declaration, void 0, void 0, [parameterSymbol], typeSymbol ? getDeclaredTypeOfSymbol(typeSymbol) : errorType, void 0, 1, 0);
      }
      function resolveJsxOpeningLikeElement(node, candidatesOutArray, checkMode) {
        if (isJsxIntrinsicIdentifier(node.tagName)) {
          var result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node);
          var fakeSignature = createSignatureForJSXIntrinsic(node, result);
          checkTypeAssignableToAndOptionallyElaborate(checkExpressionWithContextualType(node.attributes, getEffectiveFirstArgumentForJsxSignature(fakeSignature, node), void 0, 0), result, node.tagName, node.attributes);
          if (ts2.length(node.typeArguments)) {
            ts2.forEach(node.typeArguments, checkSourceElement);
            diagnostics.add(ts2.createDiagnosticForNodeArray(ts2.getSourceFileOfNode(node), node.typeArguments, ts2.Diagnostics.Expected_0_type_arguments_but_got_1, 0, ts2.length(node.typeArguments)));
          }
          return fakeSignature;
        }
        var exprTypes = checkExpression(node.tagName);
        var apparentType = getApparentType(exprTypes);
        if (isErrorType(apparentType)) {
          return resolveErrorCall(node);
        }
        var signatures = getUninstantiatedJsxSignaturesOfType(exprTypes, node);
        if (isUntypedFunctionCall(exprTypes, apparentType, signatures.length, 0)) {
          return resolveUntypedCall(node);
        }
        if (signatures.length === 0) {
          error(node.tagName, ts2.Diagnostics.JSX_element_type_0_does_not_have_any_construct_or_call_signatures, ts2.getTextOfNode(node.tagName));
          return resolveErrorCall(node);
        }
        return resolveCall(node, signatures, candidatesOutArray, checkMode, 0);
      }
      function isPotentiallyUncalledDecorator(decorator, signatures) {
        return signatures.length && ts2.every(signatures, function(signature) {
          return signature.minArgumentCount === 0 && !signatureHasRestParameter(signature) && signature.parameters.length < getDecoratorArgumentCount(decorator, signature);
        });
      }
      function resolveSignature(node, candidatesOutArray, checkMode) {
        switch (node.kind) {
          case 207:
            return resolveCallExpression(node, candidatesOutArray, checkMode);
          case 208:
            return resolveNewExpression(node, candidatesOutArray, checkMode);
          case 209:
            return resolveTaggedTemplateExpression(node, candidatesOutArray, checkMode);
          case 164:
            return resolveDecorator(node, candidatesOutArray, checkMode);
          case 279:
          case 278:
            return resolveJsxOpeningLikeElement(node, candidatesOutArray, checkMode);
        }
        throw ts2.Debug.assertNever(node, "Branch in 'resolveSignature' should be unreachable.");
      }
      function getResolvedSignature(node, candidatesOutArray, checkMode) {
        var links = getNodeLinks(node);
        var cached = links.resolvedSignature;
        if (cached && cached !== resolvingSignature && !candidatesOutArray) {
          return cached;
        }
        links.resolvedSignature = resolvingSignature;
        var result = resolveSignature(node, candidatesOutArray, checkMode || 0);
        if (result !== resolvingSignature) {
          links.resolvedSignature = flowLoopStart === flowLoopCount ? result : cached;
        }
        return result;
      }
      function isJSConstructor(node) {
        var _a;
        if (!node || !ts2.isInJSFile(node)) {
          return false;
        }
        var func = ts2.isFunctionDeclaration(node) || ts2.isFunctionExpression(node) ? node : ts2.isVariableDeclaration(node) && node.initializer && ts2.isFunctionExpression(node.initializer) ? node.initializer : void 0;
        if (func) {
          if (ts2.getJSDocClassTag(node))
            return true;
          var symbol = getSymbolOfNode(func);
          return !!((_a = symbol === null || symbol === void 0 ? void 0 : symbol.members) === null || _a === void 0 ? void 0 : _a.size);
        }
        return false;
      }
      function mergeJSSymbols(target, source) {
        var _a, _b;
        if (source) {
          var links = getSymbolLinks(source);
          if (!links.inferredClassSymbol || !links.inferredClassSymbol.has(getSymbolId(target))) {
            var inferred = ts2.isTransientSymbol(target) ? target : cloneSymbol(target);
            inferred.exports = inferred.exports || ts2.createSymbolTable();
            inferred.members = inferred.members || ts2.createSymbolTable();
            inferred.flags |= source.flags & 32;
            if ((_a = source.exports) === null || _a === void 0 ? void 0 : _a.size) {
              mergeSymbolTable(inferred.exports, source.exports);
            }
            if ((_b = source.members) === null || _b === void 0 ? void 0 : _b.size) {
              mergeSymbolTable(inferred.members, source.members);
            }
            (links.inferredClassSymbol || (links.inferredClassSymbol = new ts2.Map())).set(getSymbolId(inferred), inferred);
            return inferred;
          }
          return links.inferredClassSymbol.get(getSymbolId(target));
        }
      }
      function getAssignedClassSymbol(decl) {
        var _a;
        var assignmentSymbol = decl && getSymbolOfExpando(decl, true);
        var prototype = (_a = assignmentSymbol === null || assignmentSymbol === void 0 ? void 0 : assignmentSymbol.exports) === null || _a === void 0 ? void 0 : _a.get("prototype");
        var init = (prototype === null || prototype === void 0 ? void 0 : prototype.valueDeclaration) && getAssignedJSPrototype(prototype.valueDeclaration);
        return init ? getSymbolOfNode(init) : void 0;
      }
      function getSymbolOfExpando(node, allowDeclaration) {
        if (!node.parent) {
          return void 0;
        }
        var name;
        var decl;
        if (ts2.isVariableDeclaration(node.parent) && node.parent.initializer === node) {
          if (!ts2.isInJSFile(node) && !(ts2.isVarConst(node.parent) && ts2.isFunctionLikeDeclaration(node))) {
            return void 0;
          }
          name = node.parent.name;
          decl = node.parent;
        } else if (ts2.isBinaryExpression(node.parent)) {
          var parentNode = node.parent;
          var parentNodeOperator = node.parent.operatorToken.kind;
          if (parentNodeOperator === 63 && (allowDeclaration || parentNode.right === node)) {
            name = parentNode.left;
            decl = name;
          } else if (parentNodeOperator === 56 || parentNodeOperator === 60) {
            if (ts2.isVariableDeclaration(parentNode.parent) && parentNode.parent.initializer === parentNode) {
              name = parentNode.parent.name;
              decl = parentNode.parent;
            } else if (ts2.isBinaryExpression(parentNode.parent) && parentNode.parent.operatorToken.kind === 63 && (allowDeclaration || parentNode.parent.right === parentNode)) {
              name = parentNode.parent.left;
              decl = name;
            }
            if (!name || !ts2.isBindableStaticNameExpression(name) || !ts2.isSameEntityName(name, parentNode.left)) {
              return void 0;
            }
          }
        } else if (allowDeclaration && ts2.isFunctionDeclaration(node)) {
          name = node.name;
          decl = node;
        }
        if (!decl || !name || !allowDeclaration && !ts2.getExpandoInitializer(node, ts2.isPrototypeAccess(name))) {
          return void 0;
        }
        return getSymbolOfNode(decl);
      }
      function getAssignedJSPrototype(node) {
        if (!node.parent) {
          return false;
        }
        var parent = node.parent;
        while (parent && parent.kind === 205) {
          parent = parent.parent;
        }
        if (parent && ts2.isBinaryExpression(parent) && ts2.isPrototypeAccess(parent.left) && parent.operatorToken.kind === 63) {
          var right = ts2.getInitializerOfBinaryExpression(parent);
          return ts2.isObjectLiteralExpression(right) && right;
        }
      }
      function checkCallExpression(node, checkMode) {
        var _a;
        if (!checkGrammarTypeArguments(node, node.typeArguments))
          checkGrammarArguments(node.arguments);
        var signature = getResolvedSignature(node, void 0, checkMode);
        if (signature === resolvingSignature) {
          return nonInferrableType;
        }
        checkDeprecatedSignature(signature, node);
        if (node.expression.kind === 106) {
          return voidType;
        }
        if (node.kind === 208) {
          var declaration = signature.declaration;
          if (declaration && declaration.kind !== 170 && declaration.kind !== 174 && declaration.kind !== 179 && !ts2.isJSDocConstructSignature(declaration) && !isJSConstructor(declaration)) {
            if (noImplicitAny) {
              error(node, ts2.Diagnostics.new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type);
            }
            return anyType;
          }
        }
        if (ts2.isInJSFile(node) && isCommonJsRequire(node)) {
          return resolveExternalModuleTypeByLiteral(node.arguments[0]);
        }
        var returnType = getReturnTypeOfSignature(signature);
        if (returnType.flags & 12288 && isSymbolOrSymbolForCall(node)) {
          return getESSymbolLikeTypeForNode(ts2.walkUpParenthesizedExpressions(node.parent));
        }
        if (node.kind === 207 && !node.questionDotToken && node.parent.kind === 237 && returnType.flags & 16384 && getTypePredicateOfSignature(signature)) {
          if (!ts2.isDottedName(node.expression)) {
            error(node.expression, ts2.Diagnostics.Assertions_require_the_call_target_to_be_an_identifier_or_qualified_name);
          } else if (!getEffectsSignature(node)) {
            var diagnostic = error(node.expression, ts2.Diagnostics.Assertions_require_every_name_in_the_call_target_to_be_declared_with_an_explicit_type_annotation);
            getTypeOfDottedName(node.expression, diagnostic);
          }
        }
        if (ts2.isInJSFile(node)) {
          var jsSymbol = getSymbolOfExpando(node, false);
          if ((_a = jsSymbol === null || jsSymbol === void 0 ? void 0 : jsSymbol.exports) === null || _a === void 0 ? void 0 : _a.size) {
            var jsAssignmentType = createAnonymousType(jsSymbol, jsSymbol.exports, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
            jsAssignmentType.objectFlags |= 8192;
            return getIntersectionType([returnType, jsAssignmentType]);
          }
        }
        return returnType;
      }
      function checkDeprecatedSignature(signature, node) {
        if (signature.declaration && signature.declaration.flags & 134217728) {
          var suggestionNode = getDeprecatedSuggestionNode(node);
          var name = ts2.tryGetPropertyAccessOrIdentifierToString(ts2.getInvokedExpression(node));
          addDeprecatedSuggestionWithSignature(suggestionNode, signature.declaration, name, signatureToString(signature));
        }
      }
      function getDeprecatedSuggestionNode(node) {
        node = ts2.skipParentheses(node);
        switch (node.kind) {
          case 207:
          case 164:
          case 208:
            return getDeprecatedSuggestionNode(node.expression);
          case 209:
            return getDeprecatedSuggestionNode(node.tag);
          case 279:
          case 278:
            return getDeprecatedSuggestionNode(node.tagName);
          case 206:
            return node.argumentExpression;
          case 205:
            return node.name;
          case 177:
            var typeReference = node;
            return ts2.isQualifiedName(typeReference.typeName) ? typeReference.typeName.right : typeReference;
          default:
            return node;
        }
      }
      function isSymbolOrSymbolForCall(node) {
        if (!ts2.isCallExpression(node))
          return false;
        var left = node.expression;
        if (ts2.isPropertyAccessExpression(left) && left.name.escapedText === "for") {
          left = left.expression;
        }
        if (!ts2.isIdentifier(left) || left.escapedText !== "Symbol") {
          return false;
        }
        var globalESSymbol = getGlobalESSymbolConstructorSymbol(false);
        if (!globalESSymbol) {
          return false;
        }
        return globalESSymbol === resolveName(left, "Symbol", 111551, void 0, void 0, false);
      }
      function checkImportCallExpression(node) {
        if (!checkGrammarArguments(node.arguments))
          checkGrammarImportCallExpression(node);
        if (node.arguments.length === 0) {
          return createPromiseReturnType(node, anyType);
        }
        var specifier = node.arguments[0];
        var specifierType = checkExpressionCached(specifier);
        var optionsType = node.arguments.length > 1 ? checkExpressionCached(node.arguments[1]) : void 0;
        for (var i = 2; i < node.arguments.length; ++i) {
          checkExpressionCached(node.arguments[i]);
        }
        if (specifierType.flags & 32768 || specifierType.flags & 65536 || !isTypeAssignableTo(specifierType, stringType)) {
          error(specifier, ts2.Diagnostics.Dynamic_import_s_specifier_must_be_of_type_string_but_here_has_type_0, typeToString(specifierType));
        }
        if (optionsType) {
          var importCallOptionsType = getGlobalImportCallOptionsType(true);
          if (importCallOptionsType !== emptyObjectType) {
            checkTypeAssignableTo(optionsType, getNullableType(importCallOptionsType, 32768), node.arguments[1]);
          }
        }
        var moduleSymbol = resolveExternalModuleName(node, specifier);
        if (moduleSymbol) {
          var esModuleSymbol = resolveESModuleSymbol(moduleSymbol, specifier, true, false);
          if (esModuleSymbol) {
            return createPromiseReturnType(node, getTypeWithSyntheticDefaultOnly(getTypeOfSymbol(esModuleSymbol), esModuleSymbol, moduleSymbol, specifier) || getTypeWithSyntheticDefaultImportType(getTypeOfSymbol(esModuleSymbol), esModuleSymbol, moduleSymbol, specifier));
          }
        }
        return createPromiseReturnType(node, anyType);
      }
      function createDefaultPropertyWrapperForModule(symbol, originalSymbol, anonymousSymbol) {
        var memberTable = ts2.createSymbolTable();
        var newSymbol = createSymbol(2097152, "default");
        newSymbol.parent = originalSymbol;
        newSymbol.nameType = getStringLiteralType("default");
        newSymbol.target = resolveSymbol(symbol);
        memberTable.set("default", newSymbol);
        return createAnonymousType(anonymousSymbol, memberTable, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      }
      function getTypeWithSyntheticDefaultOnly(type, symbol, originalSymbol, moduleSpecifier) {
        var hasDefaultOnly = isOnlyImportedAsDefault(moduleSpecifier);
        if (hasDefaultOnly && type && !isErrorType(type)) {
          var synthType = type;
          if (!synthType.defaultOnlyType) {
            var type_4 = createDefaultPropertyWrapperForModule(symbol, originalSymbol);
            synthType.defaultOnlyType = type_4;
          }
          return synthType.defaultOnlyType;
        }
        return void 0;
      }
      function getTypeWithSyntheticDefaultImportType(type, symbol, originalSymbol, moduleSpecifier) {
        var _a;
        if (allowSyntheticDefaultImports && type && !isErrorType(type)) {
          var synthType = type;
          if (!synthType.syntheticType) {
            var file = (_a = originalSymbol.declarations) === null || _a === void 0 ? void 0 : _a.find(ts2.isSourceFile);
            var hasSyntheticDefault = canHaveSyntheticDefault(file, originalSymbol, false, moduleSpecifier);
            if (hasSyntheticDefault) {
              var anonymousSymbol = createSymbol(2048, "__type");
              var defaultContainingObject = createDefaultPropertyWrapperForModule(symbol, originalSymbol, anonymousSymbol);
              anonymousSymbol.type = defaultContainingObject;
              synthType.syntheticType = isValidSpreadType(type) ? getSpreadType(type, defaultContainingObject, anonymousSymbol, 0, false) : defaultContainingObject;
            } else {
              synthType.syntheticType = type;
            }
          }
          return synthType.syntheticType;
        }
        return type;
      }
      function isCommonJsRequire(node) {
        if (!ts2.isRequireCall(node, true)) {
          return false;
        }
        if (!ts2.isIdentifier(node.expression))
          return ts2.Debug.fail();
        var resolvedRequire = resolveName(node.expression, node.expression.escapedText, 111551, void 0, void 0, true);
        if (resolvedRequire === requireSymbol) {
          return true;
        }
        if (resolvedRequire.flags & 2097152) {
          return false;
        }
        var targetDeclarationKind = resolvedRequire.flags & 16 ? 255 : resolvedRequire.flags & 3 ? 253 : 0;
        if (targetDeclarationKind !== 0) {
          var decl = ts2.getDeclarationOfKind(resolvedRequire, targetDeclarationKind);
          return !!decl && !!(decl.flags & 8388608);
        }
        return false;
      }
      function checkTaggedTemplateExpression(node) {
        if (!checkGrammarTaggedTemplateChain(node))
          checkGrammarTypeArguments(node, node.typeArguments);
        if (languageVersion < 2) {
          checkExternalEmitHelpers(node, 262144);
        }
        var signature = getResolvedSignature(node);
        checkDeprecatedSignature(signature, node);
        return getReturnTypeOfSignature(signature);
      }
      function checkAssertion(node) {
        if (node.kind === 210) {
          var file = ts2.getSourceFileOfNode(node);
          if (file && ts2.fileExtensionIsOneOf(file.fileName, [".cts", ".mts"])) {
            grammarErrorOnNode(node, ts2.Diagnostics.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Use_an_as_expression_instead);
          }
        }
        return checkAssertionWorker(node, node.type, node.expression);
      }
      function isValidConstAssertionArgument(node) {
        switch (node.kind) {
          case 10:
          case 14:
          case 8:
          case 9:
          case 110:
          case 95:
          case 203:
          case 204:
          case 222:
            return true;
          case 211:
            return isValidConstAssertionArgument(node.expression);
          case 218:
            var op = node.operator;
            var arg = node.operand;
            return op === 40 && (arg.kind === 8 || arg.kind === 9) || op === 39 && arg.kind === 8;
          case 205:
          case 206:
            var expr = node.expression;
            var symbol = getTypeOfNode(expr).symbol;
            if (symbol && symbol.flags & 2097152) {
              symbol = resolveAlias(symbol);
            }
            return !!(symbol && symbol.flags & 384 && getEnumKind(symbol) === 1);
        }
        return false;
      }
      function checkAssertionWorker(errNode, type, expression, checkMode) {
        var exprType = checkExpression(expression, checkMode);
        if (ts2.isConstTypeReference(type)) {
          if (!isValidConstAssertionArgument(expression)) {
            error(expression, ts2.Diagnostics.A_const_assertions_can_only_be_applied_to_references_to_enum_members_or_string_number_boolean_array_or_object_literals);
          }
          return getRegularTypeOfLiteralType(exprType);
        }
        checkSourceElement(type);
        exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(exprType));
        var targetType = getTypeFromTypeNode(type);
        if (produceDiagnostics && !isErrorType(targetType)) {
          var widenedType = getWidenedType(exprType);
          if (!isTypeComparableTo(targetType, widenedType)) {
            checkTypeComparableTo(exprType, targetType, errNode, ts2.Diagnostics.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first);
          }
        }
        return targetType;
      }
      function checkNonNullChain(node) {
        var leftType = checkExpression(node.expression);
        var nonOptionalType = getOptionalExpressionType(leftType, node.expression);
        return propagateOptionalTypeMarker(getNonNullableType(nonOptionalType), node, nonOptionalType !== leftType);
      }
      function checkNonNullAssertion(node) {
        return node.flags & 32 ? checkNonNullChain(node) : getNonNullableType(checkExpression(node.expression));
      }
      function checkMetaProperty(node) {
        checkGrammarMetaProperty(node);
        if (node.keywordToken === 103) {
          return checkNewTargetMetaProperty(node);
        }
        if (node.keywordToken === 100) {
          return checkImportMetaProperty(node);
        }
        return ts2.Debug.assertNever(node.keywordToken);
      }
      function checkMetaPropertyKeyword(node) {
        switch (node.keywordToken) {
          case 100:
            return getGlobalImportMetaExpressionType();
          case 103:
            var type = checkNewTargetMetaProperty(node);
            return isErrorType(type) ? errorType : createNewTargetExpressionType(type);
          default:
            ts2.Debug.assertNever(node.keywordToken);
        }
      }
      function checkNewTargetMetaProperty(node) {
        var container = ts2.getNewTargetContainer(node);
        if (!container) {
          error(node, ts2.Diagnostics.Meta_property_0_is_only_allowed_in_the_body_of_a_function_declaration_function_expression_or_constructor, "new.target");
          return errorType;
        } else if (container.kind === 170) {
          var symbol = getSymbolOfNode(container.parent);
          return getTypeOfSymbol(symbol);
        } else {
          var symbol = getSymbolOfNode(container);
          return getTypeOfSymbol(symbol);
        }
      }
      function checkImportMetaProperty(node) {
        if (moduleKind === ts2.ModuleKind.Node12 || moduleKind === ts2.ModuleKind.NodeNext) {
          if (ts2.getSourceFileOfNode(node).impliedNodeFormat !== ts2.ModuleKind.ESNext) {
            error(node, ts2.Diagnostics.The_import_meta_meta_property_is_not_allowed_in_files_which_will_build_into_CommonJS_output);
          }
        } else if (moduleKind < ts2.ModuleKind.ES2020 && moduleKind !== ts2.ModuleKind.System) {
          error(node, ts2.Diagnostics.The_import_meta_meta_property_is_only_allowed_when_the_module_option_is_es2020_es2022_esnext_system_node12_or_nodenext);
        }
        var file = ts2.getSourceFileOfNode(node);
        ts2.Debug.assert(!!(file.flags & 2097152), "Containing file is missing import meta node flag.");
        return node.name.escapedText === "meta" ? getGlobalImportMetaType() : errorType;
      }
      function getTypeOfParameter(symbol) {
        var type = getTypeOfSymbol(symbol);
        if (strictNullChecks) {
          var declaration = symbol.valueDeclaration;
          if (declaration && ts2.hasInitializer(declaration)) {
            return getOptionalType(type);
          }
        }
        return type;
      }
      function getTupleElementLabel(d) {
        ts2.Debug.assert(ts2.isIdentifier(d.name));
        return d.name.escapedText;
      }
      function getParameterNameAtPosition(signature, pos, overrideRestType) {
        var paramCount = signature.parameters.length - (signatureHasRestParameter(signature) ? 1 : 0);
        if (pos < paramCount) {
          return signature.parameters[pos].escapedName;
        }
        var restParameter = signature.parameters[paramCount] || unknownSymbol;
        var restType = overrideRestType || getTypeOfSymbol(restParameter);
        if (isTupleType(restType)) {
          var associatedNames = restType.target.labeledElementDeclarations;
          var index = pos - paramCount;
          return associatedNames && getTupleElementLabel(associatedNames[index]) || restParameter.escapedName + "_" + index;
        }
        return restParameter.escapedName;
      }
      function getParameterIdentifierNameAtPosition(signature, pos) {
        var paramCount = signature.parameters.length - (signatureHasRestParameter(signature) ? 1 : 0);
        if (pos < paramCount) {
          var param = signature.parameters[pos];
          return isParameterDeclarationWithIdentifierName(param) ? [param.escapedName, false] : void 0;
        }
        var restParameter = signature.parameters[paramCount] || unknownSymbol;
        if (!isParameterDeclarationWithIdentifierName(restParameter)) {
          return void 0;
        }
        var restType = getTypeOfSymbol(restParameter);
        if (isTupleType(restType)) {
          var associatedNames = restType.target.labeledElementDeclarations;
          var index = pos - paramCount;
          var associatedName = associatedNames === null || associatedNames === void 0 ? void 0 : associatedNames[index];
          var isRestTupleElement = !!(associatedName === null || associatedName === void 0 ? void 0 : associatedName.dotDotDotToken);
          return associatedName ? [
            getTupleElementLabel(associatedName),
            isRestTupleElement
          ] : void 0;
        }
        if (pos === paramCount) {
          return [restParameter.escapedName, true];
        }
        return void 0;
      }
      function isParameterDeclarationWithIdentifierName(symbol) {
        return symbol.valueDeclaration && ts2.isParameter(symbol.valueDeclaration) && ts2.isIdentifier(symbol.valueDeclaration.name);
      }
      function isValidDeclarationForTupleLabel(d) {
        return d.kind === 196 || ts2.isParameter(d) && d.name && ts2.isIdentifier(d.name);
      }
      function getNameableDeclarationAtPosition(signature, pos) {
        var paramCount = signature.parameters.length - (signatureHasRestParameter(signature) ? 1 : 0);
        if (pos < paramCount) {
          var decl = signature.parameters[pos].valueDeclaration;
          return decl && isValidDeclarationForTupleLabel(decl) ? decl : void 0;
        }
        var restParameter = signature.parameters[paramCount] || unknownSymbol;
        var restType = getTypeOfSymbol(restParameter);
        if (isTupleType(restType)) {
          var associatedNames = restType.target.labeledElementDeclarations;
          var index = pos - paramCount;
          return associatedNames && associatedNames[index];
        }
        return restParameter.valueDeclaration && isValidDeclarationForTupleLabel(restParameter.valueDeclaration) ? restParameter.valueDeclaration : void 0;
      }
      function getTypeAtPosition(signature, pos) {
        return tryGetTypeAtPosition(signature, pos) || anyType;
      }
      function tryGetTypeAtPosition(signature, pos) {
        var paramCount = signature.parameters.length - (signatureHasRestParameter(signature) ? 1 : 0);
        if (pos < paramCount) {
          return getTypeOfParameter(signature.parameters[pos]);
        }
        if (signatureHasRestParameter(signature)) {
          var restType = getTypeOfSymbol(signature.parameters[paramCount]);
          var index = pos - paramCount;
          if (!isTupleType(restType) || restType.target.hasRestElement || index < restType.target.fixedLength) {
            return getIndexedAccessType(restType, getNumberLiteralType(index));
          }
        }
        return void 0;
      }
      function getRestTypeAtPosition(source, pos) {
        var parameterCount = getParameterCount(source);
        var minArgumentCount = getMinArgumentCount(source);
        var restType = getEffectiveRestType(source);
        if (restType && pos >= parameterCount - 1) {
          return pos === parameterCount - 1 ? restType : createArrayType(getIndexedAccessType(restType, numberType));
        }
        var types = [];
        var flags = [];
        var names = [];
        for (var i = pos; i < parameterCount; i++) {
          if (!restType || i < parameterCount - 1) {
            types.push(getTypeAtPosition(source, i));
            flags.push(i < minArgumentCount ? 1 : 2);
          } else {
            types.push(restType);
            flags.push(8);
          }
          var name = getNameableDeclarationAtPosition(source, i);
          if (name) {
            names.push(name);
          }
        }
        return createTupleType(types, flags, false, ts2.length(names) === ts2.length(types) ? names : void 0);
      }
      function getParameterCount(signature) {
        var length = signature.parameters.length;
        if (signatureHasRestParameter(signature)) {
          var restType = getTypeOfSymbol(signature.parameters[length - 1]);
          if (isTupleType(restType)) {
            return length + restType.target.fixedLength - (restType.target.hasRestElement ? 0 : 1);
          }
        }
        return length;
      }
      function getMinArgumentCount(signature, flags) {
        var strongArityForUntypedJS = flags & 1;
        var voidIsNonOptional = flags & 2;
        if (voidIsNonOptional || signature.resolvedMinArgumentCount === void 0) {
          var minArgumentCount = void 0;
          if (signatureHasRestParameter(signature)) {
            var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
            if (isTupleType(restType)) {
              var firstOptionalIndex = ts2.findIndex(restType.target.elementFlags, function(f) {
                return !(f & 1);
              });
              var requiredCount = firstOptionalIndex < 0 ? restType.target.fixedLength : firstOptionalIndex;
              if (requiredCount > 0) {
                minArgumentCount = signature.parameters.length - 1 + requiredCount;
              }
            }
          }
          if (minArgumentCount === void 0) {
            if (!strongArityForUntypedJS && signature.flags & 32) {
              return 0;
            }
            minArgumentCount = signature.minArgumentCount;
          }
          if (voidIsNonOptional) {
            return minArgumentCount;
          }
          for (var i = minArgumentCount - 1; i >= 0; i--) {
            var type = getTypeAtPosition(signature, i);
            if (filterType(type, acceptsVoid).flags & 131072) {
              break;
            }
            minArgumentCount = i;
          }
          signature.resolvedMinArgumentCount = minArgumentCount;
        }
        return signature.resolvedMinArgumentCount;
      }
      function hasEffectiveRestParameter(signature) {
        if (signatureHasRestParameter(signature)) {
          var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
          return !isTupleType(restType) || restType.target.hasRestElement;
        }
        return false;
      }
      function getEffectiveRestType(signature) {
        if (signatureHasRestParameter(signature)) {
          var restType = getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]);
          if (!isTupleType(restType)) {
            return restType;
          }
          if (restType.target.hasRestElement) {
            return sliceTupleType(restType, restType.target.fixedLength);
          }
        }
        return void 0;
      }
      function getNonArrayRestType(signature) {
        var restType = getEffectiveRestType(signature);
        return restType && !isArrayType(restType) && !isTypeAny(restType) && (getReducedType(restType).flags & 131072) === 0 ? restType : void 0;
      }
      function getTypeOfFirstParameterOfSignature(signature) {
        return getTypeOfFirstParameterOfSignatureWithFallback(signature, neverType);
      }
      function getTypeOfFirstParameterOfSignatureWithFallback(signature, fallbackType) {
        return signature.parameters.length > 0 ? getTypeAtPosition(signature, 0) : fallbackType;
      }
      function inferFromAnnotatedParameters(signature, context, inferenceContext) {
        var len = signature.parameters.length - (signatureHasRestParameter(signature) ? 1 : 0);
        for (var i = 0; i < len; i++) {
          var declaration = signature.parameters[i].valueDeclaration;
          if (declaration.type) {
            var typeNode = ts2.getEffectiveTypeAnnotationNode(declaration);
            if (typeNode) {
              inferTypes(inferenceContext.inferences, getTypeFromTypeNode(typeNode), getTypeAtPosition(context, i));
            }
          }
        }
        var restType = getEffectiveRestType(context);
        if (restType && restType.flags & 262144) {
          var instantiatedContext = instantiateSignature(context, inferenceContext.nonFixingMapper);
          assignContextualParameterTypes(signature, instantiatedContext);
          var restPos = getParameterCount(context) - 1;
          inferTypes(inferenceContext.inferences, getRestTypeAtPosition(signature, restPos), restType);
        }
      }
      function assignContextualParameterTypes(signature, context) {
        if (context.typeParameters) {
          if (!signature.typeParameters) {
            signature.typeParameters = context.typeParameters;
          } else {
            return;
          }
        }
        if (context.thisParameter) {
          var parameter = signature.thisParameter;
          if (!parameter || parameter.valueDeclaration && !parameter.valueDeclaration.type) {
            if (!parameter) {
              signature.thisParameter = createSymbolWithType(context.thisParameter, void 0);
            }
            assignParameterType(signature.thisParameter, getTypeOfSymbol(context.thisParameter));
          }
        }
        var len = signature.parameters.length - (signatureHasRestParameter(signature) ? 1 : 0);
        for (var i = 0; i < len; i++) {
          var parameter = signature.parameters[i];
          if (!ts2.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) {
            var contextualParameterType = tryGetTypeAtPosition(context, i);
            assignParameterType(parameter, contextualParameterType);
          }
        }
        if (signatureHasRestParameter(signature)) {
          var parameter = ts2.last(signature.parameters);
          if (ts2.isTransientSymbol(parameter) || !ts2.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) {
            var contextualParameterType = getRestTypeAtPosition(context, len);
            assignParameterType(parameter, contextualParameterType);
          }
        }
      }
      function assignNonContextualParameterTypes(signature) {
        if (signature.thisParameter) {
          assignParameterType(signature.thisParameter);
        }
        for (var _i = 0, _a = signature.parameters; _i < _a.length; _i++) {
          var parameter = _a[_i];
          assignParameterType(parameter);
        }
      }
      function assignParameterType(parameter, type) {
        var links = getSymbolLinks(parameter);
        if (!links.type) {
          var declaration = parameter.valueDeclaration;
          links.type = type || getWidenedTypeForVariableLikeDeclaration(declaration, true);
          if (declaration.name.kind !== 79) {
            if (links.type === unknownType) {
              links.type = getTypeFromBindingPattern(declaration.name);
            }
            assignBindingElementTypes(declaration.name);
          }
        }
      }
      function assignBindingElementTypes(pattern) {
        for (var _i = 0, _a = pattern.elements; _i < _a.length; _i++) {
          var element = _a[_i];
          if (!ts2.isOmittedExpression(element)) {
            if (element.name.kind === 79) {
              getSymbolLinks(getSymbolOfNode(element)).type = getTypeForBindingElement(element);
            } else {
              assignBindingElementTypes(element.name);
            }
          }
        }
      }
      function createPromiseType(promisedType) {
        var globalPromiseType = getGlobalPromiseType(true);
        if (globalPromiseType !== emptyGenericType) {
          promisedType = getAwaitedTypeNoAlias(unwrapAwaitedType(promisedType)) || unknownType;
          return createTypeReference(globalPromiseType, [promisedType]);
        }
        return unknownType;
      }
      function createPromiseLikeType(promisedType) {
        var globalPromiseLikeType = getGlobalPromiseLikeType(true);
        if (globalPromiseLikeType !== emptyGenericType) {
          promisedType = getAwaitedTypeNoAlias(unwrapAwaitedType(promisedType)) || unknownType;
          return createTypeReference(globalPromiseLikeType, [promisedType]);
        }
        return unknownType;
      }
      function createPromiseReturnType(func, promisedType) {
        var promiseType = createPromiseType(promisedType);
        if (promiseType === unknownType) {
          error(func, ts2.isImportCall(func) ? ts2.Diagnostics.A_dynamic_import_call_returns_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option : ts2.Diagnostics.An_async_function_or_method_must_return_a_Promise_Make_sure_you_have_a_declaration_for_Promise_or_include_ES2015_in_your_lib_option);
          return errorType;
        } else if (!getGlobalPromiseConstructorSymbol(true)) {
          error(func, ts2.isImportCall(func) ? ts2.Diagnostics.A_dynamic_import_call_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option : ts2.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option);
        }
        return promiseType;
      }
      function createNewTargetExpressionType(targetType) {
        var symbol = createSymbol(0, "NewTargetExpression");
        var targetPropertySymbol = createSymbol(4, "target", 8);
        targetPropertySymbol.parent = symbol;
        targetPropertySymbol.type = targetType;
        var members = ts2.createSymbolTable([targetPropertySymbol]);
        symbol.members = members;
        return createAnonymousType(symbol, members, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
      }
      function getReturnTypeFromBody(func, checkMode) {
        if (!func.body) {
          return errorType;
        }
        var functionFlags = ts2.getFunctionFlags(func);
        var isAsync = (functionFlags & 2) !== 0;
        var isGenerator = (functionFlags & 1) !== 0;
        var returnType;
        var yieldType;
        var nextType;
        var fallbackReturnType = voidType;
        if (func.body.kind !== 234) {
          returnType = checkExpressionCached(func.body, checkMode && checkMode & ~8);
          if (isAsync) {
            returnType = unwrapAwaitedType(checkAwaitedType(returnType, false, func, ts2.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member));
          }
        } else if (isGenerator) {
          var returnTypes = checkAndAggregateReturnExpressionTypes(func, checkMode);
          if (!returnTypes) {
            fallbackReturnType = neverType;
          } else if (returnTypes.length > 0) {
            returnType = getUnionType(returnTypes, 2);
          }
          var _a = checkAndAggregateYieldOperandTypes(func, checkMode), yieldTypes = _a.yieldTypes, nextTypes = _a.nextTypes;
          yieldType = ts2.some(yieldTypes) ? getUnionType(yieldTypes, 2) : void 0;
          nextType = ts2.some(nextTypes) ? getIntersectionType(nextTypes) : void 0;
        } else {
          var types = checkAndAggregateReturnExpressionTypes(func, checkMode);
          if (!types) {
            return functionFlags & 2 ? createPromiseReturnType(func, neverType) : neverType;
          }
          if (types.length === 0) {
            return functionFlags & 2 ? createPromiseReturnType(func, voidType) : voidType;
          }
          returnType = getUnionType(types, 2);
        }
        if (returnType || yieldType || nextType) {
          if (yieldType)
            reportErrorsFromWidening(func, yieldType, 3);
          if (returnType)
            reportErrorsFromWidening(func, returnType, 1);
          if (nextType)
            reportErrorsFromWidening(func, nextType, 2);
          if (returnType && isUnitType(returnType) || yieldType && isUnitType(yieldType) || nextType && isUnitType(nextType)) {
            var contextualSignature = getContextualSignatureForFunctionLikeDeclaration(func);
            var contextualType = !contextualSignature ? void 0 : contextualSignature === getSignatureFromDeclaration(func) ? isGenerator ? void 0 : returnType : instantiateContextualType(getReturnTypeOfSignature(contextualSignature), func);
            if (isGenerator) {
              yieldType = getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(yieldType, contextualType, 0, isAsync);
              returnType = getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(returnType, contextualType, 1, isAsync);
              nextType = getWidenedLiteralLikeTypeForContextualIterationTypeIfNeeded(nextType, contextualType, 2, isAsync);
            } else {
              returnType = getWidenedLiteralLikeTypeForContextualReturnTypeIfNeeded(returnType, contextualType, isAsync);
            }
          }
          if (yieldType)
            yieldType = getWidenedType(yieldType);
          if (returnType)
            returnType = getWidenedType(returnType);
          if (nextType)
            nextType = getWidenedType(nextType);
        }
        if (isGenerator) {
          return createGeneratorReturnType(yieldType || neverType, returnType || fallbackReturnType, nextType || getContextualIterationType(2, func) || unknownType, isAsync);
        } else {
          return isAsync ? createPromiseType(returnType || fallbackReturnType) : returnType || fallbackReturnType;
        }
      }
      function createGeneratorReturnType(yieldType, returnType, nextType, isAsyncGenerator) {
        var resolver = isAsyncGenerator ? asyncIterationTypesResolver : syncIterationTypesResolver;
        var globalGeneratorType = resolver.getGlobalGeneratorType(false);
        yieldType = resolver.resolveIterationType(yieldType, void 0) || unknownType;
        returnType = resolver.resolveIterationType(returnType, void 0) || unknownType;
        nextType = resolver.resolveIterationType(nextType, void 0) || unknownType;
        if (globalGeneratorType === emptyGenericType) {
          var globalType = resolver.getGlobalIterableIteratorType(false);
          var iterationTypes = globalType !== emptyGenericType ? getIterationTypesOfGlobalIterableType(globalType, resolver) : void 0;
          var iterableIteratorReturnType = iterationTypes ? iterationTypes.returnType : anyType;
          var iterableIteratorNextType = iterationTypes ? iterationTypes.nextType : undefinedType;
          if (isTypeAssignableTo(returnType, iterableIteratorReturnType) && isTypeAssignableTo(iterableIteratorNextType, nextType)) {
            if (globalType !== emptyGenericType) {
              return createTypeFromGenericGlobalType(globalType, [yieldType]);
            }
            resolver.getGlobalIterableIteratorType(true);
            return emptyObjectType;
          }
          resolver.getGlobalGeneratorType(true);
          return emptyObjectType;
        }
        return createTypeFromGenericGlobalType(globalGeneratorType, [yieldType, returnType, nextType]);
      }
      function checkAndAggregateYieldOperandTypes(func, checkMode) {
        var yieldTypes = [];
        var nextTypes = [];
        var isAsync = (ts2.getFunctionFlags(func) & 2) !== 0;
        ts2.forEachYieldExpression(func.body, function(yieldExpression) {
          var yieldExpressionType = yieldExpression.expression ? checkExpression(yieldExpression.expression, checkMode) : undefinedWideningType;
          ts2.pushIfUnique(yieldTypes, getYieldedTypeOfYieldExpression(yieldExpression, yieldExpressionType, anyType, isAsync));
          var nextType;
          if (yieldExpression.asteriskToken) {
            var iterationTypes = getIterationTypesOfIterable(yieldExpressionType, isAsync ? 19 : 17, yieldExpression.expression);
            nextType = iterationTypes && iterationTypes.nextType;
          } else {
            nextType = getContextualType(yieldExpression);
          }
          if (nextType)
            ts2.pushIfUnique(nextTypes, nextType);
        });
        return { yieldTypes, nextTypes };
      }
      function getYieldedTypeOfYieldExpression(node, expressionType, sentType, isAsync) {
        var errorNode = node.expression || node;
        var yieldedType = node.asteriskToken ? checkIteratedTypeOrElementType(isAsync ? 19 : 17, expressionType, sentType, errorNode) : expressionType;
        return !isAsync ? yieldedType : getAwaitedType(yieldedType, errorNode, node.asteriskToken ? ts2.Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member : ts2.Diagnostics.Type_of_yield_operand_in_an_async_generator_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member);
      }
      function getFactsFromTypeofSwitch(start, end, witnesses, hasDefault) {
        var facts = 0;
        if (hasDefault) {
          for (var i = end; i < witnesses.length; i++) {
            facts |= typeofNEFacts.get(witnesses[i]) || 32768;
          }
          for (var i = start; i < end; i++) {
            facts &= ~(typeofNEFacts.get(witnesses[i]) || 0);
          }
          for (var i = 0; i < start; i++) {
            facts |= typeofNEFacts.get(witnesses[i]) || 32768;
          }
        } else {
          for (var i = start; i < end; i++) {
            facts |= typeofEQFacts.get(witnesses[i]) || 128;
          }
          for (var i = 0; i < start; i++) {
            facts &= ~(typeofEQFacts.get(witnesses[i]) || 0);
          }
        }
        return facts;
      }
      function isExhaustiveSwitchStatement(node) {
        var links = getNodeLinks(node);
        return links.isExhaustive !== void 0 ? links.isExhaustive : links.isExhaustive = computeExhaustiveSwitchStatement(node);
      }
      function computeExhaustiveSwitchStatement(node) {
        if (node.expression.kind === 215) {
          var operandType = getTypeOfExpression(node.expression.expression);
          var witnesses = getSwitchClauseTypeOfWitnesses(node, false);
          var notEqualFacts_1 = getFactsFromTypeofSwitch(0, 0, witnesses, true);
          var type_5 = getBaseConstraintOfType(operandType) || operandType;
          if (type_5.flags & 3) {
            return (556800 & notEqualFacts_1) === 556800;
          }
          return !!(filterType(type_5, function(t) {
            return (getTypeFacts(t) & notEqualFacts_1) === notEqualFacts_1;
          }).flags & 131072);
        }
        var type = getTypeOfExpression(node.expression);
        if (!isLiteralType(type)) {
          return false;
        }
        var switchTypes = getSwitchClauseTypes(node);
        if (!switchTypes.length || ts2.some(switchTypes, isNeitherUnitTypeNorNever)) {
          return false;
        }
        return eachTypeContainedIn(mapType(type, getRegularTypeOfLiteralType), switchTypes);
      }
      function functionHasImplicitReturn(func) {
        return func.endFlowNode && isReachableFlowNode(func.endFlowNode);
      }
      function checkAndAggregateReturnExpressionTypes(func, checkMode) {
        var functionFlags = ts2.getFunctionFlags(func);
        var aggregatedTypes = [];
        var hasReturnWithNoExpression = functionHasImplicitReturn(func);
        var hasReturnOfTypeNever = false;
        ts2.forEachReturnStatement(func.body, function(returnStatement) {
          var expr = returnStatement.expression;
          if (expr) {
            var type = checkExpressionCached(expr, checkMode && checkMode & ~8);
            if (functionFlags & 2) {
              type = unwrapAwaitedType(checkAwaitedType(type, false, func, ts2.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member));
            }
            if (type.flags & 131072) {
              hasReturnOfTypeNever = true;
            }
            ts2.pushIfUnique(aggregatedTypes, type);
          } else {
            hasReturnWithNoExpression = true;
          }
        });
        if (aggregatedTypes.length === 0 && !hasReturnWithNoExpression && (hasReturnOfTypeNever || mayReturnNever(func))) {
          return void 0;
        }
        if (strictNullChecks && aggregatedTypes.length && hasReturnWithNoExpression && !(isJSConstructor(func) && aggregatedTypes.some(function(t) {
          return t.symbol === func.symbol;
        }))) {
          ts2.pushIfUnique(aggregatedTypes, undefinedType);
        }
        return aggregatedTypes;
      }
      function mayReturnNever(func) {
        switch (func.kind) {
          case 212:
          case 213:
            return true;
          case 168:
            return func.parent.kind === 204;
          default:
            return false;
        }
      }
      function checkAllCodePathsInNonVoidFunctionReturnOrThrow(func, returnType) {
        if (!produceDiagnostics) {
          return;
        }
        var functionFlags = ts2.getFunctionFlags(func);
        var type = returnType && unwrapReturnType(returnType, functionFlags);
        if (type && maybeTypeOfKind(type, 1 | 16384)) {
          return;
        }
        if (func.kind === 167 || ts2.nodeIsMissing(func.body) || func.body.kind !== 234 || !functionHasImplicitReturn(func)) {
          return;
        }
        var hasExplicitReturn = func.flags & 512;
        var errorNode = ts2.getEffectiveReturnTypeNode(func) || func;
        if (type && type.flags & 131072) {
          error(errorNode, ts2.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point);
        } else if (type && !hasExplicitReturn) {
          error(errorNode, ts2.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value);
        } else if (type && strictNullChecks && !isTypeAssignableTo(undefinedType, type)) {
          error(errorNode, ts2.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined);
        } else if (compilerOptions.noImplicitReturns) {
          if (!type) {
            if (!hasExplicitReturn) {
              return;
            }
            var inferredReturnType = getReturnTypeOfSignature(getSignatureFromDeclaration(func));
            if (isUnwrappedReturnTypeVoidOrAny(func, inferredReturnType)) {
              return;
            }
          }
          error(errorNode, ts2.Diagnostics.Not_all_code_paths_return_a_value);
        }
      }
      function checkFunctionExpressionOrObjectLiteralMethod(node, checkMode) {
        ts2.Debug.assert(node.kind !== 168 || ts2.isObjectLiteralMethod(node));
        checkNodeDeferred(node);
        if (ts2.isFunctionExpression(node)) {
          checkCollisionsForDeclarationName(node, node.name);
        }
        if (checkMode && checkMode & 4 && isContextSensitive(node)) {
          if (!ts2.getEffectiveReturnTypeNode(node) && !ts2.hasContextSensitiveParameters(node)) {
            var contextualSignature = getContextualSignature(node);
            if (contextualSignature && couldContainTypeVariables(getReturnTypeOfSignature(contextualSignature))) {
              var links = getNodeLinks(node);
              if (links.contextFreeType) {
                return links.contextFreeType;
              }
              var returnType = getReturnTypeFromBody(node, checkMode);
              var returnOnlySignature = createSignature(void 0, void 0, void 0, ts2.emptyArray, returnType, void 0, 0, 0);
              var returnOnlyType = createAnonymousType(node.symbol, emptySymbols, [returnOnlySignature], ts2.emptyArray, ts2.emptyArray);
              returnOnlyType.objectFlags |= 524288;
              return links.contextFreeType = returnOnlyType;
            }
          }
          return anyFunctionType;
        }
        var hasGrammarError = checkGrammarFunctionLikeDeclaration(node);
        if (!hasGrammarError && node.kind === 212) {
          checkGrammarForGenerator(node);
        }
        contextuallyCheckFunctionExpressionOrObjectLiteralMethod(node, checkMode);
        return getTypeOfSymbol(getSymbolOfNode(node));
      }
      function contextuallyCheckFunctionExpressionOrObjectLiteralMethod(node, checkMode) {
        var links = getNodeLinks(node);
        if (!(links.flags & 1024)) {
          var contextualSignature = getContextualSignature(node);
          if (!(links.flags & 1024)) {
            links.flags |= 1024;
            var signature = ts2.firstOrUndefined(getSignaturesOfType(getTypeOfSymbol(getSymbolOfNode(node)), 0));
            if (!signature) {
              return;
            }
            if (isContextSensitive(node)) {
              if (contextualSignature) {
                var inferenceContext = getInferenceContext(node);
                if (checkMode && checkMode & 2) {
                  inferFromAnnotatedParameters(signature, contextualSignature, inferenceContext);
                }
                var instantiatedContextualSignature = inferenceContext ? instantiateSignature(contextualSignature, inferenceContext.mapper) : contextualSignature;
                assignContextualParameterTypes(signature, instantiatedContextualSignature);
              } else {
                assignNonContextualParameterTypes(signature);
              }
            }
            if (contextualSignature && !getReturnTypeFromAnnotation(node) && !signature.resolvedReturnType) {
              var returnType = getReturnTypeFromBody(node, checkMode);
              if (!signature.resolvedReturnType) {
                signature.resolvedReturnType = returnType;
              }
            }
            checkSignatureDeclaration(node);
          }
        }
      }
      function checkFunctionExpressionOrObjectLiteralMethodDeferred(node) {
        ts2.Debug.assert(node.kind !== 168 || ts2.isObjectLiteralMethod(node));
        var functionFlags = ts2.getFunctionFlags(node);
        var returnType = getReturnTypeFromAnnotation(node);
        checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnType);
        if (node.body) {
          if (!ts2.getEffectiveReturnTypeNode(node)) {
            getReturnTypeOfSignature(getSignatureFromDeclaration(node));
          }
          if (node.body.kind === 234) {
            checkSourceElement(node.body);
          } else {
            var exprType = checkExpression(node.body);
            var returnOrPromisedType = returnType && unwrapReturnType(returnType, functionFlags);
            if (returnOrPromisedType) {
              if ((functionFlags & 3) === 2) {
                var awaitedType = checkAwaitedType(exprType, false, node.body, ts2.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member);
                checkTypeAssignableToAndOptionallyElaborate(awaitedType, returnOrPromisedType, node.body, node.body);
              } else {
                checkTypeAssignableToAndOptionallyElaborate(exprType, returnOrPromisedType, node.body, node.body);
              }
            }
          }
        }
      }
      function checkArithmeticOperandType(operand, type, diagnostic, isAwaitValid) {
        if (isAwaitValid === void 0) {
          isAwaitValid = false;
        }
        if (!isTypeAssignableTo(type, numberOrBigIntType)) {
          var awaitedType = isAwaitValid && getAwaitedTypeOfPromise(type);
          errorAndMaybeSuggestAwait(operand, !!awaitedType && isTypeAssignableTo(awaitedType, numberOrBigIntType), diagnostic);
          return false;
        }
        return true;
      }
      function isReadonlyAssignmentDeclaration(d) {
        if (!ts2.isCallExpression(d)) {
          return false;
        }
        if (!ts2.isBindableObjectDefinePropertyCall(d)) {
          return false;
        }
        var objectLitType = checkExpressionCached(d.arguments[2]);
        var valueType = getTypeOfPropertyOfType(objectLitType, "value");
        if (valueType) {
          var writableProp = getPropertyOfType(objectLitType, "writable");
          var writableType = writableProp && getTypeOfSymbol(writableProp);
          if (!writableType || writableType === falseType || writableType === regularFalseType) {
            return true;
          }
          if (writableProp && writableProp.valueDeclaration && ts2.isPropertyAssignment(writableProp.valueDeclaration)) {
            var initializer = writableProp.valueDeclaration.initializer;
            var rawOriginalType = checkExpression(initializer);
            if (rawOriginalType === falseType || rawOriginalType === regularFalseType) {
              return true;
            }
          }
          return false;
        }
        var setProp = getPropertyOfType(objectLitType, "set");
        return !setProp;
      }
      function isReadonlySymbol(symbol) {
        return !!(ts2.getCheckFlags(symbol) & 8 || symbol.flags & 4 && ts2.getDeclarationModifierFlagsFromSymbol(symbol) & 64 || symbol.flags & 3 && getDeclarationNodeFlagsFromSymbol(symbol) & 2 || symbol.flags & 98304 && !(symbol.flags & 65536) || symbol.flags & 8 || ts2.some(symbol.declarations, isReadonlyAssignmentDeclaration));
      }
      function isAssignmentToReadonlyEntity(expr, symbol, assignmentKind) {
        var _a, _b;
        if (assignmentKind === 0) {
          return false;
        }
        if (isReadonlySymbol(symbol)) {
          if (symbol.flags & 4 && ts2.isAccessExpression(expr) && expr.expression.kind === 108) {
            var ctor = ts2.getContainingFunction(expr);
            if (!(ctor && (ctor.kind === 170 || isJSConstructor(ctor)))) {
              return true;
            }
            if (symbol.valueDeclaration) {
              var isAssignmentDeclaration_1 = ts2.isBinaryExpression(symbol.valueDeclaration);
              var isLocalPropertyDeclaration = ctor.parent === symbol.valueDeclaration.parent;
              var isLocalParameterProperty = ctor === symbol.valueDeclaration.parent;
              var isLocalThisPropertyAssignment = isAssignmentDeclaration_1 && ((_a = symbol.parent) === null || _a === void 0 ? void 0 : _a.valueDeclaration) === ctor.parent;
              var isLocalThisPropertyAssignmentConstructorFunction = isAssignmentDeclaration_1 && ((_b = symbol.parent) === null || _b === void 0 ? void 0 : _b.valueDeclaration) === ctor;
              var isWriteableSymbol = isLocalPropertyDeclaration || isLocalParameterProperty || isLocalThisPropertyAssignment || isLocalThisPropertyAssignmentConstructorFunction;
              return !isWriteableSymbol;
            }
          }
          return true;
        }
        if (ts2.isAccessExpression(expr)) {
          var node = ts2.skipParentheses(expr.expression);
          if (node.kind === 79) {
            var symbol_2 = getNodeLinks(node).resolvedSymbol;
            if (symbol_2.flags & 2097152) {
              var declaration = getDeclarationOfAliasSymbol(symbol_2);
              return !!declaration && declaration.kind === 267;
            }
          }
        }
        return false;
      }
      function checkReferenceExpression(expr, invalidReferenceMessage, invalidOptionalChainMessage) {
        var node = ts2.skipOuterExpressions(expr, 6 | 1);
        if (node.kind !== 79 && !ts2.isAccessExpression(node)) {
          error(expr, invalidReferenceMessage);
          return false;
        }
        if (node.flags & 32) {
          error(expr, invalidOptionalChainMessage);
          return false;
        }
        return true;
      }
      function checkDeleteExpression(node) {
        checkExpression(node.expression);
        var expr = ts2.skipParentheses(node.expression);
        if (!ts2.isAccessExpression(expr)) {
          error(expr, ts2.Diagnostics.The_operand_of_a_delete_operator_must_be_a_property_reference);
          return booleanType;
        }
        if (ts2.isPropertyAccessExpression(expr) && ts2.isPrivateIdentifier(expr.name)) {
          error(expr, ts2.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_private_identifier);
        }
        var links = getNodeLinks(expr);
        var symbol = getExportSymbolOfValueSymbolIfExported(links.resolvedSymbol);
        if (symbol) {
          if (isReadonlySymbol(symbol)) {
            error(expr, ts2.Diagnostics.The_operand_of_a_delete_operator_cannot_be_a_read_only_property);
          }
          checkDeleteExpressionMustBeOptional(expr, symbol);
        }
        return booleanType;
      }
      function checkDeleteExpressionMustBeOptional(expr, symbol) {
        var type = getTypeOfSymbol(symbol);
        if (strictNullChecks && !(type.flags & (3 | 131072)) && !(exactOptionalPropertyTypes ? symbol.flags & 16777216 : getFalsyFlags(type) & 32768)) {
          error(expr, ts2.Diagnostics.The_operand_of_a_delete_operator_must_be_optional);
        }
      }
      function checkTypeOfExpression(node) {
        checkExpression(node.expression);
        return typeofType;
      }
      function checkVoidExpression(node) {
        checkExpression(node.expression);
        return undefinedWideningType;
      }
      function checkAwaitExpression(node) {
        if (produceDiagnostics) {
          var container = ts2.getContainingFunctionOrClassStaticBlock(node);
          if (container && ts2.isClassStaticBlockDeclaration(container)) {
            error(node, ts2.Diagnostics.Await_expression_cannot_be_used_inside_a_class_static_block);
          } else if (!(node.flags & 32768)) {
            if (ts2.isInTopLevelContext(node)) {
              var sourceFile = ts2.getSourceFileOfNode(node);
              if (!hasParseDiagnostics(sourceFile)) {
                var span = void 0;
                if (!ts2.isEffectiveExternalModule(sourceFile, compilerOptions)) {
                  if (!span)
                    span = ts2.getSpanOfTokenAtPosition(sourceFile, node.pos);
                  var diagnostic = ts2.createFileDiagnostic(sourceFile, span.start, span.length, ts2.Diagnostics.await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module);
                  diagnostics.add(diagnostic);
                }
                if (moduleKind !== ts2.ModuleKind.ES2022 && moduleKind !== ts2.ModuleKind.ESNext && moduleKind !== ts2.ModuleKind.System && !(moduleKind === ts2.ModuleKind.NodeNext && ts2.getSourceFileOfNode(node).impliedNodeFormat === ts2.ModuleKind.ESNext) || languageVersion < 4) {
                  span = ts2.getSpanOfTokenAtPosition(sourceFile, node.pos);
                  var diagnostic = ts2.createFileDiagnostic(sourceFile, span.start, span.length, ts2.Diagnostics.Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher);
                  diagnostics.add(diagnostic);
                }
              }
            } else {
              var sourceFile = ts2.getSourceFileOfNode(node);
              if (!hasParseDiagnostics(sourceFile)) {
                var span = ts2.getSpanOfTokenAtPosition(sourceFile, node.pos);
                var diagnostic = ts2.createFileDiagnostic(sourceFile, span.start, span.length, ts2.Diagnostics.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules);
                if (container && container.kind !== 170 && (ts2.getFunctionFlags(container) & 2) === 0) {
                  var relatedInfo = ts2.createDiagnosticForNode(container, ts2.Diagnostics.Did_you_mean_to_mark_this_function_as_async);
                  ts2.addRelatedInfo(diagnostic, relatedInfo);
                }
                diagnostics.add(diagnostic);
              }
            }
          }
          if (isInParameterInitializerBeforeContainingFunction(node)) {
            error(node, ts2.Diagnostics.await_expressions_cannot_be_used_in_a_parameter_initializer);
          }
        }
        var operandType = checkExpression(node.expression);
        var awaitedType = checkAwaitedType(operandType, true, node, ts2.Diagnostics.Type_of_await_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member);
        if (awaitedType === operandType && !isErrorType(awaitedType) && !(operandType.flags & 3)) {
          addErrorOrSuggestion(false, ts2.createDiagnosticForNode(node, ts2.Diagnostics.await_has_no_effect_on_the_type_of_this_expression));
        }
        return awaitedType;
      }
      function checkPrefixUnaryExpression(node) {
        var operandType = checkExpression(node.operand);
        if (operandType === silentNeverType) {
          return silentNeverType;
        }
        switch (node.operand.kind) {
          case 8:
            switch (node.operator) {
              case 40:
                return getFreshTypeOfLiteralType(getNumberLiteralType(-node.operand.text));
              case 39:
                return getFreshTypeOfLiteralType(getNumberLiteralType(+node.operand.text));
            }
            break;
          case 9:
            if (node.operator === 40) {
              return getFreshTypeOfLiteralType(getBigIntLiteralType({
                negative: true,
                base10Value: ts2.parsePseudoBigInt(node.operand.text)
              }));
            }
        }
        switch (node.operator) {
          case 39:
          case 40:
          case 54:
            checkNonNullType(operandType, node.operand);
            if (maybeTypeOfKind(operandType, 12288)) {
              error(node.operand, ts2.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts2.tokenToString(node.operator));
            }
            if (node.operator === 39) {
              if (maybeTypeOfKind(operandType, 2112)) {
                error(node.operand, ts2.Diagnostics.Operator_0_cannot_be_applied_to_type_1, ts2.tokenToString(node.operator), typeToString(getBaseTypeOfLiteralType(operandType)));
              }
              return numberType;
            }
            return getUnaryResultType(operandType);
          case 53:
            checkTruthinessExpression(node.operand);
            var facts = getTypeFacts(operandType) & (4194304 | 8388608);
            return facts === 4194304 ? falseType : facts === 8388608 ? trueType : booleanType;
          case 45:
          case 46:
            var ok = checkArithmeticOperandType(node.operand, checkNonNullType(operandType, node.operand), ts2.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type);
            if (ok) {
              checkReferenceExpression(node.operand, ts2.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, ts2.Diagnostics.The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access);
            }
            return getUnaryResultType(operandType);
        }
        return errorType;
      }
      function checkPostfixUnaryExpression(node) {
        var operandType = checkExpression(node.operand);
        if (operandType === silentNeverType) {
          return silentNeverType;
        }
        var ok = checkArithmeticOperandType(node.operand, checkNonNullType(operandType, node.operand), ts2.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type);
        if (ok) {
          checkReferenceExpression(node.operand, ts2.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access, ts2.Diagnostics.The_operand_of_an_increment_or_decrement_operator_may_not_be_an_optional_property_access);
        }
        return getUnaryResultType(operandType);
      }
      function getUnaryResultType(operandType) {
        if (maybeTypeOfKind(operandType, 2112)) {
          return isTypeAssignableToKind(operandType, 3) || maybeTypeOfKind(operandType, 296) ? numberOrBigIntType : bigintType;
        }
        return numberType;
      }
      function maybeTypeOfKind(type, kind) {
        if (type.flags & kind) {
          return true;
        }
        if (type.flags & 3145728) {
          var types = type.types;
          for (var _i = 0, types_21 = types; _i < types_21.length; _i++) {
            var t = types_21[_i];
            if (maybeTypeOfKind(t, kind)) {
              return true;
            }
          }
        }
        return false;
      }
      function isTypeAssignableToKind(source, kind, strict) {
        if (source.flags & kind) {
          return true;
        }
        if (strict && source.flags & (3 | 16384 | 32768 | 65536)) {
          return false;
        }
        return !!(kind & 296) && isTypeAssignableTo(source, numberType) || !!(kind & 2112) && isTypeAssignableTo(source, bigintType) || !!(kind & 402653316) && isTypeAssignableTo(source, stringType) || !!(kind & 528) && isTypeAssignableTo(source, booleanType) || !!(kind & 16384) && isTypeAssignableTo(source, voidType) || !!(kind & 131072) && isTypeAssignableTo(source, neverType) || !!(kind & 65536) && isTypeAssignableTo(source, nullType) || !!(kind & 32768) && isTypeAssignableTo(source, undefinedType) || !!(kind & 4096) && isTypeAssignableTo(source, esSymbolType) || !!(kind & 67108864) && isTypeAssignableTo(source, nonPrimitiveType);
      }
      function allTypesAssignableToKind(source, kind, strict) {
        return source.flags & 1048576 ? ts2.every(source.types, function(subType) {
          return allTypesAssignableToKind(subType, kind, strict);
        }) : isTypeAssignableToKind(source, kind, strict);
      }
      function isConstEnumObjectType(type) {
        return !!(ts2.getObjectFlags(type) & 16) && !!type.symbol && isConstEnumSymbol(type.symbol);
      }
      function isConstEnumSymbol(symbol) {
        return (symbol.flags & 128) !== 0;
      }
      function checkInstanceOfExpression(left, right, leftType, rightType) {
        if (leftType === silentNeverType || rightType === silentNeverType) {
          return silentNeverType;
        }
        if (!isTypeAny(leftType) && allTypesAssignableToKind(leftType, 131068)) {
          error(left, ts2.Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
        }
        if (!(isTypeAny(rightType) || typeHasCallOrConstructSignatures(rightType) || isTypeSubtypeOf(rightType, globalFunctionType))) {
          error(right, ts2.Diagnostics.The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type);
        }
        return booleanType;
      }
      function checkInExpression(left, right, leftType, rightType) {
        if (leftType === silentNeverType || rightType === silentNeverType) {
          return silentNeverType;
        }
        if (ts2.isPrivateIdentifier(left)) {
          if (languageVersion < 99) {
            checkExternalEmitHelpers(left, 2097152);
          }
          if (!getNodeLinks(left).resolvedSymbol && ts2.getContainingClass(left)) {
            var isUncheckedJS = isUncheckedJSSuggestion(left, rightType.symbol, true);
            reportNonexistentProperty(left, rightType, isUncheckedJS);
          }
        } else {
          leftType = checkNonNullType(leftType, left);
          if (!(allTypesAssignableToKind(leftType, 402653316 | 296 | 12288) || isTypeAssignableToKind(leftType, 4194304 | 134217728 | 268435456 | 262144))) {
            error(left, ts2.Diagnostics.The_left_hand_side_of_an_in_expression_must_be_a_private_identifier_or_of_type_any_string_number_or_symbol);
          }
        }
        rightType = checkNonNullType(rightType, right);
        var rightTypeConstraint = getConstraintOfType(rightType);
        if (!allTypesAssignableToKind(rightType, 67108864 | 58982400) || rightTypeConstraint && (isTypeAssignableToKind(rightType, 3145728) && !allTypesAssignableToKind(rightTypeConstraint, 67108864 | 58982400) || !maybeTypeOfKind(rightTypeConstraint, 67108864 | 58982400 | 524288))) {
          error(right, ts2.Diagnostics.The_right_hand_side_of_an_in_expression_must_not_be_a_primitive);
        }
        return booleanType;
      }
      function checkObjectLiteralAssignment(node, sourceType, rightIsThis) {
        var properties = node.properties;
        if (strictNullChecks && properties.length === 0) {
          return checkNonNullType(sourceType, node);
        }
        for (var i = 0; i < properties.length; i++) {
          checkObjectLiteralDestructuringPropertyAssignment(node, sourceType, i, properties, rightIsThis);
        }
        return sourceType;
      }
      function checkObjectLiteralDestructuringPropertyAssignment(node, objectLiteralType, propertyIndex, allProperties, rightIsThis) {
        if (rightIsThis === void 0) {
          rightIsThis = false;
        }
        var properties = node.properties;
        var property = properties[propertyIndex];
        if (property.kind === 294 || property.kind === 295) {
          var name = property.name;
          var exprType = getLiteralTypeFromPropertyName(name);
          if (isTypeUsableAsPropertyName(exprType)) {
            var text = getPropertyNameFromType(exprType);
            var prop = getPropertyOfType(objectLiteralType, text);
            if (prop) {
              markPropertyAsReferenced(prop, property, rightIsThis);
              checkPropertyAccessibility(property, false, true, objectLiteralType, prop);
            }
          }
          var elementType = getIndexedAccessType(objectLiteralType, exprType, 32, name);
          var type = getFlowTypeOfDestructuring(property, elementType);
          return checkDestructuringAssignment(property.kind === 295 ? property : property.initializer, type);
        } else if (property.kind === 296) {
          if (propertyIndex < properties.length - 1) {
            error(property, ts2.Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern);
          } else {
            if (languageVersion < 99) {
              checkExternalEmitHelpers(property, 4);
            }
            var nonRestNames = [];
            if (allProperties) {
              for (var _i = 0, allProperties_1 = allProperties; _i < allProperties_1.length; _i++) {
                var otherProperty = allProperties_1[_i];
                if (!ts2.isSpreadAssignment(otherProperty)) {
                  nonRestNames.push(otherProperty.name);
                }
              }
            }
            var type = getRestType(objectLiteralType, nonRestNames, objectLiteralType.symbol);
            checkGrammarForDisallowedTrailingComma(allProperties, ts2.Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
            return checkDestructuringAssignment(property.expression, type);
          }
        } else {
          error(property, ts2.Diagnostics.Property_assignment_expected);
        }
      }
      function checkArrayLiteralAssignment(node, sourceType, checkMode) {
        var elements = node.elements;
        if (languageVersion < 2 && compilerOptions.downlevelIteration) {
          checkExternalEmitHelpers(node, 512);
        }
        var possiblyOutOfBoundsType = checkIteratedTypeOrElementType(65 | 128, sourceType, undefinedType, node) || errorType;
        var inBoundsType = compilerOptions.noUncheckedIndexedAccess ? void 0 : possiblyOutOfBoundsType;
        for (var i = 0; i < elements.length; i++) {
          var type = possiblyOutOfBoundsType;
          if (node.elements[i].kind === 224) {
            type = inBoundsType = inBoundsType !== null && inBoundsType !== void 0 ? inBoundsType : checkIteratedTypeOrElementType(65, sourceType, undefinedType, node) || errorType;
          }
          checkArrayLiteralDestructuringElementAssignment(node, sourceType, i, type, checkMode);
        }
        return sourceType;
      }
      function checkArrayLiteralDestructuringElementAssignment(node, sourceType, elementIndex, elementType, checkMode) {
        var elements = node.elements;
        var element = elements[elementIndex];
        if (element.kind !== 226) {
          if (element.kind !== 224) {
            var indexType = getNumberLiteralType(elementIndex);
            if (isArrayLikeType(sourceType)) {
              var accessFlags = 32 | (hasDefaultValue(element) ? 16 : 0);
              var elementType_2 = getIndexedAccessTypeOrUndefined(sourceType, indexType, accessFlags, createSyntheticExpression(element, indexType)) || errorType;
              var assignedType = hasDefaultValue(element) ? getTypeWithFacts(elementType_2, 524288) : elementType_2;
              var type = getFlowTypeOfDestructuring(element, assignedType);
              return checkDestructuringAssignment(element, type, checkMode);
            }
            return checkDestructuringAssignment(element, elementType, checkMode);
          }
          if (elementIndex < elements.length - 1) {
            error(element, ts2.Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern);
          } else {
            var restExpression = element.expression;
            if (restExpression.kind === 220 && restExpression.operatorToken.kind === 63) {
              error(restExpression.operatorToken, ts2.Diagnostics.A_rest_element_cannot_have_an_initializer);
            } else {
              checkGrammarForDisallowedTrailingComma(node.elements, ts2.Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
              var type = everyType(sourceType, isTupleType) ? mapType(sourceType, function(t) {
                return sliceTupleType(t, elementIndex);
              }) : createArrayType(elementType);
              return checkDestructuringAssignment(restExpression, type, checkMode);
            }
          }
        }
        return void 0;
      }
      function checkDestructuringAssignment(exprOrAssignment, sourceType, checkMode, rightIsThis) {
        var target;
        if (exprOrAssignment.kind === 295) {
          var prop = exprOrAssignment;
          if (prop.objectAssignmentInitializer) {
            if (strictNullChecks && !(getFalsyFlags(checkExpression(prop.objectAssignmentInitializer)) & 32768)) {
              sourceType = getTypeWithFacts(sourceType, 524288);
            }
            checkBinaryLikeExpression(prop.name, prop.equalsToken, prop.objectAssignmentInitializer, checkMode);
          }
          target = exprOrAssignment.name;
        } else {
          target = exprOrAssignment;
        }
        if (target.kind === 220 && target.operatorToken.kind === 63) {
          checkBinaryExpression(target, checkMode);
          target = target.left;
        }
        if (target.kind === 204) {
          return checkObjectLiteralAssignment(target, sourceType, rightIsThis);
        }
        if (target.kind === 203) {
          return checkArrayLiteralAssignment(target, sourceType, checkMode);
        }
        return checkReferenceAssignment(target, sourceType, checkMode);
      }
      function checkReferenceAssignment(target, sourceType, checkMode) {
        var targetType = checkExpression(target, checkMode);
        var error2 = target.parent.kind === 296 ? ts2.Diagnostics.The_target_of_an_object_rest_assignment_must_be_a_variable_or_a_property_access : ts2.Diagnostics.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access;
        var optionalError = target.parent.kind === 296 ? ts2.Diagnostics.The_target_of_an_object_rest_assignment_may_not_be_an_optional_property_access : ts2.Diagnostics.The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access;
        if (checkReferenceExpression(target, error2, optionalError)) {
          checkTypeAssignableToAndOptionallyElaborate(sourceType, targetType, target, target);
        }
        if (ts2.isPrivateIdentifierPropertyAccessExpression(target)) {
          checkExternalEmitHelpers(target.parent, 1048576);
        }
        return sourceType;
      }
      function isSideEffectFree(node) {
        node = ts2.skipParentheses(node);
        switch (node.kind) {
          case 79:
          case 10:
          case 13:
          case 209:
          case 222:
          case 14:
          case 8:
          case 9:
          case 110:
          case 95:
          case 104:
          case 152:
          case 212:
          case 225:
          case 213:
          case 203:
          case 204:
          case 215:
          case 229:
          case 278:
          case 277:
            return true;
          case 221:
            return isSideEffectFree(node.whenTrue) && isSideEffectFree(node.whenFalse);
          case 220:
            if (ts2.isAssignmentOperator(node.operatorToken.kind)) {
              return false;
            }
            return isSideEffectFree(node.left) && isSideEffectFree(node.right);
          case 218:
          case 219:
            switch (node.operator) {
              case 53:
              case 39:
              case 40:
              case 54:
                return true;
            }
            return false;
          case 216:
          case 210:
          case 228:
          default:
            return false;
        }
      }
      function isTypeEqualityComparableTo(source, target) {
        return (target.flags & 98304) !== 0 || isTypeComparableTo(source, target);
      }
      function createCheckBinaryExpression() {
        var trampoline = ts2.createBinaryExpressionTrampoline(onEnter, onLeft, onOperator, onRight, onExit, foldState);
        return function(node, checkMode) {
          var result = trampoline(node, checkMode);
          ts2.Debug.assertIsDefined(result);
          return result;
        };
        function onEnter(node, state, checkMode) {
          if (state) {
            state.stackIndex++;
            state.skip = false;
            setLeftType(state, void 0);
            setLastResult(state, void 0);
          } else {
            state = {
              checkMode,
              skip: false,
              stackIndex: 0,
              typeStack: [void 0, void 0]
            };
          }
          if (ts2.isInJSFile(node) && ts2.getAssignedExpandoInitializer(node)) {
            state.skip = true;
            setLastResult(state, checkExpression(node.right, checkMode));
            return state;
          }
          checkGrammarNullishCoalesceWithLogicalExpression(node);
          var operator = node.operatorToken.kind;
          if (operator === 63 && (node.left.kind === 204 || node.left.kind === 203)) {
            state.skip = true;
            setLastResult(state, checkDestructuringAssignment(node.left, checkExpression(node.right, checkMode), checkMode, node.right.kind === 108));
            return state;
          }
          return state;
        }
        function onLeft(left, state, _node) {
          if (!state.skip) {
            return maybeCheckExpression(state, left);
          }
        }
        function onOperator(operatorToken, state, node) {
          if (!state.skip) {
            var leftType = getLastResult(state);
            ts2.Debug.assertIsDefined(leftType);
            setLeftType(state, leftType);
            setLastResult(state, void 0);
            var operator = operatorToken.kind;
            if (operator === 55 || operator === 56 || operator === 60) {
              if (operator === 55) {
                var parent = ts2.walkUpParenthesizedExpressions(node.parent);
                checkTestingKnownTruthyCallableOrAwaitableType(node.left, leftType, ts2.isIfStatement(parent) ? parent.thenStatement : void 0);
              }
              checkTruthinessOfType(leftType, node.left);
            }
          }
        }
        function onRight(right, state, _node) {
          if (!state.skip) {
            return maybeCheckExpression(state, right);
          }
        }
        function onExit(node, state) {
          var result;
          if (state.skip) {
            result = getLastResult(state);
          } else {
            var leftType = getLeftType(state);
            ts2.Debug.assertIsDefined(leftType);
            var rightType = getLastResult(state);
            ts2.Debug.assertIsDefined(rightType);
            result = checkBinaryLikeExpressionWorker(node.left, node.operatorToken, node.right, leftType, rightType, node);
          }
          state.skip = false;
          setLeftType(state, void 0);
          setLastResult(state, void 0);
          state.stackIndex--;
          return result;
        }
        function foldState(state, result, _side) {
          setLastResult(state, result);
          return state;
        }
        function maybeCheckExpression(state, node) {
          if (ts2.isBinaryExpression(node)) {
            return node;
          }
          setLastResult(state, checkExpression(node, state.checkMode));
        }
        function getLeftType(state) {
          return state.typeStack[state.stackIndex];
        }
        function setLeftType(state, type) {
          state.typeStack[state.stackIndex] = type;
        }
        function getLastResult(state) {
          return state.typeStack[state.stackIndex + 1];
        }
        function setLastResult(state, type) {
          state.typeStack[state.stackIndex + 1] = type;
        }
      }
      function checkGrammarNullishCoalesceWithLogicalExpression(node) {
        var left = node.left, operatorToken = node.operatorToken, right = node.right;
        if (operatorToken.kind === 60) {
          if (ts2.isBinaryExpression(left) && (left.operatorToken.kind === 56 || left.operatorToken.kind === 55)) {
            grammarErrorOnNode(left, ts2.Diagnostics._0_and_1_operations_cannot_be_mixed_without_parentheses, ts2.tokenToString(left.operatorToken.kind), ts2.tokenToString(operatorToken.kind));
          }
          if (ts2.isBinaryExpression(right) && (right.operatorToken.kind === 56 || right.operatorToken.kind === 55)) {
            grammarErrorOnNode(right, ts2.Diagnostics._0_and_1_operations_cannot_be_mixed_without_parentheses, ts2.tokenToString(right.operatorToken.kind), ts2.tokenToString(operatorToken.kind));
          }
        }
      }
      function checkBinaryLikeExpression(left, operatorToken, right, checkMode, errorNode) {
        var operator = operatorToken.kind;
        if (operator === 63 && (left.kind === 204 || left.kind === 203)) {
          return checkDestructuringAssignment(left, checkExpression(right, checkMode), checkMode, right.kind === 108);
        }
        var leftType;
        if (operator === 55 || operator === 56 || operator === 60) {
          leftType = checkTruthinessExpression(left, checkMode);
        } else {
          leftType = checkExpression(left, checkMode);
        }
        var rightType = checkExpression(right, checkMode);
        return checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, errorNode);
      }
      function checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, errorNode) {
        var operator = operatorToken.kind;
        switch (operator) {
          case 41:
          case 42:
          case 66:
          case 67:
          case 43:
          case 68:
          case 44:
          case 69:
          case 40:
          case 65:
          case 47:
          case 70:
          case 48:
          case 71:
          case 49:
          case 72:
          case 51:
          case 74:
          case 52:
          case 78:
          case 50:
          case 73:
            if (leftType === silentNeverType || rightType === silentNeverType) {
              return silentNeverType;
            }
            leftType = checkNonNullType(leftType, left);
            rightType = checkNonNullType(rightType, right);
            var suggestedOperator = void 0;
            if (leftType.flags & 528 && rightType.flags & 528 && (suggestedOperator = getSuggestedBooleanOperator(operatorToken.kind)) !== void 0) {
              error(errorNode || operatorToken, ts2.Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, ts2.tokenToString(operatorToken.kind), ts2.tokenToString(suggestedOperator));
              return numberType;
            } else {
              var leftOk = checkArithmeticOperandType(left, leftType, ts2.Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type, true);
              var rightOk = checkArithmeticOperandType(right, rightType, ts2.Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type, true);
              var resultType_1;
              if (isTypeAssignableToKind(leftType, 3) && isTypeAssignableToKind(rightType, 3) || !(maybeTypeOfKind(leftType, 2112) || maybeTypeOfKind(rightType, 2112))) {
                resultType_1 = numberType;
              } else if (bothAreBigIntLike(leftType, rightType)) {
                switch (operator) {
                  case 49:
                  case 72:
                    reportOperatorError();
                    break;
                  case 42:
                  case 67:
                    if (languageVersion < 3) {
                      error(errorNode, ts2.Diagnostics.Exponentiation_cannot_be_performed_on_bigint_values_unless_the_target_option_is_set_to_es2016_or_later);
                    }
                }
                resultType_1 = bigintType;
              } else {
                reportOperatorError(bothAreBigIntLike);
                resultType_1 = errorType;
              }
              if (leftOk && rightOk) {
                checkAssignmentOperator(resultType_1);
              }
              return resultType_1;
            }
          case 39:
          case 64:
            if (leftType === silentNeverType || rightType === silentNeverType) {
              return silentNeverType;
            }
            if (!isTypeAssignableToKind(leftType, 402653316) && !isTypeAssignableToKind(rightType, 402653316)) {
              leftType = checkNonNullType(leftType, left);
              rightType = checkNonNullType(rightType, right);
            }
            var resultType = void 0;
            if (isTypeAssignableToKind(leftType, 296, true) && isTypeAssignableToKind(rightType, 296, true)) {
              resultType = numberType;
            } else if (isTypeAssignableToKind(leftType, 2112, true) && isTypeAssignableToKind(rightType, 2112, true)) {
              resultType = bigintType;
            } else if (isTypeAssignableToKind(leftType, 402653316, true) || isTypeAssignableToKind(rightType, 402653316, true)) {
              resultType = stringType;
            } else if (isTypeAny(leftType) || isTypeAny(rightType)) {
              resultType = isErrorType(leftType) || isErrorType(rightType) ? errorType : anyType;
            }
            if (resultType && !checkForDisallowedESSymbolOperand(operator)) {
              return resultType;
            }
            if (!resultType) {
              var closeEnoughKind_1 = 296 | 2112 | 402653316 | 3;
              reportOperatorError(function(left2, right2) {
                return isTypeAssignableToKind(left2, closeEnoughKind_1) && isTypeAssignableToKind(right2, closeEnoughKind_1);
              });
              return anyType;
            }
            if (operator === 64) {
              checkAssignmentOperator(resultType);
            }
            return resultType;
          case 29:
          case 31:
          case 32:
          case 33:
            if (checkForDisallowedESSymbolOperand(operator)) {
              leftType = getBaseTypeOfLiteralType(checkNonNullType(leftType, left));
              rightType = getBaseTypeOfLiteralType(checkNonNullType(rightType, right));
              reportOperatorErrorUnless(function(left2, right2) {
                return isTypeComparableTo(left2, right2) || isTypeComparableTo(right2, left2) || isTypeAssignableTo(left2, numberOrBigIntType) && isTypeAssignableTo(right2, numberOrBigIntType);
              });
            }
            return booleanType;
          case 34:
          case 35:
          case 36:
          case 37:
            reportOperatorErrorUnless(function(left2, right2) {
              return isTypeEqualityComparableTo(left2, right2) || isTypeEqualityComparableTo(right2, left2);
            });
            return booleanType;
          case 102:
            return checkInstanceOfExpression(left, right, leftType, rightType);
          case 101:
            return checkInExpression(left, right, leftType, rightType);
          case 55:
          case 76: {
            var resultType_2 = getTypeFacts(leftType) & 4194304 ? getUnionType([extractDefinitelyFalsyTypes(strictNullChecks ? leftType : getBaseTypeOfLiteralType(rightType)), rightType]) : leftType;
            if (operator === 76) {
              checkAssignmentOperator(rightType);
            }
            return resultType_2;
          }
          case 56:
          case 75: {
            var resultType_3 = getTypeFacts(leftType) & 8388608 ? getUnionType([removeDefinitelyFalsyTypes(leftType), rightType], 2) : leftType;
            if (operator === 75) {
              checkAssignmentOperator(rightType);
            }
            return resultType_3;
          }
          case 60:
          case 77: {
            var resultType_4 = getTypeFacts(leftType) & 262144 ? getUnionType([getNonNullableType(leftType), rightType], 2) : leftType;
            if (operator === 77) {
              checkAssignmentOperator(rightType);
            }
            return resultType_4;
          }
          case 63:
            var declKind = ts2.isBinaryExpression(left.parent) ? ts2.getAssignmentDeclarationKind(left.parent) : 0;
            checkAssignmentDeclaration(declKind, rightType);
            if (isAssignmentDeclaration(declKind)) {
              if (!(rightType.flags & 524288) || declKind !== 2 && declKind !== 6 && !isEmptyObjectType(rightType) && !isFunctionObjectType(rightType) && !(ts2.getObjectFlags(rightType) & 1)) {
                checkAssignmentOperator(rightType);
              }
              return leftType;
            } else {
              checkAssignmentOperator(rightType);
              return getRegularTypeOfObjectLiteral(rightType);
            }
          case 27:
            if (!compilerOptions.allowUnreachableCode && isSideEffectFree(left) && !isEvalNode(right)) {
              var sf = ts2.getSourceFileOfNode(left);
              var sourceText = sf.text;
              var start_3 = ts2.skipTrivia(sourceText, left.pos);
              var isInDiag2657 = sf.parseDiagnostics.some(function(diag) {
                if (diag.code !== ts2.Diagnostics.JSX_expressions_must_have_one_parent_element.code)
                  return false;
                return ts2.textSpanContainsPosition(diag, start_3);
              });
              if (!isInDiag2657)
                error(left, ts2.Diagnostics.Left_side_of_comma_operator_is_unused_and_has_no_side_effects);
            }
            return rightType;
          default:
            return ts2.Debug.fail();
        }
        function bothAreBigIntLike(left2, right2) {
          return isTypeAssignableToKind(left2, 2112) && isTypeAssignableToKind(right2, 2112);
        }
        function checkAssignmentDeclaration(kind, rightType2) {
          if (kind === 2) {
            for (var _i = 0, _a = getPropertiesOfObjectType(rightType2); _i < _a.length; _i++) {
              var prop = _a[_i];
              var propType = getTypeOfSymbol(prop);
              if (propType.symbol && propType.symbol.flags & 32) {
                var name = prop.escapedName;
                var symbol = resolveName(prop.valueDeclaration, name, 788968, void 0, name, false);
                if ((symbol === null || symbol === void 0 ? void 0 : symbol.declarations) && symbol.declarations.some(ts2.isJSDocTypedefTag)) {
                  addDuplicateDeclarationErrorsForSymbols(symbol, ts2.Diagnostics.Duplicate_identifier_0, ts2.unescapeLeadingUnderscores(name), prop);
                  addDuplicateDeclarationErrorsForSymbols(prop, ts2.Diagnostics.Duplicate_identifier_0, ts2.unescapeLeadingUnderscores(name), symbol);
                }
              }
            }
          }
        }
        function isEvalNode(node) {
          return node.kind === 79 && node.escapedText === "eval";
        }
        function checkForDisallowedESSymbolOperand(operator2) {
          var offendingSymbolOperand = maybeTypeOfKind(leftType, 12288) ? left : maybeTypeOfKind(rightType, 12288) ? right : void 0;
          if (offendingSymbolOperand) {
            error(offendingSymbolOperand, ts2.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts2.tokenToString(operator2));
            return false;
          }
          return true;
        }
        function getSuggestedBooleanOperator(operator2) {
          switch (operator2) {
            case 51:
            case 74:
              return 56;
            case 52:
            case 78:
              return 37;
            case 50:
            case 73:
              return 55;
            default:
              return void 0;
          }
        }
        function checkAssignmentOperator(valueType) {
          if (produceDiagnostics && ts2.isAssignmentOperator(operator)) {
            if (checkReferenceExpression(left, ts2.Diagnostics.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access, ts2.Diagnostics.The_left_hand_side_of_an_assignment_expression_may_not_be_an_optional_property_access) && (!ts2.isIdentifier(left) || ts2.unescapeLeadingUnderscores(left.escapedText) !== "exports")) {
              var headMessage = void 0;
              if (exactOptionalPropertyTypes && ts2.isPropertyAccessExpression(left) && maybeTypeOfKind(valueType, 32768)) {
                var target = getTypeOfPropertyOfType(getTypeOfExpression(left.expression), left.name.escapedText);
                if (isExactOptionalPropertyMismatch(valueType, target)) {
                  headMessage = ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target;
                }
              }
              checkTypeAssignableToAndOptionallyElaborate(valueType, leftType, left, right, headMessage);
            }
          }
        }
        function isAssignmentDeclaration(kind) {
          var _a;
          switch (kind) {
            case 2:
              return true;
            case 1:
            case 5:
            case 6:
            case 3:
            case 4:
              var symbol = getSymbolOfNode(left);
              var init = ts2.getAssignedExpandoInitializer(right);
              return !!init && ts2.isObjectLiteralExpression(init) && !!((_a = symbol === null || symbol === void 0 ? void 0 : symbol.exports) === null || _a === void 0 ? void 0 : _a.size);
            default:
              return false;
          }
        }
        function reportOperatorErrorUnless(typesAreCompatible) {
          if (!typesAreCompatible(leftType, rightType)) {
            reportOperatorError(typesAreCompatible);
            return true;
          }
          return false;
        }
        function reportOperatorError(isRelated) {
          var _a;
          var wouldWorkWithAwait = false;
          var errNode = errorNode || operatorToken;
          if (isRelated) {
            var awaitedLeftType = getAwaitedTypeNoAlias(leftType);
            var awaitedRightType = getAwaitedTypeNoAlias(rightType);
            wouldWorkWithAwait = !(awaitedLeftType === leftType && awaitedRightType === rightType) && !!(awaitedLeftType && awaitedRightType) && isRelated(awaitedLeftType, awaitedRightType);
          }
          var effectiveLeft = leftType;
          var effectiveRight = rightType;
          if (!wouldWorkWithAwait && isRelated) {
            _a = getBaseTypesIfUnrelated(leftType, rightType, isRelated), effectiveLeft = _a[0], effectiveRight = _a[1];
          }
          var _b = getTypeNamesForErrorDisplay(effectiveLeft, effectiveRight), leftStr = _b[0], rightStr = _b[1];
          if (!tryGiveBetterPrimaryError(errNode, wouldWorkWithAwait, leftStr, rightStr)) {
            errorAndMaybeSuggestAwait(errNode, wouldWorkWithAwait, ts2.Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2, ts2.tokenToString(operatorToken.kind), leftStr, rightStr);
          }
        }
        function tryGiveBetterPrimaryError(errNode, maybeMissingAwait, leftStr, rightStr) {
          var typeName;
          switch (operatorToken.kind) {
            case 36:
            case 34:
              typeName = "false";
              break;
            case 37:
            case 35:
              typeName = "true";
          }
          if (typeName) {
            return errorAndMaybeSuggestAwait(errNode, maybeMissingAwait, ts2.Diagnostics.This_condition_will_always_return_0_since_the_types_1_and_2_have_no_overlap, typeName, leftStr, rightStr);
          }
          return void 0;
        }
      }
      function getBaseTypesIfUnrelated(leftType, rightType, isRelated) {
        var effectiveLeft = leftType;
        var effectiveRight = rightType;
        var leftBase = getBaseTypeOfLiteralType(leftType);
        var rightBase = getBaseTypeOfLiteralType(rightType);
        if (!isRelated(leftBase, rightBase)) {
          effectiveLeft = leftBase;
          effectiveRight = rightBase;
        }
        return [effectiveLeft, effectiveRight];
      }
      function checkYieldExpression(node) {
        if (produceDiagnostics) {
          if (!(node.flags & 8192)) {
            grammarErrorOnFirstToken(node, ts2.Diagnostics.A_yield_expression_is_only_allowed_in_a_generator_body);
          }
          if (isInParameterInitializerBeforeContainingFunction(node)) {
            error(node, ts2.Diagnostics.yield_expressions_cannot_be_used_in_a_parameter_initializer);
          }
        }
        var func = ts2.getContainingFunction(node);
        if (!func)
          return anyType;
        var functionFlags = ts2.getFunctionFlags(func);
        if (!(functionFlags & 1)) {
          return anyType;
        }
        var isAsync = (functionFlags & 2) !== 0;
        if (node.asteriskToken) {
          if (isAsync && languageVersion < 99) {
            checkExternalEmitHelpers(node, 26624);
          }
          if (!isAsync && languageVersion < 2 && compilerOptions.downlevelIteration) {
            checkExternalEmitHelpers(node, 256);
          }
        }
        var returnType = getReturnTypeFromAnnotation(func);
        var iterationTypes = returnType && getIterationTypesOfGeneratorFunctionReturnType(returnType, isAsync);
        var signatureYieldType = iterationTypes && iterationTypes.yieldType || anyType;
        var signatureNextType = iterationTypes && iterationTypes.nextType || anyType;
        var resolvedSignatureNextType = isAsync ? getAwaitedType(signatureNextType) || anyType : signatureNextType;
        var yieldExpressionType = node.expression ? checkExpression(node.expression) : undefinedWideningType;
        var yieldedType = getYieldedTypeOfYieldExpression(node, yieldExpressionType, resolvedSignatureNextType, isAsync);
        if (returnType && yieldedType) {
          checkTypeAssignableToAndOptionallyElaborate(yieldedType, signatureYieldType, node.expression || node, node.expression);
        }
        if (node.asteriskToken) {
          var use = isAsync ? 19 : 17;
          return getIterationTypeOfIterable(use, 1, yieldExpressionType, node.expression) || anyType;
        } else if (returnType) {
          return getIterationTypeOfGeneratorFunctionReturnType(2, returnType, isAsync) || anyType;
        }
        var type = getContextualIterationType(2, func);
        if (!type) {
          type = anyType;
          if (produceDiagnostics && noImplicitAny && !ts2.expressionResultIsUnused(node)) {
            var contextualType = getContextualType(node);
            if (!contextualType || isTypeAny(contextualType)) {
              error(node, ts2.Diagnostics.yield_expression_implicitly_results_in_an_any_type_because_its_containing_generator_lacks_a_return_type_annotation);
            }
          }
        }
        return type;
      }
      function checkConditionalExpression(node, checkMode) {
        var type = checkTruthinessExpression(node.condition);
        checkTestingKnownTruthyCallableOrAwaitableType(node.condition, type, node.whenTrue);
        var type1 = checkExpression(node.whenTrue, checkMode);
        var type2 = checkExpression(node.whenFalse, checkMode);
        return getUnionType([type1, type2], 2);
      }
      function isTemplateLiteralContext(node) {
        var parent = node.parent;
        return ts2.isParenthesizedExpression(parent) && isTemplateLiteralContext(parent) || ts2.isElementAccessExpression(parent) && parent.argumentExpression === node;
      }
      function checkTemplateExpression(node) {
        var texts = [node.head.text];
        var types = [];
        for (var _i = 0, _a = node.templateSpans; _i < _a.length; _i++) {
          var span = _a[_i];
          var type = checkExpression(span.expression);
          if (maybeTypeOfKind(type, 12288)) {
            error(span.expression, ts2.Diagnostics.Implicit_conversion_of_a_symbol_to_a_string_will_fail_at_runtime_Consider_wrapping_this_expression_in_String);
          }
          texts.push(span.literal.text);
          types.push(isTypeAssignableTo(type, templateConstraintType) ? type : stringType);
        }
        return isConstContext(node) || isTemplateLiteralContext(node) || someType(getContextualType(node) || unknownType, isTemplateLiteralContextualType) ? getTemplateLiteralType(texts, types) : stringType;
      }
      function isTemplateLiteralContextualType(type) {
        return !!(type.flags & (128 | 134217728) || type.flags & 58982400 && maybeTypeOfKind(getBaseConstraintOfType(type) || unknownType, 402653316));
      }
      function getContextNode(node) {
        if (node.kind === 285 && !ts2.isJsxSelfClosingElement(node.parent)) {
          return node.parent.parent;
        }
        return node;
      }
      function checkExpressionWithContextualType(node, contextualType, inferenceContext, checkMode) {
        var context = getContextNode(node);
        var saveContextualType = context.contextualType;
        var saveInferenceContext = context.inferenceContext;
        try {
          context.contextualType = contextualType;
          context.inferenceContext = inferenceContext;
          var type = checkExpression(node, checkMode | 1 | (inferenceContext ? 2 : 0));
          var result = maybeTypeOfKind(type, 2944) && isLiteralOfContextualType(type, instantiateContextualType(contextualType, node)) ? getRegularTypeOfLiteralType(type) : type;
          return result;
        } finally {
          context.contextualType = saveContextualType;
          context.inferenceContext = saveInferenceContext;
        }
      }
      function checkExpressionCached(node, checkMode) {
        var links = getNodeLinks(node);
        if (!links.resolvedType) {
          if (checkMode && checkMode !== 0) {
            return checkExpression(node, checkMode);
          }
          var saveFlowLoopStart = flowLoopStart;
          var saveFlowTypeCache = flowTypeCache;
          flowLoopStart = flowLoopCount;
          flowTypeCache = void 0;
          links.resolvedType = checkExpression(node, checkMode);
          flowTypeCache = saveFlowTypeCache;
          flowLoopStart = saveFlowLoopStart;
        }
        return links.resolvedType;
      }
      function isTypeAssertion(node) {
        node = ts2.skipParentheses(node, true);
        return node.kind === 210 || node.kind === 228 || ts2.isJSDocTypeAssertion(node);
      }
      function checkDeclarationInitializer(declaration, contextualType) {
        var initializer = ts2.getEffectiveInitializer(declaration);
        var type = getQuickTypeOfExpression(initializer) || (contextualType ? checkExpressionWithContextualType(initializer, contextualType, void 0, 0) : checkExpressionCached(initializer));
        return ts2.isParameter(declaration) && declaration.name.kind === 201 && isTupleType(type) && !type.target.hasRestElement && getTypeReferenceArity(type) < declaration.name.elements.length ? padTupleType(type, declaration.name) : type;
      }
      function padTupleType(type, pattern) {
        var patternElements = pattern.elements;
        var elementTypes = getTypeArguments(type).slice();
        var elementFlags = type.target.elementFlags.slice();
        for (var i = getTypeReferenceArity(type); i < patternElements.length; i++) {
          var e = patternElements[i];
          if (i < patternElements.length - 1 || !(e.kind === 202 && e.dotDotDotToken)) {
            elementTypes.push(!ts2.isOmittedExpression(e) && hasDefaultValue(e) ? getTypeFromBindingElement(e, false, false) : anyType);
            elementFlags.push(2);
            if (!ts2.isOmittedExpression(e) && !hasDefaultValue(e)) {
              reportImplicitAny(e, anyType);
            }
          }
        }
        return createTupleType(elementTypes, elementFlags, type.target.readonly);
      }
      function widenTypeInferredFromInitializer(declaration, type) {
        var widened = ts2.getCombinedNodeFlags(declaration) & 2 || ts2.isDeclarationReadonly(declaration) ? type : getWidenedLiteralType(type);
        if (ts2.isInJSFile(declaration)) {
          if (isEmptyLiteralType(widened)) {
            reportImplicitAny(declaration, anyType);
            return anyType;
          } else if (isEmptyArrayLiteralType(widened)) {
            reportImplicitAny(declaration, anyArrayType);
            return anyArrayType;
          }
        }
        return widened;
      }
      function isLiteralOfContextualType(candidateType, contextualType) {
        if (contextualType) {
          if (contextualType.flags & 3145728) {
            var types = contextualType.types;
            return ts2.some(types, function(t) {
              return isLiteralOfContextualType(candidateType, t);
            });
          }
          if (contextualType.flags & 58982400) {
            var constraint = getBaseConstraintOfType(contextualType) || unknownType;
            return maybeTypeOfKind(constraint, 4) && maybeTypeOfKind(candidateType, 128) || maybeTypeOfKind(constraint, 8) && maybeTypeOfKind(candidateType, 256) || maybeTypeOfKind(constraint, 64) && maybeTypeOfKind(candidateType, 2048) || maybeTypeOfKind(constraint, 4096) && maybeTypeOfKind(candidateType, 8192) || isLiteralOfContextualType(candidateType, constraint);
          }
          return !!(contextualType.flags & (128 | 4194304 | 134217728 | 268435456) && maybeTypeOfKind(candidateType, 128) || contextualType.flags & 256 && maybeTypeOfKind(candidateType, 256) || contextualType.flags & 2048 && maybeTypeOfKind(candidateType, 2048) || contextualType.flags & 512 && maybeTypeOfKind(candidateType, 512) || contextualType.flags & 8192 && maybeTypeOfKind(candidateType, 8192));
        }
        return false;
      }
      function isConstContext(node) {
        var parent = node.parent;
        return ts2.isAssertionExpression(parent) && ts2.isConstTypeReference(parent.type) || ts2.isJSDocTypeAssertion(parent) && ts2.isConstTypeReference(ts2.getJSDocTypeAssertionType(parent)) || (ts2.isParenthesizedExpression(parent) || ts2.isArrayLiteralExpression(parent) || ts2.isSpreadElement(parent)) && isConstContext(parent) || (ts2.isPropertyAssignment(parent) || ts2.isShorthandPropertyAssignment(parent) || ts2.isTemplateSpan(parent)) && isConstContext(parent.parent);
      }
      function checkExpressionForMutableLocation(node, checkMode, contextualType, forceTuple) {
        var type = checkExpression(node, checkMode, forceTuple);
        return isConstContext(node) ? getRegularTypeOfLiteralType(type) : isTypeAssertion(node) ? type : getWidenedLiteralLikeTypeForContextualType(type, instantiateContextualType(arguments.length === 2 ? getContextualType(node) : contextualType, node));
      }
      function checkPropertyAssignment(node, checkMode) {
        if (node.name.kind === 161) {
          checkComputedPropertyName(node.name);
        }
        return checkExpressionForMutableLocation(node.initializer, checkMode);
      }
      function checkObjectLiteralMethod(node, checkMode) {
        checkGrammarMethod(node);
        if (node.name.kind === 161) {
          checkComputedPropertyName(node.name);
        }
        var uninstantiatedType = checkFunctionExpressionOrObjectLiteralMethod(node, checkMode);
        return instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, checkMode);
      }
      function instantiateTypeWithSingleGenericCallSignature(node, type, checkMode) {
        if (checkMode && checkMode & (2 | 8)) {
          var callSignature = getSingleSignature(type, 0, true);
          var constructSignature = getSingleSignature(type, 1, true);
          var signature = callSignature || constructSignature;
          if (signature && signature.typeParameters) {
            var contextualType = getApparentTypeOfContextualType(node, 2);
            if (contextualType) {
              var contextualSignature = getSingleSignature(getNonNullableType(contextualType), callSignature ? 0 : 1, false);
              if (contextualSignature && !contextualSignature.typeParameters) {
                if (checkMode & 8) {
                  skippedGenericFunction(node, checkMode);
                  return anyFunctionType;
                }
                var context = getInferenceContext(node);
                var returnType = context.signature && getReturnTypeOfSignature(context.signature);
                var returnSignature = returnType && getSingleCallOrConstructSignature(returnType);
                if (returnSignature && !returnSignature.typeParameters && !ts2.every(context.inferences, hasInferenceCandidates)) {
                  var uniqueTypeParameters = getUniqueTypeParameters(context, signature.typeParameters);
                  var instantiatedSignature = getSignatureInstantiationWithoutFillingInTypeArguments(signature, uniqueTypeParameters);
                  var inferences_3 = ts2.map(context.inferences, function(info) {
                    return createInferenceInfo(info.typeParameter);
                  });
                  applyToParameterTypes(instantiatedSignature, contextualSignature, function(source, target) {
                    inferTypes(inferences_3, source, target, 0, true);
                  });
                  if (ts2.some(inferences_3, hasInferenceCandidates)) {
                    applyToReturnTypes(instantiatedSignature, contextualSignature, function(source, target) {
                      inferTypes(inferences_3, source, target);
                    });
                    if (!hasOverlappingInferences(context.inferences, inferences_3)) {
                      mergeInferences(context.inferences, inferences_3);
                      context.inferredTypeParameters = ts2.concatenate(context.inferredTypeParameters, uniqueTypeParameters);
                      return getOrCreateTypeFromSignature(instantiatedSignature);
                    }
                  }
                }
                return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, context));
              }
            }
          }
        }
        return type;
      }
      function skippedGenericFunction(node, checkMode) {
        if (checkMode & 2) {
          var context = getInferenceContext(node);
          context.flags |= 4;
        }
      }
      function hasInferenceCandidates(info) {
        return !!(info.candidates || info.contraCandidates);
      }
      function hasOverlappingInferences(a, b) {
        for (var i = 0; i < a.length; i++) {
          if (hasInferenceCandidates(a[i]) && hasInferenceCandidates(b[i])) {
            return true;
          }
        }
        return false;
      }
      function mergeInferences(target, source) {
        for (var i = 0; i < target.length; i++) {
          if (!hasInferenceCandidates(target[i]) && hasInferenceCandidates(source[i])) {
            target[i] = source[i];
          }
        }
      }
      function getUniqueTypeParameters(context, typeParameters) {
        var result = [];
        var oldTypeParameters;
        var newTypeParameters;
        for (var _i = 0, typeParameters_2 = typeParameters; _i < typeParameters_2.length; _i++) {
          var tp = typeParameters_2[_i];
          var name = tp.symbol.escapedName;
          if (hasTypeParameterByName(context.inferredTypeParameters, name) || hasTypeParameterByName(result, name)) {
            var newName = getUniqueTypeParameterName(ts2.concatenate(context.inferredTypeParameters, result), name);
            var symbol = createSymbol(262144, newName);
            var newTypeParameter = createTypeParameter(symbol);
            newTypeParameter.target = tp;
            oldTypeParameters = ts2.append(oldTypeParameters, tp);
            newTypeParameters = ts2.append(newTypeParameters, newTypeParameter);
            result.push(newTypeParameter);
          } else {
            result.push(tp);
          }
        }
        if (newTypeParameters) {
          var mapper = createTypeMapper(oldTypeParameters, newTypeParameters);
          for (var _a = 0, newTypeParameters_1 = newTypeParameters; _a < newTypeParameters_1.length; _a++) {
            var tp = newTypeParameters_1[_a];
            tp.mapper = mapper;
          }
        }
        return result;
      }
      function hasTypeParameterByName(typeParameters, name) {
        return ts2.some(typeParameters, function(tp) {
          return tp.symbol.escapedName === name;
        });
      }
      function getUniqueTypeParameterName(typeParameters, baseName) {
        var len = baseName.length;
        while (len > 1 && baseName.charCodeAt(len - 1) >= 48 && baseName.charCodeAt(len - 1) <= 57)
          len--;
        var s = baseName.slice(0, len);
        for (var index = 1; true; index++) {
          var augmentedName = s + index;
          if (!hasTypeParameterByName(typeParameters, augmentedName)) {
            return augmentedName;
          }
        }
      }
      function getReturnTypeOfSingleNonGenericCallSignature(funcType) {
        var signature = getSingleCallSignature(funcType);
        if (signature && !signature.typeParameters) {
          return getReturnTypeOfSignature(signature);
        }
      }
      function getReturnTypeOfSingleNonGenericSignatureOfCallChain(expr) {
        var funcType = checkExpression(expr.expression);
        var nonOptionalType = getOptionalExpressionType(funcType, expr.expression);
        var returnType = getReturnTypeOfSingleNonGenericCallSignature(funcType);
        return returnType && propagateOptionalTypeMarker(returnType, expr, nonOptionalType !== funcType);
      }
      function getTypeOfExpression(node) {
        var quickType = getQuickTypeOfExpression(node);
        if (quickType) {
          return quickType;
        }
        if (node.flags & 67108864 && flowTypeCache) {
          var cachedType = flowTypeCache[getNodeId(node)];
          if (cachedType) {
            return cachedType;
          }
        }
        var startInvocationCount = flowInvocationCount;
        var type = checkExpression(node);
        if (flowInvocationCount !== startInvocationCount) {
          var cache = flowTypeCache || (flowTypeCache = []);
          cache[getNodeId(node)] = type;
          ts2.setNodeFlags(node, node.flags | 67108864);
        }
        return type;
      }
      function getQuickTypeOfExpression(node) {
        var expr = ts2.skipParentheses(node, true);
        if (ts2.isJSDocTypeAssertion(expr)) {
          var type = ts2.getJSDocTypeAssertionType(expr);
          if (!ts2.isConstTypeReference(type)) {
            return getTypeFromTypeNode(type);
          }
        }
        expr = ts2.skipParentheses(node);
        if (ts2.isCallExpression(expr) && expr.expression.kind !== 106 && !ts2.isRequireCall(expr, true) && !isSymbolOrSymbolForCall(expr)) {
          var type = ts2.isCallChain(expr) ? getReturnTypeOfSingleNonGenericSignatureOfCallChain(expr) : getReturnTypeOfSingleNonGenericCallSignature(checkNonNullExpression(expr.expression));
          if (type) {
            return type;
          }
        } else if (ts2.isAssertionExpression(expr) && !ts2.isConstTypeReference(expr.type)) {
          return getTypeFromTypeNode(expr.type);
        } else if (node.kind === 8 || node.kind === 10 || node.kind === 110 || node.kind === 95) {
          return checkExpression(node);
        }
        return void 0;
      }
      function getContextFreeTypeOfExpression(node) {
        var links = getNodeLinks(node);
        if (links.contextFreeType) {
          return links.contextFreeType;
        }
        var saveContextualType = node.contextualType;
        node.contextualType = anyType;
        try {
          var type = links.contextFreeType = checkExpression(node, 4);
          return type;
        } finally {
          node.contextualType = saveContextualType;
        }
      }
      function checkExpression(node, checkMode, forceTuple) {
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("check", "checkExpression", { kind: node.kind, pos: node.pos, end: node.end });
        var saveCurrentNode = currentNode;
        currentNode = node;
        instantiationCount = 0;
        var uninstantiatedType = checkExpressionWorker(node, checkMode, forceTuple);
        var type = instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, checkMode);
        if (isConstEnumObjectType(type)) {
          checkConstEnumAccess(node, type);
        }
        currentNode = saveCurrentNode;
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        return type;
      }
      function checkConstEnumAccess(node, type) {
        var ok = node.parent.kind === 205 && node.parent.expression === node || node.parent.kind === 206 && node.parent.expression === node || ((node.kind === 79 || node.kind === 160) && isInRightSideOfImportOrExportAssignment(node) || node.parent.kind === 180 && node.parent.exprName === node) || node.parent.kind === 274;
        if (!ok) {
          error(node, ts2.Diagnostics.const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment_or_type_query);
        }
        if (compilerOptions.isolatedModules) {
          ts2.Debug.assert(!!(type.symbol.flags & 128));
          var constEnumDeclaration = type.symbol.valueDeclaration;
          if (constEnumDeclaration.flags & 8388608) {
            error(node, ts2.Diagnostics.Cannot_access_ambient_const_enums_when_the_isolatedModules_flag_is_provided);
          }
        }
      }
      function checkParenthesizedExpression(node, checkMode) {
        if (ts2.hasJSDocNodes(node) && ts2.isJSDocTypeAssertion(node)) {
          var type = ts2.getJSDocTypeAssertionType(node);
          return checkAssertionWorker(type, type, node.expression, checkMode);
        }
        return checkExpression(node.expression, checkMode);
      }
      function checkExpressionWorker(node, checkMode, forceTuple) {
        var kind = node.kind;
        if (cancellationToken) {
          switch (kind) {
            case 225:
            case 212:
            case 213:
              cancellationToken.throwIfCancellationRequested();
          }
        }
        switch (kind) {
          case 79:
            return checkIdentifier(node, checkMode);
          case 80:
            return checkPrivateIdentifierExpression(node);
          case 108:
            return checkThisExpression(node);
          case 106:
            return checkSuperExpression(node);
          case 104:
            return nullWideningType;
          case 14:
          case 10:
            return getFreshTypeOfLiteralType(getStringLiteralType(node.text));
          case 8:
            checkGrammarNumericLiteral(node);
            return getFreshTypeOfLiteralType(getNumberLiteralType(+node.text));
          case 9:
            checkGrammarBigIntLiteral(node);
            return getFreshTypeOfLiteralType(getBigIntLiteralType({
              negative: false,
              base10Value: ts2.parsePseudoBigInt(node.text)
            }));
          case 110:
            return trueType;
          case 95:
            return falseType;
          case 222:
            return checkTemplateExpression(node);
          case 13:
            return globalRegExpType;
          case 203:
            return checkArrayLiteral(node, checkMode, forceTuple);
          case 204:
            return checkObjectLiteral(node, checkMode);
          case 205:
            return checkPropertyAccessExpression(node, checkMode);
          case 160:
            return checkQualifiedName(node, checkMode);
          case 206:
            return checkIndexedAccess(node, checkMode);
          case 207:
            if (node.expression.kind === 100) {
              return checkImportCallExpression(node);
            }
          case 208:
            return checkCallExpression(node, checkMode);
          case 209:
            return checkTaggedTemplateExpression(node);
          case 211:
            return checkParenthesizedExpression(node, checkMode);
          case 225:
            return checkClassExpression(node);
          case 212:
          case 213:
            return checkFunctionExpressionOrObjectLiteralMethod(node, checkMode);
          case 215:
            return checkTypeOfExpression(node);
          case 210:
          case 228:
            return checkAssertion(node);
          case 229:
            return checkNonNullAssertion(node);
          case 230:
            return checkMetaProperty(node);
          case 214:
            return checkDeleteExpression(node);
          case 216:
            return checkVoidExpression(node);
          case 217:
            return checkAwaitExpression(node);
          case 218:
            return checkPrefixUnaryExpression(node);
          case 219:
            return checkPostfixUnaryExpression(node);
          case 220:
            return checkBinaryExpression(node, checkMode);
          case 221:
            return checkConditionalExpression(node, checkMode);
          case 224:
            return checkSpreadExpression(node, checkMode);
          case 226:
            return undefinedWideningType;
          case 223:
            return checkYieldExpression(node);
          case 231:
            return checkSyntheticExpression(node);
          case 287:
            return checkJsxExpression(node, checkMode);
          case 277:
            return checkJsxElement(node, checkMode);
          case 278:
            return checkJsxSelfClosingElement(node, checkMode);
          case 281:
            return checkJsxFragment(node);
          case 285:
            return checkJsxAttributes(node, checkMode);
          case 279:
            ts2.Debug.fail("Shouldn't ever directly check a JsxOpeningElement");
        }
        return errorType;
      }
      function checkTypeParameter(node) {
        if (node.expression) {
          grammarErrorOnFirstToken(node.expression, ts2.Diagnostics.Type_expected);
        }
        checkSourceElement(node.constraint);
        checkSourceElement(node.default);
        var typeParameter = getDeclaredTypeOfTypeParameter(getSymbolOfNode(node));
        getBaseConstraintOfType(typeParameter);
        if (!hasNonCircularTypeParameterDefault(typeParameter)) {
          error(node.default, ts2.Diagnostics.Type_parameter_0_has_a_circular_default, typeToString(typeParameter));
        }
        var constraintType = getConstraintOfTypeParameter(typeParameter);
        var defaultType = getDefaultFromTypeParameter(typeParameter);
        if (constraintType && defaultType) {
          checkTypeAssignableTo(defaultType, getTypeWithThisArgument(instantiateType(constraintType, makeUnaryTypeMapper(typeParameter, defaultType)), defaultType), node.default, ts2.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
        }
        if (produceDiagnostics) {
          checkTypeNameIsReserved(node.name, ts2.Diagnostics.Type_parameter_name_cannot_be_0);
        }
      }
      function checkParameter(node) {
        checkGrammarDecoratorsAndModifiers(node);
        checkVariableLikeDeclaration(node);
        var func = ts2.getContainingFunction(node);
        if (ts2.hasSyntacticModifier(node, 16476)) {
          if (!(func.kind === 170 && ts2.nodeIsPresent(func.body))) {
            error(node, ts2.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
          }
          if (func.kind === 170 && ts2.isIdentifier(node.name) && node.name.escapedText === "constructor") {
            error(node.name, ts2.Diagnostics.constructor_cannot_be_used_as_a_parameter_property_name);
          }
        }
        if (node.questionToken && ts2.isBindingPattern(node.name) && func.body) {
          error(node, ts2.Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature);
        }
        if (node.name && ts2.isIdentifier(node.name) && (node.name.escapedText === "this" || node.name.escapedText === "new")) {
          if (func.parameters.indexOf(node) !== 0) {
            error(node, ts2.Diagnostics.A_0_parameter_must_be_the_first_parameter, node.name.escapedText);
          }
          if (func.kind === 170 || func.kind === 174 || func.kind === 179) {
            error(node, ts2.Diagnostics.A_constructor_cannot_have_a_this_parameter);
          }
          if (func.kind === 213) {
            error(node, ts2.Diagnostics.An_arrow_function_cannot_have_a_this_parameter);
          }
          if (func.kind === 171 || func.kind === 172) {
            error(node, ts2.Diagnostics.get_and_set_accessors_cannot_declare_this_parameters);
          }
        }
        if (node.dotDotDotToken && !ts2.isBindingPattern(node.name) && !isTypeAssignableTo(getReducedType(getTypeOfSymbol(node.symbol)), anyReadonlyArrayType)) {
          error(node, ts2.Diagnostics.A_rest_parameter_must_be_of_an_array_type);
        }
      }
      function checkTypePredicate(node) {
        var parent = getTypePredicateParent(node);
        if (!parent) {
          error(node, ts2.Diagnostics.A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods);
          return;
        }
        var signature = getSignatureFromDeclaration(parent);
        var typePredicate = getTypePredicateOfSignature(signature);
        if (!typePredicate) {
          return;
        }
        checkSourceElement(node.type);
        var parameterName = node.parameterName;
        if (typePredicate.kind === 0 || typePredicate.kind === 2) {
          getTypeFromThisTypeNode(parameterName);
        } else {
          if (typePredicate.parameterIndex >= 0) {
            if (signatureHasRestParameter(signature) && typePredicate.parameterIndex === signature.parameters.length - 1) {
              error(parameterName, ts2.Diagnostics.A_type_predicate_cannot_reference_a_rest_parameter);
            } else {
              if (typePredicate.type) {
                var leadingError = function() {
                  return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type);
                };
                checkTypeAssignableTo(typePredicate.type, getTypeOfSymbol(signature.parameters[typePredicate.parameterIndex]), node.type, void 0, leadingError);
              }
            }
          } else if (parameterName) {
            var hasReportedError = false;
            for (var _i = 0, _a = parent.parameters; _i < _a.length; _i++) {
              var name = _a[_i].name;
              if (ts2.isBindingPattern(name) && checkIfTypePredicateVariableIsDeclaredInBindingPattern(name, parameterName, typePredicate.parameterName)) {
                hasReportedError = true;
                break;
              }
            }
            if (!hasReportedError) {
              error(node.parameterName, ts2.Diagnostics.Cannot_find_parameter_0, typePredicate.parameterName);
            }
          }
        }
      }
      function getTypePredicateParent(node) {
        switch (node.parent.kind) {
          case 213:
          case 173:
          case 255:
          case 212:
          case 178:
          case 168:
          case 167:
            var parent = node.parent;
            if (node === parent.type) {
              return parent;
            }
        }
      }
      function checkIfTypePredicateVariableIsDeclaredInBindingPattern(pattern, predicateVariableNode, predicateVariableName) {
        for (var _i = 0, _a = pattern.elements; _i < _a.length; _i++) {
          var element = _a[_i];
          if (ts2.isOmittedExpression(element)) {
            continue;
          }
          var name = element.name;
          if (name.kind === 79 && name.escapedText === predicateVariableName) {
            error(predicateVariableNode, ts2.Diagnostics.A_type_predicate_cannot_reference_element_0_in_a_binding_pattern, predicateVariableName);
            return true;
          } else if (name.kind === 201 || name.kind === 200) {
            if (checkIfTypePredicateVariableIsDeclaredInBindingPattern(name, predicateVariableNode, predicateVariableName)) {
              return true;
            }
          }
        }
      }
      function checkSignatureDeclaration(node) {
        if (node.kind === 175) {
          checkGrammarIndexSignature(node);
        } else if (node.kind === 178 || node.kind === 255 || node.kind === 179 || node.kind === 173 || node.kind === 170 || node.kind === 174) {
          checkGrammarFunctionLikeDeclaration(node);
        }
        var functionFlags = ts2.getFunctionFlags(node);
        if (!(functionFlags & 4)) {
          if ((functionFlags & 3) === 3 && languageVersion < 99) {
            checkExternalEmitHelpers(node, 6144);
          }
          if ((functionFlags & 3) === 2 && languageVersion < 4) {
            checkExternalEmitHelpers(node, 64);
          }
          if ((functionFlags & 3) !== 0 && languageVersion < 2) {
            checkExternalEmitHelpers(node, 128);
          }
        }
        checkTypeParameters(ts2.getEffectiveTypeParameterDeclarations(node));
        ts2.forEach(node.parameters, checkParameter);
        if (node.type) {
          checkSourceElement(node.type);
        }
        if (produceDiagnostics) {
          checkCollisionWithArgumentsInGeneratedCode(node);
          var returnTypeNode = ts2.getEffectiveReturnTypeNode(node);
          if (noImplicitAny && !returnTypeNode) {
            switch (node.kind) {
              case 174:
                error(node, ts2.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
                break;
              case 173:
                error(node, ts2.Diagnostics.Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
                break;
            }
          }
          if (returnTypeNode) {
            var functionFlags_1 = ts2.getFunctionFlags(node);
            if ((functionFlags_1 & (4 | 1)) === 1) {
              var returnType = getTypeFromTypeNode(returnTypeNode);
              if (returnType === voidType) {
                error(returnTypeNode, ts2.Diagnostics.A_generator_cannot_have_a_void_type_annotation);
              } else {
                var generatorYieldType = getIterationTypeOfGeneratorFunctionReturnType(0, returnType, (functionFlags_1 & 2) !== 0) || anyType;
                var generatorReturnType = getIterationTypeOfGeneratorFunctionReturnType(1, returnType, (functionFlags_1 & 2) !== 0) || generatorYieldType;
                var generatorNextType = getIterationTypeOfGeneratorFunctionReturnType(2, returnType, (functionFlags_1 & 2) !== 0) || unknownType;
                var generatorInstantiation = createGeneratorReturnType(generatorYieldType, generatorReturnType, generatorNextType, !!(functionFlags_1 & 2));
                checkTypeAssignableTo(generatorInstantiation, returnType, returnTypeNode);
              }
            } else if ((functionFlags_1 & 3) === 2) {
              checkAsyncFunctionReturnType(node, returnTypeNode);
            }
          }
          if (node.kind !== 175 && node.kind !== 315) {
            registerForUnusedIdentifiersCheck(node);
          }
        }
      }
      function checkClassForDuplicateDeclarations(node) {
        var instanceNames = new ts2.Map();
        var staticNames = new ts2.Map();
        var privateIdentifiers = new ts2.Map();
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          if (member.kind === 170) {
            for (var _b = 0, _c = member.parameters; _b < _c.length; _b++) {
              var param = _c[_b];
              if (ts2.isParameterPropertyDeclaration(param, member) && !ts2.isBindingPattern(param.name)) {
                addName(instanceNames, param.name, param.name.escapedText, 3);
              }
            }
          } else {
            var isStaticMember = ts2.isStatic(member);
            var name = member.name;
            if (!name) {
              continue;
            }
            var isPrivate = ts2.isPrivateIdentifier(name);
            var privateStaticFlags = isPrivate && isStaticMember ? 16 : 0;
            var names = isPrivate ? privateIdentifiers : isStaticMember ? staticNames : instanceNames;
            var memberName = name && ts2.getPropertyNameForPropertyNameNode(name);
            if (memberName) {
              switch (member.kind) {
                case 171:
                  addName(names, name, memberName, 1 | privateStaticFlags);
                  break;
                case 172:
                  addName(names, name, memberName, 2 | privateStaticFlags);
                  break;
                case 166:
                  addName(names, name, memberName, 3 | privateStaticFlags);
                  break;
                case 168:
                  addName(names, name, memberName, 8 | privateStaticFlags);
                  break;
              }
            }
          }
        }
        function addName(names2, location, name2, meaning) {
          var prev = names2.get(name2);
          if (prev) {
            if ((prev & 16) !== (meaning & 16)) {
              error(location, ts2.Diagnostics.Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name, ts2.getTextOfNode(location));
            } else {
              var prevIsMethod = !!(prev & 8);
              var isMethod = !!(meaning & 8);
              if (prevIsMethod || isMethod) {
                if (prevIsMethod !== isMethod) {
                  error(location, ts2.Diagnostics.Duplicate_identifier_0, ts2.getTextOfNode(location));
                }
              } else if (prev & meaning & ~16) {
                error(location, ts2.Diagnostics.Duplicate_identifier_0, ts2.getTextOfNode(location));
              } else {
                names2.set(name2, prev | meaning);
              }
            }
          } else {
            names2.set(name2, meaning);
          }
        }
      }
      function checkClassForStaticPropertyNameConflicts(node) {
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          var memberNameNode = member.name;
          var isStaticMember = ts2.isStatic(member);
          if (isStaticMember && memberNameNode) {
            var memberName = ts2.getPropertyNameForPropertyNameNode(memberNameNode);
            switch (memberName) {
              case "name":
              case "length":
              case "caller":
              case "arguments":
              case "prototype":
                var message = ts2.Diagnostics.Static_property_0_conflicts_with_built_in_property_Function_0_of_constructor_function_1;
                var className = getNameOfSymbolAsWritten(getSymbolOfNode(node));
                error(memberNameNode, message, memberName, className);
                break;
            }
          }
        }
      }
      function checkObjectTypeForDuplicateDeclarations(node) {
        var names = new ts2.Map();
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          if (member.kind === 165) {
            var memberName = void 0;
            var name = member.name;
            switch (name.kind) {
              case 10:
              case 8:
                memberName = name.text;
                break;
              case 79:
                memberName = ts2.idText(name);
                break;
              default:
                continue;
            }
            if (names.get(memberName)) {
              error(ts2.getNameOfDeclaration(member.symbol.valueDeclaration), ts2.Diagnostics.Duplicate_identifier_0, memberName);
              error(member.name, ts2.Diagnostics.Duplicate_identifier_0, memberName);
            } else {
              names.set(memberName, true);
            }
          }
        }
      }
      function checkTypeForDuplicateIndexSignatures(node) {
        if (node.kind === 257) {
          var nodeSymbol = getSymbolOfNode(node);
          if (nodeSymbol.declarations && nodeSymbol.declarations.length > 0 && nodeSymbol.declarations[0] !== node) {
            return;
          }
        }
        var indexSymbol = getIndexSymbol(getSymbolOfNode(node));
        if (indexSymbol === null || indexSymbol === void 0 ? void 0 : indexSymbol.declarations) {
          var indexSignatureMap_1 = new ts2.Map();
          var _loop_26 = function(declaration2) {
            if (declaration2.parameters.length === 1 && declaration2.parameters[0].type) {
              forEachType(getTypeFromTypeNode(declaration2.parameters[0].type), function(type) {
                var entry = indexSignatureMap_1.get(getTypeId(type));
                if (entry) {
                  entry.declarations.push(declaration2);
                } else {
                  indexSignatureMap_1.set(getTypeId(type), { type, declarations: [declaration2] });
                }
              });
            }
          };
          for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            _loop_26(declaration);
          }
          indexSignatureMap_1.forEach(function(entry) {
            if (entry.declarations.length > 1) {
              for (var _i2 = 0, _a2 = entry.declarations; _i2 < _a2.length; _i2++) {
                var declaration2 = _a2[_i2];
                error(declaration2, ts2.Diagnostics.Duplicate_index_signature_for_type_0, typeToString(entry.type));
              }
            }
          });
        }
      }
      function checkPropertyDeclaration(node) {
        if (!checkGrammarDecoratorsAndModifiers(node) && !checkGrammarProperty(node))
          checkGrammarComputedPropertyName(node.name);
        checkVariableLikeDeclaration(node);
        setNodeLinksForPrivateIdentifierScope(node);
        if (ts2.isPrivateIdentifier(node.name) && ts2.hasStaticModifier(node) && node.initializer && languageVersion === 99 && !compilerOptions.useDefineForClassFields) {
          error(node.initializer, ts2.Diagnostics.Static_fields_with_private_names_can_t_have_initializers_when_the_useDefineForClassFields_flag_is_not_specified_with_a_target_of_esnext_Consider_adding_the_useDefineForClassFields_flag);
        }
        if (ts2.hasSyntacticModifier(node, 128) && node.kind === 166 && node.initializer) {
          error(node, ts2.Diagnostics.Property_0_cannot_have_an_initializer_because_it_is_marked_abstract, ts2.declarationNameToString(node.name));
        }
      }
      function checkPropertySignature(node) {
        if (ts2.isPrivateIdentifier(node.name)) {
          error(node, ts2.Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies);
        }
        return checkPropertyDeclaration(node);
      }
      function checkMethodDeclaration(node) {
        if (!checkGrammarMethod(node))
          checkGrammarComputedPropertyName(node.name);
        checkFunctionOrMethodDeclaration(node);
        if (ts2.hasSyntacticModifier(node, 128) && node.kind === 168 && node.body) {
          error(node, ts2.Diagnostics.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract, ts2.declarationNameToString(node.name));
        }
        if (ts2.isPrivateIdentifier(node.name) && !ts2.getContainingClass(node)) {
          error(node, ts2.Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies);
        }
        setNodeLinksForPrivateIdentifierScope(node);
      }
      function setNodeLinksForPrivateIdentifierScope(node) {
        if (ts2.isPrivateIdentifier(node.name) && languageVersion < 99) {
          for (var lexicalScope = ts2.getEnclosingBlockScopeContainer(node); !!lexicalScope; lexicalScope = ts2.getEnclosingBlockScopeContainer(lexicalScope)) {
            getNodeLinks(lexicalScope).flags |= 67108864;
          }
          if (ts2.isClassExpression(node.parent)) {
            var enclosingIterationStatement = getEnclosingIterationStatement(node.parent);
            if (enclosingIterationStatement) {
              getNodeLinks(node.name).flags |= 524288;
              getNodeLinks(enclosingIterationStatement).flags |= 65536;
            }
          }
        }
      }
      function checkClassStaticBlockDeclaration(node) {
        checkGrammarDecoratorsAndModifiers(node);
        ts2.forEachChild(node, checkSourceElement);
      }
      function checkConstructorDeclaration(node) {
        checkSignatureDeclaration(node);
        if (!checkGrammarConstructorTypeParameters(node))
          checkGrammarConstructorTypeAnnotation(node);
        checkSourceElement(node.body);
        var symbol = getSymbolOfNode(node);
        var firstDeclaration = ts2.getDeclarationOfKind(symbol, node.kind);
        if (node === firstDeclaration) {
          checkFunctionOrConstructorSymbol(symbol);
        }
        if (ts2.nodeIsMissing(node.body)) {
          return;
        }
        if (!produceDiagnostics) {
          return;
        }
        function isInstancePropertyWithInitializerOrPrivateIdentifierProperty(n) {
          if (ts2.isPrivateIdentifierClassElementDeclaration(n)) {
            return true;
          }
          return n.kind === 166 && !ts2.isStatic(n) && !!n.initializer;
        }
        var containingClassDecl = node.parent;
        if (ts2.getClassExtendsHeritageElement(containingClassDecl)) {
          captureLexicalThis(node.parent, containingClassDecl);
          var classExtendsNull = classDeclarationExtendsNull(containingClassDecl);
          var superCall = findFirstSuperCall(node.body);
          if (superCall) {
            if (classExtendsNull) {
              error(superCall, ts2.Diagnostics.A_constructor_cannot_contain_a_super_call_when_its_class_extends_null);
            }
            var superCallShouldBeFirst = (ts2.getEmitScriptTarget(compilerOptions) !== 99 || !useDefineForClassFields) && (ts2.some(node.parent.members, isInstancePropertyWithInitializerOrPrivateIdentifierProperty) || ts2.some(node.parameters, function(p) {
              return ts2.hasSyntacticModifier(p, 16476);
            }));
            if (superCallShouldBeFirst) {
              var statements = node.body.statements;
              var superCallStatement = void 0;
              for (var _i = 0, statements_4 = statements; _i < statements_4.length; _i++) {
                var statement = statements_4[_i];
                if (statement.kind === 237 && ts2.isSuperCall(statement.expression)) {
                  superCallStatement = statement;
                  break;
                }
                if (!ts2.isPrologueDirective(statement)) {
                  break;
                }
              }
              if (!superCallStatement) {
                error(node, ts2.Diagnostics.A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_parameter_properties_or_private_identifiers);
              }
            }
          } else if (!classExtendsNull) {
            error(node, ts2.Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call);
          }
        }
      }
      function checkAccessorDeclaration(node) {
        if (produceDiagnostics) {
          if (!checkGrammarFunctionLikeDeclaration(node) && !checkGrammarAccessor(node))
            checkGrammarComputedPropertyName(node.name);
          checkDecorators(node);
          checkSignatureDeclaration(node);
          if (node.kind === 171) {
            if (!(node.flags & 8388608) && ts2.nodeIsPresent(node.body) && node.flags & 256) {
              if (!(node.flags & 512)) {
                error(node.name, ts2.Diagnostics.A_get_accessor_must_return_a_value);
              }
            }
          }
          if (node.name.kind === 161) {
            checkComputedPropertyName(node.name);
          }
          if (hasBindableName(node)) {
            var symbol = getSymbolOfNode(node);
            var getter = ts2.getDeclarationOfKind(symbol, 171);
            var setter = ts2.getDeclarationOfKind(symbol, 172);
            if (getter && setter && !(getNodeCheckFlags(getter) & 1)) {
              getNodeLinks(getter).flags |= 1;
              var getterFlags = ts2.getEffectiveModifierFlags(getter);
              var setterFlags = ts2.getEffectiveModifierFlags(setter);
              if ((getterFlags & 128) !== (setterFlags & 128)) {
                error(getter.name, ts2.Diagnostics.Accessors_must_both_be_abstract_or_non_abstract);
                error(setter.name, ts2.Diagnostics.Accessors_must_both_be_abstract_or_non_abstract);
              }
              if (getterFlags & 16 && !(setterFlags & (16 | 8)) || getterFlags & 8 && !(setterFlags & 8)) {
                error(getter.name, ts2.Diagnostics.A_get_accessor_must_be_at_least_as_accessible_as_the_setter);
                error(setter.name, ts2.Diagnostics.A_get_accessor_must_be_at_least_as_accessible_as_the_setter);
              }
              var getterType = getAnnotatedAccessorType(getter);
              var setterType = getAnnotatedAccessorType(setter);
              if (getterType && setterType) {
                checkTypeAssignableTo(getterType, setterType, getter, ts2.Diagnostics.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type);
              }
            }
          }
          var returnType = getTypeOfAccessors(getSymbolOfNode(node));
          if (node.kind === 171) {
            checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnType);
          }
        }
        checkSourceElement(node.body);
        setNodeLinksForPrivateIdentifierScope(node);
      }
      function checkMissingDeclaration(node) {
        checkDecorators(node);
      }
      function getEffectiveTypeArguments(node, typeParameters) {
        return fillMissingTypeArguments(ts2.map(node.typeArguments, getTypeFromTypeNode), typeParameters, getMinTypeArgumentCount(typeParameters), ts2.isInJSFile(node));
      }
      function checkTypeArgumentConstraints(node, typeParameters) {
        var typeArguments;
        var mapper;
        var result = true;
        for (var i = 0; i < typeParameters.length; i++) {
          var constraint = getConstraintOfTypeParameter(typeParameters[i]);
          if (constraint) {
            if (!typeArguments) {
              typeArguments = getEffectiveTypeArguments(node, typeParameters);
              mapper = createTypeMapper(typeParameters, typeArguments);
            }
            result = result && checkTypeAssignableTo(typeArguments[i], instantiateType(constraint, mapper), node.typeArguments[i], ts2.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
          }
        }
        return result;
      }
      function getTypeParametersForTypeReference(node) {
        var type = getTypeFromTypeReference(node);
        if (!isErrorType(type)) {
          var symbol = getNodeLinks(node).resolvedSymbol;
          if (symbol) {
            return symbol.flags & 524288 && getSymbolLinks(symbol).typeParameters || (ts2.getObjectFlags(type) & 4 ? type.target.localTypeParameters : void 0);
          }
        }
        return void 0;
      }
      function checkTypeReferenceNode(node) {
        checkGrammarTypeArguments(node, node.typeArguments);
        if (node.kind === 177 && node.typeName.jsdocDotPos !== void 0 && !ts2.isInJSFile(node) && !ts2.isInJSDoc(node)) {
          grammarErrorAtPos(node, node.typeName.jsdocDotPos, 1, ts2.Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments);
        }
        ts2.forEach(node.typeArguments, checkSourceElement);
        var type = getTypeFromTypeReference(node);
        if (!isErrorType(type)) {
          if (node.typeArguments && produceDiagnostics) {
            var typeParameters = getTypeParametersForTypeReference(node);
            if (typeParameters) {
              checkTypeArgumentConstraints(node, typeParameters);
            }
          }
          var symbol = getNodeLinks(node).resolvedSymbol;
          if (symbol) {
            if (ts2.some(symbol.declarations, function(d) {
              return isTypeDeclaration(d) && !!(d.flags & 134217728);
            })) {
              addDeprecatedSuggestion(getDeprecatedSuggestionNode(node), symbol.declarations, symbol.escapedName);
            }
            if (type.flags & 32 && symbol.flags & 8) {
              error(node, ts2.Diagnostics.Enum_type_0_has_members_with_initializers_that_are_not_literals, typeToString(type));
            }
          }
        }
      }
      function getTypeArgumentConstraint(node) {
        var typeReferenceNode = ts2.tryCast(node.parent, ts2.isTypeReferenceType);
        if (!typeReferenceNode)
          return void 0;
        var typeParameters = getTypeParametersForTypeReference(typeReferenceNode);
        if (!typeParameters)
          return void 0;
        var constraint = getConstraintOfTypeParameter(typeParameters[typeReferenceNode.typeArguments.indexOf(node)]);
        return constraint && instantiateType(constraint, createTypeMapper(typeParameters, getEffectiveTypeArguments(typeReferenceNode, typeParameters)));
      }
      function checkTypeQuery(node) {
        getTypeFromTypeQueryNode(node);
      }
      function checkTypeLiteral(node) {
        ts2.forEach(node.members, checkSourceElement);
        if (produceDiagnostics) {
          var type = getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
          checkIndexConstraints(type, type.symbol);
          checkTypeForDuplicateIndexSignatures(node);
          checkObjectTypeForDuplicateDeclarations(node);
        }
      }
      function checkArrayType(node) {
        checkSourceElement(node.elementType);
      }
      function checkTupleType(node) {
        var elementTypes = node.elements;
        var seenOptionalElement = false;
        var seenRestElement = false;
        var hasNamedElement = ts2.some(elementTypes, ts2.isNamedTupleMember);
        for (var _i = 0, elementTypes_1 = elementTypes; _i < elementTypes_1.length; _i++) {
          var e = elementTypes_1[_i];
          if (e.kind !== 196 && hasNamedElement) {
            grammarErrorOnNode(e, ts2.Diagnostics.Tuple_members_must_all_have_names_or_all_not_have_names);
            break;
          }
          var flags = getTupleElementFlags(e);
          if (flags & 8) {
            var type = getTypeFromTypeNode(e.type);
            if (!isArrayLikeType(type)) {
              error(e, ts2.Diagnostics.A_rest_element_type_must_be_an_array_type);
              break;
            }
            if (isArrayType(type) || isTupleType(type) && type.target.combinedFlags & 4) {
              seenRestElement = true;
            }
          } else if (flags & 4) {
            if (seenRestElement) {
              grammarErrorOnNode(e, ts2.Diagnostics.A_rest_element_cannot_follow_another_rest_element);
              break;
            }
            seenRestElement = true;
          } else if (flags & 2) {
            if (seenRestElement) {
              grammarErrorOnNode(e, ts2.Diagnostics.An_optional_element_cannot_follow_a_rest_element);
              break;
            }
            seenOptionalElement = true;
          } else if (seenOptionalElement) {
            grammarErrorOnNode(e, ts2.Diagnostics.A_required_element_cannot_follow_an_optional_element);
            break;
          }
        }
        ts2.forEach(node.elements, checkSourceElement);
        getTypeFromTypeNode(node);
      }
      function checkUnionOrIntersectionType(node) {
        ts2.forEach(node.types, checkSourceElement);
        getTypeFromTypeNode(node);
      }
      function checkIndexedAccessIndexType(type, accessNode) {
        if (!(type.flags & 8388608)) {
          return type;
        }
        var objectType = type.objectType;
        var indexType = type.indexType;
        if (isTypeAssignableTo(indexType, getIndexType(objectType, false))) {
          if (accessNode.kind === 206 && ts2.isAssignmentTarget(accessNode) && ts2.getObjectFlags(objectType) & 32 && getMappedTypeModifiers(objectType) & 1) {
            error(accessNode, ts2.Diagnostics.Index_signature_in_type_0_only_permits_reading, typeToString(objectType));
          }
          return type;
        }
        var apparentObjectType = getApparentType(objectType);
        if (getIndexInfoOfType(apparentObjectType, numberType) && isTypeAssignableToKind(indexType, 296)) {
          return type;
        }
        if (isGenericObjectType(objectType)) {
          var propertyName_1 = getPropertyNameFromIndex(indexType, accessNode);
          if (propertyName_1) {
            var propertySymbol = forEachType(apparentObjectType, function(t) {
              return getPropertyOfType(t, propertyName_1);
            });
            if (propertySymbol && ts2.getDeclarationModifierFlagsFromSymbol(propertySymbol) & 24) {
              error(accessNode, ts2.Diagnostics.Private_or_protected_member_0_cannot_be_accessed_on_a_type_parameter, ts2.unescapeLeadingUnderscores(propertyName_1));
              return errorType;
            }
          }
        }
        error(accessNode, ts2.Diagnostics.Type_0_cannot_be_used_to_index_type_1, typeToString(indexType), typeToString(objectType));
        return errorType;
      }
      function checkIndexedAccessType(node) {
        checkSourceElement(node.objectType);
        checkSourceElement(node.indexType);
        checkIndexedAccessIndexType(getTypeFromIndexedAccessTypeNode(node), node);
      }
      function checkMappedType(node) {
        checkGrammarMappedType(node);
        checkSourceElement(node.typeParameter);
        checkSourceElement(node.nameType);
        checkSourceElement(node.type);
        if (!node.type) {
          reportImplicitAny(node, anyType);
        }
        var type = getTypeFromMappedTypeNode(node);
        var nameType = getNameTypeFromMappedType(type);
        if (nameType) {
          checkTypeAssignableTo(nameType, keyofConstraintType, node.nameType);
        } else {
          var constraintType = getConstraintTypeFromMappedType(type);
          checkTypeAssignableTo(constraintType, keyofConstraintType, ts2.getEffectiveConstraintOfTypeParameter(node.typeParameter));
        }
      }
      function checkGrammarMappedType(node) {
        var _a;
        if ((_a = node.members) === null || _a === void 0 ? void 0 : _a.length) {
          return grammarErrorOnNode(node.members[0], ts2.Diagnostics.A_mapped_type_may_not_declare_properties_or_methods);
        }
      }
      function checkThisType(node) {
        getTypeFromThisTypeNode(node);
      }
      function checkTypeOperator(node) {
        checkGrammarTypeOperatorNode(node);
        checkSourceElement(node.type);
      }
      function checkConditionalType(node) {
        ts2.forEachChild(node, checkSourceElement);
      }
      function checkInferType(node) {
        if (!ts2.findAncestor(node, function(n) {
          return n.parent && n.parent.kind === 188 && n.parent.extendsType === n;
        })) {
          grammarErrorOnNode(node, ts2.Diagnostics.infer_declarations_are_only_permitted_in_the_extends_clause_of_a_conditional_type);
        }
        checkSourceElement(node.typeParameter);
        registerForUnusedIdentifiersCheck(node);
      }
      function checkTemplateLiteralType(node) {
        for (var _i = 0, _a = node.templateSpans; _i < _a.length; _i++) {
          var span = _a[_i];
          checkSourceElement(span.type);
          var type = getTypeFromTypeNode(span.type);
          checkTypeAssignableTo(type, templateConstraintType, span.type);
        }
        getTypeFromTypeNode(node);
      }
      function checkImportType(node) {
        checkSourceElement(node.argument);
        getTypeFromTypeNode(node);
      }
      function checkNamedTupleMember(node) {
        if (node.dotDotDotToken && node.questionToken) {
          grammarErrorOnNode(node, ts2.Diagnostics.A_tuple_member_cannot_be_both_optional_and_rest);
        }
        if (node.type.kind === 184) {
          grammarErrorOnNode(node.type, ts2.Diagnostics.A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_colon_rather_than_after_the_type);
        }
        if (node.type.kind === 185) {
          grammarErrorOnNode(node.type, ts2.Diagnostics.A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type);
        }
        checkSourceElement(node.type);
        getTypeFromTypeNode(node);
      }
      function isPrivateWithinAmbient(node) {
        return (ts2.hasEffectiveModifier(node, 8) || ts2.isPrivateIdentifierClassElementDeclaration(node)) && !!(node.flags & 8388608);
      }
      function getEffectiveDeclarationFlags(n, flagsToCheck) {
        var flags = ts2.getCombinedModifierFlags(n);
        if (n.parent.kind !== 257 && n.parent.kind !== 256 && n.parent.kind !== 225 && n.flags & 8388608) {
          if (!(flags & 2) && !(ts2.isModuleBlock(n.parent) && ts2.isModuleDeclaration(n.parent.parent) && ts2.isGlobalScopeAugmentation(n.parent.parent))) {
            flags |= 1;
          }
          flags |= 2;
        }
        return flags & flagsToCheck;
      }
      function checkFunctionOrConstructorSymbol(symbol) {
        if (!produceDiagnostics) {
          return;
        }
        function getCanonicalOverload(overloads, implementation) {
          var implementationSharesContainerWithFirstOverload = implementation !== void 0 && implementation.parent === overloads[0].parent;
          return implementationSharesContainerWithFirstOverload ? implementation : overloads[0];
        }
        function checkFlagAgreementBetweenOverloads(overloads, implementation, flagsToCheck2, someOverloadFlags, allOverloadFlags) {
          var someButNotAllOverloadFlags = someOverloadFlags ^ allOverloadFlags;
          if (someButNotAllOverloadFlags !== 0) {
            var canonicalFlags_1 = getEffectiveDeclarationFlags(getCanonicalOverload(overloads, implementation), flagsToCheck2);
            ts2.forEach(overloads, function(o) {
              var deviation = getEffectiveDeclarationFlags(o, flagsToCheck2) ^ canonicalFlags_1;
              if (deviation & 1) {
                error(ts2.getNameOfDeclaration(o), ts2.Diagnostics.Overload_signatures_must_all_be_exported_or_non_exported);
              } else if (deviation & 2) {
                error(ts2.getNameOfDeclaration(o), ts2.Diagnostics.Overload_signatures_must_all_be_ambient_or_non_ambient);
              } else if (deviation & (8 | 16)) {
                error(ts2.getNameOfDeclaration(o) || o, ts2.Diagnostics.Overload_signatures_must_all_be_public_private_or_protected);
              } else if (deviation & 128) {
                error(ts2.getNameOfDeclaration(o), ts2.Diagnostics.Overload_signatures_must_all_be_abstract_or_non_abstract);
              }
            });
          }
        }
        function checkQuestionTokenAgreementBetweenOverloads(overloads, implementation, someHaveQuestionToken2, allHaveQuestionToken2) {
          if (someHaveQuestionToken2 !== allHaveQuestionToken2) {
            var canonicalHasQuestionToken_1 = ts2.hasQuestionToken(getCanonicalOverload(overloads, implementation));
            ts2.forEach(overloads, function(o) {
              var deviation = ts2.hasQuestionToken(o) !== canonicalHasQuestionToken_1;
              if (deviation) {
                error(ts2.getNameOfDeclaration(o), ts2.Diagnostics.Overload_signatures_must_all_be_optional_or_required);
              }
            });
          }
        }
        var flagsToCheck = 1 | 2 | 8 | 16 | 128;
        var someNodeFlags = 0;
        var allNodeFlags = flagsToCheck;
        var someHaveQuestionToken = false;
        var allHaveQuestionToken = true;
        var hasOverloads = false;
        var bodyDeclaration;
        var lastSeenNonAmbientDeclaration;
        var previousDeclaration;
        var declarations = symbol.declarations;
        var isConstructor = (symbol.flags & 16384) !== 0;
        function reportImplementationExpectedError(node2) {
          if (node2.name && ts2.nodeIsMissing(node2.name)) {
            return;
          }
          var seen = false;
          var subsequentNode = ts2.forEachChild(node2.parent, function(c) {
            if (seen) {
              return c;
            } else {
              seen = c === node2;
            }
          });
          if (subsequentNode && subsequentNode.pos === node2.end) {
            if (subsequentNode.kind === node2.kind) {
              var errorNode_1 = subsequentNode.name || subsequentNode;
              var subsequentName = subsequentNode.name;
              if (node2.name && subsequentName && (ts2.isPrivateIdentifier(node2.name) && ts2.isPrivateIdentifier(subsequentName) && node2.name.escapedText === subsequentName.escapedText || ts2.isComputedPropertyName(node2.name) && ts2.isComputedPropertyName(subsequentName) || ts2.isPropertyNameLiteral(node2.name) && ts2.isPropertyNameLiteral(subsequentName) && ts2.getEscapedTextOfIdentifierOrLiteral(node2.name) === ts2.getEscapedTextOfIdentifierOrLiteral(subsequentName))) {
                var reportError = (node2.kind === 168 || node2.kind === 167) && ts2.isStatic(node2) !== ts2.isStatic(subsequentNode);
                if (reportError) {
                  var diagnostic = ts2.isStatic(node2) ? ts2.Diagnostics.Function_overload_must_be_static : ts2.Diagnostics.Function_overload_must_not_be_static;
                  error(errorNode_1, diagnostic);
                }
                return;
              }
              if (ts2.nodeIsPresent(subsequentNode.body)) {
                error(errorNode_1, ts2.Diagnostics.Function_implementation_name_must_be_0, ts2.declarationNameToString(node2.name));
                return;
              }
            }
          }
          var errorNode = node2.name || node2;
          if (isConstructor) {
            error(errorNode, ts2.Diagnostics.Constructor_implementation_is_missing);
          } else {
            if (ts2.hasSyntacticModifier(node2, 128)) {
              error(errorNode, ts2.Diagnostics.All_declarations_of_an_abstract_method_must_be_consecutive);
            } else {
              error(errorNode, ts2.Diagnostics.Function_implementation_is_missing_or_not_immediately_following_the_declaration);
            }
          }
        }
        var duplicateFunctionDeclaration = false;
        var multipleConstructorImplementation = false;
        var hasNonAmbientClass = false;
        var functionDeclarations = [];
        if (declarations) {
          for (var _i = 0, declarations_4 = declarations; _i < declarations_4.length; _i++) {
            var current = declarations_4[_i];
            var node = current;
            var inAmbientContext = node.flags & 8388608;
            var inAmbientContextOrInterface = node.parent && (node.parent.kind === 257 || node.parent.kind === 181) || inAmbientContext;
            if (inAmbientContextOrInterface) {
              previousDeclaration = void 0;
            }
            if ((node.kind === 256 || node.kind === 225) && !inAmbientContext) {
              hasNonAmbientClass = true;
            }
            if (node.kind === 255 || node.kind === 168 || node.kind === 167 || node.kind === 170) {
              functionDeclarations.push(node);
              var currentNodeFlags = getEffectiveDeclarationFlags(node, flagsToCheck);
              someNodeFlags |= currentNodeFlags;
              allNodeFlags &= currentNodeFlags;
              someHaveQuestionToken = someHaveQuestionToken || ts2.hasQuestionToken(node);
              allHaveQuestionToken = allHaveQuestionToken && ts2.hasQuestionToken(node);
              var bodyIsPresent = ts2.nodeIsPresent(node.body);
              if (bodyIsPresent && bodyDeclaration) {
                if (isConstructor) {
                  multipleConstructorImplementation = true;
                } else {
                  duplicateFunctionDeclaration = true;
                }
              } else if ((previousDeclaration === null || previousDeclaration === void 0 ? void 0 : previousDeclaration.parent) === node.parent && previousDeclaration.end !== node.pos) {
                reportImplementationExpectedError(previousDeclaration);
              }
              if (bodyIsPresent) {
                if (!bodyDeclaration) {
                  bodyDeclaration = node;
                }
              } else {
                hasOverloads = true;
              }
              previousDeclaration = node;
              if (!inAmbientContextOrInterface) {
                lastSeenNonAmbientDeclaration = node;
              }
            }
          }
        }
        if (multipleConstructorImplementation) {
          ts2.forEach(functionDeclarations, function(declaration) {
            error(declaration, ts2.Diagnostics.Multiple_constructor_implementations_are_not_allowed);
          });
        }
        if (duplicateFunctionDeclaration) {
          ts2.forEach(functionDeclarations, function(declaration) {
            error(ts2.getNameOfDeclaration(declaration) || declaration, ts2.Diagnostics.Duplicate_function_implementation);
          });
        }
        if (hasNonAmbientClass && !isConstructor && symbol.flags & 16 && declarations) {
          var relatedDiagnostics_1 = ts2.filter(declarations, function(d) {
            return d.kind === 256;
          }).map(function(d) {
            return ts2.createDiagnosticForNode(d, ts2.Diagnostics.Consider_adding_a_declare_modifier_to_this_class);
          });
          ts2.forEach(declarations, function(declaration) {
            var diagnostic = declaration.kind === 256 ? ts2.Diagnostics.Class_declaration_cannot_implement_overload_list_for_0 : declaration.kind === 255 ? ts2.Diagnostics.Function_with_bodies_can_only_merge_with_classes_that_are_ambient : void 0;
            if (diagnostic) {
              ts2.addRelatedInfo.apply(void 0, __spreadArray([error(ts2.getNameOfDeclaration(declaration) || declaration, diagnostic, ts2.symbolName(symbol))], relatedDiagnostics_1, false));
            }
          });
        }
        if (lastSeenNonAmbientDeclaration && !lastSeenNonAmbientDeclaration.body && !ts2.hasSyntacticModifier(lastSeenNonAmbientDeclaration, 128) && !lastSeenNonAmbientDeclaration.questionToken) {
          reportImplementationExpectedError(lastSeenNonAmbientDeclaration);
        }
        if (hasOverloads) {
          if (declarations) {
            checkFlagAgreementBetweenOverloads(declarations, bodyDeclaration, flagsToCheck, someNodeFlags, allNodeFlags);
            checkQuestionTokenAgreementBetweenOverloads(declarations, bodyDeclaration, someHaveQuestionToken, allHaveQuestionToken);
          }
          if (bodyDeclaration) {
            var signatures = getSignaturesOfSymbol(symbol);
            var bodySignature = getSignatureFromDeclaration(bodyDeclaration);
            for (var _a = 0, signatures_10 = signatures; _a < signatures_10.length; _a++) {
              var signature = signatures_10[_a];
              if (!isImplementationCompatibleWithOverload(bodySignature, signature)) {
                ts2.addRelatedInfo(error(signature.declaration, ts2.Diagnostics.This_overload_signature_is_not_compatible_with_its_implementation_signature), ts2.createDiagnosticForNode(bodyDeclaration, ts2.Diagnostics.The_implementation_signature_is_declared_here));
                break;
              }
            }
          }
        }
      }
      function checkExportsOnMergedDeclarations(node) {
        if (!produceDiagnostics) {
          return;
        }
        var symbol = node.localSymbol;
        if (!symbol) {
          symbol = getSymbolOfNode(node);
          if (!symbol.exportSymbol) {
            return;
          }
        }
        if (ts2.getDeclarationOfKind(symbol, node.kind) !== node) {
          return;
        }
        var exportedDeclarationSpaces = 0;
        var nonExportedDeclarationSpaces = 0;
        var defaultExportedDeclarationSpaces = 0;
        for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
          var d = _a[_i];
          var declarationSpaces = getDeclarationSpaces(d);
          var effectiveDeclarationFlags = getEffectiveDeclarationFlags(d, 1 | 512);
          if (effectiveDeclarationFlags & 1) {
            if (effectiveDeclarationFlags & 512) {
              defaultExportedDeclarationSpaces |= declarationSpaces;
            } else {
              exportedDeclarationSpaces |= declarationSpaces;
            }
          } else {
            nonExportedDeclarationSpaces |= declarationSpaces;
          }
        }
        var nonDefaultExportedDeclarationSpaces = exportedDeclarationSpaces | nonExportedDeclarationSpaces;
        var commonDeclarationSpacesForExportsAndLocals = exportedDeclarationSpaces & nonExportedDeclarationSpaces;
        var commonDeclarationSpacesForDefaultAndNonDefault = defaultExportedDeclarationSpaces & nonDefaultExportedDeclarationSpaces;
        if (commonDeclarationSpacesForExportsAndLocals || commonDeclarationSpacesForDefaultAndNonDefault) {
          for (var _b = 0, _c = symbol.declarations; _b < _c.length; _b++) {
            var d = _c[_b];
            var declarationSpaces = getDeclarationSpaces(d);
            var name = ts2.getNameOfDeclaration(d);
            if (declarationSpaces & commonDeclarationSpacesForDefaultAndNonDefault) {
              error(name, ts2.Diagnostics.Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead, ts2.declarationNameToString(name));
            } else if (declarationSpaces & commonDeclarationSpacesForExportsAndLocals) {
              error(name, ts2.Diagnostics.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local, ts2.declarationNameToString(name));
            }
          }
        }
        function getDeclarationSpaces(decl) {
          var d2 = decl;
          switch (d2.kind) {
            case 257:
            case 258:
            case 343:
            case 336:
            case 337:
              return 2;
            case 260:
              return ts2.isAmbientModule(d2) || ts2.getModuleInstanceState(d2) !== 0 ? 4 | 1 : 4;
            case 256:
            case 259:
            case 297:
              return 2 | 1;
            case 303:
              return 2 | 1 | 4;
            case 270:
            case 220:
              var node_2 = d2;
              var expression = ts2.isExportAssignment(node_2) ? node_2.expression : node_2.right;
              if (!ts2.isEntityNameExpression(expression)) {
                return 1;
              }
              d2 = expression;
            case 264:
            case 267:
            case 266:
              var result_11 = 0;
              var target = resolveAlias(getSymbolOfNode(d2));
              ts2.forEach(target.declarations, function(d3) {
                result_11 |= getDeclarationSpaces(d3);
              });
              return result_11;
            case 253:
            case 202:
            case 255:
            case 269:
            case 79:
              return 1;
            default:
              return ts2.Debug.failBadSyntaxKind(d2);
          }
        }
      }
      function getAwaitedTypeOfPromise(type, errorNode, diagnosticMessage, arg0) {
        var promisedType = getPromisedTypeOfPromise(type, errorNode);
        return promisedType && getAwaitedType(promisedType, errorNode, diagnosticMessage, arg0);
      }
      function getPromisedTypeOfPromise(type, errorNode) {
        if (isTypeAny(type)) {
          return void 0;
        }
        var typeAsPromise = type;
        if (typeAsPromise.promisedTypeOfPromise) {
          return typeAsPromise.promisedTypeOfPromise;
        }
        if (isReferenceToType(type, getGlobalPromiseType(false))) {
          return typeAsPromise.promisedTypeOfPromise = getTypeArguments(type)[0];
        }
        if (allTypesAssignableToKind(type, 131068 | 131072)) {
          return void 0;
        }
        var thenFunction = getTypeOfPropertyOfType(type, "then");
        if (isTypeAny(thenFunction)) {
          return void 0;
        }
        var thenSignatures = thenFunction ? getSignaturesOfType(thenFunction, 0) : ts2.emptyArray;
        if (thenSignatures.length === 0) {
          if (errorNode) {
            error(errorNode, ts2.Diagnostics.A_promise_must_have_a_then_method);
          }
          return void 0;
        }
        var onfulfilledParameterType = getTypeWithFacts(getUnionType(ts2.map(thenSignatures, getTypeOfFirstParameterOfSignature)), 2097152);
        if (isTypeAny(onfulfilledParameterType)) {
          return void 0;
        }
        var onfulfilledParameterSignatures = getSignaturesOfType(onfulfilledParameterType, 0);
        if (onfulfilledParameterSignatures.length === 0) {
          if (errorNode) {
            error(errorNode, ts2.Diagnostics.The_first_parameter_of_the_then_method_of_a_promise_must_be_a_callback);
          }
          return void 0;
        }
        return typeAsPromise.promisedTypeOfPromise = getUnionType(ts2.map(onfulfilledParameterSignatures, getTypeOfFirstParameterOfSignature), 2);
      }
      function checkAwaitedType(type, withAlias, errorNode, diagnosticMessage, arg0) {
        var awaitedType = withAlias ? getAwaitedType(type, errorNode, diagnosticMessage, arg0) : getAwaitedTypeNoAlias(type, errorNode, diagnosticMessage, arg0);
        return awaitedType || errorType;
      }
      function isThenableType(type) {
        if (allTypesAssignableToKind(type, 131068 | 131072)) {
          return false;
        }
        var thenFunction = getTypeOfPropertyOfType(type, "then");
        return !!thenFunction && getSignaturesOfType(getTypeWithFacts(thenFunction, 2097152), 0).length > 0;
      }
      function isAwaitedTypeInstantiation(type) {
        var _a;
        if (type.flags & 16777216) {
          var awaitedSymbol = getGlobalAwaitedSymbol(false);
          return !!awaitedSymbol && type.aliasSymbol === awaitedSymbol && ((_a = type.aliasTypeArguments) === null || _a === void 0 ? void 0 : _a.length) === 1;
        }
        return false;
      }
      function unwrapAwaitedType(type) {
        return type.flags & 1048576 ? mapType(type, unwrapAwaitedType) : isAwaitedTypeInstantiation(type) ? type.aliasTypeArguments[0] : type;
      }
      function createAwaitedTypeIfNeeded(type) {
        if (isTypeAny(type)) {
          return type;
        }
        if (isAwaitedTypeInstantiation(type)) {
          return type;
        }
        if (isGenericObjectType(type)) {
          var baseConstraint = getBaseConstraintOfType(type);
          if (!baseConstraint || baseConstraint.flags & 3 || isEmptyObjectType(baseConstraint) || isThenableType(baseConstraint)) {
            var awaitedSymbol = getGlobalAwaitedSymbol(true);
            if (awaitedSymbol) {
              return getTypeAliasInstantiation(awaitedSymbol, [unwrapAwaitedType(type)]);
            }
          }
        }
        ts2.Debug.assert(getPromisedTypeOfPromise(type) === void 0, "type provided should not be a non-generic 'promise'-like.");
        return type;
      }
      function getAwaitedType(type, errorNode, diagnosticMessage, arg0) {
        var awaitedType = getAwaitedTypeNoAlias(type, errorNode, diagnosticMessage, arg0);
        return awaitedType && createAwaitedTypeIfNeeded(awaitedType);
      }
      function getAwaitedTypeNoAlias(type, errorNode, diagnosticMessage, arg0) {
        if (isTypeAny(type)) {
          return type;
        }
        if (isAwaitedTypeInstantiation(type)) {
          return type;
        }
        var typeAsAwaitable = type;
        if (typeAsAwaitable.awaitedTypeOfType) {
          return typeAsAwaitable.awaitedTypeOfType;
        }
        if (type.flags & 1048576) {
          var mapper = errorNode ? function(constituentType) {
            return getAwaitedTypeNoAlias(constituentType, errorNode, diagnosticMessage, arg0);
          } : getAwaitedTypeNoAlias;
          return typeAsAwaitable.awaitedTypeOfType = mapType(type, mapper);
        }
        var promisedType = getPromisedTypeOfPromise(type);
        if (promisedType) {
          if (type.id === promisedType.id || awaitedTypeStack.lastIndexOf(promisedType.id) >= 0) {
            if (errorNode) {
              error(errorNode, ts2.Diagnostics.Type_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method);
            }
            return void 0;
          }
          awaitedTypeStack.push(type.id);
          var awaitedType = getAwaitedTypeNoAlias(promisedType, errorNode, diagnosticMessage, arg0);
          awaitedTypeStack.pop();
          if (!awaitedType) {
            return void 0;
          }
          return typeAsAwaitable.awaitedTypeOfType = awaitedType;
        }
        if (isThenableType(type)) {
          if (errorNode) {
            ts2.Debug.assertIsDefined(diagnosticMessage);
            error(errorNode, diagnosticMessage, arg0);
          }
          return void 0;
        }
        return typeAsAwaitable.awaitedTypeOfType = type;
      }
      function checkAsyncFunctionReturnType(node, returnTypeNode) {
        var returnType = getTypeFromTypeNode(returnTypeNode);
        if (languageVersion >= 2) {
          if (isErrorType(returnType)) {
            return;
          }
          var globalPromiseType = getGlobalPromiseType(true);
          if (globalPromiseType !== emptyGenericType && !isReferenceToType(returnType, globalPromiseType)) {
            error(returnTypeNode, ts2.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0, typeToString(getAwaitedTypeNoAlias(returnType) || voidType));
            return;
          }
        } else {
          markTypeNodeAsReferenced(returnTypeNode);
          if (isErrorType(returnType)) {
            return;
          }
          var promiseConstructorName = ts2.getEntityNameFromTypeNode(returnTypeNode);
          if (promiseConstructorName === void 0) {
            error(returnTypeNode, ts2.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType));
            return;
          }
          var promiseConstructorSymbol = resolveEntityName(promiseConstructorName, 111551, true);
          var promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : errorType;
          if (isErrorType(promiseConstructorType)) {
            if (promiseConstructorName.kind === 79 && promiseConstructorName.escapedText === "Promise" && getTargetType(returnType) === getGlobalPromiseType(false)) {
              error(returnTypeNode, ts2.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option);
            } else {
              error(returnTypeNode, ts2.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts2.entityNameToString(promiseConstructorName));
            }
            return;
          }
          var globalPromiseConstructorLikeType = getGlobalPromiseConstructorLikeType(true);
          if (globalPromiseConstructorLikeType === emptyObjectType) {
            error(returnTypeNode, ts2.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts2.entityNameToString(promiseConstructorName));
            return;
          }
          if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, returnTypeNode, ts2.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) {
            return;
          }
          var rootName = promiseConstructorName && ts2.getFirstIdentifier(promiseConstructorName);
          var collidingSymbol = getSymbol(node.locals, rootName.escapedText, 111551);
          if (collidingSymbol) {
            error(collidingSymbol.valueDeclaration, ts2.Diagnostics.Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions, ts2.idText(rootName), ts2.entityNameToString(promiseConstructorName));
            return;
          }
        }
        checkAwaitedType(returnType, false, node, ts2.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member);
      }
      function checkDecorator(node) {
        var signature = getResolvedSignature(node);
        checkDeprecatedSignature(signature, node);
        var returnType = getReturnTypeOfSignature(signature);
        if (returnType.flags & 1) {
          return;
        }
        var expectedReturnType;
        var headMessage = getDiagnosticHeadMessageForDecoratorResolution(node);
        var errorInfo;
        switch (node.parent.kind) {
          case 256:
            var classSymbol = getSymbolOfNode(node.parent);
            var classConstructorType = getTypeOfSymbol(classSymbol);
            expectedReturnType = getUnionType([classConstructorType, voidType]);
            break;
          case 163:
            expectedReturnType = voidType;
            errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any);
            break;
          case 166:
            expectedReturnType = voidType;
            errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.The_return_type_of_a_property_decorator_function_must_be_either_void_or_any);
            break;
          case 168:
          case 171:
          case 172:
            var methodType = getTypeOfNode(node.parent);
            var descriptorType = createTypedPropertyDescriptorType(methodType);
            expectedReturnType = getUnionType([descriptorType, voidType]);
            break;
          default:
            return ts2.Debug.fail();
        }
        checkTypeAssignableTo(returnType, expectedReturnType, node, headMessage, function() {
          return errorInfo;
        });
      }
      function markTypeNodeAsReferenced(node) {
        markEntityNameOrEntityExpressionAsReference(node && ts2.getEntityNameFromTypeNode(node));
      }
      function markEntityNameOrEntityExpressionAsReference(typeName) {
        if (!typeName)
          return;
        var rootName = ts2.getFirstIdentifier(typeName);
        var meaning = (typeName.kind === 79 ? 788968 : 1920) | 2097152;
        var rootSymbol = resolveName(rootName, rootName.escapedText, meaning, void 0, void 0, true);
        if (rootSymbol && rootSymbol.flags & 2097152 && symbolIsValue(rootSymbol) && !isConstEnumOrConstEnumOnlyModule(resolveAlias(rootSymbol)) && !getTypeOnlyAliasDeclaration(rootSymbol)) {
          markAliasSymbolAsReferenced(rootSymbol);
        }
      }
      function markDecoratorMedataDataTypeNodeAsReferenced(node) {
        var entityName = getEntityNameForDecoratorMetadata(node);
        if (entityName && ts2.isEntityName(entityName)) {
          markEntityNameOrEntityExpressionAsReference(entityName);
        }
      }
      function getEntityNameForDecoratorMetadata(node) {
        if (node) {
          switch (node.kind) {
            case 187:
            case 186:
              return getEntityNameForDecoratorMetadataFromTypeList(node.types);
            case 188:
              return getEntityNameForDecoratorMetadataFromTypeList([node.trueType, node.falseType]);
            case 190:
            case 196:
              return getEntityNameForDecoratorMetadata(node.type);
            case 177:
              return node.typeName;
          }
        }
      }
      function getEntityNameForDecoratorMetadataFromTypeList(types) {
        var commonEntityName;
        for (var _i = 0, types_22 = types; _i < types_22.length; _i++) {
          var typeNode = types_22[_i];
          while (typeNode.kind === 190 || typeNode.kind === 196) {
            typeNode = typeNode.type;
          }
          if (typeNode.kind === 143) {
            continue;
          }
          if (!strictNullChecks && (typeNode.kind === 195 && typeNode.literal.kind === 104 || typeNode.kind === 152)) {
            continue;
          }
          var individualEntityName = getEntityNameForDecoratorMetadata(typeNode);
          if (!individualEntityName) {
            return void 0;
          }
          if (commonEntityName) {
            if (!ts2.isIdentifier(commonEntityName) || !ts2.isIdentifier(individualEntityName) || commonEntityName.escapedText !== individualEntityName.escapedText) {
              return void 0;
            }
          } else {
            commonEntityName = individualEntityName;
          }
        }
        return commonEntityName;
      }
      function getParameterTypeNodeForDecoratorCheck(node) {
        var typeNode = ts2.getEffectiveTypeAnnotationNode(node);
        return ts2.isRestParameter(node) ? ts2.getRestParameterElementType(typeNode) : typeNode;
      }
      function checkDecorators(node) {
        if (!node.decorators) {
          return;
        }
        if (!ts2.nodeCanBeDecorated(node, node.parent, node.parent.parent)) {
          return;
        }
        if (!compilerOptions.experimentalDecorators) {
          error(node, ts2.Diagnostics.Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_in_your_tsconfig_or_jsconfig_to_remove_this_warning);
        }
        var firstDecorator = node.decorators[0];
        checkExternalEmitHelpers(firstDecorator, 8);
        if (node.kind === 163) {
          checkExternalEmitHelpers(firstDecorator, 32);
        }
        if (compilerOptions.emitDecoratorMetadata) {
          checkExternalEmitHelpers(firstDecorator, 16);
          switch (node.kind) {
            case 256:
              var constructor = ts2.getFirstConstructorWithBody(node);
              if (constructor) {
                for (var _i = 0, _a = constructor.parameters; _i < _a.length; _i++) {
                  var parameter = _a[_i];
                  markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter));
                }
              }
              break;
            case 171:
            case 172:
              var otherKind = node.kind === 171 ? 172 : 171;
              var otherAccessor = ts2.getDeclarationOfKind(getSymbolOfNode(node), otherKind);
              markDecoratorMedataDataTypeNodeAsReferenced(getAnnotatedAccessorTypeNode(node) || otherAccessor && getAnnotatedAccessorTypeNode(otherAccessor));
              break;
            case 168:
              for (var _b = 0, _c = node.parameters; _b < _c.length; _b++) {
                var parameter = _c[_b];
                markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter));
              }
              markDecoratorMedataDataTypeNodeAsReferenced(ts2.getEffectiveReturnTypeNode(node));
              break;
            case 166:
              markDecoratorMedataDataTypeNodeAsReferenced(ts2.getEffectiveTypeAnnotationNode(node));
              break;
            case 163:
              markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node));
              var containingSignature = node.parent;
              for (var _d = 0, _e = containingSignature.parameters; _d < _e.length; _d++) {
                var parameter = _e[_d];
                markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter));
              }
              break;
          }
        }
        ts2.forEach(node.decorators, checkDecorator);
      }
      function checkFunctionDeclaration(node) {
        if (produceDiagnostics) {
          checkFunctionOrMethodDeclaration(node);
          checkGrammarForGenerator(node);
          checkCollisionsForDeclarationName(node, node.name);
        }
      }
      function checkJSDocTypeAliasTag(node) {
        if (!node.typeExpression) {
          error(node.name, ts2.Diagnostics.JSDoc_typedef_tag_should_either_have_a_type_annotation_or_be_followed_by_property_or_member_tags);
        }
        if (node.name) {
          checkTypeNameIsReserved(node.name, ts2.Diagnostics.Type_alias_name_cannot_be_0);
        }
        checkSourceElement(node.typeExpression);
        checkTypeParameters(ts2.getEffectiveTypeParameterDeclarations(node));
      }
      function checkJSDocTemplateTag(node) {
        checkSourceElement(node.constraint);
        for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) {
          var tp = _a[_i];
          checkSourceElement(tp);
        }
      }
      function checkJSDocTypeTag(node) {
        checkSourceElement(node.typeExpression);
      }
      function checkJSDocParameterTag(node) {
        checkSourceElement(node.typeExpression);
        if (!ts2.getParameterSymbolFromJSDoc(node)) {
          var decl = ts2.getHostSignatureFromJSDoc(node);
          if (decl) {
            var i = ts2.getJSDocTags(decl).filter(ts2.isJSDocParameterTag).indexOf(node);
            if (i > -1 && i < decl.parameters.length && ts2.isBindingPattern(decl.parameters[i].name)) {
              return;
            }
            if (!containsArgumentsReference(decl)) {
              if (ts2.isQualifiedName(node.name)) {
                error(node.name, ts2.Diagnostics.Qualified_name_0_is_not_allowed_without_a_leading_param_object_1, ts2.entityNameToString(node.name), ts2.entityNameToString(node.name.left));
              } else {
                error(node.name, ts2.Diagnostics.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name, ts2.idText(node.name));
              }
            } else if (ts2.findLast(ts2.getJSDocTags(decl), ts2.isJSDocParameterTag) === node && node.typeExpression && node.typeExpression.type && !isArrayType(getTypeFromTypeNode(node.typeExpression.type))) {
              error(node.name, ts2.Diagnostics.JSDoc_param_tag_has_name_0_but_there_is_no_parameter_with_that_name_It_would_match_arguments_if_it_had_an_array_type, ts2.idText(node.name.kind === 160 ? node.name.right : node.name));
            }
          }
        }
      }
      function checkJSDocPropertyTag(node) {
        checkSourceElement(node.typeExpression);
      }
      function checkJSDocFunctionType(node) {
        if (produceDiagnostics && !node.type && !ts2.isJSDocConstructSignature(node)) {
          reportImplicitAny(node, anyType);
        }
        checkSignatureDeclaration(node);
      }
      function checkJSDocImplementsTag(node) {
        var classLike = ts2.getEffectiveJSDocHost(node);
        if (!classLike || !ts2.isClassDeclaration(classLike) && !ts2.isClassExpression(classLike)) {
          error(classLike, ts2.Diagnostics.JSDoc_0_is_not_attached_to_a_class, ts2.idText(node.tagName));
        }
      }
      function checkJSDocAugmentsTag(node) {
        var classLike = ts2.getEffectiveJSDocHost(node);
        if (!classLike || !ts2.isClassDeclaration(classLike) && !ts2.isClassExpression(classLike)) {
          error(classLike, ts2.Diagnostics.JSDoc_0_is_not_attached_to_a_class, ts2.idText(node.tagName));
          return;
        }
        var augmentsTags = ts2.getJSDocTags(classLike).filter(ts2.isJSDocAugmentsTag);
        ts2.Debug.assert(augmentsTags.length > 0);
        if (augmentsTags.length > 1) {
          error(augmentsTags[1], ts2.Diagnostics.Class_declarations_cannot_have_more_than_one_augments_or_extends_tag);
        }
        var name = getIdentifierFromEntityNameExpression(node.class.expression);
        var extend = ts2.getClassExtendsHeritageElement(classLike);
        if (extend) {
          var className = getIdentifierFromEntityNameExpression(extend.expression);
          if (className && name.escapedText !== className.escapedText) {
            error(name, ts2.Diagnostics.JSDoc_0_1_does_not_match_the_extends_2_clause, ts2.idText(node.tagName), ts2.idText(name), ts2.idText(className));
          }
        }
      }
      function checkJSDocAccessibilityModifiers(node) {
        var host2 = ts2.getJSDocHost(node);
        if (host2 && ts2.isPrivateIdentifierClassElementDeclaration(host2)) {
          error(node, ts2.Diagnostics.An_accessibility_modifier_cannot_be_used_with_a_private_identifier);
        }
      }
      function getIdentifierFromEntityNameExpression(node) {
        switch (node.kind) {
          case 79:
            return node;
          case 205:
            return node.name;
          default:
            return void 0;
        }
      }
      function checkFunctionOrMethodDeclaration(node) {
        var _a;
        checkDecorators(node);
        checkSignatureDeclaration(node);
        var functionFlags = ts2.getFunctionFlags(node);
        if (node.name && node.name.kind === 161) {
          checkComputedPropertyName(node.name);
        }
        if (hasBindableName(node)) {
          var symbol = getSymbolOfNode(node);
          var localSymbol = node.localSymbol || symbol;
          var firstDeclaration = (_a = localSymbol.declarations) === null || _a === void 0 ? void 0 : _a.find(function(declaration) {
            return declaration.kind === node.kind && !(declaration.flags & 131072);
          });
          if (node === firstDeclaration) {
            checkFunctionOrConstructorSymbol(localSymbol);
          }
          if (symbol.parent) {
            checkFunctionOrConstructorSymbol(symbol);
          }
        }
        var body = node.kind === 167 ? void 0 : node.body;
        checkSourceElement(body);
        checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, getReturnTypeFromAnnotation(node));
        if (produceDiagnostics && !ts2.getEffectiveReturnTypeNode(node)) {
          if (ts2.nodeIsMissing(body) && !isPrivateWithinAmbient(node)) {
            reportImplicitAny(node, anyType);
          }
          if (functionFlags & 1 && ts2.nodeIsPresent(body)) {
            getReturnTypeOfSignature(getSignatureFromDeclaration(node));
          }
        }
        if (ts2.isInJSFile(node)) {
          var typeTag = ts2.getJSDocTypeTag(node);
          if (typeTag && typeTag.typeExpression && !getContextualCallSignature(getTypeFromTypeNode(typeTag.typeExpression), node)) {
            error(typeTag.typeExpression.type, ts2.Diagnostics.The_type_of_a_function_declaration_must_match_the_function_s_signature);
          }
        }
      }
      function registerForUnusedIdentifiersCheck(node) {
        if (produceDiagnostics) {
          var sourceFile = ts2.getSourceFileOfNode(node);
          var potentiallyUnusedIdentifiers = allPotentiallyUnusedIdentifiers.get(sourceFile.path);
          if (!potentiallyUnusedIdentifiers) {
            potentiallyUnusedIdentifiers = [];
            allPotentiallyUnusedIdentifiers.set(sourceFile.path, potentiallyUnusedIdentifiers);
          }
          potentiallyUnusedIdentifiers.push(node);
        }
      }
      function checkUnusedIdentifiers(potentiallyUnusedIdentifiers, addDiagnostic) {
        for (var _i = 0, potentiallyUnusedIdentifiers_1 = potentiallyUnusedIdentifiers; _i < potentiallyUnusedIdentifiers_1.length; _i++) {
          var node = potentiallyUnusedIdentifiers_1[_i];
          switch (node.kind) {
            case 256:
            case 225:
              checkUnusedClassMembers(node, addDiagnostic);
              checkUnusedTypeParameters(node, addDiagnostic);
              break;
            case 303:
            case 260:
            case 234:
            case 262:
            case 241:
            case 242:
            case 243:
              checkUnusedLocalsAndParameters(node, addDiagnostic);
              break;
            case 170:
            case 212:
            case 255:
            case 213:
            case 168:
            case 171:
            case 172:
              if (node.body) {
                checkUnusedLocalsAndParameters(node, addDiagnostic);
              }
              checkUnusedTypeParameters(node, addDiagnostic);
              break;
            case 167:
            case 173:
            case 174:
            case 178:
            case 179:
            case 258:
            case 257:
              checkUnusedTypeParameters(node, addDiagnostic);
              break;
            case 189:
              checkUnusedInferTypeParameter(node, addDiagnostic);
              break;
            default:
              ts2.Debug.assertNever(node, "Node should not have been registered for unused identifiers check");
          }
        }
      }
      function errorUnusedLocal(declaration, name, addDiagnostic) {
        var node = ts2.getNameOfDeclaration(declaration) || declaration;
        var message = isTypeDeclaration(declaration) ? ts2.Diagnostics._0_is_declared_but_never_used : ts2.Diagnostics._0_is_declared_but_its_value_is_never_read;
        addDiagnostic(declaration, 0, ts2.createDiagnosticForNode(node, message, name));
      }
      function isIdentifierThatStartsWithUnderscore(node) {
        return ts2.isIdentifier(node) && ts2.idText(node).charCodeAt(0) === 95;
      }
      function checkUnusedClassMembers(node, addDiagnostic) {
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          switch (member.kind) {
            case 168:
            case 166:
            case 171:
            case 172:
              if (member.kind === 172 && member.symbol.flags & 32768) {
                break;
              }
              var symbol = getSymbolOfNode(member);
              if (!symbol.isReferenced && (ts2.hasEffectiveModifier(member, 8) || ts2.isNamedDeclaration(member) && ts2.isPrivateIdentifier(member.name)) && !(member.flags & 8388608)) {
                addDiagnostic(member, 0, ts2.createDiagnosticForNode(member.name, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, symbolToString(symbol)));
              }
              break;
            case 170:
              for (var _b = 0, _c = member.parameters; _b < _c.length; _b++) {
                var parameter = _c[_b];
                if (!parameter.symbol.isReferenced && ts2.hasSyntacticModifier(parameter, 8)) {
                  addDiagnostic(parameter, 0, ts2.createDiagnosticForNode(parameter.name, ts2.Diagnostics.Property_0_is_declared_but_its_value_is_never_read, ts2.symbolName(parameter.symbol)));
                }
              }
              break;
            case 175:
            case 233:
            case 169:
              break;
            default:
              ts2.Debug.fail("Unexpected class member");
          }
        }
      }
      function checkUnusedInferTypeParameter(node, addDiagnostic) {
        var typeParameter = node.typeParameter;
        if (isTypeParameterUnused(typeParameter)) {
          addDiagnostic(node, 1, ts2.createDiagnosticForNode(node, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, ts2.idText(typeParameter.name)));
        }
      }
      function checkUnusedTypeParameters(node, addDiagnostic) {
        var declarations = getSymbolOfNode(node).declarations;
        if (!declarations || ts2.last(declarations) !== node)
          return;
        var typeParameters = ts2.getEffectiveTypeParameterDeclarations(node);
        var seenParentsWithEveryUnused = new ts2.Set();
        for (var _i = 0, typeParameters_3 = typeParameters; _i < typeParameters_3.length; _i++) {
          var typeParameter = typeParameters_3[_i];
          if (!isTypeParameterUnused(typeParameter))
            continue;
          var name = ts2.idText(typeParameter.name);
          var parent = typeParameter.parent;
          if (parent.kind !== 189 && parent.typeParameters.every(isTypeParameterUnused)) {
            if (ts2.tryAddToSet(seenParentsWithEveryUnused, parent)) {
              var sourceFile = ts2.getSourceFileOfNode(parent);
              var range = ts2.isJSDocTemplateTag(parent) ? ts2.rangeOfNode(parent) : ts2.rangeOfTypeParameters(sourceFile, parent.typeParameters);
              var only = parent.typeParameters.length === 1;
              var message = only ? ts2.Diagnostics._0_is_declared_but_its_value_is_never_read : ts2.Diagnostics.All_type_parameters_are_unused;
              var arg0 = only ? name : void 0;
              addDiagnostic(typeParameter, 1, ts2.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, message, arg0));
            }
          } else {
            addDiagnostic(typeParameter, 1, ts2.createDiagnosticForNode(typeParameter, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, name));
          }
        }
      }
      function isTypeParameterUnused(typeParameter) {
        return !(getMergedSymbol(typeParameter.symbol).isReferenced & 262144) && !isIdentifierThatStartsWithUnderscore(typeParameter.name);
      }
      function addToGroup(map, key, value, getKey) {
        var keyString = String(getKey(key));
        var group = map.get(keyString);
        if (group) {
          group[1].push(value);
        } else {
          map.set(keyString, [key, [value]]);
        }
      }
      function tryGetRootParameterDeclaration(node) {
        return ts2.tryCast(ts2.getRootDeclaration(node), ts2.isParameter);
      }
      function isValidUnusedLocalDeclaration(declaration) {
        if (ts2.isBindingElement(declaration)) {
          if (ts2.isObjectBindingPattern(declaration.parent)) {
            return !!(declaration.propertyName && isIdentifierThatStartsWithUnderscore(declaration.name));
          }
          return isIdentifierThatStartsWithUnderscore(declaration.name);
        }
        return ts2.isAmbientModule(declaration) || (ts2.isVariableDeclaration(declaration) && ts2.isForInOrOfStatement(declaration.parent.parent) || isImportedDeclaration(declaration)) && isIdentifierThatStartsWithUnderscore(declaration.name);
      }
      function checkUnusedLocalsAndParameters(nodeWithLocals, addDiagnostic) {
        var unusedImports = new ts2.Map();
        var unusedDestructures = new ts2.Map();
        var unusedVariables = new ts2.Map();
        nodeWithLocals.locals.forEach(function(local) {
          if (local.flags & 262144 ? !(local.flags & 3 && !(local.isReferenced & 3)) : local.isReferenced || local.exportSymbol) {
            return;
          }
          if (local.declarations) {
            for (var _i = 0, _a = local.declarations; _i < _a.length; _i++) {
              var declaration = _a[_i];
              if (isValidUnusedLocalDeclaration(declaration)) {
                continue;
              }
              if (isImportedDeclaration(declaration)) {
                addToGroup(unusedImports, importClauseFromImported(declaration), declaration, getNodeId);
              } else if (ts2.isBindingElement(declaration) && ts2.isObjectBindingPattern(declaration.parent)) {
                var lastElement = ts2.last(declaration.parent.elements);
                if (declaration === lastElement || !ts2.last(declaration.parent.elements).dotDotDotToken) {
                  addToGroup(unusedDestructures, declaration.parent, declaration, getNodeId);
                }
              } else if (ts2.isVariableDeclaration(declaration)) {
                addToGroup(unusedVariables, declaration.parent, declaration, getNodeId);
              } else {
                var parameter = local.valueDeclaration && tryGetRootParameterDeclaration(local.valueDeclaration);
                var name = local.valueDeclaration && ts2.getNameOfDeclaration(local.valueDeclaration);
                if (parameter && name) {
                  if (!ts2.isParameterPropertyDeclaration(parameter, parameter.parent) && !ts2.parameterIsThisKeyword(parameter) && !isIdentifierThatStartsWithUnderscore(name)) {
                    if (ts2.isBindingElement(declaration) && ts2.isArrayBindingPattern(declaration.parent)) {
                      addToGroup(unusedDestructures, declaration.parent, declaration, getNodeId);
                    } else {
                      addDiagnostic(parameter, 1, ts2.createDiagnosticForNode(name, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, ts2.symbolName(local)));
                    }
                  }
                } else {
                  errorUnusedLocal(declaration, ts2.symbolName(local), addDiagnostic);
                }
              }
            }
          }
        });
        unusedImports.forEach(function(_a) {
          var importClause = _a[0], unuseds = _a[1];
          var importDecl = importClause.parent;
          var nDeclarations = (importClause.name ? 1 : 0) + (importClause.namedBindings ? importClause.namedBindings.kind === 267 ? 1 : importClause.namedBindings.elements.length : 0);
          if (nDeclarations === unuseds.length) {
            addDiagnostic(importDecl, 0, unuseds.length === 1 ? ts2.createDiagnosticForNode(importDecl, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, ts2.idText(ts2.first(unuseds).name)) : ts2.createDiagnosticForNode(importDecl, ts2.Diagnostics.All_imports_in_import_declaration_are_unused));
          } else {
            for (var _i = 0, unuseds_1 = unuseds; _i < unuseds_1.length; _i++) {
              var unused = unuseds_1[_i];
              errorUnusedLocal(unused, ts2.idText(unused.name), addDiagnostic);
            }
          }
        });
        unusedDestructures.forEach(function(_a) {
          var bindingPattern = _a[0], bindingElements = _a[1];
          var kind = tryGetRootParameterDeclaration(bindingPattern.parent) ? 1 : 0;
          if (bindingPattern.elements.length === bindingElements.length) {
            if (bindingElements.length === 1 && bindingPattern.parent.kind === 253 && bindingPattern.parent.parent.kind === 254) {
              addToGroup(unusedVariables, bindingPattern.parent.parent, bindingPattern.parent, getNodeId);
            } else {
              addDiagnostic(bindingPattern, kind, bindingElements.length === 1 ? ts2.createDiagnosticForNode(bindingPattern, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, bindingNameText(ts2.first(bindingElements).name)) : ts2.createDiagnosticForNode(bindingPattern, ts2.Diagnostics.All_destructured_elements_are_unused));
            }
          } else {
            for (var _i = 0, bindingElements_1 = bindingElements; _i < bindingElements_1.length; _i++) {
              var e = bindingElements_1[_i];
              addDiagnostic(e, kind, ts2.createDiagnosticForNode(e, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, bindingNameText(e.name)));
            }
          }
        });
        unusedVariables.forEach(function(_a) {
          var declarationList = _a[0], declarations = _a[1];
          if (declarationList.declarations.length === declarations.length) {
            addDiagnostic(declarationList, 0, declarations.length === 1 ? ts2.createDiagnosticForNode(ts2.first(declarations).name, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, bindingNameText(ts2.first(declarations).name)) : ts2.createDiagnosticForNode(declarationList.parent.kind === 236 ? declarationList.parent : declarationList, ts2.Diagnostics.All_variables_are_unused));
          } else {
            for (var _i = 0, declarations_5 = declarations; _i < declarations_5.length; _i++) {
              var decl = declarations_5[_i];
              addDiagnostic(decl, 0, ts2.createDiagnosticForNode(decl, ts2.Diagnostics._0_is_declared_but_its_value_is_never_read, bindingNameText(decl.name)));
            }
          }
        });
      }
      function bindingNameText(name) {
        switch (name.kind) {
          case 79:
            return ts2.idText(name);
          case 201:
          case 200:
            return bindingNameText(ts2.cast(ts2.first(name.elements), ts2.isBindingElement).name);
          default:
            return ts2.Debug.assertNever(name);
        }
      }
      function isImportedDeclaration(node) {
        return node.kind === 266 || node.kind === 269 || node.kind === 267;
      }
      function importClauseFromImported(decl) {
        return decl.kind === 266 ? decl : decl.kind === 267 ? decl.parent : decl.parent.parent;
      }
      function checkBlock(node) {
        if (node.kind === 234) {
          checkGrammarStatementInAmbientContext(node);
        }
        if (ts2.isFunctionOrModuleBlock(node)) {
          var saveFlowAnalysisDisabled = flowAnalysisDisabled;
          ts2.forEach(node.statements, checkSourceElement);
          flowAnalysisDisabled = saveFlowAnalysisDisabled;
        } else {
          ts2.forEach(node.statements, checkSourceElement);
        }
        if (node.locals) {
          registerForUnusedIdentifiersCheck(node);
        }
      }
      function checkCollisionWithArgumentsInGeneratedCode(node) {
        if (languageVersion >= 2 || !ts2.hasRestParameter(node) || node.flags & 8388608 || ts2.nodeIsMissing(node.body)) {
          return;
        }
        ts2.forEach(node.parameters, function(p) {
          if (p.name && !ts2.isBindingPattern(p.name) && p.name.escapedText === argumentsSymbol.escapedName) {
            errorSkippedOn("noEmit", p, ts2.Diagnostics.Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters);
          }
        });
      }
      function needCollisionCheckForIdentifier(node, identifier, name) {
        if ((identifier === null || identifier === void 0 ? void 0 : identifier.escapedText) !== name) {
          return false;
        }
        if (node.kind === 166 || node.kind === 165 || node.kind === 168 || node.kind === 167 || node.kind === 171 || node.kind === 172 || node.kind === 294) {
          return false;
        }
        if (node.flags & 8388608) {
          return false;
        }
        if (ts2.isImportClause(node) || ts2.isImportEqualsDeclaration(node) || ts2.isImportSpecifier(node)) {
          if (ts2.isTypeOnlyImportOrExportDeclaration(node)) {
            return false;
          }
        }
        var root = ts2.getRootDeclaration(node);
        if (ts2.isParameter(root) && ts2.nodeIsMissing(root.parent.body)) {
          return false;
        }
        return true;
      }
      function checkIfThisIsCapturedInEnclosingScope(node) {
        ts2.findAncestor(node, function(current) {
          if (getNodeCheckFlags(current) & 4) {
            var isDeclaration_1 = node.kind !== 79;
            if (isDeclaration_1) {
              error(ts2.getNameOfDeclaration(node), ts2.Diagnostics.Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference);
            } else {
              error(node, ts2.Diagnostics.Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference);
            }
            return true;
          }
          return false;
        });
      }
      function checkIfNewTargetIsCapturedInEnclosingScope(node) {
        ts2.findAncestor(node, function(current) {
          if (getNodeCheckFlags(current) & 8) {
            var isDeclaration_2 = node.kind !== 79;
            if (isDeclaration_2) {
              error(ts2.getNameOfDeclaration(node), ts2.Diagnostics.Duplicate_identifier_newTarget_Compiler_uses_variable_declaration_newTarget_to_capture_new_target_meta_property_reference);
            } else {
              error(node, ts2.Diagnostics.Expression_resolves_to_variable_declaration_newTarget_that_compiler_uses_to_capture_new_target_meta_property_reference);
            }
            return true;
          }
          return false;
        });
      }
      function checkCollisionWithRequireExportsInGeneratedCode(node, name) {
        if (moduleKind >= ts2.ModuleKind.ES2015 && !(moduleKind >= ts2.ModuleKind.Node12 && ts2.getSourceFileOfNode(node).impliedNodeFormat === ts2.ModuleKind.CommonJS)) {
          return;
        }
        if (!name || !needCollisionCheckForIdentifier(node, name, "require") && !needCollisionCheckForIdentifier(node, name, "exports")) {
          return;
        }
        if (ts2.isModuleDeclaration(node) && ts2.getModuleInstanceState(node) !== 1) {
          return;
        }
        var parent = getDeclarationContainer(node);
        if (parent.kind === 303 && ts2.isExternalOrCommonJsModule(parent)) {
          errorSkippedOn("noEmit", name, ts2.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module, ts2.declarationNameToString(name), ts2.declarationNameToString(name));
        }
      }
      function checkCollisionWithGlobalPromiseInGeneratedCode(node, name) {
        if (!name || languageVersion >= 4 || !needCollisionCheckForIdentifier(node, name, "Promise")) {
          return;
        }
        if (ts2.isModuleDeclaration(node) && ts2.getModuleInstanceState(node) !== 1) {
          return;
        }
        var parent = getDeclarationContainer(node);
        if (parent.kind === 303 && ts2.isExternalOrCommonJsModule(parent) && parent.flags & 2048) {
          errorSkippedOn("noEmit", name, ts2.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_functions, ts2.declarationNameToString(name), ts2.declarationNameToString(name));
        }
      }
      function recordPotentialCollisionWithWeakMapSetInGeneratedCode(node, name) {
        if (languageVersion <= 8 && (needCollisionCheckForIdentifier(node, name, "WeakMap") || needCollisionCheckForIdentifier(node, name, "WeakSet"))) {
          potentialWeakMapSetCollisions.push(node);
        }
      }
      function checkWeakMapSetCollision(node) {
        var enclosingBlockScope = ts2.getEnclosingBlockScopeContainer(node);
        if (getNodeCheckFlags(enclosingBlockScope) & 67108864) {
          ts2.Debug.assert(ts2.isNamedDeclaration(node) && ts2.isIdentifier(node.name) && typeof node.name.escapedText === "string", "The target of a WeakMap/WeakSet collision check should be an identifier");
          errorSkippedOn("noEmit", node, ts2.Diagnostics.Compiler_reserves_name_0_when_emitting_private_identifier_downlevel, node.name.escapedText);
        }
      }
      function recordPotentialCollisionWithReflectInGeneratedCode(node, name) {
        if (name && languageVersion >= 2 && languageVersion <= 8 && needCollisionCheckForIdentifier(node, name, "Reflect")) {
          potentialReflectCollisions.push(node);
        }
      }
      function checkReflectCollision(node) {
        var hasCollision = false;
        if (ts2.isClassExpression(node)) {
          for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
            var member = _a[_i];
            if (getNodeCheckFlags(member) & 134217728) {
              hasCollision = true;
              break;
            }
          }
        } else if (ts2.isFunctionExpression(node)) {
          if (getNodeCheckFlags(node) & 134217728) {
            hasCollision = true;
          }
        } else {
          var container = ts2.getEnclosingBlockScopeContainer(node);
          if (container && getNodeCheckFlags(container) & 134217728) {
            hasCollision = true;
          }
        }
        if (hasCollision) {
          ts2.Debug.assert(ts2.isNamedDeclaration(node) && ts2.isIdentifier(node.name), "The target of a Reflect collision check should be an identifier");
          errorSkippedOn("noEmit", node, ts2.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_when_emitting_super_references_in_static_initializers, ts2.declarationNameToString(node.name), "Reflect");
        }
      }
      function checkCollisionsForDeclarationName(node, name) {
        if (!name)
          return;
        checkCollisionWithRequireExportsInGeneratedCode(node, name);
        checkCollisionWithGlobalPromiseInGeneratedCode(node, name);
        recordPotentialCollisionWithWeakMapSetInGeneratedCode(node, name);
        recordPotentialCollisionWithReflectInGeneratedCode(node, name);
        if (ts2.isClassLike(node)) {
          checkTypeNameIsReserved(name, ts2.Diagnostics.Class_name_cannot_be_0);
          if (!(node.flags & 8388608)) {
            checkClassNameCollisionWithObject(name);
          }
        } else if (ts2.isEnumDeclaration(node)) {
          checkTypeNameIsReserved(name, ts2.Diagnostics.Enum_name_cannot_be_0);
        }
      }
      function checkVarDeclaredNamesNotShadowed(node) {
        if ((ts2.getCombinedNodeFlags(node) & 3) !== 0 || ts2.isParameterDeclaration(node)) {
          return;
        }
        if (node.kind === 253 && !node.initializer) {
          return;
        }
        var symbol = getSymbolOfNode(node);
        if (symbol.flags & 1) {
          if (!ts2.isIdentifier(node.name))
            return ts2.Debug.fail();
          var localDeclarationSymbol = resolveName(node, node.name.escapedText, 3, void 0, void 0, false);
          if (localDeclarationSymbol && localDeclarationSymbol !== symbol && localDeclarationSymbol.flags & 2) {
            if (getDeclarationNodeFlagsFromSymbol(localDeclarationSymbol) & 3) {
              var varDeclList = ts2.getAncestor(localDeclarationSymbol.valueDeclaration, 254);
              var container = varDeclList.parent.kind === 236 && varDeclList.parent.parent ? varDeclList.parent.parent : void 0;
              var namesShareScope = container && (container.kind === 234 && ts2.isFunctionLike(container.parent) || container.kind === 261 || container.kind === 260 || container.kind === 303);
              if (!namesShareScope) {
                var name = symbolToString(localDeclarationSymbol);
                error(node, ts2.Diagnostics.Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1, name, name);
              }
            }
          }
        }
      }
      function convertAutoToAny(type) {
        return type === autoType ? anyType : type === autoArrayType ? anyArrayType : type;
      }
      function checkVariableLikeDeclaration(node) {
        var _a;
        checkDecorators(node);
        if (!ts2.isBindingElement(node)) {
          checkSourceElement(node.type);
        }
        if (!node.name) {
          return;
        }
        if (node.name.kind === 161) {
          checkComputedPropertyName(node.name);
          if (node.initializer) {
            checkExpressionCached(node.initializer);
          }
        }
        if (ts2.isBindingElement(node)) {
          if (ts2.isObjectBindingPattern(node.parent) && node.dotDotDotToken && languageVersion < 5) {
            checkExternalEmitHelpers(node, 4);
          }
          if (node.propertyName && node.propertyName.kind === 161) {
            checkComputedPropertyName(node.propertyName);
          }
          var parent = node.parent.parent;
          var parentType = getTypeForBindingElementParent(parent);
          var name = node.propertyName || node.name;
          if (parentType && !ts2.isBindingPattern(name)) {
            var exprType = getLiteralTypeFromPropertyName(name);
            if (isTypeUsableAsPropertyName(exprType)) {
              var nameText = getPropertyNameFromType(exprType);
              var property = getPropertyOfType(parentType, nameText);
              if (property) {
                markPropertyAsReferenced(property, void 0, false);
                checkPropertyAccessibility(node, !!parent.initializer && parent.initializer.kind === 106, false, parentType, property);
              }
            }
          }
        }
        if (ts2.isBindingPattern(node.name)) {
          if (node.name.kind === 201 && languageVersion < 2 && compilerOptions.downlevelIteration) {
            checkExternalEmitHelpers(node, 512);
          }
          ts2.forEach(node.name.elements, checkSourceElement);
        }
        if (node.initializer && ts2.isParameterDeclaration(node) && ts2.nodeIsMissing(ts2.getContainingFunction(node).body)) {
          error(node, ts2.Diagnostics.A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation);
          return;
        }
        if (ts2.isBindingPattern(node.name)) {
          var needCheckInitializer = node.initializer && node.parent.parent.kind !== 242;
          var needCheckWidenedType = node.name.elements.length === 0;
          if (needCheckInitializer || needCheckWidenedType) {
            var widenedType = getWidenedTypeForVariableLikeDeclaration(node);
            if (needCheckInitializer) {
              var initializerType = checkExpressionCached(node.initializer);
              if (strictNullChecks && needCheckWidenedType) {
                checkNonNullNonVoidType(initializerType, node);
              } else {
                checkTypeAssignableToAndOptionallyElaborate(initializerType, getWidenedTypeForVariableLikeDeclaration(node), node, node.initializer);
              }
            }
            if (needCheckWidenedType) {
              if (ts2.isArrayBindingPattern(node.name)) {
                checkIteratedTypeOrElementType(65, widenedType, undefinedType, node);
              } else if (strictNullChecks) {
                checkNonNullNonVoidType(widenedType, node);
              }
            }
          }
          return;
        }
        var symbol = getSymbolOfNode(node);
        if (symbol.flags & 2097152 && ts2.isVariableDeclarationInitializedToBareOrAccessedRequire(node)) {
          checkAliasSymbol(node);
          return;
        }
        var type = convertAutoToAny(getTypeOfSymbol(symbol));
        if (node === symbol.valueDeclaration) {
          var initializer = ts2.getEffectiveInitializer(node);
          if (initializer) {
            var isJSObjectLiteralInitializer = ts2.isInJSFile(node) && ts2.isObjectLiteralExpression(initializer) && (initializer.properties.length === 0 || ts2.isPrototypeAccess(node.name)) && !!((_a = symbol.exports) === null || _a === void 0 ? void 0 : _a.size);
            if (!isJSObjectLiteralInitializer && node.parent.parent.kind !== 242) {
              checkTypeAssignableToAndOptionallyElaborate(checkExpressionCached(initializer), type, node, initializer, void 0);
            }
          }
          if (symbol.declarations && symbol.declarations.length > 1) {
            if (ts2.some(symbol.declarations, function(d) {
              return d !== node && ts2.isVariableLike(d) && !areDeclarationFlagsIdentical(d, node);
            })) {
              error(node.name, ts2.Diagnostics.All_declarations_of_0_must_have_identical_modifiers, ts2.declarationNameToString(node.name));
            }
          }
        } else {
          var declarationType = convertAutoToAny(getWidenedTypeForVariableLikeDeclaration(node));
          if (!isErrorType(type) && !isErrorType(declarationType) && !isTypeIdenticalTo(type, declarationType) && !(symbol.flags & 67108864)) {
            errorNextVariableOrPropertyDeclarationMustHaveSameType(symbol.valueDeclaration, type, node, declarationType);
          }
          if (node.initializer) {
            checkTypeAssignableToAndOptionallyElaborate(checkExpressionCached(node.initializer), declarationType, node, node.initializer, void 0);
          }
          if (symbol.valueDeclaration && !areDeclarationFlagsIdentical(node, symbol.valueDeclaration)) {
            error(node.name, ts2.Diagnostics.All_declarations_of_0_must_have_identical_modifiers, ts2.declarationNameToString(node.name));
          }
        }
        if (node.kind !== 166 && node.kind !== 165) {
          checkExportsOnMergedDeclarations(node);
          if (node.kind === 253 || node.kind === 202) {
            checkVarDeclaredNamesNotShadowed(node);
          }
          checkCollisionsForDeclarationName(node, node.name);
        }
      }
      function errorNextVariableOrPropertyDeclarationMustHaveSameType(firstDeclaration, firstType, nextDeclaration, nextType) {
        var nextDeclarationName = ts2.getNameOfDeclaration(nextDeclaration);
        var message = nextDeclaration.kind === 166 || nextDeclaration.kind === 165 ? ts2.Diagnostics.Subsequent_property_declarations_must_have_the_same_type_Property_0_must_be_of_type_1_but_here_has_type_2 : ts2.Diagnostics.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2;
        var declName = ts2.declarationNameToString(nextDeclarationName);
        var err = error(nextDeclarationName, message, declName, typeToString(firstType), typeToString(nextType));
        if (firstDeclaration) {
          ts2.addRelatedInfo(err, ts2.createDiagnosticForNode(firstDeclaration, ts2.Diagnostics._0_was_also_declared_here, declName));
        }
      }
      function areDeclarationFlagsIdentical(left, right) {
        if (left.kind === 163 && right.kind === 253 || left.kind === 253 && right.kind === 163) {
          return true;
        }
        if (ts2.hasQuestionToken(left) !== ts2.hasQuestionToken(right)) {
          return false;
        }
        var interestingFlags = 8 | 16 | 256 | 128 | 64 | 32;
        return ts2.getSelectedEffectiveModifierFlags(left, interestingFlags) === ts2.getSelectedEffectiveModifierFlags(right, interestingFlags);
      }
      function checkVariableDeclaration(node) {
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("check", "checkVariableDeclaration", { kind: node.kind, pos: node.pos, end: node.end });
        checkGrammarVariableDeclaration(node);
        checkVariableLikeDeclaration(node);
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      }
      function checkBindingElement(node) {
        checkGrammarBindingElement(node);
        return checkVariableLikeDeclaration(node);
      }
      function checkVariableStatement(node) {
        if (!checkGrammarDecoratorsAndModifiers(node) && !checkGrammarVariableDeclarationList(node.declarationList))
          checkGrammarForDisallowedLetOrConstStatement(node);
        ts2.forEach(node.declarationList.declarations, checkSourceElement);
      }
      function checkExpressionStatement(node) {
        checkGrammarStatementInAmbientContext(node);
        checkExpression(node.expression);
      }
      function checkIfStatement(node) {
        checkGrammarStatementInAmbientContext(node);
        var type = checkTruthinessExpression(node.expression);
        checkTestingKnownTruthyCallableOrAwaitableType(node.expression, type, node.thenStatement);
        checkSourceElement(node.thenStatement);
        if (node.thenStatement.kind === 235) {
          error(node.thenStatement, ts2.Diagnostics.The_body_of_an_if_statement_cannot_be_the_empty_statement);
        }
        checkSourceElement(node.elseStatement);
      }
      function checkTestingKnownTruthyCallableOrAwaitableType(condExpr, type, body) {
        if (!strictNullChecks)
          return;
        if (getFalsyFlags(type))
          return;
        var location = ts2.isBinaryExpression(condExpr) ? condExpr.right : condExpr;
        if (ts2.isPropertyAccessExpression(location) && isTypeAssertion(location.expression)) {
          return;
        }
        var testedNode = ts2.isIdentifier(location) ? location : ts2.isPropertyAccessExpression(location) ? location.name : ts2.isBinaryExpression(location) && ts2.isIdentifier(location.right) ? location.right : void 0;
        var callSignatures = getSignaturesOfType(type, 0);
        var isPromise = !!getAwaitedTypeOfPromise(type);
        if (callSignatures.length === 0 && !isPromise) {
          return;
        }
        var testedSymbol = testedNode && getSymbolAtLocation(testedNode);
        if (!testedSymbol && !isPromise) {
          return;
        }
        var isUsed = testedSymbol && ts2.isBinaryExpression(condExpr.parent) && isSymbolUsedInBinaryExpressionChain(condExpr.parent, testedSymbol) || testedSymbol && body && isSymbolUsedInConditionBody(condExpr, body, testedNode, testedSymbol);
        if (!isUsed) {
          if (isPromise) {
            errorAndMaybeSuggestAwait(location, true, ts2.Diagnostics.This_condition_will_always_return_true_since_this_0_is_always_defined, getTypeNameForErrorDisplay(type));
          } else {
            error(location, ts2.Diagnostics.This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead);
          }
        }
      }
      function isSymbolUsedInConditionBody(expr, body, testedNode, testedSymbol) {
        return !!ts2.forEachChild(body, function check(childNode) {
          if (ts2.isIdentifier(childNode)) {
            var childSymbol = getSymbolAtLocation(childNode);
            if (childSymbol && childSymbol === testedSymbol) {
              if (ts2.isIdentifier(expr)) {
                return true;
              }
              var testedExpression = testedNode.parent;
              var childExpression = childNode.parent;
              while (testedExpression && childExpression) {
                if (ts2.isIdentifier(testedExpression) && ts2.isIdentifier(childExpression) || testedExpression.kind === 108 && childExpression.kind === 108) {
                  return getSymbolAtLocation(testedExpression) === getSymbolAtLocation(childExpression);
                } else if (ts2.isPropertyAccessExpression(testedExpression) && ts2.isPropertyAccessExpression(childExpression)) {
                  if (getSymbolAtLocation(testedExpression.name) !== getSymbolAtLocation(childExpression.name)) {
                    return false;
                  }
                  childExpression = childExpression.expression;
                  testedExpression = testedExpression.expression;
                } else if (ts2.isCallExpression(testedExpression) && ts2.isCallExpression(childExpression)) {
                  childExpression = childExpression.expression;
                  testedExpression = testedExpression.expression;
                } else {
                  return false;
                }
              }
            }
          }
          return ts2.forEachChild(childNode, check);
        });
      }
      function isSymbolUsedInBinaryExpressionChain(node, testedSymbol) {
        while (ts2.isBinaryExpression(node) && node.operatorToken.kind === 55) {
          var isUsed = ts2.forEachChild(node.right, function visit(child) {
            if (ts2.isIdentifier(child)) {
              var symbol = getSymbolAtLocation(child);
              if (symbol && symbol === testedSymbol) {
                return true;
              }
            }
            return ts2.forEachChild(child, visit);
          });
          if (isUsed) {
            return true;
          }
          node = node.parent;
        }
        return false;
      }
      function checkDoStatement(node) {
        checkGrammarStatementInAmbientContext(node);
        checkSourceElement(node.statement);
        checkTruthinessExpression(node.expression);
      }
      function checkWhileStatement(node) {
        checkGrammarStatementInAmbientContext(node);
        checkTruthinessExpression(node.expression);
        checkSourceElement(node.statement);
      }
      function checkTruthinessOfType(type, node) {
        if (type.flags & 16384) {
          error(node, ts2.Diagnostics.An_expression_of_type_void_cannot_be_tested_for_truthiness);
        }
        return type;
      }
      function checkTruthinessExpression(node, checkMode) {
        return checkTruthinessOfType(checkExpression(node, checkMode), node);
      }
      function checkForStatement(node) {
        if (!checkGrammarStatementInAmbientContext(node)) {
          if (node.initializer && node.initializer.kind === 254) {
            checkGrammarVariableDeclarationList(node.initializer);
          }
        }
        if (node.initializer) {
          if (node.initializer.kind === 254) {
            ts2.forEach(node.initializer.declarations, checkVariableDeclaration);
          } else {
            checkExpression(node.initializer);
          }
        }
        if (node.condition)
          checkTruthinessExpression(node.condition);
        if (node.incrementor)
          checkExpression(node.incrementor);
        checkSourceElement(node.statement);
        if (node.locals) {
          registerForUnusedIdentifiersCheck(node);
        }
      }
      function checkForOfStatement(node) {
        checkGrammarForInOrForOfStatement(node);
        var container = ts2.getContainingFunctionOrClassStaticBlock(node);
        if (node.awaitModifier) {
          if (container && ts2.isClassStaticBlockDeclaration(container)) {
            grammarErrorOnNode(node.awaitModifier, ts2.Diagnostics.For_await_loops_cannot_be_used_inside_a_class_static_block);
          } else {
            var functionFlags = ts2.getFunctionFlags(container);
            if ((functionFlags & (4 | 2)) === 2 && languageVersion < 99) {
              checkExternalEmitHelpers(node, 16384);
            }
          }
        } else if (compilerOptions.downlevelIteration && languageVersion < 2) {
          checkExternalEmitHelpers(node, 256);
        }
        if (node.initializer.kind === 254) {
          checkForInOrForOfVariableDeclaration(node);
        } else {
          var varExpr = node.initializer;
          var iteratedType = checkRightHandSideOfForOf(node);
          if (varExpr.kind === 203 || varExpr.kind === 204) {
            checkDestructuringAssignment(varExpr, iteratedType || errorType);
          } else {
            var leftType = checkExpression(varExpr);
            checkReferenceExpression(varExpr, ts2.Diagnostics.The_left_hand_side_of_a_for_of_statement_must_be_a_variable_or_a_property_access, ts2.Diagnostics.The_left_hand_side_of_a_for_of_statement_may_not_be_an_optional_property_access);
            if (iteratedType) {
              checkTypeAssignableToAndOptionallyElaborate(iteratedType, leftType, varExpr, node.expression);
            }
          }
        }
        checkSourceElement(node.statement);
        if (node.locals) {
          registerForUnusedIdentifiersCheck(node);
        }
      }
      function checkForInStatement(node) {
        checkGrammarForInOrForOfStatement(node);
        var rightType = getNonNullableTypeIfNeeded(checkExpression(node.expression));
        if (node.initializer.kind === 254) {
          var variable = node.initializer.declarations[0];
          if (variable && ts2.isBindingPattern(variable.name)) {
            error(variable.name, ts2.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
          }
          checkForInOrForOfVariableDeclaration(node);
        } else {
          var varExpr = node.initializer;
          var leftType = checkExpression(varExpr);
          if (varExpr.kind === 203 || varExpr.kind === 204) {
            error(varExpr, ts2.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
          } else if (!isTypeAssignableTo(getIndexTypeOrString(rightType), leftType)) {
            error(varExpr, ts2.Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any);
          } else {
            checkReferenceExpression(varExpr, ts2.Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_a_variable_or_a_property_access, ts2.Diagnostics.The_left_hand_side_of_a_for_in_statement_may_not_be_an_optional_property_access);
          }
        }
        if (rightType === neverType || !isTypeAssignableToKind(rightType, 67108864 | 58982400)) {
          error(node.expression, ts2.Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_but_here_has_type_0, typeToString(rightType));
        }
        checkSourceElement(node.statement);
        if (node.locals) {
          registerForUnusedIdentifiersCheck(node);
        }
      }
      function checkForInOrForOfVariableDeclaration(iterationStatement) {
        var variableDeclarationList = iterationStatement.initializer;
        if (variableDeclarationList.declarations.length >= 1) {
          var decl = variableDeclarationList.declarations[0];
          checkVariableDeclaration(decl);
        }
      }
      function checkRightHandSideOfForOf(statement) {
        var use = statement.awaitModifier ? 15 : 13;
        return checkIteratedTypeOrElementType(use, checkNonNullExpression(statement.expression), undefinedType, statement.expression);
      }
      function checkIteratedTypeOrElementType(use, inputType, sentType, errorNode) {
        if (isTypeAny(inputType)) {
          return inputType;
        }
        return getIteratedTypeOrElementType(use, inputType, sentType, errorNode, true) || anyType;
      }
      function getIteratedTypeOrElementType(use, inputType, sentType, errorNode, checkAssignability) {
        var allowAsyncIterables = (use & 2) !== 0;
        if (inputType === neverType) {
          reportTypeNotIterableError(errorNode, inputType, allowAsyncIterables);
          return void 0;
        }
        var uplevelIteration = languageVersion >= 2;
        var downlevelIteration = !uplevelIteration && compilerOptions.downlevelIteration;
        var possibleOutOfBounds = compilerOptions.noUncheckedIndexedAccess && !!(use & 128);
        if (uplevelIteration || downlevelIteration || allowAsyncIterables) {
          var iterationTypes = getIterationTypesOfIterable(inputType, use, uplevelIteration ? errorNode : void 0);
          if (checkAssignability) {
            if (iterationTypes) {
              var diagnostic = use & 8 ? ts2.Diagnostics.Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_for_of_will_always_send_0 : use & 32 ? ts2.Diagnostics.Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_spread_will_always_send_0 : use & 64 ? ts2.Diagnostics.Cannot_iterate_value_because_the_next_method_of_its_iterator_expects_type_1_but_array_destructuring_will_always_send_0 : use & 16 ? ts2.Diagnostics.Cannot_delegate_iteration_to_value_because_the_next_method_of_its_iterator_expects_type_1_but_the_containing_generator_will_always_send_0 : void 0;
              if (diagnostic) {
                checkTypeAssignableTo(sentType, iterationTypes.nextType, errorNode, diagnostic);
              }
            }
          }
          if (iterationTypes || uplevelIteration) {
            return possibleOutOfBounds ? includeUndefinedInIndexSignature(iterationTypes && iterationTypes.yieldType) : iterationTypes && iterationTypes.yieldType;
          }
        }
        var arrayType = inputType;
        var reportedError = false;
        var hasStringConstituent = false;
        if (use & 4) {
          if (arrayType.flags & 1048576) {
            var arrayTypes = inputType.types;
            var filteredTypes = ts2.filter(arrayTypes, function(t) {
              return !(t.flags & 402653316);
            });
            if (filteredTypes !== arrayTypes) {
              arrayType = getUnionType(filteredTypes, 2);
            }
          } else if (arrayType.flags & 402653316) {
            arrayType = neverType;
          }
          hasStringConstituent = arrayType !== inputType;
          if (hasStringConstituent) {
            if (languageVersion < 1) {
              if (errorNode) {
                error(errorNode, ts2.Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher);
                reportedError = true;
              }
            }
            if (arrayType.flags & 131072) {
              return possibleOutOfBounds ? includeUndefinedInIndexSignature(stringType) : stringType;
            }
          }
        }
        if (!isArrayLikeType(arrayType)) {
          if (errorNode && !reportedError) {
            var allowsStrings = !!(use & 4) && !hasStringConstituent;
            var _a = getIterationDiagnosticDetails(allowsStrings, downlevelIteration), defaultDiagnostic = _a[0], maybeMissingAwait = _a[1];
            errorAndMaybeSuggestAwait(errorNode, maybeMissingAwait && !!getAwaitedTypeOfPromise(arrayType), defaultDiagnostic, typeToString(arrayType));
          }
          return hasStringConstituent ? possibleOutOfBounds ? includeUndefinedInIndexSignature(stringType) : stringType : void 0;
        }
        var arrayElementType = getIndexTypeOfType(arrayType, numberType);
        if (hasStringConstituent && arrayElementType) {
          if (arrayElementType.flags & 402653316 && !compilerOptions.noUncheckedIndexedAccess) {
            return stringType;
          }
          return getUnionType(possibleOutOfBounds ? [arrayElementType, stringType, undefinedType] : [arrayElementType, stringType], 2);
        }
        return use & 128 ? includeUndefinedInIndexSignature(arrayElementType) : arrayElementType;
        function getIterationDiagnosticDetails(allowsStrings2, downlevelIteration2) {
          var _a2;
          if (downlevelIteration2) {
            return allowsStrings2 ? [ts2.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator, true] : [ts2.Diagnostics.Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator, true];
          }
          var yieldType = getIterationTypeOfIterable(use, 0, inputType, void 0);
          if (yieldType) {
            return [ts2.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type_Use_compiler_option_downlevelIteration_to_allow_iterating_of_iterators, false];
          }
          if (isES2015OrLaterIterable((_a2 = inputType.symbol) === null || _a2 === void 0 ? void 0 : _a2.escapedName)) {
            return [ts2.Diagnostics.Type_0_can_only_be_iterated_through_when_using_the_downlevelIteration_flag_or_with_a_target_of_es2015_or_higher, true];
          }
          return allowsStrings2 ? [ts2.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type, true] : [ts2.Diagnostics.Type_0_is_not_an_array_type, true];
        }
      }
      function isES2015OrLaterIterable(n) {
        switch (n) {
          case "Float32Array":
          case "Float64Array":
          case "Int16Array":
          case "Int32Array":
          case "Int8Array":
          case "NodeList":
          case "Uint16Array":
          case "Uint32Array":
          case "Uint8Array":
          case "Uint8ClampedArray":
            return true;
        }
        return false;
      }
      function getIterationTypeOfIterable(use, typeKind, inputType, errorNode) {
        if (isTypeAny(inputType)) {
          return void 0;
        }
        var iterationTypes = getIterationTypesOfIterable(inputType, use, errorNode);
        return iterationTypes && iterationTypes[getIterationTypesKeyFromIterationTypeKind(typeKind)];
      }
      function createIterationTypes(yieldType, returnType, nextType) {
        if (yieldType === void 0) {
          yieldType = neverType;
        }
        if (returnType === void 0) {
          returnType = neverType;
        }
        if (nextType === void 0) {
          nextType = unknownType;
        }
        if (yieldType.flags & 67359327 && returnType.flags & (1 | 131072 | 2 | 16384 | 32768) && nextType.flags & (1 | 131072 | 2 | 16384 | 32768)) {
          var id = getTypeListId([yieldType, returnType, nextType]);
          var iterationTypes = iterationTypesCache.get(id);
          if (!iterationTypes) {
            iterationTypes = { yieldType, returnType, nextType };
            iterationTypesCache.set(id, iterationTypes);
          }
          return iterationTypes;
        }
        return { yieldType, returnType, nextType };
      }
      function combineIterationTypes(array) {
        var yieldTypes;
        var returnTypes;
        var nextTypes;
        for (var _i = 0, array_11 = array; _i < array_11.length; _i++) {
          var iterationTypes = array_11[_i];
          if (iterationTypes === void 0 || iterationTypes === noIterationTypes) {
            continue;
          }
          if (iterationTypes === anyIterationTypes) {
            return anyIterationTypes;
          }
          yieldTypes = ts2.append(yieldTypes, iterationTypes.yieldType);
          returnTypes = ts2.append(returnTypes, iterationTypes.returnType);
          nextTypes = ts2.append(nextTypes, iterationTypes.nextType);
        }
        if (yieldTypes || returnTypes || nextTypes) {
          return createIterationTypes(yieldTypes && getUnionType(yieldTypes), returnTypes && getUnionType(returnTypes), nextTypes && getIntersectionType(nextTypes));
        }
        return noIterationTypes;
      }
      function getCachedIterationTypes(type, cacheKey) {
        return type[cacheKey];
      }
      function setCachedIterationTypes(type, cacheKey, cachedTypes) {
        return type[cacheKey] = cachedTypes;
      }
      function getIterationTypesOfIterable(type, use, errorNode) {
        if (isTypeAny(type)) {
          return anyIterationTypes;
        }
        if (!(type.flags & 1048576)) {
          var iterationTypes_1 = getIterationTypesOfIterableWorker(type, use, errorNode);
          if (iterationTypes_1 === noIterationTypes) {
            if (errorNode) {
              reportTypeNotIterableError(errorNode, type, !!(use & 2));
            }
            return void 0;
          }
          return iterationTypes_1;
        }
        var cacheKey = use & 2 ? "iterationTypesOfAsyncIterable" : "iterationTypesOfIterable";
        var cachedTypes = getCachedIterationTypes(type, cacheKey);
        if (cachedTypes)
          return cachedTypes === noIterationTypes ? void 0 : cachedTypes;
        var allIterationTypes;
        for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
          var constituent = _a[_i];
          var iterationTypes_2 = getIterationTypesOfIterableWorker(constituent, use, errorNode);
          if (iterationTypes_2 === noIterationTypes) {
            if (errorNode) {
              reportTypeNotIterableError(errorNode, type, !!(use & 2));
            }
            setCachedIterationTypes(type, cacheKey, noIterationTypes);
            return void 0;
          } else {
            allIterationTypes = ts2.append(allIterationTypes, iterationTypes_2);
          }
        }
        var iterationTypes = allIterationTypes ? combineIterationTypes(allIterationTypes) : noIterationTypes;
        setCachedIterationTypes(type, cacheKey, iterationTypes);
        return iterationTypes === noIterationTypes ? void 0 : iterationTypes;
      }
      function getAsyncFromSyncIterationTypes(iterationTypes, errorNode) {
        if (iterationTypes === noIterationTypes)
          return noIterationTypes;
        if (iterationTypes === anyIterationTypes)
          return anyIterationTypes;
        var yieldType = iterationTypes.yieldType, returnType = iterationTypes.returnType, nextType = iterationTypes.nextType;
        if (errorNode) {
          getGlobalAwaitedSymbol(true);
        }
        return createIterationTypes(getAwaitedType(yieldType, errorNode) || anyType, getAwaitedType(returnType, errorNode) || anyType, nextType);
      }
      function getIterationTypesOfIterableWorker(type, use, errorNode) {
        if (isTypeAny(type)) {
          return anyIterationTypes;
        }
        if (use & 2) {
          var iterationTypes = getIterationTypesOfIterableCached(type, asyncIterationTypesResolver) || getIterationTypesOfIterableFast(type, asyncIterationTypesResolver);
          if (iterationTypes) {
            return use & 8 ? getAsyncFromSyncIterationTypes(iterationTypes, errorNode) : iterationTypes;
          }
        }
        if (use & 1) {
          var iterationTypes = getIterationTypesOfIterableCached(type, syncIterationTypesResolver) || getIterationTypesOfIterableFast(type, syncIterationTypesResolver);
          if (iterationTypes) {
            if (use & 2) {
              if (iterationTypes !== noIterationTypes) {
                return setCachedIterationTypes(type, "iterationTypesOfAsyncIterable", getAsyncFromSyncIterationTypes(iterationTypes, errorNode));
              }
            } else {
              return iterationTypes;
            }
          }
        }
        if (use & 2) {
          var iterationTypes = getIterationTypesOfIterableSlow(type, asyncIterationTypesResolver, errorNode);
          if (iterationTypes !== noIterationTypes) {
            return iterationTypes;
          }
        }
        if (use & 1) {
          var iterationTypes = getIterationTypesOfIterableSlow(type, syncIterationTypesResolver, errorNode);
          if (iterationTypes !== noIterationTypes) {
            if (use & 2) {
              return setCachedIterationTypes(type, "iterationTypesOfAsyncIterable", iterationTypes ? getAsyncFromSyncIterationTypes(iterationTypes, errorNode) : noIterationTypes);
            } else {
              return iterationTypes;
            }
          }
        }
        return noIterationTypes;
      }
      function getIterationTypesOfIterableCached(type, resolver) {
        return getCachedIterationTypes(type, resolver.iterableCacheKey);
      }
      function getIterationTypesOfGlobalIterableType(globalType, resolver) {
        var globalIterationTypes = getIterationTypesOfIterableCached(globalType, resolver) || getIterationTypesOfIterableSlow(globalType, resolver, void 0);
        return globalIterationTypes === noIterationTypes ? defaultIterationTypes : globalIterationTypes;
      }
      function getIterationTypesOfIterableFast(type, resolver) {
        var globalType;
        if (isReferenceToType(type, globalType = resolver.getGlobalIterableType(false)) || isReferenceToType(type, globalType = resolver.getGlobalIterableIteratorType(false))) {
          var yieldType = getTypeArguments(type)[0];
          var _a = getIterationTypesOfGlobalIterableType(globalType, resolver), returnType = _a.returnType, nextType = _a.nextType;
          return setCachedIterationTypes(type, resolver.iterableCacheKey, createIterationTypes(resolver.resolveIterationType(yieldType, void 0) || yieldType, resolver.resolveIterationType(returnType, void 0) || returnType, nextType));
        }
        if (isReferenceToType(type, resolver.getGlobalGeneratorType(false))) {
          var _b = getTypeArguments(type), yieldType = _b[0], returnType = _b[1], nextType = _b[2];
          return setCachedIterationTypes(type, resolver.iterableCacheKey, createIterationTypes(resolver.resolveIterationType(yieldType, void 0) || yieldType, resolver.resolveIterationType(returnType, void 0) || returnType, nextType));
        }
      }
      function getPropertyNameForKnownSymbolName(symbolName) {
        var ctorType = getGlobalESSymbolConstructorSymbol(false);
        var uniqueType = ctorType && getTypeOfPropertyOfType(getTypeOfSymbol(ctorType), ts2.escapeLeadingUnderscores(symbolName));
        return uniqueType && isTypeUsableAsPropertyName(uniqueType) ? getPropertyNameFromType(uniqueType) : "__@".concat(symbolName);
      }
      function getIterationTypesOfIterableSlow(type, resolver, errorNode) {
        var _a;
        var method = getPropertyOfType(type, getPropertyNameForKnownSymbolName(resolver.iteratorSymbolName));
        var methodType = method && !(method.flags & 16777216) ? getTypeOfSymbol(method) : void 0;
        if (isTypeAny(methodType)) {
          return setCachedIterationTypes(type, resolver.iterableCacheKey, anyIterationTypes);
        }
        var signatures = methodType ? getSignaturesOfType(methodType, 0) : void 0;
        if (!ts2.some(signatures)) {
          return setCachedIterationTypes(type, resolver.iterableCacheKey, noIterationTypes);
        }
        var iteratorType = getIntersectionType(ts2.map(signatures, getReturnTypeOfSignature));
        var iterationTypes = (_a = getIterationTypesOfIterator(iteratorType, resolver, errorNode)) !== null && _a !== void 0 ? _a : noIterationTypes;
        return setCachedIterationTypes(type, resolver.iterableCacheKey, iterationTypes);
      }
      function reportTypeNotIterableError(errorNode, type, allowAsyncIterables) {
        var message = allowAsyncIterables ? ts2.Diagnostics.Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator : ts2.Diagnostics.Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator;
        errorAndMaybeSuggestAwait(errorNode, !!getAwaitedTypeOfPromise(type), message, typeToString(type));
      }
      function getIterationTypesOfIterator(type, resolver, errorNode) {
        if (isTypeAny(type)) {
          return anyIterationTypes;
        }
        var iterationTypes = getIterationTypesOfIteratorCached(type, resolver) || getIterationTypesOfIteratorFast(type, resolver) || getIterationTypesOfIteratorSlow(type, resolver, errorNode);
        return iterationTypes === noIterationTypes ? void 0 : iterationTypes;
      }
      function getIterationTypesOfIteratorCached(type, resolver) {
        return getCachedIterationTypes(type, resolver.iteratorCacheKey);
      }
      function getIterationTypesOfIteratorFast(type, resolver) {
        var globalType = resolver.getGlobalIterableIteratorType(false);
        if (isReferenceToType(type, globalType)) {
          var yieldType = getTypeArguments(type)[0];
          var globalIterationTypes = getIterationTypesOfIteratorCached(globalType, resolver) || getIterationTypesOfIteratorSlow(globalType, resolver, void 0);
          var _a = globalIterationTypes === noIterationTypes ? defaultIterationTypes : globalIterationTypes, returnType = _a.returnType, nextType = _a.nextType;
          return setCachedIterationTypes(type, resolver.iteratorCacheKey, createIterationTypes(yieldType, returnType, nextType));
        }
        if (isReferenceToType(type, resolver.getGlobalIteratorType(false)) || isReferenceToType(type, resolver.getGlobalGeneratorType(false))) {
          var _b = getTypeArguments(type), yieldType = _b[0], returnType = _b[1], nextType = _b[2];
          return setCachedIterationTypes(type, resolver.iteratorCacheKey, createIterationTypes(yieldType, returnType, nextType));
        }
      }
      function isIteratorResult(type, kind) {
        var doneType = getTypeOfPropertyOfType(type, "done") || falseType;
        return isTypeAssignableTo(kind === 0 ? falseType : trueType, doneType);
      }
      function isYieldIteratorResult(type) {
        return isIteratorResult(type, 0);
      }
      function isReturnIteratorResult(type) {
        return isIteratorResult(type, 1);
      }
      function getIterationTypesOfIteratorResult(type) {
        if (isTypeAny(type)) {
          return anyIterationTypes;
        }
        var cachedTypes = getCachedIterationTypes(type, "iterationTypesOfIteratorResult");
        if (cachedTypes) {
          return cachedTypes;
        }
        if (isReferenceToType(type, getGlobalIteratorYieldResultType(false))) {
          var yieldType_1 = getTypeArguments(type)[0];
          return setCachedIterationTypes(type, "iterationTypesOfIteratorResult", createIterationTypes(yieldType_1, void 0, void 0));
        }
        if (isReferenceToType(type, getGlobalIteratorReturnResultType(false))) {
          var returnType_1 = getTypeArguments(type)[0];
          return setCachedIterationTypes(type, "iterationTypesOfIteratorResult", createIterationTypes(void 0, returnType_1, void 0));
        }
        var yieldIteratorResult = filterType(type, isYieldIteratorResult);
        var yieldType = yieldIteratorResult !== neverType ? getTypeOfPropertyOfType(yieldIteratorResult, "value") : void 0;
        var returnIteratorResult = filterType(type, isReturnIteratorResult);
        var returnType = returnIteratorResult !== neverType ? getTypeOfPropertyOfType(returnIteratorResult, "value") : void 0;
        if (!yieldType && !returnType) {
          return setCachedIterationTypes(type, "iterationTypesOfIteratorResult", noIterationTypes);
        }
        return setCachedIterationTypes(type, "iterationTypesOfIteratorResult", createIterationTypes(yieldType, returnType || voidType, void 0));
      }
      function getIterationTypesOfMethod(type, resolver, methodName, errorNode) {
        var _a, _b, _c, _d;
        var method = getPropertyOfType(type, methodName);
        if (!method && methodName !== "next") {
          return void 0;
        }
        var methodType = method && !(methodName === "next" && method.flags & 16777216) ? methodName === "next" ? getTypeOfSymbol(method) : getTypeWithFacts(getTypeOfSymbol(method), 2097152) : void 0;
        if (isTypeAny(methodType)) {
          return methodName === "next" ? anyIterationTypes : anyIterationTypesExceptNext;
        }
        var methodSignatures = methodType ? getSignaturesOfType(methodType, 0) : ts2.emptyArray;
        if (methodSignatures.length === 0) {
          if (errorNode) {
            var diagnostic = methodName === "next" ? resolver.mustHaveANextMethodDiagnostic : resolver.mustBeAMethodDiagnostic;
            error(errorNode, diagnostic, methodName);
          }
          return methodName === "next" ? anyIterationTypes : void 0;
        }
        if ((methodType === null || methodType === void 0 ? void 0 : methodType.symbol) && methodSignatures.length === 1) {
          var globalGeneratorType = resolver.getGlobalGeneratorType(false);
          var globalIteratorType = resolver.getGlobalIteratorType(false);
          var isGeneratorMethod = ((_b = (_a = globalGeneratorType.symbol) === null || _a === void 0 ? void 0 : _a.members) === null || _b === void 0 ? void 0 : _b.get(methodName)) === methodType.symbol;
          var isIteratorMethod = !isGeneratorMethod && ((_d = (_c = globalIteratorType.symbol) === null || _c === void 0 ? void 0 : _c.members) === null || _d === void 0 ? void 0 : _d.get(methodName)) === methodType.symbol;
          if (isGeneratorMethod || isIteratorMethod) {
            var globalType = isGeneratorMethod ? globalGeneratorType : globalIteratorType;
            var mapper = methodType.mapper;
            return createIterationTypes(getMappedType(globalType.typeParameters[0], mapper), getMappedType(globalType.typeParameters[1], mapper), methodName === "next" ? getMappedType(globalType.typeParameters[2], mapper) : void 0);
          }
        }
        var methodParameterTypes;
        var methodReturnTypes;
        for (var _i = 0, methodSignatures_1 = methodSignatures; _i < methodSignatures_1.length; _i++) {
          var signature = methodSignatures_1[_i];
          if (methodName !== "throw" && ts2.some(signature.parameters)) {
            methodParameterTypes = ts2.append(methodParameterTypes, getTypeAtPosition(signature, 0));
          }
          methodReturnTypes = ts2.append(methodReturnTypes, getReturnTypeOfSignature(signature));
        }
        var returnTypes;
        var nextType;
        if (methodName !== "throw") {
          var methodParameterType = methodParameterTypes ? getUnionType(methodParameterTypes) : unknownType;
          if (methodName === "next") {
            nextType = methodParameterType;
          } else if (methodName === "return") {
            var resolvedMethodParameterType = resolver.resolveIterationType(methodParameterType, errorNode) || anyType;
            returnTypes = ts2.append(returnTypes, resolvedMethodParameterType);
          }
        }
        var yieldType;
        var methodReturnType = methodReturnTypes ? getIntersectionType(methodReturnTypes) : neverType;
        var resolvedMethodReturnType = resolver.resolveIterationType(methodReturnType, errorNode) || anyType;
        var iterationTypes = getIterationTypesOfIteratorResult(resolvedMethodReturnType);
        if (iterationTypes === noIterationTypes) {
          if (errorNode) {
            error(errorNode, resolver.mustHaveAValueDiagnostic, methodName);
          }
          yieldType = anyType;
          returnTypes = ts2.append(returnTypes, anyType);
        } else {
          yieldType = iterationTypes.yieldType;
          returnTypes = ts2.append(returnTypes, iterationTypes.returnType);
        }
        return createIterationTypes(yieldType, getUnionType(returnTypes), nextType);
      }
      function getIterationTypesOfIteratorSlow(type, resolver, errorNode) {
        var iterationTypes = combineIterationTypes([
          getIterationTypesOfMethod(type, resolver, "next", errorNode),
          getIterationTypesOfMethod(type, resolver, "return", errorNode),
          getIterationTypesOfMethod(type, resolver, "throw", errorNode)
        ]);
        return setCachedIterationTypes(type, resolver.iteratorCacheKey, iterationTypes);
      }
      function getIterationTypeOfGeneratorFunctionReturnType(kind, returnType, isAsyncGenerator) {
        if (isTypeAny(returnType)) {
          return void 0;
        }
        var iterationTypes = getIterationTypesOfGeneratorFunctionReturnType(returnType, isAsyncGenerator);
        return iterationTypes && iterationTypes[getIterationTypesKeyFromIterationTypeKind(kind)];
      }
      function getIterationTypesOfGeneratorFunctionReturnType(type, isAsyncGenerator) {
        if (isTypeAny(type)) {
          return anyIterationTypes;
        }
        var use = isAsyncGenerator ? 2 : 1;
        var resolver = isAsyncGenerator ? asyncIterationTypesResolver : syncIterationTypesResolver;
        return getIterationTypesOfIterable(type, use, void 0) || getIterationTypesOfIterator(type, resolver, void 0);
      }
      function checkBreakOrContinueStatement(node) {
        if (!checkGrammarStatementInAmbientContext(node))
          checkGrammarBreakOrContinueStatement(node);
      }
      function unwrapReturnType(returnType, functionFlags) {
        var isGenerator = !!(functionFlags & 1);
        var isAsync = !!(functionFlags & 2);
        return isGenerator ? getIterationTypeOfGeneratorFunctionReturnType(1, returnType, isAsync) || errorType : isAsync ? getAwaitedTypeNoAlias(returnType) || errorType : returnType;
      }
      function isUnwrappedReturnTypeVoidOrAny(func, returnType) {
        var unwrappedReturnType = unwrapReturnType(returnType, ts2.getFunctionFlags(func));
        return !!unwrappedReturnType && maybeTypeOfKind(unwrappedReturnType, 16384 | 3);
      }
      function checkReturnStatement(node) {
        var _a;
        if (checkGrammarStatementInAmbientContext(node)) {
          return;
        }
        var container = ts2.getContainingFunctionOrClassStaticBlock(node);
        if (container && ts2.isClassStaticBlockDeclaration(container)) {
          grammarErrorOnFirstToken(node, ts2.Diagnostics.A_return_statement_cannot_be_used_inside_a_class_static_block);
          return;
        }
        if (!container) {
          grammarErrorOnFirstToken(node, ts2.Diagnostics.A_return_statement_can_only_be_used_within_a_function_body);
          return;
        }
        var signature = getSignatureFromDeclaration(container);
        var returnType = getReturnTypeOfSignature(signature);
        var functionFlags = ts2.getFunctionFlags(container);
        if (strictNullChecks || node.expression || returnType.flags & 131072) {
          var exprType = node.expression ? checkExpressionCached(node.expression) : undefinedType;
          if (container.kind === 172) {
            if (node.expression) {
              error(node, ts2.Diagnostics.Setters_cannot_return_a_value);
            }
          } else if (container.kind === 170) {
            if (node.expression && !checkTypeAssignableToAndOptionallyElaborate(exprType, returnType, node, node.expression)) {
              error(node, ts2.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class);
            }
          } else if (getReturnTypeFromAnnotation(container)) {
            var unwrappedReturnType = (_a = unwrapReturnType(returnType, functionFlags)) !== null && _a !== void 0 ? _a : returnType;
            var unwrappedExprType = functionFlags & 2 ? checkAwaitedType(exprType, false, node, ts2.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) : exprType;
            if (unwrappedReturnType) {
              checkTypeAssignableToAndOptionallyElaborate(unwrappedExprType, unwrappedReturnType, node, node.expression);
            }
          }
        } else if (container.kind !== 170 && compilerOptions.noImplicitReturns && !isUnwrappedReturnTypeVoidOrAny(container, returnType)) {
          error(node, ts2.Diagnostics.Not_all_code_paths_return_a_value);
        }
      }
      function checkWithStatement(node) {
        if (!checkGrammarStatementInAmbientContext(node)) {
          if (node.flags & 32768) {
            grammarErrorOnFirstToken(node, ts2.Diagnostics.with_statements_are_not_allowed_in_an_async_function_block);
          }
        }
        checkExpression(node.expression);
        var sourceFile = ts2.getSourceFileOfNode(node);
        if (!hasParseDiagnostics(sourceFile)) {
          var start = ts2.getSpanOfTokenAtPosition(sourceFile, node.pos).start;
          var end = node.statement.pos;
          grammarErrorAtPos(sourceFile, start, end - start, ts2.Diagnostics.The_with_statement_is_not_supported_All_symbols_in_a_with_block_will_have_type_any);
        }
      }
      function checkSwitchStatement(node) {
        checkGrammarStatementInAmbientContext(node);
        var firstDefaultClause;
        var hasDuplicateDefaultClause = false;
        var expressionType = checkExpression(node.expression);
        var expressionIsLiteral = isLiteralType(expressionType);
        ts2.forEach(node.caseBlock.clauses, function(clause) {
          if (clause.kind === 289 && !hasDuplicateDefaultClause) {
            if (firstDefaultClause === void 0) {
              firstDefaultClause = clause;
            } else {
              grammarErrorOnNode(clause, ts2.Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement);
              hasDuplicateDefaultClause = true;
            }
          }
          if (produceDiagnostics && clause.kind === 288) {
            var caseType = checkExpression(clause.expression);
            var caseIsLiteral = isLiteralType(caseType);
            var comparedExpressionType = expressionType;
            if (!caseIsLiteral || !expressionIsLiteral) {
              caseType = caseIsLiteral ? getBaseTypeOfLiteralType(caseType) : caseType;
              comparedExpressionType = getBaseTypeOfLiteralType(expressionType);
            }
            if (!isTypeEqualityComparableTo(comparedExpressionType, caseType)) {
              checkTypeComparableTo(caseType, comparedExpressionType, clause.expression, void 0);
            }
          }
          ts2.forEach(clause.statements, checkSourceElement);
          if (compilerOptions.noFallthroughCasesInSwitch && clause.fallthroughFlowNode && isReachableFlowNode(clause.fallthroughFlowNode)) {
            error(clause, ts2.Diagnostics.Fallthrough_case_in_switch);
          }
        });
        if (node.caseBlock.locals) {
          registerForUnusedIdentifiersCheck(node.caseBlock);
        }
      }
      function checkLabeledStatement(node) {
        if (!checkGrammarStatementInAmbientContext(node)) {
          ts2.findAncestor(node.parent, function(current) {
            if (ts2.isFunctionLike(current)) {
              return "quit";
            }
            if (current.kind === 249 && current.label.escapedText === node.label.escapedText) {
              grammarErrorOnNode(node.label, ts2.Diagnostics.Duplicate_label_0, ts2.getTextOfNode(node.label));
              return true;
            }
            return false;
          });
        }
        checkSourceElement(node.statement);
      }
      function checkThrowStatement(node) {
        if (!checkGrammarStatementInAmbientContext(node)) {
          if (ts2.isIdentifier(node.expression) && !node.expression.escapedText) {
            grammarErrorAfterFirstToken(node, ts2.Diagnostics.Line_break_not_permitted_here);
          }
        }
        if (node.expression) {
          checkExpression(node.expression);
        }
      }
      function checkTryStatement(node) {
        checkGrammarStatementInAmbientContext(node);
        checkBlock(node.tryBlock);
        var catchClause = node.catchClause;
        if (catchClause) {
          if (catchClause.variableDeclaration) {
            var declaration = catchClause.variableDeclaration;
            var typeNode = ts2.getEffectiveTypeAnnotationNode(ts2.getRootDeclaration(declaration));
            if (typeNode) {
              var type = getTypeForVariableLikeDeclaration(declaration, false);
              if (type && !(type.flags & 3)) {
                grammarErrorOnFirstToken(typeNode, ts2.Diagnostics.Catch_clause_variable_type_annotation_must_be_any_or_unknown_if_specified);
              }
            } else if (declaration.initializer) {
              grammarErrorOnFirstToken(declaration.initializer, ts2.Diagnostics.Catch_clause_variable_cannot_have_an_initializer);
            } else {
              var blockLocals_1 = catchClause.block.locals;
              if (blockLocals_1) {
                ts2.forEachKey(catchClause.locals, function(caughtName) {
                  var blockLocal = blockLocals_1.get(caughtName);
                  if ((blockLocal === null || blockLocal === void 0 ? void 0 : blockLocal.valueDeclaration) && (blockLocal.flags & 2) !== 0) {
                    grammarErrorOnNode(blockLocal.valueDeclaration, ts2.Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause, caughtName);
                  }
                });
              }
            }
          }
          checkBlock(catchClause.block);
        }
        if (node.finallyBlock) {
          checkBlock(node.finallyBlock);
        }
      }
      function checkIndexConstraints(type, symbol, isStaticIndex) {
        var indexInfos = getIndexInfosOfType(type);
        if (indexInfos.length === 0) {
          return;
        }
        for (var _i = 0, _a = getPropertiesOfObjectType(type); _i < _a.length; _i++) {
          var prop = _a[_i];
          if (!(isStaticIndex && prop.flags & 4194304)) {
            checkIndexConstraintForProperty(type, prop, getLiteralTypeFromProperty(prop, 8576, true), getNonMissingTypeOfSymbol(prop));
          }
        }
        var typeDeclaration = symbol.valueDeclaration;
        if (typeDeclaration && ts2.isClassLike(typeDeclaration)) {
          for (var _b = 0, _c = typeDeclaration.members; _b < _c.length; _b++) {
            var member = _c[_b];
            if (!ts2.isStatic(member) && !hasBindableName(member)) {
              var symbol_3 = getSymbolOfNode(member);
              checkIndexConstraintForProperty(type, symbol_3, getTypeOfExpression(member.name.expression), getNonMissingTypeOfSymbol(symbol_3));
            }
          }
        }
        if (indexInfos.length > 1) {
          for (var _d = 0, indexInfos_6 = indexInfos; _d < indexInfos_6.length; _d++) {
            var info = indexInfos_6[_d];
            checkIndexConstraintForIndexSignature(type, info);
          }
        }
      }
      function checkIndexConstraintForProperty(type, prop, propNameType, propType) {
        var declaration = prop.valueDeclaration;
        var name = ts2.getNameOfDeclaration(declaration);
        if (name && ts2.isPrivateIdentifier(name)) {
          return;
        }
        var indexInfos = getApplicableIndexInfos(type, propNameType);
        var interfaceDeclaration = ts2.getObjectFlags(type) & 2 ? ts2.getDeclarationOfKind(type.symbol, 257) : void 0;
        var localPropDeclaration = declaration && declaration.kind === 220 || name && name.kind === 161 || getParentOfSymbol(prop) === type.symbol ? declaration : void 0;
        var _loop_27 = function(info2) {
          var localIndexDeclaration = info2.declaration && getParentOfSymbol(getSymbolOfNode(info2.declaration)) === type.symbol ? info2.declaration : void 0;
          var errorNode = localPropDeclaration || localIndexDeclaration || (interfaceDeclaration && !ts2.some(getBaseTypes(type), function(base) {
            return !!getPropertyOfObjectType(base, prop.escapedName) && !!getIndexTypeOfType(base, info2.keyType);
          }) ? interfaceDeclaration : void 0);
          if (errorNode && !isTypeAssignableTo(propType, info2.type)) {
            error(errorNode, ts2.Diagnostics.Property_0_of_type_1_is_not_assignable_to_2_index_type_3, symbolToString(prop), typeToString(propType), typeToString(info2.keyType), typeToString(info2.type));
          }
        };
        for (var _i = 0, indexInfos_7 = indexInfos; _i < indexInfos_7.length; _i++) {
          var info = indexInfos_7[_i];
          _loop_27(info);
        }
      }
      function checkIndexConstraintForIndexSignature(type, checkInfo) {
        var declaration = checkInfo.declaration;
        var indexInfos = getApplicableIndexInfos(type, checkInfo.keyType);
        var interfaceDeclaration = ts2.getObjectFlags(type) & 2 ? ts2.getDeclarationOfKind(type.symbol, 257) : void 0;
        var localCheckDeclaration = declaration && getParentOfSymbol(getSymbolOfNode(declaration)) === type.symbol ? declaration : void 0;
        var _loop_28 = function(info2) {
          if (info2 === checkInfo)
            return "continue";
          var localIndexDeclaration = info2.declaration && getParentOfSymbol(getSymbolOfNode(info2.declaration)) === type.symbol ? info2.declaration : void 0;
          var errorNode = localCheckDeclaration || localIndexDeclaration || (interfaceDeclaration && !ts2.some(getBaseTypes(type), function(base) {
            return !!getIndexInfoOfType(base, checkInfo.keyType) && !!getIndexTypeOfType(base, info2.keyType);
          }) ? interfaceDeclaration : void 0);
          if (errorNode && !isTypeAssignableTo(checkInfo.type, info2.type)) {
            error(errorNode, ts2.Diagnostics._0_index_type_1_is_not_assignable_to_2_index_type_3, typeToString(checkInfo.keyType), typeToString(checkInfo.type), typeToString(info2.keyType), typeToString(info2.type));
          }
        };
        for (var _i = 0, indexInfos_8 = indexInfos; _i < indexInfos_8.length; _i++) {
          var info = indexInfos_8[_i];
          _loop_28(info);
        }
      }
      function checkTypeNameIsReserved(name, message) {
        switch (name.escapedText) {
          case "any":
          case "unknown":
          case "never":
          case "number":
          case "bigint":
          case "boolean":
          case "string":
          case "symbol":
          case "void":
          case "object":
            error(name, message, name.escapedText);
        }
      }
      function checkClassNameCollisionWithObject(name) {
        if (languageVersion >= 1 && name.escapedText === "Object" && (moduleKind < ts2.ModuleKind.ES2015 || ts2.getSourceFileOfNode(name).impliedNodeFormat === ts2.ModuleKind.CommonJS)) {
          error(name, ts2.Diagnostics.Class_name_cannot_be_Object_when_targeting_ES5_with_module_0, ts2.ModuleKind[moduleKind]);
        }
      }
      function checkTypeParameters(typeParameterDeclarations) {
        if (typeParameterDeclarations) {
          var seenDefault = false;
          for (var i = 0; i < typeParameterDeclarations.length; i++) {
            var node = typeParameterDeclarations[i];
            checkTypeParameter(node);
            if (produceDiagnostics) {
              if (node.default) {
                seenDefault = true;
                checkTypeParametersNotReferenced(node.default, typeParameterDeclarations, i);
              } else if (seenDefault) {
                error(node, ts2.Diagnostics.Required_type_parameters_may_not_follow_optional_type_parameters);
              }
              for (var j = 0; j < i; j++) {
                if (typeParameterDeclarations[j].symbol === node.symbol) {
                  error(node.name, ts2.Diagnostics.Duplicate_identifier_0, ts2.declarationNameToString(node.name));
                }
              }
            }
          }
        }
      }
      function checkTypeParametersNotReferenced(root, typeParameters, index) {
        visit(root);
        function visit(node) {
          if (node.kind === 177) {
            var type = getTypeFromTypeReference(node);
            if (type.flags & 262144) {
              for (var i = index; i < typeParameters.length; i++) {
                if (type.symbol === getSymbolOfNode(typeParameters[i])) {
                  error(node, ts2.Diagnostics.Type_parameter_defaults_can_only_reference_previously_declared_type_parameters);
                }
              }
            }
          }
          ts2.forEachChild(node, visit);
        }
      }
      function checkTypeParameterListsIdentical(symbol) {
        if (symbol.declarations && symbol.declarations.length === 1) {
          return;
        }
        var links = getSymbolLinks(symbol);
        if (!links.typeParametersChecked) {
          links.typeParametersChecked = true;
          var declarations = getClassOrInterfaceDeclarationsOfSymbol(symbol);
          if (!declarations || declarations.length <= 1) {
            return;
          }
          var type = getDeclaredTypeOfSymbol(symbol);
          if (!areTypeParametersIdentical(declarations, type.localTypeParameters)) {
            var name = symbolToString(symbol);
            for (var _i = 0, declarations_6 = declarations; _i < declarations_6.length; _i++) {
              var declaration = declarations_6[_i];
              error(declaration.name, ts2.Diagnostics.All_declarations_of_0_must_have_identical_type_parameters, name);
            }
          }
        }
      }
      function areTypeParametersIdentical(declarations, targetParameters) {
        var maxTypeArgumentCount = ts2.length(targetParameters);
        var minTypeArgumentCount = getMinTypeArgumentCount(targetParameters);
        for (var _i = 0, declarations_7 = declarations; _i < declarations_7.length; _i++) {
          var declaration = declarations_7[_i];
          var sourceParameters = ts2.getEffectiveTypeParameterDeclarations(declaration);
          var numTypeParameters = sourceParameters.length;
          if (numTypeParameters < minTypeArgumentCount || numTypeParameters > maxTypeArgumentCount) {
            return false;
          }
          for (var i = 0; i < numTypeParameters; i++) {
            var source = sourceParameters[i];
            var target = targetParameters[i];
            if (source.name.escapedText !== target.symbol.escapedName) {
              return false;
            }
            var constraint = ts2.getEffectiveConstraintOfTypeParameter(source);
            var sourceConstraint = constraint && getTypeFromTypeNode(constraint);
            var targetConstraint = getConstraintOfTypeParameter(target);
            if (sourceConstraint && targetConstraint && !isTypeIdenticalTo(sourceConstraint, targetConstraint)) {
              return false;
            }
            var sourceDefault = source.default && getTypeFromTypeNode(source.default);
            var targetDefault = getDefaultFromTypeParameter(target);
            if (sourceDefault && targetDefault && !isTypeIdenticalTo(sourceDefault, targetDefault)) {
              return false;
            }
          }
        }
        return true;
      }
      function checkClassExpression(node) {
        checkClassLikeDeclaration(node);
        checkNodeDeferred(node);
        return getTypeOfSymbol(getSymbolOfNode(node));
      }
      function checkClassExpressionDeferred(node) {
        ts2.forEach(node.members, checkSourceElement);
        registerForUnusedIdentifiersCheck(node);
      }
      function checkClassDeclaration(node) {
        if (ts2.some(node.decorators) && ts2.some(node.members, function(p) {
          return ts2.hasStaticModifier(p) && ts2.isPrivateIdentifierClassElementDeclaration(p);
        })) {
          grammarErrorOnNode(node.decorators[0], ts2.Diagnostics.Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator);
        }
        if (!node.name && !ts2.hasSyntacticModifier(node, 512)) {
          grammarErrorOnFirstToken(node, ts2.Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name);
        }
        checkClassLikeDeclaration(node);
        ts2.forEach(node.members, checkSourceElement);
        registerForUnusedIdentifiersCheck(node);
      }
      function checkClassLikeDeclaration(node) {
        checkGrammarClassLikeDeclaration(node);
        checkDecorators(node);
        checkCollisionsForDeclarationName(node, node.name);
        checkTypeParameters(ts2.getEffectiveTypeParameterDeclarations(node));
        checkExportsOnMergedDeclarations(node);
        var symbol = getSymbolOfNode(node);
        var type = getDeclaredTypeOfSymbol(symbol);
        var typeWithThis = getTypeWithThisArgument(type);
        var staticType = getTypeOfSymbol(symbol);
        checkTypeParameterListsIdentical(symbol);
        checkFunctionOrConstructorSymbol(symbol);
        checkClassForDuplicateDeclarations(node);
        var nodeInAmbientContext = !!(node.flags & 8388608);
        if (!nodeInAmbientContext) {
          checkClassForStaticPropertyNameConflicts(node);
        }
        var baseTypeNode = ts2.getEffectiveBaseTypeNode(node);
        if (baseTypeNode) {
          ts2.forEach(baseTypeNode.typeArguments, checkSourceElement);
          if (languageVersion < 2) {
            checkExternalEmitHelpers(baseTypeNode.parent, 1);
          }
          var extendsNode = ts2.getClassExtendsHeritageElement(node);
          if (extendsNode && extendsNode !== baseTypeNode) {
            checkExpression(extendsNode.expression);
          }
          var baseTypes = getBaseTypes(type);
          if (baseTypes.length && produceDiagnostics) {
            var baseType_1 = baseTypes[0];
            var baseConstructorType = getBaseConstructorTypeOfClass(type);
            var staticBaseType = getApparentType(baseConstructorType);
            checkBaseTypeAccessibility(staticBaseType, baseTypeNode);
            checkSourceElement(baseTypeNode.expression);
            if (ts2.some(baseTypeNode.typeArguments)) {
              ts2.forEach(baseTypeNode.typeArguments, checkSourceElement);
              for (var _i = 0, _a = getConstructorsForTypeArguments(staticBaseType, baseTypeNode.typeArguments, baseTypeNode); _i < _a.length; _i++) {
                var constructor = _a[_i];
                if (!checkTypeArgumentConstraints(baseTypeNode, constructor.typeParameters)) {
                  break;
                }
              }
            }
            var baseWithThis = getTypeWithThisArgument(baseType_1, type.thisType);
            if (!checkTypeAssignableTo(typeWithThis, baseWithThis, void 0)) {
              issueMemberSpecificError(node, typeWithThis, baseWithThis, ts2.Diagnostics.Class_0_incorrectly_extends_base_class_1);
            } else {
              checkTypeAssignableTo(staticType, getTypeWithoutSignatures(staticBaseType), node.name || node, ts2.Diagnostics.Class_static_side_0_incorrectly_extends_base_class_static_side_1);
            }
            if (baseConstructorType.flags & 8650752) {
              if (!isMixinConstructorType(staticType)) {
                error(node.name || node, ts2.Diagnostics.A_mixin_class_must_have_a_constructor_with_a_single_rest_parameter_of_type_any);
              } else {
                var constructSignatures = getSignaturesOfType(baseConstructorType, 1);
                if (constructSignatures.some(function(signature) {
                  return signature.flags & 4;
                }) && !ts2.hasSyntacticModifier(node, 128)) {
                  error(node.name || node, ts2.Diagnostics.A_mixin_class_that_extends_from_a_type_variable_containing_an_abstract_construct_signature_must_also_be_declared_abstract);
                }
              }
            }
            if (!(staticBaseType.symbol && staticBaseType.symbol.flags & 32) && !(baseConstructorType.flags & 8650752)) {
              var constructors = getInstantiatedConstructorsForTypeArguments(staticBaseType, baseTypeNode.typeArguments, baseTypeNode);
              if (ts2.forEach(constructors, function(sig) {
                return !isJSConstructor(sig.declaration) && !isTypeIdenticalTo(getReturnTypeOfSignature(sig), baseType_1);
              })) {
                error(baseTypeNode.expression, ts2.Diagnostics.Base_constructors_must_all_have_the_same_return_type);
              }
            }
            checkKindsOfPropertyMemberOverrides(type, baseType_1);
          }
        }
        checkMembersForOverrideModifier(node, type, typeWithThis, staticType);
        var implementedTypeNodes = ts2.getEffectiveImplementsTypeNodes(node);
        if (implementedTypeNodes) {
          for (var _b = 0, implementedTypeNodes_1 = implementedTypeNodes; _b < implementedTypeNodes_1.length; _b++) {
            var typeRefNode = implementedTypeNodes_1[_b];
            if (!ts2.isEntityNameExpression(typeRefNode.expression) || ts2.isOptionalChain(typeRefNode.expression)) {
              error(typeRefNode.expression, ts2.Diagnostics.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments);
            }
            checkTypeReferenceNode(typeRefNode);
            if (produceDiagnostics) {
              var t = getReducedType(getTypeFromTypeNode(typeRefNode));
              if (!isErrorType(t)) {
                if (isValidBaseType(t)) {
                  var genericDiag = t.symbol && t.symbol.flags & 32 ? ts2.Diagnostics.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass : ts2.Diagnostics.Class_0_incorrectly_implements_interface_1;
                  var baseWithThis = getTypeWithThisArgument(t, type.thisType);
                  if (!checkTypeAssignableTo(typeWithThis, baseWithThis, void 0)) {
                    issueMemberSpecificError(node, typeWithThis, baseWithThis, genericDiag);
                  }
                } else {
                  error(typeRefNode, ts2.Diagnostics.A_class_can_only_implement_an_object_type_or_intersection_of_object_types_with_statically_known_members);
                }
              }
            }
          }
        }
        if (produceDiagnostics) {
          checkIndexConstraints(type, symbol);
          checkIndexConstraints(staticType, symbol, true);
          checkTypeForDuplicateIndexSignatures(node);
          checkPropertyInitialization(node);
        }
      }
      function checkMembersForOverrideModifier(node, type, typeWithThis, staticType) {
        var baseTypeNode = ts2.getEffectiveBaseTypeNode(node);
        var baseTypes = baseTypeNode && getBaseTypes(type);
        var baseWithThis = (baseTypes === null || baseTypes === void 0 ? void 0 : baseTypes.length) ? getTypeWithThisArgument(ts2.first(baseTypes), type.thisType) : void 0;
        var baseStaticType = getBaseConstructorTypeOfClass(type);
        var _loop_29 = function(member2) {
          if (ts2.hasAmbientModifier(member2)) {
            return "continue";
          }
          if (ts2.isConstructorDeclaration(member2)) {
            ts2.forEach(member2.parameters, function(param) {
              if (ts2.isParameterPropertyDeclaration(param, member2)) {
                checkExistingMemberForOverrideModifier(node, staticType, baseStaticType, baseWithThis, type, typeWithThis, param, true);
              }
            });
          }
          checkExistingMemberForOverrideModifier(node, staticType, baseStaticType, baseWithThis, type, typeWithThis, member2, false);
        };
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          _loop_29(member);
        }
      }
      function checkExistingMemberForOverrideModifier(node, staticType, baseStaticType, baseWithThis, type, typeWithThis, member, memberIsParameterProperty, reportErrors) {
        if (reportErrors === void 0) {
          reportErrors = true;
        }
        var declaredProp = member.name && getSymbolAtLocation(member.name) || getSymbolAtLocation(member);
        if (!declaredProp) {
          return 0;
        }
        return checkMemberForOverrideModifier(node, staticType, baseStaticType, baseWithThis, type, typeWithThis, ts2.hasOverrideModifier(member), ts2.hasAbstractModifier(member), ts2.isStatic(member), memberIsParameterProperty, ts2.symbolName(declaredProp), reportErrors ? member : void 0);
      }
      function checkMemberForOverrideModifier(node, staticType, baseStaticType, baseWithThis, type, typeWithThis, memberHasOverrideModifier, memberHasAbstractModifier, memberIsStatic, memberIsParameterProperty, memberName, errorNode) {
        var isJs = ts2.isInJSFile(node);
        var nodeInAmbientContext = !!(node.flags & 8388608);
        if (baseWithThis && (memberHasOverrideModifier || compilerOptions.noImplicitOverride)) {
          var memberEscapedName = ts2.escapeLeadingUnderscores(memberName);
          var thisType = memberIsStatic ? staticType : typeWithThis;
          var baseType = memberIsStatic ? baseStaticType : baseWithThis;
          var prop = getPropertyOfType(thisType, memberEscapedName);
          var baseProp = getPropertyOfType(baseType, memberEscapedName);
          var baseClassName = typeToString(baseWithThis);
          if (prop && !baseProp && memberHasOverrideModifier) {
            if (errorNode) {
              var suggestion = getSuggestedSymbolForNonexistentClassMember(memberName, baseType);
              suggestion ? error(errorNode, isJs ? ts2.Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1 : ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1, baseClassName, symbolToString(suggestion)) : error(errorNode, isJs ? ts2.Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0 : ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0, baseClassName);
            }
            return 2;
          } else if (prop && (baseProp === null || baseProp === void 0 ? void 0 : baseProp.declarations) && compilerOptions.noImplicitOverride && !nodeInAmbientContext) {
            var baseHasAbstract = ts2.some(baseProp.declarations, ts2.hasAbstractModifier);
            if (memberHasOverrideModifier) {
              return 0;
            }
            if (!baseHasAbstract) {
              if (errorNode) {
                var diag = memberIsParameterProperty ? isJs ? ts2.Diagnostics.This_parameter_property_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0 : ts2.Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0 : isJs ? ts2.Diagnostics.This_member_must_have_a_JSDoc_comment_with_an_override_tag_because_it_overrides_a_member_in_the_base_class_0 : ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0;
                error(errorNode, diag, baseClassName);
              }
              return 1;
            } else if (memberHasAbstractModifier && baseHasAbstract) {
              if (errorNode) {
                error(errorNode, ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0, baseClassName);
              }
              return 1;
            }
          }
        } else if (memberHasOverrideModifier) {
          if (errorNode) {
            var className = typeToString(type);
            error(errorNode, isJs ? ts2.Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_its_containing_class_0_does_not_extend_another_class : ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class, className);
          }
          return 2;
        }
        return 0;
      }
      function issueMemberSpecificError(node, typeWithThis, baseWithThis, broadDiag) {
        var issuedMemberError = false;
        var _loop_30 = function(member2) {
          if (ts2.isStatic(member2)) {
            return "continue";
          }
          var declaredProp = member2.name && getSymbolAtLocation(member2.name) || getSymbolAtLocation(member2);
          if (declaredProp) {
            var prop = getPropertyOfType(typeWithThis, declaredProp.escapedName);
            var baseProp = getPropertyOfType(baseWithThis, declaredProp.escapedName);
            if (prop && baseProp) {
              var rootChain = function() {
                return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2, symbolToString(declaredProp), typeToString(typeWithThis), typeToString(baseWithThis));
              };
              if (!checkTypeAssignableTo(getTypeOfSymbol(prop), getTypeOfSymbol(baseProp), member2.name || member2, void 0, rootChain)) {
                issuedMemberError = true;
              }
            }
          }
        };
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          _loop_30(member);
        }
        if (!issuedMemberError) {
          checkTypeAssignableTo(typeWithThis, baseWithThis, node.name || node, broadDiag);
        }
      }
      function checkBaseTypeAccessibility(type, node) {
        var signatures = getSignaturesOfType(type, 1);
        if (signatures.length) {
          var declaration = signatures[0].declaration;
          if (declaration && ts2.hasEffectiveModifier(declaration, 8)) {
            var typeClassDeclaration = ts2.getClassLikeDeclarationOfSymbol(type.symbol);
            if (!isNodeWithinClass(node, typeClassDeclaration)) {
              error(node, ts2.Diagnostics.Cannot_extend_a_class_0_Class_constructor_is_marked_as_private, getFullyQualifiedName(type.symbol));
            }
          }
        }
      }
      function getMemberOverrideModifierStatus(node, member) {
        if (!member.name) {
          return 0;
        }
        var symbol = getSymbolOfNode(node);
        var type = getDeclaredTypeOfSymbol(symbol);
        var typeWithThis = getTypeWithThisArgument(type);
        var staticType = getTypeOfSymbol(symbol);
        var baseTypeNode = ts2.getEffectiveBaseTypeNode(node);
        var baseTypes = baseTypeNode && getBaseTypes(type);
        var baseWithThis = (baseTypes === null || baseTypes === void 0 ? void 0 : baseTypes.length) ? getTypeWithThisArgument(ts2.first(baseTypes), type.thisType) : void 0;
        var baseStaticType = getBaseConstructorTypeOfClass(type);
        var memberHasOverrideModifier = member.parent ? ts2.hasOverrideModifier(member) : ts2.hasSyntacticModifier(member, 16384);
        var memberName = ts2.unescapeLeadingUnderscores(ts2.getTextOfPropertyName(member.name));
        return checkMemberForOverrideModifier(node, staticType, baseStaticType, baseWithThis, type, typeWithThis, memberHasOverrideModifier, ts2.hasAbstractModifier(member), ts2.isStatic(member), false, memberName);
      }
      function getTargetSymbol(s) {
        return ts2.getCheckFlags(s) & 1 ? s.target : s;
      }
      function getClassOrInterfaceDeclarationsOfSymbol(symbol) {
        return ts2.filter(symbol.declarations, function(d) {
          return d.kind === 256 || d.kind === 257;
        });
      }
      function checkKindsOfPropertyMemberOverrides(type, baseType) {
        var _a, _b;
        var baseProperties = getPropertiesOfType(baseType);
        basePropertyCheck:
          for (var _i = 0, baseProperties_1 = baseProperties; _i < baseProperties_1.length; _i++) {
            var baseProperty = baseProperties_1[_i];
            var base = getTargetSymbol(baseProperty);
            if (base.flags & 4194304) {
              continue;
            }
            var baseSymbol = getPropertyOfObjectType(type, base.escapedName);
            if (!baseSymbol) {
              continue;
            }
            var derived = getTargetSymbol(baseSymbol);
            var baseDeclarationFlags = ts2.getDeclarationModifierFlagsFromSymbol(base);
            ts2.Debug.assert(!!derived, "derived should point to something, even if it is the base class' declaration.");
            if (derived === base) {
              var derivedClassDecl = ts2.getClassLikeDeclarationOfSymbol(type.symbol);
              if (baseDeclarationFlags & 128 && (!derivedClassDecl || !ts2.hasSyntacticModifier(derivedClassDecl, 128))) {
                for (var _c = 0, _d = getBaseTypes(type); _c < _d.length; _c++) {
                  var otherBaseType = _d[_c];
                  if (otherBaseType === baseType)
                    continue;
                  var baseSymbol_1 = getPropertyOfObjectType(otherBaseType, base.escapedName);
                  var derivedElsewhere = baseSymbol_1 && getTargetSymbol(baseSymbol_1);
                  if (derivedElsewhere && derivedElsewhere !== base) {
                    continue basePropertyCheck;
                  }
                }
                if (derivedClassDecl.kind === 225) {
                  error(derivedClassDecl, ts2.Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, symbolToString(baseProperty), typeToString(baseType));
                } else {
                  error(derivedClassDecl, ts2.Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, typeToString(type), symbolToString(baseProperty), typeToString(baseType));
                }
              }
            } else {
              var derivedDeclarationFlags = ts2.getDeclarationModifierFlagsFromSymbol(derived);
              if (baseDeclarationFlags & 8 || derivedDeclarationFlags & 8) {
                continue;
              }
              var errorMessage = void 0;
              var basePropertyFlags = base.flags & 98308;
              var derivedPropertyFlags = derived.flags & 98308;
              if (basePropertyFlags && derivedPropertyFlags) {
                if (baseDeclarationFlags & 128 && !(base.valueDeclaration && ts2.isPropertyDeclaration(base.valueDeclaration) && base.valueDeclaration.initializer) || base.valueDeclaration && base.valueDeclaration.parent.kind === 257 || derived.valueDeclaration && ts2.isBinaryExpression(derived.valueDeclaration)) {
                  continue;
                }
                var overriddenInstanceProperty = basePropertyFlags !== 4 && derivedPropertyFlags === 4;
                var overriddenInstanceAccessor = basePropertyFlags === 4 && derivedPropertyFlags !== 4;
                if (overriddenInstanceProperty || overriddenInstanceAccessor) {
                  var errorMessage_1 = overriddenInstanceProperty ? ts2.Diagnostics._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property : ts2.Diagnostics._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor;
                  error(ts2.getNameOfDeclaration(derived.valueDeclaration) || derived.valueDeclaration, errorMessage_1, symbolToString(base), typeToString(baseType), typeToString(type));
                } else if (useDefineForClassFields) {
                  var uninitialized = (_a = derived.declarations) === null || _a === void 0 ? void 0 : _a.find(function(d) {
                    return d.kind === 166 && !d.initializer;
                  });
                  if (uninitialized && !(derived.flags & 33554432) && !(baseDeclarationFlags & 128) && !(derivedDeclarationFlags & 128) && !((_b = derived.declarations) === null || _b === void 0 ? void 0 : _b.some(function(d) {
                    return !!(d.flags & 8388608);
                  }))) {
                    var constructor = findConstructorDeclaration(ts2.getClassLikeDeclarationOfSymbol(type.symbol));
                    var propName = uninitialized.name;
                    if (uninitialized.exclamationToken || !constructor || !ts2.isIdentifier(propName) || !strictNullChecks || !isPropertyInitializedInConstructor(propName, type, constructor)) {
                      var errorMessage_2 = ts2.Diagnostics.Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration;
                      error(ts2.getNameOfDeclaration(derived.valueDeclaration) || derived.valueDeclaration, errorMessage_2, symbolToString(base), typeToString(baseType));
                    }
                  }
                }
                continue;
              } else if (isPrototypeProperty(base)) {
                if (isPrototypeProperty(derived) || derived.flags & 4) {
                  continue;
                } else {
                  ts2.Debug.assert(!!(derived.flags & 98304));
                  errorMessage = ts2.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor;
                }
              } else if (base.flags & 98304) {
                errorMessage = ts2.Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function;
              } else {
                errorMessage = ts2.Diagnostics.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function;
              }
              error(ts2.getNameOfDeclaration(derived.valueDeclaration) || derived.valueDeclaration, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
            }
          }
      }
      function getNonInterhitedProperties(type, baseTypes, properties) {
        if (!ts2.length(baseTypes)) {
          return properties;
        }
        var seen = new ts2.Map();
        ts2.forEach(properties, function(p) {
          seen.set(p.escapedName, p);
        });
        for (var _i = 0, baseTypes_2 = baseTypes; _i < baseTypes_2.length; _i++) {
          var base = baseTypes_2[_i];
          var properties_5 = getPropertiesOfType(getTypeWithThisArgument(base, type.thisType));
          for (var _a = 0, properties_4 = properties_5; _a < properties_4.length; _a++) {
            var prop = properties_4[_a];
            var existing = seen.get(prop.escapedName);
            if (existing && !isPropertyIdenticalTo(existing, prop)) {
              seen.delete(prop.escapedName);
            }
          }
        }
        return ts2.arrayFrom(seen.values());
      }
      function checkInheritedPropertiesAreIdentical(type, typeNode) {
        var baseTypes = getBaseTypes(type);
        if (baseTypes.length < 2) {
          return true;
        }
        var seen = new ts2.Map();
        ts2.forEach(resolveDeclaredMembers(type).declaredProperties, function(p) {
          seen.set(p.escapedName, { prop: p, containingType: type });
        });
        var ok = true;
        for (var _i = 0, baseTypes_3 = baseTypes; _i < baseTypes_3.length; _i++) {
          var base = baseTypes_3[_i];
          var properties = getPropertiesOfType(getTypeWithThisArgument(base, type.thisType));
          for (var _a = 0, properties_6 = properties; _a < properties_6.length; _a++) {
            var prop = properties_6[_a];
            var existing = seen.get(prop.escapedName);
            if (!existing) {
              seen.set(prop.escapedName, { prop, containingType: base });
            } else {
              var isInheritedProperty = existing.containingType !== type;
              if (isInheritedProperty && !isPropertyIdenticalTo(existing.prop, prop)) {
                ok = false;
                var typeName1 = typeToString(existing.containingType);
                var typeName2 = typeToString(base);
                var errorInfo = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, symbolToString(prop), typeName1, typeName2);
                errorInfo = ts2.chainDiagnosticMessages(errorInfo, ts2.Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2, typeToString(type), typeName1, typeName2);
                diagnostics.add(ts2.createDiagnosticForNodeFromMessageChain(typeNode, errorInfo));
              }
            }
          }
        }
        return ok;
      }
      function checkPropertyInitialization(node) {
        if (!strictNullChecks || !strictPropertyInitialization || node.flags & 8388608) {
          return;
        }
        var constructor = findConstructorDeclaration(node);
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          if (ts2.getEffectiveModifierFlags(member) & 2) {
            continue;
          }
          if (!ts2.isStatic(member) && isPropertyWithoutInitializer(member)) {
            var propName = member.name;
            if (ts2.isIdentifier(propName) || ts2.isPrivateIdentifier(propName)) {
              var type = getTypeOfSymbol(getSymbolOfNode(member));
              if (!(type.flags & 3 || getFalsyFlags(type) & 32768)) {
                if (!constructor || !isPropertyInitializedInConstructor(propName, type, constructor)) {
                  error(member.name, ts2.Diagnostics.Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor, ts2.declarationNameToString(propName));
                }
              }
            }
          }
        }
      }
      function isPropertyWithoutInitializer(node) {
        return node.kind === 166 && !ts2.hasAbstractModifier(node) && !node.exclamationToken && !node.initializer;
      }
      function isPropertyInitializedInStaticBlocks(propName, propType, staticBlocks, startPos, endPos) {
        for (var _i = 0, staticBlocks_2 = staticBlocks; _i < staticBlocks_2.length; _i++) {
          var staticBlock = staticBlocks_2[_i];
          if (staticBlock.pos >= startPos && staticBlock.pos <= endPos) {
            var reference = ts2.factory.createPropertyAccessExpression(ts2.factory.createThis(), propName);
            ts2.setParent(reference.expression, reference);
            ts2.setParent(reference, staticBlock);
            reference.flowNode = staticBlock.returnFlowNode;
            var flowType = getFlowTypeOfReference(reference, propType, getOptionalType(propType));
            if (!(getFalsyFlags(flowType) & 32768)) {
              return true;
            }
          }
        }
        return false;
      }
      function isPropertyInitializedInConstructor(propName, propType, constructor) {
        var reference = ts2.factory.createPropertyAccessExpression(ts2.factory.createThis(), propName);
        ts2.setParent(reference.expression, reference);
        ts2.setParent(reference, constructor);
        reference.flowNode = constructor.returnFlowNode;
        var flowType = getFlowTypeOfReference(reference, propType, getOptionalType(propType));
        return !(getFalsyFlags(flowType) & 32768);
      }
      function checkInterfaceDeclaration(node) {
        if (!checkGrammarDecoratorsAndModifiers(node))
          checkGrammarInterfaceDeclaration(node);
        checkTypeParameters(node.typeParameters);
        if (produceDiagnostics) {
          checkTypeNameIsReserved(node.name, ts2.Diagnostics.Interface_name_cannot_be_0);
          checkExportsOnMergedDeclarations(node);
          var symbol = getSymbolOfNode(node);
          checkTypeParameterListsIdentical(symbol);
          var firstInterfaceDecl = ts2.getDeclarationOfKind(symbol, 257);
          if (node === firstInterfaceDecl) {
            var type = getDeclaredTypeOfSymbol(symbol);
            var typeWithThis = getTypeWithThisArgument(type);
            if (checkInheritedPropertiesAreIdentical(type, node.name)) {
              for (var _i = 0, _a = getBaseTypes(type); _i < _a.length; _i++) {
                var baseType = _a[_i];
                checkTypeAssignableTo(typeWithThis, getTypeWithThisArgument(baseType, type.thisType), node.name, ts2.Diagnostics.Interface_0_incorrectly_extends_interface_1);
              }
              checkIndexConstraints(type, symbol);
            }
          }
          checkObjectTypeForDuplicateDeclarations(node);
        }
        ts2.forEach(ts2.getInterfaceBaseTypeNodes(node), function(heritageElement) {
          if (!ts2.isEntityNameExpression(heritageElement.expression) || ts2.isOptionalChain(heritageElement.expression)) {
            error(heritageElement.expression, ts2.Diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments);
          }
          checkTypeReferenceNode(heritageElement);
        });
        ts2.forEach(node.members, checkSourceElement);
        if (produceDiagnostics) {
          checkTypeForDuplicateIndexSignatures(node);
          registerForUnusedIdentifiersCheck(node);
        }
      }
      function checkTypeAliasDeclaration(node) {
        checkGrammarDecoratorsAndModifiers(node);
        checkTypeNameIsReserved(node.name, ts2.Diagnostics.Type_alias_name_cannot_be_0);
        checkExportsOnMergedDeclarations(node);
        checkTypeParameters(node.typeParameters);
        if (node.type.kind === 138) {
          if (!intrinsicTypeKinds.has(node.name.escapedText) || ts2.length(node.typeParameters) !== 1) {
            error(node.type, ts2.Diagnostics.The_intrinsic_keyword_can_only_be_used_to_declare_compiler_provided_intrinsic_types);
          }
        } else {
          checkSourceElement(node.type);
          registerForUnusedIdentifiersCheck(node);
        }
      }
      function computeEnumMemberValues(node) {
        var nodeLinks2 = getNodeLinks(node);
        if (!(nodeLinks2.flags & 16384)) {
          nodeLinks2.flags |= 16384;
          var autoValue = 0;
          for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
            var member = _a[_i];
            var value = computeMemberValue(member, autoValue);
            getNodeLinks(member).enumMemberValue = value;
            autoValue = typeof value === "number" ? value + 1 : void 0;
          }
        }
      }
      function computeMemberValue(member, autoValue) {
        if (ts2.isComputedNonLiteralName(member.name)) {
          error(member.name, ts2.Diagnostics.Computed_property_names_are_not_allowed_in_enums);
        } else {
          var text = ts2.getTextOfPropertyName(member.name);
          if (isNumericLiteralName(text) && !ts2.isInfinityOrNaNString(text)) {
            error(member.name, ts2.Diagnostics.An_enum_member_cannot_have_a_numeric_name);
          }
        }
        if (member.initializer) {
          return computeConstantValue(member);
        }
        if (member.parent.flags & 8388608 && !ts2.isEnumConst(member.parent) && getEnumKind(getSymbolOfNode(member.parent)) === 0) {
          return void 0;
        }
        if (autoValue !== void 0) {
          return autoValue;
        }
        error(member.name, ts2.Diagnostics.Enum_member_must_have_initializer);
        return void 0;
      }
      function computeConstantValue(member) {
        var enumKind = getEnumKind(getSymbolOfNode(member.parent));
        var isConstEnum = ts2.isEnumConst(member.parent);
        var initializer = member.initializer;
        var value = enumKind === 1 && !isLiteralEnumMember(member) ? void 0 : evaluate(initializer);
        if (value !== void 0) {
          if (isConstEnum && typeof value === "number" && !isFinite(value)) {
            error(initializer, isNaN(value) ? ts2.Diagnostics.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN : ts2.Diagnostics.const_enum_member_initializer_was_evaluated_to_a_non_finite_value);
          }
        } else if (enumKind === 1) {
          error(initializer, ts2.Diagnostics.Computed_values_are_not_permitted_in_an_enum_with_string_valued_members);
          return 0;
        } else if (isConstEnum) {
          error(initializer, ts2.Diagnostics.const_enum_member_initializers_can_only_contain_literal_values_and_other_computed_enum_values);
        } else if (member.parent.flags & 8388608) {
          error(initializer, ts2.Diagnostics.In_ambient_enum_declarations_member_initializer_must_be_constant_expression);
        } else {
          var source = checkExpression(initializer);
          if (!isTypeAssignableToKind(source, 296)) {
            error(initializer, ts2.Diagnostics.Only_numeric_enums_can_have_computed_members_but_this_expression_has_type_0_If_you_do_not_need_exhaustiveness_checks_consider_using_an_object_literal_instead, typeToString(source));
          } else {
            checkTypeAssignableTo(source, getDeclaredTypeOfSymbol(getSymbolOfNode(member.parent)), initializer, void 0);
          }
        }
        return value;
        function evaluate(expr) {
          switch (expr.kind) {
            case 218:
              var value_2 = evaluate(expr.operand);
              if (typeof value_2 === "number") {
                switch (expr.operator) {
                  case 39:
                    return value_2;
                  case 40:
                    return -value_2;
                  case 54:
                    return ~value_2;
                }
              }
              break;
            case 220:
              var left = evaluate(expr.left);
              var right = evaluate(expr.right);
              if (typeof left === "number" && typeof right === "number") {
                switch (expr.operatorToken.kind) {
                  case 51:
                    return left | right;
                  case 50:
                    return left & right;
                  case 48:
                    return left >> right;
                  case 49:
                    return left >>> right;
                  case 47:
                    return left << right;
                  case 52:
                    return left ^ right;
                  case 41:
                    return left * right;
                  case 43:
                    return left / right;
                  case 39:
                    return left + right;
                  case 40:
                    return left - right;
                  case 44:
                    return left % right;
                  case 42:
                    return Math.pow(left, right);
                }
              } else if (typeof left === "string" && typeof right === "string" && expr.operatorToken.kind === 39) {
                return left + right;
              }
              break;
            case 10:
            case 14:
              return expr.text;
            case 8:
              checkGrammarNumericLiteral(expr);
              return +expr.text;
            case 211:
              return evaluate(expr.expression);
            case 79:
              var identifier = expr;
              if (ts2.isInfinityOrNaNString(identifier.escapedText)) {
                return +identifier.escapedText;
              }
              return ts2.nodeIsMissing(expr) ? 0 : evaluateEnumMember(expr, getSymbolOfNode(member.parent), identifier.escapedText);
            case 206:
            case 205:
              var ex = expr;
              if (isConstantMemberAccess(ex)) {
                var type = getTypeOfExpression(ex.expression);
                if (type.symbol && type.symbol.flags & 384) {
                  var name = void 0;
                  if (ex.kind === 205) {
                    name = ex.name.escapedText;
                  } else {
                    name = ts2.escapeLeadingUnderscores(ts2.cast(ex.argumentExpression, ts2.isLiteralExpression).text);
                  }
                  return evaluateEnumMember(expr, type.symbol, name);
                }
              }
              break;
          }
          return void 0;
        }
        function evaluateEnumMember(expr, enumSymbol, name) {
          var memberSymbol = enumSymbol.exports.get(name);
          if (memberSymbol) {
            var declaration = memberSymbol.valueDeclaration;
            if (declaration !== member) {
              if (declaration && isBlockScopedNameDeclaredBeforeUse(declaration, member)) {
                return getEnumMemberValue(declaration);
              }
              error(expr, ts2.Diagnostics.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums);
              return 0;
            } else {
              error(expr, ts2.Diagnostics.Property_0_is_used_before_being_assigned, symbolToString(memberSymbol));
            }
          }
          return void 0;
        }
      }
      function isConstantMemberAccess(node) {
        return node.kind === 79 || node.kind === 205 && isConstantMemberAccess(node.expression) || node.kind === 206 && isConstantMemberAccess(node.expression) && ts2.isStringLiteralLike(node.argumentExpression);
      }
      function checkEnumDeclaration(node) {
        if (!produceDiagnostics) {
          return;
        }
        checkGrammarDecoratorsAndModifiers(node);
        checkCollisionsForDeclarationName(node, node.name);
        checkExportsOnMergedDeclarations(node);
        node.members.forEach(checkEnumMember);
        computeEnumMemberValues(node);
        var enumSymbol = getSymbolOfNode(node);
        var firstDeclaration = ts2.getDeclarationOfKind(enumSymbol, node.kind);
        if (node === firstDeclaration) {
          if (enumSymbol.declarations && enumSymbol.declarations.length > 1) {
            var enumIsConst_1 = ts2.isEnumConst(node);
            ts2.forEach(enumSymbol.declarations, function(decl) {
              if (ts2.isEnumDeclaration(decl) && ts2.isEnumConst(decl) !== enumIsConst_1) {
                error(ts2.getNameOfDeclaration(decl), ts2.Diagnostics.Enum_declarations_must_all_be_const_or_non_const);
              }
            });
          }
          var seenEnumMissingInitialInitializer_1 = false;
          ts2.forEach(enumSymbol.declarations, function(declaration) {
            if (declaration.kind !== 259) {
              return false;
            }
            var enumDeclaration = declaration;
            if (!enumDeclaration.members.length) {
              return false;
            }
            var firstEnumMember = enumDeclaration.members[0];
            if (!firstEnumMember.initializer) {
              if (seenEnumMissingInitialInitializer_1) {
                error(firstEnumMember.name, ts2.Diagnostics.In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element);
              } else {
                seenEnumMissingInitialInitializer_1 = true;
              }
            }
          });
        }
      }
      function checkEnumMember(node) {
        if (ts2.isPrivateIdentifier(node.name)) {
          error(node, ts2.Diagnostics.An_enum_member_cannot_be_named_with_a_private_identifier);
        }
      }
      function getFirstNonAmbientClassOrFunctionDeclaration(symbol) {
        var declarations = symbol.declarations;
        if (declarations) {
          for (var _i = 0, declarations_8 = declarations; _i < declarations_8.length; _i++) {
            var declaration = declarations_8[_i];
            if ((declaration.kind === 256 || declaration.kind === 255 && ts2.nodeIsPresent(declaration.body)) && !(declaration.flags & 8388608)) {
              return declaration;
            }
          }
        }
        return void 0;
      }
      function inSameLexicalScope(node1, node2) {
        var container1 = ts2.getEnclosingBlockScopeContainer(node1);
        var container2 = ts2.getEnclosingBlockScopeContainer(node2);
        if (isGlobalSourceFile(container1)) {
          return isGlobalSourceFile(container2);
        } else if (isGlobalSourceFile(container2)) {
          return false;
        } else {
          return container1 === container2;
        }
      }
      function checkModuleDeclaration(node) {
        if (produceDiagnostics) {
          var isGlobalAugmentation = ts2.isGlobalScopeAugmentation(node);
          var inAmbientContext = node.flags & 8388608;
          if (isGlobalAugmentation && !inAmbientContext) {
            error(node.name, ts2.Diagnostics.Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambient_context);
          }
          var isAmbientExternalModule = ts2.isAmbientModule(node);
          var contextErrorMessage = isAmbientExternalModule ? ts2.Diagnostics.An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file : ts2.Diagnostics.A_namespace_declaration_is_only_allowed_in_a_namespace_or_module;
          if (checkGrammarModuleElementContext(node, contextErrorMessage)) {
            return;
          }
          if (!checkGrammarDecoratorsAndModifiers(node)) {
            if (!inAmbientContext && node.name.kind === 10) {
              grammarErrorOnNode(node.name, ts2.Diagnostics.Only_ambient_modules_can_use_quoted_names);
            }
          }
          if (ts2.isIdentifier(node.name)) {
            checkCollisionsForDeclarationName(node, node.name);
          }
          checkExportsOnMergedDeclarations(node);
          var symbol = getSymbolOfNode(node);
          if (symbol.flags & 512 && !inAmbientContext && symbol.declarations && symbol.declarations.length > 1 && isInstantiatedModule(node, ts2.shouldPreserveConstEnums(compilerOptions))) {
            var firstNonAmbientClassOrFunc = getFirstNonAmbientClassOrFunctionDeclaration(symbol);
            if (firstNonAmbientClassOrFunc) {
              if (ts2.getSourceFileOfNode(node) !== ts2.getSourceFileOfNode(firstNonAmbientClassOrFunc)) {
                error(node.name, ts2.Diagnostics.A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged);
              } else if (node.pos < firstNonAmbientClassOrFunc.pos) {
                error(node.name, ts2.Diagnostics.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged);
              }
            }
            var mergedClass = ts2.getDeclarationOfKind(symbol, 256);
            if (mergedClass && inSameLexicalScope(node, mergedClass)) {
              getNodeLinks(node).flags |= 32768;
            }
          }
          if (isAmbientExternalModule) {
            if (ts2.isExternalModuleAugmentation(node)) {
              var checkBody = isGlobalAugmentation || getSymbolOfNode(node).flags & 33554432;
              if (checkBody && node.body) {
                for (var _i = 0, _a = node.body.statements; _i < _a.length; _i++) {
                  var statement = _a[_i];
                  checkModuleAugmentationElement(statement, isGlobalAugmentation);
                }
              }
            } else if (isGlobalSourceFile(node.parent)) {
              if (isGlobalAugmentation) {
                error(node.name, ts2.Diagnostics.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations);
              } else if (ts2.isExternalModuleNameRelative(ts2.getTextOfIdentifierOrLiteral(node.name))) {
                error(node.name, ts2.Diagnostics.Ambient_module_declaration_cannot_specify_relative_module_name);
              }
            } else {
              if (isGlobalAugmentation) {
                error(node.name, ts2.Diagnostics.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations);
              } else {
                error(node.name, ts2.Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces);
              }
            }
          }
        }
        if (node.body) {
          checkSourceElement(node.body);
          if (!ts2.isGlobalScopeAugmentation(node)) {
            registerForUnusedIdentifiersCheck(node);
          }
        }
      }
      function checkModuleAugmentationElement(node, isGlobalAugmentation) {
        var _a;
        switch (node.kind) {
          case 236:
            for (var _i = 0, _b = node.declarationList.declarations; _i < _b.length; _i++) {
              var decl = _b[_i];
              checkModuleAugmentationElement(decl, isGlobalAugmentation);
            }
            break;
          case 270:
          case 271:
            grammarErrorOnFirstToken(node, ts2.Diagnostics.Exports_and_export_assignments_are_not_permitted_in_module_augmentations);
            break;
          case 264:
          case 265:
            grammarErrorOnFirstToken(node, ts2.Diagnostics.Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_module);
            break;
          case 202:
          case 253:
            var name = node.name;
            if (ts2.isBindingPattern(name)) {
              for (var _c = 0, _d = name.elements; _c < _d.length; _c++) {
                var el = _d[_c];
                checkModuleAugmentationElement(el, isGlobalAugmentation);
              }
              break;
            }
          case 256:
          case 259:
          case 255:
          case 257:
          case 260:
          case 258:
            if (isGlobalAugmentation) {
              return;
            }
            var symbol = getSymbolOfNode(node);
            if (symbol) {
              var reportError = !(symbol.flags & 33554432);
              if (!reportError) {
                reportError = !!((_a = symbol.parent) === null || _a === void 0 ? void 0 : _a.declarations) && ts2.isExternalModuleAugmentation(symbol.parent.declarations[0]);
              }
            }
            break;
        }
      }
      function getFirstNonModuleExportsIdentifier(node) {
        switch (node.kind) {
          case 79:
            return node;
          case 160:
            do {
              node = node.left;
            } while (node.kind !== 79);
            return node;
          case 205:
            do {
              if (ts2.isModuleExportsAccessExpression(node.expression) && !ts2.isPrivateIdentifier(node.name)) {
                return node.name;
              }
              node = node.expression;
            } while (node.kind !== 79);
            return node;
        }
      }
      function checkExternalImportOrExportDeclaration(node) {
        var moduleName = ts2.getExternalModuleName(node);
        if (!moduleName || ts2.nodeIsMissing(moduleName)) {
          return false;
        }
        if (!ts2.isStringLiteral(moduleName)) {
          error(moduleName, ts2.Diagnostics.String_literal_expected);
          return false;
        }
        var inAmbientExternalModule = node.parent.kind === 261 && ts2.isAmbientModule(node.parent.parent);
        if (node.parent.kind !== 303 && !inAmbientExternalModule) {
          error(moduleName, node.kind === 271 ? ts2.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace : ts2.Diagnostics.Import_declarations_in_a_namespace_cannot_reference_a_module);
          return false;
        }
        if (inAmbientExternalModule && ts2.isExternalModuleNameRelative(moduleName.text)) {
          if (!isTopLevelInExternalModuleAugmentation(node)) {
            error(node, ts2.Diagnostics.Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name);
            return false;
          }
        }
        return true;
      }
      function checkAliasSymbol(node) {
        var _a;
        var symbol = getSymbolOfNode(node);
        var target = resolveAlias(symbol);
        if (target !== unknownSymbol) {
          symbol = getMergedSymbol(symbol.exportSymbol || symbol);
          var excludedMeanings = (symbol.flags & (111551 | 1048576) ? 111551 : 0) | (symbol.flags & 788968 ? 788968 : 0) | (symbol.flags & 1920 ? 1920 : 0);
          if (target.flags & excludedMeanings) {
            var message = node.kind === 274 ? ts2.Diagnostics.Export_declaration_conflicts_with_exported_declaration_of_0 : ts2.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0;
            error(node, message, symbolToString(symbol));
          }
          if (compilerOptions.isolatedModules && !ts2.isTypeOnlyImportOrExportDeclaration(node) && !(node.flags & 8388608)) {
            var typeOnlyAlias = getTypeOnlyAliasDeclaration(symbol);
            var isType = !(target.flags & 111551);
            if (isType || typeOnlyAlias) {
              switch (node.kind) {
                case 266:
                case 269:
                case 264: {
                  if (compilerOptions.preserveValueImports) {
                    ts2.Debug.assertIsDefined(node.name, "An ImportClause with a symbol should have a name");
                    var message = isType ? ts2.Diagnostics._0_is_a_type_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled : ts2.Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_imported_using_a_type_only_import_when_preserveValueImports_and_isolatedModules_are_both_enabled;
                    var name = ts2.idText(node.kind === 269 ? node.propertyName || node.name : node.name);
                    addTypeOnlyDeclarationRelatedInfo(error(node, message, name), isType ? void 0 : typeOnlyAlias, name);
                  }
                  break;
                }
                case 274: {
                  if (ts2.getSourceFileOfNode(typeOnlyAlias) !== ts2.getSourceFileOfNode(node)) {
                    var message = isType ? ts2.Diagnostics.Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type : ts2.Diagnostics._0_resolves_to_a_type_only_declaration_and_must_be_re_exported_using_a_type_only_re_export_when_isolatedModules_is_enabled;
                    var name = ts2.idText(node.propertyName || node.name);
                    addTypeOnlyDeclarationRelatedInfo(error(node, message, name), isType ? void 0 : typeOnlyAlias, name);
                    return;
                  }
                }
              }
            }
          }
          if (ts2.isImportSpecifier(node) && ((_a = target.declarations) === null || _a === void 0 ? void 0 : _a.every(function(d) {
            return !!(ts2.getCombinedNodeFlags(d) & 134217728);
          }))) {
            addDeprecatedSuggestion(node.name, target.declarations, symbol.escapedName);
          }
        }
      }
      function checkImportBinding(node) {
        checkCollisionsForDeclarationName(node, node.name);
        checkAliasSymbol(node);
        if (node.kind === 269 && ts2.idText(node.propertyName || node.name) === "default" && ts2.getESModuleInterop(compilerOptions) && moduleKind !== ts2.ModuleKind.System && (moduleKind < ts2.ModuleKind.ES2015 || ts2.getSourceFileOfNode(node).impliedNodeFormat === ts2.ModuleKind.CommonJS)) {
          checkExternalEmitHelpers(node, 131072);
        }
      }
      function checkAssertClause(declaration) {
        var _a;
        if (declaration.assertClause) {
          if (moduleKind !== ts2.ModuleKind.ESNext) {
            return grammarErrorOnNode(declaration.assertClause, ts2.Diagnostics.Import_assertions_are_only_supported_when_the_module_option_is_set_to_esnext);
          }
          if (ts2.isImportDeclaration(declaration) ? (_a = declaration.importClause) === null || _a === void 0 ? void 0 : _a.isTypeOnly : declaration.isTypeOnly) {
            return grammarErrorOnNode(declaration.assertClause, ts2.Diagnostics.Import_assertions_cannot_be_used_with_type_only_imports_or_exports);
          }
        }
      }
      function checkImportDeclaration(node) {
        if (checkGrammarModuleElementContext(node, ts2.Diagnostics.An_import_declaration_can_only_be_used_in_a_namespace_or_module)) {
          return;
        }
        if (!checkGrammarDecoratorsAndModifiers(node) && ts2.hasEffectiveModifiers(node)) {
          grammarErrorOnFirstToken(node, ts2.Diagnostics.An_import_declaration_cannot_have_modifiers);
        }
        if (checkExternalImportOrExportDeclaration(node)) {
          var importClause = node.importClause;
          if (importClause && !checkGrammarImportClause(importClause)) {
            if (importClause.name) {
              checkImportBinding(importClause);
            }
            if (importClause.namedBindings) {
              if (importClause.namedBindings.kind === 267) {
                checkImportBinding(importClause.namedBindings);
                if (moduleKind !== ts2.ModuleKind.System && (moduleKind < ts2.ModuleKind.ES2015 || ts2.getSourceFileOfNode(node).impliedNodeFormat === ts2.ModuleKind.CommonJS) && ts2.getESModuleInterop(compilerOptions)) {
                  checkExternalEmitHelpers(node, 65536);
                }
              } else {
                var moduleExisted = resolveExternalModuleName(node, node.moduleSpecifier);
                if (moduleExisted) {
                  ts2.forEach(importClause.namedBindings.elements, checkImportBinding);
                }
              }
            }
          }
        }
        checkAssertClause(node);
      }
      function checkImportEqualsDeclaration(node) {
        if (checkGrammarModuleElementContext(node, ts2.Diagnostics.An_import_declaration_can_only_be_used_in_a_namespace_or_module)) {
          return;
        }
        checkGrammarDecoratorsAndModifiers(node);
        if (ts2.isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) {
          checkImportBinding(node);
          if (ts2.hasSyntacticModifier(node, 1)) {
            markExportAsReferenced(node);
          }
          if (node.moduleReference.kind !== 276) {
            var target = resolveAlias(getSymbolOfNode(node));
            if (target !== unknownSymbol) {
              if (target.flags & 111551) {
                var moduleName = ts2.getFirstIdentifier(node.moduleReference);
                if (!(resolveEntityName(moduleName, 111551 | 1920).flags & 1920)) {
                  error(moduleName, ts2.Diagnostics.Module_0_is_hidden_by_a_local_declaration_with_the_same_name, ts2.declarationNameToString(moduleName));
                }
              }
              if (target.flags & 788968) {
                checkTypeNameIsReserved(node.name, ts2.Diagnostics.Import_name_cannot_be_0);
              }
            }
            if (node.isTypeOnly) {
              grammarErrorOnNode(node, ts2.Diagnostics.An_import_alias_cannot_use_import_type);
            }
          } else {
            if (moduleKind >= ts2.ModuleKind.ES2015 && ts2.getSourceFileOfNode(node).impliedNodeFormat === void 0 && !node.isTypeOnly && !(node.flags & 8388608)) {
              grammarErrorOnNode(node, ts2.Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead);
            }
          }
        }
      }
      function checkExportDeclaration(node) {
        if (checkGrammarModuleElementContext(node, ts2.Diagnostics.An_export_declaration_can_only_be_used_in_a_module)) {
          return;
        }
        if (!checkGrammarDecoratorsAndModifiers(node) && ts2.hasEffectiveModifiers(node)) {
          grammarErrorOnFirstToken(node, ts2.Diagnostics.An_export_declaration_cannot_have_modifiers);
        }
        if (node.moduleSpecifier && node.exportClause && ts2.isNamedExports(node.exportClause) && ts2.length(node.exportClause.elements) && languageVersion === 0) {
          checkExternalEmitHelpers(node, 4194304);
        }
        checkGrammarExportDeclaration(node);
        if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) {
          if (node.exportClause && !ts2.isNamespaceExport(node.exportClause)) {
            ts2.forEach(node.exportClause.elements, checkExportSpecifier);
            var inAmbientExternalModule = node.parent.kind === 261 && ts2.isAmbientModule(node.parent.parent);
            var inAmbientNamespaceDeclaration = !inAmbientExternalModule && node.parent.kind === 261 && !node.moduleSpecifier && node.flags & 8388608;
            if (node.parent.kind !== 303 && !inAmbientExternalModule && !inAmbientNamespaceDeclaration) {
              error(node, ts2.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace);
            }
          } else {
            var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
            if (moduleSymbol && hasExportAssignmentSymbol(moduleSymbol)) {
              error(node.moduleSpecifier, ts2.Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
            } else if (node.exportClause) {
              checkAliasSymbol(node.exportClause);
            }
            if (moduleKind !== ts2.ModuleKind.System && (moduleKind < ts2.ModuleKind.ES2015 || ts2.getSourceFileOfNode(node).impliedNodeFormat === ts2.ModuleKind.CommonJS)) {
              if (node.exportClause) {
                if (ts2.getESModuleInterop(compilerOptions)) {
                  checkExternalEmitHelpers(node, 65536);
                }
              } else {
                checkExternalEmitHelpers(node, 32768);
              }
            }
          }
        }
        checkAssertClause(node);
      }
      function checkGrammarExportDeclaration(node) {
        var _a;
        if (node.isTypeOnly) {
          if (((_a = node.exportClause) === null || _a === void 0 ? void 0 : _a.kind) === 272) {
            return checkGrammarNamedImportsOrExports(node.exportClause);
          } else {
            return grammarErrorOnNode(node, ts2.Diagnostics.Only_named_exports_may_use_export_type);
          }
        }
        return false;
      }
      function checkGrammarModuleElementContext(node, errorMessage) {
        var isInAppropriateContext = node.parent.kind === 303 || node.parent.kind === 261 || node.parent.kind === 260;
        if (!isInAppropriateContext) {
          grammarErrorOnFirstToken(node, errorMessage);
        }
        return !isInAppropriateContext;
      }
      function importClauseContainsReferencedImport(importClause) {
        return ts2.forEachImportClauseDeclaration(importClause, function(declaration) {
          return !!getSymbolOfNode(declaration).isReferenced;
        });
      }
      function importClauseContainsConstEnumUsedAsValue(importClause) {
        return ts2.forEachImportClauseDeclaration(importClause, function(declaration) {
          return !!getSymbolLinks(getSymbolOfNode(declaration)).constEnumReferenced;
        });
      }
      function canConvertImportDeclarationToTypeOnly(statement) {
        return ts2.isImportDeclaration(statement) && statement.importClause && !statement.importClause.isTypeOnly && importClauseContainsReferencedImport(statement.importClause) && !isReferencedAliasDeclaration(statement.importClause, true) && !importClauseContainsConstEnumUsedAsValue(statement.importClause);
      }
      function canConvertImportEqualsDeclarationToTypeOnly(statement) {
        return ts2.isImportEqualsDeclaration(statement) && ts2.isExternalModuleReference(statement.moduleReference) && !statement.isTypeOnly && getSymbolOfNode(statement).isReferenced && !isReferencedAliasDeclaration(statement, false) && !getSymbolLinks(getSymbolOfNode(statement)).constEnumReferenced;
      }
      function checkImportsForTypeOnlyConversion(sourceFile) {
        for (var _i = 0, _a = sourceFile.statements; _i < _a.length; _i++) {
          var statement = _a[_i];
          if (canConvertImportDeclarationToTypeOnly(statement) || canConvertImportEqualsDeclarationToTypeOnly(statement)) {
            error(statement, ts2.Diagnostics.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error);
          }
        }
      }
      function checkExportSpecifier(node) {
        checkAliasSymbol(node);
        if (ts2.getEmitDeclarations(compilerOptions)) {
          collectLinkedAliases(node.propertyName || node.name, true);
        }
        if (!node.parent.parent.moduleSpecifier) {
          var exportedName = node.propertyName || node.name;
          var symbol = resolveName(exportedName, exportedName.escapedText, 111551 | 788968 | 1920 | 2097152, void 0, void 0, true);
          if (symbol && (symbol === undefinedSymbol || symbol === globalThisSymbol || symbol.declarations && isGlobalSourceFile(getDeclarationContainer(symbol.declarations[0])))) {
            error(exportedName, ts2.Diagnostics.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, ts2.idText(exportedName));
          } else {
            markExportAsReferenced(node);
            var target = symbol && (symbol.flags & 2097152 ? resolveAlias(symbol) : symbol);
            if (!target || target === unknownSymbol || target.flags & 111551) {
              checkExpressionCached(node.propertyName || node.name);
            }
          }
        } else {
          if (ts2.getESModuleInterop(compilerOptions) && moduleKind !== ts2.ModuleKind.System && (moduleKind < ts2.ModuleKind.ES2015 || ts2.getSourceFileOfNode(node).impliedNodeFormat === ts2.ModuleKind.CommonJS) && ts2.idText(node.propertyName || node.name) === "default") {
            checkExternalEmitHelpers(node, 131072);
          }
        }
      }
      function checkExportAssignment(node) {
        var illegalContextMessage = node.isExportEquals ? ts2.Diagnostics.An_export_assignment_must_be_at_the_top_level_of_a_file_or_module_declaration : ts2.Diagnostics.A_default_export_must_be_at_the_top_level_of_a_file_or_module_declaration;
        if (checkGrammarModuleElementContext(node, illegalContextMessage)) {
          return;
        }
        var container = node.parent.kind === 303 ? node.parent : node.parent.parent;
        if (container.kind === 260 && !ts2.isAmbientModule(container)) {
          if (node.isExportEquals) {
            error(node, ts2.Diagnostics.An_export_assignment_cannot_be_used_in_a_namespace);
          } else {
            error(node, ts2.Diagnostics.A_default_export_can_only_be_used_in_an_ECMAScript_style_module);
          }
          return;
        }
        if (!checkGrammarDecoratorsAndModifiers(node) && ts2.hasEffectiveModifiers(node)) {
          grammarErrorOnFirstToken(node, ts2.Diagnostics.An_export_assignment_cannot_have_modifiers);
        }
        var typeAnnotationNode = ts2.getEffectiveTypeAnnotationNode(node);
        if (typeAnnotationNode) {
          checkTypeAssignableTo(checkExpressionCached(node.expression), getTypeFromTypeNode(typeAnnotationNode), node.expression);
        }
        if (node.expression.kind === 79) {
          var id = node.expression;
          var sym = resolveEntityName(id, 67108863, true, true, node);
          if (sym) {
            markAliasReferenced(sym, id);
            var target = sym.flags & 2097152 ? resolveAlias(sym) : sym;
            if (target === unknownSymbol || target.flags & 111551) {
              checkExpressionCached(node.expression);
            }
          } else {
            checkExpressionCached(node.expression);
          }
          if (ts2.getEmitDeclarations(compilerOptions)) {
            collectLinkedAliases(node.expression, true);
          }
        } else {
          checkExpressionCached(node.expression);
        }
        checkExternalModuleExports(container);
        if (node.flags & 8388608 && !ts2.isEntityNameExpression(node.expression)) {
          grammarErrorOnNode(node.expression, ts2.Diagnostics.The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context);
        }
        if (node.isExportEquals && !(node.flags & 8388608)) {
          if (moduleKind >= ts2.ModuleKind.ES2015 && ts2.getSourceFileOfNode(node).impliedNodeFormat !== ts2.ModuleKind.CommonJS) {
            grammarErrorOnNode(node, ts2.Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_export_default_or_another_module_format_instead);
          } else if (moduleKind === ts2.ModuleKind.System) {
            grammarErrorOnNode(node, ts2.Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system);
          }
        }
      }
      function hasExportedMembers(moduleSymbol) {
        return ts2.forEachEntry(moduleSymbol.exports, function(_, id) {
          return id !== "export=";
        });
      }
      function checkExternalModuleExports(node) {
        var moduleSymbol = getSymbolOfNode(node);
        var links = getSymbolLinks(moduleSymbol);
        if (!links.exportsChecked) {
          var exportEqualsSymbol = moduleSymbol.exports.get("export=");
          if (exportEqualsSymbol && hasExportedMembers(moduleSymbol)) {
            var declaration = getDeclarationOfAliasSymbol(exportEqualsSymbol) || exportEqualsSymbol.valueDeclaration;
            if (declaration && !isTopLevelInExternalModuleAugmentation(declaration) && !ts2.isInJSFile(declaration)) {
              error(declaration, ts2.Diagnostics.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements);
            }
          }
          var exports_2 = getExportsOfModule(moduleSymbol);
          if (exports_2) {
            exports_2.forEach(function(_a, id) {
              var declarations = _a.declarations, flags = _a.flags;
              if (id === "__export") {
                return;
              }
              if (flags & (1920 | 64 | 384)) {
                return;
              }
              var exportedDeclarationsCount = ts2.countWhere(declarations, isNotOverloadAndNotAccessor);
              if (flags & 524288 && exportedDeclarationsCount <= 2) {
                return;
              }
              if (exportedDeclarationsCount > 1) {
                if (!isDuplicatedCommonJSExport(declarations)) {
                  for (var _i = 0, _b = declarations; _i < _b.length; _i++) {
                    var declaration2 = _b[_i];
                    if (isNotOverload(declaration2)) {
                      diagnostics.add(ts2.createDiagnosticForNode(declaration2, ts2.Diagnostics.Cannot_redeclare_exported_variable_0, ts2.unescapeLeadingUnderscores(id)));
                    }
                  }
                }
              }
            });
          }
          links.exportsChecked = true;
        }
      }
      function isDuplicatedCommonJSExport(declarations) {
        return declarations && declarations.length > 1 && declarations.every(function(d) {
          return ts2.isInJSFile(d) && ts2.isAccessExpression(d) && (ts2.isExportsIdentifier(d.expression) || ts2.isModuleExportsAccessExpression(d.expression));
        });
      }
      function checkSourceElement(node) {
        if (node) {
          var saveCurrentNode = currentNode;
          currentNode = node;
          instantiationCount = 0;
          checkSourceElementWorker(node);
          currentNode = saveCurrentNode;
        }
      }
      function checkSourceElementWorker(node) {
        if (ts2.isInJSFile(node)) {
          ts2.forEach(node.jsDoc, function(_a) {
            var tags = _a.tags;
            return ts2.forEach(tags, checkSourceElement);
          });
        }
        var kind = node.kind;
        if (cancellationToken) {
          switch (kind) {
            case 260:
            case 256:
            case 257:
            case 255:
              cancellationToken.throwIfCancellationRequested();
          }
        }
        if (kind >= 236 && kind <= 252 && node.flowNode && !isReachableFlowNode(node.flowNode)) {
          errorOrSuggestion(compilerOptions.allowUnreachableCode === false, node, ts2.Diagnostics.Unreachable_code_detected);
        }
        switch (kind) {
          case 162:
            return checkTypeParameter(node);
          case 163:
            return checkParameter(node);
          case 166:
            return checkPropertyDeclaration(node);
          case 165:
            return checkPropertySignature(node);
          case 179:
          case 178:
          case 173:
          case 174:
          case 175:
            return checkSignatureDeclaration(node);
          case 168:
          case 167:
            return checkMethodDeclaration(node);
          case 169:
            return checkClassStaticBlockDeclaration(node);
          case 170:
            return checkConstructorDeclaration(node);
          case 171:
          case 172:
            return checkAccessorDeclaration(node);
          case 177:
            return checkTypeReferenceNode(node);
          case 176:
            return checkTypePredicate(node);
          case 180:
            return checkTypeQuery(node);
          case 181:
            return checkTypeLiteral(node);
          case 182:
            return checkArrayType(node);
          case 183:
            return checkTupleType(node);
          case 186:
          case 187:
            return checkUnionOrIntersectionType(node);
          case 190:
          case 184:
          case 185:
            return checkSourceElement(node.type);
          case 191:
            return checkThisType(node);
          case 192:
            return checkTypeOperator(node);
          case 188:
            return checkConditionalType(node);
          case 189:
            return checkInferType(node);
          case 197:
            return checkTemplateLiteralType(node);
          case 199:
            return checkImportType(node);
          case 196:
            return checkNamedTupleMember(node);
          case 326:
            return checkJSDocAugmentsTag(node);
          case 327:
            return checkJSDocImplementsTag(node);
          case 343:
          case 336:
          case 337:
            return checkJSDocTypeAliasTag(node);
          case 342:
            return checkJSDocTemplateTag(node);
          case 341:
            return checkJSDocTypeTag(node);
          case 338:
            return checkJSDocParameterTag(node);
          case 345:
            return checkJSDocPropertyTag(node);
          case 315:
            checkJSDocFunctionType(node);
          case 313:
          case 312:
          case 310:
          case 311:
          case 320:
            checkJSDocTypeIsInJsFile(node);
            ts2.forEachChild(node, checkSourceElement);
            return;
          case 316:
            checkJSDocVariadicType(node);
            return;
          case 307:
            return checkSourceElement(node.type);
          case 331:
          case 333:
          case 332:
            return checkJSDocAccessibilityModifiers(node);
          case 193:
            return checkIndexedAccessType(node);
          case 194:
            return checkMappedType(node);
          case 255:
            return checkFunctionDeclaration(node);
          case 234:
          case 261:
            return checkBlock(node);
          case 236:
            return checkVariableStatement(node);
          case 237:
            return checkExpressionStatement(node);
          case 238:
            return checkIfStatement(node);
          case 239:
            return checkDoStatement(node);
          case 240:
            return checkWhileStatement(node);
          case 241:
            return checkForStatement(node);
          case 242:
            return checkForInStatement(node);
          case 243:
            return checkForOfStatement(node);
          case 244:
          case 245:
            return checkBreakOrContinueStatement(node);
          case 246:
            return checkReturnStatement(node);
          case 247:
            return checkWithStatement(node);
          case 248:
            return checkSwitchStatement(node);
          case 249:
            return checkLabeledStatement(node);
          case 250:
            return checkThrowStatement(node);
          case 251:
            return checkTryStatement(node);
          case 253:
            return checkVariableDeclaration(node);
          case 202:
            return checkBindingElement(node);
          case 256:
            return checkClassDeclaration(node);
          case 257:
            return checkInterfaceDeclaration(node);
          case 258:
            return checkTypeAliasDeclaration(node);
          case 259:
            return checkEnumDeclaration(node);
          case 260:
            return checkModuleDeclaration(node);
          case 265:
            return checkImportDeclaration(node);
          case 264:
            return checkImportEqualsDeclaration(node);
          case 271:
            return checkExportDeclaration(node);
          case 270:
            return checkExportAssignment(node);
          case 235:
          case 252:
            checkGrammarStatementInAmbientContext(node);
            return;
          case 275:
            return checkMissingDeclaration(node);
        }
      }
      function checkJSDocTypeIsInJsFile(node) {
        if (!ts2.isInJSFile(node)) {
          grammarErrorOnNode(node, ts2.Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments);
        }
      }
      function checkJSDocVariadicType(node) {
        checkJSDocTypeIsInJsFile(node);
        checkSourceElement(node.type);
        var parent = node.parent;
        if (ts2.isParameter(parent) && ts2.isJSDocFunctionType(parent.parent)) {
          if (ts2.last(parent.parent.parameters) !== parent) {
            error(node, ts2.Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
          }
          return;
        }
        if (!ts2.isJSDocTypeExpression(parent)) {
          error(node, ts2.Diagnostics.JSDoc_may_only_appear_in_the_last_parameter_of_a_signature);
        }
        var paramTag = node.parent.parent;
        if (!ts2.isJSDocParameterTag(paramTag)) {
          error(node, ts2.Diagnostics.JSDoc_may_only_appear_in_the_last_parameter_of_a_signature);
          return;
        }
        var param = ts2.getParameterSymbolFromJSDoc(paramTag);
        if (!param) {
          return;
        }
        var host2 = ts2.getHostSignatureFromJSDoc(paramTag);
        if (!host2 || ts2.last(host2.parameters).symbol !== param) {
          error(node, ts2.Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
        }
      }
      function getTypeFromJSDocVariadicType(node) {
        var type = getTypeFromTypeNode(node.type);
        var parent = node.parent;
        var paramTag = node.parent.parent;
        if (ts2.isJSDocTypeExpression(node.parent) && ts2.isJSDocParameterTag(paramTag)) {
          var host_1 = ts2.getHostSignatureFromJSDoc(paramTag);
          var isCallbackTag = ts2.isJSDocCallbackTag(paramTag.parent.parent);
          if (host_1 || isCallbackTag) {
            var lastParamDeclaration = isCallbackTag ? ts2.lastOrUndefined(paramTag.parent.parent.typeExpression.parameters) : ts2.lastOrUndefined(host_1.parameters);
            var symbol = ts2.getParameterSymbolFromJSDoc(paramTag);
            if (!lastParamDeclaration || symbol && lastParamDeclaration.symbol === symbol && ts2.isRestParameter(lastParamDeclaration)) {
              return createArrayType(type);
            }
          }
        }
        if (ts2.isParameter(parent) && ts2.isJSDocFunctionType(parent.parent)) {
          return createArrayType(type);
        }
        return addOptionality(type);
      }
      function checkNodeDeferred(node) {
        var enclosingFile = ts2.getSourceFileOfNode(node);
        var links = getNodeLinks(enclosingFile);
        if (!(links.flags & 1)) {
          links.deferredNodes = links.deferredNodes || new ts2.Map();
          var id = getNodeId(node);
          links.deferredNodes.set(id, node);
        }
      }
      function checkDeferredNodes(context) {
        var links = getNodeLinks(context);
        if (links.deferredNodes) {
          links.deferredNodes.forEach(checkDeferredNode);
        }
      }
      function checkDeferredNode(node) {
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("check", "checkDeferredNode", { kind: node.kind, pos: node.pos, end: node.end });
        var saveCurrentNode = currentNode;
        currentNode = node;
        instantiationCount = 0;
        switch (node.kind) {
          case 207:
          case 208:
          case 209:
          case 164:
          case 279:
            resolveUntypedCall(node);
            break;
          case 212:
          case 213:
          case 168:
          case 167:
            checkFunctionExpressionOrObjectLiteralMethodDeferred(node);
            break;
          case 171:
          case 172:
            checkAccessorDeclaration(node);
            break;
          case 225:
            checkClassExpressionDeferred(node);
            break;
          case 278:
            checkJsxSelfClosingElementDeferred(node);
            break;
          case 277:
            checkJsxElementDeferred(node);
            break;
        }
        currentNode = saveCurrentNode;
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      }
      function checkSourceFile(node) {
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("check", "checkSourceFile", { path: node.path }, true);
        ts2.performance.mark("beforeCheck");
        checkSourceFileWorker(node);
        ts2.performance.mark("afterCheck");
        ts2.performance.measure("Check", "beforeCheck", "afterCheck");
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      }
      function unusedIsError(kind, isAmbient) {
        if (isAmbient) {
          return false;
        }
        switch (kind) {
          case 0:
            return !!compilerOptions.noUnusedLocals;
          case 1:
            return !!compilerOptions.noUnusedParameters;
          default:
            return ts2.Debug.assertNever(kind);
        }
      }
      function getPotentiallyUnusedIdentifiers(sourceFile) {
        return allPotentiallyUnusedIdentifiers.get(sourceFile.path) || ts2.emptyArray;
      }
      function checkSourceFileWorker(node) {
        var links = getNodeLinks(node);
        if (!(links.flags & 1)) {
          if (ts2.skipTypeChecking(node, compilerOptions, host)) {
            return;
          }
          checkGrammarSourceFile(node);
          ts2.clear(potentialThisCollisions);
          ts2.clear(potentialNewTargetCollisions);
          ts2.clear(potentialWeakMapSetCollisions);
          ts2.clear(potentialReflectCollisions);
          ts2.forEach(node.statements, checkSourceElement);
          checkSourceElement(node.endOfFileToken);
          checkDeferredNodes(node);
          if (ts2.isExternalOrCommonJsModule(node)) {
            registerForUnusedIdentifiersCheck(node);
          }
          if (!node.isDeclarationFile && (compilerOptions.noUnusedLocals || compilerOptions.noUnusedParameters)) {
            checkUnusedIdentifiers(getPotentiallyUnusedIdentifiers(node), function(containingNode, kind, diag) {
              if (!ts2.containsParseError(containingNode) && unusedIsError(kind, !!(containingNode.flags & 8388608))) {
                diagnostics.add(diag);
              }
            });
          }
          if (compilerOptions.importsNotUsedAsValues === 2 && !node.isDeclarationFile && ts2.isExternalModule(node)) {
            checkImportsForTypeOnlyConversion(node);
          }
          if (ts2.isExternalOrCommonJsModule(node)) {
            checkExternalModuleExports(node);
          }
          if (potentialThisCollisions.length) {
            ts2.forEach(potentialThisCollisions, checkIfThisIsCapturedInEnclosingScope);
            ts2.clear(potentialThisCollisions);
          }
          if (potentialNewTargetCollisions.length) {
            ts2.forEach(potentialNewTargetCollisions, checkIfNewTargetIsCapturedInEnclosingScope);
            ts2.clear(potentialNewTargetCollisions);
          }
          if (potentialWeakMapSetCollisions.length) {
            ts2.forEach(potentialWeakMapSetCollisions, checkWeakMapSetCollision);
            ts2.clear(potentialWeakMapSetCollisions);
          }
          if (potentialReflectCollisions.length) {
            ts2.forEach(potentialReflectCollisions, checkReflectCollision);
            ts2.clear(potentialReflectCollisions);
          }
          links.flags |= 1;
        }
      }
      function getDiagnostics(sourceFile, ct) {
        try {
          cancellationToken = ct;
          return getDiagnosticsWorker(sourceFile);
        } finally {
          cancellationToken = void 0;
        }
      }
      function getDiagnosticsWorker(sourceFile) {
        throwIfNonDiagnosticsProducing();
        if (sourceFile) {
          var previousGlobalDiagnostics = diagnostics.getGlobalDiagnostics();
          var previousGlobalDiagnosticsSize = previousGlobalDiagnostics.length;
          checkSourceFile(sourceFile);
          var semanticDiagnostics = diagnostics.getDiagnostics(sourceFile.fileName);
          var currentGlobalDiagnostics = diagnostics.getGlobalDiagnostics();
          if (currentGlobalDiagnostics !== previousGlobalDiagnostics) {
            var deferredGlobalDiagnostics = ts2.relativeComplement(previousGlobalDiagnostics, currentGlobalDiagnostics, ts2.compareDiagnostics);
            return ts2.concatenate(deferredGlobalDiagnostics, semanticDiagnostics);
          } else if (previousGlobalDiagnosticsSize === 0 && currentGlobalDiagnostics.length > 0) {
            return ts2.concatenate(currentGlobalDiagnostics, semanticDiagnostics);
          }
          return semanticDiagnostics;
        }
        ts2.forEach(host.getSourceFiles(), checkSourceFile);
        return diagnostics.getDiagnostics();
      }
      function getGlobalDiagnostics() {
        throwIfNonDiagnosticsProducing();
        return diagnostics.getGlobalDiagnostics();
      }
      function throwIfNonDiagnosticsProducing() {
        if (!produceDiagnostics) {
          throw new Error("Trying to get diagnostics from a type checker that does not produce them.");
        }
      }
      function getSymbolsInScope(location, meaning) {
        if (location.flags & 16777216) {
          return [];
        }
        var symbols = ts2.createSymbolTable();
        var isStaticSymbol = false;
        populateSymbols();
        symbols.delete("this");
        return symbolsToArray(symbols);
        function populateSymbols() {
          while (location) {
            if (location.locals && !isGlobalSourceFile(location)) {
              copySymbols(location.locals, meaning);
            }
            switch (location.kind) {
              case 303:
                if (!ts2.isExternalModule(location))
                  break;
              case 260:
                copyLocallyVisibleExportSymbols(getSymbolOfNode(location).exports, meaning & 2623475);
                break;
              case 259:
                copySymbols(getSymbolOfNode(location).exports, meaning & 8);
                break;
              case 225:
                var className = location.name;
                if (className) {
                  copySymbol(location.symbol, meaning);
                }
              case 256:
              case 257:
                if (!isStaticSymbol) {
                  copySymbols(getMembersOfSymbol(getSymbolOfNode(location)), meaning & 788968);
                }
                break;
              case 212:
                var funcName = location.name;
                if (funcName) {
                  copySymbol(location.symbol, meaning);
                }
                break;
            }
            if (ts2.introducesArgumentsExoticObject(location)) {
              copySymbol(argumentsSymbol, meaning);
            }
            isStaticSymbol = ts2.isStatic(location);
            location = location.parent;
          }
          copySymbols(globals, meaning);
        }
        function copySymbol(symbol, meaning2) {
          if (ts2.getCombinedLocalAndExportSymbolFlags(symbol) & meaning2) {
            var id = symbol.escapedName;
            if (!symbols.has(id)) {
              symbols.set(id, symbol);
            }
          }
        }
        function copySymbols(source, meaning2) {
          if (meaning2) {
            source.forEach(function(symbol) {
              copySymbol(symbol, meaning2);
            });
          }
        }
        function copyLocallyVisibleExportSymbols(source, meaning2) {
          if (meaning2) {
            source.forEach(function(symbol) {
              if (!ts2.getDeclarationOfKind(symbol, 274) && !ts2.getDeclarationOfKind(symbol, 273)) {
                copySymbol(symbol, meaning2);
              }
            });
          }
        }
      }
      function isTypeDeclarationName(name) {
        return name.kind === 79 && isTypeDeclaration(name.parent) && ts2.getNameOfDeclaration(name.parent) === name;
      }
      function isTypeDeclaration(node) {
        switch (node.kind) {
          case 162:
          case 256:
          case 257:
          case 258:
          case 259:
          case 343:
          case 336:
          case 337:
            return true;
          case 266:
            return node.isTypeOnly;
          case 269:
          case 274:
            return node.parent.parent.isTypeOnly;
          default:
            return false;
        }
      }
      function isTypeReferenceIdentifier(node) {
        while (node.parent.kind === 160) {
          node = node.parent;
        }
        return node.parent.kind === 177;
      }
      function isHeritageClauseElementIdentifier(node) {
        while (node.parent.kind === 205) {
          node = node.parent;
        }
        return node.parent.kind === 227;
      }
      function forEachEnclosingClass(node, callback) {
        var result;
        while (true) {
          node = ts2.getContainingClass(node);
          if (!node)
            break;
          if (result = callback(node))
            break;
        }
        return result;
      }
      function isNodeUsedDuringClassInitialization(node) {
        return !!ts2.findAncestor(node, function(element) {
          if (ts2.isConstructorDeclaration(element) && ts2.nodeIsPresent(element.body) || ts2.isPropertyDeclaration(element)) {
            return true;
          } else if (ts2.isClassLike(element) || ts2.isFunctionLikeDeclaration(element)) {
            return "quit";
          }
          return false;
        });
      }
      function isNodeWithinClass(node, classDeclaration) {
        return !!forEachEnclosingClass(node, function(n) {
          return n === classDeclaration;
        });
      }
      function getLeftSideOfImportEqualsOrExportAssignment(nodeOnRightSide) {
        while (nodeOnRightSide.parent.kind === 160) {
          nodeOnRightSide = nodeOnRightSide.parent;
        }
        if (nodeOnRightSide.parent.kind === 264) {
          return nodeOnRightSide.parent.moduleReference === nodeOnRightSide ? nodeOnRightSide.parent : void 0;
        }
        if (nodeOnRightSide.parent.kind === 270) {
          return nodeOnRightSide.parent.expression === nodeOnRightSide ? nodeOnRightSide.parent : void 0;
        }
        return void 0;
      }
      function isInRightSideOfImportOrExportAssignment(node) {
        return getLeftSideOfImportEqualsOrExportAssignment(node) !== void 0;
      }
      function getSpecialPropertyAssignmentSymbolFromEntityName(entityName) {
        var specialPropertyAssignmentKind = ts2.getAssignmentDeclarationKind(entityName.parent.parent);
        switch (specialPropertyAssignmentKind) {
          case 1:
          case 3:
            return getSymbolOfNode(entityName.parent);
          case 4:
          case 2:
          case 5:
            return getSymbolOfNode(entityName.parent.parent);
        }
      }
      function isImportTypeQualifierPart(node) {
        var parent = node.parent;
        while (ts2.isQualifiedName(parent)) {
          node = parent;
          parent = parent.parent;
        }
        if (parent && parent.kind === 199 && parent.qualifier === node) {
          return parent;
        }
        return void 0;
      }
      function getSymbolOfNameOrPropertyAccessExpression(name) {
        if (ts2.isDeclarationName(name)) {
          return getSymbolOfNode(name.parent);
        }
        if (ts2.isInJSFile(name) && name.parent.kind === 205 && name.parent === name.parent.parent.left) {
          if (!ts2.isPrivateIdentifier(name) && !ts2.isJSDocMemberName(name)) {
            var specialPropertyAssignmentSymbol = getSpecialPropertyAssignmentSymbolFromEntityName(name);
            if (specialPropertyAssignmentSymbol) {
              return specialPropertyAssignmentSymbol;
            }
          }
        }
        if (name.parent.kind === 270 && ts2.isEntityNameExpression(name)) {
          var success = resolveEntityName(name, 111551 | 788968 | 1920 | 2097152, true);
          if (success && success !== unknownSymbol) {
            return success;
          }
        } else if (ts2.isEntityName(name) && isInRightSideOfImportOrExportAssignment(name)) {
          var importEqualsDeclaration = ts2.getAncestor(name, 264);
          ts2.Debug.assert(importEqualsDeclaration !== void 0);
          return getSymbolOfPartOfRightHandSideOfImportEquals(name, true);
        }
        if (ts2.isEntityName(name)) {
          var possibleImportNode = isImportTypeQualifierPart(name);
          if (possibleImportNode) {
            getTypeFromTypeNode(possibleImportNode);
            var sym = getNodeLinks(name).resolvedSymbol;
            return sym === unknownSymbol ? void 0 : sym;
          }
        }
        while (ts2.isRightSideOfQualifiedNameOrPropertyAccessOrJSDocMemberName(name)) {
          name = name.parent;
        }
        if (isHeritageClauseElementIdentifier(name)) {
          var meaning = 0;
          if (name.parent.kind === 227) {
            meaning = 788968;
            if (ts2.isExpressionWithTypeArgumentsInClassExtendsClause(name.parent)) {
              meaning |= 111551;
            }
          } else {
            meaning = 1920;
          }
          meaning |= 2097152;
          var entityNameSymbol = ts2.isEntityNameExpression(name) ? resolveEntityName(name, meaning) : void 0;
          if (entityNameSymbol) {
            return entityNameSymbol;
          }
        }
        if (name.parent.kind === 338) {
          return ts2.getParameterSymbolFromJSDoc(name.parent);
        }
        if (name.parent.kind === 162 && name.parent.parent.kind === 342) {
          ts2.Debug.assert(!ts2.isInJSFile(name));
          var typeParameter = ts2.getTypeParameterFromJsDoc(name.parent);
          return typeParameter && typeParameter.symbol;
        }
        if (ts2.isExpressionNode(name)) {
          if (ts2.nodeIsMissing(name)) {
            return void 0;
          }
          var isJSDoc_1 = ts2.findAncestor(name, ts2.or(ts2.isJSDocLinkLike, ts2.isJSDocNameReference, ts2.isJSDocMemberName));
          var meaning = isJSDoc_1 ? 788968 | 1920 | 111551 : 111551;
          if (name.kind === 79) {
            if (ts2.isJSXTagName(name) && isJsxIntrinsicIdentifier(name)) {
              var symbol = getIntrinsicTagSymbol(name.parent);
              return symbol === unknownSymbol ? void 0 : symbol;
            }
            var result = resolveEntityName(name, meaning, false, !isJSDoc_1, ts2.getHostSignatureFromJSDoc(name));
            if (!result && isJSDoc_1) {
              var container = ts2.findAncestor(name, ts2.or(ts2.isClassLike, ts2.isInterfaceDeclaration));
              if (container) {
                return resolveJSDocMemberName(name, getSymbolOfNode(container));
              }
            }
            return result;
          } else if (ts2.isPrivateIdentifier(name)) {
            return getSymbolForPrivateIdentifierExpression(name);
          } else if (name.kind === 205 || name.kind === 160) {
            var links = getNodeLinks(name);
            if (links.resolvedSymbol) {
              return links.resolvedSymbol;
            }
            if (name.kind === 205) {
              checkPropertyAccessExpression(name, 0);
            } else {
              checkQualifiedName(name, 0);
            }
            if (!links.resolvedSymbol && isJSDoc_1 && ts2.isQualifiedName(name)) {
              return resolveJSDocMemberName(name);
            }
            return links.resolvedSymbol;
          } else if (ts2.isJSDocMemberName(name)) {
            return resolveJSDocMemberName(name);
          }
        } else if (isTypeReferenceIdentifier(name)) {
          var meaning = name.parent.kind === 177 ? 788968 : 1920;
          var symbol = resolveEntityName(name, meaning, false, true);
          return symbol && symbol !== unknownSymbol ? symbol : getUnresolvedSymbolForEntityName(name);
        }
        if (name.parent.kind === 176) {
          return resolveEntityName(name, 1);
        }
        return void 0;
      }
      function resolveJSDocMemberName(name, container) {
        if (ts2.isEntityName(name)) {
          var meaning = 788968 | 1920 | 111551;
          var symbol = resolveEntityName(name, meaning, false, true, ts2.getHostSignatureFromJSDoc(name));
          if (!symbol && ts2.isIdentifier(name) && container) {
            symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(container), name.escapedText, meaning));
          }
          if (symbol) {
            return symbol;
          }
        }
        var left = ts2.isIdentifier(name) ? container : resolveJSDocMemberName(name.left);
        var right = ts2.isIdentifier(name) ? name.escapedText : name.right.escapedText;
        if (left) {
          var proto = left.flags & 111551 && getPropertyOfType(getTypeOfSymbol(left), "prototype");
          var t = proto ? getTypeOfSymbol(proto) : getDeclaredTypeOfSymbol(left);
          return getPropertyOfType(t, right);
        }
      }
      function getSymbolAtLocation(node, ignoreErrors) {
        if (node.kind === 303) {
          return ts2.isExternalModule(node) ? getMergedSymbol(node.symbol) : void 0;
        }
        var parent = node.parent;
        var grandParent = parent.parent;
        if (node.flags & 16777216) {
          return void 0;
        }
        if (isDeclarationNameOrImportPropertyName(node)) {
          var parentSymbol = getSymbolOfNode(parent);
          return ts2.isImportOrExportSpecifier(node.parent) && node.parent.propertyName === node ? getImmediateAliasedSymbol(parentSymbol) : parentSymbol;
        } else if (ts2.isLiteralComputedPropertyDeclarationName(node)) {
          return getSymbolOfNode(parent.parent);
        }
        if (node.kind === 79) {
          if (isInRightSideOfImportOrExportAssignment(node)) {
            return getSymbolOfNameOrPropertyAccessExpression(node);
          } else if (parent.kind === 202 && grandParent.kind === 200 && node === parent.propertyName) {
            var typeOfPattern = getTypeOfNode(grandParent);
            var propertyDeclaration = getPropertyOfType(typeOfPattern, node.escapedText);
            if (propertyDeclaration) {
              return propertyDeclaration;
            }
          } else if (ts2.isMetaProperty(parent)) {
            var parentType = getTypeOfNode(parent);
            var propertyDeclaration = getPropertyOfType(parentType, node.escapedText);
            if (propertyDeclaration) {
              return propertyDeclaration;
            }
            if (parent.keywordToken === 103) {
              return checkNewTargetMetaProperty(parent).symbol;
            }
          }
        }
        switch (node.kind) {
          case 79:
          case 80:
          case 205:
          case 160:
            return getSymbolOfNameOrPropertyAccessExpression(node);
          case 108:
            var container = ts2.getThisContainer(node, false);
            if (ts2.isFunctionLike(container)) {
              var sig = getSignatureFromDeclaration(container);
              if (sig.thisParameter) {
                return sig.thisParameter;
              }
            }
            if (ts2.isInExpressionContext(node)) {
              return checkExpression(node).symbol;
            }
          case 191:
            return getTypeFromThisTypeNode(node).symbol;
          case 106:
            return checkExpression(node).symbol;
          case 134:
            var constructorDeclaration = node.parent;
            if (constructorDeclaration && constructorDeclaration.kind === 170) {
              return constructorDeclaration.parent.symbol;
            }
            return void 0;
          case 10:
          case 14:
            if (ts2.isExternalModuleImportEqualsDeclaration(node.parent.parent) && ts2.getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node || (node.parent.kind === 265 || node.parent.kind === 271) && node.parent.moduleSpecifier === node || (ts2.isInJSFile(node) && ts2.isRequireCall(node.parent, false) || ts2.isImportCall(node.parent)) || ts2.isLiteralTypeNode(node.parent) && ts2.isLiteralImportTypeNode(node.parent.parent) && node.parent.parent.argument === node.parent) {
              return resolveExternalModuleName(node, node, ignoreErrors);
            }
            if (ts2.isCallExpression(parent) && ts2.isBindableObjectDefinePropertyCall(parent) && parent.arguments[1] === node) {
              return getSymbolOfNode(parent);
            }
          case 8:
            var objectType = ts2.isElementAccessExpression(parent) ? parent.argumentExpression === node ? getTypeOfExpression(parent.expression) : void 0 : ts2.isLiteralTypeNode(parent) && ts2.isIndexedAccessTypeNode(grandParent) ? getTypeFromTypeNode(grandParent.objectType) : void 0;
            return objectType && getPropertyOfType(objectType, ts2.escapeLeadingUnderscores(node.text));
          case 88:
          case 98:
          case 38:
          case 84:
            return getSymbolOfNode(node.parent);
          case 199:
            return ts2.isLiteralImportTypeNode(node) ? getSymbolAtLocation(node.argument.literal, ignoreErrors) : void 0;
          case 93:
            return ts2.isExportAssignment(node.parent) ? ts2.Debug.checkDefined(node.parent.symbol) : void 0;
          case 100:
          case 103:
            return ts2.isMetaProperty(node.parent) ? checkMetaPropertyKeyword(node.parent).symbol : void 0;
          case 230:
            return checkExpression(node).symbol;
          default:
            return void 0;
        }
      }
      function getIndexInfosAtLocation(node) {
        if (ts2.isIdentifier(node) && ts2.isPropertyAccessExpression(node.parent) && node.parent.name === node) {
          var keyType_1 = getLiteralTypeFromPropertyName(node);
          var objectType = getTypeOfExpression(node.parent.expression);
          var objectTypes = objectType.flags & 1048576 ? objectType.types : [objectType];
          return ts2.flatMap(objectTypes, function(t) {
            return ts2.filter(getIndexInfosOfType(t), function(info) {
              return isApplicableIndexType(keyType_1, info.keyType);
            });
          });
        }
        return void 0;
      }
      function getShorthandAssignmentValueSymbol(location) {
        if (location && location.kind === 295) {
          return resolveEntityName(location.name, 111551 | 2097152);
        }
        return void 0;
      }
      function getExportSpecifierLocalTargetSymbol(node) {
        if (ts2.isExportSpecifier(node)) {
          return node.parent.parent.moduleSpecifier ? getExternalModuleMember(node.parent.parent, node) : resolveEntityName(node.propertyName || node.name, 111551 | 788968 | 1920 | 2097152);
        } else {
          return resolveEntityName(node, 111551 | 788968 | 1920 | 2097152);
        }
      }
      function getTypeOfNode(node) {
        if (ts2.isSourceFile(node) && !ts2.isExternalModule(node)) {
          return errorType;
        }
        if (node.flags & 16777216) {
          return errorType;
        }
        var classDecl = ts2.tryGetClassImplementingOrExtendingExpressionWithTypeArguments(node);
        var classType = classDecl && getDeclaredTypeOfClassOrInterface(getSymbolOfNode(classDecl.class));
        if (ts2.isPartOfTypeNode(node)) {
          var typeFromTypeNode = getTypeFromTypeNode(node);
          return classType ? getTypeWithThisArgument(typeFromTypeNode, classType.thisType) : typeFromTypeNode;
        }
        if (ts2.isExpressionNode(node)) {
          return getRegularTypeOfExpression(node);
        }
        if (classType && !classDecl.isImplements) {
          var baseType = ts2.firstOrUndefined(getBaseTypes(classType));
          return baseType ? getTypeWithThisArgument(baseType, classType.thisType) : errorType;
        }
        if (isTypeDeclaration(node)) {
          var symbol = getSymbolOfNode(node);
          return getDeclaredTypeOfSymbol(symbol);
        }
        if (isTypeDeclarationName(node)) {
          var symbol = getSymbolAtLocation(node);
          return symbol ? getDeclaredTypeOfSymbol(symbol) : errorType;
        }
        if (ts2.isDeclaration(node)) {
          var symbol = getSymbolOfNode(node);
          return getTypeOfSymbol(symbol);
        }
        if (isDeclarationNameOrImportPropertyName(node)) {
          var symbol = getSymbolAtLocation(node);
          if (symbol) {
            return getTypeOfSymbol(symbol);
          }
          return errorType;
        }
        if (ts2.isBindingPattern(node)) {
          return getTypeForVariableLikeDeclaration(node.parent, true) || errorType;
        }
        if (isInRightSideOfImportOrExportAssignment(node)) {
          var symbol = getSymbolAtLocation(node);
          if (symbol) {
            var declaredType = getDeclaredTypeOfSymbol(symbol);
            return !isErrorType(declaredType) ? declaredType : getTypeOfSymbol(symbol);
          }
        }
        if (ts2.isMetaProperty(node.parent) && node.parent.keywordToken === node.kind) {
          return checkMetaPropertyKeyword(node.parent);
        }
        return errorType;
      }
      function getTypeOfAssignmentPattern(expr) {
        ts2.Debug.assert(expr.kind === 204 || expr.kind === 203);
        if (expr.parent.kind === 243) {
          var iteratedType = checkRightHandSideOfForOf(expr.parent);
          return checkDestructuringAssignment(expr, iteratedType || errorType);
        }
        if (expr.parent.kind === 220) {
          var iteratedType = getTypeOfExpression(expr.parent.right);
          return checkDestructuringAssignment(expr, iteratedType || errorType);
        }
        if (expr.parent.kind === 294) {
          var node_3 = ts2.cast(expr.parent.parent, ts2.isObjectLiteralExpression);
          var typeOfParentObjectLiteral = getTypeOfAssignmentPattern(node_3) || errorType;
          var propertyIndex = ts2.indexOfNode(node_3.properties, expr.parent);
          return checkObjectLiteralDestructuringPropertyAssignment(node_3, typeOfParentObjectLiteral, propertyIndex);
        }
        var node = ts2.cast(expr.parent, ts2.isArrayLiteralExpression);
        var typeOfArrayLiteral = getTypeOfAssignmentPattern(node) || errorType;
        var elementType = checkIteratedTypeOrElementType(65, typeOfArrayLiteral, undefinedType, expr.parent) || errorType;
        return checkArrayLiteralDestructuringElementAssignment(node, typeOfArrayLiteral, node.elements.indexOf(expr), elementType);
      }
      function getPropertySymbolOfDestructuringAssignment(location) {
        var typeOfObjectLiteral = getTypeOfAssignmentPattern(ts2.cast(location.parent.parent, ts2.isAssignmentPattern));
        return typeOfObjectLiteral && getPropertyOfType(typeOfObjectLiteral, location.escapedText);
      }
      function getRegularTypeOfExpression(expr) {
        if (ts2.isRightSideOfQualifiedNameOrPropertyAccess(expr)) {
          expr = expr.parent;
        }
        return getRegularTypeOfLiteralType(getTypeOfExpression(expr));
      }
      function getParentTypeOfClassElement(node) {
        var classSymbol = getSymbolOfNode(node.parent);
        return ts2.isStatic(node) ? getTypeOfSymbol(classSymbol) : getDeclaredTypeOfSymbol(classSymbol);
      }
      function getClassElementPropertyKeyType(element) {
        var name = element.name;
        switch (name.kind) {
          case 79:
            return getStringLiteralType(ts2.idText(name));
          case 8:
          case 10:
            return getStringLiteralType(name.text);
          case 161:
            var nameType = checkComputedPropertyName(name);
            return isTypeAssignableToKind(nameType, 12288) ? nameType : stringType;
          default:
            return ts2.Debug.fail("Unsupported property name.");
        }
      }
      function getAugmentedPropertiesOfType(type) {
        type = getApparentType(type);
        var propsByName = ts2.createSymbolTable(getPropertiesOfType(type));
        var functionType = getSignaturesOfType(type, 0).length ? globalCallableFunctionType : getSignaturesOfType(type, 1).length ? globalNewableFunctionType : void 0;
        if (functionType) {
          ts2.forEach(getPropertiesOfType(functionType), function(p) {
            if (!propsByName.has(p.escapedName)) {
              propsByName.set(p.escapedName, p);
            }
          });
        }
        return getNamedMembers(propsByName);
      }
      function typeHasCallOrConstructSignatures(type) {
        return ts2.typeHasCallOrConstructSignatures(type, checker);
      }
      function getRootSymbols(symbol) {
        var roots = getImmediateRootSymbols(symbol);
        return roots ? ts2.flatMap(roots, getRootSymbols) : [symbol];
      }
      function getImmediateRootSymbols(symbol) {
        if (ts2.getCheckFlags(symbol) & 6) {
          return ts2.mapDefined(getSymbolLinks(symbol).containingType.types, function(type) {
            return getPropertyOfType(type, symbol.escapedName);
          });
        } else if (symbol.flags & 33554432) {
          var _a = symbol, leftSpread = _a.leftSpread, rightSpread = _a.rightSpread, syntheticOrigin = _a.syntheticOrigin;
          return leftSpread ? [leftSpread, rightSpread] : syntheticOrigin ? [syntheticOrigin] : ts2.singleElementArray(tryGetAliasTarget(symbol));
        }
        return void 0;
      }
      function tryGetAliasTarget(symbol) {
        var target;
        var next = symbol;
        while (next = getSymbolLinks(next).target) {
          target = next;
        }
        return target;
      }
      function isArgumentsLocalBinding(nodeIn) {
        if (ts2.isGeneratedIdentifier(nodeIn))
          return false;
        var node = ts2.getParseTreeNode(nodeIn, ts2.isIdentifier);
        if (!node)
          return false;
        var parent = node.parent;
        if (!parent)
          return false;
        var isPropertyName = (ts2.isPropertyAccessExpression(parent) || ts2.isPropertyAssignment(parent)) && parent.name === node;
        return !isPropertyName && getReferencedValueSymbol(node) === argumentsSymbol;
      }
      function moduleExportsSomeValue(moduleReferenceExpression) {
        var moduleSymbol = resolveExternalModuleName(moduleReferenceExpression.parent, moduleReferenceExpression);
        if (!moduleSymbol || ts2.isShorthandAmbientModuleSymbol(moduleSymbol)) {
          return true;
        }
        var hasExportAssignment = hasExportAssignmentSymbol(moduleSymbol);
        moduleSymbol = resolveExternalModuleSymbol(moduleSymbol);
        var symbolLinks2 = getSymbolLinks(moduleSymbol);
        if (symbolLinks2.exportsSomeValue === void 0) {
          symbolLinks2.exportsSomeValue = hasExportAssignment ? !!(moduleSymbol.flags & 111551) : ts2.forEachEntry(getExportsOfModule(moduleSymbol), isValue);
        }
        return symbolLinks2.exportsSomeValue;
        function isValue(s) {
          s = resolveSymbol(s);
          return s && !!(s.flags & 111551);
        }
      }
      function isNameOfModuleOrEnumDeclaration(node) {
        return ts2.isModuleOrEnumDeclaration(node.parent) && node === node.parent.name;
      }
      function getReferencedExportContainer(nodeIn, prefixLocals) {
        var _a;
        var node = ts2.getParseTreeNode(nodeIn, ts2.isIdentifier);
        if (node) {
          var symbol = getReferencedValueSymbol(node, isNameOfModuleOrEnumDeclaration(node));
          if (symbol) {
            if (symbol.flags & 1048576) {
              var exportSymbol = getMergedSymbol(symbol.exportSymbol);
              if (!prefixLocals && exportSymbol.flags & 944 && !(exportSymbol.flags & 3)) {
                return void 0;
              }
              symbol = exportSymbol;
            }
            var parentSymbol_1 = getParentOfSymbol(symbol);
            if (parentSymbol_1) {
              if (parentSymbol_1.flags & 512 && ((_a = parentSymbol_1.valueDeclaration) === null || _a === void 0 ? void 0 : _a.kind) === 303) {
                var symbolFile = parentSymbol_1.valueDeclaration;
                var referenceFile = ts2.getSourceFileOfNode(node);
                var symbolIsUmdExport = symbolFile !== referenceFile;
                return symbolIsUmdExport ? void 0 : symbolFile;
              }
              return ts2.findAncestor(node.parent, function(n) {
                return ts2.isModuleOrEnumDeclaration(n) && getSymbolOfNode(n) === parentSymbol_1;
              });
            }
          }
        }
      }
      function getReferencedImportDeclaration(nodeIn) {
        if (nodeIn.generatedImportReference) {
          return nodeIn.generatedImportReference;
        }
        var node = ts2.getParseTreeNode(nodeIn, ts2.isIdentifier);
        if (node) {
          var symbol = getReferencedValueSymbol(node);
          if (isNonLocalAlias(symbol, 111551) && !getTypeOnlyAliasDeclaration(symbol)) {
            return getDeclarationOfAliasSymbol(symbol);
          }
        }
        return void 0;
      }
      function isSymbolOfDestructuredElementOfCatchBinding(symbol) {
        return symbol.valueDeclaration && ts2.isBindingElement(symbol.valueDeclaration) && ts2.walkUpBindingElementsAndPatterns(symbol.valueDeclaration).parent.kind === 291;
      }
      function isSymbolOfDeclarationWithCollidingName(symbol) {
        if (symbol.flags & 418 && symbol.valueDeclaration && !ts2.isSourceFile(symbol.valueDeclaration)) {
          var links = getSymbolLinks(symbol);
          if (links.isDeclarationWithCollidingName === void 0) {
            var container = ts2.getEnclosingBlockScopeContainer(symbol.valueDeclaration);
            if (ts2.isStatementWithLocals(container) || isSymbolOfDestructuredElementOfCatchBinding(symbol)) {
              var nodeLinks_1 = getNodeLinks(symbol.valueDeclaration);
              if (resolveName(container.parent, symbol.escapedName, 111551, void 0, void 0, false)) {
                links.isDeclarationWithCollidingName = true;
              } else if (nodeLinks_1.flags & 262144) {
                var isDeclaredInLoop = nodeLinks_1.flags & 524288;
                var inLoopInitializer = ts2.isIterationStatement(container, false);
                var inLoopBodyBlock = container.kind === 234 && ts2.isIterationStatement(container.parent, false);
                links.isDeclarationWithCollidingName = !ts2.isBlockScopedContainerTopLevel(container) && (!isDeclaredInLoop || !inLoopInitializer && !inLoopBodyBlock);
              } else {
                links.isDeclarationWithCollidingName = false;
              }
            }
          }
          return links.isDeclarationWithCollidingName;
        }
        return false;
      }
      function getReferencedDeclarationWithCollidingName(nodeIn) {
        if (!ts2.isGeneratedIdentifier(nodeIn)) {
          var node = ts2.getParseTreeNode(nodeIn, ts2.isIdentifier);
          if (node) {
            var symbol = getReferencedValueSymbol(node);
            if (symbol && isSymbolOfDeclarationWithCollidingName(symbol)) {
              return symbol.valueDeclaration;
            }
          }
        }
        return void 0;
      }
      function isDeclarationWithCollidingName(nodeIn) {
        var node = ts2.getParseTreeNode(nodeIn, ts2.isDeclaration);
        if (node) {
          var symbol = getSymbolOfNode(node);
          if (symbol) {
            return isSymbolOfDeclarationWithCollidingName(symbol);
          }
        }
        return false;
      }
      function isValueAliasDeclaration(node) {
        switch (node.kind) {
          case 264:
            return isAliasResolvedToValue(getSymbolOfNode(node));
          case 266:
          case 267:
          case 269:
          case 274:
            var symbol = getSymbolOfNode(node);
            return !!symbol && isAliasResolvedToValue(symbol) && !getTypeOnlyAliasDeclaration(symbol);
          case 271:
            var exportClause = node.exportClause;
            return !!exportClause && (ts2.isNamespaceExport(exportClause) || ts2.some(exportClause.elements, isValueAliasDeclaration));
          case 270:
            return node.expression && node.expression.kind === 79 ? isAliasResolvedToValue(getSymbolOfNode(node)) : true;
        }
        return false;
      }
      function isTopLevelValueImportEqualsWithEntityName(nodeIn) {
        var node = ts2.getParseTreeNode(nodeIn, ts2.isImportEqualsDeclaration);
        if (node === void 0 || node.parent.kind !== 303 || !ts2.isInternalModuleImportEqualsDeclaration(node)) {
          return false;
        }
        var isValue = isAliasResolvedToValue(getSymbolOfNode(node));
        return isValue && node.moduleReference && !ts2.nodeIsMissing(node.moduleReference);
      }
      function isAliasResolvedToValue(symbol) {
        if (!symbol) {
          return false;
        }
        var target = resolveAlias(symbol);
        if (target === unknownSymbol) {
          return true;
        }
        return !!(target.flags & 111551) && (ts2.shouldPreserveConstEnums(compilerOptions) || !isConstEnumOrConstEnumOnlyModule(target));
      }
      function isConstEnumOrConstEnumOnlyModule(s) {
        return isConstEnumSymbol(s) || !!s.constEnumOnlyModule;
      }
      function isReferencedAliasDeclaration(node, checkChildren) {
        if (isAliasSymbolDeclaration(node)) {
          var symbol = getSymbolOfNode(node);
          var links = symbol && getSymbolLinks(symbol);
          if (links === null || links === void 0 ? void 0 : links.referenced) {
            return true;
          }
          var target = getSymbolLinks(symbol).target;
          if (target && ts2.getEffectiveModifierFlags(node) & 1 && target.flags & 111551 && (ts2.shouldPreserveConstEnums(compilerOptions) || !isConstEnumOrConstEnumOnlyModule(target))) {
            return true;
          }
        }
        if (checkChildren) {
          return !!ts2.forEachChild(node, function(node2) {
            return isReferencedAliasDeclaration(node2, checkChildren);
          });
        }
        return false;
      }
      function isImplementationOfOverload(node) {
        if (ts2.nodeIsPresent(node.body)) {
          if (ts2.isGetAccessor(node) || ts2.isSetAccessor(node))
            return false;
          var symbol = getSymbolOfNode(node);
          var signaturesOfSymbol = getSignaturesOfSymbol(symbol);
          return signaturesOfSymbol.length > 1 || signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node;
        }
        return false;
      }
      function isRequiredInitializedParameter(parameter) {
        return !!strictNullChecks && !isOptionalParameter(parameter) && !ts2.isJSDocParameterTag(parameter) && !!parameter.initializer && !ts2.hasSyntacticModifier(parameter, 16476);
      }
      function isOptionalUninitializedParameterProperty(parameter) {
        return strictNullChecks && isOptionalParameter(parameter) && !parameter.initializer && ts2.hasSyntacticModifier(parameter, 16476);
      }
      function isOptionalUninitializedParameter(parameter) {
        return !!strictNullChecks && isOptionalParameter(parameter) && !parameter.initializer;
      }
      function isExpandoFunctionDeclaration(node) {
        var declaration = ts2.getParseTreeNode(node, ts2.isFunctionDeclaration);
        if (!declaration) {
          return false;
        }
        var symbol = getSymbolOfNode(declaration);
        if (!symbol || !(symbol.flags & 16)) {
          return false;
        }
        return !!ts2.forEachEntry(getExportsOfSymbol(symbol), function(p) {
          return p.flags & 111551 && p.valueDeclaration && ts2.isPropertyAccessExpression(p.valueDeclaration);
        });
      }
      function getPropertiesOfContainerFunction(node) {
        var declaration = ts2.getParseTreeNode(node, ts2.isFunctionDeclaration);
        if (!declaration) {
          return ts2.emptyArray;
        }
        var symbol = getSymbolOfNode(declaration);
        return symbol && getPropertiesOfType(getTypeOfSymbol(symbol)) || ts2.emptyArray;
      }
      function getNodeCheckFlags(node) {
        var _a;
        var nodeId = node.id || 0;
        if (nodeId < 0 || nodeId >= nodeLinks.length)
          return 0;
        return ((_a = nodeLinks[nodeId]) === null || _a === void 0 ? void 0 : _a.flags) || 0;
      }
      function getEnumMemberValue(node) {
        computeEnumMemberValues(node.parent);
        return getNodeLinks(node).enumMemberValue;
      }
      function canHaveConstantValue(node) {
        switch (node.kind) {
          case 297:
          case 205:
          case 206:
            return true;
        }
        return false;
      }
      function getConstantValue(node) {
        if (node.kind === 297) {
          return getEnumMemberValue(node);
        }
        var symbol = getNodeLinks(node).resolvedSymbol;
        if (symbol && symbol.flags & 8) {
          var member = symbol.valueDeclaration;
          if (ts2.isEnumConst(member.parent)) {
            return getEnumMemberValue(member);
          }
        }
        return void 0;
      }
      function isFunctionType(type) {
        return !!(type.flags & 524288) && getSignaturesOfType(type, 0).length > 0;
      }
      function getTypeReferenceSerializationKind(typeNameIn, location) {
        var _a, _b;
        var typeName = ts2.getParseTreeNode(typeNameIn, ts2.isEntityName);
        if (!typeName)
          return ts2.TypeReferenceSerializationKind.Unknown;
        if (location) {
          location = ts2.getParseTreeNode(location);
          if (!location)
            return ts2.TypeReferenceSerializationKind.Unknown;
        }
        var isTypeOnly = false;
        if (ts2.isQualifiedName(typeName)) {
          var rootValueSymbol = resolveEntityName(ts2.getFirstIdentifier(typeName), 111551, true, true, location);
          isTypeOnly = !!((_a = rootValueSymbol === null || rootValueSymbol === void 0 ? void 0 : rootValueSymbol.declarations) === null || _a === void 0 ? void 0 : _a.every(ts2.isTypeOnlyImportOrExportDeclaration));
        }
        var valueSymbol = resolveEntityName(typeName, 111551, true, true, location);
        var resolvedSymbol = valueSymbol && valueSymbol.flags & 2097152 ? resolveAlias(valueSymbol) : valueSymbol;
        isTypeOnly || (isTypeOnly = !!((_b = valueSymbol === null || valueSymbol === void 0 ? void 0 : valueSymbol.declarations) === null || _b === void 0 ? void 0 : _b.every(ts2.isTypeOnlyImportOrExportDeclaration)));
        var typeSymbol = resolveEntityName(typeName, 788968, true, false, location);
        if (resolvedSymbol && resolvedSymbol === typeSymbol) {
          var globalPromiseSymbol = getGlobalPromiseConstructorSymbol(false);
          if (globalPromiseSymbol && resolvedSymbol === globalPromiseSymbol) {
            return ts2.TypeReferenceSerializationKind.Promise;
          }
          var constructorType = getTypeOfSymbol(resolvedSymbol);
          if (constructorType && isConstructorType(constructorType)) {
            return isTypeOnly ? ts2.TypeReferenceSerializationKind.TypeWithCallSignature : ts2.TypeReferenceSerializationKind.TypeWithConstructSignatureAndValue;
          }
        }
        if (!typeSymbol) {
          return isTypeOnly ? ts2.TypeReferenceSerializationKind.ObjectType : ts2.TypeReferenceSerializationKind.Unknown;
        }
        var type = getDeclaredTypeOfSymbol(typeSymbol);
        if (isErrorType(type)) {
          return isTypeOnly ? ts2.TypeReferenceSerializationKind.ObjectType : ts2.TypeReferenceSerializationKind.Unknown;
        } else if (type.flags & 3) {
          return ts2.TypeReferenceSerializationKind.ObjectType;
        } else if (isTypeAssignableToKind(type, 16384 | 98304 | 131072)) {
          return ts2.TypeReferenceSerializationKind.VoidNullableOrNeverType;
        } else if (isTypeAssignableToKind(type, 528)) {
          return ts2.TypeReferenceSerializationKind.BooleanType;
        } else if (isTypeAssignableToKind(type, 296)) {
          return ts2.TypeReferenceSerializationKind.NumberLikeType;
        } else if (isTypeAssignableToKind(type, 2112)) {
          return ts2.TypeReferenceSerializationKind.BigIntLikeType;
        } else if (isTypeAssignableToKind(type, 402653316)) {
          return ts2.TypeReferenceSerializationKind.StringLikeType;
        } else if (isTupleType(type)) {
          return ts2.TypeReferenceSerializationKind.ArrayLikeType;
        } else if (isTypeAssignableToKind(type, 12288)) {
          return ts2.TypeReferenceSerializationKind.ESSymbolType;
        } else if (isFunctionType(type)) {
          return ts2.TypeReferenceSerializationKind.TypeWithCallSignature;
        } else if (isArrayType(type)) {
          return ts2.TypeReferenceSerializationKind.ArrayLikeType;
        } else {
          return ts2.TypeReferenceSerializationKind.ObjectType;
        }
      }
      function createTypeOfDeclaration(declarationIn, enclosingDeclaration, flags, tracker, addUndefined) {
        var declaration = ts2.getParseTreeNode(declarationIn, ts2.isVariableLikeOrAccessor);
        if (!declaration) {
          return ts2.factory.createToken(130);
        }
        var symbol = getSymbolOfNode(declaration);
        var type = symbol && !(symbol.flags & (2048 | 131072)) ? getWidenedLiteralType(getTypeOfSymbol(symbol)) : errorType;
        if (type.flags & 8192 && type.symbol === symbol) {
          flags |= 1048576;
        }
        if (addUndefined) {
          type = getOptionalType(type);
        }
        return nodeBuilder.typeToTypeNode(type, enclosingDeclaration, flags | 1024, tracker);
      }
      function createReturnTypeOfSignatureDeclaration(signatureDeclarationIn, enclosingDeclaration, flags, tracker) {
        var signatureDeclaration = ts2.getParseTreeNode(signatureDeclarationIn, ts2.isFunctionLike);
        if (!signatureDeclaration) {
          return ts2.factory.createToken(130);
        }
        var signature = getSignatureFromDeclaration(signatureDeclaration);
        return nodeBuilder.typeToTypeNode(getReturnTypeOfSignature(signature), enclosingDeclaration, flags | 1024, tracker);
      }
      function createTypeOfExpression(exprIn, enclosingDeclaration, flags, tracker) {
        var expr = ts2.getParseTreeNode(exprIn, ts2.isExpression);
        if (!expr) {
          return ts2.factory.createToken(130);
        }
        var type = getWidenedType(getRegularTypeOfExpression(expr));
        return nodeBuilder.typeToTypeNode(type, enclosingDeclaration, flags | 1024, tracker);
      }
      function hasGlobalName(name) {
        return globals.has(ts2.escapeLeadingUnderscores(name));
      }
      function getReferencedValueSymbol(reference, startInDeclarationContainer) {
        var resolvedSymbol = getNodeLinks(reference).resolvedSymbol;
        if (resolvedSymbol) {
          return resolvedSymbol;
        }
        var location = reference;
        if (startInDeclarationContainer) {
          var parent = reference.parent;
          if (ts2.isDeclaration(parent) && reference === parent.name) {
            location = getDeclarationContainer(parent);
          }
        }
        return resolveName(location, reference.escapedText, 111551 | 1048576 | 2097152, void 0, void 0, true);
      }
      function getReferencedValueDeclaration(referenceIn) {
        if (!ts2.isGeneratedIdentifier(referenceIn)) {
          var reference = ts2.getParseTreeNode(referenceIn, ts2.isIdentifier);
          if (reference) {
            var symbol = getReferencedValueSymbol(reference);
            if (symbol) {
              return getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration;
            }
          }
        }
        return void 0;
      }
      function isLiteralConstDeclaration(node) {
        if (ts2.isDeclarationReadonly(node) || ts2.isVariableDeclaration(node) && ts2.isVarConst(node)) {
          return isFreshLiteralType(getTypeOfSymbol(getSymbolOfNode(node)));
        }
        return false;
      }
      function literalTypeToNode(type, enclosing, tracker) {
        var enumResult = type.flags & 1024 ? nodeBuilder.symbolToExpression(type.symbol, 111551, enclosing, void 0, tracker) : type === trueType ? ts2.factory.createTrue() : type === falseType && ts2.factory.createFalse();
        if (enumResult)
          return enumResult;
        var literalValue = type.value;
        return typeof literalValue === "object" ? ts2.factory.createBigIntLiteral(literalValue) : typeof literalValue === "number" ? ts2.factory.createNumericLiteral(literalValue) : ts2.factory.createStringLiteral(literalValue);
      }
      function createLiteralConstValue(node, tracker) {
        var type = getTypeOfSymbol(getSymbolOfNode(node));
        return literalTypeToNode(type, node, tracker);
      }
      function getJsxFactoryEntity(location) {
        return location ? (getJsxNamespace(location), ts2.getSourceFileOfNode(location).localJsxFactory || _jsxFactoryEntity) : _jsxFactoryEntity;
      }
      function getJsxFragmentFactoryEntity(location) {
        if (location) {
          var file = ts2.getSourceFileOfNode(location);
          if (file) {
            if (file.localJsxFragmentFactory) {
              return file.localJsxFragmentFactory;
            }
            var jsxFragPragmas = file.pragmas.get("jsxfrag");
            var jsxFragPragma = ts2.isArray(jsxFragPragmas) ? jsxFragPragmas[0] : jsxFragPragmas;
            if (jsxFragPragma) {
              file.localJsxFragmentFactory = ts2.parseIsolatedEntityName(jsxFragPragma.arguments.factory, languageVersion);
              return file.localJsxFragmentFactory;
            }
          }
        }
        if (compilerOptions.jsxFragmentFactory) {
          return ts2.parseIsolatedEntityName(compilerOptions.jsxFragmentFactory, languageVersion);
        }
      }
      function createResolver() {
        var resolvedTypeReferenceDirectives = host.getResolvedTypeReferenceDirectives();
        var fileToDirective;
        if (resolvedTypeReferenceDirectives) {
          fileToDirective = new ts2.Map();
          resolvedTypeReferenceDirectives.forEach(function(resolvedDirective, key) {
            if (!resolvedDirective || !resolvedDirective.resolvedFileName) {
              return;
            }
            var file = host.getSourceFile(resolvedDirective.resolvedFileName);
            if (file) {
              addReferencedFilesToTypeDirective(file, key);
            }
          });
        }
        return {
          getReferencedExportContainer,
          getReferencedImportDeclaration,
          getReferencedDeclarationWithCollidingName,
          isDeclarationWithCollidingName,
          isValueAliasDeclaration: function(nodeIn) {
            var node = ts2.getParseTreeNode(nodeIn);
            return node ? isValueAliasDeclaration(node) : true;
          },
          hasGlobalName,
          isReferencedAliasDeclaration: function(nodeIn, checkChildren) {
            var node = ts2.getParseTreeNode(nodeIn);
            return node ? isReferencedAliasDeclaration(node, checkChildren) : true;
          },
          getNodeCheckFlags: function(nodeIn) {
            var node = ts2.getParseTreeNode(nodeIn);
            return node ? getNodeCheckFlags(node) : 0;
          },
          isTopLevelValueImportEqualsWithEntityName,
          isDeclarationVisible,
          isImplementationOfOverload,
          isRequiredInitializedParameter,
          isOptionalUninitializedParameterProperty,
          isExpandoFunctionDeclaration,
          getPropertiesOfContainerFunction,
          createTypeOfDeclaration,
          createReturnTypeOfSignatureDeclaration,
          createTypeOfExpression,
          createLiteralConstValue,
          isSymbolAccessible,
          isEntityNameVisible,
          getConstantValue: function(nodeIn) {
            var node = ts2.getParseTreeNode(nodeIn, canHaveConstantValue);
            return node ? getConstantValue(node) : void 0;
          },
          collectLinkedAliases,
          getReferencedValueDeclaration,
          getTypeReferenceSerializationKind,
          isOptionalParameter,
          moduleExportsSomeValue,
          isArgumentsLocalBinding,
          getExternalModuleFileFromDeclaration: function(nodeIn) {
            var node = ts2.getParseTreeNode(nodeIn, ts2.hasPossibleExternalModuleReference);
            return node && getExternalModuleFileFromDeclaration(node);
          },
          getTypeReferenceDirectivesForEntityName,
          getTypeReferenceDirectivesForSymbol,
          isLiteralConstDeclaration,
          isLateBound: function(nodeIn) {
            var node = ts2.getParseTreeNode(nodeIn, ts2.isDeclaration);
            var symbol = node && getSymbolOfNode(node);
            return !!(symbol && ts2.getCheckFlags(symbol) & 4096);
          },
          getJsxFactoryEntity,
          getJsxFragmentFactoryEntity,
          getAllAccessorDeclarations: function(accessor) {
            accessor = ts2.getParseTreeNode(accessor, ts2.isGetOrSetAccessorDeclaration);
            var otherKind = accessor.kind === 172 ? 171 : 172;
            var otherAccessor = ts2.getDeclarationOfKind(getSymbolOfNode(accessor), otherKind);
            var firstAccessor = otherAccessor && otherAccessor.pos < accessor.pos ? otherAccessor : accessor;
            var secondAccessor = otherAccessor && otherAccessor.pos < accessor.pos ? accessor : otherAccessor;
            var setAccessor = accessor.kind === 172 ? accessor : otherAccessor;
            var getAccessor = accessor.kind === 171 ? accessor : otherAccessor;
            return {
              firstAccessor,
              secondAccessor,
              setAccessor,
              getAccessor
            };
          },
          getSymbolOfExternalModuleSpecifier: function(moduleName) {
            return resolveExternalModuleNameWorker(moduleName, moduleName, void 0);
          },
          isBindingCapturedByNode: function(node, decl) {
            var parseNode = ts2.getParseTreeNode(node);
            var parseDecl = ts2.getParseTreeNode(decl);
            return !!parseNode && !!parseDecl && (ts2.isVariableDeclaration(parseDecl) || ts2.isBindingElement(parseDecl)) && isBindingCapturedByNode(parseNode, parseDecl);
          },
          getDeclarationStatementsForSourceFile: function(node, flags, tracker, bundled) {
            var n = ts2.getParseTreeNode(node);
            ts2.Debug.assert(n && n.kind === 303, "Non-sourcefile node passed into getDeclarationsForSourceFile");
            var sym = getSymbolOfNode(node);
            if (!sym) {
              return !node.locals ? [] : nodeBuilder.symbolTableToDeclarationStatements(node.locals, node, flags, tracker, bundled);
            }
            return !sym.exports ? [] : nodeBuilder.symbolTableToDeclarationStatements(sym.exports, node, flags, tracker, bundled);
          },
          isImportRequiredByAugmentation
        };
        function isImportRequiredByAugmentation(node) {
          var file = ts2.getSourceFileOfNode(node);
          if (!file.symbol)
            return false;
          var importTarget = getExternalModuleFileFromDeclaration(node);
          if (!importTarget)
            return false;
          if (importTarget === file)
            return false;
          var exports = getExportsOfModule(file.symbol);
          for (var _i = 0, _a = ts2.arrayFrom(exports.values()); _i < _a.length; _i++) {
            var s = _a[_i];
            if (s.mergeId) {
              var merged = getMergedSymbol(s);
              if (merged.declarations) {
                for (var _b = 0, _c = merged.declarations; _b < _c.length; _b++) {
                  var d = _c[_b];
                  var declFile = ts2.getSourceFileOfNode(d);
                  if (declFile === importTarget) {
                    return true;
                  }
                }
              }
            }
          }
          return false;
        }
        function isInHeritageClause(node) {
          return node.parent && node.parent.kind === 227 && node.parent.parent && node.parent.parent.kind === 290;
        }
        function getTypeReferenceDirectivesForEntityName(node) {
          if (!fileToDirective) {
            return void 0;
          }
          var meaning = 788968 | 1920;
          if (node.kind === 79 && isInTypeQuery(node) || node.kind === 205 && !isInHeritageClause(node)) {
            meaning = 111551 | 1048576;
          }
          var symbol = resolveEntityName(node, meaning, true);
          return symbol && symbol !== unknownSymbol ? getTypeReferenceDirectivesForSymbol(symbol, meaning) : void 0;
        }
        function getTypeReferenceDirectivesForSymbol(symbol, meaning) {
          if (!fileToDirective || !isSymbolFromTypeDeclarationFile(symbol)) {
            return void 0;
          }
          var typeReferenceDirectives;
          for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
            var decl = _a[_i];
            if (decl.symbol && decl.symbol.flags & meaning) {
              var file = ts2.getSourceFileOfNode(decl);
              var typeReferenceDirective = fileToDirective.get(file.path);
              if (typeReferenceDirective) {
                (typeReferenceDirectives || (typeReferenceDirectives = [])).push(typeReferenceDirective);
              } else {
                return void 0;
              }
            }
          }
          return typeReferenceDirectives;
        }
        function isSymbolFromTypeDeclarationFile(symbol) {
          if (!symbol.declarations) {
            return false;
          }
          var current = symbol;
          while (true) {
            var parent = getParentOfSymbol(current);
            if (parent) {
              current = parent;
            } else {
              break;
            }
          }
          if (current.valueDeclaration && current.valueDeclaration.kind === 303 && current.flags & 512) {
            return false;
          }
          for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
            var decl = _a[_i];
            var file = ts2.getSourceFileOfNode(decl);
            if (fileToDirective.has(file.path)) {
              return true;
            }
          }
          return false;
        }
        function addReferencedFilesToTypeDirective(file, key) {
          if (fileToDirective.has(file.path))
            return;
          fileToDirective.set(file.path, key);
          for (var _i = 0, _a = file.referencedFiles; _i < _a.length; _i++) {
            var fileName = _a[_i].fileName;
            var resolvedFile = ts2.resolveTripleslashReference(fileName, file.fileName);
            var referencedFile = host.getSourceFile(resolvedFile);
            if (referencedFile) {
              addReferencedFilesToTypeDirective(referencedFile, key);
            }
          }
        }
      }
      function getExternalModuleFileFromDeclaration(declaration) {
        var specifier = declaration.kind === 260 ? ts2.tryCast(declaration.name, ts2.isStringLiteral) : ts2.getExternalModuleName(declaration);
        var moduleSymbol = resolveExternalModuleNameWorker(specifier, specifier, void 0);
        if (!moduleSymbol) {
          return void 0;
        }
        return ts2.getDeclarationOfKind(moduleSymbol, 303);
      }
      function initializeTypeChecker() {
        for (var _i = 0, _a = host.getSourceFiles(); _i < _a.length; _i++) {
          var file = _a[_i];
          ts2.bindSourceFile(file, compilerOptions);
        }
        amalgamatedDuplicates = new ts2.Map();
        var augmentations;
        for (var _b = 0, _c = host.getSourceFiles(); _b < _c.length; _b++) {
          var file = _c[_b];
          if (file.redirectInfo) {
            continue;
          }
          if (!ts2.isExternalOrCommonJsModule(file)) {
            var fileGlobalThisSymbol = file.locals.get("globalThis");
            if (fileGlobalThisSymbol === null || fileGlobalThisSymbol === void 0 ? void 0 : fileGlobalThisSymbol.declarations) {
              for (var _d = 0, _e = fileGlobalThisSymbol.declarations; _d < _e.length; _d++) {
                var declaration = _e[_d];
                diagnostics.add(ts2.createDiagnosticForNode(declaration, ts2.Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0, "globalThis"));
              }
            }
            mergeSymbolTable(globals, file.locals);
          }
          if (file.jsGlobalAugmentations) {
            mergeSymbolTable(globals, file.jsGlobalAugmentations);
          }
          if (file.patternAmbientModules && file.patternAmbientModules.length) {
            patternAmbientModules = ts2.concatenate(patternAmbientModules, file.patternAmbientModules);
          }
          if (file.moduleAugmentations.length) {
            (augmentations || (augmentations = [])).push(file.moduleAugmentations);
          }
          if (file.symbol && file.symbol.globalExports) {
            var source = file.symbol.globalExports;
            source.forEach(function(sourceSymbol, id) {
              if (!globals.has(id)) {
                globals.set(id, sourceSymbol);
              }
            });
          }
        }
        if (augmentations) {
          for (var _f = 0, augmentations_1 = augmentations; _f < augmentations_1.length; _f++) {
            var list = augmentations_1[_f];
            for (var _g = 0, list_1 = list; _g < list_1.length; _g++) {
              var augmentation = list_1[_g];
              if (!ts2.isGlobalScopeAugmentation(augmentation.parent))
                continue;
              mergeModuleAugmentation(augmentation);
            }
          }
        }
        addToSymbolTable(globals, builtinGlobals, ts2.Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0);
        getSymbolLinks(undefinedSymbol).type = undefinedWideningType;
        getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments", 0, true);
        getSymbolLinks(unknownSymbol).type = errorType;
        getSymbolLinks(globalThisSymbol).type = createObjectType(16, globalThisSymbol);
        globalArrayType = getGlobalType("Array", 1, true);
        globalObjectType = getGlobalType("Object", 0, true);
        globalFunctionType = getGlobalType("Function", 0, true);
        globalCallableFunctionType = strictBindCallApply && getGlobalType("CallableFunction", 0, true) || globalFunctionType;
        globalNewableFunctionType = strictBindCallApply && getGlobalType("NewableFunction", 0, true) || globalFunctionType;
        globalStringType = getGlobalType("String", 0, true);
        globalNumberType = getGlobalType("Number", 0, true);
        globalBooleanType = getGlobalType("Boolean", 0, true);
        globalRegExpType = getGlobalType("RegExp", 0, true);
        anyArrayType = createArrayType(anyType);
        autoArrayType = createArrayType(autoType);
        if (autoArrayType === emptyObjectType) {
          autoArrayType = createAnonymousType(void 0, emptySymbols, ts2.emptyArray, ts2.emptyArray, ts2.emptyArray);
        }
        globalReadonlyArrayType = getGlobalTypeOrUndefined("ReadonlyArray", 1) || globalArrayType;
        anyReadonlyArrayType = globalReadonlyArrayType ? createTypeFromGenericGlobalType(globalReadonlyArrayType, [anyType]) : anyArrayType;
        globalThisType = getGlobalTypeOrUndefined("ThisType", 1);
        if (augmentations) {
          for (var _h = 0, augmentations_2 = augmentations; _h < augmentations_2.length; _h++) {
            var list = augmentations_2[_h];
            for (var _j = 0, list_2 = list; _j < list_2.length; _j++) {
              var augmentation = list_2[_j];
              if (ts2.isGlobalScopeAugmentation(augmentation.parent))
                continue;
              mergeModuleAugmentation(augmentation);
            }
          }
        }
        amalgamatedDuplicates.forEach(function(_a2) {
          var firstFile = _a2.firstFile, secondFile = _a2.secondFile, conflictingSymbols = _a2.conflictingSymbols;
          if (conflictingSymbols.size < 8) {
            conflictingSymbols.forEach(function(_a3, symbolName) {
              var isBlockScoped = _a3.isBlockScoped, firstFileLocations = _a3.firstFileLocations, secondFileLocations = _a3.secondFileLocations;
              var message = isBlockScoped ? ts2.Diagnostics.Cannot_redeclare_block_scoped_variable_0 : ts2.Diagnostics.Duplicate_identifier_0;
              for (var _i2 = 0, firstFileLocations_1 = firstFileLocations; _i2 < firstFileLocations_1.length; _i2++) {
                var node = firstFileLocations_1[_i2];
                addDuplicateDeclarationError(node, message, symbolName, secondFileLocations);
              }
              for (var _b2 = 0, secondFileLocations_1 = secondFileLocations; _b2 < secondFileLocations_1.length; _b2++) {
                var node = secondFileLocations_1[_b2];
                addDuplicateDeclarationError(node, message, symbolName, firstFileLocations);
              }
            });
          } else {
            var list2 = ts2.arrayFrom(conflictingSymbols.keys()).join(", ");
            diagnostics.add(ts2.addRelatedInfo(ts2.createDiagnosticForNode(firstFile, ts2.Diagnostics.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, list2), ts2.createDiagnosticForNode(secondFile, ts2.Diagnostics.Conflicts_are_in_this_file)));
            diagnostics.add(ts2.addRelatedInfo(ts2.createDiagnosticForNode(secondFile, ts2.Diagnostics.Definitions_of_the_following_identifiers_conflict_with_those_in_another_file_Colon_0, list2), ts2.createDiagnosticForNode(firstFile, ts2.Diagnostics.Conflicts_are_in_this_file)));
          }
        });
        amalgamatedDuplicates = void 0;
      }
      function checkExternalEmitHelpers(location, helpers) {
        if ((requestedExternalEmitHelpers & helpers) !== helpers && compilerOptions.importHelpers) {
          var sourceFile = ts2.getSourceFileOfNode(location);
          if (ts2.isEffectiveExternalModule(sourceFile, compilerOptions) && !(location.flags & 8388608)) {
            var helpersModule = resolveHelpersModule(sourceFile, location);
            if (helpersModule !== unknownSymbol) {
              var uncheckedHelpers = helpers & ~requestedExternalEmitHelpers;
              for (var helper = 1; helper <= 4194304; helper <<= 1) {
                if (uncheckedHelpers & helper) {
                  var name = getHelperName(helper);
                  var symbol = getSymbol(helpersModule.exports, ts2.escapeLeadingUnderscores(name), 111551);
                  if (!symbol) {
                    error(location, ts2.Diagnostics.This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_version_of_0, ts2.externalHelpersModuleNameText, name);
                  } else if (helper & 524288) {
                    if (!ts2.some(getSignaturesOfSymbol(symbol), function(signature) {
                      return getParameterCount(signature) > 3;
                    })) {
                      error(location, ts2.Diagnostics.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, ts2.externalHelpersModuleNameText, name, 4);
                    }
                  } else if (helper & 1048576) {
                    if (!ts2.some(getSignaturesOfSymbol(symbol), function(signature) {
                      return getParameterCount(signature) > 4;
                    })) {
                      error(location, ts2.Diagnostics.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, ts2.externalHelpersModuleNameText, name, 5);
                    }
                  } else if (helper & 1024) {
                    if (!ts2.some(getSignaturesOfSymbol(symbol), function(signature) {
                      return getParameterCount(signature) > 2;
                    })) {
                      error(location, ts2.Diagnostics.This_syntax_requires_an_imported_helper_named_1_with_2_parameters_which_is_not_compatible_with_the_one_in_0_Consider_upgrading_your_version_of_0, ts2.externalHelpersModuleNameText, name, 3);
                    }
                  }
                }
              }
            }
            requestedExternalEmitHelpers |= helpers;
          }
        }
      }
      function getHelperName(helper) {
        switch (helper) {
          case 1:
            return "__extends";
          case 2:
            return "__assign";
          case 4:
            return "__rest";
          case 8:
            return "__decorate";
          case 16:
            return "__metadata";
          case 32:
            return "__param";
          case 64:
            return "__awaiter";
          case 128:
            return "__generator";
          case 256:
            return "__values";
          case 512:
            return "__read";
          case 1024:
            return "__spreadArray";
          case 2048:
            return "__await";
          case 4096:
            return "__asyncGenerator";
          case 8192:
            return "__asyncDelegator";
          case 16384:
            return "__asyncValues";
          case 32768:
            return "__exportStar";
          case 65536:
            return "__importStar";
          case 131072:
            return "__importDefault";
          case 262144:
            return "__makeTemplateObject";
          case 524288:
            return "__classPrivateFieldGet";
          case 1048576:
            return "__classPrivateFieldSet";
          case 2097152:
            return "__classPrivateFieldIn";
          case 4194304:
            return "__createBinding";
          default:
            return ts2.Debug.fail("Unrecognized helper");
        }
      }
      function resolveHelpersModule(node, errorNode) {
        if (!externalHelpersModule) {
          externalHelpersModule = resolveExternalModule(node, ts2.externalHelpersModuleNameText, ts2.Diagnostics.This_syntax_requires_an_imported_helper_but_module_0_cannot_be_found, errorNode) || unknownSymbol;
        }
        return externalHelpersModule;
      }
      function checkGrammarDecoratorsAndModifiers(node) {
        return checkGrammarDecorators(node) || checkGrammarModifiers(node);
      }
      function checkGrammarDecorators(node) {
        if (!node.decorators) {
          return false;
        }
        if (!ts2.nodeCanBeDecorated(node, node.parent, node.parent.parent)) {
          if (node.kind === 168 && !ts2.nodeIsPresent(node.body)) {
            return grammarErrorOnFirstToken(node, ts2.Diagnostics.A_decorator_can_only_decorate_a_method_implementation_not_an_overload);
          } else {
            return grammarErrorOnFirstToken(node, ts2.Diagnostics.Decorators_are_not_valid_here);
          }
        } else if (node.kind === 171 || node.kind === 172) {
          var accessors = ts2.getAllAccessorDeclarations(node.parent.members, node);
          if (accessors.firstAccessor.decorators && node === accessors.secondAccessor) {
            return grammarErrorOnFirstToken(node, ts2.Diagnostics.Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name);
          }
        }
        return false;
      }
      function checkGrammarModifiers(node) {
        var quickResult = reportObviousModifierErrors(node);
        if (quickResult !== void 0) {
          return quickResult;
        }
        var lastStatic, lastDeclare, lastAsync, lastReadonly, lastOverride;
        var flags = 0;
        for (var _i = 0, _a = node.modifiers; _i < _a.length; _i++) {
          var modifier = _a[_i];
          if (modifier.kind !== 144) {
            if (node.kind === 165 || node.kind === 167) {
              return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_a_type_member, ts2.tokenToString(modifier.kind));
            }
            if (node.kind === 175 && (modifier.kind !== 124 || !ts2.isClassLike(node.parent))) {
              return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_an_index_signature, ts2.tokenToString(modifier.kind));
            }
          }
          switch (modifier.kind) {
            case 85:
              if (node.kind !== 259) {
                return grammarErrorOnNode(node, ts2.Diagnostics.A_class_member_cannot_have_the_0_keyword, ts2.tokenToString(85));
              }
              break;
            case 158:
              if (flags & 16384) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_already_seen, "override");
              } else if (flags & 2) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "override", "declare");
              } else if (flags & 64) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
              } else if (flags & 256) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
              }
              flags |= 16384;
              lastOverride = modifier;
              break;
            case 123:
            case 122:
            case 121:
              var text = visibilityToString(ts2.modifierToFlag(modifier.kind));
              if (flags & 28) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics.Accessibility_modifier_already_seen);
              } else if (flags & 16384) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, text, "override");
              } else if (flags & 32) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
              } else if (flags & 64) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, text, "readonly");
              } else if (flags & 256) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, text, "async");
              } else if (node.parent.kind === 261 || node.parent.kind === 303) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, text);
              } else if (flags & 128) {
                if (modifier.kind === 121) {
                  return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, text, "abstract");
                } else {
                  return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, text, "abstract");
                }
              } else if (ts2.isPrivateIdentifierClassElementDeclaration(node)) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics.An_accessibility_modifier_cannot_be_used_with_a_private_identifier);
              }
              flags |= ts2.modifierToFlag(modifier.kind);
              break;
            case 124:
              if (flags & 32) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_already_seen, "static");
              } else if (flags & 64) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "static", "readonly");
              } else if (flags & 256) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "static", "async");
              } else if (node.parent.kind === 261 || node.parent.kind === 303) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static");
              } else if (node.kind === 163) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "static");
              } else if (flags & 128) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
              } else if (flags & 16384) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "static", "override");
              }
              flags |= 32;
              lastStatic = modifier;
              break;
            case 144:
              if (flags & 64) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_already_seen, "readonly");
              } else if (node.kind !== 166 && node.kind !== 165 && node.kind !== 175 && node.kind !== 163) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics.readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature);
              }
              flags |= 64;
              lastReadonly = modifier;
              break;
            case 93:
              if (flags & 1) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_already_seen, "export");
              } else if (flags & 2) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "export", "declare");
              } else if (flags & 128) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "export", "abstract");
              } else if (flags & 256) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "export", "async");
              } else if (ts2.isClassLike(node.parent)) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_class_elements_of_this_kind, "export");
              } else if (node.kind === 163) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "export");
              }
              flags |= 1;
              break;
            case 88:
              var container = node.parent.kind === 303 ? node.parent : node.parent.parent;
              if (container.kind === 260 && !ts2.isAmbientModule(container)) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics.A_default_export_can_only_be_used_in_an_ECMAScript_style_module);
              } else if (!(flags & 1)) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "export", "default");
              }
              flags |= 512;
              break;
            case 135:
              if (flags & 2) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_already_seen, "declare");
              } else if (flags & 256) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async");
              } else if (flags & 16384) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "override");
              } else if (ts2.isClassLike(node.parent) && !ts2.isPropertyDeclaration(node)) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_class_elements_of_this_kind, "declare");
              } else if (node.kind === 163) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "declare");
              } else if (node.parent.flags & 8388608 && node.parent.kind === 261) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context);
              } else if (ts2.isPrivateIdentifierClassElementDeclaration(node)) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "declare");
              }
              flags |= 2;
              lastDeclare = modifier;
              break;
            case 126:
              if (flags & 128) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_already_seen, "abstract");
              }
              if (node.kind !== 256 && node.kind !== 179) {
                if (node.kind !== 168 && node.kind !== 166 && node.kind !== 171 && node.kind !== 172) {
                  return grammarErrorOnNode(modifier, ts2.Diagnostics.abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration);
                }
                if (!(node.parent.kind === 256 && ts2.hasSyntacticModifier(node.parent, 128))) {
                  return grammarErrorOnNode(modifier, ts2.Diagnostics.Abstract_methods_can_only_appear_within_an_abstract_class);
                }
                if (flags & 32) {
                  return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
                }
                if (flags & 8) {
                  return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract");
                }
                if (flags & 256 && lastAsync) {
                  return grammarErrorOnNode(lastAsync, ts2.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
                }
                if (flags & 16384) {
                  return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override");
                }
              }
              if (ts2.isNamedDeclaration(node) && node.name.kind === 80) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");
              }
              flags |= 128;
              break;
            case 131:
              if (flags & 256) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_already_seen, "async");
              } else if (flags & 2 || node.parent.flags & 8388608) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async");
              } else if (node.kind === 163) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "async");
              }
              if (flags & 128) {
                return grammarErrorOnNode(modifier, ts2.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract");
              }
              flags |= 256;
              lastAsync = modifier;
              break;
          }
        }
        if (node.kind === 170) {
          if (flags & 32) {
            return grammarErrorOnNode(lastStatic, ts2.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static");
          }
          if (flags & 128) {
            return grammarErrorOnNode(lastStatic, ts2.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "abstract");
          }
          if (flags & 16384) {
            return grammarErrorOnNode(lastOverride, ts2.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "override");
          } else if (flags & 256) {
            return grammarErrorOnNode(lastAsync, ts2.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "async");
          } else if (flags & 64) {
            return grammarErrorOnNode(lastReadonly, ts2.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "readonly");
          }
          return false;
        } else if ((node.kind === 265 || node.kind === 264) && flags & 2) {
          return grammarErrorOnNode(lastDeclare, ts2.Diagnostics.A_0_modifier_cannot_be_used_with_an_import_declaration, "declare");
        } else if (node.kind === 163 && flags & 16476 && ts2.isBindingPattern(node.name)) {
          return grammarErrorOnNode(node, ts2.Diagnostics.A_parameter_property_may_not_be_declared_using_a_binding_pattern);
        } else if (node.kind === 163 && flags & 16476 && node.dotDotDotToken) {
          return grammarErrorOnNode(node, ts2.Diagnostics.A_parameter_property_cannot_be_declared_using_a_rest_parameter);
        }
        if (flags & 256) {
          return checkGrammarAsyncModifier(node, lastAsync);
        }
        return false;
      }
      function reportObviousModifierErrors(node) {
        return !node.modifiers ? false : shouldReportBadModifier(node) ? grammarErrorOnFirstToken(node, ts2.Diagnostics.Modifiers_cannot_appear_here) : void 0;
      }
      function shouldReportBadModifier(node) {
        switch (node.kind) {
          case 171:
          case 172:
          case 170:
          case 166:
          case 165:
          case 168:
          case 167:
          case 175:
          case 260:
          case 265:
          case 264:
          case 271:
          case 270:
          case 212:
          case 213:
          case 163:
            return false;
          default:
            if (node.parent.kind === 261 || node.parent.kind === 303) {
              return false;
            }
            switch (node.kind) {
              case 255:
                return nodeHasAnyModifiersExcept(node, 131);
              case 256:
              case 179:
                return nodeHasAnyModifiersExcept(node, 126);
              case 257:
              case 236:
              case 258:
              case 169:
                return true;
              case 259:
                return nodeHasAnyModifiersExcept(node, 85);
              default:
                ts2.Debug.fail();
            }
        }
      }
      function nodeHasAnyModifiersExcept(node, allowedModifier) {
        return node.modifiers.length > 1 || node.modifiers[0].kind !== allowedModifier;
      }
      function checkGrammarAsyncModifier(node, asyncModifier) {
        switch (node.kind) {
          case 168:
          case 255:
          case 212:
          case 213:
            return false;
        }
        return grammarErrorOnNode(asyncModifier, ts2.Diagnostics._0_modifier_cannot_be_used_here, "async");
      }
      function checkGrammarForDisallowedTrailingComma(list, diag) {
        if (diag === void 0) {
          diag = ts2.Diagnostics.Trailing_comma_not_allowed;
        }
        if (list && list.hasTrailingComma) {
          return grammarErrorAtPos(list[0], list.end - ",".length, ",".length, diag);
        }
        return false;
      }
      function checkGrammarTypeParameterList(typeParameters, file) {
        if (typeParameters && typeParameters.length === 0) {
          var start = typeParameters.pos - "<".length;
          var end = ts2.skipTrivia(file.text, typeParameters.end) + ">".length;
          return grammarErrorAtPos(file, start, end - start, ts2.Diagnostics.Type_parameter_list_cannot_be_empty);
        }
        return false;
      }
      function checkGrammarParameterList(parameters) {
        var seenOptionalParameter = false;
        var parameterCount = parameters.length;
        for (var i = 0; i < parameterCount; i++) {
          var parameter = parameters[i];
          if (parameter.dotDotDotToken) {
            if (i !== parameterCount - 1) {
              return grammarErrorOnNode(parameter.dotDotDotToken, ts2.Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
            }
            if (!(parameter.flags & 8388608)) {
              checkGrammarForDisallowedTrailingComma(parameters, ts2.Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
            }
            if (parameter.questionToken) {
              return grammarErrorOnNode(parameter.questionToken, ts2.Diagnostics.A_rest_parameter_cannot_be_optional);
            }
            if (parameter.initializer) {
              return grammarErrorOnNode(parameter.name, ts2.Diagnostics.A_rest_parameter_cannot_have_an_initializer);
            }
          } else if (isOptionalParameter(parameter)) {
            seenOptionalParameter = true;
            if (parameter.questionToken && parameter.initializer) {
              return grammarErrorOnNode(parameter.name, ts2.Diagnostics.Parameter_cannot_have_question_mark_and_initializer);
            }
          } else if (seenOptionalParameter && !parameter.initializer) {
            return grammarErrorOnNode(parameter.name, ts2.Diagnostics.A_required_parameter_cannot_follow_an_optional_parameter);
          }
        }
      }
      function getNonSimpleParameters(parameters) {
        return ts2.filter(parameters, function(parameter) {
          return !!parameter.initializer || ts2.isBindingPattern(parameter.name) || ts2.isRestParameter(parameter);
        });
      }
      function checkGrammarForUseStrictSimpleParameterList(node) {
        if (languageVersion >= 3) {
          var useStrictDirective_1 = node.body && ts2.isBlock(node.body) && ts2.findUseStrictPrologue(node.body.statements);
          if (useStrictDirective_1) {
            var nonSimpleParameters = getNonSimpleParameters(node.parameters);
            if (ts2.length(nonSimpleParameters)) {
              ts2.forEach(nonSimpleParameters, function(parameter) {
                ts2.addRelatedInfo(error(parameter, ts2.Diagnostics.This_parameter_is_not_allowed_with_use_strict_directive), ts2.createDiagnosticForNode(useStrictDirective_1, ts2.Diagnostics.use_strict_directive_used_here));
              });
              var diagnostics_2 = nonSimpleParameters.map(function(parameter, index) {
                return index === 0 ? ts2.createDiagnosticForNode(parameter, ts2.Diagnostics.Non_simple_parameter_declared_here) : ts2.createDiagnosticForNode(parameter, ts2.Diagnostics.and_here);
              });
              ts2.addRelatedInfo.apply(void 0, __spreadArray([error(useStrictDirective_1, ts2.Diagnostics.use_strict_directive_cannot_be_used_with_non_simple_parameter_list)], diagnostics_2, false));
              return true;
            }
          }
        }
        return false;
      }
      function checkGrammarFunctionLikeDeclaration(node) {
        var file = ts2.getSourceFileOfNode(node);
        return checkGrammarDecoratorsAndModifiers(node) || checkGrammarTypeParameterList(node.typeParameters, file) || checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file) || ts2.isFunctionLikeDeclaration(node) && checkGrammarForUseStrictSimpleParameterList(node);
      }
      function checkGrammarClassLikeDeclaration(node) {
        var file = ts2.getSourceFileOfNode(node);
        return checkGrammarClassDeclarationHeritageClauses(node) || checkGrammarTypeParameterList(node.typeParameters, file);
      }
      function checkGrammarArrowFunction(node, file) {
        if (!ts2.isArrowFunction(node)) {
          return false;
        }
        if (node.typeParameters && !(ts2.length(node.typeParameters) > 1 || node.typeParameters.hasTrailingComma || node.typeParameters[0].constraint)) {
          if (file && ts2.fileExtensionIsOneOf(file.fileName, [".mts", ".cts"])) {
            grammarErrorOnNode(node.typeParameters[0], ts2.Diagnostics.This_syntax_is_reserved_in_files_with_the_mts_or_cts_extension_Add_a_trailing_comma_or_explicit_constraint);
          }
        }
        var equalsGreaterThanToken = node.equalsGreaterThanToken;
        var startLine = ts2.getLineAndCharacterOfPosition(file, equalsGreaterThanToken.pos).line;
        var endLine = ts2.getLineAndCharacterOfPosition(file, equalsGreaterThanToken.end).line;
        return startLine !== endLine && grammarErrorOnNode(equalsGreaterThanToken, ts2.Diagnostics.Line_terminator_not_permitted_before_arrow);
      }
      function checkGrammarIndexSignatureParameters(node) {
        var parameter = node.parameters[0];
        if (node.parameters.length !== 1) {
          if (parameter) {
            return grammarErrorOnNode(parameter.name, ts2.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
          } else {
            return grammarErrorOnNode(node, ts2.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
          }
        }
        checkGrammarForDisallowedTrailingComma(node.parameters, ts2.Diagnostics.An_index_signature_cannot_have_a_trailing_comma);
        if (parameter.dotDotDotToken) {
          return grammarErrorOnNode(parameter.dotDotDotToken, ts2.Diagnostics.An_index_signature_cannot_have_a_rest_parameter);
        }
        if (ts2.hasEffectiveModifiers(parameter)) {
          return grammarErrorOnNode(parameter.name, ts2.Diagnostics.An_index_signature_parameter_cannot_have_an_accessibility_modifier);
        }
        if (parameter.questionToken) {
          return grammarErrorOnNode(parameter.questionToken, ts2.Diagnostics.An_index_signature_parameter_cannot_have_a_question_mark);
        }
        if (parameter.initializer) {
          return grammarErrorOnNode(parameter.name, ts2.Diagnostics.An_index_signature_parameter_cannot_have_an_initializer);
        }
        if (!parameter.type) {
          return grammarErrorOnNode(parameter.name, ts2.Diagnostics.An_index_signature_parameter_must_have_a_type_annotation);
        }
        var type = getTypeFromTypeNode(parameter.type);
        if (someType(type, function(t) {
          return !!(t.flags & 8576);
        }) || isGenericType(type)) {
          return grammarErrorOnNode(parameter.name, ts2.Diagnostics.An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead);
        }
        if (!everyType(type, isValidIndexKeyType)) {
          return grammarErrorOnNode(parameter.name, ts2.Diagnostics.An_index_signature_parameter_type_must_be_string_number_symbol_or_a_template_literal_type);
        }
        if (!node.type) {
          return grammarErrorOnNode(node, ts2.Diagnostics.An_index_signature_must_have_a_type_annotation);
        }
        return false;
      }
      function checkGrammarIndexSignature(node) {
        return checkGrammarDecoratorsAndModifiers(node) || checkGrammarIndexSignatureParameters(node);
      }
      function checkGrammarForAtLeastOneTypeArgument(node, typeArguments) {
        if (typeArguments && typeArguments.length === 0) {
          var sourceFile = ts2.getSourceFileOfNode(node);
          var start = typeArguments.pos - "<".length;
          var end = ts2.skipTrivia(sourceFile.text, typeArguments.end) + ">".length;
          return grammarErrorAtPos(sourceFile, start, end - start, ts2.Diagnostics.Type_argument_list_cannot_be_empty);
        }
        return false;
      }
      function checkGrammarTypeArguments(node, typeArguments) {
        return checkGrammarForDisallowedTrailingComma(typeArguments) || checkGrammarForAtLeastOneTypeArgument(node, typeArguments);
      }
      function checkGrammarTaggedTemplateChain(node) {
        if (node.questionDotToken || node.flags & 32) {
          return grammarErrorOnNode(node.template, ts2.Diagnostics.Tagged_template_expressions_are_not_permitted_in_an_optional_chain);
        }
        return false;
      }
      function checkGrammarForOmittedArgument(args) {
        if (args) {
          for (var _i = 0, args_4 = args; _i < args_4.length; _i++) {
            var arg = args_4[_i];
            if (arg.kind === 226) {
              return grammarErrorAtPos(arg, arg.pos, 0, ts2.Diagnostics.Argument_expression_expected);
            }
          }
        }
        return false;
      }
      function checkGrammarArguments(args) {
        return checkGrammarForOmittedArgument(args);
      }
      function checkGrammarHeritageClause(node) {
        var types = node.types;
        if (checkGrammarForDisallowedTrailingComma(types)) {
          return true;
        }
        if (types && types.length === 0) {
          var listType = ts2.tokenToString(node.token);
          return grammarErrorAtPos(node, types.pos, 0, ts2.Diagnostics._0_list_cannot_be_empty, listType);
        }
        return ts2.some(types, checkGrammarExpressionWithTypeArguments);
      }
      function checkGrammarExpressionWithTypeArguments(node) {
        return checkGrammarTypeArguments(node, node.typeArguments);
      }
      function checkGrammarClassDeclarationHeritageClauses(node) {
        var seenExtendsClause = false;
        var seenImplementsClause = false;
        if (!checkGrammarDecoratorsAndModifiers(node) && node.heritageClauses) {
          for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
            var heritageClause = _a[_i];
            if (heritageClause.token === 94) {
              if (seenExtendsClause) {
                return grammarErrorOnFirstToken(heritageClause, ts2.Diagnostics.extends_clause_already_seen);
              }
              if (seenImplementsClause) {
                return grammarErrorOnFirstToken(heritageClause, ts2.Diagnostics.extends_clause_must_precede_implements_clause);
              }
              if (heritageClause.types.length > 1) {
                return grammarErrorOnFirstToken(heritageClause.types[1], ts2.Diagnostics.Classes_can_only_extend_a_single_class);
              }
              seenExtendsClause = true;
            } else {
              ts2.Debug.assert(heritageClause.token === 117);
              if (seenImplementsClause) {
                return grammarErrorOnFirstToken(heritageClause, ts2.Diagnostics.implements_clause_already_seen);
              }
              seenImplementsClause = true;
            }
            checkGrammarHeritageClause(heritageClause);
          }
        }
      }
      function checkGrammarInterfaceDeclaration(node) {
        var seenExtendsClause = false;
        if (node.heritageClauses) {
          for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
            var heritageClause = _a[_i];
            if (heritageClause.token === 94) {
              if (seenExtendsClause) {
                return grammarErrorOnFirstToken(heritageClause, ts2.Diagnostics.extends_clause_already_seen);
              }
              seenExtendsClause = true;
            } else {
              ts2.Debug.assert(heritageClause.token === 117);
              return grammarErrorOnFirstToken(heritageClause, ts2.Diagnostics.Interface_declaration_cannot_have_implements_clause);
            }
            checkGrammarHeritageClause(heritageClause);
          }
        }
        return false;
      }
      function checkGrammarComputedPropertyName(node) {
        if (node.kind !== 161) {
          return false;
        }
        var computedPropertyName = node;
        if (computedPropertyName.expression.kind === 220 && computedPropertyName.expression.operatorToken.kind === 27) {
          return grammarErrorOnNode(computedPropertyName.expression, ts2.Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name);
        }
        return false;
      }
      function checkGrammarForGenerator(node) {
        if (node.asteriskToken) {
          ts2.Debug.assert(node.kind === 255 || node.kind === 212 || node.kind === 168);
          if (node.flags & 8388608) {
            return grammarErrorOnNode(node.asteriskToken, ts2.Diagnostics.Generators_are_not_allowed_in_an_ambient_context);
          }
          if (!node.body) {
            return grammarErrorOnNode(node.asteriskToken, ts2.Diagnostics.An_overload_signature_cannot_be_declared_as_a_generator);
          }
        }
      }
      function checkGrammarForInvalidQuestionMark(questionToken, message) {
        return !!questionToken && grammarErrorOnNode(questionToken, message);
      }
      function checkGrammarForInvalidExclamationToken(exclamationToken, message) {
        return !!exclamationToken && grammarErrorOnNode(exclamationToken, message);
      }
      function checkGrammarObjectLiteralExpression(node, inDestructuring) {
        var seen = new ts2.Map();
        for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
          var prop = _a[_i];
          if (prop.kind === 296) {
            if (inDestructuring) {
              var expression = ts2.skipParentheses(prop.expression);
              if (ts2.isArrayLiteralExpression(expression) || ts2.isObjectLiteralExpression(expression)) {
                return grammarErrorOnNode(prop.expression, ts2.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
              }
            }
            continue;
          }
          var name = prop.name;
          if (name.kind === 161) {
            checkGrammarComputedPropertyName(name);
          }
          if (prop.kind === 295 && !inDestructuring && prop.objectAssignmentInitializer) {
            return grammarErrorOnNode(prop.equalsToken, ts2.Diagnostics.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern);
          }
          if (name.kind === 80) {
            grammarErrorOnNode(name, ts2.Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies);
          }
          if (prop.modifiers) {
            for (var _b = 0, _c = prop.modifiers; _b < _c.length; _b++) {
              var mod = _c[_b];
              if (mod.kind !== 131 || prop.kind !== 168) {
                grammarErrorOnNode(mod, ts2.Diagnostics._0_modifier_cannot_be_used_here, ts2.getTextOfNode(mod));
              }
            }
          }
          var currentKind = void 0;
          switch (prop.kind) {
            case 295:
              checkGrammarForInvalidExclamationToken(prop.exclamationToken, ts2.Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context);
            case 294:
              checkGrammarForInvalidQuestionMark(prop.questionToken, ts2.Diagnostics.An_object_member_cannot_be_declared_optional);
              if (name.kind === 8) {
                checkGrammarNumericLiteral(name);
              }
              currentKind = 4;
              break;
            case 168:
              currentKind = 8;
              break;
            case 171:
              currentKind = 1;
              break;
            case 172:
              currentKind = 2;
              break;
            default:
              throw ts2.Debug.assertNever(prop, "Unexpected syntax kind:" + prop.kind);
          }
          if (!inDestructuring) {
            var effectiveName = ts2.getPropertyNameForPropertyNameNode(name);
            if (effectiveName === void 0) {
              continue;
            }
            var existingKind = seen.get(effectiveName);
            if (!existingKind) {
              seen.set(effectiveName, currentKind);
            } else {
              if (currentKind & 12 && existingKind & 12) {
                grammarErrorOnNode(name, ts2.Diagnostics.Duplicate_identifier_0, ts2.getTextOfNode(name));
              } else if (currentKind & 3 && existingKind & 3) {
                if (existingKind !== 3 && currentKind !== existingKind) {
                  seen.set(effectiveName, currentKind | existingKind);
                } else {
                  return grammarErrorOnNode(name, ts2.Diagnostics.An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name);
                }
              } else {
                return grammarErrorOnNode(name, ts2.Diagnostics.An_object_literal_cannot_have_property_and_accessor_with_the_same_name);
              }
            }
          }
        }
      }
      function checkGrammarJsxElement(node) {
        checkGrammarJsxName(node.tagName);
        checkGrammarTypeArguments(node, node.typeArguments);
        var seen = new ts2.Map();
        for (var _i = 0, _a = node.attributes.properties; _i < _a.length; _i++) {
          var attr = _a[_i];
          if (attr.kind === 286) {
            continue;
          }
          var name = attr.name, initializer = attr.initializer;
          if (!seen.get(name.escapedText)) {
            seen.set(name.escapedText, true);
          } else {
            return grammarErrorOnNode(name, ts2.Diagnostics.JSX_elements_cannot_have_multiple_attributes_with_the_same_name);
          }
          if (initializer && initializer.kind === 287 && !initializer.expression) {
            return grammarErrorOnNode(initializer, ts2.Diagnostics.JSX_attributes_must_only_be_assigned_a_non_empty_expression);
          }
        }
      }
      function checkGrammarJsxName(node) {
        if (ts2.isPropertyAccessExpression(node)) {
          var propName = node;
          do {
            var check_1 = checkGrammarJsxNestedIdentifier(propName.name);
            if (check_1) {
              return check_1;
            }
            propName = propName.expression;
          } while (ts2.isPropertyAccessExpression(propName));
          var check = checkGrammarJsxNestedIdentifier(propName);
          if (check) {
            return check;
          }
        }
        function checkGrammarJsxNestedIdentifier(name) {
          if (ts2.isIdentifier(name) && ts2.idText(name).indexOf(":") !== -1) {
            return grammarErrorOnNode(name, ts2.Diagnostics.JSX_property_access_expressions_cannot_include_JSX_namespace_names);
          }
        }
      }
      function checkGrammarJsxExpression(node) {
        if (node.expression && ts2.isCommaSequence(node.expression)) {
          return grammarErrorOnNode(node.expression, ts2.Diagnostics.JSX_expressions_may_not_use_the_comma_operator_Did_you_mean_to_write_an_array);
        }
      }
      function checkGrammarForInOrForOfStatement(forInOrOfStatement) {
        if (checkGrammarStatementInAmbientContext(forInOrOfStatement)) {
          return true;
        }
        if (forInOrOfStatement.kind === 243 && forInOrOfStatement.awaitModifier) {
          if (!(forInOrOfStatement.flags & 32768)) {
            var sourceFile = ts2.getSourceFileOfNode(forInOrOfStatement);
            if (ts2.isInTopLevelContext(forInOrOfStatement)) {
              if (!hasParseDiagnostics(sourceFile)) {
                if (!ts2.isEffectiveExternalModule(sourceFile, compilerOptions)) {
                  diagnostics.add(ts2.createDiagnosticForNode(forInOrOfStatement.awaitModifier, ts2.Diagnostics.for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module));
                }
                if (moduleKind !== ts2.ModuleKind.ES2022 && moduleKind !== ts2.ModuleKind.ESNext && moduleKind !== ts2.ModuleKind.System && !(moduleKind === ts2.ModuleKind.NodeNext && ts2.getSourceFileOfNode(forInOrOfStatement).impliedNodeFormat === ts2.ModuleKind.ESNext) || languageVersion < 4) {
                  diagnostics.add(ts2.createDiagnosticForNode(forInOrOfStatement.awaitModifier, ts2.Diagnostics.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher));
                }
              }
            } else {
              if (!hasParseDiagnostics(sourceFile)) {
                var diagnostic = ts2.createDiagnosticForNode(forInOrOfStatement.awaitModifier, ts2.Diagnostics.for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules);
                var func = ts2.getContainingFunction(forInOrOfStatement);
                if (func && func.kind !== 170) {
                  ts2.Debug.assert((ts2.getFunctionFlags(func) & 2) === 0, "Enclosing function should never be an async function.");
                  var relatedInfo = ts2.createDiagnosticForNode(func, ts2.Diagnostics.Did_you_mean_to_mark_this_function_as_async);
                  ts2.addRelatedInfo(diagnostic, relatedInfo);
                }
                diagnostics.add(diagnostic);
                return true;
              }
            }
            return false;
          }
        }
        if (ts2.isForOfStatement(forInOrOfStatement) && !(forInOrOfStatement.flags & 32768) && ts2.isIdentifier(forInOrOfStatement.initializer) && forInOrOfStatement.initializer.escapedText === "async") {
          grammarErrorOnNode(forInOrOfStatement.initializer, ts2.Diagnostics.The_left_hand_side_of_a_for_of_statement_may_not_be_async);
          return false;
        }
        if (forInOrOfStatement.initializer.kind === 254) {
          var variableList = forInOrOfStatement.initializer;
          if (!checkGrammarVariableDeclarationList(variableList)) {
            var declarations = variableList.declarations;
            if (!declarations.length) {
              return false;
            }
            if (declarations.length > 1) {
              var diagnostic = forInOrOfStatement.kind === 242 ? ts2.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement : ts2.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement;
              return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic);
            }
            var firstDeclaration = declarations[0];
            if (firstDeclaration.initializer) {
              var diagnostic = forInOrOfStatement.kind === 242 ? ts2.Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer : ts2.Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer;
              return grammarErrorOnNode(firstDeclaration.name, diagnostic);
            }
            if (firstDeclaration.type) {
              var diagnostic = forInOrOfStatement.kind === 242 ? ts2.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation : ts2.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation;
              return grammarErrorOnNode(firstDeclaration, diagnostic);
            }
          }
        }
        return false;
      }
      function checkGrammarAccessor(accessor) {
        if (!(accessor.flags & 8388608) && accessor.parent.kind !== 181 && accessor.parent.kind !== 257) {
          if (languageVersion < 1) {
            return grammarErrorOnNode(accessor.name, ts2.Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher);
          }
          if (languageVersion < 2 && ts2.isPrivateIdentifier(accessor.name)) {
            return grammarErrorOnNode(accessor.name, ts2.Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher);
          }
          if (accessor.body === void 0 && !ts2.hasSyntacticModifier(accessor, 128)) {
            return grammarErrorAtPos(accessor, accessor.end - 1, ";".length, ts2.Diagnostics._0_expected, "{");
          }
        }
        if (accessor.body) {
          if (ts2.hasSyntacticModifier(accessor, 128)) {
            return grammarErrorOnNode(accessor, ts2.Diagnostics.An_abstract_accessor_cannot_have_an_implementation);
          }
          if (accessor.parent.kind === 181 || accessor.parent.kind === 257) {
            return grammarErrorOnNode(accessor.body, ts2.Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts);
          }
        }
        if (accessor.typeParameters) {
          return grammarErrorOnNode(accessor.name, ts2.Diagnostics.An_accessor_cannot_have_type_parameters);
        }
        if (!doesAccessorHaveCorrectParameterCount(accessor)) {
          return grammarErrorOnNode(accessor.name, accessor.kind === 171 ? ts2.Diagnostics.A_get_accessor_cannot_have_parameters : ts2.Diagnostics.A_set_accessor_must_have_exactly_one_parameter);
        }
        if (accessor.kind === 172) {
          if (accessor.type) {
            return grammarErrorOnNode(accessor.name, ts2.Diagnostics.A_set_accessor_cannot_have_a_return_type_annotation);
          }
          var parameter = ts2.Debug.checkDefined(ts2.getSetAccessorValueParameter(accessor), "Return value does not match parameter count assertion.");
          if (parameter.dotDotDotToken) {
            return grammarErrorOnNode(parameter.dotDotDotToken, ts2.Diagnostics.A_set_accessor_cannot_have_rest_parameter);
          }
          if (parameter.questionToken) {
            return grammarErrorOnNode(parameter.questionToken, ts2.Diagnostics.A_set_accessor_cannot_have_an_optional_parameter);
          }
          if (parameter.initializer) {
            return grammarErrorOnNode(accessor.name, ts2.Diagnostics.A_set_accessor_parameter_cannot_have_an_initializer);
          }
        }
        return false;
      }
      function doesAccessorHaveCorrectParameterCount(accessor) {
        return getAccessorThisParameter(accessor) || accessor.parameters.length === (accessor.kind === 171 ? 0 : 1);
      }
      function getAccessorThisParameter(accessor) {
        if (accessor.parameters.length === (accessor.kind === 171 ? 1 : 2)) {
          return ts2.getThisParameter(accessor);
        }
      }
      function checkGrammarTypeOperatorNode(node) {
        if (node.operator === 153) {
          if (node.type.kind !== 150) {
            return grammarErrorOnNode(node.type, ts2.Diagnostics._0_expected, ts2.tokenToString(150));
          }
          var parent = ts2.walkUpParenthesizedTypes(node.parent);
          if (ts2.isInJSFile(parent) && ts2.isJSDocTypeExpression(parent)) {
            parent = parent.parent;
            if (ts2.isJSDocTypeTag(parent)) {
              parent = parent.parent.parent;
            }
          }
          switch (parent.kind) {
            case 253:
              var decl = parent;
              if (decl.name.kind !== 79) {
                return grammarErrorOnNode(node, ts2.Diagnostics.unique_symbol_types_may_not_be_used_on_a_variable_declaration_with_a_binding_name);
              }
              if (!ts2.isVariableDeclarationInVariableStatement(decl)) {
                return grammarErrorOnNode(node, ts2.Diagnostics.unique_symbol_types_are_only_allowed_on_variables_in_a_variable_statement);
              }
              if (!(decl.parent.flags & 2)) {
                return grammarErrorOnNode(parent.name, ts2.Diagnostics.A_variable_whose_type_is_a_unique_symbol_type_must_be_const);
              }
              break;
            case 166:
              if (!ts2.isStatic(parent) || !ts2.hasEffectiveReadonlyModifier(parent)) {
                return grammarErrorOnNode(parent.name, ts2.Diagnostics.A_property_of_a_class_whose_type_is_a_unique_symbol_type_must_be_both_static_and_readonly);
              }
              break;
            case 165:
              if (!ts2.hasSyntacticModifier(parent, 64)) {
                return grammarErrorOnNode(parent.name, ts2.Diagnostics.A_property_of_an_interface_or_type_literal_whose_type_is_a_unique_symbol_type_must_be_readonly);
              }
              break;
            default:
              return grammarErrorOnNode(node, ts2.Diagnostics.unique_symbol_types_are_not_allowed_here);
          }
        } else if (node.operator === 144) {
          if (node.type.kind !== 182 && node.type.kind !== 183) {
            return grammarErrorOnFirstToken(node, ts2.Diagnostics.readonly_type_modifier_is_only_permitted_on_array_and_tuple_literal_types, ts2.tokenToString(150));
          }
        }
      }
      function checkGrammarForInvalidDynamicName(node, message) {
        if (isNonBindableDynamicName(node)) {
          return grammarErrorOnNode(node, message);
        }
      }
      function checkGrammarMethod(node) {
        if (checkGrammarFunctionLikeDeclaration(node)) {
          return true;
        }
        if (node.kind === 168) {
          if (node.parent.kind === 204) {
            if (node.modifiers && !(node.modifiers.length === 1 && ts2.first(node.modifiers).kind === 131)) {
              return grammarErrorOnFirstToken(node, ts2.Diagnostics.Modifiers_cannot_appear_here);
            } else if (checkGrammarForInvalidQuestionMark(node.questionToken, ts2.Diagnostics.An_object_member_cannot_be_declared_optional)) {
              return true;
            } else if (checkGrammarForInvalidExclamationToken(node.exclamationToken, ts2.Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context)) {
              return true;
            } else if (node.body === void 0) {
              return grammarErrorAtPos(node, node.end - 1, ";".length, ts2.Diagnostics._0_expected, "{");
            }
          }
          if (checkGrammarForGenerator(node)) {
            return true;
          }
        }
        if (ts2.isClassLike(node.parent)) {
          if (languageVersion < 2 && ts2.isPrivateIdentifier(node.name)) {
            return grammarErrorOnNode(node.name, ts2.Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher);
          }
          if (node.flags & 8388608) {
            return checkGrammarForInvalidDynamicName(node.name, ts2.Diagnostics.A_computed_property_name_in_an_ambient_context_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type);
          } else if (node.kind === 168 && !node.body) {
            return checkGrammarForInvalidDynamicName(node.name, ts2.Diagnostics.A_computed_property_name_in_a_method_overload_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type);
          }
        } else if (node.parent.kind === 257) {
          return checkGrammarForInvalidDynamicName(node.name, ts2.Diagnostics.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type);
        } else if (node.parent.kind === 181) {
          return checkGrammarForInvalidDynamicName(node.name, ts2.Diagnostics.A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type);
        }
      }
      function checkGrammarBreakOrContinueStatement(node) {
        var current = node;
        while (current) {
          if (ts2.isFunctionLikeOrClassStaticBlockDeclaration(current)) {
            return grammarErrorOnNode(node, ts2.Diagnostics.Jump_target_cannot_cross_function_boundary);
          }
          switch (current.kind) {
            case 249:
              if (node.label && current.label.escapedText === node.label.escapedText) {
                var isMisplacedContinueLabel = node.kind === 244 && !ts2.isIterationStatement(current.statement, true);
                if (isMisplacedContinueLabel) {
                  return grammarErrorOnNode(node, ts2.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement);
                }
                return false;
              }
              break;
            case 248:
              if (node.kind === 245 && !node.label) {
                return false;
              }
              break;
            default:
              if (ts2.isIterationStatement(current, false) && !node.label) {
                return false;
              }
              break;
          }
          current = current.parent;
        }
        if (node.label) {
          var message = node.kind === 245 ? ts2.Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement : ts2.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement;
          return grammarErrorOnNode(node, message);
        } else {
          var message = node.kind === 245 ? ts2.Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement : ts2.Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement;
          return grammarErrorOnNode(node, message);
        }
      }
      function checkGrammarBindingElement(node) {
        if (node.dotDotDotToken) {
          var elements = node.parent.elements;
          if (node !== ts2.last(elements)) {
            return grammarErrorOnNode(node, ts2.Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern);
          }
          checkGrammarForDisallowedTrailingComma(elements, ts2.Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
          if (node.propertyName) {
            return grammarErrorOnNode(node.name, ts2.Diagnostics.A_rest_element_cannot_have_a_property_name);
          }
        }
        if (node.dotDotDotToken && node.initializer) {
          return grammarErrorAtPos(node, node.initializer.pos - 1, 1, ts2.Diagnostics.A_rest_element_cannot_have_an_initializer);
        }
      }
      function isStringOrNumberLiteralExpression(expr) {
        return ts2.isStringOrNumericLiteralLike(expr) || expr.kind === 218 && expr.operator === 40 && expr.operand.kind === 8;
      }
      function isBigIntLiteralExpression(expr) {
        return expr.kind === 9 || expr.kind === 218 && expr.operator === 40 && expr.operand.kind === 9;
      }
      function isSimpleLiteralEnumReference(expr) {
        if ((ts2.isPropertyAccessExpression(expr) || ts2.isElementAccessExpression(expr) && isStringOrNumberLiteralExpression(expr.argumentExpression)) && ts2.isEntityNameExpression(expr.expression)) {
          return !!(checkExpressionCached(expr).flags & 1024);
        }
      }
      function checkAmbientInitializer(node) {
        var initializer = node.initializer;
        if (initializer) {
          var isInvalidInitializer = !(isStringOrNumberLiteralExpression(initializer) || isSimpleLiteralEnumReference(initializer) || initializer.kind === 110 || initializer.kind === 95 || isBigIntLiteralExpression(initializer));
          var isConstOrReadonly = ts2.isDeclarationReadonly(node) || ts2.isVariableDeclaration(node) && ts2.isVarConst(node);
          if (isConstOrReadonly && !node.type) {
            if (isInvalidInitializer) {
              return grammarErrorOnNode(initializer, ts2.Diagnostics.A_const_initializer_in_an_ambient_context_must_be_a_string_or_numeric_literal_or_literal_enum_reference);
            }
          } else {
            return grammarErrorOnNode(initializer, ts2.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
          }
          if (!isConstOrReadonly || isInvalidInitializer) {
            return grammarErrorOnNode(initializer, ts2.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
          }
        }
      }
      function checkGrammarVariableDeclaration(node) {
        if (node.parent.parent.kind !== 242 && node.parent.parent.kind !== 243) {
          if (node.flags & 8388608) {
            checkAmbientInitializer(node);
          } else if (!node.initializer) {
            if (ts2.isBindingPattern(node.name) && !ts2.isBindingPattern(node.parent)) {
              return grammarErrorOnNode(node, ts2.Diagnostics.A_destructuring_declaration_must_have_an_initializer);
            }
            if (ts2.isVarConst(node)) {
              return grammarErrorOnNode(node, ts2.Diagnostics.const_declarations_must_be_initialized);
            }
          }
        }
        if (node.exclamationToken && (node.parent.parent.kind !== 236 || !node.type || node.initializer || node.flags & 8388608)) {
          var message = node.initializer ? ts2.Diagnostics.Declarations_with_initializers_cannot_also_have_definite_assignment_assertions : !node.type ? ts2.Diagnostics.Declarations_with_definite_assignment_assertions_must_also_have_type_annotations : ts2.Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context;
          return grammarErrorOnNode(node.exclamationToken, message);
        }
        if ((moduleKind < ts2.ModuleKind.ES2015 || ts2.getSourceFileOfNode(node).impliedNodeFormat === ts2.ModuleKind.CommonJS) && moduleKind !== ts2.ModuleKind.System && !(node.parent.parent.flags & 8388608) && ts2.hasSyntacticModifier(node.parent.parent, 1)) {
          checkESModuleMarker(node.name);
        }
        var checkLetConstNames = ts2.isLet(node) || ts2.isVarConst(node);
        return checkLetConstNames && checkGrammarNameInLetOrConstDeclarations(node.name);
      }
      function checkESModuleMarker(name) {
        if (name.kind === 79) {
          if (ts2.idText(name) === "__esModule") {
            return grammarErrorOnNodeSkippedOn("noEmit", name, ts2.Diagnostics.Identifier_expected_esModule_is_reserved_as_an_exported_marker_when_transforming_ECMAScript_modules);
          }
        } else {
          var elements = name.elements;
          for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {
            var element = elements_1[_i];
            if (!ts2.isOmittedExpression(element)) {
              return checkESModuleMarker(element.name);
            }
          }
        }
        return false;
      }
      function checkGrammarNameInLetOrConstDeclarations(name) {
        if (name.kind === 79) {
          if (name.originalKeywordKind === 119) {
            return grammarErrorOnNode(name, ts2.Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations);
          }
        } else {
          var elements = name.elements;
          for (var _i = 0, elements_2 = elements; _i < elements_2.length; _i++) {
            var element = elements_2[_i];
            if (!ts2.isOmittedExpression(element)) {
              checkGrammarNameInLetOrConstDeclarations(element.name);
            }
          }
        }
        return false;
      }
      function checkGrammarVariableDeclarationList(declarationList) {
        var declarations = declarationList.declarations;
        if (checkGrammarForDisallowedTrailingComma(declarationList.declarations)) {
          return true;
        }
        if (!declarationList.declarations.length) {
          return grammarErrorAtPos(declarationList, declarations.pos, declarations.end - declarations.pos, ts2.Diagnostics.Variable_declaration_list_cannot_be_empty);
        }
        return false;
      }
      function allowLetAndConstDeclarations(parent) {
        switch (parent.kind) {
          case 238:
          case 239:
          case 240:
          case 247:
          case 241:
          case 242:
          case 243:
            return false;
          case 249:
            return allowLetAndConstDeclarations(parent.parent);
        }
        return true;
      }
      function checkGrammarForDisallowedLetOrConstStatement(node) {
        if (!allowLetAndConstDeclarations(node.parent)) {
          if (ts2.isLet(node.declarationList)) {
            return grammarErrorOnNode(node, ts2.Diagnostics.let_declarations_can_only_be_declared_inside_a_block);
          } else if (ts2.isVarConst(node.declarationList)) {
            return grammarErrorOnNode(node, ts2.Diagnostics.const_declarations_can_only_be_declared_inside_a_block);
          }
        }
      }
      function checkGrammarMetaProperty(node) {
        var escapedText = node.name.escapedText;
        switch (node.keywordToken) {
          case 103:
            if (escapedText !== "target") {
              return grammarErrorOnNode(node.name, ts2.Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, node.name.escapedText, ts2.tokenToString(node.keywordToken), "target");
            }
            break;
          case 100:
            if (escapedText !== "meta") {
              return grammarErrorOnNode(node.name, ts2.Diagnostics._0_is_not_a_valid_meta_property_for_keyword_1_Did_you_mean_2, node.name.escapedText, ts2.tokenToString(node.keywordToken), "meta");
            }
            break;
        }
      }
      function hasParseDiagnostics(sourceFile) {
        return sourceFile.parseDiagnostics.length > 0;
      }
      function grammarErrorOnFirstToken(node, message, arg0, arg1, arg2) {
        var sourceFile = ts2.getSourceFileOfNode(node);
        if (!hasParseDiagnostics(sourceFile)) {
          var span = ts2.getSpanOfTokenAtPosition(sourceFile, node.pos);
          diagnostics.add(ts2.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2));
          return true;
        }
        return false;
      }
      function grammarErrorAtPos(nodeForSourceFile, start, length, message, arg0, arg1, arg2) {
        var sourceFile = ts2.getSourceFileOfNode(nodeForSourceFile);
        if (!hasParseDiagnostics(sourceFile)) {
          diagnostics.add(ts2.createFileDiagnostic(sourceFile, start, length, message, arg0, arg1, arg2));
          return true;
        }
        return false;
      }
      function grammarErrorOnNodeSkippedOn(key, node, message, arg0, arg1, arg2) {
        var sourceFile = ts2.getSourceFileOfNode(node);
        if (!hasParseDiagnostics(sourceFile)) {
          errorSkippedOn(key, node, message, arg0, arg1, arg2);
          return true;
        }
        return false;
      }
      function grammarErrorOnNode(node, message, arg0, arg1, arg2) {
        var sourceFile = ts2.getSourceFileOfNode(node);
        if (!hasParseDiagnostics(sourceFile)) {
          diagnostics.add(ts2.createDiagnosticForNode(node, message, arg0, arg1, arg2));
          return true;
        }
        return false;
      }
      function checkGrammarConstructorTypeParameters(node) {
        var jsdocTypeParameters = ts2.isInJSFile(node) ? ts2.getJSDocTypeParameterDeclarations(node) : void 0;
        var range = node.typeParameters || jsdocTypeParameters && ts2.firstOrUndefined(jsdocTypeParameters);
        if (range) {
          var pos = range.pos === range.end ? range.pos : ts2.skipTrivia(ts2.getSourceFileOfNode(node).text, range.pos);
          return grammarErrorAtPos(node, pos, range.end - pos, ts2.Diagnostics.Type_parameters_cannot_appear_on_a_constructor_declaration);
        }
      }
      function checkGrammarConstructorTypeAnnotation(node) {
        var type = ts2.getEffectiveReturnTypeNode(node);
        if (type) {
          return grammarErrorOnNode(type, ts2.Diagnostics.Type_annotation_cannot_appear_on_a_constructor_declaration);
        }
      }
      function checkGrammarProperty(node) {
        if (ts2.isComputedPropertyName(node.name) && ts2.isBinaryExpression(node.name.expression) && node.name.expression.operatorToken.kind === 101) {
          return grammarErrorOnNode(node.parent.members[0], ts2.Diagnostics.A_mapped_type_may_not_declare_properties_or_methods);
        }
        if (ts2.isClassLike(node.parent)) {
          if (ts2.isStringLiteral(node.name) && node.name.text === "constructor") {
            return grammarErrorOnNode(node.name, ts2.Diagnostics.Classes_may_not_have_a_field_named_constructor);
          }
          if (checkGrammarForInvalidDynamicName(node.name, ts2.Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_have_a_simple_literal_type_or_a_unique_symbol_type)) {
            return true;
          }
          if (languageVersion < 2 && ts2.isPrivateIdentifier(node.name)) {
            return grammarErrorOnNode(node.name, ts2.Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher);
          }
        } else if (node.parent.kind === 257) {
          if (checkGrammarForInvalidDynamicName(node.name, ts2.Diagnostics.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) {
            return true;
          }
          if (node.initializer) {
            return grammarErrorOnNode(node.initializer, ts2.Diagnostics.An_interface_property_cannot_have_an_initializer);
          }
        } else if (ts2.isTypeLiteralNode(node.parent)) {
          if (checkGrammarForInvalidDynamicName(node.name, ts2.Diagnostics.A_computed_property_name_in_a_type_literal_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) {
            return true;
          }
          if (node.initializer) {
            return grammarErrorOnNode(node.initializer, ts2.Diagnostics.A_type_literal_property_cannot_have_an_initializer);
          }
        }
        if (node.flags & 8388608) {
          checkAmbientInitializer(node);
        }
        if (ts2.isPropertyDeclaration(node) && node.exclamationToken && (!ts2.isClassLike(node.parent) || !node.type || node.initializer || node.flags & 8388608 || ts2.isStatic(node) || ts2.hasAbstractModifier(node))) {
          var message = node.initializer ? ts2.Diagnostics.Declarations_with_initializers_cannot_also_have_definite_assignment_assertions : !node.type ? ts2.Diagnostics.Declarations_with_definite_assignment_assertions_must_also_have_type_annotations : ts2.Diagnostics.A_definite_assignment_assertion_is_not_permitted_in_this_context;
          return grammarErrorOnNode(node.exclamationToken, message);
        }
      }
      function checkGrammarTopLevelElementForRequiredDeclareModifier(node) {
        if (node.kind === 257 || node.kind === 258 || node.kind === 265 || node.kind === 264 || node.kind === 271 || node.kind === 270 || node.kind === 263 || ts2.hasSyntacticModifier(node, 2 | 1 | 512)) {
          return false;
        }
        return grammarErrorOnFirstToken(node, ts2.Diagnostics.Top_level_declarations_in_d_ts_files_must_start_with_either_a_declare_or_export_modifier);
      }
      function checkGrammarTopLevelElementsForRequiredDeclareModifier(file) {
        for (var _i = 0, _a = file.statements; _i < _a.length; _i++) {
          var decl = _a[_i];
          if (ts2.isDeclaration(decl) || decl.kind === 236) {
            if (checkGrammarTopLevelElementForRequiredDeclareModifier(decl)) {
              return true;
            }
          }
        }
        return false;
      }
      function checkGrammarSourceFile(node) {
        return !!(node.flags & 8388608) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node);
      }
      function checkGrammarStatementInAmbientContext(node) {
        if (node.flags & 8388608) {
          var links = getNodeLinks(node);
          if (!links.hasReportedStatementInAmbientContext && (ts2.isFunctionLike(node.parent) || ts2.isAccessor(node.parent))) {
            return getNodeLinks(node).hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts2.Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts);
          }
          if (node.parent.kind === 234 || node.parent.kind === 261 || node.parent.kind === 303) {
            var links_2 = getNodeLinks(node.parent);
            if (!links_2.hasReportedStatementInAmbientContext) {
              return links_2.hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts2.Diagnostics.Statements_are_not_allowed_in_ambient_contexts);
            }
          } else {
          }
        }
        return false;
      }
      function checkGrammarNumericLiteral(node) {
        if (node.numericLiteralFlags & 32) {
          var diagnosticMessage = void 0;
          if (languageVersion >= 1) {
            diagnosticMessage = ts2.Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher_Use_the_syntax_0;
          } else if (ts2.isChildOfNodeWithKind(node, 195)) {
            diagnosticMessage = ts2.Diagnostics.Octal_literal_types_must_use_ES2015_syntax_Use_the_syntax_0;
          } else if (ts2.isChildOfNodeWithKind(node, 297)) {
            diagnosticMessage = ts2.Diagnostics.Octal_literals_are_not_allowed_in_enums_members_initializer_Use_the_syntax_0;
          }
          if (diagnosticMessage) {
            var withMinus = ts2.isPrefixUnaryExpression(node.parent) && node.parent.operator === 40;
            var literal = (withMinus ? "-" : "") + "0o" + node.text;
            return grammarErrorOnNode(withMinus ? node.parent : node, diagnosticMessage, literal);
          }
        }
        checkNumericLiteralValueSize(node);
        return false;
      }
      function checkNumericLiteralValueSize(node) {
        if (node.numericLiteralFlags & 16 || node.text.length <= 15 || node.text.indexOf(".") !== -1) {
          return;
        }
        var apparentValue = +ts2.getTextOfNode(node);
        if (apparentValue <= Math.pow(2, 53) - 1 && apparentValue + 1 > apparentValue) {
          return;
        }
        addErrorOrSuggestion(false, ts2.createDiagnosticForNode(node, ts2.Diagnostics.Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers));
      }
      function checkGrammarBigIntLiteral(node) {
        var literalType = ts2.isLiteralTypeNode(node.parent) || ts2.isPrefixUnaryExpression(node.parent) && ts2.isLiteralTypeNode(node.parent.parent);
        if (!literalType) {
          if (languageVersion < 7) {
            if (grammarErrorOnNode(node, ts2.Diagnostics.BigInt_literals_are_not_available_when_targeting_lower_than_ES2020)) {
              return true;
            }
          }
        }
        return false;
      }
      function grammarErrorAfterFirstToken(node, message, arg0, arg1, arg2) {
        var sourceFile = ts2.getSourceFileOfNode(node);
        if (!hasParseDiagnostics(sourceFile)) {
          var span = ts2.getSpanOfTokenAtPosition(sourceFile, node.pos);
          diagnostics.add(ts2.createFileDiagnostic(sourceFile, ts2.textSpanEnd(span), 0, message, arg0, arg1, arg2));
          return true;
        }
        return false;
      }
      function getAmbientModules() {
        if (!ambientModulesCache) {
          ambientModulesCache = [];
          globals.forEach(function(global, sym) {
            if (ambientModuleSymbolRegex.test(sym)) {
              ambientModulesCache.push(global);
            }
          });
        }
        return ambientModulesCache;
      }
      function checkGrammarImportClause(node) {
        var _a;
        if (node.isTypeOnly && node.name && node.namedBindings) {
          return grammarErrorOnNode(node, ts2.Diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both);
        }
        if (node.isTypeOnly && ((_a = node.namedBindings) === null || _a === void 0 ? void 0 : _a.kind) === 268) {
          return checkGrammarNamedImportsOrExports(node.namedBindings);
        }
        return false;
      }
      function checkGrammarNamedImportsOrExports(namedBindings) {
        return !!ts2.forEach(namedBindings.elements, function(specifier) {
          if (specifier.isTypeOnly) {
            return grammarErrorOnFirstToken(specifier, specifier.kind === 269 ? ts2.Diagnostics.The_type_modifier_cannot_be_used_on_a_named_import_when_import_type_is_used_on_its_import_statement : ts2.Diagnostics.The_type_modifier_cannot_be_used_on_a_named_export_when_export_type_is_used_on_its_export_statement);
          }
        });
      }
      function checkGrammarImportCallExpression(node) {
        if (moduleKind === ts2.ModuleKind.ES2015) {
          return grammarErrorOnNode(node, ts2.Diagnostics.Dynamic_imports_are_only_supported_when_the_module_flag_is_set_to_es2020_es2022_esnext_commonjs_amd_system_umd_node12_or_nodenext);
        }
        if (node.typeArguments) {
          return grammarErrorOnNode(node, ts2.Diagnostics.Dynamic_import_cannot_have_type_arguments);
        }
        var nodeArguments = node.arguments;
        if (moduleKind !== ts2.ModuleKind.ESNext) {
          checkGrammarForDisallowedTrailingComma(nodeArguments);
          if (nodeArguments.length > 1) {
            var assertionArgument = nodeArguments[1];
            return grammarErrorOnNode(assertionArgument, ts2.Diagnostics.Dynamic_imports_only_support_a_second_argument_when_the_module_option_is_set_to_esnext);
          }
        }
        if (nodeArguments.length === 0 || nodeArguments.length > 2) {
          return grammarErrorOnNode(node, ts2.Diagnostics.Dynamic_imports_can_only_accept_a_module_specifier_and_an_optional_assertion_as_arguments);
        }
        var spreadElement = ts2.find(nodeArguments, ts2.isSpreadElement);
        if (spreadElement) {
          return grammarErrorOnNode(spreadElement, ts2.Diagnostics.Argument_of_dynamic_import_cannot_be_spread_element);
        }
        return false;
      }
      function findMatchingTypeReferenceOrTypeAliasReference(source, unionTarget) {
        var sourceObjectFlags = ts2.getObjectFlags(source);
        if (sourceObjectFlags & (4 | 16) && unionTarget.flags & 1048576) {
          return ts2.find(unionTarget.types, function(target) {
            if (target.flags & 524288) {
              var overlapObjFlags = sourceObjectFlags & ts2.getObjectFlags(target);
              if (overlapObjFlags & 4) {
                return source.target === target.target;
              }
              if (overlapObjFlags & 16) {
                return !!source.aliasSymbol && source.aliasSymbol === target.aliasSymbol;
              }
            }
            return false;
          });
        }
      }
      function findBestTypeForObjectLiteral(source, unionTarget) {
        if (ts2.getObjectFlags(source) & 128 && someType(unionTarget, isArrayLikeType)) {
          return ts2.find(unionTarget.types, function(t) {
            return !isArrayLikeType(t);
          });
        }
      }
      function findBestTypeForInvokable(source, unionTarget) {
        var signatureKind = 0;
        var hasSignatures = getSignaturesOfType(source, signatureKind).length > 0 || (signatureKind = 1, getSignaturesOfType(source, signatureKind).length > 0);
        if (hasSignatures) {
          return ts2.find(unionTarget.types, function(t) {
            return getSignaturesOfType(t, signatureKind).length > 0;
          });
        }
      }
      function findMostOverlappyType(source, unionTarget) {
        var bestMatch;
        var matchingCount = 0;
        for (var _i = 0, _a = unionTarget.types; _i < _a.length; _i++) {
          var target = _a[_i];
          var overlap = getIntersectionType([getIndexType(source), getIndexType(target)]);
          if (overlap.flags & 4194304) {
            bestMatch = target;
            matchingCount = Infinity;
          } else if (overlap.flags & 1048576) {
            var len = ts2.length(ts2.filter(overlap.types, isUnitType));
            if (len >= matchingCount) {
              bestMatch = target;
              matchingCount = len;
            }
          } else if (isUnitType(overlap) && 1 >= matchingCount) {
            bestMatch = target;
            matchingCount = 1;
          }
        }
        return bestMatch;
      }
      function filterPrimitivesIfContainsNonPrimitive(type) {
        if (maybeTypeOfKind(type, 67108864)) {
          var result = filterType(type, function(t) {
            return !(t.flags & 131068);
          });
          if (!(result.flags & 131072)) {
            return result;
          }
        }
        return type;
      }
      function findMatchingDiscriminantType(source, target, isRelatedTo, skipPartial) {
        if (target.flags & 1048576 && source.flags & (2097152 | 524288)) {
          var match = getMatchingUnionConstituentForType(target, source);
          if (match) {
            return match;
          }
          var sourceProperties = getPropertiesOfType(source);
          if (sourceProperties) {
            var sourcePropertiesFiltered = findDiscriminantProperties(sourceProperties, target);
            if (sourcePropertiesFiltered) {
              return discriminateTypeByDiscriminableItems(target, ts2.map(sourcePropertiesFiltered, function(p) {
                return [function() {
                  return getTypeOfSymbol(p);
                }, p.escapedName];
              }), isRelatedTo, void 0, skipPartial);
            }
          }
        }
        return void 0;
      }
    }
    ts2.createTypeChecker = createTypeChecker;
    function isNotAccessor(declaration) {
      return !ts2.isAccessor(declaration);
    }
    function isNotOverload(declaration) {
      return declaration.kind !== 255 && declaration.kind !== 168 || !!declaration.body;
    }
    function isDeclarationNameOrImportPropertyName(name) {
      switch (name.parent.kind) {
        case 269:
        case 274:
          return ts2.isIdentifier(name);
        default:
          return ts2.isDeclarationName(name);
      }
    }
    var JsxNames;
    (function(JsxNames2) {
      JsxNames2.JSX = "JSX";
      JsxNames2.IntrinsicElements = "IntrinsicElements";
      JsxNames2.ElementClass = "ElementClass";
      JsxNames2.ElementAttributesPropertyNameContainer = "ElementAttributesProperty";
      JsxNames2.ElementChildrenAttributeNameContainer = "ElementChildrenAttribute";
      JsxNames2.Element = "Element";
      JsxNames2.IntrinsicAttributes = "IntrinsicAttributes";
      JsxNames2.IntrinsicClassAttributes = "IntrinsicClassAttributes";
      JsxNames2.LibraryManagedAttributes = "LibraryManagedAttributes";
    })(JsxNames || (JsxNames = {}));
    function getIterationTypesKeyFromIterationTypeKind(typeKind) {
      switch (typeKind) {
        case 0:
          return "yieldType";
        case 1:
          return "returnType";
        case 2:
          return "nextType";
      }
    }
    function signatureHasRestParameter(s) {
      return !!(s.flags & 1);
    }
    ts2.signatureHasRestParameter = signatureHasRestParameter;
    function signatureHasLiteralTypes(s) {
      return !!(s.flags & 2);
    }
    ts2.signatureHasLiteralTypes = signatureHasLiteralTypes;
  })(ts || (ts = {}));
  (function(ts2) {
    function visitNode(node, visitor, test, lift) {
      if (node === void 0 || visitor === void 0) {
        return node;
      }
      var visited = visitor(node);
      if (visited === node) {
        return node;
      }
      var visitedNode;
      if (visited === void 0) {
        return void 0;
      } else if (ts2.isArray(visited)) {
        visitedNode = (lift || extractSingleNode)(visited);
      } else {
        visitedNode = visited;
      }
      ts2.Debug.assertNode(visitedNode, test);
      return visitedNode;
    }
    ts2.visitNode = visitNode;
    function visitNodes(nodes, visitor, test, start, count) {
      if (nodes === void 0 || visitor === void 0) {
        return nodes;
      }
      var updated;
      var length = nodes.length;
      if (start === void 0 || start < 0) {
        start = 0;
      }
      if (count === void 0 || count > length - start) {
        count = length - start;
      }
      var hasTrailingComma;
      var pos = -1;
      var end = -1;
      if (start > 0 || count < length) {
        updated = [];
        hasTrailingComma = nodes.hasTrailingComma && start + count === length;
      }
      for (var i = 0; i < count; i++) {
        var node = nodes[i + start];
        var visited = node !== void 0 ? visitor(node) : void 0;
        if (updated !== void 0 || visited === void 0 || visited !== node) {
          if (updated === void 0) {
            updated = nodes.slice(0, i);
            hasTrailingComma = nodes.hasTrailingComma;
            pos = nodes.pos;
            end = nodes.end;
          }
          if (visited) {
            if (ts2.isArray(visited)) {
              for (var _i = 0, visited_1 = visited; _i < visited_1.length; _i++) {
                var visitedNode = visited_1[_i];
                void ts2.Debug.assertNode(visitedNode, test);
                updated.push(visitedNode);
              }
            } else {
              void ts2.Debug.assertNode(visited, test);
              updated.push(visited);
            }
          }
        }
      }
      if (updated) {
        var updatedArray = ts2.factory.createNodeArray(updated, hasTrailingComma);
        ts2.setTextRangePosEnd(updatedArray, pos, end);
        return updatedArray;
      }
      return nodes;
    }
    ts2.visitNodes = visitNodes;
    function visitLexicalEnvironment(statements, visitor, context, start, ensureUseStrict, nodesVisitor) {
      if (nodesVisitor === void 0) {
        nodesVisitor = visitNodes;
      }
      context.startLexicalEnvironment();
      statements = nodesVisitor(statements, visitor, ts2.isStatement, start);
      if (ensureUseStrict)
        statements = context.factory.ensureUseStrict(statements);
      return ts2.factory.mergeLexicalEnvironment(statements, context.endLexicalEnvironment());
    }
    ts2.visitLexicalEnvironment = visitLexicalEnvironment;
    function visitParameterList(nodes, visitor, context, nodesVisitor) {
      if (nodesVisitor === void 0) {
        nodesVisitor = visitNodes;
      }
      var updated;
      context.startLexicalEnvironment();
      if (nodes) {
        context.setLexicalEnvironmentFlags(1, true);
        updated = nodesVisitor(nodes, visitor, ts2.isParameterDeclaration);
        if (context.getLexicalEnvironmentFlags() & 2 && ts2.getEmitScriptTarget(context.getCompilerOptions()) >= 2) {
          updated = addDefaultValueAssignmentsIfNeeded(updated, context);
        }
        context.setLexicalEnvironmentFlags(1, false);
      }
      context.suspendLexicalEnvironment();
      return updated;
    }
    ts2.visitParameterList = visitParameterList;
    function addDefaultValueAssignmentsIfNeeded(parameters, context) {
      var result;
      for (var i = 0; i < parameters.length; i++) {
        var parameter = parameters[i];
        var updated = addDefaultValueAssignmentIfNeeded(parameter, context);
        if (result || updated !== parameter) {
          if (!result)
            result = parameters.slice(0, i);
          result[i] = updated;
        }
      }
      if (result) {
        return ts2.setTextRange(context.factory.createNodeArray(result, parameters.hasTrailingComma), parameters);
      }
      return parameters;
    }
    function addDefaultValueAssignmentIfNeeded(parameter, context) {
      return parameter.dotDotDotToken ? parameter : ts2.isBindingPattern(parameter.name) ? addDefaultValueAssignmentForBindingPattern(parameter, context) : parameter.initializer ? addDefaultValueAssignmentForInitializer(parameter, parameter.name, parameter.initializer, context) : parameter;
    }
    function addDefaultValueAssignmentForBindingPattern(parameter, context) {
      var factory = context.factory;
      context.addInitializationStatement(factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
        factory.createVariableDeclaration(parameter.name, void 0, parameter.type, parameter.initializer ? factory.createConditionalExpression(factory.createStrictEquality(factory.getGeneratedNameForNode(parameter), factory.createVoidZero()), void 0, parameter.initializer, void 0, factory.getGeneratedNameForNode(parameter)) : factory.getGeneratedNameForNode(parameter))
      ])));
      return factory.updateParameterDeclaration(parameter, parameter.decorators, parameter.modifiers, parameter.dotDotDotToken, factory.getGeneratedNameForNode(parameter), parameter.questionToken, parameter.type, void 0);
    }
    function addDefaultValueAssignmentForInitializer(parameter, name, initializer, context) {
      var factory = context.factory;
      context.addInitializationStatement(factory.createIfStatement(factory.createTypeCheck(factory.cloneNode(name), "undefined"), ts2.setEmitFlags(ts2.setTextRange(factory.createBlock([
        factory.createExpressionStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createAssignment(ts2.setEmitFlags(factory.cloneNode(name), 48), ts2.setEmitFlags(initializer, 48 | ts2.getEmitFlags(initializer) | 1536)), parameter), 1536))
      ]), parameter), 1 | 32 | 384 | 1536)));
      return factory.updateParameterDeclaration(parameter, parameter.decorators, parameter.modifiers, parameter.dotDotDotToken, parameter.name, parameter.questionToken, parameter.type, void 0);
    }
    function visitFunctionBody(node, visitor, context, nodeVisitor) {
      if (nodeVisitor === void 0) {
        nodeVisitor = visitNode;
      }
      context.resumeLexicalEnvironment();
      var updated = nodeVisitor(node, visitor, ts2.isConciseBody);
      var declarations = context.endLexicalEnvironment();
      if (ts2.some(declarations)) {
        if (!updated) {
          return context.factory.createBlock(declarations);
        }
        var block = context.factory.converters.convertToFunctionBlock(updated);
        var statements = ts2.factory.mergeLexicalEnvironment(block.statements, declarations);
        return context.factory.updateBlock(block, statements);
      }
      return updated;
    }
    ts2.visitFunctionBody = visitFunctionBody;
    function visitIterationBody(body, visitor, context) {
      context.startBlockScope();
      var updated = visitNode(body, visitor, ts2.isStatement, context.factory.liftToBlock);
      var declarations = context.endBlockScope();
      if (ts2.some(declarations)) {
        if (ts2.isBlock(updated)) {
          declarations.push.apply(declarations, updated.statements);
          return context.factory.updateBlock(updated, declarations);
        }
        declarations.push(updated);
        return context.factory.createBlock(declarations);
      }
      return updated;
    }
    ts2.visitIterationBody = visitIterationBody;
    function visitEachChild(node, visitor, context, nodesVisitor, tokenVisitor, nodeVisitor) {
      if (nodesVisitor === void 0) {
        nodesVisitor = visitNodes;
      }
      if (nodeVisitor === void 0) {
        nodeVisitor = visitNode;
      }
      if (node === void 0) {
        return void 0;
      }
      var kind = node.kind;
      if (kind > 0 && kind <= 159 || kind === 191) {
        return node;
      }
      var factory = context.factory;
      switch (kind) {
        case 79:
          ts2.Debug.type(node);
          return factory.updateIdentifier(node, nodesVisitor(node.typeArguments, visitor, ts2.isTypeNodeOrTypeParameterDeclaration));
        case 160:
          ts2.Debug.type(node);
          return factory.updateQualifiedName(node, nodeVisitor(node.left, visitor, ts2.isEntityName), nodeVisitor(node.right, visitor, ts2.isIdentifier));
        case 161:
          ts2.Debug.type(node);
          return factory.updateComputedPropertyName(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 162:
          ts2.Debug.type(node);
          return factory.updateTypeParameterDeclaration(node, nodeVisitor(node.name, visitor, ts2.isIdentifier), nodeVisitor(node.constraint, visitor, ts2.isTypeNode), nodeVisitor(node.default, visitor, ts2.isTypeNode));
        case 163:
          ts2.Debug.type(node);
          return factory.updateParameterDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.dotDotDotToken, tokenVisitor, ts2.isDotDotDotToken), nodeVisitor(node.name, visitor, ts2.isBindingName), nodeVisitor(node.questionToken, tokenVisitor, ts2.isQuestionToken), nodeVisitor(node.type, visitor, ts2.isTypeNode), nodeVisitor(node.initializer, visitor, ts2.isExpression));
        case 164:
          ts2.Debug.type(node);
          return factory.updateDecorator(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 165:
          ts2.Debug.type(node);
          return factory.updatePropertySignature(node, nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isPropertyName), nodeVisitor(node.questionToken, tokenVisitor, ts2.isToken), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 166:
          ts2.Debug.type(node);
          return factory.updatePropertyDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isPropertyName), nodeVisitor(node.questionToken || node.exclamationToken, tokenVisitor, ts2.isQuestionOrExclamationToken), nodeVisitor(node.type, visitor, ts2.isTypeNode), nodeVisitor(node.initializer, visitor, ts2.isExpression));
        case 167:
          ts2.Debug.type(node);
          return factory.updateMethodSignature(node, nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isPropertyName), nodeVisitor(node.questionToken, tokenVisitor, ts2.isQuestionToken), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts2.isParameterDeclaration), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 168:
          ts2.Debug.type(node);
          return factory.updateMethodDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.asteriskToken, tokenVisitor, ts2.isAsteriskToken), nodeVisitor(node.name, visitor, ts2.isPropertyName), nodeVisitor(node.questionToken, tokenVisitor, ts2.isQuestionToken), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, ts2.isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 170:
          ts2.Debug.type(node);
          return factory.updateConstructorDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 171:
          ts2.Debug.type(node);
          return factory.updateGetAccessorDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isPropertyName), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, ts2.isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 172:
          ts2.Debug.type(node);
          return factory.updateSetAccessorDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isPropertyName), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 169:
          ts2.Debug.type(node);
          context.startLexicalEnvironment();
          context.suspendLexicalEnvironment();
          return factory.updateClassStaticBlockDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 173:
          ts2.Debug.type(node);
          return factory.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts2.isParameterDeclaration), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 174:
          ts2.Debug.type(node);
          return factory.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts2.isParameterDeclaration), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 175:
          ts2.Debug.type(node);
          return factory.updateIndexSignature(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodesVisitor(node.parameters, visitor, ts2.isParameterDeclaration), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 176:
          ts2.Debug.type(node);
          return factory.updateTypePredicateNode(node, nodeVisitor(node.assertsModifier, visitor, ts2.isAssertsKeyword), nodeVisitor(node.parameterName, visitor, ts2.isIdentifierOrThisTypeNode), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 177:
          ts2.Debug.type(node);
          return factory.updateTypeReferenceNode(node, nodeVisitor(node.typeName, visitor, ts2.isEntityName), nodesVisitor(node.typeArguments, visitor, ts2.isTypeNode));
        case 178:
          ts2.Debug.type(node);
          return factory.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts2.isParameterDeclaration), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 179:
          ts2.Debug.type(node);
          return factory.updateConstructorTypeNode(node, nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts2.isParameterDeclaration), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 180:
          ts2.Debug.type(node);
          return factory.updateTypeQueryNode(node, nodeVisitor(node.exprName, visitor, ts2.isEntityName));
        case 181:
          ts2.Debug.type(node);
          return factory.updateTypeLiteralNode(node, nodesVisitor(node.members, visitor, ts2.isTypeElement));
        case 182:
          ts2.Debug.type(node);
          return factory.updateArrayTypeNode(node, nodeVisitor(node.elementType, visitor, ts2.isTypeNode));
        case 183:
          ts2.Debug.type(node);
          return factory.updateTupleTypeNode(node, nodesVisitor(node.elements, visitor, ts2.isTypeNode));
        case 184:
          ts2.Debug.type(node);
          return factory.updateOptionalTypeNode(node, nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 185:
          ts2.Debug.type(node);
          return factory.updateRestTypeNode(node, nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 186:
          ts2.Debug.type(node);
          return factory.updateUnionTypeNode(node, nodesVisitor(node.types, visitor, ts2.isTypeNode));
        case 187:
          ts2.Debug.type(node);
          return factory.updateIntersectionTypeNode(node, nodesVisitor(node.types, visitor, ts2.isTypeNode));
        case 188:
          ts2.Debug.type(node);
          return factory.updateConditionalTypeNode(node, nodeVisitor(node.checkType, visitor, ts2.isTypeNode), nodeVisitor(node.extendsType, visitor, ts2.isTypeNode), nodeVisitor(node.trueType, visitor, ts2.isTypeNode), nodeVisitor(node.falseType, visitor, ts2.isTypeNode));
        case 189:
          ts2.Debug.type(node);
          return factory.updateInferTypeNode(node, nodeVisitor(node.typeParameter, visitor, ts2.isTypeParameterDeclaration));
        case 199:
          ts2.Debug.type(node);
          return factory.updateImportTypeNode(node, nodeVisitor(node.argument, visitor, ts2.isTypeNode), nodeVisitor(node.qualifier, visitor, ts2.isEntityName), visitNodes(node.typeArguments, visitor, ts2.isTypeNode), node.isTypeOf);
        case 196:
          ts2.Debug.type(node);
          return factory.updateNamedTupleMember(node, visitNode(node.dotDotDotToken, visitor, ts2.isDotDotDotToken), visitNode(node.name, visitor, ts2.isIdentifier), visitNode(node.questionToken, visitor, ts2.isQuestionToken), visitNode(node.type, visitor, ts2.isTypeNode));
        case 190:
          ts2.Debug.type(node);
          return factory.updateParenthesizedType(node, nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 192:
          ts2.Debug.type(node);
          return factory.updateTypeOperatorNode(node, nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 193:
          ts2.Debug.type(node);
          return factory.updateIndexedAccessTypeNode(node, nodeVisitor(node.objectType, visitor, ts2.isTypeNode), nodeVisitor(node.indexType, visitor, ts2.isTypeNode));
        case 194:
          ts2.Debug.type(node);
          return factory.updateMappedTypeNode(node, nodeVisitor(node.readonlyToken, tokenVisitor, ts2.isReadonlyKeywordOrPlusOrMinusToken), nodeVisitor(node.typeParameter, visitor, ts2.isTypeParameterDeclaration), nodeVisitor(node.nameType, visitor, ts2.isTypeNode), nodeVisitor(node.questionToken, tokenVisitor, ts2.isQuestionOrPlusOrMinusToken), nodeVisitor(node.type, visitor, ts2.isTypeNode), nodesVisitor(node.members, visitor, ts2.isTypeElement));
        case 195:
          ts2.Debug.type(node);
          return factory.updateLiteralTypeNode(node, nodeVisitor(node.literal, visitor, ts2.isExpression));
        case 197:
          ts2.Debug.type(node);
          return factory.updateTemplateLiteralType(node, nodeVisitor(node.head, visitor, ts2.isTemplateHead), nodesVisitor(node.templateSpans, visitor, ts2.isTemplateLiteralTypeSpan));
        case 198:
          ts2.Debug.type(node);
          return factory.updateTemplateLiteralTypeSpan(node, nodeVisitor(node.type, visitor, ts2.isTypeNode), nodeVisitor(node.literal, visitor, ts2.isTemplateMiddleOrTemplateTail));
        case 200:
          ts2.Debug.type(node);
          return factory.updateObjectBindingPattern(node, nodesVisitor(node.elements, visitor, ts2.isBindingElement));
        case 201:
          ts2.Debug.type(node);
          return factory.updateArrayBindingPattern(node, nodesVisitor(node.elements, visitor, ts2.isArrayBindingElement));
        case 202:
          ts2.Debug.type(node);
          return factory.updateBindingElement(node, nodeVisitor(node.dotDotDotToken, tokenVisitor, ts2.isDotDotDotToken), nodeVisitor(node.propertyName, visitor, ts2.isPropertyName), nodeVisitor(node.name, visitor, ts2.isBindingName), nodeVisitor(node.initializer, visitor, ts2.isExpression));
        case 203:
          ts2.Debug.type(node);
          return factory.updateArrayLiteralExpression(node, nodesVisitor(node.elements, visitor, ts2.isExpression));
        case 204:
          ts2.Debug.type(node);
          return factory.updateObjectLiteralExpression(node, nodesVisitor(node.properties, visitor, ts2.isObjectLiteralElementLike));
        case 205:
          if (node.flags & 32) {
            ts2.Debug.type(node);
            return factory.updatePropertyAccessChain(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.questionDotToken, tokenVisitor, ts2.isQuestionDotToken), nodeVisitor(node.name, visitor, ts2.isMemberName));
          }
          ts2.Debug.type(node);
          return factory.updatePropertyAccessExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.name, visitor, ts2.isMemberName));
        case 206:
          if (node.flags & 32) {
            ts2.Debug.type(node);
            return factory.updateElementAccessChain(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.questionDotToken, tokenVisitor, ts2.isQuestionDotToken), nodeVisitor(node.argumentExpression, visitor, ts2.isExpression));
          }
          ts2.Debug.type(node);
          return factory.updateElementAccessExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.argumentExpression, visitor, ts2.isExpression));
        case 207:
          if (node.flags & 32) {
            ts2.Debug.type(node);
            return factory.updateCallChain(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.questionDotToken, tokenVisitor, ts2.isQuestionDotToken), nodesVisitor(node.typeArguments, visitor, ts2.isTypeNode), nodesVisitor(node.arguments, visitor, ts2.isExpression));
          }
          ts2.Debug.type(node);
          return factory.updateCallExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodesVisitor(node.typeArguments, visitor, ts2.isTypeNode), nodesVisitor(node.arguments, visitor, ts2.isExpression));
        case 208:
          ts2.Debug.type(node);
          return factory.updateNewExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodesVisitor(node.typeArguments, visitor, ts2.isTypeNode), nodesVisitor(node.arguments, visitor, ts2.isExpression));
        case 209:
          ts2.Debug.type(node);
          return factory.updateTaggedTemplateExpression(node, nodeVisitor(node.tag, visitor, ts2.isExpression), visitNodes(node.typeArguments, visitor, ts2.isTypeNode), nodeVisitor(node.template, visitor, ts2.isTemplateLiteral));
        case 210:
          ts2.Debug.type(node);
          return factory.updateTypeAssertion(node, nodeVisitor(node.type, visitor, ts2.isTypeNode), nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 211:
          ts2.Debug.type(node);
          return factory.updateParenthesizedExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 212:
          ts2.Debug.type(node);
          return factory.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.asteriskToken, tokenVisitor, ts2.isAsteriskToken), nodeVisitor(node.name, visitor, ts2.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, ts2.isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 213:
          ts2.Debug.type(node);
          return factory.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, ts2.isTypeNode), nodeVisitor(node.equalsGreaterThanToken, tokenVisitor, ts2.isEqualsGreaterThanToken), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 214:
          ts2.Debug.type(node);
          return factory.updateDeleteExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 215:
          ts2.Debug.type(node);
          return factory.updateTypeOfExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 216:
          ts2.Debug.type(node);
          return factory.updateVoidExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 217:
          ts2.Debug.type(node);
          return factory.updateAwaitExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 218:
          ts2.Debug.type(node);
          return factory.updatePrefixUnaryExpression(node, nodeVisitor(node.operand, visitor, ts2.isExpression));
        case 219:
          ts2.Debug.type(node);
          return factory.updatePostfixUnaryExpression(node, nodeVisitor(node.operand, visitor, ts2.isExpression));
        case 220:
          ts2.Debug.type(node);
          return factory.updateBinaryExpression(node, nodeVisitor(node.left, visitor, ts2.isExpression), nodeVisitor(node.operatorToken, tokenVisitor, ts2.isBinaryOperatorToken), nodeVisitor(node.right, visitor, ts2.isExpression));
        case 221:
          ts2.Debug.type(node);
          return factory.updateConditionalExpression(node, nodeVisitor(node.condition, visitor, ts2.isExpression), nodeVisitor(node.questionToken, tokenVisitor, ts2.isQuestionToken), nodeVisitor(node.whenTrue, visitor, ts2.isExpression), nodeVisitor(node.colonToken, tokenVisitor, ts2.isColonToken), nodeVisitor(node.whenFalse, visitor, ts2.isExpression));
        case 222:
          ts2.Debug.type(node);
          return factory.updateTemplateExpression(node, nodeVisitor(node.head, visitor, ts2.isTemplateHead), nodesVisitor(node.templateSpans, visitor, ts2.isTemplateSpan));
        case 223:
          ts2.Debug.type(node);
          return factory.updateYieldExpression(node, nodeVisitor(node.asteriskToken, tokenVisitor, ts2.isAsteriskToken), nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 224:
          ts2.Debug.type(node);
          return factory.updateSpreadElement(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 225:
          ts2.Debug.type(node);
          return factory.updateClassExpression(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts2.isHeritageClause), nodesVisitor(node.members, visitor, ts2.isClassElement));
        case 227:
          ts2.Debug.type(node);
          return factory.updateExpressionWithTypeArguments(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodesVisitor(node.typeArguments, visitor, ts2.isTypeNode));
        case 228:
          ts2.Debug.type(node);
          return factory.updateAsExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 229:
          if (node.flags & 32) {
            ts2.Debug.type(node);
            return factory.updateNonNullChain(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
          }
          ts2.Debug.type(node);
          return factory.updateNonNullExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 230:
          ts2.Debug.type(node);
          return factory.updateMetaProperty(node, nodeVisitor(node.name, visitor, ts2.isIdentifier));
        case 232:
          ts2.Debug.type(node);
          return factory.updateTemplateSpan(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.literal, visitor, ts2.isTemplateMiddleOrTemplateTail));
        case 234:
          ts2.Debug.type(node);
          return factory.updateBlock(node, nodesVisitor(node.statements, visitor, ts2.isStatement));
        case 236:
          ts2.Debug.type(node);
          return factory.updateVariableStatement(node, nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.declarationList, visitor, ts2.isVariableDeclarationList));
        case 237:
          ts2.Debug.type(node);
          return factory.updateExpressionStatement(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 238:
          ts2.Debug.type(node);
          return factory.updateIfStatement(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.thenStatement, visitor, ts2.isStatement, factory.liftToBlock), nodeVisitor(node.elseStatement, visitor, ts2.isStatement, factory.liftToBlock));
        case 239:
          ts2.Debug.type(node);
          return factory.updateDoStatement(node, visitIterationBody(node.statement, visitor, context), nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 240:
          ts2.Debug.type(node);
          return factory.updateWhileStatement(node, nodeVisitor(node.expression, visitor, ts2.isExpression), visitIterationBody(node.statement, visitor, context));
        case 241:
          ts2.Debug.type(node);
          return factory.updateForStatement(node, nodeVisitor(node.initializer, visitor, ts2.isForInitializer), nodeVisitor(node.condition, visitor, ts2.isExpression), nodeVisitor(node.incrementor, visitor, ts2.isExpression), visitIterationBody(node.statement, visitor, context));
        case 242:
          ts2.Debug.type(node);
          return factory.updateForInStatement(node, nodeVisitor(node.initializer, visitor, ts2.isForInitializer), nodeVisitor(node.expression, visitor, ts2.isExpression), visitIterationBody(node.statement, visitor, context));
        case 243:
          ts2.Debug.type(node);
          return factory.updateForOfStatement(node, nodeVisitor(node.awaitModifier, tokenVisitor, ts2.isAwaitKeyword), nodeVisitor(node.initializer, visitor, ts2.isForInitializer), nodeVisitor(node.expression, visitor, ts2.isExpression), visitIterationBody(node.statement, visitor, context));
        case 244:
          ts2.Debug.type(node);
          return factory.updateContinueStatement(node, nodeVisitor(node.label, visitor, ts2.isIdentifier));
        case 245:
          ts2.Debug.type(node);
          return factory.updateBreakStatement(node, nodeVisitor(node.label, visitor, ts2.isIdentifier));
        case 246:
          ts2.Debug.type(node);
          return factory.updateReturnStatement(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 247:
          ts2.Debug.type(node);
          return factory.updateWithStatement(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.statement, visitor, ts2.isStatement, factory.liftToBlock));
        case 248:
          ts2.Debug.type(node);
          return factory.updateSwitchStatement(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodeVisitor(node.caseBlock, visitor, ts2.isCaseBlock));
        case 249:
          ts2.Debug.type(node);
          return factory.updateLabeledStatement(node, nodeVisitor(node.label, visitor, ts2.isIdentifier), nodeVisitor(node.statement, visitor, ts2.isStatement, factory.liftToBlock));
        case 250:
          ts2.Debug.type(node);
          return factory.updateThrowStatement(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 251:
          ts2.Debug.type(node);
          return factory.updateTryStatement(node, nodeVisitor(node.tryBlock, visitor, ts2.isBlock), nodeVisitor(node.catchClause, visitor, ts2.isCatchClause), nodeVisitor(node.finallyBlock, visitor, ts2.isBlock));
        case 253:
          ts2.Debug.type(node);
          return factory.updateVariableDeclaration(node, nodeVisitor(node.name, visitor, ts2.isBindingName), nodeVisitor(node.exclamationToken, tokenVisitor, ts2.isExclamationToken), nodeVisitor(node.type, visitor, ts2.isTypeNode), nodeVisitor(node.initializer, visitor, ts2.isExpression));
        case 254:
          ts2.Debug.type(node);
          return factory.updateVariableDeclarationList(node, nodesVisitor(node.declarations, visitor, ts2.isVariableDeclaration));
        case 255:
          ts2.Debug.type(node);
          return factory.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.asteriskToken, tokenVisitor, ts2.isAsteriskToken), nodeVisitor(node.name, visitor, ts2.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), nodeVisitor(node.type, visitor, ts2.isTypeNode), visitFunctionBody(node.body, visitor, context, nodeVisitor));
        case 256:
          ts2.Debug.type(node);
          return factory.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts2.isHeritageClause), nodesVisitor(node.members, visitor, ts2.isClassElement));
        case 257:
          ts2.Debug.type(node);
          return factory.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts2.isHeritageClause), nodesVisitor(node.members, visitor, ts2.isTypeElement));
        case 258:
          ts2.Debug.type(node);
          return factory.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts2.isTypeParameterDeclaration), nodeVisitor(node.type, visitor, ts2.isTypeNode));
        case 259:
          ts2.Debug.type(node);
          return factory.updateEnumDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isIdentifier), nodesVisitor(node.members, visitor, ts2.isEnumMember));
        case 260:
          ts2.Debug.type(node);
          return factory.updateModuleDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.name, visitor, ts2.isModuleName), nodeVisitor(node.body, visitor, ts2.isModuleBody));
        case 261:
          ts2.Debug.type(node);
          return factory.updateModuleBlock(node, nodesVisitor(node.statements, visitor, ts2.isStatement));
        case 262:
          ts2.Debug.type(node);
          return factory.updateCaseBlock(node, nodesVisitor(node.clauses, visitor, ts2.isCaseOrDefaultClause));
        case 263:
          ts2.Debug.type(node);
          return factory.updateNamespaceExportDeclaration(node, nodeVisitor(node.name, visitor, ts2.isIdentifier));
        case 264:
          ts2.Debug.type(node);
          return factory.updateImportEqualsDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), node.isTypeOnly, nodeVisitor(node.name, visitor, ts2.isIdentifier), nodeVisitor(node.moduleReference, visitor, ts2.isModuleReference));
        case 265:
          ts2.Debug.type(node);
          return factory.updateImportDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.importClause, visitor, ts2.isImportClause), nodeVisitor(node.moduleSpecifier, visitor, ts2.isExpression), nodeVisitor(node.assertClause, visitor, ts2.isAssertClause));
        case 292:
          ts2.Debug.type(node);
          return factory.updateAssertClause(node, nodesVisitor(node.elements, visitor, ts2.isAssertEntry), node.multiLine);
        case 293:
          ts2.Debug.type(node);
          return factory.updateAssertEntry(node, nodeVisitor(node.name, visitor, ts2.isAssertionKey), nodeVisitor(node.value, visitor, ts2.isStringLiteral));
        case 266:
          ts2.Debug.type(node);
          return factory.updateImportClause(node, node.isTypeOnly, nodeVisitor(node.name, visitor, ts2.isIdentifier), nodeVisitor(node.namedBindings, visitor, ts2.isNamedImportBindings));
        case 267:
          ts2.Debug.type(node);
          return factory.updateNamespaceImport(node, nodeVisitor(node.name, visitor, ts2.isIdentifier));
        case 273:
          ts2.Debug.type(node);
          return factory.updateNamespaceExport(node, nodeVisitor(node.name, visitor, ts2.isIdentifier));
        case 268:
          ts2.Debug.type(node);
          return factory.updateNamedImports(node, nodesVisitor(node.elements, visitor, ts2.isImportSpecifier));
        case 269:
          ts2.Debug.type(node);
          return factory.updateImportSpecifier(node, node.isTypeOnly, nodeVisitor(node.propertyName, visitor, ts2.isIdentifier), nodeVisitor(node.name, visitor, ts2.isIdentifier));
        case 270:
          ts2.Debug.type(node);
          return factory.updateExportAssignment(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 271:
          ts2.Debug.type(node);
          return factory.updateExportDeclaration(node, nodesVisitor(node.decorators, visitor, ts2.isDecorator), nodesVisitor(node.modifiers, visitor, ts2.isModifier), node.isTypeOnly, nodeVisitor(node.exportClause, visitor, ts2.isNamedExportBindings), nodeVisitor(node.moduleSpecifier, visitor, ts2.isExpression), nodeVisitor(node.assertClause, visitor, ts2.isAssertClause));
        case 272:
          ts2.Debug.type(node);
          return factory.updateNamedExports(node, nodesVisitor(node.elements, visitor, ts2.isExportSpecifier));
        case 274:
          ts2.Debug.type(node);
          return factory.updateExportSpecifier(node, node.isTypeOnly, nodeVisitor(node.propertyName, visitor, ts2.isIdentifier), nodeVisitor(node.name, visitor, ts2.isIdentifier));
        case 276:
          ts2.Debug.type(node);
          return factory.updateExternalModuleReference(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 277:
          ts2.Debug.type(node);
          return factory.updateJsxElement(node, nodeVisitor(node.openingElement, visitor, ts2.isJsxOpeningElement), nodesVisitor(node.children, visitor, ts2.isJsxChild), nodeVisitor(node.closingElement, visitor, ts2.isJsxClosingElement));
        case 278:
          ts2.Debug.type(node);
          return factory.updateJsxSelfClosingElement(node, nodeVisitor(node.tagName, visitor, ts2.isJsxTagNameExpression), nodesVisitor(node.typeArguments, visitor, ts2.isTypeNode), nodeVisitor(node.attributes, visitor, ts2.isJsxAttributes));
        case 279:
          ts2.Debug.type(node);
          return factory.updateJsxOpeningElement(node, nodeVisitor(node.tagName, visitor, ts2.isJsxTagNameExpression), nodesVisitor(node.typeArguments, visitor, ts2.isTypeNode), nodeVisitor(node.attributes, visitor, ts2.isJsxAttributes));
        case 280:
          ts2.Debug.type(node);
          return factory.updateJsxClosingElement(node, nodeVisitor(node.tagName, visitor, ts2.isJsxTagNameExpression));
        case 281:
          ts2.Debug.type(node);
          return factory.updateJsxFragment(node, nodeVisitor(node.openingFragment, visitor, ts2.isJsxOpeningFragment), nodesVisitor(node.children, visitor, ts2.isJsxChild), nodeVisitor(node.closingFragment, visitor, ts2.isJsxClosingFragment));
        case 284:
          ts2.Debug.type(node);
          return factory.updateJsxAttribute(node, nodeVisitor(node.name, visitor, ts2.isIdentifier), nodeVisitor(node.initializer, visitor, ts2.isStringLiteralOrJsxExpression));
        case 285:
          ts2.Debug.type(node);
          return factory.updateJsxAttributes(node, nodesVisitor(node.properties, visitor, ts2.isJsxAttributeLike));
        case 286:
          ts2.Debug.type(node);
          return factory.updateJsxSpreadAttribute(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 287:
          ts2.Debug.type(node);
          return factory.updateJsxExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 288:
          ts2.Debug.type(node);
          return factory.updateCaseClause(node, nodeVisitor(node.expression, visitor, ts2.isExpression), nodesVisitor(node.statements, visitor, ts2.isStatement));
        case 289:
          ts2.Debug.type(node);
          return factory.updateDefaultClause(node, nodesVisitor(node.statements, visitor, ts2.isStatement));
        case 290:
          ts2.Debug.type(node);
          return factory.updateHeritageClause(node, nodesVisitor(node.types, visitor, ts2.isExpressionWithTypeArguments));
        case 291:
          ts2.Debug.type(node);
          return factory.updateCatchClause(node, nodeVisitor(node.variableDeclaration, visitor, ts2.isVariableDeclaration), nodeVisitor(node.block, visitor, ts2.isBlock));
        case 294:
          ts2.Debug.type(node);
          return factory.updatePropertyAssignment(node, nodeVisitor(node.name, visitor, ts2.isPropertyName), nodeVisitor(node.initializer, visitor, ts2.isExpression));
        case 295:
          ts2.Debug.type(node);
          return factory.updateShorthandPropertyAssignment(node, nodeVisitor(node.name, visitor, ts2.isIdentifier), nodeVisitor(node.objectAssignmentInitializer, visitor, ts2.isExpression));
        case 296:
          ts2.Debug.type(node);
          return factory.updateSpreadAssignment(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 297:
          ts2.Debug.type(node);
          return factory.updateEnumMember(node, nodeVisitor(node.name, visitor, ts2.isPropertyName), nodeVisitor(node.initializer, visitor, ts2.isExpression));
        case 303:
          ts2.Debug.type(node);
          return factory.updateSourceFile(node, visitLexicalEnvironment(node.statements, visitor, context));
        case 348:
          ts2.Debug.type(node);
          return factory.updatePartiallyEmittedExpression(node, nodeVisitor(node.expression, visitor, ts2.isExpression));
        case 349:
          ts2.Debug.type(node);
          return factory.updateCommaListExpression(node, nodesVisitor(node.elements, visitor, ts2.isExpression));
        default:
          return node;
      }
    }
    ts2.visitEachChild = visitEachChild;
    function extractSingleNode(nodes) {
      ts2.Debug.assert(nodes.length <= 1, "Too many nodes written to output.");
      return ts2.singleOrUndefined(nodes);
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function createSourceMapGenerator(host, file, sourceRoot, sourcesDirectoryPath, generatorOptions) {
      var _a = generatorOptions.extendedDiagnostics ? ts2.performance.createTimer("Source Map", "beforeSourcemap", "afterSourcemap") : ts2.performance.nullTimer, enter = _a.enter, exit = _a.exit;
      var rawSources = [];
      var sources = [];
      var sourceToSourceIndexMap = new ts2.Map();
      var sourcesContent;
      var names = [];
      var nameToNameIndexMap;
      var mappingCharCodes = [];
      var mappings = "";
      var lastGeneratedLine = 0;
      var lastGeneratedCharacter = 0;
      var lastSourceIndex = 0;
      var lastSourceLine = 0;
      var lastSourceCharacter = 0;
      var lastNameIndex = 0;
      var hasLast = false;
      var pendingGeneratedLine = 0;
      var pendingGeneratedCharacter = 0;
      var pendingSourceIndex = 0;
      var pendingSourceLine = 0;
      var pendingSourceCharacter = 0;
      var pendingNameIndex = 0;
      var hasPending = false;
      var hasPendingSource = false;
      var hasPendingName = false;
      return {
        getSources: function() {
          return rawSources;
        },
        addSource,
        setSourceContent,
        addName,
        addMapping,
        appendSourceMap,
        toJSON,
        toString: function() {
          return JSON.stringify(toJSON());
        }
      };
      function addSource(fileName) {
        enter();
        var source = ts2.getRelativePathToDirectoryOrUrl(sourcesDirectoryPath, fileName, host.getCurrentDirectory(), host.getCanonicalFileName, true);
        var sourceIndex = sourceToSourceIndexMap.get(source);
        if (sourceIndex === void 0) {
          sourceIndex = sources.length;
          sources.push(source);
          rawSources.push(fileName);
          sourceToSourceIndexMap.set(source, sourceIndex);
        }
        exit();
        return sourceIndex;
      }
      function setSourceContent(sourceIndex, content) {
        enter();
        if (content !== null) {
          if (!sourcesContent)
            sourcesContent = [];
          while (sourcesContent.length < sourceIndex) {
            sourcesContent.push(null);
          }
          sourcesContent[sourceIndex] = content;
        }
        exit();
      }
      function addName(name) {
        enter();
        if (!nameToNameIndexMap)
          nameToNameIndexMap = new ts2.Map();
        var nameIndex = nameToNameIndexMap.get(name);
        if (nameIndex === void 0) {
          nameIndex = names.length;
          names.push(name);
          nameToNameIndexMap.set(name, nameIndex);
        }
        exit();
        return nameIndex;
      }
      function isNewGeneratedPosition(generatedLine, generatedCharacter) {
        return !hasPending || pendingGeneratedLine !== generatedLine || pendingGeneratedCharacter !== generatedCharacter;
      }
      function isBacktrackingSourcePosition(sourceIndex, sourceLine, sourceCharacter) {
        return sourceIndex !== void 0 && sourceLine !== void 0 && sourceCharacter !== void 0 && pendingSourceIndex === sourceIndex && (pendingSourceLine > sourceLine || pendingSourceLine === sourceLine && pendingSourceCharacter > sourceCharacter);
      }
      function addMapping(generatedLine, generatedCharacter, sourceIndex, sourceLine, sourceCharacter, nameIndex) {
        ts2.Debug.assert(generatedLine >= pendingGeneratedLine, "generatedLine cannot backtrack");
        ts2.Debug.assert(generatedCharacter >= 0, "generatedCharacter cannot be negative");
        ts2.Debug.assert(sourceIndex === void 0 || sourceIndex >= 0, "sourceIndex cannot be negative");
        ts2.Debug.assert(sourceLine === void 0 || sourceLine >= 0, "sourceLine cannot be negative");
        ts2.Debug.assert(sourceCharacter === void 0 || sourceCharacter >= 0, "sourceCharacter cannot be negative");
        enter();
        if (isNewGeneratedPosition(generatedLine, generatedCharacter) || isBacktrackingSourcePosition(sourceIndex, sourceLine, sourceCharacter)) {
          commitPendingMapping();
          pendingGeneratedLine = generatedLine;
          pendingGeneratedCharacter = generatedCharacter;
          hasPendingSource = false;
          hasPendingName = false;
          hasPending = true;
        }
        if (sourceIndex !== void 0 && sourceLine !== void 0 && sourceCharacter !== void 0) {
          pendingSourceIndex = sourceIndex;
          pendingSourceLine = sourceLine;
          pendingSourceCharacter = sourceCharacter;
          hasPendingSource = true;
          if (nameIndex !== void 0) {
            pendingNameIndex = nameIndex;
            hasPendingName = true;
          }
        }
        exit();
      }
      function appendSourceMap(generatedLine, generatedCharacter, map, sourceMapPath, start, end) {
        ts2.Debug.assert(generatedLine >= pendingGeneratedLine, "generatedLine cannot backtrack");
        ts2.Debug.assert(generatedCharacter >= 0, "generatedCharacter cannot be negative");
        enter();
        var sourceIndexToNewSourceIndexMap = [];
        var nameIndexToNewNameIndexMap;
        var mappingIterator = decodeMappings(map.mappings);
        for (var iterResult = mappingIterator.next(); !iterResult.done; iterResult = mappingIterator.next()) {
          var raw = iterResult.value;
          if (end && (raw.generatedLine > end.line || raw.generatedLine === end.line && raw.generatedCharacter > end.character)) {
            break;
          }
          if (start && (raw.generatedLine < start.line || start.line === raw.generatedLine && raw.generatedCharacter < start.character)) {
            continue;
          }
          var newSourceIndex = void 0;
          var newSourceLine = void 0;
          var newSourceCharacter = void 0;
          var newNameIndex = void 0;
          if (raw.sourceIndex !== void 0) {
            newSourceIndex = sourceIndexToNewSourceIndexMap[raw.sourceIndex];
            if (newSourceIndex === void 0) {
              var rawPath = map.sources[raw.sourceIndex];
              var relativePath = map.sourceRoot ? ts2.combinePaths(map.sourceRoot, rawPath) : rawPath;
              var combinedPath = ts2.combinePaths(ts2.getDirectoryPath(sourceMapPath), relativePath);
              sourceIndexToNewSourceIndexMap[raw.sourceIndex] = newSourceIndex = addSource(combinedPath);
              if (map.sourcesContent && typeof map.sourcesContent[raw.sourceIndex] === "string") {
                setSourceContent(newSourceIndex, map.sourcesContent[raw.sourceIndex]);
              }
            }
            newSourceLine = raw.sourceLine;
            newSourceCharacter = raw.sourceCharacter;
            if (map.names && raw.nameIndex !== void 0) {
              if (!nameIndexToNewNameIndexMap)
                nameIndexToNewNameIndexMap = [];
              newNameIndex = nameIndexToNewNameIndexMap[raw.nameIndex];
              if (newNameIndex === void 0) {
                nameIndexToNewNameIndexMap[raw.nameIndex] = newNameIndex = addName(map.names[raw.nameIndex]);
              }
            }
          }
          var rawGeneratedLine = raw.generatedLine - (start ? start.line : 0);
          var newGeneratedLine = rawGeneratedLine + generatedLine;
          var rawGeneratedCharacter = start && start.line === raw.generatedLine ? raw.generatedCharacter - start.character : raw.generatedCharacter;
          var newGeneratedCharacter = rawGeneratedLine === 0 ? rawGeneratedCharacter + generatedCharacter : rawGeneratedCharacter;
          addMapping(newGeneratedLine, newGeneratedCharacter, newSourceIndex, newSourceLine, newSourceCharacter, newNameIndex);
        }
        exit();
      }
      function shouldCommitMapping() {
        return !hasLast || lastGeneratedLine !== pendingGeneratedLine || lastGeneratedCharacter !== pendingGeneratedCharacter || lastSourceIndex !== pendingSourceIndex || lastSourceLine !== pendingSourceLine || lastSourceCharacter !== pendingSourceCharacter || lastNameIndex !== pendingNameIndex;
      }
      function appendMappingCharCode(charCode) {
        mappingCharCodes.push(charCode);
        if (mappingCharCodes.length >= 1024) {
          flushMappingBuffer();
        }
      }
      function commitPendingMapping() {
        if (!hasPending || !shouldCommitMapping()) {
          return;
        }
        enter();
        if (lastGeneratedLine < pendingGeneratedLine) {
          do {
            appendMappingCharCode(59);
            lastGeneratedLine++;
          } while (lastGeneratedLine < pendingGeneratedLine);
          lastGeneratedCharacter = 0;
        } else {
          ts2.Debug.assertEqual(lastGeneratedLine, pendingGeneratedLine, "generatedLine cannot backtrack");
          if (hasLast) {
            appendMappingCharCode(44);
          }
        }
        appendBase64VLQ(pendingGeneratedCharacter - lastGeneratedCharacter);
        lastGeneratedCharacter = pendingGeneratedCharacter;
        if (hasPendingSource) {
          appendBase64VLQ(pendingSourceIndex - lastSourceIndex);
          lastSourceIndex = pendingSourceIndex;
          appendBase64VLQ(pendingSourceLine - lastSourceLine);
          lastSourceLine = pendingSourceLine;
          appendBase64VLQ(pendingSourceCharacter - lastSourceCharacter);
          lastSourceCharacter = pendingSourceCharacter;
          if (hasPendingName) {
            appendBase64VLQ(pendingNameIndex - lastNameIndex);
            lastNameIndex = pendingNameIndex;
          }
        }
        hasLast = true;
        exit();
      }
      function flushMappingBuffer() {
        if (mappingCharCodes.length > 0) {
          mappings += String.fromCharCode.apply(void 0, mappingCharCodes);
          mappingCharCodes.length = 0;
        }
      }
      function toJSON() {
        commitPendingMapping();
        flushMappingBuffer();
        return {
          version: 3,
          file,
          sourceRoot,
          sources,
          names,
          mappings,
          sourcesContent
        };
      }
      function appendBase64VLQ(inValue) {
        if (inValue < 0) {
          inValue = (-inValue << 1) + 1;
        } else {
          inValue = inValue << 1;
        }
        do {
          var currentDigit = inValue & 31;
          inValue = inValue >> 5;
          if (inValue > 0) {
            currentDigit = currentDigit | 32;
          }
          appendMappingCharCode(base64FormatEncode(currentDigit));
        } while (inValue > 0);
      }
    }
    ts2.createSourceMapGenerator = createSourceMapGenerator;
    var sourceMapCommentRegExp = /^\/\/[@#] source[M]appingURL=(.+)\r?\n?$/;
    var whitespaceOrMapCommentRegExp = /^\s*(\/\/[@#] .*)?$/;
    function getLineInfo(text, lineStarts) {
      return {
        getLineCount: function() {
          return lineStarts.length;
        },
        getLineText: function(line) {
          return text.substring(lineStarts[line], lineStarts[line + 1]);
        }
      };
    }
    ts2.getLineInfo = getLineInfo;
    function tryGetSourceMappingURL(lineInfo) {
      for (var index = lineInfo.getLineCount() - 1; index >= 0; index--) {
        var line = lineInfo.getLineText(index);
        var comment = sourceMapCommentRegExp.exec(line);
        if (comment) {
          return ts2.trimStringEnd(comment[1]);
        } else if (!line.match(whitespaceOrMapCommentRegExp)) {
          break;
        }
      }
    }
    ts2.tryGetSourceMappingURL = tryGetSourceMappingURL;
    function isStringOrNull(x) {
      return typeof x === "string" || x === null;
    }
    function isRawSourceMap(x) {
      return x !== null && typeof x === "object" && x.version === 3 && typeof x.file === "string" && typeof x.mappings === "string" && ts2.isArray(x.sources) && ts2.every(x.sources, ts2.isString) && (x.sourceRoot === void 0 || x.sourceRoot === null || typeof x.sourceRoot === "string") && (x.sourcesContent === void 0 || x.sourcesContent === null || ts2.isArray(x.sourcesContent) && ts2.every(x.sourcesContent, isStringOrNull)) && (x.names === void 0 || x.names === null || ts2.isArray(x.names) && ts2.every(x.names, ts2.isString));
    }
    ts2.isRawSourceMap = isRawSourceMap;
    function tryParseRawSourceMap(text) {
      try {
        var parsed = JSON.parse(text);
        if (isRawSourceMap(parsed)) {
          return parsed;
        }
      } catch (_a) {
      }
      return void 0;
    }
    ts2.tryParseRawSourceMap = tryParseRawSourceMap;
    function decodeMappings(mappings) {
      var done = false;
      var pos = 0;
      var generatedLine = 0;
      var generatedCharacter = 0;
      var sourceIndex = 0;
      var sourceLine = 0;
      var sourceCharacter = 0;
      var nameIndex = 0;
      var error;
      return {
        get pos() {
          return pos;
        },
        get error() {
          return error;
        },
        get state() {
          return captureMapping(true, true);
        },
        next: function() {
          while (!done && pos < mappings.length) {
            var ch = mappings.charCodeAt(pos);
            if (ch === 59) {
              generatedLine++;
              generatedCharacter = 0;
              pos++;
              continue;
            }
            if (ch === 44) {
              pos++;
              continue;
            }
            var hasSource = false;
            var hasName = false;
            generatedCharacter += base64VLQFormatDecode();
            if (hasReportedError())
              return stopIterating();
            if (generatedCharacter < 0)
              return setErrorAndStopIterating("Invalid generatedCharacter found");
            if (!isSourceMappingSegmentEnd()) {
              hasSource = true;
              sourceIndex += base64VLQFormatDecode();
              if (hasReportedError())
                return stopIterating();
              if (sourceIndex < 0)
                return setErrorAndStopIterating("Invalid sourceIndex found");
              if (isSourceMappingSegmentEnd())
                return setErrorAndStopIterating("Unsupported Format: No entries after sourceIndex");
              sourceLine += base64VLQFormatDecode();
              if (hasReportedError())
                return stopIterating();
              if (sourceLine < 0)
                return setErrorAndStopIterating("Invalid sourceLine found");
              if (isSourceMappingSegmentEnd())
                return setErrorAndStopIterating("Unsupported Format: No entries after sourceLine");
              sourceCharacter += base64VLQFormatDecode();
              if (hasReportedError())
                return stopIterating();
              if (sourceCharacter < 0)
                return setErrorAndStopIterating("Invalid sourceCharacter found");
              if (!isSourceMappingSegmentEnd()) {
                hasName = true;
                nameIndex += base64VLQFormatDecode();
                if (hasReportedError())
                  return stopIterating();
                if (nameIndex < 0)
                  return setErrorAndStopIterating("Invalid nameIndex found");
                if (!isSourceMappingSegmentEnd())
                  return setErrorAndStopIterating("Unsupported Error Format: Entries after nameIndex");
              }
            }
            return { value: captureMapping(hasSource, hasName), done };
          }
          return stopIterating();
        }
      };
      function captureMapping(hasSource, hasName) {
        return {
          generatedLine,
          generatedCharacter,
          sourceIndex: hasSource ? sourceIndex : void 0,
          sourceLine: hasSource ? sourceLine : void 0,
          sourceCharacter: hasSource ? sourceCharacter : void 0,
          nameIndex: hasName ? nameIndex : void 0
        };
      }
      function stopIterating() {
        done = true;
        return { value: void 0, done: true };
      }
      function setError(message) {
        if (error === void 0) {
          error = message;
        }
      }
      function setErrorAndStopIterating(message) {
        setError(message);
        return stopIterating();
      }
      function hasReportedError() {
        return error !== void 0;
      }
      function isSourceMappingSegmentEnd() {
        return pos === mappings.length || mappings.charCodeAt(pos) === 44 || mappings.charCodeAt(pos) === 59;
      }
      function base64VLQFormatDecode() {
        var moreDigits = true;
        var shiftCount = 0;
        var value = 0;
        for (; moreDigits; pos++) {
          if (pos >= mappings.length)
            return setError("Error in decoding base64VLQFormatDecode, past the mapping string"), -1;
          var currentByte = base64FormatDecode(mappings.charCodeAt(pos));
          if (currentByte === -1)
            return setError("Invalid character in VLQ"), -1;
          moreDigits = (currentByte & 32) !== 0;
          value = value | (currentByte & 31) << shiftCount;
          shiftCount += 5;
        }
        if ((value & 1) === 0) {
          value = value >> 1;
        } else {
          value = value >> 1;
          value = -value;
        }
        return value;
      }
    }
    ts2.decodeMappings = decodeMappings;
    function sameMapping(left, right) {
      return left === right || left.generatedLine === right.generatedLine && left.generatedCharacter === right.generatedCharacter && left.sourceIndex === right.sourceIndex && left.sourceLine === right.sourceLine && left.sourceCharacter === right.sourceCharacter && left.nameIndex === right.nameIndex;
    }
    ts2.sameMapping = sameMapping;
    function isSourceMapping(mapping) {
      return mapping.sourceIndex !== void 0 && mapping.sourceLine !== void 0 && mapping.sourceCharacter !== void 0;
    }
    ts2.isSourceMapping = isSourceMapping;
    function base64FormatEncode(value) {
      return value >= 0 && value < 26 ? 65 + value : value >= 26 && value < 52 ? 97 + value - 26 : value >= 52 && value < 62 ? 48 + value - 52 : value === 62 ? 43 : value === 63 ? 47 : ts2.Debug.fail("".concat(value, ": not a base64 value"));
    }
    function base64FormatDecode(ch) {
      return ch >= 65 && ch <= 90 ? ch - 65 : ch >= 97 && ch <= 122 ? ch - 97 + 26 : ch >= 48 && ch <= 57 ? ch - 48 + 52 : ch === 43 ? 62 : ch === 47 ? 63 : -1;
    }
    function isSourceMappedPosition(value) {
      return value.sourceIndex !== void 0 && value.sourcePosition !== void 0;
    }
    function sameMappedPosition(left, right) {
      return left.generatedPosition === right.generatedPosition && left.sourceIndex === right.sourceIndex && left.sourcePosition === right.sourcePosition;
    }
    function compareSourcePositions(left, right) {
      ts2.Debug.assert(left.sourceIndex === right.sourceIndex);
      return ts2.compareValues(left.sourcePosition, right.sourcePosition);
    }
    function compareGeneratedPositions(left, right) {
      return ts2.compareValues(left.generatedPosition, right.generatedPosition);
    }
    function getSourcePositionOfMapping(value) {
      return value.sourcePosition;
    }
    function getGeneratedPositionOfMapping(value) {
      return value.generatedPosition;
    }
    function createDocumentPositionMapper(host, map, mapPath) {
      var mapDirectory = ts2.getDirectoryPath(mapPath);
      var sourceRoot = map.sourceRoot ? ts2.getNormalizedAbsolutePath(map.sourceRoot, mapDirectory) : mapDirectory;
      var generatedAbsoluteFilePath = ts2.getNormalizedAbsolutePath(map.file, mapDirectory);
      var generatedFile = host.getSourceFileLike(generatedAbsoluteFilePath);
      var sourceFileAbsolutePaths = map.sources.map(function(source) {
        return ts2.getNormalizedAbsolutePath(source, sourceRoot);
      });
      var sourceToSourceIndexMap = new ts2.Map(sourceFileAbsolutePaths.map(function(source, i) {
        return [host.getCanonicalFileName(source), i];
      }));
      var decodedMappings;
      var generatedMappings;
      var sourceMappings;
      return {
        getSourcePosition,
        getGeneratedPosition
      };
      function processMapping(mapping) {
        var generatedPosition = generatedFile !== void 0 ? ts2.getPositionOfLineAndCharacter(generatedFile, mapping.generatedLine, mapping.generatedCharacter, true) : -1;
        var source;
        var sourcePosition;
        if (isSourceMapping(mapping)) {
          var sourceFile = host.getSourceFileLike(sourceFileAbsolutePaths[mapping.sourceIndex]);
          source = map.sources[mapping.sourceIndex];
          sourcePosition = sourceFile !== void 0 ? ts2.getPositionOfLineAndCharacter(sourceFile, mapping.sourceLine, mapping.sourceCharacter, true) : -1;
        }
        return {
          generatedPosition,
          source,
          sourceIndex: mapping.sourceIndex,
          sourcePosition,
          nameIndex: mapping.nameIndex
        };
      }
      function getDecodedMappings() {
        if (decodedMappings === void 0) {
          var decoder = decodeMappings(map.mappings);
          var mappings = ts2.arrayFrom(decoder, processMapping);
          if (decoder.error !== void 0) {
            if (host.log) {
              host.log("Encountered error while decoding sourcemap: ".concat(decoder.error));
            }
            decodedMappings = ts2.emptyArray;
          } else {
            decodedMappings = mappings;
          }
        }
        return decodedMappings;
      }
      function getSourceMappings(sourceIndex) {
        if (sourceMappings === void 0) {
          var lists = [];
          for (var _i = 0, _a = getDecodedMappings(); _i < _a.length; _i++) {
            var mapping = _a[_i];
            if (!isSourceMappedPosition(mapping))
              continue;
            var list = lists[mapping.sourceIndex];
            if (!list)
              lists[mapping.sourceIndex] = list = [];
            list.push(mapping);
          }
          sourceMappings = lists.map(function(list2) {
            return ts2.sortAndDeduplicate(list2, compareSourcePositions, sameMappedPosition);
          });
        }
        return sourceMappings[sourceIndex];
      }
      function getGeneratedMappings() {
        if (generatedMappings === void 0) {
          var list = [];
          for (var _i = 0, _a = getDecodedMappings(); _i < _a.length; _i++) {
            var mapping = _a[_i];
            list.push(mapping);
          }
          generatedMappings = ts2.sortAndDeduplicate(list, compareGeneratedPositions, sameMappedPosition);
        }
        return generatedMappings;
      }
      function getGeneratedPosition(loc) {
        var sourceIndex = sourceToSourceIndexMap.get(host.getCanonicalFileName(loc.fileName));
        if (sourceIndex === void 0)
          return loc;
        var sourceMappings2 = getSourceMappings(sourceIndex);
        if (!ts2.some(sourceMappings2))
          return loc;
        var targetIndex = ts2.binarySearchKey(sourceMappings2, loc.pos, getSourcePositionOfMapping, ts2.compareValues);
        if (targetIndex < 0) {
          targetIndex = ~targetIndex;
        }
        var mapping = sourceMappings2[targetIndex];
        if (mapping === void 0 || mapping.sourceIndex !== sourceIndex) {
          return loc;
        }
        return { fileName: generatedAbsoluteFilePath, pos: mapping.generatedPosition };
      }
      function getSourcePosition(loc) {
        var generatedMappings2 = getGeneratedMappings();
        if (!ts2.some(generatedMappings2))
          return loc;
        var targetIndex = ts2.binarySearchKey(generatedMappings2, loc.pos, getGeneratedPositionOfMapping, ts2.compareValues);
        if (targetIndex < 0) {
          targetIndex = ~targetIndex;
        }
        var mapping = generatedMappings2[targetIndex];
        if (mapping === void 0 || !isSourceMappedPosition(mapping)) {
          return loc;
        }
        return { fileName: sourceFileAbsolutePaths[mapping.sourceIndex], pos: mapping.sourcePosition };
      }
    }
    ts2.createDocumentPositionMapper = createDocumentPositionMapper;
    ts2.identitySourceMapConsumer = {
      getSourcePosition: ts2.identity,
      getGeneratedPosition: ts2.identity
    };
  })(ts || (ts = {}));
  (function(ts2) {
    function getOriginalNodeId(node) {
      node = ts2.getOriginalNode(node);
      return node ? ts2.getNodeId(node) : 0;
    }
    ts2.getOriginalNodeId = getOriginalNodeId;
    function containsDefaultReference(node) {
      if (!node)
        return false;
      if (!ts2.isNamedImports(node))
        return false;
      return ts2.some(node.elements, isNamedDefaultReference);
    }
    function isNamedDefaultReference(e) {
      return e.propertyName !== void 0 && e.propertyName.escapedText === "default";
    }
    function chainBundle(context, transformSourceFile) {
      return transformSourceFileOrBundle;
      function transformSourceFileOrBundle(node) {
        return node.kind === 303 ? transformSourceFile(node) : transformBundle(node);
      }
      function transformBundle(node) {
        return context.factory.createBundle(ts2.map(node.sourceFiles, transformSourceFile), node.prepends);
      }
    }
    ts2.chainBundle = chainBundle;
    function getExportNeedsImportStarHelper(node) {
      return !!ts2.getNamespaceDeclarationNode(node);
    }
    ts2.getExportNeedsImportStarHelper = getExportNeedsImportStarHelper;
    function getImportNeedsImportStarHelper(node) {
      if (!!ts2.getNamespaceDeclarationNode(node)) {
        return true;
      }
      var bindings = node.importClause && node.importClause.namedBindings;
      if (!bindings) {
        return false;
      }
      if (!ts2.isNamedImports(bindings))
        return false;
      var defaultRefCount = 0;
      for (var _i = 0, _a = bindings.elements; _i < _a.length; _i++) {
        var binding = _a[_i];
        if (isNamedDefaultReference(binding)) {
          defaultRefCount++;
        }
      }
      return defaultRefCount > 0 && defaultRefCount !== bindings.elements.length || !!(bindings.elements.length - defaultRefCount) && ts2.isDefaultImport(node);
    }
    ts2.getImportNeedsImportStarHelper = getImportNeedsImportStarHelper;
    function getImportNeedsImportDefaultHelper(node) {
      return !getImportNeedsImportStarHelper(node) && (ts2.isDefaultImport(node) || !!node.importClause && ts2.isNamedImports(node.importClause.namedBindings) && containsDefaultReference(node.importClause.namedBindings));
    }
    ts2.getImportNeedsImportDefaultHelper = getImportNeedsImportDefaultHelper;
    function collectExternalModuleInfo(context, sourceFile, resolver, compilerOptions) {
      var externalImports = [];
      var exportSpecifiers = ts2.createMultiMap();
      var exportedBindings = [];
      var uniqueExports = new ts2.Map();
      var exportedNames;
      var hasExportDefault = false;
      var exportEquals;
      var hasExportStarsToExportValues = false;
      var hasImportStar = false;
      var hasImportDefault = false;
      for (var _i = 0, _a = sourceFile.statements; _i < _a.length; _i++) {
        var node = _a[_i];
        switch (node.kind) {
          case 265:
            externalImports.push(node);
            if (!hasImportStar && getImportNeedsImportStarHelper(node)) {
              hasImportStar = true;
            }
            if (!hasImportDefault && getImportNeedsImportDefaultHelper(node)) {
              hasImportDefault = true;
            }
            break;
          case 264:
            if (node.moduleReference.kind === 276) {
              externalImports.push(node);
            }
            break;
          case 271:
            if (node.moduleSpecifier) {
              if (!node.exportClause) {
                externalImports.push(node);
                hasExportStarsToExportValues = true;
              } else {
                externalImports.push(node);
                if (ts2.isNamedExports(node.exportClause)) {
                  addExportedNamesForExportDeclaration(node);
                } else {
                  var name = node.exportClause.name;
                  if (!uniqueExports.get(ts2.idText(name))) {
                    multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name);
                    uniqueExports.set(ts2.idText(name), true);
                    exportedNames = ts2.append(exportedNames, name);
                  }
                  hasImportStar = true;
                }
              }
            } else {
              addExportedNamesForExportDeclaration(node);
            }
            break;
          case 270:
            if (node.isExportEquals && !exportEquals) {
              exportEquals = node;
            }
            break;
          case 236:
            if (ts2.hasSyntacticModifier(node, 1)) {
              for (var _b = 0, _c = node.declarationList.declarations; _b < _c.length; _b++) {
                var decl = _c[_b];
                exportedNames = collectExportedVariableInfo(decl, uniqueExports, exportedNames);
              }
            }
            break;
          case 255:
            if (ts2.hasSyntacticModifier(node, 1)) {
              if (ts2.hasSyntacticModifier(node, 512)) {
                if (!hasExportDefault) {
                  multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), context.factory.getDeclarationName(node));
                  hasExportDefault = true;
                }
              } else {
                var name = node.name;
                if (!uniqueExports.get(ts2.idText(name))) {
                  multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name);
                  uniqueExports.set(ts2.idText(name), true);
                  exportedNames = ts2.append(exportedNames, name);
                }
              }
            }
            break;
          case 256:
            if (ts2.hasSyntacticModifier(node, 1)) {
              if (ts2.hasSyntacticModifier(node, 512)) {
                if (!hasExportDefault) {
                  multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), context.factory.getDeclarationName(node));
                  hasExportDefault = true;
                }
              } else {
                var name = node.name;
                if (name && !uniqueExports.get(ts2.idText(name))) {
                  multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name);
                  uniqueExports.set(ts2.idText(name), true);
                  exportedNames = ts2.append(exportedNames, name);
                }
              }
            }
            break;
        }
      }
      var externalHelpersImportDeclaration = ts2.createExternalHelpersImportDeclarationIfNeeded(context.factory, context.getEmitHelperFactory(), sourceFile, compilerOptions, hasExportStarsToExportValues, hasImportStar, hasImportDefault);
      if (externalHelpersImportDeclaration) {
        externalImports.unshift(externalHelpersImportDeclaration);
      }
      return { externalImports, exportSpecifiers, exportEquals, hasExportStarsToExportValues, exportedBindings, exportedNames, externalHelpersImportDeclaration };
      function addExportedNamesForExportDeclaration(node2) {
        for (var _i2 = 0, _a2 = ts2.cast(node2.exportClause, ts2.isNamedExports).elements; _i2 < _a2.length; _i2++) {
          var specifier = _a2[_i2];
          if (!uniqueExports.get(ts2.idText(specifier.name))) {
            var name2 = specifier.propertyName || specifier.name;
            if (!node2.moduleSpecifier) {
              exportSpecifiers.add(ts2.idText(name2), specifier);
            }
            var decl2 = resolver.getReferencedImportDeclaration(name2) || resolver.getReferencedValueDeclaration(name2);
            if (decl2) {
              multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(decl2), specifier.name);
            }
            uniqueExports.set(ts2.idText(specifier.name), true);
            exportedNames = ts2.append(exportedNames, specifier.name);
          }
        }
      }
    }
    ts2.collectExternalModuleInfo = collectExternalModuleInfo;
    function collectExportedVariableInfo(decl, uniqueExports, exportedNames) {
      if (ts2.isBindingPattern(decl.name)) {
        for (var _i = 0, _a = decl.name.elements; _i < _a.length; _i++) {
          var element = _a[_i];
          if (!ts2.isOmittedExpression(element)) {
            exportedNames = collectExportedVariableInfo(element, uniqueExports, exportedNames);
          }
        }
      } else if (!ts2.isGeneratedIdentifier(decl.name)) {
        var text = ts2.idText(decl.name);
        if (!uniqueExports.get(text)) {
          uniqueExports.set(text, true);
          exportedNames = ts2.append(exportedNames, decl.name);
        }
      }
      return exportedNames;
    }
    function multiMapSparseArrayAdd(map, key, value) {
      var values = map[key];
      if (values) {
        values.push(value);
      } else {
        map[key] = values = [value];
      }
      return values;
    }
    function isSimpleCopiableExpression(expression) {
      return ts2.isStringLiteralLike(expression) || expression.kind === 8 || ts2.isKeyword(expression.kind) || ts2.isIdentifier(expression);
    }
    ts2.isSimpleCopiableExpression = isSimpleCopiableExpression;
    function isSimpleInlineableExpression(expression) {
      return !ts2.isIdentifier(expression) && isSimpleCopiableExpression(expression);
    }
    ts2.isSimpleInlineableExpression = isSimpleInlineableExpression;
    function isCompoundAssignment(kind) {
      return kind >= 64 && kind <= 78;
    }
    ts2.isCompoundAssignment = isCompoundAssignment;
    function getNonAssignmentOperatorForCompoundAssignment(kind) {
      switch (kind) {
        case 64:
          return 39;
        case 65:
          return 40;
        case 66:
          return 41;
        case 67:
          return 42;
        case 68:
          return 43;
        case 69:
          return 44;
        case 70:
          return 47;
        case 71:
          return 48;
        case 72:
          return 49;
        case 73:
          return 50;
        case 74:
          return 51;
        case 78:
          return 52;
        case 75:
          return 56;
        case 76:
          return 55;
        case 77:
          return 60;
      }
    }
    ts2.getNonAssignmentOperatorForCompoundAssignment = getNonAssignmentOperatorForCompoundAssignment;
    function addPrologueDirectivesAndInitialSuperCall(factory, ctor, result, visitor) {
      if (ctor.body) {
        var statements = ctor.body.statements;
        var index = factory.copyPrologue(statements, result, false, visitor);
        if (index === statements.length) {
          return index;
        }
        var superIndex = ts2.findIndex(statements, function(s) {
          return ts2.isExpressionStatement(s) && ts2.isSuperCall(s.expression);
        }, index);
        if (superIndex > -1) {
          for (var i = index; i <= superIndex; i++) {
            result.push(ts2.visitNode(statements[i], visitor, ts2.isStatement));
          }
          return superIndex + 1;
        }
        return index;
      }
      return 0;
    }
    ts2.addPrologueDirectivesAndInitialSuperCall = addPrologueDirectivesAndInitialSuperCall;
    function getProperties(node, requireInitializer, isStatic) {
      return ts2.filter(node.members, function(m) {
        return isInitializedOrStaticProperty(m, requireInitializer, isStatic);
      });
    }
    ts2.getProperties = getProperties;
    function isStaticPropertyDeclarationOrClassStaticBlockDeclaration(element) {
      return isStaticPropertyDeclaration(element) || ts2.isClassStaticBlockDeclaration(element);
    }
    function getStaticPropertiesAndClassStaticBlock(node) {
      return ts2.filter(node.members, isStaticPropertyDeclarationOrClassStaticBlockDeclaration);
    }
    ts2.getStaticPropertiesAndClassStaticBlock = getStaticPropertiesAndClassStaticBlock;
    function isInitializedOrStaticProperty(member, requireInitializer, isStatic) {
      return ts2.isPropertyDeclaration(member) && (!!member.initializer || !requireInitializer) && ts2.hasStaticModifier(member) === isStatic;
    }
    function isStaticPropertyDeclaration(member) {
      return ts2.isPropertyDeclaration(member) && ts2.hasStaticModifier(member);
    }
    function isInitializedProperty(member) {
      return member.kind === 166 && member.initializer !== void 0;
    }
    ts2.isInitializedProperty = isInitializedProperty;
    function isNonStaticMethodOrAccessorWithPrivateName(member) {
      return !ts2.isStatic(member) && ts2.isMethodOrAccessor(member) && ts2.isPrivateIdentifier(member.name);
    }
    ts2.isNonStaticMethodOrAccessorWithPrivateName = isNonStaticMethodOrAccessorWithPrivateName;
  })(ts || (ts = {}));
  (function(ts2) {
    var FlattenLevel;
    (function(FlattenLevel2) {
      FlattenLevel2[FlattenLevel2["All"] = 0] = "All";
      FlattenLevel2[FlattenLevel2["ObjectRest"] = 1] = "ObjectRest";
    })(FlattenLevel = ts2.FlattenLevel || (ts2.FlattenLevel = {}));
    function flattenDestructuringAssignment(node, visitor, context, level, needsValue, createAssignmentCallback) {
      var location = node;
      var value;
      if (ts2.isDestructuringAssignment(node)) {
        value = node.right;
        while (ts2.isEmptyArrayLiteral(node.left) || ts2.isEmptyObjectLiteral(node.left)) {
          if (ts2.isDestructuringAssignment(value)) {
            location = node = value;
            value = node.right;
          } else {
            return ts2.visitNode(value, visitor, ts2.isExpression);
          }
        }
      }
      var expressions;
      var flattenContext = {
        context,
        level,
        downlevelIteration: !!context.getCompilerOptions().downlevelIteration,
        hoistTempVariables: true,
        emitExpression,
        emitBindingOrAssignment,
        createArrayBindingOrAssignmentPattern: function(elements) {
          return makeArrayAssignmentPattern(context.factory, elements);
        },
        createObjectBindingOrAssignmentPattern: function(elements) {
          return makeObjectAssignmentPattern(context.factory, elements);
        },
        createArrayBindingOrAssignmentElement: makeAssignmentElement,
        visitor
      };
      if (value) {
        value = ts2.visitNode(value, visitor, ts2.isExpression);
        if (ts2.isIdentifier(value) && bindingOrAssignmentElementAssignsToName(node, value.escapedText) || bindingOrAssignmentElementContainsNonLiteralComputedName(node)) {
          value = ensureIdentifier(flattenContext, value, false, location);
        } else if (needsValue) {
          value = ensureIdentifier(flattenContext, value, true, location);
        } else if (ts2.nodeIsSynthesized(node)) {
          location = value;
        }
      }
      flattenBindingOrAssignmentElement(flattenContext, node, value, location, ts2.isDestructuringAssignment(node));
      if (value && needsValue) {
        if (!ts2.some(expressions)) {
          return value;
        }
        expressions.push(value);
      }
      return context.factory.inlineExpressions(expressions) || context.factory.createOmittedExpression();
      function emitExpression(expression) {
        expressions = ts2.append(expressions, expression);
      }
      function emitBindingOrAssignment(target, value2, location2, original) {
        ts2.Debug.assertNode(target, createAssignmentCallback ? ts2.isIdentifier : ts2.isExpression);
        var expression = createAssignmentCallback ? createAssignmentCallback(target, value2, location2) : ts2.setTextRange(context.factory.createAssignment(ts2.visitNode(target, visitor, ts2.isExpression), value2), location2);
        expression.original = original;
        emitExpression(expression);
      }
    }
    ts2.flattenDestructuringAssignment = flattenDestructuringAssignment;
    function bindingOrAssignmentElementAssignsToName(element, escapedName) {
      var target = ts2.getTargetOfBindingOrAssignmentElement(element);
      if (ts2.isBindingOrAssignmentPattern(target)) {
        return bindingOrAssignmentPatternAssignsToName(target, escapedName);
      } else if (ts2.isIdentifier(target)) {
        return target.escapedText === escapedName;
      }
      return false;
    }
    function bindingOrAssignmentPatternAssignsToName(pattern, escapedName) {
      var elements = ts2.getElementsOfBindingOrAssignmentPattern(pattern);
      for (var _i = 0, elements_3 = elements; _i < elements_3.length; _i++) {
        var element = elements_3[_i];
        if (bindingOrAssignmentElementAssignsToName(element, escapedName)) {
          return true;
        }
      }
      return false;
    }
    function bindingOrAssignmentElementContainsNonLiteralComputedName(element) {
      var propertyName = ts2.tryGetPropertyNameOfBindingOrAssignmentElement(element);
      if (propertyName && ts2.isComputedPropertyName(propertyName) && !ts2.isLiteralExpression(propertyName.expression)) {
        return true;
      }
      var target = ts2.getTargetOfBindingOrAssignmentElement(element);
      return !!target && ts2.isBindingOrAssignmentPattern(target) && bindingOrAssignmentPatternContainsNonLiteralComputedName(target);
    }
    function bindingOrAssignmentPatternContainsNonLiteralComputedName(pattern) {
      return !!ts2.forEach(ts2.getElementsOfBindingOrAssignmentPattern(pattern), bindingOrAssignmentElementContainsNonLiteralComputedName);
    }
    function flattenDestructuringBinding(node, visitor, context, level, rval, hoistTempVariables, skipInitializer) {
      if (hoistTempVariables === void 0) {
        hoistTempVariables = false;
      }
      var pendingExpressions;
      var pendingDeclarations = [];
      var declarations = [];
      var flattenContext = {
        context,
        level,
        downlevelIteration: !!context.getCompilerOptions().downlevelIteration,
        hoistTempVariables,
        emitExpression,
        emitBindingOrAssignment,
        createArrayBindingOrAssignmentPattern: function(elements) {
          return makeArrayBindingPattern(context.factory, elements);
        },
        createObjectBindingOrAssignmentPattern: function(elements) {
          return makeObjectBindingPattern(context.factory, elements);
        },
        createArrayBindingOrAssignmentElement: function(name2) {
          return makeBindingElement(context.factory, name2);
        },
        visitor
      };
      if (ts2.isVariableDeclaration(node)) {
        var initializer = ts2.getInitializerOfBindingOrAssignmentElement(node);
        if (initializer && (ts2.isIdentifier(initializer) && bindingOrAssignmentElementAssignsToName(node, initializer.escapedText) || bindingOrAssignmentElementContainsNonLiteralComputedName(node))) {
          initializer = ensureIdentifier(flattenContext, ts2.visitNode(initializer, flattenContext.visitor), false, initializer);
          node = context.factory.updateVariableDeclaration(node, node.name, void 0, void 0, initializer);
        }
      }
      flattenBindingOrAssignmentElement(flattenContext, node, rval, node, skipInitializer);
      if (pendingExpressions) {
        var temp = context.factory.createTempVariable(void 0);
        if (hoistTempVariables) {
          var value = context.factory.inlineExpressions(pendingExpressions);
          pendingExpressions = void 0;
          emitBindingOrAssignment(temp, value, void 0, void 0);
        } else {
          context.hoistVariableDeclaration(temp);
          var pendingDeclaration = ts2.last(pendingDeclarations);
          pendingDeclaration.pendingExpressions = ts2.append(pendingDeclaration.pendingExpressions, context.factory.createAssignment(temp, pendingDeclaration.value));
          ts2.addRange(pendingDeclaration.pendingExpressions, pendingExpressions);
          pendingDeclaration.value = temp;
        }
      }
      for (var _i = 0, pendingDeclarations_1 = pendingDeclarations; _i < pendingDeclarations_1.length; _i++) {
        var _a = pendingDeclarations_1[_i], pendingExpressions_1 = _a.pendingExpressions, name = _a.name, value = _a.value, location = _a.location, original = _a.original;
        var variable = context.factory.createVariableDeclaration(name, void 0, void 0, pendingExpressions_1 ? context.factory.inlineExpressions(ts2.append(pendingExpressions_1, value)) : value);
        variable.original = original;
        ts2.setTextRange(variable, location);
        declarations.push(variable);
      }
      return declarations;
      function emitExpression(value2) {
        pendingExpressions = ts2.append(pendingExpressions, value2);
      }
      function emitBindingOrAssignment(target, value2, location2, original2) {
        ts2.Debug.assertNode(target, ts2.isBindingName);
        if (pendingExpressions) {
          value2 = context.factory.inlineExpressions(ts2.append(pendingExpressions, value2));
          pendingExpressions = void 0;
        }
        pendingDeclarations.push({ pendingExpressions, name: target, value: value2, location: location2, original: original2 });
      }
    }
    ts2.flattenDestructuringBinding = flattenDestructuringBinding;
    function flattenBindingOrAssignmentElement(flattenContext, element, value, location, skipInitializer) {
      var bindingTarget = ts2.getTargetOfBindingOrAssignmentElement(element);
      if (!skipInitializer) {
        var initializer = ts2.visitNode(ts2.getInitializerOfBindingOrAssignmentElement(element), flattenContext.visitor, ts2.isExpression);
        if (initializer) {
          if (value) {
            value = createDefaultValueCheck(flattenContext, value, initializer, location);
            if (!ts2.isSimpleInlineableExpression(initializer) && ts2.isBindingOrAssignmentPattern(bindingTarget)) {
              value = ensureIdentifier(flattenContext, value, true, location);
            }
          } else {
            value = initializer;
          }
        } else if (!value) {
          value = flattenContext.context.factory.createVoidZero();
        }
      }
      if (ts2.isObjectBindingOrAssignmentPattern(bindingTarget)) {
        flattenObjectBindingOrAssignmentPattern(flattenContext, element, bindingTarget, value, location);
      } else if (ts2.isArrayBindingOrAssignmentPattern(bindingTarget)) {
        flattenArrayBindingOrAssignmentPattern(flattenContext, element, bindingTarget, value, location);
      } else {
        flattenContext.emitBindingOrAssignment(bindingTarget, value, location, element);
      }
    }
    function flattenObjectBindingOrAssignmentPattern(flattenContext, parent, pattern, value, location) {
      var elements = ts2.getElementsOfBindingOrAssignmentPattern(pattern);
      var numElements = elements.length;
      if (numElements !== 1) {
        var reuseIdentifierExpressions = !ts2.isDeclarationBindingElement(parent) || numElements !== 0;
        value = ensureIdentifier(flattenContext, value, reuseIdentifierExpressions, location);
      }
      var bindingElements;
      var computedTempVariables;
      for (var i = 0; i < numElements; i++) {
        var element = elements[i];
        if (!ts2.getRestIndicatorOfBindingOrAssignmentElement(element)) {
          var propertyName = ts2.getPropertyNameOfBindingOrAssignmentElement(element);
          if (flattenContext.level >= 1 && !(element.transformFlags & (16384 | 32768)) && !(ts2.getTargetOfBindingOrAssignmentElement(element).transformFlags & (16384 | 32768)) && !ts2.isComputedPropertyName(propertyName)) {
            bindingElements = ts2.append(bindingElements, ts2.visitNode(element, flattenContext.visitor));
          } else {
            if (bindingElements) {
              flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern);
              bindingElements = void 0;
            }
            var rhsValue = createDestructuringPropertyAccess(flattenContext, value, propertyName);
            if (ts2.isComputedPropertyName(propertyName)) {
              computedTempVariables = ts2.append(computedTempVariables, rhsValue.argumentExpression);
            }
            flattenBindingOrAssignmentElement(flattenContext, element, rhsValue, element);
          }
        } else if (i === numElements - 1) {
          if (bindingElements) {
            flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern);
            bindingElements = void 0;
          }
          var rhsValue = flattenContext.context.getEmitHelperFactory().createRestHelper(value, elements, computedTempVariables, pattern);
          flattenBindingOrAssignmentElement(flattenContext, element, rhsValue, element);
        }
      }
      if (bindingElements) {
        flattenContext.emitBindingOrAssignment(flattenContext.createObjectBindingOrAssignmentPattern(bindingElements), value, location, pattern);
      }
    }
    function flattenArrayBindingOrAssignmentPattern(flattenContext, parent, pattern, value, location) {
      var elements = ts2.getElementsOfBindingOrAssignmentPattern(pattern);
      var numElements = elements.length;
      if (flattenContext.level < 1 && flattenContext.downlevelIteration) {
        value = ensureIdentifier(flattenContext, ts2.setTextRange(flattenContext.context.getEmitHelperFactory().createReadHelper(value, numElements > 0 && ts2.getRestIndicatorOfBindingOrAssignmentElement(elements[numElements - 1]) ? void 0 : numElements), location), false, location);
      } else if (numElements !== 1 && (flattenContext.level < 1 || numElements === 0) || ts2.every(elements, ts2.isOmittedExpression)) {
        var reuseIdentifierExpressions = !ts2.isDeclarationBindingElement(parent) || numElements !== 0;
        value = ensureIdentifier(flattenContext, value, reuseIdentifierExpressions, location);
      }
      var bindingElements;
      var restContainingElements;
      for (var i = 0; i < numElements; i++) {
        var element = elements[i];
        if (flattenContext.level >= 1) {
          if (element.transformFlags & 32768 || flattenContext.hasTransformedPriorElement && !isSimpleBindingOrAssignmentElement(element)) {
            flattenContext.hasTransformedPriorElement = true;
            var temp = flattenContext.context.factory.createTempVariable(void 0);
            if (flattenContext.hoistTempVariables) {
              flattenContext.context.hoistVariableDeclaration(temp);
            }
            restContainingElements = ts2.append(restContainingElements, [temp, element]);
            bindingElements = ts2.append(bindingElements, flattenContext.createArrayBindingOrAssignmentElement(temp));
          } else {
            bindingElements = ts2.append(bindingElements, element);
          }
        } else if (ts2.isOmittedExpression(element)) {
          continue;
        } else if (!ts2.getRestIndicatorOfBindingOrAssignmentElement(element)) {
          var rhsValue = flattenContext.context.factory.createElementAccessExpression(value, i);
          flattenBindingOrAssignmentElement(flattenContext, element, rhsValue, element);
        } else if (i === numElements - 1) {
          var rhsValue = flattenContext.context.factory.createArraySliceCall(value, i);
          flattenBindingOrAssignmentElement(flattenContext, element, rhsValue, element);
        }
      }
      if (bindingElements) {
        flattenContext.emitBindingOrAssignment(flattenContext.createArrayBindingOrAssignmentPattern(bindingElements), value, location, pattern);
      }
      if (restContainingElements) {
        for (var _i = 0, restContainingElements_1 = restContainingElements; _i < restContainingElements_1.length; _i++) {
          var _a = restContainingElements_1[_i], id = _a[0], element = _a[1];
          flattenBindingOrAssignmentElement(flattenContext, element, id, element);
        }
      }
    }
    function isSimpleBindingOrAssignmentElement(element) {
      var target = ts2.getTargetOfBindingOrAssignmentElement(element);
      if (!target || ts2.isOmittedExpression(target))
        return true;
      var propertyName = ts2.tryGetPropertyNameOfBindingOrAssignmentElement(element);
      if (propertyName && !ts2.isPropertyNameLiteral(propertyName))
        return false;
      var initializer = ts2.getInitializerOfBindingOrAssignmentElement(element);
      if (initializer && !ts2.isSimpleInlineableExpression(initializer))
        return false;
      if (ts2.isBindingOrAssignmentPattern(target))
        return ts2.every(ts2.getElementsOfBindingOrAssignmentPattern(target), isSimpleBindingOrAssignmentElement);
      return ts2.isIdentifier(target);
    }
    function createDefaultValueCheck(flattenContext, value, defaultValue, location) {
      value = ensureIdentifier(flattenContext, value, true, location);
      return flattenContext.context.factory.createConditionalExpression(flattenContext.context.factory.createTypeCheck(value, "undefined"), void 0, defaultValue, void 0, value);
    }
    function createDestructuringPropertyAccess(flattenContext, value, propertyName) {
      if (ts2.isComputedPropertyName(propertyName)) {
        var argumentExpression = ensureIdentifier(flattenContext, ts2.visitNode(propertyName.expression, flattenContext.visitor), false, propertyName);
        return flattenContext.context.factory.createElementAccessExpression(value, argumentExpression);
      } else if (ts2.isStringOrNumericLiteralLike(propertyName)) {
        var argumentExpression = ts2.factory.cloneNode(propertyName);
        return flattenContext.context.factory.createElementAccessExpression(value, argumentExpression);
      } else {
        var name = flattenContext.context.factory.createIdentifier(ts2.idText(propertyName));
        return flattenContext.context.factory.createPropertyAccessExpression(value, name);
      }
    }
    function ensureIdentifier(flattenContext, value, reuseIdentifierExpressions, location) {
      if (ts2.isIdentifier(value) && reuseIdentifierExpressions) {
        return value;
      } else {
        var temp = flattenContext.context.factory.createTempVariable(void 0);
        if (flattenContext.hoistTempVariables) {
          flattenContext.context.hoistVariableDeclaration(temp);
          flattenContext.emitExpression(ts2.setTextRange(flattenContext.context.factory.createAssignment(temp, value), location));
        } else {
          flattenContext.emitBindingOrAssignment(temp, value, location, void 0);
        }
        return temp;
      }
    }
    function makeArrayBindingPattern(factory, elements) {
      ts2.Debug.assertEachNode(elements, ts2.isArrayBindingElement);
      return factory.createArrayBindingPattern(elements);
    }
    function makeArrayAssignmentPattern(factory, elements) {
      return factory.createArrayLiteralExpression(ts2.map(elements, factory.converters.convertToArrayAssignmentElement));
    }
    function makeObjectBindingPattern(factory, elements) {
      ts2.Debug.assertEachNode(elements, ts2.isBindingElement);
      return factory.createObjectBindingPattern(elements);
    }
    function makeObjectAssignmentPattern(factory, elements) {
      return factory.createObjectLiteralExpression(ts2.map(elements, factory.converters.convertToObjectAssignmentElement));
    }
    function makeBindingElement(factory, name) {
      return factory.createBindingElement(void 0, void 0, name);
    }
    function makeAssignmentElement(name) {
      return name;
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var ProcessLevel;
    (function(ProcessLevel2) {
      ProcessLevel2[ProcessLevel2["LiftRestriction"] = 0] = "LiftRestriction";
      ProcessLevel2[ProcessLevel2["All"] = 1] = "All";
    })(ProcessLevel = ts2.ProcessLevel || (ts2.ProcessLevel = {}));
    function processTaggedTemplateExpression(context, node, visitor, currentSourceFile, recordTaggedTemplateString, level) {
      var tag = ts2.visitNode(node.tag, visitor, ts2.isExpression);
      var templateArguments = [void 0];
      var cookedStrings = [];
      var rawStrings = [];
      var template = node.template;
      if (level === ProcessLevel.LiftRestriction && !ts2.hasInvalidEscape(template)) {
        return ts2.visitEachChild(node, visitor, context);
      }
      if (ts2.isNoSubstitutionTemplateLiteral(template)) {
        cookedStrings.push(createTemplateCooked(template));
        rawStrings.push(getRawLiteral(template, currentSourceFile));
      } else {
        cookedStrings.push(createTemplateCooked(template.head));
        rawStrings.push(getRawLiteral(template.head, currentSourceFile));
        for (var _i = 0, _a = template.templateSpans; _i < _a.length; _i++) {
          var templateSpan = _a[_i];
          cookedStrings.push(createTemplateCooked(templateSpan.literal));
          rawStrings.push(getRawLiteral(templateSpan.literal, currentSourceFile));
          templateArguments.push(ts2.visitNode(templateSpan.expression, visitor, ts2.isExpression));
        }
      }
      var helperCall = context.getEmitHelperFactory().createTemplateObjectHelper(ts2.factory.createArrayLiteralExpression(cookedStrings), ts2.factory.createArrayLiteralExpression(rawStrings));
      if (ts2.isExternalModule(currentSourceFile)) {
        var tempVar = ts2.factory.createUniqueName("templateObject");
        recordTaggedTemplateString(tempVar);
        templateArguments[0] = ts2.factory.createLogicalOr(tempVar, ts2.factory.createAssignment(tempVar, helperCall));
      } else {
        templateArguments[0] = helperCall;
      }
      return ts2.factory.createCallExpression(tag, void 0, templateArguments);
    }
    ts2.processTaggedTemplateExpression = processTaggedTemplateExpression;
    function createTemplateCooked(template) {
      return template.templateFlags ? ts2.factory.createVoidZero() : ts2.factory.createStringLiteral(template.text);
    }
    function getRawLiteral(node, currentSourceFile) {
      var text = node.rawText;
      if (text === void 0) {
        ts2.Debug.assertIsDefined(currentSourceFile, "Template literal node is missing 'rawText' and does not have a source file. Possibly bad transform.");
        text = ts2.getSourceTextOfNodeFromSourceFile(currentSourceFile, node);
        var isLast = node.kind === 14 || node.kind === 17;
        text = text.substring(1, text.length - (isLast ? 1 : 2));
      }
      text = text.replace(/\r\n?/g, "\n");
      return ts2.setTextRange(ts2.factory.createStringLiteral(text), node);
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var USE_NEW_TYPE_METADATA_FORMAT = false;
    var TypeScriptSubstitutionFlags;
    (function(TypeScriptSubstitutionFlags2) {
      TypeScriptSubstitutionFlags2[TypeScriptSubstitutionFlags2["ClassAliases"] = 1] = "ClassAliases";
      TypeScriptSubstitutionFlags2[TypeScriptSubstitutionFlags2["NamespaceExports"] = 2] = "NamespaceExports";
      TypeScriptSubstitutionFlags2[TypeScriptSubstitutionFlags2["NonQualifiedEnumMembers"] = 8] = "NonQualifiedEnumMembers";
    })(TypeScriptSubstitutionFlags || (TypeScriptSubstitutionFlags = {}));
    var ClassFacts;
    (function(ClassFacts2) {
      ClassFacts2[ClassFacts2["None"] = 0] = "None";
      ClassFacts2[ClassFacts2["HasStaticInitializedProperties"] = 1] = "HasStaticInitializedProperties";
      ClassFacts2[ClassFacts2["HasConstructorDecorators"] = 2] = "HasConstructorDecorators";
      ClassFacts2[ClassFacts2["HasMemberDecorators"] = 4] = "HasMemberDecorators";
      ClassFacts2[ClassFacts2["IsExportOfNamespace"] = 8] = "IsExportOfNamespace";
      ClassFacts2[ClassFacts2["IsNamedExternalExport"] = 16] = "IsNamedExternalExport";
      ClassFacts2[ClassFacts2["IsDefaultExternalExport"] = 32] = "IsDefaultExternalExport";
      ClassFacts2[ClassFacts2["IsDerivedClass"] = 64] = "IsDerivedClass";
      ClassFacts2[ClassFacts2["UseImmediatelyInvokedFunctionExpression"] = 128] = "UseImmediatelyInvokedFunctionExpression";
      ClassFacts2[ClassFacts2["HasAnyDecorators"] = 6] = "HasAnyDecorators";
      ClassFacts2[ClassFacts2["NeedsName"] = 5] = "NeedsName";
      ClassFacts2[ClassFacts2["MayNeedImmediatelyInvokedFunctionExpression"] = 7] = "MayNeedImmediatelyInvokedFunctionExpression";
      ClassFacts2[ClassFacts2["IsExported"] = 56] = "IsExported";
    })(ClassFacts || (ClassFacts = {}));
    function transformTypeScript(context) {
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory, startLexicalEnvironment = context.startLexicalEnvironment, resumeLexicalEnvironment = context.resumeLexicalEnvironment, endLexicalEnvironment = context.endLexicalEnvironment, hoistVariableDeclaration = context.hoistVariableDeclaration;
      var resolver = context.getEmitResolver();
      var compilerOptions = context.getCompilerOptions();
      var strictNullChecks = ts2.getStrictOptionValue(compilerOptions, "strictNullChecks");
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var moduleKind = ts2.getEmitModuleKind(compilerOptions);
      var previousOnEmitNode = context.onEmitNode;
      var previousOnSubstituteNode = context.onSubstituteNode;
      context.onEmitNode = onEmitNode;
      context.onSubstituteNode = onSubstituteNode;
      context.enableSubstitution(205);
      context.enableSubstitution(206);
      var currentSourceFile;
      var currentNamespace;
      var currentNamespaceContainerName;
      var currentLexicalScope;
      var currentNameScope;
      var currentScopeFirstDeclarationsOfName;
      var currentClassHasParameterProperties;
      var enabledSubstitutions;
      var classAliases;
      var applicableSubstitutions;
      return transformSourceFileOrBundle;
      function transformSourceFileOrBundle(node) {
        if (node.kind === 304) {
          return transformBundle(node);
        }
        return transformSourceFile(node);
      }
      function transformBundle(node) {
        return factory.createBundle(node.sourceFiles.map(transformSourceFile), ts2.mapDefined(node.prepends, function(prepend) {
          if (prepend.kind === 306) {
            return ts2.createUnparsedSourceFile(prepend, "js");
          }
          return prepend;
        }));
      }
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        currentSourceFile = node;
        var visited = saveStateAndInvoke(node, visitSourceFile);
        ts2.addEmitHelpers(visited, context.readEmitHelpers());
        currentSourceFile = void 0;
        return visited;
      }
      function saveStateAndInvoke(node, f) {
        var savedCurrentScope = currentLexicalScope;
        var savedCurrentNameScope = currentNameScope;
        var savedCurrentScopeFirstDeclarationsOfName = currentScopeFirstDeclarationsOfName;
        var savedCurrentClassHasParameterProperties = currentClassHasParameterProperties;
        onBeforeVisitNode(node);
        var visited = f(node);
        if (currentLexicalScope !== savedCurrentScope) {
          currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName;
        }
        currentLexicalScope = savedCurrentScope;
        currentNameScope = savedCurrentNameScope;
        currentClassHasParameterProperties = savedCurrentClassHasParameterProperties;
        return visited;
      }
      function onBeforeVisitNode(node) {
        switch (node.kind) {
          case 303:
          case 262:
          case 261:
          case 234:
            currentLexicalScope = node;
            currentNameScope = void 0;
            currentScopeFirstDeclarationsOfName = void 0;
            break;
          case 256:
          case 255:
            if (ts2.hasSyntacticModifier(node, 2)) {
              break;
            }
            if (node.name) {
              recordEmittedDeclarationInScope(node);
            } else {
              ts2.Debug.assert(node.kind === 256 || ts2.hasSyntacticModifier(node, 512));
            }
            if (ts2.isClassDeclaration(node)) {
              currentNameScope = node;
            }
            break;
        }
      }
      function visitor(node) {
        return saveStateAndInvoke(node, visitorWorker);
      }
      function visitorWorker(node) {
        if (node.transformFlags & 1) {
          return visitTypeScript(node);
        }
        return node;
      }
      function sourceElementVisitor(node) {
        return saveStateAndInvoke(node, sourceElementVisitorWorker);
      }
      function sourceElementVisitorWorker(node) {
        switch (node.kind) {
          case 265:
          case 264:
          case 270:
          case 271:
            return visitElidableStatement(node);
          default:
            return visitorWorker(node);
        }
      }
      function visitElidableStatement(node) {
        var parsed = ts2.getParseTreeNode(node);
        if (parsed !== node) {
          if (node.transformFlags & 1) {
            return ts2.visitEachChild(node, visitor, context);
          }
          return node;
        }
        switch (node.kind) {
          case 265:
            return visitImportDeclaration(node);
          case 264:
            return visitImportEqualsDeclaration(node);
          case 270:
            return visitExportAssignment(node);
          case 271:
            return visitExportDeclaration(node);
          default:
            ts2.Debug.fail("Unhandled ellided statement");
        }
      }
      function namespaceElementVisitor(node) {
        return saveStateAndInvoke(node, namespaceElementVisitorWorker);
      }
      function namespaceElementVisitorWorker(node) {
        if (node.kind === 271 || node.kind === 265 || node.kind === 266 || node.kind === 264 && node.moduleReference.kind === 276) {
          return void 0;
        } else if (node.transformFlags & 1 || ts2.hasSyntacticModifier(node, 1)) {
          return visitTypeScript(node);
        }
        return node;
      }
      function classElementVisitor(node) {
        return saveStateAndInvoke(node, classElementVisitorWorker);
      }
      function classElementVisitorWorker(node) {
        switch (node.kind) {
          case 170:
            return visitConstructor(node);
          case 166:
            return visitPropertyDeclaration(node);
          case 175:
          case 171:
          case 172:
          case 168:
          case 169:
            return visitorWorker(node);
          case 233:
            return node;
          default:
            return ts2.Debug.failBadSyntaxKind(node);
        }
      }
      function modifierVisitor(node) {
        if (ts2.modifierToFlag(node.kind) & 18654) {
          return void 0;
        } else if (currentNamespace && node.kind === 93) {
          return void 0;
        }
        return node;
      }
      function visitTypeScript(node) {
        if (ts2.isStatement(node) && ts2.hasSyntacticModifier(node, 2)) {
          return factory.createNotEmittedStatement(node);
        }
        switch (node.kind) {
          case 93:
          case 88:
            return currentNamespace ? void 0 : node;
          case 123:
          case 121:
          case 122:
          case 126:
          case 158:
          case 85:
          case 135:
          case 144:
          case 182:
          case 183:
          case 184:
          case 185:
          case 181:
          case 176:
          case 162:
          case 130:
          case 154:
          case 133:
          case 149:
          case 146:
          case 143:
          case 114:
          case 150:
          case 179:
          case 178:
          case 180:
          case 177:
          case 186:
          case 187:
          case 188:
          case 190:
          case 191:
          case 192:
          case 193:
          case 194:
          case 195:
          case 175:
          case 164:
            return void 0;
          case 258:
            return factory.createNotEmittedStatement(node);
          case 166:
            return visitPropertyDeclaration(node);
          case 263:
            return void 0;
          case 170:
            return visitConstructor(node);
          case 257:
            return factory.createNotEmittedStatement(node);
          case 256:
            return visitClassDeclaration(node);
          case 225:
            return visitClassExpression(node);
          case 290:
            return visitHeritageClause(node);
          case 227:
            return visitExpressionWithTypeArguments(node);
          case 168:
            return visitMethodDeclaration(node);
          case 171:
            return visitGetAccessor(node);
          case 172:
            return visitSetAccessor(node);
          case 255:
            return visitFunctionDeclaration(node);
          case 212:
            return visitFunctionExpression(node);
          case 213:
            return visitArrowFunction(node);
          case 163:
            return visitParameter(node);
          case 211:
            return visitParenthesizedExpression(node);
          case 210:
          case 228:
            return visitAssertionExpression(node);
          case 207:
            return visitCallExpression(node);
          case 208:
            return visitNewExpression(node);
          case 209:
            return visitTaggedTemplateExpression(node);
          case 229:
            return visitNonNullExpression(node);
          case 259:
            return visitEnumDeclaration(node);
          case 236:
            return visitVariableStatement(node);
          case 253:
            return visitVariableDeclaration(node);
          case 260:
            return visitModuleDeclaration(node);
          case 264:
            return visitImportEqualsDeclaration(node);
          case 278:
            return visitJsxSelfClosingElement(node);
          case 279:
            return visitJsxJsxOpeningElement(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitSourceFile(node) {
        var alwaysStrict = ts2.getStrictOptionValue(compilerOptions, "alwaysStrict") && !(ts2.isExternalModule(node) && moduleKind >= ts2.ModuleKind.ES2015) && !ts2.isJsonSourceFile(node);
        return factory.updateSourceFile(node, ts2.visitLexicalEnvironment(node.statements, sourceElementVisitor, context, 0, alwaysStrict));
      }
      function getClassFacts(node, staticProperties) {
        var facts = 0;
        if (ts2.some(staticProperties))
          facts |= 1;
        var extendsClauseElement = ts2.getEffectiveBaseTypeNode(node);
        if (extendsClauseElement && ts2.skipOuterExpressions(extendsClauseElement.expression).kind !== 104)
          facts |= 64;
        if (ts2.classOrConstructorParameterIsDecorated(node))
          facts |= 2;
        if (ts2.childIsDecorated(node))
          facts |= 4;
        if (isExportOfNamespace(node))
          facts |= 8;
        else if (isDefaultExternalModuleExport(node))
          facts |= 32;
        else if (isNamedExternalModuleExport(node))
          facts |= 16;
        if (languageVersion <= 1 && facts & 7)
          facts |= 128;
        return facts;
      }
      function hasTypeScriptClassSyntax(node) {
        return !!(node.transformFlags & 4096);
      }
      function isClassLikeDeclarationWithTypeScriptSyntax(node) {
        return ts2.some(node.decorators) || ts2.some(node.typeParameters) || ts2.some(node.heritageClauses, hasTypeScriptClassSyntax) || ts2.some(node.members, hasTypeScriptClassSyntax);
      }
      function visitClassDeclaration(node) {
        if (!isClassLikeDeclarationWithTypeScriptSyntax(node) && !(currentNamespace && ts2.hasSyntacticModifier(node, 1))) {
          return ts2.visitEachChild(node, visitor, context);
        }
        var staticProperties = ts2.getProperties(node, true, true);
        var facts = getClassFacts(node, staticProperties);
        if (facts & 128) {
          context.startLexicalEnvironment();
        }
        var name = node.name || (facts & 5 ? factory.getGeneratedNameForNode(node) : void 0);
        var classStatement = facts & 2 ? createClassDeclarationHeadWithDecorators(node, name) : createClassDeclarationHeadWithoutDecorators(node, name, facts);
        var statements = [classStatement];
        addClassElementDecorationStatements(statements, node, false);
        addClassElementDecorationStatements(statements, node, true);
        addConstructorDecorationStatement(statements, node);
        if (facts & 128) {
          var closingBraceLocation = ts2.createTokenRange(ts2.skipTrivia(currentSourceFile.text, node.members.end), 19);
          var localName = factory.getInternalName(node);
          var outer = factory.createPartiallyEmittedExpression(localName);
          ts2.setTextRangeEnd(outer, closingBraceLocation.end);
          ts2.setEmitFlags(outer, 1536);
          var statement = factory.createReturnStatement(outer);
          ts2.setTextRangePos(statement, closingBraceLocation.pos);
          ts2.setEmitFlags(statement, 1536 | 384);
          statements.push(statement);
          ts2.insertStatementsAfterStandardPrologue(statements, context.endLexicalEnvironment());
          var iife = factory.createImmediatelyInvokedArrowFunction(statements);
          ts2.setEmitFlags(iife, 33554432);
          var varStatement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
            factory.createVariableDeclaration(factory.getLocalName(node, false, false), void 0, void 0, iife)
          ]));
          ts2.setOriginalNode(varStatement, node);
          ts2.setCommentRange(varStatement, node);
          ts2.setSourceMapRange(varStatement, ts2.moveRangePastDecorators(node));
          ts2.startOnNewLine(varStatement);
          statements = [varStatement];
        }
        if (facts & 8) {
          addExportMemberAssignment(statements, node);
        } else if (facts & 128 || facts & 2) {
          if (facts & 32) {
            statements.push(factory.createExportDefault(factory.getLocalName(node, false, true)));
          } else if (facts & 16) {
            statements.push(factory.createExternalModuleExport(factory.getLocalName(node, false, true)));
          }
        }
        if (statements.length > 1) {
          statements.push(factory.createEndOfDeclarationMarker(node));
          ts2.setEmitFlags(classStatement, ts2.getEmitFlags(classStatement) | 4194304);
        }
        return ts2.singleOrMany(statements);
      }
      function createClassDeclarationHeadWithoutDecorators(node, name, facts) {
        var modifiers = !(facts & 128) ? ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier) : void 0;
        var classDeclaration = factory.createClassDeclaration(void 0, modifiers, name, void 0, ts2.visitNodes(node.heritageClauses, visitor, ts2.isHeritageClause), transformClassMembers(node));
        var emitFlags = ts2.getEmitFlags(node);
        if (facts & 1) {
          emitFlags |= 32;
        }
        ts2.setTextRange(classDeclaration, node);
        ts2.setOriginalNode(classDeclaration, node);
        ts2.setEmitFlags(classDeclaration, emitFlags);
        return classDeclaration;
      }
      function createClassDeclarationHeadWithDecorators(node, name) {
        var location = ts2.moveRangePastDecorators(node);
        var classAlias = getClassAliasIfNeeded(node);
        var declName = languageVersion <= 2 ? factory.getInternalName(node, false, true) : factory.getLocalName(node, false, true);
        var heritageClauses = ts2.visitNodes(node.heritageClauses, visitor, ts2.isHeritageClause);
        var members = transformClassMembers(node);
        var classExpression = factory.createClassExpression(void 0, void 0, name, void 0, heritageClauses, members);
        ts2.setOriginalNode(classExpression, node);
        ts2.setTextRange(classExpression, location);
        var statement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
          factory.createVariableDeclaration(declName, void 0, void 0, classAlias ? factory.createAssignment(classAlias, classExpression) : classExpression)
        ], 1));
        ts2.setOriginalNode(statement, node);
        ts2.setTextRange(statement, location);
        ts2.setCommentRange(statement, node);
        return statement;
      }
      function visitClassExpression(node) {
        if (!isClassLikeDeclarationWithTypeScriptSyntax(node)) {
          return ts2.visitEachChild(node, visitor, context);
        }
        var classExpression = factory.createClassExpression(void 0, void 0, node.name, void 0, ts2.visitNodes(node.heritageClauses, visitor, ts2.isHeritageClause), transformClassMembers(node));
        ts2.setOriginalNode(classExpression, node);
        ts2.setTextRange(classExpression, node);
        return classExpression;
      }
      function transformClassMembers(node) {
        var members = [];
        var constructor = ts2.getFirstConstructorWithBody(node);
        var parametersWithPropertyAssignments = constructor && ts2.filter(constructor.parameters, function(p) {
          return ts2.isParameterPropertyDeclaration(p, constructor);
        });
        if (parametersWithPropertyAssignments) {
          for (var _i = 0, parametersWithPropertyAssignments_1 = parametersWithPropertyAssignments; _i < parametersWithPropertyAssignments_1.length; _i++) {
            var parameter = parametersWithPropertyAssignments_1[_i];
            if (ts2.isIdentifier(parameter.name)) {
              members.push(ts2.setOriginalNode(factory.createPropertyDeclaration(void 0, void 0, parameter.name, void 0, void 0, void 0), parameter));
            }
          }
        }
        ts2.addRange(members, ts2.visitNodes(node.members, classElementVisitor, ts2.isClassElement));
        return ts2.setTextRange(factory.createNodeArray(members), node.members);
      }
      function getDecoratedClassElements(node, isStatic) {
        return ts2.filter(node.members, isStatic ? function(m) {
          return isStaticDecoratedClassElement(m, node);
        } : function(m) {
          return isInstanceDecoratedClassElement(m, node);
        });
      }
      function isStaticDecoratedClassElement(member, parent) {
        return isDecoratedClassElement(member, true, parent);
      }
      function isInstanceDecoratedClassElement(member, parent) {
        return isDecoratedClassElement(member, false, parent);
      }
      function isDecoratedClassElement(member, isStaticElement, parent) {
        return ts2.nodeOrChildIsDecorated(member, parent) && isStaticElement === ts2.isStatic(member);
      }
      function getDecoratorsOfParameters(node) {
        var decorators;
        if (node) {
          var parameters = node.parameters;
          var firstParameterIsThis = parameters.length > 0 && ts2.parameterIsThisKeyword(parameters[0]);
          var firstParameterOffset = firstParameterIsThis ? 1 : 0;
          var numParameters = firstParameterIsThis ? parameters.length - 1 : parameters.length;
          for (var i = 0; i < numParameters; i++) {
            var parameter = parameters[i + firstParameterOffset];
            if (decorators || parameter.decorators) {
              if (!decorators) {
                decorators = new Array(numParameters);
              }
              decorators[i] = parameter.decorators;
            }
          }
        }
        return decorators;
      }
      function getAllDecoratorsOfConstructor(node) {
        var decorators = node.decorators;
        var parameters = getDecoratorsOfParameters(ts2.getFirstConstructorWithBody(node));
        if (!decorators && !parameters) {
          return void 0;
        }
        return {
          decorators,
          parameters
        };
      }
      function getAllDecoratorsOfClassElement(node, member) {
        switch (member.kind) {
          case 171:
          case 172:
            return getAllDecoratorsOfAccessors(node, member);
          case 168:
            return getAllDecoratorsOfMethod(member);
          case 166:
            return getAllDecoratorsOfProperty(member);
          default:
            return void 0;
        }
      }
      function getAllDecoratorsOfAccessors(node, accessor) {
        if (!accessor.body) {
          return void 0;
        }
        var _a = ts2.getAllAccessorDeclarations(node.members, accessor), firstAccessor = _a.firstAccessor, secondAccessor = _a.secondAccessor, setAccessor = _a.setAccessor;
        var firstAccessorWithDecorators = firstAccessor.decorators ? firstAccessor : secondAccessor && secondAccessor.decorators ? secondAccessor : void 0;
        if (!firstAccessorWithDecorators || accessor !== firstAccessorWithDecorators) {
          return void 0;
        }
        var decorators = firstAccessorWithDecorators.decorators;
        var parameters = getDecoratorsOfParameters(setAccessor);
        if (!decorators && !parameters) {
          return void 0;
        }
        return { decorators, parameters };
      }
      function getAllDecoratorsOfMethod(method) {
        if (!method.body) {
          return void 0;
        }
        var decorators = method.decorators;
        var parameters = getDecoratorsOfParameters(method);
        if (!decorators && !parameters) {
          return void 0;
        }
        return { decorators, parameters };
      }
      function getAllDecoratorsOfProperty(property) {
        var decorators = property.decorators;
        if (!decorators) {
          return void 0;
        }
        return { decorators };
      }
      function transformAllDecoratorsOfDeclaration(node, container, allDecorators) {
        if (!allDecorators) {
          return void 0;
        }
        var decoratorExpressions = [];
        ts2.addRange(decoratorExpressions, ts2.map(allDecorators.decorators, transformDecorator));
        ts2.addRange(decoratorExpressions, ts2.flatMap(allDecorators.parameters, transformDecoratorsOfParameter));
        addTypeMetadata(node, container, decoratorExpressions);
        return decoratorExpressions;
      }
      function addClassElementDecorationStatements(statements, node, isStatic) {
        ts2.addRange(statements, ts2.map(generateClassElementDecorationExpressions(node, isStatic), expressionToStatement));
      }
      function generateClassElementDecorationExpressions(node, isStatic) {
        var members = getDecoratedClassElements(node, isStatic);
        var expressions;
        for (var _i = 0, members_6 = members; _i < members_6.length; _i++) {
          var member = members_6[_i];
          var expression = generateClassElementDecorationExpression(node, member);
          if (expression) {
            if (!expressions) {
              expressions = [expression];
            } else {
              expressions.push(expression);
            }
          }
        }
        return expressions;
      }
      function generateClassElementDecorationExpression(node, member) {
        var allDecorators = getAllDecoratorsOfClassElement(node, member);
        var decoratorExpressions = transformAllDecoratorsOfDeclaration(member, node, allDecorators);
        if (!decoratorExpressions) {
          return void 0;
        }
        var prefix = getClassMemberPrefix(node, member);
        var memberName = getExpressionForPropertyName(member, true);
        var descriptor = languageVersion > 0 ? member.kind === 166 ? factory.createVoidZero() : factory.createNull() : void 0;
        var helper = emitHelpers().createDecorateHelper(decoratorExpressions, prefix, memberName, descriptor);
        ts2.setTextRange(helper, ts2.moveRangePastDecorators(member));
        ts2.setEmitFlags(helper, 1536);
        return helper;
      }
      function addConstructorDecorationStatement(statements, node) {
        var expression = generateConstructorDecorationExpression(node);
        if (expression) {
          statements.push(ts2.setOriginalNode(factory.createExpressionStatement(expression), node));
        }
      }
      function generateConstructorDecorationExpression(node) {
        var allDecorators = getAllDecoratorsOfConstructor(node);
        var decoratorExpressions = transformAllDecoratorsOfDeclaration(node, node, allDecorators);
        if (!decoratorExpressions) {
          return void 0;
        }
        var classAlias = classAliases && classAliases[ts2.getOriginalNodeId(node)];
        var localName = languageVersion <= 2 ? factory.getInternalName(node, false, true) : factory.getLocalName(node, false, true);
        var decorate = emitHelpers().createDecorateHelper(decoratorExpressions, localName);
        var expression = factory.createAssignment(localName, classAlias ? factory.createAssignment(classAlias, decorate) : decorate);
        ts2.setEmitFlags(expression, 1536);
        ts2.setSourceMapRange(expression, ts2.moveRangePastDecorators(node));
        return expression;
      }
      function transformDecorator(decorator) {
        return ts2.visitNode(decorator.expression, visitor, ts2.isExpression);
      }
      function transformDecoratorsOfParameter(decorators, parameterOffset) {
        var expressions;
        if (decorators) {
          expressions = [];
          for (var _i = 0, decorators_1 = decorators; _i < decorators_1.length; _i++) {
            var decorator = decorators_1[_i];
            var helper = emitHelpers().createParamHelper(transformDecorator(decorator), parameterOffset);
            ts2.setTextRange(helper, decorator.expression);
            ts2.setEmitFlags(helper, 1536);
            expressions.push(helper);
          }
        }
        return expressions;
      }
      function addTypeMetadata(node, container, decoratorExpressions) {
        if (USE_NEW_TYPE_METADATA_FORMAT) {
          addNewTypeMetadata(node, container, decoratorExpressions);
        } else {
          addOldTypeMetadata(node, container, decoratorExpressions);
        }
      }
      function addOldTypeMetadata(node, container, decoratorExpressions) {
        if (compilerOptions.emitDecoratorMetadata) {
          if (shouldAddTypeMetadata(node)) {
            decoratorExpressions.push(emitHelpers().createMetadataHelper("design:type", serializeTypeOfNode(node)));
          }
          if (shouldAddParamTypesMetadata(node)) {
            decoratorExpressions.push(emitHelpers().createMetadataHelper("design:paramtypes", serializeParameterTypesOfNode(node, container)));
          }
          if (shouldAddReturnTypeMetadata(node)) {
            decoratorExpressions.push(emitHelpers().createMetadataHelper("design:returntype", serializeReturnTypeOfNode(node)));
          }
        }
      }
      function addNewTypeMetadata(node, container, decoratorExpressions) {
        if (compilerOptions.emitDecoratorMetadata) {
          var properties = void 0;
          if (shouldAddTypeMetadata(node)) {
            (properties || (properties = [])).push(factory.createPropertyAssignment("type", factory.createArrowFunction(void 0, void 0, [], void 0, factory.createToken(38), serializeTypeOfNode(node))));
          }
          if (shouldAddParamTypesMetadata(node)) {
            (properties || (properties = [])).push(factory.createPropertyAssignment("paramTypes", factory.createArrowFunction(void 0, void 0, [], void 0, factory.createToken(38), serializeParameterTypesOfNode(node, container))));
          }
          if (shouldAddReturnTypeMetadata(node)) {
            (properties || (properties = [])).push(factory.createPropertyAssignment("returnType", factory.createArrowFunction(void 0, void 0, [], void 0, factory.createToken(38), serializeReturnTypeOfNode(node))));
          }
          if (properties) {
            decoratorExpressions.push(emitHelpers().createMetadataHelper("design:typeinfo", factory.createObjectLiteralExpression(properties, true)));
          }
        }
      }
      function shouldAddTypeMetadata(node) {
        var kind = node.kind;
        return kind === 168 || kind === 171 || kind === 172 || kind === 166;
      }
      function shouldAddReturnTypeMetadata(node) {
        return node.kind === 168;
      }
      function shouldAddParamTypesMetadata(node) {
        switch (node.kind) {
          case 256:
          case 225:
            return ts2.getFirstConstructorWithBody(node) !== void 0;
          case 168:
          case 171:
          case 172:
            return true;
        }
        return false;
      }
      function getAccessorTypeNode(node) {
        var accessors = resolver.getAllAccessorDeclarations(node);
        return accessors.setAccessor && ts2.getSetAccessorTypeAnnotationNode(accessors.setAccessor) || accessors.getAccessor && ts2.getEffectiveReturnTypeNode(accessors.getAccessor);
      }
      function serializeTypeOfNode(node) {
        switch (node.kind) {
          case 166:
          case 163:
            return serializeTypeNode(node.type);
          case 172:
          case 171:
            return serializeTypeNode(getAccessorTypeNode(node));
          case 256:
          case 225:
          case 168:
            return factory.createIdentifier("Function");
          default:
            return factory.createVoidZero();
        }
      }
      function serializeParameterTypesOfNode(node, container) {
        var valueDeclaration = ts2.isClassLike(node) ? ts2.getFirstConstructorWithBody(node) : ts2.isFunctionLike(node) && ts2.nodeIsPresent(node.body) ? node : void 0;
        var expressions = [];
        if (valueDeclaration) {
          var parameters = getParametersOfDecoratedDeclaration(valueDeclaration, container);
          var numParameters = parameters.length;
          for (var i = 0; i < numParameters; i++) {
            var parameter = parameters[i];
            if (i === 0 && ts2.isIdentifier(parameter.name) && parameter.name.escapedText === "this") {
              continue;
            }
            if (parameter.dotDotDotToken) {
              expressions.push(serializeTypeNode(ts2.getRestParameterElementType(parameter.type)));
            } else {
              expressions.push(serializeTypeOfNode(parameter));
            }
          }
        }
        return factory.createArrayLiteralExpression(expressions);
      }
      function getParametersOfDecoratedDeclaration(node, container) {
        if (container && node.kind === 171) {
          var setAccessor = ts2.getAllAccessorDeclarations(container.members, node).setAccessor;
          if (setAccessor) {
            return setAccessor.parameters;
          }
        }
        return node.parameters;
      }
      function serializeReturnTypeOfNode(node) {
        if (ts2.isFunctionLike(node) && node.type) {
          return serializeTypeNode(node.type);
        } else if (ts2.isAsyncFunction(node)) {
          return factory.createIdentifier("Promise");
        }
        return factory.createVoidZero();
      }
      function serializeTypeNode(node) {
        if (node === void 0) {
          return factory.createIdentifier("Object");
        }
        switch (node.kind) {
          case 114:
          case 152:
          case 143:
            return factory.createVoidZero();
          case 190:
            return serializeTypeNode(node.type);
          case 178:
          case 179:
            return factory.createIdentifier("Function");
          case 182:
          case 183:
            return factory.createIdentifier("Array");
          case 176:
          case 133:
            return factory.createIdentifier("Boolean");
          case 149:
            return factory.createIdentifier("String");
          case 147:
            return factory.createIdentifier("Object");
          case 195:
            switch (node.literal.kind) {
              case 10:
              case 14:
                return factory.createIdentifier("String");
              case 218:
              case 8:
                return factory.createIdentifier("Number");
              case 9:
                return getGlobalBigIntNameWithFallback();
              case 110:
              case 95:
                return factory.createIdentifier("Boolean");
              case 104:
                return factory.createVoidZero();
              default:
                return ts2.Debug.failBadSyntaxKind(node.literal);
            }
          case 146:
            return factory.createIdentifier("Number");
          case 157:
            return getGlobalBigIntNameWithFallback();
          case 150:
            return languageVersion < 2 ? getGlobalSymbolNameWithFallback() : factory.createIdentifier("Symbol");
          case 177:
            return serializeTypeReferenceNode(node);
          case 187:
          case 186:
            return serializeTypeList(node.types);
          case 188:
            return serializeTypeList([node.trueType, node.falseType]);
          case 192:
            if (node.operator === 144) {
              return serializeTypeNode(node.type);
            }
            break;
          case 180:
          case 193:
          case 194:
          case 181:
          case 130:
          case 154:
          case 191:
          case 199:
            break;
          case 310:
          case 311:
          case 315:
          case 316:
          case 317:
            break;
          case 312:
          case 313:
          case 314:
            return serializeTypeNode(node.type);
          default:
            return ts2.Debug.failBadSyntaxKind(node);
        }
        return factory.createIdentifier("Object");
      }
      function serializeTypeList(types) {
        var serializedUnion;
        for (var _i = 0, types_23 = types; _i < types_23.length; _i++) {
          var typeNode = types_23[_i];
          while (typeNode.kind === 190) {
            typeNode = typeNode.type;
          }
          if (typeNode.kind === 143) {
            continue;
          }
          if (!strictNullChecks && (typeNode.kind === 195 && typeNode.literal.kind === 104 || typeNode.kind === 152)) {
            continue;
          }
          var serializedIndividual = serializeTypeNode(typeNode);
          if (ts2.isIdentifier(serializedIndividual) && serializedIndividual.escapedText === "Object") {
            return serializedIndividual;
          } else if (serializedUnion) {
            if (!ts2.isIdentifier(serializedUnion) || !ts2.isIdentifier(serializedIndividual) || serializedUnion.escapedText !== serializedIndividual.escapedText) {
              return factory.createIdentifier("Object");
            }
          } else {
            serializedUnion = serializedIndividual;
          }
        }
        return serializedUnion || factory.createVoidZero();
      }
      function serializeTypeReferenceNode(node) {
        var kind = resolver.getTypeReferenceSerializationKind(node.typeName, currentNameScope || currentLexicalScope);
        switch (kind) {
          case ts2.TypeReferenceSerializationKind.Unknown:
            if (ts2.findAncestor(node, function(n) {
              return n.parent && ts2.isConditionalTypeNode(n.parent) && (n.parent.trueType === n || n.parent.falseType === n);
            })) {
              return factory.createIdentifier("Object");
            }
            var serialized = serializeEntityNameAsExpressionFallback(node.typeName);
            var temp = factory.createTempVariable(hoistVariableDeclaration);
            return factory.createConditionalExpression(factory.createTypeCheck(factory.createAssignment(temp, serialized), "function"), void 0, temp, void 0, factory.createIdentifier("Object"));
          case ts2.TypeReferenceSerializationKind.TypeWithConstructSignatureAndValue:
            return serializeEntityNameAsExpression(node.typeName);
          case ts2.TypeReferenceSerializationKind.VoidNullableOrNeverType:
            return factory.createVoidZero();
          case ts2.TypeReferenceSerializationKind.BigIntLikeType:
            return getGlobalBigIntNameWithFallback();
          case ts2.TypeReferenceSerializationKind.BooleanType:
            return factory.createIdentifier("Boolean");
          case ts2.TypeReferenceSerializationKind.NumberLikeType:
            return factory.createIdentifier("Number");
          case ts2.TypeReferenceSerializationKind.StringLikeType:
            return factory.createIdentifier("String");
          case ts2.TypeReferenceSerializationKind.ArrayLikeType:
            return factory.createIdentifier("Array");
          case ts2.TypeReferenceSerializationKind.ESSymbolType:
            return languageVersion < 2 ? getGlobalSymbolNameWithFallback() : factory.createIdentifier("Symbol");
          case ts2.TypeReferenceSerializationKind.TypeWithCallSignature:
            return factory.createIdentifier("Function");
          case ts2.TypeReferenceSerializationKind.Promise:
            return factory.createIdentifier("Promise");
          case ts2.TypeReferenceSerializationKind.ObjectType:
            return factory.createIdentifier("Object");
          default:
            return ts2.Debug.assertNever(kind);
        }
      }
      function createCheckedValue(left, right) {
        return factory.createLogicalAnd(factory.createStrictInequality(factory.createTypeOfExpression(left), factory.createStringLiteral("undefined")), right);
      }
      function serializeEntityNameAsExpressionFallback(node) {
        if (node.kind === 79) {
          var copied = serializeEntityNameAsExpression(node);
          return createCheckedValue(copied, copied);
        }
        if (node.left.kind === 79) {
          return createCheckedValue(serializeEntityNameAsExpression(node.left), serializeEntityNameAsExpression(node));
        }
        var left = serializeEntityNameAsExpressionFallback(node.left);
        var temp = factory.createTempVariable(hoistVariableDeclaration);
        return factory.createLogicalAnd(factory.createLogicalAnd(left.left, factory.createStrictInequality(factory.createAssignment(temp, left.right), factory.createVoidZero())), factory.createPropertyAccessExpression(temp, node.right));
      }
      function serializeEntityNameAsExpression(node) {
        switch (node.kind) {
          case 79:
            var name = ts2.setParent(ts2.setTextRange(ts2.parseNodeFactory.cloneNode(node), node), node.parent);
            name.original = void 0;
            ts2.setParent(name, ts2.getParseTreeNode(currentLexicalScope));
            return name;
          case 160:
            return serializeQualifiedNameAsExpression(node);
        }
      }
      function serializeQualifiedNameAsExpression(node) {
        return factory.createPropertyAccessExpression(serializeEntityNameAsExpression(node.left), node.right);
      }
      function getGlobalSymbolNameWithFallback() {
        return factory.createConditionalExpression(factory.createTypeCheck(factory.createIdentifier("Symbol"), "function"), void 0, factory.createIdentifier("Symbol"), void 0, factory.createIdentifier("Object"));
      }
      function getGlobalBigIntNameWithFallback() {
        return languageVersion < 99 ? factory.createConditionalExpression(factory.createTypeCheck(factory.createIdentifier("BigInt"), "function"), void 0, factory.createIdentifier("BigInt"), void 0, factory.createIdentifier("Object")) : factory.createIdentifier("BigInt");
      }
      function getExpressionForPropertyName(member, generateNameForComputedPropertyName) {
        var name = member.name;
        if (ts2.isPrivateIdentifier(name)) {
          return factory.createIdentifier("");
        } else if (ts2.isComputedPropertyName(name)) {
          return generateNameForComputedPropertyName && !ts2.isSimpleInlineableExpression(name.expression) ? factory.getGeneratedNameForNode(name) : name.expression;
        } else if (ts2.isIdentifier(name)) {
          return factory.createStringLiteral(ts2.idText(name));
        } else {
          return factory.cloneNode(name);
        }
      }
      function visitPropertyNameOfClassElement(member) {
        var name = member.name;
        if (ts2.isComputedPropertyName(name) && (!ts2.hasStaticModifier(member) && currentClassHasParameterProperties || ts2.some(member.decorators))) {
          var expression = ts2.visitNode(name.expression, visitor, ts2.isExpression);
          var innerExpression = ts2.skipPartiallyEmittedExpressions(expression);
          if (!ts2.isSimpleInlineableExpression(innerExpression)) {
            var generatedName = factory.getGeneratedNameForNode(name);
            hoistVariableDeclaration(generatedName);
            return factory.updateComputedPropertyName(name, factory.createAssignment(generatedName, expression));
          }
        }
        return ts2.visitNode(name, visitor, ts2.isPropertyName);
      }
      function visitHeritageClause(node) {
        if (node.token === 117) {
          return void 0;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitExpressionWithTypeArguments(node) {
        return factory.updateExpressionWithTypeArguments(node, ts2.visitNode(node.expression, visitor, ts2.isLeftHandSideExpression), void 0);
      }
      function shouldEmitFunctionLikeDeclaration(node) {
        return !ts2.nodeIsMissing(node.body);
      }
      function visitPropertyDeclaration(node) {
        if (node.flags & 8388608 || ts2.hasSyntacticModifier(node, 128)) {
          return void 0;
        }
        var updated = factory.updatePropertyDeclaration(node, void 0, ts2.visitNodes(node.modifiers, visitor, ts2.isModifier), visitPropertyNameOfClassElement(node), void 0, void 0, ts2.visitNode(node.initializer, visitor));
        if (updated !== node) {
          ts2.setCommentRange(updated, node);
          ts2.setSourceMapRange(updated, ts2.moveRangePastDecorators(node));
        }
        return updated;
      }
      function visitConstructor(node) {
        if (!shouldEmitFunctionLikeDeclaration(node)) {
          return void 0;
        }
        return factory.updateConstructorDeclaration(node, void 0, void 0, ts2.visitParameterList(node.parameters, visitor, context), transformConstructorBody(node.body, node));
      }
      function transformConstructorBody(body, constructor) {
        var parametersWithPropertyAssignments = constructor && ts2.filter(constructor.parameters, function(p) {
          return ts2.isParameterPropertyDeclaration(p, constructor);
        });
        if (!ts2.some(parametersWithPropertyAssignments)) {
          return ts2.visitFunctionBody(body, visitor, context);
        }
        var statements = [];
        var indexOfFirstStatement = 0;
        resumeLexicalEnvironment();
        indexOfFirstStatement = ts2.addPrologueDirectivesAndInitialSuperCall(factory, constructor, statements, visitor);
        ts2.addRange(statements, ts2.map(parametersWithPropertyAssignments, transformParameterWithPropertyAssignment));
        ts2.addRange(statements, ts2.visitNodes(body.statements, visitor, ts2.isStatement, indexOfFirstStatement));
        statements = factory.mergeLexicalEnvironment(statements, endLexicalEnvironment());
        var block = factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), body.statements), true);
        ts2.setTextRange(block, body);
        ts2.setOriginalNode(block, body);
        return block;
      }
      function transformParameterWithPropertyAssignment(node) {
        var name = node.name;
        if (!ts2.isIdentifier(name)) {
          return void 0;
        }
        var propertyName = ts2.setParent(ts2.setTextRange(factory.cloneNode(name), name), name.parent);
        ts2.setEmitFlags(propertyName, 1536 | 48);
        var localName = ts2.setParent(ts2.setTextRange(factory.cloneNode(name), name), name.parent);
        ts2.setEmitFlags(localName, 1536);
        return ts2.startOnNewLine(ts2.removeAllComments(ts2.setTextRange(ts2.setOriginalNode(factory.createExpressionStatement(factory.createAssignment(ts2.setTextRange(factory.createPropertyAccessExpression(factory.createThis(), propertyName), node.name), localName)), node), ts2.moveRangePos(node, -1))));
      }
      function visitMethodDeclaration(node) {
        if (!shouldEmitFunctionLikeDeclaration(node)) {
          return void 0;
        }
        var updated = factory.updateMethodDeclaration(node, void 0, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), node.asteriskToken, visitPropertyNameOfClassElement(node), void 0, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, ts2.visitFunctionBody(node.body, visitor, context));
        if (updated !== node) {
          ts2.setCommentRange(updated, node);
          ts2.setSourceMapRange(updated, ts2.moveRangePastDecorators(node));
        }
        return updated;
      }
      function shouldEmitAccessorDeclaration(node) {
        return !(ts2.nodeIsMissing(node.body) && ts2.hasSyntacticModifier(node, 128));
      }
      function visitGetAccessor(node) {
        if (!shouldEmitAccessorDeclaration(node)) {
          return void 0;
        }
        var updated = factory.updateGetAccessorDeclaration(node, void 0, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), visitPropertyNameOfClassElement(node), ts2.visitParameterList(node.parameters, visitor, context), void 0, ts2.visitFunctionBody(node.body, visitor, context) || factory.createBlock([]));
        if (updated !== node) {
          ts2.setCommentRange(updated, node);
          ts2.setSourceMapRange(updated, ts2.moveRangePastDecorators(node));
        }
        return updated;
      }
      function visitSetAccessor(node) {
        if (!shouldEmitAccessorDeclaration(node)) {
          return void 0;
        }
        var updated = factory.updateSetAccessorDeclaration(node, void 0, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), visitPropertyNameOfClassElement(node), ts2.visitParameterList(node.parameters, visitor, context), ts2.visitFunctionBody(node.body, visitor, context) || factory.createBlock([]));
        if (updated !== node) {
          ts2.setCommentRange(updated, node);
          ts2.setSourceMapRange(updated, ts2.moveRangePastDecorators(node));
        }
        return updated;
      }
      function visitFunctionDeclaration(node) {
        if (!shouldEmitFunctionLikeDeclaration(node)) {
          return factory.createNotEmittedStatement(node);
        }
        var updated = factory.updateFunctionDeclaration(node, void 0, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), node.asteriskToken, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, ts2.visitFunctionBody(node.body, visitor, context) || factory.createBlock([]));
        if (isExportOfNamespace(node)) {
          var statements = [updated];
          addExportMemberAssignment(statements, node);
          return statements;
        }
        return updated;
      }
      function visitFunctionExpression(node) {
        if (!shouldEmitFunctionLikeDeclaration(node)) {
          return factory.createOmittedExpression();
        }
        var updated = factory.updateFunctionExpression(node, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), node.asteriskToken, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, ts2.visitFunctionBody(node.body, visitor, context) || factory.createBlock([]));
        return updated;
      }
      function visitArrowFunction(node) {
        var updated = factory.updateArrowFunction(node, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, node.equalsGreaterThanToken, ts2.visitFunctionBody(node.body, visitor, context));
        return updated;
      }
      function visitParameter(node) {
        if (ts2.parameterIsThisKeyword(node)) {
          return void 0;
        }
        var updated = factory.updateParameterDeclaration(node, void 0, void 0, node.dotDotDotToken, ts2.visitNode(node.name, visitor, ts2.isBindingName), void 0, void 0, ts2.visitNode(node.initializer, visitor, ts2.isExpression));
        if (updated !== node) {
          ts2.setCommentRange(updated, node);
          ts2.setTextRange(updated, ts2.moveRangePastModifiers(node));
          ts2.setSourceMapRange(updated, ts2.moveRangePastModifiers(node));
          ts2.setEmitFlags(updated.name, 32);
        }
        return updated;
      }
      function visitVariableStatement(node) {
        if (isExportOfNamespace(node)) {
          var variables = ts2.getInitializedVariables(node.declarationList);
          if (variables.length === 0) {
            return void 0;
          }
          return ts2.setTextRange(factory.createExpressionStatement(factory.inlineExpressions(ts2.map(variables, transformInitializedVariable))), node);
        } else {
          return ts2.visitEachChild(node, visitor, context);
        }
      }
      function transformInitializedVariable(node) {
        var name = node.name;
        if (ts2.isBindingPattern(name)) {
          return ts2.flattenDestructuringAssignment(node, visitor, context, 0, false, createNamespaceExportExpression);
        } else {
          return ts2.setTextRange(factory.createAssignment(getNamespaceMemberNameWithSourceMapsAndWithoutComments(name), ts2.visitNode(node.initializer, visitor, ts2.isExpression)), node);
        }
      }
      function visitVariableDeclaration(node) {
        return factory.updateVariableDeclaration(node, ts2.visitNode(node.name, visitor, ts2.isBindingName), void 0, void 0, ts2.visitNode(node.initializer, visitor, ts2.isExpression));
      }
      function visitParenthesizedExpression(node) {
        var innerExpression = ts2.skipOuterExpressions(node.expression, ~6);
        if (ts2.isAssertionExpression(innerExpression)) {
          var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
          if (ts2.length(ts2.getLeadingCommentRangesOfNode(expression, currentSourceFile))) {
            return factory.updateParenthesizedExpression(node, expression);
          }
          return factory.createPartiallyEmittedExpression(expression, node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitAssertionExpression(node) {
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        return factory.createPartiallyEmittedExpression(expression, node);
      }
      function visitNonNullExpression(node) {
        var expression = ts2.visitNode(node.expression, visitor, ts2.isLeftHandSideExpression);
        return factory.createPartiallyEmittedExpression(expression, node);
      }
      function visitCallExpression(node) {
        return factory.updateCallExpression(node, ts2.visitNode(node.expression, visitor, ts2.isExpression), void 0, ts2.visitNodes(node.arguments, visitor, ts2.isExpression));
      }
      function visitNewExpression(node) {
        return factory.updateNewExpression(node, ts2.visitNode(node.expression, visitor, ts2.isExpression), void 0, ts2.visitNodes(node.arguments, visitor, ts2.isExpression));
      }
      function visitTaggedTemplateExpression(node) {
        return factory.updateTaggedTemplateExpression(node, ts2.visitNode(node.tag, visitor, ts2.isExpression), void 0, ts2.visitNode(node.template, visitor, ts2.isExpression));
      }
      function visitJsxSelfClosingElement(node) {
        return factory.updateJsxSelfClosingElement(node, ts2.visitNode(node.tagName, visitor, ts2.isJsxTagNameExpression), void 0, ts2.visitNode(node.attributes, visitor, ts2.isJsxAttributes));
      }
      function visitJsxJsxOpeningElement(node) {
        return factory.updateJsxOpeningElement(node, ts2.visitNode(node.tagName, visitor, ts2.isJsxTagNameExpression), void 0, ts2.visitNode(node.attributes, visitor, ts2.isJsxAttributes));
      }
      function shouldEmitEnumDeclaration(node) {
        return !ts2.isEnumConst(node) || ts2.shouldPreserveConstEnums(compilerOptions);
      }
      function visitEnumDeclaration(node) {
        if (!shouldEmitEnumDeclaration(node)) {
          return factory.createNotEmittedStatement(node);
        }
        var statements = [];
        var emitFlags = 2;
        var varAdded = addVarForEnumOrModuleDeclaration(statements, node);
        if (varAdded) {
          if (moduleKind !== ts2.ModuleKind.System || currentLexicalScope !== currentSourceFile) {
            emitFlags |= 512;
          }
        }
        var parameterName = getNamespaceParameterName(node);
        var containerName = getNamespaceContainerName(node);
        var exportName = ts2.hasSyntacticModifier(node, 1) ? factory.getExternalModuleOrNamespaceExportName(currentNamespaceContainerName, node, false, true) : factory.getLocalName(node, false, true);
        var moduleArg = factory.createLogicalOr(exportName, factory.createAssignment(exportName, factory.createObjectLiteralExpression()));
        if (hasNamespaceQualifiedExportName(node)) {
          var localName = factory.getLocalName(node, false, true);
          moduleArg = factory.createAssignment(localName, moduleArg);
        }
        var enumStatement = factory.createExpressionStatement(factory.createCallExpression(factory.createFunctionExpression(void 0, void 0, void 0, void 0, [factory.createParameterDeclaration(void 0, void 0, void 0, parameterName)], void 0, transformEnumBody(node, containerName)), void 0, [moduleArg]));
        ts2.setOriginalNode(enumStatement, node);
        if (varAdded) {
          ts2.setSyntheticLeadingComments(enumStatement, void 0);
          ts2.setSyntheticTrailingComments(enumStatement, void 0);
        }
        ts2.setTextRange(enumStatement, node);
        ts2.addEmitFlags(enumStatement, emitFlags);
        statements.push(enumStatement);
        statements.push(factory.createEndOfDeclarationMarker(node));
        return statements;
      }
      function transformEnumBody(node, localName) {
        var savedCurrentNamespaceLocalName = currentNamespaceContainerName;
        currentNamespaceContainerName = localName;
        var statements = [];
        startLexicalEnvironment();
        var members = ts2.map(node.members, transformEnumMember);
        ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
        ts2.addRange(statements, members);
        currentNamespaceContainerName = savedCurrentNamespaceLocalName;
        return factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), node.members), true);
      }
      function transformEnumMember(member) {
        var name = getExpressionForPropertyName(member, false);
        var valueExpression = transformEnumMemberDeclarationValue(member);
        var innerAssignment = factory.createAssignment(factory.createElementAccessExpression(currentNamespaceContainerName, name), valueExpression);
        var outerAssignment = valueExpression.kind === 10 ? innerAssignment : factory.createAssignment(factory.createElementAccessExpression(currentNamespaceContainerName, innerAssignment), name);
        return ts2.setTextRange(factory.createExpressionStatement(ts2.setTextRange(outerAssignment, member)), member);
      }
      function transformEnumMemberDeclarationValue(member) {
        var value = resolver.getConstantValue(member);
        if (value !== void 0) {
          return typeof value === "string" ? factory.createStringLiteral(value) : factory.createNumericLiteral(value);
        } else {
          enableSubstitutionForNonQualifiedEnumMembers();
          if (member.initializer) {
            return ts2.visitNode(member.initializer, visitor, ts2.isExpression);
          } else {
            return factory.createVoidZero();
          }
        }
      }
      function shouldEmitModuleDeclaration(nodeIn) {
        var node = ts2.getParseTreeNode(nodeIn, ts2.isModuleDeclaration);
        if (!node) {
          return true;
        }
        return ts2.isInstantiatedModule(node, ts2.shouldPreserveConstEnums(compilerOptions));
      }
      function hasNamespaceQualifiedExportName(node) {
        return isExportOfNamespace(node) || isExternalModuleExport(node) && moduleKind !== ts2.ModuleKind.ES2015 && moduleKind !== ts2.ModuleKind.ES2020 && moduleKind !== ts2.ModuleKind.ES2022 && moduleKind !== ts2.ModuleKind.ESNext && moduleKind !== ts2.ModuleKind.System;
      }
      function recordEmittedDeclarationInScope(node) {
        if (!currentScopeFirstDeclarationsOfName) {
          currentScopeFirstDeclarationsOfName = new ts2.Map();
        }
        var name = declaredNameInScope(node);
        if (!currentScopeFirstDeclarationsOfName.has(name)) {
          currentScopeFirstDeclarationsOfName.set(name, node);
        }
      }
      function isFirstEmittedDeclarationInScope(node) {
        if (currentScopeFirstDeclarationsOfName) {
          var name = declaredNameInScope(node);
          return currentScopeFirstDeclarationsOfName.get(name) === node;
        }
        return true;
      }
      function declaredNameInScope(node) {
        ts2.Debug.assertNode(node.name, ts2.isIdentifier);
        return node.name.escapedText;
      }
      function addVarForEnumOrModuleDeclaration(statements, node) {
        var statement = factory.createVariableStatement(ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), factory.createVariableDeclarationList([
          factory.createVariableDeclaration(factory.getLocalName(node, false, true))
        ], currentLexicalScope.kind === 303 ? 0 : 1));
        ts2.setOriginalNode(statement, node);
        recordEmittedDeclarationInScope(node);
        if (isFirstEmittedDeclarationInScope(node)) {
          if (node.kind === 259) {
            ts2.setSourceMapRange(statement.declarationList, node);
          } else {
            ts2.setSourceMapRange(statement, node);
          }
          ts2.setCommentRange(statement, node);
          ts2.addEmitFlags(statement, 1024 | 4194304);
          statements.push(statement);
          return true;
        } else {
          var mergeMarker = factory.createMergeDeclarationMarker(statement);
          ts2.setEmitFlags(mergeMarker, 1536 | 4194304);
          statements.push(mergeMarker);
          return false;
        }
      }
      function visitModuleDeclaration(node) {
        if (!shouldEmitModuleDeclaration(node)) {
          return factory.createNotEmittedStatement(node);
        }
        ts2.Debug.assertNode(node.name, ts2.isIdentifier, "A TypeScript namespace should have an Identifier name.");
        enableSubstitutionForNamespaceExports();
        var statements = [];
        var emitFlags = 2;
        var varAdded = addVarForEnumOrModuleDeclaration(statements, node);
        if (varAdded) {
          if (moduleKind !== ts2.ModuleKind.System || currentLexicalScope !== currentSourceFile) {
            emitFlags |= 512;
          }
        }
        var parameterName = getNamespaceParameterName(node);
        var containerName = getNamespaceContainerName(node);
        var exportName = ts2.hasSyntacticModifier(node, 1) ? factory.getExternalModuleOrNamespaceExportName(currentNamespaceContainerName, node, false, true) : factory.getLocalName(node, false, true);
        var moduleArg = factory.createLogicalOr(exportName, factory.createAssignment(exportName, factory.createObjectLiteralExpression()));
        if (hasNamespaceQualifiedExportName(node)) {
          var localName = factory.getLocalName(node, false, true);
          moduleArg = factory.createAssignment(localName, moduleArg);
        }
        var moduleStatement = factory.createExpressionStatement(factory.createCallExpression(factory.createFunctionExpression(void 0, void 0, void 0, void 0, [factory.createParameterDeclaration(void 0, void 0, void 0, parameterName)], void 0, transformModuleBody(node, containerName)), void 0, [moduleArg]));
        ts2.setOriginalNode(moduleStatement, node);
        if (varAdded) {
          ts2.setSyntheticLeadingComments(moduleStatement, void 0);
          ts2.setSyntheticTrailingComments(moduleStatement, void 0);
        }
        ts2.setTextRange(moduleStatement, node);
        ts2.addEmitFlags(moduleStatement, emitFlags);
        statements.push(moduleStatement);
        statements.push(factory.createEndOfDeclarationMarker(node));
        return statements;
      }
      function transformModuleBody(node, namespaceLocalName) {
        var savedCurrentNamespaceContainerName = currentNamespaceContainerName;
        var savedCurrentNamespace = currentNamespace;
        var savedCurrentScopeFirstDeclarationsOfName = currentScopeFirstDeclarationsOfName;
        currentNamespaceContainerName = namespaceLocalName;
        currentNamespace = node;
        currentScopeFirstDeclarationsOfName = void 0;
        var statements = [];
        startLexicalEnvironment();
        var statementsLocation;
        var blockLocation;
        if (node.body) {
          if (node.body.kind === 261) {
            saveStateAndInvoke(node.body, function(body) {
              return ts2.addRange(statements, ts2.visitNodes(body.statements, namespaceElementVisitor, ts2.isStatement));
            });
            statementsLocation = node.body.statements;
            blockLocation = node.body;
          } else {
            var result = visitModuleDeclaration(node.body);
            if (result) {
              if (ts2.isArray(result)) {
                ts2.addRange(statements, result);
              } else {
                statements.push(result);
              }
            }
            var moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body;
            statementsLocation = ts2.moveRangePos(moduleBlock.statements, -1);
          }
        }
        ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
        currentNamespaceContainerName = savedCurrentNamespaceContainerName;
        currentNamespace = savedCurrentNamespace;
        currentScopeFirstDeclarationsOfName = savedCurrentScopeFirstDeclarationsOfName;
        var block = factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), statementsLocation), true);
        ts2.setTextRange(block, blockLocation);
        if (!node.body || node.body.kind !== 261) {
          ts2.setEmitFlags(block, ts2.getEmitFlags(block) | 1536);
        }
        return block;
      }
      function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
        if (moduleDeclaration.body.kind === 260) {
          var recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body);
          return recursiveInnerModule || moduleDeclaration.body;
        }
      }
      function visitImportDeclaration(node) {
        if (!node.importClause) {
          return node;
        }
        if (node.importClause.isTypeOnly) {
          return void 0;
        }
        var importClause = ts2.visitNode(node.importClause, visitImportClause, ts2.isImportClause);
        return importClause || compilerOptions.importsNotUsedAsValues === 1 || compilerOptions.importsNotUsedAsValues === 2 ? factory.updateImportDeclaration(node, void 0, void 0, importClause, node.moduleSpecifier, node.assertClause) : void 0;
      }
      function visitImportClause(node) {
        ts2.Debug.assert(!node.isTypeOnly);
        var name = shouldEmitAliasDeclaration(node) ? node.name : void 0;
        var namedBindings = ts2.visitNode(node.namedBindings, visitNamedImportBindings, ts2.isNamedImportBindings);
        return name || namedBindings ? factory.updateImportClause(node, false, name, namedBindings) : void 0;
      }
      function visitNamedImportBindings(node) {
        if (node.kind === 267) {
          return shouldEmitAliasDeclaration(node) ? node : void 0;
        } else {
          var allowEmpty = compilerOptions.preserveValueImports && (compilerOptions.importsNotUsedAsValues === 1 || compilerOptions.importsNotUsedAsValues === 2);
          var elements = ts2.visitNodes(node.elements, visitImportSpecifier, ts2.isImportSpecifier);
          return allowEmpty || ts2.some(elements) ? factory.updateNamedImports(node, elements) : void 0;
        }
      }
      function visitImportSpecifier(node) {
        return !node.isTypeOnly && shouldEmitAliasDeclaration(node) ? node : void 0;
      }
      function visitExportAssignment(node) {
        return resolver.isValueAliasDeclaration(node) ? ts2.visitEachChild(node, visitor, context) : void 0;
      }
      function visitExportDeclaration(node) {
        if (node.isTypeOnly) {
          return void 0;
        }
        if (!node.exportClause || ts2.isNamespaceExport(node.exportClause)) {
          return node;
        }
        var allowEmpty = !!node.moduleSpecifier && (compilerOptions.importsNotUsedAsValues === 1 || compilerOptions.importsNotUsedAsValues === 2);
        var exportClause = ts2.visitNode(node.exportClause, function(bindings) {
          return visitNamedExportBindings(bindings, allowEmpty);
        }, ts2.isNamedExportBindings);
        return exportClause ? factory.updateExportDeclaration(node, void 0, void 0, node.isTypeOnly, exportClause, node.moduleSpecifier, node.assertClause) : void 0;
      }
      function visitNamedExports(node, allowEmpty) {
        var elements = ts2.visitNodes(node.elements, visitExportSpecifier, ts2.isExportSpecifier);
        return allowEmpty || ts2.some(elements) ? factory.updateNamedExports(node, elements) : void 0;
      }
      function visitNamespaceExports(node) {
        return factory.updateNamespaceExport(node, ts2.visitNode(node.name, visitor, ts2.isIdentifier));
      }
      function visitNamedExportBindings(node, allowEmpty) {
        return ts2.isNamespaceExport(node) ? visitNamespaceExports(node) : visitNamedExports(node, allowEmpty);
      }
      function visitExportSpecifier(node) {
        return !node.isTypeOnly && resolver.isValueAliasDeclaration(node) ? node : void 0;
      }
      function shouldEmitImportEqualsDeclaration(node) {
        return shouldEmitAliasDeclaration(node) || !ts2.isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node);
      }
      function visitImportEqualsDeclaration(node) {
        if (node.isTypeOnly) {
          return void 0;
        }
        if (ts2.isExternalModuleImportEqualsDeclaration(node)) {
          var isReferenced = shouldEmitAliasDeclaration(node);
          if (!isReferenced && compilerOptions.importsNotUsedAsValues === 1) {
            return ts2.setOriginalNode(ts2.setTextRange(factory.createImportDeclaration(void 0, void 0, void 0, node.moduleReference.expression, void 0), node), node);
          }
          return isReferenced ? ts2.visitEachChild(node, visitor, context) : void 0;
        }
        if (!shouldEmitImportEqualsDeclaration(node)) {
          return void 0;
        }
        var moduleReference = ts2.createExpressionFromEntityName(factory, node.moduleReference);
        ts2.setEmitFlags(moduleReference, 1536 | 2048);
        if (isNamedExternalModuleExport(node) || !isExportOfNamespace(node)) {
          return ts2.setOriginalNode(ts2.setTextRange(factory.createVariableStatement(ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), factory.createVariableDeclarationList([
            ts2.setOriginalNode(factory.createVariableDeclaration(node.name, void 0, void 0, moduleReference), node)
          ])), node), node);
        } else {
          return ts2.setOriginalNode(createNamespaceExport(node.name, moduleReference, node), node);
        }
      }
      function isExportOfNamespace(node) {
        return currentNamespace !== void 0 && ts2.hasSyntacticModifier(node, 1);
      }
      function isExternalModuleExport(node) {
        return currentNamespace === void 0 && ts2.hasSyntacticModifier(node, 1);
      }
      function isNamedExternalModuleExport(node) {
        return isExternalModuleExport(node) && !ts2.hasSyntacticModifier(node, 512);
      }
      function isDefaultExternalModuleExport(node) {
        return isExternalModuleExport(node) && ts2.hasSyntacticModifier(node, 512);
      }
      function expressionToStatement(expression) {
        return factory.createExpressionStatement(expression);
      }
      function addExportMemberAssignment(statements, node) {
        var expression = factory.createAssignment(factory.getExternalModuleOrNamespaceExportName(currentNamespaceContainerName, node, false, true), factory.getLocalName(node));
        ts2.setSourceMapRange(expression, ts2.createRange(node.name ? node.name.pos : node.pos, node.end));
        var statement = factory.createExpressionStatement(expression);
        ts2.setSourceMapRange(statement, ts2.createRange(-1, node.end));
        statements.push(statement);
      }
      function createNamespaceExport(exportName, exportValue, location) {
        return ts2.setTextRange(factory.createExpressionStatement(factory.createAssignment(factory.getNamespaceMemberName(currentNamespaceContainerName, exportName, false, true), exportValue)), location);
      }
      function createNamespaceExportExpression(exportName, exportValue, location) {
        return ts2.setTextRange(factory.createAssignment(getNamespaceMemberNameWithSourceMapsAndWithoutComments(exportName), exportValue), location);
      }
      function getNamespaceMemberNameWithSourceMapsAndWithoutComments(name) {
        return factory.getNamespaceMemberName(currentNamespaceContainerName, name, false, true);
      }
      function getNamespaceParameterName(node) {
        var name = factory.getGeneratedNameForNode(node);
        ts2.setSourceMapRange(name, node.name);
        return name;
      }
      function getNamespaceContainerName(node) {
        return factory.getGeneratedNameForNode(node);
      }
      function getClassAliasIfNeeded(node) {
        if (resolver.getNodeCheckFlags(node) & 16777216) {
          enableSubstitutionForClassAliases();
          var classAlias = factory.createUniqueName(node.name && !ts2.isGeneratedIdentifier(node.name) ? ts2.idText(node.name) : "default");
          classAliases[ts2.getOriginalNodeId(node)] = classAlias;
          hoistVariableDeclaration(classAlias);
          return classAlias;
        }
      }
      function getClassPrototype(node) {
        return factory.createPropertyAccessExpression(factory.getDeclarationName(node), "prototype");
      }
      function getClassMemberPrefix(node, member) {
        return ts2.isStatic(member) ? factory.getDeclarationName(node) : getClassPrototype(node);
      }
      function enableSubstitutionForNonQualifiedEnumMembers() {
        if ((enabledSubstitutions & 8) === 0) {
          enabledSubstitutions |= 8;
          context.enableSubstitution(79);
        }
      }
      function enableSubstitutionForClassAliases() {
        if ((enabledSubstitutions & 1) === 0) {
          enabledSubstitutions |= 1;
          context.enableSubstitution(79);
          classAliases = [];
        }
      }
      function enableSubstitutionForNamespaceExports() {
        if ((enabledSubstitutions & 2) === 0) {
          enabledSubstitutions |= 2;
          context.enableSubstitution(79);
          context.enableSubstitution(295);
          context.enableEmitNotification(260);
        }
      }
      function isTransformedModuleDeclaration(node) {
        return ts2.getOriginalNode(node).kind === 260;
      }
      function isTransformedEnumDeclaration(node) {
        return ts2.getOriginalNode(node).kind === 259;
      }
      function onEmitNode(hint, node, emitCallback) {
        var savedApplicableSubstitutions = applicableSubstitutions;
        var savedCurrentSourceFile = currentSourceFile;
        if (ts2.isSourceFile(node)) {
          currentSourceFile = node;
        }
        if (enabledSubstitutions & 2 && isTransformedModuleDeclaration(node)) {
          applicableSubstitutions |= 2;
        }
        if (enabledSubstitutions & 8 && isTransformedEnumDeclaration(node)) {
          applicableSubstitutions |= 8;
        }
        previousOnEmitNode(hint, node, emitCallback);
        applicableSubstitutions = savedApplicableSubstitutions;
        currentSourceFile = savedCurrentSourceFile;
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (hint === 1) {
          return substituteExpression(node);
        } else if (ts2.isShorthandPropertyAssignment(node)) {
          return substituteShorthandPropertyAssignment(node);
        }
        return node;
      }
      function substituteShorthandPropertyAssignment(node) {
        if (enabledSubstitutions & 2) {
          var name = node.name;
          var exportedName = trySubstituteNamespaceExportedName(name);
          if (exportedName) {
            if (node.objectAssignmentInitializer) {
              var initializer = factory.createAssignment(exportedName, node.objectAssignmentInitializer);
              return ts2.setTextRange(factory.createPropertyAssignment(name, initializer), node);
            }
            return ts2.setTextRange(factory.createPropertyAssignment(name, exportedName), node);
          }
        }
        return node;
      }
      function substituteExpression(node) {
        switch (node.kind) {
          case 79:
            return substituteExpressionIdentifier(node);
          case 205:
            return substitutePropertyAccessExpression(node);
          case 206:
            return substituteElementAccessExpression(node);
        }
        return node;
      }
      function substituteExpressionIdentifier(node) {
        return trySubstituteClassAlias(node) || trySubstituteNamespaceExportedName(node) || node;
      }
      function trySubstituteClassAlias(node) {
        if (enabledSubstitutions & 1) {
          if (resolver.getNodeCheckFlags(node) & 33554432) {
            var declaration = resolver.getReferencedValueDeclaration(node);
            if (declaration) {
              var classAlias = classAliases[declaration.id];
              if (classAlias) {
                var clone_2 = factory.cloneNode(classAlias);
                ts2.setSourceMapRange(clone_2, node);
                ts2.setCommentRange(clone_2, node);
                return clone_2;
              }
            }
          }
        }
        return void 0;
      }
      function trySubstituteNamespaceExportedName(node) {
        if (enabledSubstitutions & applicableSubstitutions && !ts2.isGeneratedIdentifier(node) && !ts2.isLocalName(node)) {
          var container = resolver.getReferencedExportContainer(node, false);
          if (container && container.kind !== 303) {
            var substitute = applicableSubstitutions & 2 && container.kind === 260 || applicableSubstitutions & 8 && container.kind === 259;
            if (substitute) {
              return ts2.setTextRange(factory.createPropertyAccessExpression(factory.getGeneratedNameForNode(container), node), node);
            }
          }
        }
        return void 0;
      }
      function substitutePropertyAccessExpression(node) {
        return substituteConstantValue(node);
      }
      function substituteElementAccessExpression(node) {
        return substituteConstantValue(node);
      }
      function substituteConstantValue(node) {
        var constantValue = tryGetConstEnumValue(node);
        if (constantValue !== void 0) {
          ts2.setConstantValue(node, constantValue);
          var substitute = typeof constantValue === "string" ? factory.createStringLiteral(constantValue) : factory.createNumericLiteral(constantValue);
          if (!compilerOptions.removeComments) {
            var originalNode = ts2.getOriginalNode(node, ts2.isAccessExpression);
            var propertyName = ts2.isPropertyAccessExpression(originalNode) ? ts2.declarationNameToString(originalNode.name) : ts2.getTextOfNode(originalNode.argumentExpression);
            ts2.addSyntheticTrailingComment(substitute, 3, " ".concat(propertyName, " "));
          }
          return substitute;
        }
        return node;
      }
      function tryGetConstEnumValue(node) {
        if (compilerOptions.isolatedModules) {
          return void 0;
        }
        return ts2.isPropertyAccessExpression(node) || ts2.isElementAccessExpression(node) ? resolver.getConstantValue(node) : void 0;
      }
      function shouldEmitAliasDeclaration(node) {
        return compilerOptions.preserveValueImports ? resolver.isValueAliasDeclaration(node) : resolver.isReferencedAliasDeclaration(node);
      }
    }
    ts2.transformTypeScript = transformTypeScript;
  })(ts || (ts = {}));
  (function(ts2) {
    var ClassPropertySubstitutionFlags;
    (function(ClassPropertySubstitutionFlags2) {
      ClassPropertySubstitutionFlags2[ClassPropertySubstitutionFlags2["ClassAliases"] = 1] = "ClassAliases";
      ClassPropertySubstitutionFlags2[ClassPropertySubstitutionFlags2["ClassStaticThisOrSuperReference"] = 2] = "ClassStaticThisOrSuperReference";
    })(ClassPropertySubstitutionFlags || (ClassPropertySubstitutionFlags = {}));
    var PrivateIdentifierKind;
    (function(PrivateIdentifierKind2) {
      PrivateIdentifierKind2["Field"] = "f";
      PrivateIdentifierKind2["Method"] = "m";
      PrivateIdentifierKind2["Accessor"] = "a";
    })(PrivateIdentifierKind = ts2.PrivateIdentifierKind || (ts2.PrivateIdentifierKind = {}));
    var ClassFacts;
    (function(ClassFacts2) {
      ClassFacts2[ClassFacts2["None"] = 0] = "None";
      ClassFacts2[ClassFacts2["ClassWasDecorated"] = 1] = "ClassWasDecorated";
      ClassFacts2[ClassFacts2["NeedsClassConstructorReference"] = 2] = "NeedsClassConstructorReference";
      ClassFacts2[ClassFacts2["NeedsClassSuperReference"] = 4] = "NeedsClassSuperReference";
      ClassFacts2[ClassFacts2["NeedsSubstitutionForThisInClassStaticField"] = 8] = "NeedsSubstitutionForThisInClassStaticField";
    })(ClassFacts || (ClassFacts = {}));
    function transformClassFields(context) {
      var factory = context.factory, hoistVariableDeclaration = context.hoistVariableDeclaration, endLexicalEnvironment = context.endLexicalEnvironment, startLexicalEnvironment = context.startLexicalEnvironment, resumeLexicalEnvironment = context.resumeLexicalEnvironment, addBlockScopedVariable = context.addBlockScopedVariable;
      var resolver = context.getEmitResolver();
      var compilerOptions = context.getCompilerOptions();
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var useDefineForClassFields = ts2.getUseDefineForClassFields(compilerOptions);
      var shouldTransformPrivateElementsOrClassStaticBlocks = languageVersion < 99;
      var shouldTransformSuperInStaticInitializers = (languageVersion <= 8 || !useDefineForClassFields) && languageVersion >= 2;
      var shouldTransformThisInStaticInitializers = languageVersion <= 8 || !useDefineForClassFields;
      var previousOnSubstituteNode = context.onSubstituteNode;
      context.onSubstituteNode = onSubstituteNode;
      var previousOnEmitNode = context.onEmitNode;
      context.onEmitNode = onEmitNode;
      var enabledSubstitutions;
      var classAliases;
      var pendingExpressions;
      var pendingStatements;
      var classLexicalEnvironmentStack = [];
      var classLexicalEnvironmentMap = new ts2.Map();
      var currentClassLexicalEnvironment;
      var currentComputedPropertyNameClassLexicalEnvironment;
      var currentStaticPropertyDeclarationOrStaticBlock;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        var options = context.getCompilerOptions();
        if (node.isDeclarationFile || useDefineForClassFields && ts2.getEmitScriptTarget(options) === 99) {
          return node;
        }
        var visited = ts2.visitEachChild(node, visitor, context);
        ts2.addEmitHelpers(visited, context.readEmitHelpers());
        return visited;
      }
      function visitorWorker(node, valueIsDiscarded) {
        if (node.transformFlags & 8388608) {
          switch (node.kind) {
            case 225:
            case 256:
              return visitClassLike(node);
            case 166:
              return visitPropertyDeclaration(node);
            case 236:
              return visitVariableStatement(node);
            case 80:
              return visitPrivateIdentifier(node);
            case 169:
              return visitClassStaticBlockDeclaration(node);
          }
        }
        if (node.transformFlags & 8388608 || node.transformFlags & 33554432 && shouldTransformSuperInStaticInitializers && currentStaticPropertyDeclarationOrStaticBlock && currentClassLexicalEnvironment) {
          switch (node.kind) {
            case 218:
            case 219:
              return visitPreOrPostfixUnaryExpression(node, valueIsDiscarded);
            case 220:
              return visitBinaryExpression(node, valueIsDiscarded);
            case 207:
              return visitCallExpression(node);
            case 209:
              return visitTaggedTemplateExpression(node);
            case 205:
              return visitPropertyAccessExpression(node);
            case 206:
              return visitElementAccessExpression(node);
            case 237:
              return visitExpressionStatement(node);
            case 241:
              return visitForStatement(node);
            case 255:
            case 212:
            case 170:
            case 168:
            case 171:
            case 172: {
              var savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
              currentStaticPropertyDeclarationOrStaticBlock = void 0;
              var result = ts2.visitEachChild(node, visitor, context);
              currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
              return result;
            }
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function discardedValueVisitor(node) {
        return visitorWorker(node, true);
      }
      function visitor(node) {
        return visitorWorker(node, false);
      }
      function heritageClauseVisitor(node) {
        switch (node.kind) {
          case 290:
            return ts2.visitEachChild(node, heritageClauseVisitor, context);
          case 227:
            return visitExpressionWithTypeArguments(node);
        }
        return visitor(node);
      }
      function visitorDestructuringTarget(node) {
        switch (node.kind) {
          case 204:
          case 203:
            return visitAssignmentPattern(node);
          default:
            return visitor(node);
        }
      }
      function visitPrivateIdentifier(node) {
        if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
          return node;
        }
        if (ts2.isStatement(node.parent)) {
          return node;
        }
        return ts2.setOriginalNode(factory.createIdentifier(""), node);
      }
      function visitPrivateIdentifierInInExpression(node) {
        if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
          return node;
        }
        var privId = node.left;
        ts2.Debug.assertNode(privId, ts2.isPrivateIdentifier);
        ts2.Debug.assert(node.operatorToken.kind === 101);
        var info = accessPrivateIdentifier(privId);
        if (info) {
          var receiver = ts2.visitNode(node.right, visitor, ts2.isExpression);
          return ts2.setOriginalNode(context.getEmitHelperFactory().createClassPrivateFieldInHelper(info.brandCheckIdentifier, receiver), node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function classElementVisitor(node) {
        switch (node.kind) {
          case 170:
            return void 0;
          case 171:
          case 172:
          case 168:
            return visitMethodOrAccessorDeclaration(node);
          case 166:
            return visitPropertyDeclaration(node);
          case 161:
            return visitComputedPropertyName(node);
          case 233:
            return node;
          default:
            return visitor(node);
        }
      }
      function visitVariableStatement(node) {
        var savedPendingStatements = pendingStatements;
        pendingStatements = [];
        var visitedNode = ts2.visitEachChild(node, visitor, context);
        var statement = ts2.some(pendingStatements) ? __spreadArray([visitedNode], pendingStatements, true) : visitedNode;
        pendingStatements = savedPendingStatements;
        return statement;
      }
      function visitComputedPropertyName(name) {
        var node = ts2.visitEachChild(name, visitor, context);
        if (ts2.some(pendingExpressions)) {
          var expressions = pendingExpressions;
          expressions.push(node.expression);
          pendingExpressions = [];
          node = factory.updateComputedPropertyName(node, factory.inlineExpressions(expressions));
        }
        return node;
      }
      function visitMethodOrAccessorDeclaration(node) {
        ts2.Debug.assert(!ts2.some(node.decorators));
        if (!shouldTransformPrivateElementsOrClassStaticBlocks || !ts2.isPrivateIdentifier(node.name)) {
          return ts2.visitEachChild(node, classElementVisitor, context);
        }
        var info = accessPrivateIdentifier(node.name);
        ts2.Debug.assert(info, "Undeclared private name for property declaration.");
        if (!info.isValid) {
          return node;
        }
        var functionName = getHoistedFunctionName(node);
        if (functionName) {
          getPendingExpressions().push(factory.createAssignment(functionName, factory.createFunctionExpression(ts2.filter(node.modifiers, function(m) {
            return !ts2.isStaticModifier(m);
          }), node.asteriskToken, functionName, void 0, ts2.visitParameterList(node.parameters, classElementVisitor, context), void 0, ts2.visitFunctionBody(node.body, classElementVisitor, context))));
        }
        return void 0;
      }
      function getHoistedFunctionName(node) {
        ts2.Debug.assert(ts2.isPrivateIdentifier(node.name));
        var info = accessPrivateIdentifier(node.name);
        ts2.Debug.assert(info, "Undeclared private name for property declaration.");
        if (info.kind === "m") {
          return info.methodName;
        }
        if (info.kind === "a") {
          if (ts2.isGetAccessor(node)) {
            return info.getterName;
          }
          if (ts2.isSetAccessor(node)) {
            return info.setterName;
          }
        }
      }
      function visitPropertyDeclaration(node) {
        ts2.Debug.assert(!ts2.some(node.decorators));
        if (ts2.isPrivateIdentifier(node.name)) {
          if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
            return factory.updatePropertyDeclaration(node, void 0, ts2.visitNodes(node.modifiers, visitor, ts2.isModifier), node.name, void 0, void 0, void 0);
          }
          var info = accessPrivateIdentifier(node.name);
          ts2.Debug.assert(info, "Undeclared private name for property declaration.");
          if (!info.isValid) {
            return node;
          }
        }
        var expr = getPropertyNameExpressionIfNeeded(node.name, !!node.initializer || useDefineForClassFields);
        if (expr && !ts2.isSimpleInlineableExpression(expr)) {
          getPendingExpressions().push(expr);
        }
        return void 0;
      }
      function createPrivateIdentifierAccess(info, receiver) {
        return createPrivateIdentifierAccessHelper(info, ts2.visitNode(receiver, visitor, ts2.isExpression));
      }
      function createPrivateIdentifierAccessHelper(info, receiver) {
        ts2.setCommentRange(receiver, ts2.moveRangePos(receiver, -1));
        switch (info.kind) {
          case "a":
            return context.getEmitHelperFactory().createClassPrivateFieldGetHelper(receiver, info.brandCheckIdentifier, info.kind, info.getterName);
          case "m":
            return context.getEmitHelperFactory().createClassPrivateFieldGetHelper(receiver, info.brandCheckIdentifier, info.kind, info.methodName);
          case "f":
            return context.getEmitHelperFactory().createClassPrivateFieldGetHelper(receiver, info.brandCheckIdentifier, info.kind, info.variableName);
          default:
            ts2.Debug.assertNever(info, "Unknown private element type");
        }
      }
      function visitPropertyAccessExpression(node) {
        if (shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifier(node.name)) {
          var privateIdentifierInfo = accessPrivateIdentifier(node.name);
          if (privateIdentifierInfo) {
            return ts2.setTextRange(ts2.setOriginalNode(createPrivateIdentifierAccess(privateIdentifierInfo, node.expression), node), node);
          }
        }
        if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(node) && ts2.isIdentifier(node.name) && currentStaticPropertyDeclarationOrStaticBlock && currentClassLexicalEnvironment) {
          var classConstructor = currentClassLexicalEnvironment.classConstructor, superClassReference = currentClassLexicalEnvironment.superClassReference, facts = currentClassLexicalEnvironment.facts;
          if (facts & 1) {
            return visitInvalidSuperProperty(node);
          }
          if (classConstructor && superClassReference) {
            var superProperty = factory.createReflectGetCall(superClassReference, factory.createStringLiteralFromNode(node.name), classConstructor);
            ts2.setOriginalNode(superProperty, node.expression);
            ts2.setTextRange(superProperty, node.expression);
            return superProperty;
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitElementAccessExpression(node) {
        if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(node) && currentStaticPropertyDeclarationOrStaticBlock && currentClassLexicalEnvironment) {
          var classConstructor = currentClassLexicalEnvironment.classConstructor, superClassReference = currentClassLexicalEnvironment.superClassReference, facts = currentClassLexicalEnvironment.facts;
          if (facts & 1) {
            return visitInvalidSuperProperty(node);
          }
          if (classConstructor && superClassReference) {
            var superProperty = factory.createReflectGetCall(superClassReference, ts2.visitNode(node.argumentExpression, visitor, ts2.isExpression), classConstructor);
            ts2.setOriginalNode(superProperty, node.expression);
            ts2.setTextRange(superProperty, node.expression);
            return superProperty;
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitPreOrPostfixUnaryExpression(node, valueIsDiscarded) {
        if (node.operator === 45 || node.operator === 46) {
          if (shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifierPropertyAccessExpression(node.operand)) {
            var info = void 0;
            if (info = accessPrivateIdentifier(node.operand.name)) {
              var receiver = ts2.visitNode(node.operand.expression, visitor, ts2.isExpression);
              var _a = createCopiableReceiverExpr(receiver), readExpression = _a.readExpression, initializeExpression = _a.initializeExpression;
              var expression = createPrivateIdentifierAccess(info, readExpression);
              var temp = ts2.isPrefixUnaryExpression(node) || valueIsDiscarded ? void 0 : factory.createTempVariable(hoistVariableDeclaration);
              expression = ts2.expandPreOrPostfixIncrementOrDecrementExpression(factory, node, expression, hoistVariableDeclaration, temp);
              expression = createPrivateIdentifierAssignment(info, initializeExpression || readExpression, expression, 63);
              ts2.setOriginalNode(expression, node);
              ts2.setTextRange(expression, node);
              if (temp) {
                expression = factory.createComma(expression, temp);
                ts2.setTextRange(expression, node);
              }
              return expression;
            }
          } else if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(node.operand) && currentStaticPropertyDeclarationOrStaticBlock && currentClassLexicalEnvironment) {
            var classConstructor = currentClassLexicalEnvironment.classConstructor, superClassReference = currentClassLexicalEnvironment.superClassReference, facts = currentClassLexicalEnvironment.facts;
            if (facts & 1) {
              var operand = visitInvalidSuperProperty(node.operand);
              return ts2.isPrefixUnaryExpression(node) ? factory.updatePrefixUnaryExpression(node, operand) : factory.updatePostfixUnaryExpression(node, operand);
            }
            if (classConstructor && superClassReference) {
              var setterName = void 0;
              var getterName = void 0;
              if (ts2.isPropertyAccessExpression(node.operand)) {
                if (ts2.isIdentifier(node.operand.name)) {
                  getterName = setterName = factory.createStringLiteralFromNode(node.operand.name);
                }
              } else {
                if (ts2.isSimpleInlineableExpression(node.operand.argumentExpression)) {
                  getterName = setterName = node.operand.argumentExpression;
                } else {
                  getterName = factory.createTempVariable(hoistVariableDeclaration);
                  setterName = factory.createAssignment(getterName, ts2.visitNode(node.operand.argumentExpression, visitor, ts2.isExpression));
                }
              }
              if (setterName && getterName) {
                var expression = factory.createReflectGetCall(superClassReference, getterName, classConstructor);
                ts2.setTextRange(expression, node.operand);
                var temp = valueIsDiscarded ? void 0 : factory.createTempVariable(hoistVariableDeclaration);
                expression = ts2.expandPreOrPostfixIncrementOrDecrementExpression(factory, node, expression, hoistVariableDeclaration, temp);
                expression = factory.createReflectSetCall(superClassReference, setterName, expression, classConstructor);
                ts2.setOriginalNode(expression, node);
                ts2.setTextRange(expression, node);
                if (temp) {
                  expression = factory.createComma(expression, temp);
                  ts2.setTextRange(expression, node);
                }
                return expression;
              }
            }
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitForStatement(node) {
        return factory.updateForStatement(node, ts2.visitNode(node.initializer, discardedValueVisitor, ts2.isForInitializer), ts2.visitNode(node.condition, visitor, ts2.isExpression), ts2.visitNode(node.incrementor, discardedValueVisitor, ts2.isExpression), ts2.visitIterationBody(node.statement, visitor, context));
      }
      function visitExpressionStatement(node) {
        return factory.updateExpressionStatement(node, ts2.visitNode(node.expression, discardedValueVisitor, ts2.isExpression));
      }
      function createCopiableReceiverExpr(receiver) {
        var clone = ts2.nodeIsSynthesized(receiver) ? receiver : factory.cloneNode(receiver);
        if (ts2.isSimpleInlineableExpression(receiver)) {
          return { readExpression: clone, initializeExpression: void 0 };
        }
        var readExpression = factory.createTempVariable(hoistVariableDeclaration);
        var initializeExpression = factory.createAssignment(readExpression, clone);
        return { readExpression, initializeExpression };
      }
      function visitCallExpression(node) {
        if (shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifierPropertyAccessExpression(node.expression)) {
          var _a = factory.createCallBinding(node.expression, hoistVariableDeclaration, languageVersion), thisArg = _a.thisArg, target = _a.target;
          if (ts2.isCallChain(node)) {
            return factory.updateCallChain(node, factory.createPropertyAccessChain(ts2.visitNode(target, visitor), node.questionDotToken, "call"), void 0, void 0, __spreadArray([ts2.visitNode(thisArg, visitor, ts2.isExpression)], ts2.visitNodes(node.arguments, visitor, ts2.isExpression), true));
          }
          return factory.updateCallExpression(node, factory.createPropertyAccessExpression(ts2.visitNode(target, visitor), "call"), void 0, __spreadArray([ts2.visitNode(thisArg, visitor, ts2.isExpression)], ts2.visitNodes(node.arguments, visitor, ts2.isExpression), true));
        }
        if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(node.expression) && currentStaticPropertyDeclarationOrStaticBlock && (currentClassLexicalEnvironment === null || currentClassLexicalEnvironment === void 0 ? void 0 : currentClassLexicalEnvironment.classConstructor)) {
          var invocation = factory.createFunctionCallCall(ts2.visitNode(node.expression, visitor, ts2.isExpression), currentClassLexicalEnvironment.classConstructor, ts2.visitNodes(node.arguments, visitor, ts2.isExpression));
          ts2.setOriginalNode(invocation, node);
          ts2.setTextRange(invocation, node);
          return invocation;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitTaggedTemplateExpression(node) {
        if (shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifierPropertyAccessExpression(node.tag)) {
          var _a = factory.createCallBinding(node.tag, hoistVariableDeclaration, languageVersion), thisArg = _a.thisArg, target = _a.target;
          return factory.updateTaggedTemplateExpression(node, factory.createCallExpression(factory.createPropertyAccessExpression(ts2.visitNode(target, visitor), "bind"), void 0, [ts2.visitNode(thisArg, visitor, ts2.isExpression)]), void 0, ts2.visitNode(node.template, visitor, ts2.isTemplateLiteral));
        }
        if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(node.tag) && currentStaticPropertyDeclarationOrStaticBlock && (currentClassLexicalEnvironment === null || currentClassLexicalEnvironment === void 0 ? void 0 : currentClassLexicalEnvironment.classConstructor)) {
          var invocation = factory.createFunctionBindCall(ts2.visitNode(node.tag, visitor, ts2.isExpression), currentClassLexicalEnvironment.classConstructor, []);
          ts2.setOriginalNode(invocation, node);
          ts2.setTextRange(invocation, node);
          return factory.updateTaggedTemplateExpression(node, invocation, void 0, ts2.visitNode(node.template, visitor, ts2.isTemplateLiteral));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function transformClassStaticBlockDeclaration(node) {
        if (shouldTransformPrivateElementsOrClassStaticBlocks) {
          if (currentClassLexicalEnvironment) {
            classLexicalEnvironmentMap.set(ts2.getOriginalNodeId(node), currentClassLexicalEnvironment);
          }
          startLexicalEnvironment();
          var savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
          currentStaticPropertyDeclarationOrStaticBlock = node;
          var statements = ts2.visitNodes(node.body.statements, visitor, ts2.isStatement);
          statements = factory.mergeLexicalEnvironment(statements, endLexicalEnvironment());
          currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
          var iife = factory.createImmediatelyInvokedArrowFunction(statements);
          ts2.setOriginalNode(iife, node);
          ts2.setTextRange(iife, node);
          ts2.addEmitFlags(iife, 2);
          return iife;
        }
      }
      function visitBinaryExpression(node, valueIsDiscarded) {
        if (ts2.isDestructuringAssignment(node)) {
          var savedPendingExpressions = pendingExpressions;
          pendingExpressions = void 0;
          node = factory.updateBinaryExpression(node, ts2.visitNode(node.left, visitorDestructuringTarget), node.operatorToken, ts2.visitNode(node.right, visitor));
          var expr = ts2.some(pendingExpressions) ? factory.inlineExpressions(ts2.compact(__spreadArray(__spreadArray([], pendingExpressions, true), [node], false))) : node;
          pendingExpressions = savedPendingExpressions;
          return expr;
        }
        if (ts2.isAssignmentExpression(node)) {
          if (shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifierPropertyAccessExpression(node.left)) {
            var info = accessPrivateIdentifier(node.left.name);
            if (info) {
              return ts2.setTextRange(ts2.setOriginalNode(createPrivateIdentifierAssignment(info, node.left.expression, node.right, node.operatorToken.kind), node), node);
            }
          } else if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(node.left) && currentStaticPropertyDeclarationOrStaticBlock && currentClassLexicalEnvironment) {
            var classConstructor = currentClassLexicalEnvironment.classConstructor, superClassReference = currentClassLexicalEnvironment.superClassReference, facts = currentClassLexicalEnvironment.facts;
            if (facts & 1) {
              return factory.updateBinaryExpression(node, visitInvalidSuperProperty(node.left), node.operatorToken, ts2.visitNode(node.right, visitor, ts2.isExpression));
            }
            if (classConstructor && superClassReference) {
              var setterName = ts2.isElementAccessExpression(node.left) ? ts2.visitNode(node.left.argumentExpression, visitor, ts2.isExpression) : ts2.isIdentifier(node.left.name) ? factory.createStringLiteralFromNode(node.left.name) : void 0;
              if (setterName) {
                var expression = ts2.visitNode(node.right, visitor, ts2.isExpression);
                if (ts2.isCompoundAssignment(node.operatorToken.kind)) {
                  var getterName = setterName;
                  if (!ts2.isSimpleInlineableExpression(setterName)) {
                    getterName = factory.createTempVariable(hoistVariableDeclaration);
                    setterName = factory.createAssignment(getterName, setterName);
                  }
                  var superPropertyGet = factory.createReflectGetCall(superClassReference, getterName, classConstructor);
                  ts2.setOriginalNode(superPropertyGet, node.left);
                  ts2.setTextRange(superPropertyGet, node.left);
                  expression = factory.createBinaryExpression(superPropertyGet, ts2.getNonAssignmentOperatorForCompoundAssignment(node.operatorToken.kind), expression);
                  ts2.setTextRange(expression, node);
                }
                var temp = valueIsDiscarded ? void 0 : factory.createTempVariable(hoistVariableDeclaration);
                if (temp) {
                  expression = factory.createAssignment(temp, expression);
                  ts2.setTextRange(temp, node);
                }
                expression = factory.createReflectSetCall(superClassReference, setterName, expression, classConstructor);
                ts2.setOriginalNode(expression, node);
                ts2.setTextRange(expression, node);
                if (temp) {
                  expression = factory.createComma(expression, temp);
                  ts2.setTextRange(expression, node);
                }
                return expression;
              }
            }
          }
        }
        if (node.operatorToken.kind === 101 && ts2.isPrivateIdentifier(node.left)) {
          return visitPrivateIdentifierInInExpression(node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function createPrivateIdentifierAssignment(info, receiver, right, operator) {
        receiver = ts2.visitNode(receiver, visitor, ts2.isExpression);
        right = ts2.visitNode(right, visitor, ts2.isExpression);
        if (ts2.isCompoundAssignment(operator)) {
          var _a = createCopiableReceiverExpr(receiver), readExpression = _a.readExpression, initializeExpression = _a.initializeExpression;
          receiver = initializeExpression || readExpression;
          right = factory.createBinaryExpression(createPrivateIdentifierAccessHelper(info, readExpression), ts2.getNonAssignmentOperatorForCompoundAssignment(operator), right);
        }
        ts2.setCommentRange(receiver, ts2.moveRangePos(receiver, -1));
        switch (info.kind) {
          case "a":
            return context.getEmitHelperFactory().createClassPrivateFieldSetHelper(receiver, info.brandCheckIdentifier, right, info.kind, info.setterName);
          case "m":
            return context.getEmitHelperFactory().createClassPrivateFieldSetHelper(receiver, info.brandCheckIdentifier, right, info.kind, void 0);
          case "f":
            return context.getEmitHelperFactory().createClassPrivateFieldSetHelper(receiver, info.brandCheckIdentifier, right, info.kind, info.variableName);
          default:
            ts2.Debug.assertNever(info, "Unknown private element type");
        }
      }
      function visitClassLike(node) {
        if (!ts2.forEach(node.members, doesClassElementNeedTransform)) {
          return ts2.visitEachChild(node, visitor, context);
        }
        var savedPendingExpressions = pendingExpressions;
        pendingExpressions = void 0;
        startClassLexicalEnvironment();
        if (shouldTransformPrivateElementsOrClassStaticBlocks) {
          var name = ts2.getNameOfDeclaration(node);
          if (name && ts2.isIdentifier(name)) {
            getPrivateIdentifierEnvironment().className = ts2.idText(name);
          }
          var privateInstanceMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node);
          if (ts2.some(privateInstanceMethodsAndAccessors)) {
            getPrivateIdentifierEnvironment().weakSetName = createHoistedVariableForClass("instances", privateInstanceMethodsAndAccessors[0].name);
          }
        }
        var result = ts2.isClassDeclaration(node) ? visitClassDeclaration(node) : visitClassExpression(node);
        endClassLexicalEnvironment();
        pendingExpressions = savedPendingExpressions;
        return result;
      }
      function doesClassElementNeedTransform(node) {
        return ts2.isPropertyDeclaration(node) || ts2.isClassStaticBlockDeclaration(node) || shouldTransformPrivateElementsOrClassStaticBlocks && node.name && ts2.isPrivateIdentifier(node.name);
      }
      function getPrivateInstanceMethodsAndAccessors(node) {
        return ts2.filter(node.members, ts2.isNonStaticMethodOrAccessorWithPrivateName);
      }
      function getClassFacts(node) {
        var facts = 0;
        var original = ts2.getOriginalNode(node);
        if (ts2.isClassDeclaration(original) && ts2.classOrConstructorParameterIsDecorated(original)) {
          facts |= 1;
        }
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          if (!ts2.isStatic(member))
            continue;
          if (member.name && ts2.isPrivateIdentifier(member.name) && shouldTransformPrivateElementsOrClassStaticBlocks) {
            facts |= 2;
          }
          if (ts2.isPropertyDeclaration(member) || ts2.isClassStaticBlockDeclaration(member)) {
            if (shouldTransformThisInStaticInitializers && member.transformFlags & 8192) {
              facts |= 8;
              if (!(facts & 1)) {
                facts |= 2;
              }
            }
            if (shouldTransformSuperInStaticInitializers && member.transformFlags & 33554432) {
              if (!(facts & 1)) {
                facts |= 2 | 4;
              }
            }
          }
        }
        return facts;
      }
      function visitExpressionWithTypeArguments(node) {
        var facts = (currentClassLexicalEnvironment === null || currentClassLexicalEnvironment === void 0 ? void 0 : currentClassLexicalEnvironment.facts) || 0;
        if (facts & 4) {
          var temp = factory.createTempVariable(hoistVariableDeclaration, true);
          getClassLexicalEnvironment().superClassReference = temp;
          return factory.updateExpressionWithTypeArguments(node, factory.createAssignment(temp, ts2.visitNode(node.expression, visitor, ts2.isExpression)), void 0);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitClassDeclaration(node) {
        var facts = getClassFacts(node);
        if (facts) {
          getClassLexicalEnvironment().facts = facts;
        }
        if (facts & 8) {
          enableSubstitutionForClassStaticThisOrSuperReference();
        }
        var staticProperties = ts2.getStaticPropertiesAndClassStaticBlock(node);
        var pendingClassReferenceAssignment;
        if (facts & 2) {
          var temp = factory.createTempVariable(hoistVariableDeclaration, true);
          getClassLexicalEnvironment().classConstructor = factory.cloneNode(temp);
          pendingClassReferenceAssignment = factory.createAssignment(temp, factory.getInternalName(node));
        }
        var extendsClauseElement = ts2.getEffectiveBaseTypeNode(node);
        var isDerivedClass = !!(extendsClauseElement && ts2.skipOuterExpressions(extendsClauseElement.expression).kind !== 104);
        var statements = [
          factory.updateClassDeclaration(node, void 0, node.modifiers, node.name, void 0, ts2.visitNodes(node.heritageClauses, heritageClauseVisitor, ts2.isHeritageClause), transformClassMembers(node, isDerivedClass))
        ];
        if (pendingClassReferenceAssignment) {
          getPendingExpressions().unshift(pendingClassReferenceAssignment);
        }
        if (ts2.some(pendingExpressions)) {
          statements.push(factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions)));
        }
        if (ts2.some(staticProperties)) {
          addPropertyOrClassStaticBlockStatements(statements, staticProperties, factory.getInternalName(node));
        }
        return statements;
      }
      function visitClassExpression(node) {
        var facts = getClassFacts(node);
        if (facts) {
          getClassLexicalEnvironment().facts = facts;
        }
        if (facts & 8) {
          enableSubstitutionForClassStaticThisOrSuperReference();
        }
        var isDecoratedClassDeclaration = !!(facts & 1);
        var staticPropertiesOrClassStaticBlocks = ts2.getStaticPropertiesAndClassStaticBlock(node);
        var extendsClauseElement = ts2.getEffectiveBaseTypeNode(node);
        var isDerivedClass = !!(extendsClauseElement && ts2.skipOuterExpressions(extendsClauseElement.expression).kind !== 104);
        var isClassWithConstructorReference = resolver.getNodeCheckFlags(node) & 16777216;
        var temp;
        function createClassTempVar() {
          var classCheckFlags = resolver.getNodeCheckFlags(node);
          var isClassWithConstructorReference2 = classCheckFlags & 16777216;
          var requiresBlockScopedVar = classCheckFlags & 524288;
          return factory.createTempVariable(requiresBlockScopedVar ? addBlockScopedVariable : hoistVariableDeclaration, !!isClassWithConstructorReference2);
        }
        if (facts & 2) {
          temp = createClassTempVar();
          getClassLexicalEnvironment().classConstructor = factory.cloneNode(temp);
        }
        var classExpression = factory.updateClassExpression(node, ts2.visitNodes(node.decorators, visitor, ts2.isDecorator), node.modifiers, node.name, void 0, ts2.visitNodes(node.heritageClauses, heritageClauseVisitor, ts2.isHeritageClause), transformClassMembers(node, isDerivedClass));
        var hasTransformableStatics = ts2.some(staticPropertiesOrClassStaticBlocks, function(p) {
          return ts2.isClassStaticBlockDeclaration(p) || !!p.initializer || shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifier(p.name);
        });
        if (hasTransformableStatics || ts2.some(pendingExpressions)) {
          if (isDecoratedClassDeclaration) {
            ts2.Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration.");
            if (pendingStatements && pendingExpressions && ts2.some(pendingExpressions)) {
              pendingStatements.push(factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions)));
            }
            if (pendingStatements && ts2.some(staticPropertiesOrClassStaticBlocks)) {
              addPropertyOrClassStaticBlockStatements(pendingStatements, staticPropertiesOrClassStaticBlocks, factory.getInternalName(node));
            }
            if (temp) {
              return factory.inlineExpressions([factory.createAssignment(temp, classExpression), temp]);
            }
            return classExpression;
          } else {
            var expressions = [];
            temp || (temp = createClassTempVar());
            if (isClassWithConstructorReference) {
              enableSubstitutionForClassAliases();
              var alias = factory.cloneNode(temp);
              alias.autoGenerateFlags &= ~8;
              classAliases[ts2.getOriginalNodeId(node)] = alias;
            }
            ts2.setEmitFlags(classExpression, 65536 | ts2.getEmitFlags(classExpression));
            expressions.push(ts2.startOnNewLine(factory.createAssignment(temp, classExpression)));
            ts2.addRange(expressions, ts2.map(pendingExpressions, ts2.startOnNewLine));
            ts2.addRange(expressions, generateInitializedPropertyExpressionsOrClassStaticBlock(staticPropertiesOrClassStaticBlocks, temp));
            expressions.push(ts2.startOnNewLine(temp));
            return factory.inlineExpressions(expressions);
          }
        }
        return classExpression;
      }
      function visitClassStaticBlockDeclaration(node) {
        if (!shouldTransformPrivateElementsOrClassStaticBlocks) {
          return ts2.visitEachChild(node, classElementVisitor, context);
        }
        return void 0;
      }
      function transformClassMembers(node, isDerivedClass) {
        if (shouldTransformPrivateElementsOrClassStaticBlocks) {
          for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
            var member = _a[_i];
            if (ts2.isPrivateIdentifierClassElementDeclaration(member)) {
              addPrivateIdentifierToEnvironment(member);
            }
          }
          if (ts2.some(getPrivateInstanceMethodsAndAccessors(node))) {
            createBrandCheckWeakSetForPrivateMethods();
          }
        }
        var members = [];
        var constructor = transformConstructor(node, isDerivedClass);
        if (constructor) {
          members.push(constructor);
        }
        ts2.addRange(members, ts2.visitNodes(node.members, classElementVisitor, ts2.isClassElement));
        return ts2.setTextRange(factory.createNodeArray(members), node.members);
      }
      function createBrandCheckWeakSetForPrivateMethods() {
        var weakSetName = getPrivateIdentifierEnvironment().weakSetName;
        ts2.Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
        getPendingExpressions().push(factory.createAssignment(weakSetName, factory.createNewExpression(factory.createIdentifier("WeakSet"), void 0, [])));
      }
      function isClassElementThatRequiresConstructorStatement(member) {
        if (ts2.isStatic(member) || ts2.hasSyntacticModifier(ts2.getOriginalNode(member), 128)) {
          return false;
        }
        if (useDefineForClassFields) {
          return languageVersion < 99;
        }
        return ts2.isInitializedProperty(member) || shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifierClassElementDeclaration(member);
      }
      function transformConstructor(node, isDerivedClass) {
        var constructor = ts2.visitNode(ts2.getFirstConstructorWithBody(node), visitor, ts2.isConstructorDeclaration);
        var elements = node.members.filter(isClassElementThatRequiresConstructorStatement);
        if (!ts2.some(elements)) {
          return constructor;
        }
        var parameters = ts2.visitParameterList(constructor ? constructor.parameters : void 0, visitor, context);
        var body = transformConstructorBody(node, constructor, isDerivedClass);
        if (!body) {
          return void 0;
        }
        return ts2.startOnNewLine(ts2.setOriginalNode(ts2.setTextRange(factory.createConstructorDeclaration(void 0, void 0, parameters !== null && parameters !== void 0 ? parameters : [], body), constructor || node), constructor));
      }
      function transformConstructorBody(node, constructor, isDerivedClass) {
        var properties = ts2.getProperties(node, false, false);
        if (!useDefineForClassFields) {
          properties = ts2.filter(properties, function(property) {
            return !!property.initializer || ts2.isPrivateIdentifier(property.name);
          });
        }
        var privateMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node);
        var needsConstructorBody = ts2.some(properties) || ts2.some(privateMethodsAndAccessors);
        if (!constructor && !needsConstructorBody) {
          return ts2.visitFunctionBody(void 0, visitor, context);
        }
        resumeLexicalEnvironment();
        var indexOfFirstStatement = 0;
        var statements = [];
        if (!constructor && isDerivedClass) {
          statements.push(factory.createExpressionStatement(factory.createCallExpression(factory.createSuper(), void 0, [factory.createSpreadElement(factory.createIdentifier("arguments"))])));
        }
        if (constructor) {
          indexOfFirstStatement = ts2.addPrologueDirectivesAndInitialSuperCall(factory, constructor, statements, visitor);
        }
        if (constructor === null || constructor === void 0 ? void 0 : constructor.body) {
          var afterParameterProperties = ts2.findIndex(constructor.body.statements, function(s) {
            return !ts2.isParameterPropertyDeclaration(ts2.getOriginalNode(s), constructor);
          }, indexOfFirstStatement);
          if (afterParameterProperties === -1) {
            afterParameterProperties = constructor.body.statements.length;
          }
          if (afterParameterProperties > indexOfFirstStatement) {
            if (!useDefineForClassFields) {
              ts2.addRange(statements, ts2.visitNodes(constructor.body.statements, visitor, ts2.isStatement, indexOfFirstStatement, afterParameterProperties - indexOfFirstStatement));
            }
            indexOfFirstStatement = afterParameterProperties;
          }
        }
        var receiver = factory.createThis();
        addMethodStatements(statements, privateMethodsAndAccessors, receiver);
        addPropertyOrClassStaticBlockStatements(statements, properties, receiver);
        if (constructor) {
          ts2.addRange(statements, ts2.visitNodes(constructor.body.statements, visitor, ts2.isStatement, indexOfFirstStatement));
        }
        statements = factory.mergeLexicalEnvironment(statements, endLexicalEnvironment());
        return ts2.setTextRange(factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), constructor ? constructor.body.statements : node.members), true), constructor ? constructor.body : void 0);
      }
      function addPropertyOrClassStaticBlockStatements(statements, properties, receiver) {
        for (var _i = 0, properties_7 = properties; _i < properties_7.length; _i++) {
          var property = properties_7[_i];
          var expression = ts2.isClassStaticBlockDeclaration(property) ? transformClassStaticBlockDeclaration(property) : transformProperty(property, receiver);
          if (!expression) {
            continue;
          }
          var statement = factory.createExpressionStatement(expression);
          ts2.setSourceMapRange(statement, ts2.moveRangePastModifiers(property));
          ts2.setCommentRange(statement, property);
          ts2.setOriginalNode(statement, property);
          statements.push(statement);
        }
      }
      function generateInitializedPropertyExpressionsOrClassStaticBlock(propertiesOrClassStaticBlocks, receiver) {
        var expressions = [];
        for (var _i = 0, propertiesOrClassStaticBlocks_1 = propertiesOrClassStaticBlocks; _i < propertiesOrClassStaticBlocks_1.length; _i++) {
          var property = propertiesOrClassStaticBlocks_1[_i];
          var expression = ts2.isClassStaticBlockDeclaration(property) ? transformClassStaticBlockDeclaration(property) : transformProperty(property, receiver);
          if (!expression) {
            continue;
          }
          ts2.startOnNewLine(expression);
          ts2.setSourceMapRange(expression, ts2.moveRangePastModifiers(property));
          ts2.setCommentRange(expression, property);
          ts2.setOriginalNode(expression, property);
          expressions.push(expression);
        }
        return expressions;
      }
      function transformProperty(property, receiver) {
        var savedCurrentStaticPropertyDeclarationOrStaticBlock = currentStaticPropertyDeclarationOrStaticBlock;
        var transformed = transformPropertyWorker(property, receiver);
        if (transformed && ts2.hasStaticModifier(property) && (currentClassLexicalEnvironment === null || currentClassLexicalEnvironment === void 0 ? void 0 : currentClassLexicalEnvironment.facts)) {
          ts2.setOriginalNode(transformed, property);
          ts2.addEmitFlags(transformed, 2);
          classLexicalEnvironmentMap.set(ts2.getOriginalNodeId(transformed), currentClassLexicalEnvironment);
        }
        currentStaticPropertyDeclarationOrStaticBlock = savedCurrentStaticPropertyDeclarationOrStaticBlock;
        return transformed;
      }
      function transformPropertyWorker(property, receiver) {
        var _a;
        var emitAssignment = !useDefineForClassFields;
        var propertyName = ts2.isComputedPropertyName(property.name) && !ts2.isSimpleInlineableExpression(property.name.expression) ? factory.updateComputedPropertyName(property.name, factory.getGeneratedNameForNode(property.name)) : property.name;
        if (ts2.hasStaticModifier(property)) {
          currentStaticPropertyDeclarationOrStaticBlock = property;
        }
        if (shouldTransformPrivateElementsOrClassStaticBlocks && ts2.isPrivateIdentifier(propertyName)) {
          var privateIdentifierInfo = accessPrivateIdentifier(propertyName);
          if (privateIdentifierInfo) {
            if (privateIdentifierInfo.kind === "f") {
              if (!privateIdentifierInfo.isStatic) {
                return createPrivateInstanceFieldInitializer(receiver, ts2.visitNode(property.initializer, visitor, ts2.isExpression), privateIdentifierInfo.brandCheckIdentifier);
              } else {
                return createPrivateStaticFieldInitializer(privateIdentifierInfo.variableName, ts2.visitNode(property.initializer, visitor, ts2.isExpression));
              }
            } else {
              return void 0;
            }
          } else {
            ts2.Debug.fail("Undeclared private name for property declaration.");
          }
        }
        if ((ts2.isPrivateIdentifier(propertyName) || ts2.hasStaticModifier(property)) && !property.initializer) {
          return void 0;
        }
        var propertyOriginalNode = ts2.getOriginalNode(property);
        if (ts2.hasSyntacticModifier(propertyOriginalNode, 128)) {
          return void 0;
        }
        var initializer = property.initializer || emitAssignment ? (_a = ts2.visitNode(property.initializer, visitor, ts2.isExpression)) !== null && _a !== void 0 ? _a : factory.createVoidZero() : ts2.isParameterPropertyDeclaration(propertyOriginalNode, propertyOriginalNode.parent) && ts2.isIdentifier(propertyName) ? propertyName : factory.createVoidZero();
        if (emitAssignment || ts2.isPrivateIdentifier(propertyName)) {
          var memberAccess = ts2.createMemberAccessForPropertyName(factory, receiver, propertyName, propertyName);
          return factory.createAssignment(memberAccess, initializer);
        } else {
          var name = ts2.isComputedPropertyName(propertyName) ? propertyName.expression : ts2.isIdentifier(propertyName) ? factory.createStringLiteral(ts2.unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName;
          var descriptor = factory.createPropertyDescriptor({ value: initializer, configurable: true, writable: true, enumerable: true });
          return factory.createObjectDefinePropertyCall(receiver, name, descriptor);
        }
      }
      function enableSubstitutionForClassAliases() {
        if ((enabledSubstitutions & 1) === 0) {
          enabledSubstitutions |= 1;
          context.enableSubstitution(79);
          classAliases = [];
        }
      }
      function enableSubstitutionForClassStaticThisOrSuperReference() {
        if ((enabledSubstitutions & 2) === 0) {
          enabledSubstitutions |= 2;
          context.enableSubstitution(108);
          context.enableEmitNotification(255);
          context.enableEmitNotification(212);
          context.enableEmitNotification(170);
          context.enableEmitNotification(171);
          context.enableEmitNotification(172);
          context.enableEmitNotification(168);
          context.enableEmitNotification(166);
          context.enableEmitNotification(161);
        }
      }
      function addMethodStatements(statements, methods, receiver) {
        if (!shouldTransformPrivateElementsOrClassStaticBlocks || !ts2.some(methods)) {
          return;
        }
        var weakSetName = getPrivateIdentifierEnvironment().weakSetName;
        ts2.Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
        statements.push(factory.createExpressionStatement(createPrivateInstanceMethodInitializer(receiver, weakSetName)));
      }
      function visitInvalidSuperProperty(node) {
        return ts2.isPropertyAccessExpression(node) ? factory.updatePropertyAccessExpression(node, factory.createVoidZero(), node.name) : factory.updateElementAccessExpression(node, factory.createVoidZero(), ts2.visitNode(node.argumentExpression, visitor, ts2.isExpression));
      }
      function onEmitNode(hint, node, emitCallback) {
        var original = ts2.getOriginalNode(node);
        if (original.id) {
          var classLexicalEnvironment = classLexicalEnvironmentMap.get(original.id);
          if (classLexicalEnvironment) {
            var savedClassLexicalEnvironment = currentClassLexicalEnvironment;
            var savedCurrentComputedPropertyNameClassLexicalEnvironment = currentComputedPropertyNameClassLexicalEnvironment;
            currentClassLexicalEnvironment = classLexicalEnvironment;
            currentComputedPropertyNameClassLexicalEnvironment = classLexicalEnvironment;
            previousOnEmitNode(hint, node, emitCallback);
            currentClassLexicalEnvironment = savedClassLexicalEnvironment;
            currentComputedPropertyNameClassLexicalEnvironment = savedCurrentComputedPropertyNameClassLexicalEnvironment;
            return;
          }
        }
        switch (node.kind) {
          case 212:
            if (ts2.isArrowFunction(original) || ts2.getEmitFlags(node) & 262144) {
              break;
            }
          case 255:
          case 170: {
            var savedClassLexicalEnvironment = currentClassLexicalEnvironment;
            var savedCurrentComputedPropertyNameClassLexicalEnvironment = currentComputedPropertyNameClassLexicalEnvironment;
            currentClassLexicalEnvironment = void 0;
            currentComputedPropertyNameClassLexicalEnvironment = void 0;
            previousOnEmitNode(hint, node, emitCallback);
            currentClassLexicalEnvironment = savedClassLexicalEnvironment;
            currentComputedPropertyNameClassLexicalEnvironment = savedCurrentComputedPropertyNameClassLexicalEnvironment;
            return;
          }
          case 171:
          case 172:
          case 168:
          case 166: {
            var savedClassLexicalEnvironment = currentClassLexicalEnvironment;
            var savedCurrentComputedPropertyNameClassLexicalEnvironment = currentComputedPropertyNameClassLexicalEnvironment;
            currentComputedPropertyNameClassLexicalEnvironment = currentClassLexicalEnvironment;
            currentClassLexicalEnvironment = void 0;
            previousOnEmitNode(hint, node, emitCallback);
            currentClassLexicalEnvironment = savedClassLexicalEnvironment;
            currentComputedPropertyNameClassLexicalEnvironment = savedCurrentComputedPropertyNameClassLexicalEnvironment;
            return;
          }
          case 161: {
            var savedClassLexicalEnvironment = currentClassLexicalEnvironment;
            var savedCurrentComputedPropertyNameClassLexicalEnvironment = currentComputedPropertyNameClassLexicalEnvironment;
            currentClassLexicalEnvironment = currentComputedPropertyNameClassLexicalEnvironment;
            currentComputedPropertyNameClassLexicalEnvironment = void 0;
            previousOnEmitNode(hint, node, emitCallback);
            currentClassLexicalEnvironment = savedClassLexicalEnvironment;
            currentComputedPropertyNameClassLexicalEnvironment = savedCurrentComputedPropertyNameClassLexicalEnvironment;
            return;
          }
        }
        previousOnEmitNode(hint, node, emitCallback);
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (hint === 1) {
          return substituteExpression(node);
        }
        return node;
      }
      function substituteExpression(node) {
        switch (node.kind) {
          case 79:
            return substituteExpressionIdentifier(node);
          case 108:
            return substituteThisExpression(node);
        }
        return node;
      }
      function substituteThisExpression(node) {
        if (enabledSubstitutions & 2 && currentClassLexicalEnvironment) {
          var facts = currentClassLexicalEnvironment.facts, classConstructor = currentClassLexicalEnvironment.classConstructor;
          if (facts & 1) {
            return factory.createParenthesizedExpression(factory.createVoidZero());
          }
          if (classConstructor) {
            return ts2.setTextRange(ts2.setOriginalNode(factory.cloneNode(classConstructor), node), node);
          }
        }
        return node;
      }
      function substituteExpressionIdentifier(node) {
        return trySubstituteClassAlias(node) || node;
      }
      function trySubstituteClassAlias(node) {
        if (enabledSubstitutions & 1) {
          if (resolver.getNodeCheckFlags(node) & 33554432) {
            var declaration = resolver.getReferencedValueDeclaration(node);
            if (declaration) {
              var classAlias = classAliases[declaration.id];
              if (classAlias) {
                var clone_3 = factory.cloneNode(classAlias);
                ts2.setSourceMapRange(clone_3, node);
                ts2.setCommentRange(clone_3, node);
                return clone_3;
              }
            }
          }
        }
        return void 0;
      }
      function getPropertyNameExpressionIfNeeded(name, shouldHoist) {
        if (ts2.isComputedPropertyName(name)) {
          var expression = ts2.visitNode(name.expression, visitor, ts2.isExpression);
          var innerExpression = ts2.skipPartiallyEmittedExpressions(expression);
          var inlinable = ts2.isSimpleInlineableExpression(innerExpression);
          var alreadyTransformed = ts2.isAssignmentExpression(innerExpression) && ts2.isGeneratedIdentifier(innerExpression.left);
          if (!alreadyTransformed && !inlinable && shouldHoist) {
            var generatedName = factory.getGeneratedNameForNode(name);
            if (resolver.getNodeCheckFlags(name) & 524288) {
              addBlockScopedVariable(generatedName);
            } else {
              hoistVariableDeclaration(generatedName);
            }
            return factory.createAssignment(generatedName, expression);
          }
          return inlinable || ts2.isIdentifier(innerExpression) ? void 0 : expression;
        }
      }
      function startClassLexicalEnvironment() {
        classLexicalEnvironmentStack.push(currentClassLexicalEnvironment);
        currentClassLexicalEnvironment = void 0;
      }
      function endClassLexicalEnvironment() {
        currentClassLexicalEnvironment = classLexicalEnvironmentStack.pop();
      }
      function getClassLexicalEnvironment() {
        return currentClassLexicalEnvironment || (currentClassLexicalEnvironment = {
          facts: 0,
          classConstructor: void 0,
          superClassReference: void 0,
          privateIdentifierEnvironment: void 0
        });
      }
      function getPrivateIdentifierEnvironment() {
        var lex = getClassLexicalEnvironment();
        lex.privateIdentifierEnvironment || (lex.privateIdentifierEnvironment = {
          className: "",
          identifiers: new ts2.Map()
        });
        return lex.privateIdentifierEnvironment;
      }
      function getPendingExpressions() {
        return pendingExpressions || (pendingExpressions = []);
      }
      function addPrivateIdentifierToEnvironment(node) {
        var _a;
        var text = ts2.getTextOfPropertyName(node.name);
        var lex = getClassLexicalEnvironment();
        var classConstructor = lex.classConstructor;
        var privateEnv = getPrivateIdentifierEnvironment();
        var weakSetName = privateEnv.weakSetName;
        var assignmentExpressions = [];
        var privateName = node.name.escapedText;
        var previousInfo = privateEnv.identifiers.get(privateName);
        var isValid = !isReservedPrivateName(node.name) && previousInfo === void 0;
        if (ts2.hasStaticModifier(node)) {
          ts2.Debug.assert(classConstructor, "weakSetName should be set in private identifier environment");
          if (ts2.isPropertyDeclaration(node)) {
            var variableName = createHoistedVariableForPrivateName(text, node);
            privateEnv.identifiers.set(privateName, {
              kind: "f",
              variableName,
              brandCheckIdentifier: classConstructor,
              isStatic: true,
              isValid
            });
          } else if (ts2.isMethodDeclaration(node)) {
            var functionName = createHoistedVariableForPrivateName(text, node);
            privateEnv.identifiers.set(privateName, {
              kind: "m",
              methodName: functionName,
              brandCheckIdentifier: classConstructor,
              isStatic: true,
              isValid
            });
          } else if (ts2.isGetAccessorDeclaration(node)) {
            var getterName = createHoistedVariableForPrivateName(text + "_get", node);
            if ((previousInfo === null || previousInfo === void 0 ? void 0 : previousInfo.kind) === "a" && previousInfo.isStatic && !previousInfo.getterName) {
              previousInfo.getterName = getterName;
            } else {
              privateEnv.identifiers.set(privateName, {
                kind: "a",
                getterName,
                setterName: void 0,
                brandCheckIdentifier: classConstructor,
                isStatic: true,
                isValid
              });
            }
          } else if (ts2.isSetAccessorDeclaration(node)) {
            var setterName = createHoistedVariableForPrivateName(text + "_set", node);
            if ((previousInfo === null || previousInfo === void 0 ? void 0 : previousInfo.kind) === "a" && previousInfo.isStatic && !previousInfo.setterName) {
              previousInfo.setterName = setterName;
            } else {
              privateEnv.identifiers.set(privateName, {
                kind: "a",
                getterName: void 0,
                setterName,
                brandCheckIdentifier: classConstructor,
                isStatic: true,
                isValid
              });
            }
          } else {
            ts2.Debug.assertNever(node, "Unknown class element type.");
          }
        } else if (ts2.isPropertyDeclaration(node)) {
          var weakMapName = createHoistedVariableForPrivateName(text, node);
          privateEnv.identifiers.set(privateName, {
            kind: "f",
            brandCheckIdentifier: weakMapName,
            isStatic: false,
            variableName: void 0,
            isValid
          });
          assignmentExpressions.push(factory.createAssignment(weakMapName, factory.createNewExpression(factory.createIdentifier("WeakMap"), void 0, [])));
        } else if (ts2.isMethodDeclaration(node)) {
          ts2.Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
          privateEnv.identifiers.set(privateName, {
            kind: "m",
            methodName: createHoistedVariableForPrivateName(text, node),
            brandCheckIdentifier: weakSetName,
            isStatic: false,
            isValid
          });
        } else if (ts2.isAccessor(node)) {
          ts2.Debug.assert(weakSetName, "weakSetName should be set in private identifier environment");
          if (ts2.isGetAccessor(node)) {
            var getterName = createHoistedVariableForPrivateName(text + "_get", node);
            if ((previousInfo === null || previousInfo === void 0 ? void 0 : previousInfo.kind) === "a" && !previousInfo.isStatic && !previousInfo.getterName) {
              previousInfo.getterName = getterName;
            } else {
              privateEnv.identifiers.set(privateName, {
                kind: "a",
                getterName,
                setterName: void 0,
                brandCheckIdentifier: weakSetName,
                isStatic: false,
                isValid
              });
            }
          } else {
            var setterName = createHoistedVariableForPrivateName(text + "_set", node);
            if ((previousInfo === null || previousInfo === void 0 ? void 0 : previousInfo.kind) === "a" && !previousInfo.isStatic && !previousInfo.setterName) {
              previousInfo.setterName = setterName;
            } else {
              privateEnv.identifiers.set(privateName, {
                kind: "a",
                getterName: void 0,
                setterName,
                brandCheckIdentifier: weakSetName,
                isStatic: false,
                isValid
              });
            }
          }
        } else {
          ts2.Debug.assertNever(node, "Unknown class element type.");
        }
        (_a = getPendingExpressions()).push.apply(_a, assignmentExpressions);
      }
      function createHoistedVariableForClass(name, node) {
        var className = getPrivateIdentifierEnvironment().className;
        var prefix = className ? "_".concat(className) : "";
        var identifier = factory.createUniqueName("".concat(prefix, "_").concat(name), 16);
        if (resolver.getNodeCheckFlags(node) & 524288) {
          addBlockScopedVariable(identifier);
        } else {
          hoistVariableDeclaration(identifier);
        }
        return identifier;
      }
      function createHoistedVariableForPrivateName(privateName, node) {
        return createHoistedVariableForClass(privateName.substring(1), node.name);
      }
      function accessPrivateIdentifier(name) {
        var _a;
        if (currentClassLexicalEnvironment === null || currentClassLexicalEnvironment === void 0 ? void 0 : currentClassLexicalEnvironment.privateIdentifierEnvironment) {
          var info = currentClassLexicalEnvironment.privateIdentifierEnvironment.identifiers.get(name.escapedText);
          if (info) {
            return info;
          }
        }
        for (var i = classLexicalEnvironmentStack.length - 1; i >= 0; --i) {
          var env = classLexicalEnvironmentStack[i];
          if (!env) {
            continue;
          }
          var info = (_a = env.privateIdentifierEnvironment) === null || _a === void 0 ? void 0 : _a.identifiers.get(name.escapedText);
          if (info) {
            return info;
          }
        }
        return void 0;
      }
      function wrapPrivateIdentifierForDestructuringTarget(node) {
        var parameter = factory.getGeneratedNameForNode(node);
        var info = accessPrivateIdentifier(node.name);
        if (!info) {
          return ts2.visitEachChild(node, visitor, context);
        }
        var receiver = node.expression;
        if (ts2.isThisProperty(node) || ts2.isSuperProperty(node) || !ts2.isSimpleCopiableExpression(node.expression)) {
          receiver = factory.createTempVariable(hoistVariableDeclaration, true);
          getPendingExpressions().push(factory.createBinaryExpression(receiver, 63, ts2.visitNode(node.expression, visitor, ts2.isExpression)));
        }
        return factory.createAssignmentTargetWrapper(parameter, createPrivateIdentifierAssignment(info, receiver, parameter, 63));
      }
      function visitArrayAssignmentTarget(node) {
        var target = ts2.getTargetOfBindingOrAssignmentElement(node);
        if (target) {
          var wrapped = void 0;
          if (ts2.isPrivateIdentifierPropertyAccessExpression(target)) {
            wrapped = wrapPrivateIdentifierForDestructuringTarget(target);
          } else if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(target) && currentStaticPropertyDeclarationOrStaticBlock && currentClassLexicalEnvironment) {
            var classConstructor = currentClassLexicalEnvironment.classConstructor, superClassReference = currentClassLexicalEnvironment.superClassReference, facts = currentClassLexicalEnvironment.facts;
            if (facts & 1) {
              wrapped = visitInvalidSuperProperty(target);
            } else if (classConstructor && superClassReference) {
              var name = ts2.isElementAccessExpression(target) ? ts2.visitNode(target.argumentExpression, visitor, ts2.isExpression) : ts2.isIdentifier(target.name) ? factory.createStringLiteralFromNode(target.name) : void 0;
              if (name) {
                var temp = factory.createTempVariable(void 0);
                wrapped = factory.createAssignmentTargetWrapper(temp, factory.createReflectSetCall(superClassReference, name, temp, classConstructor));
              }
            }
          }
          if (wrapped) {
            if (ts2.isAssignmentExpression(node)) {
              return factory.updateBinaryExpression(node, wrapped, node.operatorToken, ts2.visitNode(node.right, visitor, ts2.isExpression));
            } else if (ts2.isSpreadElement(node)) {
              return factory.updateSpreadElement(node, wrapped);
            } else {
              return wrapped;
            }
          }
        }
        return ts2.visitNode(node, visitorDestructuringTarget);
      }
      function visitObjectAssignmentTarget(node) {
        if (ts2.isObjectBindingOrAssignmentElement(node) && !ts2.isShorthandPropertyAssignment(node)) {
          var target = ts2.getTargetOfBindingOrAssignmentElement(node);
          var wrapped = void 0;
          if (target) {
            if (ts2.isPrivateIdentifierPropertyAccessExpression(target)) {
              wrapped = wrapPrivateIdentifierForDestructuringTarget(target);
            } else if (shouldTransformSuperInStaticInitializers && ts2.isSuperProperty(target) && currentStaticPropertyDeclarationOrStaticBlock && currentClassLexicalEnvironment) {
              var classConstructor = currentClassLexicalEnvironment.classConstructor, superClassReference = currentClassLexicalEnvironment.superClassReference, facts = currentClassLexicalEnvironment.facts;
              if (facts & 1) {
                wrapped = visitInvalidSuperProperty(target);
              } else if (classConstructor && superClassReference) {
                var name = ts2.isElementAccessExpression(target) ? ts2.visitNode(target.argumentExpression, visitor, ts2.isExpression) : ts2.isIdentifier(target.name) ? factory.createStringLiteralFromNode(target.name) : void 0;
                if (name) {
                  var temp = factory.createTempVariable(void 0);
                  wrapped = factory.createAssignmentTargetWrapper(temp, factory.createReflectSetCall(superClassReference, name, temp, classConstructor));
                }
              }
            }
          }
          if (ts2.isPropertyAssignment(node)) {
            var initializer = ts2.getInitializerOfBindingOrAssignmentElement(node);
            return factory.updatePropertyAssignment(node, ts2.visitNode(node.name, visitor, ts2.isPropertyName), wrapped ? initializer ? factory.createAssignment(wrapped, ts2.visitNode(initializer, visitor)) : wrapped : ts2.visitNode(node.initializer, visitorDestructuringTarget, ts2.isExpression));
          }
          if (ts2.isSpreadAssignment(node)) {
            return factory.updateSpreadAssignment(node, wrapped || ts2.visitNode(node.expression, visitorDestructuringTarget, ts2.isExpression));
          }
          ts2.Debug.assert(wrapped === void 0, "Should not have generated a wrapped target");
        }
        return ts2.visitNode(node, visitor);
      }
      function visitAssignmentPattern(node) {
        if (ts2.isArrayLiteralExpression(node)) {
          return factory.updateArrayLiteralExpression(node, ts2.visitNodes(node.elements, visitArrayAssignmentTarget, ts2.isExpression));
        } else {
          return factory.updateObjectLiteralExpression(node, ts2.visitNodes(node.properties, visitObjectAssignmentTarget, ts2.isObjectLiteralElementLike));
        }
      }
    }
    ts2.transformClassFields = transformClassFields;
    function createPrivateStaticFieldInitializer(variableName, initializer) {
      return ts2.factory.createAssignment(variableName, ts2.factory.createObjectLiteralExpression([
        ts2.factory.createPropertyAssignment("value", initializer || ts2.factory.createVoidZero())
      ]));
    }
    function createPrivateInstanceFieldInitializer(receiver, initializer, weakMapName) {
      return ts2.factory.createCallExpression(ts2.factory.createPropertyAccessExpression(weakMapName, "set"), void 0, [receiver, initializer || ts2.factory.createVoidZero()]);
    }
    function createPrivateInstanceMethodInitializer(receiver, weakSetName) {
      return ts2.factory.createCallExpression(ts2.factory.createPropertyAccessExpression(weakSetName, "add"), void 0, [receiver]);
    }
    function isReservedPrivateName(node) {
      return node.escapedText === "#constructor";
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var ES2017SubstitutionFlags;
    (function(ES2017SubstitutionFlags2) {
      ES2017SubstitutionFlags2[ES2017SubstitutionFlags2["AsyncMethodsWithSuper"] = 1] = "AsyncMethodsWithSuper";
    })(ES2017SubstitutionFlags || (ES2017SubstitutionFlags = {}));
    var ContextFlags;
    (function(ContextFlags2) {
      ContextFlags2[ContextFlags2["NonTopLevel"] = 1] = "NonTopLevel";
      ContextFlags2[ContextFlags2["HasLexicalThis"] = 2] = "HasLexicalThis";
    })(ContextFlags || (ContextFlags = {}));
    function transformES2017(context) {
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory, resumeLexicalEnvironment = context.resumeLexicalEnvironment, endLexicalEnvironment = context.endLexicalEnvironment, hoistVariableDeclaration = context.hoistVariableDeclaration;
      var resolver = context.getEmitResolver();
      var compilerOptions = context.getCompilerOptions();
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var enabledSubstitutions;
      var enclosingSuperContainerFlags = 0;
      var enclosingFunctionParameterNames;
      var capturedSuperProperties;
      var hasSuperElementAccess;
      var substitutedSuperAccessors = [];
      var contextFlags = 0;
      var previousOnEmitNode = context.onEmitNode;
      var previousOnSubstituteNode = context.onSubstituteNode;
      context.onEmitNode = onEmitNode;
      context.onSubstituteNode = onSubstituteNode;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        setContextFlag(1, false);
        setContextFlag(2, !ts2.isEffectiveStrictModeSourceFile(node, compilerOptions));
        var visited = ts2.visitEachChild(node, visitor, context);
        ts2.addEmitHelpers(visited, context.readEmitHelpers());
        return visited;
      }
      function setContextFlag(flag, val) {
        contextFlags = val ? contextFlags | flag : contextFlags & ~flag;
      }
      function inContext(flags) {
        return (contextFlags & flags) !== 0;
      }
      function inTopLevelContext() {
        return !inContext(1);
      }
      function inHasLexicalThisContext() {
        return inContext(2);
      }
      function doWithContext(flags, cb, value) {
        var contextFlagsToSet = flags & ~contextFlags;
        if (contextFlagsToSet) {
          setContextFlag(contextFlagsToSet, true);
          var result = cb(value);
          setContextFlag(contextFlagsToSet, false);
          return result;
        }
        return cb(value);
      }
      function visitDefault(node) {
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        if ((node.transformFlags & 128) === 0) {
          return node;
        }
        switch (node.kind) {
          case 131:
            return void 0;
          case 217:
            return visitAwaitExpression(node);
          case 168:
            return doWithContext(1 | 2, visitMethodDeclaration, node);
          case 255:
            return doWithContext(1 | 2, visitFunctionDeclaration, node);
          case 212:
            return doWithContext(1 | 2, visitFunctionExpression, node);
          case 213:
            return doWithContext(1, visitArrowFunction, node);
          case 205:
            if (capturedSuperProperties && ts2.isPropertyAccessExpression(node) && node.expression.kind === 106) {
              capturedSuperProperties.add(node.name.escapedText);
            }
            return ts2.visitEachChild(node, visitor, context);
          case 206:
            if (capturedSuperProperties && node.expression.kind === 106) {
              hasSuperElementAccess = true;
            }
            return ts2.visitEachChild(node, visitor, context);
          case 171:
          case 172:
          case 170:
          case 256:
          case 225:
            return doWithContext(1 | 2, visitDefault, node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function asyncBodyVisitor(node) {
        if (ts2.isNodeWithPossibleHoistedDeclaration(node)) {
          switch (node.kind) {
            case 236:
              return visitVariableStatementInAsyncBody(node);
            case 241:
              return visitForStatementInAsyncBody(node);
            case 242:
              return visitForInStatementInAsyncBody(node);
            case 243:
              return visitForOfStatementInAsyncBody(node);
            case 291:
              return visitCatchClauseInAsyncBody(node);
            case 234:
            case 248:
            case 262:
            case 288:
            case 289:
            case 251:
            case 239:
            case 240:
            case 238:
            case 247:
            case 249:
              return ts2.visitEachChild(node, asyncBodyVisitor, context);
            default:
              return ts2.Debug.assertNever(node, "Unhandled node.");
          }
        }
        return visitor(node);
      }
      function visitCatchClauseInAsyncBody(node) {
        var catchClauseNames = new ts2.Set();
        recordDeclarationName(node.variableDeclaration, catchClauseNames);
        var catchClauseUnshadowedNames;
        catchClauseNames.forEach(function(_, escapedName) {
          if (enclosingFunctionParameterNames.has(escapedName)) {
            if (!catchClauseUnshadowedNames) {
              catchClauseUnshadowedNames = new ts2.Set(enclosingFunctionParameterNames);
            }
            catchClauseUnshadowedNames.delete(escapedName);
          }
        });
        if (catchClauseUnshadowedNames) {
          var savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames;
          enclosingFunctionParameterNames = catchClauseUnshadowedNames;
          var result = ts2.visitEachChild(node, asyncBodyVisitor, context);
          enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames;
          return result;
        } else {
          return ts2.visitEachChild(node, asyncBodyVisitor, context);
        }
      }
      function visitVariableStatementInAsyncBody(node) {
        if (isVariableDeclarationListWithCollidingName(node.declarationList)) {
          var expression = visitVariableDeclarationListWithCollidingNames(node.declarationList, false);
          return expression ? factory.createExpressionStatement(expression) : void 0;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitForInStatementInAsyncBody(node) {
        return factory.updateForInStatement(node, isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames(node.initializer, true) : ts2.visitNode(node.initializer, visitor, ts2.isForInitializer), ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitIterationBody(node.statement, asyncBodyVisitor, context));
      }
      function visitForOfStatementInAsyncBody(node) {
        return factory.updateForOfStatement(node, ts2.visitNode(node.awaitModifier, visitor, ts2.isToken), isVariableDeclarationListWithCollidingName(node.initializer) ? visitVariableDeclarationListWithCollidingNames(node.initializer, true) : ts2.visitNode(node.initializer, visitor, ts2.isForInitializer), ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitIterationBody(node.statement, asyncBodyVisitor, context));
      }
      function visitForStatementInAsyncBody(node) {
        var initializer = node.initializer;
        return factory.updateForStatement(node, isVariableDeclarationListWithCollidingName(initializer) ? visitVariableDeclarationListWithCollidingNames(initializer, false) : ts2.visitNode(node.initializer, visitor, ts2.isForInitializer), ts2.visitNode(node.condition, visitor, ts2.isExpression), ts2.visitNode(node.incrementor, visitor, ts2.isExpression), ts2.visitIterationBody(node.statement, asyncBodyVisitor, context));
      }
      function visitAwaitExpression(node) {
        if (inTopLevelContext()) {
          return ts2.visitEachChild(node, visitor, context);
        }
        return ts2.setOriginalNode(ts2.setTextRange(factory.createYieldExpression(void 0, ts2.visitNode(node.expression, visitor, ts2.isExpression)), node), node);
      }
      function visitMethodDeclaration(node) {
        return factory.updateMethodDeclaration(node, void 0, ts2.visitNodes(node.modifiers, visitor, ts2.isModifier), node.asteriskToken, node.name, void 0, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, ts2.getFunctionFlags(node) & 2 ? transformAsyncFunctionBody(node) : ts2.visitFunctionBody(node.body, visitor, context));
      }
      function visitFunctionDeclaration(node) {
        return factory.updateFunctionDeclaration(node, void 0, ts2.visitNodes(node.modifiers, visitor, ts2.isModifier), node.asteriskToken, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, ts2.getFunctionFlags(node) & 2 ? transformAsyncFunctionBody(node) : ts2.visitFunctionBody(node.body, visitor, context));
      }
      function visitFunctionExpression(node) {
        return factory.updateFunctionExpression(node, ts2.visitNodes(node.modifiers, visitor, ts2.isModifier), node.asteriskToken, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, ts2.getFunctionFlags(node) & 2 ? transformAsyncFunctionBody(node) : ts2.visitFunctionBody(node.body, visitor, context));
      }
      function visitArrowFunction(node) {
        return factory.updateArrowFunction(node, ts2.visitNodes(node.modifiers, visitor, ts2.isModifier), void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, node.equalsGreaterThanToken, ts2.getFunctionFlags(node) & 2 ? transformAsyncFunctionBody(node) : ts2.visitFunctionBody(node.body, visitor, context));
      }
      function recordDeclarationName(_a, names) {
        var name = _a.name;
        if (ts2.isIdentifier(name)) {
          names.add(name.escapedText);
        } else {
          for (var _i = 0, _b = name.elements; _i < _b.length; _i++) {
            var element = _b[_i];
            if (!ts2.isOmittedExpression(element)) {
              recordDeclarationName(element, names);
            }
          }
        }
      }
      function isVariableDeclarationListWithCollidingName(node) {
        return !!node && ts2.isVariableDeclarationList(node) && !(node.flags & 3) && node.declarations.some(collidesWithParameterName);
      }
      function visitVariableDeclarationListWithCollidingNames(node, hasReceiver) {
        hoistVariableDeclarationList(node);
        var variables = ts2.getInitializedVariables(node);
        if (variables.length === 0) {
          if (hasReceiver) {
            return ts2.visitNode(factory.converters.convertToAssignmentElementTarget(node.declarations[0].name), visitor, ts2.isExpression);
          }
          return void 0;
        }
        return factory.inlineExpressions(ts2.map(variables, transformInitializedVariable));
      }
      function hoistVariableDeclarationList(node) {
        ts2.forEach(node.declarations, hoistVariable);
      }
      function hoistVariable(_a) {
        var name = _a.name;
        if (ts2.isIdentifier(name)) {
          hoistVariableDeclaration(name);
        } else {
          for (var _i = 0, _b = name.elements; _i < _b.length; _i++) {
            var element = _b[_i];
            if (!ts2.isOmittedExpression(element)) {
              hoistVariable(element);
            }
          }
        }
      }
      function transformInitializedVariable(node) {
        var converted = ts2.setSourceMapRange(factory.createAssignment(factory.converters.convertToAssignmentElementTarget(node.name), node.initializer), node);
        return ts2.visitNode(converted, visitor, ts2.isExpression);
      }
      function collidesWithParameterName(_a) {
        var name = _a.name;
        if (ts2.isIdentifier(name)) {
          return enclosingFunctionParameterNames.has(name.escapedText);
        } else {
          for (var _i = 0, _b = name.elements; _i < _b.length; _i++) {
            var element = _b[_i];
            if (!ts2.isOmittedExpression(element) && collidesWithParameterName(element)) {
              return true;
            }
          }
        }
        return false;
      }
      function transformAsyncFunctionBody(node) {
        resumeLexicalEnvironment();
        var original = ts2.getOriginalNode(node, ts2.isFunctionLike);
        var nodeType = original.type;
        var promiseConstructor = languageVersion < 2 ? getPromiseConstructor(nodeType) : void 0;
        var isArrowFunction = node.kind === 213;
        var hasLexicalArguments = (resolver.getNodeCheckFlags(node) & 8192) !== 0;
        var savedEnclosingFunctionParameterNames = enclosingFunctionParameterNames;
        enclosingFunctionParameterNames = new ts2.Set();
        for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
          var parameter = _a[_i];
          recordDeclarationName(parameter, enclosingFunctionParameterNames);
        }
        var savedCapturedSuperProperties = capturedSuperProperties;
        var savedHasSuperElementAccess = hasSuperElementAccess;
        if (!isArrowFunction) {
          capturedSuperProperties = new ts2.Set();
          hasSuperElementAccess = false;
        }
        var result;
        if (!isArrowFunction) {
          var statements = [];
          var statementOffset = factory.copyPrologue(node.body.statements, statements, false, visitor);
          statements.push(factory.createReturnStatement(emitHelpers().createAwaiterHelper(inHasLexicalThisContext(), hasLexicalArguments, promiseConstructor, transformAsyncFunctionBodyWorker(node.body, statementOffset))));
          ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
          var emitSuperHelpers = languageVersion >= 2 && resolver.getNodeCheckFlags(node) & (4096 | 2048);
          if (emitSuperHelpers) {
            enableSubstitutionForAsyncMethodsWithSuper();
            if (capturedSuperProperties.size) {
              var variableStatement = createSuperAccessVariableStatement(factory, resolver, node, capturedSuperProperties);
              substitutedSuperAccessors[ts2.getNodeId(variableStatement)] = true;
              ts2.insertStatementsAfterStandardPrologue(statements, [variableStatement]);
            }
          }
          var block = factory.createBlock(statements, true);
          ts2.setTextRange(block, node.body);
          if (emitSuperHelpers && hasSuperElementAccess) {
            if (resolver.getNodeCheckFlags(node) & 4096) {
              ts2.addEmitHelper(block, ts2.advancedAsyncSuperHelper);
            } else if (resolver.getNodeCheckFlags(node) & 2048) {
              ts2.addEmitHelper(block, ts2.asyncSuperHelper);
            }
          }
          result = block;
        } else {
          var expression = emitHelpers().createAwaiterHelper(inHasLexicalThisContext(), hasLexicalArguments, promiseConstructor, transformAsyncFunctionBodyWorker(node.body));
          var declarations = endLexicalEnvironment();
          if (ts2.some(declarations)) {
            var block = factory.converters.convertToFunctionBlock(expression);
            result = factory.updateBlock(block, ts2.setTextRange(factory.createNodeArray(ts2.concatenate(declarations, block.statements)), block.statements));
          } else {
            result = expression;
          }
        }
        enclosingFunctionParameterNames = savedEnclosingFunctionParameterNames;
        if (!isArrowFunction) {
          capturedSuperProperties = savedCapturedSuperProperties;
          hasSuperElementAccess = savedHasSuperElementAccess;
        }
        return result;
      }
      function transformAsyncFunctionBodyWorker(body, start) {
        if (ts2.isBlock(body)) {
          return factory.updateBlock(body, ts2.visitNodes(body.statements, asyncBodyVisitor, ts2.isStatement, start));
        } else {
          return factory.converters.convertToFunctionBlock(ts2.visitNode(body, asyncBodyVisitor, ts2.isConciseBody));
        }
      }
      function getPromiseConstructor(type) {
        var typeName = type && ts2.getEntityNameFromTypeNode(type);
        if (typeName && ts2.isEntityName(typeName)) {
          var serializationKind = resolver.getTypeReferenceSerializationKind(typeName);
          if (serializationKind === ts2.TypeReferenceSerializationKind.TypeWithConstructSignatureAndValue || serializationKind === ts2.TypeReferenceSerializationKind.Unknown) {
            return typeName;
          }
        }
        return void 0;
      }
      function enableSubstitutionForAsyncMethodsWithSuper() {
        if ((enabledSubstitutions & 1) === 0) {
          enabledSubstitutions |= 1;
          context.enableSubstitution(207);
          context.enableSubstitution(205);
          context.enableSubstitution(206);
          context.enableEmitNotification(256);
          context.enableEmitNotification(168);
          context.enableEmitNotification(171);
          context.enableEmitNotification(172);
          context.enableEmitNotification(170);
          context.enableEmitNotification(236);
        }
      }
      function onEmitNode(hint, node, emitCallback) {
        if (enabledSubstitutions & 1 && isSuperContainer(node)) {
          var superContainerFlags = resolver.getNodeCheckFlags(node) & (2048 | 4096);
          if (superContainerFlags !== enclosingSuperContainerFlags) {
            var savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
            enclosingSuperContainerFlags = superContainerFlags;
            previousOnEmitNode(hint, node, emitCallback);
            enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
            return;
          }
        } else if (enabledSubstitutions && substitutedSuperAccessors[ts2.getNodeId(node)]) {
          var savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
          enclosingSuperContainerFlags = 0;
          previousOnEmitNode(hint, node, emitCallback);
          enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
          return;
        }
        previousOnEmitNode(hint, node, emitCallback);
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (hint === 1 && enclosingSuperContainerFlags) {
          return substituteExpression(node);
        }
        return node;
      }
      function substituteExpression(node) {
        switch (node.kind) {
          case 205:
            return substitutePropertyAccessExpression(node);
          case 206:
            return substituteElementAccessExpression(node);
          case 207:
            return substituteCallExpression(node);
        }
        return node;
      }
      function substitutePropertyAccessExpression(node) {
        if (node.expression.kind === 106) {
          return ts2.setTextRange(factory.createPropertyAccessExpression(factory.createUniqueName("_super", 16 | 32), node.name), node);
        }
        return node;
      }
      function substituteElementAccessExpression(node) {
        if (node.expression.kind === 106) {
          return createSuperElementAccessInAsyncMethod(node.argumentExpression, node);
        }
        return node;
      }
      function substituteCallExpression(node) {
        var expression = node.expression;
        if (ts2.isSuperProperty(expression)) {
          var argumentExpression = ts2.isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression);
          return factory.createCallExpression(factory.createPropertyAccessExpression(argumentExpression, "call"), void 0, __spreadArray([
            factory.createThis()
          ], node.arguments, true));
        }
        return node;
      }
      function isSuperContainer(node) {
        var kind = node.kind;
        return kind === 256 || kind === 170 || kind === 168 || kind === 171 || kind === 172;
      }
      function createSuperElementAccessInAsyncMethod(argumentExpression, location) {
        if (enclosingSuperContainerFlags & 4096) {
          return ts2.setTextRange(factory.createPropertyAccessExpression(factory.createCallExpression(factory.createUniqueName("_superIndex", 16 | 32), void 0, [argumentExpression]), "value"), location);
        } else {
          return ts2.setTextRange(factory.createCallExpression(factory.createUniqueName("_superIndex", 16 | 32), void 0, [argumentExpression]), location);
        }
      }
    }
    ts2.transformES2017 = transformES2017;
    function createSuperAccessVariableStatement(factory, resolver, node, names) {
      var hasBinding = (resolver.getNodeCheckFlags(node) & 4096) !== 0;
      var accessors = [];
      names.forEach(function(_, key) {
        var name = ts2.unescapeLeadingUnderscores(key);
        var getterAndSetter = [];
        getterAndSetter.push(factory.createPropertyAssignment("get", factory.createArrowFunction(void 0, void 0, [], void 0, void 0, ts2.setEmitFlags(factory.createPropertyAccessExpression(ts2.setEmitFlags(factory.createSuper(), 4), name), 4))));
        if (hasBinding) {
          getterAndSetter.push(factory.createPropertyAssignment("set", factory.createArrowFunction(void 0, void 0, [
            factory.createParameterDeclaration(void 0, void 0, void 0, "v", void 0, void 0, void 0)
          ], void 0, void 0, factory.createAssignment(ts2.setEmitFlags(factory.createPropertyAccessExpression(ts2.setEmitFlags(factory.createSuper(), 4), name), 4), factory.createIdentifier("v")))));
        }
        accessors.push(factory.createPropertyAssignment(name, factory.createObjectLiteralExpression(getterAndSetter)));
      });
      return factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
        factory.createVariableDeclaration(factory.createUniqueName("_super", 16 | 32), void 0, void 0, factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("Object"), "create"), void 0, [
          factory.createNull(),
          factory.createObjectLiteralExpression(accessors, true)
        ]))
      ], 2));
    }
    ts2.createSuperAccessVariableStatement = createSuperAccessVariableStatement;
  })(ts || (ts = {}));
  (function(ts2) {
    var ESNextSubstitutionFlags;
    (function(ESNextSubstitutionFlags2) {
      ESNextSubstitutionFlags2[ESNextSubstitutionFlags2["AsyncMethodsWithSuper"] = 1] = "AsyncMethodsWithSuper";
    })(ESNextSubstitutionFlags || (ESNextSubstitutionFlags = {}));
    var HierarchyFacts;
    (function(HierarchyFacts2) {
      HierarchyFacts2[HierarchyFacts2["None"] = 0] = "None";
      HierarchyFacts2[HierarchyFacts2["HasLexicalThis"] = 1] = "HasLexicalThis";
      HierarchyFacts2[HierarchyFacts2["IterationContainer"] = 2] = "IterationContainer";
      HierarchyFacts2[HierarchyFacts2["AncestorFactsMask"] = 3] = "AncestorFactsMask";
      HierarchyFacts2[HierarchyFacts2["SourceFileIncludes"] = 1] = "SourceFileIncludes";
      HierarchyFacts2[HierarchyFacts2["SourceFileExcludes"] = 2] = "SourceFileExcludes";
      HierarchyFacts2[HierarchyFacts2["StrictModeSourceFileIncludes"] = 0] = "StrictModeSourceFileIncludes";
      HierarchyFacts2[HierarchyFacts2["ClassOrFunctionIncludes"] = 1] = "ClassOrFunctionIncludes";
      HierarchyFacts2[HierarchyFacts2["ClassOrFunctionExcludes"] = 2] = "ClassOrFunctionExcludes";
      HierarchyFacts2[HierarchyFacts2["ArrowFunctionIncludes"] = 0] = "ArrowFunctionIncludes";
      HierarchyFacts2[HierarchyFacts2["ArrowFunctionExcludes"] = 2] = "ArrowFunctionExcludes";
      HierarchyFacts2[HierarchyFacts2["IterationStatementIncludes"] = 2] = "IterationStatementIncludes";
      HierarchyFacts2[HierarchyFacts2["IterationStatementExcludes"] = 0] = "IterationStatementExcludes";
    })(HierarchyFacts || (HierarchyFacts = {}));
    function transformES2018(context) {
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory, resumeLexicalEnvironment = context.resumeLexicalEnvironment, endLexicalEnvironment = context.endLexicalEnvironment, hoistVariableDeclaration = context.hoistVariableDeclaration;
      var resolver = context.getEmitResolver();
      var compilerOptions = context.getCompilerOptions();
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var previousOnEmitNode = context.onEmitNode;
      context.onEmitNode = onEmitNode;
      var previousOnSubstituteNode = context.onSubstituteNode;
      context.onSubstituteNode = onSubstituteNode;
      var exportedVariableStatement = false;
      var enabledSubstitutions;
      var enclosingFunctionFlags;
      var enclosingSuperContainerFlags = 0;
      var hierarchyFacts = 0;
      var currentSourceFile;
      var taggedTemplateStringDeclarations;
      var capturedSuperProperties;
      var hasSuperElementAccess;
      var substitutedSuperAccessors = [];
      return ts2.chainBundle(context, transformSourceFile);
      function affectsSubtree(excludeFacts, includeFacts) {
        return hierarchyFacts !== (hierarchyFacts & ~excludeFacts | includeFacts);
      }
      function enterSubtree(excludeFacts, includeFacts) {
        var ancestorFacts = hierarchyFacts;
        hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 3;
        return ancestorFacts;
      }
      function exitSubtree(ancestorFacts) {
        hierarchyFacts = ancestorFacts;
      }
      function recordTaggedTemplateString(temp) {
        taggedTemplateStringDeclarations = ts2.append(taggedTemplateStringDeclarations, factory.createVariableDeclaration(temp));
      }
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        currentSourceFile = node;
        var visited = visitSourceFile(node);
        ts2.addEmitHelpers(visited, context.readEmitHelpers());
        currentSourceFile = void 0;
        taggedTemplateStringDeclarations = void 0;
        return visited;
      }
      function visitor(node) {
        return visitorWorker(node, false);
      }
      function visitorWithUnusedExpressionResult(node) {
        return visitorWorker(node, true);
      }
      function visitorNoAsyncModifier(node) {
        if (node.kind === 131) {
          return void 0;
        }
        return node;
      }
      function doWithHierarchyFacts(cb, value, excludeFacts, includeFacts) {
        if (affectsSubtree(excludeFacts, includeFacts)) {
          var ancestorFacts = enterSubtree(excludeFacts, includeFacts);
          var result = cb(value);
          exitSubtree(ancestorFacts);
          return result;
        }
        return cb(value);
      }
      function visitDefault(node) {
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitorWorker(node, expressionResultIsUnused) {
        if ((node.transformFlags & 64) === 0) {
          return node;
        }
        switch (node.kind) {
          case 217:
            return visitAwaitExpression(node);
          case 223:
            return visitYieldExpression(node);
          case 246:
            return visitReturnStatement(node);
          case 249:
            return visitLabeledStatement(node);
          case 204:
            return visitObjectLiteralExpression(node);
          case 220:
            return visitBinaryExpression(node, expressionResultIsUnused);
          case 349:
            return visitCommaListExpression(node, expressionResultIsUnused);
          case 291:
            return visitCatchClause(node);
          case 236:
            return visitVariableStatement(node);
          case 253:
            return visitVariableDeclaration(node);
          case 239:
          case 240:
          case 242:
            return doWithHierarchyFacts(visitDefault, node, 0, 2);
          case 243:
            return visitForOfStatement(node, void 0);
          case 241:
            return doWithHierarchyFacts(visitForStatement, node, 0, 2);
          case 216:
            return visitVoidExpression(node);
          case 170:
            return doWithHierarchyFacts(visitConstructorDeclaration, node, 2, 1);
          case 168:
            return doWithHierarchyFacts(visitMethodDeclaration, node, 2, 1);
          case 171:
            return doWithHierarchyFacts(visitGetAccessorDeclaration, node, 2, 1);
          case 172:
            return doWithHierarchyFacts(visitSetAccessorDeclaration, node, 2, 1);
          case 255:
            return doWithHierarchyFacts(visitFunctionDeclaration, node, 2, 1);
          case 212:
            return doWithHierarchyFacts(visitFunctionExpression, node, 2, 1);
          case 213:
            return doWithHierarchyFacts(visitArrowFunction, node, 2, 0);
          case 163:
            return visitParameter(node);
          case 237:
            return visitExpressionStatement(node);
          case 211:
            return visitParenthesizedExpression(node, expressionResultIsUnused);
          case 209:
            return visitTaggedTemplateExpression(node);
          case 205:
            if (capturedSuperProperties && ts2.isPropertyAccessExpression(node) && node.expression.kind === 106) {
              capturedSuperProperties.add(node.name.escapedText);
            }
            return ts2.visitEachChild(node, visitor, context);
          case 206:
            if (capturedSuperProperties && node.expression.kind === 106) {
              hasSuperElementAccess = true;
            }
            return ts2.visitEachChild(node, visitor, context);
          case 256:
          case 225:
            return doWithHierarchyFacts(visitDefault, node, 2, 1);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitAwaitExpression(node) {
        if (enclosingFunctionFlags & 2 && enclosingFunctionFlags & 1) {
          return ts2.setOriginalNode(ts2.setTextRange(factory.createYieldExpression(void 0, emitHelpers().createAwaitHelper(ts2.visitNode(node.expression, visitor, ts2.isExpression))), node), node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitYieldExpression(node) {
        if (enclosingFunctionFlags & 2 && enclosingFunctionFlags & 1) {
          if (node.asteriskToken) {
            var expression = ts2.visitNode(ts2.Debug.assertDefined(node.expression), visitor, ts2.isExpression);
            return ts2.setOriginalNode(ts2.setTextRange(factory.createYieldExpression(void 0, emitHelpers().createAwaitHelper(factory.updateYieldExpression(node, node.asteriskToken, ts2.setTextRange(emitHelpers().createAsyncDelegatorHelper(ts2.setTextRange(emitHelpers().createAsyncValuesHelper(expression), expression)), expression)))), node), node);
          }
          return ts2.setOriginalNode(ts2.setTextRange(factory.createYieldExpression(void 0, createDownlevelAwait(node.expression ? ts2.visitNode(node.expression, visitor, ts2.isExpression) : factory.createVoidZero())), node), node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitReturnStatement(node) {
        if (enclosingFunctionFlags & 2 && enclosingFunctionFlags & 1) {
          return factory.updateReturnStatement(node, createDownlevelAwait(node.expression ? ts2.visitNode(node.expression, visitor, ts2.isExpression) : factory.createVoidZero()));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitLabeledStatement(node) {
        if (enclosingFunctionFlags & 2) {
          var statement = ts2.unwrapInnermostStatementOfLabel(node);
          if (statement.kind === 243 && statement.awaitModifier) {
            return visitForOfStatement(statement, node);
          }
          return factory.restoreEnclosingLabel(ts2.visitNode(statement, visitor, ts2.isStatement, factory.liftToBlock), node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function chunkObjectLiteralElements(elements) {
        var chunkObject;
        var objects = [];
        for (var _i = 0, elements_4 = elements; _i < elements_4.length; _i++) {
          var e = elements_4[_i];
          if (e.kind === 296) {
            if (chunkObject) {
              objects.push(factory.createObjectLiteralExpression(chunkObject));
              chunkObject = void 0;
            }
            var target = e.expression;
            objects.push(ts2.visitNode(target, visitor, ts2.isExpression));
          } else {
            chunkObject = ts2.append(chunkObject, e.kind === 294 ? factory.createPropertyAssignment(e.name, ts2.visitNode(e.initializer, visitor, ts2.isExpression)) : ts2.visitNode(e, visitor, ts2.isObjectLiteralElementLike));
          }
        }
        if (chunkObject) {
          objects.push(factory.createObjectLiteralExpression(chunkObject));
        }
        return objects;
      }
      function visitObjectLiteralExpression(node) {
        if (node.transformFlags & 32768) {
          var objects = chunkObjectLiteralElements(node.properties);
          if (objects.length && objects[0].kind !== 204) {
            objects.unshift(factory.createObjectLiteralExpression());
          }
          var expression = objects[0];
          if (objects.length > 1) {
            for (var i = 1; i < objects.length; i++) {
              expression = emitHelpers().createAssignHelper([expression, objects[i]]);
            }
            return expression;
          } else {
            return emitHelpers().createAssignHelper(objects);
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitExpressionStatement(node) {
        return ts2.visitEachChild(node, visitorWithUnusedExpressionResult, context);
      }
      function visitParenthesizedExpression(node, expressionResultIsUnused) {
        return ts2.visitEachChild(node, expressionResultIsUnused ? visitorWithUnusedExpressionResult : visitor, context);
      }
      function visitSourceFile(node) {
        var ancestorFacts = enterSubtree(2, ts2.isEffectiveStrictModeSourceFile(node, compilerOptions) ? 0 : 1);
        exportedVariableStatement = false;
        var visited = ts2.visitEachChild(node, visitor, context);
        var statement = ts2.concatenate(visited.statements, taggedTemplateStringDeclarations && [
          factory.createVariableStatement(void 0, factory.createVariableDeclarationList(taggedTemplateStringDeclarations))
        ]);
        var result = factory.updateSourceFile(visited, ts2.setTextRange(factory.createNodeArray(statement), node.statements));
        exitSubtree(ancestorFacts);
        return result;
      }
      function visitTaggedTemplateExpression(node) {
        return ts2.processTaggedTemplateExpression(context, node, visitor, currentSourceFile, recordTaggedTemplateString, ts2.ProcessLevel.LiftRestriction);
      }
      function visitBinaryExpression(node, expressionResultIsUnused) {
        if (ts2.isDestructuringAssignment(node) && node.left.transformFlags & 32768) {
          return ts2.flattenDestructuringAssignment(node, visitor, context, 1, !expressionResultIsUnused);
        }
        if (node.operatorToken.kind === 27) {
          return factory.updateBinaryExpression(node, ts2.visitNode(node.left, visitorWithUnusedExpressionResult, ts2.isExpression), node.operatorToken, ts2.visitNode(node.right, expressionResultIsUnused ? visitorWithUnusedExpressionResult : visitor, ts2.isExpression));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitCommaListExpression(node, expressionResultIsUnused) {
        if (expressionResultIsUnused) {
          return ts2.visitEachChild(node, visitorWithUnusedExpressionResult, context);
        }
        var result;
        for (var i = 0; i < node.elements.length; i++) {
          var element = node.elements[i];
          var visited = ts2.visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, ts2.isExpression);
          if (result || visited !== element) {
            result || (result = node.elements.slice(0, i));
            result.push(visited);
          }
        }
        var elements = result ? ts2.setTextRange(factory.createNodeArray(result), node.elements) : node.elements;
        return factory.updateCommaListExpression(node, elements);
      }
      function visitCatchClause(node) {
        if (node.variableDeclaration && ts2.isBindingPattern(node.variableDeclaration.name) && node.variableDeclaration.name.transformFlags & 32768) {
          var name = factory.getGeneratedNameForNode(node.variableDeclaration.name);
          var updatedDecl = factory.updateVariableDeclaration(node.variableDeclaration, node.variableDeclaration.name, void 0, void 0, name);
          var visitedBindings = ts2.flattenDestructuringBinding(updatedDecl, visitor, context, 1);
          var block = ts2.visitNode(node.block, visitor, ts2.isBlock);
          if (ts2.some(visitedBindings)) {
            block = factory.updateBlock(block, __spreadArray([
              factory.createVariableStatement(void 0, visitedBindings)
            ], block.statements, true));
          }
          return factory.updateCatchClause(node, factory.updateVariableDeclaration(node.variableDeclaration, name, void 0, void 0, void 0), block);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitVariableStatement(node) {
        if (ts2.hasSyntacticModifier(node, 1)) {
          var savedExportedVariableStatement = exportedVariableStatement;
          exportedVariableStatement = true;
          var visited = ts2.visitEachChild(node, visitor, context);
          exportedVariableStatement = savedExportedVariableStatement;
          return visited;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitVariableDeclaration(node) {
        if (exportedVariableStatement) {
          var savedExportedVariableStatement = exportedVariableStatement;
          exportedVariableStatement = false;
          var visited = visitVariableDeclarationWorker(node, true);
          exportedVariableStatement = savedExportedVariableStatement;
          return visited;
        }
        return visitVariableDeclarationWorker(node, false);
      }
      function visitVariableDeclarationWorker(node, exportedVariableStatement2) {
        if (ts2.isBindingPattern(node.name) && node.name.transformFlags & 32768) {
          return ts2.flattenDestructuringBinding(node, visitor, context, 1, void 0, exportedVariableStatement2);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitForStatement(node) {
        return factory.updateForStatement(node, ts2.visitNode(node.initializer, visitorWithUnusedExpressionResult, ts2.isForInitializer), ts2.visitNode(node.condition, visitor, ts2.isExpression), ts2.visitNode(node.incrementor, visitorWithUnusedExpressionResult, ts2.isExpression), ts2.visitIterationBody(node.statement, visitor, context));
      }
      function visitVoidExpression(node) {
        return ts2.visitEachChild(node, visitorWithUnusedExpressionResult, context);
      }
      function visitForOfStatement(node, outermostLabeledStatement) {
        var ancestorFacts = enterSubtree(0, 2);
        if (node.initializer.transformFlags & 32768) {
          node = transformForOfStatementWithObjectRest(node);
        }
        var result = node.awaitModifier ? transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) : factory.restoreEnclosingLabel(ts2.visitEachChild(node, visitor, context), outermostLabeledStatement);
        exitSubtree(ancestorFacts);
        return result;
      }
      function transformForOfStatementWithObjectRest(node) {
        var initializerWithoutParens = ts2.skipParentheses(node.initializer);
        if (ts2.isVariableDeclarationList(initializerWithoutParens) || ts2.isAssignmentPattern(initializerWithoutParens)) {
          var bodyLocation = void 0;
          var statementsLocation = void 0;
          var temp = factory.createTempVariable(void 0);
          var statements = [ts2.createForOfBindingStatement(factory, initializerWithoutParens, temp)];
          if (ts2.isBlock(node.statement)) {
            ts2.addRange(statements, node.statement.statements);
            bodyLocation = node.statement;
            statementsLocation = node.statement.statements;
          } else if (node.statement) {
            ts2.append(statements, node.statement);
            bodyLocation = node.statement;
            statementsLocation = node.statement;
          }
          return factory.updateForOfStatement(node, node.awaitModifier, ts2.setTextRange(factory.createVariableDeclarationList([
            ts2.setTextRange(factory.createVariableDeclaration(temp), node.initializer)
          ], 1), node.initializer), node.expression, ts2.setTextRange(factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), statementsLocation), true), bodyLocation));
        }
        return node;
      }
      function convertForOfStatementHead(node, boundValue) {
        var binding = ts2.createForOfBindingStatement(factory, node.initializer, boundValue);
        var bodyLocation;
        var statementsLocation;
        var statements = [ts2.visitNode(binding, visitor, ts2.isStatement)];
        var statement = ts2.visitIterationBody(node.statement, visitor, context);
        if (ts2.isBlock(statement)) {
          ts2.addRange(statements, statement.statements);
          bodyLocation = statement;
          statementsLocation = statement.statements;
        } else {
          statements.push(statement);
        }
        return ts2.setEmitFlags(ts2.setTextRange(factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), statementsLocation), true), bodyLocation), 48 | 384);
      }
      function createDownlevelAwait(expression) {
        return enclosingFunctionFlags & 1 ? factory.createYieldExpression(void 0, emitHelpers().createAwaitHelper(expression)) : factory.createAwaitExpression(expression);
      }
      function transformForAwaitOfStatement(node, outermostLabeledStatement, ancestorFacts) {
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        var iterator = ts2.isIdentifier(expression) ? factory.getGeneratedNameForNode(expression) : factory.createTempVariable(void 0);
        var result = ts2.isIdentifier(expression) ? factory.getGeneratedNameForNode(iterator) : factory.createTempVariable(void 0);
        var errorRecord = factory.createUniqueName("e");
        var catchVariable = factory.getGeneratedNameForNode(errorRecord);
        var returnMethod = factory.createTempVariable(void 0);
        var callValues = ts2.setTextRange(emitHelpers().createAsyncValuesHelper(expression), node.expression);
        var callNext = factory.createCallExpression(factory.createPropertyAccessExpression(iterator, "next"), void 0, []);
        var getDone = factory.createPropertyAccessExpression(result, "done");
        var getValue = factory.createPropertyAccessExpression(result, "value");
        var callReturn = factory.createFunctionCallCall(returnMethod, iterator, []);
        hoistVariableDeclaration(errorRecord);
        hoistVariableDeclaration(returnMethod);
        var initializer = ancestorFacts & 2 ? factory.inlineExpressions([factory.createAssignment(errorRecord, factory.createVoidZero()), callValues]) : callValues;
        var forStatement = ts2.setEmitFlags(ts2.setTextRange(factory.createForStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createVariableDeclarationList([
          ts2.setTextRange(factory.createVariableDeclaration(iterator, void 0, void 0, initializer), node.expression),
          factory.createVariableDeclaration(result)
        ]), node.expression), 2097152), factory.createComma(factory.createAssignment(result, createDownlevelAwait(callNext)), factory.createLogicalNot(getDone)), void 0, convertForOfStatementHead(node, getValue)), node), 256);
        return factory.createTryStatement(factory.createBlock([
          factory.restoreEnclosingLabel(forStatement, outermostLabeledStatement)
        ]), factory.createCatchClause(factory.createVariableDeclaration(catchVariable), ts2.setEmitFlags(factory.createBlock([
          factory.createExpressionStatement(factory.createAssignment(errorRecord, factory.createObjectLiteralExpression([
            factory.createPropertyAssignment("error", catchVariable)
          ])))
        ]), 1)), factory.createBlock([
          factory.createTryStatement(factory.createBlock([
            ts2.setEmitFlags(factory.createIfStatement(factory.createLogicalAnd(factory.createLogicalAnd(result, factory.createLogicalNot(getDone)), factory.createAssignment(returnMethod, factory.createPropertyAccessExpression(iterator, "return"))), factory.createExpressionStatement(createDownlevelAwait(callReturn))), 1)
          ]), void 0, ts2.setEmitFlags(factory.createBlock([
            ts2.setEmitFlags(factory.createIfStatement(errorRecord, factory.createThrowStatement(factory.createPropertyAccessExpression(errorRecord, "error"))), 1)
          ]), 1))
        ]));
      }
      function visitParameter(node) {
        if (node.transformFlags & 32768) {
          return factory.updateParameterDeclaration(node, void 0, void 0, node.dotDotDotToken, factory.getGeneratedNameForNode(node), void 0, void 0, ts2.visitNode(node.initializer, visitor, ts2.isExpression));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitConstructorDeclaration(node) {
        var savedEnclosingFunctionFlags = enclosingFunctionFlags;
        enclosingFunctionFlags = 0;
        var updated = factory.updateConstructorDeclaration(node, void 0, node.modifiers, ts2.visitParameterList(node.parameters, visitor, context), transformFunctionBody(node));
        enclosingFunctionFlags = savedEnclosingFunctionFlags;
        return updated;
      }
      function visitGetAccessorDeclaration(node) {
        var savedEnclosingFunctionFlags = enclosingFunctionFlags;
        enclosingFunctionFlags = 0;
        var updated = factory.updateGetAccessorDeclaration(node, void 0, node.modifiers, ts2.visitNode(node.name, visitor, ts2.isPropertyName), ts2.visitParameterList(node.parameters, visitor, context), void 0, transformFunctionBody(node));
        enclosingFunctionFlags = savedEnclosingFunctionFlags;
        return updated;
      }
      function visitSetAccessorDeclaration(node) {
        var savedEnclosingFunctionFlags = enclosingFunctionFlags;
        enclosingFunctionFlags = 0;
        var updated = factory.updateSetAccessorDeclaration(node, void 0, node.modifiers, ts2.visitNode(node.name, visitor, ts2.isPropertyName), ts2.visitParameterList(node.parameters, visitor, context), transformFunctionBody(node));
        enclosingFunctionFlags = savedEnclosingFunctionFlags;
        return updated;
      }
      function visitMethodDeclaration(node) {
        var savedEnclosingFunctionFlags = enclosingFunctionFlags;
        enclosingFunctionFlags = ts2.getFunctionFlags(node);
        var updated = factory.updateMethodDeclaration(node, void 0, enclosingFunctionFlags & 1 ? ts2.visitNodes(node.modifiers, visitorNoAsyncModifier, ts2.isModifier) : node.modifiers, enclosingFunctionFlags & 2 ? void 0 : node.asteriskToken, ts2.visitNode(node.name, visitor, ts2.isPropertyName), ts2.visitNode(void 0, visitor, ts2.isToken), void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, enclosingFunctionFlags & 2 && enclosingFunctionFlags & 1 ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node));
        enclosingFunctionFlags = savedEnclosingFunctionFlags;
        return updated;
      }
      function visitFunctionDeclaration(node) {
        var savedEnclosingFunctionFlags = enclosingFunctionFlags;
        enclosingFunctionFlags = ts2.getFunctionFlags(node);
        var updated = factory.updateFunctionDeclaration(node, void 0, enclosingFunctionFlags & 1 ? ts2.visitNodes(node.modifiers, visitorNoAsyncModifier, ts2.isModifier) : node.modifiers, enclosingFunctionFlags & 2 ? void 0 : node.asteriskToken, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, enclosingFunctionFlags & 2 && enclosingFunctionFlags & 1 ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node));
        enclosingFunctionFlags = savedEnclosingFunctionFlags;
        return updated;
      }
      function visitArrowFunction(node) {
        var savedEnclosingFunctionFlags = enclosingFunctionFlags;
        enclosingFunctionFlags = ts2.getFunctionFlags(node);
        var updated = factory.updateArrowFunction(node, node.modifiers, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, node.equalsGreaterThanToken, transformFunctionBody(node));
        enclosingFunctionFlags = savedEnclosingFunctionFlags;
        return updated;
      }
      function visitFunctionExpression(node) {
        var savedEnclosingFunctionFlags = enclosingFunctionFlags;
        enclosingFunctionFlags = ts2.getFunctionFlags(node);
        var updated = factory.updateFunctionExpression(node, enclosingFunctionFlags & 1 ? ts2.visitNodes(node.modifiers, visitorNoAsyncModifier, ts2.isModifier) : node.modifiers, enclosingFunctionFlags & 2 ? void 0 : node.asteriskToken, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, enclosingFunctionFlags & 2 && enclosingFunctionFlags & 1 ? transformAsyncGeneratorFunctionBody(node) : transformFunctionBody(node));
        enclosingFunctionFlags = savedEnclosingFunctionFlags;
        return updated;
      }
      function transformAsyncGeneratorFunctionBody(node) {
        resumeLexicalEnvironment();
        var statements = [];
        var statementOffset = factory.copyPrologue(node.body.statements, statements, false, visitor);
        appendObjectRestAssignmentsIfNeeded(statements, node);
        var savedCapturedSuperProperties = capturedSuperProperties;
        var savedHasSuperElementAccess = hasSuperElementAccess;
        capturedSuperProperties = new ts2.Set();
        hasSuperElementAccess = false;
        var returnStatement = factory.createReturnStatement(emitHelpers().createAsyncGeneratorHelper(factory.createFunctionExpression(void 0, factory.createToken(41), node.name && factory.getGeneratedNameForNode(node.name), void 0, [], void 0, factory.updateBlock(node.body, ts2.visitLexicalEnvironment(node.body.statements, visitor, context, statementOffset))), !!(hierarchyFacts & 1)));
        var emitSuperHelpers = languageVersion >= 2 && resolver.getNodeCheckFlags(node) & (4096 | 2048);
        if (emitSuperHelpers) {
          enableSubstitutionForAsyncMethodsWithSuper();
          var variableStatement = ts2.createSuperAccessVariableStatement(factory, resolver, node, capturedSuperProperties);
          substitutedSuperAccessors[ts2.getNodeId(variableStatement)] = true;
          ts2.insertStatementsAfterStandardPrologue(statements, [variableStatement]);
        }
        statements.push(returnStatement);
        ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
        var block = factory.updateBlock(node.body, statements);
        if (emitSuperHelpers && hasSuperElementAccess) {
          if (resolver.getNodeCheckFlags(node) & 4096) {
            ts2.addEmitHelper(block, ts2.advancedAsyncSuperHelper);
          } else if (resolver.getNodeCheckFlags(node) & 2048) {
            ts2.addEmitHelper(block, ts2.asyncSuperHelper);
          }
        }
        capturedSuperProperties = savedCapturedSuperProperties;
        hasSuperElementAccess = savedHasSuperElementAccess;
        return block;
      }
      function transformFunctionBody(node) {
        var _a;
        resumeLexicalEnvironment();
        var statementOffset = 0;
        var statements = [];
        var body = (_a = ts2.visitNode(node.body, visitor, ts2.isConciseBody)) !== null && _a !== void 0 ? _a : factory.createBlock([]);
        if (ts2.isBlock(body)) {
          statementOffset = factory.copyPrologue(body.statements, statements, false, visitor);
        }
        ts2.addRange(statements, appendObjectRestAssignmentsIfNeeded(void 0, node));
        var leadingStatements = endLexicalEnvironment();
        if (statementOffset > 0 || ts2.some(statements) || ts2.some(leadingStatements)) {
          var block = factory.converters.convertToFunctionBlock(body, true);
          ts2.insertStatementsAfterStandardPrologue(statements, leadingStatements);
          ts2.addRange(statements, block.statements.slice(statementOffset));
          return factory.updateBlock(block, ts2.setTextRange(factory.createNodeArray(statements), block.statements));
        }
        return body;
      }
      function appendObjectRestAssignmentsIfNeeded(statements, node) {
        for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
          var parameter = _a[_i];
          if (parameter.transformFlags & 32768) {
            var temp = factory.getGeneratedNameForNode(parameter);
            var declarations = ts2.flattenDestructuringBinding(parameter, visitor, context, 1, temp, false, true);
            if (ts2.some(declarations)) {
              var statement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList(declarations));
              ts2.setEmitFlags(statement, 1048576);
              statements = ts2.append(statements, statement);
            }
          }
        }
        return statements;
      }
      function enableSubstitutionForAsyncMethodsWithSuper() {
        if ((enabledSubstitutions & 1) === 0) {
          enabledSubstitutions |= 1;
          context.enableSubstitution(207);
          context.enableSubstitution(205);
          context.enableSubstitution(206);
          context.enableEmitNotification(256);
          context.enableEmitNotification(168);
          context.enableEmitNotification(171);
          context.enableEmitNotification(172);
          context.enableEmitNotification(170);
          context.enableEmitNotification(236);
        }
      }
      function onEmitNode(hint, node, emitCallback) {
        if (enabledSubstitutions & 1 && isSuperContainer(node)) {
          var superContainerFlags = resolver.getNodeCheckFlags(node) & (2048 | 4096);
          if (superContainerFlags !== enclosingSuperContainerFlags) {
            var savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
            enclosingSuperContainerFlags = superContainerFlags;
            previousOnEmitNode(hint, node, emitCallback);
            enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
            return;
          }
        } else if (enabledSubstitutions && substitutedSuperAccessors[ts2.getNodeId(node)]) {
          var savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags;
          enclosingSuperContainerFlags = 0;
          previousOnEmitNode(hint, node, emitCallback);
          enclosingSuperContainerFlags = savedEnclosingSuperContainerFlags;
          return;
        }
        previousOnEmitNode(hint, node, emitCallback);
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (hint === 1 && enclosingSuperContainerFlags) {
          return substituteExpression(node);
        }
        return node;
      }
      function substituteExpression(node) {
        switch (node.kind) {
          case 205:
            return substitutePropertyAccessExpression(node);
          case 206:
            return substituteElementAccessExpression(node);
          case 207:
            return substituteCallExpression(node);
        }
        return node;
      }
      function substitutePropertyAccessExpression(node) {
        if (node.expression.kind === 106) {
          return ts2.setTextRange(factory.createPropertyAccessExpression(factory.createUniqueName("_super", 16 | 32), node.name), node);
        }
        return node;
      }
      function substituteElementAccessExpression(node) {
        if (node.expression.kind === 106) {
          return createSuperElementAccessInAsyncMethod(node.argumentExpression, node);
        }
        return node;
      }
      function substituteCallExpression(node) {
        var expression = node.expression;
        if (ts2.isSuperProperty(expression)) {
          var argumentExpression = ts2.isPropertyAccessExpression(expression) ? substitutePropertyAccessExpression(expression) : substituteElementAccessExpression(expression);
          return factory.createCallExpression(factory.createPropertyAccessExpression(argumentExpression, "call"), void 0, __spreadArray([
            factory.createThis()
          ], node.arguments, true));
        }
        return node;
      }
      function isSuperContainer(node) {
        var kind = node.kind;
        return kind === 256 || kind === 170 || kind === 168 || kind === 171 || kind === 172;
      }
      function createSuperElementAccessInAsyncMethod(argumentExpression, location) {
        if (enclosingSuperContainerFlags & 4096) {
          return ts2.setTextRange(factory.createPropertyAccessExpression(factory.createCallExpression(factory.createIdentifier("_superIndex"), void 0, [argumentExpression]), "value"), location);
        } else {
          return ts2.setTextRange(factory.createCallExpression(factory.createIdentifier("_superIndex"), void 0, [argumentExpression]), location);
        }
      }
    }
    ts2.transformES2018 = transformES2018;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformES2019(context) {
      var factory = context.factory;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        if ((node.transformFlags & 32) === 0) {
          return node;
        }
        switch (node.kind) {
          case 291:
            return visitCatchClause(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitCatchClause(node) {
        if (!node.variableDeclaration) {
          return factory.updateCatchClause(node, factory.createVariableDeclaration(factory.createTempVariable(void 0)), ts2.visitNode(node.block, visitor, ts2.isBlock));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
    }
    ts2.transformES2019 = transformES2019;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformES2020(context) {
      var factory = context.factory, hoistVariableDeclaration = context.hoistVariableDeclaration;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        if ((node.transformFlags & 16) === 0) {
          return node;
        }
        switch (node.kind) {
          case 207: {
            var updated = visitNonOptionalCallExpression(node, false);
            ts2.Debug.assertNotNode(updated, ts2.isSyntheticReference);
            return updated;
          }
          case 205:
          case 206:
            if (ts2.isOptionalChain(node)) {
              var updated = visitOptionalExpression(node, false, false);
              ts2.Debug.assertNotNode(updated, ts2.isSyntheticReference);
              return updated;
            }
            return ts2.visitEachChild(node, visitor, context);
          case 220:
            if (node.operatorToken.kind === 60) {
              return transformNullishCoalescingExpression(node);
            }
            return ts2.visitEachChild(node, visitor, context);
          case 214:
            return visitDeleteExpression(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function flattenChain(chain) {
        ts2.Debug.assertNotNode(chain, ts2.isNonNullChain);
        var links = [chain];
        while (!chain.questionDotToken && !ts2.isTaggedTemplateExpression(chain)) {
          chain = ts2.cast(ts2.skipPartiallyEmittedExpressions(chain.expression), ts2.isOptionalChain);
          ts2.Debug.assertNotNode(chain, ts2.isNonNullChain);
          links.unshift(chain);
        }
        return { expression: chain.expression, chain: links };
      }
      function visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete) {
        var expression = visitNonOptionalExpression(node.expression, captureThisArg, isDelete);
        if (ts2.isSyntheticReference(expression)) {
          return factory.createSyntheticReferenceExpression(factory.updateParenthesizedExpression(node, expression.expression), expression.thisArg);
        }
        return factory.updateParenthesizedExpression(node, expression);
      }
      function visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete) {
        if (ts2.isOptionalChain(node)) {
          return visitOptionalExpression(node, captureThisArg, isDelete);
        }
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        ts2.Debug.assertNotNode(expression, ts2.isSyntheticReference);
        var thisArg;
        if (captureThisArg) {
          if (!ts2.isSimpleCopiableExpression(expression)) {
            thisArg = factory.createTempVariable(hoistVariableDeclaration);
            expression = factory.createAssignment(thisArg, expression);
          } else {
            thisArg = expression;
          }
        }
        expression = node.kind === 205 ? factory.updatePropertyAccessExpression(node, expression, ts2.visitNode(node.name, visitor, ts2.isIdentifier)) : factory.updateElementAccessExpression(node, expression, ts2.visitNode(node.argumentExpression, visitor, ts2.isExpression));
        return thisArg ? factory.createSyntheticReferenceExpression(expression, thisArg) : expression;
      }
      function visitNonOptionalCallExpression(node, captureThisArg) {
        if (ts2.isOptionalChain(node)) {
          return visitOptionalExpression(node, captureThisArg, false);
        }
        if (ts2.isParenthesizedExpression(node.expression) && ts2.isOptionalChain(ts2.skipParentheses(node.expression))) {
          var expression = visitNonOptionalParenthesizedExpression(node.expression, true, false);
          var args = ts2.visitNodes(node.arguments, visitor, ts2.isExpression);
          if (ts2.isSyntheticReference(expression)) {
            return ts2.setTextRange(factory.createFunctionCallCall(expression.expression, expression.thisArg, args), node);
          }
          return factory.updateCallExpression(node, expression, void 0, args);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitNonOptionalExpression(node, captureThisArg, isDelete) {
        switch (node.kind) {
          case 211:
            return visitNonOptionalParenthesizedExpression(node, captureThisArg, isDelete);
          case 205:
          case 206:
            return visitNonOptionalPropertyOrElementAccessExpression(node, captureThisArg, isDelete);
          case 207:
            return visitNonOptionalCallExpression(node, captureThisArg);
          default:
            return ts2.visitNode(node, visitor, ts2.isExpression);
        }
      }
      function visitOptionalExpression(node, captureThisArg, isDelete) {
        var _a = flattenChain(node), expression = _a.expression, chain = _a.chain;
        var left = visitNonOptionalExpression(expression, ts2.isCallChain(chain[0]), false);
        var leftThisArg = ts2.isSyntheticReference(left) ? left.thisArg : void 0;
        var leftExpression = ts2.isSyntheticReference(left) ? left.expression : left;
        var capturedLeft = leftExpression;
        if (!ts2.isSimpleCopiableExpression(leftExpression)) {
          capturedLeft = factory.createTempVariable(hoistVariableDeclaration);
          leftExpression = factory.createAssignment(capturedLeft, leftExpression);
        }
        var rightExpression = capturedLeft;
        var thisArg;
        for (var i = 0; i < chain.length; i++) {
          var segment = chain[i];
          switch (segment.kind) {
            case 205:
            case 206:
              if (i === chain.length - 1 && captureThisArg) {
                if (!ts2.isSimpleCopiableExpression(rightExpression)) {
                  thisArg = factory.createTempVariable(hoistVariableDeclaration);
                  rightExpression = factory.createAssignment(thisArg, rightExpression);
                } else {
                  thisArg = rightExpression;
                }
              }
              rightExpression = segment.kind === 205 ? factory.createPropertyAccessExpression(rightExpression, ts2.visitNode(segment.name, visitor, ts2.isIdentifier)) : factory.createElementAccessExpression(rightExpression, ts2.visitNode(segment.argumentExpression, visitor, ts2.isExpression));
              break;
            case 207:
              if (i === 0 && leftThisArg) {
                rightExpression = factory.createFunctionCallCall(rightExpression, leftThisArg.kind === 106 ? factory.createThis() : leftThisArg, ts2.visitNodes(segment.arguments, visitor, ts2.isExpression));
              } else {
                rightExpression = factory.createCallExpression(rightExpression, void 0, ts2.visitNodes(segment.arguments, visitor, ts2.isExpression));
              }
              break;
          }
          ts2.setOriginalNode(rightExpression, segment);
        }
        var target = isDelete ? factory.createConditionalExpression(createNotNullCondition(leftExpression, capturedLeft, true), void 0, factory.createTrue(), void 0, factory.createDeleteExpression(rightExpression)) : factory.createConditionalExpression(createNotNullCondition(leftExpression, capturedLeft, true), void 0, factory.createVoidZero(), void 0, rightExpression);
        ts2.setTextRange(target, node);
        return thisArg ? factory.createSyntheticReferenceExpression(target, thisArg) : target;
      }
      function createNotNullCondition(left, right, invert) {
        return factory.createBinaryExpression(factory.createBinaryExpression(left, factory.createToken(invert ? 36 : 37), factory.createNull()), factory.createToken(invert ? 56 : 55), factory.createBinaryExpression(right, factory.createToken(invert ? 36 : 37), factory.createVoidZero()));
      }
      function transformNullishCoalescingExpression(node) {
        var left = ts2.visitNode(node.left, visitor, ts2.isExpression);
        var right = left;
        if (!ts2.isSimpleCopiableExpression(left)) {
          right = factory.createTempVariable(hoistVariableDeclaration);
          left = factory.createAssignment(right, left);
        }
        return ts2.setTextRange(factory.createConditionalExpression(createNotNullCondition(left, right), void 0, right, void 0, ts2.visitNode(node.right, visitor, ts2.isExpression)), node);
      }
      function visitDeleteExpression(node) {
        return ts2.isOptionalChain(ts2.skipParentheses(node.expression)) ? ts2.setOriginalNode(visitNonOptionalExpression(node.expression, false, true), node) : factory.updateDeleteExpression(node, ts2.visitNode(node.expression, visitor, ts2.isExpression));
      }
    }
    ts2.transformES2020 = transformES2020;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformES2021(context) {
      var hoistVariableDeclaration = context.hoistVariableDeclaration, factory = context.factory;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        if ((node.transformFlags & 8) === 0) {
          return node;
        }
        switch (node.kind) {
          case 220:
            var binaryExpression = node;
            if (ts2.isLogicalOrCoalescingAssignmentExpression(binaryExpression)) {
              return transformLogicalAssignment(binaryExpression);
            }
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function transformLogicalAssignment(binaryExpression) {
        var operator = binaryExpression.operatorToken;
        var nonAssignmentOperator = ts2.getNonAssignmentOperatorForCompoundAssignment(operator.kind);
        var left = ts2.skipParentheses(ts2.visitNode(binaryExpression.left, visitor, ts2.isLeftHandSideExpression));
        var assignmentTarget = left;
        var right = ts2.skipParentheses(ts2.visitNode(binaryExpression.right, visitor, ts2.isExpression));
        if (ts2.isAccessExpression(left)) {
          var propertyAccessTargetSimpleCopiable = ts2.isSimpleCopiableExpression(left.expression);
          var propertyAccessTarget = propertyAccessTargetSimpleCopiable ? left.expression : factory.createTempVariable(hoistVariableDeclaration);
          var propertyAccessTargetAssignment = propertyAccessTargetSimpleCopiable ? left.expression : factory.createAssignment(propertyAccessTarget, left.expression);
          if (ts2.isPropertyAccessExpression(left)) {
            assignmentTarget = factory.createPropertyAccessExpression(propertyAccessTarget, left.name);
            left = factory.createPropertyAccessExpression(propertyAccessTargetAssignment, left.name);
          } else {
            var elementAccessArgumentSimpleCopiable = ts2.isSimpleCopiableExpression(left.argumentExpression);
            var elementAccessArgument = elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory.createTempVariable(hoistVariableDeclaration);
            assignmentTarget = factory.createElementAccessExpression(propertyAccessTarget, elementAccessArgument);
            left = factory.createElementAccessExpression(propertyAccessTargetAssignment, elementAccessArgumentSimpleCopiable ? left.argumentExpression : factory.createAssignment(elementAccessArgument, left.argumentExpression));
          }
        }
        return factory.createBinaryExpression(left, nonAssignmentOperator, factory.createParenthesizedExpression(factory.createAssignment(assignmentTarget, right)));
      }
    }
    ts2.transformES2021 = transformES2021;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformESNext(context) {
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        if ((node.transformFlags & 4) === 0) {
          return node;
        }
        switch (node.kind) {
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
    }
    ts2.transformESNext = transformESNext;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformJsx(context) {
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory;
      var compilerOptions = context.getCompilerOptions();
      var currentSourceFile;
      var currentFileState;
      return ts2.chainBundle(context, transformSourceFile);
      function getCurrentFileNameExpression() {
        if (currentFileState.filenameDeclaration) {
          return currentFileState.filenameDeclaration.name;
        }
        var declaration = factory.createVariableDeclaration(factory.createUniqueName("_jsxFileName", 16 | 32), void 0, void 0, factory.createStringLiteral(currentSourceFile.fileName));
        currentFileState.filenameDeclaration = declaration;
        return currentFileState.filenameDeclaration.name;
      }
      function getJsxFactoryCalleePrimitive(isStaticChildren) {
        return compilerOptions.jsx === 5 ? "jsxDEV" : isStaticChildren ? "jsxs" : "jsx";
      }
      function getJsxFactoryCallee(isStaticChildren) {
        var type = getJsxFactoryCalleePrimitive(isStaticChildren);
        return getImplicitImportForName(type);
      }
      function getImplicitJsxFragmentReference() {
        return getImplicitImportForName("Fragment");
      }
      function getImplicitImportForName(name) {
        var _a, _b;
        var importSource = name === "createElement" ? currentFileState.importSpecifier : ts2.getJSXRuntimeImport(currentFileState.importSpecifier, compilerOptions);
        var existing = (_b = (_a = currentFileState.utilizedImplicitRuntimeImports) === null || _a === void 0 ? void 0 : _a.get(importSource)) === null || _b === void 0 ? void 0 : _b.get(name);
        if (existing) {
          return existing.name;
        }
        if (!currentFileState.utilizedImplicitRuntimeImports) {
          currentFileState.utilizedImplicitRuntimeImports = ts2.createMap();
        }
        var specifierSourceImports = currentFileState.utilizedImplicitRuntimeImports.get(importSource);
        if (!specifierSourceImports) {
          specifierSourceImports = ts2.createMap();
          currentFileState.utilizedImplicitRuntimeImports.set(importSource, specifierSourceImports);
        }
        var generatedName = factory.createUniqueName("_".concat(name), 16 | 32 | 64);
        var specifier = factory.createImportSpecifier(false, factory.createIdentifier(name), generatedName);
        generatedName.generatedImportReference = specifier;
        specifierSourceImports.set(name, specifier);
        return generatedName;
      }
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        currentSourceFile = node;
        currentFileState = {};
        currentFileState.importSpecifier = ts2.getJSXImplicitImportBase(compilerOptions, node);
        var visited = ts2.visitEachChild(node, visitor, context);
        ts2.addEmitHelpers(visited, context.readEmitHelpers());
        var statements = visited.statements;
        if (currentFileState.filenameDeclaration) {
          statements = ts2.insertStatementAfterCustomPrologue(statements.slice(), factory.createVariableStatement(void 0, factory.createVariableDeclarationList([currentFileState.filenameDeclaration], 2)));
        }
        if (currentFileState.utilizedImplicitRuntimeImports) {
          for (var _i = 0, _a = ts2.arrayFrom(currentFileState.utilizedImplicitRuntimeImports.entries()); _i < _a.length; _i++) {
            var _b = _a[_i], importSource = _b[0], importSpecifiersMap = _b[1];
            if (ts2.isExternalModule(node)) {
              var importStatement = factory.createImportDeclaration(void 0, void 0, factory.createImportClause(false, void 0, factory.createNamedImports(ts2.arrayFrom(importSpecifiersMap.values()))), factory.createStringLiteral(importSource), void 0);
              ts2.setParentRecursive(importStatement, false);
              statements = ts2.insertStatementAfterCustomPrologue(statements.slice(), importStatement);
            } else if (ts2.isExternalOrCommonJsModule(node)) {
              var requireStatement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
                factory.createVariableDeclaration(factory.createObjectBindingPattern(ts2.map(ts2.arrayFrom(importSpecifiersMap.values()), function(s) {
                  return factory.createBindingElement(void 0, s.propertyName, s.name);
                })), void 0, void 0, factory.createCallExpression(factory.createIdentifier("require"), void 0, [factory.createStringLiteral(importSource)]))
              ], 2));
              ts2.setParentRecursive(requireStatement, false);
              statements = ts2.insertStatementAfterCustomPrologue(statements.slice(), requireStatement);
            } else {
            }
          }
        }
        if (statements !== visited.statements) {
          visited = factory.updateSourceFile(visited, statements);
        }
        currentFileState = void 0;
        return visited;
      }
      function visitor(node) {
        if (node.transformFlags & 2) {
          return visitorWorker(node);
        } else {
          return node;
        }
      }
      function visitorWorker(node) {
        switch (node.kind) {
          case 277:
            return visitJsxElement(node, false);
          case 278:
            return visitJsxSelfClosingElement(node, false);
          case 281:
            return visitJsxFragment(node, false);
          case 287:
            return visitJsxExpression(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function transformJsxChildToExpression(node) {
        switch (node.kind) {
          case 11:
            return visitJsxText(node);
          case 287:
            return visitJsxExpression(node);
          case 277:
            return visitJsxElement(node, true);
          case 278:
            return visitJsxSelfClosingElement(node, true);
          case 281:
            return visitJsxFragment(node, true);
          default:
            return ts2.Debug.failBadSyntaxKind(node);
        }
      }
      function hasKeyAfterPropsSpread(node) {
        var spread = false;
        for (var _i = 0, _a = node.attributes.properties; _i < _a.length; _i++) {
          var elem = _a[_i];
          if (ts2.isJsxSpreadAttribute(elem)) {
            spread = true;
          } else if (spread && ts2.isJsxAttribute(elem) && elem.name.escapedText === "key") {
            return true;
          }
        }
        return false;
      }
      function shouldUseCreateElement(node) {
        return currentFileState.importSpecifier === void 0 || hasKeyAfterPropsSpread(node);
      }
      function visitJsxElement(node, isChild) {
        var tagTransform = shouldUseCreateElement(node.openingElement) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
        return tagTransform(node.openingElement, node.children, isChild, node);
      }
      function visitJsxSelfClosingElement(node, isChild) {
        var tagTransform = shouldUseCreateElement(node) ? visitJsxOpeningLikeElementCreateElement : visitJsxOpeningLikeElementJSX;
        return tagTransform(node, void 0, isChild, node);
      }
      function visitJsxFragment(node, isChild) {
        var tagTransform = currentFileState.importSpecifier === void 0 ? visitJsxOpeningFragmentCreateElement : visitJsxOpeningFragmentJSX;
        return tagTransform(node.openingFragment, node.children, isChild, node);
      }
      function convertJsxChildrenToChildrenPropObject(children) {
        var prop = convertJsxChildrenToChildrenPropAssignment(children);
        return prop && factory.createObjectLiteralExpression([prop]);
      }
      function convertJsxChildrenToChildrenPropAssignment(children) {
        var nonWhitespaceChildren = ts2.getSemanticJsxChildren(children);
        if (ts2.length(nonWhitespaceChildren) === 1 && !nonWhitespaceChildren[0].dotDotDotToken) {
          var result_12 = transformJsxChildToExpression(nonWhitespaceChildren[0]);
          return result_12 && factory.createPropertyAssignment("children", result_12);
        }
        var result = ts2.mapDefined(children, transformJsxChildToExpression);
        return ts2.length(result) ? factory.createPropertyAssignment("children", factory.createArrayLiteralExpression(result)) : void 0;
      }
      function visitJsxOpeningLikeElementJSX(node, children, isChild, location) {
        var tagName = getTagName(node);
        var childrenProp = children && children.length ? convertJsxChildrenToChildrenPropAssignment(children) : void 0;
        var keyAttr = ts2.find(node.attributes.properties, function(p) {
          return !!p.name && ts2.isIdentifier(p.name) && p.name.escapedText === "key";
        });
        var attrs = keyAttr ? ts2.filter(node.attributes.properties, function(p) {
          return p !== keyAttr;
        }) : node.attributes.properties;
        var objectProperties = ts2.length(attrs) ? transformJsxAttributesToObjectProps(attrs, childrenProp) : factory.createObjectLiteralExpression(childrenProp ? [childrenProp] : ts2.emptyArray);
        return visitJsxOpeningLikeElementOrFragmentJSX(tagName, objectProperties, keyAttr, children || ts2.emptyArray, isChild, location);
      }
      function visitJsxOpeningLikeElementOrFragmentJSX(tagName, objectProperties, keyAttr, children, isChild, location) {
        var _a;
        var nonWhitespaceChildren = ts2.getSemanticJsxChildren(children);
        var isStaticChildren = ts2.length(nonWhitespaceChildren) > 1 || !!((_a = nonWhitespaceChildren[0]) === null || _a === void 0 ? void 0 : _a.dotDotDotToken);
        var args = [tagName, objectProperties, !keyAttr ? factory.createVoidZero() : transformJsxAttributeInitializer(keyAttr.initializer)];
        if (compilerOptions.jsx === 5) {
          var originalFile = ts2.getOriginalNode(currentSourceFile);
          if (originalFile && ts2.isSourceFile(originalFile)) {
            args.push(isStaticChildren ? factory.createTrue() : factory.createFalse());
            var lineCol = ts2.getLineAndCharacterOfPosition(originalFile, location.pos);
            args.push(factory.createObjectLiteralExpression([
              factory.createPropertyAssignment("fileName", getCurrentFileNameExpression()),
              factory.createPropertyAssignment("lineNumber", factory.createNumericLiteral(lineCol.line + 1)),
              factory.createPropertyAssignment("columnNumber", factory.createNumericLiteral(lineCol.character + 1))
            ]));
            args.push(factory.createThis());
          }
        }
        var element = ts2.setTextRange(factory.createCallExpression(getJsxFactoryCallee(isStaticChildren), void 0, args), location);
        if (isChild) {
          ts2.startOnNewLine(element);
        }
        return element;
      }
      function visitJsxOpeningLikeElementCreateElement(node, children, isChild, location) {
        var tagName = getTagName(node);
        var attrs = node.attributes.properties;
        var objectProperties = ts2.length(attrs) ? transformJsxAttributesToObjectProps(attrs) : factory.createNull();
        var callee = currentFileState.importSpecifier === void 0 ? ts2.createJsxFactoryExpression(factory, context.getEmitResolver().getJsxFactoryEntity(currentSourceFile), compilerOptions.reactNamespace, node) : getImplicitImportForName("createElement");
        var element = ts2.createExpressionForJsxElement(factory, callee, tagName, objectProperties, ts2.mapDefined(children, transformJsxChildToExpression), location);
        if (isChild) {
          ts2.startOnNewLine(element);
        }
        return element;
      }
      function visitJsxOpeningFragmentJSX(_node, children, isChild, location) {
        var childrenProps;
        if (children && children.length) {
          var result = convertJsxChildrenToChildrenPropObject(children);
          if (result) {
            childrenProps = result;
          }
        }
        return visitJsxOpeningLikeElementOrFragmentJSX(getImplicitJsxFragmentReference(), childrenProps || factory.createObjectLiteralExpression([]), void 0, children, isChild, location);
      }
      function visitJsxOpeningFragmentCreateElement(node, children, isChild, location) {
        var element = ts2.createExpressionForJsxFragment(factory, context.getEmitResolver().getJsxFactoryEntity(currentSourceFile), context.getEmitResolver().getJsxFragmentFactoryEntity(currentSourceFile), compilerOptions.reactNamespace, ts2.mapDefined(children, transformJsxChildToExpression), node, location);
        if (isChild) {
          ts2.startOnNewLine(element);
        }
        return element;
      }
      function transformJsxSpreadAttributeToSpreadAssignment(node) {
        return factory.createSpreadAssignment(ts2.visitNode(node.expression, visitor, ts2.isExpression));
      }
      function transformJsxAttributesToObjectProps(attrs, children) {
        var target = ts2.getEmitScriptTarget(compilerOptions);
        return target && target >= 5 ? factory.createObjectLiteralExpression(transformJsxAttributesToProps(attrs, children)) : transformJsxAttributesToExpression(attrs, children);
      }
      function transformJsxAttributesToProps(attrs, children) {
        var props = ts2.flatten(ts2.spanMap(attrs, ts2.isJsxSpreadAttribute, function(attrs2, isSpread) {
          return ts2.map(attrs2, function(attr) {
            return isSpread ? transformJsxSpreadAttributeToSpreadAssignment(attr) : transformJsxAttributeToObjectLiteralElement(attr);
          });
        }));
        if (children) {
          props.push(children);
        }
        return props;
      }
      function transformJsxAttributesToExpression(attrs, children) {
        var expressions = ts2.flatten(ts2.spanMap(attrs, ts2.isJsxSpreadAttribute, function(attrs2, isSpread) {
          return isSpread ? ts2.map(attrs2, transformJsxSpreadAttributeToExpression) : factory.createObjectLiteralExpression(ts2.map(attrs2, transformJsxAttributeToObjectLiteralElement));
        }));
        if (ts2.isJsxSpreadAttribute(attrs[0])) {
          expressions.unshift(factory.createObjectLiteralExpression());
        }
        if (children) {
          expressions.push(factory.createObjectLiteralExpression([children]));
        }
        return ts2.singleOrUndefined(expressions) || emitHelpers().createAssignHelper(expressions);
      }
      function transformJsxSpreadAttributeToExpression(node) {
        return ts2.visitNode(node.expression, visitor, ts2.isExpression);
      }
      function transformJsxAttributeToObjectLiteralElement(node) {
        var name = getAttributeName(node);
        var expression = transformJsxAttributeInitializer(node.initializer);
        return factory.createPropertyAssignment(name, expression);
      }
      function transformJsxAttributeInitializer(node) {
        if (node === void 0) {
          return factory.createTrue();
        } else if (node.kind === 10) {
          var singleQuote = node.singleQuote !== void 0 ? node.singleQuote : !ts2.isStringDoubleQuoted(node, currentSourceFile);
          var literal = factory.createStringLiteral(tryDecodeEntities(node.text) || node.text, singleQuote);
          return ts2.setTextRange(literal, node);
        } else if (node.kind === 287) {
          if (node.expression === void 0) {
            return factory.createTrue();
          }
          return ts2.visitNode(node.expression, visitor, ts2.isExpression);
        } else {
          return ts2.Debug.failBadSyntaxKind(node);
        }
      }
      function visitJsxText(node) {
        var fixed = fixupWhitespaceAndDecodeEntities(node.text);
        return fixed === void 0 ? void 0 : factory.createStringLiteral(fixed);
      }
      function fixupWhitespaceAndDecodeEntities(text) {
        var acc;
        var firstNonWhitespace = 0;
        var lastNonWhitespace = -1;
        for (var i = 0; i < text.length; i++) {
          var c = text.charCodeAt(i);
          if (ts2.isLineBreak(c)) {
            if (firstNonWhitespace !== -1 && lastNonWhitespace !== -1) {
              acc = addLineOfJsxText(acc, text.substr(firstNonWhitespace, lastNonWhitespace - firstNonWhitespace + 1));
            }
            firstNonWhitespace = -1;
          } else if (!ts2.isWhiteSpaceSingleLine(c)) {
            lastNonWhitespace = i;
            if (firstNonWhitespace === -1) {
              firstNonWhitespace = i;
            }
          }
        }
        return firstNonWhitespace !== -1 ? addLineOfJsxText(acc, text.substr(firstNonWhitespace)) : acc;
      }
      function addLineOfJsxText(acc, trimmedLine) {
        var decoded = decodeEntities(trimmedLine);
        return acc === void 0 ? decoded : acc + " " + decoded;
      }
      function decodeEntities(text) {
        return text.replace(/&((#((\d+)|x([\da-fA-F]+)))|(\w+));/g, function(match, _all, _number, _digits, decimal, hex, word) {
          if (decimal) {
            return ts2.utf16EncodeAsString(parseInt(decimal, 10));
          } else if (hex) {
            return ts2.utf16EncodeAsString(parseInt(hex, 16));
          } else {
            var ch = entities.get(word);
            return ch ? ts2.utf16EncodeAsString(ch) : match;
          }
        });
      }
      function tryDecodeEntities(text) {
        var decoded = decodeEntities(text);
        return decoded === text ? void 0 : decoded;
      }
      function getTagName(node) {
        if (node.kind === 277) {
          return getTagName(node.openingElement);
        } else {
          var name = node.tagName;
          if (ts2.isIdentifier(name) && ts2.isIntrinsicJsxName(name.escapedText)) {
            return factory.createStringLiteral(ts2.idText(name));
          } else {
            return ts2.createExpressionFromEntityName(factory, name);
          }
        }
      }
      function getAttributeName(node) {
        var name = node.name;
        var text = ts2.idText(name);
        if (/^[A-Za-z_]\w*$/.test(text)) {
          return name;
        } else {
          return factory.createStringLiteral(text);
        }
      }
      function visitJsxExpression(node) {
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        return node.dotDotDotToken ? factory.createSpreadElement(expression) : expression;
      }
    }
    ts2.transformJsx = transformJsx;
    var entities = new ts2.Map(ts2.getEntries({
      quot: 34,
      amp: 38,
      apos: 39,
      lt: 60,
      gt: 62,
      nbsp: 160,
      iexcl: 161,
      cent: 162,
      pound: 163,
      curren: 164,
      yen: 165,
      brvbar: 166,
      sect: 167,
      uml: 168,
      copy: 169,
      ordf: 170,
      laquo: 171,
      not: 172,
      shy: 173,
      reg: 174,
      macr: 175,
      deg: 176,
      plusmn: 177,
      sup2: 178,
      sup3: 179,
      acute: 180,
      micro: 181,
      para: 182,
      middot: 183,
      cedil: 184,
      sup1: 185,
      ordm: 186,
      raquo: 187,
      frac14: 188,
      frac12: 189,
      frac34: 190,
      iquest: 191,
      Agrave: 192,
      Aacute: 193,
      Acirc: 194,
      Atilde: 195,
      Auml: 196,
      Aring: 197,
      AElig: 198,
      Ccedil: 199,
      Egrave: 200,
      Eacute: 201,
      Ecirc: 202,
      Euml: 203,
      Igrave: 204,
      Iacute: 205,
      Icirc: 206,
      Iuml: 207,
      ETH: 208,
      Ntilde: 209,
      Ograve: 210,
      Oacute: 211,
      Ocirc: 212,
      Otilde: 213,
      Ouml: 214,
      times: 215,
      Oslash: 216,
      Ugrave: 217,
      Uacute: 218,
      Ucirc: 219,
      Uuml: 220,
      Yacute: 221,
      THORN: 222,
      szlig: 223,
      agrave: 224,
      aacute: 225,
      acirc: 226,
      atilde: 227,
      auml: 228,
      aring: 229,
      aelig: 230,
      ccedil: 231,
      egrave: 232,
      eacute: 233,
      ecirc: 234,
      euml: 235,
      igrave: 236,
      iacute: 237,
      icirc: 238,
      iuml: 239,
      eth: 240,
      ntilde: 241,
      ograve: 242,
      oacute: 243,
      ocirc: 244,
      otilde: 245,
      ouml: 246,
      divide: 247,
      oslash: 248,
      ugrave: 249,
      uacute: 250,
      ucirc: 251,
      uuml: 252,
      yacute: 253,
      thorn: 254,
      yuml: 255,
      OElig: 338,
      oelig: 339,
      Scaron: 352,
      scaron: 353,
      Yuml: 376,
      fnof: 402,
      circ: 710,
      tilde: 732,
      Alpha: 913,
      Beta: 914,
      Gamma: 915,
      Delta: 916,
      Epsilon: 917,
      Zeta: 918,
      Eta: 919,
      Theta: 920,
      Iota: 921,
      Kappa: 922,
      Lambda: 923,
      Mu: 924,
      Nu: 925,
      Xi: 926,
      Omicron: 927,
      Pi: 928,
      Rho: 929,
      Sigma: 931,
      Tau: 932,
      Upsilon: 933,
      Phi: 934,
      Chi: 935,
      Psi: 936,
      Omega: 937,
      alpha: 945,
      beta: 946,
      gamma: 947,
      delta: 948,
      epsilon: 949,
      zeta: 950,
      eta: 951,
      theta: 952,
      iota: 953,
      kappa: 954,
      lambda: 955,
      mu: 956,
      nu: 957,
      xi: 958,
      omicron: 959,
      pi: 960,
      rho: 961,
      sigmaf: 962,
      sigma: 963,
      tau: 964,
      upsilon: 965,
      phi: 966,
      chi: 967,
      psi: 968,
      omega: 969,
      thetasym: 977,
      upsih: 978,
      piv: 982,
      ensp: 8194,
      emsp: 8195,
      thinsp: 8201,
      zwnj: 8204,
      zwj: 8205,
      lrm: 8206,
      rlm: 8207,
      ndash: 8211,
      mdash: 8212,
      lsquo: 8216,
      rsquo: 8217,
      sbquo: 8218,
      ldquo: 8220,
      rdquo: 8221,
      bdquo: 8222,
      dagger: 8224,
      Dagger: 8225,
      bull: 8226,
      hellip: 8230,
      permil: 8240,
      prime: 8242,
      Prime: 8243,
      lsaquo: 8249,
      rsaquo: 8250,
      oline: 8254,
      frasl: 8260,
      euro: 8364,
      image: 8465,
      weierp: 8472,
      real: 8476,
      trade: 8482,
      alefsym: 8501,
      larr: 8592,
      uarr: 8593,
      rarr: 8594,
      darr: 8595,
      harr: 8596,
      crarr: 8629,
      lArr: 8656,
      uArr: 8657,
      rArr: 8658,
      dArr: 8659,
      hArr: 8660,
      forall: 8704,
      part: 8706,
      exist: 8707,
      empty: 8709,
      nabla: 8711,
      isin: 8712,
      notin: 8713,
      ni: 8715,
      prod: 8719,
      sum: 8721,
      minus: 8722,
      lowast: 8727,
      radic: 8730,
      prop: 8733,
      infin: 8734,
      ang: 8736,
      and: 8743,
      or: 8744,
      cap: 8745,
      cup: 8746,
      int: 8747,
      there4: 8756,
      sim: 8764,
      cong: 8773,
      asymp: 8776,
      ne: 8800,
      equiv: 8801,
      le: 8804,
      ge: 8805,
      sub: 8834,
      sup: 8835,
      nsub: 8836,
      sube: 8838,
      supe: 8839,
      oplus: 8853,
      otimes: 8855,
      perp: 8869,
      sdot: 8901,
      lceil: 8968,
      rceil: 8969,
      lfloor: 8970,
      rfloor: 8971,
      lang: 9001,
      rang: 9002,
      loz: 9674,
      spades: 9824,
      clubs: 9827,
      hearts: 9829,
      diams: 9830
    }));
  })(ts || (ts = {}));
  (function(ts2) {
    function transformES2016(context) {
      var factory = context.factory, hoistVariableDeclaration = context.hoistVariableDeclaration;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        if ((node.transformFlags & 256) === 0) {
          return node;
        }
        switch (node.kind) {
          case 220:
            return visitBinaryExpression(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitBinaryExpression(node) {
        switch (node.operatorToken.kind) {
          case 67:
            return visitExponentiationAssignmentExpression(node);
          case 42:
            return visitExponentiationExpression(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitExponentiationAssignmentExpression(node) {
        var target;
        var value;
        var left = ts2.visitNode(node.left, visitor, ts2.isExpression);
        var right = ts2.visitNode(node.right, visitor, ts2.isExpression);
        if (ts2.isElementAccessExpression(left)) {
          var expressionTemp = factory.createTempVariable(hoistVariableDeclaration);
          var argumentExpressionTemp = factory.createTempVariable(hoistVariableDeclaration);
          target = ts2.setTextRange(factory.createElementAccessExpression(ts2.setTextRange(factory.createAssignment(expressionTemp, left.expression), left.expression), ts2.setTextRange(factory.createAssignment(argumentExpressionTemp, left.argumentExpression), left.argumentExpression)), left);
          value = ts2.setTextRange(factory.createElementAccessExpression(expressionTemp, argumentExpressionTemp), left);
        } else if (ts2.isPropertyAccessExpression(left)) {
          var expressionTemp = factory.createTempVariable(hoistVariableDeclaration);
          target = ts2.setTextRange(factory.createPropertyAccessExpression(ts2.setTextRange(factory.createAssignment(expressionTemp, left.expression), left.expression), left.name), left);
          value = ts2.setTextRange(factory.createPropertyAccessExpression(expressionTemp, left.name), left);
        } else {
          target = left;
          value = left;
        }
        return ts2.setTextRange(factory.createAssignment(target, ts2.setTextRange(factory.createGlobalMethodCall("Math", "pow", [value, right]), node)), node);
      }
      function visitExponentiationExpression(node) {
        var left = ts2.visitNode(node.left, visitor, ts2.isExpression);
        var right = ts2.visitNode(node.right, visitor, ts2.isExpression);
        return ts2.setTextRange(factory.createGlobalMethodCall("Math", "pow", [left, right]), node);
      }
    }
    ts2.transformES2016 = transformES2016;
  })(ts || (ts = {}));
  (function(ts2) {
    var ES2015SubstitutionFlags;
    (function(ES2015SubstitutionFlags2) {
      ES2015SubstitutionFlags2[ES2015SubstitutionFlags2["CapturedThis"] = 1] = "CapturedThis";
      ES2015SubstitutionFlags2[ES2015SubstitutionFlags2["BlockScopedBindings"] = 2] = "BlockScopedBindings";
    })(ES2015SubstitutionFlags || (ES2015SubstitutionFlags = {}));
    var LoopOutParameterFlags;
    (function(LoopOutParameterFlags2) {
      LoopOutParameterFlags2[LoopOutParameterFlags2["Body"] = 1] = "Body";
      LoopOutParameterFlags2[LoopOutParameterFlags2["Initializer"] = 2] = "Initializer";
    })(LoopOutParameterFlags || (LoopOutParameterFlags = {}));
    var CopyDirection;
    (function(CopyDirection2) {
      CopyDirection2[CopyDirection2["ToOriginal"] = 0] = "ToOriginal";
      CopyDirection2[CopyDirection2["ToOutParameter"] = 1] = "ToOutParameter";
    })(CopyDirection || (CopyDirection = {}));
    var Jump;
    (function(Jump2) {
      Jump2[Jump2["Break"] = 2] = "Break";
      Jump2[Jump2["Continue"] = 4] = "Continue";
      Jump2[Jump2["Return"] = 8] = "Return";
    })(Jump || (Jump = {}));
    var HierarchyFacts;
    (function(HierarchyFacts2) {
      HierarchyFacts2[HierarchyFacts2["None"] = 0] = "None";
      HierarchyFacts2[HierarchyFacts2["Function"] = 1] = "Function";
      HierarchyFacts2[HierarchyFacts2["ArrowFunction"] = 2] = "ArrowFunction";
      HierarchyFacts2[HierarchyFacts2["AsyncFunctionBody"] = 4] = "AsyncFunctionBody";
      HierarchyFacts2[HierarchyFacts2["NonStaticClassElement"] = 8] = "NonStaticClassElement";
      HierarchyFacts2[HierarchyFacts2["CapturesThis"] = 16] = "CapturesThis";
      HierarchyFacts2[HierarchyFacts2["ExportedVariableStatement"] = 32] = "ExportedVariableStatement";
      HierarchyFacts2[HierarchyFacts2["TopLevel"] = 64] = "TopLevel";
      HierarchyFacts2[HierarchyFacts2["Block"] = 128] = "Block";
      HierarchyFacts2[HierarchyFacts2["IterationStatement"] = 256] = "IterationStatement";
      HierarchyFacts2[HierarchyFacts2["IterationStatementBlock"] = 512] = "IterationStatementBlock";
      HierarchyFacts2[HierarchyFacts2["IterationContainer"] = 1024] = "IterationContainer";
      HierarchyFacts2[HierarchyFacts2["ForStatement"] = 2048] = "ForStatement";
      HierarchyFacts2[HierarchyFacts2["ForInOrForOfStatement"] = 4096] = "ForInOrForOfStatement";
      HierarchyFacts2[HierarchyFacts2["ConstructorWithCapturedSuper"] = 8192] = "ConstructorWithCapturedSuper";
      HierarchyFacts2[HierarchyFacts2["StaticInitializer"] = 16384] = "StaticInitializer";
      HierarchyFacts2[HierarchyFacts2["AncestorFactsMask"] = 32767] = "AncestorFactsMask";
      HierarchyFacts2[HierarchyFacts2["BlockScopeIncludes"] = 0] = "BlockScopeIncludes";
      HierarchyFacts2[HierarchyFacts2["BlockScopeExcludes"] = 7104] = "BlockScopeExcludes";
      HierarchyFacts2[HierarchyFacts2["SourceFileIncludes"] = 64] = "SourceFileIncludes";
      HierarchyFacts2[HierarchyFacts2["SourceFileExcludes"] = 8064] = "SourceFileExcludes";
      HierarchyFacts2[HierarchyFacts2["FunctionIncludes"] = 65] = "FunctionIncludes";
      HierarchyFacts2[HierarchyFacts2["FunctionExcludes"] = 32670] = "FunctionExcludes";
      HierarchyFacts2[HierarchyFacts2["AsyncFunctionBodyIncludes"] = 69] = "AsyncFunctionBodyIncludes";
      HierarchyFacts2[HierarchyFacts2["AsyncFunctionBodyExcludes"] = 32662] = "AsyncFunctionBodyExcludes";
      HierarchyFacts2[HierarchyFacts2["ArrowFunctionIncludes"] = 66] = "ArrowFunctionIncludes";
      HierarchyFacts2[HierarchyFacts2["ArrowFunctionExcludes"] = 15232] = "ArrowFunctionExcludes";
      HierarchyFacts2[HierarchyFacts2["ConstructorIncludes"] = 73] = "ConstructorIncludes";
      HierarchyFacts2[HierarchyFacts2["ConstructorExcludes"] = 32662] = "ConstructorExcludes";
      HierarchyFacts2[HierarchyFacts2["DoOrWhileStatementIncludes"] = 1280] = "DoOrWhileStatementIncludes";
      HierarchyFacts2[HierarchyFacts2["DoOrWhileStatementExcludes"] = 0] = "DoOrWhileStatementExcludes";
      HierarchyFacts2[HierarchyFacts2["ForStatementIncludes"] = 3328] = "ForStatementIncludes";
      HierarchyFacts2[HierarchyFacts2["ForStatementExcludes"] = 5056] = "ForStatementExcludes";
      HierarchyFacts2[HierarchyFacts2["ForInOrForOfStatementIncludes"] = 5376] = "ForInOrForOfStatementIncludes";
      HierarchyFacts2[HierarchyFacts2["ForInOrForOfStatementExcludes"] = 3008] = "ForInOrForOfStatementExcludes";
      HierarchyFacts2[HierarchyFacts2["BlockIncludes"] = 128] = "BlockIncludes";
      HierarchyFacts2[HierarchyFacts2["BlockExcludes"] = 6976] = "BlockExcludes";
      HierarchyFacts2[HierarchyFacts2["IterationStatementBlockIncludes"] = 512] = "IterationStatementBlockIncludes";
      HierarchyFacts2[HierarchyFacts2["IterationStatementBlockExcludes"] = 7104] = "IterationStatementBlockExcludes";
      HierarchyFacts2[HierarchyFacts2["StaticInitializerIncludes"] = 16449] = "StaticInitializerIncludes";
      HierarchyFacts2[HierarchyFacts2["StaticInitializerExcludes"] = 32670] = "StaticInitializerExcludes";
      HierarchyFacts2[HierarchyFacts2["NewTarget"] = 32768] = "NewTarget";
      HierarchyFacts2[HierarchyFacts2["CapturedLexicalThis"] = 65536] = "CapturedLexicalThis";
      HierarchyFacts2[HierarchyFacts2["SubtreeFactsMask"] = -32768] = "SubtreeFactsMask";
      HierarchyFacts2[HierarchyFacts2["ArrowFunctionSubtreeExcludes"] = 0] = "ArrowFunctionSubtreeExcludes";
      HierarchyFacts2[HierarchyFacts2["FunctionSubtreeExcludes"] = 98304] = "FunctionSubtreeExcludes";
    })(HierarchyFacts || (HierarchyFacts = {}));
    var SpreadSegmentKind;
    (function(SpreadSegmentKind2) {
      SpreadSegmentKind2[SpreadSegmentKind2["None"] = 0] = "None";
      SpreadSegmentKind2[SpreadSegmentKind2["UnpackedSpread"] = 1] = "UnpackedSpread";
      SpreadSegmentKind2[SpreadSegmentKind2["PackedSpread"] = 2] = "PackedSpread";
    })(SpreadSegmentKind || (SpreadSegmentKind = {}));
    function createSpreadSegment(kind, expression) {
      return { kind, expression };
    }
    function transformES2015(context) {
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory, startLexicalEnvironment = context.startLexicalEnvironment, resumeLexicalEnvironment = context.resumeLexicalEnvironment, endLexicalEnvironment = context.endLexicalEnvironment, hoistVariableDeclaration = context.hoistVariableDeclaration;
      var compilerOptions = context.getCompilerOptions();
      var resolver = context.getEmitResolver();
      var previousOnSubstituteNode = context.onSubstituteNode;
      var previousOnEmitNode = context.onEmitNode;
      context.onEmitNode = onEmitNode;
      context.onSubstituteNode = onSubstituteNode;
      var currentSourceFile;
      var currentText;
      var hierarchyFacts;
      var taggedTemplateStringDeclarations;
      function recordTaggedTemplateString(temp) {
        taggedTemplateStringDeclarations = ts2.append(taggedTemplateStringDeclarations, factory.createVariableDeclaration(temp));
      }
      var convertedLoopState;
      var enabledSubstitutions;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        currentSourceFile = node;
        currentText = node.text;
        var visited = visitSourceFile(node);
        ts2.addEmitHelpers(visited, context.readEmitHelpers());
        currentSourceFile = void 0;
        currentText = void 0;
        taggedTemplateStringDeclarations = void 0;
        hierarchyFacts = 0;
        return visited;
      }
      function enterSubtree(excludeFacts, includeFacts) {
        var ancestorFacts = hierarchyFacts;
        hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & 32767;
        return ancestorFacts;
      }
      function exitSubtree(ancestorFacts, excludeFacts, includeFacts) {
        hierarchyFacts = (hierarchyFacts & ~excludeFacts | includeFacts) & -32768 | ancestorFacts;
      }
      function isReturnVoidStatementInConstructorWithCapturedSuper(node) {
        return (hierarchyFacts & 8192) !== 0 && node.kind === 246 && !node.expression;
      }
      function isOrMayContainReturnCompletion(node) {
        return node.transformFlags & 2097152 && (ts2.isReturnStatement(node) || ts2.isIfStatement(node) || ts2.isWithStatement(node) || ts2.isSwitchStatement(node) || ts2.isCaseBlock(node) || ts2.isCaseClause(node) || ts2.isDefaultClause(node) || ts2.isTryStatement(node) || ts2.isCatchClause(node) || ts2.isLabeledStatement(node) || ts2.isIterationStatement(node, false) || ts2.isBlock(node));
      }
      function shouldVisitNode(node) {
        return (node.transformFlags & 512) !== 0 || convertedLoopState !== void 0 || hierarchyFacts & 8192 && isOrMayContainReturnCompletion(node) || ts2.isIterationStatement(node, false) && shouldConvertIterationStatement(node) || (ts2.getEmitFlags(node) & 33554432) !== 0;
      }
      function visitor(node) {
        return shouldVisitNode(node) ? visitorWorker(node, false) : node;
      }
      function visitorWithUnusedExpressionResult(node) {
        return shouldVisitNode(node) ? visitorWorker(node, true) : node;
      }
      function classWrapperStatementVisitor(node) {
        if (shouldVisitNode(node)) {
          var original = ts2.getOriginalNode(node);
          if (ts2.isPropertyDeclaration(original) && ts2.hasStaticModifier(original)) {
            var ancestorFacts = enterSubtree(32670, 16449);
            var result = visitorWorker(node, false);
            exitSubtree(ancestorFacts, 98304, 0);
            return result;
          }
          return visitorWorker(node, false);
        }
        return node;
      }
      function callExpressionVisitor(node) {
        if (node.kind === 106) {
          return visitSuperKeyword(true);
        }
        return visitor(node);
      }
      function visitorWorker(node, expressionResultIsUnused) {
        switch (node.kind) {
          case 124:
            return void 0;
          case 256:
            return visitClassDeclaration(node);
          case 225:
            return visitClassExpression(node);
          case 163:
            return visitParameter(node);
          case 255:
            return visitFunctionDeclaration(node);
          case 213:
            return visitArrowFunction(node);
          case 212:
            return visitFunctionExpression(node);
          case 253:
            return visitVariableDeclaration(node);
          case 79:
            return visitIdentifier(node);
          case 254:
            return visitVariableDeclarationList(node);
          case 248:
            return visitSwitchStatement(node);
          case 262:
            return visitCaseBlock(node);
          case 234:
            return visitBlock(node, false);
          case 245:
          case 244:
            return visitBreakOrContinueStatement(node);
          case 249:
            return visitLabeledStatement(node);
          case 239:
          case 240:
            return visitDoOrWhileStatement(node, void 0);
          case 241:
            return visitForStatement(node, void 0);
          case 242:
            return visitForInStatement(node, void 0);
          case 243:
            return visitForOfStatement(node, void 0);
          case 237:
            return visitExpressionStatement(node);
          case 204:
            return visitObjectLiteralExpression(node);
          case 291:
            return visitCatchClause(node);
          case 295:
            return visitShorthandPropertyAssignment(node);
          case 161:
            return visitComputedPropertyName(node);
          case 203:
            return visitArrayLiteralExpression(node);
          case 207:
            return visitCallExpression(node);
          case 208:
            return visitNewExpression(node);
          case 211:
            return visitParenthesizedExpression(node, expressionResultIsUnused);
          case 220:
            return visitBinaryExpression(node, expressionResultIsUnused);
          case 349:
            return visitCommaListExpression(node, expressionResultIsUnused);
          case 14:
          case 15:
          case 16:
          case 17:
            return visitTemplateLiteral(node);
          case 10:
            return visitStringLiteral(node);
          case 8:
            return visitNumericLiteral(node);
          case 209:
            return visitTaggedTemplateExpression(node);
          case 222:
            return visitTemplateExpression(node);
          case 223:
            return visitYieldExpression(node);
          case 224:
            return visitSpreadElement(node);
          case 106:
            return visitSuperKeyword(false);
          case 108:
            return visitThisKeyword(node);
          case 230:
            return visitMetaProperty(node);
          case 168:
            return visitMethodDeclaration(node);
          case 171:
          case 172:
            return visitAccessorDeclaration(node);
          case 236:
            return visitVariableStatement(node);
          case 246:
            return visitReturnStatement(node);
          case 216:
            return visitVoidExpression(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitSourceFile(node) {
        var ancestorFacts = enterSubtree(8064, 64);
        var prologue = [];
        var statements = [];
        startLexicalEnvironment();
        var statementOffset = factory.copyPrologue(node.statements, prologue, false, visitor);
        ts2.addRange(statements, ts2.visitNodes(node.statements, visitor, ts2.isStatement, statementOffset));
        if (taggedTemplateStringDeclarations) {
          statements.push(factory.createVariableStatement(void 0, factory.createVariableDeclarationList(taggedTemplateStringDeclarations)));
        }
        factory.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
        insertCaptureThisForNodeIfNeeded(prologue, node);
        exitSubtree(ancestorFacts, 0, 0);
        return factory.updateSourceFile(node, ts2.setTextRange(factory.createNodeArray(ts2.concatenate(prologue, statements)), node.statements));
      }
      function visitSwitchStatement(node) {
        if (convertedLoopState !== void 0) {
          var savedAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
          convertedLoopState.allowedNonLabeledJumps |= 2;
          var result = ts2.visitEachChild(node, visitor, context);
          convertedLoopState.allowedNonLabeledJumps = savedAllowedNonLabeledJumps;
          return result;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitCaseBlock(node) {
        var ancestorFacts = enterSubtree(7104, 0);
        var updated = ts2.visitEachChild(node, visitor, context);
        exitSubtree(ancestorFacts, 0, 0);
        return updated;
      }
      function returnCapturedThis(node) {
        return ts2.setOriginalNode(factory.createReturnStatement(factory.createUniqueName("_this", 16 | 32)), node);
      }
      function visitReturnStatement(node) {
        if (convertedLoopState) {
          convertedLoopState.nonLocalJumps |= 8;
          if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) {
            node = returnCapturedThis(node);
          }
          return factory.createReturnStatement(factory.createObjectLiteralExpression([
            factory.createPropertyAssignment(factory.createIdentifier("value"), node.expression ? ts2.visitNode(node.expression, visitor, ts2.isExpression) : factory.createVoidZero())
          ]));
        } else if (isReturnVoidStatementInConstructorWithCapturedSuper(node)) {
          return returnCapturedThis(node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitThisKeyword(node) {
        if (hierarchyFacts & 2 && !(hierarchyFacts & 16384)) {
          hierarchyFacts |= 65536;
        }
        if (convertedLoopState) {
          if (hierarchyFacts & 2) {
            convertedLoopState.containsLexicalThis = true;
            return node;
          }
          return convertedLoopState.thisName || (convertedLoopState.thisName = factory.createUniqueName("this"));
        }
        return node;
      }
      function visitVoidExpression(node) {
        return ts2.visitEachChild(node, visitorWithUnusedExpressionResult, context);
      }
      function visitIdentifier(node) {
        if (!convertedLoopState) {
          return node;
        }
        if (resolver.isArgumentsLocalBinding(node)) {
          return convertedLoopState.argumentsName || (convertedLoopState.argumentsName = factory.createUniqueName("arguments"));
        }
        return node;
      }
      function visitBreakOrContinueStatement(node) {
        if (convertedLoopState) {
          var jump = node.kind === 245 ? 2 : 4;
          var canUseBreakOrContinue = node.label && convertedLoopState.labels && convertedLoopState.labels.get(ts2.idText(node.label)) || !node.label && convertedLoopState.allowedNonLabeledJumps & jump;
          if (!canUseBreakOrContinue) {
            var labelMarker = void 0;
            var label = node.label;
            if (!label) {
              if (node.kind === 245) {
                convertedLoopState.nonLocalJumps |= 2;
                labelMarker = "break";
              } else {
                convertedLoopState.nonLocalJumps |= 4;
                labelMarker = "continue";
              }
            } else {
              if (node.kind === 245) {
                labelMarker = "break-".concat(label.escapedText);
                setLabeledJump(convertedLoopState, true, ts2.idText(label), labelMarker);
              } else {
                labelMarker = "continue-".concat(label.escapedText);
                setLabeledJump(convertedLoopState, false, ts2.idText(label), labelMarker);
              }
            }
            var returnExpression = factory.createStringLiteral(labelMarker);
            if (convertedLoopState.loopOutParameters.length) {
              var outParams = convertedLoopState.loopOutParameters;
              var expr = void 0;
              for (var i = 0; i < outParams.length; i++) {
                var copyExpr = copyOutParameter(outParams[i], 1);
                if (i === 0) {
                  expr = copyExpr;
                } else {
                  expr = factory.createBinaryExpression(expr, 27, copyExpr);
                }
              }
              returnExpression = factory.createBinaryExpression(expr, 27, returnExpression);
            }
            return factory.createReturnStatement(returnExpression);
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitClassDeclaration(node) {
        var variable = factory.createVariableDeclaration(factory.getLocalName(node, true), void 0, void 0, transformClassLikeDeclarationToExpression(node));
        ts2.setOriginalNode(variable, node);
        var statements = [];
        var statement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([variable]));
        ts2.setOriginalNode(statement, node);
        ts2.setTextRange(statement, node);
        ts2.startOnNewLine(statement);
        statements.push(statement);
        if (ts2.hasSyntacticModifier(node, 1)) {
          var exportStatement = ts2.hasSyntacticModifier(node, 512) ? factory.createExportDefault(factory.getLocalName(node)) : factory.createExternalModuleExport(factory.getLocalName(node));
          ts2.setOriginalNode(exportStatement, statement);
          statements.push(exportStatement);
        }
        var emitFlags = ts2.getEmitFlags(node);
        if ((emitFlags & 4194304) === 0) {
          statements.push(factory.createEndOfDeclarationMarker(node));
          ts2.setEmitFlags(statement, emitFlags | 4194304);
        }
        return ts2.singleOrMany(statements);
      }
      function visitClassExpression(node) {
        return transformClassLikeDeclarationToExpression(node);
      }
      function transformClassLikeDeclarationToExpression(node) {
        if (node.name) {
          enableSubstitutionsForBlockScopedBindings();
        }
        var extendsClauseElement = ts2.getClassExtendsHeritageElement(node);
        var classFunction = factory.createFunctionExpression(void 0, void 0, void 0, void 0, extendsClauseElement ? [factory.createParameterDeclaration(void 0, void 0, void 0, factory.createUniqueName("_super", 16 | 32))] : [], void 0, transformClassBody(node, extendsClauseElement));
        ts2.setEmitFlags(classFunction, ts2.getEmitFlags(node) & 65536 | 524288);
        var inner = factory.createPartiallyEmittedExpression(classFunction);
        ts2.setTextRangeEnd(inner, node.end);
        ts2.setEmitFlags(inner, 1536);
        var outer = factory.createPartiallyEmittedExpression(inner);
        ts2.setTextRangeEnd(outer, ts2.skipTrivia(currentText, node.pos));
        ts2.setEmitFlags(outer, 1536);
        var result = factory.createParenthesizedExpression(factory.createCallExpression(outer, void 0, extendsClauseElement ? [ts2.visitNode(extendsClauseElement.expression, visitor, ts2.isExpression)] : []));
        ts2.addSyntheticLeadingComment(result, 3, "* @class ");
        return result;
      }
      function transformClassBody(node, extendsClauseElement) {
        var statements = [];
        var name = factory.getInternalName(node);
        var constructorLikeName = ts2.isIdentifierANonContextualKeyword(name) ? factory.getGeneratedNameForNode(name) : name;
        startLexicalEnvironment();
        addExtendsHelperIfNeeded(statements, node, extendsClauseElement);
        addConstructor(statements, node, constructorLikeName, extendsClauseElement);
        addClassMembers(statements, node);
        var closingBraceLocation = ts2.createTokenRange(ts2.skipTrivia(currentText, node.members.end), 19);
        var outer = factory.createPartiallyEmittedExpression(constructorLikeName);
        ts2.setTextRangeEnd(outer, closingBraceLocation.end);
        ts2.setEmitFlags(outer, 1536);
        var statement = factory.createReturnStatement(outer);
        ts2.setTextRangePos(statement, closingBraceLocation.pos);
        ts2.setEmitFlags(statement, 1536 | 384);
        statements.push(statement);
        ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
        var block = factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), node.members), true);
        ts2.setEmitFlags(block, 1536);
        return block;
      }
      function addExtendsHelperIfNeeded(statements, node, extendsClauseElement) {
        if (extendsClauseElement) {
          statements.push(ts2.setTextRange(factory.createExpressionStatement(emitHelpers().createExtendsHelper(factory.getInternalName(node))), extendsClauseElement));
        }
      }
      function addConstructor(statements, node, name, extendsClauseElement) {
        var savedConvertedLoopState = convertedLoopState;
        convertedLoopState = void 0;
        var ancestorFacts = enterSubtree(32662, 73);
        var constructor = ts2.getFirstConstructorWithBody(node);
        var hasSynthesizedSuper = hasSynthesizedDefaultSuperCall(constructor, extendsClauseElement !== void 0);
        var constructorFunction = factory.createFunctionDeclaration(void 0, void 0, void 0, name, void 0, transformConstructorParameters(constructor, hasSynthesizedSuper), void 0, transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper));
        ts2.setTextRange(constructorFunction, constructor || node);
        if (extendsClauseElement) {
          ts2.setEmitFlags(constructorFunction, 8);
        }
        statements.push(constructorFunction);
        exitSubtree(ancestorFacts, 98304, 0);
        convertedLoopState = savedConvertedLoopState;
      }
      function transformConstructorParameters(constructor, hasSynthesizedSuper) {
        return ts2.visitParameterList(constructor && !hasSynthesizedSuper ? constructor.parameters : void 0, visitor, context) || [];
      }
      function createDefaultConstructorBody(node, isDerivedClass) {
        var statements = [];
        resumeLexicalEnvironment();
        factory.mergeLexicalEnvironment(statements, endLexicalEnvironment());
        if (isDerivedClass) {
          statements.push(factory.createReturnStatement(createDefaultSuperCallOrThis()));
        }
        var statementsArray = factory.createNodeArray(statements);
        ts2.setTextRange(statementsArray, node.members);
        var block = factory.createBlock(statementsArray, true);
        ts2.setTextRange(block, node);
        ts2.setEmitFlags(block, 1536);
        return block;
      }
      function transformConstructorBody(constructor, node, extendsClauseElement, hasSynthesizedSuper) {
        var isDerivedClass = !!extendsClauseElement && ts2.skipOuterExpressions(extendsClauseElement.expression).kind !== 104;
        if (!constructor)
          return createDefaultConstructorBody(node, isDerivedClass);
        var prologue = [];
        var statements = [];
        resumeLexicalEnvironment();
        var statementOffset = 0;
        if (!hasSynthesizedSuper)
          statementOffset = factory.copyStandardPrologue(constructor.body.statements, prologue, false);
        addDefaultValueAssignmentsIfNeeded(statements, constructor);
        addRestParameterIfNeeded(statements, constructor, hasSynthesizedSuper);
        if (!hasSynthesizedSuper)
          statementOffset = factory.copyCustomPrologue(constructor.body.statements, statements, statementOffset, visitor);
        var superCallExpression;
        if (hasSynthesizedSuper) {
          superCallExpression = createDefaultSuperCallOrThis();
        } else if (isDerivedClass && statementOffset < constructor.body.statements.length) {
          var firstStatement = constructor.body.statements[statementOffset];
          if (ts2.isExpressionStatement(firstStatement) && ts2.isSuperCall(firstStatement.expression)) {
            superCallExpression = visitImmediateSuperCallInBody(firstStatement.expression);
          }
        }
        if (superCallExpression) {
          hierarchyFacts |= 8192;
          statementOffset++;
        }
        ts2.addRange(statements, ts2.visitNodes(constructor.body.statements, visitor, ts2.isStatement, statementOffset));
        factory.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
        insertCaptureNewTargetIfNeeded(prologue, constructor, false);
        if (isDerivedClass) {
          if (superCallExpression && statementOffset === constructor.body.statements.length && !(constructor.body.transformFlags & 8192)) {
            var superCall = ts2.cast(ts2.cast(superCallExpression, ts2.isBinaryExpression).left, ts2.isCallExpression);
            var returnStatement = factory.createReturnStatement(superCallExpression);
            ts2.setCommentRange(returnStatement, ts2.getCommentRange(superCall));
            ts2.setEmitFlags(superCall, 1536);
            statements.push(returnStatement);
          } else {
            insertCaptureThisForNode(statements, constructor, superCallExpression || createActualThis());
            if (!isSufficientlyCoveredByReturnStatements(constructor.body)) {
              statements.push(factory.createReturnStatement(factory.createUniqueName("_this", 16 | 32)));
            }
          }
        } else {
          insertCaptureThisForNodeIfNeeded(prologue, constructor);
        }
        var block = factory.createBlock(ts2.setTextRange(factory.createNodeArray(ts2.concatenate(prologue, statements)), constructor.body.statements), true);
        ts2.setTextRange(block, constructor.body);
        return block;
      }
      function isSufficientlyCoveredByReturnStatements(statement) {
        if (statement.kind === 246) {
          return true;
        } else if (statement.kind === 238) {
          var ifStatement = statement;
          if (ifStatement.elseStatement) {
            return isSufficientlyCoveredByReturnStatements(ifStatement.thenStatement) && isSufficientlyCoveredByReturnStatements(ifStatement.elseStatement);
          }
        } else if (statement.kind === 234) {
          var lastStatement = ts2.lastOrUndefined(statement.statements);
          if (lastStatement && isSufficientlyCoveredByReturnStatements(lastStatement)) {
            return true;
          }
        }
        return false;
      }
      function createActualThis() {
        return ts2.setEmitFlags(factory.createThis(), 4);
      }
      function createDefaultSuperCallOrThis() {
        return factory.createLogicalOr(factory.createLogicalAnd(factory.createStrictInequality(factory.createUniqueName("_super", 16 | 32), factory.createNull()), factory.createFunctionApplyCall(factory.createUniqueName("_super", 16 | 32), createActualThis(), factory.createIdentifier("arguments"))), createActualThis());
      }
      function visitParameter(node) {
        if (node.dotDotDotToken) {
          return void 0;
        } else if (ts2.isBindingPattern(node.name)) {
          return ts2.setOriginalNode(ts2.setTextRange(factory.createParameterDeclaration(void 0, void 0, void 0, factory.getGeneratedNameForNode(node), void 0, void 0, void 0), node), node);
        } else if (node.initializer) {
          return ts2.setOriginalNode(ts2.setTextRange(factory.createParameterDeclaration(void 0, void 0, void 0, node.name, void 0, void 0, void 0), node), node);
        } else {
          return node;
        }
      }
      function hasDefaultValueOrBindingPattern(node) {
        return node.initializer !== void 0 || ts2.isBindingPattern(node.name);
      }
      function addDefaultValueAssignmentsIfNeeded(statements, node) {
        if (!ts2.some(node.parameters, hasDefaultValueOrBindingPattern)) {
          return false;
        }
        var added = false;
        for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
          var parameter = _a[_i];
          var name = parameter.name, initializer = parameter.initializer, dotDotDotToken = parameter.dotDotDotToken;
          if (dotDotDotToken) {
            continue;
          }
          if (ts2.isBindingPattern(name)) {
            added = insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) || added;
          } else if (initializer) {
            insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer);
            added = true;
          }
        }
        return added;
      }
      function insertDefaultValueAssignmentForBindingPattern(statements, parameter, name, initializer) {
        if (name.elements.length > 0) {
          ts2.insertStatementAfterCustomPrologue(statements, ts2.setEmitFlags(factory.createVariableStatement(void 0, factory.createVariableDeclarationList(ts2.flattenDestructuringBinding(parameter, visitor, context, 0, factory.getGeneratedNameForNode(parameter)))), 1048576));
          return true;
        } else if (initializer) {
          ts2.insertStatementAfterCustomPrologue(statements, ts2.setEmitFlags(factory.createExpressionStatement(factory.createAssignment(factory.getGeneratedNameForNode(parameter), ts2.visitNode(initializer, visitor, ts2.isExpression))), 1048576));
          return true;
        }
        return false;
      }
      function insertDefaultValueAssignmentForInitializer(statements, parameter, name, initializer) {
        initializer = ts2.visitNode(initializer, visitor, ts2.isExpression);
        var statement = factory.createIfStatement(factory.createTypeCheck(factory.cloneNode(name), "undefined"), ts2.setEmitFlags(ts2.setTextRange(factory.createBlock([
          factory.createExpressionStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createAssignment(ts2.setEmitFlags(ts2.setParent(ts2.setTextRange(factory.cloneNode(name), name), name.parent), 48), ts2.setEmitFlags(initializer, 48 | ts2.getEmitFlags(initializer) | 1536)), parameter), 1536))
        ]), parameter), 1 | 32 | 384 | 1536));
        ts2.startOnNewLine(statement);
        ts2.setTextRange(statement, parameter);
        ts2.setEmitFlags(statement, 384 | 32 | 1048576 | 1536);
        ts2.insertStatementAfterCustomPrologue(statements, statement);
      }
      function shouldAddRestParameter(node, inConstructorWithSynthesizedSuper) {
        return !!(node && node.dotDotDotToken && !inConstructorWithSynthesizedSuper);
      }
      function addRestParameterIfNeeded(statements, node, inConstructorWithSynthesizedSuper) {
        var prologueStatements = [];
        var parameter = ts2.lastOrUndefined(node.parameters);
        if (!shouldAddRestParameter(parameter, inConstructorWithSynthesizedSuper)) {
          return false;
        }
        var declarationName = parameter.name.kind === 79 ? ts2.setParent(ts2.setTextRange(factory.cloneNode(parameter.name), parameter.name), parameter.name.parent) : factory.createTempVariable(void 0);
        ts2.setEmitFlags(declarationName, 48);
        var expressionName = parameter.name.kind === 79 ? factory.cloneNode(parameter.name) : declarationName;
        var restIndex = node.parameters.length - 1;
        var temp = factory.createLoopVariable();
        prologueStatements.push(ts2.setEmitFlags(ts2.setTextRange(factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
          factory.createVariableDeclaration(declarationName, void 0, void 0, factory.createArrayLiteralExpression([]))
        ])), parameter), 1048576));
        var forStatement = factory.createForStatement(ts2.setTextRange(factory.createVariableDeclarationList([
          factory.createVariableDeclaration(temp, void 0, void 0, factory.createNumericLiteral(restIndex))
        ]), parameter), ts2.setTextRange(factory.createLessThan(temp, factory.createPropertyAccessExpression(factory.createIdentifier("arguments"), "length")), parameter), ts2.setTextRange(factory.createPostfixIncrement(temp), parameter), factory.createBlock([
          ts2.startOnNewLine(ts2.setTextRange(factory.createExpressionStatement(factory.createAssignment(factory.createElementAccessExpression(expressionName, restIndex === 0 ? temp : factory.createSubtract(temp, factory.createNumericLiteral(restIndex))), factory.createElementAccessExpression(factory.createIdentifier("arguments"), temp))), parameter))
        ]));
        ts2.setEmitFlags(forStatement, 1048576);
        ts2.startOnNewLine(forStatement);
        prologueStatements.push(forStatement);
        if (parameter.name.kind !== 79) {
          prologueStatements.push(ts2.setEmitFlags(ts2.setTextRange(factory.createVariableStatement(void 0, factory.createVariableDeclarationList(ts2.flattenDestructuringBinding(parameter, visitor, context, 0, expressionName))), parameter), 1048576));
        }
        ts2.insertStatementsAfterCustomPrologue(statements, prologueStatements);
        return true;
      }
      function insertCaptureThisForNodeIfNeeded(statements, node) {
        if (hierarchyFacts & 65536 && node.kind !== 213) {
          insertCaptureThisForNode(statements, node, factory.createThis());
          return true;
        }
        return false;
      }
      function insertCaptureThisForNode(statements, node, initializer) {
        enableSubstitutionsForCapturedThis();
        var captureThisStatement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
          factory.createVariableDeclaration(factory.createUniqueName("_this", 16 | 32), void 0, void 0, initializer)
        ]));
        ts2.setEmitFlags(captureThisStatement, 1536 | 1048576);
        ts2.setSourceMapRange(captureThisStatement, node);
        ts2.insertStatementAfterCustomPrologue(statements, captureThisStatement);
      }
      function insertCaptureNewTargetIfNeeded(statements, node, copyOnWrite) {
        if (hierarchyFacts & 32768) {
          var newTarget = void 0;
          switch (node.kind) {
            case 213:
              return statements;
            case 168:
            case 171:
            case 172:
              newTarget = factory.createVoidZero();
              break;
            case 170:
              newTarget = factory.createPropertyAccessExpression(ts2.setEmitFlags(factory.createThis(), 4), "constructor");
              break;
            case 255:
            case 212:
              newTarget = factory.createConditionalExpression(factory.createLogicalAnd(ts2.setEmitFlags(factory.createThis(), 4), factory.createBinaryExpression(ts2.setEmitFlags(factory.createThis(), 4), 102, factory.getLocalName(node))), void 0, factory.createPropertyAccessExpression(ts2.setEmitFlags(factory.createThis(), 4), "constructor"), void 0, factory.createVoidZero());
              break;
            default:
              return ts2.Debug.failBadSyntaxKind(node);
          }
          var captureNewTargetStatement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
            factory.createVariableDeclaration(factory.createUniqueName("_newTarget", 16 | 32), void 0, void 0, newTarget)
          ]));
          ts2.setEmitFlags(captureNewTargetStatement, 1536 | 1048576);
          if (copyOnWrite) {
            statements = statements.slice();
          }
          ts2.insertStatementAfterCustomPrologue(statements, captureNewTargetStatement);
        }
        return statements;
      }
      function addClassMembers(statements, node) {
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          switch (member.kind) {
            case 233:
              statements.push(transformSemicolonClassElementToStatement(member));
              break;
            case 168:
              statements.push(transformClassMethodDeclarationToStatement(getClassMemberPrefix(node, member), member, node));
              break;
            case 171:
            case 172:
              var accessors = ts2.getAllAccessorDeclarations(node.members, member);
              if (member === accessors.firstAccessor) {
                statements.push(transformAccessorsToStatement(getClassMemberPrefix(node, member), accessors, node));
              }
              break;
            case 170:
            case 169:
              break;
            default:
              ts2.Debug.failBadSyntaxKind(member, currentSourceFile && currentSourceFile.fileName);
              break;
          }
        }
      }
      function transformSemicolonClassElementToStatement(member) {
        return ts2.setTextRange(factory.createEmptyStatement(), member);
      }
      function transformClassMethodDeclarationToStatement(receiver, member, container) {
        var commentRange = ts2.getCommentRange(member);
        var sourceMapRange = ts2.getSourceMapRange(member);
        var memberFunction = transformFunctionLikeToExpression(member, member, void 0, container);
        var propertyName = ts2.visitNode(member.name, visitor, ts2.isPropertyName);
        var e;
        if (!ts2.isPrivateIdentifier(propertyName) && ts2.getUseDefineForClassFields(context.getCompilerOptions())) {
          var name = ts2.isComputedPropertyName(propertyName) ? propertyName.expression : ts2.isIdentifier(propertyName) ? factory.createStringLiteral(ts2.unescapeLeadingUnderscores(propertyName.escapedText)) : propertyName;
          e = factory.createObjectDefinePropertyCall(receiver, name, factory.createPropertyDescriptor({ value: memberFunction, enumerable: false, writable: true, configurable: true }));
        } else {
          var memberName = ts2.createMemberAccessForPropertyName(factory, receiver, propertyName, member.name);
          e = factory.createAssignment(memberName, memberFunction);
        }
        ts2.setEmitFlags(memberFunction, 1536);
        ts2.setSourceMapRange(memberFunction, sourceMapRange);
        var statement = ts2.setTextRange(factory.createExpressionStatement(e), member);
        ts2.setOriginalNode(statement, member);
        ts2.setCommentRange(statement, commentRange);
        ts2.setEmitFlags(statement, 48);
        return statement;
      }
      function transformAccessorsToStatement(receiver, accessors, container) {
        var statement = factory.createExpressionStatement(transformAccessorsToExpression(receiver, accessors, container, false));
        ts2.setEmitFlags(statement, 1536);
        ts2.setSourceMapRange(statement, ts2.getSourceMapRange(accessors.firstAccessor));
        return statement;
      }
      function transformAccessorsToExpression(receiver, _a, container, startsOnNewLine) {
        var firstAccessor = _a.firstAccessor, getAccessor = _a.getAccessor, setAccessor = _a.setAccessor;
        var target = ts2.setParent(ts2.setTextRange(factory.cloneNode(receiver), receiver), receiver.parent);
        ts2.setEmitFlags(target, 1536 | 32);
        ts2.setSourceMapRange(target, firstAccessor.name);
        var visitedAccessorName = ts2.visitNode(firstAccessor.name, visitor, ts2.isPropertyName);
        if (ts2.isPrivateIdentifier(visitedAccessorName)) {
          return ts2.Debug.failBadSyntaxKind(visitedAccessorName, "Encountered unhandled private identifier while transforming ES2015.");
        }
        var propertyName = ts2.createExpressionForPropertyName(factory, visitedAccessorName);
        ts2.setEmitFlags(propertyName, 1536 | 16);
        ts2.setSourceMapRange(propertyName, firstAccessor.name);
        var properties = [];
        if (getAccessor) {
          var getterFunction = transformFunctionLikeToExpression(getAccessor, void 0, void 0, container);
          ts2.setSourceMapRange(getterFunction, ts2.getSourceMapRange(getAccessor));
          ts2.setEmitFlags(getterFunction, 512);
          var getter = factory.createPropertyAssignment("get", getterFunction);
          ts2.setCommentRange(getter, ts2.getCommentRange(getAccessor));
          properties.push(getter);
        }
        if (setAccessor) {
          var setterFunction = transformFunctionLikeToExpression(setAccessor, void 0, void 0, container);
          ts2.setSourceMapRange(setterFunction, ts2.getSourceMapRange(setAccessor));
          ts2.setEmitFlags(setterFunction, 512);
          var setter = factory.createPropertyAssignment("set", setterFunction);
          ts2.setCommentRange(setter, ts2.getCommentRange(setAccessor));
          properties.push(setter);
        }
        properties.push(factory.createPropertyAssignment("enumerable", getAccessor || setAccessor ? factory.createFalse() : factory.createTrue()), factory.createPropertyAssignment("configurable", factory.createTrue()));
        var call = factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("Object"), "defineProperty"), void 0, [
          target,
          propertyName,
          factory.createObjectLiteralExpression(properties, true)
        ]);
        if (startsOnNewLine) {
          ts2.startOnNewLine(call);
        }
        return call;
      }
      function visitArrowFunction(node) {
        if (node.transformFlags & 8192 && !(hierarchyFacts & 16384)) {
          hierarchyFacts |= 65536;
        }
        var savedConvertedLoopState = convertedLoopState;
        convertedLoopState = void 0;
        var ancestorFacts = enterSubtree(15232, 66);
        var func = factory.createFunctionExpression(void 0, void 0, void 0, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, transformFunctionBody(node));
        ts2.setTextRange(func, node);
        ts2.setOriginalNode(func, node);
        ts2.setEmitFlags(func, 8);
        exitSubtree(ancestorFacts, 0, 0);
        convertedLoopState = savedConvertedLoopState;
        return func;
      }
      function visitFunctionExpression(node) {
        var ancestorFacts = ts2.getEmitFlags(node) & 262144 ? enterSubtree(32662, 69) : enterSubtree(32670, 65);
        var savedConvertedLoopState = convertedLoopState;
        convertedLoopState = void 0;
        var parameters = ts2.visitParameterList(node.parameters, visitor, context);
        var body = transformFunctionBody(node);
        var name = hierarchyFacts & 32768 ? factory.getLocalName(node) : node.name;
        exitSubtree(ancestorFacts, 98304, 0);
        convertedLoopState = savedConvertedLoopState;
        return factory.updateFunctionExpression(node, void 0, node.asteriskToken, name, void 0, parameters, void 0, body);
      }
      function visitFunctionDeclaration(node) {
        var savedConvertedLoopState = convertedLoopState;
        convertedLoopState = void 0;
        var ancestorFacts = enterSubtree(32670, 65);
        var parameters = ts2.visitParameterList(node.parameters, visitor, context);
        var body = transformFunctionBody(node);
        var name = hierarchyFacts & 32768 ? factory.getLocalName(node) : node.name;
        exitSubtree(ancestorFacts, 98304, 0);
        convertedLoopState = savedConvertedLoopState;
        return factory.updateFunctionDeclaration(node, void 0, ts2.visitNodes(node.modifiers, visitor, ts2.isModifier), node.asteriskToken, name, void 0, parameters, void 0, body);
      }
      function transformFunctionLikeToExpression(node, location, name, container) {
        var savedConvertedLoopState = convertedLoopState;
        convertedLoopState = void 0;
        var ancestorFacts = container && ts2.isClassLike(container) && !ts2.isStatic(node) ? enterSubtree(32670, 65 | 8) : enterSubtree(32670, 65);
        var parameters = ts2.visitParameterList(node.parameters, visitor, context);
        var body = transformFunctionBody(node);
        if (hierarchyFacts & 32768 && !name && (node.kind === 255 || node.kind === 212)) {
          name = factory.getGeneratedNameForNode(node);
        }
        exitSubtree(ancestorFacts, 98304, 0);
        convertedLoopState = savedConvertedLoopState;
        return ts2.setOriginalNode(ts2.setTextRange(factory.createFunctionExpression(void 0, node.asteriskToken, name, void 0, parameters, void 0, body), location), node);
      }
      function transformFunctionBody(node) {
        var multiLine = false;
        var singleLine = false;
        var statementsLocation;
        var closeBraceLocation;
        var prologue = [];
        var statements = [];
        var body = node.body;
        var statementOffset;
        resumeLexicalEnvironment();
        if (ts2.isBlock(body)) {
          statementOffset = factory.copyStandardPrologue(body.statements, prologue, false);
          statementOffset = factory.copyCustomPrologue(body.statements, statements, statementOffset, visitor, ts2.isHoistedFunction);
          statementOffset = factory.copyCustomPrologue(body.statements, statements, statementOffset, visitor, ts2.isHoistedVariableStatement);
        }
        multiLine = addDefaultValueAssignmentsIfNeeded(statements, node) || multiLine;
        multiLine = addRestParameterIfNeeded(statements, node, false) || multiLine;
        if (ts2.isBlock(body)) {
          statementOffset = factory.copyCustomPrologue(body.statements, statements, statementOffset, visitor);
          statementsLocation = body.statements;
          ts2.addRange(statements, ts2.visitNodes(body.statements, visitor, ts2.isStatement, statementOffset));
          if (!multiLine && body.multiLine) {
            multiLine = true;
          }
        } else {
          ts2.Debug.assert(node.kind === 213);
          statementsLocation = ts2.moveRangeEnd(body, -1);
          var equalsGreaterThanToken = node.equalsGreaterThanToken;
          if (!ts2.nodeIsSynthesized(equalsGreaterThanToken) && !ts2.nodeIsSynthesized(body)) {
            if (ts2.rangeEndIsOnSameLineAsRangeStart(equalsGreaterThanToken, body, currentSourceFile)) {
              singleLine = true;
            } else {
              multiLine = true;
            }
          }
          var expression = ts2.visitNode(body, visitor, ts2.isExpression);
          var returnStatement = factory.createReturnStatement(expression);
          ts2.setTextRange(returnStatement, body);
          ts2.moveSyntheticComments(returnStatement, body);
          ts2.setEmitFlags(returnStatement, 384 | 32 | 1024);
          statements.push(returnStatement);
          closeBraceLocation = body;
        }
        factory.mergeLexicalEnvironment(prologue, endLexicalEnvironment());
        insertCaptureNewTargetIfNeeded(prologue, node, false);
        insertCaptureThisForNodeIfNeeded(prologue, node);
        if (ts2.some(prologue)) {
          multiLine = true;
        }
        statements.unshift.apply(statements, prologue);
        if (ts2.isBlock(body) && ts2.arrayIsEqualTo(statements, body.statements)) {
          return body;
        }
        var block = factory.createBlock(ts2.setTextRange(factory.createNodeArray(statements), statementsLocation), multiLine);
        ts2.setTextRange(block, node.body);
        if (!multiLine && singleLine) {
          ts2.setEmitFlags(block, 1);
        }
        if (closeBraceLocation) {
          ts2.setTokenSourceMapRange(block, 19, closeBraceLocation);
        }
        ts2.setOriginalNode(block, node.body);
        return block;
      }
      function visitBlock(node, isFunctionBody) {
        if (isFunctionBody) {
          return ts2.visitEachChild(node, visitor, context);
        }
        var ancestorFacts = hierarchyFacts & 256 ? enterSubtree(7104, 512) : enterSubtree(6976, 128);
        var updated = ts2.visitEachChild(node, visitor, context);
        exitSubtree(ancestorFacts, 0, 0);
        return updated;
      }
      function visitExpressionStatement(node) {
        return ts2.visitEachChild(node, visitorWithUnusedExpressionResult, context);
      }
      function visitParenthesizedExpression(node, expressionResultIsUnused) {
        return ts2.visitEachChild(node, expressionResultIsUnused ? visitorWithUnusedExpressionResult : visitor, context);
      }
      function visitBinaryExpression(node, expressionResultIsUnused) {
        if (ts2.isDestructuringAssignment(node)) {
          return ts2.flattenDestructuringAssignment(node, visitor, context, 0, !expressionResultIsUnused);
        }
        if (node.operatorToken.kind === 27) {
          return factory.updateBinaryExpression(node, ts2.visitNode(node.left, visitorWithUnusedExpressionResult, ts2.isExpression), node.operatorToken, ts2.visitNode(node.right, expressionResultIsUnused ? visitorWithUnusedExpressionResult : visitor, ts2.isExpression));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitCommaListExpression(node, expressionResultIsUnused) {
        if (expressionResultIsUnused) {
          return ts2.visitEachChild(node, visitorWithUnusedExpressionResult, context);
        }
        var result;
        for (var i = 0; i < node.elements.length; i++) {
          var element = node.elements[i];
          var visited = ts2.visitNode(element, i < node.elements.length - 1 ? visitorWithUnusedExpressionResult : visitor, ts2.isExpression);
          if (result || visited !== element) {
            result || (result = node.elements.slice(0, i));
            result.push(visited);
          }
        }
        var elements = result ? ts2.setTextRange(factory.createNodeArray(result), node.elements) : node.elements;
        return factory.updateCommaListExpression(node, elements);
      }
      function isVariableStatementOfTypeScriptClassWrapper(node) {
        return node.declarationList.declarations.length === 1 && !!node.declarationList.declarations[0].initializer && !!(ts2.getEmitFlags(node.declarationList.declarations[0].initializer) & 33554432);
      }
      function visitVariableStatement(node) {
        var ancestorFacts = enterSubtree(0, ts2.hasSyntacticModifier(node, 1) ? 32 : 0);
        var updated;
        if (convertedLoopState && (node.declarationList.flags & 3) === 0 && !isVariableStatementOfTypeScriptClassWrapper(node)) {
          var assignments = void 0;
          for (var _i = 0, _a = node.declarationList.declarations; _i < _a.length; _i++) {
            var decl = _a[_i];
            hoistVariableDeclarationDeclaredInConvertedLoop(convertedLoopState, decl);
            if (decl.initializer) {
              var assignment = void 0;
              if (ts2.isBindingPattern(decl.name)) {
                assignment = ts2.flattenDestructuringAssignment(decl, visitor, context, 0);
              } else {
                assignment = factory.createBinaryExpression(decl.name, 63, ts2.visitNode(decl.initializer, visitor, ts2.isExpression));
                ts2.setTextRange(assignment, decl);
              }
              assignments = ts2.append(assignments, assignment);
            }
          }
          if (assignments) {
            updated = ts2.setTextRange(factory.createExpressionStatement(factory.inlineExpressions(assignments)), node);
          } else {
            updated = void 0;
          }
        } else {
          updated = ts2.visitEachChild(node, visitor, context);
        }
        exitSubtree(ancestorFacts, 0, 0);
        return updated;
      }
      function visitVariableDeclarationList(node) {
        if (node.flags & 3 || node.transformFlags & 262144) {
          if (node.flags & 3) {
            enableSubstitutionsForBlockScopedBindings();
          }
          var declarations = ts2.flatMap(node.declarations, node.flags & 1 ? visitVariableDeclarationInLetDeclarationList : visitVariableDeclaration);
          var declarationList = factory.createVariableDeclarationList(declarations);
          ts2.setOriginalNode(declarationList, node);
          ts2.setTextRange(declarationList, node);
          ts2.setCommentRange(declarationList, node);
          if (node.transformFlags & 262144 && (ts2.isBindingPattern(node.declarations[0].name) || ts2.isBindingPattern(ts2.last(node.declarations).name))) {
            ts2.setSourceMapRange(declarationList, getRangeUnion(declarations));
          }
          return declarationList;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function getRangeUnion(declarations) {
        var pos = -1, end = -1;
        for (var _i = 0, declarations_9 = declarations; _i < declarations_9.length; _i++) {
          var node = declarations_9[_i];
          pos = pos === -1 ? node.pos : node.pos === -1 ? pos : Math.min(pos, node.pos);
          end = Math.max(end, node.end);
        }
        return ts2.createRange(pos, end);
      }
      function shouldEmitExplicitInitializerForLetDeclaration(node) {
        var flags = resolver.getNodeCheckFlags(node);
        var isCapturedInFunction = flags & 262144;
        var isDeclaredInLoop = flags & 524288;
        var emittedAsTopLevel = (hierarchyFacts & 64) !== 0 || isCapturedInFunction && isDeclaredInLoop && (hierarchyFacts & 512) !== 0;
        var emitExplicitInitializer = !emittedAsTopLevel && (hierarchyFacts & 4096) === 0 && (!resolver.isDeclarationWithCollidingName(node) || isDeclaredInLoop && !isCapturedInFunction && (hierarchyFacts & (2048 | 4096)) === 0);
        return emitExplicitInitializer;
      }
      function visitVariableDeclarationInLetDeclarationList(node) {
        var name = node.name;
        if (ts2.isBindingPattern(name)) {
          return visitVariableDeclaration(node);
        }
        if (!node.initializer && shouldEmitExplicitInitializerForLetDeclaration(node)) {
          return factory.updateVariableDeclaration(node, node.name, void 0, void 0, factory.createVoidZero());
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitVariableDeclaration(node) {
        var ancestorFacts = enterSubtree(32, 0);
        var updated;
        if (ts2.isBindingPattern(node.name)) {
          updated = ts2.flattenDestructuringBinding(node, visitor, context, 0, void 0, (ancestorFacts & 32) !== 0);
        } else {
          updated = ts2.visitEachChild(node, visitor, context);
        }
        exitSubtree(ancestorFacts, 0, 0);
        return updated;
      }
      function recordLabel(node) {
        convertedLoopState.labels.set(ts2.idText(node.label), true);
      }
      function resetLabel(node) {
        convertedLoopState.labels.set(ts2.idText(node.label), false);
      }
      function visitLabeledStatement(node) {
        if (convertedLoopState && !convertedLoopState.labels) {
          convertedLoopState.labels = new ts2.Map();
        }
        var statement = ts2.unwrapInnermostStatementOfLabel(node, convertedLoopState && recordLabel);
        return ts2.isIterationStatement(statement, false) ? visitIterationStatement(statement, node) : factory.restoreEnclosingLabel(ts2.visitNode(statement, visitor, ts2.isStatement, factory.liftToBlock), node, convertedLoopState && resetLabel);
      }
      function visitIterationStatement(node, outermostLabeledStatement) {
        switch (node.kind) {
          case 239:
          case 240:
            return visitDoOrWhileStatement(node, outermostLabeledStatement);
          case 241:
            return visitForStatement(node, outermostLabeledStatement);
          case 242:
            return visitForInStatement(node, outermostLabeledStatement);
          case 243:
            return visitForOfStatement(node, outermostLabeledStatement);
        }
      }
      function visitIterationStatementWithFacts(excludeFacts, includeFacts, node, outermostLabeledStatement, convert) {
        var ancestorFacts = enterSubtree(excludeFacts, includeFacts);
        var updated = convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert);
        exitSubtree(ancestorFacts, 0, 0);
        return updated;
      }
      function visitDoOrWhileStatement(node, outermostLabeledStatement) {
        return visitIterationStatementWithFacts(0, 1280, node, outermostLabeledStatement);
      }
      function visitForStatement(node, outermostLabeledStatement) {
        return visitIterationStatementWithFacts(5056, 3328, node, outermostLabeledStatement);
      }
      function visitEachChildOfForStatement(node) {
        return factory.updateForStatement(node, ts2.visitNode(node.initializer, visitorWithUnusedExpressionResult, ts2.isForInitializer), ts2.visitNode(node.condition, visitor, ts2.isExpression), ts2.visitNode(node.incrementor, visitorWithUnusedExpressionResult, ts2.isExpression), ts2.visitNode(node.statement, visitor, ts2.isStatement, factory.liftToBlock));
      }
      function visitForInStatement(node, outermostLabeledStatement) {
        return visitIterationStatementWithFacts(3008, 5376, node, outermostLabeledStatement);
      }
      function visitForOfStatement(node, outermostLabeledStatement) {
        return visitIterationStatementWithFacts(3008, 5376, node, outermostLabeledStatement, compilerOptions.downlevelIteration ? convertForOfStatementForIterable : convertForOfStatementForArray);
      }
      function convertForOfStatementHead(node, boundValue, convertedLoopBodyStatements) {
        var statements = [];
        var initializer = node.initializer;
        if (ts2.isVariableDeclarationList(initializer)) {
          if (node.initializer.flags & 3) {
            enableSubstitutionsForBlockScopedBindings();
          }
          var firstOriginalDeclaration = ts2.firstOrUndefined(initializer.declarations);
          if (firstOriginalDeclaration && ts2.isBindingPattern(firstOriginalDeclaration.name)) {
            var declarations = ts2.flattenDestructuringBinding(firstOriginalDeclaration, visitor, context, 0, boundValue);
            var declarationList = ts2.setTextRange(factory.createVariableDeclarationList(declarations), node.initializer);
            ts2.setOriginalNode(declarationList, node.initializer);
            ts2.setSourceMapRange(declarationList, ts2.createRange(declarations[0].pos, ts2.last(declarations).end));
            statements.push(factory.createVariableStatement(void 0, declarationList));
          } else {
            statements.push(ts2.setTextRange(factory.createVariableStatement(void 0, ts2.setOriginalNode(ts2.setTextRange(factory.createVariableDeclarationList([
              factory.createVariableDeclaration(firstOriginalDeclaration ? firstOriginalDeclaration.name : factory.createTempVariable(void 0), void 0, void 0, boundValue)
            ]), ts2.moveRangePos(initializer, -1)), initializer)), ts2.moveRangeEnd(initializer, -1)));
          }
        } else {
          var assignment = factory.createAssignment(initializer, boundValue);
          if (ts2.isDestructuringAssignment(assignment)) {
            statements.push(factory.createExpressionStatement(visitBinaryExpression(assignment, true)));
          } else {
            ts2.setTextRangeEnd(assignment, initializer.end);
            statements.push(ts2.setTextRange(factory.createExpressionStatement(ts2.visitNode(assignment, visitor, ts2.isExpression)), ts2.moveRangeEnd(initializer, -1)));
          }
        }
        if (convertedLoopBodyStatements) {
          return createSyntheticBlockForConvertedStatements(ts2.addRange(statements, convertedLoopBodyStatements));
        } else {
          var statement = ts2.visitNode(node.statement, visitor, ts2.isStatement, factory.liftToBlock);
          if (ts2.isBlock(statement)) {
            return factory.updateBlock(statement, ts2.setTextRange(factory.createNodeArray(ts2.concatenate(statements, statement.statements)), statement.statements));
          } else {
            statements.push(statement);
            return createSyntheticBlockForConvertedStatements(statements);
          }
        }
      }
      function createSyntheticBlockForConvertedStatements(statements) {
        return ts2.setEmitFlags(factory.createBlock(factory.createNodeArray(statements), true), 48 | 384);
      }
      function convertForOfStatementForArray(node, outermostLabeledStatement, convertedLoopBodyStatements) {
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        var counter = factory.createLoopVariable();
        var rhsReference = ts2.isIdentifier(expression) ? factory.getGeneratedNameForNode(expression) : factory.createTempVariable(void 0);
        ts2.setEmitFlags(expression, 48 | ts2.getEmitFlags(expression));
        var forStatement = ts2.setTextRange(factory.createForStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createVariableDeclarationList([
          ts2.setTextRange(factory.createVariableDeclaration(counter, void 0, void 0, factory.createNumericLiteral(0)), ts2.moveRangePos(node.expression, -1)),
          ts2.setTextRange(factory.createVariableDeclaration(rhsReference, void 0, void 0, expression), node.expression)
        ]), node.expression), 2097152), ts2.setTextRange(factory.createLessThan(counter, factory.createPropertyAccessExpression(rhsReference, "length")), node.expression), ts2.setTextRange(factory.createPostfixIncrement(counter), node.expression), convertForOfStatementHead(node, factory.createElementAccessExpression(rhsReference, counter), convertedLoopBodyStatements)), node);
        ts2.setEmitFlags(forStatement, 256);
        ts2.setTextRange(forStatement, node);
        return factory.restoreEnclosingLabel(forStatement, outermostLabeledStatement, convertedLoopState && resetLabel);
      }
      function convertForOfStatementForIterable(node, outermostLabeledStatement, convertedLoopBodyStatements, ancestorFacts) {
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        var iterator = ts2.isIdentifier(expression) ? factory.getGeneratedNameForNode(expression) : factory.createTempVariable(void 0);
        var result = ts2.isIdentifier(expression) ? factory.getGeneratedNameForNode(iterator) : factory.createTempVariable(void 0);
        var errorRecord = factory.createUniqueName("e");
        var catchVariable = factory.getGeneratedNameForNode(errorRecord);
        var returnMethod = factory.createTempVariable(void 0);
        var values = ts2.setTextRange(emitHelpers().createValuesHelper(expression), node.expression);
        var next = factory.createCallExpression(factory.createPropertyAccessExpression(iterator, "next"), void 0, []);
        hoistVariableDeclaration(errorRecord);
        hoistVariableDeclaration(returnMethod);
        var initializer = ancestorFacts & 1024 ? factory.inlineExpressions([factory.createAssignment(errorRecord, factory.createVoidZero()), values]) : values;
        var forStatement = ts2.setEmitFlags(ts2.setTextRange(factory.createForStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createVariableDeclarationList([
          ts2.setTextRange(factory.createVariableDeclaration(iterator, void 0, void 0, initializer), node.expression),
          factory.createVariableDeclaration(result, void 0, void 0, next)
        ]), node.expression), 2097152), factory.createLogicalNot(factory.createPropertyAccessExpression(result, "done")), factory.createAssignment(result, next), convertForOfStatementHead(node, factory.createPropertyAccessExpression(result, "value"), convertedLoopBodyStatements)), node), 256);
        return factory.createTryStatement(factory.createBlock([
          factory.restoreEnclosingLabel(forStatement, outermostLabeledStatement, convertedLoopState && resetLabel)
        ]), factory.createCatchClause(factory.createVariableDeclaration(catchVariable), ts2.setEmitFlags(factory.createBlock([
          factory.createExpressionStatement(factory.createAssignment(errorRecord, factory.createObjectLiteralExpression([
            factory.createPropertyAssignment("error", catchVariable)
          ])))
        ]), 1)), factory.createBlock([
          factory.createTryStatement(factory.createBlock([
            ts2.setEmitFlags(factory.createIfStatement(factory.createLogicalAnd(factory.createLogicalAnd(result, factory.createLogicalNot(factory.createPropertyAccessExpression(result, "done"))), factory.createAssignment(returnMethod, factory.createPropertyAccessExpression(iterator, "return"))), factory.createExpressionStatement(factory.createFunctionCallCall(returnMethod, iterator, []))), 1)
          ]), void 0, ts2.setEmitFlags(factory.createBlock([
            ts2.setEmitFlags(factory.createIfStatement(errorRecord, factory.createThrowStatement(factory.createPropertyAccessExpression(errorRecord, "error"))), 1)
          ]), 1))
        ]));
      }
      function visitObjectLiteralExpression(node) {
        var properties = node.properties;
        var numInitialProperties = -1, hasComputed = false;
        for (var i = 0; i < properties.length; i++) {
          var property = properties[i];
          if (property.transformFlags & 524288 && hierarchyFacts & 4 || (hasComputed = ts2.Debug.checkDefined(property.name).kind === 161)) {
            numInitialProperties = i;
            break;
          }
        }
        if (numInitialProperties < 0) {
          return ts2.visitEachChild(node, visitor, context);
        }
        var temp = factory.createTempVariable(hoistVariableDeclaration);
        var expressions = [];
        var assignment = factory.createAssignment(temp, ts2.setEmitFlags(factory.createObjectLiteralExpression(ts2.visitNodes(properties, visitor, ts2.isObjectLiteralElementLike, 0, numInitialProperties), node.multiLine), hasComputed ? 65536 : 0));
        if (node.multiLine) {
          ts2.startOnNewLine(assignment);
        }
        expressions.push(assignment);
        addObjectLiteralMembers(expressions, node, temp, numInitialProperties);
        expressions.push(node.multiLine ? ts2.startOnNewLine(ts2.setParent(ts2.setTextRange(factory.cloneNode(temp), temp), temp.parent)) : temp);
        return factory.inlineExpressions(expressions);
      }
      function shouldConvertPartOfIterationStatement(node) {
        return (resolver.getNodeCheckFlags(node) & 131072) !== 0;
      }
      function shouldConvertInitializerOfForStatement(node) {
        return ts2.isForStatement(node) && !!node.initializer && shouldConvertPartOfIterationStatement(node.initializer);
      }
      function shouldConvertConditionOfForStatement(node) {
        return ts2.isForStatement(node) && !!node.condition && shouldConvertPartOfIterationStatement(node.condition);
      }
      function shouldConvertIncrementorOfForStatement(node) {
        return ts2.isForStatement(node) && !!node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor);
      }
      function shouldConvertIterationStatement(node) {
        return shouldConvertBodyOfIterationStatement(node) || shouldConvertInitializerOfForStatement(node);
      }
      function shouldConvertBodyOfIterationStatement(node) {
        return (resolver.getNodeCheckFlags(node) & 65536) !== 0;
      }
      function hoistVariableDeclarationDeclaredInConvertedLoop(state, node) {
        if (!state.hoistedLocalVariables) {
          state.hoistedLocalVariables = [];
        }
        visit(node.name);
        function visit(node2) {
          if (node2.kind === 79) {
            state.hoistedLocalVariables.push(node2);
          } else {
            for (var _i = 0, _a = node2.elements; _i < _a.length; _i++) {
              var element = _a[_i];
              if (!ts2.isOmittedExpression(element)) {
                visit(element.name);
              }
            }
          }
        }
      }
      function convertIterationStatementBodyIfNecessary(node, outermostLabeledStatement, ancestorFacts, convert) {
        if (!shouldConvertIterationStatement(node)) {
          var saveAllowedNonLabeledJumps = void 0;
          if (convertedLoopState) {
            saveAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
            convertedLoopState.allowedNonLabeledJumps = 2 | 4;
          }
          var result = convert ? convert(node, outermostLabeledStatement, void 0, ancestorFacts) : factory.restoreEnclosingLabel(ts2.isForStatement(node) ? visitEachChildOfForStatement(node) : ts2.visitEachChild(node, visitor, context), outermostLabeledStatement, convertedLoopState && resetLabel);
          if (convertedLoopState) {
            convertedLoopState.allowedNonLabeledJumps = saveAllowedNonLabeledJumps;
          }
          return result;
        }
        var currentState = createConvertedLoopState(node);
        var statements = [];
        var outerConvertedLoopState = convertedLoopState;
        convertedLoopState = currentState;
        var initializerFunction = shouldConvertInitializerOfForStatement(node) ? createFunctionForInitializerOfForStatement(node, currentState) : void 0;
        var bodyFunction = shouldConvertBodyOfIterationStatement(node) ? createFunctionForBodyOfIterationStatement(node, currentState, outerConvertedLoopState) : void 0;
        convertedLoopState = outerConvertedLoopState;
        if (initializerFunction)
          statements.push(initializerFunction.functionDeclaration);
        if (bodyFunction)
          statements.push(bodyFunction.functionDeclaration);
        addExtraDeclarationsForConvertedLoop(statements, currentState, outerConvertedLoopState);
        if (initializerFunction) {
          statements.push(generateCallToConvertedLoopInitializer(initializerFunction.functionName, initializerFunction.containsYield));
        }
        var loop;
        if (bodyFunction) {
          if (convert) {
            loop = convert(node, outermostLabeledStatement, bodyFunction.part, ancestorFacts);
          } else {
            var clone_4 = convertIterationStatementCore(node, initializerFunction, factory.createBlock(bodyFunction.part, true));
            loop = factory.restoreEnclosingLabel(clone_4, outermostLabeledStatement, convertedLoopState && resetLabel);
          }
        } else {
          var clone_5 = convertIterationStatementCore(node, initializerFunction, ts2.visitNode(node.statement, visitor, ts2.isStatement, factory.liftToBlock));
          loop = factory.restoreEnclosingLabel(clone_5, outermostLabeledStatement, convertedLoopState && resetLabel);
        }
        statements.push(loop);
        return statements;
      }
      function convertIterationStatementCore(node, initializerFunction, convertedLoopBody) {
        switch (node.kind) {
          case 241:
            return convertForStatement(node, initializerFunction, convertedLoopBody);
          case 242:
            return convertForInStatement(node, convertedLoopBody);
          case 243:
            return convertForOfStatement(node, convertedLoopBody);
          case 239:
            return convertDoStatement(node, convertedLoopBody);
          case 240:
            return convertWhileStatement(node, convertedLoopBody);
          default:
            return ts2.Debug.failBadSyntaxKind(node, "IterationStatement expected");
        }
      }
      function convertForStatement(node, initializerFunction, convertedLoopBody) {
        var shouldConvertCondition = node.condition && shouldConvertPartOfIterationStatement(node.condition);
        var shouldConvertIncrementor = shouldConvertCondition || node.incrementor && shouldConvertPartOfIterationStatement(node.incrementor);
        return factory.updateForStatement(node, ts2.visitNode(initializerFunction ? initializerFunction.part : node.initializer, visitorWithUnusedExpressionResult, ts2.isForInitializer), ts2.visitNode(shouldConvertCondition ? void 0 : node.condition, visitor, ts2.isExpression), ts2.visitNode(shouldConvertIncrementor ? void 0 : node.incrementor, visitorWithUnusedExpressionResult, ts2.isExpression), convertedLoopBody);
      }
      function convertForOfStatement(node, convertedLoopBody) {
        return factory.updateForOfStatement(node, void 0, ts2.visitNode(node.initializer, visitor, ts2.isForInitializer), ts2.visitNode(node.expression, visitor, ts2.isExpression), convertedLoopBody);
      }
      function convertForInStatement(node, convertedLoopBody) {
        return factory.updateForInStatement(node, ts2.visitNode(node.initializer, visitor, ts2.isForInitializer), ts2.visitNode(node.expression, visitor, ts2.isExpression), convertedLoopBody);
      }
      function convertDoStatement(node, convertedLoopBody) {
        return factory.updateDoStatement(node, convertedLoopBody, ts2.visitNode(node.expression, visitor, ts2.isExpression));
      }
      function convertWhileStatement(node, convertedLoopBody) {
        return factory.updateWhileStatement(node, ts2.visitNode(node.expression, visitor, ts2.isExpression), convertedLoopBody);
      }
      function createConvertedLoopState(node) {
        var loopInitializer;
        switch (node.kind) {
          case 241:
          case 242:
          case 243:
            var initializer = node.initializer;
            if (initializer && initializer.kind === 254) {
              loopInitializer = initializer;
            }
            break;
        }
        var loopParameters = [];
        var loopOutParameters = [];
        if (loopInitializer && ts2.getCombinedNodeFlags(loopInitializer) & 3) {
          var hasCapturedBindingsInForInitializer = shouldConvertInitializerOfForStatement(node);
          for (var _i = 0, _a = loopInitializer.declarations; _i < _a.length; _i++) {
            var decl = _a[_i];
            processLoopVariableDeclaration(node, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForInitializer);
          }
        }
        var currentState = { loopParameters, loopOutParameters };
        if (convertedLoopState) {
          if (convertedLoopState.argumentsName) {
            currentState.argumentsName = convertedLoopState.argumentsName;
          }
          if (convertedLoopState.thisName) {
            currentState.thisName = convertedLoopState.thisName;
          }
          if (convertedLoopState.hoistedLocalVariables) {
            currentState.hoistedLocalVariables = convertedLoopState.hoistedLocalVariables;
          }
        }
        return currentState;
      }
      function addExtraDeclarationsForConvertedLoop(statements, state, outerState) {
        var extraVariableDeclarations;
        if (state.argumentsName) {
          if (outerState) {
            outerState.argumentsName = state.argumentsName;
          } else {
            (extraVariableDeclarations || (extraVariableDeclarations = [])).push(factory.createVariableDeclaration(state.argumentsName, void 0, void 0, factory.createIdentifier("arguments")));
          }
        }
        if (state.thisName) {
          if (outerState) {
            outerState.thisName = state.thisName;
          } else {
            (extraVariableDeclarations || (extraVariableDeclarations = [])).push(factory.createVariableDeclaration(state.thisName, void 0, void 0, factory.createIdentifier("this")));
          }
        }
        if (state.hoistedLocalVariables) {
          if (outerState) {
            outerState.hoistedLocalVariables = state.hoistedLocalVariables;
          } else {
            if (!extraVariableDeclarations) {
              extraVariableDeclarations = [];
            }
            for (var _i = 0, _a = state.hoistedLocalVariables; _i < _a.length; _i++) {
              var identifier = _a[_i];
              extraVariableDeclarations.push(factory.createVariableDeclaration(identifier));
            }
          }
        }
        if (state.loopOutParameters.length) {
          if (!extraVariableDeclarations) {
            extraVariableDeclarations = [];
          }
          for (var _b = 0, _c = state.loopOutParameters; _b < _c.length; _b++) {
            var outParam = _c[_b];
            extraVariableDeclarations.push(factory.createVariableDeclaration(outParam.outParamName));
          }
        }
        if (state.conditionVariable) {
          if (!extraVariableDeclarations) {
            extraVariableDeclarations = [];
          }
          extraVariableDeclarations.push(factory.createVariableDeclaration(state.conditionVariable, void 0, void 0, factory.createFalse()));
        }
        if (extraVariableDeclarations) {
          statements.push(factory.createVariableStatement(void 0, factory.createVariableDeclarationList(extraVariableDeclarations)));
        }
      }
      function createOutVariable(p) {
        return factory.createVariableDeclaration(p.originalName, void 0, void 0, p.outParamName);
      }
      function createFunctionForInitializerOfForStatement(node, currentState) {
        var functionName = factory.createUniqueName("_loop_init");
        var containsYield = (node.initializer.transformFlags & 524288) !== 0;
        var emitFlags = 0;
        if (currentState.containsLexicalThis)
          emitFlags |= 8;
        if (containsYield && hierarchyFacts & 4)
          emitFlags |= 262144;
        var statements = [];
        statements.push(factory.createVariableStatement(void 0, node.initializer));
        copyOutParameters(currentState.loopOutParameters, 2, 1, statements);
        var functionDeclaration = factory.createVariableStatement(void 0, ts2.setEmitFlags(factory.createVariableDeclarationList([
          factory.createVariableDeclaration(functionName, void 0, void 0, ts2.setEmitFlags(factory.createFunctionExpression(void 0, containsYield ? factory.createToken(41) : void 0, void 0, void 0, void 0, void 0, ts2.visitNode(factory.createBlock(statements, true), visitor, ts2.isBlock)), emitFlags))
        ]), 2097152));
        var part = factory.createVariableDeclarationList(ts2.map(currentState.loopOutParameters, createOutVariable));
        return { functionName, containsYield, functionDeclaration, part };
      }
      function createFunctionForBodyOfIterationStatement(node, currentState, outerState) {
        var functionName = factory.createUniqueName("_loop");
        startLexicalEnvironment();
        var statement = ts2.visitNode(node.statement, visitor, ts2.isStatement, factory.liftToBlock);
        var lexicalEnvironment = endLexicalEnvironment();
        var statements = [];
        if (shouldConvertConditionOfForStatement(node) || shouldConvertIncrementorOfForStatement(node)) {
          currentState.conditionVariable = factory.createUniqueName("inc");
          if (node.incrementor) {
            statements.push(factory.createIfStatement(currentState.conditionVariable, factory.createExpressionStatement(ts2.visitNode(node.incrementor, visitor, ts2.isExpression)), factory.createExpressionStatement(factory.createAssignment(currentState.conditionVariable, factory.createTrue()))));
          } else {
            statements.push(factory.createIfStatement(factory.createLogicalNot(currentState.conditionVariable), factory.createExpressionStatement(factory.createAssignment(currentState.conditionVariable, factory.createTrue()))));
          }
          if (shouldConvertConditionOfForStatement(node)) {
            statements.push(factory.createIfStatement(factory.createPrefixUnaryExpression(53, ts2.visitNode(node.condition, visitor, ts2.isExpression)), ts2.visitNode(factory.createBreakStatement(), visitor, ts2.isStatement)));
          }
        }
        if (ts2.isBlock(statement)) {
          ts2.addRange(statements, statement.statements);
        } else {
          statements.push(statement);
        }
        copyOutParameters(currentState.loopOutParameters, 1, 1, statements);
        ts2.insertStatementsAfterStandardPrologue(statements, lexicalEnvironment);
        var loopBody = factory.createBlock(statements, true);
        if (ts2.isBlock(statement))
          ts2.setOriginalNode(loopBody, statement);
        var containsYield = (node.statement.transformFlags & 524288) !== 0;
        var emitFlags = 524288;
        if (currentState.containsLexicalThis)
          emitFlags |= 8;
        if (containsYield && (hierarchyFacts & 4) !== 0)
          emitFlags |= 262144;
        var functionDeclaration = factory.createVariableStatement(void 0, ts2.setEmitFlags(factory.createVariableDeclarationList([
          factory.createVariableDeclaration(functionName, void 0, void 0, ts2.setEmitFlags(factory.createFunctionExpression(void 0, containsYield ? factory.createToken(41) : void 0, void 0, void 0, currentState.loopParameters, void 0, loopBody), emitFlags))
        ]), 2097152));
        var part = generateCallToConvertedLoop(functionName, currentState, outerState, containsYield);
        return { functionName, containsYield, functionDeclaration, part };
      }
      function copyOutParameter(outParam, copyDirection) {
        var source = copyDirection === 0 ? outParam.outParamName : outParam.originalName;
        var target = copyDirection === 0 ? outParam.originalName : outParam.outParamName;
        return factory.createBinaryExpression(target, 63, source);
      }
      function copyOutParameters(outParams, partFlags, copyDirection, statements) {
        for (var _i = 0, outParams_1 = outParams; _i < outParams_1.length; _i++) {
          var outParam = outParams_1[_i];
          if (outParam.flags & partFlags) {
            statements.push(factory.createExpressionStatement(copyOutParameter(outParam, copyDirection)));
          }
        }
      }
      function generateCallToConvertedLoopInitializer(initFunctionExpressionName, containsYield) {
        var call = factory.createCallExpression(initFunctionExpressionName, void 0, []);
        var callResult = containsYield ? factory.createYieldExpression(factory.createToken(41), ts2.setEmitFlags(call, 8388608)) : call;
        return factory.createExpressionStatement(callResult);
      }
      function generateCallToConvertedLoop(loopFunctionExpressionName, state, outerState, containsYield) {
        var statements = [];
        var isSimpleLoop = !(state.nonLocalJumps & ~4) && !state.labeledNonLocalBreaks && !state.labeledNonLocalContinues;
        var call = factory.createCallExpression(loopFunctionExpressionName, void 0, ts2.map(state.loopParameters, function(p) {
          return p.name;
        }));
        var callResult = containsYield ? factory.createYieldExpression(factory.createToken(41), ts2.setEmitFlags(call, 8388608)) : call;
        if (isSimpleLoop) {
          statements.push(factory.createExpressionStatement(callResult));
          copyOutParameters(state.loopOutParameters, 1, 0, statements);
        } else {
          var loopResultName = factory.createUniqueName("state");
          var stateVariable = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([factory.createVariableDeclaration(loopResultName, void 0, void 0, callResult)]));
          statements.push(stateVariable);
          copyOutParameters(state.loopOutParameters, 1, 0, statements);
          if (state.nonLocalJumps & 8) {
            var returnStatement = void 0;
            if (outerState) {
              outerState.nonLocalJumps |= 8;
              returnStatement = factory.createReturnStatement(loopResultName);
            } else {
              returnStatement = factory.createReturnStatement(factory.createPropertyAccessExpression(loopResultName, "value"));
            }
            statements.push(factory.createIfStatement(factory.createTypeCheck(loopResultName, "object"), returnStatement));
          }
          if (state.nonLocalJumps & 2) {
            statements.push(factory.createIfStatement(factory.createStrictEquality(loopResultName, factory.createStringLiteral("break")), factory.createBreakStatement()));
          }
          if (state.labeledNonLocalBreaks || state.labeledNonLocalContinues) {
            var caseClauses = [];
            processLabeledJumps(state.labeledNonLocalBreaks, true, loopResultName, outerState, caseClauses);
            processLabeledJumps(state.labeledNonLocalContinues, false, loopResultName, outerState, caseClauses);
            statements.push(factory.createSwitchStatement(loopResultName, factory.createCaseBlock(caseClauses)));
          }
        }
        return statements;
      }
      function setLabeledJump(state, isBreak, labelText, labelMarker) {
        if (isBreak) {
          if (!state.labeledNonLocalBreaks) {
            state.labeledNonLocalBreaks = new ts2.Map();
          }
          state.labeledNonLocalBreaks.set(labelText, labelMarker);
        } else {
          if (!state.labeledNonLocalContinues) {
            state.labeledNonLocalContinues = new ts2.Map();
          }
          state.labeledNonLocalContinues.set(labelText, labelMarker);
        }
      }
      function processLabeledJumps(table, isBreak, loopResultName, outerLoop, caseClauses) {
        if (!table) {
          return;
        }
        table.forEach(function(labelMarker, labelText) {
          var statements = [];
          if (!outerLoop || outerLoop.labels && outerLoop.labels.get(labelText)) {
            var label = factory.createIdentifier(labelText);
            statements.push(isBreak ? factory.createBreakStatement(label) : factory.createContinueStatement(label));
          } else {
            setLabeledJump(outerLoop, isBreak, labelText, labelMarker);
            statements.push(factory.createReturnStatement(loopResultName));
          }
          caseClauses.push(factory.createCaseClause(factory.createStringLiteral(labelMarker), statements));
        });
      }
      function processLoopVariableDeclaration(container, decl, loopParameters, loopOutParameters, hasCapturedBindingsInForInitializer) {
        var name = decl.name;
        if (ts2.isBindingPattern(name)) {
          for (var _i = 0, _a = name.elements; _i < _a.length; _i++) {
            var element = _a[_i];
            if (!ts2.isOmittedExpression(element)) {
              processLoopVariableDeclaration(container, element, loopParameters, loopOutParameters, hasCapturedBindingsInForInitializer);
            }
          }
        } else {
          loopParameters.push(factory.createParameterDeclaration(void 0, void 0, void 0, name));
          var checkFlags = resolver.getNodeCheckFlags(decl);
          if (checkFlags & 4194304 || hasCapturedBindingsInForInitializer) {
            var outParamName = factory.createUniqueName("out_" + ts2.idText(name));
            var flags = 0;
            if (checkFlags & 4194304) {
              flags |= 1;
            }
            if (ts2.isForStatement(container) && container.initializer && resolver.isBindingCapturedByNode(container.initializer, decl)) {
              flags |= 2;
            }
            loopOutParameters.push({ flags, originalName: name, outParamName });
          }
        }
      }
      function addObjectLiteralMembers(expressions, node, receiver, start) {
        var properties = node.properties;
        var numProperties = properties.length;
        for (var i = start; i < numProperties; i++) {
          var property = properties[i];
          switch (property.kind) {
            case 171:
            case 172:
              var accessors = ts2.getAllAccessorDeclarations(node.properties, property);
              if (property === accessors.firstAccessor) {
                expressions.push(transformAccessorsToExpression(receiver, accessors, node, !!node.multiLine));
              }
              break;
            case 168:
              expressions.push(transformObjectLiteralMethodDeclarationToExpression(property, receiver, node, node.multiLine));
              break;
            case 294:
              expressions.push(transformPropertyAssignmentToExpression(property, receiver, node.multiLine));
              break;
            case 295:
              expressions.push(transformShorthandPropertyAssignmentToExpression(property, receiver, node.multiLine));
              break;
            default:
              ts2.Debug.failBadSyntaxKind(node);
              break;
          }
        }
      }
      function transformPropertyAssignmentToExpression(property, receiver, startsOnNewLine) {
        var expression = factory.createAssignment(ts2.createMemberAccessForPropertyName(factory, receiver, ts2.visitNode(property.name, visitor, ts2.isPropertyName)), ts2.visitNode(property.initializer, visitor, ts2.isExpression));
        ts2.setTextRange(expression, property);
        if (startsOnNewLine) {
          ts2.startOnNewLine(expression);
        }
        return expression;
      }
      function transformShorthandPropertyAssignmentToExpression(property, receiver, startsOnNewLine) {
        var expression = factory.createAssignment(ts2.createMemberAccessForPropertyName(factory, receiver, ts2.visitNode(property.name, visitor, ts2.isPropertyName)), factory.cloneNode(property.name));
        ts2.setTextRange(expression, property);
        if (startsOnNewLine) {
          ts2.startOnNewLine(expression);
        }
        return expression;
      }
      function transformObjectLiteralMethodDeclarationToExpression(method, receiver, container, startsOnNewLine) {
        var expression = factory.createAssignment(ts2.createMemberAccessForPropertyName(factory, receiver, ts2.visitNode(method.name, visitor, ts2.isPropertyName)), transformFunctionLikeToExpression(method, method, void 0, container));
        ts2.setTextRange(expression, method);
        if (startsOnNewLine) {
          ts2.startOnNewLine(expression);
        }
        return expression;
      }
      function visitCatchClause(node) {
        var ancestorFacts = enterSubtree(7104, 0);
        var updated;
        ts2.Debug.assert(!!node.variableDeclaration, "Catch clause variable should always be present when downleveling ES2015.");
        if (ts2.isBindingPattern(node.variableDeclaration.name)) {
          var temp = factory.createTempVariable(void 0);
          var newVariableDeclaration = factory.createVariableDeclaration(temp);
          ts2.setTextRange(newVariableDeclaration, node.variableDeclaration);
          var vars = ts2.flattenDestructuringBinding(node.variableDeclaration, visitor, context, 0, temp);
          var list = factory.createVariableDeclarationList(vars);
          ts2.setTextRange(list, node.variableDeclaration);
          var destructure = factory.createVariableStatement(void 0, list);
          updated = factory.updateCatchClause(node, newVariableDeclaration, addStatementToStartOfBlock(node.block, destructure));
        } else {
          updated = ts2.visitEachChild(node, visitor, context);
        }
        exitSubtree(ancestorFacts, 0, 0);
        return updated;
      }
      function addStatementToStartOfBlock(block, statement) {
        var transformedStatements = ts2.visitNodes(block.statements, visitor, ts2.isStatement);
        return factory.updateBlock(block, __spreadArray([statement], transformedStatements, true));
      }
      function visitMethodDeclaration(node) {
        ts2.Debug.assert(!ts2.isComputedPropertyName(node.name));
        var functionExpression = transformFunctionLikeToExpression(node, ts2.moveRangePos(node, -1), void 0, void 0);
        ts2.setEmitFlags(functionExpression, 512 | ts2.getEmitFlags(functionExpression));
        return ts2.setTextRange(factory.createPropertyAssignment(node.name, functionExpression), node);
      }
      function visitAccessorDeclaration(node) {
        ts2.Debug.assert(!ts2.isComputedPropertyName(node.name));
        var savedConvertedLoopState = convertedLoopState;
        convertedLoopState = void 0;
        var ancestorFacts = enterSubtree(32670, 65);
        var updated;
        var parameters = ts2.visitParameterList(node.parameters, visitor, context);
        var body = transformFunctionBody(node);
        if (node.kind === 171) {
          updated = factory.updateGetAccessorDeclaration(node, node.decorators, node.modifiers, node.name, parameters, node.type, body);
        } else {
          updated = factory.updateSetAccessorDeclaration(node, node.decorators, node.modifiers, node.name, parameters, body);
        }
        exitSubtree(ancestorFacts, 98304, 0);
        convertedLoopState = savedConvertedLoopState;
        return updated;
      }
      function visitShorthandPropertyAssignment(node) {
        return ts2.setTextRange(factory.createPropertyAssignment(node.name, visitIdentifier(factory.cloneNode(node.name))), node);
      }
      function visitComputedPropertyName(node) {
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitYieldExpression(node) {
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitArrayLiteralExpression(node) {
        if (ts2.some(node.elements, ts2.isSpreadElement)) {
          return transformAndSpreadElements(node.elements, false, !!node.multiLine, !!node.elements.hasTrailingComma);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitCallExpression(node) {
        if (ts2.getEmitFlags(node) & 33554432) {
          return visitTypeScriptClassWrapper(node);
        }
        var expression = ts2.skipOuterExpressions(node.expression);
        if (expression.kind === 106 || ts2.isSuperProperty(expression) || ts2.some(node.arguments, ts2.isSpreadElement)) {
          return visitCallExpressionWithPotentialCapturedThisAssignment(node, true);
        }
        return factory.updateCallExpression(node, ts2.visitNode(node.expression, callExpressionVisitor, ts2.isExpression), void 0, ts2.visitNodes(node.arguments, visitor, ts2.isExpression));
      }
      function visitTypeScriptClassWrapper(node) {
        var body = ts2.cast(ts2.cast(ts2.skipOuterExpressions(node.expression), ts2.isArrowFunction).body, ts2.isBlock);
        var isVariableStatementWithInitializer = function(stmt) {
          return ts2.isVariableStatement(stmt) && !!ts2.first(stmt.declarationList.declarations).initializer;
        };
        var savedConvertedLoopState = convertedLoopState;
        convertedLoopState = void 0;
        var bodyStatements = ts2.visitNodes(body.statements, classWrapperStatementVisitor, ts2.isStatement);
        convertedLoopState = savedConvertedLoopState;
        var classStatements = ts2.filter(bodyStatements, isVariableStatementWithInitializer);
        var remainingStatements = ts2.filter(bodyStatements, function(stmt) {
          return !isVariableStatementWithInitializer(stmt);
        });
        var varStatement = ts2.cast(ts2.first(classStatements), ts2.isVariableStatement);
        var variable = varStatement.declarationList.declarations[0];
        var initializer = ts2.skipOuterExpressions(variable.initializer);
        var aliasAssignment = ts2.tryCast(initializer, ts2.isAssignmentExpression);
        if (!aliasAssignment && ts2.isBinaryExpression(initializer) && initializer.operatorToken.kind === 27) {
          aliasAssignment = ts2.tryCast(initializer.left, ts2.isAssignmentExpression);
        }
        var call = ts2.cast(aliasAssignment ? ts2.skipOuterExpressions(aliasAssignment.right) : initializer, ts2.isCallExpression);
        var func = ts2.cast(ts2.skipOuterExpressions(call.expression), ts2.isFunctionExpression);
        var funcStatements = func.body.statements;
        var classBodyStart = 0;
        var classBodyEnd = -1;
        var statements = [];
        if (aliasAssignment) {
          var extendsCall = ts2.tryCast(funcStatements[classBodyStart], ts2.isExpressionStatement);
          if (extendsCall) {
            statements.push(extendsCall);
            classBodyStart++;
          }
          statements.push(funcStatements[classBodyStart]);
          classBodyStart++;
          statements.push(factory.createExpressionStatement(factory.createAssignment(aliasAssignment.left, ts2.cast(variable.name, ts2.isIdentifier))));
        }
        while (!ts2.isReturnStatement(ts2.elementAt(funcStatements, classBodyEnd))) {
          classBodyEnd--;
        }
        ts2.addRange(statements, funcStatements, classBodyStart, classBodyEnd);
        if (classBodyEnd < -1) {
          ts2.addRange(statements, funcStatements, classBodyEnd + 1);
        }
        ts2.addRange(statements, remainingStatements);
        ts2.addRange(statements, classStatements, 1);
        return factory.restoreOuterExpressions(node.expression, factory.restoreOuterExpressions(variable.initializer, factory.restoreOuterExpressions(aliasAssignment && aliasAssignment.right, factory.updateCallExpression(call, factory.restoreOuterExpressions(call.expression, factory.updateFunctionExpression(func, void 0, void 0, void 0, void 0, func.parameters, void 0, factory.updateBlock(func.body, statements))), void 0, call.arguments))));
      }
      function visitImmediateSuperCallInBody(node) {
        return visitCallExpressionWithPotentialCapturedThisAssignment(node, false);
      }
      function visitCallExpressionWithPotentialCapturedThisAssignment(node, assignToCapturedThis) {
        if (node.transformFlags & 16384 || node.expression.kind === 106 || ts2.isSuperProperty(ts2.skipOuterExpressions(node.expression))) {
          var _a = factory.createCallBinding(node.expression, hoistVariableDeclaration), target = _a.target, thisArg = _a.thisArg;
          if (node.expression.kind === 106) {
            ts2.setEmitFlags(thisArg, 4);
          }
          var resultingCall = void 0;
          if (node.transformFlags & 16384) {
            resultingCall = factory.createFunctionApplyCall(ts2.visitNode(target, callExpressionVisitor, ts2.isExpression), node.expression.kind === 106 ? thisArg : ts2.visitNode(thisArg, visitor, ts2.isExpression), transformAndSpreadElements(node.arguments, true, false, false));
          } else {
            resultingCall = ts2.setTextRange(factory.createFunctionCallCall(ts2.visitNode(target, callExpressionVisitor, ts2.isExpression), node.expression.kind === 106 ? thisArg : ts2.visitNode(thisArg, visitor, ts2.isExpression), ts2.visitNodes(node.arguments, visitor, ts2.isExpression)), node);
          }
          if (node.expression.kind === 106) {
            var initializer = factory.createLogicalOr(resultingCall, createActualThis());
            resultingCall = assignToCapturedThis ? factory.createAssignment(factory.createUniqueName("_this", 16 | 32), initializer) : initializer;
          }
          return ts2.setOriginalNode(resultingCall, node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitNewExpression(node) {
        if (ts2.some(node.arguments, ts2.isSpreadElement)) {
          var _a = factory.createCallBinding(factory.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration), target = _a.target, thisArg = _a.thisArg;
          return factory.createNewExpression(factory.createFunctionApplyCall(ts2.visitNode(target, visitor, ts2.isExpression), thisArg, transformAndSpreadElements(factory.createNodeArray(__spreadArray([factory.createVoidZero()], node.arguments, true)), true, false, false)), void 0, []);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function transformAndSpreadElements(elements, isArgumentList, multiLine, hasTrailingComma) {
        var numElements = elements.length;
        var segments = ts2.flatten(ts2.spanMap(elements, partitionSpread, function(partition, visitPartition, _start, end) {
          return visitPartition(partition, multiLine, hasTrailingComma && end === numElements);
        }));
        if (segments.length === 1) {
          var firstSegment = segments[0];
          if (isArgumentList && !compilerOptions.downlevelIteration || ts2.isPackedArrayLiteral(firstSegment.expression) || ts2.isCallToHelper(firstSegment.expression, "___spreadArray")) {
            return firstSegment.expression;
          }
        }
        var helpers = emitHelpers();
        var startsWithSpread = segments[0].kind !== 0;
        var expression = startsWithSpread ? factory.createArrayLiteralExpression() : segments[0].expression;
        for (var i = startsWithSpread ? 0 : 1; i < segments.length; i++) {
          var segment = segments[i];
          expression = helpers.createSpreadArrayHelper(expression, segment.expression, segment.kind === 1 && !isArgumentList);
        }
        return expression;
      }
      function partitionSpread(node) {
        return ts2.isSpreadElement(node) ? visitSpanOfSpreads : visitSpanOfNonSpreads;
      }
      function visitSpanOfSpreads(chunk) {
        return ts2.map(chunk, visitExpressionOfSpread);
      }
      function visitExpressionOfSpread(node) {
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        var isCallToReadHelper = ts2.isCallToHelper(expression, "___read");
        var kind = isCallToReadHelper || ts2.isPackedArrayLiteral(expression) ? 2 : 1;
        if (compilerOptions.downlevelIteration && kind === 1 && !ts2.isArrayLiteralExpression(expression) && !isCallToReadHelper) {
          expression = emitHelpers().createReadHelper(expression, void 0);
          kind = 2;
        }
        return createSpreadSegment(kind, expression);
      }
      function visitSpanOfNonSpreads(chunk, multiLine, hasTrailingComma) {
        var expression = factory.createArrayLiteralExpression(ts2.visitNodes(factory.createNodeArray(chunk, hasTrailingComma), visitor, ts2.isExpression), multiLine);
        return createSpreadSegment(0, expression);
      }
      function visitSpreadElement(node) {
        return ts2.visitNode(node.expression, visitor, ts2.isExpression);
      }
      function visitTemplateLiteral(node) {
        return ts2.setTextRange(factory.createStringLiteral(node.text), node);
      }
      function visitStringLiteral(node) {
        if (node.hasExtendedUnicodeEscape) {
          return ts2.setTextRange(factory.createStringLiteral(node.text), node);
        }
        return node;
      }
      function visitNumericLiteral(node) {
        if (node.numericLiteralFlags & 384) {
          return ts2.setTextRange(factory.createNumericLiteral(node.text), node);
        }
        return node;
      }
      function visitTaggedTemplateExpression(node) {
        return ts2.processTaggedTemplateExpression(context, node, visitor, currentSourceFile, recordTaggedTemplateString, ts2.ProcessLevel.All);
      }
      function visitTemplateExpression(node) {
        var expression = factory.createStringLiteral(node.head.text);
        for (var _i = 0, _a = node.templateSpans; _i < _a.length; _i++) {
          var span = _a[_i];
          var args = [ts2.visitNode(span.expression, visitor, ts2.isExpression)];
          if (span.literal.text.length > 0) {
            args.push(factory.createStringLiteral(span.literal.text));
          }
          expression = factory.createCallExpression(factory.createPropertyAccessExpression(expression, "concat"), void 0, args);
        }
        return ts2.setTextRange(expression, node);
      }
      function visitSuperKeyword(isExpressionOfCall) {
        return hierarchyFacts & 8 && !isExpressionOfCall ? factory.createPropertyAccessExpression(factory.createUniqueName("_super", 16 | 32), "prototype") : factory.createUniqueName("_super", 16 | 32);
      }
      function visitMetaProperty(node) {
        if (node.keywordToken === 103 && node.name.escapedText === "target") {
          hierarchyFacts |= 32768;
          return factory.createUniqueName("_newTarget", 16 | 32);
        }
        return node;
      }
      function onEmitNode(hint, node, emitCallback) {
        if (enabledSubstitutions & 1 && ts2.isFunctionLike(node)) {
          var ancestorFacts = enterSubtree(32670, ts2.getEmitFlags(node) & 8 ? 65 | 16 : 65);
          previousOnEmitNode(hint, node, emitCallback);
          exitSubtree(ancestorFacts, 0, 0);
          return;
        }
        previousOnEmitNode(hint, node, emitCallback);
      }
      function enableSubstitutionsForBlockScopedBindings() {
        if ((enabledSubstitutions & 2) === 0) {
          enabledSubstitutions |= 2;
          context.enableSubstitution(79);
        }
      }
      function enableSubstitutionsForCapturedThis() {
        if ((enabledSubstitutions & 1) === 0) {
          enabledSubstitutions |= 1;
          context.enableSubstitution(108);
          context.enableEmitNotification(170);
          context.enableEmitNotification(168);
          context.enableEmitNotification(171);
          context.enableEmitNotification(172);
          context.enableEmitNotification(213);
          context.enableEmitNotification(212);
          context.enableEmitNotification(255);
        }
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (hint === 1) {
          return substituteExpression(node);
        }
        if (ts2.isIdentifier(node)) {
          return substituteIdentifier(node);
        }
        return node;
      }
      function substituteIdentifier(node) {
        if (enabledSubstitutions & 2 && !ts2.isInternalName(node)) {
          var original = ts2.getParseTreeNode(node, ts2.isIdentifier);
          if (original && isNameOfDeclarationWithCollidingName(original)) {
            return ts2.setTextRange(factory.getGeneratedNameForNode(original), node);
          }
        }
        return node;
      }
      function isNameOfDeclarationWithCollidingName(node) {
        switch (node.parent.kind) {
          case 202:
          case 256:
          case 259:
          case 253:
            return node.parent.name === node && resolver.isDeclarationWithCollidingName(node.parent);
        }
        return false;
      }
      function substituteExpression(node) {
        switch (node.kind) {
          case 79:
            return substituteExpressionIdentifier(node);
          case 108:
            return substituteThisKeyword(node);
        }
        return node;
      }
      function substituteExpressionIdentifier(node) {
        if (enabledSubstitutions & 2 && !ts2.isInternalName(node)) {
          var declaration = resolver.getReferencedDeclarationWithCollidingName(node);
          if (declaration && !(ts2.isClassLike(declaration) && isPartOfClassBody(declaration, node))) {
            return ts2.setTextRange(factory.getGeneratedNameForNode(ts2.getNameOfDeclaration(declaration)), node);
          }
        }
        return node;
      }
      function isPartOfClassBody(declaration, node) {
        var currentNode = ts2.getParseTreeNode(node);
        if (!currentNode || currentNode === declaration || currentNode.end <= declaration.pos || currentNode.pos >= declaration.end) {
          return false;
        }
        var blockScope = ts2.getEnclosingBlockScopeContainer(declaration);
        while (currentNode) {
          if (currentNode === blockScope || currentNode === declaration) {
            return false;
          }
          if (ts2.isClassElement(currentNode) && currentNode.parent === declaration) {
            return true;
          }
          currentNode = currentNode.parent;
        }
        return false;
      }
      function substituteThisKeyword(node) {
        if (enabledSubstitutions & 1 && hierarchyFacts & 16) {
          return ts2.setTextRange(factory.createUniqueName("_this", 16 | 32), node);
        }
        return node;
      }
      function getClassMemberPrefix(node, member) {
        return ts2.isStatic(member) ? factory.getInternalName(node) : factory.createPropertyAccessExpression(factory.getInternalName(node), "prototype");
      }
      function hasSynthesizedDefaultSuperCall(constructor, hasExtendsClause) {
        if (!constructor || !hasExtendsClause) {
          return false;
        }
        if (ts2.some(constructor.parameters)) {
          return false;
        }
        var statement = ts2.firstOrUndefined(constructor.body.statements);
        if (!statement || !ts2.nodeIsSynthesized(statement) || statement.kind !== 237) {
          return false;
        }
        var statementExpression = statement.expression;
        if (!ts2.nodeIsSynthesized(statementExpression) || statementExpression.kind !== 207) {
          return false;
        }
        var callTarget = statementExpression.expression;
        if (!ts2.nodeIsSynthesized(callTarget) || callTarget.kind !== 106) {
          return false;
        }
        var callArgument = ts2.singleOrUndefined(statementExpression.arguments);
        if (!callArgument || !ts2.nodeIsSynthesized(callArgument) || callArgument.kind !== 224) {
          return false;
        }
        var expression = callArgument.expression;
        return ts2.isIdentifier(expression) && expression.escapedText === "arguments";
      }
    }
    ts2.transformES2015 = transformES2015;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformES5(context) {
      var factory = context.factory;
      var compilerOptions = context.getCompilerOptions();
      var previousOnEmitNode;
      var noSubstitution;
      if (compilerOptions.jsx === 1 || compilerOptions.jsx === 3) {
        previousOnEmitNode = context.onEmitNode;
        context.onEmitNode = onEmitNode;
        context.enableEmitNotification(279);
        context.enableEmitNotification(280);
        context.enableEmitNotification(278);
        noSubstitution = [];
      }
      var previousOnSubstituteNode = context.onSubstituteNode;
      context.onSubstituteNode = onSubstituteNode;
      context.enableSubstitution(205);
      context.enableSubstitution(294);
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        return node;
      }
      function onEmitNode(hint, node, emitCallback) {
        switch (node.kind) {
          case 279:
          case 280:
          case 278:
            var tagName = node.tagName;
            noSubstitution[ts2.getOriginalNodeId(tagName)] = true;
            break;
        }
        previousOnEmitNode(hint, node, emitCallback);
      }
      function onSubstituteNode(hint, node) {
        if (node.id && noSubstitution && noSubstitution[node.id]) {
          return previousOnSubstituteNode(hint, node);
        }
        node = previousOnSubstituteNode(hint, node);
        if (ts2.isPropertyAccessExpression(node)) {
          return substitutePropertyAccessExpression(node);
        } else if (ts2.isPropertyAssignment(node)) {
          return substitutePropertyAssignment(node);
        }
        return node;
      }
      function substitutePropertyAccessExpression(node) {
        if (ts2.isPrivateIdentifier(node.name)) {
          return node;
        }
        var literalName = trySubstituteReservedName(node.name);
        if (literalName) {
          return ts2.setTextRange(factory.createElementAccessExpression(node.expression, literalName), node);
        }
        return node;
      }
      function substitutePropertyAssignment(node) {
        var literalName = ts2.isIdentifier(node.name) && trySubstituteReservedName(node.name);
        if (literalName) {
          return factory.updatePropertyAssignment(node, literalName, node.initializer);
        }
        return node;
      }
      function trySubstituteReservedName(name) {
        var token = name.originalKeywordKind || (ts2.nodeIsSynthesized(name) ? ts2.stringToToken(ts2.idText(name)) : void 0);
        if (token !== void 0 && token >= 81 && token <= 116) {
          return ts2.setTextRange(factory.createStringLiteralFromNode(name), name);
        }
        return void 0;
      }
    }
    ts2.transformES5 = transformES5;
  })(ts || (ts = {}));
  (function(ts2) {
    var OpCode;
    (function(OpCode2) {
      OpCode2[OpCode2["Nop"] = 0] = "Nop";
      OpCode2[OpCode2["Statement"] = 1] = "Statement";
      OpCode2[OpCode2["Assign"] = 2] = "Assign";
      OpCode2[OpCode2["Break"] = 3] = "Break";
      OpCode2[OpCode2["BreakWhenTrue"] = 4] = "BreakWhenTrue";
      OpCode2[OpCode2["BreakWhenFalse"] = 5] = "BreakWhenFalse";
      OpCode2[OpCode2["Yield"] = 6] = "Yield";
      OpCode2[OpCode2["YieldStar"] = 7] = "YieldStar";
      OpCode2[OpCode2["Return"] = 8] = "Return";
      OpCode2[OpCode2["Throw"] = 9] = "Throw";
      OpCode2[OpCode2["Endfinally"] = 10] = "Endfinally";
    })(OpCode || (OpCode = {}));
    var BlockAction;
    (function(BlockAction2) {
      BlockAction2[BlockAction2["Open"] = 0] = "Open";
      BlockAction2[BlockAction2["Close"] = 1] = "Close";
    })(BlockAction || (BlockAction = {}));
    var CodeBlockKind;
    (function(CodeBlockKind2) {
      CodeBlockKind2[CodeBlockKind2["Exception"] = 0] = "Exception";
      CodeBlockKind2[CodeBlockKind2["With"] = 1] = "With";
      CodeBlockKind2[CodeBlockKind2["Switch"] = 2] = "Switch";
      CodeBlockKind2[CodeBlockKind2["Loop"] = 3] = "Loop";
      CodeBlockKind2[CodeBlockKind2["Labeled"] = 4] = "Labeled";
    })(CodeBlockKind || (CodeBlockKind = {}));
    var ExceptionBlockState;
    (function(ExceptionBlockState2) {
      ExceptionBlockState2[ExceptionBlockState2["Try"] = 0] = "Try";
      ExceptionBlockState2[ExceptionBlockState2["Catch"] = 1] = "Catch";
      ExceptionBlockState2[ExceptionBlockState2["Finally"] = 2] = "Finally";
      ExceptionBlockState2[ExceptionBlockState2["Done"] = 3] = "Done";
    })(ExceptionBlockState || (ExceptionBlockState = {}));
    var Instruction;
    (function(Instruction2) {
      Instruction2[Instruction2["Next"] = 0] = "Next";
      Instruction2[Instruction2["Throw"] = 1] = "Throw";
      Instruction2[Instruction2["Return"] = 2] = "Return";
      Instruction2[Instruction2["Break"] = 3] = "Break";
      Instruction2[Instruction2["Yield"] = 4] = "Yield";
      Instruction2[Instruction2["YieldStar"] = 5] = "YieldStar";
      Instruction2[Instruction2["Catch"] = 6] = "Catch";
      Instruction2[Instruction2["Endfinally"] = 7] = "Endfinally";
    })(Instruction || (Instruction = {}));
    function getInstructionName(instruction) {
      switch (instruction) {
        case 2:
          return "return";
        case 3:
          return "break";
        case 4:
          return "yield";
        case 5:
          return "yield*";
        case 7:
          return "endfinally";
        default:
          return void 0;
      }
    }
    function transformGenerators(context) {
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory, resumeLexicalEnvironment = context.resumeLexicalEnvironment, endLexicalEnvironment = context.endLexicalEnvironment, hoistFunctionDeclaration = context.hoistFunctionDeclaration, hoistVariableDeclaration = context.hoistVariableDeclaration;
      var compilerOptions = context.getCompilerOptions();
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var resolver = context.getEmitResolver();
      var previousOnSubstituteNode = context.onSubstituteNode;
      context.onSubstituteNode = onSubstituteNode;
      var renamedCatchVariables;
      var renamedCatchVariableDeclarations;
      var inGeneratorFunctionBody;
      var inStatementContainingYield;
      var blocks;
      var blockOffsets;
      var blockActions;
      var blockStack;
      var labelOffsets;
      var labelExpressions;
      var nextLabelId = 1;
      var operations;
      var operationArguments;
      var operationLocations;
      var state;
      var blockIndex = 0;
      var labelNumber = 0;
      var labelNumbers;
      var lastOperationWasAbrupt;
      var lastOperationWasCompletion;
      var clauses;
      var statements;
      var exceptionBlockStack;
      var currentExceptionBlock;
      var withBlockStack;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile || (node.transformFlags & 1024) === 0) {
          return node;
        }
        var visited = ts2.visitEachChild(node, visitor, context);
        ts2.addEmitHelpers(visited, context.readEmitHelpers());
        return visited;
      }
      function visitor(node) {
        var transformFlags = node.transformFlags;
        if (inStatementContainingYield) {
          return visitJavaScriptInStatementContainingYield(node);
        } else if (inGeneratorFunctionBody) {
          return visitJavaScriptInGeneratorFunctionBody(node);
        } else if (ts2.isFunctionLikeDeclaration(node) && node.asteriskToken) {
          return visitGenerator(node);
        } else if (transformFlags & 1024) {
          return ts2.visitEachChild(node, visitor, context);
        } else {
          return node;
        }
      }
      function visitJavaScriptInStatementContainingYield(node) {
        switch (node.kind) {
          case 239:
            return visitDoStatement(node);
          case 240:
            return visitWhileStatement(node);
          case 248:
            return visitSwitchStatement(node);
          case 249:
            return visitLabeledStatement(node);
          default:
            return visitJavaScriptInGeneratorFunctionBody(node);
        }
      }
      function visitJavaScriptInGeneratorFunctionBody(node) {
        switch (node.kind) {
          case 255:
            return visitFunctionDeclaration(node);
          case 212:
            return visitFunctionExpression(node);
          case 171:
          case 172:
            return visitAccessorDeclaration(node);
          case 236:
            return visitVariableStatement(node);
          case 241:
            return visitForStatement(node);
          case 242:
            return visitForInStatement(node);
          case 245:
            return visitBreakStatement(node);
          case 244:
            return visitContinueStatement(node);
          case 246:
            return visitReturnStatement(node);
          default:
            if (node.transformFlags & 524288) {
              return visitJavaScriptContainingYield(node);
            } else if (node.transformFlags & (1024 | 2097152)) {
              return ts2.visitEachChild(node, visitor, context);
            } else {
              return node;
            }
        }
      }
      function visitJavaScriptContainingYield(node) {
        switch (node.kind) {
          case 220:
            return visitBinaryExpression(node);
          case 349:
            return visitCommaListExpression(node);
          case 221:
            return visitConditionalExpression(node);
          case 223:
            return visitYieldExpression(node);
          case 203:
            return visitArrayLiteralExpression(node);
          case 204:
            return visitObjectLiteralExpression(node);
          case 206:
            return visitElementAccessExpression(node);
          case 207:
            return visitCallExpression(node);
          case 208:
            return visitNewExpression(node);
          default:
            return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitGenerator(node) {
        switch (node.kind) {
          case 255:
            return visitFunctionDeclaration(node);
          case 212:
            return visitFunctionExpression(node);
          default:
            return ts2.Debug.failBadSyntaxKind(node);
        }
      }
      function visitFunctionDeclaration(node) {
        if (node.asteriskToken) {
          node = ts2.setOriginalNode(ts2.setTextRange(factory.createFunctionDeclaration(void 0, node.modifiers, void 0, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, transformGeneratorFunctionBody(node.body)), node), node);
        } else {
          var savedInGeneratorFunctionBody = inGeneratorFunctionBody;
          var savedInStatementContainingYield = inStatementContainingYield;
          inGeneratorFunctionBody = false;
          inStatementContainingYield = false;
          node = ts2.visitEachChild(node, visitor, context);
          inGeneratorFunctionBody = savedInGeneratorFunctionBody;
          inStatementContainingYield = savedInStatementContainingYield;
        }
        if (inGeneratorFunctionBody) {
          hoistFunctionDeclaration(node);
          return void 0;
        } else {
          return node;
        }
      }
      function visitFunctionExpression(node) {
        if (node.asteriskToken) {
          node = ts2.setOriginalNode(ts2.setTextRange(factory.createFunctionExpression(void 0, void 0, node.name, void 0, ts2.visitParameterList(node.parameters, visitor, context), void 0, transformGeneratorFunctionBody(node.body)), node), node);
        } else {
          var savedInGeneratorFunctionBody = inGeneratorFunctionBody;
          var savedInStatementContainingYield = inStatementContainingYield;
          inGeneratorFunctionBody = false;
          inStatementContainingYield = false;
          node = ts2.visitEachChild(node, visitor, context);
          inGeneratorFunctionBody = savedInGeneratorFunctionBody;
          inStatementContainingYield = savedInStatementContainingYield;
        }
        return node;
      }
      function visitAccessorDeclaration(node) {
        var savedInGeneratorFunctionBody = inGeneratorFunctionBody;
        var savedInStatementContainingYield = inStatementContainingYield;
        inGeneratorFunctionBody = false;
        inStatementContainingYield = false;
        node = ts2.visitEachChild(node, visitor, context);
        inGeneratorFunctionBody = savedInGeneratorFunctionBody;
        inStatementContainingYield = savedInStatementContainingYield;
        return node;
      }
      function transformGeneratorFunctionBody(body) {
        var statements2 = [];
        var savedInGeneratorFunctionBody = inGeneratorFunctionBody;
        var savedInStatementContainingYield = inStatementContainingYield;
        var savedBlocks = blocks;
        var savedBlockOffsets = blockOffsets;
        var savedBlockActions = blockActions;
        var savedBlockStack = blockStack;
        var savedLabelOffsets = labelOffsets;
        var savedLabelExpressions = labelExpressions;
        var savedNextLabelId = nextLabelId;
        var savedOperations = operations;
        var savedOperationArguments = operationArguments;
        var savedOperationLocations = operationLocations;
        var savedState = state;
        inGeneratorFunctionBody = true;
        inStatementContainingYield = false;
        blocks = void 0;
        blockOffsets = void 0;
        blockActions = void 0;
        blockStack = void 0;
        labelOffsets = void 0;
        labelExpressions = void 0;
        nextLabelId = 1;
        operations = void 0;
        operationArguments = void 0;
        operationLocations = void 0;
        state = factory.createTempVariable(void 0);
        resumeLexicalEnvironment();
        var statementOffset = factory.copyPrologue(body.statements, statements2, false, visitor);
        transformAndEmitStatements(body.statements, statementOffset);
        var buildResult = build();
        ts2.insertStatementsAfterStandardPrologue(statements2, endLexicalEnvironment());
        statements2.push(factory.createReturnStatement(buildResult));
        inGeneratorFunctionBody = savedInGeneratorFunctionBody;
        inStatementContainingYield = savedInStatementContainingYield;
        blocks = savedBlocks;
        blockOffsets = savedBlockOffsets;
        blockActions = savedBlockActions;
        blockStack = savedBlockStack;
        labelOffsets = savedLabelOffsets;
        labelExpressions = savedLabelExpressions;
        nextLabelId = savedNextLabelId;
        operations = savedOperations;
        operationArguments = savedOperationArguments;
        operationLocations = savedOperationLocations;
        state = savedState;
        return ts2.setTextRange(factory.createBlock(statements2, body.multiLine), body);
      }
      function visitVariableStatement(node) {
        if (node.transformFlags & 524288) {
          transformAndEmitVariableDeclarationList(node.declarationList);
          return void 0;
        } else {
          if (ts2.getEmitFlags(node) & 1048576) {
            return node;
          }
          for (var _i = 0, _a = node.declarationList.declarations; _i < _a.length; _i++) {
            var variable = _a[_i];
            hoistVariableDeclaration(variable.name);
          }
          var variables = ts2.getInitializedVariables(node.declarationList);
          if (variables.length === 0) {
            return void 0;
          }
          return ts2.setSourceMapRange(factory.createExpressionStatement(factory.inlineExpressions(ts2.map(variables, transformInitializedVariable))), node);
        }
      }
      function visitBinaryExpression(node) {
        var assoc = ts2.getExpressionAssociativity(node);
        switch (assoc) {
          case 0:
            return visitLeftAssociativeBinaryExpression(node);
          case 1:
            return visitRightAssociativeBinaryExpression(node);
          default:
            return ts2.Debug.assertNever(assoc);
        }
      }
      function visitRightAssociativeBinaryExpression(node) {
        var left = node.left, right = node.right;
        if (containsYield(right)) {
          var target = void 0;
          switch (left.kind) {
            case 205:
              target = factory.updatePropertyAccessExpression(left, cacheExpression(ts2.visitNode(left.expression, visitor, ts2.isLeftHandSideExpression)), left.name);
              break;
            case 206:
              target = factory.updateElementAccessExpression(left, cacheExpression(ts2.visitNode(left.expression, visitor, ts2.isLeftHandSideExpression)), cacheExpression(ts2.visitNode(left.argumentExpression, visitor, ts2.isExpression)));
              break;
            default:
              target = ts2.visitNode(left, visitor, ts2.isExpression);
              break;
          }
          var operator = node.operatorToken.kind;
          if (ts2.isCompoundAssignment(operator)) {
            return ts2.setTextRange(factory.createAssignment(target, ts2.setTextRange(factory.createBinaryExpression(cacheExpression(target), ts2.getNonAssignmentOperatorForCompoundAssignment(operator), ts2.visitNode(right, visitor, ts2.isExpression)), node)), node);
          } else {
            return factory.updateBinaryExpression(node, target, node.operatorToken, ts2.visitNode(right, visitor, ts2.isExpression));
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitLeftAssociativeBinaryExpression(node) {
        if (containsYield(node.right)) {
          if (ts2.isLogicalOperator(node.operatorToken.kind)) {
            return visitLogicalBinaryExpression(node);
          } else if (node.operatorToken.kind === 27) {
            return visitCommaExpression(node);
          }
          return factory.updateBinaryExpression(node, cacheExpression(ts2.visitNode(node.left, visitor, ts2.isExpression)), node.operatorToken, ts2.visitNode(node.right, visitor, ts2.isExpression));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitCommaExpression(node) {
        var pendingExpressions = [];
        visit(node.left);
        visit(node.right);
        return factory.inlineExpressions(pendingExpressions);
        function visit(node2) {
          if (ts2.isBinaryExpression(node2) && node2.operatorToken.kind === 27) {
            visit(node2.left);
            visit(node2.right);
          } else {
            if (containsYield(node2) && pendingExpressions.length > 0) {
              emitWorker(1, [factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions))]);
              pendingExpressions = [];
            }
            pendingExpressions.push(ts2.visitNode(node2, visitor, ts2.isExpression));
          }
        }
      }
      function visitCommaListExpression(node) {
        var pendingExpressions = [];
        for (var _i = 0, _a = node.elements; _i < _a.length; _i++) {
          var elem = _a[_i];
          if (ts2.isBinaryExpression(elem) && elem.operatorToken.kind === 27) {
            pendingExpressions.push(visitCommaExpression(elem));
          } else {
            if (containsYield(elem) && pendingExpressions.length > 0) {
              emitWorker(1, [factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions))]);
              pendingExpressions = [];
            }
            pendingExpressions.push(ts2.visitNode(elem, visitor, ts2.isExpression));
          }
        }
        return factory.inlineExpressions(pendingExpressions);
      }
      function visitLogicalBinaryExpression(node) {
        var resultLabel = defineLabel();
        var resultLocal = declareLocal();
        emitAssignment(resultLocal, ts2.visitNode(node.left, visitor, ts2.isExpression), node.left);
        if (node.operatorToken.kind === 55) {
          emitBreakWhenFalse(resultLabel, resultLocal, node.left);
        } else {
          emitBreakWhenTrue(resultLabel, resultLocal, node.left);
        }
        emitAssignment(resultLocal, ts2.visitNode(node.right, visitor, ts2.isExpression), node.right);
        markLabel(resultLabel);
        return resultLocal;
      }
      function visitConditionalExpression(node) {
        if (containsYield(node.whenTrue) || containsYield(node.whenFalse)) {
          var whenFalseLabel = defineLabel();
          var resultLabel = defineLabel();
          var resultLocal = declareLocal();
          emitBreakWhenFalse(whenFalseLabel, ts2.visitNode(node.condition, visitor, ts2.isExpression), node.condition);
          emitAssignment(resultLocal, ts2.visitNode(node.whenTrue, visitor, ts2.isExpression), node.whenTrue);
          emitBreak(resultLabel);
          markLabel(whenFalseLabel);
          emitAssignment(resultLocal, ts2.visitNode(node.whenFalse, visitor, ts2.isExpression), node.whenFalse);
          markLabel(resultLabel);
          return resultLocal;
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitYieldExpression(node) {
        var resumeLabel = defineLabel();
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        if (node.asteriskToken) {
          var iterator = (ts2.getEmitFlags(node.expression) & 8388608) === 0 ? ts2.setTextRange(emitHelpers().createValuesHelper(expression), node) : expression;
          emitYieldStar(iterator, node);
        } else {
          emitYield(expression, node);
        }
        markLabel(resumeLabel);
        return createGeneratorResume(node);
      }
      function visitArrayLiteralExpression(node) {
        return visitElements(node.elements, void 0, void 0, node.multiLine);
      }
      function visitElements(elements, leadingElement, location, multiLine) {
        var numInitialElements = countInitialNodesWithoutYield(elements);
        var temp;
        if (numInitialElements > 0) {
          temp = declareLocal();
          var initialElements = ts2.visitNodes(elements, visitor, ts2.isExpression, 0, numInitialElements);
          emitAssignment(temp, factory.createArrayLiteralExpression(leadingElement ? __spreadArray([leadingElement], initialElements, true) : initialElements));
          leadingElement = void 0;
        }
        var expressions = ts2.reduceLeft(elements, reduceElement, [], numInitialElements);
        return temp ? factory.createArrayConcatCall(temp, [factory.createArrayLiteralExpression(expressions, multiLine)]) : ts2.setTextRange(factory.createArrayLiteralExpression(leadingElement ? __spreadArray([leadingElement], expressions, true) : expressions, multiLine), location);
        function reduceElement(expressions2, element) {
          if (containsYield(element) && expressions2.length > 0) {
            var hasAssignedTemp = temp !== void 0;
            if (!temp) {
              temp = declareLocal();
            }
            emitAssignment(temp, hasAssignedTemp ? factory.createArrayConcatCall(temp, [factory.createArrayLiteralExpression(expressions2, multiLine)]) : factory.createArrayLiteralExpression(leadingElement ? __spreadArray([leadingElement], expressions2, true) : expressions2, multiLine));
            leadingElement = void 0;
            expressions2 = [];
          }
          expressions2.push(ts2.visitNode(element, visitor, ts2.isExpression));
          return expressions2;
        }
      }
      function visitObjectLiteralExpression(node) {
        var properties = node.properties;
        var multiLine = node.multiLine;
        var numInitialProperties = countInitialNodesWithoutYield(properties);
        var temp = declareLocal();
        emitAssignment(temp, factory.createObjectLiteralExpression(ts2.visitNodes(properties, visitor, ts2.isObjectLiteralElementLike, 0, numInitialProperties), multiLine));
        var expressions = ts2.reduceLeft(properties, reduceProperty, [], numInitialProperties);
        expressions.push(multiLine ? ts2.startOnNewLine(ts2.setParent(ts2.setTextRange(factory.cloneNode(temp), temp), temp.parent)) : temp);
        return factory.inlineExpressions(expressions);
        function reduceProperty(expressions2, property) {
          if (containsYield(property) && expressions2.length > 0) {
            emitStatement(factory.createExpressionStatement(factory.inlineExpressions(expressions2)));
            expressions2 = [];
          }
          var expression = ts2.createExpressionForObjectLiteralElementLike(factory, node, property, temp);
          var visited = ts2.visitNode(expression, visitor, ts2.isExpression);
          if (visited) {
            if (multiLine) {
              ts2.startOnNewLine(visited);
            }
            expressions2.push(visited);
          }
          return expressions2;
        }
      }
      function visitElementAccessExpression(node) {
        if (containsYield(node.argumentExpression)) {
          return factory.updateElementAccessExpression(node, cacheExpression(ts2.visitNode(node.expression, visitor, ts2.isLeftHandSideExpression)), ts2.visitNode(node.argumentExpression, visitor, ts2.isExpression));
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitCallExpression(node) {
        if (!ts2.isImportCall(node) && ts2.forEach(node.arguments, containsYield)) {
          var _a = factory.createCallBinding(node.expression, hoistVariableDeclaration, languageVersion, true), target = _a.target, thisArg = _a.thisArg;
          return ts2.setOriginalNode(ts2.setTextRange(factory.createFunctionApplyCall(cacheExpression(ts2.visitNode(target, visitor, ts2.isLeftHandSideExpression)), thisArg, visitElements(node.arguments)), node), node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitNewExpression(node) {
        if (ts2.forEach(node.arguments, containsYield)) {
          var _a = factory.createCallBinding(factory.createPropertyAccessExpression(node.expression, "bind"), hoistVariableDeclaration), target = _a.target, thisArg = _a.thisArg;
          return ts2.setOriginalNode(ts2.setTextRange(factory.createNewExpression(factory.createFunctionApplyCall(cacheExpression(ts2.visitNode(target, visitor, ts2.isExpression)), thisArg, visitElements(node.arguments, factory.createVoidZero())), void 0, []), node), node);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function transformAndEmitStatements(statements2, start) {
        if (start === void 0) {
          start = 0;
        }
        var numStatements = statements2.length;
        for (var i = start; i < numStatements; i++) {
          transformAndEmitStatement(statements2[i]);
        }
      }
      function transformAndEmitEmbeddedStatement(node) {
        if (ts2.isBlock(node)) {
          transformAndEmitStatements(node.statements);
        } else {
          transformAndEmitStatement(node);
        }
      }
      function transformAndEmitStatement(node) {
        var savedInStatementContainingYield = inStatementContainingYield;
        if (!inStatementContainingYield) {
          inStatementContainingYield = containsYield(node);
        }
        transformAndEmitStatementWorker(node);
        inStatementContainingYield = savedInStatementContainingYield;
      }
      function transformAndEmitStatementWorker(node) {
        switch (node.kind) {
          case 234:
            return transformAndEmitBlock(node);
          case 237:
            return transformAndEmitExpressionStatement(node);
          case 238:
            return transformAndEmitIfStatement(node);
          case 239:
            return transformAndEmitDoStatement(node);
          case 240:
            return transformAndEmitWhileStatement(node);
          case 241:
            return transformAndEmitForStatement(node);
          case 242:
            return transformAndEmitForInStatement(node);
          case 244:
            return transformAndEmitContinueStatement(node);
          case 245:
            return transformAndEmitBreakStatement(node);
          case 246:
            return transformAndEmitReturnStatement(node);
          case 247:
            return transformAndEmitWithStatement(node);
          case 248:
            return transformAndEmitSwitchStatement(node);
          case 249:
            return transformAndEmitLabeledStatement(node);
          case 250:
            return transformAndEmitThrowStatement(node);
          case 251:
            return transformAndEmitTryStatement(node);
          default:
            return emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function transformAndEmitBlock(node) {
        if (containsYield(node)) {
          transformAndEmitStatements(node.statements);
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function transformAndEmitExpressionStatement(node) {
        emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
      }
      function transformAndEmitVariableDeclarationList(node) {
        for (var _i = 0, _a = node.declarations; _i < _a.length; _i++) {
          var variable = _a[_i];
          var name = factory.cloneNode(variable.name);
          ts2.setCommentRange(name, variable.name);
          hoistVariableDeclaration(name);
        }
        var variables = ts2.getInitializedVariables(node);
        var numVariables = variables.length;
        var variablesWritten = 0;
        var pendingExpressions = [];
        while (variablesWritten < numVariables) {
          for (var i = variablesWritten; i < numVariables; i++) {
            var variable = variables[i];
            if (containsYield(variable.initializer) && pendingExpressions.length > 0) {
              break;
            }
            pendingExpressions.push(transformInitializedVariable(variable));
          }
          if (pendingExpressions.length) {
            emitStatement(factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions)));
            variablesWritten += pendingExpressions.length;
            pendingExpressions = [];
          }
        }
        return void 0;
      }
      function transformInitializedVariable(node) {
        return ts2.setSourceMapRange(factory.createAssignment(ts2.setSourceMapRange(factory.cloneNode(node.name), node.name), ts2.visitNode(node.initializer, visitor, ts2.isExpression)), node);
      }
      function transformAndEmitIfStatement(node) {
        if (containsYield(node)) {
          if (containsYield(node.thenStatement) || containsYield(node.elseStatement)) {
            var endLabel = defineLabel();
            var elseLabel = node.elseStatement ? defineLabel() : void 0;
            emitBreakWhenFalse(node.elseStatement ? elseLabel : endLabel, ts2.visitNode(node.expression, visitor, ts2.isExpression), node.expression);
            transformAndEmitEmbeddedStatement(node.thenStatement);
            if (node.elseStatement) {
              emitBreak(endLabel);
              markLabel(elseLabel);
              transformAndEmitEmbeddedStatement(node.elseStatement);
            }
            markLabel(endLabel);
          } else {
            emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
          }
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function transformAndEmitDoStatement(node) {
        if (containsYield(node)) {
          var conditionLabel = defineLabel();
          var loopLabel = defineLabel();
          beginLoopBlock(conditionLabel);
          markLabel(loopLabel);
          transformAndEmitEmbeddedStatement(node.statement);
          markLabel(conditionLabel);
          emitBreakWhenTrue(loopLabel, ts2.visitNode(node.expression, visitor, ts2.isExpression));
          endLoopBlock();
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function visitDoStatement(node) {
        if (inStatementContainingYield) {
          beginScriptLoopBlock();
          node = ts2.visitEachChild(node, visitor, context);
          endLoopBlock();
          return node;
        } else {
          return ts2.visitEachChild(node, visitor, context);
        }
      }
      function transformAndEmitWhileStatement(node) {
        if (containsYield(node)) {
          var loopLabel = defineLabel();
          var endLabel = beginLoopBlock(loopLabel);
          markLabel(loopLabel);
          emitBreakWhenFalse(endLabel, ts2.visitNode(node.expression, visitor, ts2.isExpression));
          transformAndEmitEmbeddedStatement(node.statement);
          emitBreak(loopLabel);
          endLoopBlock();
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function visitWhileStatement(node) {
        if (inStatementContainingYield) {
          beginScriptLoopBlock();
          node = ts2.visitEachChild(node, visitor, context);
          endLoopBlock();
          return node;
        } else {
          return ts2.visitEachChild(node, visitor, context);
        }
      }
      function transformAndEmitForStatement(node) {
        if (containsYield(node)) {
          var conditionLabel = defineLabel();
          var incrementLabel = defineLabel();
          var endLabel = beginLoopBlock(incrementLabel);
          if (node.initializer) {
            var initializer = node.initializer;
            if (ts2.isVariableDeclarationList(initializer)) {
              transformAndEmitVariableDeclarationList(initializer);
            } else {
              emitStatement(ts2.setTextRange(factory.createExpressionStatement(ts2.visitNode(initializer, visitor, ts2.isExpression)), initializer));
            }
          }
          markLabel(conditionLabel);
          if (node.condition) {
            emitBreakWhenFalse(endLabel, ts2.visitNode(node.condition, visitor, ts2.isExpression));
          }
          transformAndEmitEmbeddedStatement(node.statement);
          markLabel(incrementLabel);
          if (node.incrementor) {
            emitStatement(ts2.setTextRange(factory.createExpressionStatement(ts2.visitNode(node.incrementor, visitor, ts2.isExpression)), node.incrementor));
          }
          emitBreak(conditionLabel);
          endLoopBlock();
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function visitForStatement(node) {
        if (inStatementContainingYield) {
          beginScriptLoopBlock();
        }
        var initializer = node.initializer;
        if (initializer && ts2.isVariableDeclarationList(initializer)) {
          for (var _i = 0, _a = initializer.declarations; _i < _a.length; _i++) {
            var variable = _a[_i];
            hoistVariableDeclaration(variable.name);
          }
          var variables = ts2.getInitializedVariables(initializer);
          node = factory.updateForStatement(node, variables.length > 0 ? factory.inlineExpressions(ts2.map(variables, transformInitializedVariable)) : void 0, ts2.visitNode(node.condition, visitor, ts2.isExpression), ts2.visitNode(node.incrementor, visitor, ts2.isExpression), ts2.visitIterationBody(node.statement, visitor, context));
        } else {
          node = ts2.visitEachChild(node, visitor, context);
        }
        if (inStatementContainingYield) {
          endLoopBlock();
        }
        return node;
      }
      function transformAndEmitForInStatement(node) {
        if (containsYield(node)) {
          var keysArray = declareLocal();
          var key = declareLocal();
          var keysIndex = factory.createLoopVariable();
          var initializer = node.initializer;
          hoistVariableDeclaration(keysIndex);
          emitAssignment(keysArray, factory.createArrayLiteralExpression());
          emitStatement(factory.createForInStatement(key, ts2.visitNode(node.expression, visitor, ts2.isExpression), factory.createExpressionStatement(factory.createCallExpression(factory.createPropertyAccessExpression(keysArray, "push"), void 0, [key]))));
          emitAssignment(keysIndex, factory.createNumericLiteral(0));
          var conditionLabel = defineLabel();
          var incrementLabel = defineLabel();
          var endLabel = beginLoopBlock(incrementLabel);
          markLabel(conditionLabel);
          emitBreakWhenFalse(endLabel, factory.createLessThan(keysIndex, factory.createPropertyAccessExpression(keysArray, "length")));
          var variable = void 0;
          if (ts2.isVariableDeclarationList(initializer)) {
            for (var _i = 0, _a = initializer.declarations; _i < _a.length; _i++) {
              var variable_1 = _a[_i];
              hoistVariableDeclaration(variable_1.name);
            }
            variable = factory.cloneNode(initializer.declarations[0].name);
          } else {
            variable = ts2.visitNode(initializer, visitor, ts2.isExpression);
            ts2.Debug.assert(ts2.isLeftHandSideExpression(variable));
          }
          emitAssignment(variable, factory.createElementAccessExpression(keysArray, keysIndex));
          transformAndEmitEmbeddedStatement(node.statement);
          markLabel(incrementLabel);
          emitStatement(factory.createExpressionStatement(factory.createPostfixIncrement(keysIndex)));
          emitBreak(conditionLabel);
          endLoopBlock();
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function visitForInStatement(node) {
        if (inStatementContainingYield) {
          beginScriptLoopBlock();
        }
        var initializer = node.initializer;
        if (ts2.isVariableDeclarationList(initializer)) {
          for (var _i = 0, _a = initializer.declarations; _i < _a.length; _i++) {
            var variable = _a[_i];
            hoistVariableDeclaration(variable.name);
          }
          node = factory.updateForInStatement(node, initializer.declarations[0].name, ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitNode(node.statement, visitor, ts2.isStatement, factory.liftToBlock));
        } else {
          node = ts2.visitEachChild(node, visitor, context);
        }
        if (inStatementContainingYield) {
          endLoopBlock();
        }
        return node;
      }
      function transformAndEmitContinueStatement(node) {
        var label = findContinueTarget(node.label ? ts2.idText(node.label) : void 0);
        if (label > 0) {
          emitBreak(label, node);
        } else {
          emitStatement(node);
        }
      }
      function visitContinueStatement(node) {
        if (inStatementContainingYield) {
          var label = findContinueTarget(node.label && ts2.idText(node.label));
          if (label > 0) {
            return createInlineBreak(label, node);
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function transformAndEmitBreakStatement(node) {
        var label = findBreakTarget(node.label ? ts2.idText(node.label) : void 0);
        if (label > 0) {
          emitBreak(label, node);
        } else {
          emitStatement(node);
        }
      }
      function visitBreakStatement(node) {
        if (inStatementContainingYield) {
          var label = findBreakTarget(node.label && ts2.idText(node.label));
          if (label > 0) {
            return createInlineBreak(label, node);
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function transformAndEmitReturnStatement(node) {
        emitReturn(ts2.visitNode(node.expression, visitor, ts2.isExpression), node);
      }
      function visitReturnStatement(node) {
        return createInlineReturn(ts2.visitNode(node.expression, visitor, ts2.isExpression), node);
      }
      function transformAndEmitWithStatement(node) {
        if (containsYield(node)) {
          beginWithBlock(cacheExpression(ts2.visitNode(node.expression, visitor, ts2.isExpression)));
          transformAndEmitEmbeddedStatement(node.statement);
          endWithBlock();
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function transformAndEmitSwitchStatement(node) {
        if (containsYield(node.caseBlock)) {
          var caseBlock = node.caseBlock;
          var numClauses = caseBlock.clauses.length;
          var endLabel = beginSwitchBlock();
          var expression = cacheExpression(ts2.visitNode(node.expression, visitor, ts2.isExpression));
          var clauseLabels = [];
          var defaultClauseIndex = -1;
          for (var i = 0; i < numClauses; i++) {
            var clause = caseBlock.clauses[i];
            clauseLabels.push(defineLabel());
            if (clause.kind === 289 && defaultClauseIndex === -1) {
              defaultClauseIndex = i;
            }
          }
          var clausesWritten = 0;
          var pendingClauses = [];
          while (clausesWritten < numClauses) {
            var defaultClausesSkipped = 0;
            for (var i = clausesWritten; i < numClauses; i++) {
              var clause = caseBlock.clauses[i];
              if (clause.kind === 288) {
                if (containsYield(clause.expression) && pendingClauses.length > 0) {
                  break;
                }
                pendingClauses.push(factory.createCaseClause(ts2.visitNode(clause.expression, visitor, ts2.isExpression), [
                  createInlineBreak(clauseLabels[i], clause.expression)
                ]));
              } else {
                defaultClausesSkipped++;
              }
            }
            if (pendingClauses.length) {
              emitStatement(factory.createSwitchStatement(expression, factory.createCaseBlock(pendingClauses)));
              clausesWritten += pendingClauses.length;
              pendingClauses = [];
            }
            if (defaultClausesSkipped > 0) {
              clausesWritten += defaultClausesSkipped;
              defaultClausesSkipped = 0;
            }
          }
          if (defaultClauseIndex >= 0) {
            emitBreak(clauseLabels[defaultClauseIndex]);
          } else {
            emitBreak(endLabel);
          }
          for (var i = 0; i < numClauses; i++) {
            markLabel(clauseLabels[i]);
            transformAndEmitStatements(caseBlock.clauses[i].statements);
          }
          endSwitchBlock();
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function visitSwitchStatement(node) {
        if (inStatementContainingYield) {
          beginScriptSwitchBlock();
        }
        node = ts2.visitEachChild(node, visitor, context);
        if (inStatementContainingYield) {
          endSwitchBlock();
        }
        return node;
      }
      function transformAndEmitLabeledStatement(node) {
        if (containsYield(node)) {
          beginLabeledBlock(ts2.idText(node.label));
          transformAndEmitEmbeddedStatement(node.statement);
          endLabeledBlock();
        } else {
          emitStatement(ts2.visitNode(node, visitor, ts2.isStatement));
        }
      }
      function visitLabeledStatement(node) {
        if (inStatementContainingYield) {
          beginScriptLabeledBlock(ts2.idText(node.label));
        }
        node = ts2.visitEachChild(node, visitor, context);
        if (inStatementContainingYield) {
          endLabeledBlock();
        }
        return node;
      }
      function transformAndEmitThrowStatement(node) {
        var _a;
        emitThrow(ts2.visitNode((_a = node.expression) !== null && _a !== void 0 ? _a : factory.createVoidZero(), visitor, ts2.isExpression), node);
      }
      function transformAndEmitTryStatement(node) {
        if (containsYield(node)) {
          beginExceptionBlock();
          transformAndEmitEmbeddedStatement(node.tryBlock);
          if (node.catchClause) {
            beginCatchBlock(node.catchClause.variableDeclaration);
            transformAndEmitEmbeddedStatement(node.catchClause.block);
          }
          if (node.finallyBlock) {
            beginFinallyBlock();
            transformAndEmitEmbeddedStatement(node.finallyBlock);
          }
          endExceptionBlock();
        } else {
          emitStatement(ts2.visitEachChild(node, visitor, context));
        }
      }
      function containsYield(node) {
        return !!node && (node.transformFlags & 524288) !== 0;
      }
      function countInitialNodesWithoutYield(nodes) {
        var numNodes = nodes.length;
        for (var i = 0; i < numNodes; i++) {
          if (containsYield(nodes[i])) {
            return i;
          }
        }
        return -1;
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (hint === 1) {
          return substituteExpression(node);
        }
        return node;
      }
      function substituteExpression(node) {
        if (ts2.isIdentifier(node)) {
          return substituteExpressionIdentifier(node);
        }
        return node;
      }
      function substituteExpressionIdentifier(node) {
        if (!ts2.isGeneratedIdentifier(node) && renamedCatchVariables && renamedCatchVariables.has(ts2.idText(node))) {
          var original = ts2.getOriginalNode(node);
          if (ts2.isIdentifier(original) && original.parent) {
            var declaration = resolver.getReferencedValueDeclaration(original);
            if (declaration) {
              var name = renamedCatchVariableDeclarations[ts2.getOriginalNodeId(declaration)];
              if (name) {
                var clone_6 = ts2.setParent(ts2.setTextRange(factory.cloneNode(name), name), name.parent);
                ts2.setSourceMapRange(clone_6, node);
                ts2.setCommentRange(clone_6, node);
                return clone_6;
              }
            }
          }
        }
        return node;
      }
      function cacheExpression(node) {
        if (ts2.isGeneratedIdentifier(node) || ts2.getEmitFlags(node) & 4096) {
          return node;
        }
        var temp = factory.createTempVariable(hoistVariableDeclaration);
        emitAssignment(temp, node, node);
        return temp;
      }
      function declareLocal(name) {
        var temp = name ? factory.createUniqueName(name) : factory.createTempVariable(void 0);
        hoistVariableDeclaration(temp);
        return temp;
      }
      function defineLabel() {
        if (!labelOffsets) {
          labelOffsets = [];
        }
        var label = nextLabelId;
        nextLabelId++;
        labelOffsets[label] = -1;
        return label;
      }
      function markLabel(label) {
        ts2.Debug.assert(labelOffsets !== void 0, "No labels were defined.");
        labelOffsets[label] = operations ? operations.length : 0;
      }
      function beginBlock(block) {
        if (!blocks) {
          blocks = [];
          blockActions = [];
          blockOffsets = [];
          blockStack = [];
        }
        var index = blockActions.length;
        blockActions[index] = 0;
        blockOffsets[index] = operations ? operations.length : 0;
        blocks[index] = block;
        blockStack.push(block);
        return index;
      }
      function endBlock() {
        var block = peekBlock();
        if (block === void 0)
          return ts2.Debug.fail("beginBlock was never called.");
        var index = blockActions.length;
        blockActions[index] = 1;
        blockOffsets[index] = operations ? operations.length : 0;
        blocks[index] = block;
        blockStack.pop();
        return block;
      }
      function peekBlock() {
        return ts2.lastOrUndefined(blockStack);
      }
      function peekBlockKind() {
        var block = peekBlock();
        return block && block.kind;
      }
      function beginWithBlock(expression) {
        var startLabel = defineLabel();
        var endLabel = defineLabel();
        markLabel(startLabel);
        beginBlock({
          kind: 1,
          expression,
          startLabel,
          endLabel
        });
      }
      function endWithBlock() {
        ts2.Debug.assert(peekBlockKind() === 1);
        var block = endBlock();
        markLabel(block.endLabel);
      }
      function beginExceptionBlock() {
        var startLabel = defineLabel();
        var endLabel = defineLabel();
        markLabel(startLabel);
        beginBlock({
          kind: 0,
          state: 0,
          startLabel,
          endLabel
        });
        emitNop();
        return endLabel;
      }
      function beginCatchBlock(variable) {
        ts2.Debug.assert(peekBlockKind() === 0);
        var name;
        if (ts2.isGeneratedIdentifier(variable.name)) {
          name = variable.name;
          hoistVariableDeclaration(variable.name);
        } else {
          var text = ts2.idText(variable.name);
          name = declareLocal(text);
          if (!renamedCatchVariables) {
            renamedCatchVariables = new ts2.Map();
            renamedCatchVariableDeclarations = [];
            context.enableSubstitution(79);
          }
          renamedCatchVariables.set(text, true);
          renamedCatchVariableDeclarations[ts2.getOriginalNodeId(variable)] = name;
        }
        var exception = peekBlock();
        ts2.Debug.assert(exception.state < 1);
        var endLabel = exception.endLabel;
        emitBreak(endLabel);
        var catchLabel = defineLabel();
        markLabel(catchLabel);
        exception.state = 1;
        exception.catchVariable = name;
        exception.catchLabel = catchLabel;
        emitAssignment(name, factory.createCallExpression(factory.createPropertyAccessExpression(state, "sent"), void 0, []));
        emitNop();
      }
      function beginFinallyBlock() {
        ts2.Debug.assert(peekBlockKind() === 0);
        var exception = peekBlock();
        ts2.Debug.assert(exception.state < 2);
        var endLabel = exception.endLabel;
        emitBreak(endLabel);
        var finallyLabel = defineLabel();
        markLabel(finallyLabel);
        exception.state = 2;
        exception.finallyLabel = finallyLabel;
      }
      function endExceptionBlock() {
        ts2.Debug.assert(peekBlockKind() === 0);
        var exception = endBlock();
        var state2 = exception.state;
        if (state2 < 2) {
          emitBreak(exception.endLabel);
        } else {
          emitEndfinally();
        }
        markLabel(exception.endLabel);
        emitNop();
        exception.state = 3;
      }
      function beginScriptLoopBlock() {
        beginBlock({
          kind: 3,
          isScript: true,
          breakLabel: -1,
          continueLabel: -1
        });
      }
      function beginLoopBlock(continueLabel) {
        var breakLabel = defineLabel();
        beginBlock({
          kind: 3,
          isScript: false,
          breakLabel,
          continueLabel
        });
        return breakLabel;
      }
      function endLoopBlock() {
        ts2.Debug.assert(peekBlockKind() === 3);
        var block = endBlock();
        var breakLabel = block.breakLabel;
        if (!block.isScript) {
          markLabel(breakLabel);
        }
      }
      function beginScriptSwitchBlock() {
        beginBlock({
          kind: 2,
          isScript: true,
          breakLabel: -1
        });
      }
      function beginSwitchBlock() {
        var breakLabel = defineLabel();
        beginBlock({
          kind: 2,
          isScript: false,
          breakLabel
        });
        return breakLabel;
      }
      function endSwitchBlock() {
        ts2.Debug.assert(peekBlockKind() === 2);
        var block = endBlock();
        var breakLabel = block.breakLabel;
        if (!block.isScript) {
          markLabel(breakLabel);
        }
      }
      function beginScriptLabeledBlock(labelText) {
        beginBlock({
          kind: 4,
          isScript: true,
          labelText,
          breakLabel: -1
        });
      }
      function beginLabeledBlock(labelText) {
        var breakLabel = defineLabel();
        beginBlock({
          kind: 4,
          isScript: false,
          labelText,
          breakLabel
        });
      }
      function endLabeledBlock() {
        ts2.Debug.assert(peekBlockKind() === 4);
        var block = endBlock();
        if (!block.isScript) {
          markLabel(block.breakLabel);
        }
      }
      function supportsUnlabeledBreak(block) {
        return block.kind === 2 || block.kind === 3;
      }
      function supportsLabeledBreakOrContinue(block) {
        return block.kind === 4;
      }
      function supportsUnlabeledContinue(block) {
        return block.kind === 3;
      }
      function hasImmediateContainingLabeledBlock(labelText, start) {
        for (var j = start; j >= 0; j--) {
          var containingBlock = blockStack[j];
          if (supportsLabeledBreakOrContinue(containingBlock)) {
            if (containingBlock.labelText === labelText) {
              return true;
            }
          } else {
            break;
          }
        }
        return false;
      }
      function findBreakTarget(labelText) {
        if (blockStack) {
          if (labelText) {
            for (var i = blockStack.length - 1; i >= 0; i--) {
              var block = blockStack[i];
              if (supportsLabeledBreakOrContinue(block) && block.labelText === labelText) {
                return block.breakLabel;
              } else if (supportsUnlabeledBreak(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) {
                return block.breakLabel;
              }
            }
          } else {
            for (var i = blockStack.length - 1; i >= 0; i--) {
              var block = blockStack[i];
              if (supportsUnlabeledBreak(block)) {
                return block.breakLabel;
              }
            }
          }
        }
        return 0;
      }
      function findContinueTarget(labelText) {
        if (blockStack) {
          if (labelText) {
            for (var i = blockStack.length - 1; i >= 0; i--) {
              var block = blockStack[i];
              if (supportsUnlabeledContinue(block) && hasImmediateContainingLabeledBlock(labelText, i - 1)) {
                return block.continueLabel;
              }
            }
          } else {
            for (var i = blockStack.length - 1; i >= 0; i--) {
              var block = blockStack[i];
              if (supportsUnlabeledContinue(block)) {
                return block.continueLabel;
              }
            }
          }
        }
        return 0;
      }
      function createLabel(label) {
        if (label !== void 0 && label > 0) {
          if (labelExpressions === void 0) {
            labelExpressions = [];
          }
          var expression = factory.createNumericLiteral(-1);
          if (labelExpressions[label] === void 0) {
            labelExpressions[label] = [expression];
          } else {
            labelExpressions[label].push(expression);
          }
          return expression;
        }
        return factory.createOmittedExpression();
      }
      function createInstruction(instruction) {
        var literal = factory.createNumericLiteral(instruction);
        ts2.addSyntheticTrailingComment(literal, 3, getInstructionName(instruction));
        return literal;
      }
      function createInlineBreak(label, location) {
        ts2.Debug.assertLessThan(0, label, "Invalid label");
        return ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression([
          createInstruction(3),
          createLabel(label)
        ])), location);
      }
      function createInlineReturn(expression, location) {
        return ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression(expression ? [createInstruction(2), expression] : [createInstruction(2)])), location);
      }
      function createGeneratorResume(location) {
        return ts2.setTextRange(factory.createCallExpression(factory.createPropertyAccessExpression(state, "sent"), void 0, []), location);
      }
      function emitNop() {
        emitWorker(0);
      }
      function emitStatement(node) {
        if (node) {
          emitWorker(1, [node]);
        } else {
          emitNop();
        }
      }
      function emitAssignment(left, right, location) {
        emitWorker(2, [left, right], location);
      }
      function emitBreak(label, location) {
        emitWorker(3, [label], location);
      }
      function emitBreakWhenTrue(label, condition, location) {
        emitWorker(4, [label, condition], location);
      }
      function emitBreakWhenFalse(label, condition, location) {
        emitWorker(5, [label, condition], location);
      }
      function emitYieldStar(expression, location) {
        emitWorker(7, [expression], location);
      }
      function emitYield(expression, location) {
        emitWorker(6, [expression], location);
      }
      function emitReturn(expression, location) {
        emitWorker(8, [expression], location);
      }
      function emitThrow(expression, location) {
        emitWorker(9, [expression], location);
      }
      function emitEndfinally() {
        emitWorker(10);
      }
      function emitWorker(code, args, location) {
        if (operations === void 0) {
          operations = [];
          operationArguments = [];
          operationLocations = [];
        }
        if (labelOffsets === void 0) {
          markLabel(defineLabel());
        }
        var operationIndex = operations.length;
        operations[operationIndex] = code;
        operationArguments[operationIndex] = args;
        operationLocations[operationIndex] = location;
      }
      function build() {
        blockIndex = 0;
        labelNumber = 0;
        labelNumbers = void 0;
        lastOperationWasAbrupt = false;
        lastOperationWasCompletion = false;
        clauses = void 0;
        statements = void 0;
        exceptionBlockStack = void 0;
        currentExceptionBlock = void 0;
        withBlockStack = void 0;
        var buildResult = buildStatements();
        return emitHelpers().createGeneratorHelper(ts2.setEmitFlags(factory.createFunctionExpression(void 0, void 0, void 0, void 0, [factory.createParameterDeclaration(void 0, void 0, void 0, state)], void 0, factory.createBlock(buildResult, buildResult.length > 0)), 524288));
      }
      function buildStatements() {
        if (operations) {
          for (var operationIndex = 0; operationIndex < operations.length; operationIndex++) {
            writeOperation(operationIndex);
          }
          flushFinalLabel(operations.length);
        } else {
          flushFinalLabel(0);
        }
        if (clauses) {
          var labelExpression = factory.createPropertyAccessExpression(state, "label");
          var switchStatement = factory.createSwitchStatement(labelExpression, factory.createCaseBlock(clauses));
          return [ts2.startOnNewLine(switchStatement)];
        }
        if (statements) {
          return statements;
        }
        return [];
      }
      function flushLabel() {
        if (!statements) {
          return;
        }
        appendLabel(!lastOperationWasAbrupt);
        lastOperationWasAbrupt = false;
        lastOperationWasCompletion = false;
        labelNumber++;
      }
      function flushFinalLabel(operationIndex) {
        if (isFinalLabelReachable(operationIndex)) {
          tryEnterLabel(operationIndex);
          withBlockStack = void 0;
          writeReturn(void 0, void 0);
        }
        if (statements && clauses) {
          appendLabel(false);
        }
        updateLabelExpressions();
      }
      function isFinalLabelReachable(operationIndex) {
        if (!lastOperationWasCompletion) {
          return true;
        }
        if (!labelOffsets || !labelExpressions) {
          return false;
        }
        for (var label = 0; label < labelOffsets.length; label++) {
          if (labelOffsets[label] === operationIndex && labelExpressions[label]) {
            return true;
          }
        }
        return false;
      }
      function appendLabel(markLabelEnd) {
        if (!clauses) {
          clauses = [];
        }
        if (statements) {
          if (withBlockStack) {
            for (var i = withBlockStack.length - 1; i >= 0; i--) {
              var withBlock = withBlockStack[i];
              statements = [factory.createWithStatement(withBlock.expression, factory.createBlock(statements))];
            }
          }
          if (currentExceptionBlock) {
            var startLabel = currentExceptionBlock.startLabel, catchLabel = currentExceptionBlock.catchLabel, finallyLabel = currentExceptionBlock.finallyLabel, endLabel = currentExceptionBlock.endLabel;
            statements.unshift(factory.createExpressionStatement(factory.createCallExpression(factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(state, "trys"), "push"), void 0, [
              factory.createArrayLiteralExpression([
                createLabel(startLabel),
                createLabel(catchLabel),
                createLabel(finallyLabel),
                createLabel(endLabel)
              ])
            ])));
            currentExceptionBlock = void 0;
          }
          if (markLabelEnd) {
            statements.push(factory.createExpressionStatement(factory.createAssignment(factory.createPropertyAccessExpression(state, "label"), factory.createNumericLiteral(labelNumber + 1))));
          }
        }
        clauses.push(factory.createCaseClause(factory.createNumericLiteral(labelNumber), statements || []));
        statements = void 0;
      }
      function tryEnterLabel(operationIndex) {
        if (!labelOffsets) {
          return;
        }
        for (var label = 0; label < labelOffsets.length; label++) {
          if (labelOffsets[label] === operationIndex) {
            flushLabel();
            if (labelNumbers === void 0) {
              labelNumbers = [];
            }
            if (labelNumbers[labelNumber] === void 0) {
              labelNumbers[labelNumber] = [label];
            } else {
              labelNumbers[labelNumber].push(label);
            }
          }
        }
      }
      function updateLabelExpressions() {
        if (labelExpressions !== void 0 && labelNumbers !== void 0) {
          for (var labelNumber_1 = 0; labelNumber_1 < labelNumbers.length; labelNumber_1++) {
            var labels = labelNumbers[labelNumber_1];
            if (labels !== void 0) {
              for (var _i = 0, labels_1 = labels; _i < labels_1.length; _i++) {
                var label = labels_1[_i];
                var expressions = labelExpressions[label];
                if (expressions !== void 0) {
                  for (var _a = 0, expressions_1 = expressions; _a < expressions_1.length; _a++) {
                    var expression = expressions_1[_a];
                    expression.text = String(labelNumber_1);
                  }
                }
              }
            }
          }
        }
      }
      function tryEnterOrLeaveBlock(operationIndex) {
        if (blocks) {
          for (; blockIndex < blockActions.length && blockOffsets[blockIndex] <= operationIndex; blockIndex++) {
            var block = blocks[blockIndex];
            var blockAction = blockActions[blockIndex];
            switch (block.kind) {
              case 0:
                if (blockAction === 0) {
                  if (!exceptionBlockStack) {
                    exceptionBlockStack = [];
                  }
                  if (!statements) {
                    statements = [];
                  }
                  exceptionBlockStack.push(currentExceptionBlock);
                  currentExceptionBlock = block;
                } else if (blockAction === 1) {
                  currentExceptionBlock = exceptionBlockStack.pop();
                }
                break;
              case 1:
                if (blockAction === 0) {
                  if (!withBlockStack) {
                    withBlockStack = [];
                  }
                  withBlockStack.push(block);
                } else if (blockAction === 1) {
                  withBlockStack.pop();
                }
                break;
            }
          }
        }
      }
      function writeOperation(operationIndex) {
        tryEnterLabel(operationIndex);
        tryEnterOrLeaveBlock(operationIndex);
        if (lastOperationWasAbrupt) {
          return;
        }
        lastOperationWasAbrupt = false;
        lastOperationWasCompletion = false;
        var opcode = operations[operationIndex];
        if (opcode === 0) {
          return;
        } else if (opcode === 10) {
          return writeEndfinally();
        }
        var args = operationArguments[operationIndex];
        if (opcode === 1) {
          return writeStatement(args[0]);
        }
        var location = operationLocations[operationIndex];
        switch (opcode) {
          case 2:
            return writeAssign(args[0], args[1], location);
          case 3:
            return writeBreak(args[0], location);
          case 4:
            return writeBreakWhenTrue(args[0], args[1], location);
          case 5:
            return writeBreakWhenFalse(args[0], args[1], location);
          case 6:
            return writeYield(args[0], location);
          case 7:
            return writeYieldStar(args[0], location);
          case 8:
            return writeReturn(args[0], location);
          case 9:
            return writeThrow(args[0], location);
        }
      }
      function writeStatement(statement) {
        if (statement) {
          if (!statements) {
            statements = [statement];
          } else {
            statements.push(statement);
          }
        }
      }
      function writeAssign(left, right, operationLocation) {
        writeStatement(ts2.setTextRange(factory.createExpressionStatement(factory.createAssignment(left, right)), operationLocation));
      }
      function writeThrow(expression, operationLocation) {
        lastOperationWasAbrupt = true;
        lastOperationWasCompletion = true;
        writeStatement(ts2.setTextRange(factory.createThrowStatement(expression), operationLocation));
      }
      function writeReturn(expression, operationLocation) {
        lastOperationWasAbrupt = true;
        lastOperationWasCompletion = true;
        writeStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression(expression ? [createInstruction(2), expression] : [createInstruction(2)])), operationLocation), 384));
      }
      function writeBreak(label, operationLocation) {
        lastOperationWasAbrupt = true;
        writeStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression([
          createInstruction(3),
          createLabel(label)
        ])), operationLocation), 384));
      }
      function writeBreakWhenTrue(label, condition, operationLocation) {
        writeStatement(ts2.setEmitFlags(factory.createIfStatement(condition, ts2.setEmitFlags(ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression([
          createInstruction(3),
          createLabel(label)
        ])), operationLocation), 384)), 1));
      }
      function writeBreakWhenFalse(label, condition, operationLocation) {
        writeStatement(ts2.setEmitFlags(factory.createIfStatement(factory.createLogicalNot(condition), ts2.setEmitFlags(ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression([
          createInstruction(3),
          createLabel(label)
        ])), operationLocation), 384)), 1));
      }
      function writeYield(expression, operationLocation) {
        lastOperationWasAbrupt = true;
        writeStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression(expression ? [createInstruction(4), expression] : [createInstruction(4)])), operationLocation), 384));
      }
      function writeYieldStar(expression, operationLocation) {
        lastOperationWasAbrupt = true;
        writeStatement(ts2.setEmitFlags(ts2.setTextRange(factory.createReturnStatement(factory.createArrayLiteralExpression([
          createInstruction(5),
          expression
        ])), operationLocation), 384));
      }
      function writeEndfinally() {
        lastOperationWasAbrupt = true;
        writeStatement(factory.createReturnStatement(factory.createArrayLiteralExpression([
          createInstruction(7)
        ])));
      }
    }
    ts2.transformGenerators = transformGenerators;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformModule(context) {
      function getTransformModuleDelegate(moduleKind2) {
        switch (moduleKind2) {
          case ts2.ModuleKind.AMD:
            return transformAMDModule;
          case ts2.ModuleKind.UMD:
            return transformUMDModule;
          default:
            return transformCommonJSModule;
        }
      }
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory, startLexicalEnvironment = context.startLexicalEnvironment, endLexicalEnvironment = context.endLexicalEnvironment, hoistVariableDeclaration = context.hoistVariableDeclaration;
      var compilerOptions = context.getCompilerOptions();
      var resolver = context.getEmitResolver();
      var host = context.getEmitHost();
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var moduleKind = ts2.getEmitModuleKind(compilerOptions);
      var previousOnSubstituteNode = context.onSubstituteNode;
      var previousOnEmitNode = context.onEmitNode;
      context.onSubstituteNode = onSubstituteNode;
      context.onEmitNode = onEmitNode;
      context.enableSubstitution(207);
      context.enableSubstitution(209);
      context.enableSubstitution(79);
      context.enableSubstitution(220);
      context.enableSubstitution(295);
      context.enableEmitNotification(303);
      var moduleInfoMap = [];
      var deferredExports = [];
      var currentSourceFile;
      var currentModuleInfo;
      var noSubstitution = [];
      var needUMDDynamicImportHelper;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile || !(ts2.isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 4194304 || ts2.isJsonSourceFile(node) && ts2.hasJsonModuleEmitEnabled(compilerOptions) && ts2.outFile(compilerOptions))) {
          return node;
        }
        currentSourceFile = node;
        currentModuleInfo = ts2.collectExternalModuleInfo(context, node, resolver, compilerOptions);
        moduleInfoMap[ts2.getOriginalNodeId(node)] = currentModuleInfo;
        var transformModule2 = getTransformModuleDelegate(moduleKind);
        var updated = transformModule2(node);
        currentSourceFile = void 0;
        currentModuleInfo = void 0;
        needUMDDynamicImportHelper = false;
        return updated;
      }
      function shouldEmitUnderscoreUnderscoreESModule() {
        if (!currentModuleInfo.exportEquals && ts2.isExternalModule(currentSourceFile)) {
          return true;
        }
        return false;
      }
      function transformCommonJSModule(node) {
        startLexicalEnvironment();
        var statements = [];
        var ensureUseStrict = ts2.getStrictOptionValue(compilerOptions, "alwaysStrict") || !compilerOptions.noImplicitUseStrict && ts2.isExternalModule(currentSourceFile);
        var statementOffset = factory.copyPrologue(node.statements, statements, ensureUseStrict && !ts2.isJsonSourceFile(node), topLevelVisitor);
        if (shouldEmitUnderscoreUnderscoreESModule()) {
          ts2.append(statements, createUnderscoreUnderscoreESModule());
        }
        if (ts2.length(currentModuleInfo.exportedNames)) {
          var chunkSize = 50;
          for (var i = 0; i < currentModuleInfo.exportedNames.length; i += chunkSize) {
            ts2.append(statements, factory.createExpressionStatement(ts2.reduceLeft(currentModuleInfo.exportedNames.slice(i, i + chunkSize), function(prev, nextId) {
              return factory.createAssignment(factory.createPropertyAccessExpression(factory.createIdentifier("exports"), factory.createIdentifier(ts2.idText(nextId))), prev);
            }, factory.createVoidZero())));
          }
        }
        ts2.append(statements, ts2.visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, ts2.isStatement));
        ts2.addRange(statements, ts2.visitNodes(node.statements, topLevelVisitor, ts2.isStatement, statementOffset));
        addExportEqualsIfNeeded(statements, false);
        ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
        var updated = factory.updateSourceFile(node, ts2.setTextRange(factory.createNodeArray(statements), node.statements));
        ts2.addEmitHelpers(updated, context.readEmitHelpers());
        return updated;
      }
      function transformAMDModule(node) {
        var define = factory.createIdentifier("define");
        var moduleName = ts2.tryGetModuleNameFromFile(factory, node, host, compilerOptions);
        var jsonSourceFile = ts2.isJsonSourceFile(node) && node;
        var _a = collectAsynchronousDependencies(node, true), aliasedModuleNames = _a.aliasedModuleNames, unaliasedModuleNames = _a.unaliasedModuleNames, importAliasNames = _a.importAliasNames;
        var updated = factory.updateSourceFile(node, ts2.setTextRange(factory.createNodeArray([
          factory.createExpressionStatement(factory.createCallExpression(define, void 0, __spreadArray(__spreadArray([], moduleName ? [moduleName] : [], true), [
            factory.createArrayLiteralExpression(jsonSourceFile ? ts2.emptyArray : __spreadArray(__spreadArray([
              factory.createStringLiteral("require"),
              factory.createStringLiteral("exports")
            ], aliasedModuleNames, true), unaliasedModuleNames, true)),
            jsonSourceFile ? jsonSourceFile.statements.length ? jsonSourceFile.statements[0].expression : factory.createObjectLiteralExpression() : factory.createFunctionExpression(void 0, void 0, void 0, void 0, __spreadArray([
              factory.createParameterDeclaration(void 0, void 0, void 0, "require"),
              factory.createParameterDeclaration(void 0, void 0, void 0, "exports")
            ], importAliasNames, true), void 0, transformAsynchronousModuleBody(node))
          ], false)))
        ]), node.statements));
        ts2.addEmitHelpers(updated, context.readEmitHelpers());
        return updated;
      }
      function transformUMDModule(node) {
        var _a = collectAsynchronousDependencies(node, false), aliasedModuleNames = _a.aliasedModuleNames, unaliasedModuleNames = _a.unaliasedModuleNames, importAliasNames = _a.importAliasNames;
        var moduleName = ts2.tryGetModuleNameFromFile(factory, node, host, compilerOptions);
        var umdHeader = factory.createFunctionExpression(void 0, void 0, void 0, void 0, [factory.createParameterDeclaration(void 0, void 0, void 0, "factory")], void 0, ts2.setTextRange(factory.createBlock([
          factory.createIfStatement(factory.createLogicalAnd(factory.createTypeCheck(factory.createIdentifier("module"), "object"), factory.createTypeCheck(factory.createPropertyAccessExpression(factory.createIdentifier("module"), "exports"), "object")), factory.createBlock([
            factory.createVariableStatement(void 0, [
              factory.createVariableDeclaration("v", void 0, void 0, factory.createCallExpression(factory.createIdentifier("factory"), void 0, [
                factory.createIdentifier("require"),
                factory.createIdentifier("exports")
              ]))
            ]),
            ts2.setEmitFlags(factory.createIfStatement(factory.createStrictInequality(factory.createIdentifier("v"), factory.createIdentifier("undefined")), factory.createExpressionStatement(factory.createAssignment(factory.createPropertyAccessExpression(factory.createIdentifier("module"), "exports"), factory.createIdentifier("v")))), 1)
          ]), factory.createIfStatement(factory.createLogicalAnd(factory.createTypeCheck(factory.createIdentifier("define"), "function"), factory.createPropertyAccessExpression(factory.createIdentifier("define"), "amd")), factory.createBlock([
            factory.createExpressionStatement(factory.createCallExpression(factory.createIdentifier("define"), void 0, __spreadArray(__spreadArray([], moduleName ? [moduleName] : [], true), [
              factory.createArrayLiteralExpression(__spreadArray(__spreadArray([
                factory.createStringLiteral("require"),
                factory.createStringLiteral("exports")
              ], aliasedModuleNames, true), unaliasedModuleNames, true)),
              factory.createIdentifier("factory")
            ], false)))
          ])))
        ], true), void 0));
        var updated = factory.updateSourceFile(node, ts2.setTextRange(factory.createNodeArray([
          factory.createExpressionStatement(factory.createCallExpression(umdHeader, void 0, [
            factory.createFunctionExpression(void 0, void 0, void 0, void 0, __spreadArray([
              factory.createParameterDeclaration(void 0, void 0, void 0, "require"),
              factory.createParameterDeclaration(void 0, void 0, void 0, "exports")
            ], importAliasNames, true), void 0, transformAsynchronousModuleBody(node))
          ]))
        ]), node.statements));
        ts2.addEmitHelpers(updated, context.readEmitHelpers());
        return updated;
      }
      function collectAsynchronousDependencies(node, includeNonAmdDependencies) {
        var aliasedModuleNames = [];
        var unaliasedModuleNames = [];
        var importAliasNames = [];
        for (var _i = 0, _a = node.amdDependencies; _i < _a.length; _i++) {
          var amdDependency = _a[_i];
          if (amdDependency.name) {
            aliasedModuleNames.push(factory.createStringLiteral(amdDependency.path));
            importAliasNames.push(factory.createParameterDeclaration(void 0, void 0, void 0, amdDependency.name));
          } else {
            unaliasedModuleNames.push(factory.createStringLiteral(amdDependency.path));
          }
        }
        for (var _b = 0, _c = currentModuleInfo.externalImports; _b < _c.length; _b++) {
          var importNode = _c[_b];
          var externalModuleName = ts2.getExternalModuleNameLiteral(factory, importNode, currentSourceFile, host, resolver, compilerOptions);
          var importAliasName = ts2.getLocalNameForExternalImport(factory, importNode, currentSourceFile);
          if (externalModuleName) {
            if (includeNonAmdDependencies && importAliasName) {
              ts2.setEmitFlags(importAliasName, 4);
              aliasedModuleNames.push(externalModuleName);
              importAliasNames.push(factory.createParameterDeclaration(void 0, void 0, void 0, importAliasName));
            } else {
              unaliasedModuleNames.push(externalModuleName);
            }
          }
        }
        return { aliasedModuleNames, unaliasedModuleNames, importAliasNames };
      }
      function getAMDImportExpressionForImport(node) {
        if (ts2.isImportEqualsDeclaration(node) || ts2.isExportDeclaration(node) || !ts2.getExternalModuleNameLiteral(factory, node, currentSourceFile, host, resolver, compilerOptions)) {
          return void 0;
        }
        var name = ts2.getLocalNameForExternalImport(factory, node, currentSourceFile);
        var expr = getHelperExpressionForImport(node, name);
        if (expr === name) {
          return void 0;
        }
        return factory.createExpressionStatement(factory.createAssignment(name, expr));
      }
      function transformAsynchronousModuleBody(node) {
        startLexicalEnvironment();
        var statements = [];
        var statementOffset = factory.copyPrologue(node.statements, statements, !compilerOptions.noImplicitUseStrict, topLevelVisitor);
        if (shouldEmitUnderscoreUnderscoreESModule()) {
          ts2.append(statements, createUnderscoreUnderscoreESModule());
        }
        if (ts2.length(currentModuleInfo.exportedNames)) {
          ts2.append(statements, factory.createExpressionStatement(ts2.reduceLeft(currentModuleInfo.exportedNames, function(prev, nextId) {
            return factory.createAssignment(factory.createPropertyAccessExpression(factory.createIdentifier("exports"), factory.createIdentifier(ts2.idText(nextId))), prev);
          }, factory.createVoidZero())));
        }
        ts2.append(statements, ts2.visitNode(currentModuleInfo.externalHelpersImportDeclaration, topLevelVisitor, ts2.isStatement));
        if (moduleKind === ts2.ModuleKind.AMD) {
          ts2.addRange(statements, ts2.mapDefined(currentModuleInfo.externalImports, getAMDImportExpressionForImport));
        }
        ts2.addRange(statements, ts2.visitNodes(node.statements, topLevelVisitor, ts2.isStatement, statementOffset));
        addExportEqualsIfNeeded(statements, true);
        ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
        var body = factory.createBlock(statements, true);
        if (needUMDDynamicImportHelper) {
          ts2.addEmitHelper(body, dynamicImportUMDHelper);
        }
        return body;
      }
      function addExportEqualsIfNeeded(statements, emitAsReturn) {
        if (currentModuleInfo.exportEquals) {
          var expressionResult = ts2.visitNode(currentModuleInfo.exportEquals.expression, visitor);
          if (expressionResult) {
            if (emitAsReturn) {
              var statement = factory.createReturnStatement(expressionResult);
              ts2.setTextRange(statement, currentModuleInfo.exportEquals);
              ts2.setEmitFlags(statement, 384 | 1536);
              statements.push(statement);
            } else {
              var statement = factory.createExpressionStatement(factory.createAssignment(factory.createPropertyAccessExpression(factory.createIdentifier("module"), "exports"), expressionResult));
              ts2.setTextRange(statement, currentModuleInfo.exportEquals);
              ts2.setEmitFlags(statement, 1536);
              statements.push(statement);
            }
          }
        }
      }
      function topLevelVisitor(node) {
        switch (node.kind) {
          case 265:
            return visitImportDeclaration(node);
          case 264:
            return visitImportEqualsDeclaration(node);
          case 271:
            return visitExportDeclaration(node);
          case 270:
            return visitExportAssignment(node);
          case 236:
            return visitVariableStatement(node);
          case 255:
            return visitFunctionDeclaration(node);
          case 256:
            return visitClassDeclaration(node);
          case 350:
            return visitMergeDeclarationMarker(node);
          case 351:
            return visitEndOfDeclarationMarker(node);
          default:
            return visitor(node);
        }
      }
      function visitorWorker(node, valueIsDiscarded) {
        if (!(node.transformFlags & (4194304 | 2048 | 67108864))) {
          return node;
        }
        switch (node.kind) {
          case 241:
            return visitForStatement(node);
          case 237:
            return visitExpressionStatement(node);
          case 211:
            return visitParenthesizedExpression(node, valueIsDiscarded);
          case 348:
            return visitPartiallyEmittedExpression(node, valueIsDiscarded);
          case 207:
            if (ts2.isImportCall(node) && currentSourceFile.impliedNodeFormat === void 0) {
              return visitImportCallExpression(node);
            }
            break;
          case 220:
            if (ts2.isDestructuringAssignment(node)) {
              return visitDestructuringAssignment(node, valueIsDiscarded);
            }
            break;
          case 218:
          case 219:
            return visitPreOrPostfixUnaryExpression(node, valueIsDiscarded);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        return visitorWorker(node, false);
      }
      function discardedValueVisitor(node) {
        return visitorWorker(node, true);
      }
      function destructuringNeedsFlattening(node) {
        if (ts2.isObjectLiteralExpression(node)) {
          for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
            var elem = _a[_i];
            switch (elem.kind) {
              case 294:
                if (destructuringNeedsFlattening(elem.initializer)) {
                  return true;
                }
                break;
              case 295:
                if (destructuringNeedsFlattening(elem.name)) {
                  return true;
                }
                break;
              case 296:
                if (destructuringNeedsFlattening(elem.expression)) {
                  return true;
                }
                break;
              case 168:
              case 171:
              case 172:
                return false;
              default:
                ts2.Debug.assertNever(elem, "Unhandled object member kind");
            }
          }
        } else if (ts2.isArrayLiteralExpression(node)) {
          for (var _b = 0, _c = node.elements; _b < _c.length; _b++) {
            var elem = _c[_b];
            if (ts2.isSpreadElement(elem)) {
              if (destructuringNeedsFlattening(elem.expression)) {
                return true;
              }
            } else if (destructuringNeedsFlattening(elem)) {
              return true;
            }
          }
        } else if (ts2.isIdentifier(node)) {
          return ts2.length(getExports(node)) > (ts2.isExportName(node) ? 1 : 0);
        }
        return false;
      }
      function visitDestructuringAssignment(node, valueIsDiscarded) {
        if (destructuringNeedsFlattening(node.left)) {
          return ts2.flattenDestructuringAssignment(node, visitor, context, 0, !valueIsDiscarded, createAllExportExpressions);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitForStatement(node) {
        return factory.updateForStatement(node, ts2.visitNode(node.initializer, discardedValueVisitor, ts2.isForInitializer), ts2.visitNode(node.condition, visitor, ts2.isExpression), ts2.visitNode(node.incrementor, discardedValueVisitor, ts2.isExpression), ts2.visitIterationBody(node.statement, visitor, context));
      }
      function visitExpressionStatement(node) {
        return factory.updateExpressionStatement(node, ts2.visitNode(node.expression, discardedValueVisitor, ts2.isExpression));
      }
      function visitParenthesizedExpression(node, valueIsDiscarded) {
        return factory.updateParenthesizedExpression(node, ts2.visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, ts2.isExpression));
      }
      function visitPartiallyEmittedExpression(node, valueIsDiscarded) {
        return factory.updatePartiallyEmittedExpression(node, ts2.visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, ts2.isExpression));
      }
      function visitPreOrPostfixUnaryExpression(node, valueIsDiscarded) {
        if ((node.operator === 45 || node.operator === 46) && ts2.isIdentifier(node.operand) && !ts2.isGeneratedIdentifier(node.operand) && !ts2.isLocalName(node.operand) && !ts2.isDeclarationNameOfEnumOrNamespace(node.operand)) {
          var exportedNames = getExports(node.operand);
          if (exportedNames) {
            var temp = void 0;
            var expression = ts2.visitNode(node.operand, visitor, ts2.isExpression);
            if (ts2.isPrefixUnaryExpression(node)) {
              expression = factory.updatePrefixUnaryExpression(node, expression);
            } else {
              expression = factory.updatePostfixUnaryExpression(node, expression);
              if (!valueIsDiscarded) {
                temp = factory.createTempVariable(hoistVariableDeclaration);
                expression = factory.createAssignment(temp, expression);
                ts2.setTextRange(expression, node);
              }
              expression = factory.createComma(expression, factory.cloneNode(node.operand));
              ts2.setTextRange(expression, node);
            }
            for (var _i = 0, exportedNames_1 = exportedNames; _i < exportedNames_1.length; _i++) {
              var exportName = exportedNames_1[_i];
              noSubstitution[ts2.getNodeId(expression)] = true;
              expression = createExportExpression(exportName, expression);
              ts2.setTextRange(expression, node);
            }
            if (temp) {
              noSubstitution[ts2.getNodeId(expression)] = true;
              expression = factory.createComma(expression, temp);
              ts2.setTextRange(expression, node);
            }
            return expression;
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitImportCallExpression(node) {
        var externalModuleName = ts2.getExternalModuleNameLiteral(factory, node, currentSourceFile, host, resolver, compilerOptions);
        var firstArgument = ts2.visitNode(ts2.firstOrUndefined(node.arguments), visitor);
        var argument = externalModuleName && (!firstArgument || !ts2.isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument;
        var containsLexicalThis = !!(node.transformFlags & 8192);
        switch (compilerOptions.module) {
          case ts2.ModuleKind.AMD:
            return createImportCallExpressionAMD(argument, containsLexicalThis);
          case ts2.ModuleKind.UMD:
            return createImportCallExpressionUMD(argument !== null && argument !== void 0 ? argument : factory.createVoidZero(), containsLexicalThis);
          case ts2.ModuleKind.CommonJS:
          default:
            return createImportCallExpressionCommonJS(argument, containsLexicalThis);
        }
      }
      function createImportCallExpressionUMD(arg, containsLexicalThis) {
        needUMDDynamicImportHelper = true;
        if (ts2.isSimpleCopiableExpression(arg)) {
          var argClone = ts2.isGeneratedIdentifier(arg) ? arg : ts2.isStringLiteral(arg) ? factory.createStringLiteralFromNode(arg) : ts2.setEmitFlags(ts2.setTextRange(factory.cloneNode(arg), arg), 1536);
          return factory.createConditionalExpression(factory.createIdentifier("__syncRequire"), void 0, createImportCallExpressionCommonJS(arg, containsLexicalThis), void 0, createImportCallExpressionAMD(argClone, containsLexicalThis));
        } else {
          var temp = factory.createTempVariable(hoistVariableDeclaration);
          return factory.createComma(factory.createAssignment(temp, arg), factory.createConditionalExpression(factory.createIdentifier("__syncRequire"), void 0, createImportCallExpressionCommonJS(temp, containsLexicalThis), void 0, createImportCallExpressionAMD(temp, containsLexicalThis)));
        }
      }
      function createImportCallExpressionAMD(arg, containsLexicalThis) {
        var resolve = factory.createUniqueName("resolve");
        var reject = factory.createUniqueName("reject");
        var parameters = [
          factory.createParameterDeclaration(void 0, void 0, void 0, resolve),
          factory.createParameterDeclaration(void 0, void 0, void 0, reject)
        ];
        var body = factory.createBlock([
          factory.createExpressionStatement(factory.createCallExpression(factory.createIdentifier("require"), void 0, [factory.createArrayLiteralExpression([arg || factory.createOmittedExpression()]), resolve, reject]))
        ]);
        var func;
        if (languageVersion >= 2) {
          func = factory.createArrowFunction(void 0, void 0, parameters, void 0, void 0, body);
        } else {
          func = factory.createFunctionExpression(void 0, void 0, void 0, void 0, parameters, void 0, body);
          if (containsLexicalThis) {
            ts2.setEmitFlags(func, 8);
          }
        }
        var promise = factory.createNewExpression(factory.createIdentifier("Promise"), void 0, [func]);
        if (ts2.getESModuleInterop(compilerOptions)) {
          return factory.createCallExpression(factory.createPropertyAccessExpression(promise, factory.createIdentifier("then")), void 0, [emitHelpers().createImportStarCallbackHelper()]);
        }
        return promise;
      }
      function createImportCallExpressionCommonJS(arg, containsLexicalThis) {
        var promiseResolveCall = factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("Promise"), "resolve"), void 0, []);
        var requireCall = factory.createCallExpression(factory.createIdentifier("require"), void 0, arg ? [arg] : []);
        if (ts2.getESModuleInterop(compilerOptions)) {
          requireCall = emitHelpers().createImportStarHelper(requireCall);
        }
        var func;
        if (languageVersion >= 2) {
          func = factory.createArrowFunction(void 0, void 0, [], void 0, void 0, requireCall);
        } else {
          func = factory.createFunctionExpression(void 0, void 0, void 0, void 0, [], void 0, factory.createBlock([factory.createReturnStatement(requireCall)]));
          if (containsLexicalThis) {
            ts2.setEmitFlags(func, 8);
          }
        }
        return factory.createCallExpression(factory.createPropertyAccessExpression(promiseResolveCall, "then"), void 0, [func]);
      }
      function getHelperExpressionForExport(node, innerExpr) {
        if (!ts2.getESModuleInterop(compilerOptions) || ts2.getEmitFlags(node) & 67108864) {
          return innerExpr;
        }
        if (ts2.getExportNeedsImportStarHelper(node)) {
          return emitHelpers().createImportStarHelper(innerExpr);
        }
        return innerExpr;
      }
      function getHelperExpressionForImport(node, innerExpr) {
        if (!ts2.getESModuleInterop(compilerOptions) || ts2.getEmitFlags(node) & 67108864) {
          return innerExpr;
        }
        if (ts2.getImportNeedsImportStarHelper(node)) {
          return emitHelpers().createImportStarHelper(innerExpr);
        }
        if (ts2.getImportNeedsImportDefaultHelper(node)) {
          return emitHelpers().createImportDefaultHelper(innerExpr);
        }
        return innerExpr;
      }
      function visitImportDeclaration(node) {
        var statements;
        var namespaceDeclaration = ts2.getNamespaceDeclarationNode(node);
        if (moduleKind !== ts2.ModuleKind.AMD) {
          if (!node.importClause) {
            return ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(createRequireCall(node)), node), node);
          } else {
            var variables = [];
            if (namespaceDeclaration && !ts2.isDefaultImport(node)) {
              variables.push(factory.createVariableDeclaration(factory.cloneNode(namespaceDeclaration.name), void 0, void 0, getHelperExpressionForImport(node, createRequireCall(node))));
            } else {
              variables.push(factory.createVariableDeclaration(factory.getGeneratedNameForNode(node), void 0, void 0, getHelperExpressionForImport(node, createRequireCall(node))));
              if (namespaceDeclaration && ts2.isDefaultImport(node)) {
                variables.push(factory.createVariableDeclaration(factory.cloneNode(namespaceDeclaration.name), void 0, void 0, factory.getGeneratedNameForNode(node)));
              }
            }
            statements = ts2.append(statements, ts2.setOriginalNode(ts2.setTextRange(factory.createVariableStatement(void 0, factory.createVariableDeclarationList(variables, languageVersion >= 2 ? 2 : 0)), node), node));
          }
        } else if (namespaceDeclaration && ts2.isDefaultImport(node)) {
          statements = ts2.append(statements, factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
            ts2.setOriginalNode(ts2.setTextRange(factory.createVariableDeclaration(factory.cloneNode(namespaceDeclaration.name), void 0, void 0, factory.getGeneratedNameForNode(node)), node), node)
          ], languageVersion >= 2 ? 2 : 0)));
        }
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfImportDeclaration(deferredExports[id], node);
        } else {
          statements = appendExportsOfImportDeclaration(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function createRequireCall(importNode) {
        var moduleName = ts2.getExternalModuleNameLiteral(factory, importNode, currentSourceFile, host, resolver, compilerOptions);
        var args = [];
        if (moduleName) {
          args.push(moduleName);
        }
        return factory.createCallExpression(factory.createIdentifier("require"), void 0, args);
      }
      function visitImportEqualsDeclaration(node) {
        ts2.Debug.assert(ts2.isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
        var statements;
        if (moduleKind !== ts2.ModuleKind.AMD) {
          if (ts2.hasSyntacticModifier(node, 1)) {
            statements = ts2.append(statements, ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(createExportExpression(node.name, createRequireCall(node))), node), node));
          } else {
            statements = ts2.append(statements, ts2.setOriginalNode(ts2.setTextRange(factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
              factory.createVariableDeclaration(factory.cloneNode(node.name), void 0, void 0, createRequireCall(node))
            ], languageVersion >= 2 ? 2 : 0)), node), node));
          }
        } else {
          if (ts2.hasSyntacticModifier(node, 1)) {
            statements = ts2.append(statements, ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(createExportExpression(factory.getExportName(node), factory.getLocalName(node))), node), node));
          }
        }
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfImportEqualsDeclaration(deferredExports[id], node);
        } else {
          statements = appendExportsOfImportEqualsDeclaration(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function visitExportDeclaration(node) {
        if (!node.moduleSpecifier) {
          return void 0;
        }
        var generatedName = factory.getGeneratedNameForNode(node);
        if (node.exportClause && ts2.isNamedExports(node.exportClause)) {
          var statements = [];
          if (moduleKind !== ts2.ModuleKind.AMD) {
            statements.push(ts2.setOriginalNode(ts2.setTextRange(factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
              factory.createVariableDeclaration(generatedName, void 0, void 0, createRequireCall(node))
            ])), node), node));
          }
          for (var _i = 0, _a = node.exportClause.elements; _i < _a.length; _i++) {
            var specifier = _a[_i];
            if (languageVersion === 0) {
              statements.push(ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(emitHelpers().createCreateBindingHelper(generatedName, factory.createStringLiteralFromNode(specifier.propertyName || specifier.name), specifier.propertyName ? factory.createStringLiteralFromNode(specifier.name) : void 0)), specifier), specifier));
            } else {
              var exportNeedsImportDefault = !!ts2.getESModuleInterop(compilerOptions) && !(ts2.getEmitFlags(node) & 67108864) && ts2.idText(specifier.propertyName || specifier.name) === "default";
              var exportedValue = factory.createPropertyAccessExpression(exportNeedsImportDefault ? emitHelpers().createImportDefaultHelper(generatedName) : generatedName, specifier.propertyName || specifier.name);
              statements.push(ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(createExportExpression(factory.getExportName(specifier), exportedValue, void 0, true)), specifier), specifier));
            }
          }
          return ts2.singleOrMany(statements);
        } else if (node.exportClause) {
          var statements = [];
          statements.push(ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(createExportExpression(factory.cloneNode(node.exportClause.name), getHelperExpressionForExport(node, moduleKind !== ts2.ModuleKind.AMD ? createRequireCall(node) : ts2.isExportNamespaceAsDefaultDeclaration(node) ? generatedName : factory.createIdentifier(ts2.idText(node.exportClause.name))))), node), node));
          return ts2.singleOrMany(statements);
        } else {
          return ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(emitHelpers().createExportStarHelper(moduleKind !== ts2.ModuleKind.AMD ? createRequireCall(node) : generatedName)), node), node);
        }
      }
      function visitExportAssignment(node) {
        if (node.isExportEquals) {
          return void 0;
        }
        var statements;
        var original = node.original;
        if (original && hasAssociatedEndOfDeclarationMarker(original)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportStatement(deferredExports[id], factory.createIdentifier("default"), ts2.visitNode(node.expression, visitor), node, true);
        } else {
          statements = appendExportStatement(statements, factory.createIdentifier("default"), ts2.visitNode(node.expression, visitor), node, true);
        }
        return ts2.singleOrMany(statements);
      }
      function visitFunctionDeclaration(node) {
        var statements;
        if (ts2.hasSyntacticModifier(node, 1)) {
          statements = ts2.append(statements, ts2.setOriginalNode(ts2.setTextRange(factory.createFunctionDeclaration(void 0, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), node.asteriskToken, factory.getDeclarationName(node, true, true), void 0, ts2.visitNodes(node.parameters, visitor), void 0, ts2.visitEachChild(node.body, visitor, context)), node), node));
        } else {
          statements = ts2.append(statements, ts2.visitEachChild(node, visitor, context));
        }
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfHoistedDeclaration(deferredExports[id], node);
        } else {
          statements = appendExportsOfHoistedDeclaration(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function visitClassDeclaration(node) {
        var statements;
        if (ts2.hasSyntacticModifier(node, 1)) {
          statements = ts2.append(statements, ts2.setOriginalNode(ts2.setTextRange(factory.createClassDeclaration(void 0, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), factory.getDeclarationName(node, true, true), void 0, ts2.visitNodes(node.heritageClauses, visitor), ts2.visitNodes(node.members, visitor)), node), node));
        } else {
          statements = ts2.append(statements, ts2.visitEachChild(node, visitor, context));
        }
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfHoistedDeclaration(deferredExports[id], node);
        } else {
          statements = appendExportsOfHoistedDeclaration(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function visitVariableStatement(node) {
        var statements;
        var variables;
        var expressions;
        if (ts2.hasSyntacticModifier(node, 1)) {
          var modifiers = void 0;
          var removeCommentsOnExpressions = false;
          for (var _i = 0, _a = node.declarationList.declarations; _i < _a.length; _i++) {
            var variable = _a[_i];
            if (ts2.isIdentifier(variable.name) && ts2.isLocalName(variable.name)) {
              if (!modifiers) {
                modifiers = ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier);
              }
              variables = ts2.append(variables, variable);
            } else if (variable.initializer) {
              if (!ts2.isBindingPattern(variable.name) && (ts2.isArrowFunction(variable.initializer) || ts2.isFunctionExpression(variable.initializer) || ts2.isClassExpression(variable.initializer))) {
                var expression = factory.createAssignment(ts2.setTextRange(factory.createPropertyAccessExpression(factory.createIdentifier("exports"), variable.name), variable.name), factory.createIdentifier(ts2.getTextOfIdentifierOrLiteral(variable.name)));
                var updatedVariable = factory.createVariableDeclaration(variable.name, variable.exclamationToken, variable.type, ts2.visitNode(variable.initializer, visitor));
                variables = ts2.append(variables, updatedVariable);
                expressions = ts2.append(expressions, expression);
                removeCommentsOnExpressions = true;
              } else {
                expressions = ts2.append(expressions, transformInitializedVariable(variable));
              }
            }
          }
          if (variables) {
            statements = ts2.append(statements, factory.updateVariableStatement(node, modifiers, factory.updateVariableDeclarationList(node.declarationList, variables)));
          }
          if (expressions) {
            var statement = ts2.setOriginalNode(ts2.setTextRange(factory.createExpressionStatement(factory.inlineExpressions(expressions)), node), node);
            if (removeCommentsOnExpressions) {
              ts2.removeAllComments(statement);
            }
            statements = ts2.append(statements, statement);
          }
        } else {
          statements = ts2.append(statements, ts2.visitEachChild(node, visitor, context));
        }
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfVariableStatement(deferredExports[id], node);
        } else {
          statements = appendExportsOfVariableStatement(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function createAllExportExpressions(name, value, location) {
        var exportedNames = getExports(name);
        if (exportedNames) {
          var expression = ts2.isExportName(name) ? value : factory.createAssignment(name, value);
          for (var _i = 0, exportedNames_2 = exportedNames; _i < exportedNames_2.length; _i++) {
            var exportName = exportedNames_2[_i];
            ts2.setEmitFlags(expression, 4);
            expression = createExportExpression(exportName, expression, location);
          }
          return expression;
        }
        return factory.createAssignment(name, value);
      }
      function transformInitializedVariable(node) {
        if (ts2.isBindingPattern(node.name)) {
          return ts2.flattenDestructuringAssignment(ts2.visitNode(node, visitor), void 0, context, 0, false, createAllExportExpressions);
        } else {
          return factory.createAssignment(ts2.setTextRange(factory.createPropertyAccessExpression(factory.createIdentifier("exports"), node.name), node.name), node.initializer ? ts2.visitNode(node.initializer, visitor) : factory.createVoidZero());
        }
      }
      function visitMergeDeclarationMarker(node) {
        if (hasAssociatedEndOfDeclarationMarker(node) && node.original.kind === 236) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfVariableStatement(deferredExports[id], node.original);
        }
        return node;
      }
      function hasAssociatedEndOfDeclarationMarker(node) {
        return (ts2.getEmitFlags(node) & 4194304) !== 0;
      }
      function visitEndOfDeclarationMarker(node) {
        var id = ts2.getOriginalNodeId(node);
        var statements = deferredExports[id];
        if (statements) {
          delete deferredExports[id];
          return ts2.append(statements, node);
        }
        return node;
      }
      function appendExportsOfImportDeclaration(statements, decl) {
        if (currentModuleInfo.exportEquals) {
          return statements;
        }
        var importClause = decl.importClause;
        if (!importClause) {
          return statements;
        }
        if (importClause.name) {
          statements = appendExportsOfDeclaration(statements, importClause);
        }
        var namedBindings = importClause.namedBindings;
        if (namedBindings) {
          switch (namedBindings.kind) {
            case 267:
              statements = appendExportsOfDeclaration(statements, namedBindings);
              break;
            case 268:
              for (var _i = 0, _a = namedBindings.elements; _i < _a.length; _i++) {
                var importBinding = _a[_i];
                statements = appendExportsOfDeclaration(statements, importBinding, true);
              }
              break;
          }
        }
        return statements;
      }
      function appendExportsOfImportEqualsDeclaration(statements, decl) {
        if (currentModuleInfo.exportEquals) {
          return statements;
        }
        return appendExportsOfDeclaration(statements, decl);
      }
      function appendExportsOfVariableStatement(statements, node) {
        if (currentModuleInfo.exportEquals) {
          return statements;
        }
        for (var _i = 0, _a = node.declarationList.declarations; _i < _a.length; _i++) {
          var decl = _a[_i];
          statements = appendExportsOfBindingElement(statements, decl);
        }
        return statements;
      }
      function appendExportsOfBindingElement(statements, decl) {
        if (currentModuleInfo.exportEquals) {
          return statements;
        }
        if (ts2.isBindingPattern(decl.name)) {
          for (var _i = 0, _a = decl.name.elements; _i < _a.length; _i++) {
            var element = _a[_i];
            if (!ts2.isOmittedExpression(element)) {
              statements = appendExportsOfBindingElement(statements, element);
            }
          }
        } else if (!ts2.isGeneratedIdentifier(decl.name)) {
          statements = appendExportsOfDeclaration(statements, decl);
        }
        return statements;
      }
      function appendExportsOfHoistedDeclaration(statements, decl) {
        if (currentModuleInfo.exportEquals) {
          return statements;
        }
        if (ts2.hasSyntacticModifier(decl, 1)) {
          var exportName = ts2.hasSyntacticModifier(decl, 512) ? factory.createIdentifier("default") : factory.getDeclarationName(decl);
          statements = appendExportStatement(statements, exportName, factory.getLocalName(decl), decl);
        }
        if (decl.name) {
          statements = appendExportsOfDeclaration(statements, decl);
        }
        return statements;
      }
      function appendExportsOfDeclaration(statements, decl, liveBinding) {
        var name = factory.getDeclarationName(decl);
        var exportSpecifiers = currentModuleInfo.exportSpecifiers.get(ts2.idText(name));
        if (exportSpecifiers) {
          for (var _i = 0, exportSpecifiers_1 = exportSpecifiers; _i < exportSpecifiers_1.length; _i++) {
            var exportSpecifier = exportSpecifiers_1[_i];
            statements = appendExportStatement(statements, exportSpecifier.name, name, exportSpecifier.name, void 0, liveBinding);
          }
        }
        return statements;
      }
      function appendExportStatement(statements, exportName, expression, location, allowComments, liveBinding) {
        statements = ts2.append(statements, createExportStatement(exportName, expression, location, allowComments, liveBinding));
        return statements;
      }
      function createUnderscoreUnderscoreESModule() {
        var statement;
        if (languageVersion === 0) {
          statement = factory.createExpressionStatement(createExportExpression(factory.createIdentifier("__esModule"), factory.createTrue()));
        } else {
          statement = factory.createExpressionStatement(factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("Object"), "defineProperty"), void 0, [
            factory.createIdentifier("exports"),
            factory.createStringLiteral("__esModule"),
            factory.createObjectLiteralExpression([
              factory.createPropertyAssignment("value", factory.createTrue())
            ])
          ]));
        }
        ts2.setEmitFlags(statement, 1048576);
        return statement;
      }
      function createExportStatement(name, value, location, allowComments, liveBinding) {
        var statement = ts2.setTextRange(factory.createExpressionStatement(createExportExpression(name, value, void 0, liveBinding)), location);
        ts2.startOnNewLine(statement);
        if (!allowComments) {
          ts2.setEmitFlags(statement, 1536);
        }
        return statement;
      }
      function createExportExpression(name, value, location, liveBinding) {
        return ts2.setTextRange(liveBinding && languageVersion !== 0 ? factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("Object"), "defineProperty"), void 0, [
          factory.createIdentifier("exports"),
          factory.createStringLiteralFromNode(name),
          factory.createObjectLiteralExpression([
            factory.createPropertyAssignment("enumerable", factory.createTrue()),
            factory.createPropertyAssignment("get", factory.createFunctionExpression(void 0, void 0, void 0, void 0, [], void 0, factory.createBlock([factory.createReturnStatement(value)])))
          ])
        ]) : factory.createAssignment(factory.createPropertyAccessExpression(factory.createIdentifier("exports"), factory.cloneNode(name)), value), location);
      }
      function modifierVisitor(node) {
        switch (node.kind) {
          case 93:
          case 88:
            return void 0;
        }
        return node;
      }
      function onEmitNode(hint, node, emitCallback) {
        if (node.kind === 303) {
          currentSourceFile = node;
          currentModuleInfo = moduleInfoMap[ts2.getOriginalNodeId(currentSourceFile)];
          previousOnEmitNode(hint, node, emitCallback);
          currentSourceFile = void 0;
          currentModuleInfo = void 0;
        } else {
          previousOnEmitNode(hint, node, emitCallback);
        }
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (node.id && noSubstitution[node.id]) {
          return node;
        }
        if (hint === 1) {
          return substituteExpression(node);
        } else if (ts2.isShorthandPropertyAssignment(node)) {
          return substituteShorthandPropertyAssignment(node);
        }
        return node;
      }
      function substituteShorthandPropertyAssignment(node) {
        var name = node.name;
        var exportedOrImportedName = substituteExpressionIdentifier(name);
        if (exportedOrImportedName !== name) {
          if (node.objectAssignmentInitializer) {
            var initializer = factory.createAssignment(exportedOrImportedName, node.objectAssignmentInitializer);
            return ts2.setTextRange(factory.createPropertyAssignment(name, initializer), node);
          }
          return ts2.setTextRange(factory.createPropertyAssignment(name, exportedOrImportedName), node);
        }
        return node;
      }
      function substituteExpression(node) {
        switch (node.kind) {
          case 79:
            return substituteExpressionIdentifier(node);
          case 207:
            return substituteCallExpression(node);
          case 209:
            return substituteTaggedTemplateExpression(node);
          case 220:
            return substituteBinaryExpression(node);
        }
        return node;
      }
      function substituteCallExpression(node) {
        if (ts2.isIdentifier(node.expression)) {
          var expression = substituteExpressionIdentifier(node.expression);
          noSubstitution[ts2.getNodeId(expression)] = true;
          if (!ts2.isIdentifier(expression)) {
            return ts2.addEmitFlags(factory.updateCallExpression(node, expression, void 0, node.arguments), 536870912);
          }
        }
        return node;
      }
      function substituteTaggedTemplateExpression(node) {
        if (ts2.isIdentifier(node.tag)) {
          var tag = substituteExpressionIdentifier(node.tag);
          noSubstitution[ts2.getNodeId(tag)] = true;
          if (!ts2.isIdentifier(tag)) {
            return ts2.addEmitFlags(factory.updateTaggedTemplateExpression(node, tag, void 0, node.template), 536870912);
          }
        }
        return node;
      }
      function substituteExpressionIdentifier(node) {
        var _a, _b;
        if (ts2.getEmitFlags(node) & 4096) {
          var externalHelpersModuleName = ts2.getExternalHelpersModuleName(currentSourceFile);
          if (externalHelpersModuleName) {
            return factory.createPropertyAccessExpression(externalHelpersModuleName, node);
          }
          return node;
        } else if (!(ts2.isGeneratedIdentifier(node) && !(node.autoGenerateFlags & 64)) && !ts2.isLocalName(node)) {
          var exportContainer = resolver.getReferencedExportContainer(node, ts2.isExportName(node));
          if (exportContainer && exportContainer.kind === 303) {
            return ts2.setTextRange(factory.createPropertyAccessExpression(factory.createIdentifier("exports"), factory.cloneNode(node)), node);
          }
          var importDeclaration = resolver.getReferencedImportDeclaration(node);
          if (importDeclaration) {
            if (ts2.isImportClause(importDeclaration)) {
              return ts2.setTextRange(factory.createPropertyAccessExpression(factory.getGeneratedNameForNode(importDeclaration.parent), factory.createIdentifier("default")), node);
            } else if (ts2.isImportSpecifier(importDeclaration)) {
              var name = importDeclaration.propertyName || importDeclaration.name;
              return ts2.setTextRange(factory.createPropertyAccessExpression(factory.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.parent) || importDeclaration), factory.cloneNode(name)), node);
            }
          }
        }
        return node;
      }
      function substituteBinaryExpression(node) {
        if (ts2.isAssignmentOperator(node.operatorToken.kind) && ts2.isIdentifier(node.left) && !ts2.isGeneratedIdentifier(node.left) && !ts2.isLocalName(node.left) && !ts2.isDeclarationNameOfEnumOrNamespace(node.left)) {
          var exportedNames = getExports(node.left);
          if (exportedNames) {
            var expression = node;
            for (var _i = 0, exportedNames_3 = exportedNames; _i < exportedNames_3.length; _i++) {
              var exportName = exportedNames_3[_i];
              noSubstitution[ts2.getNodeId(expression)] = true;
              expression = createExportExpression(exportName, expression, node);
            }
            return expression;
          }
        }
        return node;
      }
      function getExports(name) {
        if (!ts2.isGeneratedIdentifier(name)) {
          var valueDeclaration = resolver.getReferencedImportDeclaration(name) || resolver.getReferencedValueDeclaration(name);
          if (valueDeclaration) {
            return currentModuleInfo && currentModuleInfo.exportedBindings[ts2.getOriginalNodeId(valueDeclaration)];
          }
        }
      }
    }
    ts2.transformModule = transformModule;
    var dynamicImportUMDHelper = {
      name: "typescript:dynamicimport-sync-require",
      scoped: true,
      text: '\n            var __syncRequire = typeof module === "object" && typeof module.exports === "object";'
    };
  })(ts || (ts = {}));
  (function(ts2) {
    function transformSystemModule(context) {
      var factory = context.factory, startLexicalEnvironment = context.startLexicalEnvironment, endLexicalEnvironment = context.endLexicalEnvironment, hoistVariableDeclaration = context.hoistVariableDeclaration;
      var compilerOptions = context.getCompilerOptions();
      var resolver = context.getEmitResolver();
      var host = context.getEmitHost();
      var previousOnSubstituteNode = context.onSubstituteNode;
      var previousOnEmitNode = context.onEmitNode;
      context.onSubstituteNode = onSubstituteNode;
      context.onEmitNode = onEmitNode;
      context.enableSubstitution(79);
      context.enableSubstitution(295);
      context.enableSubstitution(220);
      context.enableSubstitution(230);
      context.enableEmitNotification(303);
      var moduleInfoMap = [];
      var deferredExports = [];
      var exportFunctionsMap = [];
      var noSubstitutionMap = [];
      var contextObjectMap = [];
      var currentSourceFile;
      var moduleInfo;
      var exportFunction;
      var contextObject;
      var hoistedStatements;
      var enclosingBlockScopedContainer;
      var noSubstitution;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile || !(ts2.isEffectiveExternalModule(node, compilerOptions) || node.transformFlags & 4194304)) {
          return node;
        }
        var id = ts2.getOriginalNodeId(node);
        currentSourceFile = node;
        enclosingBlockScopedContainer = node;
        moduleInfo = moduleInfoMap[id] = ts2.collectExternalModuleInfo(context, node, resolver, compilerOptions);
        exportFunction = factory.createUniqueName("exports");
        exportFunctionsMap[id] = exportFunction;
        contextObject = contextObjectMap[id] = factory.createUniqueName("context");
        var dependencyGroups = collectDependencyGroups(moduleInfo.externalImports);
        var moduleBodyBlock = createSystemModuleBody(node, dependencyGroups);
        var moduleBodyFunction = factory.createFunctionExpression(void 0, void 0, void 0, void 0, [
          factory.createParameterDeclaration(void 0, void 0, void 0, exportFunction),
          factory.createParameterDeclaration(void 0, void 0, void 0, contextObject)
        ], void 0, moduleBodyBlock);
        var moduleName = ts2.tryGetModuleNameFromFile(factory, node, host, compilerOptions);
        var dependencies = factory.createArrayLiteralExpression(ts2.map(dependencyGroups, function(dependencyGroup) {
          return dependencyGroup.name;
        }));
        var updated = ts2.setEmitFlags(factory.updateSourceFile(node, ts2.setTextRange(factory.createNodeArray([
          factory.createExpressionStatement(factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("System"), "register"), void 0, moduleName ? [moduleName, dependencies, moduleBodyFunction] : [dependencies, moduleBodyFunction]))
        ]), node.statements)), 1024);
        if (!ts2.outFile(compilerOptions)) {
          ts2.moveEmitHelpers(updated, moduleBodyBlock, function(helper) {
            return !helper.scoped;
          });
        }
        if (noSubstitution) {
          noSubstitutionMap[id] = noSubstitution;
          noSubstitution = void 0;
        }
        currentSourceFile = void 0;
        moduleInfo = void 0;
        exportFunction = void 0;
        contextObject = void 0;
        hoistedStatements = void 0;
        enclosingBlockScopedContainer = void 0;
        return updated;
      }
      function collectDependencyGroups(externalImports) {
        var groupIndices = new ts2.Map();
        var dependencyGroups = [];
        for (var _i = 0, externalImports_1 = externalImports; _i < externalImports_1.length; _i++) {
          var externalImport = externalImports_1[_i];
          var externalModuleName = ts2.getExternalModuleNameLiteral(factory, externalImport, currentSourceFile, host, resolver, compilerOptions);
          if (externalModuleName) {
            var text = externalModuleName.text;
            var groupIndex = groupIndices.get(text);
            if (groupIndex !== void 0) {
              dependencyGroups[groupIndex].externalImports.push(externalImport);
            } else {
              groupIndices.set(text, dependencyGroups.length);
              dependencyGroups.push({
                name: externalModuleName,
                externalImports: [externalImport]
              });
            }
          }
        }
        return dependencyGroups;
      }
      function createSystemModuleBody(node, dependencyGroups) {
        var statements = [];
        startLexicalEnvironment();
        var ensureUseStrict = ts2.getStrictOptionValue(compilerOptions, "alwaysStrict") || !compilerOptions.noImplicitUseStrict && ts2.isExternalModule(currentSourceFile);
        var statementOffset = factory.copyPrologue(node.statements, statements, ensureUseStrict, topLevelVisitor);
        statements.push(factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
          factory.createVariableDeclaration("__moduleName", void 0, void 0, factory.createLogicalAnd(contextObject, factory.createPropertyAccessExpression(contextObject, "id")))
        ])));
        ts2.visitNode(moduleInfo.externalHelpersImportDeclaration, topLevelVisitor, ts2.isStatement);
        var executeStatements = ts2.visitNodes(node.statements, topLevelVisitor, ts2.isStatement, statementOffset);
        ts2.addRange(statements, hoistedStatements);
        ts2.insertStatementsAfterStandardPrologue(statements, endLexicalEnvironment());
        var exportStarFunction = addExportStarIfNeeded(statements);
        var modifiers = node.transformFlags & 1048576 ? factory.createModifiersFromModifierFlags(256) : void 0;
        var moduleObject = factory.createObjectLiteralExpression([
          factory.createPropertyAssignment("setters", createSettersArray(exportStarFunction, dependencyGroups)),
          factory.createPropertyAssignment("execute", factory.createFunctionExpression(modifiers, void 0, void 0, void 0, [], void 0, factory.createBlock(executeStatements, true)))
        ], true);
        statements.push(factory.createReturnStatement(moduleObject));
        return factory.createBlock(statements, true);
      }
      function addExportStarIfNeeded(statements) {
        if (!moduleInfo.hasExportStarsToExportValues) {
          return;
        }
        if (!moduleInfo.exportedNames && moduleInfo.exportSpecifiers.size === 0) {
          var hasExportDeclarationWithExportClause = false;
          for (var _i = 0, _a = moduleInfo.externalImports; _i < _a.length; _i++) {
            var externalImport = _a[_i];
            if (externalImport.kind === 271 && externalImport.exportClause) {
              hasExportDeclarationWithExportClause = true;
              break;
            }
          }
          if (!hasExportDeclarationWithExportClause) {
            var exportStarFunction_1 = createExportStarFunction(void 0);
            statements.push(exportStarFunction_1);
            return exportStarFunction_1.name;
          }
        }
        var exportedNames = [];
        if (moduleInfo.exportedNames) {
          for (var _b = 0, _c = moduleInfo.exportedNames; _b < _c.length; _b++) {
            var exportedLocalName = _c[_b];
            if (exportedLocalName.escapedText === "default") {
              continue;
            }
            exportedNames.push(factory.createPropertyAssignment(factory.createStringLiteralFromNode(exportedLocalName), factory.createTrue()));
          }
        }
        var exportedNamesStorageRef = factory.createUniqueName("exportedNames");
        statements.push(factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
          factory.createVariableDeclaration(exportedNamesStorageRef, void 0, void 0, factory.createObjectLiteralExpression(exportedNames, true))
        ])));
        var exportStarFunction = createExportStarFunction(exportedNamesStorageRef);
        statements.push(exportStarFunction);
        return exportStarFunction.name;
      }
      function createExportStarFunction(localNames) {
        var exportStarFunction = factory.createUniqueName("exportStar");
        var m = factory.createIdentifier("m");
        var n = factory.createIdentifier("n");
        var exports = factory.createIdentifier("exports");
        var condition = factory.createStrictInequality(n, factory.createStringLiteral("default"));
        if (localNames) {
          condition = factory.createLogicalAnd(condition, factory.createLogicalNot(factory.createCallExpression(factory.createPropertyAccessExpression(localNames, "hasOwnProperty"), void 0, [n])));
        }
        return factory.createFunctionDeclaration(void 0, void 0, void 0, exportStarFunction, void 0, [factory.createParameterDeclaration(void 0, void 0, void 0, m)], void 0, factory.createBlock([
          factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
            factory.createVariableDeclaration(exports, void 0, void 0, factory.createObjectLiteralExpression([]))
          ])),
          factory.createForInStatement(factory.createVariableDeclarationList([
            factory.createVariableDeclaration(n)
          ]), m, factory.createBlock([
            ts2.setEmitFlags(factory.createIfStatement(condition, factory.createExpressionStatement(factory.createAssignment(factory.createElementAccessExpression(exports, n), factory.createElementAccessExpression(m, n)))), 1)
          ])),
          factory.createExpressionStatement(factory.createCallExpression(exportFunction, void 0, [exports]))
        ], true));
      }
      function createSettersArray(exportStarFunction, dependencyGroups) {
        var setters = [];
        for (var _i = 0, dependencyGroups_1 = dependencyGroups; _i < dependencyGroups_1.length; _i++) {
          var group_2 = dependencyGroups_1[_i];
          var localName = ts2.forEach(group_2.externalImports, function(i) {
            return ts2.getLocalNameForExternalImport(factory, i, currentSourceFile);
          });
          var parameterName = localName ? factory.getGeneratedNameForNode(localName) : factory.createUniqueName("");
          var statements = [];
          for (var _a = 0, _b = group_2.externalImports; _a < _b.length; _a++) {
            var entry = _b[_a];
            var importVariableName = ts2.getLocalNameForExternalImport(factory, entry, currentSourceFile);
            switch (entry.kind) {
              case 265:
                if (!entry.importClause) {
                  break;
                }
              case 264:
                ts2.Debug.assert(importVariableName !== void 0);
                statements.push(factory.createExpressionStatement(factory.createAssignment(importVariableName, parameterName)));
                break;
              case 271:
                ts2.Debug.assert(importVariableName !== void 0);
                if (entry.exportClause) {
                  if (ts2.isNamedExports(entry.exportClause)) {
                    var properties = [];
                    for (var _c = 0, _d = entry.exportClause.elements; _c < _d.length; _c++) {
                      var e = _d[_c];
                      properties.push(factory.createPropertyAssignment(factory.createStringLiteral(ts2.idText(e.name)), factory.createElementAccessExpression(parameterName, factory.createStringLiteral(ts2.idText(e.propertyName || e.name)))));
                    }
                    statements.push(factory.createExpressionStatement(factory.createCallExpression(exportFunction, void 0, [factory.createObjectLiteralExpression(properties, true)])));
                  } else {
                    statements.push(factory.createExpressionStatement(factory.createCallExpression(exportFunction, void 0, [
                      factory.createStringLiteral(ts2.idText(entry.exportClause.name)),
                      parameterName
                    ])));
                  }
                } else {
                  statements.push(factory.createExpressionStatement(factory.createCallExpression(exportStarFunction, void 0, [parameterName])));
                }
                break;
            }
          }
          setters.push(factory.createFunctionExpression(void 0, void 0, void 0, void 0, [factory.createParameterDeclaration(void 0, void 0, void 0, parameterName)], void 0, factory.createBlock(statements, true)));
        }
        return factory.createArrayLiteralExpression(setters, true);
      }
      function topLevelVisitor(node) {
        switch (node.kind) {
          case 265:
            return visitImportDeclaration(node);
          case 264:
            return visitImportEqualsDeclaration(node);
          case 271:
            return visitExportDeclaration(node);
          case 270:
            return visitExportAssignment(node);
          default:
            return topLevelNestedVisitor(node);
        }
      }
      function visitImportDeclaration(node) {
        var statements;
        if (node.importClause) {
          hoistVariableDeclaration(ts2.getLocalNameForExternalImport(factory, node, currentSourceFile));
        }
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfImportDeclaration(deferredExports[id], node);
        } else {
          statements = appendExportsOfImportDeclaration(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function visitExportDeclaration(node) {
        ts2.Debug.assertIsDefined(node);
        return void 0;
      }
      function visitImportEqualsDeclaration(node) {
        ts2.Debug.assert(ts2.isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
        var statements;
        hoistVariableDeclaration(ts2.getLocalNameForExternalImport(factory, node, currentSourceFile));
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfImportEqualsDeclaration(deferredExports[id], node);
        } else {
          statements = appendExportsOfImportEqualsDeclaration(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function visitExportAssignment(node) {
        if (node.isExportEquals) {
          return void 0;
        }
        var expression = ts2.visitNode(node.expression, visitor, ts2.isExpression);
        var original = node.original;
        if (original && hasAssociatedEndOfDeclarationMarker(original)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportStatement(deferredExports[id], factory.createIdentifier("default"), expression, true);
        } else {
          return createExportStatement(factory.createIdentifier("default"), expression, true);
        }
      }
      function visitFunctionDeclaration(node) {
        if (ts2.hasSyntacticModifier(node, 1)) {
          hoistedStatements = ts2.append(hoistedStatements, factory.updateFunctionDeclaration(node, node.decorators, ts2.visitNodes(node.modifiers, modifierVisitor, ts2.isModifier), node.asteriskToken, factory.getDeclarationName(node, true, true), void 0, ts2.visitNodes(node.parameters, visitor, ts2.isParameterDeclaration), void 0, ts2.visitNode(node.body, visitor, ts2.isBlock)));
        } else {
          hoistedStatements = ts2.append(hoistedStatements, ts2.visitEachChild(node, visitor, context));
        }
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfHoistedDeclaration(deferredExports[id], node);
        } else {
          hoistedStatements = appendExportsOfHoistedDeclaration(hoistedStatements, node);
        }
        return void 0;
      }
      function visitClassDeclaration(node) {
        var statements;
        var name = factory.getLocalName(node);
        hoistVariableDeclaration(name);
        statements = ts2.append(statements, ts2.setTextRange(factory.createExpressionStatement(factory.createAssignment(name, ts2.setTextRange(factory.createClassExpression(ts2.visitNodes(node.decorators, visitor, ts2.isDecorator), void 0, node.name, void 0, ts2.visitNodes(node.heritageClauses, visitor, ts2.isHeritageClause), ts2.visitNodes(node.members, visitor, ts2.isClassElement)), node))), node));
        if (hasAssociatedEndOfDeclarationMarker(node)) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfHoistedDeclaration(deferredExports[id], node);
        } else {
          statements = appendExportsOfHoistedDeclaration(statements, node);
        }
        return ts2.singleOrMany(statements);
      }
      function visitVariableStatement(node) {
        if (!shouldHoistVariableDeclarationList(node.declarationList)) {
          return ts2.visitNode(node, visitor, ts2.isStatement);
        }
        var expressions;
        var isExportedDeclaration = ts2.hasSyntacticModifier(node, 1);
        var isMarkedDeclaration = hasAssociatedEndOfDeclarationMarker(node);
        for (var _i = 0, _a = node.declarationList.declarations; _i < _a.length; _i++) {
          var variable = _a[_i];
          if (variable.initializer) {
            expressions = ts2.append(expressions, transformInitializedVariable(variable, isExportedDeclaration && !isMarkedDeclaration));
          } else {
            hoistBindingElement(variable);
          }
        }
        var statements;
        if (expressions) {
          statements = ts2.append(statements, ts2.setTextRange(factory.createExpressionStatement(factory.inlineExpressions(expressions)), node));
        }
        if (isMarkedDeclaration) {
          var id = ts2.getOriginalNodeId(node);
          deferredExports[id] = appendExportsOfVariableStatement(deferredExports[id], node, isExportedDeclaration);
        } else {
          statements = appendExportsOfVariableStatement(statements, node, false);
        }
        return ts2.singleOrMany(statements);
      }
      function hoistBindingElement(node) {
        if (ts2.isBindingPattern(node.name)) {
          for (var _i = 0, _a = node.name.elements; _i < _a.length; _i++) {
            var element = _a[_i];
            if (!ts2.isOmittedExpression(element)) {
              hoistBindingElement(element);
            }
          }
        } else {
          hoistVariableDeclaration(factory.cloneNode(node.name));
        }
      }
      function shouldHoistVariableDeclarationList(node) {
        return (ts2.getEmitFlags(node) & 2097152) === 0 && (enclosingBlockScopedContainer.kind === 303 || (ts2.getOriginalNode(node).flags & 3) === 0);
      }
      function transformInitializedVariable(node, isExportedDeclaration) {
        var createAssignment = isExportedDeclaration ? createExportedVariableAssignment : createNonExportedVariableAssignment;
        return ts2.isBindingPattern(node.name) ? ts2.flattenDestructuringAssignment(node, visitor, context, 0, false, createAssignment) : node.initializer ? createAssignment(node.name, ts2.visitNode(node.initializer, visitor, ts2.isExpression)) : node.name;
      }
      function createExportedVariableAssignment(name, value, location) {
        return createVariableAssignment(name, value, location, true);
      }
      function createNonExportedVariableAssignment(name, value, location) {
        return createVariableAssignment(name, value, location, false);
      }
      function createVariableAssignment(name, value, location, isExportedDeclaration) {
        hoistVariableDeclaration(factory.cloneNode(name));
        return isExportedDeclaration ? createExportExpression(name, preventSubstitution(ts2.setTextRange(factory.createAssignment(name, value), location))) : preventSubstitution(ts2.setTextRange(factory.createAssignment(name, value), location));
      }
      function visitMergeDeclarationMarker(node) {
        if (hasAssociatedEndOfDeclarationMarker(node) && node.original.kind === 236) {
          var id = ts2.getOriginalNodeId(node);
          var isExportedDeclaration = ts2.hasSyntacticModifier(node.original, 1);
          deferredExports[id] = appendExportsOfVariableStatement(deferredExports[id], node.original, isExportedDeclaration);
        }
        return node;
      }
      function hasAssociatedEndOfDeclarationMarker(node) {
        return (ts2.getEmitFlags(node) & 4194304) !== 0;
      }
      function visitEndOfDeclarationMarker(node) {
        var id = ts2.getOriginalNodeId(node);
        var statements = deferredExports[id];
        if (statements) {
          delete deferredExports[id];
          return ts2.append(statements, node);
        } else {
          var original = ts2.getOriginalNode(node);
          if (ts2.isModuleOrEnumDeclaration(original)) {
            return ts2.append(appendExportsOfDeclaration(statements, original), node);
          }
        }
        return node;
      }
      function appendExportsOfImportDeclaration(statements, decl) {
        if (moduleInfo.exportEquals) {
          return statements;
        }
        var importClause = decl.importClause;
        if (!importClause) {
          return statements;
        }
        if (importClause.name) {
          statements = appendExportsOfDeclaration(statements, importClause);
        }
        var namedBindings = importClause.namedBindings;
        if (namedBindings) {
          switch (namedBindings.kind) {
            case 267:
              statements = appendExportsOfDeclaration(statements, namedBindings);
              break;
            case 268:
              for (var _i = 0, _a = namedBindings.elements; _i < _a.length; _i++) {
                var importBinding = _a[_i];
                statements = appendExportsOfDeclaration(statements, importBinding);
              }
              break;
          }
        }
        return statements;
      }
      function appendExportsOfImportEqualsDeclaration(statements, decl) {
        if (moduleInfo.exportEquals) {
          return statements;
        }
        return appendExportsOfDeclaration(statements, decl);
      }
      function appendExportsOfVariableStatement(statements, node, exportSelf) {
        if (moduleInfo.exportEquals) {
          return statements;
        }
        for (var _i = 0, _a = node.declarationList.declarations; _i < _a.length; _i++) {
          var decl = _a[_i];
          if (decl.initializer || exportSelf) {
            statements = appendExportsOfBindingElement(statements, decl, exportSelf);
          }
        }
        return statements;
      }
      function appendExportsOfBindingElement(statements, decl, exportSelf) {
        if (moduleInfo.exportEquals) {
          return statements;
        }
        if (ts2.isBindingPattern(decl.name)) {
          for (var _i = 0, _a = decl.name.elements; _i < _a.length; _i++) {
            var element = _a[_i];
            if (!ts2.isOmittedExpression(element)) {
              statements = appendExportsOfBindingElement(statements, element, exportSelf);
            }
          }
        } else if (!ts2.isGeneratedIdentifier(decl.name)) {
          var excludeName = void 0;
          if (exportSelf) {
            statements = appendExportStatement(statements, decl.name, factory.getLocalName(decl));
            excludeName = ts2.idText(decl.name);
          }
          statements = appendExportsOfDeclaration(statements, decl, excludeName);
        }
        return statements;
      }
      function appendExportsOfHoistedDeclaration(statements, decl) {
        if (moduleInfo.exportEquals) {
          return statements;
        }
        var excludeName;
        if (ts2.hasSyntacticModifier(decl, 1)) {
          var exportName = ts2.hasSyntacticModifier(decl, 512) ? factory.createStringLiteral("default") : decl.name;
          statements = appendExportStatement(statements, exportName, factory.getLocalName(decl));
          excludeName = ts2.getTextOfIdentifierOrLiteral(exportName);
        }
        if (decl.name) {
          statements = appendExportsOfDeclaration(statements, decl, excludeName);
        }
        return statements;
      }
      function appendExportsOfDeclaration(statements, decl, excludeName) {
        if (moduleInfo.exportEquals) {
          return statements;
        }
        var name = factory.getDeclarationName(decl);
        var exportSpecifiers = moduleInfo.exportSpecifiers.get(ts2.idText(name));
        if (exportSpecifiers) {
          for (var _i = 0, exportSpecifiers_2 = exportSpecifiers; _i < exportSpecifiers_2.length; _i++) {
            var exportSpecifier = exportSpecifiers_2[_i];
            if (exportSpecifier.name.escapedText !== excludeName) {
              statements = appendExportStatement(statements, exportSpecifier.name, name);
            }
          }
        }
        return statements;
      }
      function appendExportStatement(statements, exportName, expression, allowComments) {
        statements = ts2.append(statements, createExportStatement(exportName, expression, allowComments));
        return statements;
      }
      function createExportStatement(name, value, allowComments) {
        var statement = factory.createExpressionStatement(createExportExpression(name, value));
        ts2.startOnNewLine(statement);
        if (!allowComments) {
          ts2.setEmitFlags(statement, 1536);
        }
        return statement;
      }
      function createExportExpression(name, value) {
        var exportName = ts2.isIdentifier(name) ? factory.createStringLiteralFromNode(name) : name;
        ts2.setEmitFlags(value, ts2.getEmitFlags(value) | 1536);
        return ts2.setCommentRange(factory.createCallExpression(exportFunction, void 0, [exportName, value]), value);
      }
      function topLevelNestedVisitor(node) {
        switch (node.kind) {
          case 236:
            return visitVariableStatement(node);
          case 255:
            return visitFunctionDeclaration(node);
          case 256:
            return visitClassDeclaration(node);
          case 241:
            return visitForStatement(node, true);
          case 242:
            return visitForInStatement(node);
          case 243:
            return visitForOfStatement(node);
          case 239:
            return visitDoStatement(node);
          case 240:
            return visitWhileStatement(node);
          case 249:
            return visitLabeledStatement(node);
          case 247:
            return visitWithStatement(node);
          case 248:
            return visitSwitchStatement(node);
          case 262:
            return visitCaseBlock(node);
          case 288:
            return visitCaseClause(node);
          case 289:
            return visitDefaultClause(node);
          case 251:
            return visitTryStatement(node);
          case 291:
            return visitCatchClause(node);
          case 234:
            return visitBlock(node);
          case 350:
            return visitMergeDeclarationMarker(node);
          case 351:
            return visitEndOfDeclarationMarker(node);
          default:
            return visitor(node);
        }
      }
      function visitForStatement(node, isTopLevel) {
        var savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
        enclosingBlockScopedContainer = node;
        node = factory.updateForStatement(node, ts2.visitNode(node.initializer, isTopLevel ? visitForInitializer : discardedValueVisitor, ts2.isForInitializer), ts2.visitNode(node.condition, visitor, ts2.isExpression), ts2.visitNode(node.incrementor, discardedValueVisitor, ts2.isExpression), ts2.visitIterationBody(node.statement, isTopLevel ? topLevelNestedVisitor : visitor, context));
        enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
        return node;
      }
      function visitForInStatement(node) {
        var savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
        enclosingBlockScopedContainer = node;
        node = factory.updateForInStatement(node, visitForInitializer(node.initializer), ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitIterationBody(node.statement, topLevelNestedVisitor, context));
        enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
        return node;
      }
      function visitForOfStatement(node) {
        var savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
        enclosingBlockScopedContainer = node;
        node = factory.updateForOfStatement(node, node.awaitModifier, visitForInitializer(node.initializer), ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitIterationBody(node.statement, topLevelNestedVisitor, context));
        enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
        return node;
      }
      function shouldHoistForInitializer(node) {
        return ts2.isVariableDeclarationList(node) && shouldHoistVariableDeclarationList(node);
      }
      function visitForInitializer(node) {
        if (shouldHoistForInitializer(node)) {
          var expressions = void 0;
          for (var _i = 0, _a = node.declarations; _i < _a.length; _i++) {
            var variable = _a[_i];
            expressions = ts2.append(expressions, transformInitializedVariable(variable, false));
            if (!variable.initializer) {
              hoistBindingElement(variable);
            }
          }
          return expressions ? factory.inlineExpressions(expressions) : factory.createOmittedExpression();
        } else {
          return ts2.visitNode(node, discardedValueVisitor, ts2.isExpression);
        }
      }
      function visitDoStatement(node) {
        return factory.updateDoStatement(node, ts2.visitIterationBody(node.statement, topLevelNestedVisitor, context), ts2.visitNode(node.expression, visitor, ts2.isExpression));
      }
      function visitWhileStatement(node) {
        return factory.updateWhileStatement(node, ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitIterationBody(node.statement, topLevelNestedVisitor, context));
      }
      function visitLabeledStatement(node) {
        return factory.updateLabeledStatement(node, node.label, ts2.visitNode(node.statement, topLevelNestedVisitor, ts2.isStatement, factory.liftToBlock));
      }
      function visitWithStatement(node) {
        return factory.updateWithStatement(node, ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitNode(node.statement, topLevelNestedVisitor, ts2.isStatement, factory.liftToBlock));
      }
      function visitSwitchStatement(node) {
        return factory.updateSwitchStatement(node, ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitNode(node.caseBlock, topLevelNestedVisitor, ts2.isCaseBlock));
      }
      function visitCaseBlock(node) {
        var savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
        enclosingBlockScopedContainer = node;
        node = factory.updateCaseBlock(node, ts2.visitNodes(node.clauses, topLevelNestedVisitor, ts2.isCaseOrDefaultClause));
        enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
        return node;
      }
      function visitCaseClause(node) {
        return factory.updateCaseClause(node, ts2.visitNode(node.expression, visitor, ts2.isExpression), ts2.visitNodes(node.statements, topLevelNestedVisitor, ts2.isStatement));
      }
      function visitDefaultClause(node) {
        return ts2.visitEachChild(node, topLevelNestedVisitor, context);
      }
      function visitTryStatement(node) {
        return ts2.visitEachChild(node, topLevelNestedVisitor, context);
      }
      function visitCatchClause(node) {
        var savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
        enclosingBlockScopedContainer = node;
        node = factory.updateCatchClause(node, node.variableDeclaration, ts2.visitNode(node.block, topLevelNestedVisitor, ts2.isBlock));
        enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
        return node;
      }
      function visitBlock(node) {
        var savedEnclosingBlockScopedContainer = enclosingBlockScopedContainer;
        enclosingBlockScopedContainer = node;
        node = ts2.visitEachChild(node, topLevelNestedVisitor, context);
        enclosingBlockScopedContainer = savedEnclosingBlockScopedContainer;
        return node;
      }
      function visitorWorker(node, valueIsDiscarded) {
        if (!(node.transformFlags & (2048 | 4194304 | 67108864))) {
          return node;
        }
        switch (node.kind) {
          case 241:
            return visitForStatement(node, false);
          case 237:
            return visitExpressionStatement(node);
          case 211:
            return visitParenthesizedExpression(node, valueIsDiscarded);
          case 348:
            return visitPartiallyEmittedExpression(node, valueIsDiscarded);
          case 220:
            if (ts2.isDestructuringAssignment(node)) {
              return visitDestructuringAssignment(node, valueIsDiscarded);
            }
            break;
          case 207:
            if (ts2.isImportCall(node)) {
              return visitImportCallExpression(node);
            }
            break;
          case 218:
          case 219:
            return visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function visitor(node) {
        return visitorWorker(node, false);
      }
      function discardedValueVisitor(node) {
        return visitorWorker(node, true);
      }
      function visitExpressionStatement(node) {
        return factory.updateExpressionStatement(node, ts2.visitNode(node.expression, discardedValueVisitor, ts2.isExpression));
      }
      function visitParenthesizedExpression(node, valueIsDiscarded) {
        return factory.updateParenthesizedExpression(node, ts2.visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, ts2.isExpression));
      }
      function visitPartiallyEmittedExpression(node, valueIsDiscarded) {
        return factory.updatePartiallyEmittedExpression(node, ts2.visitNode(node.expression, valueIsDiscarded ? discardedValueVisitor : visitor, ts2.isExpression));
      }
      function visitImportCallExpression(node) {
        var externalModuleName = ts2.getExternalModuleNameLiteral(factory, node, currentSourceFile, host, resolver, compilerOptions);
        var firstArgument = ts2.visitNode(ts2.firstOrUndefined(node.arguments), visitor);
        var argument = externalModuleName && (!firstArgument || !ts2.isStringLiteral(firstArgument) || firstArgument.text !== externalModuleName.text) ? externalModuleName : firstArgument;
        return factory.createCallExpression(factory.createPropertyAccessExpression(contextObject, factory.createIdentifier("import")), void 0, argument ? [argument] : []);
      }
      function visitDestructuringAssignment(node, valueIsDiscarded) {
        if (hasExportedReferenceInDestructuringTarget(node.left)) {
          return ts2.flattenDestructuringAssignment(node, visitor, context, 0, !valueIsDiscarded);
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function hasExportedReferenceInDestructuringTarget(node) {
        if (ts2.isAssignmentExpression(node, true)) {
          return hasExportedReferenceInDestructuringTarget(node.left);
        } else if (ts2.isSpreadElement(node)) {
          return hasExportedReferenceInDestructuringTarget(node.expression);
        } else if (ts2.isObjectLiteralExpression(node)) {
          return ts2.some(node.properties, hasExportedReferenceInDestructuringTarget);
        } else if (ts2.isArrayLiteralExpression(node)) {
          return ts2.some(node.elements, hasExportedReferenceInDestructuringTarget);
        } else if (ts2.isShorthandPropertyAssignment(node)) {
          return hasExportedReferenceInDestructuringTarget(node.name);
        } else if (ts2.isPropertyAssignment(node)) {
          return hasExportedReferenceInDestructuringTarget(node.initializer);
        } else if (ts2.isIdentifier(node)) {
          var container = resolver.getReferencedExportContainer(node);
          return container !== void 0 && container.kind === 303;
        } else {
          return false;
        }
      }
      function visitPrefixOrPostfixUnaryExpression(node, valueIsDiscarded) {
        if ((node.operator === 45 || node.operator === 46) && ts2.isIdentifier(node.operand) && !ts2.isGeneratedIdentifier(node.operand) && !ts2.isLocalName(node.operand) && !ts2.isDeclarationNameOfEnumOrNamespace(node.operand)) {
          var exportedNames = getExports(node.operand);
          if (exportedNames) {
            var temp = void 0;
            var expression = ts2.visitNode(node.operand, visitor, ts2.isExpression);
            if (ts2.isPrefixUnaryExpression(node)) {
              expression = factory.updatePrefixUnaryExpression(node, expression);
            } else {
              expression = factory.updatePostfixUnaryExpression(node, expression);
              if (!valueIsDiscarded) {
                temp = factory.createTempVariable(hoistVariableDeclaration);
                expression = factory.createAssignment(temp, expression);
                ts2.setTextRange(expression, node);
              }
              expression = factory.createComma(expression, factory.cloneNode(node.operand));
              ts2.setTextRange(expression, node);
            }
            for (var _i = 0, exportedNames_4 = exportedNames; _i < exportedNames_4.length; _i++) {
              var exportName = exportedNames_4[_i];
              expression = createExportExpression(exportName, preventSubstitution(expression));
            }
            if (temp) {
              expression = factory.createComma(expression, temp);
              ts2.setTextRange(expression, node);
            }
            return expression;
          }
        }
        return ts2.visitEachChild(node, visitor, context);
      }
      function modifierVisitor(node) {
        switch (node.kind) {
          case 93:
          case 88:
            return void 0;
        }
        return node;
      }
      function onEmitNode(hint, node, emitCallback) {
        if (node.kind === 303) {
          var id = ts2.getOriginalNodeId(node);
          currentSourceFile = node;
          moduleInfo = moduleInfoMap[id];
          exportFunction = exportFunctionsMap[id];
          noSubstitution = noSubstitutionMap[id];
          contextObject = contextObjectMap[id];
          if (noSubstitution) {
            delete noSubstitutionMap[id];
          }
          previousOnEmitNode(hint, node, emitCallback);
          currentSourceFile = void 0;
          moduleInfo = void 0;
          exportFunction = void 0;
          contextObject = void 0;
          noSubstitution = void 0;
        } else {
          previousOnEmitNode(hint, node, emitCallback);
        }
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (isSubstitutionPrevented(node)) {
          return node;
        }
        if (hint === 1) {
          return substituteExpression(node);
        } else if (hint === 4) {
          return substituteUnspecified(node);
        }
        return node;
      }
      function substituteUnspecified(node) {
        switch (node.kind) {
          case 295:
            return substituteShorthandPropertyAssignment(node);
        }
        return node;
      }
      function substituteShorthandPropertyAssignment(node) {
        var _a, _b;
        var name = node.name;
        if (!ts2.isGeneratedIdentifier(name) && !ts2.isLocalName(name)) {
          var importDeclaration = resolver.getReferencedImportDeclaration(name);
          if (importDeclaration) {
            if (ts2.isImportClause(importDeclaration)) {
              return ts2.setTextRange(factory.createPropertyAssignment(factory.cloneNode(name), factory.createPropertyAccessExpression(factory.getGeneratedNameForNode(importDeclaration.parent), factory.createIdentifier("default"))), node);
            } else if (ts2.isImportSpecifier(importDeclaration)) {
              return ts2.setTextRange(factory.createPropertyAssignment(factory.cloneNode(name), factory.createPropertyAccessExpression(factory.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.parent) || importDeclaration), factory.cloneNode(importDeclaration.propertyName || importDeclaration.name))), node);
            }
          }
        }
        return node;
      }
      function substituteExpression(node) {
        switch (node.kind) {
          case 79:
            return substituteExpressionIdentifier(node);
          case 220:
            return substituteBinaryExpression(node);
          case 230:
            return substituteMetaProperty(node);
        }
        return node;
      }
      function substituteExpressionIdentifier(node) {
        var _a, _b;
        if (ts2.getEmitFlags(node) & 4096) {
          var externalHelpersModuleName = ts2.getExternalHelpersModuleName(currentSourceFile);
          if (externalHelpersModuleName) {
            return factory.createPropertyAccessExpression(externalHelpersModuleName, node);
          }
          return node;
        }
        if (!ts2.isGeneratedIdentifier(node) && !ts2.isLocalName(node)) {
          var importDeclaration = resolver.getReferencedImportDeclaration(node);
          if (importDeclaration) {
            if (ts2.isImportClause(importDeclaration)) {
              return ts2.setTextRange(factory.createPropertyAccessExpression(factory.getGeneratedNameForNode(importDeclaration.parent), factory.createIdentifier("default")), node);
            } else if (ts2.isImportSpecifier(importDeclaration)) {
              return ts2.setTextRange(factory.createPropertyAccessExpression(factory.getGeneratedNameForNode(((_b = (_a = importDeclaration.parent) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.parent) || importDeclaration), factory.cloneNode(importDeclaration.propertyName || importDeclaration.name)), node);
            }
          }
        }
        return node;
      }
      function substituteBinaryExpression(node) {
        if (ts2.isAssignmentOperator(node.operatorToken.kind) && ts2.isIdentifier(node.left) && !ts2.isGeneratedIdentifier(node.left) && !ts2.isLocalName(node.left) && !ts2.isDeclarationNameOfEnumOrNamespace(node.left)) {
          var exportedNames = getExports(node.left);
          if (exportedNames) {
            var expression = node;
            for (var _i = 0, exportedNames_5 = exportedNames; _i < exportedNames_5.length; _i++) {
              var exportName = exportedNames_5[_i];
              expression = createExportExpression(exportName, preventSubstitution(expression));
            }
            return expression;
          }
        }
        return node;
      }
      function substituteMetaProperty(node) {
        if (ts2.isImportMeta(node)) {
          return factory.createPropertyAccessExpression(contextObject, factory.createIdentifier("meta"));
        }
        return node;
      }
      function getExports(name) {
        var exportedNames;
        if (!ts2.isGeneratedIdentifier(name)) {
          var valueDeclaration = resolver.getReferencedImportDeclaration(name) || resolver.getReferencedValueDeclaration(name);
          if (valueDeclaration) {
            var exportContainer = resolver.getReferencedExportContainer(name, false);
            if (exportContainer && exportContainer.kind === 303) {
              exportedNames = ts2.append(exportedNames, factory.getDeclarationName(valueDeclaration));
            }
            exportedNames = ts2.addRange(exportedNames, moduleInfo && moduleInfo.exportedBindings[ts2.getOriginalNodeId(valueDeclaration)]);
          }
        }
        return exportedNames;
      }
      function preventSubstitution(node) {
        if (noSubstitution === void 0)
          noSubstitution = [];
        noSubstitution[ts2.getNodeId(node)] = true;
        return node;
      }
      function isSubstitutionPrevented(node) {
        return noSubstitution && node.id && noSubstitution[node.id];
      }
    }
    ts2.transformSystemModule = transformSystemModule;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformECMAScriptModule(context) {
      var factory = context.factory, emitHelpers = context.getEmitHelperFactory;
      var host = context.getEmitHost();
      var resolver = context.getEmitResolver();
      var compilerOptions = context.getCompilerOptions();
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var previousOnEmitNode = context.onEmitNode;
      var previousOnSubstituteNode = context.onSubstituteNode;
      context.onEmitNode = onEmitNode;
      context.onSubstituteNode = onSubstituteNode;
      context.enableEmitNotification(303);
      context.enableSubstitution(79);
      var helperNameSubstitutions;
      var currentSourceFile;
      var importRequireStatements;
      return ts2.chainBundle(context, transformSourceFile);
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        if (ts2.isExternalModule(node) || compilerOptions.isolatedModules) {
          currentSourceFile = node;
          importRequireStatements = void 0;
          var result = updateExternalModule(node);
          currentSourceFile = void 0;
          if (importRequireStatements) {
            result = factory.updateSourceFile(result, ts2.setTextRange(factory.createNodeArray(ts2.insertStatementsAfterCustomPrologue(result.statements.slice(), importRequireStatements)), result.statements));
          }
          if (!ts2.isExternalModule(node) || ts2.some(result.statements, ts2.isExternalModuleIndicator)) {
            return result;
          }
          return factory.updateSourceFile(result, ts2.setTextRange(factory.createNodeArray(__spreadArray(__spreadArray([], result.statements, true), [ts2.createEmptyExports(factory)], false)), result.statements));
        }
        return node;
      }
      function updateExternalModule(node) {
        var externalHelpersImportDeclaration = ts2.createExternalHelpersImportDeclarationIfNeeded(factory, emitHelpers(), node, compilerOptions);
        if (externalHelpersImportDeclaration) {
          var statements = [];
          var statementOffset = factory.copyPrologue(node.statements, statements);
          ts2.append(statements, externalHelpersImportDeclaration);
          ts2.addRange(statements, ts2.visitNodes(node.statements, visitor, ts2.isStatement, statementOffset));
          return factory.updateSourceFile(node, ts2.setTextRange(factory.createNodeArray(statements), node.statements));
        } else {
          return ts2.visitEachChild(node, visitor, context);
        }
      }
      function visitor(node) {
        switch (node.kind) {
          case 264:
            return ts2.getEmitScriptTarget(compilerOptions) >= ts2.ModuleKind.ES2020 ? visitImportEqualsDeclaration(node) : void 0;
          case 270:
            return visitExportAssignment(node);
          case 271:
            var exportDecl = node;
            return visitExportDeclaration(exportDecl);
        }
        return node;
      }
      function createRequireCall(importNode) {
        var moduleName = ts2.getExternalModuleNameLiteral(factory, importNode, ts2.Debug.checkDefined(currentSourceFile), host, resolver, compilerOptions);
        var args = [];
        if (moduleName) {
          args.push(moduleName);
        }
        if (!importRequireStatements) {
          var createRequireName = factory.createUniqueName("_createRequire", 16 | 32);
          var importStatement = factory.createImportDeclaration(void 0, void 0, factory.createImportClause(false, void 0, factory.createNamedImports([
            factory.createImportSpecifier(false, factory.createIdentifier("createRequire"), createRequireName)
          ])), factory.createStringLiteral("module"));
          var requireHelperName = factory.createUniqueName("__require", 16 | 32);
          var requireStatement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
            factory.createVariableDeclaration(requireHelperName, void 0, void 0, factory.createCallExpression(factory.cloneNode(createRequireName), void 0, [
              factory.createPropertyAccessExpression(factory.createMetaProperty(100, factory.createIdentifier("meta")), factory.createIdentifier("url"))
            ]))
          ], languageVersion >= 2 ? 2 : 0));
          importRequireStatements = [importStatement, requireStatement];
        }
        var name = importRequireStatements[1].declarationList.declarations[0].name;
        ts2.Debug.assertNode(name, ts2.isIdentifier);
        return factory.createCallExpression(factory.cloneNode(name), void 0, args);
      }
      function visitImportEqualsDeclaration(node) {
        ts2.Debug.assert(ts2.isExternalModuleImportEqualsDeclaration(node), "import= for internal module references should be handled in an earlier transformer.");
        var statements;
        statements = ts2.append(statements, ts2.setOriginalNode(ts2.setTextRange(factory.createVariableStatement(void 0, factory.createVariableDeclarationList([
          factory.createVariableDeclaration(factory.cloneNode(node.name), void 0, void 0, createRequireCall(node))
        ], languageVersion >= 2 ? 2 : 0)), node), node));
        statements = appendExportsOfImportEqualsDeclaration(statements, node);
        return ts2.singleOrMany(statements);
      }
      function appendExportsOfImportEqualsDeclaration(statements, node) {
        if (ts2.hasSyntacticModifier(node, 1)) {
          statements = ts2.append(statements, factory.createExportDeclaration(void 0, void 0, node.isTypeOnly, factory.createNamedExports([factory.createExportSpecifier(false, void 0, ts2.idText(node.name))])));
        }
        return statements;
      }
      function visitExportAssignment(node) {
        return node.isExportEquals ? void 0 : node;
      }
      function visitExportDeclaration(node) {
        if (compilerOptions.module !== void 0 && compilerOptions.module > ts2.ModuleKind.ES2015) {
          return node;
        }
        if (!node.exportClause || !ts2.isNamespaceExport(node.exportClause) || !node.moduleSpecifier) {
          return node;
        }
        var oldIdentifier = node.exportClause.name;
        var synthName = factory.getGeneratedNameForNode(oldIdentifier);
        var importDecl = factory.createImportDeclaration(void 0, void 0, factory.createImportClause(false, void 0, factory.createNamespaceImport(synthName)), node.moduleSpecifier, node.assertClause);
        ts2.setOriginalNode(importDecl, node.exportClause);
        var exportDecl = ts2.isExportNamespaceAsDefaultDeclaration(node) ? factory.createExportDefault(synthName) : factory.createExportDeclaration(void 0, void 0, false, factory.createNamedExports([factory.createExportSpecifier(false, synthName, oldIdentifier)]));
        ts2.setOriginalNode(exportDecl, node);
        return [importDecl, exportDecl];
      }
      function onEmitNode(hint, node, emitCallback) {
        if (ts2.isSourceFile(node)) {
          if ((ts2.isExternalModule(node) || compilerOptions.isolatedModules) && compilerOptions.importHelpers) {
            helperNameSubstitutions = new ts2.Map();
          }
          previousOnEmitNode(hint, node, emitCallback);
          helperNameSubstitutions = void 0;
        } else {
          previousOnEmitNode(hint, node, emitCallback);
        }
      }
      function onSubstituteNode(hint, node) {
        node = previousOnSubstituteNode(hint, node);
        if (helperNameSubstitutions && ts2.isIdentifier(node) && ts2.getEmitFlags(node) & 4096) {
          return substituteHelperName(node);
        }
        return node;
      }
      function substituteHelperName(node) {
        var name = ts2.idText(node);
        var substitution = helperNameSubstitutions.get(name);
        if (!substitution) {
          helperNameSubstitutions.set(name, substitution = factory.createUniqueName(name, 16 | 32));
        }
        return substitution;
      }
    }
    ts2.transformECMAScriptModule = transformECMAScriptModule;
  })(ts || (ts = {}));
  (function(ts2) {
    function transformNodeModule(context) {
      var previousOnSubstituteNode = context.onSubstituteNode;
      var previousOnEmitNode = context.onEmitNode;
      var esmTransform = ts2.transformECMAScriptModule(context);
      var esmOnSubstituteNode = context.onSubstituteNode;
      var esmOnEmitNode = context.onEmitNode;
      context.onSubstituteNode = previousOnSubstituteNode;
      context.onEmitNode = previousOnEmitNode;
      var cjsTransform = ts2.transformModule(context);
      var cjsOnSubstituteNode = context.onSubstituteNode;
      var cjsOnEmitNode = context.onEmitNode;
      context.onSubstituteNode = onSubstituteNode;
      context.onEmitNode = onEmitNode;
      context.enableSubstitution(303);
      context.enableEmitNotification(303);
      var currentSourceFile;
      return transformSourceFileOrBundle;
      function onSubstituteNode(hint, node) {
        if (ts2.isSourceFile(node)) {
          currentSourceFile = node;
          return previousOnSubstituteNode(hint, node);
        } else {
          if (!currentSourceFile) {
            return previousOnSubstituteNode(hint, node);
          }
          if (currentSourceFile.impliedNodeFormat === ts2.ModuleKind.ESNext) {
            return esmOnSubstituteNode(hint, node);
          }
          return cjsOnSubstituteNode(hint, node);
        }
      }
      function onEmitNode(hint, node, emitCallback) {
        if (ts2.isSourceFile(node)) {
          currentSourceFile = node;
        }
        if (!currentSourceFile) {
          return previousOnEmitNode(hint, node, emitCallback);
        }
        if (currentSourceFile.impliedNodeFormat === ts2.ModuleKind.ESNext) {
          return esmOnEmitNode(hint, node, emitCallback);
        }
        return cjsOnEmitNode(hint, node, emitCallback);
      }
      function getModuleTransformForFile(file) {
        return file.impliedNodeFormat === ts2.ModuleKind.ESNext ? esmTransform : cjsTransform;
      }
      function transformSourceFile(node) {
        if (node.isDeclarationFile) {
          return node;
        }
        currentSourceFile = node;
        var result = getModuleTransformForFile(node)(node);
        currentSourceFile = void 0;
        ts2.Debug.assert(ts2.isSourceFile(result));
        return result;
      }
      function transformSourceFileOrBundle(node) {
        return node.kind === 303 ? transformSourceFile(node) : transformBundle(node);
      }
      function transformBundle(node) {
        return context.factory.createBundle(ts2.map(node.sourceFiles, transformSourceFile), node.prepends);
      }
    }
    ts2.transformNodeModule = transformNodeModule;
  })(ts || (ts = {}));
  (function(ts2) {
    function canProduceDiagnostics(node) {
      return ts2.isVariableDeclaration(node) || ts2.isPropertyDeclaration(node) || ts2.isPropertySignature(node) || ts2.isBindingElement(node) || ts2.isSetAccessor(node) || ts2.isGetAccessor(node) || ts2.isConstructSignatureDeclaration(node) || ts2.isCallSignatureDeclaration(node) || ts2.isMethodDeclaration(node) || ts2.isMethodSignature(node) || ts2.isFunctionDeclaration(node) || ts2.isParameter(node) || ts2.isTypeParameterDeclaration(node) || ts2.isExpressionWithTypeArguments(node) || ts2.isImportEqualsDeclaration(node) || ts2.isTypeAliasDeclaration(node) || ts2.isConstructorDeclaration(node) || ts2.isIndexSignatureDeclaration(node) || ts2.isPropertyAccessExpression(node) || ts2.isJSDocTypeAlias(node);
    }
    ts2.canProduceDiagnostics = canProduceDiagnostics;
    function createGetSymbolAccessibilityDiagnosticForNodeName(node) {
      if (ts2.isSetAccessor(node) || ts2.isGetAccessor(node)) {
        return getAccessorNameVisibilityError;
      } else if (ts2.isMethodSignature(node) || ts2.isMethodDeclaration(node)) {
        return getMethodNameVisibilityError;
      } else {
        return createGetSymbolAccessibilityDiagnosticForNode(node);
      }
      function getAccessorNameVisibilityError(symbolAccessibilityResult) {
        var diagnosticMessage = getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
        return diagnosticMessage !== void 0 ? {
          diagnosticMessage,
          errorNode: node,
          typeName: node.name
        } : void 0;
      }
      function getAccessorNameVisibilityDiagnosticMessage(symbolAccessibilityResult) {
        if (ts2.isStatic(node)) {
          return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
        } else if (node.parent.kind === 256) {
          return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
        } else {
          return symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
        }
      }
      function getMethodNameVisibilityError(symbolAccessibilityResult) {
        var diagnosticMessage = getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult);
        return diagnosticMessage !== void 0 ? {
          diagnosticMessage,
          errorNode: node,
          typeName: node.name
        } : void 0;
      }
      function getMethodNameVisibilityDiagnosticMessage(symbolAccessibilityResult) {
        if (ts2.isStatic(node)) {
          return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_private_name_1;
        } else if (node.parent.kind === 256) {
          return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Public_method_0_of_exported_class_has_or_is_using_private_name_1;
        } else {
          return symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Method_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Method_0_of_exported_interface_has_or_is_using_private_name_1;
        }
      }
    }
    ts2.createGetSymbolAccessibilityDiagnosticForNodeName = createGetSymbolAccessibilityDiagnosticForNodeName;
    function createGetSymbolAccessibilityDiagnosticForNode(node) {
      if (ts2.isVariableDeclaration(node) || ts2.isPropertyDeclaration(node) || ts2.isPropertySignature(node) || ts2.isPropertyAccessExpression(node) || ts2.isBindingElement(node) || ts2.isConstructorDeclaration(node)) {
        return getVariableDeclarationTypeVisibilityError;
      } else if (ts2.isSetAccessor(node) || ts2.isGetAccessor(node)) {
        return getAccessorDeclarationTypeVisibilityError;
      } else if (ts2.isConstructSignatureDeclaration(node) || ts2.isCallSignatureDeclaration(node) || ts2.isMethodDeclaration(node) || ts2.isMethodSignature(node) || ts2.isFunctionDeclaration(node) || ts2.isIndexSignatureDeclaration(node)) {
        return getReturnTypeVisibilityError;
      } else if (ts2.isParameter(node)) {
        if (ts2.isParameterPropertyDeclaration(node, node.parent) && ts2.hasSyntacticModifier(node.parent, 8)) {
          return getVariableDeclarationTypeVisibilityError;
        }
        return getParameterDeclarationTypeVisibilityError;
      } else if (ts2.isTypeParameterDeclaration(node)) {
        return getTypeParameterConstraintVisibilityError;
      } else if (ts2.isExpressionWithTypeArguments(node)) {
        return getHeritageClauseVisibilityError;
      } else if (ts2.isImportEqualsDeclaration(node)) {
        return getImportEntityNameVisibilityError;
      } else if (ts2.isTypeAliasDeclaration(node) || ts2.isJSDocTypeAlias(node)) {
        return getTypeAliasDeclarationVisibilityError;
      } else {
        return ts2.Debug.assertNever(node, "Attempted to set a declaration diagnostic context for unhandled node kind: ".concat(ts2.SyntaxKind[node.kind]));
      }
      function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
        if (node.kind === 253 || node.kind === 202) {
          return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
        } else if (node.kind === 166 || node.kind === 205 || node.kind === 165 || node.kind === 163 && ts2.hasSyntacticModifier(node.parent, 8)) {
          if (ts2.isStatic(node)) {
            return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
          } else if (node.parent.kind === 256 || node.kind === 163) {
            return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
          } else {
            return symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
          }
        }
      }
      function getVariableDeclarationTypeVisibilityError(symbolAccessibilityResult) {
        var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
        return diagnosticMessage !== void 0 ? {
          diagnosticMessage,
          errorNode: node,
          typeName: node.name
        } : void 0;
      }
      function getAccessorDeclarationTypeVisibilityError(symbolAccessibilityResult) {
        var diagnosticMessage;
        if (node.kind === 172) {
          if (ts2.isStatic(node)) {
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_type_of_public_static_setter_0_from_exported_class_has_or_is_using_private_name_1;
          } else {
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_type_of_public_setter_0_from_exported_class_has_or_is_using_private_name_1;
          }
        } else {
          if (ts2.isStatic(node)) {
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Return_type_of_public_static_getter_0_from_exported_class_has_or_is_using_private_name_1;
          } else {
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Return_type_of_public_getter_0_from_exported_class_has_or_is_using_private_name_1;
          }
        }
        return {
          diagnosticMessage,
          errorNode: node.name,
          typeName: node.name
        };
      }
      function getReturnTypeVisibilityError(symbolAccessibilityResult) {
        var diagnosticMessage;
        switch (node.kind) {
          case 174:
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : ts2.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
            break;
          case 173:
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : ts2.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
            break;
          case 175:
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : ts2.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
            break;
          case 168:
          case 167:
            if (ts2.isStatic(node)) {
              diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : ts2.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : ts2.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
            } else if (node.parent.kind === 256) {
              diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : ts2.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 : ts2.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
            } else {
              diagnosticMessage = symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 : ts2.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
            }
            break;
          case 255:
            diagnosticMessage = symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named : ts2.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 : ts2.Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
            break;
          default:
            return ts2.Debug.fail("This is unknown kind for signature: " + node.kind);
        }
        return {
          diagnosticMessage,
          errorNode: node.name || node
        };
      }
      function getParameterDeclarationTypeVisibilityError(symbolAccessibilityResult) {
        var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
        return diagnosticMessage !== void 0 ? {
          diagnosticMessage,
          errorNode: node,
          typeName: node.name
        } : void 0;
      }
      function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
        switch (node.parent.kind) {
          case 170:
            return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
          case 174:
          case 179:
            return symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
          case 173:
            return symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
          case 175:
            return symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_index_signature_from_exported_interface_has_or_is_using_private_name_1;
          case 168:
          case 167:
            if (ts2.isStatic(node.parent)) {
              return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
            } else if (node.parent.parent.kind === 256) {
              return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
            } else {
              return symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
            }
          case 255:
          case 178:
            return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
          case 172:
          case 171:
            return symbolAccessibilityResult.errorModuleName ? symbolAccessibilityResult.accessibility === 2 ? ts2.Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named : ts2.Diagnostics.Parameter_0_of_accessor_has_or_is_using_name_1_from_private_module_2 : ts2.Diagnostics.Parameter_0_of_accessor_has_or_is_using_private_name_1;
          default:
            return ts2.Debug.fail("Unknown parent for parameter: ".concat(ts2.SyntaxKind[node.parent.kind]));
        }
      }
      function getTypeParameterConstraintVisibilityError() {
        var diagnosticMessage;
        switch (node.parent.kind) {
          case 256:
            diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
            break;
          case 257:
            diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
            break;
          case 194:
            diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_exported_mapped_object_type_is_using_private_name_1;
            break;
          case 179:
          case 174:
            diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
            break;
          case 173:
            diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
            break;
          case 168:
          case 167:
            if (ts2.isStatic(node.parent)) {
              diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
            } else if (node.parent.parent.kind === 256) {
              diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
            } else {
              diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
            }
            break;
          case 178:
          case 255:
            diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
            break;
          case 258:
            diagnosticMessage = ts2.Diagnostics.Type_parameter_0_of_exported_type_alias_has_or_is_using_private_name_1;
            break;
          default:
            return ts2.Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
        }
        return {
          diagnosticMessage,
          errorNode: node,
          typeName: node.name
        };
      }
      function getHeritageClauseVisibilityError() {
        var diagnosticMessage;
        if (ts2.isClassDeclaration(node.parent.parent)) {
          diagnosticMessage = ts2.isHeritageClause(node.parent) && node.parent.token === 117 ? ts2.Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 : node.parent.parent.name ? ts2.Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1 : ts2.Diagnostics.extends_clause_of_exported_class_has_or_is_using_private_name_0;
        } else {
          diagnosticMessage = ts2.Diagnostics.extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
        }
        return {
          diagnosticMessage,
          errorNode: node,
          typeName: ts2.getNameOfDeclaration(node.parent.parent)
        };
      }
      function getImportEntityNameVisibilityError() {
        return {
          diagnosticMessage: ts2.Diagnostics.Import_declaration_0_is_using_private_name_1,
          errorNode: node,
          typeName: node.name
        };
      }
      function getTypeAliasDeclarationVisibilityError(symbolAccessibilityResult) {
        return {
          diagnosticMessage: symbolAccessibilityResult.errorModuleName ? ts2.Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1_from_module_2 : ts2.Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
          errorNode: ts2.isJSDocTypeAlias(node) ? ts2.Debug.checkDefined(node.typeExpression) : node.type,
          typeName: ts2.isJSDocTypeAlias(node) ? ts2.getNameOfDeclaration(node) : node.name
        };
      }
    }
    ts2.createGetSymbolAccessibilityDiagnosticForNode = createGetSymbolAccessibilityDiagnosticForNode;
  })(ts || (ts = {}));
  (function(ts2) {
    function getDeclarationDiagnostics(host, resolver, file) {
      var compilerOptions = host.getCompilerOptions();
      var result = ts2.transformNodes(resolver, host, ts2.factory, compilerOptions, file ? [file] : ts2.filter(host.getSourceFiles(), ts2.isSourceFileNotJson), [transformDeclarations], false);
      return result.diagnostics;
    }
    ts2.getDeclarationDiagnostics = getDeclarationDiagnostics;
    function hasInternalAnnotation(range, currentSourceFile) {
      var comment = currentSourceFile.text.substring(range.pos, range.end);
      return ts2.stringContains(comment, "@internal");
    }
    function isInternalDeclaration(node, currentSourceFile) {
      var parseTreeNode = ts2.getParseTreeNode(node);
      if (parseTreeNode && parseTreeNode.kind === 163) {
        var paramIdx = parseTreeNode.parent.parameters.indexOf(parseTreeNode);
        var previousSibling = paramIdx > 0 ? parseTreeNode.parent.parameters[paramIdx - 1] : void 0;
        var text = currentSourceFile.text;
        var commentRanges = previousSibling ? ts2.concatenate(ts2.getTrailingCommentRanges(text, ts2.skipTrivia(text, previousSibling.end + 1, false, true)), ts2.getLeadingCommentRanges(text, node.pos)) : ts2.getTrailingCommentRanges(text, ts2.skipTrivia(text, node.pos, false, true));
        return commentRanges && commentRanges.length && hasInternalAnnotation(ts2.last(commentRanges), currentSourceFile);
      }
      var leadingCommentRanges = parseTreeNode && ts2.getLeadingCommentRangesOfNode(parseTreeNode, currentSourceFile);
      return !!ts2.forEach(leadingCommentRanges, function(range) {
        return hasInternalAnnotation(range, currentSourceFile);
      });
    }
    ts2.isInternalDeclaration = isInternalDeclaration;
    var declarationEmitNodeBuilderFlags = 1024 | 2048 | 4096 | 8 | 524288 | 4 | 1;
    function transformDeclarations(context) {
      var throwDiagnostic = function() {
        return ts2.Debug.fail("Diagnostic emitted without context");
      };
      var getSymbolAccessibilityDiagnostic = throwDiagnostic;
      var needsDeclare = true;
      var isBundledEmit = false;
      var resultHasExternalModuleIndicator = false;
      var needsScopeFixMarker = false;
      var resultHasScopeMarker = false;
      var enclosingDeclaration;
      var necessaryTypeReferences;
      var lateMarkedStatements;
      var lateStatementReplacementMap;
      var suppressNewDiagnosticContexts;
      var exportedModulesFromDeclarationEmit;
      var factory = context.factory;
      var host = context.getEmitHost();
      var symbolTracker = {
        trackSymbol,
        reportInaccessibleThisError,
        reportInaccessibleUniqueSymbolError,
        reportCyclicStructureError,
        reportPrivateInBaseOfClassExpression,
        reportLikelyUnsafeImportRequiredError,
        reportTruncationError,
        moduleResolverHost: host,
        trackReferencedAmbientModule,
        trackExternalModuleSymbolOfImportTypeNode,
        reportNonlocalAugmentation,
        reportNonSerializableProperty
      };
      var errorNameNode;
      var errorFallbackNode;
      var currentSourceFile;
      var refs;
      var libs;
      var emittedImports;
      var resolver = context.getEmitResolver();
      var options = context.getCompilerOptions();
      var noResolve = options.noResolve, stripInternal = options.stripInternal;
      return transformRoot;
      function recordTypeReferenceDirectivesIfNecessary(typeReferenceDirectives) {
        if (!typeReferenceDirectives) {
          return;
        }
        necessaryTypeReferences = necessaryTypeReferences || new ts2.Set();
        for (var _i = 0, typeReferenceDirectives_2 = typeReferenceDirectives; _i < typeReferenceDirectives_2.length; _i++) {
          var ref = typeReferenceDirectives_2[_i];
          necessaryTypeReferences.add(ref);
        }
      }
      function trackReferencedAmbientModule(node, symbol) {
        var directives = resolver.getTypeReferenceDirectivesForSymbol(symbol, 67108863);
        if (ts2.length(directives)) {
          return recordTypeReferenceDirectivesIfNecessary(directives);
        }
        var container = ts2.getSourceFileOfNode(node);
        refs.set(ts2.getOriginalNodeId(container), container);
      }
      function handleSymbolAccessibilityError(symbolAccessibilityResult) {
        if (symbolAccessibilityResult.accessibility === 0) {
          if (symbolAccessibilityResult && symbolAccessibilityResult.aliasesToMakeVisible) {
            if (!lateMarkedStatements) {
              lateMarkedStatements = symbolAccessibilityResult.aliasesToMakeVisible;
            } else {
              for (var _i = 0, _a = symbolAccessibilityResult.aliasesToMakeVisible; _i < _a.length; _i++) {
                var ref = _a[_i];
                ts2.pushIfUnique(lateMarkedStatements, ref);
              }
            }
          }
        } else {
          var errorInfo = getSymbolAccessibilityDiagnostic(symbolAccessibilityResult);
          if (errorInfo) {
            if (errorInfo.typeName) {
              context.addDiagnostic(ts2.createDiagnosticForNode(symbolAccessibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, ts2.getTextOfNode(errorInfo.typeName), symbolAccessibilityResult.errorSymbolName, symbolAccessibilityResult.errorModuleName));
            } else {
              context.addDiagnostic(ts2.createDiagnosticForNode(symbolAccessibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, symbolAccessibilityResult.errorSymbolName, symbolAccessibilityResult.errorModuleName));
            }
            return true;
          }
        }
        return false;
      }
      function trackExternalModuleSymbolOfImportTypeNode(symbol) {
        if (!isBundledEmit) {
          (exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
        }
      }
      function trackSymbol(symbol, enclosingDeclaration2, meaning) {
        if (symbol.flags & 262144)
          return false;
        var issuedDiagnostic = handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration2, meaning, true));
        recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForSymbol(symbol, meaning));
        return issuedDiagnostic;
      }
      function reportPrivateInBaseOfClassExpression(propertyName) {
        if (errorNameNode || errorFallbackNode) {
          context.addDiagnostic(ts2.createDiagnosticForNode(errorNameNode || errorFallbackNode, ts2.Diagnostics.Property_0_of_exported_class_expression_may_not_be_private_or_protected, propertyName));
        }
      }
      function errorDeclarationNameWithFallback() {
        return errorNameNode ? ts2.declarationNameToString(errorNameNode) : errorFallbackNode && ts2.getNameOfDeclaration(errorFallbackNode) ? ts2.declarationNameToString(ts2.getNameOfDeclaration(errorFallbackNode)) : errorFallbackNode && ts2.isExportAssignment(errorFallbackNode) ? errorFallbackNode.isExportEquals ? "export=" : "default" : "(Missing)";
      }
      function reportInaccessibleUniqueSymbolError() {
        if (errorNameNode || errorFallbackNode) {
          context.addDiagnostic(ts2.createDiagnosticForNode(errorNameNode || errorFallbackNode, ts2.Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), "unique symbol"));
        }
      }
      function reportCyclicStructureError() {
        if (errorNameNode || errorFallbackNode) {
          context.addDiagnostic(ts2.createDiagnosticForNode(errorNameNode || errorFallbackNode, ts2.Diagnostics.The_inferred_type_of_0_references_a_type_with_a_cyclic_structure_which_cannot_be_trivially_serialized_A_type_annotation_is_necessary, errorDeclarationNameWithFallback()));
        }
      }
      function reportInaccessibleThisError() {
        if (errorNameNode || errorFallbackNode) {
          context.addDiagnostic(ts2.createDiagnosticForNode(errorNameNode || errorFallbackNode, ts2.Diagnostics.The_inferred_type_of_0_references_an_inaccessible_1_type_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), "this"));
        }
      }
      function reportLikelyUnsafeImportRequiredError(specifier) {
        if (errorNameNode || errorFallbackNode) {
          context.addDiagnostic(ts2.createDiagnosticForNode(errorNameNode || errorFallbackNode, ts2.Diagnostics.The_inferred_type_of_0_cannot_be_named_without_a_reference_to_1_This_is_likely_not_portable_A_type_annotation_is_necessary, errorDeclarationNameWithFallback(), specifier));
        }
      }
      function reportTruncationError() {
        if (errorNameNode || errorFallbackNode) {
          context.addDiagnostic(ts2.createDiagnosticForNode(errorNameNode || errorFallbackNode, ts2.Diagnostics.The_inferred_type_of_this_node_exceeds_the_maximum_length_the_compiler_will_serialize_An_explicit_type_annotation_is_needed));
        }
      }
      function reportNonlocalAugmentation(containingFile, parentSymbol, symbol) {
        var _a;
        var primaryDeclaration = (_a = parentSymbol.declarations) === null || _a === void 0 ? void 0 : _a.find(function(d) {
          return ts2.getSourceFileOfNode(d) === containingFile;
        });
        var augmentingDeclarations = ts2.filter(symbol.declarations, function(d) {
          return ts2.getSourceFileOfNode(d) !== containingFile;
        });
        if (augmentingDeclarations) {
          for (var _i = 0, augmentingDeclarations_1 = augmentingDeclarations; _i < augmentingDeclarations_1.length; _i++) {
            var augmentations = augmentingDeclarations_1[_i];
            context.addDiagnostic(ts2.addRelatedInfo(ts2.createDiagnosticForNode(augmentations, ts2.Diagnostics.Declaration_augments_declaration_in_another_file_This_cannot_be_serialized), ts2.createDiagnosticForNode(primaryDeclaration, ts2.Diagnostics.This_is_the_declaration_being_augmented_Consider_moving_the_augmenting_declaration_into_the_same_file)));
          }
        }
      }
      function reportNonSerializableProperty(propertyName) {
        if (errorNameNode || errorFallbackNode) {
          context.addDiagnostic(ts2.createDiagnosticForNode(errorNameNode || errorFallbackNode, ts2.Diagnostics.The_type_of_this_node_cannot_be_serialized_because_its_property_0_cannot_be_serialized, propertyName));
        }
      }
      function transformDeclarationsForJS(sourceFile, bundled) {
        var oldDiag = getSymbolAccessibilityDiagnostic;
        getSymbolAccessibilityDiagnostic = function(s) {
          return s.errorNode && ts2.canProduceDiagnostics(s.errorNode) ? ts2.createGetSymbolAccessibilityDiagnosticForNode(s.errorNode)(s) : {
            diagnosticMessage: s.errorModuleName ? ts2.Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_from_module_1_An_explicit_type_annotation_may_unblock_declaration_emit : ts2.Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit,
            errorNode: s.errorNode || sourceFile
          };
        };
        var result = resolver.getDeclarationStatementsForSourceFile(sourceFile, declarationEmitNodeBuilderFlags, symbolTracker, bundled);
        getSymbolAccessibilityDiagnostic = oldDiag;
        return result;
      }
      function transformRoot(node) {
        if (node.kind === 303 && node.isDeclarationFile) {
          return node;
        }
        if (node.kind === 304) {
          isBundledEmit = true;
          refs = new ts2.Map();
          libs = new ts2.Map();
          var hasNoDefaultLib_1 = false;
          var bundle = factory.createBundle(ts2.map(node.sourceFiles, function(sourceFile) {
            if (sourceFile.isDeclarationFile)
              return void 0;
            hasNoDefaultLib_1 = hasNoDefaultLib_1 || sourceFile.hasNoDefaultLib;
            currentSourceFile = sourceFile;
            enclosingDeclaration = sourceFile;
            lateMarkedStatements = void 0;
            suppressNewDiagnosticContexts = false;
            lateStatementReplacementMap = new ts2.Map();
            getSymbolAccessibilityDiagnostic = throwDiagnostic;
            needsScopeFixMarker = false;
            resultHasScopeMarker = false;
            collectReferences(sourceFile, refs);
            collectLibs(sourceFile, libs);
            if (ts2.isExternalOrCommonJsModule(sourceFile) || ts2.isJsonSourceFile(sourceFile)) {
              resultHasExternalModuleIndicator = false;
              needsDeclare = false;
              var statements2 = ts2.isSourceFileJS(sourceFile) ? factory.createNodeArray(transformDeclarationsForJS(sourceFile, true)) : ts2.visitNodes(sourceFile.statements, visitDeclarationStatements);
              var newFile = factory.updateSourceFile(sourceFile, [factory.createModuleDeclaration([], [factory.createModifier(135)], factory.createStringLiteral(ts2.getResolvedExternalModuleName(context.getEmitHost(), sourceFile)), factory.createModuleBlock(ts2.setTextRange(factory.createNodeArray(transformAndReplaceLatePaintedStatements(statements2)), sourceFile.statements)))], true, [], [], false, []);
              return newFile;
            }
            needsDeclare = true;
            var updated2 = ts2.isSourceFileJS(sourceFile) ? factory.createNodeArray(transformDeclarationsForJS(sourceFile)) : ts2.visitNodes(sourceFile.statements, visitDeclarationStatements);
            return factory.updateSourceFile(sourceFile, transformAndReplaceLatePaintedStatements(updated2), true, [], [], false, []);
          }), ts2.mapDefined(node.prepends, function(prepend) {
            if (prepend.kind === 306) {
              var sourceFile = ts2.createUnparsedSourceFile(prepend, "dts", stripInternal);
              hasNoDefaultLib_1 = hasNoDefaultLib_1 || !!sourceFile.hasNoDefaultLib;
              collectReferences(sourceFile, refs);
              recordTypeReferenceDirectivesIfNecessary(sourceFile.typeReferenceDirectives);
              collectLibs(sourceFile, libs);
              return sourceFile;
            }
            return prepend;
          }));
          bundle.syntheticFileReferences = [];
          bundle.syntheticTypeReferences = getFileReferencesForUsedTypeReferences();
          bundle.syntheticLibReferences = getLibReferences();
          bundle.hasNoDefaultLib = hasNoDefaultLib_1;
          var outputFilePath_1 = ts2.getDirectoryPath(ts2.normalizeSlashes(ts2.getOutputPathsFor(node, host, true).declarationFilePath));
          var referenceVisitor_1 = mapReferencesIntoArray(bundle.syntheticFileReferences, outputFilePath_1);
          refs.forEach(referenceVisitor_1);
          return bundle;
        }
        needsDeclare = true;
        needsScopeFixMarker = false;
        resultHasScopeMarker = false;
        enclosingDeclaration = node;
        currentSourceFile = node;
        getSymbolAccessibilityDiagnostic = throwDiagnostic;
        isBundledEmit = false;
        resultHasExternalModuleIndicator = false;
        suppressNewDiagnosticContexts = false;
        lateMarkedStatements = void 0;
        lateStatementReplacementMap = new ts2.Map();
        necessaryTypeReferences = void 0;
        refs = collectReferences(currentSourceFile, new ts2.Map());
        libs = collectLibs(currentSourceFile, new ts2.Map());
        var references = [];
        var outputFilePath = ts2.getDirectoryPath(ts2.normalizeSlashes(ts2.getOutputPathsFor(node, host, true).declarationFilePath));
        var referenceVisitor = mapReferencesIntoArray(references, outputFilePath);
        var combinedStatements;
        if (ts2.isSourceFileJS(currentSourceFile)) {
          combinedStatements = factory.createNodeArray(transformDeclarationsForJS(node));
          refs.forEach(referenceVisitor);
          emittedImports = ts2.filter(combinedStatements, ts2.isAnyImportSyntax);
        } else {
          var statements = ts2.visitNodes(node.statements, visitDeclarationStatements);
          combinedStatements = ts2.setTextRange(factory.createNodeArray(transformAndReplaceLatePaintedStatements(statements)), node.statements);
          refs.forEach(referenceVisitor);
          emittedImports = ts2.filter(combinedStatements, ts2.isAnyImportSyntax);
          if (ts2.isExternalModule(node) && (!resultHasExternalModuleIndicator || needsScopeFixMarker && !resultHasScopeMarker)) {
            combinedStatements = ts2.setTextRange(factory.createNodeArray(__spreadArray(__spreadArray([], combinedStatements, true), [ts2.createEmptyExports(factory)], false)), combinedStatements);
          }
        }
        var updated = factory.updateSourceFile(node, combinedStatements, true, references, getFileReferencesForUsedTypeReferences(), node.hasNoDefaultLib, getLibReferences());
        updated.exportedModulesFromDeclarationEmit = exportedModulesFromDeclarationEmit;
        return updated;
        function getLibReferences() {
          return ts2.map(ts2.arrayFrom(libs.keys()), function(lib) {
            return { fileName: lib, pos: -1, end: -1 };
          });
        }
        function getFileReferencesForUsedTypeReferences() {
          return necessaryTypeReferences ? ts2.mapDefined(ts2.arrayFrom(necessaryTypeReferences.keys()), getFileReferenceForTypeName) : [];
        }
        function getFileReferenceForTypeName(typeName) {
          if (emittedImports) {
            for (var _i = 0, emittedImports_1 = emittedImports; _i < emittedImports_1.length; _i++) {
              var importStatement = emittedImports_1[_i];
              if (ts2.isImportEqualsDeclaration(importStatement) && ts2.isExternalModuleReference(importStatement.moduleReference)) {
                var expr = importStatement.moduleReference.expression;
                if (ts2.isStringLiteralLike(expr) && expr.text === typeName) {
                  return void 0;
                }
              } else if (ts2.isImportDeclaration(importStatement) && ts2.isStringLiteral(importStatement.moduleSpecifier) && importStatement.moduleSpecifier.text === typeName) {
                return void 0;
              }
            }
          }
          return { fileName: typeName, pos: -1, end: -1 };
        }
        function mapReferencesIntoArray(references2, outputFilePath2) {
          return function(file) {
            var declFileName;
            if (file.isDeclarationFile) {
              declFileName = file.fileName;
            } else {
              if (isBundledEmit && ts2.contains(node.sourceFiles, file))
                return;
              var paths = ts2.getOutputPathsFor(file, host, true);
              declFileName = paths.declarationFilePath || paths.jsFilePath || file.fileName;
            }
            if (declFileName) {
              var specifier = ts2.moduleSpecifiers.getModuleSpecifier(options, currentSourceFile, ts2.toPath(outputFilePath2, host.getCurrentDirectory(), host.getCanonicalFileName), ts2.toPath(declFileName, host.getCurrentDirectory(), host.getCanonicalFileName), host);
              if (!ts2.pathIsRelative(specifier)) {
                recordTypeReferenceDirectivesIfNecessary([specifier]);
                return;
              }
              var fileName = ts2.getRelativePathToDirectoryOrUrl(outputFilePath2, declFileName, host.getCurrentDirectory(), host.getCanonicalFileName, false);
              if (ts2.startsWith(fileName, "./") && ts2.hasExtension(fileName)) {
                fileName = fileName.substring(2);
              }
              if (ts2.startsWith(fileName, "node_modules/") || ts2.pathContainsNodeModules(fileName)) {
                return;
              }
              references2.push({ pos: -1, end: -1, fileName });
            }
          };
        }
      }
      function collectReferences(sourceFile, ret) {
        if (noResolve || !ts2.isUnparsedSource(sourceFile) && ts2.isSourceFileJS(sourceFile))
          return ret;
        ts2.forEach(sourceFile.referencedFiles, function(f) {
          var elem = host.getSourceFileFromReference(sourceFile, f);
          if (elem) {
            ret.set(ts2.getOriginalNodeId(elem), elem);
          }
        });
        return ret;
      }
      function collectLibs(sourceFile, ret) {
        ts2.forEach(sourceFile.libReferenceDirectives, function(ref) {
          var lib = host.getLibFileFromReference(ref);
          if (lib) {
            ret.set(ts2.toFileNameLowerCase(ref.fileName), true);
          }
        });
        return ret;
      }
      function filterBindingPatternInitializers(name) {
        if (name.kind === 79) {
          return name;
        } else {
          if (name.kind === 201) {
            return factory.updateArrayBindingPattern(name, ts2.visitNodes(name.elements, visitBindingElement));
          } else {
            return factory.updateObjectBindingPattern(name, ts2.visitNodes(name.elements, visitBindingElement));
          }
        }
        function visitBindingElement(elem) {
          if (elem.kind === 226) {
            return elem;
          }
          return factory.updateBindingElement(elem, elem.dotDotDotToken, elem.propertyName, filterBindingPatternInitializers(elem.name), shouldPrintWithInitializer(elem) ? elem.initializer : void 0);
        }
      }
      function ensureParameter(p, modifierMask, type) {
        var oldDiag;
        if (!suppressNewDiagnosticContexts) {
          oldDiag = getSymbolAccessibilityDiagnostic;
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(p);
        }
        var newParam = factory.updateParameterDeclaration(p, void 0, maskModifiers(p, modifierMask), p.dotDotDotToken, filterBindingPatternInitializers(p.name), resolver.isOptionalParameter(p) ? p.questionToken || factory.createToken(57) : void 0, ensureType(p, type || p.type, true), ensureNoInitializer(p));
        if (!suppressNewDiagnosticContexts) {
          getSymbolAccessibilityDiagnostic = oldDiag;
        }
        return newParam;
      }
      function shouldPrintWithInitializer(node) {
        return canHaveLiteralInitializer(node) && resolver.isLiteralConstDeclaration(ts2.getParseTreeNode(node));
      }
      function ensureNoInitializer(node) {
        if (shouldPrintWithInitializer(node)) {
          return resolver.createLiteralConstValue(ts2.getParseTreeNode(node), symbolTracker);
        }
        return void 0;
      }
      function ensureType(node, type, ignorePrivate) {
        if (!ignorePrivate && ts2.hasEffectiveModifier(node, 8)) {
          return;
        }
        if (shouldPrintWithInitializer(node)) {
          return;
        }
        var shouldUseResolverType = node.kind === 163 && (resolver.isRequiredInitializedParameter(node) || resolver.isOptionalUninitializedParameterProperty(node));
        if (type && !shouldUseResolverType) {
          return ts2.visitNode(type, visitDeclarationSubtree);
        }
        if (!ts2.getParseTreeNode(node)) {
          return type ? ts2.visitNode(type, visitDeclarationSubtree) : factory.createKeywordTypeNode(130);
        }
        if (node.kind === 172) {
          return factory.createKeywordTypeNode(130);
        }
        errorNameNode = node.name;
        var oldDiag;
        if (!suppressNewDiagnosticContexts) {
          oldDiag = getSymbolAccessibilityDiagnostic;
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(node);
        }
        if (node.kind === 253 || node.kind === 202) {
          return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
        }
        if (node.kind === 163 || node.kind === 166 || node.kind === 165) {
          if (!node.initializer)
            return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType));
          return cleanup(resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker, shouldUseResolverType) || resolver.createTypeOfExpression(node.initializer, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
        }
        return cleanup(resolver.createReturnTypeOfSignatureDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker));
        function cleanup(returnValue) {
          errorNameNode = void 0;
          if (!suppressNewDiagnosticContexts) {
            getSymbolAccessibilityDiagnostic = oldDiag;
          }
          return returnValue || factory.createKeywordTypeNode(130);
        }
      }
      function isDeclarationAndNotVisible(node) {
        node = ts2.getParseTreeNode(node);
        switch (node.kind) {
          case 255:
          case 260:
          case 257:
          case 256:
          case 258:
          case 259:
            return !resolver.isDeclarationVisible(node);
          case 253:
            return !getBindingNameVisible(node);
          case 264:
          case 265:
          case 271:
          case 270:
            return false;
          case 169:
            return true;
        }
        return false;
      }
      function shouldEmitFunctionProperties(input) {
        var _a;
        if (input.body) {
          return true;
        }
        var overloadSignatures = (_a = input.symbol.declarations) === null || _a === void 0 ? void 0 : _a.filter(function(decl) {
          return ts2.isFunctionDeclaration(decl) && !decl.body;
        });
        return !overloadSignatures || overloadSignatures.indexOf(input) === overloadSignatures.length - 1;
      }
      function getBindingNameVisible(elem) {
        if (ts2.isOmittedExpression(elem)) {
          return false;
        }
        if (ts2.isBindingPattern(elem.name)) {
          return ts2.some(elem.name.elements, getBindingNameVisible);
        } else {
          return resolver.isDeclarationVisible(elem);
        }
      }
      function updateParamsList(node, params, modifierMask) {
        if (ts2.hasEffectiveModifier(node, 8)) {
          return void 0;
        }
        var newParams = ts2.map(params, function(p) {
          return ensureParameter(p, modifierMask);
        });
        if (!newParams) {
          return void 0;
        }
        return factory.createNodeArray(newParams, params.hasTrailingComma);
      }
      function updateAccessorParamsList(input, isPrivate) {
        var newParams;
        if (!isPrivate) {
          var thisParameter = ts2.getThisParameter(input);
          if (thisParameter) {
            newParams = [ensureParameter(thisParameter)];
          }
        }
        if (ts2.isSetAccessorDeclaration(input)) {
          var newValueParameter = void 0;
          if (!isPrivate) {
            var valueParameter = ts2.getSetAccessorValueParameter(input);
            if (valueParameter) {
              var accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
              newValueParameter = ensureParameter(valueParameter, void 0, accessorType);
            }
          }
          if (!newValueParameter) {
            newValueParameter = factory.createParameterDeclaration(void 0, void 0, void 0, "value");
          }
          newParams = ts2.append(newParams, newValueParameter);
        }
        return factory.createNodeArray(newParams || ts2.emptyArray);
      }
      function ensureTypeParams(node, params) {
        return ts2.hasEffectiveModifier(node, 8) ? void 0 : ts2.visitNodes(params, visitDeclarationSubtree);
      }
      function isEnclosingDeclaration(node) {
        return ts2.isSourceFile(node) || ts2.isTypeAliasDeclaration(node) || ts2.isModuleDeclaration(node) || ts2.isClassDeclaration(node) || ts2.isInterfaceDeclaration(node) || ts2.isFunctionLike(node) || ts2.isIndexSignatureDeclaration(node) || ts2.isMappedTypeNode(node);
      }
      function checkEntityNameVisibility(entityName, enclosingDeclaration2) {
        var visibilityResult = resolver.isEntityNameVisible(entityName, enclosingDeclaration2);
        handleSymbolAccessibilityError(visibilityResult);
        recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForEntityName(entityName));
      }
      function preserveJsDoc(updated, original) {
        if (ts2.hasJSDocNodes(updated) && ts2.hasJSDocNodes(original)) {
          updated.jsDoc = original.jsDoc;
        }
        return ts2.setCommentRange(updated, ts2.getCommentRange(original));
      }
      function rewriteModuleSpecifier(parent, input) {
        if (!input)
          return void 0;
        resultHasExternalModuleIndicator = resultHasExternalModuleIndicator || parent.kind !== 260 && parent.kind !== 199;
        if (ts2.isStringLiteralLike(input)) {
          if (isBundledEmit) {
            var newName = ts2.getExternalModuleNameFromDeclaration(context.getEmitHost(), resolver, parent);
            if (newName) {
              return factory.createStringLiteral(newName);
            }
          } else {
            var symbol = resolver.getSymbolOfExternalModuleSpecifier(input);
            if (symbol) {
              (exportedModulesFromDeclarationEmit || (exportedModulesFromDeclarationEmit = [])).push(symbol);
            }
          }
        }
        return input;
      }
      function transformImportEqualsDeclaration(decl) {
        if (!resolver.isDeclarationVisible(decl))
          return;
        if (decl.moduleReference.kind === 276) {
          var specifier = ts2.getExternalModuleImportEqualsDeclarationExpression(decl);
          return factory.updateImportEqualsDeclaration(decl, void 0, decl.modifiers, decl.isTypeOnly, decl.name, factory.updateExternalModuleReference(decl.moduleReference, rewriteModuleSpecifier(decl, specifier)));
        } else {
          var oldDiag = getSymbolAccessibilityDiagnostic;
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(decl);
          checkEntityNameVisibility(decl.moduleReference, enclosingDeclaration);
          getSymbolAccessibilityDiagnostic = oldDiag;
          return decl;
        }
      }
      function transformImportDeclaration(decl) {
        if (!decl.importClause) {
          return factory.updateImportDeclaration(decl, void 0, decl.modifiers, decl.importClause, rewriteModuleSpecifier(decl, decl.moduleSpecifier), void 0);
        }
        var visibleDefaultBinding = decl.importClause && decl.importClause.name && resolver.isDeclarationVisible(decl.importClause) ? decl.importClause.name : void 0;
        if (!decl.importClause.namedBindings) {
          return visibleDefaultBinding && factory.updateImportDeclaration(decl, void 0, decl.modifiers, factory.updateImportClause(decl.importClause, decl.importClause.isTypeOnly, visibleDefaultBinding, void 0), rewriteModuleSpecifier(decl, decl.moduleSpecifier), void 0);
        }
        if (decl.importClause.namedBindings.kind === 267) {
          var namedBindings = resolver.isDeclarationVisible(decl.importClause.namedBindings) ? decl.importClause.namedBindings : void 0;
          return visibleDefaultBinding || namedBindings ? factory.updateImportDeclaration(decl, void 0, decl.modifiers, factory.updateImportClause(decl.importClause, decl.importClause.isTypeOnly, visibleDefaultBinding, namedBindings), rewriteModuleSpecifier(decl, decl.moduleSpecifier), void 0) : void 0;
        }
        var bindingList = ts2.mapDefined(decl.importClause.namedBindings.elements, function(b) {
          return resolver.isDeclarationVisible(b) ? b : void 0;
        });
        if (bindingList && bindingList.length || visibleDefaultBinding) {
          return factory.updateImportDeclaration(decl, void 0, decl.modifiers, factory.updateImportClause(decl.importClause, decl.importClause.isTypeOnly, visibleDefaultBinding, bindingList && bindingList.length ? factory.updateNamedImports(decl.importClause.namedBindings, bindingList) : void 0), rewriteModuleSpecifier(decl, decl.moduleSpecifier), void 0);
        }
        if (resolver.isImportRequiredByAugmentation(decl)) {
          return factory.updateImportDeclaration(decl, void 0, decl.modifiers, void 0, rewriteModuleSpecifier(decl, decl.moduleSpecifier), void 0);
        }
      }
      function transformAndReplaceLatePaintedStatements(statements) {
        while (ts2.length(lateMarkedStatements)) {
          var i = lateMarkedStatements.shift();
          if (!ts2.isLateVisibilityPaintedStatement(i)) {
            return ts2.Debug.fail("Late replaced statement was found which is not handled by the declaration transformer!: ".concat(ts2.SyntaxKind ? ts2.SyntaxKind[i.kind] : i.kind));
          }
          var priorNeedsDeclare = needsDeclare;
          needsDeclare = i.parent && ts2.isSourceFile(i.parent) && !(ts2.isExternalModule(i.parent) && isBundledEmit);
          var result = transformTopLevelDeclaration(i);
          needsDeclare = priorNeedsDeclare;
          lateStatementReplacementMap.set(ts2.getOriginalNodeId(i), result);
        }
        return ts2.visitNodes(statements, visitLateVisibilityMarkedStatements);
        function visitLateVisibilityMarkedStatements(statement) {
          if (ts2.isLateVisibilityPaintedStatement(statement)) {
            var key = ts2.getOriginalNodeId(statement);
            if (lateStatementReplacementMap.has(key)) {
              var result2 = lateStatementReplacementMap.get(key);
              lateStatementReplacementMap.delete(key);
              if (result2) {
                if (ts2.isArray(result2) ? ts2.some(result2, ts2.needsScopeMarker) : ts2.needsScopeMarker(result2)) {
                  needsScopeFixMarker = true;
                }
                if (ts2.isSourceFile(statement.parent) && (ts2.isArray(result2) ? ts2.some(result2, ts2.isExternalModuleIndicator) : ts2.isExternalModuleIndicator(result2))) {
                  resultHasExternalModuleIndicator = true;
                }
              }
              return result2;
            }
          }
          return statement;
        }
      }
      function visitDeclarationSubtree(input) {
        if (shouldStripInternal(input))
          return;
        if (ts2.isDeclaration(input)) {
          if (isDeclarationAndNotVisible(input))
            return;
          if (ts2.hasDynamicName(input) && !resolver.isLateBound(ts2.getParseTreeNode(input))) {
            return;
          }
        }
        if (ts2.isFunctionLike(input) && resolver.isImplementationOfOverload(input))
          return;
        if (ts2.isSemicolonClassElement(input))
          return;
        var previousEnclosingDeclaration;
        if (isEnclosingDeclaration(input)) {
          previousEnclosingDeclaration = enclosingDeclaration;
          enclosingDeclaration = input;
        }
        var oldDiag = getSymbolAccessibilityDiagnostic;
        var canProduceDiagnostic = ts2.canProduceDiagnostics(input);
        var oldWithinObjectLiteralType = suppressNewDiagnosticContexts;
        var shouldEnterSuppressNewDiagnosticsContextContext = (input.kind === 181 || input.kind === 194) && input.parent.kind !== 258;
        if (ts2.isMethodDeclaration(input) || ts2.isMethodSignature(input)) {
          if (ts2.hasEffectiveModifier(input, 8)) {
            if (input.symbol && input.symbol.declarations && input.symbol.declarations[0] !== input)
              return;
            return cleanup(factory.createPropertyDeclaration(void 0, ensureModifiers(input), input.name, void 0, void 0, void 0));
          }
        }
        if (canProduceDiagnostic && !suppressNewDiagnosticContexts) {
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(input);
        }
        if (ts2.isTypeQueryNode(input)) {
          checkEntityNameVisibility(input.exprName, enclosingDeclaration);
        }
        if (shouldEnterSuppressNewDiagnosticsContextContext) {
          suppressNewDiagnosticContexts = true;
        }
        if (isProcessedComponent(input)) {
          switch (input.kind) {
            case 227: {
              if (ts2.isEntityName(input.expression) || ts2.isEntityNameExpression(input.expression)) {
                checkEntityNameVisibility(input.expression, enclosingDeclaration);
              }
              var node = ts2.visitEachChild(input, visitDeclarationSubtree, context);
              return cleanup(factory.updateExpressionWithTypeArguments(node, node.expression, node.typeArguments));
            }
            case 177: {
              checkEntityNameVisibility(input.typeName, enclosingDeclaration);
              var node = ts2.visitEachChild(input, visitDeclarationSubtree, context);
              return cleanup(factory.updateTypeReferenceNode(node, node.typeName, node.typeArguments));
            }
            case 174:
              return cleanup(factory.updateConstructSignature(input, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type)));
            case 170: {
              var ctor = factory.createConstructorDeclaration(void 0, ensureModifiers(input), updateParamsList(input, input.parameters, 0), void 0);
              return cleanup(ctor);
            }
            case 168: {
              if (ts2.isPrivateIdentifier(input.name)) {
                return cleanup(void 0);
              }
              var sig = factory.createMethodDeclaration(void 0, ensureModifiers(input), void 0, input.name, input.questionToken, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), void 0);
              return cleanup(sig);
            }
            case 171: {
              if (ts2.isPrivateIdentifier(input.name)) {
                return cleanup(void 0);
              }
              var accessorType = getTypeAnnotationFromAllAccessorDeclarations(input, resolver.getAllAccessorDeclarations(input));
              return cleanup(factory.updateGetAccessorDeclaration(input, void 0, ensureModifiers(input), input.name, updateAccessorParamsList(input, ts2.hasEffectiveModifier(input, 8)), ensureType(input, accessorType), void 0));
            }
            case 172: {
              if (ts2.isPrivateIdentifier(input.name)) {
                return cleanup(void 0);
              }
              return cleanup(factory.updateSetAccessorDeclaration(input, void 0, ensureModifiers(input), input.name, updateAccessorParamsList(input, ts2.hasEffectiveModifier(input, 8)), void 0));
            }
            case 166:
              if (ts2.isPrivateIdentifier(input.name)) {
                return cleanup(void 0);
              }
              return cleanup(factory.updatePropertyDeclaration(input, void 0, ensureModifiers(input), input.name, input.questionToken, ensureType(input, input.type), ensureNoInitializer(input)));
            case 165:
              if (ts2.isPrivateIdentifier(input.name)) {
                return cleanup(void 0);
              }
              return cleanup(factory.updatePropertySignature(input, ensureModifiers(input), input.name, input.questionToken, ensureType(input, input.type)));
            case 167: {
              if (ts2.isPrivateIdentifier(input.name)) {
                return cleanup(void 0);
              }
              return cleanup(factory.updateMethodSignature(input, ensureModifiers(input), input.name, input.questionToken, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type)));
            }
            case 173: {
              return cleanup(factory.updateCallSignature(input, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type)));
            }
            case 175: {
              return cleanup(factory.updateIndexSignature(input, void 0, ensureModifiers(input), updateParamsList(input, input.parameters), ts2.visitNode(input.type, visitDeclarationSubtree) || factory.createKeywordTypeNode(130)));
            }
            case 253: {
              if (ts2.isBindingPattern(input.name)) {
                return recreateBindingPattern(input.name);
              }
              shouldEnterSuppressNewDiagnosticsContextContext = true;
              suppressNewDiagnosticContexts = true;
              return cleanup(factory.updateVariableDeclaration(input, input.name, void 0, ensureType(input, input.type), ensureNoInitializer(input)));
            }
            case 162: {
              if (isPrivateMethodTypeParameter(input) && (input.default || input.constraint)) {
                return cleanup(factory.updateTypeParameterDeclaration(input, input.name, void 0, void 0));
              }
              return cleanup(ts2.visitEachChild(input, visitDeclarationSubtree, context));
            }
            case 188: {
              var checkType = ts2.visitNode(input.checkType, visitDeclarationSubtree);
              var extendsType = ts2.visitNode(input.extendsType, visitDeclarationSubtree);
              var oldEnclosingDecl = enclosingDeclaration;
              enclosingDeclaration = input.trueType;
              var trueType = ts2.visitNode(input.trueType, visitDeclarationSubtree);
              enclosingDeclaration = oldEnclosingDecl;
              var falseType = ts2.visitNode(input.falseType, visitDeclarationSubtree);
              return cleanup(factory.updateConditionalTypeNode(input, checkType, extendsType, trueType, falseType));
            }
            case 178: {
              return cleanup(factory.updateFunctionTypeNode(input, ts2.visitNodes(input.typeParameters, visitDeclarationSubtree), updateParamsList(input, input.parameters), ts2.visitNode(input.type, visitDeclarationSubtree)));
            }
            case 179: {
              return cleanup(factory.updateConstructorTypeNode(input, ensureModifiers(input), ts2.visitNodes(input.typeParameters, visitDeclarationSubtree), updateParamsList(input, input.parameters), ts2.visitNode(input.type, visitDeclarationSubtree)));
            }
            case 199: {
              if (!ts2.isLiteralImportTypeNode(input))
                return cleanup(input);
              return cleanup(factory.updateImportTypeNode(input, factory.updateLiteralTypeNode(input.argument, rewriteModuleSpecifier(input, input.argument.literal)), input.qualifier, ts2.visitNodes(input.typeArguments, visitDeclarationSubtree, ts2.isTypeNode), input.isTypeOf));
            }
            default:
              ts2.Debug.assertNever(input, "Attempted to process unhandled node kind: ".concat(ts2.SyntaxKind[input.kind]));
          }
        }
        if (ts2.isTupleTypeNode(input) && ts2.getLineAndCharacterOfPosition(currentSourceFile, input.pos).line === ts2.getLineAndCharacterOfPosition(currentSourceFile, input.end).line) {
          ts2.setEmitFlags(input, 1);
        }
        return cleanup(ts2.visitEachChild(input, visitDeclarationSubtree, context));
        function cleanup(returnValue) {
          if (returnValue && canProduceDiagnostic && ts2.hasDynamicName(input)) {
            checkName(input);
          }
          if (isEnclosingDeclaration(input)) {
            enclosingDeclaration = previousEnclosingDeclaration;
          }
          if (canProduceDiagnostic && !suppressNewDiagnosticContexts) {
            getSymbolAccessibilityDiagnostic = oldDiag;
          }
          if (shouldEnterSuppressNewDiagnosticsContextContext) {
            suppressNewDiagnosticContexts = oldWithinObjectLiteralType;
          }
          if (returnValue === input) {
            return returnValue;
          }
          return returnValue && ts2.setOriginalNode(preserveJsDoc(returnValue, input), input);
        }
      }
      function isPrivateMethodTypeParameter(node) {
        return node.parent.kind === 168 && ts2.hasEffectiveModifier(node.parent, 8);
      }
      function visitDeclarationStatements(input) {
        if (!isPreservedDeclarationStatement(input)) {
          return;
        }
        if (shouldStripInternal(input))
          return;
        switch (input.kind) {
          case 271: {
            if (ts2.isSourceFile(input.parent)) {
              resultHasExternalModuleIndicator = true;
            }
            resultHasScopeMarker = true;
            return factory.updateExportDeclaration(input, void 0, input.modifiers, input.isTypeOnly, input.exportClause, rewriteModuleSpecifier(input, input.moduleSpecifier), void 0);
          }
          case 270: {
            if (ts2.isSourceFile(input.parent)) {
              resultHasExternalModuleIndicator = true;
            }
            resultHasScopeMarker = true;
            if (input.expression.kind === 79) {
              return input;
            } else {
              var newId = factory.createUniqueName("_default", 16);
              getSymbolAccessibilityDiagnostic = function() {
                return {
                  diagnosticMessage: ts2.Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
                  errorNode: input
                };
              };
              errorFallbackNode = input;
              var varDecl = factory.createVariableDeclaration(newId, void 0, resolver.createTypeOfExpression(input.expression, input, declarationEmitNodeBuilderFlags, symbolTracker), void 0);
              errorFallbackNode = void 0;
              var statement = factory.createVariableStatement(needsDeclare ? [factory.createModifier(135)] : [], factory.createVariableDeclarationList([varDecl], 2));
              return [statement, factory.updateExportAssignment(input, input.decorators, input.modifiers, newId)];
            }
          }
        }
        var result = transformTopLevelDeclaration(input);
        lateStatementReplacementMap.set(ts2.getOriginalNodeId(input), result);
        return input;
      }
      function stripExportModifiers(statement) {
        if (ts2.isImportEqualsDeclaration(statement) || ts2.hasEffectiveModifier(statement, 512) || !ts2.canHaveModifiers(statement)) {
          return statement;
        }
        var modifiers = factory.createModifiersFromModifierFlags(ts2.getEffectiveModifierFlags(statement) & (27647 ^ 1));
        return factory.updateModifiers(statement, modifiers);
      }
      function transformTopLevelDeclaration(input) {
        if (shouldStripInternal(input))
          return;
        switch (input.kind) {
          case 264: {
            return transformImportEqualsDeclaration(input);
          }
          case 265: {
            return transformImportDeclaration(input);
          }
        }
        if (ts2.isDeclaration(input) && isDeclarationAndNotVisible(input))
          return;
        if (ts2.isFunctionLike(input) && resolver.isImplementationOfOverload(input))
          return;
        var previousEnclosingDeclaration;
        if (isEnclosingDeclaration(input)) {
          previousEnclosingDeclaration = enclosingDeclaration;
          enclosingDeclaration = input;
        }
        var canProdiceDiagnostic = ts2.canProduceDiagnostics(input);
        var oldDiag = getSymbolAccessibilityDiagnostic;
        if (canProdiceDiagnostic) {
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(input);
        }
        var previousNeedsDeclare = needsDeclare;
        switch (input.kind) {
          case 258:
            return cleanup(factory.updateTypeAliasDeclaration(input, void 0, ensureModifiers(input), input.name, ts2.visitNodes(input.typeParameters, visitDeclarationSubtree, ts2.isTypeParameterDeclaration), ts2.visitNode(input.type, visitDeclarationSubtree, ts2.isTypeNode)));
          case 257: {
            return cleanup(factory.updateInterfaceDeclaration(input, void 0, ensureModifiers(input), input.name, ensureTypeParams(input, input.typeParameters), transformHeritageClauses(input.heritageClauses), ts2.visitNodes(input.members, visitDeclarationSubtree)));
          }
          case 255: {
            var clean = cleanup(factory.updateFunctionDeclaration(input, void 0, ensureModifiers(input), void 0, input.name, ensureTypeParams(input, input.typeParameters), updateParamsList(input, input.parameters), ensureType(input, input.type), void 0));
            if (clean && resolver.isExpandoFunctionDeclaration(input) && shouldEmitFunctionProperties(input)) {
              var props = resolver.getPropertiesOfContainerFunction(input);
              var fakespace_1 = ts2.parseNodeFactory.createModuleDeclaration(void 0, void 0, clean.name || factory.createIdentifier("_default"), factory.createModuleBlock([]), 16);
              ts2.setParent(fakespace_1, enclosingDeclaration);
              fakespace_1.locals = ts2.createSymbolTable(props);
              fakespace_1.symbol = props[0].parent;
              var exportMappings_1 = [];
              var declarations = ts2.mapDefined(props, function(p) {
                if (!p.valueDeclaration || !ts2.isPropertyAccessExpression(p.valueDeclaration)) {
                  return void 0;
                }
                getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(p.valueDeclaration);
                var type = resolver.createTypeOfDeclaration(p.valueDeclaration, fakespace_1, declarationEmitNodeBuilderFlags, symbolTracker);
                getSymbolAccessibilityDiagnostic = oldDiag;
                var nameStr = ts2.unescapeLeadingUnderscores(p.escapedName);
                var isNonContextualKeywordName = ts2.isStringANonContextualKeyword(nameStr);
                var name = isNonContextualKeywordName ? factory.getGeneratedNameForNode(p.valueDeclaration) : factory.createIdentifier(nameStr);
                if (isNonContextualKeywordName) {
                  exportMappings_1.push([name, nameStr]);
                }
                var varDecl2 = factory.createVariableDeclaration(name, void 0, type, void 0);
                return factory.createVariableStatement(isNonContextualKeywordName ? void 0 : [factory.createToken(93)], factory.createVariableDeclarationList([varDecl2]));
              });
              if (!exportMappings_1.length) {
                declarations = ts2.mapDefined(declarations, function(declaration) {
                  return factory.updateModifiers(declaration, 0);
                });
              } else {
                declarations.push(factory.createExportDeclaration(void 0, void 0, false, factory.createNamedExports(ts2.map(exportMappings_1, function(_a) {
                  var gen = _a[0], exp = _a[1];
                  return factory.createExportSpecifier(false, gen, exp);
                }))));
              }
              var namespaceDecl = factory.createModuleDeclaration(void 0, ensureModifiers(input), input.name, factory.createModuleBlock(declarations), 16);
              if (!ts2.hasEffectiveModifier(clean, 512)) {
                return [clean, namespaceDecl];
              }
              var modifiers = factory.createModifiersFromModifierFlags(ts2.getEffectiveModifierFlags(clean) & ~513 | 2);
              var cleanDeclaration = factory.updateFunctionDeclaration(clean, void 0, modifiers, void 0, clean.name, clean.typeParameters, clean.parameters, clean.type, void 0);
              var namespaceDeclaration = factory.updateModuleDeclaration(namespaceDecl, void 0, modifiers, namespaceDecl.name, namespaceDecl.body);
              var exportDefaultDeclaration = factory.createExportAssignment(void 0, void 0, false, namespaceDecl.name);
              if (ts2.isSourceFile(input.parent)) {
                resultHasExternalModuleIndicator = true;
              }
              resultHasScopeMarker = true;
              return [cleanDeclaration, namespaceDeclaration, exportDefaultDeclaration];
            } else {
              return clean;
            }
          }
          case 260: {
            needsDeclare = false;
            var inner = input.body;
            if (inner && inner.kind === 261) {
              var oldNeedsScopeFix = needsScopeFixMarker;
              var oldHasScopeFix = resultHasScopeMarker;
              resultHasScopeMarker = false;
              needsScopeFixMarker = false;
              var statements = ts2.visitNodes(inner.statements, visitDeclarationStatements);
              var lateStatements = transformAndReplaceLatePaintedStatements(statements);
              if (input.flags & 8388608) {
                needsScopeFixMarker = false;
              }
              if (!ts2.isGlobalScopeAugmentation(input) && !hasScopeMarker(lateStatements) && !resultHasScopeMarker) {
                if (needsScopeFixMarker) {
                  lateStatements = factory.createNodeArray(__spreadArray(__spreadArray([], lateStatements, true), [ts2.createEmptyExports(factory)], false));
                } else {
                  lateStatements = ts2.visitNodes(lateStatements, stripExportModifiers);
                }
              }
              var body = factory.updateModuleBlock(inner, lateStatements);
              needsDeclare = previousNeedsDeclare;
              needsScopeFixMarker = oldNeedsScopeFix;
              resultHasScopeMarker = oldHasScopeFix;
              var mods = ensureModifiers(input);
              return cleanup(factory.updateModuleDeclaration(input, void 0, mods, ts2.isExternalModuleAugmentation(input) ? rewriteModuleSpecifier(input, input.name) : input.name, body));
            } else {
              needsDeclare = previousNeedsDeclare;
              var mods = ensureModifiers(input);
              needsDeclare = false;
              ts2.visitNode(inner, visitDeclarationStatements);
              var id = ts2.getOriginalNodeId(inner);
              var body = lateStatementReplacementMap.get(id);
              lateStatementReplacementMap.delete(id);
              return cleanup(factory.updateModuleDeclaration(input, void 0, mods, input.name, body));
            }
          }
          case 256: {
            errorNameNode = input.name;
            errorFallbackNode = input;
            var modifiers = factory.createNodeArray(ensureModifiers(input));
            var typeParameters = ensureTypeParams(input, input.typeParameters);
            var ctor = ts2.getFirstConstructorWithBody(input);
            var parameterProperties = void 0;
            if (ctor) {
              var oldDiag_1 = getSymbolAccessibilityDiagnostic;
              parameterProperties = ts2.compact(ts2.flatMap(ctor.parameters, function(param) {
                if (!ts2.hasSyntacticModifier(param, 16476) || shouldStripInternal(param))
                  return;
                getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(param);
                if (param.name.kind === 79) {
                  return preserveJsDoc(factory.createPropertyDeclaration(void 0, ensureModifiers(param), param.name, param.questionToken, ensureType(param, param.type), ensureNoInitializer(param)), param);
                } else {
                  return walkBindingPattern(param.name);
                }
                function walkBindingPattern(pattern) {
                  var elems;
                  for (var _i = 0, _a = pattern.elements; _i < _a.length; _i++) {
                    var elem = _a[_i];
                    if (ts2.isOmittedExpression(elem))
                      continue;
                    if (ts2.isBindingPattern(elem.name)) {
                      elems = ts2.concatenate(elems, walkBindingPattern(elem.name));
                    }
                    elems = elems || [];
                    elems.push(factory.createPropertyDeclaration(void 0, ensureModifiers(param), elem.name, void 0, ensureType(elem, void 0), void 0));
                  }
                  return elems;
                }
              }));
              getSymbolAccessibilityDiagnostic = oldDiag_1;
            }
            var hasPrivateIdentifier = ts2.some(input.members, function(member) {
              return !!member.name && ts2.isPrivateIdentifier(member.name);
            });
            var privateIdentifier = hasPrivateIdentifier ? [
              factory.createPropertyDeclaration(void 0, void 0, factory.createPrivateIdentifier("#private"), void 0, void 0, void 0)
            ] : void 0;
            var memberNodes = ts2.concatenate(ts2.concatenate(privateIdentifier, parameterProperties), ts2.visitNodes(input.members, visitDeclarationSubtree));
            var members = factory.createNodeArray(memberNodes);
            var extendsClause_1 = ts2.getEffectiveBaseTypeNode(input);
            if (extendsClause_1 && !ts2.isEntityNameExpression(extendsClause_1.expression) && extendsClause_1.expression.kind !== 104) {
              var oldId = input.name ? ts2.unescapeLeadingUnderscores(input.name.escapedText) : "default";
              var newId_1 = factory.createUniqueName("".concat(oldId, "_base"), 16);
              getSymbolAccessibilityDiagnostic = function() {
                return {
                  diagnosticMessage: ts2.Diagnostics.extends_clause_of_exported_class_0_has_or_is_using_private_name_1,
                  errorNode: extendsClause_1,
                  typeName: input.name
                };
              };
              var varDecl = factory.createVariableDeclaration(newId_1, void 0, resolver.createTypeOfExpression(extendsClause_1.expression, input, declarationEmitNodeBuilderFlags, symbolTracker), void 0);
              var statement = factory.createVariableStatement(needsDeclare ? [factory.createModifier(135)] : [], factory.createVariableDeclarationList([varDecl], 2));
              var heritageClauses = factory.createNodeArray(ts2.map(input.heritageClauses, function(clause) {
                if (clause.token === 94) {
                  var oldDiag_2 = getSymbolAccessibilityDiagnostic;
                  getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(clause.types[0]);
                  var newClause = factory.updateHeritageClause(clause, ts2.map(clause.types, function(t) {
                    return factory.updateExpressionWithTypeArguments(t, newId_1, ts2.visitNodes(t.typeArguments, visitDeclarationSubtree));
                  }));
                  getSymbolAccessibilityDiagnostic = oldDiag_2;
                  return newClause;
                }
                return factory.updateHeritageClause(clause, ts2.visitNodes(factory.createNodeArray(ts2.filter(clause.types, function(t) {
                  return ts2.isEntityNameExpression(t.expression) || t.expression.kind === 104;
                })), visitDeclarationSubtree));
              }));
              return [statement, cleanup(factory.updateClassDeclaration(input, void 0, modifiers, input.name, typeParameters, heritageClauses, members))];
            } else {
              var heritageClauses = transformHeritageClauses(input.heritageClauses);
              return cleanup(factory.updateClassDeclaration(input, void 0, modifiers, input.name, typeParameters, heritageClauses, members));
            }
          }
          case 236: {
            return cleanup(transformVariableStatement(input));
          }
          case 259: {
            return cleanup(factory.updateEnumDeclaration(input, void 0, factory.createNodeArray(ensureModifiers(input)), input.name, factory.createNodeArray(ts2.mapDefined(input.members, function(m) {
              if (shouldStripInternal(m))
                return;
              var constValue = resolver.getConstantValue(m);
              return preserveJsDoc(factory.updateEnumMember(m, m.name, constValue !== void 0 ? typeof constValue === "string" ? factory.createStringLiteral(constValue) : factory.createNumericLiteral(constValue) : void 0), m);
            }))));
          }
        }
        return ts2.Debug.assertNever(input, "Unhandled top-level node in declaration emit: ".concat(ts2.SyntaxKind[input.kind]));
        function cleanup(node) {
          if (isEnclosingDeclaration(input)) {
            enclosingDeclaration = previousEnclosingDeclaration;
          }
          if (canProdiceDiagnostic) {
            getSymbolAccessibilityDiagnostic = oldDiag;
          }
          if (input.kind === 260) {
            needsDeclare = previousNeedsDeclare;
          }
          if (node === input) {
            return node;
          }
          errorFallbackNode = void 0;
          errorNameNode = void 0;
          return node && ts2.setOriginalNode(preserveJsDoc(node, input), input);
        }
      }
      function transformVariableStatement(input) {
        if (!ts2.forEach(input.declarationList.declarations, getBindingNameVisible))
          return;
        var nodes = ts2.visitNodes(input.declarationList.declarations, visitDeclarationSubtree);
        if (!ts2.length(nodes))
          return;
        return factory.updateVariableStatement(input, factory.createNodeArray(ensureModifiers(input)), factory.updateVariableDeclarationList(input.declarationList, nodes));
      }
      function recreateBindingPattern(d) {
        return ts2.flatten(ts2.mapDefined(d.elements, function(e) {
          return recreateBindingElement(e);
        }));
      }
      function recreateBindingElement(e) {
        if (e.kind === 226) {
          return;
        }
        if (e.name) {
          if (!getBindingNameVisible(e))
            return;
          if (ts2.isBindingPattern(e.name)) {
            return recreateBindingPattern(e.name);
          } else {
            return factory.createVariableDeclaration(e.name, void 0, ensureType(e, void 0), void 0);
          }
        }
      }
      function checkName(node) {
        var oldDiag;
        if (!suppressNewDiagnosticContexts) {
          oldDiag = getSymbolAccessibilityDiagnostic;
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNodeName(node);
        }
        errorNameNode = node.name;
        ts2.Debug.assert(resolver.isLateBound(ts2.getParseTreeNode(node)));
        var decl = node;
        var entityName = decl.name.expression;
        checkEntityNameVisibility(entityName, enclosingDeclaration);
        if (!suppressNewDiagnosticContexts) {
          getSymbolAccessibilityDiagnostic = oldDiag;
        }
        errorNameNode = void 0;
      }
      function shouldStripInternal(node) {
        return !!stripInternal && !!node && isInternalDeclaration(node, currentSourceFile);
      }
      function isScopeMarker(node) {
        return ts2.isExportAssignment(node) || ts2.isExportDeclaration(node);
      }
      function hasScopeMarker(statements) {
        return ts2.some(statements, isScopeMarker);
      }
      function ensureModifiers(node) {
        var currentFlags = ts2.getEffectiveModifierFlags(node);
        var newFlags = ensureModifierFlags(node);
        if (currentFlags === newFlags) {
          return node.modifiers;
        }
        return factory.createModifiersFromModifierFlags(newFlags);
      }
      function ensureModifierFlags(node) {
        var mask = 27647 ^ (4 | 256 | 16384);
        var additions = needsDeclare && !isAlwaysType(node) ? 2 : 0;
        var parentIsFile = node.parent.kind === 303;
        if (!parentIsFile || isBundledEmit && parentIsFile && ts2.isExternalModule(node.parent)) {
          mask ^= 2;
          additions = 0;
        }
        return maskModifierFlags(node, mask, additions);
      }
      function getTypeAnnotationFromAllAccessorDeclarations(node, accessors) {
        var accessorType = getTypeAnnotationFromAccessor(node);
        if (!accessorType && node !== accessors.firstAccessor) {
          accessorType = getTypeAnnotationFromAccessor(accessors.firstAccessor);
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(accessors.firstAccessor);
        }
        if (!accessorType && accessors.secondAccessor && node !== accessors.secondAccessor) {
          accessorType = getTypeAnnotationFromAccessor(accessors.secondAccessor);
          getSymbolAccessibilityDiagnostic = ts2.createGetSymbolAccessibilityDiagnosticForNode(accessors.secondAccessor);
        }
        return accessorType;
      }
      function transformHeritageClauses(nodes) {
        return factory.createNodeArray(ts2.filter(ts2.map(nodes, function(clause) {
          return factory.updateHeritageClause(clause, ts2.visitNodes(factory.createNodeArray(ts2.filter(clause.types, function(t) {
            return ts2.isEntityNameExpression(t.expression) || clause.token === 94 && t.expression.kind === 104;
          })), visitDeclarationSubtree));
        }), function(clause) {
          return clause.types && !!clause.types.length;
        }));
      }
    }
    ts2.transformDeclarations = transformDeclarations;
    function isAlwaysType(node) {
      if (node.kind === 257) {
        return true;
      }
      return false;
    }
    function maskModifiers(node, modifierMask, modifierAdditions) {
      return ts2.factory.createModifiersFromModifierFlags(maskModifierFlags(node, modifierMask, modifierAdditions));
    }
    function maskModifierFlags(node, modifierMask, modifierAdditions) {
      if (modifierMask === void 0) {
        modifierMask = 27647 ^ 4;
      }
      if (modifierAdditions === void 0) {
        modifierAdditions = 0;
      }
      var flags = ts2.getEffectiveModifierFlags(node) & modifierMask | modifierAdditions;
      if (flags & 512 && !(flags & 1)) {
        flags ^= 1;
      }
      if (flags & 512 && flags & 2) {
        flags ^= 2;
      }
      return flags;
    }
    function getTypeAnnotationFromAccessor(accessor) {
      if (accessor) {
        return accessor.kind === 171 ? accessor.type : accessor.parameters.length > 0 ? accessor.parameters[0].type : void 0;
      }
    }
    function canHaveLiteralInitializer(node) {
      switch (node.kind) {
        case 166:
        case 165:
          return !ts2.hasEffectiveModifier(node, 8);
        case 163:
        case 253:
          return true;
      }
      return false;
    }
    function isPreservedDeclarationStatement(node) {
      switch (node.kind) {
        case 255:
        case 260:
        case 264:
        case 257:
        case 256:
        case 258:
        case 259:
        case 236:
        case 265:
        case 271:
        case 270:
          return true;
      }
      return false;
    }
    function isProcessedComponent(node) {
      switch (node.kind) {
        case 174:
        case 170:
        case 168:
        case 171:
        case 172:
        case 166:
        case 165:
        case 167:
        case 173:
        case 175:
        case 253:
        case 162:
        case 227:
        case 177:
        case 188:
        case 178:
        case 179:
        case 199:
          return true;
      }
      return false;
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function getModuleTransformer(moduleKind) {
      switch (moduleKind) {
        case ts2.ModuleKind.ESNext:
        case ts2.ModuleKind.ES2022:
        case ts2.ModuleKind.ES2020:
        case ts2.ModuleKind.ES2015:
          return ts2.transformECMAScriptModule;
        case ts2.ModuleKind.System:
          return ts2.transformSystemModule;
        case ts2.ModuleKind.Node12:
        case ts2.ModuleKind.NodeNext:
          return ts2.transformNodeModule;
        default:
          return ts2.transformModule;
      }
    }
    var TransformationState;
    (function(TransformationState2) {
      TransformationState2[TransformationState2["Uninitialized"] = 0] = "Uninitialized";
      TransformationState2[TransformationState2["Initialized"] = 1] = "Initialized";
      TransformationState2[TransformationState2["Completed"] = 2] = "Completed";
      TransformationState2[TransformationState2["Disposed"] = 3] = "Disposed";
    })(TransformationState || (TransformationState = {}));
    var SyntaxKindFeatureFlags;
    (function(SyntaxKindFeatureFlags2) {
      SyntaxKindFeatureFlags2[SyntaxKindFeatureFlags2["Substitution"] = 1] = "Substitution";
      SyntaxKindFeatureFlags2[SyntaxKindFeatureFlags2["EmitNotifications"] = 2] = "EmitNotifications";
    })(SyntaxKindFeatureFlags || (SyntaxKindFeatureFlags = {}));
    ts2.noTransformers = { scriptTransformers: ts2.emptyArray, declarationTransformers: ts2.emptyArray };
    function getTransformers(compilerOptions, customTransformers, emitOnlyDtsFiles) {
      return {
        scriptTransformers: getScriptTransformers(compilerOptions, customTransformers, emitOnlyDtsFiles),
        declarationTransformers: getDeclarationTransformers(customTransformers)
      };
    }
    ts2.getTransformers = getTransformers;
    function getScriptTransformers(compilerOptions, customTransformers, emitOnlyDtsFiles) {
      if (emitOnlyDtsFiles)
        return ts2.emptyArray;
      var languageVersion = ts2.getEmitScriptTarget(compilerOptions);
      var moduleKind = ts2.getEmitModuleKind(compilerOptions);
      var transformers = [];
      ts2.addRange(transformers, customTransformers && ts2.map(customTransformers.before, wrapScriptTransformerFactory));
      transformers.push(ts2.transformTypeScript);
      transformers.push(ts2.transformClassFields);
      if (ts2.getJSXTransformEnabled(compilerOptions)) {
        transformers.push(ts2.transformJsx);
      }
      if (languageVersion < 99) {
        transformers.push(ts2.transformESNext);
      }
      if (languageVersion < 8) {
        transformers.push(ts2.transformES2021);
      }
      if (languageVersion < 7) {
        transformers.push(ts2.transformES2020);
      }
      if (languageVersion < 6) {
        transformers.push(ts2.transformES2019);
      }
      if (languageVersion < 5) {
        transformers.push(ts2.transformES2018);
      }
      if (languageVersion < 4) {
        transformers.push(ts2.transformES2017);
      }
      if (languageVersion < 3) {
        transformers.push(ts2.transformES2016);
      }
      if (languageVersion < 2) {
        transformers.push(ts2.transformES2015);
        transformers.push(ts2.transformGenerators);
      }
      transformers.push(getModuleTransformer(moduleKind));
      if (languageVersion < 1) {
        transformers.push(ts2.transformES5);
      }
      ts2.addRange(transformers, customTransformers && ts2.map(customTransformers.after, wrapScriptTransformerFactory));
      return transformers;
    }
    function getDeclarationTransformers(customTransformers) {
      var transformers = [];
      transformers.push(ts2.transformDeclarations);
      ts2.addRange(transformers, customTransformers && ts2.map(customTransformers.afterDeclarations, wrapDeclarationTransformerFactory));
      return transformers;
    }
    function wrapCustomTransformer(transformer) {
      return function(node) {
        return ts2.isBundle(node) ? transformer.transformBundle(node) : transformer.transformSourceFile(node);
      };
    }
    function wrapCustomTransformerFactory(transformer, handleDefault) {
      return function(context) {
        var customTransformer = transformer(context);
        return typeof customTransformer === "function" ? handleDefault(context, customTransformer) : wrapCustomTransformer(customTransformer);
      };
    }
    function wrapScriptTransformerFactory(transformer) {
      return wrapCustomTransformerFactory(transformer, ts2.chainBundle);
    }
    function wrapDeclarationTransformerFactory(transformer) {
      return wrapCustomTransformerFactory(transformer, function(_, node) {
        return node;
      });
    }
    function noEmitSubstitution(_hint, node) {
      return node;
    }
    ts2.noEmitSubstitution = noEmitSubstitution;
    function noEmitNotification(hint, node, callback) {
      callback(hint, node);
    }
    ts2.noEmitNotification = noEmitNotification;
    function transformNodes(resolver, host, factory, options, nodes, transformers, allowDtsFiles) {
      var enabledSyntaxKindFeatures = new Array(353);
      var lexicalEnvironmentVariableDeclarations;
      var lexicalEnvironmentFunctionDeclarations;
      var lexicalEnvironmentStatements;
      var lexicalEnvironmentFlags = 0;
      var lexicalEnvironmentVariableDeclarationsStack = [];
      var lexicalEnvironmentFunctionDeclarationsStack = [];
      var lexicalEnvironmentStatementsStack = [];
      var lexicalEnvironmentFlagsStack = [];
      var lexicalEnvironmentStackOffset = 0;
      var lexicalEnvironmentSuspended = false;
      var blockScopedVariableDeclarationsStack = [];
      var blockScopeStackOffset = 0;
      var blockScopedVariableDeclarations;
      var emitHelpers;
      var onSubstituteNode = noEmitSubstitution;
      var onEmitNode = noEmitNotification;
      var state = 0;
      var diagnostics = [];
      var context = {
        factory,
        getCompilerOptions: function() {
          return options;
        },
        getEmitResolver: function() {
          return resolver;
        },
        getEmitHost: function() {
          return host;
        },
        getEmitHelperFactory: ts2.memoize(function() {
          return ts2.createEmitHelperFactory(context);
        }),
        startLexicalEnvironment,
        suspendLexicalEnvironment,
        resumeLexicalEnvironment,
        endLexicalEnvironment,
        setLexicalEnvironmentFlags,
        getLexicalEnvironmentFlags,
        hoistVariableDeclaration,
        hoistFunctionDeclaration,
        addInitializationStatement,
        startBlockScope,
        endBlockScope,
        addBlockScopedVariable,
        requestEmitHelper,
        readEmitHelpers,
        enableSubstitution,
        enableEmitNotification,
        isSubstitutionEnabled,
        isEmitNotificationEnabled,
        get onSubstituteNode() {
          return onSubstituteNode;
        },
        set onSubstituteNode(value) {
          ts2.Debug.assert(state < 1, "Cannot modify transformation hooks after initialization has completed.");
          ts2.Debug.assert(value !== void 0, "Value must not be 'undefined'");
          onSubstituteNode = value;
        },
        get onEmitNode() {
          return onEmitNode;
        },
        set onEmitNode(value) {
          ts2.Debug.assert(state < 1, "Cannot modify transformation hooks after initialization has completed.");
          ts2.Debug.assert(value !== void 0, "Value must not be 'undefined'");
          onEmitNode = value;
        },
        addDiagnostic: function(diag) {
          diagnostics.push(diag);
        }
      };
      for (var _i = 0, nodes_2 = nodes; _i < nodes_2.length; _i++) {
        var node = nodes_2[_i];
        ts2.disposeEmitNodes(ts2.getSourceFileOfNode(ts2.getParseTreeNode(node)));
      }
      ts2.performance.mark("beforeTransform");
      var transformersWithContext = transformers.map(function(t) {
        return t(context);
      });
      var transformation = function(node2) {
        for (var _i2 = 0, transformersWithContext_1 = transformersWithContext; _i2 < transformersWithContext_1.length; _i2++) {
          var transform = transformersWithContext_1[_i2];
          node2 = transform(node2);
        }
        return node2;
      };
      state = 1;
      var transformed = [];
      for (var _a = 0, nodes_3 = nodes; _a < nodes_3.length; _a++) {
        var node = nodes_3[_a];
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("emit", "transformNodes", node.kind === 303 ? { path: node.path } : { kind: node.kind, pos: node.pos, end: node.end });
        transformed.push((allowDtsFiles ? transformation : transformRoot)(node));
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      }
      state = 2;
      ts2.performance.mark("afterTransform");
      ts2.performance.measure("transformTime", "beforeTransform", "afterTransform");
      return {
        transformed,
        substituteNode,
        emitNodeWithNotification,
        isEmitNotificationEnabled,
        dispose,
        diagnostics
      };
      function transformRoot(node2) {
        return node2 && (!ts2.isSourceFile(node2) || !node2.isDeclarationFile) ? transformation(node2) : node2;
      }
      function enableSubstitution(kind) {
        ts2.Debug.assert(state < 2, "Cannot modify the transformation context after transformation has completed.");
        enabledSyntaxKindFeatures[kind] |= 1;
      }
      function isSubstitutionEnabled(node2) {
        return (enabledSyntaxKindFeatures[node2.kind] & 1) !== 0 && (ts2.getEmitFlags(node2) & 4) === 0;
      }
      function substituteNode(hint, node2) {
        ts2.Debug.assert(state < 3, "Cannot substitute a node after the result is disposed.");
        return node2 && isSubstitutionEnabled(node2) && onSubstituteNode(hint, node2) || node2;
      }
      function enableEmitNotification(kind) {
        ts2.Debug.assert(state < 2, "Cannot modify the transformation context after transformation has completed.");
        enabledSyntaxKindFeatures[kind] |= 2;
      }
      function isEmitNotificationEnabled(node2) {
        return (enabledSyntaxKindFeatures[node2.kind] & 2) !== 0 || (ts2.getEmitFlags(node2) & 2) !== 0;
      }
      function emitNodeWithNotification(hint, node2, emitCallback) {
        ts2.Debug.assert(state < 3, "Cannot invoke TransformationResult callbacks after the result is disposed.");
        if (node2) {
          if (isEmitNotificationEnabled(node2)) {
            onEmitNode(hint, node2, emitCallback);
          } else {
            emitCallback(hint, node2);
          }
        }
      }
      function hoistVariableDeclaration(name) {
        ts2.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed.");
        var decl = ts2.setEmitFlags(factory.createVariableDeclaration(name), 64);
        if (!lexicalEnvironmentVariableDeclarations) {
          lexicalEnvironmentVariableDeclarations = [decl];
        } else {
          lexicalEnvironmentVariableDeclarations.push(decl);
        }
        if (lexicalEnvironmentFlags & 1) {
          lexicalEnvironmentFlags |= 2;
        }
      }
      function hoistFunctionDeclaration(func) {
        ts2.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed.");
        ts2.setEmitFlags(func, 1048576);
        if (!lexicalEnvironmentFunctionDeclarations) {
          lexicalEnvironmentFunctionDeclarations = [func];
        } else {
          lexicalEnvironmentFunctionDeclarations.push(func);
        }
      }
      function addInitializationStatement(node2) {
        ts2.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed.");
        ts2.setEmitFlags(node2, 1048576);
        if (!lexicalEnvironmentStatements) {
          lexicalEnvironmentStatements = [node2];
        } else {
          lexicalEnvironmentStatements.push(node2);
        }
      }
      function startLexicalEnvironment() {
        ts2.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed.");
        ts2.Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended.");
        lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentVariableDeclarations;
        lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFunctionDeclarations;
        lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentStatements;
        lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset] = lexicalEnvironmentFlags;
        lexicalEnvironmentStackOffset++;
        lexicalEnvironmentVariableDeclarations = void 0;
        lexicalEnvironmentFunctionDeclarations = void 0;
        lexicalEnvironmentStatements = void 0;
        lexicalEnvironmentFlags = 0;
      }
      function suspendLexicalEnvironment() {
        ts2.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed.");
        ts2.Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is already suspended.");
        lexicalEnvironmentSuspended = true;
      }
      function resumeLexicalEnvironment() {
        ts2.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed.");
        ts2.Debug.assert(lexicalEnvironmentSuspended, "Lexical environment is not suspended.");
        lexicalEnvironmentSuspended = false;
      }
      function endLexicalEnvironment() {
        ts2.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed.");
        ts2.Debug.assert(!lexicalEnvironmentSuspended, "Lexical environment is suspended.");
        var statements;
        if (lexicalEnvironmentVariableDeclarations || lexicalEnvironmentFunctionDeclarations || lexicalEnvironmentStatements) {
          if (lexicalEnvironmentFunctionDeclarations) {
            statements = __spreadArray([], lexicalEnvironmentFunctionDeclarations, true);
          }
          if (lexicalEnvironmentVariableDeclarations) {
            var statement = factory.createVariableStatement(void 0, factory.createVariableDeclarationList(lexicalEnvironmentVariableDeclarations));
            ts2.setEmitFlags(statement, 1048576);
            if (!statements) {
              statements = [statement];
            } else {
              statements.push(statement);
            }
          }
          if (lexicalEnvironmentStatements) {
            if (!statements) {
              statements = __spreadArray([], lexicalEnvironmentStatements, true);
            } else {
              statements = __spreadArray(__spreadArray([], statements, true), lexicalEnvironmentStatements, true);
            }
          }
        }
        lexicalEnvironmentStackOffset--;
        lexicalEnvironmentVariableDeclarations = lexicalEnvironmentVariableDeclarationsStack[lexicalEnvironmentStackOffset];
        lexicalEnvironmentFunctionDeclarations = lexicalEnvironmentFunctionDeclarationsStack[lexicalEnvironmentStackOffset];
        lexicalEnvironmentStatements = lexicalEnvironmentStatementsStack[lexicalEnvironmentStackOffset];
        lexicalEnvironmentFlags = lexicalEnvironmentFlagsStack[lexicalEnvironmentStackOffset];
        if (lexicalEnvironmentStackOffset === 0) {
          lexicalEnvironmentVariableDeclarationsStack = [];
          lexicalEnvironmentFunctionDeclarationsStack = [];
          lexicalEnvironmentStatementsStack = [];
          lexicalEnvironmentFlagsStack = [];
        }
        return statements;
      }
      function setLexicalEnvironmentFlags(flags, value) {
        lexicalEnvironmentFlags = value ? lexicalEnvironmentFlags | flags : lexicalEnvironmentFlags & ~flags;
      }
      function getLexicalEnvironmentFlags() {
        return lexicalEnvironmentFlags;
      }
      function startBlockScope() {
        ts2.Debug.assert(state > 0, "Cannot start a block scope during initialization.");
        ts2.Debug.assert(state < 2, "Cannot start a block scope after transformation has completed.");
        blockScopedVariableDeclarationsStack[blockScopeStackOffset] = blockScopedVariableDeclarations;
        blockScopeStackOffset++;
        blockScopedVariableDeclarations = void 0;
      }
      function endBlockScope() {
        ts2.Debug.assert(state > 0, "Cannot end a block scope during initialization.");
        ts2.Debug.assert(state < 2, "Cannot end a block scope after transformation has completed.");
        var statements = ts2.some(blockScopedVariableDeclarations) ? [
          factory.createVariableStatement(void 0, factory.createVariableDeclarationList(blockScopedVariableDeclarations.map(function(identifier) {
            return factory.createVariableDeclaration(identifier);
          }), 1))
        ] : void 0;
        blockScopeStackOffset--;
        blockScopedVariableDeclarations = blockScopedVariableDeclarationsStack[blockScopeStackOffset];
        if (blockScopeStackOffset === 0) {
          blockScopedVariableDeclarationsStack = [];
        }
        return statements;
      }
      function addBlockScopedVariable(name) {
        ts2.Debug.assert(blockScopeStackOffset > 0, "Cannot add a block scoped variable outside of an iteration body.");
        (blockScopedVariableDeclarations || (blockScopedVariableDeclarations = [])).push(name);
      }
      function requestEmitHelper(helper) {
        ts2.Debug.assert(state > 0, "Cannot modify the transformation context during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the transformation context after transformation has completed.");
        ts2.Debug.assert(!helper.scoped, "Cannot request a scoped emit helper.");
        if (helper.dependencies) {
          for (var _i2 = 0, _a2 = helper.dependencies; _i2 < _a2.length; _i2++) {
            var h = _a2[_i2];
            requestEmitHelper(h);
          }
        }
        emitHelpers = ts2.append(emitHelpers, helper);
      }
      function readEmitHelpers() {
        ts2.Debug.assert(state > 0, "Cannot modify the transformation context during initialization.");
        ts2.Debug.assert(state < 2, "Cannot modify the transformation context after transformation has completed.");
        var helpers = emitHelpers;
        emitHelpers = void 0;
        return helpers;
      }
      function dispose() {
        if (state < 3) {
          for (var _i2 = 0, nodes_4 = nodes; _i2 < nodes_4.length; _i2++) {
            var node2 = nodes_4[_i2];
            ts2.disposeEmitNodes(ts2.getSourceFileOfNode(ts2.getParseTreeNode(node2)));
          }
          lexicalEnvironmentVariableDeclarations = void 0;
          lexicalEnvironmentVariableDeclarationsStack = void 0;
          lexicalEnvironmentFunctionDeclarations = void 0;
          lexicalEnvironmentFunctionDeclarationsStack = void 0;
          onSubstituteNode = void 0;
          onEmitNode = void 0;
          emitHelpers = void 0;
          state = 3;
        }
      }
    }
    ts2.transformNodes = transformNodes;
    ts2.nullTransformationContext = {
      factory: ts2.factory,
      getCompilerOptions: function() {
        return {};
      },
      getEmitResolver: ts2.notImplemented,
      getEmitHost: ts2.notImplemented,
      getEmitHelperFactory: ts2.notImplemented,
      startLexicalEnvironment: ts2.noop,
      resumeLexicalEnvironment: ts2.noop,
      suspendLexicalEnvironment: ts2.noop,
      endLexicalEnvironment: ts2.returnUndefined,
      setLexicalEnvironmentFlags: ts2.noop,
      getLexicalEnvironmentFlags: function() {
        return 0;
      },
      hoistVariableDeclaration: ts2.noop,
      hoistFunctionDeclaration: ts2.noop,
      addInitializationStatement: ts2.noop,
      startBlockScope: ts2.noop,
      endBlockScope: ts2.returnUndefined,
      addBlockScopedVariable: ts2.noop,
      requestEmitHelper: ts2.noop,
      readEmitHelpers: ts2.notImplemented,
      enableSubstitution: ts2.noop,
      enableEmitNotification: ts2.noop,
      isSubstitutionEnabled: ts2.notImplemented,
      isEmitNotificationEnabled: ts2.notImplemented,
      onSubstituteNode: noEmitSubstitution,
      onEmitNode: noEmitNotification,
      addDiagnostic: ts2.noop
    };
  })(ts || (ts = {}));
  (function(ts2) {
    var brackets = createBracketsMap();
    function isBuildInfoFile(file) {
      return ts2.fileExtensionIs(file, ".tsbuildinfo");
    }
    ts2.isBuildInfoFile = isBuildInfoFile;
    function forEachEmittedFile(host, action, sourceFilesOrTargetSourceFile, forceDtsEmit, onlyBuildInfo, includeBuildInfo) {
      if (forceDtsEmit === void 0) {
        forceDtsEmit = false;
      }
      var sourceFiles = ts2.isArray(sourceFilesOrTargetSourceFile) ? sourceFilesOrTargetSourceFile : ts2.getSourceFilesToEmit(host, sourceFilesOrTargetSourceFile, forceDtsEmit);
      var options = host.getCompilerOptions();
      if (ts2.outFile(options)) {
        var prepends = host.getPrependNodes();
        if (sourceFiles.length || prepends.length) {
          var bundle = ts2.factory.createBundle(sourceFiles, prepends);
          var result = action(getOutputPathsFor(bundle, host, forceDtsEmit), bundle);
          if (result) {
            return result;
          }
        }
      } else {
        if (!onlyBuildInfo) {
          for (var _a = 0, sourceFiles_1 = sourceFiles; _a < sourceFiles_1.length; _a++) {
            var sourceFile = sourceFiles_1[_a];
            var result = action(getOutputPathsFor(sourceFile, host, forceDtsEmit), sourceFile);
            if (result) {
              return result;
            }
          }
        }
        if (includeBuildInfo) {
          var buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
          if (buildInfoPath)
            return action({ buildInfoPath }, void 0);
        }
      }
    }
    ts2.forEachEmittedFile = forEachEmittedFile;
    function getTsBuildInfoEmitOutputFilePath(options) {
      var configFile = options.configFilePath;
      if (!ts2.isIncrementalCompilation(options))
        return void 0;
      if (options.tsBuildInfoFile)
        return options.tsBuildInfoFile;
      var outPath = ts2.outFile(options);
      var buildInfoExtensionLess;
      if (outPath) {
        buildInfoExtensionLess = ts2.removeFileExtension(outPath);
      } else {
        if (!configFile)
          return void 0;
        var configFileExtensionLess = ts2.removeFileExtension(configFile);
        buildInfoExtensionLess = options.outDir ? options.rootDir ? ts2.resolvePath(options.outDir, ts2.getRelativePathFromDirectory(options.rootDir, configFileExtensionLess, true)) : ts2.combinePaths(options.outDir, ts2.getBaseFileName(configFileExtensionLess)) : configFileExtensionLess;
      }
      return buildInfoExtensionLess + ".tsbuildinfo";
    }
    ts2.getTsBuildInfoEmitOutputFilePath = getTsBuildInfoEmitOutputFilePath;
    function getOutputPathsForBundle(options, forceDtsPaths) {
      var outPath = ts2.outFile(options);
      var jsFilePath = options.emitDeclarationOnly ? void 0 : outPath;
      var sourceMapFilePath = jsFilePath && getSourceMapFilePath(jsFilePath, options);
      var declarationFilePath = forceDtsPaths || ts2.getEmitDeclarations(options) ? ts2.removeFileExtension(outPath) + ".d.ts" : void 0;
      var declarationMapPath = declarationFilePath && ts2.getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0;
      var buildInfoPath = getTsBuildInfoEmitOutputFilePath(options);
      return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath };
    }
    ts2.getOutputPathsForBundle = getOutputPathsForBundle;
    function getOutputPathsFor(sourceFile, host, forceDtsPaths) {
      var options = host.getCompilerOptions();
      if (sourceFile.kind === 304) {
        return getOutputPathsForBundle(options, forceDtsPaths);
      } else {
        var ownOutputFilePath = ts2.getOwnEmitOutputFilePath(sourceFile.fileName, host, getOutputExtension(sourceFile.fileName, options));
        var isJsonFile = ts2.isJsonSourceFile(sourceFile);
        var isJsonEmittedToSameLocation = isJsonFile && ts2.comparePaths(sourceFile.fileName, ownOutputFilePath, host.getCurrentDirectory(), !host.useCaseSensitiveFileNames()) === 0;
        var jsFilePath = options.emitDeclarationOnly || isJsonEmittedToSameLocation ? void 0 : ownOutputFilePath;
        var sourceMapFilePath = !jsFilePath || ts2.isJsonSourceFile(sourceFile) ? void 0 : getSourceMapFilePath(jsFilePath, options);
        var declarationFilePath = forceDtsPaths || ts2.getEmitDeclarations(options) && !isJsonFile ? ts2.getDeclarationEmitOutputFilePath(sourceFile.fileName, host) : void 0;
        var declarationMapPath = declarationFilePath && ts2.getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : void 0;
        return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath: void 0 };
      }
    }
    ts2.getOutputPathsFor = getOutputPathsFor;
    function getSourceMapFilePath(jsFilePath, options) {
      return options.sourceMap && !options.inlineSourceMap ? jsFilePath + ".map" : void 0;
    }
    function getOutputExtension(fileName, options) {
      return ts2.fileExtensionIs(fileName, ".json") ? ".json" : options.jsx === 1 && ts2.fileExtensionIsOneOf(fileName, [".jsx", ".tsx"]) ? ".jsx" : ts2.fileExtensionIsOneOf(fileName, [".mts", ".mjs"]) ? ".mjs" : ts2.fileExtensionIsOneOf(fileName, [".cts", ".cjs"]) ? ".cjs" : ".js";
    }
    ts2.getOutputExtension = getOutputExtension;
    function getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, outputDir, getCommonSourceDirectory2) {
      return outputDir ? ts2.resolvePath(outputDir, ts2.getRelativePathFromDirectory(getCommonSourceDirectory2 ? getCommonSourceDirectory2() : getCommonSourceDirectoryOfConfig(configFile, ignoreCase), inputFileName, ignoreCase)) : inputFileName;
    }
    function getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
      return ts2.changeExtension(getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.declarationDir || configFile.options.outDir, getCommonSourceDirectory2), ts2.getDeclarationEmitExtensionForPath(inputFileName));
    }
    ts2.getOutputDeclarationFileName = getOutputDeclarationFileName;
    function getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2) {
      if (configFile.options.emitDeclarationOnly)
        return void 0;
      var isJsonFile = ts2.fileExtensionIs(inputFileName, ".json");
      var outputFileName = ts2.changeExtension(getOutputPathWithoutChangingExt(inputFileName, configFile, ignoreCase, configFile.options.outDir, getCommonSourceDirectory2), getOutputExtension(inputFileName, configFile.options));
      return !isJsonFile || ts2.comparePaths(inputFileName, outputFileName, ts2.Debug.checkDefined(configFile.options.configFilePath), ignoreCase) !== 0 ? outputFileName : void 0;
    }
    function createAddOutput() {
      var outputs;
      return { addOutput, getOutputs };
      function addOutput(path) {
        if (path) {
          (outputs || (outputs = [])).push(path);
        }
      }
      function getOutputs() {
        return outputs || ts2.emptyArray;
      }
    }
    function getSingleOutputFileNames(configFile, addOutput) {
      var _a = getOutputPathsForBundle(configFile.options, false), jsFilePath = _a.jsFilePath, sourceMapFilePath = _a.sourceMapFilePath, declarationFilePath = _a.declarationFilePath, declarationMapPath = _a.declarationMapPath, buildInfoPath = _a.buildInfoPath;
      addOutput(jsFilePath);
      addOutput(sourceMapFilePath);
      addOutput(declarationFilePath);
      addOutput(declarationMapPath);
      addOutput(buildInfoPath);
    }
    function getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory2) {
      if (ts2.fileExtensionIs(inputFileName, ".d.ts"))
        return;
      var js = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
      addOutput(js);
      if (ts2.fileExtensionIs(inputFileName, ".json"))
        return;
      if (js && configFile.options.sourceMap) {
        addOutput("".concat(js, ".map"));
      }
      if (ts2.getEmitDeclarations(configFile.options)) {
        var dts = getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
        addOutput(dts);
        if (configFile.options.declarationMap) {
          addOutput("".concat(dts, ".map"));
        }
      }
    }
    function getCommonSourceDirectory(options, emittedFiles, currentDirectory, getCanonicalFileName, checkSourceFilesBelongToPath) {
      var commonSourceDirectory;
      if (options.rootDir) {
        commonSourceDirectory = ts2.getNormalizedAbsolutePath(options.rootDir, currentDirectory);
        checkSourceFilesBelongToPath === null || checkSourceFilesBelongToPath === void 0 ? void 0 : checkSourceFilesBelongToPath(options.rootDir);
      } else if (options.composite && options.configFilePath) {
        commonSourceDirectory = ts2.getDirectoryPath(ts2.normalizeSlashes(options.configFilePath));
        checkSourceFilesBelongToPath === null || checkSourceFilesBelongToPath === void 0 ? void 0 : checkSourceFilesBelongToPath(commonSourceDirectory);
      } else {
        commonSourceDirectory = ts2.computeCommonSourceDirectoryOfFilenames(emittedFiles(), currentDirectory, getCanonicalFileName);
      }
      if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== ts2.directorySeparator) {
        commonSourceDirectory += ts2.directorySeparator;
      }
      return commonSourceDirectory;
    }
    ts2.getCommonSourceDirectory = getCommonSourceDirectory;
    function getCommonSourceDirectoryOfConfig(_a, ignoreCase) {
      var options = _a.options, fileNames = _a.fileNames;
      return getCommonSourceDirectory(options, function() {
        return ts2.filter(fileNames, function(file) {
          return !(options.noEmitForJsFiles && ts2.fileExtensionIsOneOf(file, ts2.supportedJSExtensionsFlat)) && !ts2.fileExtensionIs(file, ".d.ts");
        });
      }, ts2.getDirectoryPath(ts2.normalizeSlashes(ts2.Debug.checkDefined(options.configFilePath))), ts2.createGetCanonicalFileName(!ignoreCase));
    }
    ts2.getCommonSourceDirectoryOfConfig = getCommonSourceDirectoryOfConfig;
    function getAllProjectOutputs(configFile, ignoreCase) {
      var _a = createAddOutput(), addOutput = _a.addOutput, getOutputs = _a.getOutputs;
      if (ts2.outFile(configFile.options)) {
        getSingleOutputFileNames(configFile, addOutput);
      } else {
        var getCommonSourceDirectory_1 = ts2.memoize(function() {
          return getCommonSourceDirectoryOfConfig(configFile, ignoreCase);
        });
        for (var _b = 0, _c = configFile.fileNames; _b < _c.length; _b++) {
          var inputFileName = _c[_b];
          getOwnOutputFileNames(configFile, inputFileName, ignoreCase, addOutput, getCommonSourceDirectory_1);
        }
        addOutput(getTsBuildInfoEmitOutputFilePath(configFile.options));
      }
      return getOutputs();
    }
    ts2.getAllProjectOutputs = getAllProjectOutputs;
    function getOutputFileNames(commandLine, inputFileName, ignoreCase) {
      inputFileName = ts2.normalizePath(inputFileName);
      ts2.Debug.assert(ts2.contains(commandLine.fileNames, inputFileName), "Expected fileName to be present in command line");
      var _a = createAddOutput(), addOutput = _a.addOutput, getOutputs = _a.getOutputs;
      if (ts2.outFile(commandLine.options)) {
        getSingleOutputFileNames(commandLine, addOutput);
      } else {
        getOwnOutputFileNames(commandLine, inputFileName, ignoreCase, addOutput);
      }
      return getOutputs();
    }
    ts2.getOutputFileNames = getOutputFileNames;
    function getFirstProjectOutput(configFile, ignoreCase) {
      if (ts2.outFile(configFile.options)) {
        var jsFilePath = getOutputPathsForBundle(configFile.options, false).jsFilePath;
        return ts2.Debug.checkDefined(jsFilePath, "project ".concat(configFile.options.configFilePath, " expected to have at least one output"));
      }
      var getCommonSourceDirectory2 = ts2.memoize(function() {
        return getCommonSourceDirectoryOfConfig(configFile, ignoreCase);
      });
      for (var _a = 0, _b = configFile.fileNames; _a < _b.length; _a++) {
        var inputFileName = _b[_a];
        if (ts2.fileExtensionIs(inputFileName, ".d.ts"))
          continue;
        var jsFilePath = getOutputJSFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
        if (jsFilePath)
          return jsFilePath;
        if (ts2.fileExtensionIs(inputFileName, ".json"))
          continue;
        if (ts2.getEmitDeclarations(configFile.options)) {
          return getOutputDeclarationFileName(inputFileName, configFile, ignoreCase, getCommonSourceDirectory2);
        }
      }
      var buildInfoPath = getTsBuildInfoEmitOutputFilePath(configFile.options);
      if (buildInfoPath)
        return buildInfoPath;
      return ts2.Debug.fail("project ".concat(configFile.options.configFilePath, " expected to have at least one output"));
    }
    ts2.getFirstProjectOutput = getFirstProjectOutput;
    function emitFiles(resolver, host, targetSourceFile, _a, emitOnlyDtsFiles, onlyBuildInfo, forceDtsEmit) {
      var scriptTransformers = _a.scriptTransformers, declarationTransformers = _a.declarationTransformers;
      var compilerOptions = host.getCompilerOptions();
      var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap || ts2.getAreDeclarationMapsEnabled(compilerOptions) ? [] : void 0;
      var emittedFilesList = compilerOptions.listEmittedFiles ? [] : void 0;
      var emitterDiagnostics = ts2.createDiagnosticCollection();
      var newLine = ts2.getNewLineCharacter(compilerOptions, function() {
        return host.getNewLine();
      });
      var writer = ts2.createTextWriter(newLine);
      var _b = ts2.performance.createTimer("printTime", "beforePrint", "afterPrint"), enter = _b.enter, exit = _b.exit;
      var bundleBuildInfo;
      var emitSkipped = false;
      var exportedModulesFromDeclarationEmit;
      enter();
      forEachEmittedFile(host, emitSourceFileOrBundle, ts2.getSourceFilesToEmit(host, targetSourceFile, forceDtsEmit), forceDtsEmit, onlyBuildInfo, !targetSourceFile);
      exit();
      return {
        emitSkipped,
        diagnostics: emitterDiagnostics.getDiagnostics(),
        emittedFiles: emittedFilesList,
        sourceMaps: sourceMapDataList,
        exportedModulesFromDeclarationEmit
      };
      function emitSourceFileOrBundle(_a2, sourceFileOrBundle) {
        var jsFilePath = _a2.jsFilePath, sourceMapFilePath = _a2.sourceMapFilePath, declarationFilePath = _a2.declarationFilePath, declarationMapPath = _a2.declarationMapPath, buildInfoPath = _a2.buildInfoPath;
        var buildInfoDirectory;
        if (buildInfoPath && sourceFileOrBundle && ts2.isBundle(sourceFileOrBundle)) {
          buildInfoDirectory = ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
          bundleBuildInfo = {
            commonSourceDirectory: relativeToBuildInfo(host.getCommonSourceDirectory()),
            sourceFiles: sourceFileOrBundle.sourceFiles.map(function(file) {
              return relativeToBuildInfo(ts2.getNormalizedAbsolutePath(file.fileName, host.getCurrentDirectory()));
            })
          };
        }
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("emit", "emitJsFileOrBundle", { jsFilePath });
        emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo);
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("emit", "emitDeclarationFileOrBundle", { declarationFilePath });
        emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo);
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("emit", "emitBuildInfo", { buildInfoPath });
        emitBuildInfo(bundleBuildInfo, buildInfoPath);
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        if (!emitSkipped && emittedFilesList) {
          if (!emitOnlyDtsFiles) {
            if (jsFilePath) {
              emittedFilesList.push(jsFilePath);
            }
            if (sourceMapFilePath) {
              emittedFilesList.push(sourceMapFilePath);
            }
            if (buildInfoPath) {
              emittedFilesList.push(buildInfoPath);
            }
          }
          if (declarationFilePath) {
            emittedFilesList.push(declarationFilePath);
          }
          if (declarationMapPath) {
            emittedFilesList.push(declarationMapPath);
          }
        }
        function relativeToBuildInfo(path) {
          return ts2.ensurePathIsNonModuleName(ts2.getRelativePathFromDirectory(buildInfoDirectory, path, host.getCanonicalFileName));
        }
      }
      function emitBuildInfo(bundle, buildInfoPath) {
        if (!buildInfoPath || targetSourceFile || emitSkipped)
          return;
        var program = host.getProgramBuildInfo();
        if (host.isEmitBlocked(buildInfoPath)) {
          emitSkipped = true;
          return;
        }
        var version = ts2.version;
        ts2.writeFile(host, emitterDiagnostics, buildInfoPath, getBuildInfoText({ bundle, program, version }), false);
      }
      function emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath, relativeToBuildInfo) {
        if (!sourceFileOrBundle || emitOnlyDtsFiles || !jsFilePath) {
          return;
        }
        if (jsFilePath && host.isEmitBlocked(jsFilePath) || compilerOptions.noEmit) {
          emitSkipped = true;
          return;
        }
        var transform = ts2.transformNodes(resolver, host, ts2.factory, compilerOptions, [sourceFileOrBundle], scriptTransformers, false);
        var printerOptions = {
          removeComments: compilerOptions.removeComments,
          newLine: compilerOptions.newLine,
          noEmitHelpers: compilerOptions.noEmitHelpers,
          module: compilerOptions.module,
          target: compilerOptions.target,
          sourceMap: compilerOptions.sourceMap,
          inlineSourceMap: compilerOptions.inlineSourceMap,
          inlineSources: compilerOptions.inlineSources,
          extendedDiagnostics: compilerOptions.extendedDiagnostics,
          writeBundleFileInfo: !!bundleBuildInfo,
          relativeToBuildInfo
        };
        var printer = createPrinter(printerOptions, {
          hasGlobalName: resolver.hasGlobalName,
          onEmitNode: transform.emitNodeWithNotification,
          isEmitNotificationEnabled: transform.isEmitNotificationEnabled,
          substituteNode: transform.substituteNode
        });
        ts2.Debug.assert(transform.transformed.length === 1, "Should only see one output from the transform");
        printSourceFileOrBundle(jsFilePath, sourceMapFilePath, transform.transformed[0], printer, compilerOptions);
        transform.dispose();
        if (bundleBuildInfo)
          bundleBuildInfo.js = printer.bundleFileInfo;
      }
      function emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath, relativeToBuildInfo) {
        if (!sourceFileOrBundle)
          return;
        if (!declarationFilePath) {
          if (emitOnlyDtsFiles || compilerOptions.emitDeclarationOnly)
            emitSkipped = true;
          return;
        }
        var sourceFiles = ts2.isSourceFile(sourceFileOrBundle) ? [sourceFileOrBundle] : sourceFileOrBundle.sourceFiles;
        var filesForEmit = forceDtsEmit ? sourceFiles : ts2.filter(sourceFiles, ts2.isSourceFileNotJson);
        var inputListOrBundle = ts2.outFile(compilerOptions) ? [ts2.factory.createBundle(filesForEmit, !ts2.isSourceFile(sourceFileOrBundle) ? sourceFileOrBundle.prepends : void 0)] : filesForEmit;
        if (emitOnlyDtsFiles && !ts2.getEmitDeclarations(compilerOptions)) {
          filesForEmit.forEach(collectLinkedAliases);
        }
        var declarationTransform = ts2.transformNodes(resolver, host, ts2.factory, compilerOptions, inputListOrBundle, declarationTransformers, false);
        if (ts2.length(declarationTransform.diagnostics)) {
          for (var _a2 = 0, _b2 = declarationTransform.diagnostics; _a2 < _b2.length; _a2++) {
            var diagnostic = _b2[_a2];
            emitterDiagnostics.add(diagnostic);
          }
        }
        var printerOptions = {
          removeComments: compilerOptions.removeComments,
          newLine: compilerOptions.newLine,
          noEmitHelpers: true,
          module: compilerOptions.module,
          target: compilerOptions.target,
          sourceMap: compilerOptions.sourceMap,
          inlineSourceMap: compilerOptions.inlineSourceMap,
          extendedDiagnostics: compilerOptions.extendedDiagnostics,
          onlyPrintJsDocStyle: true,
          writeBundleFileInfo: !!bundleBuildInfo,
          recordInternalSection: !!bundleBuildInfo,
          relativeToBuildInfo
        };
        var declarationPrinter = createPrinter(printerOptions, {
          hasGlobalName: resolver.hasGlobalName,
          onEmitNode: declarationTransform.emitNodeWithNotification,
          isEmitNotificationEnabled: declarationTransform.isEmitNotificationEnabled,
          substituteNode: declarationTransform.substituteNode
        });
        var declBlocked = !!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length || !!host.isEmitBlocked(declarationFilePath) || !!compilerOptions.noEmit;
        emitSkipped = emitSkipped || declBlocked;
        if (!declBlocked || forceDtsEmit) {
          ts2.Debug.assert(declarationTransform.transformed.length === 1, "Should only see one output from the decl transform");
          printSourceFileOrBundle(declarationFilePath, declarationMapPath, declarationTransform.transformed[0], declarationPrinter, {
            sourceMap: !forceDtsEmit && compilerOptions.declarationMap,
            sourceRoot: compilerOptions.sourceRoot,
            mapRoot: compilerOptions.mapRoot,
            extendedDiagnostics: compilerOptions.extendedDiagnostics
          });
          if (forceDtsEmit && declarationTransform.transformed[0].kind === 303) {
            var sourceFile = declarationTransform.transformed[0];
            exportedModulesFromDeclarationEmit = sourceFile.exportedModulesFromDeclarationEmit;
          }
        }
        declarationTransform.dispose();
        if (bundleBuildInfo)
          bundleBuildInfo.dts = declarationPrinter.bundleFileInfo;
      }
      function collectLinkedAliases(node) {
        if (ts2.isExportAssignment(node)) {
          if (node.expression.kind === 79) {
            resolver.collectLinkedAliases(node.expression, true);
          }
          return;
        } else if (ts2.isExportSpecifier(node)) {
          resolver.collectLinkedAliases(node.propertyName || node.name, true);
          return;
        }
        ts2.forEachChild(node, collectLinkedAliases);
      }
      function printSourceFileOrBundle(jsFilePath, sourceMapFilePath, sourceFileOrBundle, printer, mapOptions) {
        var bundle = sourceFileOrBundle.kind === 304 ? sourceFileOrBundle : void 0;
        var sourceFile = sourceFileOrBundle.kind === 303 ? sourceFileOrBundle : void 0;
        var sourceFiles = bundle ? bundle.sourceFiles : [sourceFile];
        var sourceMapGenerator;
        if (shouldEmitSourceMaps(mapOptions, sourceFileOrBundle)) {
          sourceMapGenerator = ts2.createSourceMapGenerator(host, ts2.getBaseFileName(ts2.normalizeSlashes(jsFilePath)), getSourceRoot(mapOptions), getSourceMapDirectory(mapOptions, jsFilePath, sourceFile), mapOptions);
        }
        if (bundle) {
          printer.writeBundle(bundle, writer, sourceMapGenerator);
        } else {
          printer.writeFile(sourceFile, writer, sourceMapGenerator);
        }
        if (sourceMapGenerator) {
          if (sourceMapDataList) {
            sourceMapDataList.push({
              inputSourceFileNames: sourceMapGenerator.getSources(),
              sourceMap: sourceMapGenerator.toJSON()
            });
          }
          var sourceMappingURL = getSourceMappingURL(mapOptions, sourceMapGenerator, jsFilePath, sourceMapFilePath, sourceFile);
          if (sourceMappingURL) {
            if (!writer.isAtStartOfLine())
              writer.rawWrite(newLine);
            writer.writeComment("//# ".concat("sourceMappingURL", "=").concat(sourceMappingURL));
          }
          if (sourceMapFilePath) {
            var sourceMap = sourceMapGenerator.toString();
            ts2.writeFile(host, emitterDiagnostics, sourceMapFilePath, sourceMap, false, sourceFiles);
          }
        } else {
          writer.writeLine();
        }
        ts2.writeFile(host, emitterDiagnostics, jsFilePath, writer.getText(), !!compilerOptions.emitBOM, sourceFiles);
        writer.clear();
      }
      function shouldEmitSourceMaps(mapOptions, sourceFileOrBundle) {
        return (mapOptions.sourceMap || mapOptions.inlineSourceMap) && (sourceFileOrBundle.kind !== 303 || !ts2.fileExtensionIs(sourceFileOrBundle.fileName, ".json"));
      }
      function getSourceRoot(mapOptions) {
        var sourceRoot = ts2.normalizeSlashes(mapOptions.sourceRoot || "");
        return sourceRoot ? ts2.ensureTrailingDirectorySeparator(sourceRoot) : sourceRoot;
      }
      function getSourceMapDirectory(mapOptions, filePath, sourceFile) {
        if (mapOptions.sourceRoot)
          return host.getCommonSourceDirectory();
        if (mapOptions.mapRoot) {
          var sourceMapDir = ts2.normalizeSlashes(mapOptions.mapRoot);
          if (sourceFile) {
            sourceMapDir = ts2.getDirectoryPath(ts2.getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir));
          }
          if (ts2.getRootLength(sourceMapDir) === 0) {
            sourceMapDir = ts2.combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
          }
          return sourceMapDir;
        }
        return ts2.getDirectoryPath(ts2.normalizePath(filePath));
      }
      function getSourceMappingURL(mapOptions, sourceMapGenerator, filePath, sourceMapFilePath, sourceFile) {
        if (mapOptions.inlineSourceMap) {
          var sourceMapText = sourceMapGenerator.toString();
          var base64SourceMapText = ts2.base64encode(ts2.sys, sourceMapText);
          return "data:application/json;base64,".concat(base64SourceMapText);
        }
        var sourceMapFile = ts2.getBaseFileName(ts2.normalizeSlashes(ts2.Debug.checkDefined(sourceMapFilePath)));
        if (mapOptions.mapRoot) {
          var sourceMapDir = ts2.normalizeSlashes(mapOptions.mapRoot);
          if (sourceFile) {
            sourceMapDir = ts2.getDirectoryPath(ts2.getSourceFilePathInNewDir(sourceFile.fileName, host, sourceMapDir));
          }
          if (ts2.getRootLength(sourceMapDir) === 0) {
            sourceMapDir = ts2.combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
            return encodeURI(ts2.getRelativePathToDirectoryOrUrl(ts2.getDirectoryPath(ts2.normalizePath(filePath)), ts2.combinePaths(sourceMapDir, sourceMapFile), host.getCurrentDirectory(), host.getCanonicalFileName, true));
          } else {
            return encodeURI(ts2.combinePaths(sourceMapDir, sourceMapFile));
          }
        }
        return encodeURI(sourceMapFile);
      }
    }
    ts2.emitFiles = emitFiles;
    function getBuildInfoText(buildInfo) {
      return JSON.stringify(buildInfo);
    }
    ts2.getBuildInfoText = getBuildInfoText;
    function getBuildInfo(buildInfoText) {
      return JSON.parse(buildInfoText);
    }
    ts2.getBuildInfo = getBuildInfo;
    ts2.notImplementedResolver = {
      hasGlobalName: ts2.notImplemented,
      getReferencedExportContainer: ts2.notImplemented,
      getReferencedImportDeclaration: ts2.notImplemented,
      getReferencedDeclarationWithCollidingName: ts2.notImplemented,
      isDeclarationWithCollidingName: ts2.notImplemented,
      isValueAliasDeclaration: ts2.notImplemented,
      isReferencedAliasDeclaration: ts2.notImplemented,
      isTopLevelValueImportEqualsWithEntityName: ts2.notImplemented,
      getNodeCheckFlags: ts2.notImplemented,
      isDeclarationVisible: ts2.notImplemented,
      isLateBound: function(_node) {
        return false;
      },
      collectLinkedAliases: ts2.notImplemented,
      isImplementationOfOverload: ts2.notImplemented,
      isRequiredInitializedParameter: ts2.notImplemented,
      isOptionalUninitializedParameterProperty: ts2.notImplemented,
      isExpandoFunctionDeclaration: ts2.notImplemented,
      getPropertiesOfContainerFunction: ts2.notImplemented,
      createTypeOfDeclaration: ts2.notImplemented,
      createReturnTypeOfSignatureDeclaration: ts2.notImplemented,
      createTypeOfExpression: ts2.notImplemented,
      createLiteralConstValue: ts2.notImplemented,
      isSymbolAccessible: ts2.notImplemented,
      isEntityNameVisible: ts2.notImplemented,
      getConstantValue: ts2.notImplemented,
      getReferencedValueDeclaration: ts2.notImplemented,
      getTypeReferenceSerializationKind: ts2.notImplemented,
      isOptionalParameter: ts2.notImplemented,
      moduleExportsSomeValue: ts2.notImplemented,
      isArgumentsLocalBinding: ts2.notImplemented,
      getExternalModuleFileFromDeclaration: ts2.notImplemented,
      getTypeReferenceDirectivesForEntityName: ts2.notImplemented,
      getTypeReferenceDirectivesForSymbol: ts2.notImplemented,
      isLiteralConstDeclaration: ts2.notImplemented,
      getJsxFactoryEntity: ts2.notImplemented,
      getJsxFragmentFactoryEntity: ts2.notImplemented,
      getAllAccessorDeclarations: ts2.notImplemented,
      getSymbolOfExternalModuleSpecifier: ts2.notImplemented,
      isBindingCapturedByNode: ts2.notImplemented,
      getDeclarationStatementsForSourceFile: ts2.notImplemented,
      isImportRequiredByAugmentation: ts2.notImplemented
    };
    function createSourceFilesFromBundleBuildInfo(bundle, buildInfoDirectory, host) {
      var _a;
      var jsBundle = ts2.Debug.checkDefined(bundle.js);
      var prologueMap = ((_a = jsBundle.sources) === null || _a === void 0 ? void 0 : _a.prologues) && ts2.arrayToMap(jsBundle.sources.prologues, function(prologueInfo) {
        return prologueInfo.file;
      });
      return bundle.sourceFiles.map(function(fileName, index) {
        var _a2, _b;
        var prologueInfo = prologueMap === null || prologueMap === void 0 ? void 0 : prologueMap.get(index);
        var statements = prologueInfo === null || prologueInfo === void 0 ? void 0 : prologueInfo.directives.map(function(directive) {
          var literal = ts2.setTextRange(ts2.factory.createStringLiteral(directive.expression.text), directive.expression);
          var statement = ts2.setTextRange(ts2.factory.createExpressionStatement(literal), directive);
          ts2.setParent(literal, statement);
          return statement;
        });
        var eofToken = ts2.factory.createToken(1);
        var sourceFile = ts2.factory.createSourceFile(statements !== null && statements !== void 0 ? statements : [], eofToken, 0);
        sourceFile.fileName = ts2.getRelativePathFromDirectory(host.getCurrentDirectory(), ts2.getNormalizedAbsolutePath(fileName, buildInfoDirectory), !host.useCaseSensitiveFileNames());
        sourceFile.text = (_a2 = prologueInfo === null || prologueInfo === void 0 ? void 0 : prologueInfo.text) !== null && _a2 !== void 0 ? _a2 : "";
        ts2.setTextRangePosWidth(sourceFile, 0, (_b = prologueInfo === null || prologueInfo === void 0 ? void 0 : prologueInfo.text.length) !== null && _b !== void 0 ? _b : 0);
        ts2.setEachParent(sourceFile.statements, sourceFile);
        ts2.setTextRangePosWidth(eofToken, sourceFile.end, 0);
        ts2.setParent(eofToken, sourceFile);
        return sourceFile;
      });
    }
    function emitUsingBuildInfo(config, host, getCommandLine, customTransformers) {
      var _a = getOutputPathsForBundle(config.options, false), buildInfoPath = _a.buildInfoPath, jsFilePath = _a.jsFilePath, sourceMapFilePath = _a.sourceMapFilePath, declarationFilePath = _a.declarationFilePath, declarationMapPath = _a.declarationMapPath;
      var buildInfoText = host.readFile(ts2.Debug.checkDefined(buildInfoPath));
      if (!buildInfoText)
        return buildInfoPath;
      var jsFileText = host.readFile(ts2.Debug.checkDefined(jsFilePath));
      if (!jsFileText)
        return jsFilePath;
      var sourceMapText = sourceMapFilePath && host.readFile(sourceMapFilePath);
      if (sourceMapFilePath && !sourceMapText || config.options.inlineSourceMap)
        return sourceMapFilePath || "inline sourcemap decoding";
      var declarationText = declarationFilePath && host.readFile(declarationFilePath);
      if (declarationFilePath && !declarationText)
        return declarationFilePath;
      var declarationMapText = declarationMapPath && host.readFile(declarationMapPath);
      if (declarationMapPath && !declarationMapText || config.options.inlineSourceMap)
        return declarationMapPath || "inline sourcemap decoding";
      var buildInfo = getBuildInfo(buildInfoText);
      if (!buildInfo.bundle || !buildInfo.bundle.js || declarationText && !buildInfo.bundle.dts)
        return buildInfoPath;
      var buildInfoDirectory = ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
      var ownPrependInput = ts2.createInputFiles(jsFileText, declarationText, sourceMapFilePath, sourceMapText, declarationMapPath, declarationMapText, jsFilePath, declarationFilePath, buildInfoPath, buildInfo, true);
      var outputFiles = [];
      var prependNodes = ts2.createPrependNodes(config.projectReferences, getCommandLine, function(f) {
        return host.readFile(f);
      });
      var sourceFilesForJsEmit = createSourceFilesFromBundleBuildInfo(buildInfo.bundle, buildInfoDirectory, host);
      var emitHost = {
        getPrependNodes: ts2.memoize(function() {
          return __spreadArray(__spreadArray([], prependNodes, true), [ownPrependInput], false);
        }),
        getCanonicalFileName: host.getCanonicalFileName,
        getCommonSourceDirectory: function() {
          return ts2.getNormalizedAbsolutePath(buildInfo.bundle.commonSourceDirectory, buildInfoDirectory);
        },
        getCompilerOptions: function() {
          return config.options;
        },
        getCurrentDirectory: function() {
          return host.getCurrentDirectory();
        },
        getNewLine: function() {
          return host.getNewLine();
        },
        getSourceFile: ts2.returnUndefined,
        getSourceFileByPath: ts2.returnUndefined,
        getSourceFiles: function() {
          return sourceFilesForJsEmit;
        },
        getLibFileFromReference: ts2.notImplemented,
        isSourceFileFromExternalLibrary: ts2.returnFalse,
        getResolvedProjectReferenceToRedirect: ts2.returnUndefined,
        getProjectReferenceRedirect: ts2.returnUndefined,
        isSourceOfProjectReferenceRedirect: ts2.returnFalse,
        writeFile: function(name, text, writeByteOrderMark) {
          switch (name) {
            case jsFilePath:
              if (jsFileText === text)
                return;
              break;
            case sourceMapFilePath:
              if (sourceMapText === text)
                return;
              break;
            case buildInfoPath:
              var newBuildInfo = getBuildInfo(text);
              newBuildInfo.program = buildInfo.program;
              var _a2 = buildInfo.bundle, js = _a2.js, dts = _a2.dts, sourceFiles = _a2.sourceFiles;
              newBuildInfo.bundle.js.sources = js.sources;
              if (dts) {
                newBuildInfo.bundle.dts.sources = dts.sources;
              }
              newBuildInfo.bundle.sourceFiles = sourceFiles;
              outputFiles.push({ name, text: getBuildInfoText(newBuildInfo), writeByteOrderMark });
              return;
            case declarationFilePath:
              if (declarationText === text)
                return;
              break;
            case declarationMapPath:
              if (declarationMapText === text)
                return;
              break;
            default:
              ts2.Debug.fail("Unexpected path: ".concat(name));
          }
          outputFiles.push({ name, text, writeByteOrderMark });
        },
        isEmitBlocked: ts2.returnFalse,
        readFile: function(f) {
          return host.readFile(f);
        },
        fileExists: function(f) {
          return host.fileExists(f);
        },
        useCaseSensitiveFileNames: function() {
          return host.useCaseSensitiveFileNames();
        },
        getProgramBuildInfo: ts2.returnUndefined,
        getSourceFileFromReference: ts2.returnUndefined,
        redirectTargetsMap: ts2.createMultiMap(),
        getFileIncludeReasons: ts2.notImplemented
      };
      emitFiles(ts2.notImplementedResolver, emitHost, void 0, ts2.getTransformers(config.options, customTransformers));
      return outputFiles;
    }
    ts2.emitUsingBuildInfo = emitUsingBuildInfo;
    var PipelinePhase;
    (function(PipelinePhase2) {
      PipelinePhase2[PipelinePhase2["Notification"] = 0] = "Notification";
      PipelinePhase2[PipelinePhase2["Substitution"] = 1] = "Substitution";
      PipelinePhase2[PipelinePhase2["Comments"] = 2] = "Comments";
      PipelinePhase2[PipelinePhase2["SourceMaps"] = 3] = "SourceMaps";
      PipelinePhase2[PipelinePhase2["Emit"] = 4] = "Emit";
    })(PipelinePhase || (PipelinePhase = {}));
    function createPrinter(printerOptions, handlers) {
      if (printerOptions === void 0) {
        printerOptions = {};
      }
      if (handlers === void 0) {
        handlers = {};
      }
      var hasGlobalName = handlers.hasGlobalName, _a = handlers.onEmitNode, onEmitNode = _a === void 0 ? ts2.noEmitNotification : _a, isEmitNotificationEnabled = handlers.isEmitNotificationEnabled, _b = handlers.substituteNode, substituteNode = _b === void 0 ? ts2.noEmitSubstitution : _b, onBeforeEmitNode = handlers.onBeforeEmitNode, onAfterEmitNode = handlers.onAfterEmitNode, onBeforeEmitNodeArray = handlers.onBeforeEmitNodeArray, onAfterEmitNodeArray = handlers.onAfterEmitNodeArray, onBeforeEmitToken = handlers.onBeforeEmitToken, onAfterEmitToken = handlers.onAfterEmitToken;
      var extendedDiagnostics = !!printerOptions.extendedDiagnostics;
      var newLine = ts2.getNewLineCharacter(printerOptions);
      var moduleKind = ts2.getEmitModuleKind(printerOptions);
      var bundledHelpers = new ts2.Map();
      var currentSourceFile;
      var nodeIdToGeneratedName;
      var autoGeneratedIdToGeneratedName;
      var generatedNames;
      var tempFlagsStack;
      var tempFlags;
      var reservedNamesStack;
      var reservedNames;
      var preserveSourceNewlines = printerOptions.preserveSourceNewlines;
      var nextListElementPos;
      var writer;
      var ownWriter;
      var write = writeBase;
      var isOwnFileEmit;
      var bundleFileInfo = printerOptions.writeBundleFileInfo ? { sections: [] } : void 0;
      var relativeToBuildInfo = bundleFileInfo ? ts2.Debug.checkDefined(printerOptions.relativeToBuildInfo) : void 0;
      var recordInternalSection = printerOptions.recordInternalSection;
      var sourceFileTextPos = 0;
      var sourceFileTextKind = "text";
      var sourceMapsDisabled = true;
      var sourceMapGenerator;
      var sourceMapSource;
      var sourceMapSourceIndex = -1;
      var mostRecentlyAddedSourceMapSource;
      var mostRecentlyAddedSourceMapSourceIndex = -1;
      var containerPos = -1;
      var containerEnd = -1;
      var declarationListContainerEnd = -1;
      var currentLineMap;
      var detachedCommentsInfo;
      var hasWrittenComment = false;
      var commentsDisabled = !!printerOptions.removeComments;
      var lastSubstitution;
      var currentParenthesizerRule;
      var _c = ts2.performance.createTimerIf(extendedDiagnostics, "commentTime", "beforeComment", "afterComment"), enterComment = _c.enter, exitComment = _c.exit;
      var parenthesizer = ts2.factory.parenthesizer;
      var emitBinaryExpression = createEmitBinaryExpression();
      reset();
      return {
        printNode,
        printList,
        printFile,
        printBundle,
        writeNode,
        writeList,
        writeFile,
        writeBundle,
        bundleFileInfo
      };
      function printNode(hint, node, sourceFile) {
        switch (hint) {
          case 0:
            ts2.Debug.assert(ts2.isSourceFile(node), "Expected a SourceFile node.");
            break;
          case 2:
            ts2.Debug.assert(ts2.isIdentifier(node), "Expected an Identifier node.");
            break;
          case 1:
            ts2.Debug.assert(ts2.isExpression(node), "Expected an Expression node.");
            break;
        }
        switch (node.kind) {
          case 303:
            return printFile(node);
          case 304:
            return printBundle(node);
          case 305:
            return printUnparsedSource(node);
        }
        writeNode(hint, node, sourceFile, beginPrint());
        return endPrint();
      }
      function printList(format, nodes, sourceFile) {
        writeList(format, nodes, sourceFile, beginPrint());
        return endPrint();
      }
      function printBundle(bundle) {
        writeBundle(bundle, beginPrint(), void 0);
        return endPrint();
      }
      function printFile(sourceFile) {
        writeFile(sourceFile, beginPrint(), void 0);
        return endPrint();
      }
      function printUnparsedSource(unparsed) {
        writeUnparsedSource(unparsed, beginPrint());
        return endPrint();
      }
      function writeNode(hint, node, sourceFile, output) {
        var previousWriter = writer;
        setWriter(output, void 0);
        print(hint, node, sourceFile);
        reset();
        writer = previousWriter;
      }
      function writeList(format, nodes, sourceFile, output) {
        var previousWriter = writer;
        setWriter(output, void 0);
        if (sourceFile) {
          setSourceFile(sourceFile);
        }
        emitList(void 0, nodes, format);
        reset();
        writer = previousWriter;
      }
      function getTextPosWithWriteLine() {
        return writer.getTextPosWithWriteLine ? writer.getTextPosWithWriteLine() : writer.getTextPos();
      }
      function updateOrPushBundleFileTextLike(pos, end, kind) {
        var last = ts2.lastOrUndefined(bundleFileInfo.sections);
        if (last && last.kind === kind) {
          last.end = end;
        } else {
          bundleFileInfo.sections.push({ pos, end, kind });
        }
      }
      function recordBundleFileInternalSectionStart(node) {
        if (recordInternalSection && bundleFileInfo && currentSourceFile && (ts2.isDeclaration(node) || ts2.isVariableStatement(node)) && ts2.isInternalDeclaration(node, currentSourceFile) && sourceFileTextKind !== "internal") {
          var prevSourceFileTextKind = sourceFileTextKind;
          recordBundleFileTextLikeSection(writer.getTextPos());
          sourceFileTextPos = getTextPosWithWriteLine();
          sourceFileTextKind = "internal";
          return prevSourceFileTextKind;
        }
        return void 0;
      }
      function recordBundleFileInternalSectionEnd(prevSourceFileTextKind) {
        if (prevSourceFileTextKind) {
          recordBundleFileTextLikeSection(writer.getTextPos());
          sourceFileTextPos = getTextPosWithWriteLine();
          sourceFileTextKind = prevSourceFileTextKind;
        }
      }
      function recordBundleFileTextLikeSection(end) {
        if (sourceFileTextPos < end) {
          updateOrPushBundleFileTextLike(sourceFileTextPos, end, sourceFileTextKind);
          return true;
        }
        return false;
      }
      function writeBundle(bundle, output, sourceMapGenerator2) {
        var _a2;
        isOwnFileEmit = false;
        var previousWriter = writer;
        setWriter(output, sourceMapGenerator2);
        emitShebangIfNeeded(bundle);
        emitPrologueDirectivesIfNeeded(bundle);
        emitHelpers(bundle);
        emitSyntheticTripleSlashReferencesIfNeeded(bundle);
        for (var _b2 = 0, _c2 = bundle.prepends; _b2 < _c2.length; _b2++) {
          var prepend = _c2[_b2];
          writeLine();
          var pos = writer.getTextPos();
          var savedSections = bundleFileInfo && bundleFileInfo.sections;
          if (savedSections)
            bundleFileInfo.sections = [];
          print(4, prepend, void 0);
          if (bundleFileInfo) {
            var newSections = bundleFileInfo.sections;
            bundleFileInfo.sections = savedSections;
            if (prepend.oldFileOfCurrentEmit)
              (_a2 = bundleFileInfo.sections).push.apply(_a2, newSections);
            else {
              newSections.forEach(function(section) {
                return ts2.Debug.assert(ts2.isBundleFileTextLike(section));
              });
              bundleFileInfo.sections.push({
                pos,
                end: writer.getTextPos(),
                kind: "prepend",
                data: relativeToBuildInfo(prepend.fileName),
                texts: newSections
              });
            }
          }
        }
        sourceFileTextPos = getTextPosWithWriteLine();
        for (var _d = 0, _e = bundle.sourceFiles; _d < _e.length; _d++) {
          var sourceFile = _e[_d];
          print(0, sourceFile, sourceFile);
        }
        if (bundleFileInfo && bundle.sourceFiles.length) {
          var end = writer.getTextPos();
          if (recordBundleFileTextLikeSection(end)) {
            var prologues = getPrologueDirectivesFromBundledSourceFiles(bundle);
            if (prologues) {
              if (!bundleFileInfo.sources)
                bundleFileInfo.sources = {};
              bundleFileInfo.sources.prologues = prologues;
            }
            var helpers = getHelpersFromBundledSourceFiles(bundle);
            if (helpers) {
              if (!bundleFileInfo.sources)
                bundleFileInfo.sources = {};
              bundleFileInfo.sources.helpers = helpers;
            }
          }
        }
        reset();
        writer = previousWriter;
      }
      function writeUnparsedSource(unparsed, output) {
        var previousWriter = writer;
        setWriter(output, void 0);
        print(4, unparsed, void 0);
        reset();
        writer = previousWriter;
      }
      function writeFile(sourceFile, output, sourceMapGenerator2) {
        isOwnFileEmit = true;
        var previousWriter = writer;
        setWriter(output, sourceMapGenerator2);
        emitShebangIfNeeded(sourceFile);
        emitPrologueDirectivesIfNeeded(sourceFile);
        print(0, sourceFile, sourceFile);
        reset();
        writer = previousWriter;
      }
      function beginPrint() {
        return ownWriter || (ownWriter = ts2.createTextWriter(newLine));
      }
      function endPrint() {
        var text = ownWriter.getText();
        ownWriter.clear();
        return text;
      }
      function print(hint, node, sourceFile) {
        if (sourceFile) {
          setSourceFile(sourceFile);
        }
        pipelineEmit(hint, node, void 0);
      }
      function setSourceFile(sourceFile) {
        currentSourceFile = sourceFile;
        currentLineMap = void 0;
        detachedCommentsInfo = void 0;
        if (sourceFile) {
          setSourceMapSource(sourceFile);
        }
      }
      function setWriter(_writer, _sourceMapGenerator) {
        if (_writer && printerOptions.omitTrailingSemicolon) {
          _writer = ts2.getTrailingSemicolonDeferringWriter(_writer);
        }
        writer = _writer;
        sourceMapGenerator = _sourceMapGenerator;
        sourceMapsDisabled = !writer || !sourceMapGenerator;
      }
      function reset() {
        nodeIdToGeneratedName = [];
        autoGeneratedIdToGeneratedName = [];
        generatedNames = new ts2.Set();
        tempFlagsStack = [];
        tempFlags = 0;
        reservedNamesStack = [];
        currentSourceFile = void 0;
        currentLineMap = void 0;
        detachedCommentsInfo = void 0;
        setWriter(void 0, void 0);
      }
      function getCurrentLineMap() {
        return currentLineMap || (currentLineMap = ts2.getLineStarts(currentSourceFile));
      }
      function emit(node, parenthesizerRule) {
        if (node === void 0)
          return;
        var prevSourceFileTextKind = recordBundleFileInternalSectionStart(node);
        pipelineEmit(4, node, parenthesizerRule);
        recordBundleFileInternalSectionEnd(prevSourceFileTextKind);
      }
      function emitIdentifierName(node) {
        if (node === void 0)
          return;
        pipelineEmit(2, node, void 0);
      }
      function emitExpression(node, parenthesizerRule) {
        if (node === void 0)
          return;
        pipelineEmit(1, node, parenthesizerRule);
      }
      function emitJsxAttributeValue(node) {
        pipelineEmit(ts2.isStringLiteral(node) ? 6 : 4, node);
      }
      function beforeEmitNode(node) {
        if (preserveSourceNewlines && ts2.getEmitFlags(node) & 134217728) {
          preserveSourceNewlines = false;
        }
      }
      function afterEmitNode(savedPreserveSourceNewlines) {
        preserveSourceNewlines = savedPreserveSourceNewlines;
      }
      function pipelineEmit(emitHint, node, parenthesizerRule) {
        currentParenthesizerRule = parenthesizerRule;
        var pipelinePhase = getPipelinePhase(0, emitHint, node);
        pipelinePhase(emitHint, node);
        currentParenthesizerRule = void 0;
      }
      function shouldEmitComments(node) {
        return !commentsDisabled && !ts2.isSourceFile(node);
      }
      function shouldEmitSourceMaps(node) {
        return !sourceMapsDisabled && !ts2.isSourceFile(node) && !ts2.isInJsonFile(node) && !ts2.isUnparsedSource(node) && !ts2.isUnparsedPrepend(node);
      }
      function getPipelinePhase(phase, emitHint, node) {
        switch (phase) {
          case 0:
            if (onEmitNode !== ts2.noEmitNotification && (!isEmitNotificationEnabled || isEmitNotificationEnabled(node))) {
              return pipelineEmitWithNotification;
            }
          case 1:
            if (substituteNode !== ts2.noEmitSubstitution && (lastSubstitution = substituteNode(emitHint, node) || node) !== node) {
              if (currentParenthesizerRule) {
                lastSubstitution = currentParenthesizerRule(lastSubstitution);
              }
              return pipelineEmitWithSubstitution;
            }
          case 2:
            if (shouldEmitComments(node)) {
              return pipelineEmitWithComments;
            }
          case 3:
            if (shouldEmitSourceMaps(node)) {
              return pipelineEmitWithSourceMaps;
            }
          case 4:
            return pipelineEmitWithHint;
          default:
            return ts2.Debug.assertNever(phase);
        }
      }
      function getNextPipelinePhase(currentPhase, emitHint, node) {
        return getPipelinePhase(currentPhase + 1, emitHint, node);
      }
      function pipelineEmitWithNotification(hint, node) {
        var pipelinePhase = getNextPipelinePhase(0, hint, node);
        onEmitNode(hint, node, pipelinePhase);
      }
      function pipelineEmitWithHint(hint, node) {
        onBeforeEmitNode === null || onBeforeEmitNode === void 0 ? void 0 : onBeforeEmitNode(node);
        if (preserveSourceNewlines) {
          var savedPreserveSourceNewlines = preserveSourceNewlines;
          beforeEmitNode(node);
          pipelineEmitWithHintWorker(hint, node);
          afterEmitNode(savedPreserveSourceNewlines);
        } else {
          pipelineEmitWithHintWorker(hint, node);
        }
        onAfterEmitNode === null || onAfterEmitNode === void 0 ? void 0 : onAfterEmitNode(node);
        currentParenthesizerRule = void 0;
      }
      function pipelineEmitWithHintWorker(hint, node, allowSnippets) {
        if (allowSnippets === void 0) {
          allowSnippets = true;
        }
        if (allowSnippets) {
          var snippet = ts2.getSnippetElement(node);
          if (snippet) {
            return emitSnippetNode(hint, node, snippet);
          }
        }
        if (hint === 0)
          return emitSourceFile(ts2.cast(node, ts2.isSourceFile));
        if (hint === 2)
          return emitIdentifier(ts2.cast(node, ts2.isIdentifier));
        if (hint === 6)
          return emitLiteral(ts2.cast(node, ts2.isStringLiteral), true);
        if (hint === 3)
          return emitMappedTypeParameter(ts2.cast(node, ts2.isTypeParameterDeclaration));
        if (hint === 5) {
          ts2.Debug.assertNode(node, ts2.isEmptyStatement);
          return emitEmptyStatement(true);
        }
        if (hint === 4) {
          switch (node.kind) {
            case 15:
            case 16:
            case 17:
              return emitLiteral(node, false);
            case 79:
              return emitIdentifier(node);
            case 80:
              return emitPrivateIdentifier(node);
            case 160:
              return emitQualifiedName(node);
            case 161:
              return emitComputedPropertyName(node);
            case 162:
              return emitTypeParameter(node);
            case 163:
              return emitParameter(node);
            case 164:
              return emitDecorator(node);
            case 165:
              return emitPropertySignature(node);
            case 166:
              return emitPropertyDeclaration(node);
            case 167:
              return emitMethodSignature(node);
            case 168:
              return emitMethodDeclaration(node);
            case 169:
              return emitClassStaticBlockDeclaration(node);
            case 170:
              return emitConstructor(node);
            case 171:
            case 172:
              return emitAccessorDeclaration(node);
            case 173:
              return emitCallSignature(node);
            case 174:
              return emitConstructSignature(node);
            case 175:
              return emitIndexSignature(node);
            case 176:
              return emitTypePredicate(node);
            case 177:
              return emitTypeReference(node);
            case 178:
              return emitFunctionType(node);
            case 179:
              return emitConstructorType(node);
            case 180:
              return emitTypeQuery(node);
            case 181:
              return emitTypeLiteral(node);
            case 182:
              return emitArrayType(node);
            case 183:
              return emitTupleType(node);
            case 184:
              return emitOptionalType(node);
            case 186:
              return emitUnionType(node);
            case 187:
              return emitIntersectionType(node);
            case 188:
              return emitConditionalType(node);
            case 189:
              return emitInferType(node);
            case 190:
              return emitParenthesizedType(node);
            case 227:
              return emitExpressionWithTypeArguments(node);
            case 191:
              return emitThisType();
            case 192:
              return emitTypeOperator(node);
            case 193:
              return emitIndexedAccessType(node);
            case 194:
              return emitMappedType(node);
            case 195:
              return emitLiteralType(node);
            case 196:
              return emitNamedTupleMember(node);
            case 197:
              return emitTemplateType(node);
            case 198:
              return emitTemplateTypeSpan(node);
            case 199:
              return emitImportTypeNode(node);
            case 200:
              return emitObjectBindingPattern(node);
            case 201:
              return emitArrayBindingPattern(node);
            case 202:
              return emitBindingElement(node);
            case 232:
              return emitTemplateSpan(node);
            case 233:
              return emitSemicolonClassElement();
            case 234:
              return emitBlock(node);
            case 236:
              return emitVariableStatement(node);
            case 235:
              return emitEmptyStatement(false);
            case 237:
              return emitExpressionStatement(node);
            case 238:
              return emitIfStatement(node);
            case 239:
              return emitDoStatement(node);
            case 240:
              return emitWhileStatement(node);
            case 241:
              return emitForStatement(node);
            case 242:
              return emitForInStatement(node);
            case 243:
              return emitForOfStatement(node);
            case 244:
              return emitContinueStatement(node);
            case 245:
              return emitBreakStatement(node);
            case 246:
              return emitReturnStatement(node);
            case 247:
              return emitWithStatement(node);
            case 248:
              return emitSwitchStatement(node);
            case 249:
              return emitLabeledStatement(node);
            case 250:
              return emitThrowStatement(node);
            case 251:
              return emitTryStatement(node);
            case 252:
              return emitDebuggerStatement(node);
            case 253:
              return emitVariableDeclaration(node);
            case 254:
              return emitVariableDeclarationList(node);
            case 255:
              return emitFunctionDeclaration(node);
            case 256:
              return emitClassDeclaration(node);
            case 257:
              return emitInterfaceDeclaration(node);
            case 258:
              return emitTypeAliasDeclaration(node);
            case 259:
              return emitEnumDeclaration(node);
            case 260:
              return emitModuleDeclaration(node);
            case 261:
              return emitModuleBlock(node);
            case 262:
              return emitCaseBlock(node);
            case 263:
              return emitNamespaceExportDeclaration(node);
            case 264:
              return emitImportEqualsDeclaration(node);
            case 265:
              return emitImportDeclaration(node);
            case 266:
              return emitImportClause(node);
            case 267:
              return emitNamespaceImport(node);
            case 273:
              return emitNamespaceExport(node);
            case 268:
              return emitNamedImports(node);
            case 269:
              return emitImportSpecifier(node);
            case 270:
              return emitExportAssignment(node);
            case 271:
              return emitExportDeclaration(node);
            case 272:
              return emitNamedExports(node);
            case 274:
              return emitExportSpecifier(node);
            case 292:
              return emitAssertClause(node);
            case 293:
              return emitAssertEntry(node);
            case 275:
              return;
            case 276:
              return emitExternalModuleReference(node);
            case 11:
              return emitJsxText(node);
            case 279:
            case 282:
              return emitJsxOpeningElementOrFragment(node);
            case 280:
            case 283:
              return emitJsxClosingElementOrFragment(node);
            case 284:
              return emitJsxAttribute(node);
            case 285:
              return emitJsxAttributes(node);
            case 286:
              return emitJsxSpreadAttribute(node);
            case 287:
              return emitJsxExpression(node);
            case 288:
              return emitCaseClause(node);
            case 289:
              return emitDefaultClause(node);
            case 290:
              return emitHeritageClause(node);
            case 291:
              return emitCatchClause(node);
            case 294:
              return emitPropertyAssignment(node);
            case 295:
              return emitShorthandPropertyAssignment(node);
            case 296:
              return emitSpreadAssignment(node);
            case 297:
              return emitEnumMember(node);
            case 298:
              return writeUnparsedNode(node);
            case 305:
            case 299:
              return emitUnparsedSourceOrPrepend(node);
            case 300:
            case 301:
              return emitUnparsedTextLike(node);
            case 302:
              return emitUnparsedSyntheticReference(node);
            case 303:
              return emitSourceFile(node);
            case 304:
              return ts2.Debug.fail("Bundles should be printed using printBundle");
            case 306:
              return ts2.Debug.fail("InputFiles should not be printed");
            case 307:
              return emitJSDocTypeExpression(node);
            case 308:
              return emitJSDocNameReference(node);
            case 310:
              return writePunctuation("*");
            case 311:
              return writePunctuation("?");
            case 312:
              return emitJSDocNullableType(node);
            case 313:
              return emitJSDocNonNullableType(node);
            case 314:
              return emitJSDocOptionalType(node);
            case 315:
              return emitJSDocFunctionType(node);
            case 185:
            case 316:
              return emitRestOrJSDocVariadicType(node);
            case 317:
              return;
            case 318:
              return emitJSDoc(node);
            case 320:
              return emitJSDocTypeLiteral(node);
            case 321:
              return emitJSDocSignature(node);
            case 325:
            case 330:
              return emitJSDocSimpleTag(node);
            case 326:
            case 327:
              return emitJSDocHeritageTag(node);
            case 328:
            case 329:
              return;
            case 331:
            case 332:
            case 333:
            case 334:
            case 335:
              return;
            case 336:
              return emitJSDocCallbackTag(node);
            case 338:
            case 345:
              return emitJSDocPropertyLikeTag(node);
            case 337:
            case 339:
            case 340:
            case 341:
              return emitJSDocSimpleTypedTag(node);
            case 342:
              return emitJSDocTemplateTag(node);
            case 343:
              return emitJSDocTypedefTag(node);
            case 344:
              return emitJSDocSeeTag(node);
            case 347:
            case 351:
            case 350:
              return;
          }
          if (ts2.isExpression(node)) {
            hint = 1;
            if (substituteNode !== ts2.noEmitSubstitution) {
              var substitute = substituteNode(hint, node) || node;
              if (substitute !== node) {
                node = substitute;
                if (currentParenthesizerRule) {
                  node = currentParenthesizerRule(node);
                }
              }
            }
          }
        }
        if (hint === 1) {
          switch (node.kind) {
            case 8:
            case 9:
              return emitNumericOrBigIntLiteral(node);
            case 10:
            case 13:
            case 14:
              return emitLiteral(node, false);
            case 79:
              return emitIdentifier(node);
            case 80:
              return emitPrivateIdentifier(node);
            case 203:
              return emitArrayLiteralExpression(node);
            case 204:
              return emitObjectLiteralExpression(node);
            case 205:
              return emitPropertyAccessExpression(node);
            case 206:
              return emitElementAccessExpression(node);
            case 207:
              return emitCallExpression(node);
            case 208:
              return emitNewExpression(node);
            case 209:
              return emitTaggedTemplateExpression(node);
            case 210:
              return emitTypeAssertionExpression(node);
            case 211:
              return emitParenthesizedExpression(node);
            case 212:
              return emitFunctionExpression(node);
            case 213:
              return emitArrowFunction(node);
            case 214:
              return emitDeleteExpression(node);
            case 215:
              return emitTypeOfExpression(node);
            case 216:
              return emitVoidExpression(node);
            case 217:
              return emitAwaitExpression(node);
            case 218:
              return emitPrefixUnaryExpression(node);
            case 219:
              return emitPostfixUnaryExpression(node);
            case 220:
              return emitBinaryExpression(node);
            case 221:
              return emitConditionalExpression(node);
            case 222:
              return emitTemplateExpression(node);
            case 223:
              return emitYieldExpression(node);
            case 224:
              return emitSpreadElement(node);
            case 225:
              return emitClassExpression(node);
            case 226:
              return;
            case 228:
              return emitAsExpression(node);
            case 229:
              return emitNonNullExpression(node);
            case 230:
              return emitMetaProperty(node);
            case 231:
              return ts2.Debug.fail("SyntheticExpression should never be printed.");
            case 277:
              return emitJsxElement(node);
            case 278:
              return emitJsxSelfClosingElement(node);
            case 281:
              return emitJsxFragment(node);
            case 346:
              return ts2.Debug.fail("SyntaxList should not be printed");
            case 347:
              return;
            case 348:
              return emitPartiallyEmittedExpression(node);
            case 349:
              return emitCommaList(node);
            case 350:
            case 351:
              return;
            case 352:
              return ts2.Debug.fail("SyntheticReferenceExpression should not be printed");
          }
        }
        if (ts2.isKeyword(node.kind))
          return writeTokenNode(node, writeKeyword);
        if (ts2.isTokenKind(node.kind))
          return writeTokenNode(node, writePunctuation);
        ts2.Debug.fail("Unhandled SyntaxKind: ".concat(ts2.Debug.formatSyntaxKind(node.kind), "."));
      }
      function emitMappedTypeParameter(node) {
        emit(node.name);
        writeSpace();
        writeKeyword("in");
        writeSpace();
        emit(node.constraint);
      }
      function pipelineEmitWithSubstitution(hint, node) {
        var pipelinePhase = getNextPipelinePhase(1, hint, node);
        ts2.Debug.assertIsDefined(lastSubstitution);
        node = lastSubstitution;
        lastSubstitution = void 0;
        pipelinePhase(hint, node);
      }
      function getHelpersFromBundledSourceFiles(bundle) {
        var result;
        if (moduleKind === ts2.ModuleKind.None || printerOptions.noEmitHelpers) {
          return void 0;
        }
        var bundledHelpers2 = new ts2.Map();
        for (var _a2 = 0, _b2 = bundle.sourceFiles; _a2 < _b2.length; _a2++) {
          var sourceFile = _b2[_a2];
          var shouldSkip = ts2.getExternalHelpersModuleName(sourceFile) !== void 0;
          var helpers = getSortedEmitHelpers(sourceFile);
          if (!helpers)
            continue;
          for (var _c2 = 0, helpers_5 = helpers; _c2 < helpers_5.length; _c2++) {
            var helper = helpers_5[_c2];
            if (!helper.scoped && !shouldSkip && !bundledHelpers2.get(helper.name)) {
              bundledHelpers2.set(helper.name, true);
              (result || (result = [])).push(helper.name);
            }
          }
        }
        return result;
      }
      function emitHelpers(node) {
        var helpersEmitted = false;
        var bundle = node.kind === 304 ? node : void 0;
        if (bundle && moduleKind === ts2.ModuleKind.None) {
          return;
        }
        var numPrepends = bundle ? bundle.prepends.length : 0;
        var numNodes = bundle ? bundle.sourceFiles.length + numPrepends : 1;
        for (var i = 0; i < numNodes; i++) {
          var currentNode = bundle ? i < numPrepends ? bundle.prepends[i] : bundle.sourceFiles[i - numPrepends] : node;
          var sourceFile = ts2.isSourceFile(currentNode) ? currentNode : ts2.isUnparsedSource(currentNode) ? void 0 : currentSourceFile;
          var shouldSkip = printerOptions.noEmitHelpers || !!sourceFile && ts2.hasRecordedExternalHelpers(sourceFile);
          var shouldBundle = (ts2.isSourceFile(currentNode) || ts2.isUnparsedSource(currentNode)) && !isOwnFileEmit;
          var helpers = ts2.isUnparsedSource(currentNode) ? currentNode.helpers : getSortedEmitHelpers(currentNode);
          if (helpers) {
            for (var _a2 = 0, helpers_6 = helpers; _a2 < helpers_6.length; _a2++) {
              var helper = helpers_6[_a2];
              if (!helper.scoped) {
                if (shouldSkip)
                  continue;
                if (shouldBundle) {
                  if (bundledHelpers.get(helper.name)) {
                    continue;
                  }
                  bundledHelpers.set(helper.name, true);
                }
              } else if (bundle) {
                continue;
              }
              var pos = getTextPosWithWriteLine();
              if (typeof helper.text === "string") {
                writeLines(helper.text);
              } else {
                writeLines(helper.text(makeFileLevelOptimisticUniqueName));
              }
              if (bundleFileInfo)
                bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "emitHelpers", data: helper.name });
              helpersEmitted = true;
            }
          }
        }
        return helpersEmitted;
      }
      function getSortedEmitHelpers(node) {
        var helpers = ts2.getEmitHelpers(node);
        return helpers && ts2.stableSort(helpers, ts2.compareEmitHelpers);
      }
      function emitNumericOrBigIntLiteral(node) {
        emitLiteral(node, false);
      }
      function emitLiteral(node, jsxAttributeEscape) {
        var text = getLiteralTextOfNode(node, printerOptions.neverAsciiEscape, jsxAttributeEscape);
        if ((printerOptions.sourceMap || printerOptions.inlineSourceMap) && (node.kind === 10 || ts2.isTemplateLiteralKind(node.kind))) {
          writeLiteral(text);
        } else {
          writeStringLiteral(text);
        }
      }
      function emitUnparsedSourceOrPrepend(unparsed) {
        for (var _a2 = 0, _b2 = unparsed.texts; _a2 < _b2.length; _a2++) {
          var text = _b2[_a2];
          writeLine();
          emit(text);
        }
      }
      function writeUnparsedNode(unparsed) {
        writer.rawWrite(unparsed.parent.text.substring(unparsed.pos, unparsed.end));
      }
      function emitUnparsedTextLike(unparsed) {
        var pos = getTextPosWithWriteLine();
        writeUnparsedNode(unparsed);
        if (bundleFileInfo) {
          updateOrPushBundleFileTextLike(pos, writer.getTextPos(), unparsed.kind === 300 ? "text" : "internal");
        }
      }
      function emitUnparsedSyntheticReference(unparsed) {
        var pos = getTextPosWithWriteLine();
        writeUnparsedNode(unparsed);
        if (bundleFileInfo) {
          var section = ts2.clone(unparsed.section);
          section.pos = pos;
          section.end = writer.getTextPos();
          bundleFileInfo.sections.push(section);
        }
      }
      function emitSnippetNode(hint, node, snippet) {
        switch (snippet.kind) {
          case 1:
            emitPlaceholder(hint, node, snippet);
            break;
          case 0:
            emitTabStop(snippet);
            break;
        }
      }
      function emitPlaceholder(hint, node, snippet) {
        nonEscapingWrite("${".concat(snippet.order, ":"));
        pipelineEmitWithHintWorker(hint, node, false);
        nonEscapingWrite("}");
      }
      function emitTabStop(snippet) {
        nonEscapingWrite("$".concat(snippet.order));
      }
      function emitIdentifier(node) {
        var writeText = node.symbol ? writeSymbol : write;
        writeText(getTextOfNode(node, false), node.symbol);
        emitList(node, node.typeArguments, 53776);
      }
      function emitPrivateIdentifier(node) {
        var writeText = node.symbol ? writeSymbol : write;
        writeText(getTextOfNode(node, false), node.symbol);
      }
      function emitQualifiedName(node) {
        emitEntityName(node.left);
        writePunctuation(".");
        emit(node.right);
      }
      function emitEntityName(node) {
        if (node.kind === 79) {
          emitExpression(node);
        } else {
          emit(node);
        }
      }
      function emitComputedPropertyName(node) {
        writePunctuation("[");
        emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfComputedPropertyName);
        writePunctuation("]");
      }
      function emitTypeParameter(node) {
        emit(node.name);
        if (node.constraint) {
          writeSpace();
          writeKeyword("extends");
          writeSpace();
          emit(node.constraint);
        }
        if (node.default) {
          writeSpace();
          writeOperator("=");
          writeSpace();
          emit(node.default);
        }
      }
      function emitParameter(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emit(node.dotDotDotToken);
        emitNodeWithWriter(node.name, writeParameter);
        emit(node.questionToken);
        if (node.parent && node.parent.kind === 315 && !node.name) {
          emit(node.type);
        } else {
          emitTypeAnnotation(node.type);
        }
        emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name ? node.name.end : node.modifiers ? node.modifiers.end : node.decorators ? node.decorators.end : node.pos, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitDecorator(decorator) {
        writePunctuation("@");
        emitExpression(decorator.expression, parenthesizer.parenthesizeLeftSideOfAccess);
      }
      function emitPropertySignature(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emitNodeWithWriter(node.name, writeProperty);
        emit(node.questionToken);
        emitTypeAnnotation(node.type);
        writeTrailingSemicolon();
      }
      function emitPropertyDeclaration(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emit(node.name);
        emit(node.questionToken);
        emit(node.exclamationToken);
        emitTypeAnnotation(node.type);
        emitInitializer(node.initializer, node.type ? node.type.end : node.questionToken ? node.questionToken.end : node.name.end, node);
        writeTrailingSemicolon();
      }
      function emitMethodSignature(node) {
        pushNameGenerationScope(node);
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emit(node.name);
        emit(node.questionToken);
        emitTypeParameters(node, node.typeParameters);
        emitParameters(node, node.parameters);
        emitTypeAnnotation(node.type);
        writeTrailingSemicolon();
        popNameGenerationScope(node);
      }
      function emitMethodDeclaration(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emit(node.asteriskToken);
        emit(node.name);
        emit(node.questionToken);
        emitSignatureAndBody(node, emitSignatureHead);
      }
      function emitClassStaticBlockDeclaration(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        writeKeyword("static");
        emitBlockFunctionBody(node.body);
      }
      function emitConstructor(node) {
        emitModifiers(node, node.modifiers);
        writeKeyword("constructor");
        emitSignatureAndBody(node, emitSignatureHead);
      }
      function emitAccessorDeclaration(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        writeKeyword(node.kind === 171 ? "get" : "set");
        writeSpace();
        emit(node.name);
        emitSignatureAndBody(node, emitSignatureHead);
      }
      function emitCallSignature(node) {
        pushNameGenerationScope(node);
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emitTypeParameters(node, node.typeParameters);
        emitParameters(node, node.parameters);
        emitTypeAnnotation(node.type);
        writeTrailingSemicolon();
        popNameGenerationScope(node);
      }
      function emitConstructSignature(node) {
        pushNameGenerationScope(node);
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        writeKeyword("new");
        writeSpace();
        emitTypeParameters(node, node.typeParameters);
        emitParameters(node, node.parameters);
        emitTypeAnnotation(node.type);
        writeTrailingSemicolon();
        popNameGenerationScope(node);
      }
      function emitIndexSignature(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emitParametersForIndexSignature(node, node.parameters);
        emitTypeAnnotation(node.type);
        writeTrailingSemicolon();
      }
      function emitTemplateTypeSpan(node) {
        emit(node.type);
        emit(node.literal);
      }
      function emitSemicolonClassElement() {
        writeTrailingSemicolon();
      }
      function emitTypePredicate(node) {
        if (node.assertsModifier) {
          emit(node.assertsModifier);
          writeSpace();
        }
        emit(node.parameterName);
        if (node.type) {
          writeSpace();
          writeKeyword("is");
          writeSpace();
          emit(node.type);
        }
      }
      function emitTypeReference(node) {
        emit(node.typeName);
        emitTypeArguments(node, node.typeArguments);
      }
      function emitFunctionType(node) {
        pushNameGenerationScope(node);
        emitTypeParameters(node, node.typeParameters);
        emitParametersForArrow(node, node.parameters);
        writeSpace();
        writePunctuation("=>");
        writeSpace();
        emit(node.type);
        popNameGenerationScope(node);
      }
      function emitJSDocFunctionType(node) {
        writeKeyword("function");
        emitParameters(node, node.parameters);
        writePunctuation(":");
        emit(node.type);
      }
      function emitJSDocNullableType(node) {
        writePunctuation("?");
        emit(node.type);
      }
      function emitJSDocNonNullableType(node) {
        writePunctuation("!");
        emit(node.type);
      }
      function emitJSDocOptionalType(node) {
        emit(node.type);
        writePunctuation("=");
      }
      function emitConstructorType(node) {
        pushNameGenerationScope(node);
        emitModifiers(node, node.modifiers);
        writeKeyword("new");
        writeSpace();
        emitTypeParameters(node, node.typeParameters);
        emitParameters(node, node.parameters);
        writeSpace();
        writePunctuation("=>");
        writeSpace();
        emit(node.type);
        popNameGenerationScope(node);
      }
      function emitTypeQuery(node) {
        writeKeyword("typeof");
        writeSpace();
        emit(node.exprName);
      }
      function emitTypeLiteral(node) {
        writePunctuation("{");
        var flags = ts2.getEmitFlags(node) & 1 ? 768 : 32897;
        emitList(node, node.members, flags | 524288);
        writePunctuation("}");
      }
      function emitArrayType(node) {
        emit(node.elementType, parenthesizer.parenthesizeElementTypeOfArrayType);
        writePunctuation("[");
        writePunctuation("]");
      }
      function emitRestOrJSDocVariadicType(node) {
        writePunctuation("...");
        emit(node.type);
      }
      function emitTupleType(node) {
        emitTokenWithComment(22, node.pos, writePunctuation, node);
        var flags = ts2.getEmitFlags(node) & 1 ? 528 : 657;
        emitList(node, node.elements, flags | 524288);
        emitTokenWithComment(23, node.elements.end, writePunctuation, node);
      }
      function emitNamedTupleMember(node) {
        emit(node.dotDotDotToken);
        emit(node.name);
        emit(node.questionToken);
        emitTokenWithComment(58, node.name.end, writePunctuation, node);
        writeSpace();
        emit(node.type);
      }
      function emitOptionalType(node) {
        emit(node.type, parenthesizer.parenthesizeElementTypeOfArrayType);
        writePunctuation("?");
      }
      function emitUnionType(node) {
        emitList(node, node.types, 516, parenthesizer.parenthesizeMemberOfElementType);
      }
      function emitIntersectionType(node) {
        emitList(node, node.types, 520, parenthesizer.parenthesizeMemberOfElementType);
      }
      function emitConditionalType(node) {
        emit(node.checkType, parenthesizer.parenthesizeMemberOfConditionalType);
        writeSpace();
        writeKeyword("extends");
        writeSpace();
        emit(node.extendsType, parenthesizer.parenthesizeMemberOfConditionalType);
        writeSpace();
        writePunctuation("?");
        writeSpace();
        emit(node.trueType);
        writeSpace();
        writePunctuation(":");
        writeSpace();
        emit(node.falseType);
      }
      function emitInferType(node) {
        writeKeyword("infer");
        writeSpace();
        emit(node.typeParameter);
      }
      function emitParenthesizedType(node) {
        writePunctuation("(");
        emit(node.type);
        writePunctuation(")");
      }
      function emitThisType() {
        writeKeyword("this");
      }
      function emitTypeOperator(node) {
        writeTokenText(node.operator, writeKeyword);
        writeSpace();
        emit(node.type, parenthesizer.parenthesizeMemberOfElementType);
      }
      function emitIndexedAccessType(node) {
        emit(node.objectType, parenthesizer.parenthesizeMemberOfElementType);
        writePunctuation("[");
        emit(node.indexType);
        writePunctuation("]");
      }
      function emitMappedType(node) {
        var emitFlags = ts2.getEmitFlags(node);
        writePunctuation("{");
        if (emitFlags & 1) {
          writeSpace();
        } else {
          writeLine();
          increaseIndent();
        }
        if (node.readonlyToken) {
          emit(node.readonlyToken);
          if (node.readonlyToken.kind !== 144) {
            writeKeyword("readonly");
          }
          writeSpace();
        }
        writePunctuation("[");
        pipelineEmit(3, node.typeParameter);
        if (node.nameType) {
          writeSpace();
          writeKeyword("as");
          writeSpace();
          emit(node.nameType);
        }
        writePunctuation("]");
        if (node.questionToken) {
          emit(node.questionToken);
          if (node.questionToken.kind !== 57) {
            writePunctuation("?");
          }
        }
        writePunctuation(":");
        writeSpace();
        emit(node.type);
        writeTrailingSemicolon();
        if (emitFlags & 1) {
          writeSpace();
        } else {
          writeLine();
          decreaseIndent();
        }
        writePunctuation("}");
      }
      function emitLiteralType(node) {
        emitExpression(node.literal);
      }
      function emitTemplateType(node) {
        emit(node.head);
        emitList(node, node.templateSpans, 262144);
      }
      function emitImportTypeNode(node) {
        if (node.isTypeOf) {
          writeKeyword("typeof");
          writeSpace();
        }
        writeKeyword("import");
        writePunctuation("(");
        emit(node.argument);
        writePunctuation(")");
        if (node.qualifier) {
          writePunctuation(".");
          emit(node.qualifier);
        }
        emitTypeArguments(node, node.typeArguments);
      }
      function emitObjectBindingPattern(node) {
        writePunctuation("{");
        emitList(node, node.elements, 525136);
        writePunctuation("}");
      }
      function emitArrayBindingPattern(node) {
        writePunctuation("[");
        emitList(node, node.elements, 524880);
        writePunctuation("]");
      }
      function emitBindingElement(node) {
        emit(node.dotDotDotToken);
        if (node.propertyName) {
          emit(node.propertyName);
          writePunctuation(":");
          writeSpace();
        }
        emit(node.name);
        emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitArrayLiteralExpression(node) {
        var elements = node.elements;
        var preferNewLine = node.multiLine ? 65536 : 0;
        emitExpressionList(node, elements, 8914 | preferNewLine, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitObjectLiteralExpression(node) {
        ts2.forEach(node.properties, generateMemberNames);
        var indentedFlag = ts2.getEmitFlags(node) & 65536;
        if (indentedFlag) {
          increaseIndent();
        }
        var preferNewLine = node.multiLine ? 65536 : 0;
        var allowTrailingComma = currentSourceFile.languageVersion >= 1 && !ts2.isJsonSourceFile(currentSourceFile) ? 64 : 0;
        emitList(node, node.properties, 526226 | allowTrailingComma | preferNewLine);
        if (indentedFlag) {
          decreaseIndent();
        }
      }
      function emitPropertyAccessExpression(node) {
        emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
        var token = node.questionDotToken || ts2.setTextRangePosEnd(ts2.factory.createToken(24), node.expression.end, node.name.pos);
        var linesBeforeDot = getLinesBetweenNodes(node, node.expression, token);
        var linesAfterDot = getLinesBetweenNodes(node, token, node.name);
        writeLinesAndIndent(linesBeforeDot, false);
        var shouldEmitDotDot = token.kind !== 28 && mayNeedDotDotForPropertyAccess(node.expression) && !writer.hasTrailingComment() && !writer.hasTrailingWhitespace();
        if (shouldEmitDotDot) {
          writePunctuation(".");
        }
        if (node.questionDotToken) {
          emit(token);
        } else {
          emitTokenWithComment(token.kind, node.expression.end, writePunctuation, node);
        }
        writeLinesAndIndent(linesAfterDot, false);
        emit(node.name);
        decreaseIndentIf(linesBeforeDot, linesAfterDot);
      }
      function mayNeedDotDotForPropertyAccess(expression) {
        expression = ts2.skipPartiallyEmittedExpressions(expression);
        if (ts2.isNumericLiteral(expression)) {
          var text = getLiteralTextOfNode(expression, true, false);
          return !expression.numericLiteralFlags && !ts2.stringContains(text, ts2.tokenToString(24));
        } else if (ts2.isAccessExpression(expression)) {
          var constantValue = ts2.getConstantValue(expression);
          return typeof constantValue === "number" && isFinite(constantValue) && Math.floor(constantValue) === constantValue;
        }
      }
      function emitElementAccessExpression(node) {
        emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
        emit(node.questionDotToken);
        emitTokenWithComment(22, node.expression.end, writePunctuation, node);
        emitExpression(node.argumentExpression);
        emitTokenWithComment(23, node.argumentExpression.end, writePunctuation, node);
      }
      function emitCallExpression(node) {
        var indirectCall = ts2.getEmitFlags(node) & 536870912;
        if (indirectCall) {
          writePunctuation("(");
          writeLiteral("0");
          writePunctuation(",");
          writeSpace();
        }
        emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
        if (indirectCall) {
          writePunctuation(")");
        }
        emit(node.questionDotToken);
        emitTypeArguments(node, node.typeArguments);
        emitExpressionList(node, node.arguments, 2576, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitNewExpression(node) {
        emitTokenWithComment(103, node.pos, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfNew);
        emitTypeArguments(node, node.typeArguments);
        emitExpressionList(node, node.arguments, 18960, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitTaggedTemplateExpression(node) {
        var indirectCall = ts2.getEmitFlags(node) & 536870912;
        if (indirectCall) {
          writePunctuation("(");
          writeLiteral("0");
          writePunctuation(",");
          writeSpace();
        }
        emitExpression(node.tag, parenthesizer.parenthesizeLeftSideOfAccess);
        if (indirectCall) {
          writePunctuation(")");
        }
        emitTypeArguments(node, node.typeArguments);
        writeSpace();
        emitExpression(node.template);
      }
      function emitTypeAssertionExpression(node) {
        writePunctuation("<");
        emit(node.type);
        writePunctuation(">");
        emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
      }
      function emitParenthesizedExpression(node) {
        var openParenPos = emitTokenWithComment(20, node.pos, writePunctuation, node);
        var indented = writeLineSeparatorsAndIndentBefore(node.expression, node);
        emitExpression(node.expression, void 0);
        writeLineSeparatorsAfter(node.expression, node);
        decreaseIndentIf(indented);
        emitTokenWithComment(21, node.expression ? node.expression.end : openParenPos, writePunctuation, node);
      }
      function emitFunctionExpression(node) {
        generateNameIfNeeded(node.name);
        emitFunctionDeclarationOrExpression(node);
      }
      function emitArrowFunction(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        emitSignatureAndBody(node, emitArrowFunctionHead);
      }
      function emitArrowFunctionHead(node) {
        emitTypeParameters(node, node.typeParameters);
        emitParametersForArrow(node, node.parameters);
        emitTypeAnnotation(node.type);
        writeSpace();
        emit(node.equalsGreaterThanToken);
      }
      function emitDeleteExpression(node) {
        emitTokenWithComment(89, node.pos, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
      }
      function emitTypeOfExpression(node) {
        emitTokenWithComment(112, node.pos, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
      }
      function emitVoidExpression(node) {
        emitTokenWithComment(114, node.pos, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
      }
      function emitAwaitExpression(node) {
        emitTokenWithComment(132, node.pos, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression, parenthesizer.parenthesizeOperandOfPrefixUnary);
      }
      function emitPrefixUnaryExpression(node) {
        writeTokenText(node.operator, writeOperator);
        if (shouldEmitWhitespaceBeforeOperand(node)) {
          writeSpace();
        }
        emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPrefixUnary);
      }
      function shouldEmitWhitespaceBeforeOperand(node) {
        var operand = node.operand;
        return operand.kind === 218 && (node.operator === 39 && (operand.operator === 39 || operand.operator === 45) || node.operator === 40 && (operand.operator === 40 || operand.operator === 46));
      }
      function emitPostfixUnaryExpression(node) {
        emitExpression(node.operand, parenthesizer.parenthesizeOperandOfPostfixUnary);
        writeTokenText(node.operator, writeOperator);
      }
      function createEmitBinaryExpression() {
        return ts2.createBinaryExpressionTrampoline(onEnter, onLeft, onOperator, onRight, onExit, void 0);
        function onEnter(node, state) {
          if (state) {
            state.stackIndex++;
            state.preserveSourceNewlinesStack[state.stackIndex] = preserveSourceNewlines;
            state.containerPosStack[state.stackIndex] = containerPos;
            state.containerEndStack[state.stackIndex] = containerEnd;
            state.declarationListContainerEndStack[state.stackIndex] = declarationListContainerEnd;
            var emitComments_1 = state.shouldEmitCommentsStack[state.stackIndex] = shouldEmitComments(node);
            var emitSourceMaps = state.shouldEmitSourceMapsStack[state.stackIndex] = shouldEmitSourceMaps(node);
            onBeforeEmitNode === null || onBeforeEmitNode === void 0 ? void 0 : onBeforeEmitNode(node);
            if (emitComments_1)
              emitCommentsBeforeNode(node);
            if (emitSourceMaps)
              emitSourceMapsBeforeNode(node);
            beforeEmitNode(node);
          } else {
            state = {
              stackIndex: 0,
              preserveSourceNewlinesStack: [void 0],
              containerPosStack: [-1],
              containerEndStack: [-1],
              declarationListContainerEndStack: [-1],
              shouldEmitCommentsStack: [false],
              shouldEmitSourceMapsStack: [false]
            };
          }
          return state;
        }
        function onLeft(next, _workArea, parent) {
          return maybeEmitExpression(next, parent, "left");
        }
        function onOperator(operatorToken, _state, node) {
          var isCommaOperator = operatorToken.kind !== 27;
          var linesBeforeOperator = getLinesBetweenNodes(node, node.left, operatorToken);
          var linesAfterOperator = getLinesBetweenNodes(node, operatorToken, node.right);
          writeLinesAndIndent(linesBeforeOperator, isCommaOperator);
          emitLeadingCommentsOfPosition(operatorToken.pos);
          writeTokenNode(operatorToken, operatorToken.kind === 101 ? writeKeyword : writeOperator);
          emitTrailingCommentsOfPosition(operatorToken.end, true);
          writeLinesAndIndent(linesAfterOperator, true);
        }
        function onRight(next, _workArea, parent) {
          return maybeEmitExpression(next, parent, "right");
        }
        function onExit(node, state) {
          var linesBeforeOperator = getLinesBetweenNodes(node, node.left, node.operatorToken);
          var linesAfterOperator = getLinesBetweenNodes(node, node.operatorToken, node.right);
          decreaseIndentIf(linesBeforeOperator, linesAfterOperator);
          if (state.stackIndex > 0) {
            var savedPreserveSourceNewlines = state.preserveSourceNewlinesStack[state.stackIndex];
            var savedContainerPos = state.containerPosStack[state.stackIndex];
            var savedContainerEnd = state.containerEndStack[state.stackIndex];
            var savedDeclarationListContainerEnd = state.declarationListContainerEndStack[state.stackIndex];
            var shouldEmitComments_1 = state.shouldEmitCommentsStack[state.stackIndex];
            var shouldEmitSourceMaps_1 = state.shouldEmitSourceMapsStack[state.stackIndex];
            afterEmitNode(savedPreserveSourceNewlines);
            if (shouldEmitSourceMaps_1)
              emitSourceMapsAfterNode(node);
            if (shouldEmitComments_1)
              emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
            onAfterEmitNode === null || onAfterEmitNode === void 0 ? void 0 : onAfterEmitNode(node);
            state.stackIndex--;
          }
        }
        function maybeEmitExpression(next, parent, side) {
          var parenthesizerRule = side === "left" ? parenthesizer.getParenthesizeLeftSideOfBinaryForOperator(parent.operatorToken.kind) : parenthesizer.getParenthesizeRightSideOfBinaryForOperator(parent.operatorToken.kind);
          var pipelinePhase = getPipelinePhase(0, 1, next);
          if (pipelinePhase === pipelineEmitWithSubstitution) {
            ts2.Debug.assertIsDefined(lastSubstitution);
            next = parenthesizerRule(ts2.cast(lastSubstitution, ts2.isExpression));
            pipelinePhase = getNextPipelinePhase(1, 1, next);
            lastSubstitution = void 0;
          }
          if (pipelinePhase === pipelineEmitWithComments || pipelinePhase === pipelineEmitWithSourceMaps || pipelinePhase === pipelineEmitWithHint) {
            if (ts2.isBinaryExpression(next)) {
              return next;
            }
          }
          currentParenthesizerRule = parenthesizerRule;
          pipelinePhase(1, next);
        }
      }
      function emitConditionalExpression(node) {
        var linesBeforeQuestion = getLinesBetweenNodes(node, node.condition, node.questionToken);
        var linesAfterQuestion = getLinesBetweenNodes(node, node.questionToken, node.whenTrue);
        var linesBeforeColon = getLinesBetweenNodes(node, node.whenTrue, node.colonToken);
        var linesAfterColon = getLinesBetweenNodes(node, node.colonToken, node.whenFalse);
        emitExpression(node.condition, parenthesizer.parenthesizeConditionOfConditionalExpression);
        writeLinesAndIndent(linesBeforeQuestion, true);
        emit(node.questionToken);
        writeLinesAndIndent(linesAfterQuestion, true);
        emitExpression(node.whenTrue, parenthesizer.parenthesizeBranchOfConditionalExpression);
        decreaseIndentIf(linesBeforeQuestion, linesAfterQuestion);
        writeLinesAndIndent(linesBeforeColon, true);
        emit(node.colonToken);
        writeLinesAndIndent(linesAfterColon, true);
        emitExpression(node.whenFalse, parenthesizer.parenthesizeBranchOfConditionalExpression);
        decreaseIndentIf(linesBeforeColon, linesAfterColon);
      }
      function emitTemplateExpression(node) {
        emit(node.head);
        emitList(node, node.templateSpans, 262144);
      }
      function emitYieldExpression(node) {
        emitTokenWithComment(125, node.pos, writeKeyword, node);
        emit(node.asteriskToken);
        emitExpressionWithLeadingSpace(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitSpreadElement(node) {
        emitTokenWithComment(25, node.pos, writePunctuation, node);
        emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitClassExpression(node) {
        generateNameIfNeeded(node.name);
        emitClassDeclarationOrExpression(node);
      }
      function emitExpressionWithTypeArguments(node) {
        emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
        emitTypeArguments(node, node.typeArguments);
      }
      function emitAsExpression(node) {
        emitExpression(node.expression, void 0);
        if (node.type) {
          writeSpace();
          writeKeyword("as");
          writeSpace();
          emit(node.type);
        }
      }
      function emitNonNullExpression(node) {
        emitExpression(node.expression, parenthesizer.parenthesizeLeftSideOfAccess);
        writeOperator("!");
      }
      function emitMetaProperty(node) {
        writeToken(node.keywordToken, node.pos, writePunctuation);
        writePunctuation(".");
        emit(node.name);
      }
      function emitTemplateSpan(node) {
        emitExpression(node.expression);
        emit(node.literal);
      }
      function emitBlock(node) {
        emitBlockStatements(node, !node.multiLine && isEmptyBlock(node));
      }
      function emitBlockStatements(node, forceSingleLine) {
        emitTokenWithComment(18, node.pos, writePunctuation, node);
        var format = forceSingleLine || ts2.getEmitFlags(node) & 1 ? 768 : 129;
        emitList(node, node.statements, format);
        emitTokenWithComment(19, node.statements.end, writePunctuation, node, !!(format & 1));
      }
      function emitVariableStatement(node) {
        emitModifiers(node, node.modifiers);
        emit(node.declarationList);
        writeTrailingSemicolon();
      }
      function emitEmptyStatement(isEmbeddedStatement) {
        if (isEmbeddedStatement) {
          writePunctuation(";");
        } else {
          writeTrailingSemicolon();
        }
      }
      function emitExpressionStatement(node) {
        emitExpression(node.expression, parenthesizer.parenthesizeExpressionOfExpressionStatement);
        if (!ts2.isJsonSourceFile(currentSourceFile) || ts2.nodeIsSynthesized(node.expression)) {
          writeTrailingSemicolon();
        }
      }
      function emitIfStatement(node) {
        var openParenPos = emitTokenWithComment(99, node.pos, writeKeyword, node);
        writeSpace();
        emitTokenWithComment(20, openParenPos, writePunctuation, node);
        emitExpression(node.expression);
        emitTokenWithComment(21, node.expression.end, writePunctuation, node);
        emitEmbeddedStatement(node, node.thenStatement);
        if (node.elseStatement) {
          writeLineOrSpace(node, node.thenStatement, node.elseStatement);
          emitTokenWithComment(91, node.thenStatement.end, writeKeyword, node);
          if (node.elseStatement.kind === 238) {
            writeSpace();
            emit(node.elseStatement);
          } else {
            emitEmbeddedStatement(node, node.elseStatement);
          }
        }
      }
      function emitWhileClause(node, startPos) {
        var openParenPos = emitTokenWithComment(115, startPos, writeKeyword, node);
        writeSpace();
        emitTokenWithComment(20, openParenPos, writePunctuation, node);
        emitExpression(node.expression);
        emitTokenWithComment(21, node.expression.end, writePunctuation, node);
      }
      function emitDoStatement(node) {
        emitTokenWithComment(90, node.pos, writeKeyword, node);
        emitEmbeddedStatement(node, node.statement);
        if (ts2.isBlock(node.statement) && !preserveSourceNewlines) {
          writeSpace();
        } else {
          writeLineOrSpace(node, node.statement, node.expression);
        }
        emitWhileClause(node, node.statement.end);
        writeTrailingSemicolon();
      }
      function emitWhileStatement(node) {
        emitWhileClause(node, node.pos);
        emitEmbeddedStatement(node, node.statement);
      }
      function emitForStatement(node) {
        var openParenPos = emitTokenWithComment(97, node.pos, writeKeyword, node);
        writeSpace();
        var pos = emitTokenWithComment(20, openParenPos, writePunctuation, node);
        emitForBinding(node.initializer);
        pos = emitTokenWithComment(26, node.initializer ? node.initializer.end : pos, writePunctuation, node);
        emitExpressionWithLeadingSpace(node.condition);
        pos = emitTokenWithComment(26, node.condition ? node.condition.end : pos, writePunctuation, node);
        emitExpressionWithLeadingSpace(node.incrementor);
        emitTokenWithComment(21, node.incrementor ? node.incrementor.end : pos, writePunctuation, node);
        emitEmbeddedStatement(node, node.statement);
      }
      function emitForInStatement(node) {
        var openParenPos = emitTokenWithComment(97, node.pos, writeKeyword, node);
        writeSpace();
        emitTokenWithComment(20, openParenPos, writePunctuation, node);
        emitForBinding(node.initializer);
        writeSpace();
        emitTokenWithComment(101, node.initializer.end, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression);
        emitTokenWithComment(21, node.expression.end, writePunctuation, node);
        emitEmbeddedStatement(node, node.statement);
      }
      function emitForOfStatement(node) {
        var openParenPos = emitTokenWithComment(97, node.pos, writeKeyword, node);
        writeSpace();
        emitWithTrailingSpace(node.awaitModifier);
        emitTokenWithComment(20, openParenPos, writePunctuation, node);
        emitForBinding(node.initializer);
        writeSpace();
        emitTokenWithComment(159, node.initializer.end, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression);
        emitTokenWithComment(21, node.expression.end, writePunctuation, node);
        emitEmbeddedStatement(node, node.statement);
      }
      function emitForBinding(node) {
        if (node !== void 0) {
          if (node.kind === 254) {
            emit(node);
          } else {
            emitExpression(node);
          }
        }
      }
      function emitContinueStatement(node) {
        emitTokenWithComment(86, node.pos, writeKeyword, node);
        emitWithLeadingSpace(node.label);
        writeTrailingSemicolon();
      }
      function emitBreakStatement(node) {
        emitTokenWithComment(81, node.pos, writeKeyword, node);
        emitWithLeadingSpace(node.label);
        writeTrailingSemicolon();
      }
      function emitTokenWithComment(token, pos, writer2, contextNode, indentLeading) {
        var node = ts2.getParseTreeNode(contextNode);
        var isSimilarNode = node && node.kind === contextNode.kind;
        var startPos = pos;
        if (isSimilarNode && currentSourceFile) {
          pos = ts2.skipTrivia(currentSourceFile.text, pos);
        }
        if (isSimilarNode && contextNode.pos !== startPos) {
          var needsIndent = indentLeading && currentSourceFile && !ts2.positionsAreOnSameLine(startPos, pos, currentSourceFile);
          if (needsIndent) {
            increaseIndent();
          }
          emitLeadingCommentsOfPosition(startPos);
          if (needsIndent) {
            decreaseIndent();
          }
        }
        pos = writeTokenText(token, writer2, pos);
        if (isSimilarNode && contextNode.end !== pos) {
          var isJsxExprContext = contextNode.kind === 287;
          emitTrailingCommentsOfPosition(pos, !isJsxExprContext, isJsxExprContext);
        }
        return pos;
      }
      function emitReturnStatement(node) {
        emitTokenWithComment(105, node.pos, writeKeyword, node);
        emitExpressionWithLeadingSpace(node.expression);
        writeTrailingSemicolon();
      }
      function emitWithStatement(node) {
        var openParenPos = emitTokenWithComment(116, node.pos, writeKeyword, node);
        writeSpace();
        emitTokenWithComment(20, openParenPos, writePunctuation, node);
        emitExpression(node.expression);
        emitTokenWithComment(21, node.expression.end, writePunctuation, node);
        emitEmbeddedStatement(node, node.statement);
      }
      function emitSwitchStatement(node) {
        var openParenPos = emitTokenWithComment(107, node.pos, writeKeyword, node);
        writeSpace();
        emitTokenWithComment(20, openParenPos, writePunctuation, node);
        emitExpression(node.expression);
        emitTokenWithComment(21, node.expression.end, writePunctuation, node);
        writeSpace();
        emit(node.caseBlock);
      }
      function emitLabeledStatement(node) {
        emit(node.label);
        emitTokenWithComment(58, node.label.end, writePunctuation, node);
        writeSpace();
        emit(node.statement);
      }
      function emitThrowStatement(node) {
        emitTokenWithComment(109, node.pos, writeKeyword, node);
        emitExpressionWithLeadingSpace(node.expression);
        writeTrailingSemicolon();
      }
      function emitTryStatement(node) {
        emitTokenWithComment(111, node.pos, writeKeyword, node);
        writeSpace();
        emit(node.tryBlock);
        if (node.catchClause) {
          writeLineOrSpace(node, node.tryBlock, node.catchClause);
          emit(node.catchClause);
        }
        if (node.finallyBlock) {
          writeLineOrSpace(node, node.catchClause || node.tryBlock, node.finallyBlock);
          emitTokenWithComment(96, (node.catchClause || node.tryBlock).end, writeKeyword, node);
          writeSpace();
          emit(node.finallyBlock);
        }
      }
      function emitDebuggerStatement(node) {
        writeToken(87, node.pos, writeKeyword);
        writeTrailingSemicolon();
      }
      function emitVariableDeclaration(node) {
        emit(node.name);
        emit(node.exclamationToken);
        emitTypeAnnotation(node.type);
        emitInitializer(node.initializer, node.type ? node.type.end : node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitVariableDeclarationList(node) {
        writeKeyword(ts2.isLet(node) ? "let" : ts2.isVarConst(node) ? "const" : "var");
        writeSpace();
        emitList(node, node.declarations, 528);
      }
      function emitFunctionDeclaration(node) {
        emitFunctionDeclarationOrExpression(node);
      }
      function emitFunctionDeclarationOrExpression(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        writeKeyword("function");
        emit(node.asteriskToken);
        writeSpace();
        emitIdentifierName(node.name);
        emitSignatureAndBody(node, emitSignatureHead);
      }
      function emitSignatureAndBody(node, emitSignatureHead2) {
        var body = node.body;
        if (body) {
          if (ts2.isBlock(body)) {
            var indentedFlag = ts2.getEmitFlags(node) & 65536;
            if (indentedFlag) {
              increaseIndent();
            }
            pushNameGenerationScope(node);
            ts2.forEach(node.parameters, generateNames);
            generateNames(node.body);
            emitSignatureHead2(node);
            emitBlockFunctionBody(body);
            popNameGenerationScope(node);
            if (indentedFlag) {
              decreaseIndent();
            }
          } else {
            emitSignatureHead2(node);
            writeSpace();
            emitExpression(body, parenthesizer.parenthesizeConciseBodyOfArrowFunction);
          }
        } else {
          emitSignatureHead2(node);
          writeTrailingSemicolon();
        }
      }
      function emitSignatureHead(node) {
        emitTypeParameters(node, node.typeParameters);
        emitParameters(node, node.parameters);
        emitTypeAnnotation(node.type);
      }
      function shouldEmitBlockFunctionBodyOnSingleLine(body) {
        if (ts2.getEmitFlags(body) & 1) {
          return true;
        }
        if (body.multiLine) {
          return false;
        }
        if (!ts2.nodeIsSynthesized(body) && !ts2.rangeIsOnSingleLine(body, currentSourceFile)) {
          return false;
        }
        if (getLeadingLineTerminatorCount(body, body.statements, 2) || getClosingLineTerminatorCount(body, body.statements, 2)) {
          return false;
        }
        var previousStatement;
        for (var _a2 = 0, _b2 = body.statements; _a2 < _b2.length; _a2++) {
          var statement = _b2[_a2];
          if (getSeparatingLineTerminatorCount(previousStatement, statement, 2) > 0) {
            return false;
          }
          previousStatement = statement;
        }
        return true;
      }
      function emitBlockFunctionBody(body) {
        onBeforeEmitNode === null || onBeforeEmitNode === void 0 ? void 0 : onBeforeEmitNode(body);
        writeSpace();
        writePunctuation("{");
        increaseIndent();
        var emitBlockFunctionBody2 = shouldEmitBlockFunctionBodyOnSingleLine(body) ? emitBlockFunctionBodyOnSingleLine : emitBlockFunctionBodyWorker;
        if (emitBodyWithDetachedComments) {
          emitBodyWithDetachedComments(body, body.statements, emitBlockFunctionBody2);
        } else {
          emitBlockFunctionBody2(body);
        }
        decreaseIndent();
        writeToken(19, body.statements.end, writePunctuation, body);
        onAfterEmitNode === null || onAfterEmitNode === void 0 ? void 0 : onAfterEmitNode(body);
      }
      function emitBlockFunctionBodyOnSingleLine(body) {
        emitBlockFunctionBodyWorker(body, true);
      }
      function emitBlockFunctionBodyWorker(body, emitBlockFunctionBodyOnSingleLine2) {
        var statementOffset = emitPrologueDirectives(body.statements);
        var pos = writer.getTextPos();
        emitHelpers(body);
        if (statementOffset === 0 && pos === writer.getTextPos() && emitBlockFunctionBodyOnSingleLine2) {
          decreaseIndent();
          emitList(body, body.statements, 768);
          increaseIndent();
        } else {
          emitList(body, body.statements, 1, void 0, statementOffset);
        }
      }
      function emitClassDeclaration(node) {
        emitClassDeclarationOrExpression(node);
      }
      function emitClassDeclarationOrExpression(node) {
        ts2.forEach(node.members, generateMemberNames);
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        writeKeyword("class");
        if (node.name) {
          writeSpace();
          emitIdentifierName(node.name);
        }
        var indentedFlag = ts2.getEmitFlags(node) & 65536;
        if (indentedFlag) {
          increaseIndent();
        }
        emitTypeParameters(node, node.typeParameters);
        emitList(node, node.heritageClauses, 0);
        writeSpace();
        writePunctuation("{");
        emitList(node, node.members, 129);
        writePunctuation("}");
        if (indentedFlag) {
          decreaseIndent();
        }
      }
      function emitInterfaceDeclaration(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        writeKeyword("interface");
        writeSpace();
        emit(node.name);
        emitTypeParameters(node, node.typeParameters);
        emitList(node, node.heritageClauses, 512);
        writeSpace();
        writePunctuation("{");
        emitList(node, node.members, 129);
        writePunctuation("}");
      }
      function emitTypeAliasDeclaration(node) {
        emitDecorators(node, node.decorators);
        emitModifiers(node, node.modifiers);
        writeKeyword("type");
        writeSpace();
        emit(node.name);
        emitTypeParameters(node, node.typeParameters);
        writeSpace();
        writePunctuation("=");
        writeSpace();
        emit(node.type);
        writeTrailingSemicolon();
      }
      function emitEnumDeclaration(node) {
        emitModifiers(node, node.modifiers);
        writeKeyword("enum");
        writeSpace();
        emit(node.name);
        writeSpace();
        writePunctuation("{");
        emitList(node, node.members, 145);
        writePunctuation("}");
      }
      function emitModuleDeclaration(node) {
        emitModifiers(node, node.modifiers);
        if (~node.flags & 1024) {
          writeKeyword(node.flags & 16 ? "namespace" : "module");
          writeSpace();
        }
        emit(node.name);
        var body = node.body;
        if (!body)
          return writeTrailingSemicolon();
        while (body && ts2.isModuleDeclaration(body)) {
          writePunctuation(".");
          emit(body.name);
          body = body.body;
        }
        writeSpace();
        emit(body);
      }
      function emitModuleBlock(node) {
        pushNameGenerationScope(node);
        ts2.forEach(node.statements, generateNames);
        emitBlockStatements(node, isEmptyBlock(node));
        popNameGenerationScope(node);
      }
      function emitCaseBlock(node) {
        emitTokenWithComment(18, node.pos, writePunctuation, node);
        emitList(node, node.clauses, 129);
        emitTokenWithComment(19, node.clauses.end, writePunctuation, node, true);
      }
      function emitImportEqualsDeclaration(node) {
        emitModifiers(node, node.modifiers);
        emitTokenWithComment(100, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node);
        writeSpace();
        if (node.isTypeOnly) {
          emitTokenWithComment(151, node.pos, writeKeyword, node);
          writeSpace();
        }
        emit(node.name);
        writeSpace();
        emitTokenWithComment(63, node.name.end, writePunctuation, node);
        writeSpace();
        emitModuleReference(node.moduleReference);
        writeTrailingSemicolon();
      }
      function emitModuleReference(node) {
        if (node.kind === 79) {
          emitExpression(node);
        } else {
          emit(node);
        }
      }
      function emitImportDeclaration(node) {
        emitModifiers(node, node.modifiers);
        emitTokenWithComment(100, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node);
        writeSpace();
        if (node.importClause) {
          emit(node.importClause);
          writeSpace();
          emitTokenWithComment(155, node.importClause.end, writeKeyword, node);
          writeSpace();
        }
        emitExpression(node.moduleSpecifier);
        if (node.assertClause) {
          emitWithLeadingSpace(node.assertClause);
        }
        writeTrailingSemicolon();
      }
      function emitImportClause(node) {
        if (node.isTypeOnly) {
          emitTokenWithComment(151, node.pos, writeKeyword, node);
          writeSpace();
        }
        emit(node.name);
        if (node.name && node.namedBindings) {
          emitTokenWithComment(27, node.name.end, writePunctuation, node);
          writeSpace();
        }
        emit(node.namedBindings);
      }
      function emitNamespaceImport(node) {
        var asPos = emitTokenWithComment(41, node.pos, writePunctuation, node);
        writeSpace();
        emitTokenWithComment(127, asPos, writeKeyword, node);
        writeSpace();
        emit(node.name);
      }
      function emitNamedImports(node) {
        emitNamedImportsOrExports(node);
      }
      function emitImportSpecifier(node) {
        emitImportOrExportSpecifier(node);
      }
      function emitExportAssignment(node) {
        var nextPos = emitTokenWithComment(93, node.pos, writeKeyword, node);
        writeSpace();
        if (node.isExportEquals) {
          emitTokenWithComment(63, nextPos, writeOperator, node);
        } else {
          emitTokenWithComment(88, nextPos, writeKeyword, node);
        }
        writeSpace();
        emitExpression(node.expression, node.isExportEquals ? parenthesizer.getParenthesizeRightSideOfBinaryForOperator(63) : parenthesizer.parenthesizeExpressionOfExportDefault);
        writeTrailingSemicolon();
      }
      function emitExportDeclaration(node) {
        var nextPos = emitTokenWithComment(93, node.pos, writeKeyword, node);
        writeSpace();
        if (node.isTypeOnly) {
          nextPos = emitTokenWithComment(151, nextPos, writeKeyword, node);
          writeSpace();
        }
        if (node.exportClause) {
          emit(node.exportClause);
        } else {
          nextPos = emitTokenWithComment(41, nextPos, writePunctuation, node);
        }
        if (node.moduleSpecifier) {
          writeSpace();
          var fromPos = node.exportClause ? node.exportClause.end : nextPos;
          emitTokenWithComment(155, fromPos, writeKeyword, node);
          writeSpace();
          emitExpression(node.moduleSpecifier);
        }
        if (node.assertClause) {
          emitWithLeadingSpace(node.assertClause);
        }
        writeTrailingSemicolon();
      }
      function emitAssertClause(node) {
        emitTokenWithComment(129, node.pos, writeKeyword, node);
        writeSpace();
        var elements = node.elements;
        emitList(node, elements, 526226);
      }
      function emitAssertEntry(node) {
        emit(node.name);
        writePunctuation(":");
        writeSpace();
        var value = node.value;
        if ((ts2.getEmitFlags(value) & 512) === 0) {
          var commentRange = ts2.getCommentRange(value);
          emitTrailingCommentsOfPosition(commentRange.pos);
        }
        emit(value);
      }
      function emitNamespaceExportDeclaration(node) {
        var nextPos = emitTokenWithComment(93, node.pos, writeKeyword, node);
        writeSpace();
        nextPos = emitTokenWithComment(127, nextPos, writeKeyword, node);
        writeSpace();
        nextPos = emitTokenWithComment(142, nextPos, writeKeyword, node);
        writeSpace();
        emit(node.name);
        writeTrailingSemicolon();
      }
      function emitNamespaceExport(node) {
        var asPos = emitTokenWithComment(41, node.pos, writePunctuation, node);
        writeSpace();
        emitTokenWithComment(127, asPos, writeKeyword, node);
        writeSpace();
        emit(node.name);
      }
      function emitNamedExports(node) {
        emitNamedImportsOrExports(node);
      }
      function emitExportSpecifier(node) {
        emitImportOrExportSpecifier(node);
      }
      function emitNamedImportsOrExports(node) {
        writePunctuation("{");
        emitList(node, node.elements, 525136);
        writePunctuation("}");
      }
      function emitImportOrExportSpecifier(node) {
        if (node.isTypeOnly) {
          writeKeyword("type");
          writeSpace();
        }
        if (node.propertyName) {
          emit(node.propertyName);
          writeSpace();
          emitTokenWithComment(127, node.propertyName.end, writeKeyword, node);
          writeSpace();
        }
        emit(node.name);
      }
      function emitExternalModuleReference(node) {
        writeKeyword("require");
        writePunctuation("(");
        emitExpression(node.expression);
        writePunctuation(")");
      }
      function emitJsxElement(node) {
        emit(node.openingElement);
        emitList(node, node.children, 262144);
        emit(node.closingElement);
      }
      function emitJsxSelfClosingElement(node) {
        writePunctuation("<");
        emitJsxTagName(node.tagName);
        emitTypeArguments(node, node.typeArguments);
        writeSpace();
        emit(node.attributes);
        writePunctuation("/>");
      }
      function emitJsxFragment(node) {
        emit(node.openingFragment);
        emitList(node, node.children, 262144);
        emit(node.closingFragment);
      }
      function emitJsxOpeningElementOrFragment(node) {
        writePunctuation("<");
        if (ts2.isJsxOpeningElement(node)) {
          var indented = writeLineSeparatorsAndIndentBefore(node.tagName, node);
          emitJsxTagName(node.tagName);
          emitTypeArguments(node, node.typeArguments);
          if (node.attributes.properties && node.attributes.properties.length > 0) {
            writeSpace();
          }
          emit(node.attributes);
          writeLineSeparatorsAfter(node.attributes, node);
          decreaseIndentIf(indented);
        }
        writePunctuation(">");
      }
      function emitJsxText(node) {
        writer.writeLiteral(node.text);
      }
      function emitJsxClosingElementOrFragment(node) {
        writePunctuation("</");
        if (ts2.isJsxClosingElement(node)) {
          emitJsxTagName(node.tagName);
        }
        writePunctuation(">");
      }
      function emitJsxAttributes(node) {
        emitList(node, node.properties, 262656);
      }
      function emitJsxAttribute(node) {
        emit(node.name);
        emitNodeWithPrefix("=", writePunctuation, node.initializer, emitJsxAttributeValue);
      }
      function emitJsxSpreadAttribute(node) {
        writePunctuation("{...");
        emitExpression(node.expression);
        writePunctuation("}");
      }
      function hasTrailingCommentsAtPosition(pos) {
        var result = false;
        ts2.forEachTrailingCommentRange((currentSourceFile === null || currentSourceFile === void 0 ? void 0 : currentSourceFile.text) || "", pos + 1, function() {
          return result = true;
        });
        return result;
      }
      function hasLeadingCommentsAtPosition(pos) {
        var result = false;
        ts2.forEachLeadingCommentRange((currentSourceFile === null || currentSourceFile === void 0 ? void 0 : currentSourceFile.text) || "", pos + 1, function() {
          return result = true;
        });
        return result;
      }
      function hasCommentsAtPosition(pos) {
        return hasTrailingCommentsAtPosition(pos) || hasLeadingCommentsAtPosition(pos);
      }
      function emitJsxExpression(node) {
        var _a2;
        if (node.expression || !commentsDisabled && !ts2.nodeIsSynthesized(node) && hasCommentsAtPosition(node.pos)) {
          var isMultiline = currentSourceFile && !ts2.nodeIsSynthesized(node) && ts2.getLineAndCharacterOfPosition(currentSourceFile, node.pos).line !== ts2.getLineAndCharacterOfPosition(currentSourceFile, node.end).line;
          if (isMultiline) {
            writer.increaseIndent();
          }
          var end = emitTokenWithComment(18, node.pos, writePunctuation, node);
          emit(node.dotDotDotToken);
          emitExpression(node.expression);
          emitTokenWithComment(19, ((_a2 = node.expression) === null || _a2 === void 0 ? void 0 : _a2.end) || end, writePunctuation, node);
          if (isMultiline) {
            writer.decreaseIndent();
          }
        }
      }
      function emitJsxTagName(node) {
        if (node.kind === 79) {
          emitExpression(node);
        } else {
          emit(node);
        }
      }
      function emitCaseClause(node) {
        emitTokenWithComment(82, node.pos, writeKeyword, node);
        writeSpace();
        emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
        emitCaseOrDefaultClauseRest(node, node.statements, node.expression.end);
      }
      function emitDefaultClause(node) {
        var pos = emitTokenWithComment(88, node.pos, writeKeyword, node);
        emitCaseOrDefaultClauseRest(node, node.statements, pos);
      }
      function emitCaseOrDefaultClauseRest(parentNode, statements, colonPos) {
        var emitAsSingleStatement = statements.length === 1 && (ts2.nodeIsSynthesized(parentNode) || ts2.nodeIsSynthesized(statements[0]) || ts2.rangeStartPositionsAreOnSameLine(parentNode, statements[0], currentSourceFile));
        var format = 163969;
        if (emitAsSingleStatement) {
          writeToken(58, colonPos, writePunctuation, parentNode);
          writeSpace();
          format &= ~(1 | 128);
        } else {
          emitTokenWithComment(58, colonPos, writePunctuation, parentNode);
        }
        emitList(parentNode, statements, format);
      }
      function emitHeritageClause(node) {
        writeSpace();
        writeTokenText(node.token, writeKeyword);
        writeSpace();
        emitList(node, node.types, 528);
      }
      function emitCatchClause(node) {
        var openParenPos = emitTokenWithComment(83, node.pos, writeKeyword, node);
        writeSpace();
        if (node.variableDeclaration) {
          emitTokenWithComment(20, openParenPos, writePunctuation, node);
          emit(node.variableDeclaration);
          emitTokenWithComment(21, node.variableDeclaration.end, writePunctuation, node);
          writeSpace();
        }
        emit(node.block);
      }
      function emitPropertyAssignment(node) {
        emit(node.name);
        writePunctuation(":");
        writeSpace();
        var initializer = node.initializer;
        if ((ts2.getEmitFlags(initializer) & 512) === 0) {
          var commentRange = ts2.getCommentRange(initializer);
          emitTrailingCommentsOfPosition(commentRange.pos);
        }
        emitExpression(initializer, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitShorthandPropertyAssignment(node) {
        emit(node.name);
        if (node.objectAssignmentInitializer) {
          writeSpace();
          writePunctuation("=");
          writeSpace();
          emitExpression(node.objectAssignmentInitializer, parenthesizer.parenthesizeExpressionForDisallowedComma);
        }
      }
      function emitSpreadAssignment(node) {
        if (node.expression) {
          emitTokenWithComment(25, node.pos, writePunctuation, node);
          emitExpression(node.expression, parenthesizer.parenthesizeExpressionForDisallowedComma);
        }
      }
      function emitEnumMember(node) {
        emit(node.name);
        emitInitializer(node.initializer, node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma);
      }
      function emitJSDoc(node) {
        write("/**");
        if (node.comment) {
          var text = ts2.getTextOfJSDocComment(node.comment);
          if (text) {
            var lines = text.split(/\r\n?|\n/g);
            for (var _a2 = 0, lines_2 = lines; _a2 < lines_2.length; _a2++) {
              var line = lines_2[_a2];
              writeLine();
              writeSpace();
              writePunctuation("*");
              writeSpace();
              write(line);
            }
          }
        }
        if (node.tags) {
          if (node.tags.length === 1 && node.tags[0].kind === 341 && !node.comment) {
            writeSpace();
            emit(node.tags[0]);
          } else {
            emitList(node, node.tags, 33);
          }
        }
        writeSpace();
        write("*/");
      }
      function emitJSDocSimpleTypedTag(tag) {
        emitJSDocTagName(tag.tagName);
        emitJSDocTypeExpression(tag.typeExpression);
        emitJSDocComment(tag.comment);
      }
      function emitJSDocSeeTag(tag) {
        emitJSDocTagName(tag.tagName);
        emit(tag.name);
        emitJSDocComment(tag.comment);
      }
      function emitJSDocNameReference(node) {
        writeSpace();
        writePunctuation("{");
        emit(node.name);
        writePunctuation("}");
      }
      function emitJSDocHeritageTag(tag) {
        emitJSDocTagName(tag.tagName);
        writeSpace();
        writePunctuation("{");
        emit(tag.class);
        writePunctuation("}");
        emitJSDocComment(tag.comment);
      }
      function emitJSDocTemplateTag(tag) {
        emitJSDocTagName(tag.tagName);
        emitJSDocTypeExpression(tag.constraint);
        writeSpace();
        emitList(tag, tag.typeParameters, 528);
        emitJSDocComment(tag.comment);
      }
      function emitJSDocTypedefTag(tag) {
        emitJSDocTagName(tag.tagName);
        if (tag.typeExpression) {
          if (tag.typeExpression.kind === 307) {
            emitJSDocTypeExpression(tag.typeExpression);
          } else {
            writeSpace();
            writePunctuation("{");
            write("Object");
            if (tag.typeExpression.isArrayType) {
              writePunctuation("[");
              writePunctuation("]");
            }
            writePunctuation("}");
          }
        }
        if (tag.fullName) {
          writeSpace();
          emit(tag.fullName);
        }
        emitJSDocComment(tag.comment);
        if (tag.typeExpression && tag.typeExpression.kind === 320) {
          emitJSDocTypeLiteral(tag.typeExpression);
        }
      }
      function emitJSDocCallbackTag(tag) {
        emitJSDocTagName(tag.tagName);
        if (tag.name) {
          writeSpace();
          emit(tag.name);
        }
        emitJSDocComment(tag.comment);
        emitJSDocSignature(tag.typeExpression);
      }
      function emitJSDocSimpleTag(tag) {
        emitJSDocTagName(tag.tagName);
        emitJSDocComment(tag.comment);
      }
      function emitJSDocTypeLiteral(lit) {
        emitList(lit, ts2.factory.createNodeArray(lit.jsDocPropertyTags), 33);
      }
      function emitJSDocSignature(sig) {
        if (sig.typeParameters) {
          emitList(sig, ts2.factory.createNodeArray(sig.typeParameters), 33);
        }
        if (sig.parameters) {
          emitList(sig, ts2.factory.createNodeArray(sig.parameters), 33);
        }
        if (sig.type) {
          writeLine();
          writeSpace();
          writePunctuation("*");
          writeSpace();
          emit(sig.type);
        }
      }
      function emitJSDocPropertyLikeTag(param) {
        emitJSDocTagName(param.tagName);
        emitJSDocTypeExpression(param.typeExpression);
        writeSpace();
        if (param.isBracketed) {
          writePunctuation("[");
        }
        emit(param.name);
        if (param.isBracketed) {
          writePunctuation("]");
        }
        emitJSDocComment(param.comment);
      }
      function emitJSDocTagName(tagName) {
        writePunctuation("@");
        emit(tagName);
      }
      function emitJSDocComment(comment) {
        var text = ts2.getTextOfJSDocComment(comment);
        if (text) {
          writeSpace();
          write(text);
        }
      }
      function emitJSDocTypeExpression(typeExpression) {
        if (typeExpression) {
          writeSpace();
          writePunctuation("{");
          emit(typeExpression.type);
          writePunctuation("}");
        }
      }
      function emitSourceFile(node) {
        writeLine();
        var statements = node.statements;
        if (emitBodyWithDetachedComments) {
          var shouldEmitDetachedComment = statements.length === 0 || !ts2.isPrologueDirective(statements[0]) || ts2.nodeIsSynthesized(statements[0]);
          if (shouldEmitDetachedComment) {
            emitBodyWithDetachedComments(node, statements, emitSourceFileWorker);
            return;
          }
        }
        emitSourceFileWorker(node);
      }
      function emitSyntheticTripleSlashReferencesIfNeeded(node) {
        emitTripleSlashDirectives(!!node.hasNoDefaultLib, node.syntheticFileReferences || [], node.syntheticTypeReferences || [], node.syntheticLibReferences || []);
        for (var _a2 = 0, _b2 = node.prepends; _a2 < _b2.length; _a2++) {
          var prepend = _b2[_a2];
          if (ts2.isUnparsedSource(prepend) && prepend.syntheticReferences) {
            for (var _c2 = 0, _d = prepend.syntheticReferences; _c2 < _d.length; _c2++) {
              var ref = _d[_c2];
              emit(ref);
              writeLine();
            }
          }
        }
      }
      function emitTripleSlashDirectivesIfNeeded(node) {
        if (node.isDeclarationFile)
          emitTripleSlashDirectives(node.hasNoDefaultLib, node.referencedFiles, node.typeReferenceDirectives, node.libReferenceDirectives);
      }
      function emitTripleSlashDirectives(hasNoDefaultLib, files, types, libs) {
        if (hasNoDefaultLib) {
          var pos = writer.getTextPos();
          writeComment('/// <reference no-default-lib="true"/>');
          if (bundleFileInfo)
            bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "no-default-lib" });
          writeLine();
        }
        if (currentSourceFile && currentSourceFile.moduleName) {
          writeComment('/// <amd-module name="'.concat(currentSourceFile.moduleName, '" />'));
          writeLine();
        }
        if (currentSourceFile && currentSourceFile.amdDependencies) {
          for (var _a2 = 0, _b2 = currentSourceFile.amdDependencies; _a2 < _b2.length; _a2++) {
            var dep = _b2[_a2];
            if (dep.name) {
              writeComment('/// <amd-dependency name="'.concat(dep.name, '" path="').concat(dep.path, '" />'));
            } else {
              writeComment('/// <amd-dependency path="'.concat(dep.path, '" />'));
            }
            writeLine();
          }
        }
        for (var _c2 = 0, files_2 = files; _c2 < files_2.length; _c2++) {
          var directive = files_2[_c2];
          var pos = writer.getTextPos();
          writeComment('/// <reference path="'.concat(directive.fileName, '" />'));
          if (bundleFileInfo)
            bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "reference", data: directive.fileName });
          writeLine();
        }
        for (var _d = 0, types_24 = types; _d < types_24.length; _d++) {
          var directive = types_24[_d];
          var pos = writer.getTextPos();
          writeComment('/// <reference types="'.concat(directive.fileName, '" />'));
          if (bundleFileInfo)
            bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "type", data: directive.fileName });
          writeLine();
        }
        for (var _e = 0, libs_1 = libs; _e < libs_1.length; _e++) {
          var directive = libs_1[_e];
          var pos = writer.getTextPos();
          writeComment('/// <reference lib="'.concat(directive.fileName, '" />'));
          if (bundleFileInfo)
            bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "lib", data: directive.fileName });
          writeLine();
        }
      }
      function emitSourceFileWorker(node) {
        var statements = node.statements;
        pushNameGenerationScope(node);
        ts2.forEach(node.statements, generateNames);
        emitHelpers(node);
        var index = ts2.findIndex(statements, function(statement) {
          return !ts2.isPrologueDirective(statement);
        });
        emitTripleSlashDirectivesIfNeeded(node);
        emitList(node, statements, 1, void 0, index === -1 ? statements.length : index);
        popNameGenerationScope(node);
      }
      function emitPartiallyEmittedExpression(node) {
        emitExpression(node.expression);
      }
      function emitCommaList(node) {
        emitExpressionList(node, node.elements, 528, void 0);
      }
      function emitPrologueDirectives(statements, sourceFile, seenPrologueDirectives, recordBundleFileSection) {
        var needsToSetSourceFile = !!sourceFile;
        for (var i = 0; i < statements.length; i++) {
          var statement = statements[i];
          if (ts2.isPrologueDirective(statement)) {
            var shouldEmitPrologueDirective = seenPrologueDirectives ? !seenPrologueDirectives.has(statement.expression.text) : true;
            if (shouldEmitPrologueDirective) {
              if (needsToSetSourceFile) {
                needsToSetSourceFile = false;
                setSourceFile(sourceFile);
              }
              writeLine();
              var pos = writer.getTextPos();
              emit(statement);
              if (recordBundleFileSection && bundleFileInfo)
                bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "prologue", data: statement.expression.text });
              if (seenPrologueDirectives) {
                seenPrologueDirectives.add(statement.expression.text);
              }
            }
          } else {
            return i;
          }
        }
        return statements.length;
      }
      function emitUnparsedPrologues(prologues, seenPrologueDirectives) {
        for (var _a2 = 0, prologues_1 = prologues; _a2 < prologues_1.length; _a2++) {
          var prologue = prologues_1[_a2];
          if (!seenPrologueDirectives.has(prologue.data)) {
            writeLine();
            var pos = writer.getTextPos();
            emit(prologue);
            if (bundleFileInfo)
              bundleFileInfo.sections.push({ pos, end: writer.getTextPos(), kind: "prologue", data: prologue.data });
            if (seenPrologueDirectives) {
              seenPrologueDirectives.add(prologue.data);
            }
          }
        }
      }
      function emitPrologueDirectivesIfNeeded(sourceFileOrBundle) {
        if (ts2.isSourceFile(sourceFileOrBundle)) {
          emitPrologueDirectives(sourceFileOrBundle.statements, sourceFileOrBundle);
        } else {
          var seenPrologueDirectives = new ts2.Set();
          for (var _a2 = 0, _b2 = sourceFileOrBundle.prepends; _a2 < _b2.length; _a2++) {
            var prepend = _b2[_a2];
            emitUnparsedPrologues(prepend.prologues, seenPrologueDirectives);
          }
          for (var _c2 = 0, _d = sourceFileOrBundle.sourceFiles; _c2 < _d.length; _c2++) {
            var sourceFile = _d[_c2];
            emitPrologueDirectives(sourceFile.statements, sourceFile, seenPrologueDirectives, true);
          }
          setSourceFile(void 0);
        }
      }
      function getPrologueDirectivesFromBundledSourceFiles(bundle) {
        var seenPrologueDirectives = new ts2.Set();
        var prologues;
        for (var index = 0; index < bundle.sourceFiles.length; index++) {
          var sourceFile = bundle.sourceFiles[index];
          var directives = void 0;
          var end = 0;
          for (var _a2 = 0, _b2 = sourceFile.statements; _a2 < _b2.length; _a2++) {
            var statement = _b2[_a2];
            if (!ts2.isPrologueDirective(statement))
              break;
            if (seenPrologueDirectives.has(statement.expression.text))
              continue;
            seenPrologueDirectives.add(statement.expression.text);
            (directives || (directives = [])).push({
              pos: statement.pos,
              end: statement.end,
              expression: {
                pos: statement.expression.pos,
                end: statement.expression.end,
                text: statement.expression.text
              }
            });
            end = end < statement.end ? statement.end : end;
          }
          if (directives)
            (prologues || (prologues = [])).push({ file: index, text: sourceFile.text.substring(0, end), directives });
        }
        return prologues;
      }
      function emitShebangIfNeeded(sourceFileOrBundle) {
        if (ts2.isSourceFile(sourceFileOrBundle) || ts2.isUnparsedSource(sourceFileOrBundle)) {
          var shebang = ts2.getShebang(sourceFileOrBundle.text);
          if (shebang) {
            writeComment(shebang);
            writeLine();
            return true;
          }
        } else {
          for (var _a2 = 0, _b2 = sourceFileOrBundle.prepends; _a2 < _b2.length; _a2++) {
            var prepend = _b2[_a2];
            ts2.Debug.assertNode(prepend, ts2.isUnparsedSource);
            if (emitShebangIfNeeded(prepend)) {
              return true;
            }
          }
          for (var _c2 = 0, _d = sourceFileOrBundle.sourceFiles; _c2 < _d.length; _c2++) {
            var sourceFile = _d[_c2];
            if (emitShebangIfNeeded(sourceFile)) {
              return true;
            }
          }
        }
      }
      function emitNodeWithWriter(node, writer2) {
        if (!node)
          return;
        var savedWrite = write;
        write = writer2;
        emit(node);
        write = savedWrite;
      }
      function emitModifiers(node, modifiers) {
        if (modifiers && modifiers.length) {
          emitList(node, modifiers, 262656);
          writeSpace();
        }
      }
      function emitTypeAnnotation(node) {
        if (node) {
          writePunctuation(":");
          writeSpace();
          emit(node);
        }
      }
      function emitInitializer(node, equalCommentStartPos, container, parenthesizerRule) {
        if (node) {
          writeSpace();
          emitTokenWithComment(63, equalCommentStartPos, writeOperator, container);
          writeSpace();
          emitExpression(node, parenthesizerRule);
        }
      }
      function emitNodeWithPrefix(prefix, prefixWriter, node, emit2) {
        if (node) {
          prefixWriter(prefix);
          emit2(node);
        }
      }
      function emitWithLeadingSpace(node) {
        if (node) {
          writeSpace();
          emit(node);
        }
      }
      function emitExpressionWithLeadingSpace(node, parenthesizerRule) {
        if (node) {
          writeSpace();
          emitExpression(node, parenthesizerRule);
        }
      }
      function emitWithTrailingSpace(node) {
        if (node) {
          emit(node);
          writeSpace();
        }
      }
      function emitEmbeddedStatement(parent, node) {
        if (ts2.isBlock(node) || ts2.getEmitFlags(parent) & 1) {
          writeSpace();
          emit(node);
        } else {
          writeLine();
          increaseIndent();
          if (ts2.isEmptyStatement(node)) {
            pipelineEmit(5, node);
          } else {
            emit(node);
          }
          decreaseIndent();
        }
      }
      function emitDecorators(parentNode, decorators) {
        emitList(parentNode, decorators, 2146305);
      }
      function emitTypeArguments(parentNode, typeArguments) {
        emitList(parentNode, typeArguments, 53776, parenthesizer.parenthesizeMemberOfElementType);
      }
      function emitTypeParameters(parentNode, typeParameters) {
        if (ts2.isFunctionLike(parentNode) && parentNode.typeArguments) {
          return emitTypeArguments(parentNode, parentNode.typeArguments);
        }
        emitList(parentNode, typeParameters, 53776);
      }
      function emitParameters(parentNode, parameters) {
        emitList(parentNode, parameters, 2576);
      }
      function canEmitSimpleArrowHead(parentNode, parameters) {
        var parameter = ts2.singleOrUndefined(parameters);
        return parameter && parameter.pos === parentNode.pos && ts2.isArrowFunction(parentNode) && !parentNode.type && !ts2.some(parentNode.decorators) && !ts2.some(parentNode.modifiers) && !ts2.some(parentNode.typeParameters) && !ts2.some(parameter.decorators) && !ts2.some(parameter.modifiers) && !parameter.dotDotDotToken && !parameter.questionToken && !parameter.type && !parameter.initializer && ts2.isIdentifier(parameter.name);
      }
      function emitParametersForArrow(parentNode, parameters) {
        if (canEmitSimpleArrowHead(parentNode, parameters)) {
          emitList(parentNode, parameters, 2576 & ~2048);
        } else {
          emitParameters(parentNode, parameters);
        }
      }
      function emitParametersForIndexSignature(parentNode, parameters) {
        emitList(parentNode, parameters, 8848);
      }
      function writeDelimiter(format) {
        switch (format & 60) {
          case 0:
            break;
          case 16:
            writePunctuation(",");
            break;
          case 4:
            writeSpace();
            writePunctuation("|");
            break;
          case 32:
            writeSpace();
            writePunctuation("*");
            writeSpace();
            break;
          case 8:
            writeSpace();
            writePunctuation("&");
            break;
        }
      }
      function emitList(parentNode, children, format, parenthesizerRule, start, count) {
        emitNodeList(emit, parentNode, children, format, parenthesizerRule, start, count);
      }
      function emitExpressionList(parentNode, children, format, parenthesizerRule, start, count) {
        emitNodeList(emitExpression, parentNode, children, format, parenthesizerRule, start, count);
      }
      function emitNodeList(emit2, parentNode, children, format, parenthesizerRule, start, count) {
        if (start === void 0) {
          start = 0;
        }
        if (count === void 0) {
          count = children ? children.length - start : 0;
        }
        var isUndefined = children === void 0;
        if (isUndefined && format & 16384) {
          return;
        }
        var isEmpty = children === void 0 || start >= children.length || count === 0;
        if (isEmpty && format & 32768) {
          if (onBeforeEmitNodeArray) {
            onBeforeEmitNodeArray(children);
          }
          if (onAfterEmitNodeArray) {
            onAfterEmitNodeArray(children);
          }
          return;
        }
        if (format & 15360) {
          writePunctuation(getOpeningBracket(format));
          if (isEmpty && children) {
            emitTrailingCommentsOfPosition(children.pos, true);
          }
        }
        if (onBeforeEmitNodeArray) {
          onBeforeEmitNodeArray(children);
        }
        if (isEmpty) {
          if (format & 1 && !(preserveSourceNewlines && (!parentNode || ts2.rangeIsOnSingleLine(parentNode, currentSourceFile)))) {
            writeLine();
          } else if (format & 256 && !(format & 524288)) {
            writeSpace();
          }
        } else {
          ts2.Debug.type(children);
          var mayEmitInterveningComments = (format & 262144) === 0;
          var shouldEmitInterveningComments = mayEmitInterveningComments;
          var leadingLineTerminatorCount = getLeadingLineTerminatorCount(parentNode, children, format);
          if (leadingLineTerminatorCount) {
            writeLine(leadingLineTerminatorCount);
            shouldEmitInterveningComments = false;
          } else if (format & 256) {
            writeSpace();
          }
          if (format & 128) {
            increaseIndent();
          }
          var previousSibling = void 0;
          var previousSourceFileTextKind = void 0;
          var shouldDecreaseIndentAfterEmit = false;
          for (var i = 0; i < count; i++) {
            var child = children[start + i];
            if (format & 32) {
              writeLine();
              writeDelimiter(format);
            } else if (previousSibling) {
              if (format & 60 && previousSibling.end !== (parentNode ? parentNode.end : -1)) {
                emitLeadingCommentsOfPosition(previousSibling.end);
              }
              writeDelimiter(format);
              recordBundleFileInternalSectionEnd(previousSourceFileTextKind);
              var separatingLineTerminatorCount = getSeparatingLineTerminatorCount(previousSibling, child, format);
              if (separatingLineTerminatorCount > 0) {
                if ((format & (3 | 128)) === 0) {
                  increaseIndent();
                  shouldDecreaseIndentAfterEmit = true;
                }
                writeLine(separatingLineTerminatorCount);
                shouldEmitInterveningComments = false;
              } else if (previousSibling && format & 512) {
                writeSpace();
              }
            }
            previousSourceFileTextKind = recordBundleFileInternalSectionStart(child);
            if (shouldEmitInterveningComments) {
              if (emitTrailingCommentsOfPosition) {
                var commentRange = ts2.getCommentRange(child);
                emitTrailingCommentsOfPosition(commentRange.pos);
              }
            } else {
              shouldEmitInterveningComments = mayEmitInterveningComments;
            }
            nextListElementPos = child.pos;
            if (emit2.length === 1) {
              emit2(child);
            } else {
              emit2(child, parenthesizerRule);
            }
            if (shouldDecreaseIndentAfterEmit) {
              decreaseIndent();
              shouldDecreaseIndentAfterEmit = false;
            }
            previousSibling = child;
          }
          var emitFlags = previousSibling ? ts2.getEmitFlags(previousSibling) : 0;
          var skipTrailingComments = commentsDisabled || !!(emitFlags & 1024);
          var hasTrailingComma = (children === null || children === void 0 ? void 0 : children.hasTrailingComma) && format & 64 && format & 16;
          if (hasTrailingComma) {
            if (previousSibling && !skipTrailingComments) {
              emitTokenWithComment(27, previousSibling.end, writePunctuation, previousSibling);
            } else {
              writePunctuation(",");
            }
          }
          if (previousSibling && (parentNode ? parentNode.end : -1) !== previousSibling.end && format & 60 && !skipTrailingComments) {
            emitLeadingCommentsOfPosition(hasTrailingComma && (children === null || children === void 0 ? void 0 : children.end) ? children.end : previousSibling.end);
          }
          if (format & 128) {
            decreaseIndent();
          }
          recordBundleFileInternalSectionEnd(previousSourceFileTextKind);
          var closingLineTerminatorCount = getClosingLineTerminatorCount(parentNode, children, format);
          if (closingLineTerminatorCount) {
            writeLine(closingLineTerminatorCount);
          } else if (format & (2097152 | 256)) {
            writeSpace();
          }
        }
        if (onAfterEmitNodeArray) {
          onAfterEmitNodeArray(children);
        }
        if (format & 15360) {
          if (isEmpty && children) {
            emitLeadingCommentsOfPosition(children.end);
          }
          writePunctuation(getClosingBracket(format));
        }
      }
      function writeLiteral(s) {
        writer.writeLiteral(s);
      }
      function writeStringLiteral(s) {
        writer.writeStringLiteral(s);
      }
      function writeBase(s) {
        writer.write(s);
      }
      function writeSymbol(s, sym) {
        writer.writeSymbol(s, sym);
      }
      function writePunctuation(s) {
        writer.writePunctuation(s);
      }
      function writeTrailingSemicolon() {
        writer.writeTrailingSemicolon(";");
      }
      function writeKeyword(s) {
        writer.writeKeyword(s);
      }
      function writeOperator(s) {
        writer.writeOperator(s);
      }
      function writeParameter(s) {
        writer.writeParameter(s);
      }
      function writeComment(s) {
        writer.writeComment(s);
      }
      function writeSpace() {
        writer.writeSpace(" ");
      }
      function writeProperty(s) {
        writer.writeProperty(s);
      }
      function nonEscapingWrite(s) {
        if (writer.nonEscapingWrite) {
          writer.nonEscapingWrite(s);
        } else {
          writer.write(s);
        }
      }
      function writeLine(count) {
        if (count === void 0) {
          count = 1;
        }
        for (var i = 0; i < count; i++) {
          writer.writeLine(i > 0);
        }
      }
      function increaseIndent() {
        writer.increaseIndent();
      }
      function decreaseIndent() {
        writer.decreaseIndent();
      }
      function writeToken(token, pos, writer2, contextNode) {
        return !sourceMapsDisabled ? emitTokenWithSourceMap(contextNode, token, writer2, pos, writeTokenText) : writeTokenText(token, writer2, pos);
      }
      function writeTokenNode(node, writer2) {
        if (onBeforeEmitToken) {
          onBeforeEmitToken(node);
        }
        writer2(ts2.tokenToString(node.kind));
        if (onAfterEmitToken) {
          onAfterEmitToken(node);
        }
      }
      function writeTokenText(token, writer2, pos) {
        var tokenString = ts2.tokenToString(token);
        writer2(tokenString);
        return pos < 0 ? pos : pos + tokenString.length;
      }
      function writeLineOrSpace(parentNode, prevChildNode, nextChildNode) {
        if (ts2.getEmitFlags(parentNode) & 1) {
          writeSpace();
        } else if (preserveSourceNewlines) {
          var lines = getLinesBetweenNodes(parentNode, prevChildNode, nextChildNode);
          if (lines) {
            writeLine(lines);
          } else {
            writeSpace();
          }
        } else {
          writeLine();
        }
      }
      function writeLines(text) {
        var lines = text.split(/\r\n?|\n/g);
        var indentation = ts2.guessIndentation(lines);
        for (var _a2 = 0, lines_3 = lines; _a2 < lines_3.length; _a2++) {
          var lineText = lines_3[_a2];
          var line = indentation ? lineText.slice(indentation) : lineText;
          if (line.length) {
            writeLine();
            write(line);
          }
        }
      }
      function writeLinesAndIndent(lineCount, writeSpaceIfNotIndenting) {
        if (lineCount) {
          increaseIndent();
          writeLine(lineCount);
        } else if (writeSpaceIfNotIndenting) {
          writeSpace();
        }
      }
      function decreaseIndentIf(value1, value2) {
        if (value1) {
          decreaseIndent();
        }
        if (value2) {
          decreaseIndent();
        }
      }
      function getLeadingLineTerminatorCount(parentNode, children, format) {
        if (format & 2 || preserveSourceNewlines) {
          if (format & 65536) {
            return 1;
          }
          var firstChild_1 = children[0];
          if (firstChild_1 === void 0) {
            return !parentNode || ts2.rangeIsOnSingleLine(parentNode, currentSourceFile) ? 0 : 1;
          }
          if (firstChild_1.pos === nextListElementPos) {
            return 0;
          }
          if (firstChild_1.kind === 11) {
            return 0;
          }
          if (parentNode && !ts2.positionIsSynthesized(parentNode.pos) && !ts2.nodeIsSynthesized(firstChild_1) && (!firstChild_1.parent || ts2.getOriginalNode(firstChild_1.parent) === ts2.getOriginalNode(parentNode))) {
            if (preserveSourceNewlines) {
              return getEffectiveLines(function(includeComments) {
                return ts2.getLinesBetweenPositionAndPrecedingNonWhitespaceCharacter(firstChild_1.pos, parentNode.pos, currentSourceFile, includeComments);
              });
            }
            return ts2.rangeStartPositionsAreOnSameLine(parentNode, firstChild_1, currentSourceFile) ? 0 : 1;
          }
          if (synthesizedNodeStartsOnNewLine(firstChild_1, format)) {
            return 1;
          }
        }
        return format & 1 ? 1 : 0;
      }
      function getSeparatingLineTerminatorCount(previousNode, nextNode, format) {
        if (format & 2 || preserveSourceNewlines) {
          if (previousNode === void 0 || nextNode === void 0) {
            return 0;
          }
          if (nextNode.kind === 11) {
            return 0;
          } else if (!ts2.nodeIsSynthesized(previousNode) && !ts2.nodeIsSynthesized(nextNode)) {
            if (preserveSourceNewlines && siblingNodePositionsAreComparable(previousNode, nextNode)) {
              return getEffectiveLines(function(includeComments) {
                return ts2.getLinesBetweenRangeEndAndRangeStart(previousNode, nextNode, currentSourceFile, includeComments);
              });
            } else if (!preserveSourceNewlines && originalNodesHaveSameParent(previousNode, nextNode)) {
              return ts2.rangeEndIsOnSameLineAsRangeStart(previousNode, nextNode, currentSourceFile) ? 0 : 1;
            }
            return format & 65536 ? 1 : 0;
          } else if (synthesizedNodeStartsOnNewLine(previousNode, format) || synthesizedNodeStartsOnNewLine(nextNode, format)) {
            return 1;
          }
        } else if (ts2.getStartsOnNewLine(nextNode)) {
          return 1;
        }
        return format & 1 ? 1 : 0;
      }
      function getClosingLineTerminatorCount(parentNode, children, format) {
        if (format & 2 || preserveSourceNewlines) {
          if (format & 65536) {
            return 1;
          }
          var lastChild = ts2.lastOrUndefined(children);
          if (lastChild === void 0) {
            return !parentNode || ts2.rangeIsOnSingleLine(parentNode, currentSourceFile) ? 0 : 1;
          }
          if (parentNode && !ts2.positionIsSynthesized(parentNode.pos) && !ts2.nodeIsSynthesized(lastChild) && (!lastChild.parent || lastChild.parent === parentNode)) {
            if (preserveSourceNewlines) {
              var end_1 = ts2.isNodeArray(children) && !ts2.positionIsSynthesized(children.end) ? children.end : lastChild.end;
              return getEffectiveLines(function(includeComments) {
                return ts2.getLinesBetweenPositionAndNextNonWhitespaceCharacter(end_1, parentNode.end, currentSourceFile, includeComments);
              });
            }
            return ts2.rangeEndPositionsAreOnSameLine(parentNode, lastChild, currentSourceFile) ? 0 : 1;
          }
          if (synthesizedNodeStartsOnNewLine(lastChild, format)) {
            return 1;
          }
        }
        if (format & 1 && !(format & 131072)) {
          return 1;
        }
        return 0;
      }
      function getEffectiveLines(getLineDifference) {
        ts2.Debug.assert(!!preserveSourceNewlines);
        var lines = getLineDifference(true);
        if (lines === 0) {
          return getLineDifference(false);
        }
        return lines;
      }
      function writeLineSeparatorsAndIndentBefore(node, parent) {
        var leadingNewlines = preserveSourceNewlines && getLeadingLineTerminatorCount(parent, [node], 0);
        if (leadingNewlines) {
          writeLinesAndIndent(leadingNewlines, false);
        }
        return !!leadingNewlines;
      }
      function writeLineSeparatorsAfter(node, parent) {
        var trailingNewlines = preserveSourceNewlines && getClosingLineTerminatorCount(parent, [node], 0);
        if (trailingNewlines) {
          writeLine(trailingNewlines);
        }
      }
      function synthesizedNodeStartsOnNewLine(node, format) {
        if (ts2.nodeIsSynthesized(node)) {
          var startsOnNewLine = ts2.getStartsOnNewLine(node);
          if (startsOnNewLine === void 0) {
            return (format & 65536) !== 0;
          }
          return startsOnNewLine;
        }
        return (format & 65536) !== 0;
      }
      function getLinesBetweenNodes(parent, node1, node2) {
        if (ts2.getEmitFlags(parent) & 131072) {
          return 0;
        }
        parent = skipSynthesizedParentheses(parent);
        node1 = skipSynthesizedParentheses(node1);
        node2 = skipSynthesizedParentheses(node2);
        if (ts2.getStartsOnNewLine(node2)) {
          return 1;
        }
        if (!ts2.nodeIsSynthesized(parent) && !ts2.nodeIsSynthesized(node1) && !ts2.nodeIsSynthesized(node2)) {
          if (preserveSourceNewlines) {
            return getEffectiveLines(function(includeComments) {
              return ts2.getLinesBetweenRangeEndAndRangeStart(node1, node2, currentSourceFile, includeComments);
            });
          }
          return ts2.rangeEndIsOnSameLineAsRangeStart(node1, node2, currentSourceFile) ? 0 : 1;
        }
        return 0;
      }
      function isEmptyBlock(block) {
        return block.statements.length === 0 && ts2.rangeEndIsOnSameLineAsRangeStart(block, block, currentSourceFile);
      }
      function skipSynthesizedParentheses(node) {
        while (node.kind === 211 && ts2.nodeIsSynthesized(node)) {
          node = node.expression;
        }
        return node;
      }
      function getTextOfNode(node, includeTrivia) {
        if (ts2.isGeneratedIdentifier(node)) {
          return generateName(node);
        } else if ((ts2.isIdentifier(node) || ts2.isPrivateIdentifier(node)) && (ts2.nodeIsSynthesized(node) || !node.parent || !currentSourceFile || node.parent && currentSourceFile && ts2.getSourceFileOfNode(node) !== ts2.getOriginalNode(currentSourceFile))) {
          return ts2.idText(node);
        } else if (node.kind === 10 && node.textSourceNode) {
          return getTextOfNode(node.textSourceNode, includeTrivia);
        } else if (ts2.isLiteralExpression(node) && (ts2.nodeIsSynthesized(node) || !node.parent)) {
          return node.text;
        }
        return ts2.getSourceTextOfNodeFromSourceFile(currentSourceFile, node, includeTrivia);
      }
      function getLiteralTextOfNode(node, neverAsciiEscape, jsxAttributeEscape) {
        if (node.kind === 10 && node.textSourceNode) {
          var textSourceNode = node.textSourceNode;
          if (ts2.isIdentifier(textSourceNode) || ts2.isNumericLiteral(textSourceNode)) {
            var text = ts2.isNumericLiteral(textSourceNode) ? textSourceNode.text : getTextOfNode(textSourceNode);
            return jsxAttributeEscape ? '"'.concat(ts2.escapeJsxAttributeString(text), '"') : neverAsciiEscape || ts2.getEmitFlags(node) & 16777216 ? '"'.concat(ts2.escapeString(text), '"') : '"'.concat(ts2.escapeNonAsciiString(text), '"');
          } else {
            return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape);
          }
        }
        var flags = (neverAsciiEscape ? 1 : 0) | (jsxAttributeEscape ? 2 : 0) | (printerOptions.terminateUnterminatedLiterals ? 4 : 0) | (printerOptions.target && printerOptions.target === 99 ? 8 : 0);
        return ts2.getLiteralText(node, currentSourceFile, flags);
      }
      function pushNameGenerationScope(node) {
        if (node && ts2.getEmitFlags(node) & 524288) {
          return;
        }
        tempFlagsStack.push(tempFlags);
        tempFlags = 0;
        reservedNamesStack.push(reservedNames);
      }
      function popNameGenerationScope(node) {
        if (node && ts2.getEmitFlags(node) & 524288) {
          return;
        }
        tempFlags = tempFlagsStack.pop();
        reservedNames = reservedNamesStack.pop();
      }
      function reserveNameInNestedScopes(name) {
        if (!reservedNames || reservedNames === ts2.lastOrUndefined(reservedNamesStack)) {
          reservedNames = new ts2.Set();
        }
        reservedNames.add(name);
      }
      function generateNames(node) {
        if (!node)
          return;
        switch (node.kind) {
          case 234:
            ts2.forEach(node.statements, generateNames);
            break;
          case 249:
          case 247:
          case 239:
          case 240:
            generateNames(node.statement);
            break;
          case 238:
            generateNames(node.thenStatement);
            generateNames(node.elseStatement);
            break;
          case 241:
          case 243:
          case 242:
            generateNames(node.initializer);
            generateNames(node.statement);
            break;
          case 248:
            generateNames(node.caseBlock);
            break;
          case 262:
            ts2.forEach(node.clauses, generateNames);
            break;
          case 288:
          case 289:
            ts2.forEach(node.statements, generateNames);
            break;
          case 251:
            generateNames(node.tryBlock);
            generateNames(node.catchClause);
            generateNames(node.finallyBlock);
            break;
          case 291:
            generateNames(node.variableDeclaration);
            generateNames(node.block);
            break;
          case 236:
            generateNames(node.declarationList);
            break;
          case 254:
            ts2.forEach(node.declarations, generateNames);
            break;
          case 253:
          case 163:
          case 202:
          case 256:
            generateNameIfNeeded(node.name);
            break;
          case 255:
            generateNameIfNeeded(node.name);
            if (ts2.getEmitFlags(node) & 524288) {
              ts2.forEach(node.parameters, generateNames);
              generateNames(node.body);
            }
            break;
          case 200:
          case 201:
            ts2.forEach(node.elements, generateNames);
            break;
          case 265:
            generateNames(node.importClause);
            break;
          case 266:
            generateNameIfNeeded(node.name);
            generateNames(node.namedBindings);
            break;
          case 267:
            generateNameIfNeeded(node.name);
            break;
          case 273:
            generateNameIfNeeded(node.name);
            break;
          case 268:
            ts2.forEach(node.elements, generateNames);
            break;
          case 269:
            generateNameIfNeeded(node.propertyName || node.name);
            break;
        }
      }
      function generateMemberNames(node) {
        if (!node)
          return;
        switch (node.kind) {
          case 294:
          case 295:
          case 166:
          case 168:
          case 171:
          case 172:
            generateNameIfNeeded(node.name);
            break;
        }
      }
      function generateNameIfNeeded(name) {
        if (name) {
          if (ts2.isGeneratedIdentifier(name)) {
            generateName(name);
          } else if (ts2.isBindingPattern(name)) {
            generateNames(name);
          }
        }
      }
      function generateName(name) {
        if ((name.autoGenerateFlags & 7) === 4) {
          return generateNameCached(getNodeForGeneratedName(name), name.autoGenerateFlags);
        } else {
          var autoGenerateId = name.autoGenerateId;
          return autoGeneratedIdToGeneratedName[autoGenerateId] || (autoGeneratedIdToGeneratedName[autoGenerateId] = makeName(name));
        }
      }
      function generateNameCached(node, flags) {
        var nodeId = ts2.getNodeId(node);
        return nodeIdToGeneratedName[nodeId] || (nodeIdToGeneratedName[nodeId] = generateNameForNode(node, flags));
      }
      function isUniqueName(name) {
        return isFileLevelUniqueName(name) && !generatedNames.has(name) && !(reservedNames && reservedNames.has(name));
      }
      function isFileLevelUniqueName(name) {
        return currentSourceFile ? ts2.isFileLevelUniqueName(currentSourceFile, name, hasGlobalName) : true;
      }
      function isUniqueLocalName(name, container) {
        for (var node = container; ts2.isNodeDescendantOf(node, container); node = node.nextContainer) {
          if (node.locals) {
            var local = node.locals.get(ts2.escapeLeadingUnderscores(name));
            if (local && local.flags & (111551 | 1048576 | 2097152)) {
              return false;
            }
          }
        }
        return true;
      }
      function makeTempVariableName(flags, reservedInNestedScopes) {
        if (flags && !(tempFlags & flags)) {
          var name = flags === 268435456 ? "_i" : "_n";
          if (isUniqueName(name)) {
            tempFlags |= flags;
            if (reservedInNestedScopes) {
              reserveNameInNestedScopes(name);
            }
            return name;
          }
        }
        while (true) {
          var count = tempFlags & 268435455;
          tempFlags++;
          if (count !== 8 && count !== 13) {
            var name = count < 26 ? "_" + String.fromCharCode(97 + count) : "_" + (count - 26);
            if (isUniqueName(name)) {
              if (reservedInNestedScopes) {
                reserveNameInNestedScopes(name);
              }
              return name;
            }
          }
        }
      }
      function makeUniqueName(baseName, checkFn, optimistic, scoped) {
        if (checkFn === void 0) {
          checkFn = isUniqueName;
        }
        if (optimistic) {
          if (checkFn(baseName)) {
            if (scoped) {
              reserveNameInNestedScopes(baseName);
            } else {
              generatedNames.add(baseName);
            }
            return baseName;
          }
        }
        if (baseName.charCodeAt(baseName.length - 1) !== 95) {
          baseName += "_";
        }
        var i = 1;
        while (true) {
          var generatedName = baseName + i;
          if (checkFn(generatedName)) {
            if (scoped) {
              reserveNameInNestedScopes(generatedName);
            } else {
              generatedNames.add(generatedName);
            }
            return generatedName;
          }
          i++;
        }
      }
      function makeFileLevelOptimisticUniqueName(name) {
        return makeUniqueName(name, isFileLevelUniqueName, true);
      }
      function generateNameForModuleOrEnum(node) {
        var name = getTextOfNode(node.name);
        return isUniqueLocalName(name, node) ? name : makeUniqueName(name);
      }
      function generateNameForImportOrExportDeclaration(node) {
        var expr = ts2.getExternalModuleName(node);
        var baseName = ts2.isStringLiteral(expr) ? ts2.makeIdentifierFromModuleName(expr.text) : "module";
        return makeUniqueName(baseName);
      }
      function generateNameForExportDefault() {
        return makeUniqueName("default");
      }
      function generateNameForClassExpression() {
        return makeUniqueName("class");
      }
      function generateNameForMethodOrAccessor(node) {
        if (ts2.isIdentifier(node.name)) {
          return generateNameCached(node.name);
        }
        return makeTempVariableName(0);
      }
      function generateNameForNode(node, flags) {
        switch (node.kind) {
          case 79:
            return makeUniqueName(getTextOfNode(node), isUniqueName, !!(flags & 16), !!(flags & 8));
          case 260:
          case 259:
            return generateNameForModuleOrEnum(node);
          case 265:
          case 271:
            return generateNameForImportOrExportDeclaration(node);
          case 255:
          case 256:
          case 270:
            return generateNameForExportDefault();
          case 225:
            return generateNameForClassExpression();
          case 168:
          case 171:
          case 172:
            return generateNameForMethodOrAccessor(node);
          case 161:
            return makeTempVariableName(0, true);
          default:
            return makeTempVariableName(0);
        }
      }
      function makeName(name) {
        switch (name.autoGenerateFlags & 7) {
          case 1:
            return makeTempVariableName(0, !!(name.autoGenerateFlags & 8));
          case 2:
            return makeTempVariableName(268435456, !!(name.autoGenerateFlags & 8));
          case 3:
            return makeUniqueName(ts2.idText(name), name.autoGenerateFlags & 32 ? isFileLevelUniqueName : isUniqueName, !!(name.autoGenerateFlags & 16), !!(name.autoGenerateFlags & 8));
        }
        return ts2.Debug.fail("Unsupported GeneratedIdentifierKind.");
      }
      function getNodeForGeneratedName(name) {
        var autoGenerateId = name.autoGenerateId;
        var node = name;
        var original = node.original;
        while (original) {
          node = original;
          if (ts2.isIdentifier(node) && !!(node.autoGenerateFlags & 4) && node.autoGenerateId !== autoGenerateId) {
            break;
          }
          original = node.original;
        }
        return node;
      }
      function pipelineEmitWithComments(hint, node) {
        var pipelinePhase = getNextPipelinePhase(2, hint, node);
        var savedContainerPos = containerPos;
        var savedContainerEnd = containerEnd;
        var savedDeclarationListContainerEnd = declarationListContainerEnd;
        emitCommentsBeforeNode(node);
        pipelinePhase(hint, node);
        emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
      }
      function emitCommentsBeforeNode(node) {
        var emitFlags = ts2.getEmitFlags(node);
        var commentRange = ts2.getCommentRange(node);
        emitLeadingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end);
        if (emitFlags & 2048) {
          commentsDisabled = true;
        }
      }
      function emitCommentsAfterNode(node, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd) {
        var emitFlags = ts2.getEmitFlags(node);
        var commentRange = ts2.getCommentRange(node);
        if (emitFlags & 2048) {
          commentsDisabled = false;
        }
        emitTrailingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd);
      }
      function emitLeadingCommentsOfNode(node, emitFlags, pos, end) {
        enterComment();
        hasWrittenComment = false;
        var skipLeadingComments = pos < 0 || (emitFlags & 512) !== 0 || node.kind === 11;
        var skipTrailingComments = end < 0 || (emitFlags & 1024) !== 0 || node.kind === 11;
        if ((pos > 0 || end > 0) && pos !== end) {
          if (!skipLeadingComments) {
            emitLeadingComments(pos, node.kind !== 347);
          }
          if (!skipLeadingComments || pos >= 0 && (emitFlags & 512) !== 0) {
            containerPos = pos;
          }
          if (!skipTrailingComments || end >= 0 && (emitFlags & 1024) !== 0) {
            containerEnd = end;
            if (node.kind === 254) {
              declarationListContainerEnd = end;
            }
          }
        }
        ts2.forEach(ts2.getSyntheticLeadingComments(node), emitLeadingSynthesizedComment);
        exitComment();
      }
      function emitTrailingCommentsOfNode(node, emitFlags, pos, end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd) {
        enterComment();
        var skipTrailingComments = end < 0 || (emitFlags & 1024) !== 0 || node.kind === 11;
        ts2.forEach(ts2.getSyntheticTrailingComments(node), emitTrailingSynthesizedComment);
        if ((pos > 0 || end > 0) && pos !== end) {
          containerPos = savedContainerPos;
          containerEnd = savedContainerEnd;
          declarationListContainerEnd = savedDeclarationListContainerEnd;
          if (!skipTrailingComments && node.kind !== 347) {
            emitTrailingComments(end);
          }
        }
        exitComment();
      }
      function emitLeadingSynthesizedComment(comment) {
        if (comment.hasLeadingNewline || comment.kind === 2) {
          writer.writeLine();
        }
        writeSynthesizedComment(comment);
        if (comment.hasTrailingNewLine || comment.kind === 2) {
          writer.writeLine();
        } else {
          writer.writeSpace(" ");
        }
      }
      function emitTrailingSynthesizedComment(comment) {
        if (!writer.isAtStartOfLine()) {
          writer.writeSpace(" ");
        }
        writeSynthesizedComment(comment);
        if (comment.hasTrailingNewLine) {
          writer.writeLine();
        }
      }
      function writeSynthesizedComment(comment) {
        var text = formatSynthesizedComment(comment);
        var lineMap = comment.kind === 3 ? ts2.computeLineStarts(text) : void 0;
        ts2.writeCommentRange(text, lineMap, writer, 0, text.length, newLine);
      }
      function formatSynthesizedComment(comment) {
        return comment.kind === 3 ? "/*".concat(comment.text, "*/") : "//".concat(comment.text);
      }
      function emitBodyWithDetachedComments(node, detachedRange, emitCallback) {
        enterComment();
        var pos = detachedRange.pos, end = detachedRange.end;
        var emitFlags = ts2.getEmitFlags(node);
        var skipLeadingComments = pos < 0 || (emitFlags & 512) !== 0;
        var skipTrailingComments = commentsDisabled || end < 0 || (emitFlags & 1024) !== 0;
        if (!skipLeadingComments) {
          emitDetachedCommentsAndUpdateCommentsInfo(detachedRange);
        }
        exitComment();
        if (emitFlags & 2048 && !commentsDisabled) {
          commentsDisabled = true;
          emitCallback(node);
          commentsDisabled = false;
        } else {
          emitCallback(node);
        }
        enterComment();
        if (!skipTrailingComments) {
          emitLeadingComments(detachedRange.end, true);
          if (hasWrittenComment && !writer.isAtStartOfLine()) {
            writer.writeLine();
          }
        }
        exitComment();
      }
      function originalNodesHaveSameParent(nodeA, nodeB) {
        nodeA = ts2.getOriginalNode(nodeA);
        return nodeA.parent && nodeA.parent === ts2.getOriginalNode(nodeB).parent;
      }
      function siblingNodePositionsAreComparable(previousNode, nextNode) {
        if (nextNode.pos < previousNode.end) {
          return false;
        }
        previousNode = ts2.getOriginalNode(previousNode);
        nextNode = ts2.getOriginalNode(nextNode);
        var parent = previousNode.parent;
        if (!parent || parent !== nextNode.parent) {
          return false;
        }
        var parentNodeArray = ts2.getContainingNodeArray(previousNode);
        var prevNodeIndex = parentNodeArray === null || parentNodeArray === void 0 ? void 0 : parentNodeArray.indexOf(previousNode);
        return prevNodeIndex !== void 0 && prevNodeIndex > -1 && parentNodeArray.indexOf(nextNode) === prevNodeIndex + 1;
      }
      function emitLeadingComments(pos, isEmittedNode) {
        hasWrittenComment = false;
        if (isEmittedNode) {
          if (pos === 0 && (currentSourceFile === null || currentSourceFile === void 0 ? void 0 : currentSourceFile.isDeclarationFile)) {
            forEachLeadingCommentToEmit(pos, emitNonTripleSlashLeadingComment);
          } else {
            forEachLeadingCommentToEmit(pos, emitLeadingComment);
          }
        } else if (pos === 0) {
          forEachLeadingCommentToEmit(pos, emitTripleSlashLeadingComment);
        }
      }
      function emitTripleSlashLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) {
        if (isTripleSlashComment(commentPos, commentEnd)) {
          emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos);
        }
      }
      function emitNonTripleSlashLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) {
        if (!isTripleSlashComment(commentPos, commentEnd)) {
          emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos);
        }
      }
      function shouldWriteComment(text, pos) {
        if (printerOptions.onlyPrintJsDocStyle) {
          return ts2.isJSDocLikeText(text, pos) || ts2.isPinnedComment(text, pos);
        }
        return true;
      }
      function emitLeadingComment(commentPos, commentEnd, kind, hasTrailingNewLine, rangePos) {
        if (!shouldWriteComment(currentSourceFile.text, commentPos))
          return;
        if (!hasWrittenComment) {
          ts2.emitNewLineBeforeLeadingCommentOfPosition(getCurrentLineMap(), writer, rangePos, commentPos);
          hasWrittenComment = true;
        }
        emitPos(commentPos);
        ts2.writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
        emitPos(commentEnd);
        if (hasTrailingNewLine) {
          writer.writeLine();
        } else if (kind === 3) {
          writer.writeSpace(" ");
        }
      }
      function emitLeadingCommentsOfPosition(pos) {
        if (commentsDisabled || pos === -1) {
          return;
        }
        emitLeadingComments(pos, true);
      }
      function emitTrailingComments(pos) {
        forEachTrailingCommentToEmit(pos, emitTrailingComment);
      }
      function emitTrailingComment(commentPos, commentEnd, _kind, hasTrailingNewLine) {
        if (!shouldWriteComment(currentSourceFile.text, commentPos))
          return;
        if (!writer.isAtStartOfLine()) {
          writer.writeSpace(" ");
        }
        emitPos(commentPos);
        ts2.writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
        emitPos(commentEnd);
        if (hasTrailingNewLine) {
          writer.writeLine();
        }
      }
      function emitTrailingCommentsOfPosition(pos, prefixSpace, forceNoNewline) {
        if (commentsDisabled) {
          return;
        }
        enterComment();
        forEachTrailingCommentToEmit(pos, prefixSpace ? emitTrailingComment : forceNoNewline ? emitTrailingCommentOfPositionNoNewline : emitTrailingCommentOfPosition);
        exitComment();
      }
      function emitTrailingCommentOfPositionNoNewline(commentPos, commentEnd, kind) {
        emitPos(commentPos);
        ts2.writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
        emitPos(commentEnd);
        if (kind === 2) {
          writer.writeLine();
        }
      }
      function emitTrailingCommentOfPosition(commentPos, commentEnd, _kind, hasTrailingNewLine) {
        emitPos(commentPos);
        ts2.writeCommentRange(currentSourceFile.text, getCurrentLineMap(), writer, commentPos, commentEnd, newLine);
        emitPos(commentEnd);
        if (hasTrailingNewLine) {
          writer.writeLine();
        } else {
          writer.writeSpace(" ");
        }
      }
      function forEachLeadingCommentToEmit(pos, cb) {
        if (currentSourceFile && (containerPos === -1 || pos !== containerPos)) {
          if (hasDetachedComments(pos)) {
            forEachLeadingCommentWithoutDetachedComments(cb);
          } else {
            ts2.forEachLeadingCommentRange(currentSourceFile.text, pos, cb, pos);
          }
        }
      }
      function forEachTrailingCommentToEmit(end, cb) {
        if (currentSourceFile && (containerEnd === -1 || end !== containerEnd && end !== declarationListContainerEnd)) {
          ts2.forEachTrailingCommentRange(currentSourceFile.text, end, cb);
        }
      }
      function hasDetachedComments(pos) {
        return detachedCommentsInfo !== void 0 && ts2.last(detachedCommentsInfo).nodePos === pos;
      }
      function forEachLeadingCommentWithoutDetachedComments(cb) {
        var pos = ts2.last(detachedCommentsInfo).detachedCommentEndPos;
        if (detachedCommentsInfo.length - 1) {
          detachedCommentsInfo.pop();
        } else {
          detachedCommentsInfo = void 0;
        }
        ts2.forEachLeadingCommentRange(currentSourceFile.text, pos, cb, pos);
      }
      function emitDetachedCommentsAndUpdateCommentsInfo(range) {
        var currentDetachedCommentInfo = ts2.emitDetachedComments(currentSourceFile.text, getCurrentLineMap(), writer, emitComment, range, newLine, commentsDisabled);
        if (currentDetachedCommentInfo) {
          if (detachedCommentsInfo) {
            detachedCommentsInfo.push(currentDetachedCommentInfo);
          } else {
            detachedCommentsInfo = [currentDetachedCommentInfo];
          }
        }
      }
      function emitComment(text, lineMap, writer2, commentPos, commentEnd, newLine2) {
        if (!shouldWriteComment(currentSourceFile.text, commentPos))
          return;
        emitPos(commentPos);
        ts2.writeCommentRange(text, lineMap, writer2, commentPos, commentEnd, newLine2);
        emitPos(commentEnd);
      }
      function isTripleSlashComment(commentPos, commentEnd) {
        return ts2.isRecognizedTripleSlashComment(currentSourceFile.text, commentPos, commentEnd);
      }
      function getParsedSourceMap(node) {
        if (node.parsedSourceMap === void 0 && node.sourceMapText !== void 0) {
          node.parsedSourceMap = ts2.tryParseRawSourceMap(node.sourceMapText) || false;
        }
        return node.parsedSourceMap || void 0;
      }
      function pipelineEmitWithSourceMaps(hint, node) {
        var pipelinePhase = getNextPipelinePhase(3, hint, node);
        emitSourceMapsBeforeNode(node);
        pipelinePhase(hint, node);
        emitSourceMapsAfterNode(node);
      }
      function emitSourceMapsBeforeNode(node) {
        var emitFlags = ts2.getEmitFlags(node);
        var sourceMapRange = ts2.getSourceMapRange(node);
        if (ts2.isUnparsedNode(node)) {
          ts2.Debug.assertIsDefined(node.parent, "UnparsedNodes must have parent pointers");
          var parsed = getParsedSourceMap(node.parent);
          if (parsed && sourceMapGenerator) {
            sourceMapGenerator.appendSourceMap(writer.getLine(), writer.getColumn(), parsed, node.parent.sourceMapPath, node.parent.getLineAndCharacterOfPosition(node.pos), node.parent.getLineAndCharacterOfPosition(node.end));
          }
        } else {
          var source = sourceMapRange.source || sourceMapSource;
          if (node.kind !== 347 && (emitFlags & 16) === 0 && sourceMapRange.pos >= 0) {
            emitSourcePos(sourceMapRange.source || sourceMapSource, skipSourceTrivia(source, sourceMapRange.pos));
          }
          if (emitFlags & 64) {
            sourceMapsDisabled = true;
          }
        }
      }
      function emitSourceMapsAfterNode(node) {
        var emitFlags = ts2.getEmitFlags(node);
        var sourceMapRange = ts2.getSourceMapRange(node);
        if (!ts2.isUnparsedNode(node)) {
          if (emitFlags & 64) {
            sourceMapsDisabled = false;
          }
          if (node.kind !== 347 && (emitFlags & 32) === 0 && sourceMapRange.end >= 0) {
            emitSourcePos(sourceMapRange.source || sourceMapSource, sourceMapRange.end);
          }
        }
      }
      function skipSourceTrivia(source, pos) {
        return source.skipTrivia ? source.skipTrivia(pos) : ts2.skipTrivia(source.text, pos);
      }
      function emitPos(pos) {
        if (sourceMapsDisabled || ts2.positionIsSynthesized(pos) || isJsonSourceMapSource(sourceMapSource)) {
          return;
        }
        var _a2 = ts2.getLineAndCharacterOfPosition(sourceMapSource, pos), sourceLine = _a2.line, sourceCharacter = _a2.character;
        sourceMapGenerator.addMapping(writer.getLine(), writer.getColumn(), sourceMapSourceIndex, sourceLine, sourceCharacter, void 0);
      }
      function emitSourcePos(source, pos) {
        if (source !== sourceMapSource) {
          var savedSourceMapSource = sourceMapSource;
          var savedSourceMapSourceIndex = sourceMapSourceIndex;
          setSourceMapSource(source);
          emitPos(pos);
          resetSourceMapSource(savedSourceMapSource, savedSourceMapSourceIndex);
        } else {
          emitPos(pos);
        }
      }
      function emitTokenWithSourceMap(node, token, writer2, tokenPos, emitCallback) {
        if (sourceMapsDisabled || node && ts2.isInJsonFile(node)) {
          return emitCallback(token, writer2, tokenPos);
        }
        var emitNode = node && node.emitNode;
        var emitFlags = emitNode && emitNode.flags || 0;
        var range = emitNode && emitNode.tokenSourceMapRanges && emitNode.tokenSourceMapRanges[token];
        var source = range && range.source || sourceMapSource;
        tokenPos = skipSourceTrivia(source, range ? range.pos : tokenPos);
        if ((emitFlags & 128) === 0 && tokenPos >= 0) {
          emitSourcePos(source, tokenPos);
        }
        tokenPos = emitCallback(token, writer2, tokenPos);
        if (range)
          tokenPos = range.end;
        if ((emitFlags & 256) === 0 && tokenPos >= 0) {
          emitSourcePos(source, tokenPos);
        }
        return tokenPos;
      }
      function setSourceMapSource(source) {
        if (sourceMapsDisabled) {
          return;
        }
        sourceMapSource = source;
        if (source === mostRecentlyAddedSourceMapSource) {
          sourceMapSourceIndex = mostRecentlyAddedSourceMapSourceIndex;
          return;
        }
        if (isJsonSourceMapSource(source)) {
          return;
        }
        sourceMapSourceIndex = sourceMapGenerator.addSource(source.fileName);
        if (printerOptions.inlineSources) {
          sourceMapGenerator.setSourceContent(sourceMapSourceIndex, source.text);
        }
        mostRecentlyAddedSourceMapSource = source;
        mostRecentlyAddedSourceMapSourceIndex = sourceMapSourceIndex;
      }
      function resetSourceMapSource(source, sourceIndex) {
        sourceMapSource = source;
        sourceMapSourceIndex = sourceIndex;
      }
      function isJsonSourceMapSource(sourceFile) {
        return ts2.fileExtensionIs(sourceFile.fileName, ".json");
      }
    }
    ts2.createPrinter = createPrinter;
    function createBracketsMap() {
      var brackets2 = [];
      brackets2[1024] = ["{", "}"];
      brackets2[2048] = ["(", ")"];
      brackets2[4096] = ["<", ">"];
      brackets2[8192] = ["[", "]"];
      return brackets2;
    }
    function getOpeningBracket(format) {
      return brackets[format & 15360][0];
    }
    function getClosingBracket(format) {
      return brackets[format & 15360][1];
    }
    var TempFlags;
    (function(TempFlags2) {
      TempFlags2[TempFlags2["Auto"] = 0] = "Auto";
      TempFlags2[TempFlags2["CountMask"] = 268435455] = "CountMask";
      TempFlags2[TempFlags2["_i"] = 268435456] = "_i";
    })(TempFlags || (TempFlags = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    function createCachedDirectoryStructureHost(host, currentDirectory, useCaseSensitiveFileNames) {
      if (!host.getDirectories || !host.readDirectory) {
        return void 0;
      }
      var cachedReadDirectoryResult = new ts2.Map();
      var getCanonicalFileName = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      return {
        useCaseSensitiveFileNames,
        fileExists,
        readFile: function(path, encoding) {
          return host.readFile(path, encoding);
        },
        directoryExists: host.directoryExists && directoryExists,
        getDirectories,
        readDirectory,
        createDirectory: host.createDirectory && createDirectory,
        writeFile: host.writeFile && writeFile,
        addOrDeleteFileOrDirectory,
        addOrDeleteFile,
        clearCache,
        realpath: host.realpath && realpath
      };
      function toPath(fileName) {
        return ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
      }
      function getCachedFileSystemEntries(rootDirPath) {
        return cachedReadDirectoryResult.get(ts2.ensureTrailingDirectorySeparator(rootDirPath));
      }
      function getCachedFileSystemEntriesForBaseDir(path) {
        return getCachedFileSystemEntries(ts2.getDirectoryPath(path));
      }
      function getBaseNameOfFileName(fileName) {
        return ts2.getBaseFileName(ts2.normalizePath(fileName));
      }
      function createCachedFileSystemEntries(rootDir, rootDirPath) {
        var _a;
        if (!host.realpath || ts2.ensureTrailingDirectorySeparator(toPath(host.realpath(rootDir))) === rootDirPath) {
          var resultFromHost = {
            files: ts2.map(host.readDirectory(rootDir, void 0, void 0, ["*.*"]), getBaseNameOfFileName) || [],
            directories: host.getDirectories(rootDir) || []
          };
          cachedReadDirectoryResult.set(ts2.ensureTrailingDirectorySeparator(rootDirPath), resultFromHost);
          return resultFromHost;
        }
        if ((_a = host.directoryExists) === null || _a === void 0 ? void 0 : _a.call(host, rootDir)) {
          cachedReadDirectoryResult.set(rootDirPath, false);
          return false;
        }
        return void 0;
      }
      function tryReadDirectory(rootDir, rootDirPath) {
        rootDirPath = ts2.ensureTrailingDirectorySeparator(rootDirPath);
        var cachedResult = getCachedFileSystemEntries(rootDirPath);
        if (cachedResult) {
          return cachedResult;
        }
        try {
          return createCachedFileSystemEntries(rootDir, rootDirPath);
        } catch (_e) {
          ts2.Debug.assert(!cachedReadDirectoryResult.has(ts2.ensureTrailingDirectorySeparator(rootDirPath)));
          return void 0;
        }
      }
      function fileNameEqual(name1, name2) {
        return getCanonicalFileName(name1) === getCanonicalFileName(name2);
      }
      function hasEntry(entries, name) {
        return ts2.some(entries, function(file) {
          return fileNameEqual(file, name);
        });
      }
      function updateFileSystemEntry(entries, baseName, isValid) {
        if (hasEntry(entries, baseName)) {
          if (!isValid) {
            return ts2.filterMutate(entries, function(entry) {
              return !fileNameEqual(entry, baseName);
            });
          }
        } else if (isValid) {
          return entries.push(baseName);
        }
      }
      function writeFile(fileName, data, writeByteOrderMark) {
        var path = toPath(fileName);
        var result = getCachedFileSystemEntriesForBaseDir(path);
        if (result) {
          updateFilesOfFileSystemEntry(result, getBaseNameOfFileName(fileName), true);
        }
        return host.writeFile(fileName, data, writeByteOrderMark);
      }
      function fileExists(fileName) {
        var path = toPath(fileName);
        var result = getCachedFileSystemEntriesForBaseDir(path);
        return result && hasEntry(result.files, getBaseNameOfFileName(fileName)) || host.fileExists(fileName);
      }
      function directoryExists(dirPath) {
        var path = toPath(dirPath);
        return cachedReadDirectoryResult.has(ts2.ensureTrailingDirectorySeparator(path)) || host.directoryExists(dirPath);
      }
      function createDirectory(dirPath) {
        var path = toPath(dirPath);
        var result = getCachedFileSystemEntriesForBaseDir(path);
        var baseFileName = getBaseNameOfFileName(dirPath);
        if (result) {
          updateFileSystemEntry(result.directories, baseFileName, true);
        }
        host.createDirectory(dirPath);
      }
      function getDirectories(rootDir) {
        var rootDirPath = toPath(rootDir);
        var result = tryReadDirectory(rootDir, rootDirPath);
        if (result) {
          return result.directories.slice();
        }
        return host.getDirectories(rootDir);
      }
      function readDirectory(rootDir, extensions, excludes, includes, depth) {
        var rootDirPath = toPath(rootDir);
        var rootResult = tryReadDirectory(rootDir, rootDirPath);
        var rootSymLinkResult;
        if (rootResult !== void 0) {
          return ts2.matchFiles(rootDir, extensions, excludes, includes, useCaseSensitiveFileNames, currentDirectory, depth, getFileSystemEntries, realpath);
        }
        return host.readDirectory(rootDir, extensions, excludes, includes, depth);
        function getFileSystemEntries(dir) {
          var path = toPath(dir);
          if (path === rootDirPath) {
            return rootResult || getFileSystemEntriesFromHost(dir, path);
          }
          var result = tryReadDirectory(dir, path);
          return result !== void 0 ? result || getFileSystemEntriesFromHost(dir, path) : ts2.emptyFileSystemEntries;
        }
        function getFileSystemEntriesFromHost(dir, path) {
          if (rootSymLinkResult && path === rootDirPath)
            return rootSymLinkResult;
          var result = {
            files: ts2.map(host.readDirectory(dir, void 0, void 0, ["*.*"]), getBaseNameOfFileName) || ts2.emptyArray,
            directories: host.getDirectories(dir) || ts2.emptyArray
          };
          if (path === rootDirPath)
            rootSymLinkResult = result;
          return result;
        }
      }
      function realpath(s) {
        return host.realpath ? host.realpath(s) : s;
      }
      function addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath) {
        var existingResult = getCachedFileSystemEntries(fileOrDirectoryPath);
        if (existingResult !== void 0) {
          clearCache();
          return void 0;
        }
        var parentResult = getCachedFileSystemEntriesForBaseDir(fileOrDirectoryPath);
        if (!parentResult) {
          return void 0;
        }
        if (!host.directoryExists) {
          clearCache();
          return void 0;
        }
        var baseName = getBaseNameOfFileName(fileOrDirectory);
        var fsQueryResult = {
          fileExists: host.fileExists(fileOrDirectoryPath),
          directoryExists: host.directoryExists(fileOrDirectoryPath)
        };
        if (fsQueryResult.directoryExists || hasEntry(parentResult.directories, baseName)) {
          clearCache();
        } else {
          updateFilesOfFileSystemEntry(parentResult, baseName, fsQueryResult.fileExists);
        }
        return fsQueryResult;
      }
      function addOrDeleteFile(fileName, filePath, eventKind) {
        if (eventKind === ts2.FileWatcherEventKind.Changed) {
          return;
        }
        var parentResult = getCachedFileSystemEntriesForBaseDir(filePath);
        if (parentResult) {
          updateFilesOfFileSystemEntry(parentResult, getBaseNameOfFileName(fileName), eventKind === ts2.FileWatcherEventKind.Created);
        }
      }
      function updateFilesOfFileSystemEntry(parentResult, baseName, fileExists2) {
        updateFileSystemEntry(parentResult.files, baseName, fileExists2);
      }
      function clearCache() {
        cachedReadDirectoryResult.clear();
      }
    }
    ts2.createCachedDirectoryStructureHost = createCachedDirectoryStructureHost;
    var ConfigFileProgramReloadLevel;
    (function(ConfigFileProgramReloadLevel2) {
      ConfigFileProgramReloadLevel2[ConfigFileProgramReloadLevel2["None"] = 0] = "None";
      ConfigFileProgramReloadLevel2[ConfigFileProgramReloadLevel2["Partial"] = 1] = "Partial";
      ConfigFileProgramReloadLevel2[ConfigFileProgramReloadLevel2["Full"] = 2] = "Full";
    })(ConfigFileProgramReloadLevel = ts2.ConfigFileProgramReloadLevel || (ts2.ConfigFileProgramReloadLevel = {}));
    function updateSharedExtendedConfigFileWatcher(projectPath, options, extendedConfigFilesMap, createExtendedConfigFileWatch, toPath) {
      var _a;
      var extendedConfigs = ts2.arrayToMap(((_a = options === null || options === void 0 ? void 0 : options.configFile) === null || _a === void 0 ? void 0 : _a.extendedSourceFiles) || ts2.emptyArray, toPath);
      extendedConfigFilesMap.forEach(function(watcher, extendedConfigFilePath) {
        if (!extendedConfigs.has(extendedConfigFilePath)) {
          watcher.projects.delete(projectPath);
          watcher.close();
        }
      });
      extendedConfigs.forEach(function(extendedConfigFileName, extendedConfigFilePath) {
        var existing = extendedConfigFilesMap.get(extendedConfigFilePath);
        if (existing) {
          existing.projects.add(projectPath);
        } else {
          extendedConfigFilesMap.set(extendedConfigFilePath, {
            projects: new ts2.Set([projectPath]),
            watcher: createExtendedConfigFileWatch(extendedConfigFileName, extendedConfigFilePath),
            close: function() {
              var existing2 = extendedConfigFilesMap.get(extendedConfigFilePath);
              if (!existing2 || existing2.projects.size !== 0)
                return;
              existing2.watcher.close();
              extendedConfigFilesMap.delete(extendedConfigFilePath);
            }
          });
        }
      });
    }
    ts2.updateSharedExtendedConfigFileWatcher = updateSharedExtendedConfigFileWatcher;
    function clearSharedExtendedConfigFileWatcher(projectPath, extendedConfigFilesMap) {
      extendedConfigFilesMap.forEach(function(watcher) {
        if (watcher.projects.delete(projectPath))
          watcher.close();
      });
    }
    ts2.clearSharedExtendedConfigFileWatcher = clearSharedExtendedConfigFileWatcher;
    function cleanExtendedConfigCache(extendedConfigCache, extendedConfigFilePath, toPath) {
      if (!extendedConfigCache.delete(extendedConfigFilePath))
        return;
      extendedConfigCache.forEach(function(_a, key) {
        var _b;
        var extendedResult = _a.extendedResult;
        if ((_b = extendedResult.extendedSourceFiles) === null || _b === void 0 ? void 0 : _b.some(function(extendedFile) {
          return toPath(extendedFile) === extendedConfigFilePath;
        })) {
          cleanExtendedConfigCache(extendedConfigCache, key, toPath);
        }
      });
    }
    ts2.cleanExtendedConfigCache = cleanExtendedConfigCache;
    function updatePackageJsonWatch(lookups, packageJsonWatches, createPackageJsonWatch) {
      var newMap = new ts2.Map(lookups);
      ts2.mutateMap(packageJsonWatches, newMap, {
        createNewValue: createPackageJsonWatch,
        onDeleteValue: ts2.closeFileWatcher
      });
    }
    ts2.updatePackageJsonWatch = updatePackageJsonWatch;
    function updateMissingFilePathsWatch(program, missingFileWatches, createMissingFileWatch) {
      var missingFilePaths = program.getMissingFilePaths();
      var newMissingFilePathMap = ts2.arrayToMap(missingFilePaths, ts2.identity, ts2.returnTrue);
      ts2.mutateMap(missingFileWatches, newMissingFilePathMap, {
        createNewValue: createMissingFileWatch,
        onDeleteValue: ts2.closeFileWatcher
      });
    }
    ts2.updateMissingFilePathsWatch = updateMissingFilePathsWatch;
    function updateWatchingWildcardDirectories(existingWatchedForWildcards, wildcardDirectories, watchDirectory) {
      ts2.mutateMap(existingWatchedForWildcards, wildcardDirectories, {
        createNewValue: createWildcardDirectoryWatcher,
        onDeleteValue: closeFileWatcherOf,
        onExistingValue: updateWildcardDirectoryWatcher
      });
      function createWildcardDirectoryWatcher(directory, flags) {
        return {
          watcher: watchDirectory(directory, flags),
          flags
        };
      }
      function updateWildcardDirectoryWatcher(existingWatcher, flags, directory) {
        if (existingWatcher.flags === flags) {
          return;
        }
        existingWatcher.watcher.close();
        existingWatchedForWildcards.set(directory, createWildcardDirectoryWatcher(directory, flags));
      }
    }
    ts2.updateWatchingWildcardDirectories = updateWatchingWildcardDirectories;
    function isIgnoredFileFromWildCardWatching(_a) {
      var watchedDirPath = _a.watchedDirPath, fileOrDirectory = _a.fileOrDirectory, fileOrDirectoryPath = _a.fileOrDirectoryPath, configFileName = _a.configFileName, options = _a.options, program = _a.program, extraFileExtensions = _a.extraFileExtensions, currentDirectory = _a.currentDirectory, useCaseSensitiveFileNames = _a.useCaseSensitiveFileNames, writeLog = _a.writeLog, toPath = _a.toPath;
      var newPath = ts2.removeIgnoredPath(fileOrDirectoryPath);
      if (!newPath) {
        writeLog("Project: ".concat(configFileName, " Detected ignored path: ").concat(fileOrDirectory));
        return true;
      }
      fileOrDirectoryPath = newPath;
      if (fileOrDirectoryPath === watchedDirPath)
        return false;
      if (ts2.hasExtension(fileOrDirectoryPath) && !ts2.isSupportedSourceFileName(fileOrDirectory, options, extraFileExtensions)) {
        writeLog("Project: ".concat(configFileName, " Detected file add/remove of non supported extension: ").concat(fileOrDirectory));
        return true;
      }
      if (ts2.isExcludedFile(fileOrDirectory, options.configFile.configFileSpecs, ts2.getNormalizedAbsolutePath(ts2.getDirectoryPath(configFileName), currentDirectory), useCaseSensitiveFileNames, currentDirectory)) {
        writeLog("Project: ".concat(configFileName, " Detected excluded file: ").concat(fileOrDirectory));
        return true;
      }
      if (!program)
        return false;
      if (ts2.outFile(options) || options.outDir)
        return false;
      if (ts2.fileExtensionIs(fileOrDirectoryPath, ".d.ts")) {
        if (options.declarationDir)
          return false;
      } else if (!ts2.fileExtensionIsOneOf(fileOrDirectoryPath, ts2.supportedJSExtensionsFlat)) {
        return false;
      }
      var filePathWithoutExtension = ts2.removeFileExtension(fileOrDirectoryPath);
      var realProgram = ts2.isArray(program) ? void 0 : isBuilderProgram(program) ? program.getProgramOrUndefined() : program;
      var builderProgram = !realProgram && !ts2.isArray(program) ? program : void 0;
      if (hasSourceFile(filePathWithoutExtension + ".ts") || hasSourceFile(filePathWithoutExtension + ".tsx")) {
        writeLog("Project: ".concat(configFileName, " Detected output file: ").concat(fileOrDirectory));
        return true;
      }
      return false;
      function hasSourceFile(file) {
        return realProgram ? !!realProgram.getSourceFileByPath(file) : builderProgram ? builderProgram.getState().fileInfos.has(file) : !!ts2.find(program, function(rootFile) {
          return toPath(rootFile) === file;
        });
      }
    }
    ts2.isIgnoredFileFromWildCardWatching = isIgnoredFileFromWildCardWatching;
    function isBuilderProgram(program) {
      return !!program.getState;
    }
    function isEmittedFileOfProgram(program, file) {
      if (!program) {
        return false;
      }
      return program.isEmittedFile(file);
    }
    ts2.isEmittedFileOfProgram = isEmittedFileOfProgram;
    var WatchLogLevel;
    (function(WatchLogLevel2) {
      WatchLogLevel2[WatchLogLevel2["None"] = 0] = "None";
      WatchLogLevel2[WatchLogLevel2["TriggerOnly"] = 1] = "TriggerOnly";
      WatchLogLevel2[WatchLogLevel2["Verbose"] = 2] = "Verbose";
    })(WatchLogLevel = ts2.WatchLogLevel || (ts2.WatchLogLevel = {}));
    function getWatchFactory(host, watchLogLevel, log, getDetailWatchInfo) {
      ts2.setSysLog(watchLogLevel === WatchLogLevel.Verbose ? log : ts2.noop);
      var plainInvokeFactory = {
        watchFile: function(file, callback, pollingInterval, options) {
          return host.watchFile(file, callback, pollingInterval, options);
        },
        watchDirectory: function(directory, callback, flags, options) {
          return host.watchDirectory(directory, callback, (flags & 1) !== 0, options);
        }
      };
      var triggerInvokingFactory = watchLogLevel !== WatchLogLevel.None ? {
        watchFile: createTriggerLoggingAddWatch("watchFile"),
        watchDirectory: createTriggerLoggingAddWatch("watchDirectory")
      } : void 0;
      var factory = watchLogLevel === WatchLogLevel.Verbose ? {
        watchFile: createFileWatcherWithLogging,
        watchDirectory: createDirectoryWatcherWithLogging
      } : triggerInvokingFactory || plainInvokeFactory;
      var excludeWatcherFactory = watchLogLevel === WatchLogLevel.Verbose ? createExcludeWatcherWithLogging : ts2.returnNoopFileWatcher;
      return {
        watchFile: createExcludeHandlingAddWatch("watchFile"),
        watchDirectory: createExcludeHandlingAddWatch("watchDirectory")
      };
      function createExcludeHandlingAddWatch(key) {
        return function(file, cb, flags, options, detailInfo1, detailInfo2) {
          var _a;
          return !ts2.matchesExclude(file, key === "watchFile" ? options === null || options === void 0 ? void 0 : options.excludeFiles : options === null || options === void 0 ? void 0 : options.excludeDirectories, useCaseSensitiveFileNames(), ((_a = host.getCurrentDirectory) === null || _a === void 0 ? void 0 : _a.call(host)) || "") ? factory[key].call(void 0, file, cb, flags, options, detailInfo1, detailInfo2) : excludeWatcherFactory(file, flags, options, detailInfo1, detailInfo2);
        };
      }
      function useCaseSensitiveFileNames() {
        return typeof host.useCaseSensitiveFileNames === "boolean" ? host.useCaseSensitiveFileNames : host.useCaseSensitiveFileNames();
      }
      function createExcludeWatcherWithLogging(file, flags, options, detailInfo1, detailInfo2) {
        log("ExcludeWatcher:: Added:: ".concat(getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)));
        return {
          close: function() {
            return log("ExcludeWatcher:: Close:: ".concat(getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)));
          }
        };
      }
      function createFileWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) {
        log("FileWatcher:: Added:: ".concat(getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)));
        var watcher = triggerInvokingFactory.watchFile(file, cb, flags, options, detailInfo1, detailInfo2);
        return {
          close: function() {
            log("FileWatcher:: Close:: ".concat(getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo)));
            watcher.close();
          }
        };
      }
      function createDirectoryWatcherWithLogging(file, cb, flags, options, detailInfo1, detailInfo2) {
        var watchInfo = "DirectoryWatcher:: Added:: ".concat(getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo));
        log(watchInfo);
        var start = ts2.timestamp();
        var watcher = triggerInvokingFactory.watchDirectory(file, cb, flags, options, detailInfo1, detailInfo2);
        var elapsed = ts2.timestamp() - start;
        log("Elapsed:: ".concat(elapsed, "ms ").concat(watchInfo));
        return {
          close: function() {
            var watchInfo2 = "DirectoryWatcher:: Close:: ".concat(getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo));
            log(watchInfo2);
            var start2 = ts2.timestamp();
            watcher.close();
            var elapsed2 = ts2.timestamp() - start2;
            log("Elapsed:: ".concat(elapsed2, "ms ").concat(watchInfo2));
          }
        };
      }
      function createTriggerLoggingAddWatch(key) {
        return function(file, cb, flags, options, detailInfo1, detailInfo2) {
          return plainInvokeFactory[key].call(void 0, file, function() {
            var args = [];
            for (var _i = 0; _i < arguments.length; _i++) {
              args[_i] = arguments[_i];
            }
            var triggerredInfo = "".concat(key === "watchFile" ? "FileWatcher" : "DirectoryWatcher", ":: Triggered with ").concat(args[0], " ").concat(args[1] !== void 0 ? args[1] : "", ":: ").concat(getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo));
            log(triggerredInfo);
            var start = ts2.timestamp();
            cb.call.apply(cb, __spreadArray([void 0], args, false));
            var elapsed = ts2.timestamp() - start;
            log("Elapsed:: ".concat(elapsed, "ms ").concat(triggerredInfo));
          }, flags, options, detailInfo1, detailInfo2);
        };
      }
      function getWatchInfo(file, flags, options, detailInfo1, detailInfo2, getDetailWatchInfo2) {
        return "WatchInfo: ".concat(file, " ").concat(flags, " ").concat(JSON.stringify(options), " ").concat(getDetailWatchInfo2 ? getDetailWatchInfo2(detailInfo1, detailInfo2) : detailInfo2 === void 0 ? detailInfo1 : "".concat(detailInfo1, " ").concat(detailInfo2));
      }
    }
    ts2.getWatchFactory = getWatchFactory;
    function getFallbackOptions(options) {
      var fallbackPolling = options === null || options === void 0 ? void 0 : options.fallbackPolling;
      return {
        watchFile: fallbackPolling !== void 0 ? fallbackPolling : ts2.WatchFileKind.PriorityPollingInterval
      };
    }
    ts2.getFallbackOptions = getFallbackOptions;
    function closeFileWatcherOf(objWithWatcher) {
      objWithWatcher.watcher.close();
    }
    ts2.closeFileWatcherOf = closeFileWatcherOf;
  })(ts || (ts = {}));
  (function(ts2) {
    function findConfigFile(searchPath, fileExists, configName) {
      if (configName === void 0) {
        configName = "tsconfig.json";
      }
      return ts2.forEachAncestorDirectory(searchPath, function(ancestor) {
        var fileName = ts2.combinePaths(ancestor, configName);
        return fileExists(fileName) ? fileName : void 0;
      });
    }
    ts2.findConfigFile = findConfigFile;
    function resolveTripleslashReference(moduleName, containingFile) {
      var basePath = ts2.getDirectoryPath(containingFile);
      var referencedFileName = ts2.isRootedDiskPath(moduleName) ? moduleName : ts2.combinePaths(basePath, moduleName);
      return ts2.normalizePath(referencedFileName);
    }
    ts2.resolveTripleslashReference = resolveTripleslashReference;
    function computeCommonSourceDirectoryOfFilenames(fileNames, currentDirectory, getCanonicalFileName) {
      var commonPathComponents;
      var failed = ts2.forEach(fileNames, function(sourceFile) {
        var sourcePathComponents = ts2.getNormalizedPathComponents(sourceFile, currentDirectory);
        sourcePathComponents.pop();
        if (!commonPathComponents) {
          commonPathComponents = sourcePathComponents;
          return;
        }
        var n = Math.min(commonPathComponents.length, sourcePathComponents.length);
        for (var i = 0; i < n; i++) {
          if (getCanonicalFileName(commonPathComponents[i]) !== getCanonicalFileName(sourcePathComponents[i])) {
            if (i === 0) {
              return true;
            }
            commonPathComponents.length = i;
            break;
          }
        }
        if (sourcePathComponents.length < commonPathComponents.length) {
          commonPathComponents.length = sourcePathComponents.length;
        }
      });
      if (failed) {
        return "";
      }
      if (!commonPathComponents) {
        return currentDirectory;
      }
      return ts2.getPathFromPathComponents(commonPathComponents);
    }
    ts2.computeCommonSourceDirectoryOfFilenames = computeCommonSourceDirectoryOfFilenames;
    function createCompilerHost(options, setParentNodes) {
      return createCompilerHostWorker(options, setParentNodes);
    }
    ts2.createCompilerHost = createCompilerHost;
    function createCompilerHostWorker(options, setParentNodes, system) {
      if (system === void 0) {
        system = ts2.sys;
      }
      var existingDirectories = new ts2.Map();
      var getCanonicalFileName = ts2.createGetCanonicalFileName(system.useCaseSensitiveFileNames);
      var computeHash = ts2.maybeBind(system, system.createHash) || ts2.generateDjb2Hash;
      function getSourceFile(fileName, languageVersion, onError) {
        var text;
        try {
          ts2.performance.mark("beforeIORead");
          text = compilerHost.readFile(fileName);
          ts2.performance.mark("afterIORead");
          ts2.performance.measure("I/O Read", "beforeIORead", "afterIORead");
        } catch (e) {
          if (onError) {
            onError(e.message);
          }
          text = "";
        }
        return text !== void 0 ? ts2.createSourceFile(fileName, text, languageVersion, setParentNodes) : void 0;
      }
      function directoryExists(directoryPath) {
        if (existingDirectories.has(directoryPath)) {
          return true;
        }
        if ((compilerHost.directoryExists || system.directoryExists)(directoryPath)) {
          existingDirectories.set(directoryPath, true);
          return true;
        }
        return false;
      }
      function writeFile(fileName, data, writeByteOrderMark, onError) {
        try {
          ts2.performance.mark("beforeIOWrite");
          ts2.writeFileEnsuringDirectories(fileName, data, writeByteOrderMark, function(path, data2, writeByteOrderMark2) {
            return writeFileWorker(path, data2, writeByteOrderMark2);
          }, function(path) {
            return (compilerHost.createDirectory || system.createDirectory)(path);
          }, function(path) {
            return directoryExists(path);
          });
          ts2.performance.mark("afterIOWrite");
          ts2.performance.measure("I/O Write", "beforeIOWrite", "afterIOWrite");
        } catch (e) {
          if (onError) {
            onError(e.message);
          }
        }
      }
      var outputFingerprints;
      function writeFileWorker(fileName, data, writeByteOrderMark) {
        if (!ts2.isWatchSet(options) || !system.getModifiedTime) {
          system.writeFile(fileName, data, writeByteOrderMark);
          return;
        }
        if (!outputFingerprints) {
          outputFingerprints = new ts2.Map();
        }
        var hash = computeHash(data);
        var mtimeBefore = system.getModifiedTime(fileName);
        if (mtimeBefore) {
          var fingerprint = outputFingerprints.get(fileName);
          if (fingerprint && fingerprint.byteOrderMark === writeByteOrderMark && fingerprint.hash === hash && fingerprint.mtime.getTime() === mtimeBefore.getTime()) {
            return;
          }
        }
        system.writeFile(fileName, data, writeByteOrderMark);
        var mtimeAfter = system.getModifiedTime(fileName) || ts2.missingFileModifiedTime;
        outputFingerprints.set(fileName, {
          hash,
          byteOrderMark: writeByteOrderMark,
          mtime: mtimeAfter
        });
      }
      function getDefaultLibLocation() {
        return ts2.getDirectoryPath(ts2.normalizePath(system.getExecutingFilePath()));
      }
      var newLine = ts2.getNewLineCharacter(options, function() {
        return system.newLine;
      });
      var realpath = system.realpath && function(path) {
        return system.realpath(path);
      };
      var compilerHost = {
        getSourceFile,
        getDefaultLibLocation,
        getDefaultLibFileName: function(options2) {
          return ts2.combinePaths(getDefaultLibLocation(), ts2.getDefaultLibFileName(options2));
        },
        writeFile,
        getCurrentDirectory: ts2.memoize(function() {
          return system.getCurrentDirectory();
        }),
        useCaseSensitiveFileNames: function() {
          return system.useCaseSensitiveFileNames;
        },
        getCanonicalFileName,
        getNewLine: function() {
          return newLine;
        },
        fileExists: function(fileName) {
          return system.fileExists(fileName);
        },
        readFile: function(fileName) {
          return system.readFile(fileName);
        },
        trace: function(s) {
          return system.write(s + newLine);
        },
        directoryExists: function(directoryName) {
          return system.directoryExists(directoryName);
        },
        getEnvironmentVariable: function(name) {
          return system.getEnvironmentVariable ? system.getEnvironmentVariable(name) : "";
        },
        getDirectories: function(path) {
          return system.getDirectories(path);
        },
        realpath,
        readDirectory: function(path, extensions, include, exclude, depth) {
          return system.readDirectory(path, extensions, include, exclude, depth);
        },
        createDirectory: function(d) {
          return system.createDirectory(d);
        },
        createHash: ts2.maybeBind(system, system.createHash)
      };
      return compilerHost;
    }
    ts2.createCompilerHostWorker = createCompilerHostWorker;
    function changeCompilerHostLikeToUseCache(host, toPath, getSourceFile) {
      var originalReadFile = host.readFile;
      var originalFileExists = host.fileExists;
      var originalDirectoryExists = host.directoryExists;
      var originalCreateDirectory = host.createDirectory;
      var originalWriteFile = host.writeFile;
      var readFileCache = new ts2.Map();
      var fileExistsCache = new ts2.Map();
      var directoryExistsCache = new ts2.Map();
      var sourceFileCache = new ts2.Map();
      var readFileWithCache = function(fileName) {
        var key = toPath(fileName);
        var value = readFileCache.get(key);
        if (value !== void 0)
          return value !== false ? value : void 0;
        return setReadFileCache(key, fileName);
      };
      var setReadFileCache = function(key, fileName) {
        var newValue = originalReadFile.call(host, fileName);
        readFileCache.set(key, newValue !== void 0 ? newValue : false);
        return newValue;
      };
      host.readFile = function(fileName) {
        var key = toPath(fileName);
        var value = readFileCache.get(key);
        if (value !== void 0)
          return value !== false ? value : void 0;
        if (!ts2.fileExtensionIs(fileName, ".json") && !ts2.isBuildInfoFile(fileName)) {
          return originalReadFile.call(host, fileName);
        }
        return setReadFileCache(key, fileName);
      };
      var getSourceFileWithCache = getSourceFile ? function(fileName, languageVersion, onError, shouldCreateNewSourceFile) {
        var key = toPath(fileName);
        var value = sourceFileCache.get(key);
        if (value)
          return value;
        var sourceFile = getSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile);
        if (sourceFile && (ts2.isDeclarationFileName(fileName) || ts2.fileExtensionIs(fileName, ".json"))) {
          sourceFileCache.set(key, sourceFile);
        }
        return sourceFile;
      } : void 0;
      host.fileExists = function(fileName) {
        var key = toPath(fileName);
        var value = fileExistsCache.get(key);
        if (value !== void 0)
          return value;
        var newValue = originalFileExists.call(host, fileName);
        fileExistsCache.set(key, !!newValue);
        return newValue;
      };
      if (originalWriteFile) {
        host.writeFile = function(fileName, data, writeByteOrderMark, onError, sourceFiles) {
          var key = toPath(fileName);
          fileExistsCache.delete(key);
          var value = readFileCache.get(key);
          if (value !== void 0 && value !== data) {
            readFileCache.delete(key);
            sourceFileCache.delete(key);
          } else if (getSourceFileWithCache) {
            var sourceFile = sourceFileCache.get(key);
            if (sourceFile && sourceFile.text !== data) {
              sourceFileCache.delete(key);
            }
          }
          originalWriteFile.call(host, fileName, data, writeByteOrderMark, onError, sourceFiles);
        };
      }
      if (originalDirectoryExists && originalCreateDirectory) {
        host.directoryExists = function(directory) {
          var key = toPath(directory);
          var value = directoryExistsCache.get(key);
          if (value !== void 0)
            return value;
          var newValue = originalDirectoryExists.call(host, directory);
          directoryExistsCache.set(key, !!newValue);
          return newValue;
        };
        host.createDirectory = function(directory) {
          var key = toPath(directory);
          directoryExistsCache.delete(key);
          originalCreateDirectory.call(host, directory);
        };
      }
      return {
        originalReadFile,
        originalFileExists,
        originalDirectoryExists,
        originalCreateDirectory,
        originalWriteFile,
        getSourceFileWithCache,
        readFileWithCache
      };
    }
    ts2.changeCompilerHostLikeToUseCache = changeCompilerHostLikeToUseCache;
    function getPreEmitDiagnostics(program, sourceFile, cancellationToken) {
      var diagnostics;
      diagnostics = ts2.addRange(diagnostics, program.getConfigFileParsingDiagnostics());
      diagnostics = ts2.addRange(diagnostics, program.getOptionsDiagnostics(cancellationToken));
      diagnostics = ts2.addRange(diagnostics, program.getSyntacticDiagnostics(sourceFile, cancellationToken));
      diagnostics = ts2.addRange(diagnostics, program.getGlobalDiagnostics(cancellationToken));
      diagnostics = ts2.addRange(diagnostics, program.getSemanticDiagnostics(sourceFile, cancellationToken));
      if (ts2.getEmitDeclarations(program.getCompilerOptions())) {
        diagnostics = ts2.addRange(diagnostics, program.getDeclarationDiagnostics(sourceFile, cancellationToken));
      }
      return ts2.sortAndDeduplicateDiagnostics(diagnostics || ts2.emptyArray);
    }
    ts2.getPreEmitDiagnostics = getPreEmitDiagnostics;
    function formatDiagnostics(diagnostics, host) {
      var output = "";
      for (var _i = 0, diagnostics_3 = diagnostics; _i < diagnostics_3.length; _i++) {
        var diagnostic = diagnostics_3[_i];
        output += formatDiagnostic(diagnostic, host);
      }
      return output;
    }
    ts2.formatDiagnostics = formatDiagnostics;
    function formatDiagnostic(diagnostic, host) {
      var errorMessage = "".concat(ts2.diagnosticCategoryName(diagnostic), " TS").concat(diagnostic.code, ": ").concat(flattenDiagnosticMessageText2(diagnostic.messageText, host.getNewLine())).concat(host.getNewLine());
      if (diagnostic.file) {
        var _a = ts2.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character;
        var fileName = diagnostic.file.fileName;
        var relativeFileName = ts2.convertToRelativePath(fileName, host.getCurrentDirectory(), function(fileName2) {
          return host.getCanonicalFileName(fileName2);
        });
        return "".concat(relativeFileName, "(").concat(line + 1, ",").concat(character + 1, "): ") + errorMessage;
      }
      return errorMessage;
    }
    ts2.formatDiagnostic = formatDiagnostic;
    var ForegroundColorEscapeSequences;
    (function(ForegroundColorEscapeSequences2) {
      ForegroundColorEscapeSequences2["Grey"] = "\x1B[90m";
      ForegroundColorEscapeSequences2["Red"] = "\x1B[91m";
      ForegroundColorEscapeSequences2["Yellow"] = "\x1B[93m";
      ForegroundColorEscapeSequences2["Blue"] = "\x1B[94m";
      ForegroundColorEscapeSequences2["Cyan"] = "\x1B[96m";
    })(ForegroundColorEscapeSequences = ts2.ForegroundColorEscapeSequences || (ts2.ForegroundColorEscapeSequences = {}));
    var gutterStyleSequence = "\x1B[7m";
    var gutterSeparator = " ";
    var resetEscapeSequence = "\x1B[0m";
    var ellipsis = "...";
    var halfIndent = "  ";
    var indent = "    ";
    function getCategoryFormat(category) {
      switch (category) {
        case ts2.DiagnosticCategory.Error:
          return ForegroundColorEscapeSequences.Red;
        case ts2.DiagnosticCategory.Warning:
          return ForegroundColorEscapeSequences.Yellow;
        case ts2.DiagnosticCategory.Suggestion:
          return ts2.Debug.fail("Should never get an Info diagnostic on the command line.");
        case ts2.DiagnosticCategory.Message:
          return ForegroundColorEscapeSequences.Blue;
      }
    }
    function formatColorAndReset(text, formatStyle) {
      return formatStyle + text + resetEscapeSequence;
    }
    ts2.formatColorAndReset = formatColorAndReset;
    function formatCodeSpan(file, start, length, indent2, squiggleColor, host) {
      var _a = ts2.getLineAndCharacterOfPosition(file, start), firstLine = _a.line, firstLineChar = _a.character;
      var _b = ts2.getLineAndCharacterOfPosition(file, start + length), lastLine = _b.line, lastLineChar = _b.character;
      var lastLineInFile = ts2.getLineAndCharacterOfPosition(file, file.text.length).line;
      var hasMoreThanFiveLines = lastLine - firstLine >= 4;
      var gutterWidth = (lastLine + 1 + "").length;
      if (hasMoreThanFiveLines) {
        gutterWidth = Math.max(ellipsis.length, gutterWidth);
      }
      var context = "";
      for (var i = firstLine; i <= lastLine; i++) {
        context += host.getNewLine();
        if (hasMoreThanFiveLines && firstLine + 1 < i && i < lastLine - 1) {
          context += indent2 + formatColorAndReset(ts2.padLeft(ellipsis, gutterWidth), gutterStyleSequence) + gutterSeparator + host.getNewLine();
          i = lastLine - 1;
        }
        var lineStart = ts2.getPositionOfLineAndCharacter(file, i, 0);
        var lineEnd = i < lastLineInFile ? ts2.getPositionOfLineAndCharacter(file, i + 1, 0) : file.text.length;
        var lineContent = file.text.slice(lineStart, lineEnd);
        lineContent = ts2.trimStringEnd(lineContent);
        lineContent = lineContent.replace(/\t/g, " ");
        context += indent2 + formatColorAndReset(ts2.padLeft(i + 1 + "", gutterWidth), gutterStyleSequence) + gutterSeparator;
        context += lineContent + host.getNewLine();
        context += indent2 + formatColorAndReset(ts2.padLeft("", gutterWidth), gutterStyleSequence) + gutterSeparator;
        context += squiggleColor;
        if (i === firstLine) {
          var lastCharForLine = i === lastLine ? lastLineChar : void 0;
          context += lineContent.slice(0, firstLineChar).replace(/\S/g, " ");
          context += lineContent.slice(firstLineChar, lastCharForLine).replace(/./g, "~");
        } else if (i === lastLine) {
          context += lineContent.slice(0, lastLineChar).replace(/./g, "~");
        } else {
          context += lineContent.replace(/./g, "~");
        }
        context += resetEscapeSequence;
      }
      return context;
    }
    function formatLocation(file, start, host, color) {
      if (color === void 0) {
        color = formatColorAndReset;
      }
      var _a = ts2.getLineAndCharacterOfPosition(file, start), firstLine = _a.line, firstLineChar = _a.character;
      var relativeFileName = host ? ts2.convertToRelativePath(file.fileName, host.getCurrentDirectory(), function(fileName) {
        return host.getCanonicalFileName(fileName);
      }) : file.fileName;
      var output = "";
      output += color(relativeFileName, ForegroundColorEscapeSequences.Cyan);
      output += ":";
      output += color("".concat(firstLine + 1), ForegroundColorEscapeSequences.Yellow);
      output += ":";
      output += color("".concat(firstLineChar + 1), ForegroundColorEscapeSequences.Yellow);
      return output;
    }
    ts2.formatLocation = formatLocation;
    function formatDiagnosticsWithColorAndContext(diagnostics, host) {
      var output = "";
      for (var _i = 0, diagnostics_4 = diagnostics; _i < diagnostics_4.length; _i++) {
        var diagnostic = diagnostics_4[_i];
        if (diagnostic.file) {
          var file = diagnostic.file, start = diagnostic.start;
          output += formatLocation(file, start, host);
          output += " - ";
        }
        output += formatColorAndReset(ts2.diagnosticCategoryName(diagnostic), getCategoryFormat(diagnostic.category));
        output += formatColorAndReset(" TS".concat(diagnostic.code, ": "), ForegroundColorEscapeSequences.Grey);
        output += flattenDiagnosticMessageText2(diagnostic.messageText, host.getNewLine());
        if (diagnostic.file) {
          output += host.getNewLine();
          output += formatCodeSpan(diagnostic.file, diagnostic.start, diagnostic.length, "", getCategoryFormat(diagnostic.category), host);
        }
        if (diagnostic.relatedInformation) {
          output += host.getNewLine();
          for (var _a = 0, _b = diagnostic.relatedInformation; _a < _b.length; _a++) {
            var _c = _b[_a], file = _c.file, start = _c.start, length_9 = _c.length, messageText = _c.messageText;
            if (file) {
              output += host.getNewLine();
              output += halfIndent + formatLocation(file, start, host);
              output += formatCodeSpan(file, start, length_9, indent, ForegroundColorEscapeSequences.Cyan, host);
            }
            output += host.getNewLine();
            output += indent + flattenDiagnosticMessageText2(messageText, host.getNewLine());
          }
        }
        output += host.getNewLine();
      }
      return output;
    }
    ts2.formatDiagnosticsWithColorAndContext = formatDiagnosticsWithColorAndContext;
    function flattenDiagnosticMessageText2(diag, newLine, indent2) {
      if (indent2 === void 0) {
        indent2 = 0;
      }
      if (ts2.isString(diag)) {
        return diag;
      } else if (diag === void 0) {
        return "";
      }
      var result = "";
      if (indent2) {
        result += newLine;
        for (var i = 0; i < indent2; i++) {
          result += "  ";
        }
      }
      result += diag.messageText;
      indent2++;
      if (diag.next) {
        for (var _i = 0, _a = diag.next; _i < _a.length; _i++) {
          var kid = _a[_i];
          result += flattenDiagnosticMessageText2(kid, newLine, indent2);
        }
      }
      return result;
    }
    ts2.flattenDiagnosticMessageText = flattenDiagnosticMessageText2;
    function loadWithLocalCache(names, containingFile, redirectedReference, loader) {
      if (names.length === 0) {
        return [];
      }
      var resolutions = [];
      var cache = new ts2.Map();
      for (var _i = 0, names_2 = names; _i < names_2.length; _i++) {
        var name = names_2[_i];
        var result = void 0;
        if (cache.has(name)) {
          result = cache.get(name);
        } else {
          cache.set(name, result = loader(name, containingFile, redirectedReference));
        }
        resolutions.push(result);
      }
      return resolutions;
    }
    ts2.loadWithLocalCache = loadWithLocalCache;
    ;
    function getModeForResolutionAtIndex(file, index) {
      if (file.impliedNodeFormat === void 0)
        return void 0;
      return getModeForUsageLocation(file, getModuleNameStringLiteralAt(file, index));
    }
    ts2.getModeForResolutionAtIndex = getModeForResolutionAtIndex;
    function getModeForUsageLocation(file, usage) {
      var _a;
      if (file.impliedNodeFormat === void 0)
        return void 0;
      if (file.impliedNodeFormat !== ts2.ModuleKind.ESNext) {
        return ts2.isImportCall(ts2.walkUpParenthesizedExpressions(usage.parent)) ? ts2.ModuleKind.ESNext : ts2.ModuleKind.CommonJS;
      }
      var exprParentParent = (_a = ts2.walkUpParenthesizedExpressions(usage.parent)) === null || _a === void 0 ? void 0 : _a.parent;
      return exprParentParent && ts2.isImportEqualsDeclaration(exprParentParent) ? ts2.ModuleKind.CommonJS : ts2.ModuleKind.ESNext;
    }
    ts2.getModeForUsageLocation = getModeForUsageLocation;
    function loadWithModeAwareCache(names, containingFile, containingFileName, redirectedReference, loader) {
      if (names.length === 0) {
        return [];
      }
      var resolutions = [];
      var cache = new ts2.Map();
      var i = 0;
      for (var _i = 0, names_3 = names; _i < names_3.length; _i++) {
        var name = names_3[_i];
        var result = void 0;
        var mode = getModeForResolutionAtIndex(containingFile, i);
        i++;
        var cacheKey = mode !== void 0 ? "".concat(mode, "|").concat(name) : name;
        if (cache.has(cacheKey)) {
          result = cache.get(cacheKey);
        } else {
          cache.set(cacheKey, result = loader(name, mode, containingFileName, redirectedReference));
        }
        resolutions.push(result);
      }
      return resolutions;
    }
    ts2.loadWithModeAwareCache = loadWithModeAwareCache;
    function forEachResolvedProjectReference(resolvedProjectReferences, cb) {
      return forEachProjectReference(void 0, resolvedProjectReferences, function(resolvedRef, parent) {
        return resolvedRef && cb(resolvedRef, parent);
      });
    }
    ts2.forEachResolvedProjectReference = forEachResolvedProjectReference;
    function forEachProjectReference(projectReferences, resolvedProjectReferences, cbResolvedRef, cbRef) {
      var seenResolvedRefs;
      return worker(projectReferences, resolvedProjectReferences, void 0);
      function worker(projectReferences2, resolvedProjectReferences2, parent) {
        if (cbRef) {
          var result = cbRef(projectReferences2, parent);
          if (result)
            return result;
        }
        return ts2.forEach(resolvedProjectReferences2, function(resolvedRef, index) {
          if (resolvedRef && (seenResolvedRefs === null || seenResolvedRefs === void 0 ? void 0 : seenResolvedRefs.has(resolvedRef.sourceFile.path))) {
            return void 0;
          }
          var result2 = cbResolvedRef(resolvedRef, parent, index);
          if (result2 || !resolvedRef)
            return result2;
          (seenResolvedRefs || (seenResolvedRefs = new ts2.Set())).add(resolvedRef.sourceFile.path);
          return worker(resolvedRef.commandLine.projectReferences, resolvedRef.references, resolvedRef);
        });
      }
    }
    ts2.inferredTypesContainingFile = "__inferred type names__.ts";
    function isReferencedFile(reason) {
      switch (reason === null || reason === void 0 ? void 0 : reason.kind) {
        case ts2.FileIncludeKind.Import:
        case ts2.FileIncludeKind.ReferenceFile:
        case ts2.FileIncludeKind.TypeReferenceDirective:
        case ts2.FileIncludeKind.LibReferenceDirective:
          return true;
        default:
          return false;
      }
    }
    ts2.isReferencedFile = isReferencedFile;
    function isReferenceFileLocation(location) {
      return location.pos !== void 0;
    }
    ts2.isReferenceFileLocation = isReferenceFileLocation;
    function getReferencedFileLocation(getSourceFileByPath, ref) {
      var _a, _b, _c;
      var _d, _e, _f, _g;
      var file = ts2.Debug.checkDefined(getSourceFileByPath(ref.file));
      var kind = ref.kind, index = ref.index;
      var pos, end, packageId;
      switch (kind) {
        case ts2.FileIncludeKind.Import:
          var importLiteral = getModuleNameStringLiteralAt(file, index);
          packageId = (_e = (_d = file.resolvedModules) === null || _d === void 0 ? void 0 : _d.get(importLiteral.text, getModeForResolutionAtIndex(file, index))) === null || _e === void 0 ? void 0 : _e.packageId;
          if (importLiteral.pos === -1)
            return { file, packageId, text: importLiteral.text };
          pos = ts2.skipTrivia(file.text, importLiteral.pos);
          end = importLiteral.end;
          break;
        case ts2.FileIncludeKind.ReferenceFile:
          _a = file.referencedFiles[index], pos = _a.pos, end = _a.end;
          break;
        case ts2.FileIncludeKind.TypeReferenceDirective:
          _b = file.typeReferenceDirectives[index], pos = _b.pos, end = _b.end;
          packageId = (_g = (_f = file.resolvedTypeReferenceDirectiveNames) === null || _f === void 0 ? void 0 : _f.get(ts2.toFileNameLowerCase(file.typeReferenceDirectives[index].fileName), file.impliedNodeFormat)) === null || _g === void 0 ? void 0 : _g.packageId;
          break;
        case ts2.FileIncludeKind.LibReferenceDirective:
          _c = file.libReferenceDirectives[index], pos = _c.pos, end = _c.end;
          break;
        default:
          return ts2.Debug.assertNever(kind);
      }
      return { file, pos, end, packageId };
    }
    ts2.getReferencedFileLocation = getReferencedFileLocation;
    function isProgramUptoDate(program, rootFileNames, newOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences) {
      if (!program || (hasChangedAutomaticTypeDirectiveNames === null || hasChangedAutomaticTypeDirectiveNames === void 0 ? void 0 : hasChangedAutomaticTypeDirectiveNames()))
        return false;
      if (!ts2.arrayIsEqualTo(program.getRootFileNames(), rootFileNames))
        return false;
      var seenResolvedRefs;
      if (!ts2.arrayIsEqualTo(program.getProjectReferences(), projectReferences, projectReferenceUptoDate))
        return false;
      if (program.getSourceFiles().some(sourceFileNotUptoDate))
        return false;
      if (program.getMissingFilePaths().some(fileExists))
        return false;
      var currentOptions = program.getCompilerOptions();
      if (!ts2.compareDataObjects(currentOptions, newOptions))
        return false;
      if (currentOptions.configFile && newOptions.configFile)
        return currentOptions.configFile.text === newOptions.configFile.text;
      return true;
      function sourceFileNotUptoDate(sourceFile) {
        return !sourceFileVersionUptoDate(sourceFile) || hasInvalidatedResolution(sourceFile.path);
      }
      function sourceFileVersionUptoDate(sourceFile) {
        return sourceFile.version === getSourceVersion(sourceFile.resolvedPath, sourceFile.fileName);
      }
      function projectReferenceUptoDate(oldRef, newRef, index) {
        return ts2.projectReferenceIsEqualTo(oldRef, newRef) && resolvedProjectReferenceUptoDate(program.getResolvedProjectReferences()[index], oldRef);
      }
      function resolvedProjectReferenceUptoDate(oldResolvedRef, oldRef) {
        if (oldResolvedRef) {
          if (ts2.contains(seenResolvedRefs, oldResolvedRef))
            return true;
          var refPath_1 = resolveProjectReferencePath(oldRef);
          var newParsedCommandLine = getParsedCommandLine(refPath_1);
          if (!newParsedCommandLine)
            return false;
          if (oldResolvedRef.commandLine.options.configFile !== newParsedCommandLine.options.configFile)
            return false;
          if (!ts2.arrayIsEqualTo(oldResolvedRef.commandLine.fileNames, newParsedCommandLine.fileNames))
            return false;
          (seenResolvedRefs || (seenResolvedRefs = [])).push(oldResolvedRef);
          return !ts2.forEach(oldResolvedRef.references, function(childResolvedRef, index) {
            return !resolvedProjectReferenceUptoDate(childResolvedRef, oldResolvedRef.commandLine.projectReferences[index]);
          });
        }
        var refPath = resolveProjectReferencePath(oldRef);
        return !getParsedCommandLine(refPath);
      }
    }
    ts2.isProgramUptoDate = isProgramUptoDate;
    function getConfigFileParsingDiagnostics(configFileParseResult) {
      return configFileParseResult.options.configFile ? __spreadArray(__spreadArray([], configFileParseResult.options.configFile.parseDiagnostics, true), configFileParseResult.errors, true) : configFileParseResult.errors;
    }
    ts2.getConfigFileParsingDiagnostics = getConfigFileParsingDiagnostics;
    function getImpliedNodeFormatForFile(fileName, packageJsonInfoCache, host, options) {
      switch (ts2.getEmitModuleResolutionKind(options)) {
        case ts2.ModuleResolutionKind.Node12:
        case ts2.ModuleResolutionKind.NodeNext:
          return ts2.fileExtensionIsOneOf(fileName, [".d.mts", ".mts", ".mjs"]) ? ts2.ModuleKind.ESNext : ts2.fileExtensionIsOneOf(fileName, [".d.cts", ".cts", ".cjs"]) ? ts2.ModuleKind.CommonJS : ts2.fileExtensionIsOneOf(fileName, [".d.ts", ".ts", ".tsx", ".js", ".jsx"]) ? lookupFromPackageJson() : void 0;
        default:
          return void 0;
      }
      function lookupFromPackageJson() {
        var scope = ts2.getPackageScopeForPath(fileName, packageJsonInfoCache, host, options);
        return (scope === null || scope === void 0 ? void 0 : scope.packageJsonContent.type) === "module" ? ts2.ModuleKind.ESNext : ts2.ModuleKind.CommonJS;
      }
    }
    ts2.getImpliedNodeFormatForFile = getImpliedNodeFormatForFile;
    function shouldProgramCreateNewSourceFiles(program, newOptions) {
      if (!program)
        return false;
      return ts2.optionsHaveChanges(program.getCompilerOptions(), newOptions, ts2.sourceFileAffectingCompilerOptions);
    }
    function createCreateProgramOptions(rootNames, options, host, oldProgram, configFileParsingDiagnostics) {
      return {
        rootNames,
        options,
        host,
        oldProgram,
        configFileParsingDiagnostics
      };
    }
    function createProgram(rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) {
      var _a, _b, _c, _d;
      var createProgramOptions = ts2.isArray(rootNamesOrOptions) ? createCreateProgramOptions(rootNamesOrOptions, _options, _host, _oldProgram, _configFileParsingDiagnostics) : rootNamesOrOptions;
      var rootNames = createProgramOptions.rootNames, options = createProgramOptions.options, configFileParsingDiagnostics = createProgramOptions.configFileParsingDiagnostics, projectReferences = createProgramOptions.projectReferences;
      var oldProgram = createProgramOptions.oldProgram;
      var processingDefaultLibFiles;
      var processingOtherFiles;
      var files;
      var symlinks;
      var commonSourceDirectory;
      var diagnosticsProducingTypeChecker;
      var noDiagnosticsTypeChecker;
      var classifiableNames;
      var ambientModuleNameToUnmodifiedFileName = new ts2.Map();
      var fileReasons = ts2.createMultiMap();
      var cachedBindAndCheckDiagnosticsForFile = {};
      var cachedDeclarationDiagnosticsForFile = {};
      var resolvedTypeReferenceDirectives = new ts2.Map();
      var fileProcessingDiagnostics;
      var maxNodeModuleJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 0;
      var currentNodeModulesDepth = 0;
      var modulesWithElidedImports = new ts2.Map();
      var sourceFilesFoundSearchingNodeModules = new ts2.Map();
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "createProgram", { configFilePath: options.configFilePath, rootDir: options.rootDir }, true);
      ts2.performance.mark("beforeProgram");
      var host = createProgramOptions.host || createCompilerHost(options);
      var configParsingHost = parseConfigHostFromCompilerHostLike(host);
      var skipDefaultLib = options.noLib;
      var getDefaultLibraryFileName = ts2.memoize(function() {
        return host.getDefaultLibFileName(options);
      });
      var defaultLibraryPath = host.getDefaultLibLocation ? host.getDefaultLibLocation() : ts2.getDirectoryPath(getDefaultLibraryFileName());
      var programDiagnostics = ts2.createDiagnosticCollection();
      var currentDirectory = host.getCurrentDirectory();
      var supportedExtensions = ts2.getSupportedExtensions(options);
      var supportedExtensionsWithJsonIfResolveJsonModule = ts2.getSupportedExtensionsWithJsonIfResolveJsonModule(options, supportedExtensions);
      var hasEmitBlockingDiagnostics = new ts2.Map();
      var _compilerOptionsObjectLiteralSyntax;
      var moduleResolutionCache;
      var typeReferenceDirectiveResolutionCache;
      var actualResolveModuleNamesWorker;
      var hasInvalidatedResolution = host.hasInvalidatedResolution || ts2.returnFalse;
      if (host.resolveModuleNames) {
        actualResolveModuleNamesWorker = function(moduleNames, containingFile, containingFileName, reusedNames, redirectedReference) {
          return host.resolveModuleNames(ts2.Debug.checkEachDefined(moduleNames), containingFileName, reusedNames, redirectedReference, options, containingFile).map(function(resolved) {
            if (!resolved || resolved.extension !== void 0) {
              return resolved;
            }
            var withExtension = ts2.clone(resolved);
            withExtension.extension = ts2.extensionFromPath(resolved.resolvedFileName);
            return withExtension;
          });
        };
        moduleResolutionCache = (_a = host.getModuleResolutionCache) === null || _a === void 0 ? void 0 : _a.call(host);
      } else {
        moduleResolutionCache = ts2.createModuleResolutionCache(currentDirectory, getCanonicalFileName, options);
        var loader_1 = function(moduleName, resolverMode, containingFileName, redirectedReference) {
          return ts2.resolveModuleName(moduleName, containingFileName, options, host, moduleResolutionCache, redirectedReference, resolverMode).resolvedModule;
        };
        actualResolveModuleNamesWorker = function(moduleNames, containingFile, containingFileName, _reusedNames, redirectedReference) {
          return loadWithModeAwareCache(ts2.Debug.checkEachDefined(moduleNames), containingFile, containingFileName, redirectedReference, loader_1);
        };
      }
      var actualResolveTypeReferenceDirectiveNamesWorker;
      if (host.resolveTypeReferenceDirectives) {
        actualResolveTypeReferenceDirectiveNamesWorker = function(typeDirectiveNames, containingFile, redirectedReference) {
          return host.resolveTypeReferenceDirectives(ts2.Debug.checkEachDefined(typeDirectiveNames), containingFile, redirectedReference, options);
        };
      } else {
        typeReferenceDirectiveResolutionCache = ts2.createTypeReferenceDirectiveResolutionCache(currentDirectory, getCanonicalFileName, void 0, moduleResolutionCache === null || moduleResolutionCache === void 0 ? void 0 : moduleResolutionCache.getPackageJsonInfoCache());
        var loader_2 = function(typesRef, containingFile, redirectedReference) {
          return ts2.resolveTypeReferenceDirective(typesRef, containingFile, options, host, redirectedReference, typeReferenceDirectiveResolutionCache).resolvedTypeReferenceDirective;
        };
        actualResolveTypeReferenceDirectiveNamesWorker = function(typeReferenceDirectiveNames, containingFile, redirectedReference) {
          return loadWithLocalCache(ts2.Debug.checkEachDefined(typeReferenceDirectiveNames), containingFile, redirectedReference, loader_2);
        };
      }
      var packageIdToSourceFile = new ts2.Map();
      var sourceFileToPackageName = new ts2.Map();
      var redirectTargetsMap = ts2.createMultiMap();
      var usesUriStyleNodeCoreModules = false;
      var filesByName = new ts2.Map();
      var missingFilePaths;
      var filesByNameIgnoreCase = host.useCaseSensitiveFileNames() ? new ts2.Map() : void 0;
      var resolvedProjectReferences;
      var projectReferenceRedirects;
      var mapFromFileToProjectReferenceRedirects;
      var mapFromToProjectReferenceRedirectSource;
      var useSourceOfProjectReferenceRedirect = !!((_b = host.useSourceOfProjectReferenceRedirect) === null || _b === void 0 ? void 0 : _b.call(host)) && !options.disableSourceOfProjectReferenceRedirect;
      var _e = updateHostForUseSourceOfProjectReferenceRedirect({
        compilerHost: host,
        getSymlinkCache,
        useSourceOfProjectReferenceRedirect,
        toPath,
        getResolvedProjectReferences,
        getSourceOfProjectReferenceRedirect,
        forEachResolvedProjectReference: forEachResolvedProjectReference2
      }), onProgramCreateComplete = _e.onProgramCreateComplete, fileExists = _e.fileExists, directoryExists = _e.directoryExists;
      var readFile = host.readFile.bind(host);
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "shouldProgramCreateNewSourceFiles", { hasOldProgram: !!oldProgram });
      var shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options);
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      var structureIsReused;
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "tryReuseStructureFromOldProgram", {});
      structureIsReused = tryReuseStructureFromOldProgram();
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      if (structureIsReused !== 2) {
        processingDefaultLibFiles = [];
        processingOtherFiles = [];
        if (projectReferences) {
          if (!resolvedProjectReferences) {
            resolvedProjectReferences = projectReferences.map(parseProjectReferenceConfigFile);
          }
          if (rootNames.length) {
            resolvedProjectReferences === null || resolvedProjectReferences === void 0 ? void 0 : resolvedProjectReferences.forEach(function(parsedRef, index) {
              if (!parsedRef)
                return;
              var out = ts2.outFile(parsedRef.commandLine.options);
              if (useSourceOfProjectReferenceRedirect) {
                if (out || ts2.getEmitModuleKind(parsedRef.commandLine.options) === ts2.ModuleKind.None) {
                  for (var _i2 = 0, _a2 = parsedRef.commandLine.fileNames; _i2 < _a2.length; _i2++) {
                    var fileName = _a2[_i2];
                    processProjectReferenceFile(fileName, { kind: ts2.FileIncludeKind.SourceFromProjectReference, index });
                  }
                }
              } else {
                if (out) {
                  processProjectReferenceFile(ts2.changeExtension(out, ".d.ts"), { kind: ts2.FileIncludeKind.OutputFromProjectReference, index });
                } else if (ts2.getEmitModuleKind(parsedRef.commandLine.options) === ts2.ModuleKind.None) {
                  var getCommonSourceDirectory_2 = ts2.memoize(function() {
                    return ts2.getCommonSourceDirectoryOfConfig(parsedRef.commandLine, !host.useCaseSensitiveFileNames());
                  });
                  for (var _b2 = 0, _c2 = parsedRef.commandLine.fileNames; _b2 < _c2.length; _b2++) {
                    var fileName = _c2[_b2];
                    if (!ts2.fileExtensionIs(fileName, ".d.ts") && !ts2.fileExtensionIs(fileName, ".json")) {
                      processProjectReferenceFile(ts2.getOutputDeclarationFileName(fileName, parsedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory_2), { kind: ts2.FileIncludeKind.OutputFromProjectReference, index });
                    }
                  }
                }
              }
            });
          }
        }
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "processRootFiles", { count: rootNames.length });
        ts2.forEach(rootNames, function(name, index) {
          return processRootFile(name, false, false, { kind: ts2.FileIncludeKind.RootFile, index });
        });
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        var typeReferences = rootNames.length ? ts2.getAutomaticTypeDirectiveNames(options, host) : ts2.emptyArray;
        if (typeReferences.length) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "processTypeReferences", { count: typeReferences.length });
          var containingDirectory = options.configFilePath ? ts2.getDirectoryPath(options.configFilePath) : host.getCurrentDirectory();
          var containingFilename = ts2.combinePaths(containingDirectory, ts2.inferredTypesContainingFile);
          var resolutions = resolveTypeReferenceDirectiveNamesWorker(typeReferences, containingFilename);
          for (var i = 0; i < typeReferences.length; i++) {
            processTypeReferenceDirective(typeReferences[i], resolutions[i], { kind: ts2.FileIncludeKind.AutomaticTypeDirectiveFile, typeReference: typeReferences[i], packageId: (_c = resolutions[i]) === null || _c === void 0 ? void 0 : _c.packageId });
          }
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        }
        if (rootNames.length && !skipDefaultLib) {
          var defaultLibraryFileName = getDefaultLibraryFileName();
          if (!options.lib && defaultLibraryFileName) {
            processRootFile(defaultLibraryFileName, true, false, { kind: ts2.FileIncludeKind.LibFile });
          } else {
            ts2.forEach(options.lib, function(libFileName, index) {
              processRootFile(pathForLibFile(libFileName), true, false, { kind: ts2.FileIncludeKind.LibFile, index });
            });
          }
        }
        missingFilePaths = ts2.arrayFrom(ts2.mapDefinedIterator(filesByName.entries(), function(_a2) {
          var path = _a2[0], file = _a2[1];
          return file === void 0 ? path : void 0;
        }));
        files = ts2.stableSort(processingDefaultLibFiles, compareDefaultLibFiles).concat(processingOtherFiles);
        processingDefaultLibFiles = void 0;
        processingOtherFiles = void 0;
      }
      ts2.Debug.assert(!!missingFilePaths);
      if (oldProgram && host.onReleaseOldSourceFile) {
        var oldSourceFiles = oldProgram.getSourceFiles();
        for (var _i = 0, oldSourceFiles_1 = oldSourceFiles; _i < oldSourceFiles_1.length; _i++) {
          var oldSourceFile = oldSourceFiles_1[_i];
          var newFile = getSourceFileByPath(oldSourceFile.resolvedPath);
          if (shouldCreateNewSourceFile || !newFile || oldSourceFile.resolvedPath === oldSourceFile.path && newFile.resolvedPath !== oldSourceFile.path) {
            host.onReleaseOldSourceFile(oldSourceFile, oldProgram.getCompilerOptions(), !!getSourceFileByPath(oldSourceFile.path));
          }
        }
        if (!host.getParsedCommandLine) {
          oldProgram.forEachResolvedProjectReference(function(resolvedProjectReference) {
            if (!getResolvedProjectReferenceByPath(resolvedProjectReference.sourceFile.path)) {
              host.onReleaseOldSourceFile(resolvedProjectReference.sourceFile, oldProgram.getCompilerOptions(), false);
            }
          });
        }
      }
      if (oldProgram && host.onReleaseParsedCommandLine) {
        forEachProjectReference(oldProgram.getProjectReferences(), oldProgram.getResolvedProjectReferences(), function(oldResolvedRef, parent, index) {
          var oldReference = (parent === null || parent === void 0 ? void 0 : parent.commandLine.projectReferences[index]) || oldProgram.getProjectReferences()[index];
          var oldRefPath = resolveProjectReferencePath(oldReference);
          if (!(projectReferenceRedirects === null || projectReferenceRedirects === void 0 ? void 0 : projectReferenceRedirects.has(toPath(oldRefPath)))) {
            host.onReleaseParsedCommandLine(oldRefPath, oldResolvedRef, oldProgram.getCompilerOptions());
          }
        });
      }
      typeReferenceDirectiveResolutionCache = void 0;
      oldProgram = void 0;
      var program = {
        getRootFileNames: function() {
          return rootNames;
        },
        getSourceFile,
        getSourceFileByPath,
        getSourceFiles: function() {
          return files;
        },
        getMissingFilePaths: function() {
          return missingFilePaths;
        },
        getModuleResolutionCache: function() {
          return moduleResolutionCache;
        },
        getFilesByNameMap: function() {
          return filesByName;
        },
        getCompilerOptions: function() {
          return options;
        },
        getSyntacticDiagnostics,
        getOptionsDiagnostics,
        getGlobalDiagnostics,
        getSemanticDiagnostics,
        getCachedSemanticDiagnostics,
        getSuggestionDiagnostics,
        getDeclarationDiagnostics,
        getBindAndCheckDiagnostics,
        getProgramDiagnostics,
        getTypeChecker,
        getClassifiableNames,
        getDiagnosticsProducingTypeChecker,
        getCommonSourceDirectory,
        emit,
        getCurrentDirectory: function() {
          return currentDirectory;
        },
        getNodeCount: function() {
          return getDiagnosticsProducingTypeChecker().getNodeCount();
        },
        getIdentifierCount: function() {
          return getDiagnosticsProducingTypeChecker().getIdentifierCount();
        },
        getSymbolCount: function() {
          return getDiagnosticsProducingTypeChecker().getSymbolCount();
        },
        getTypeCount: function() {
          return getDiagnosticsProducingTypeChecker().getTypeCount();
        },
        getInstantiationCount: function() {
          return getDiagnosticsProducingTypeChecker().getInstantiationCount();
        },
        getRelationCacheSizes: function() {
          return getDiagnosticsProducingTypeChecker().getRelationCacheSizes();
        },
        getFileProcessingDiagnostics: function() {
          return fileProcessingDiagnostics;
        },
        getResolvedTypeReferenceDirectives: function() {
          return resolvedTypeReferenceDirectives;
        },
        isSourceFileFromExternalLibrary,
        isSourceFileDefaultLibrary,
        dropDiagnosticsProducingTypeChecker,
        getSourceFileFromReference,
        getLibFileFromReference,
        sourceFileToPackageName,
        redirectTargetsMap,
        usesUriStyleNodeCoreModules,
        isEmittedFile,
        getConfigFileParsingDiagnostics: getConfigFileParsingDiagnostics2,
        getResolvedModuleWithFailedLookupLocationsFromCache,
        getProjectReferences,
        getResolvedProjectReferences,
        getProjectReferenceRedirect,
        getResolvedProjectReferenceToRedirect,
        getResolvedProjectReferenceByPath,
        forEachResolvedProjectReference: forEachResolvedProjectReference2,
        isSourceOfProjectReferenceRedirect,
        emitBuildInfo,
        fileExists,
        readFile,
        directoryExists,
        getSymlinkCache,
        realpath: (_d = host.realpath) === null || _d === void 0 ? void 0 : _d.bind(host),
        useCaseSensitiveFileNames: function() {
          return host.useCaseSensitiveFileNames();
        },
        getFileIncludeReasons: function() {
          return fileReasons;
        },
        structureIsReused
      };
      onProgramCreateComplete();
      fileProcessingDiagnostics === null || fileProcessingDiagnostics === void 0 ? void 0 : fileProcessingDiagnostics.forEach(function(diagnostic) {
        switch (diagnostic.kind) {
          case 1:
            return programDiagnostics.add(createDiagnosticExplainingFile(diagnostic.file && getSourceFileByPath(diagnostic.file), diagnostic.fileProcessingReason, diagnostic.diagnostic, diagnostic.args || ts2.emptyArray));
          case 0:
            var _a2 = getReferencedFileLocation(getSourceFileByPath, diagnostic.reason), file = _a2.file, pos = _a2.pos, end = _a2.end;
            return programDiagnostics.add(ts2.createFileDiagnostic.apply(void 0, __spreadArray([file, ts2.Debug.checkDefined(pos), ts2.Debug.checkDefined(end) - pos, diagnostic.diagnostic], diagnostic.args || ts2.emptyArray, false)));
          default:
            ts2.Debug.assertNever(diagnostic);
        }
      });
      verifyCompilerOptions();
      ts2.performance.mark("afterProgram");
      ts2.performance.measure("Program", "beforeProgram", "afterProgram");
      ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      return program;
      function resolveModuleNamesWorker(moduleNames, containingFile, reusedNames) {
        if (!moduleNames.length)
          return ts2.emptyArray;
        var containingFileName = ts2.getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory);
        var redirectedReference = getRedirectReferenceForResolution(containingFile);
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "resolveModuleNamesWorker", { containingFileName });
        ts2.performance.mark("beforeResolveModule");
        var result = actualResolveModuleNamesWorker(moduleNames, containingFile, containingFileName, reusedNames, redirectedReference);
        ts2.performance.mark("afterResolveModule");
        ts2.performance.measure("ResolveModule", "beforeResolveModule", "afterResolveModule");
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        return result;
      }
      function resolveTypeReferenceDirectiveNamesWorker(typeDirectiveNames, containingFile) {
        if (!typeDirectiveNames.length)
          return [];
        var containingFileName = !ts2.isString(containingFile) ? ts2.getNormalizedAbsolutePath(containingFile.originalFileName, currentDirectory) : containingFile;
        var redirectedReference = !ts2.isString(containingFile) ? getRedirectReferenceForResolution(containingFile) : void 0;
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "resolveTypeReferenceDirectiveNamesWorker", { containingFileName });
        ts2.performance.mark("beforeResolveTypeReference");
        var result = actualResolveTypeReferenceDirectiveNamesWorker(typeDirectiveNames, containingFileName, redirectedReference);
        ts2.performance.mark("afterResolveTypeReference");
        ts2.performance.measure("ResolveTypeReference", "beforeResolveTypeReference", "afterResolveTypeReference");
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        return result;
      }
      function getRedirectReferenceForResolution(file) {
        var redirect = getResolvedProjectReferenceToRedirect(file.originalFileName);
        if (redirect || !ts2.fileExtensionIsOneOf(file.originalFileName, [".d.ts", ".d.cts", ".d.mts"]))
          return redirect;
        var resultFromDts = getRedirectReferenceForResolutionFromSourceOfProject(file.path);
        if (resultFromDts)
          return resultFromDts;
        if (!host.realpath || !options.preserveSymlinks || !ts2.stringContains(file.originalFileName, ts2.nodeModulesPathPart))
          return void 0;
        var realDeclarationPath = toPath(host.realpath(file.originalFileName));
        return realDeclarationPath === file.path ? void 0 : getRedirectReferenceForResolutionFromSourceOfProject(realDeclarationPath);
      }
      function getRedirectReferenceForResolutionFromSourceOfProject(filePath) {
        var source = getSourceOfProjectReferenceRedirect(filePath);
        if (ts2.isString(source))
          return getResolvedProjectReferenceToRedirect(source);
        if (!source)
          return void 0;
        return forEachResolvedProjectReference2(function(resolvedRef) {
          var out = ts2.outFile(resolvedRef.commandLine.options);
          if (!out)
            return void 0;
          return toPath(out) === filePath ? resolvedRef : void 0;
        });
      }
      function compareDefaultLibFiles(a, b) {
        return ts2.compareValues(getDefaultLibFilePriority(a), getDefaultLibFilePriority(b));
      }
      function getDefaultLibFilePriority(a) {
        if (ts2.containsPath(defaultLibraryPath, a.fileName, false)) {
          var basename = ts2.getBaseFileName(a.fileName);
          if (basename === "lib.d.ts" || basename === "lib.es6.d.ts")
            return 0;
          var name = ts2.removeSuffix(ts2.removePrefix(basename, "lib."), ".d.ts");
          var index = ts2.libs.indexOf(name);
          if (index !== -1)
            return index + 1;
        }
        return ts2.libs.length + 2;
      }
      function getResolvedModuleWithFailedLookupLocationsFromCache(moduleName, containingFile, mode) {
        return moduleResolutionCache && ts2.resolveModuleNameFromCache(moduleName, containingFile, moduleResolutionCache, mode);
      }
      function toPath(fileName) {
        return ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
      }
      function getCommonSourceDirectory() {
        if (commonSourceDirectory === void 0) {
          var emittedFiles_1 = ts2.filter(files, function(file) {
            return ts2.sourceFileMayBeEmitted(file, program);
          });
          commonSourceDirectory = ts2.getCommonSourceDirectory(options, function() {
            return ts2.mapDefined(emittedFiles_1, function(file) {
              return file.isDeclarationFile ? void 0 : file.fileName;
            });
          }, currentDirectory, getCanonicalFileName, function(commonSourceDirectory2) {
            return checkSourceFilesBelongToPath(emittedFiles_1, commonSourceDirectory2);
          });
        }
        return commonSourceDirectory;
      }
      function getClassifiableNames() {
        var _a2;
        if (!classifiableNames) {
          getTypeChecker();
          classifiableNames = new ts2.Set();
          for (var _i2 = 0, files_3 = files; _i2 < files_3.length; _i2++) {
            var sourceFile = files_3[_i2];
            (_a2 = sourceFile.classifiableNames) === null || _a2 === void 0 ? void 0 : _a2.forEach(function(value) {
              return classifiableNames.add(value);
            });
          }
        }
        return classifiableNames;
      }
      function resolveModuleNamesReusingOldState(moduleNames, file) {
        if (structureIsReused === 0 && !file.ambientModuleNames.length) {
          return resolveModuleNamesWorker(moduleNames, file, void 0);
        }
        var oldSourceFile2 = oldProgram && oldProgram.getSourceFile(file.fileName);
        if (oldSourceFile2 !== file && file.resolvedModules) {
          var result_13 = [];
          var i2 = 0;
          for (var _i2 = 0, moduleNames_1 = moduleNames; _i2 < moduleNames_1.length; _i2++) {
            var moduleName = moduleNames_1[_i2];
            var resolvedModule = file.resolvedModules.get(moduleName, getModeForResolutionAtIndex(file, i2));
            i2++;
            result_13.push(resolvedModule);
          }
          return result_13;
        }
        var unknownModuleNames;
        var result;
        var reusedNames;
        var predictedToResolveToAmbientModuleMarker = {};
        for (var i2 = 0; i2 < moduleNames.length; i2++) {
          var moduleName = moduleNames[i2];
          if (file === oldSourceFile2 && !hasInvalidatedResolution(oldSourceFile2.path)) {
            var oldResolvedModule = ts2.getResolvedModule(oldSourceFile2, moduleName, getModeForResolutionAtIndex(oldSourceFile2, i2));
            if (oldResolvedModule) {
              if (ts2.isTraceEnabled(options, host)) {
                ts2.trace(host, oldResolvedModule.packageId ? ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2, moduleName, ts2.getNormalizedAbsolutePath(file.originalFileName, currentDirectory), oldResolvedModule.resolvedFileName, oldResolvedModule.packageId && ts2.packageIdToString(oldResolvedModule.packageId));
              }
              (result || (result = new Array(moduleNames.length)))[i2] = oldResolvedModule;
              (reusedNames || (reusedNames = [])).push(moduleName);
              continue;
            }
          }
          var resolvesToAmbientModuleInNonModifiedFile = false;
          if (ts2.contains(file.ambientModuleNames, moduleName)) {
            resolvesToAmbientModuleInNonModifiedFile = true;
            if (ts2.isTraceEnabled(options, host)) {
              ts2.trace(host, ts2.Diagnostics.Module_0_was_resolved_as_locally_declared_ambient_module_in_file_1, moduleName, ts2.getNormalizedAbsolutePath(file.originalFileName, currentDirectory));
            }
          } else {
            resolvesToAmbientModuleInNonModifiedFile = moduleNameResolvesToAmbientModuleInNonModifiedFile(moduleName, i2);
          }
          if (resolvesToAmbientModuleInNonModifiedFile) {
            (result || (result = new Array(moduleNames.length)))[i2] = predictedToResolveToAmbientModuleMarker;
          } else {
            (unknownModuleNames || (unknownModuleNames = [])).push(moduleName);
          }
        }
        var resolutions2 = unknownModuleNames && unknownModuleNames.length ? resolveModuleNamesWorker(unknownModuleNames, file, reusedNames) : ts2.emptyArray;
        if (!result) {
          ts2.Debug.assert(resolutions2.length === moduleNames.length);
          return resolutions2;
        }
        var j = 0;
        for (var i2 = 0; i2 < result.length; i2++) {
          if (result[i2]) {
            if (result[i2] === predictedToResolveToAmbientModuleMarker) {
              result[i2] = void 0;
            }
          } else {
            result[i2] = resolutions2[j];
            j++;
          }
        }
        ts2.Debug.assert(j === resolutions2.length);
        return result;
        function moduleNameResolvesToAmbientModuleInNonModifiedFile(moduleName2, index) {
          if (index >= ts2.length(oldSourceFile2 === null || oldSourceFile2 === void 0 ? void 0 : oldSourceFile2.imports) + ts2.length(oldSourceFile2 === null || oldSourceFile2 === void 0 ? void 0 : oldSourceFile2.moduleAugmentations))
            return false;
          var resolutionToFile = ts2.getResolvedModule(oldSourceFile2, moduleName2, oldSourceFile2 && getModeForResolutionAtIndex(oldSourceFile2, index));
          var resolvedFile = resolutionToFile && oldProgram.getSourceFile(resolutionToFile.resolvedFileName);
          if (resolutionToFile && resolvedFile) {
            return false;
          }
          var unmodifiedFile = ambientModuleNameToUnmodifiedFileName.get(moduleName2);
          if (!unmodifiedFile) {
            return false;
          }
          if (ts2.isTraceEnabled(options, host)) {
            ts2.trace(host, ts2.Diagnostics.Module_0_was_resolved_as_ambient_module_declared_in_1_since_this_file_was_not_modified, moduleName2, unmodifiedFile);
          }
          return true;
        }
      }
      function canReuseProjectReferences() {
        return !forEachProjectReference(oldProgram.getProjectReferences(), oldProgram.getResolvedProjectReferences(), function(oldResolvedRef, parent, index) {
          var newRef = (parent ? parent.commandLine.projectReferences : projectReferences)[index];
          var newResolvedRef = parseProjectReferenceConfigFile(newRef);
          if (oldResolvedRef) {
            return !newResolvedRef || newResolvedRef.sourceFile !== oldResolvedRef.sourceFile || !ts2.arrayIsEqualTo(oldResolvedRef.commandLine.fileNames, newResolvedRef.commandLine.fileNames);
          } else {
            return newResolvedRef !== void 0;
          }
        }, function(oldProjectReferences, parent) {
          var newReferences = parent ? getResolvedProjectReferenceByPath(parent.sourceFile.path).commandLine.projectReferences : projectReferences;
          return !ts2.arrayIsEqualTo(oldProjectReferences, newReferences, ts2.projectReferenceIsEqualTo);
        });
      }
      function tryReuseStructureFromOldProgram() {
        var _a2;
        if (!oldProgram) {
          return 0;
        }
        var oldOptions = oldProgram.getCompilerOptions();
        if (ts2.changesAffectModuleResolution(oldOptions, options)) {
          return 0;
        }
        var oldRootNames = oldProgram.getRootFileNames();
        if (!ts2.arrayIsEqualTo(oldRootNames, rootNames)) {
          return 0;
        }
        if (!canReuseProjectReferences()) {
          return 0;
        }
        if (projectReferences) {
          resolvedProjectReferences = projectReferences.map(parseProjectReferenceConfigFile);
        }
        var newSourceFiles = [];
        var modifiedSourceFiles = [];
        structureIsReused = 2;
        if (oldProgram.getMissingFilePaths().some(function(missingFilePath) {
          return host.fileExists(missingFilePath);
        })) {
          return 0;
        }
        var oldSourceFiles2 = oldProgram.getSourceFiles();
        var SeenPackageName;
        (function(SeenPackageName2) {
          SeenPackageName2[SeenPackageName2["Exists"] = 0] = "Exists";
          SeenPackageName2[SeenPackageName2["Modified"] = 1] = "Modified";
        })(SeenPackageName || (SeenPackageName = {}));
        var seenPackageNames = new ts2.Map();
        for (var _i2 = 0, oldSourceFiles_2 = oldSourceFiles2; _i2 < oldSourceFiles_2.length; _i2++) {
          var oldSourceFile2 = oldSourceFiles_2[_i2];
          var newSourceFile = host.getSourceFileByPath ? host.getSourceFileByPath(oldSourceFile2.fileName, oldSourceFile2.resolvedPath, ts2.getEmitScriptTarget(options), void 0, shouldCreateNewSourceFile) : host.getSourceFile(oldSourceFile2.fileName, ts2.getEmitScriptTarget(options), void 0, shouldCreateNewSourceFile);
          if (!newSourceFile) {
            return 0;
          }
          ts2.Debug.assert(!newSourceFile.redirectInfo, "Host should not return a redirect source file from `getSourceFile`");
          var fileChanged = void 0;
          if (oldSourceFile2.redirectInfo) {
            if (newSourceFile !== oldSourceFile2.redirectInfo.unredirected) {
              return 0;
            }
            fileChanged = false;
            newSourceFile = oldSourceFile2;
          } else if (oldProgram.redirectTargetsMap.has(oldSourceFile2.path)) {
            if (newSourceFile !== oldSourceFile2) {
              return 0;
            }
            fileChanged = false;
          } else {
            fileChanged = newSourceFile !== oldSourceFile2;
          }
          newSourceFile.path = oldSourceFile2.path;
          newSourceFile.originalFileName = oldSourceFile2.originalFileName;
          newSourceFile.resolvedPath = oldSourceFile2.resolvedPath;
          newSourceFile.fileName = oldSourceFile2.fileName;
          var packageName = oldProgram.sourceFileToPackageName.get(oldSourceFile2.path);
          if (packageName !== void 0) {
            var prevKind = seenPackageNames.get(packageName);
            var newKind = fileChanged ? 1 : 0;
            if (prevKind !== void 0 && newKind === 1 || prevKind === 1) {
              return 0;
            }
            seenPackageNames.set(packageName, newKind);
          }
          if (fileChanged) {
            if (!ts2.arrayIsEqualTo(oldSourceFile2.libReferenceDirectives, newSourceFile.libReferenceDirectives, fileReferenceIsEqualTo)) {
              structureIsReused = 1;
            }
            if (oldSourceFile2.hasNoDefaultLib !== newSourceFile.hasNoDefaultLib) {
              structureIsReused = 1;
            }
            if (!ts2.arrayIsEqualTo(oldSourceFile2.referencedFiles, newSourceFile.referencedFiles, fileReferenceIsEqualTo)) {
              structureIsReused = 1;
            }
            collectExternalModuleReferences(newSourceFile);
            if (!ts2.arrayIsEqualTo(oldSourceFile2.imports, newSourceFile.imports, moduleNameIsEqualTo)) {
              structureIsReused = 1;
            }
            if (!ts2.arrayIsEqualTo(oldSourceFile2.moduleAugmentations, newSourceFile.moduleAugmentations, moduleNameIsEqualTo)) {
              structureIsReused = 1;
            }
            if ((oldSourceFile2.flags & 3145728) !== (newSourceFile.flags & 3145728)) {
              structureIsReused = 1;
            }
            if (!ts2.arrayIsEqualTo(oldSourceFile2.typeReferenceDirectives, newSourceFile.typeReferenceDirectives, fileReferenceIsEqualTo)) {
              structureIsReused = 1;
            }
            modifiedSourceFiles.push({ oldFile: oldSourceFile2, newFile: newSourceFile });
          } else if (hasInvalidatedResolution(oldSourceFile2.path)) {
            structureIsReused = 1;
            modifiedSourceFiles.push({ oldFile: oldSourceFile2, newFile: newSourceFile });
          }
          newSourceFiles.push(newSourceFile);
        }
        if (structureIsReused !== 2) {
          return structureIsReused;
        }
        var modifiedFiles = modifiedSourceFiles.map(function(f) {
          return f.oldFile;
        });
        for (var _b2 = 0, oldSourceFiles_3 = oldSourceFiles2; _b2 < oldSourceFiles_3.length; _b2++) {
          var oldFile = oldSourceFiles_3[_b2];
          if (!ts2.contains(modifiedFiles, oldFile)) {
            for (var _c2 = 0, _d2 = oldFile.ambientModuleNames; _c2 < _d2.length; _c2++) {
              var moduleName = _d2[_c2];
              ambientModuleNameToUnmodifiedFileName.set(moduleName, oldFile.fileName);
            }
          }
        }
        for (var _e2 = 0, modifiedSourceFiles_1 = modifiedSourceFiles; _e2 < modifiedSourceFiles_1.length; _e2++) {
          var _f = modifiedSourceFiles_1[_e2], oldSourceFile2 = _f.oldFile, newSourceFile = _f.newFile;
          var moduleNames = getModuleNames(newSourceFile);
          var resolutions2 = resolveModuleNamesReusingOldState(moduleNames, newSourceFile);
          var resolutionsChanged = ts2.hasChangesInResolutions(moduleNames, resolutions2, oldSourceFile2.resolvedModules, oldSourceFile2, ts2.moduleResolutionIsEqualTo);
          if (resolutionsChanged) {
            structureIsReused = 1;
            newSourceFile.resolvedModules = ts2.zipToModeAwareCache(newSourceFile, moduleNames, resolutions2);
          } else {
            newSourceFile.resolvedModules = oldSourceFile2.resolvedModules;
          }
          var typesReferenceDirectives = ts2.map(newSourceFile.typeReferenceDirectives, function(ref) {
            return ts2.toFileNameLowerCase(ref.fileName);
          });
          var typeReferenceResolutions = resolveTypeReferenceDirectiveNamesWorker(typesReferenceDirectives, newSourceFile);
          var typeReferenceResolutionsChanged = ts2.hasChangesInResolutions(typesReferenceDirectives, typeReferenceResolutions, oldSourceFile2.resolvedTypeReferenceDirectiveNames, oldSourceFile2, ts2.typeDirectiveIsEqualTo);
          if (typeReferenceResolutionsChanged) {
            structureIsReused = 1;
            newSourceFile.resolvedTypeReferenceDirectiveNames = ts2.zipToModeAwareCache(newSourceFile, typesReferenceDirectives, typeReferenceResolutions);
          } else {
            newSourceFile.resolvedTypeReferenceDirectiveNames = oldSourceFile2.resolvedTypeReferenceDirectiveNames;
          }
        }
        if (structureIsReused !== 2) {
          return structureIsReused;
        }
        if (ts2.changesAffectingProgramStructure(oldOptions, options) || ((_a2 = host.hasChangedAutomaticTypeDirectiveNames) === null || _a2 === void 0 ? void 0 : _a2.call(host))) {
          return 1;
        }
        missingFilePaths = oldProgram.getMissingFilePaths();
        ts2.Debug.assert(newSourceFiles.length === oldProgram.getSourceFiles().length);
        for (var _g = 0, newSourceFiles_1 = newSourceFiles; _g < newSourceFiles_1.length; _g++) {
          var newSourceFile = newSourceFiles_1[_g];
          filesByName.set(newSourceFile.path, newSourceFile);
        }
        var oldFilesByNameMap = oldProgram.getFilesByNameMap();
        oldFilesByNameMap.forEach(function(oldFile2, path) {
          if (!oldFile2) {
            filesByName.set(path, oldFile2);
            return;
          }
          if (oldFile2.path === path) {
            if (oldProgram.isSourceFileFromExternalLibrary(oldFile2)) {
              sourceFilesFoundSearchingNodeModules.set(oldFile2.path, true);
            }
            return;
          }
          filesByName.set(path, filesByName.get(oldFile2.path));
        });
        files = newSourceFiles;
        fileReasons = oldProgram.getFileIncludeReasons();
        fileProcessingDiagnostics = oldProgram.getFileProcessingDiagnostics();
        resolvedTypeReferenceDirectives = oldProgram.getResolvedTypeReferenceDirectives();
        sourceFileToPackageName = oldProgram.sourceFileToPackageName;
        redirectTargetsMap = oldProgram.redirectTargetsMap;
        usesUriStyleNodeCoreModules = oldProgram.usesUriStyleNodeCoreModules;
        return 2;
      }
      function getEmitHost(writeFileCallback) {
        return {
          getPrependNodes,
          getCanonicalFileName,
          getCommonSourceDirectory: program.getCommonSourceDirectory,
          getCompilerOptions: program.getCompilerOptions,
          getCurrentDirectory: function() {
            return currentDirectory;
          },
          getNewLine: function() {
            return host.getNewLine();
          },
          getSourceFile: program.getSourceFile,
          getSourceFileByPath: program.getSourceFileByPath,
          getSourceFiles: program.getSourceFiles,
          getLibFileFromReference: program.getLibFileFromReference,
          isSourceFileFromExternalLibrary,
          getResolvedProjectReferenceToRedirect,
          getProjectReferenceRedirect,
          isSourceOfProjectReferenceRedirect,
          getSymlinkCache,
          writeFile: writeFileCallback || function(fileName, data, writeByteOrderMark, onError, sourceFiles) {
            return host.writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles);
          },
          isEmitBlocked,
          readFile: function(f) {
            return host.readFile(f);
          },
          fileExists: function(f) {
            var path = toPath(f);
            if (getSourceFileByPath(path))
              return true;
            if (ts2.contains(missingFilePaths, path))
              return false;
            return host.fileExists(f);
          },
          useCaseSensitiveFileNames: function() {
            return host.useCaseSensitiveFileNames();
          },
          getProgramBuildInfo: function() {
            return program.getProgramBuildInfo && program.getProgramBuildInfo();
          },
          getSourceFileFromReference: function(file, ref) {
            return program.getSourceFileFromReference(file, ref);
          },
          redirectTargetsMap,
          getFileIncludeReasons: program.getFileIncludeReasons
        };
      }
      function emitBuildInfo(writeFileCallback) {
        ts2.Debug.assert(!ts2.outFile(options));
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("emit", "emitBuildInfo", {}, true);
        ts2.performance.mark("beforeEmit");
        var emitResult = ts2.emitFiles(ts2.notImplementedResolver, getEmitHost(writeFileCallback), void 0, ts2.noTransformers, false, true);
        ts2.performance.mark("afterEmit");
        ts2.performance.measure("Emit", "beforeEmit", "afterEmit");
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        return emitResult;
      }
      function getResolvedProjectReferences() {
        return resolvedProjectReferences;
      }
      function getProjectReferences() {
        return projectReferences;
      }
      function getPrependNodes() {
        return createPrependNodes(projectReferences, function(_ref, index) {
          var _a2;
          return (_a2 = resolvedProjectReferences[index]) === null || _a2 === void 0 ? void 0 : _a2.commandLine;
        }, function(fileName) {
          var path = toPath(fileName);
          var sourceFile = getSourceFileByPath(path);
          return sourceFile ? sourceFile.text : filesByName.has(path) ? void 0 : host.readFile(path);
        });
      }
      function isSourceFileFromExternalLibrary(file) {
        return !!sourceFilesFoundSearchingNodeModules.get(file.path);
      }
      function isSourceFileDefaultLibrary(file) {
        if (file.hasNoDefaultLib) {
          return true;
        }
        if (!options.noLib) {
          return false;
        }
        var equalityComparer = host.useCaseSensitiveFileNames() ? ts2.equateStringsCaseSensitive : ts2.equateStringsCaseInsensitive;
        if (!options.lib) {
          return equalityComparer(file.fileName, getDefaultLibraryFileName());
        } else {
          return ts2.some(options.lib, function(libFileName) {
            return equalityComparer(file.fileName, pathForLibFile(libFileName));
          });
        }
      }
      function getDiagnosticsProducingTypeChecker() {
        return diagnosticsProducingTypeChecker || (diagnosticsProducingTypeChecker = ts2.createTypeChecker(program, true));
      }
      function dropDiagnosticsProducingTypeChecker() {
        diagnosticsProducingTypeChecker = void 0;
      }
      function getTypeChecker() {
        return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts2.createTypeChecker(program, false));
      }
      function emit(sourceFile, writeFileCallback, cancellationToken, emitOnlyDtsFiles, transformers, forceDtsEmit) {
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("emit", "emit", { path: sourceFile === null || sourceFile === void 0 ? void 0 : sourceFile.path }, true);
        var result = runWithCancellationToken(function() {
          return emitWorker(program, sourceFile, writeFileCallback, cancellationToken, emitOnlyDtsFiles, transformers, forceDtsEmit);
        });
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        return result;
      }
      function isEmitBlocked(emitFileName) {
        return hasEmitBlockingDiagnostics.has(toPath(emitFileName));
      }
      function emitWorker(program2, sourceFile, writeFileCallback, cancellationToken, emitOnlyDtsFiles, customTransformers, forceDtsEmit) {
        if (!forceDtsEmit) {
          var result = handleNoEmitOptions(program2, sourceFile, writeFileCallback, cancellationToken);
          if (result)
            return result;
        }
        var emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver(ts2.outFile(options) ? void 0 : sourceFile, cancellationToken);
        ts2.performance.mark("beforeEmit");
        var emitResult = ts2.emitFiles(emitResolver, getEmitHost(writeFileCallback), sourceFile, ts2.getTransformers(options, customTransformers, emitOnlyDtsFiles), emitOnlyDtsFiles, false, forceDtsEmit);
        ts2.performance.mark("afterEmit");
        ts2.performance.measure("Emit", "beforeEmit", "afterEmit");
        return emitResult;
      }
      function getSourceFile(fileName) {
        return getSourceFileByPath(toPath(fileName));
      }
      function getSourceFileByPath(path) {
        return filesByName.get(path) || void 0;
      }
      function getDiagnosticsHelper(sourceFile, getDiagnostics, cancellationToken) {
        if (sourceFile) {
          return getDiagnostics(sourceFile, cancellationToken);
        }
        return ts2.sortAndDeduplicateDiagnostics(ts2.flatMap(program.getSourceFiles(), function(sourceFile2) {
          if (cancellationToken) {
            cancellationToken.throwIfCancellationRequested();
          }
          return getDiagnostics(sourceFile2, cancellationToken);
        }));
      }
      function getSyntacticDiagnostics(sourceFile, cancellationToken) {
        return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile, cancellationToken);
      }
      function getSemanticDiagnostics(sourceFile, cancellationToken) {
        return getDiagnosticsHelper(sourceFile, getSemanticDiagnosticsForFile, cancellationToken);
      }
      function getCachedSemanticDiagnostics(sourceFile) {
        var _a2;
        return sourceFile ? (_a2 = cachedBindAndCheckDiagnosticsForFile.perFile) === null || _a2 === void 0 ? void 0 : _a2.get(sourceFile.path) : cachedBindAndCheckDiagnosticsForFile.allDiagnostics;
      }
      function getBindAndCheckDiagnostics(sourceFile, cancellationToken) {
        return getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken);
      }
      function getProgramDiagnostics(sourceFile) {
        var _a2;
        if (ts2.skipTypeChecking(sourceFile, options, program)) {
          return ts2.emptyArray;
        }
        var programDiagnosticsInFile = programDiagnostics.getDiagnostics(sourceFile.fileName);
        if (!((_a2 = sourceFile.commentDirectives) === null || _a2 === void 0 ? void 0 : _a2.length)) {
          return programDiagnosticsInFile;
        }
        return getDiagnosticsWithPrecedingDirectives(sourceFile, sourceFile.commentDirectives, programDiagnosticsInFile).diagnostics;
      }
      function getDeclarationDiagnostics(sourceFile, cancellationToken) {
        var options2 = program.getCompilerOptions();
        if (!sourceFile || ts2.outFile(options2)) {
          return getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
        } else {
          return getDiagnosticsHelper(sourceFile, getDeclarationDiagnosticsForFile, cancellationToken);
        }
      }
      function getSyntacticDiagnosticsForFile(sourceFile) {
        if (ts2.isSourceFileJS(sourceFile)) {
          if (!sourceFile.additionalSyntacticDiagnostics) {
            sourceFile.additionalSyntacticDiagnostics = getJSSyntacticDiagnosticsForFile(sourceFile);
          }
          return ts2.concatenate(sourceFile.additionalSyntacticDiagnostics, sourceFile.parseDiagnostics);
        }
        return sourceFile.parseDiagnostics;
      }
      function runWithCancellationToken(func) {
        try {
          return func();
        } catch (e) {
          if (e instanceof ts2.OperationCanceledException) {
            noDiagnosticsTypeChecker = void 0;
            diagnosticsProducingTypeChecker = void 0;
          }
          throw e;
        }
      }
      function getSemanticDiagnosticsForFile(sourceFile, cancellationToken) {
        return ts2.concatenate(filterSemanticDiagnostics(getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken), options), getProgramDiagnostics(sourceFile));
      }
      function getBindAndCheckDiagnosticsForFile(sourceFile, cancellationToken) {
        return getAndCacheDiagnostics(sourceFile, cancellationToken, cachedBindAndCheckDiagnosticsForFile, getBindAndCheckDiagnosticsForFileNoCache);
      }
      function getBindAndCheckDiagnosticsForFileNoCache(sourceFile, cancellationToken) {
        return runWithCancellationToken(function() {
          if (ts2.skipTypeChecking(sourceFile, options, program)) {
            return ts2.emptyArray;
          }
          var typeChecker = getDiagnosticsProducingTypeChecker();
          ts2.Debug.assert(!!sourceFile.bindDiagnostics);
          var isCheckJs = ts2.isCheckJsEnabledForFile(sourceFile, options);
          var isTsNoCheck = !!sourceFile.checkJsDirective && sourceFile.checkJsDirective.enabled === false;
          var includeBindAndCheckDiagnostics = !isTsNoCheck && (sourceFile.scriptKind === 3 || sourceFile.scriptKind === 4 || sourceFile.scriptKind === 5 || isCheckJs || sourceFile.scriptKind === 7);
          var bindDiagnostics = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : ts2.emptyArray;
          var checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : ts2.emptyArray;
          return getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics, bindDiagnostics, checkDiagnostics, isCheckJs ? sourceFile.jsDocDiagnostics : void 0);
        });
      }
      function getMergedBindAndCheckDiagnostics(sourceFile, includeBindAndCheckDiagnostics) {
        var _a2;
        var allDiagnostics = [];
        for (var _i2 = 2; _i2 < arguments.length; _i2++) {
          allDiagnostics[_i2 - 2] = arguments[_i2];
        }
        var flatDiagnostics = ts2.flatten(allDiagnostics);
        if (!includeBindAndCheckDiagnostics || !((_a2 = sourceFile.commentDirectives) === null || _a2 === void 0 ? void 0 : _a2.length)) {
          return flatDiagnostics;
        }
        var _b2 = getDiagnosticsWithPrecedingDirectives(sourceFile, sourceFile.commentDirectives, flatDiagnostics), diagnostics = _b2.diagnostics, directives = _b2.directives;
        for (var _c2 = 0, _d2 = directives.getUnusedExpectations(); _c2 < _d2.length; _c2++) {
          var errorExpectation = _d2[_c2];
          diagnostics.push(ts2.createDiagnosticForRange(sourceFile, errorExpectation.range, ts2.Diagnostics.Unused_ts_expect_error_directive));
        }
        return diagnostics;
      }
      function getDiagnosticsWithPrecedingDirectives(sourceFile, commentDirectives, flatDiagnostics) {
        var directives = ts2.createCommentDirectivesMap(sourceFile, commentDirectives);
        var diagnostics = flatDiagnostics.filter(function(diagnostic) {
          return markPrecedingCommentDirectiveLine(diagnostic, directives) === -1;
        });
        return { diagnostics, directives };
      }
      function getSuggestionDiagnostics(sourceFile, cancellationToken) {
        return runWithCancellationToken(function() {
          return getDiagnosticsProducingTypeChecker().getSuggestionDiagnostics(sourceFile, cancellationToken);
        });
      }
      function markPrecedingCommentDirectiveLine(diagnostic, directives) {
        var file = diagnostic.file, start = diagnostic.start;
        if (!file) {
          return -1;
        }
        var lineStarts = ts2.getLineStarts(file);
        var line = ts2.computeLineAndCharacterOfPosition(lineStarts, start).line - 1;
        while (line >= 0) {
          if (directives.markUsed(line)) {
            return line;
          }
          var lineText = file.text.slice(lineStarts[line], lineStarts[line + 1]).trim();
          if (lineText !== "" && !/^(\s*)\/\/(.*)$/.test(lineText)) {
            return -1;
          }
          line--;
        }
        return -1;
      }
      function getJSSyntacticDiagnosticsForFile(sourceFile) {
        return runWithCancellationToken(function() {
          var diagnostics = [];
          walk(sourceFile, sourceFile);
          ts2.forEachChildRecursively(sourceFile, walk, walkArray);
          return diagnostics;
          function walk(node, parent) {
            switch (parent.kind) {
              case 163:
              case 166:
              case 168:
                if (parent.questionToken === node) {
                  diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, "?"));
                  return "skip";
                }
              case 167:
              case 170:
              case 171:
              case 172:
              case 212:
              case 255:
              case 213:
              case 253:
                if (parent.type === node) {
                  diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Type_annotations_can_only_be_used_in_TypeScript_files));
                  return "skip";
                }
            }
            switch (node.kind) {
              case 266:
                if (node.isTypeOnly) {
                  diagnostics.push(createDiagnosticForNode(parent, ts2.Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "import type"));
                  return "skip";
                }
                break;
              case 271:
                if (node.isTypeOnly) {
                  diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, "export type"));
                  return "skip";
                }
                break;
              case 264:
                diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.import_can_only_be_used_in_TypeScript_files));
                return "skip";
              case 270:
                if (node.isExportEquals) {
                  diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.export_can_only_be_used_in_TypeScript_files));
                  return "skip";
                }
                break;
              case 290:
                var heritageClause = node;
                if (heritageClause.token === 117) {
                  diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.implements_clauses_can_only_be_used_in_TypeScript_files));
                  return "skip";
                }
                break;
              case 257:
                var interfaceKeyword = ts2.tokenToString(118);
                ts2.Debug.assertIsDefined(interfaceKeyword);
                diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, interfaceKeyword));
                return "skip";
              case 260:
                var moduleKeyword = node.flags & 16 ? ts2.tokenToString(142) : ts2.tokenToString(141);
                ts2.Debug.assertIsDefined(moduleKeyword);
                diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, moduleKeyword));
                return "skip";
              case 258:
                diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Type_aliases_can_only_be_used_in_TypeScript_files));
                return "skip";
              case 259:
                var enumKeyword = ts2.Debug.checkDefined(ts2.tokenToString(92));
                diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics._0_declarations_can_only_be_used_in_TypeScript_files, enumKeyword));
                return "skip";
              case 229:
                diagnostics.push(createDiagnosticForNode(node, ts2.Diagnostics.Non_null_assertions_can_only_be_used_in_TypeScript_files));
                return "skip";
              case 228:
                diagnostics.push(createDiagnosticForNode(node.type, ts2.Diagnostics.Type_assertion_expressions_can_only_be_used_in_TypeScript_files));
                return "skip";
              case 210:
                ts2.Debug.fail();
            }
          }
          function walkArray(nodes, parent) {
            if (parent.decorators === nodes && !options.experimentalDecorators) {
              diagnostics.push(createDiagnosticForNode(parent, ts2.Diagnostics.Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_in_your_tsconfig_or_jsconfig_to_remove_this_warning));
            }
            switch (parent.kind) {
              case 256:
              case 225:
              case 168:
              case 170:
              case 171:
              case 172:
              case 212:
              case 255:
              case 213:
                if (nodes === parent.typeParameters) {
                  diagnostics.push(createDiagnosticForNodeArray(nodes, ts2.Diagnostics.Type_parameter_declarations_can_only_be_used_in_TypeScript_files));
                  return "skip";
                }
              case 236:
                if (nodes === parent.modifiers) {
                  checkModifiers(parent.modifiers, parent.kind === 236);
                  return "skip";
                }
                break;
              case 166:
                if (nodes === parent.modifiers) {
                  for (var _i2 = 0, _a2 = nodes; _i2 < _a2.length; _i2++) {
                    var modifier = _a2[_i2];
                    if (modifier.kind !== 124) {
                      diagnostics.push(createDiagnosticForNode(modifier, ts2.Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, ts2.tokenToString(modifier.kind)));
                    }
                  }
                  return "skip";
                }
                break;
              case 163:
                if (nodes === parent.modifiers) {
                  diagnostics.push(createDiagnosticForNodeArray(nodes, ts2.Diagnostics.Parameter_modifiers_can_only_be_used_in_TypeScript_files));
                  return "skip";
                }
                break;
              case 207:
              case 208:
              case 227:
              case 278:
              case 279:
              case 209:
                if (nodes === parent.typeArguments) {
                  diagnostics.push(createDiagnosticForNodeArray(nodes, ts2.Diagnostics.Type_arguments_can_only_be_used_in_TypeScript_files));
                  return "skip";
                }
                break;
            }
          }
          function checkModifiers(modifiers, isConstValid) {
            for (var _i2 = 0, modifiers_2 = modifiers; _i2 < modifiers_2.length; _i2++) {
              var modifier = modifiers_2[_i2];
              switch (modifier.kind) {
                case 85:
                  if (isConstValid) {
                    continue;
                  }
                case 123:
                case 121:
                case 122:
                case 144:
                case 135:
                case 126:
                case 158:
                  diagnostics.push(createDiagnosticForNode(modifier, ts2.Diagnostics.The_0_modifier_can_only_be_used_in_TypeScript_files, ts2.tokenToString(modifier.kind)));
                  break;
                case 124:
                case 93:
                case 88:
              }
            }
          }
          function createDiagnosticForNodeArray(nodes, message, arg0, arg1, arg2) {
            var start = nodes.pos;
            return ts2.createFileDiagnostic(sourceFile, start, nodes.end - start, message, arg0, arg1, arg2);
          }
          function createDiagnosticForNode(node, message, arg0, arg1, arg2) {
            return ts2.createDiagnosticForNodeInSourceFile(sourceFile, node, message, arg0, arg1, arg2);
          }
        });
      }
      function getDeclarationDiagnosticsWorker(sourceFile, cancellationToken) {
        return getAndCacheDiagnostics(sourceFile, cancellationToken, cachedDeclarationDiagnosticsForFile, getDeclarationDiagnosticsForFileNoCache);
      }
      function getDeclarationDiagnosticsForFileNoCache(sourceFile, cancellationToken) {
        return runWithCancellationToken(function() {
          var resolver = getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile, cancellationToken);
          return ts2.getDeclarationDiagnostics(getEmitHost(ts2.noop), resolver, sourceFile) || ts2.emptyArray;
        });
      }
      function getAndCacheDiagnostics(sourceFile, cancellationToken, cache, getDiagnostics) {
        var _a2;
        var cachedResult = sourceFile ? (_a2 = cache.perFile) === null || _a2 === void 0 ? void 0 : _a2.get(sourceFile.path) : cache.allDiagnostics;
        if (cachedResult) {
          return cachedResult;
        }
        var result = getDiagnostics(sourceFile, cancellationToken);
        if (sourceFile) {
          (cache.perFile || (cache.perFile = new ts2.Map())).set(sourceFile.path, result);
        } else {
          cache.allDiagnostics = result;
        }
        return result;
      }
      function getDeclarationDiagnosticsForFile(sourceFile, cancellationToken) {
        return sourceFile.isDeclarationFile ? [] : getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
      }
      function getOptionsDiagnostics() {
        return ts2.sortAndDeduplicateDiagnostics(ts2.concatenate(programDiagnostics.getGlobalDiagnostics(), getOptionsDiagnosticsOfConfigFile()));
      }
      function getOptionsDiagnosticsOfConfigFile() {
        if (!options.configFile)
          return ts2.emptyArray;
        var diagnostics = programDiagnostics.getDiagnostics(options.configFile.fileName);
        forEachResolvedProjectReference2(function(resolvedRef) {
          diagnostics = ts2.concatenate(diagnostics, programDiagnostics.getDiagnostics(resolvedRef.sourceFile.fileName));
        });
        return diagnostics;
      }
      function getGlobalDiagnostics() {
        return rootNames.length ? ts2.sortAndDeduplicateDiagnostics(getDiagnosticsProducingTypeChecker().getGlobalDiagnostics().slice()) : ts2.emptyArray;
      }
      function getConfigFileParsingDiagnostics2() {
        return configFileParsingDiagnostics || ts2.emptyArray;
      }
      function processRootFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason) {
        processSourceFile(ts2.normalizePath(fileName), isDefaultLib, ignoreNoDefaultLib, void 0, reason);
      }
      function fileReferenceIsEqualTo(a, b) {
        return a.fileName === b.fileName;
      }
      function moduleNameIsEqualTo(a, b) {
        return a.kind === 79 ? b.kind === 79 && a.escapedText === b.escapedText : b.kind === 10 && a.text === b.text;
      }
      function createSyntheticImport(text, file) {
        var externalHelpersModuleReference = ts2.factory.createStringLiteral(text);
        var importDecl = ts2.factory.createImportDeclaration(void 0, void 0, void 0, externalHelpersModuleReference, void 0);
        ts2.addEmitFlags(importDecl, 67108864);
        ts2.setParent(externalHelpersModuleReference, importDecl);
        ts2.setParent(importDecl, file);
        externalHelpersModuleReference.flags &= ~8;
        importDecl.flags &= ~8;
        return externalHelpersModuleReference;
      }
      function collectExternalModuleReferences(file) {
        if (file.imports) {
          return;
        }
        var isJavaScriptFile = ts2.isSourceFileJS(file);
        var isExternalModuleFile = ts2.isExternalModule(file);
        var imports;
        var moduleAugmentations;
        var ambientModules;
        if ((options.isolatedModules || isExternalModuleFile) && !file.isDeclarationFile) {
          if (options.importHelpers) {
            imports = [createSyntheticImport(ts2.externalHelpersModuleNameText, file)];
          }
          var jsxImport = ts2.getJSXRuntimeImport(ts2.getJSXImplicitImportBase(options, file), options);
          if (jsxImport) {
            (imports || (imports = [])).push(createSyntheticImport(jsxImport, file));
          }
        }
        for (var _i2 = 0, _a2 = file.statements; _i2 < _a2.length; _i2++) {
          var node = _a2[_i2];
          collectModuleReferences(node, false);
        }
        if (file.flags & 1048576 || isJavaScriptFile) {
          collectDynamicImportOrRequireCalls(file);
        }
        file.imports = imports || ts2.emptyArray;
        file.moduleAugmentations = moduleAugmentations || ts2.emptyArray;
        file.ambientModuleNames = ambientModules || ts2.emptyArray;
        return;
        function collectModuleReferences(node2, inAmbientModule) {
          if (ts2.isAnyImportOrReExport(node2)) {
            var moduleNameExpr = ts2.getExternalModuleName(node2);
            if (moduleNameExpr && ts2.isStringLiteral(moduleNameExpr) && moduleNameExpr.text && (!inAmbientModule || !ts2.isExternalModuleNameRelative(moduleNameExpr.text))) {
              ts2.setParentRecursive(node2, false);
              imports = ts2.append(imports, moduleNameExpr);
              if (!usesUriStyleNodeCoreModules && currentNodeModulesDepth === 0 && !file.isDeclarationFile) {
                usesUriStyleNodeCoreModules = ts2.startsWith(moduleNameExpr.text, "node:");
              }
            }
          } else if (ts2.isModuleDeclaration(node2)) {
            if (ts2.isAmbientModule(node2) && (inAmbientModule || ts2.hasSyntacticModifier(node2, 2) || file.isDeclarationFile)) {
              node2.name.parent = node2;
              var nameText = ts2.getTextOfIdentifierOrLiteral(node2.name);
              if (isExternalModuleFile || inAmbientModule && !ts2.isExternalModuleNameRelative(nameText)) {
                (moduleAugmentations || (moduleAugmentations = [])).push(node2.name);
              } else if (!inAmbientModule) {
                if (file.isDeclarationFile) {
                  (ambientModules || (ambientModules = [])).push(nameText);
                }
                var body = node2.body;
                if (body) {
                  for (var _i3 = 0, _a3 = body.statements; _i3 < _a3.length; _i3++) {
                    var statement = _a3[_i3];
                    collectModuleReferences(statement, true);
                  }
                }
              }
            }
          }
        }
        function collectDynamicImportOrRequireCalls(file2) {
          var r = /import|require/g;
          while (r.exec(file2.text) !== null) {
            var node2 = getNodeAtPosition(file2, r.lastIndex);
            if (isJavaScriptFile && ts2.isRequireCall(node2, true)) {
              ts2.setParentRecursive(node2, false);
              imports = ts2.append(imports, node2.arguments[0]);
            } else if (ts2.isImportCall(node2) && node2.arguments.length >= 1 && ts2.isStringLiteralLike(node2.arguments[0])) {
              ts2.setParentRecursive(node2, false);
              imports = ts2.append(imports, node2.arguments[0]);
            } else if (ts2.isLiteralImportTypeNode(node2)) {
              ts2.setParentRecursive(node2, false);
              imports = ts2.append(imports, node2.argument.literal);
            }
          }
        }
        function getNodeAtPosition(sourceFile, position) {
          var current = sourceFile;
          var getContainingChild = function(child2) {
            if (child2.pos <= position && (position < child2.end || position === child2.end && child2.kind === 1)) {
              return child2;
            }
          };
          while (true) {
            var child = isJavaScriptFile && ts2.hasJSDocNodes(current) && ts2.forEach(current.jsDoc, getContainingChild) || ts2.forEachChild(current, getContainingChild);
            if (!child) {
              return current;
            }
            current = child;
          }
        }
      }
      function getLibFileFromReference(ref) {
        var libName = ts2.toFileNameLowerCase(ref.fileName);
        var libFileName = ts2.libMap.get(libName);
        if (libFileName) {
          return getSourceFile(pathForLibFile(libFileName));
        }
      }
      function getSourceFileFromReference(referencingFile, ref) {
        return getSourceFileFromReferenceWorker(resolveTripleslashReference(ref.fileName, referencingFile.fileName), getSourceFile);
      }
      function getSourceFileFromReferenceWorker(fileName, getSourceFile2, fail, reason) {
        if (ts2.hasExtension(fileName)) {
          var canonicalFileName_1 = host.getCanonicalFileName(fileName);
          if (!options.allowNonTsExtensions && !ts2.forEach(ts2.flatten(supportedExtensionsWithJsonIfResolveJsonModule), function(extension) {
            return ts2.fileExtensionIs(canonicalFileName_1, extension);
          })) {
            if (fail) {
              if (ts2.hasJSFileExtension(canonicalFileName_1)) {
                fail(ts2.Diagnostics.File_0_is_a_JavaScript_file_Did_you_mean_to_enable_the_allowJs_option, fileName);
              } else {
                fail(ts2.Diagnostics.File_0_has_an_unsupported_extension_The_only_supported_extensions_are_1, fileName, "'" + ts2.flatten(supportedExtensions).join("', '") + "'");
              }
            }
            return void 0;
          }
          var sourceFile = getSourceFile2(fileName);
          if (fail) {
            if (!sourceFile) {
              var redirect = getProjectReferenceRedirect(fileName);
              if (redirect) {
                fail(ts2.Diagnostics.Output_file_0_has_not_been_built_from_source_file_1, redirect, fileName);
              } else {
                fail(ts2.Diagnostics.File_0_not_found, fileName);
              }
            } else if (isReferencedFile(reason) && canonicalFileName_1 === host.getCanonicalFileName(getSourceFileByPath(reason.file).fileName)) {
              fail(ts2.Diagnostics.A_file_cannot_have_a_reference_to_itself);
            }
          }
          return sourceFile;
        } else {
          var sourceFileNoExtension = options.allowNonTsExtensions && getSourceFile2(fileName);
          if (sourceFileNoExtension)
            return sourceFileNoExtension;
          if (fail && options.allowNonTsExtensions) {
            fail(ts2.Diagnostics.File_0_not_found, fileName);
            return void 0;
          }
          var sourceFileWithAddedExtension = ts2.forEach(supportedExtensions[0], function(extension) {
            return getSourceFile2(fileName + extension);
          });
          if (fail && !sourceFileWithAddedExtension)
            fail(ts2.Diagnostics.Could_not_resolve_the_path_0_with_the_extensions_Colon_1, fileName, "'" + ts2.flatten(supportedExtensions).join("', '") + "'");
          return sourceFileWithAddedExtension;
        }
      }
      function processSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, packageId, reason) {
        getSourceFileFromReferenceWorker(fileName, function(fileName2) {
          return findSourceFile(fileName2, isDefaultLib, ignoreNoDefaultLib, reason, packageId);
        }, function(diagnostic) {
          var args = [];
          for (var _i2 = 1; _i2 < arguments.length; _i2++) {
            args[_i2 - 1] = arguments[_i2];
          }
          return addFilePreprocessingFileExplainingDiagnostic(void 0, reason, diagnostic, args);
        }, reason);
      }
      function processProjectReferenceFile(fileName, reason) {
        return processSourceFile(fileName, false, false, void 0, reason);
      }
      function reportFileNamesDifferOnlyInCasingError(fileName, existingFile, reason) {
        var hasExistingReasonToReportErrorOn = !isReferencedFile(reason) && ts2.some(fileReasons.get(existingFile.path), isReferencedFile);
        if (hasExistingReasonToReportErrorOn) {
          addFilePreprocessingFileExplainingDiagnostic(existingFile, reason, ts2.Diagnostics.Already_included_file_name_0_differs_from_file_name_1_only_in_casing, [existingFile.fileName, fileName]);
        } else {
          addFilePreprocessingFileExplainingDiagnostic(existingFile, reason, ts2.Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, [fileName, existingFile.fileName]);
        }
      }
      function createRedirectSourceFile(redirectTarget, unredirected, fileName, path, resolvedPath, originalFileName) {
        var redirect = Object.create(redirectTarget);
        redirect.fileName = fileName;
        redirect.path = path;
        redirect.resolvedPath = resolvedPath;
        redirect.originalFileName = originalFileName;
        redirect.redirectInfo = { redirectTarget, unredirected };
        sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0);
        Object.defineProperties(redirect, {
          id: {
            get: function() {
              return this.redirectInfo.redirectTarget.id;
            },
            set: function(value) {
              this.redirectInfo.redirectTarget.id = value;
            }
          },
          symbol: {
            get: function() {
              return this.redirectInfo.redirectTarget.symbol;
            },
            set: function(value) {
              this.redirectInfo.redirectTarget.symbol = value;
            }
          }
        });
        return redirect;
      }
      function findSourceFile(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) {
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "findSourceFile", {
          fileName,
          isDefaultLib: isDefaultLib || void 0,
          fileIncludeKind: ts2.FileIncludeKind[reason.kind]
        });
        var result = findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId);
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
        return result;
      }
      function findSourceFileWorker(fileName, isDefaultLib, ignoreNoDefaultLib, reason, packageId) {
        var path = toPath(fileName);
        if (useSourceOfProjectReferenceRedirect) {
          var source = getSourceOfProjectReferenceRedirect(path);
          if (!source && host.realpath && options.preserveSymlinks && ts2.isDeclarationFileName(fileName) && ts2.stringContains(fileName, ts2.nodeModulesPathPart)) {
            var realPath = toPath(host.realpath(fileName));
            if (realPath !== path)
              source = getSourceOfProjectReferenceRedirect(realPath);
          }
          if (source) {
            var file_1 = ts2.isString(source) ? findSourceFile(source, isDefaultLib, ignoreNoDefaultLib, reason, packageId) : void 0;
            if (file_1)
              addFileToFilesByName(file_1, path, void 0);
            return file_1;
          }
        }
        var originalFileName = fileName;
        if (filesByName.has(path)) {
          var file_2 = filesByName.get(path);
          addFileIncludeReason(file_2 || void 0, reason);
          if (file_2 && options.forceConsistentCasingInFileNames) {
            var checkedName = file_2.fileName;
            var isRedirect = toPath(checkedName) !== toPath(fileName);
            if (isRedirect) {
              fileName = getProjectReferenceRedirect(fileName) || fileName;
            }
            var checkedAbsolutePath = ts2.getNormalizedAbsolutePathWithoutRoot(checkedName, currentDirectory);
            var inputAbsolutePath = ts2.getNormalizedAbsolutePathWithoutRoot(fileName, currentDirectory);
            if (checkedAbsolutePath !== inputAbsolutePath) {
              reportFileNamesDifferOnlyInCasingError(fileName, file_2, reason);
            }
          }
          if (file_2 && sourceFilesFoundSearchingNodeModules.get(file_2.path) && currentNodeModulesDepth === 0) {
            sourceFilesFoundSearchingNodeModules.set(file_2.path, false);
            if (!options.noResolve) {
              processReferencedFiles(file_2, isDefaultLib);
              processTypeReferenceDirectives(file_2);
            }
            if (!options.noLib) {
              processLibReferenceDirectives(file_2);
            }
            modulesWithElidedImports.set(file_2.path, false);
            processImportedModules(file_2);
          } else if (file_2 && modulesWithElidedImports.get(file_2.path)) {
            if (currentNodeModulesDepth < maxNodeModuleJsDepth) {
              modulesWithElidedImports.set(file_2.path, false);
              processImportedModules(file_2);
            }
          }
          return file_2 || void 0;
        }
        var redirectedPath;
        if (isReferencedFile(reason) && !useSourceOfProjectReferenceRedirect) {
          var redirectProject = getProjectReferenceRedirectProject(fileName);
          if (redirectProject) {
            if (ts2.outFile(redirectProject.commandLine.options)) {
              return void 0;
            }
            var redirect = getProjectReferenceOutputName(redirectProject, fileName);
            fileName = redirect;
            redirectedPath = toPath(redirect);
          }
        }
        var file = host.getSourceFile(fileName, ts2.getEmitScriptTarget(options), function(hostErrorMessage) {
          return addFilePreprocessingFileExplainingDiagnostic(void 0, reason, ts2.Diagnostics.Cannot_read_file_0_Colon_1, [fileName, hostErrorMessage]);
        }, shouldCreateNewSourceFile);
        if (packageId) {
          var packageIdKey = ts2.packageIdToString(packageId);
          var fileFromPackageId = packageIdToSourceFile.get(packageIdKey);
          if (fileFromPackageId) {
            var dupFile = createRedirectSourceFile(fileFromPackageId, file, fileName, path, toPath(fileName), originalFileName);
            redirectTargetsMap.add(fileFromPackageId.path, fileName);
            addFileToFilesByName(dupFile, path, redirectedPath);
            addFileIncludeReason(dupFile, reason);
            sourceFileToPackageName.set(path, packageId.name);
            processingOtherFiles.push(dupFile);
            return dupFile;
          } else if (file) {
            packageIdToSourceFile.set(packageIdKey, file);
            sourceFileToPackageName.set(path, packageId.name);
          }
        }
        addFileToFilesByName(file, path, redirectedPath);
        if (file) {
          sourceFilesFoundSearchingNodeModules.set(path, currentNodeModulesDepth > 0);
          file.fileName = fileName;
          file.path = path;
          file.resolvedPath = toPath(fileName);
          file.originalFileName = originalFileName;
          file.impliedNodeFormat = getImpliedNodeFormatForFile(file.resolvedPath, moduleResolutionCache === null || moduleResolutionCache === void 0 ? void 0 : moduleResolutionCache.getPackageJsonInfoCache(), host, options);
          addFileIncludeReason(file, reason);
          if (host.useCaseSensitiveFileNames()) {
            var pathLowerCase = ts2.toFileNameLowerCase(path);
            var existingFile = filesByNameIgnoreCase.get(pathLowerCase);
            if (existingFile) {
              reportFileNamesDifferOnlyInCasingError(fileName, existingFile, reason);
            } else {
              filesByNameIgnoreCase.set(pathLowerCase, file);
            }
          }
          skipDefaultLib = skipDefaultLib || file.hasNoDefaultLib && !ignoreNoDefaultLib;
          if (!options.noResolve) {
            processReferencedFiles(file, isDefaultLib);
            processTypeReferenceDirectives(file);
          }
          if (!options.noLib) {
            processLibReferenceDirectives(file);
          }
          processImportedModules(file);
          if (isDefaultLib) {
            processingDefaultLibFiles.push(file);
          } else {
            processingOtherFiles.push(file);
          }
        }
        return file;
      }
      function addFileIncludeReason(file, reason) {
        if (file)
          fileReasons.add(file.path, reason);
      }
      function addFileToFilesByName(file, path, redirectedPath) {
        if (redirectedPath) {
          filesByName.set(redirectedPath, file);
          filesByName.set(path, file || false);
        } else {
          filesByName.set(path, file);
        }
      }
      function getProjectReferenceRedirect(fileName) {
        var referencedProject = getProjectReferenceRedirectProject(fileName);
        return referencedProject && getProjectReferenceOutputName(referencedProject, fileName);
      }
      function getProjectReferenceRedirectProject(fileName) {
        if (!resolvedProjectReferences || !resolvedProjectReferences.length || ts2.fileExtensionIs(fileName, ".d.ts") || ts2.fileExtensionIs(fileName, ".json")) {
          return void 0;
        }
        return getResolvedProjectReferenceToRedirect(fileName);
      }
      function getProjectReferenceOutputName(referencedProject, fileName) {
        var out = ts2.outFile(referencedProject.commandLine.options);
        return out ? ts2.changeExtension(out, ".d.ts") : ts2.getOutputDeclarationFileName(fileName, referencedProject.commandLine, !host.useCaseSensitiveFileNames());
      }
      function getResolvedProjectReferenceToRedirect(fileName) {
        if (mapFromFileToProjectReferenceRedirects === void 0) {
          mapFromFileToProjectReferenceRedirects = new ts2.Map();
          forEachResolvedProjectReference2(function(referencedProject) {
            if (toPath(options.configFilePath) !== referencedProject.sourceFile.path) {
              referencedProject.commandLine.fileNames.forEach(function(f) {
                return mapFromFileToProjectReferenceRedirects.set(toPath(f), referencedProject.sourceFile.path);
              });
            }
          });
        }
        var referencedProjectPath = mapFromFileToProjectReferenceRedirects.get(toPath(fileName));
        return referencedProjectPath && getResolvedProjectReferenceByPath(referencedProjectPath);
      }
      function forEachResolvedProjectReference2(cb) {
        return ts2.forEachResolvedProjectReference(resolvedProjectReferences, cb);
      }
      function getSourceOfProjectReferenceRedirect(path) {
        if (!ts2.isDeclarationFileName(path))
          return void 0;
        if (mapFromToProjectReferenceRedirectSource === void 0) {
          mapFromToProjectReferenceRedirectSource = new ts2.Map();
          forEachResolvedProjectReference2(function(resolvedRef) {
            var out = ts2.outFile(resolvedRef.commandLine.options);
            if (out) {
              var outputDts = ts2.changeExtension(out, ".d.ts");
              mapFromToProjectReferenceRedirectSource.set(toPath(outputDts), true);
            } else {
              var getCommonSourceDirectory_3 = ts2.memoize(function() {
                return ts2.getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames());
              });
              ts2.forEach(resolvedRef.commandLine.fileNames, function(fileName) {
                if (!ts2.fileExtensionIs(fileName, ".d.ts") && !ts2.fileExtensionIs(fileName, ".json")) {
                  var outputDts2 = ts2.getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory_3);
                  mapFromToProjectReferenceRedirectSource.set(toPath(outputDts2), fileName);
                }
              });
            }
          });
        }
        return mapFromToProjectReferenceRedirectSource.get(path);
      }
      function isSourceOfProjectReferenceRedirect(fileName) {
        return useSourceOfProjectReferenceRedirect && !!getResolvedProjectReferenceToRedirect(fileName);
      }
      function getResolvedProjectReferenceByPath(projectReferencePath) {
        if (!projectReferenceRedirects) {
          return void 0;
        }
        return projectReferenceRedirects.get(projectReferencePath) || void 0;
      }
      function processReferencedFiles(file, isDefaultLib) {
        ts2.forEach(file.referencedFiles, function(ref, index) {
          processSourceFile(resolveTripleslashReference(ref.fileName, file.fileName), isDefaultLib, false, void 0, { kind: ts2.FileIncludeKind.ReferenceFile, file: file.path, index });
        });
      }
      function processTypeReferenceDirectives(file) {
        var typeDirectives = ts2.map(file.typeReferenceDirectives, function(ref2) {
          return ts2.toFileNameLowerCase(ref2.fileName);
        });
        if (!typeDirectives) {
          return;
        }
        var resolutions2 = resolveTypeReferenceDirectiveNamesWorker(typeDirectives, file);
        for (var index = 0; index < typeDirectives.length; index++) {
          var ref = file.typeReferenceDirectives[index];
          var resolvedTypeReferenceDirective = resolutions2[index];
          var fileName = ts2.toFileNameLowerCase(ref.fileName);
          ts2.setResolvedTypeReferenceDirective(file, fileName, resolvedTypeReferenceDirective);
          processTypeReferenceDirective(fileName, resolvedTypeReferenceDirective, { kind: ts2.FileIncludeKind.TypeReferenceDirective, file: file.path, index });
        }
      }
      function processTypeReferenceDirective(typeReferenceDirective, resolvedTypeReferenceDirective, reason) {
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.push("program", "processTypeReferenceDirective", { directive: typeReferenceDirective, hasResolved: !!resolveModuleNamesReusingOldState, refKind: reason.kind, refPath: isReferencedFile(reason) ? reason.file : void 0 });
        processTypeReferenceDirectiveWorker(typeReferenceDirective, resolvedTypeReferenceDirective, reason);
        ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.pop();
      }
      function processTypeReferenceDirectiveWorker(typeReferenceDirective, resolvedTypeReferenceDirective, reason) {
        var previousResolution = resolvedTypeReferenceDirectives.get(typeReferenceDirective);
        if (previousResolution && previousResolution.primary) {
          return;
        }
        var saveResolution = true;
        if (resolvedTypeReferenceDirective) {
          if (resolvedTypeReferenceDirective.isExternalLibraryImport)
            currentNodeModulesDepth++;
          if (resolvedTypeReferenceDirective.primary) {
            processSourceFile(resolvedTypeReferenceDirective.resolvedFileName, false, false, resolvedTypeReferenceDirective.packageId, reason);
          } else {
            if (previousResolution) {
              if (resolvedTypeReferenceDirective.resolvedFileName !== previousResolution.resolvedFileName) {
                var otherFileText = host.readFile(resolvedTypeReferenceDirective.resolvedFileName);
                var existingFile = getSourceFile(previousResolution.resolvedFileName);
                if (otherFileText !== existingFile.text) {
                  addFilePreprocessingFileExplainingDiagnostic(existingFile, reason, ts2.Diagnostics.Conflicting_definitions_for_0_found_at_1_and_2_Consider_installing_a_specific_version_of_this_library_to_resolve_the_conflict, [typeReferenceDirective, resolvedTypeReferenceDirective.resolvedFileName, previousResolution.resolvedFileName]);
                }
              }
              saveResolution = false;
            } else {
              processSourceFile(resolvedTypeReferenceDirective.resolvedFileName, false, false, resolvedTypeReferenceDirective.packageId, reason);
            }
          }
          if (resolvedTypeReferenceDirective.isExternalLibraryImport)
            currentNodeModulesDepth--;
        } else {
          addFilePreprocessingFileExplainingDiagnostic(void 0, reason, ts2.Diagnostics.Cannot_find_type_definition_file_for_0, [typeReferenceDirective]);
        }
        if (saveResolution) {
          resolvedTypeReferenceDirectives.set(typeReferenceDirective, resolvedTypeReferenceDirective);
        }
      }
      function pathForLibFile(libFileName) {
        var components = libFileName.split(".");
        var path = components[1];
        var i2 = 2;
        while (components[i2] && components[i2] !== "d") {
          path += (i2 === 2 ? "/" : "-") + components[i2];
          i2++;
        }
        var resolveFrom = ts2.combinePaths(currentDirectory, "__lib_node_modules_lookup_".concat(libFileName, "__.ts"));
        var localOverrideModuleResult = ts2.resolveModuleName("@typescript/lib-" + path, resolveFrom, { moduleResolution: ts2.ModuleResolutionKind.NodeJs }, host, moduleResolutionCache);
        if (localOverrideModuleResult === null || localOverrideModuleResult === void 0 ? void 0 : localOverrideModuleResult.resolvedModule) {
          return localOverrideModuleResult.resolvedModule.resolvedFileName;
        }
        return ts2.combinePaths(defaultLibraryPath, libFileName);
      }
      function processLibReferenceDirectives(file) {
        ts2.forEach(file.libReferenceDirectives, function(libReference, index) {
          var libName = ts2.toFileNameLowerCase(libReference.fileName);
          var libFileName = ts2.libMap.get(libName);
          if (libFileName) {
            processRootFile(pathForLibFile(libFileName), true, true, { kind: ts2.FileIncludeKind.LibReferenceDirective, file: file.path, index });
          } else {
            var unqualifiedLibName = ts2.removeSuffix(ts2.removePrefix(libName, "lib."), ".d.ts");
            var suggestion = ts2.getSpellingSuggestion(unqualifiedLibName, ts2.libs, ts2.identity);
            var diagnostic = suggestion ? ts2.Diagnostics.Cannot_find_lib_definition_for_0_Did_you_mean_1 : ts2.Diagnostics.Cannot_find_lib_definition_for_0;
            (fileProcessingDiagnostics || (fileProcessingDiagnostics = [])).push({
              kind: 0,
              reason: { kind: ts2.FileIncludeKind.LibReferenceDirective, file: file.path, index },
              diagnostic,
              args: [libName, suggestion]
            });
          }
        });
      }
      function getCanonicalFileName(fileName) {
        return host.getCanonicalFileName(fileName);
      }
      function processImportedModules(file) {
        var _a2;
        collectExternalModuleReferences(file);
        if (file.imports.length || file.moduleAugmentations.length) {
          var moduleNames = getModuleNames(file);
          var resolutions2 = resolveModuleNamesReusingOldState(moduleNames, file);
          ts2.Debug.assert(resolutions2.length === moduleNames.length);
          var optionsForFile = (useSourceOfProjectReferenceRedirect ? (_a2 = getRedirectReferenceForResolution(file)) === null || _a2 === void 0 ? void 0 : _a2.commandLine.options : void 0) || options;
          for (var index = 0; index < moduleNames.length; index++) {
            var resolution = resolutions2[index];
            ts2.setResolvedModule(file, moduleNames[index], resolution, getModeForResolutionAtIndex(file, index));
            if (!resolution) {
              continue;
            }
            var isFromNodeModulesSearch = resolution.isExternalLibraryImport;
            var isJsFile = !ts2.resolutionExtensionIsTSOrJson(resolution.extension);
            var isJsFileFromNodeModules = isFromNodeModulesSearch && isJsFile;
            var resolvedFileName = resolution.resolvedFileName;
            if (isFromNodeModulesSearch) {
              currentNodeModulesDepth++;
            }
            var elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModuleJsDepth;
            var shouldAddFile = resolvedFileName && !getResolutionDiagnostic(optionsForFile, resolution) && !optionsForFile.noResolve && index < file.imports.length && !elideImport && !(isJsFile && !ts2.getAllowJSCompilerOption(optionsForFile)) && (ts2.isInJSFile(file.imports[index]) || !(file.imports[index].flags & 4194304));
            if (elideImport) {
              modulesWithElidedImports.set(file.path, true);
            } else if (shouldAddFile) {
              findSourceFile(resolvedFileName, false, false, { kind: ts2.FileIncludeKind.Import, file: file.path, index }, resolution.packageId);
            }
            if (isFromNodeModulesSearch) {
              currentNodeModulesDepth--;
            }
          }
        } else {
          file.resolvedModules = void 0;
        }
      }
      function checkSourceFilesBelongToPath(sourceFiles, rootDirectory) {
        var allFilesBelongToPath = true;
        var absoluteRootDirectoryPath = host.getCanonicalFileName(ts2.getNormalizedAbsolutePath(rootDirectory, currentDirectory));
        for (var _i2 = 0, sourceFiles_2 = sourceFiles; _i2 < sourceFiles_2.length; _i2++) {
          var sourceFile = sourceFiles_2[_i2];
          if (!sourceFile.isDeclarationFile) {
            var absoluteSourceFilePath = host.getCanonicalFileName(ts2.getNormalizedAbsolutePath(sourceFile.fileName, currentDirectory));
            if (absoluteSourceFilePath.indexOf(absoluteRootDirectoryPath) !== 0) {
              addProgramDiagnosticExplainingFile(sourceFile, ts2.Diagnostics.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files, [sourceFile.fileName, rootDirectory]);
              allFilesBelongToPath = false;
            }
          }
        }
        return allFilesBelongToPath;
      }
      function parseProjectReferenceConfigFile(ref) {
        if (!projectReferenceRedirects) {
          projectReferenceRedirects = new ts2.Map();
        }
        var refPath = resolveProjectReferencePath(ref);
        var sourceFilePath = toPath(refPath);
        var fromCache = projectReferenceRedirects.get(sourceFilePath);
        if (fromCache !== void 0) {
          return fromCache || void 0;
        }
        var commandLine;
        var sourceFile;
        if (host.getParsedCommandLine) {
          commandLine = host.getParsedCommandLine(refPath);
          if (!commandLine) {
            addFileToFilesByName(void 0, sourceFilePath, void 0);
            projectReferenceRedirects.set(sourceFilePath, false);
            return void 0;
          }
          sourceFile = ts2.Debug.checkDefined(commandLine.options.configFile);
          ts2.Debug.assert(!sourceFile.path || sourceFile.path === sourceFilePath);
          addFileToFilesByName(sourceFile, sourceFilePath, void 0);
        } else {
          var basePath = ts2.getNormalizedAbsolutePath(ts2.getDirectoryPath(refPath), host.getCurrentDirectory());
          sourceFile = host.getSourceFile(refPath, 100);
          addFileToFilesByName(sourceFile, sourceFilePath, void 0);
          if (sourceFile === void 0) {
            projectReferenceRedirects.set(sourceFilePath, false);
            return void 0;
          }
          commandLine = ts2.parseJsonSourceFileConfigFileContent(sourceFile, configParsingHost, basePath, void 0, refPath);
        }
        sourceFile.fileName = refPath;
        sourceFile.path = sourceFilePath;
        sourceFile.resolvedPath = sourceFilePath;
        sourceFile.originalFileName = refPath;
        var resolvedRef = { commandLine, sourceFile };
        projectReferenceRedirects.set(sourceFilePath, resolvedRef);
        if (commandLine.projectReferences) {
          resolvedRef.references = commandLine.projectReferences.map(parseProjectReferenceConfigFile);
        }
        return resolvedRef;
      }
      function verifyCompilerOptions() {
        var isNightly = ts2.stringContains(ts2.version, "-dev");
        if (!isNightly) {
          if (ts2.getEmitModuleKind(options) === ts2.ModuleKind.Node12) {
            createOptionValueDiagnostic("module", ts2.Diagnostics.Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next, "module", "node12");
          } else if (ts2.getEmitModuleKind(options) === ts2.ModuleKind.NodeNext) {
            createOptionValueDiagnostic("module", ts2.Diagnostics.Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next, "module", "nodenext");
          } else if (ts2.getEmitModuleResolutionKind(options) === ts2.ModuleResolutionKind.Node12) {
            createOptionValueDiagnostic("moduleResolution", ts2.Diagnostics.Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next, "moduleResolution", "node12");
          } else if (ts2.getEmitModuleResolutionKind(options) === ts2.ModuleResolutionKind.NodeNext) {
            createOptionValueDiagnostic("moduleResolution", ts2.Diagnostics.Compiler_option_0_of_value_1_is_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next, "moduleResolution", "nodenext");
          }
        }
        if (options.strictPropertyInitialization && !ts2.getStrictOptionValue(options, "strictNullChecks")) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "strictPropertyInitialization", "strictNullChecks");
        }
        if (options.exactOptionalPropertyTypes && !ts2.getStrictOptionValue(options, "strictNullChecks")) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "exactOptionalPropertyTypes", "strictNullChecks");
        }
        if (options.isolatedModules) {
          if (options.out) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", "isolatedModules");
          }
          if (options.outFile) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "outFile", "isolatedModules");
          }
        }
        if (options.inlineSourceMap) {
          if (options.sourceMap) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "sourceMap", "inlineSourceMap");
          }
          if (options.mapRoot) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "mapRoot", "inlineSourceMap");
          }
        }
        if (options.composite) {
          if (options.declaration === false) {
            createDiagnosticForOptionName(ts2.Diagnostics.Composite_projects_may_not_disable_declaration_emit, "declaration");
          }
          if (options.incremental === false) {
            createDiagnosticForOptionName(ts2.Diagnostics.Composite_projects_may_not_disable_incremental_compilation, "declaration");
          }
        }
        var outputFile = ts2.outFile(options);
        if (options.tsBuildInfoFile) {
          if (!ts2.isIncrementalCompilation(options)) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "tsBuildInfoFile", "incremental", "composite");
          }
        } else if (options.incremental && !outputFile && !options.configFilePath) {
          programDiagnostics.add(ts2.createCompilerDiagnostic(ts2.Diagnostics.Option_incremental_can_only_be_specified_using_tsconfig_emitting_to_single_file_or_when_option_tsBuildInfoFile_is_specified));
        }
        verifyProjectReferences();
        if (options.composite) {
          var rootPaths = new ts2.Set(rootNames.map(toPath));
          for (var _i2 = 0, files_4 = files; _i2 < files_4.length; _i2++) {
            var file = files_4[_i2];
            if (ts2.sourceFileMayBeEmitted(file, program) && !rootPaths.has(file.path)) {
              addProgramDiagnosticExplainingFile(file, ts2.Diagnostics.File_0_is_not_listed_within_the_file_list_of_project_1_Projects_must_list_all_files_or_use_an_include_pattern, [file.fileName, options.configFilePath || ""]);
            }
          }
        }
        if (options.paths) {
          for (var key in options.paths) {
            if (!ts2.hasProperty(options.paths, key)) {
              continue;
            }
            if (!ts2.hasZeroOrOneAsteriskCharacter(key)) {
              createDiagnosticForOptionPaths(true, key, ts2.Diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character, key);
            }
            if (ts2.isArray(options.paths[key])) {
              var len = options.paths[key].length;
              if (len === 0) {
                createDiagnosticForOptionPaths(false, key, ts2.Diagnostics.Substitutions_for_pattern_0_shouldn_t_be_an_empty_array, key);
              }
              for (var i2 = 0; i2 < len; i2++) {
                var subst = options.paths[key][i2];
                var typeOfSubst = typeof subst;
                if (typeOfSubst === "string") {
                  if (!ts2.hasZeroOrOneAsteriskCharacter(subst)) {
                    createDiagnosticForOptionPathKeyValue(key, i2, ts2.Diagnostics.Substitution_0_in_pattern_1_can_have_at_most_one_Asterisk_character, subst, key);
                  }
                  if (!options.baseUrl && !ts2.pathIsRelative(subst) && !ts2.pathIsAbsolute(subst)) {
                    createDiagnosticForOptionPathKeyValue(key, i2, ts2.Diagnostics.Non_relative_paths_are_not_allowed_when_baseUrl_is_not_set_Did_you_forget_a_leading_Slash);
                  }
                } else {
                  createDiagnosticForOptionPathKeyValue(key, i2, ts2.Diagnostics.Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2, subst, key, typeOfSubst);
                }
              }
            } else {
              createDiagnosticForOptionPaths(false, key, ts2.Diagnostics.Substitutions_for_pattern_0_should_be_an_array, key);
            }
          }
        }
        if (!options.sourceMap && !options.inlineSourceMap) {
          if (options.inlineSources) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "inlineSources");
          }
          if (options.sourceRoot) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "sourceRoot");
          }
        }
        if (options.out && options.outFile) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", "outFile");
        }
        if (options.mapRoot && !(options.sourceMap || options.declarationMap)) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "mapRoot", "sourceMap", "declarationMap");
        }
        if (options.declarationDir) {
          if (!ts2.getEmitDeclarations(options)) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationDir", "declaration", "composite");
          }
          if (outputFile) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "declarationDir", options.out ? "out" : "outFile");
          }
        }
        if (options.declarationMap && !ts2.getEmitDeclarations(options)) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "declarationMap", "declaration", "composite");
        }
        if (options.lib && options.noLib) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "lib", "noLib");
        }
        if (options.noImplicitUseStrict && ts2.getStrictOptionValue(options, "alwaysStrict")) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "noImplicitUseStrict", "alwaysStrict");
        }
        var languageVersion = ts2.getEmitScriptTarget(options);
        var firstNonAmbientExternalModuleSourceFile = ts2.find(files, function(f) {
          return ts2.isExternalModule(f) && !f.isDeclarationFile;
        });
        if (options.isolatedModules) {
          if (options.module === ts2.ModuleKind.None && languageVersion < 2) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher, "isolatedModules", "target");
          }
          if (options.preserveConstEnums === false) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_preserveConstEnums_cannot_be_disabled_when_isolatedModules_is_enabled, "preserveConstEnums", "isolatedModules");
          }
          var firstNonExternalModuleSourceFile = ts2.find(files, function(f) {
            return !ts2.isExternalModule(f) && !ts2.isSourceFileJS(f) && !f.isDeclarationFile && f.scriptKind !== 6;
          });
          if (firstNonExternalModuleSourceFile) {
            var span = ts2.getErrorSpanForNode(firstNonExternalModuleSourceFile, firstNonExternalModuleSourceFile);
            programDiagnostics.add(ts2.createFileDiagnostic(firstNonExternalModuleSourceFile, span.start, span.length, ts2.Diagnostics._0_cannot_be_compiled_under_isolatedModules_because_it_is_considered_a_global_script_file_Add_an_import_export_or_an_empty_export_statement_to_make_it_a_module, ts2.getBaseFileName(firstNonExternalModuleSourceFile.fileName)));
          }
        } else if (firstNonAmbientExternalModuleSourceFile && languageVersion < 2 && options.module === ts2.ModuleKind.None) {
          var span = ts2.getErrorSpanForNode(firstNonAmbientExternalModuleSourceFile, firstNonAmbientExternalModuleSourceFile.externalModuleIndicator);
          programDiagnostics.add(ts2.createFileDiagnostic(firstNonAmbientExternalModuleSourceFile, span.start, span.length, ts2.Diagnostics.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none));
        }
        if (outputFile && !options.emitDeclarationOnly) {
          if (options.module && !(options.module === ts2.ModuleKind.AMD || options.module === ts2.ModuleKind.System)) {
            createDiagnosticForOptionName(ts2.Diagnostics.Only_amd_and_system_modules_are_supported_alongside_0, options.out ? "out" : "outFile", "module");
          } else if (options.module === void 0 && firstNonAmbientExternalModuleSourceFile) {
            var span = ts2.getErrorSpanForNode(firstNonAmbientExternalModuleSourceFile, firstNonAmbientExternalModuleSourceFile.externalModuleIndicator);
            programDiagnostics.add(ts2.createFileDiagnostic(firstNonAmbientExternalModuleSourceFile, span.start, span.length, ts2.Diagnostics.Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system, options.out ? "out" : "outFile"));
          }
        }
        if (options.resolveJsonModule) {
          if (ts2.getEmitModuleResolutionKind(options) !== ts2.ModuleResolutionKind.NodeJs && ts2.getEmitModuleResolutionKind(options) !== ts2.ModuleResolutionKind.Node12 && ts2.getEmitModuleResolutionKind(options) !== ts2.ModuleResolutionKind.NodeNext) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_resolveJsonModule_cannot_be_specified_without_node_module_resolution_strategy, "resolveJsonModule");
          } else if (!ts2.hasJsonModuleEmitEnabled(options)) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_resolveJsonModule_can_only_be_specified_when_module_code_generation_is_commonjs_amd_es2015_or_esNext, "resolveJsonModule", "module");
          }
        }
        if (options.outDir || options.rootDir || options.sourceRoot || options.mapRoot) {
          var dir = getCommonSourceDirectory();
          if (options.outDir && dir === "" && files.some(function(file2) {
            return ts2.getRootLength(file2.fileName) > 1;
          })) {
            createDiagnosticForOptionName(ts2.Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files, "outDir");
          }
        }
        if (options.useDefineForClassFields && languageVersion === 0) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_when_option_target_is_ES3, "useDefineForClassFields");
        }
        if (options.checkJs && !ts2.getAllowJSCompilerOption(options)) {
          programDiagnostics.add(ts2.createCompilerDiagnostic(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "checkJs", "allowJs"));
        }
        if (options.emitDeclarationOnly) {
          if (!ts2.getEmitDeclarations(options)) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "emitDeclarationOnly", "declaration", "composite");
          }
          if (options.noEmit) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "emitDeclarationOnly", "noEmit");
          }
        }
        if (options.emitDecoratorMetadata && !options.experimentalDecorators) {
          createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "emitDecoratorMetadata", "experimentalDecorators");
        }
        if (options.jsxFactory) {
          if (options.reactNamespace) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_with_option_1, "reactNamespace", "jsxFactory");
          }
          if (options.jsx === 4 || options.jsx === 5) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFactory", ts2.inverseJsxOptionMap.get("" + options.jsx));
          }
          if (!ts2.parseIsolatedEntityName(options.jsxFactory, languageVersion)) {
            createOptionValueDiagnostic("jsxFactory", ts2.Diagnostics.Invalid_value_for_jsxFactory_0_is_not_a_valid_identifier_or_qualified_name, options.jsxFactory);
          }
        } else if (options.reactNamespace && !ts2.isIdentifierText(options.reactNamespace, languageVersion)) {
          createOptionValueDiagnostic("reactNamespace", ts2.Diagnostics.Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier, options.reactNamespace);
        }
        if (options.jsxFragmentFactory) {
          if (!options.jsxFactory) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "jsxFragmentFactory", "jsxFactory");
          }
          if (options.jsx === 4 || options.jsx === 5) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxFragmentFactory", ts2.inverseJsxOptionMap.get("" + options.jsx));
          }
          if (!ts2.parseIsolatedEntityName(options.jsxFragmentFactory, languageVersion)) {
            createOptionValueDiagnostic("jsxFragmentFactory", ts2.Diagnostics.Invalid_value_for_jsxFragmentFactory_0_is_not_a_valid_identifier_or_qualified_name, options.jsxFragmentFactory);
          }
        }
        if (options.reactNamespace) {
          if (options.jsx === 4 || options.jsx === 5) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "reactNamespace", ts2.inverseJsxOptionMap.get("" + options.jsx));
          }
        }
        if (options.jsxImportSource) {
          if (options.jsx === 2) {
            createDiagnosticForOptionName(ts2.Diagnostics.Option_0_cannot_be_specified_when_option_jsx_is_1, "jsxImportSource", ts2.inverseJsxOptionMap.get("" + options.jsx));
          }
        }
        if (options.preserveValueImports && ts2.getEmitModuleKind(options) < ts2.ModuleKind.ES2015) {
          createOptionValueDiagnostic("importsNotUsedAsValues", ts2.Diagnostics.Option_preserveValueImports_can_only_be_used_when_module_is_set_to_es2015_or_later);
        }
        if (!options.noEmit && !options.suppressOutputPathCheck) {
          var emitHost = getEmitHost();
          var emitFilesSeen_1 = new ts2.Set();
          ts2.forEachEmittedFile(emitHost, function(emitFileNames) {
            if (!options.emitDeclarationOnly) {
              verifyEmitFilePath(emitFileNames.jsFilePath, emitFilesSeen_1);
            }
            verifyEmitFilePath(emitFileNames.declarationFilePath, emitFilesSeen_1);
          });
        }
        function verifyEmitFilePath(emitFileName, emitFilesSeen) {
          if (emitFileName) {
            var emitFilePath = toPath(emitFileName);
            if (filesByName.has(emitFilePath)) {
              var chain = void 0;
              if (!options.configFilePath) {
                chain = ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Adding_a_tsconfig_json_file_will_help_organize_projects_that_contain_both_TypeScript_and_JavaScript_files_Learn_more_at_https_Colon_Slash_Slashaka_ms_Slashtsconfig);
              }
              chain = ts2.chainDiagnosticMessages(chain, ts2.Diagnostics.Cannot_write_file_0_because_it_would_overwrite_input_file, emitFileName);
              blockEmittingOfFile(emitFileName, ts2.createCompilerDiagnosticFromMessageChain(chain));
            }
            var emitFileKey = !host.useCaseSensitiveFileNames() ? ts2.toFileNameLowerCase(emitFilePath) : emitFilePath;
            if (emitFilesSeen.has(emitFileKey)) {
              blockEmittingOfFile(emitFileName, ts2.createCompilerDiagnostic(ts2.Diagnostics.Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files, emitFileName));
            } else {
              emitFilesSeen.add(emitFileKey);
            }
          }
        }
      }
      function createDiagnosticExplainingFile(file, fileProcessingReason, diagnostic, args) {
        var _a2;
        var fileIncludeReasons;
        var relatedInfo;
        var locationReason = isReferencedFile(fileProcessingReason) ? fileProcessingReason : void 0;
        if (file)
          (_a2 = fileReasons.get(file.path)) === null || _a2 === void 0 ? void 0 : _a2.forEach(processReason);
        if (fileProcessingReason)
          processReason(fileProcessingReason);
        if (locationReason && (fileIncludeReasons === null || fileIncludeReasons === void 0 ? void 0 : fileIncludeReasons.length) === 1)
          fileIncludeReasons = void 0;
        var location = locationReason && getReferencedFileLocation(getSourceFileByPath, locationReason);
        var fileIncludeReasonDetails = fileIncludeReasons && ts2.chainDiagnosticMessages(fileIncludeReasons, ts2.Diagnostics.The_file_is_in_the_program_because_Colon);
        var redirectInfo = file && ts2.explainIfFileIsRedirect(file);
        var chain = ts2.chainDiagnosticMessages.apply(void 0, __spreadArray([redirectInfo ? fileIncludeReasonDetails ? __spreadArray([fileIncludeReasonDetails], redirectInfo, true) : redirectInfo : fileIncludeReasonDetails, diagnostic], args || ts2.emptyArray, false));
        return location && isReferenceFileLocation(location) ? ts2.createFileDiagnosticFromMessageChain(location.file, location.pos, location.end - location.pos, chain, relatedInfo) : ts2.createCompilerDiagnosticFromMessageChain(chain, relatedInfo);
        function processReason(reason) {
          (fileIncludeReasons || (fileIncludeReasons = [])).push(ts2.fileIncludeReasonToDiagnostics(program, reason));
          if (!locationReason && isReferencedFile(reason)) {
            locationReason = reason;
          } else if (locationReason !== reason) {
            relatedInfo = ts2.append(relatedInfo, fileIncludeReasonToRelatedInformation(reason));
          }
          if (reason === fileProcessingReason)
            fileProcessingReason = void 0;
        }
      }
      function addFilePreprocessingFileExplainingDiagnostic(file, fileProcessingReason, diagnostic, args) {
        (fileProcessingDiagnostics || (fileProcessingDiagnostics = [])).push({
          kind: 1,
          file: file && file.path,
          fileProcessingReason,
          diagnostic,
          args
        });
      }
      function addProgramDiagnosticExplainingFile(file, diagnostic, args) {
        programDiagnostics.add(createDiagnosticExplainingFile(file, void 0, diagnostic, args));
      }
      function fileIncludeReasonToRelatedInformation(reason) {
        if (isReferencedFile(reason)) {
          var referenceLocation = getReferencedFileLocation(getSourceFileByPath, reason);
          var message_2;
          switch (reason.kind) {
            case ts2.FileIncludeKind.Import:
              message_2 = ts2.Diagnostics.File_is_included_via_import_here;
              break;
            case ts2.FileIncludeKind.ReferenceFile:
              message_2 = ts2.Diagnostics.File_is_included_via_reference_here;
              break;
            case ts2.FileIncludeKind.TypeReferenceDirective:
              message_2 = ts2.Diagnostics.File_is_included_via_type_library_reference_here;
              break;
            case ts2.FileIncludeKind.LibReferenceDirective:
              message_2 = ts2.Diagnostics.File_is_included_via_library_reference_here;
              break;
            default:
              ts2.Debug.assertNever(reason);
          }
          return isReferenceFileLocation(referenceLocation) ? ts2.createFileDiagnostic(referenceLocation.file, referenceLocation.pos, referenceLocation.end - referenceLocation.pos, message_2) : void 0;
        }
        if (!options.configFile)
          return void 0;
        var configFileNode;
        var message;
        switch (reason.kind) {
          case ts2.FileIncludeKind.RootFile:
            if (!options.configFile.configFileSpecs)
              return void 0;
            var fileName = ts2.getNormalizedAbsolutePath(rootNames[reason.index], currentDirectory);
            var matchedByFiles = ts2.getMatchedFileSpec(program, fileName);
            if (matchedByFiles) {
              configFileNode = ts2.getTsConfigPropArrayElementValue(options.configFile, "files", matchedByFiles);
              message = ts2.Diagnostics.File_is_matched_by_files_list_specified_here;
              break;
            }
            var matchedByInclude = ts2.getMatchedIncludeSpec(program, fileName);
            if (!matchedByInclude)
              return void 0;
            configFileNode = ts2.getTsConfigPropArrayElementValue(options.configFile, "include", matchedByInclude);
            message = ts2.Diagnostics.File_is_matched_by_include_pattern_specified_here;
            break;
          case ts2.FileIncludeKind.SourceFromProjectReference:
          case ts2.FileIncludeKind.OutputFromProjectReference:
            var referencedResolvedRef_1 = ts2.Debug.checkDefined(resolvedProjectReferences === null || resolvedProjectReferences === void 0 ? void 0 : resolvedProjectReferences[reason.index]);
            var referenceInfo = forEachProjectReference(projectReferences, resolvedProjectReferences, function(resolvedRef, parent, index2) {
              return resolvedRef === referencedResolvedRef_1 ? { sourceFile: (parent === null || parent === void 0 ? void 0 : parent.sourceFile) || options.configFile, index: index2 } : void 0;
            });
            if (!referenceInfo)
              return void 0;
            var sourceFile = referenceInfo.sourceFile, index = referenceInfo.index;
            var referencesSyntax = ts2.firstDefined(ts2.getTsConfigPropArray(sourceFile, "references"), function(property) {
              return ts2.isArrayLiteralExpression(property.initializer) ? property.initializer : void 0;
            });
            return referencesSyntax && referencesSyntax.elements.length > index ? ts2.createDiagnosticForNodeInSourceFile(sourceFile, referencesSyntax.elements[index], reason.kind === ts2.FileIncludeKind.OutputFromProjectReference ? ts2.Diagnostics.File_is_output_from_referenced_project_specified_here : ts2.Diagnostics.File_is_source_from_referenced_project_specified_here) : void 0;
          case ts2.FileIncludeKind.AutomaticTypeDirectiveFile:
            if (!options.types)
              return void 0;
            configFileNode = getOptionsSyntaxByArrayElementValue("types", reason.typeReference);
            message = ts2.Diagnostics.File_is_entry_point_of_type_library_specified_here;
            break;
          case ts2.FileIncludeKind.LibFile:
            if (reason.index !== void 0) {
              configFileNode = getOptionsSyntaxByArrayElementValue("lib", options.lib[reason.index]);
              message = ts2.Diagnostics.File_is_library_specified_here;
              break;
            }
            var target = ts2.forEachEntry(ts2.targetOptionDeclaration.type, function(value, key) {
              return value === ts2.getEmitScriptTarget(options) ? key : void 0;
            });
            configFileNode = target ? getOptionsSyntaxByValue("target", target) : void 0;
            message = ts2.Diagnostics.File_is_default_library_for_target_specified_here;
            break;
          default:
            ts2.Debug.assertNever(reason);
        }
        return configFileNode && ts2.createDiagnosticForNodeInSourceFile(options.configFile, configFileNode, message);
      }
      function verifyProjectReferences() {
        var buildInfoPath = !options.suppressOutputPathCheck ? ts2.getTsBuildInfoEmitOutputFilePath(options) : void 0;
        forEachProjectReference(projectReferences, resolvedProjectReferences, function(resolvedRef, parent, index) {
          var ref = (parent ? parent.commandLine.projectReferences : projectReferences)[index];
          var parentFile = parent && parent.sourceFile;
          if (!resolvedRef) {
            createDiagnosticForReference(parentFile, index, ts2.Diagnostics.File_0_not_found, ref.path);
            return;
          }
          var options2 = resolvedRef.commandLine.options;
          if (!options2.composite || options2.noEmit) {
            var inputs = parent ? parent.commandLine.fileNames : rootNames;
            if (inputs.length) {
              if (!options2.composite)
                createDiagnosticForReference(parentFile, index, ts2.Diagnostics.Referenced_project_0_must_have_setting_composite_Colon_true, ref.path);
              if (options2.noEmit)
                createDiagnosticForReference(parentFile, index, ts2.Diagnostics.Referenced_project_0_may_not_disable_emit, ref.path);
            }
          }
          if (ref.prepend) {
            var out = ts2.outFile(options2);
            if (out) {
              if (!host.fileExists(out)) {
                createDiagnosticForReference(parentFile, index, ts2.Diagnostics.Output_file_0_from_project_1_does_not_exist, out, ref.path);
              }
            } else {
              createDiagnosticForReference(parentFile, index, ts2.Diagnostics.Cannot_prepend_project_0_because_it_does_not_have_outFile_set, ref.path);
            }
          }
          if (!parent && buildInfoPath && buildInfoPath === ts2.getTsBuildInfoEmitOutputFilePath(options2)) {
            createDiagnosticForReference(parentFile, index, ts2.Diagnostics.Cannot_write_file_0_because_it_will_overwrite_tsbuildinfo_file_generated_by_referenced_project_1, buildInfoPath, ref.path);
            hasEmitBlockingDiagnostics.set(toPath(buildInfoPath), true);
          }
        });
      }
      function createDiagnosticForOptionPathKeyValue(key, valueIndex, message, arg0, arg1, arg2) {
        var needCompilerDiagnostic = true;
        var pathsSyntax = getOptionPathsSyntax();
        for (var _i2 = 0, pathsSyntax_1 = pathsSyntax; _i2 < pathsSyntax_1.length; _i2++) {
          var pathProp = pathsSyntax_1[_i2];
          if (ts2.isObjectLiteralExpression(pathProp.initializer)) {
            for (var _a2 = 0, _b2 = ts2.getPropertyAssignment(pathProp.initializer, key); _a2 < _b2.length; _a2++) {
              var keyProps = _b2[_a2];
              var initializer = keyProps.initializer;
              if (ts2.isArrayLiteralExpression(initializer) && initializer.elements.length > valueIndex) {
                programDiagnostics.add(ts2.createDiagnosticForNodeInSourceFile(options.configFile, initializer.elements[valueIndex], message, arg0, arg1, arg2));
                needCompilerDiagnostic = false;
              }
            }
          }
        }
        if (needCompilerDiagnostic) {
          programDiagnostics.add(ts2.createCompilerDiagnostic(message, arg0, arg1, arg2));
        }
      }
      function createDiagnosticForOptionPaths(onKey, key, message, arg0) {
        var needCompilerDiagnostic = true;
        var pathsSyntax = getOptionPathsSyntax();
        for (var _i2 = 0, pathsSyntax_2 = pathsSyntax; _i2 < pathsSyntax_2.length; _i2++) {
          var pathProp = pathsSyntax_2[_i2];
          if (ts2.isObjectLiteralExpression(pathProp.initializer) && createOptionDiagnosticInObjectLiteralSyntax(pathProp.initializer, onKey, key, void 0, message, arg0)) {
            needCompilerDiagnostic = false;
          }
        }
        if (needCompilerDiagnostic) {
          programDiagnostics.add(ts2.createCompilerDiagnostic(message, arg0));
        }
      }
      function getOptionsSyntaxByName(name) {
        var compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
        return compilerOptionsObjectLiteralSyntax && ts2.getPropertyAssignment(compilerOptionsObjectLiteralSyntax, name);
      }
      function getOptionPathsSyntax() {
        return getOptionsSyntaxByName("paths") || ts2.emptyArray;
      }
      function getOptionsSyntaxByValue(name, value) {
        var syntaxByName = getOptionsSyntaxByName(name);
        return syntaxByName && ts2.firstDefined(syntaxByName, function(property) {
          return ts2.isStringLiteral(property.initializer) && property.initializer.text === value ? property.initializer : void 0;
        });
      }
      function getOptionsSyntaxByArrayElementValue(name, value) {
        var compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
        return compilerOptionsObjectLiteralSyntax && ts2.getPropertyArrayElementValue(compilerOptionsObjectLiteralSyntax, name, value);
      }
      function createDiagnosticForOptionName(message, option1, option2, option3) {
        createDiagnosticForOption(true, option1, option2, message, option1, option2, option3);
      }
      function createOptionValueDiagnostic(option1, message, arg0, arg1) {
        createDiagnosticForOption(false, option1, void 0, message, arg0, arg1);
      }
      function createDiagnosticForReference(sourceFile, index, message, arg0, arg1) {
        var referencesSyntax = ts2.firstDefined(ts2.getTsConfigPropArray(sourceFile || options.configFile, "references"), function(property) {
          return ts2.isArrayLiteralExpression(property.initializer) ? property.initializer : void 0;
        });
        if (referencesSyntax && referencesSyntax.elements.length > index) {
          programDiagnostics.add(ts2.createDiagnosticForNodeInSourceFile(sourceFile || options.configFile, referencesSyntax.elements[index], message, arg0, arg1));
        } else {
          programDiagnostics.add(ts2.createCompilerDiagnostic(message, arg0, arg1));
        }
      }
      function createDiagnosticForOption(onKey, option1, option2, message, arg0, arg1, arg2) {
        var compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
        var needCompilerDiagnostic = !compilerOptionsObjectLiteralSyntax || !createOptionDiagnosticInObjectLiteralSyntax(compilerOptionsObjectLiteralSyntax, onKey, option1, option2, message, arg0, arg1, arg2);
        if (needCompilerDiagnostic) {
          programDiagnostics.add(ts2.createCompilerDiagnostic(message, arg0, arg1, arg2));
        }
      }
      function getCompilerOptionsObjectLiteralSyntax() {
        if (_compilerOptionsObjectLiteralSyntax === void 0) {
          _compilerOptionsObjectLiteralSyntax = false;
          var jsonObjectLiteral = ts2.getTsConfigObjectLiteralExpression(options.configFile);
          if (jsonObjectLiteral) {
            for (var _i2 = 0, _a2 = ts2.getPropertyAssignment(jsonObjectLiteral, "compilerOptions"); _i2 < _a2.length; _i2++) {
              var prop = _a2[_i2];
              if (ts2.isObjectLiteralExpression(prop.initializer)) {
                _compilerOptionsObjectLiteralSyntax = prop.initializer;
                break;
              }
            }
          }
        }
        return _compilerOptionsObjectLiteralSyntax || void 0;
      }
      function createOptionDiagnosticInObjectLiteralSyntax(objectLiteral, onKey, key1, key2, message, arg0, arg1, arg2) {
        var props = ts2.getPropertyAssignment(objectLiteral, key1, key2);
        for (var _i2 = 0, props_3 = props; _i2 < props_3.length; _i2++) {
          var prop = props_3[_i2];
          programDiagnostics.add(ts2.createDiagnosticForNodeInSourceFile(options.configFile, onKey ? prop.name : prop.initializer, message, arg0, arg1, arg2));
        }
        return !!props.length;
      }
      function blockEmittingOfFile(emitFileName, diag) {
        hasEmitBlockingDiagnostics.set(toPath(emitFileName), true);
        programDiagnostics.add(diag);
      }
      function isEmittedFile(file) {
        if (options.noEmit) {
          return false;
        }
        var filePath = toPath(file);
        if (getSourceFileByPath(filePath)) {
          return false;
        }
        var out = ts2.outFile(options);
        if (out) {
          return isSameFile(filePath, out) || isSameFile(filePath, ts2.removeFileExtension(out) + ".d.ts");
        }
        if (options.declarationDir && ts2.containsPath(options.declarationDir, filePath, currentDirectory, !host.useCaseSensitiveFileNames())) {
          return true;
        }
        if (options.outDir) {
          return ts2.containsPath(options.outDir, filePath, currentDirectory, !host.useCaseSensitiveFileNames());
        }
        if (ts2.fileExtensionIsOneOf(filePath, ts2.supportedJSExtensionsFlat) || ts2.fileExtensionIs(filePath, ".d.ts")) {
          var filePathWithoutExtension = ts2.removeFileExtension(filePath);
          return !!getSourceFileByPath(filePathWithoutExtension + ".ts") || !!getSourceFileByPath(filePathWithoutExtension + ".tsx");
        }
        return false;
      }
      function isSameFile(file1, file2) {
        return ts2.comparePaths(file1, file2, currentDirectory, !host.useCaseSensitiveFileNames()) === 0;
      }
      function getSymlinkCache() {
        if (host.getSymlinkCache) {
          return host.getSymlinkCache();
        }
        if (!symlinks) {
          symlinks = ts2.createSymlinkCache(currentDirectory, getCanonicalFileName);
        }
        if (files && resolvedTypeReferenceDirectives && !symlinks.hasProcessedResolutions()) {
          symlinks.setSymlinksFromResolutions(files, resolvedTypeReferenceDirectives);
        }
        return symlinks;
      }
    }
    ts2.createProgram = createProgram;
    function updateHostForUseSourceOfProjectReferenceRedirect(host) {
      var setOfDeclarationDirectories;
      var originalFileExists = host.compilerHost.fileExists;
      var originalDirectoryExists = host.compilerHost.directoryExists;
      var originalGetDirectories = host.compilerHost.getDirectories;
      var originalRealpath = host.compilerHost.realpath;
      if (!host.useSourceOfProjectReferenceRedirect)
        return { onProgramCreateComplete: ts2.noop, fileExists };
      host.compilerHost.fileExists = fileExists;
      var directoryExists;
      if (originalDirectoryExists) {
        directoryExists = host.compilerHost.directoryExists = function(path) {
          if (originalDirectoryExists.call(host.compilerHost, path)) {
            handleDirectoryCouldBeSymlink(path);
            return true;
          }
          if (!host.getResolvedProjectReferences())
            return false;
          if (!setOfDeclarationDirectories) {
            setOfDeclarationDirectories = new ts2.Set();
            host.forEachResolvedProjectReference(function(ref) {
              var out = ts2.outFile(ref.commandLine.options);
              if (out) {
                setOfDeclarationDirectories.add(ts2.getDirectoryPath(host.toPath(out)));
              } else {
                var declarationDir = ref.commandLine.options.declarationDir || ref.commandLine.options.outDir;
                if (declarationDir) {
                  setOfDeclarationDirectories.add(host.toPath(declarationDir));
                }
              }
            });
          }
          return fileOrDirectoryExistsUsingSource(path, false);
        };
      }
      if (originalGetDirectories) {
        host.compilerHost.getDirectories = function(path) {
          return !host.getResolvedProjectReferences() || originalDirectoryExists && originalDirectoryExists.call(host.compilerHost, path) ? originalGetDirectories.call(host.compilerHost, path) : [];
        };
      }
      if (originalRealpath) {
        host.compilerHost.realpath = function(s) {
          var _a;
          return ((_a = host.getSymlinkCache().getSymlinkedFiles()) === null || _a === void 0 ? void 0 : _a.get(host.toPath(s))) || originalRealpath.call(host.compilerHost, s);
        };
      }
      return { onProgramCreateComplete, fileExists, directoryExists };
      function onProgramCreateComplete() {
        host.compilerHost.fileExists = originalFileExists;
        host.compilerHost.directoryExists = originalDirectoryExists;
        host.compilerHost.getDirectories = originalGetDirectories;
      }
      function fileExists(file) {
        if (originalFileExists.call(host.compilerHost, file))
          return true;
        if (!host.getResolvedProjectReferences())
          return false;
        if (!ts2.isDeclarationFileName(file))
          return false;
        return fileOrDirectoryExistsUsingSource(file, true);
      }
      function fileExistsIfProjectReferenceDts(file) {
        var source = host.getSourceOfProjectReferenceRedirect(host.toPath(file));
        return source !== void 0 ? ts2.isString(source) ? originalFileExists.call(host.compilerHost, source) : true : void 0;
      }
      function directoryExistsIfProjectReferenceDeclDir(dir) {
        var dirPath = host.toPath(dir);
        var dirPathWithTrailingDirectorySeparator = "".concat(dirPath).concat(ts2.directorySeparator);
        return ts2.forEachKey(setOfDeclarationDirectories, function(declDirPath) {
          return dirPath === declDirPath || ts2.startsWith(declDirPath, dirPathWithTrailingDirectorySeparator) || ts2.startsWith(dirPath, "".concat(declDirPath, "/"));
        });
      }
      function handleDirectoryCouldBeSymlink(directory) {
        var _a;
        if (!host.getResolvedProjectReferences() || ts2.containsIgnoredPath(directory))
          return;
        if (!originalRealpath || !ts2.stringContains(directory, ts2.nodeModulesPathPart))
          return;
        var symlinkCache = host.getSymlinkCache();
        var directoryPath = ts2.ensureTrailingDirectorySeparator(host.toPath(directory));
        if ((_a = symlinkCache.getSymlinkedDirectories()) === null || _a === void 0 ? void 0 : _a.has(directoryPath))
          return;
        var real = ts2.normalizePath(originalRealpath.call(host.compilerHost, directory));
        var realPath;
        if (real === directory || (realPath = ts2.ensureTrailingDirectorySeparator(host.toPath(real))) === directoryPath) {
          symlinkCache.setSymlinkedDirectory(directoryPath, false);
          return;
        }
        symlinkCache.setSymlinkedDirectory(directory, {
          real: ts2.ensureTrailingDirectorySeparator(real),
          realPath
        });
      }
      function fileOrDirectoryExistsUsingSource(fileOrDirectory, isFile) {
        var _a;
        var fileOrDirectoryExistsUsingSource2 = isFile ? function(file) {
          return fileExistsIfProjectReferenceDts(file);
        } : function(dir) {
          return directoryExistsIfProjectReferenceDeclDir(dir);
        };
        var result = fileOrDirectoryExistsUsingSource2(fileOrDirectory);
        if (result !== void 0)
          return result;
        var symlinkCache = host.getSymlinkCache();
        var symlinkedDirectories = symlinkCache.getSymlinkedDirectories();
        if (!symlinkedDirectories)
          return false;
        var fileOrDirectoryPath = host.toPath(fileOrDirectory);
        if (!ts2.stringContains(fileOrDirectoryPath, ts2.nodeModulesPathPart))
          return false;
        if (isFile && ((_a = symlinkCache.getSymlinkedFiles()) === null || _a === void 0 ? void 0 : _a.has(fileOrDirectoryPath)))
          return true;
        return ts2.firstDefinedIterator(symlinkedDirectories.entries(), function(_a2) {
          var directoryPath = _a2[0], symlinkedDirectory = _a2[1];
          if (!symlinkedDirectory || !ts2.startsWith(fileOrDirectoryPath, directoryPath))
            return void 0;
          var result2 = fileOrDirectoryExistsUsingSource2(fileOrDirectoryPath.replace(directoryPath, symlinkedDirectory.realPath));
          if (isFile && result2) {
            var absolutePath = ts2.getNormalizedAbsolutePath(fileOrDirectory, host.compilerHost.getCurrentDirectory());
            symlinkCache.setSymlinkedFile(fileOrDirectoryPath, "".concat(symlinkedDirectory.real).concat(absolutePath.replace(new RegExp(directoryPath, "i"), "")));
          }
          return result2;
        }) || false;
      }
    }
    ts2.emitSkippedWithNoDiagnostics = { diagnostics: ts2.emptyArray, sourceMaps: void 0, emittedFiles: void 0, emitSkipped: true };
    function handleNoEmitOptions(program, sourceFile, writeFile, cancellationToken) {
      var options = program.getCompilerOptions();
      if (options.noEmit) {
        program.getSemanticDiagnostics(sourceFile, cancellationToken);
        return sourceFile || ts2.outFile(options) ? ts2.emitSkippedWithNoDiagnostics : program.emitBuildInfo(writeFile, cancellationToken);
      }
      if (!options.noEmitOnError)
        return void 0;
      var diagnostics = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], program.getOptionsDiagnostics(cancellationToken), true), program.getSyntacticDiagnostics(sourceFile, cancellationToken), true), program.getGlobalDiagnostics(cancellationToken), true), program.getSemanticDiagnostics(sourceFile, cancellationToken), true);
      if (diagnostics.length === 0 && ts2.getEmitDeclarations(program.getCompilerOptions())) {
        diagnostics = program.getDeclarationDiagnostics(void 0, cancellationToken);
      }
      if (!diagnostics.length)
        return void 0;
      var emittedFiles;
      if (!sourceFile && !ts2.outFile(options)) {
        var emitResult = program.emitBuildInfo(writeFile, cancellationToken);
        if (emitResult.diagnostics)
          diagnostics = __spreadArray(__spreadArray([], diagnostics, true), emitResult.diagnostics, true);
        emittedFiles = emitResult.emittedFiles;
      }
      return { diagnostics, sourceMaps: void 0, emittedFiles, emitSkipped: true };
    }
    ts2.handleNoEmitOptions = handleNoEmitOptions;
    function filterSemanticDiagnostics(diagnostic, option) {
      return ts2.filter(diagnostic, function(d) {
        return !d.skippedOn || !option[d.skippedOn];
      });
    }
    ts2.filterSemanticDiagnostics = filterSemanticDiagnostics;
    function parseConfigHostFromCompilerHostLike(host, directoryStructureHost) {
      if (directoryStructureHost === void 0) {
        directoryStructureHost = host;
      }
      return {
        fileExists: function(f) {
          return directoryStructureHost.fileExists(f);
        },
        readDirectory: function(root, extensions, excludes, includes, depth) {
          ts2.Debug.assertIsDefined(directoryStructureHost.readDirectory, "'CompilerHost.readDirectory' must be implemented to correctly process 'projectReferences'");
          return directoryStructureHost.readDirectory(root, extensions, excludes, includes, depth);
        },
        readFile: function(f) {
          return directoryStructureHost.readFile(f);
        },
        useCaseSensitiveFileNames: host.useCaseSensitiveFileNames(),
        getCurrentDirectory: function() {
          return host.getCurrentDirectory();
        },
        onUnRecoverableConfigFileDiagnostic: host.onUnRecoverableConfigFileDiagnostic || ts2.returnUndefined,
        trace: host.trace ? function(s) {
          return host.trace(s);
        } : void 0
      };
    }
    ts2.parseConfigHostFromCompilerHostLike = parseConfigHostFromCompilerHostLike;
    function createPrependNodes(projectReferences, getCommandLine, readFile) {
      if (!projectReferences)
        return ts2.emptyArray;
      var nodes;
      for (var i = 0; i < projectReferences.length; i++) {
        var ref = projectReferences[i];
        var resolvedRefOpts = getCommandLine(ref, i);
        if (ref.prepend && resolvedRefOpts && resolvedRefOpts.options) {
          var out = ts2.outFile(resolvedRefOpts.options);
          if (!out)
            continue;
          var _a = ts2.getOutputPathsForBundle(resolvedRefOpts.options, true), jsFilePath = _a.jsFilePath, sourceMapFilePath = _a.sourceMapFilePath, declarationFilePath = _a.declarationFilePath, declarationMapPath = _a.declarationMapPath, buildInfoPath = _a.buildInfoPath;
          var node = ts2.createInputFiles(readFile, jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath, buildInfoPath);
          (nodes || (nodes = [])).push(node);
        }
      }
      return nodes || ts2.emptyArray;
    }
    ts2.createPrependNodes = createPrependNodes;
    function resolveProjectReferencePath(hostOrRef, ref) {
      var passedInRef = ref ? ref : hostOrRef;
      return ts2.resolveConfigFileProjectName(passedInRef.path);
    }
    ts2.resolveProjectReferencePath = resolveProjectReferencePath;
    function getResolutionDiagnostic(options, _a) {
      var extension = _a.extension;
      switch (extension) {
        case ".ts":
        case ".d.ts":
          return void 0;
        case ".tsx":
          return needJsx();
        case ".jsx":
          return needJsx() || needAllowJs();
        case ".js":
          return needAllowJs();
        case ".json":
          return needResolveJsonModule();
      }
      function needJsx() {
        return options.jsx ? void 0 : ts2.Diagnostics.Module_0_was_resolved_to_1_but_jsx_is_not_set;
      }
      function needAllowJs() {
        return ts2.getAllowJSCompilerOption(options) || !ts2.getStrictOptionValue(options, "noImplicitAny") ? void 0 : ts2.Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type;
      }
      function needResolveJsonModule() {
        return options.resolveJsonModule ? void 0 : ts2.Diagnostics.Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used;
      }
    }
    ts2.getResolutionDiagnostic = getResolutionDiagnostic;
    function getModuleNames(_a) {
      var imports = _a.imports, moduleAugmentations = _a.moduleAugmentations;
      var res = imports.map(function(i) {
        return i.text;
      });
      for (var _i = 0, moduleAugmentations_1 = moduleAugmentations; _i < moduleAugmentations_1.length; _i++) {
        var aug = moduleAugmentations_1[_i];
        if (aug.kind === 10) {
          res.push(aug.text);
        }
      }
      return res;
    }
    function getModuleNameStringLiteralAt(_a, index) {
      var imports = _a.imports, moduleAugmentations = _a.moduleAugmentations;
      if (index < imports.length)
        return imports[index];
      var augIndex = imports.length;
      for (var _i = 0, moduleAugmentations_2 = moduleAugmentations; _i < moduleAugmentations_2.length; _i++) {
        var aug = moduleAugmentations_2[_i];
        if (aug.kind === 10) {
          if (index === augIndex)
            return aug;
          augIndex++;
        }
      }
      ts2.Debug.fail("should never ask for module name at index higher than possible module name");
    }
    ts2.getModuleNameStringLiteralAt = getModuleNameStringLiteralAt;
  })(ts || (ts = {}));
  (function(ts2) {
    function getFileEmitOutput(program, sourceFile, emitOnlyDtsFiles, cancellationToken, customTransformers, forceDtsEmit) {
      var outputFiles = [];
      var _a = program.emit(sourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers, forceDtsEmit), emitSkipped = _a.emitSkipped, diagnostics = _a.diagnostics, exportedModulesFromDeclarationEmit = _a.exportedModulesFromDeclarationEmit;
      return { outputFiles, emitSkipped, diagnostics, exportedModulesFromDeclarationEmit };
      function writeFile(fileName, text, writeByteOrderMark) {
        outputFiles.push({ name: fileName, writeByteOrderMark, text });
      }
    }
    ts2.getFileEmitOutput = getFileEmitOutput;
    var BuilderState;
    (function(BuilderState2) {
      var manyToManyPathMapCount = 0;
      function createManyToManyPathMap() {
        function create3(forward, reverse, deleted) {
          var version = 0;
          var map = {
            id: manyToManyPathMapCount++,
            version: function() {
              return version;
            },
            clone: function() {
              return create3(new ts2.Map(forward), new ts2.Map(reverse), deleted && new ts2.Set(deleted));
            },
            forEach: function(fn) {
              return forward.forEach(fn);
            },
            getKeys: function(v) {
              return reverse.get(v);
            },
            getValues: function(k) {
              return forward.get(k);
            },
            hasKey: function(k) {
              return forward.has(k);
            },
            keys: function() {
              return forward.keys();
            },
            deletedKeys: function() {
              return deleted;
            },
            deleteKey: function(k) {
              (deleted || (deleted = new ts2.Set())).add(k);
              var set = forward.get(k);
              if (!set) {
                return false;
              }
              set.forEach(function(v) {
                return deleteFromMultimap(reverse, v, k);
              });
              forward.delete(k);
              version++;
              return true;
            },
            set: function(k, vSet) {
              var changed = !!(deleted === null || deleted === void 0 ? void 0 : deleted.delete(k));
              var existingVSet = forward.get(k);
              forward.set(k, vSet);
              existingVSet === null || existingVSet === void 0 ? void 0 : existingVSet.forEach(function(v) {
                if (!vSet.has(v)) {
                  changed = true;
                  deleteFromMultimap(reverse, v, k);
                }
              });
              vSet.forEach(function(v) {
                if (!(existingVSet === null || existingVSet === void 0 ? void 0 : existingVSet.has(v))) {
                  changed = true;
                  addToMultimap(reverse, v, k);
                }
              });
              if (changed) {
                version++;
              }
              return map;
            }
          };
          return map;
        }
        return create3(new ts2.Map(), new ts2.Map(), void 0);
      }
      BuilderState2.createManyToManyPathMap = createManyToManyPathMap;
      function addToMultimap(map, k, v) {
        var set = map.get(k);
        if (!set) {
          set = new ts2.Set();
          map.set(k, set);
        }
        set.add(v);
      }
      function deleteFromMultimap(map, k, v, removeEmpty) {
        if (removeEmpty === void 0) {
          removeEmpty = true;
        }
        var set = map.get(k);
        if (set === null || set === void 0 ? void 0 : set.delete(v)) {
          if (removeEmpty && !set.size) {
            map.delete(k);
          }
          return true;
        }
        return false;
      }
      function getReferencedFilesFromImportedModuleSymbol(symbol) {
        return ts2.mapDefined(symbol.declarations, function(declaration) {
          var _a;
          return (_a = ts2.getSourceFileOfNode(declaration)) === null || _a === void 0 ? void 0 : _a.resolvedPath;
        });
      }
      function getReferencedFilesFromImportLiteral(checker, importName) {
        var symbol = checker.getSymbolAtLocation(importName);
        return symbol && getReferencedFilesFromImportedModuleSymbol(symbol);
      }
      function getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName) {
        return ts2.toPath(program.getProjectReferenceRedirect(fileName) || fileName, sourceFileDirectory, getCanonicalFileName);
      }
      function getReferencedFiles(program, sourceFile, getCanonicalFileName) {
        var referencedFiles;
        if (sourceFile.imports && sourceFile.imports.length > 0) {
          var checker = program.getTypeChecker();
          for (var _i = 0, _a = sourceFile.imports; _i < _a.length; _i++) {
            var importName = _a[_i];
            var declarationSourceFilePaths = getReferencedFilesFromImportLiteral(checker, importName);
            declarationSourceFilePaths === null || declarationSourceFilePaths === void 0 ? void 0 : declarationSourceFilePaths.forEach(addReferencedFile);
          }
        }
        var sourceFileDirectory = ts2.getDirectoryPath(sourceFile.resolvedPath);
        if (sourceFile.referencedFiles && sourceFile.referencedFiles.length > 0) {
          for (var _b = 0, _c = sourceFile.referencedFiles; _b < _c.length; _b++) {
            var referencedFile = _c[_b];
            var referencedPath = getReferencedFileFromFileName(program, referencedFile.fileName, sourceFileDirectory, getCanonicalFileName);
            addReferencedFile(referencedPath);
          }
        }
        if (sourceFile.resolvedTypeReferenceDirectiveNames) {
          sourceFile.resolvedTypeReferenceDirectiveNames.forEach(function(resolvedTypeReferenceDirective) {
            if (!resolvedTypeReferenceDirective) {
              return;
            }
            var fileName = resolvedTypeReferenceDirective.resolvedFileName;
            var typeFilePath = getReferencedFileFromFileName(program, fileName, sourceFileDirectory, getCanonicalFileName);
            addReferencedFile(typeFilePath);
          });
        }
        if (sourceFile.moduleAugmentations.length) {
          var checker = program.getTypeChecker();
          for (var _d = 0, _e = sourceFile.moduleAugmentations; _d < _e.length; _d++) {
            var moduleName = _e[_d];
            if (!ts2.isStringLiteral(moduleName))
              continue;
            var symbol = checker.getSymbolAtLocation(moduleName);
            if (!symbol)
              continue;
            addReferenceFromAmbientModule(symbol);
          }
        }
        for (var _f = 0, _g = program.getTypeChecker().getAmbientModules(); _f < _g.length; _f++) {
          var ambientModule = _g[_f];
          if (ambientModule.declarations && ambientModule.declarations.length > 1) {
            addReferenceFromAmbientModule(ambientModule);
          }
        }
        return referencedFiles;
        function addReferenceFromAmbientModule(symbol2) {
          if (!symbol2.declarations) {
            return;
          }
          for (var _i2 = 0, _a2 = symbol2.declarations; _i2 < _a2.length; _i2++) {
            var declaration = _a2[_i2];
            var declarationSourceFile = ts2.getSourceFileOfNode(declaration);
            if (declarationSourceFile && declarationSourceFile !== sourceFile) {
              addReferencedFile(declarationSourceFile.resolvedPath);
            }
          }
        }
        function addReferencedFile(referencedPath2) {
          (referencedFiles || (referencedFiles = new ts2.Set())).add(referencedPath2);
        }
      }
      function canReuseOldState(newReferencedMap, oldState) {
        return oldState && !oldState.referencedMap === !newReferencedMap;
      }
      BuilderState2.canReuseOldState = canReuseOldState;
      function create2(newProgram, getCanonicalFileName, oldState, disableUseFileVersionAsSignature) {
        var fileInfos = new ts2.Map();
        var referencedMap = newProgram.getCompilerOptions().module !== ts2.ModuleKind.None ? createManyToManyPathMap() : void 0;
        var exportedModulesMap = referencedMap ? createManyToManyPathMap() : void 0;
        var hasCalledUpdateShapeSignature = new ts2.Set();
        var useOldState = canReuseOldState(referencedMap, oldState);
        newProgram.getTypeChecker();
        for (var _i = 0, _a = newProgram.getSourceFiles(); _i < _a.length; _i++) {
          var sourceFile = _a[_i];
          var version_2 = ts2.Debug.checkDefined(sourceFile.version, "Program intended to be used with Builder should have source files with versions set");
          var oldInfo = useOldState ? oldState.fileInfos.get(sourceFile.resolvedPath) : void 0;
          if (referencedMap) {
            var newReferences = getReferencedFiles(newProgram, sourceFile, getCanonicalFileName);
            if (newReferences) {
              referencedMap.set(sourceFile.resolvedPath, newReferences);
            }
            if (useOldState) {
              var exportedModules = oldState.exportedModulesMap.getValues(sourceFile.resolvedPath);
              if (exportedModules) {
                exportedModulesMap.set(sourceFile.resolvedPath, exportedModules);
              }
            }
          }
          fileInfos.set(sourceFile.resolvedPath, { version: version_2, signature: oldInfo && oldInfo.signature, affectsGlobalScope: isFileAffectingGlobalScope(sourceFile) || void 0, impliedFormat: sourceFile.impliedNodeFormat });
        }
        return {
          fileInfos,
          referencedMap,
          exportedModulesMap,
          hasCalledUpdateShapeSignature,
          useFileVersionAsSignature: !disableUseFileVersionAsSignature && !useOldState
        };
      }
      BuilderState2.create = create2;
      function releaseCache(state) {
        state.allFilesExcludingDefaultLibraryFile = void 0;
        state.allFileNames = void 0;
      }
      BuilderState2.releaseCache = releaseCache;
      function clone(state) {
        var _a, _b;
        return {
          fileInfos: new ts2.Map(state.fileInfos),
          referencedMap: (_a = state.referencedMap) === null || _a === void 0 ? void 0 : _a.clone(),
          exportedModulesMap: (_b = state.exportedModulesMap) === null || _b === void 0 ? void 0 : _b.clone(),
          hasCalledUpdateShapeSignature: new ts2.Set(state.hasCalledUpdateShapeSignature),
          useFileVersionAsSignature: state.useFileVersionAsSignature
        };
      }
      BuilderState2.clone = clone;
      function getFilesAffectedBy(state, programOfThisState, path, cancellationToken, computeHash, cacheToUpdateSignature, exportedModulesMapCache) {
        var signatureCache = cacheToUpdateSignature || new ts2.Map();
        var sourceFile = programOfThisState.getSourceFileByPath(path);
        if (!sourceFile) {
          return ts2.emptyArray;
        }
        if (!updateShapeSignature(state, programOfThisState, sourceFile, signatureCache, cancellationToken, computeHash, exportedModulesMapCache)) {
          return [sourceFile];
        }
        var result = (state.referencedMap ? getFilesAffectedByUpdatedShapeWhenModuleEmit : getFilesAffectedByUpdatedShapeWhenNonModuleEmit)(state, programOfThisState, sourceFile, signatureCache, cancellationToken, computeHash, exportedModulesMapCache);
        if (!cacheToUpdateSignature) {
          updateSignaturesFromCache(state, signatureCache);
        }
        return result;
      }
      BuilderState2.getFilesAffectedBy = getFilesAffectedBy;
      function updateSignaturesFromCache(state, signatureCache) {
        signatureCache.forEach(function(signature, path) {
          return updateSignatureOfFile(state, signature, path);
        });
      }
      BuilderState2.updateSignaturesFromCache = updateSignaturesFromCache;
      function updateSignatureOfFile(state, signature, path) {
        state.fileInfos.get(path).signature = signature;
        state.hasCalledUpdateShapeSignature.add(path);
      }
      BuilderState2.updateSignatureOfFile = updateSignatureOfFile;
      function updateShapeSignature(state, programOfThisState, sourceFile, cacheToUpdateSignature, cancellationToken, computeHash, exportedModulesMapCache, useFileVersionAsSignature) {
        if (useFileVersionAsSignature === void 0) {
          useFileVersionAsSignature = state.useFileVersionAsSignature;
        }
        ts2.Debug.assert(!!sourceFile);
        ts2.Debug.assert(!exportedModulesMapCache || !!state.exportedModulesMap, "Compute visible to outside map only if visibleToOutsideReferencedMap present in the state");
        if (state.hasCalledUpdateShapeSignature.has(sourceFile.resolvedPath) || cacheToUpdateSignature.has(sourceFile.resolvedPath)) {
          return false;
        }
        var info = state.fileInfos.get(sourceFile.resolvedPath);
        if (!info)
          return ts2.Debug.fail();
        var prevSignature = info.signature;
        var latestSignature;
        if (!sourceFile.isDeclarationFile && !useFileVersionAsSignature) {
          var emitOutput_1 = getFileEmitOutput(programOfThisState, sourceFile, true, cancellationToken, void 0, true);
          var firstDts_1 = ts2.firstOrUndefined(emitOutput_1.outputFiles);
          if (firstDts_1) {
            ts2.Debug.assert(ts2.fileExtensionIsOneOf(firstDts_1.name, [".d.ts", ".d.mts", ".d.cts"]), "File extension for signature expected to be dts", function() {
              return "Found: ".concat(ts2.getAnyExtensionFromPath(firstDts_1.name), " for ").concat(firstDts_1.name, ":: All output files: ").concat(JSON.stringify(emitOutput_1.outputFiles.map(function(f) {
                return f.name;
              })));
            });
            latestSignature = (computeHash || ts2.generateDjb2Hash)(firstDts_1.text);
            if (exportedModulesMapCache && latestSignature !== prevSignature) {
              updateExportedModules(sourceFile, emitOutput_1.exportedModulesFromDeclarationEmit, exportedModulesMapCache);
            }
          }
        }
        if (latestSignature === void 0) {
          latestSignature = sourceFile.version;
          if (exportedModulesMapCache && latestSignature !== prevSignature) {
            var references = state.referencedMap ? state.referencedMap.getValues(sourceFile.resolvedPath) : void 0;
            if (references) {
              exportedModulesMapCache.set(sourceFile.resolvedPath, references);
            } else {
              exportedModulesMapCache.deleteKey(sourceFile.resolvedPath);
            }
          }
        }
        cacheToUpdateSignature.set(sourceFile.resolvedPath, latestSignature);
        return latestSignature !== prevSignature;
      }
      BuilderState2.updateShapeSignature = updateShapeSignature;
      function updateExportedModules(sourceFile, exportedModulesFromDeclarationEmit, exportedModulesMapCache) {
        if (!exportedModulesFromDeclarationEmit) {
          exportedModulesMapCache.deleteKey(sourceFile.resolvedPath);
          return;
        }
        var exportedModules;
        exportedModulesFromDeclarationEmit.forEach(function(symbol) {
          return addExportedModule(getReferencedFilesFromImportedModuleSymbol(symbol));
        });
        if (exportedModules) {
          exportedModulesMapCache.set(sourceFile.resolvedPath, exportedModules);
        } else {
          exportedModulesMapCache.deleteKey(sourceFile.resolvedPath);
        }
        function addExportedModule(exportedModulePaths) {
          if (exportedModulePaths === null || exportedModulePaths === void 0 ? void 0 : exportedModulePaths.length) {
            if (!exportedModules) {
              exportedModules = new ts2.Set();
            }
            exportedModulePaths.forEach(function(path) {
              return exportedModules.add(path);
            });
          }
        }
      }
      function updateExportedFilesMapFromCache(state, exportedModulesMapCache) {
        var _a;
        if (exportedModulesMapCache) {
          ts2.Debug.assert(!!state.exportedModulesMap);
          var cacheId = exportedModulesMapCache.id;
          var cacheVersion = exportedModulesMapCache.version();
          if (state.previousCache) {
            if (state.previousCache.id === cacheId && state.previousCache.version === cacheVersion) {
              return;
            }
            state.previousCache.id = cacheId;
            state.previousCache.version = cacheVersion;
          } else {
            state.previousCache = { id: cacheId, version: cacheVersion };
          }
          (_a = exportedModulesMapCache.deletedKeys()) === null || _a === void 0 ? void 0 : _a.forEach(function(path) {
            return state.exportedModulesMap.deleteKey(path);
          });
          exportedModulesMapCache.forEach(function(exportedModules, path) {
            return state.exportedModulesMap.set(path, exportedModules);
          });
        }
      }
      BuilderState2.updateExportedFilesMapFromCache = updateExportedFilesMapFromCache;
      function getAllDependencies(state, programOfThisState, sourceFile) {
        var compilerOptions = programOfThisState.getCompilerOptions();
        if (ts2.outFile(compilerOptions)) {
          return getAllFileNames(state, programOfThisState);
        }
        if (!state.referencedMap || isFileAffectingGlobalScope(sourceFile)) {
          return getAllFileNames(state, programOfThisState);
        }
        var seenMap = new ts2.Set();
        var queue = [sourceFile.resolvedPath];
        while (queue.length) {
          var path = queue.pop();
          if (!seenMap.has(path)) {
            seenMap.add(path);
            var references = state.referencedMap.getValues(path);
            if (references) {
              var iterator = references.keys();
              for (var iterResult = iterator.next(); !iterResult.done; iterResult = iterator.next()) {
                queue.push(iterResult.value);
              }
            }
          }
        }
        return ts2.arrayFrom(ts2.mapDefinedIterator(seenMap.keys(), function(path2) {
          var _a, _b;
          return (_b = (_a = programOfThisState.getSourceFileByPath(path2)) === null || _a === void 0 ? void 0 : _a.fileName) !== null && _b !== void 0 ? _b : path2;
        }));
      }
      BuilderState2.getAllDependencies = getAllDependencies;
      function getAllFileNames(state, programOfThisState) {
        if (!state.allFileNames) {
          var sourceFiles = programOfThisState.getSourceFiles();
          state.allFileNames = sourceFiles === ts2.emptyArray ? ts2.emptyArray : sourceFiles.map(function(file) {
            return file.fileName;
          });
        }
        return state.allFileNames;
      }
      function getReferencedByPaths(state, referencedFilePath) {
        var keys = state.referencedMap.getKeys(referencedFilePath);
        return keys ? ts2.arrayFrom(keys.keys()) : [];
      }
      BuilderState2.getReferencedByPaths = getReferencedByPaths;
      function containsOnlyAmbientModules(sourceFile) {
        for (var _i = 0, _a = sourceFile.statements; _i < _a.length; _i++) {
          var statement = _a[_i];
          if (!ts2.isModuleWithStringLiteralName(statement)) {
            return false;
          }
        }
        return true;
      }
      function containsGlobalScopeAugmentation(sourceFile) {
        return ts2.some(sourceFile.moduleAugmentations, function(augmentation) {
          return ts2.isGlobalScopeAugmentation(augmentation.parent);
        });
      }
      function isFileAffectingGlobalScope(sourceFile) {
        return containsGlobalScopeAugmentation(sourceFile) || !ts2.isExternalOrCommonJsModule(sourceFile) && !ts2.isJsonSourceFile(sourceFile) && !containsOnlyAmbientModules(sourceFile);
      }
      function getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, firstSourceFile) {
        if (state.allFilesExcludingDefaultLibraryFile) {
          return state.allFilesExcludingDefaultLibraryFile;
        }
        var result;
        if (firstSourceFile)
          addSourceFile(firstSourceFile);
        for (var _i = 0, _a = programOfThisState.getSourceFiles(); _i < _a.length; _i++) {
          var sourceFile = _a[_i];
          if (sourceFile !== firstSourceFile) {
            addSourceFile(sourceFile);
          }
        }
        state.allFilesExcludingDefaultLibraryFile = result || ts2.emptyArray;
        return state.allFilesExcludingDefaultLibraryFile;
        function addSourceFile(sourceFile2) {
          if (!programOfThisState.isSourceFileDefaultLibrary(sourceFile2)) {
            (result || (result = [])).push(sourceFile2);
          }
        }
      }
      BuilderState2.getAllFilesExcludingDefaultLibraryFile = getAllFilesExcludingDefaultLibraryFile;
      function getFilesAffectedByUpdatedShapeWhenNonModuleEmit(state, programOfThisState, sourceFileWithUpdatedShape) {
        var compilerOptions = programOfThisState.getCompilerOptions();
        if (compilerOptions && ts2.outFile(compilerOptions)) {
          return [sourceFileWithUpdatedShape];
        }
        return getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, sourceFileWithUpdatedShape);
      }
      function getFilesAffectedByUpdatedShapeWhenModuleEmit(state, programOfThisState, sourceFileWithUpdatedShape, cacheToUpdateSignature, cancellationToken, computeHash, exportedModulesMapCache) {
        if (isFileAffectingGlobalScope(sourceFileWithUpdatedShape)) {
          return getAllFilesExcludingDefaultLibraryFile(state, programOfThisState, sourceFileWithUpdatedShape);
        }
        var compilerOptions = programOfThisState.getCompilerOptions();
        if (compilerOptions && (compilerOptions.isolatedModules || ts2.outFile(compilerOptions))) {
          return [sourceFileWithUpdatedShape];
        }
        var seenFileNamesMap = new ts2.Map();
        seenFileNamesMap.set(sourceFileWithUpdatedShape.resolvedPath, sourceFileWithUpdatedShape);
        var queue = getReferencedByPaths(state, sourceFileWithUpdatedShape.resolvedPath);
        while (queue.length > 0) {
          var currentPath = queue.pop();
          if (!seenFileNamesMap.has(currentPath)) {
            var currentSourceFile = programOfThisState.getSourceFileByPath(currentPath);
            seenFileNamesMap.set(currentPath, currentSourceFile);
            if (currentSourceFile && updateShapeSignature(state, programOfThisState, currentSourceFile, cacheToUpdateSignature, cancellationToken, computeHash, exportedModulesMapCache)) {
              queue.push.apply(queue, getReferencedByPaths(state, currentSourceFile.resolvedPath));
            }
          }
        }
        return ts2.arrayFrom(ts2.mapDefinedIterator(seenFileNamesMap.values(), function(value) {
          return value;
        }));
      }
    })(BuilderState = ts2.BuilderState || (ts2.BuilderState = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var BuilderFileEmit;
    (function(BuilderFileEmit2) {
      BuilderFileEmit2[BuilderFileEmit2["DtsOnly"] = 0] = "DtsOnly";
      BuilderFileEmit2[BuilderFileEmit2["Full"] = 1] = "Full";
    })(BuilderFileEmit = ts2.BuilderFileEmit || (ts2.BuilderFileEmit = {}));
    function hasSameKeys(map1, map2) {
      return map1 === map2 || map1 !== void 0 && map2 !== void 0 && map1.size === map2.size && !ts2.forEachKey(map1, function(key) {
        return !map2.has(key);
      });
    }
    function createBuilderProgramState(newProgram, getCanonicalFileName, oldState, disableUseFileVersionAsSignature) {
      var state = ts2.BuilderState.create(newProgram, getCanonicalFileName, oldState, disableUseFileVersionAsSignature);
      state.program = newProgram;
      var compilerOptions = newProgram.getCompilerOptions();
      state.compilerOptions = compilerOptions;
      if (!ts2.outFile(compilerOptions)) {
        state.semanticDiagnosticsPerFile = new ts2.Map();
      }
      state.changedFilesSet = new ts2.Set();
      var useOldState = ts2.BuilderState.canReuseOldState(state.referencedMap, oldState);
      var oldCompilerOptions = useOldState ? oldState.compilerOptions : void 0;
      var canCopySemanticDiagnostics = useOldState && oldState.semanticDiagnosticsPerFile && !!state.semanticDiagnosticsPerFile && !ts2.compilerOptionsAffectSemanticDiagnostics(compilerOptions, oldCompilerOptions);
      if (useOldState) {
        if (!oldState.currentChangedFilePath) {
          var affectedSignatures = oldState.currentAffectedFilesSignatures;
          ts2.Debug.assert(!oldState.affectedFiles && (!affectedSignatures || !affectedSignatures.size), "Cannot reuse if only few affected files of currentChangedFile were iterated");
        }
        var changedFilesSet = oldState.changedFilesSet;
        if (canCopySemanticDiagnostics) {
          ts2.Debug.assert(!changedFilesSet || !ts2.forEachKey(changedFilesSet, function(path) {
            return oldState.semanticDiagnosticsPerFile.has(path);
          }), "Semantic diagnostics shouldnt be available for changed files");
        }
        changedFilesSet === null || changedFilesSet === void 0 ? void 0 : changedFilesSet.forEach(function(value) {
          return state.changedFilesSet.add(value);
        });
        if (!ts2.outFile(compilerOptions) && oldState.affectedFilesPendingEmit) {
          state.affectedFilesPendingEmit = oldState.affectedFilesPendingEmit.slice();
          state.affectedFilesPendingEmitKind = oldState.affectedFilesPendingEmitKind && new ts2.Map(oldState.affectedFilesPendingEmitKind);
          state.affectedFilesPendingEmitIndex = oldState.affectedFilesPendingEmitIndex;
          state.seenAffectedFiles = new ts2.Set();
        }
      }
      var referencedMap = state.referencedMap;
      var oldReferencedMap = useOldState ? oldState.referencedMap : void 0;
      var copyDeclarationFileDiagnostics = canCopySemanticDiagnostics && !compilerOptions.skipLibCheck === !oldCompilerOptions.skipLibCheck;
      var copyLibFileDiagnostics = copyDeclarationFileDiagnostics && !compilerOptions.skipDefaultLibCheck === !oldCompilerOptions.skipDefaultLibCheck;
      state.fileInfos.forEach(function(info, sourceFilePath) {
        var oldInfo;
        var newReferences;
        if (!useOldState || !(oldInfo = oldState.fileInfos.get(sourceFilePath)) || oldInfo.version !== info.version || !hasSameKeys(newReferences = referencedMap && referencedMap.getValues(sourceFilePath), oldReferencedMap && oldReferencedMap.getValues(sourceFilePath)) || newReferences && ts2.forEachKey(newReferences, function(path) {
          return !state.fileInfos.has(path) && oldState.fileInfos.has(path);
        })) {
          state.changedFilesSet.add(sourceFilePath);
        } else if (canCopySemanticDiagnostics) {
          var sourceFile = newProgram.getSourceFileByPath(sourceFilePath);
          if (sourceFile.isDeclarationFile && !copyDeclarationFileDiagnostics)
            return;
          if (sourceFile.hasNoDefaultLib && !copyLibFileDiagnostics)
            return;
          var diagnostics = oldState.semanticDiagnosticsPerFile.get(sourceFilePath);
          if (diagnostics) {
            state.semanticDiagnosticsPerFile.set(sourceFilePath, oldState.hasReusableDiagnostic ? convertToDiagnostics(diagnostics, newProgram, getCanonicalFileName) : diagnostics);
            if (!state.semanticDiagnosticsFromOldState) {
              state.semanticDiagnosticsFromOldState = new ts2.Set();
            }
            state.semanticDiagnosticsFromOldState.add(sourceFilePath);
          }
        }
      });
      if (useOldState && ts2.forEachEntry(oldState.fileInfos, function(info, sourceFilePath) {
        return info.affectsGlobalScope && !state.fileInfos.has(sourceFilePath);
      })) {
        ts2.BuilderState.getAllFilesExcludingDefaultLibraryFile(state, newProgram, void 0).forEach(function(file) {
          return state.changedFilesSet.add(file.resolvedPath);
        });
      } else if (oldCompilerOptions && !ts2.outFile(compilerOptions) && ts2.compilerOptionsAffectEmit(compilerOptions, oldCompilerOptions)) {
        newProgram.getSourceFiles().forEach(function(f) {
          return addToAffectedFilesPendingEmit(state, f.resolvedPath, 1);
        });
        ts2.Debug.assert(!state.seenAffectedFiles || !state.seenAffectedFiles.size);
        state.seenAffectedFiles = state.seenAffectedFiles || new ts2.Set();
      }
      if (useOldState) {
        ts2.forEachEntry(oldState.fileInfos, function(info, sourceFilePath) {
          if (state.fileInfos.has(sourceFilePath) && state.fileInfos.get(sourceFilePath).impliedFormat !== info.impliedFormat) {
            state.changedFilesSet.add(sourceFilePath);
          }
        });
      }
      state.buildInfoEmitPending = !!state.changedFilesSet.size;
      return state;
    }
    function convertToDiagnostics(diagnostics, newProgram, getCanonicalFileName) {
      if (!diagnostics.length)
        return ts2.emptyArray;
      var buildInfoDirectory = ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(ts2.getTsBuildInfoEmitOutputFilePath(newProgram.getCompilerOptions()), newProgram.getCurrentDirectory()));
      return diagnostics.map(function(diagnostic) {
        var result = convertToDiagnosticRelatedInformation(diagnostic, newProgram, toPath);
        result.reportsUnnecessary = diagnostic.reportsUnnecessary;
        result.reportsDeprecated = diagnostic.reportDeprecated;
        result.source = diagnostic.source;
        result.skippedOn = diagnostic.skippedOn;
        var relatedInformation = diagnostic.relatedInformation;
        result.relatedInformation = relatedInformation ? relatedInformation.length ? relatedInformation.map(function(r) {
          return convertToDiagnosticRelatedInformation(r, newProgram, toPath);
        }) : [] : void 0;
        return result;
      });
      function toPath(path) {
        return ts2.toPath(path, buildInfoDirectory, getCanonicalFileName);
      }
    }
    function convertToDiagnosticRelatedInformation(diagnostic, newProgram, toPath) {
      var file = diagnostic.file;
      return __assign(__assign({}, diagnostic), { file: file ? newProgram.getSourceFileByPath(toPath(file)) : void 0 });
    }
    function releaseCache(state) {
      ts2.BuilderState.releaseCache(state);
      state.program = void 0;
    }
    function cloneBuilderProgramState(state) {
      var _a;
      var newState = ts2.BuilderState.clone(state);
      newState.semanticDiagnosticsPerFile = state.semanticDiagnosticsPerFile && new ts2.Map(state.semanticDiagnosticsPerFile);
      newState.changedFilesSet = new ts2.Set(state.changedFilesSet);
      newState.affectedFiles = state.affectedFiles;
      newState.affectedFilesIndex = state.affectedFilesIndex;
      newState.currentChangedFilePath = state.currentChangedFilePath;
      newState.currentAffectedFilesSignatures = state.currentAffectedFilesSignatures && new ts2.Map(state.currentAffectedFilesSignatures);
      newState.currentAffectedFilesExportedModulesMap = (_a = state.currentAffectedFilesExportedModulesMap) === null || _a === void 0 ? void 0 : _a.clone();
      newState.seenAffectedFiles = state.seenAffectedFiles && new ts2.Set(state.seenAffectedFiles);
      newState.cleanedDiagnosticsOfLibFiles = state.cleanedDiagnosticsOfLibFiles;
      newState.semanticDiagnosticsFromOldState = state.semanticDiagnosticsFromOldState && new ts2.Set(state.semanticDiagnosticsFromOldState);
      newState.program = state.program;
      newState.compilerOptions = state.compilerOptions;
      newState.affectedFilesPendingEmit = state.affectedFilesPendingEmit && state.affectedFilesPendingEmit.slice();
      newState.affectedFilesPendingEmitKind = state.affectedFilesPendingEmitKind && new ts2.Map(state.affectedFilesPendingEmitKind);
      newState.affectedFilesPendingEmitIndex = state.affectedFilesPendingEmitIndex;
      newState.seenEmittedFiles = state.seenEmittedFiles && new ts2.Map(state.seenEmittedFiles);
      newState.programEmitComplete = state.programEmitComplete;
      return newState;
    }
    function assertSourceFileOkWithoutNextAffectedCall(state, sourceFile) {
      ts2.Debug.assert(!sourceFile || !state.affectedFiles || state.affectedFiles[state.affectedFilesIndex - 1] !== sourceFile || !state.semanticDiagnosticsPerFile.has(sourceFile.resolvedPath));
    }
    function getNextAffectedFile(state, cancellationToken, computeHash) {
      while (true) {
        var affectedFiles = state.affectedFiles;
        if (affectedFiles) {
          var seenAffectedFiles = state.seenAffectedFiles;
          var affectedFilesIndex = state.affectedFilesIndex;
          while (affectedFilesIndex < affectedFiles.length) {
            var affectedFile = affectedFiles[affectedFilesIndex];
            if (!seenAffectedFiles.has(affectedFile.resolvedPath)) {
              state.affectedFilesIndex = affectedFilesIndex;
              handleDtsMayChangeOfAffectedFile(state, affectedFile, cancellationToken, computeHash);
              return affectedFile;
            }
            affectedFilesIndex++;
          }
          state.changedFilesSet.delete(state.currentChangedFilePath);
          state.currentChangedFilePath = void 0;
          ts2.BuilderState.updateSignaturesFromCache(state, state.currentAffectedFilesSignatures);
          state.currentAffectedFilesSignatures.clear();
          ts2.BuilderState.updateExportedFilesMapFromCache(state, state.currentAffectedFilesExportedModulesMap);
          state.affectedFiles = void 0;
        }
        var nextKey = state.changedFilesSet.keys().next();
        if (nextKey.done) {
          return void 0;
        }
        var program = ts2.Debug.checkDefined(state.program);
        var compilerOptions = program.getCompilerOptions();
        if (ts2.outFile(compilerOptions)) {
          ts2.Debug.assert(!state.semanticDiagnosticsPerFile);
          return program;
        }
        if (!state.currentAffectedFilesSignatures)
          state.currentAffectedFilesSignatures = new ts2.Map();
        if (state.exportedModulesMap) {
          state.currentAffectedFilesExportedModulesMap || (state.currentAffectedFilesExportedModulesMap = ts2.BuilderState.createManyToManyPathMap());
        }
        state.affectedFiles = ts2.BuilderState.getFilesAffectedBy(state, program, nextKey.value, cancellationToken, computeHash, state.currentAffectedFilesSignatures, state.currentAffectedFilesExportedModulesMap);
        state.currentChangedFilePath = nextKey.value;
        state.affectedFilesIndex = 0;
        if (!state.seenAffectedFiles)
          state.seenAffectedFiles = new ts2.Set();
      }
    }
    function getNextAffectedFilePendingEmit(state) {
      var affectedFilesPendingEmit = state.affectedFilesPendingEmit;
      if (affectedFilesPendingEmit) {
        var seenEmittedFiles = state.seenEmittedFiles || (state.seenEmittedFiles = new ts2.Map());
        for (var i = state.affectedFilesPendingEmitIndex; i < affectedFilesPendingEmit.length; i++) {
          var affectedFile = ts2.Debug.checkDefined(state.program).getSourceFileByPath(affectedFilesPendingEmit[i]);
          if (affectedFile) {
            var seenKind = seenEmittedFiles.get(affectedFile.resolvedPath);
            var emitKind = ts2.Debug.checkDefined(ts2.Debug.checkDefined(state.affectedFilesPendingEmitKind).get(affectedFile.resolvedPath));
            if (seenKind === void 0 || seenKind < emitKind) {
              state.affectedFilesPendingEmitIndex = i;
              return { affectedFile, emitKind };
            }
          }
        }
        state.affectedFilesPendingEmit = void 0;
        state.affectedFilesPendingEmitKind = void 0;
        state.affectedFilesPendingEmitIndex = void 0;
      }
      return void 0;
    }
    function handleDtsMayChangeOfAffectedFile(state, affectedFile, cancellationToken, computeHash) {
      var _a;
      removeSemanticDiagnosticsOf(state, affectedFile.resolvedPath);
      if (state.allFilesExcludingDefaultLibraryFile === state.affectedFiles) {
        if (!state.cleanedDiagnosticsOfLibFiles) {
          state.cleanedDiagnosticsOfLibFiles = true;
          var program_1 = ts2.Debug.checkDefined(state.program);
          var options_2 = program_1.getCompilerOptions();
          ts2.forEach(program_1.getSourceFiles(), function(f) {
            return program_1.isSourceFileDefaultLibrary(f) && !ts2.skipTypeChecking(f, options_2, program_1) && removeSemanticDiagnosticsOf(state, f.resolvedPath);
          });
        }
        ts2.BuilderState.updateShapeSignature(state, ts2.Debug.checkDefined(state.program), affectedFile, ts2.Debug.checkDefined(state.currentAffectedFilesSignatures), cancellationToken, computeHash, state.currentAffectedFilesExportedModulesMap);
        return;
      } else {
        ts2.Debug.assert(state.hasCalledUpdateShapeSignature.has(affectedFile.resolvedPath) || ((_a = state.currentAffectedFilesSignatures) === null || _a === void 0 ? void 0 : _a.has(affectedFile.resolvedPath)), "Signature not updated for affected file: ".concat(affectedFile.fileName));
      }
      if (!state.compilerOptions.assumeChangesOnlyAffectDirectDependencies) {
        forEachReferencingModulesOfExportOfAffectedFile(state, affectedFile, function(state2, path) {
          return handleDtsMayChangeOf(state2, path, cancellationToken, computeHash);
        });
      }
    }
    function handleDtsMayChangeOf(state, path, cancellationToken, computeHash) {
      removeSemanticDiagnosticsOf(state, path);
      if (!state.changedFilesSet.has(path)) {
        var program = ts2.Debug.checkDefined(state.program);
        var sourceFile = program.getSourceFileByPath(path);
        if (sourceFile) {
          ts2.BuilderState.updateShapeSignature(state, program, sourceFile, ts2.Debug.checkDefined(state.currentAffectedFilesSignatures), cancellationToken, computeHash, state.currentAffectedFilesExportedModulesMap, true);
          if (ts2.getEmitDeclarations(state.compilerOptions)) {
            addToAffectedFilesPendingEmit(state, path, 0);
          }
        }
      }
    }
    function removeSemanticDiagnosticsOf(state, path) {
      if (!state.semanticDiagnosticsFromOldState) {
        return true;
      }
      state.semanticDiagnosticsFromOldState.delete(path);
      state.semanticDiagnosticsPerFile.delete(path);
      return !state.semanticDiagnosticsFromOldState.size;
    }
    function isChangedSignature(state, path) {
      var newSignature = ts2.Debug.checkDefined(state.currentAffectedFilesSignatures).get(path);
      var oldSignature = ts2.Debug.checkDefined(state.fileInfos.get(path)).signature;
      return newSignature !== oldSignature;
    }
    function forEachReferencingModulesOfExportOfAffectedFile(state, affectedFile, fn) {
      var _a, _b;
      if (!state.exportedModulesMap || !state.changedFilesSet.has(affectedFile.resolvedPath)) {
        return;
      }
      if (!isChangedSignature(state, affectedFile.resolvedPath))
        return;
      if (state.compilerOptions.isolatedModules) {
        var seenFileNamesMap = new ts2.Map();
        seenFileNamesMap.set(affectedFile.resolvedPath, true);
        var queue = ts2.BuilderState.getReferencedByPaths(state, affectedFile.resolvedPath);
        while (queue.length > 0) {
          var currentPath = queue.pop();
          if (!seenFileNamesMap.has(currentPath)) {
            seenFileNamesMap.set(currentPath, true);
            fn(state, currentPath);
            if (isChangedSignature(state, currentPath)) {
              var currentSourceFile = ts2.Debug.checkDefined(state.program).getSourceFileByPath(currentPath);
              queue.push.apply(queue, ts2.BuilderState.getReferencedByPaths(state, currentSourceFile.resolvedPath));
            }
          }
        }
      }
      ts2.Debug.assert(!!state.currentAffectedFilesExportedModulesMap);
      var seenFileAndExportsOfFile = new ts2.Set();
      (_a = state.currentAffectedFilesExportedModulesMap.getKeys(affectedFile.resolvedPath)) === null || _a === void 0 ? void 0 : _a.forEach(function(exportedFromPath) {
        return forEachFilesReferencingPath(state, exportedFromPath, seenFileAndExportsOfFile, fn);
      });
      (_b = state.exportedModulesMap.getKeys(affectedFile.resolvedPath)) === null || _b === void 0 ? void 0 : _b.forEach(function(exportedFromPath) {
        var _a2;
        return !state.currentAffectedFilesExportedModulesMap.hasKey(exportedFromPath) && !((_a2 = state.currentAffectedFilesExportedModulesMap.deletedKeys()) === null || _a2 === void 0 ? void 0 : _a2.has(exportedFromPath)) && forEachFilesReferencingPath(state, exportedFromPath, seenFileAndExportsOfFile, fn);
      });
    }
    function forEachFilesReferencingPath(state, referencedPath, seenFileAndExportsOfFile, fn) {
      var _a;
      (_a = state.referencedMap.getKeys(referencedPath)) === null || _a === void 0 ? void 0 : _a.forEach(function(filePath) {
        return forEachFileAndExportsOfFile(state, filePath, seenFileAndExportsOfFile, fn);
      });
    }
    function forEachFileAndExportsOfFile(state, filePath, seenFileAndExportsOfFile, fn) {
      var _a, _b, _c;
      if (!ts2.tryAddToSet(seenFileAndExportsOfFile, filePath)) {
        return;
      }
      fn(state, filePath);
      ts2.Debug.assert(!!state.currentAffectedFilesExportedModulesMap);
      (_a = state.currentAffectedFilesExportedModulesMap.getKeys(filePath)) === null || _a === void 0 ? void 0 : _a.forEach(function(exportedFromPath) {
        return forEachFileAndExportsOfFile(state, exportedFromPath, seenFileAndExportsOfFile, fn);
      });
      (_b = state.exportedModulesMap.getKeys(filePath)) === null || _b === void 0 ? void 0 : _b.forEach(function(exportedFromPath) {
        var _a2;
        return !state.currentAffectedFilesExportedModulesMap.hasKey(exportedFromPath) && !((_a2 = state.currentAffectedFilesExportedModulesMap.deletedKeys()) === null || _a2 === void 0 ? void 0 : _a2.has(exportedFromPath)) && forEachFileAndExportsOfFile(state, exportedFromPath, seenFileAndExportsOfFile, fn);
      });
      (_c = state.referencedMap.getKeys(filePath)) === null || _c === void 0 ? void 0 : _c.forEach(function(referencingFilePath) {
        return !seenFileAndExportsOfFile.has(referencingFilePath) && fn(state, referencingFilePath);
      });
    }
    function doneWithAffectedFile(state, affected, emitKind, isPendingEmit, isBuildInfoEmit) {
      if (isBuildInfoEmit) {
        state.buildInfoEmitPending = false;
      } else if (affected === state.program) {
        state.changedFilesSet.clear();
        state.programEmitComplete = true;
      } else {
        state.seenAffectedFiles.add(affected.resolvedPath);
        if (emitKind !== void 0) {
          (state.seenEmittedFiles || (state.seenEmittedFiles = new ts2.Map())).set(affected.resolvedPath, emitKind);
        }
        if (isPendingEmit) {
          state.affectedFilesPendingEmitIndex++;
          state.buildInfoEmitPending = true;
        } else {
          state.affectedFilesIndex++;
        }
      }
    }
    function toAffectedFileResult(state, result, affected) {
      doneWithAffectedFile(state, affected);
      return { result, affected };
    }
    function toAffectedFileEmitResult(state, result, affected, emitKind, isPendingEmit, isBuildInfoEmit) {
      doneWithAffectedFile(state, affected, emitKind, isPendingEmit, isBuildInfoEmit);
      return { result, affected };
    }
    function getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken) {
      return ts2.concatenate(getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken), ts2.Debug.checkDefined(state.program).getProgramDiagnostics(sourceFile));
    }
    function getBinderAndCheckerDiagnosticsOfFile(state, sourceFile, cancellationToken) {
      var path = sourceFile.resolvedPath;
      if (state.semanticDiagnosticsPerFile) {
        var cachedDiagnostics = state.semanticDiagnosticsPerFile.get(path);
        if (cachedDiagnostics) {
          return ts2.filterSemanticDiagnostics(cachedDiagnostics, state.compilerOptions);
        }
      }
      var diagnostics = ts2.Debug.checkDefined(state.program).getBindAndCheckDiagnostics(sourceFile, cancellationToken);
      if (state.semanticDiagnosticsPerFile) {
        state.semanticDiagnosticsPerFile.set(path, diagnostics);
      }
      return ts2.filterSemanticDiagnostics(diagnostics, state.compilerOptions);
    }
    function getProgramBuildInfo(state, getCanonicalFileName) {
      if (ts2.outFile(state.compilerOptions))
        return void 0;
      var currentDirectory = ts2.Debug.checkDefined(state.program).getCurrentDirectory();
      var buildInfoDirectory = ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(ts2.getTsBuildInfoEmitOutputFilePath(state.compilerOptions), currentDirectory));
      var fileNames = [];
      var fileNameToFileId = new ts2.Map();
      var fileIdsList;
      var fileNamesToFileIdListId;
      var fileInfos = ts2.arrayFrom(state.fileInfos.entries(), function(_a2) {
        var key2 = _a2[0], value2 = _a2[1];
        var fileId = toFileId(key2);
        ts2.Debug.assert(fileNames[fileId - 1] === relativeToBuildInfo(key2));
        var signature = state.currentAffectedFilesSignatures && state.currentAffectedFilesSignatures.get(key2);
        var actualSignature = signature !== null && signature !== void 0 ? signature : value2.signature;
        return value2.version === actualSignature ? value2.affectsGlobalScope ? { version: value2.version, signature: void 0, affectsGlobalScope: true, impliedFormat: value2.impliedFormat } : value2.version : actualSignature !== void 0 ? signature === void 0 ? value2 : { version: value2.version, signature, affectsGlobalScope: value2.affectsGlobalScope, impliedFormat: value2.impliedFormat } : { version: value2.version, signature: false, affectsGlobalScope: value2.affectsGlobalScope, impliedFormat: value2.impliedFormat };
      });
      var referencedMap;
      if (state.referencedMap) {
        referencedMap = ts2.arrayFrom(state.referencedMap.keys()).sort(ts2.compareStringsCaseSensitive).map(function(key2) {
          return [
            toFileId(key2),
            toFileIdListId(state.referencedMap.getValues(key2))
          ];
        });
      }
      var exportedModulesMap;
      if (state.exportedModulesMap) {
        exportedModulesMap = ts2.mapDefined(ts2.arrayFrom(state.exportedModulesMap.keys()).sort(ts2.compareStringsCaseSensitive), function(key2) {
          var _a2;
          if (state.currentAffectedFilesExportedModulesMap) {
            if ((_a2 = state.currentAffectedFilesExportedModulesMap.deletedKeys()) === null || _a2 === void 0 ? void 0 : _a2.has(key2)) {
              return void 0;
            }
            var newValue = state.currentAffectedFilesExportedModulesMap.getValues(key2);
            if (newValue) {
              return [toFileId(key2), toFileIdListId(newValue)];
            }
          }
          return [toFileId(key2), toFileIdListId(state.exportedModulesMap.getValues(key2))];
        });
      }
      var semanticDiagnosticsPerFile;
      if (state.semanticDiagnosticsPerFile) {
        for (var _i = 0, _a = ts2.arrayFrom(state.semanticDiagnosticsPerFile.keys()).sort(ts2.compareStringsCaseSensitive); _i < _a.length; _i++) {
          var key = _a[_i];
          var value = state.semanticDiagnosticsPerFile.get(key);
          (semanticDiagnosticsPerFile || (semanticDiagnosticsPerFile = [])).push(value.length ? [
            toFileId(key),
            state.hasReusableDiagnostic ? value : convertToReusableDiagnostics(value, relativeToBuildInfo)
          ] : toFileId(key));
        }
      }
      var affectedFilesPendingEmit;
      if (state.affectedFilesPendingEmit) {
        var seenFiles = new ts2.Set();
        for (var _b = 0, _c = state.affectedFilesPendingEmit.slice(state.affectedFilesPendingEmitIndex).sort(ts2.compareStringsCaseSensitive); _b < _c.length; _b++) {
          var path = _c[_b];
          if (ts2.tryAddToSet(seenFiles, path)) {
            (affectedFilesPendingEmit || (affectedFilesPendingEmit = [])).push([toFileId(path), state.affectedFilesPendingEmitKind.get(path)]);
          }
        }
      }
      return {
        fileNames,
        fileInfos,
        options: convertToProgramBuildInfoCompilerOptions(state.compilerOptions, relativeToBuildInfoEnsuringAbsolutePath),
        fileIdsList,
        referencedMap,
        exportedModulesMap,
        semanticDiagnosticsPerFile,
        affectedFilesPendingEmit
      };
      function relativeToBuildInfoEnsuringAbsolutePath(path2) {
        return relativeToBuildInfo(ts2.getNormalizedAbsolutePath(path2, currentDirectory));
      }
      function relativeToBuildInfo(path2) {
        return ts2.ensurePathIsNonModuleName(ts2.getRelativePathFromDirectory(buildInfoDirectory, path2, getCanonicalFileName));
      }
      function toFileId(path2) {
        var fileId = fileNameToFileId.get(path2);
        if (fileId === void 0) {
          fileNames.push(relativeToBuildInfo(path2));
          fileNameToFileId.set(path2, fileId = fileNames.length);
        }
        return fileId;
      }
      function toFileIdListId(set) {
        var fileIds = ts2.arrayFrom(set.keys(), toFileId).sort(ts2.compareValues);
        var key2 = fileIds.join();
        var fileIdListId = fileNamesToFileIdListId === null || fileNamesToFileIdListId === void 0 ? void 0 : fileNamesToFileIdListId.get(key2);
        if (fileIdListId === void 0) {
          (fileIdsList || (fileIdsList = [])).push(fileIds);
          (fileNamesToFileIdListId || (fileNamesToFileIdListId = new ts2.Map())).set(key2, fileIdListId = fileIdsList.length);
        }
        return fileIdListId;
      }
    }
    function convertToProgramBuildInfoCompilerOptions(options, relativeToBuildInfo) {
      var result;
      var optionsNameMap = ts2.getOptionsNameMap().optionsNameMap;
      for (var _i = 0, _a = ts2.getOwnKeys(options).sort(ts2.compareStringsCaseSensitive); _i < _a.length; _i++) {
        var name = _a[_i];
        var optionKey = name.toLowerCase();
        var optionInfo = optionsNameMap.get(optionKey);
        if ((optionInfo === null || optionInfo === void 0 ? void 0 : optionInfo.affectsEmit) || (optionInfo === null || optionInfo === void 0 ? void 0 : optionInfo.affectsSemanticDiagnostics) || optionKey === "strict" || optionKey === "skiplibcheck" || optionKey === "skipdefaultlibcheck") {
          (result || (result = {}))[name] = convertToReusableCompilerOptionValue(optionInfo, options[name], relativeToBuildInfo);
        }
      }
      return result;
    }
    function convertToReusableCompilerOptionValue(option, value, relativeToBuildInfo) {
      if (option) {
        if (option.type === "list") {
          var values = value;
          if (option.element.isFilePath && values.length) {
            return values.map(relativeToBuildInfo);
          }
        } else if (option.isFilePath) {
          return relativeToBuildInfo(value);
        }
      }
      return value;
    }
    function convertToReusableDiagnostics(diagnostics, relativeToBuildInfo) {
      ts2.Debug.assert(!!diagnostics.length);
      return diagnostics.map(function(diagnostic) {
        var result = convertToReusableDiagnosticRelatedInformation(diagnostic, relativeToBuildInfo);
        result.reportsUnnecessary = diagnostic.reportsUnnecessary;
        result.reportDeprecated = diagnostic.reportsDeprecated;
        result.source = diagnostic.source;
        result.skippedOn = diagnostic.skippedOn;
        var relatedInformation = diagnostic.relatedInformation;
        result.relatedInformation = relatedInformation ? relatedInformation.length ? relatedInformation.map(function(r) {
          return convertToReusableDiagnosticRelatedInformation(r, relativeToBuildInfo);
        }) : [] : void 0;
        return result;
      });
    }
    function convertToReusableDiagnosticRelatedInformation(diagnostic, relativeToBuildInfo) {
      var file = diagnostic.file;
      return __assign(__assign({}, diagnostic), { file: file ? relativeToBuildInfo(file.resolvedPath) : void 0 });
    }
    var BuilderProgramKind;
    (function(BuilderProgramKind2) {
      BuilderProgramKind2[BuilderProgramKind2["SemanticDiagnosticsBuilderProgram"] = 0] = "SemanticDiagnosticsBuilderProgram";
      BuilderProgramKind2[BuilderProgramKind2["EmitAndSemanticDiagnosticsBuilderProgram"] = 1] = "EmitAndSemanticDiagnosticsBuilderProgram";
    })(BuilderProgramKind = ts2.BuilderProgramKind || (ts2.BuilderProgramKind = {}));
    function getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
      var host;
      var newProgram;
      var oldProgram;
      if (newProgramOrRootNames === void 0) {
        ts2.Debug.assert(hostOrOptions === void 0);
        host = oldProgramOrHost;
        oldProgram = configFileParsingDiagnosticsOrOldProgram;
        ts2.Debug.assert(!!oldProgram);
        newProgram = oldProgram.getProgram();
      } else if (ts2.isArray(newProgramOrRootNames)) {
        oldProgram = configFileParsingDiagnosticsOrOldProgram;
        newProgram = ts2.createProgram({
          rootNames: newProgramOrRootNames,
          options: hostOrOptions,
          host: oldProgramOrHost,
          oldProgram: oldProgram && oldProgram.getProgramOrUndefined(),
          configFileParsingDiagnostics,
          projectReferences
        });
        host = oldProgramOrHost;
      } else {
        newProgram = newProgramOrRootNames;
        host = hostOrOptions;
        oldProgram = oldProgramOrHost;
        configFileParsingDiagnostics = configFileParsingDiagnosticsOrOldProgram;
      }
      return { host, newProgram, oldProgram, configFileParsingDiagnostics: configFileParsingDiagnostics || ts2.emptyArray };
    }
    ts2.getBuilderCreationParameters = getBuilderCreationParameters;
    function createBuilderProgram(kind, _a) {
      var newProgram = _a.newProgram, host = _a.host, oldProgram = _a.oldProgram, configFileParsingDiagnostics = _a.configFileParsingDiagnostics;
      var oldState = oldProgram && oldProgram.getState();
      if (oldState && newProgram === oldState.program && configFileParsingDiagnostics === newProgram.getConfigFileParsingDiagnostics()) {
        newProgram = void 0;
        oldState = void 0;
        return oldProgram;
      }
      var getCanonicalFileName = ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames());
      var computeHash = ts2.maybeBind(host, host.createHash);
      var state = createBuilderProgramState(newProgram, getCanonicalFileName, oldState, host.disableUseFileVersionAsSignature);
      var backupState;
      newProgram.getProgramBuildInfo = function() {
        return getProgramBuildInfo(state, getCanonicalFileName);
      };
      newProgram = void 0;
      oldProgram = void 0;
      oldState = void 0;
      var getState = function() {
        return state;
      };
      var builderProgram = createRedirectedBuilderProgram(getState, configFileParsingDiagnostics);
      builderProgram.getState = getState;
      builderProgram.backupState = function() {
        ts2.Debug.assert(backupState === void 0);
        backupState = cloneBuilderProgramState(state);
      };
      builderProgram.restoreState = function() {
        state = ts2.Debug.checkDefined(backupState);
        backupState = void 0;
      };
      builderProgram.getAllDependencies = function(sourceFile) {
        return ts2.BuilderState.getAllDependencies(state, ts2.Debug.checkDefined(state.program), sourceFile);
      };
      builderProgram.getSemanticDiagnostics = getSemanticDiagnostics;
      builderProgram.emit = emit;
      builderProgram.releaseProgram = function() {
        releaseCache(state);
        backupState = void 0;
      };
      if (kind === BuilderProgramKind.SemanticDiagnosticsBuilderProgram) {
        builderProgram.getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile;
      } else if (kind === BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram) {
        builderProgram.getSemanticDiagnosticsOfNextAffectedFile = getSemanticDiagnosticsOfNextAffectedFile;
        builderProgram.emitNextAffectedFile = emitNextAffectedFile;
        builderProgram.emitBuildInfo = emitBuildInfo;
      } else {
        ts2.notImplemented();
      }
      return builderProgram;
      function emitBuildInfo(writeFile, cancellationToken) {
        if (state.buildInfoEmitPending) {
          var result = ts2.Debug.checkDefined(state.program).emitBuildInfo(writeFile || ts2.maybeBind(host, host.writeFile), cancellationToken);
          state.buildInfoEmitPending = false;
          return result;
        }
        return ts2.emitSkippedWithNoDiagnostics;
      }
      function emitNextAffectedFile(writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers) {
        var affected = getNextAffectedFile(state, cancellationToken, computeHash);
        var emitKind = 1;
        var isPendingEmitFile = false;
        if (!affected) {
          if (!ts2.outFile(state.compilerOptions)) {
            var pendingAffectedFile = getNextAffectedFilePendingEmit(state);
            if (!pendingAffectedFile) {
              if (!state.buildInfoEmitPending) {
                return void 0;
              }
              var affected_1 = ts2.Debug.checkDefined(state.program);
              return toAffectedFileEmitResult(state, affected_1.emitBuildInfo(writeFile || ts2.maybeBind(host, host.writeFile), cancellationToken), affected_1, 1, false, true);
            }
            affected = pendingAffectedFile.affectedFile, emitKind = pendingAffectedFile.emitKind;
            isPendingEmitFile = true;
          } else {
            var program = ts2.Debug.checkDefined(state.program);
            if (state.programEmitComplete)
              return void 0;
            affected = program;
          }
        }
        return toAffectedFileEmitResult(state, ts2.Debug.checkDefined(state.program).emit(affected === state.program ? void 0 : affected, writeFile || ts2.maybeBind(host, host.writeFile), cancellationToken, emitOnlyDtsFiles || emitKind === 0, customTransformers), affected, emitKind, isPendingEmitFile);
      }
      function emit(targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers) {
        var restorePendingEmitOnHandlingNoEmitSuccess = false;
        var savedAffectedFilesPendingEmit;
        var savedAffectedFilesPendingEmitKind;
        var savedAffectedFilesPendingEmitIndex;
        if (kind !== BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram && !targetSourceFile && !ts2.outFile(state.compilerOptions) && !state.compilerOptions.noEmit && state.compilerOptions.noEmitOnError) {
          restorePendingEmitOnHandlingNoEmitSuccess = true;
          savedAffectedFilesPendingEmit = state.affectedFilesPendingEmit && state.affectedFilesPendingEmit.slice();
          savedAffectedFilesPendingEmitKind = state.affectedFilesPendingEmitKind && new ts2.Map(state.affectedFilesPendingEmitKind);
          savedAffectedFilesPendingEmitIndex = state.affectedFilesPendingEmitIndex;
        }
        if (kind === BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram) {
          assertSourceFileOkWithoutNextAffectedCall(state, targetSourceFile);
        }
        var result = ts2.handleNoEmitOptions(builderProgram, targetSourceFile, writeFile, cancellationToken);
        if (result)
          return result;
        if (restorePendingEmitOnHandlingNoEmitSuccess) {
          state.affectedFilesPendingEmit = savedAffectedFilesPendingEmit;
          state.affectedFilesPendingEmitKind = savedAffectedFilesPendingEmitKind;
          state.affectedFilesPendingEmitIndex = savedAffectedFilesPendingEmitIndex;
        }
        if (!targetSourceFile && kind === BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram) {
          var sourceMaps = [];
          var emitSkipped = false;
          var diagnostics = void 0;
          var emittedFiles = [];
          var affectedEmitResult = void 0;
          while (affectedEmitResult = emitNextAffectedFile(writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers)) {
            emitSkipped = emitSkipped || affectedEmitResult.result.emitSkipped;
            diagnostics = ts2.addRange(diagnostics, affectedEmitResult.result.diagnostics);
            emittedFiles = ts2.addRange(emittedFiles, affectedEmitResult.result.emittedFiles);
            sourceMaps = ts2.addRange(sourceMaps, affectedEmitResult.result.sourceMaps);
          }
          return {
            emitSkipped,
            diagnostics: diagnostics || ts2.emptyArray,
            emittedFiles,
            sourceMaps
          };
        }
        return ts2.Debug.checkDefined(state.program).emit(targetSourceFile, writeFile || ts2.maybeBind(host, host.writeFile), cancellationToken, emitOnlyDtsFiles, customTransformers);
      }
      function getSemanticDiagnosticsOfNextAffectedFile(cancellationToken, ignoreSourceFile) {
        while (true) {
          var affected = getNextAffectedFile(state, cancellationToken, computeHash);
          if (!affected) {
            return void 0;
          } else if (affected === state.program) {
            return toAffectedFileResult(state, state.program.getSemanticDiagnostics(void 0, cancellationToken), affected);
          }
          if (kind === BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram || state.compilerOptions.noEmit || state.compilerOptions.noEmitOnError) {
            addToAffectedFilesPendingEmit(state, affected.resolvedPath, 1);
          }
          if (ignoreSourceFile && ignoreSourceFile(affected)) {
            doneWithAffectedFile(state, affected);
            continue;
          }
          return toAffectedFileResult(state, getSemanticDiagnosticsOfFile(state, affected, cancellationToken), affected);
        }
      }
      function getSemanticDiagnostics(sourceFile, cancellationToken) {
        assertSourceFileOkWithoutNextAffectedCall(state, sourceFile);
        var compilerOptions = ts2.Debug.checkDefined(state.program).getCompilerOptions();
        if (ts2.outFile(compilerOptions)) {
          ts2.Debug.assert(!state.semanticDiagnosticsPerFile);
          return ts2.Debug.checkDefined(state.program).getSemanticDiagnostics(sourceFile, cancellationToken);
        }
        if (sourceFile) {
          return getSemanticDiagnosticsOfFile(state, sourceFile, cancellationToken);
        }
        while (getSemanticDiagnosticsOfNextAffectedFile(cancellationToken)) {
        }
        var diagnostics;
        for (var _i = 0, _a2 = ts2.Debug.checkDefined(state.program).getSourceFiles(); _i < _a2.length; _i++) {
          var sourceFile_1 = _a2[_i];
          diagnostics = ts2.addRange(diagnostics, getSemanticDiagnosticsOfFile(state, sourceFile_1, cancellationToken));
        }
        return diagnostics || ts2.emptyArray;
      }
    }
    ts2.createBuilderProgram = createBuilderProgram;
    function addToAffectedFilesPendingEmit(state, affectedFilePendingEmit, kind) {
      if (!state.affectedFilesPendingEmit)
        state.affectedFilesPendingEmit = [];
      if (!state.affectedFilesPendingEmitKind)
        state.affectedFilesPendingEmitKind = new ts2.Map();
      var existingKind = state.affectedFilesPendingEmitKind.get(affectedFilePendingEmit);
      state.affectedFilesPendingEmit.push(affectedFilePendingEmit);
      state.affectedFilesPendingEmitKind.set(affectedFilePendingEmit, existingKind || kind);
      if (state.affectedFilesPendingEmitIndex === void 0) {
        state.affectedFilesPendingEmitIndex = 0;
      }
    }
    function toBuilderStateFileInfo(fileInfo) {
      return ts2.isString(fileInfo) ? { version: fileInfo, signature: fileInfo, affectsGlobalScope: void 0, impliedFormat: void 0 } : ts2.isString(fileInfo.signature) ? fileInfo : { version: fileInfo.version, signature: fileInfo.signature === false ? void 0 : fileInfo.version, affectsGlobalScope: fileInfo.affectsGlobalScope, impliedFormat: fileInfo.impliedFormat };
    }
    ts2.toBuilderStateFileInfo = toBuilderStateFileInfo;
    function createBuildProgramUsingProgramBuildInfo(program, buildInfoPath, host) {
      var _a;
      var buildInfoDirectory = ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(buildInfoPath, host.getCurrentDirectory()));
      var getCanonicalFileName = ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames());
      var filePaths = program.fileNames.map(toPath);
      var filePathsSetList = (_a = program.fileIdsList) === null || _a === void 0 ? void 0 : _a.map(function(fileIds) {
        return new ts2.Set(fileIds.map(toFilePath));
      });
      var fileInfos = new ts2.Map();
      program.fileInfos.forEach(function(fileInfo, index) {
        return fileInfos.set(toFilePath(index + 1), toBuilderStateFileInfo(fileInfo));
      });
      var state = {
        fileInfos,
        compilerOptions: program.options ? ts2.convertToOptionsWithAbsolutePaths(program.options, toAbsolutePath) : {},
        referencedMap: toManyToManyPathMap(program.referencedMap),
        exportedModulesMap: toManyToManyPathMap(program.exportedModulesMap),
        semanticDiagnosticsPerFile: program.semanticDiagnosticsPerFile && ts2.arrayToMap(program.semanticDiagnosticsPerFile, function(value) {
          return toFilePath(ts2.isNumber(value) ? value : value[0]);
        }, function(value) {
          return ts2.isNumber(value) ? ts2.emptyArray : value[1];
        }),
        hasReusableDiagnostic: true,
        affectedFilesPendingEmit: ts2.map(program.affectedFilesPendingEmit, function(value) {
          return toFilePath(value[0]);
        }),
        affectedFilesPendingEmitKind: program.affectedFilesPendingEmit && ts2.arrayToMap(program.affectedFilesPendingEmit, function(value) {
          return toFilePath(value[0]);
        }, function(value) {
          return value[1];
        }),
        affectedFilesPendingEmitIndex: program.affectedFilesPendingEmit && 0
      };
      return {
        getState: function() {
          return state;
        },
        backupState: ts2.noop,
        restoreState: ts2.noop,
        getProgram: ts2.notImplemented,
        getProgramOrUndefined: ts2.returnUndefined,
        releaseProgram: ts2.noop,
        getCompilerOptions: function() {
          return state.compilerOptions;
        },
        getSourceFile: ts2.notImplemented,
        getSourceFiles: ts2.notImplemented,
        getOptionsDiagnostics: ts2.notImplemented,
        getGlobalDiagnostics: ts2.notImplemented,
        getConfigFileParsingDiagnostics: ts2.notImplemented,
        getSyntacticDiagnostics: ts2.notImplemented,
        getDeclarationDiagnostics: ts2.notImplemented,
        getSemanticDiagnostics: ts2.notImplemented,
        emit: ts2.notImplemented,
        getAllDependencies: ts2.notImplemented,
        getCurrentDirectory: ts2.notImplemented,
        emitNextAffectedFile: ts2.notImplemented,
        getSemanticDiagnosticsOfNextAffectedFile: ts2.notImplemented,
        emitBuildInfo: ts2.notImplemented,
        close: ts2.noop
      };
      function toPath(path) {
        return ts2.toPath(path, buildInfoDirectory, getCanonicalFileName);
      }
      function toAbsolutePath(path) {
        return ts2.getNormalizedAbsolutePath(path, buildInfoDirectory);
      }
      function toFilePath(fileId) {
        return filePaths[fileId - 1];
      }
      function toFilePathsSet(fileIdsListId) {
        return filePathsSetList[fileIdsListId - 1];
      }
      function toManyToManyPathMap(referenceMap) {
        if (!referenceMap) {
          return void 0;
        }
        var map = ts2.BuilderState.createManyToManyPathMap();
        referenceMap.forEach(function(_a2) {
          var fileId = _a2[0], fileIdListId = _a2[1];
          return map.set(toFilePath(fileId), toFilePathsSet(fileIdListId));
        });
        return map;
      }
    }
    ts2.createBuildProgramUsingProgramBuildInfo = createBuildProgramUsingProgramBuildInfo;
    function createRedirectedBuilderProgram(getState, configFileParsingDiagnostics) {
      return {
        getState: ts2.notImplemented,
        backupState: ts2.noop,
        restoreState: ts2.noop,
        getProgram,
        getProgramOrUndefined: function() {
          return getState().program;
        },
        releaseProgram: function() {
          return getState().program = void 0;
        },
        getCompilerOptions: function() {
          return getState().compilerOptions;
        },
        getSourceFile: function(fileName) {
          return getProgram().getSourceFile(fileName);
        },
        getSourceFiles: function() {
          return getProgram().getSourceFiles();
        },
        getOptionsDiagnostics: function(cancellationToken) {
          return getProgram().getOptionsDiagnostics(cancellationToken);
        },
        getGlobalDiagnostics: function(cancellationToken) {
          return getProgram().getGlobalDiagnostics(cancellationToken);
        },
        getConfigFileParsingDiagnostics: function() {
          return configFileParsingDiagnostics;
        },
        getSyntacticDiagnostics: function(sourceFile, cancellationToken) {
          return getProgram().getSyntacticDiagnostics(sourceFile, cancellationToken);
        },
        getDeclarationDiagnostics: function(sourceFile, cancellationToken) {
          return getProgram().getDeclarationDiagnostics(sourceFile, cancellationToken);
        },
        getSemanticDiagnostics: function(sourceFile, cancellationToken) {
          return getProgram().getSemanticDiagnostics(sourceFile, cancellationToken);
        },
        emit: function(sourceFile, writeFile, cancellationToken, emitOnlyDts, customTransformers) {
          return getProgram().emit(sourceFile, writeFile, cancellationToken, emitOnlyDts, customTransformers);
        },
        emitBuildInfo: function(writeFile, cancellationToken) {
          return getProgram().emitBuildInfo(writeFile, cancellationToken);
        },
        getAllDependencies: ts2.notImplemented,
        getCurrentDirectory: function() {
          return getProgram().getCurrentDirectory();
        },
        close: ts2.noop
      };
      function getProgram() {
        return ts2.Debug.checkDefined(getState().program);
      }
    }
    ts2.createRedirectedBuilderProgram = createRedirectedBuilderProgram;
  })(ts || (ts = {}));
  (function(ts2) {
    function createSemanticDiagnosticsBuilderProgram(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
      return ts2.createBuilderProgram(ts2.BuilderProgramKind.SemanticDiagnosticsBuilderProgram, ts2.getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
    }
    ts2.createSemanticDiagnosticsBuilderProgram = createSemanticDiagnosticsBuilderProgram;
    function createEmitAndSemanticDiagnosticsBuilderProgram(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
      return ts2.createBuilderProgram(ts2.BuilderProgramKind.EmitAndSemanticDiagnosticsBuilderProgram, ts2.getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences));
    }
    ts2.createEmitAndSemanticDiagnosticsBuilderProgram = createEmitAndSemanticDiagnosticsBuilderProgram;
    function createAbstractBuilder(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences) {
      var _a = ts2.getBuilderCreationParameters(newProgramOrRootNames, hostOrOptions, oldProgramOrHost, configFileParsingDiagnosticsOrOldProgram, configFileParsingDiagnostics, projectReferences), newProgram = _a.newProgram, newConfigFileParsingDiagnostics = _a.configFileParsingDiagnostics;
      return ts2.createRedirectedBuilderProgram(function() {
        return { program: newProgram, compilerOptions: newProgram.getCompilerOptions() };
      }, newConfigFileParsingDiagnostics);
    }
    ts2.createAbstractBuilder = createAbstractBuilder;
  })(ts || (ts = {}));
  (function(ts2) {
    function removeIgnoredPath(path) {
      if (ts2.endsWith(path, "/node_modules/.staging")) {
        return ts2.removeSuffix(path, "/.staging");
      }
      return ts2.some(ts2.ignoredPaths, function(searchPath) {
        return ts2.stringContains(path, searchPath);
      }) ? void 0 : path;
    }
    ts2.removeIgnoredPath = removeIgnoredPath;
    function canWatchDirectory(dirPath) {
      var rootLength = ts2.getRootLength(dirPath);
      if (dirPath.length === rootLength) {
        return false;
      }
      var nextDirectorySeparator = dirPath.indexOf(ts2.directorySeparator, rootLength);
      if (nextDirectorySeparator === -1) {
        return false;
      }
      var pathPartForUserCheck = dirPath.substring(rootLength, nextDirectorySeparator + 1);
      var isNonDirectorySeparatorRoot = rootLength > 1 || dirPath.charCodeAt(0) !== 47;
      if (isNonDirectorySeparatorRoot && dirPath.search(/[a-zA-Z]:/) !== 0 && pathPartForUserCheck.search(/[a-zA-z]\$\//) === 0) {
        nextDirectorySeparator = dirPath.indexOf(ts2.directorySeparator, nextDirectorySeparator + 1);
        if (nextDirectorySeparator === -1) {
          return false;
        }
        pathPartForUserCheck = dirPath.substring(rootLength + pathPartForUserCheck.length, nextDirectorySeparator + 1);
      }
      if (isNonDirectorySeparatorRoot && pathPartForUserCheck.search(/users\//i) !== 0) {
        return true;
      }
      for (var searchIndex = nextDirectorySeparator + 1, searchLevels = 2; searchLevels > 0; searchLevels--) {
        searchIndex = dirPath.indexOf(ts2.directorySeparator, searchIndex) + 1;
        if (searchIndex === 0) {
          return false;
        }
      }
      return true;
    }
    ts2.canWatchDirectory = canWatchDirectory;
    function createResolutionCache(resolutionHost, rootDirForResolution, logChangesWhenResolvingModule) {
      var filesWithChangedSetOfUnresolvedImports;
      var filesWithInvalidatedResolutions;
      var filesWithInvalidatedNonRelativeUnresolvedImports;
      var nonRelativeExternalModuleResolutions = ts2.createMultiMap();
      var resolutionsWithFailedLookups = [];
      var resolvedFileToResolution = ts2.createMultiMap();
      var hasChangedAutomaticTypeDirectiveNames = false;
      var failedLookupChecks;
      var startsWithPathChecks;
      var isInDirectoryChecks;
      var getCurrentDirectory = ts2.memoize(function() {
        return resolutionHost.getCurrentDirectory();
      });
      var cachedDirectoryStructureHost = resolutionHost.getCachedDirectoryStructureHost();
      var resolvedModuleNames = new ts2.Map();
      var perDirectoryResolvedModuleNames = ts2.createCacheWithRedirects();
      var nonRelativeModuleNameCache = ts2.createCacheWithRedirects();
      var moduleResolutionCache = ts2.createModuleResolutionCache(getCurrentDirectory(), resolutionHost.getCanonicalFileName, void 0, perDirectoryResolvedModuleNames, nonRelativeModuleNameCache);
      var resolvedTypeReferenceDirectives = new ts2.Map();
      var perDirectoryResolvedTypeReferenceDirectives = ts2.createCacheWithRedirects();
      var typeReferenceDirectiveResolutionCache = ts2.createTypeReferenceDirectiveResolutionCache(getCurrentDirectory(), resolutionHost.getCanonicalFileName, void 0, moduleResolutionCache.getPackageJsonInfoCache(), perDirectoryResolvedTypeReferenceDirectives);
      var failedLookupDefaultExtensions = [".ts", ".tsx", ".js", ".jsx", ".json"];
      var customFailedLookupPaths = new ts2.Map();
      var directoryWatchesOfFailedLookups = new ts2.Map();
      var rootDir = rootDirForResolution && ts2.removeTrailingDirectorySeparator(ts2.getNormalizedAbsolutePath(rootDirForResolution, getCurrentDirectory()));
      var rootPath = rootDir && resolutionHost.toPath(rootDir);
      var rootSplitLength = rootPath !== void 0 ? rootPath.split(ts2.directorySeparator).length : 0;
      var typeRootsWatches = new ts2.Map();
      return {
        getModuleResolutionCache: function() {
          return moduleResolutionCache;
        },
        startRecordingFilesWithChangedResolutions,
        finishRecordingFilesWithChangedResolutions,
        startCachingPerDirectoryResolution: clearPerDirectoryResolutions,
        finishCachingPerDirectoryResolution,
        resolveModuleNames,
        getResolvedModuleWithFailedLookupLocationsFromCache,
        resolveTypeReferenceDirectives,
        removeResolutionsFromProjectReferenceRedirects,
        removeResolutionsOfFile,
        hasChangedAutomaticTypeDirectiveNames: function() {
          return hasChangedAutomaticTypeDirectiveNames;
        },
        invalidateResolutionOfFile,
        invalidateResolutionsOfFailedLookupLocations,
        setFilesWithInvalidatedNonRelativeUnresolvedImports,
        createHasInvalidatedResolution,
        isFileWithInvalidatedNonRelativeUnresolvedImports,
        updateTypeRootsWatch,
        closeTypeRootsWatch,
        clear
      };
      function getResolvedModule(resolution) {
        return resolution.resolvedModule;
      }
      function getResolvedTypeReferenceDirective(resolution) {
        return resolution.resolvedTypeReferenceDirective;
      }
      function isInDirectoryPath(dir, file) {
        if (dir === void 0 || file.length <= dir.length) {
          return false;
        }
        return ts2.startsWith(file, dir) && file[dir.length] === ts2.directorySeparator;
      }
      function clear() {
        ts2.clearMap(directoryWatchesOfFailedLookups, ts2.closeFileWatcherOf);
        customFailedLookupPaths.clear();
        nonRelativeExternalModuleResolutions.clear();
        closeTypeRootsWatch();
        resolvedModuleNames.clear();
        resolvedTypeReferenceDirectives.clear();
        resolvedFileToResolution.clear();
        resolutionsWithFailedLookups.length = 0;
        failedLookupChecks = void 0;
        startsWithPathChecks = void 0;
        isInDirectoryChecks = void 0;
        clearPerDirectoryResolutions();
        hasChangedAutomaticTypeDirectiveNames = false;
      }
      function startRecordingFilesWithChangedResolutions() {
        filesWithChangedSetOfUnresolvedImports = [];
      }
      function finishRecordingFilesWithChangedResolutions() {
        var collected = filesWithChangedSetOfUnresolvedImports;
        filesWithChangedSetOfUnresolvedImports = void 0;
        return collected;
      }
      function isFileWithInvalidatedNonRelativeUnresolvedImports(path) {
        if (!filesWithInvalidatedNonRelativeUnresolvedImports) {
          return false;
        }
        var value = filesWithInvalidatedNonRelativeUnresolvedImports.get(path);
        return !!value && !!value.length;
      }
      function createHasInvalidatedResolution(forceAllFilesAsInvalidated) {
        invalidateResolutionsOfFailedLookupLocations();
        if (forceAllFilesAsInvalidated) {
          filesWithInvalidatedResolutions = void 0;
          return ts2.returnTrue;
        }
        var collected = filesWithInvalidatedResolutions;
        filesWithInvalidatedResolutions = void 0;
        return function(path) {
          return !!collected && collected.has(path) || isFileWithInvalidatedNonRelativeUnresolvedImports(path);
        };
      }
      function clearPerDirectoryResolutions() {
        moduleResolutionCache.clear();
        typeReferenceDirectiveResolutionCache.clear();
        nonRelativeExternalModuleResolutions.forEach(watchFailedLookupLocationOfNonRelativeModuleResolutions);
        nonRelativeExternalModuleResolutions.clear();
      }
      function finishCachingPerDirectoryResolution() {
        filesWithInvalidatedNonRelativeUnresolvedImports = void 0;
        clearPerDirectoryResolutions();
        directoryWatchesOfFailedLookups.forEach(function(watcher, path) {
          if (watcher.refCount === 0) {
            directoryWatchesOfFailedLookups.delete(path);
            watcher.watcher.close();
          }
        });
        hasChangedAutomaticTypeDirectiveNames = false;
      }
      function resolveModuleName(moduleName, containingFile, compilerOptions, host, redirectedReference) {
        var _a;
        var primaryResult = ts2.resolveModuleName(moduleName, containingFile, compilerOptions, host, moduleResolutionCache, redirectedReference);
        if (!resolutionHost.getGlobalCache) {
          return primaryResult;
        }
        var globalCache = resolutionHost.getGlobalCache();
        if (globalCache !== void 0 && !ts2.isExternalModuleNameRelative(moduleName) && !(primaryResult.resolvedModule && ts2.extensionIsTS(primaryResult.resolvedModule.extension))) {
          var _b = ts2.loadModuleFromGlobalCache(ts2.Debug.checkDefined(resolutionHost.globalCacheResolutionModuleName)(moduleName), resolutionHost.projectName, compilerOptions, host, globalCache, moduleResolutionCache), resolvedModule = _b.resolvedModule, failedLookupLocations = _b.failedLookupLocations;
          if (resolvedModule) {
            primaryResult.resolvedModule = resolvedModule;
            (_a = primaryResult.failedLookupLocations).push.apply(_a, failedLookupLocations);
            return primaryResult;
          }
        }
        return primaryResult;
      }
      function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host, redirectedReference) {
        return ts2.resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host, redirectedReference, typeReferenceDirectiveResolutionCache);
      }
      function resolveNamesWithLocalCache(_a) {
        var _b, _c, _d;
        var names = _a.names, containingFile = _a.containingFile, redirectedReference = _a.redirectedReference, cache = _a.cache, perDirectoryCacheWithRedirects = _a.perDirectoryCacheWithRedirects, loader = _a.loader, getResolutionWithResolvedFileName = _a.getResolutionWithResolvedFileName, shouldRetryResolution = _a.shouldRetryResolution, reusedNames = _a.reusedNames, logChanges = _a.logChanges, containingSourceFile = _a.containingSourceFile;
        var path = resolutionHost.toPath(containingFile);
        var resolutionsInFile = cache.get(path) || cache.set(path, ts2.createModeAwareCache()).get(path);
        var dirPath = ts2.getDirectoryPath(path);
        var perDirectoryCache = perDirectoryCacheWithRedirects.getOrCreateMapOfCacheRedirects(redirectedReference);
        var perDirectoryResolution = perDirectoryCache.get(dirPath);
        if (!perDirectoryResolution) {
          perDirectoryResolution = ts2.createModeAwareCache();
          perDirectoryCache.set(dirPath, perDirectoryResolution);
        }
        var resolvedModules = [];
        var compilerOptions = resolutionHost.getCompilationSettings();
        var hasInvalidatedNonRelativeUnresolvedImport = logChanges && isFileWithInvalidatedNonRelativeUnresolvedImports(path);
        var program = resolutionHost.getCurrentProgram();
        var oldRedirect = program && program.getResolvedProjectReferenceToRedirect(containingFile);
        var unmatchedRedirects = oldRedirect ? !redirectedReference || redirectedReference.sourceFile.path !== oldRedirect.sourceFile.path : !!redirectedReference;
        var seenNamesInFile = ts2.createModeAwareCache();
        var i = 0;
        for (var _i = 0, names_4 = names; _i < names_4.length; _i++) {
          var name = names_4[_i];
          var mode = containingSourceFile ? ts2.getModeForResolutionAtIndex(containingSourceFile, i) : void 0;
          i++;
          var resolution = resolutionsInFile.get(name, mode);
          if (!seenNamesInFile.has(name, mode) && unmatchedRedirects || !resolution || resolution.isInvalidated || hasInvalidatedNonRelativeUnresolvedImport && !ts2.isExternalModuleNameRelative(name) && shouldRetryResolution(resolution)) {
            var existingResolution = resolution;
            var resolutionInDirectory = perDirectoryResolution.get(name, mode);
            if (resolutionInDirectory) {
              resolution = resolutionInDirectory;
              var host = ((_b = resolutionHost.getCompilerHost) === null || _b === void 0 ? void 0 : _b.call(resolutionHost)) || resolutionHost;
              if (ts2.isTraceEnabled(compilerOptions, host)) {
                var resolved = getResolutionWithResolvedFileName(resolution);
                ts2.trace(host, loader === resolveModuleName ? (resolved === null || resolved === void 0 ? void 0 : resolved.resolvedFileName) ? resolved.packagetId ? ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3_with_Package_ID_4 : ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3 : ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_found_in_cache_from_location_2_it_was_not_resolved : (resolved === null || resolved === void 0 ? void 0 : resolved.resolvedFileName) ? resolved.packagetId ? ts2.Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3_with_Package_ID_4 : ts2.Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_successfully_resolved_to_3 : ts2.Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_found_in_cache_from_location_2_it_was_not_resolved, name, containingFile, ts2.getDirectoryPath(containingFile), resolved === null || resolved === void 0 ? void 0 : resolved.resolvedFileName, (resolved === null || resolved === void 0 ? void 0 : resolved.packagetId) && ts2.packageIdToString(resolved.packagetId));
              }
            } else {
              resolution = loader(name, containingFile, compilerOptions, ((_c = resolutionHost.getCompilerHost) === null || _c === void 0 ? void 0 : _c.call(resolutionHost)) || resolutionHost, redirectedReference, containingSourceFile);
              perDirectoryResolution.set(name, mode, resolution);
              if (resolutionHost.onDiscoveredSymlink && resolutionIsSymlink(resolution)) {
                resolutionHost.onDiscoveredSymlink();
              }
            }
            resolutionsInFile.set(name, mode, resolution);
            watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, path, getResolutionWithResolvedFileName);
            if (existingResolution) {
              stopWatchFailedLookupLocationOfResolution(existingResolution, path, getResolutionWithResolvedFileName);
            }
            if (logChanges && filesWithChangedSetOfUnresolvedImports && !resolutionIsEqualTo(existingResolution, resolution)) {
              filesWithChangedSetOfUnresolvedImports.push(path);
              logChanges = false;
            }
          } else {
            var host = ((_d = resolutionHost.getCompilerHost) === null || _d === void 0 ? void 0 : _d.call(resolutionHost)) || resolutionHost;
            if (ts2.isTraceEnabled(compilerOptions, host) && !seenNamesInFile.has(name, mode)) {
              var resolved = getResolutionWithResolvedFileName(resolution);
              ts2.trace(host, loader === resolveModuleName ? (resolved === null || resolved === void 0 ? void 0 : resolved.resolvedFileName) ? resolved.packagetId ? ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : ts2.Diagnostics.Reusing_resolution_of_module_0_from_1_of_old_program_it_was_not_resolved : (resolved === null || resolved === void 0 ? void 0 : resolved.resolvedFileName) ? resolved.packagetId ? ts2.Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2_with_Package_ID_3 : ts2.Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_successfully_resolved_to_2 : ts2.Diagnostics.Reusing_resolution_of_type_reference_directive_0_from_1_of_old_program_it_was_not_resolved, name, containingFile, resolved === null || resolved === void 0 ? void 0 : resolved.resolvedFileName, (resolved === null || resolved === void 0 ? void 0 : resolved.packagetId) && ts2.packageIdToString(resolved.packagetId));
            }
          }
          ts2.Debug.assert(resolution !== void 0 && !resolution.isInvalidated);
          seenNamesInFile.set(name, mode, true);
          resolvedModules.push(getResolutionWithResolvedFileName(resolution));
        }
        resolutionsInFile.forEach(function(resolution2, name2, mode2) {
          if (!seenNamesInFile.has(name2, mode2) && !ts2.contains(reusedNames, name2)) {
            stopWatchFailedLookupLocationOfResolution(resolution2, path, getResolutionWithResolvedFileName);
            resolutionsInFile.delete(name2, mode2);
          }
        });
        return resolvedModules;
        function resolutionIsEqualTo(oldResolution, newResolution) {
          if (oldResolution === newResolution) {
            return true;
          }
          if (!oldResolution || !newResolution) {
            return false;
          }
          var oldResult = getResolutionWithResolvedFileName(oldResolution);
          var newResult = getResolutionWithResolvedFileName(newResolution);
          if (oldResult === newResult) {
            return true;
          }
          if (!oldResult || !newResult) {
            return false;
          }
          return oldResult.resolvedFileName === newResult.resolvedFileName;
        }
      }
      function resolveTypeReferenceDirectives(typeDirectiveNames, containingFile, redirectedReference) {
        return resolveNamesWithLocalCache({
          names: typeDirectiveNames,
          containingFile,
          redirectedReference,
          cache: resolvedTypeReferenceDirectives,
          perDirectoryCacheWithRedirects: perDirectoryResolvedTypeReferenceDirectives,
          loader: resolveTypeReferenceDirective,
          getResolutionWithResolvedFileName: getResolvedTypeReferenceDirective,
          shouldRetryResolution: function(resolution) {
            return resolution.resolvedTypeReferenceDirective === void 0;
          }
        });
      }
      function resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, containingSourceFile) {
        return resolveNamesWithLocalCache({
          names: moduleNames,
          containingFile,
          redirectedReference,
          cache: resolvedModuleNames,
          perDirectoryCacheWithRedirects: perDirectoryResolvedModuleNames,
          loader: resolveModuleName,
          getResolutionWithResolvedFileName: getResolvedModule,
          shouldRetryResolution: function(resolution) {
            return !resolution.resolvedModule || !ts2.resolutionExtensionIsTSOrJson(resolution.resolvedModule.extension);
          },
          reusedNames,
          logChanges: logChangesWhenResolvingModule,
          containingSourceFile
        });
      }
      function getResolvedModuleWithFailedLookupLocationsFromCache(moduleName, containingFile, resolutionMode) {
        var cache = resolvedModuleNames.get(resolutionHost.toPath(containingFile));
        if (!cache)
          return void 0;
        return cache.get(moduleName, resolutionMode);
      }
      function isNodeModulesAtTypesDirectory(dirPath) {
        return ts2.endsWith(dirPath, "/node_modules/@types");
      }
      function getDirectoryToWatchFailedLookupLocation(failedLookupLocation, failedLookupLocationPath) {
        if (isInDirectoryPath(rootPath, failedLookupLocationPath)) {
          failedLookupLocation = ts2.isRootedDiskPath(failedLookupLocation) ? ts2.normalizePath(failedLookupLocation) : ts2.getNormalizedAbsolutePath(failedLookupLocation, getCurrentDirectory());
          var failedLookupPathSplit = failedLookupLocationPath.split(ts2.directorySeparator);
          var failedLookupSplit = failedLookupLocation.split(ts2.directorySeparator);
          ts2.Debug.assert(failedLookupSplit.length === failedLookupPathSplit.length, "FailedLookup: ".concat(failedLookupLocation, " failedLookupLocationPath: ").concat(failedLookupLocationPath));
          if (failedLookupPathSplit.length > rootSplitLength + 1) {
            return {
              dir: failedLookupSplit.slice(0, rootSplitLength + 1).join(ts2.directorySeparator),
              dirPath: failedLookupPathSplit.slice(0, rootSplitLength + 1).join(ts2.directorySeparator)
            };
          } else {
            return {
              dir: rootDir,
              dirPath: rootPath,
              nonRecursive: false
            };
          }
        }
        return getDirectoryToWatchFromFailedLookupLocationDirectory(ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(failedLookupLocation, getCurrentDirectory())), ts2.getDirectoryPath(failedLookupLocationPath));
      }
      function getDirectoryToWatchFromFailedLookupLocationDirectory(dir, dirPath) {
        while (ts2.pathContainsNodeModules(dirPath)) {
          dir = ts2.getDirectoryPath(dir);
          dirPath = ts2.getDirectoryPath(dirPath);
        }
        if (ts2.isNodeModulesDirectory(dirPath)) {
          return canWatchDirectory(ts2.getDirectoryPath(dirPath)) ? { dir, dirPath } : void 0;
        }
        var nonRecursive = true;
        var subDirectoryPath, subDirectory;
        if (rootPath !== void 0) {
          while (!isInDirectoryPath(dirPath, rootPath)) {
            var parentPath = ts2.getDirectoryPath(dirPath);
            if (parentPath === dirPath) {
              break;
            }
            nonRecursive = false;
            subDirectoryPath = dirPath;
            subDirectory = dir;
            dirPath = parentPath;
            dir = ts2.getDirectoryPath(dir);
          }
        }
        return canWatchDirectory(dirPath) ? { dir: subDirectory || dir, dirPath: subDirectoryPath || dirPath, nonRecursive } : void 0;
      }
      function isPathWithDefaultFailedLookupExtension(path) {
        return ts2.fileExtensionIsOneOf(path, failedLookupDefaultExtensions);
      }
      function watchFailedLookupLocationsOfExternalModuleResolutions(name, resolution, filePath, getResolutionWithResolvedFileName) {
        if (resolution.refCount) {
          resolution.refCount++;
          ts2.Debug.assertDefined(resolution.files);
        } else {
          resolution.refCount = 1;
          ts2.Debug.assert(ts2.length(resolution.files) === 0);
          if (ts2.isExternalModuleNameRelative(name)) {
            watchFailedLookupLocationOfResolution(resolution);
          } else {
            nonRelativeExternalModuleResolutions.add(name, resolution);
          }
          var resolved = getResolutionWithResolvedFileName(resolution);
          if (resolved && resolved.resolvedFileName) {
            resolvedFileToResolution.add(resolutionHost.toPath(resolved.resolvedFileName), resolution);
          }
        }
        (resolution.files || (resolution.files = [])).push(filePath);
      }
      function watchFailedLookupLocationOfResolution(resolution) {
        ts2.Debug.assert(!!resolution.refCount);
        var failedLookupLocations = resolution.failedLookupLocations;
        if (!failedLookupLocations.length)
          return;
        resolutionsWithFailedLookups.push(resolution);
        var setAtRoot = false;
        for (var _i = 0, failedLookupLocations_1 = failedLookupLocations; _i < failedLookupLocations_1.length; _i++) {
          var failedLookupLocation = failedLookupLocations_1[_i];
          var failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation);
          var toWatch = getDirectoryToWatchFailedLookupLocation(failedLookupLocation, failedLookupLocationPath);
          if (toWatch) {
            var dir = toWatch.dir, dirPath = toWatch.dirPath, nonRecursive = toWatch.nonRecursive;
            if (!isPathWithDefaultFailedLookupExtension(failedLookupLocationPath)) {
              var refCount = customFailedLookupPaths.get(failedLookupLocationPath) || 0;
              customFailedLookupPaths.set(failedLookupLocationPath, refCount + 1);
            }
            if (dirPath === rootPath) {
              ts2.Debug.assert(!nonRecursive);
              setAtRoot = true;
            } else {
              setDirectoryWatcher(dir, dirPath, nonRecursive);
            }
          }
        }
        if (setAtRoot) {
          setDirectoryWatcher(rootDir, rootPath, true);
        }
      }
      function watchFailedLookupLocationOfNonRelativeModuleResolutions(resolutions, name) {
        var program = resolutionHost.getCurrentProgram();
        if (!program || !program.getTypeChecker().tryFindAmbientModuleWithoutAugmentations(name)) {
          resolutions.forEach(watchFailedLookupLocationOfResolution);
        }
      }
      function setDirectoryWatcher(dir, dirPath, nonRecursive) {
        var dirWatcher = directoryWatchesOfFailedLookups.get(dirPath);
        if (dirWatcher) {
          ts2.Debug.assert(!!nonRecursive === !!dirWatcher.nonRecursive);
          dirWatcher.refCount++;
        } else {
          directoryWatchesOfFailedLookups.set(dirPath, { watcher: createDirectoryWatcher(dir, dirPath, nonRecursive), refCount: 1, nonRecursive });
        }
      }
      function stopWatchFailedLookupLocationOfResolution(resolution, filePath, getResolutionWithResolvedFileName) {
        ts2.unorderedRemoveItem(ts2.Debug.assertDefined(resolution.files), filePath);
        resolution.refCount--;
        if (resolution.refCount) {
          return;
        }
        var resolved = getResolutionWithResolvedFileName(resolution);
        if (resolved && resolved.resolvedFileName) {
          resolvedFileToResolution.remove(resolutionHost.toPath(resolved.resolvedFileName), resolution);
        }
        if (!ts2.unorderedRemoveItem(resolutionsWithFailedLookups, resolution)) {
          return;
        }
        var failedLookupLocations = resolution.failedLookupLocations;
        var removeAtRoot = false;
        for (var _i = 0, failedLookupLocations_2 = failedLookupLocations; _i < failedLookupLocations_2.length; _i++) {
          var failedLookupLocation = failedLookupLocations_2[_i];
          var failedLookupLocationPath = resolutionHost.toPath(failedLookupLocation);
          var toWatch = getDirectoryToWatchFailedLookupLocation(failedLookupLocation, failedLookupLocationPath);
          if (toWatch) {
            var dirPath = toWatch.dirPath;
            var refCount = customFailedLookupPaths.get(failedLookupLocationPath);
            if (refCount) {
              if (refCount === 1) {
                customFailedLookupPaths.delete(failedLookupLocationPath);
              } else {
                ts2.Debug.assert(refCount > 1);
                customFailedLookupPaths.set(failedLookupLocationPath, refCount - 1);
              }
            }
            if (dirPath === rootPath) {
              removeAtRoot = true;
            } else {
              removeDirectoryWatcher(dirPath);
            }
          }
        }
        if (removeAtRoot) {
          removeDirectoryWatcher(rootPath);
        }
      }
      function removeDirectoryWatcher(dirPath) {
        var dirWatcher = directoryWatchesOfFailedLookups.get(dirPath);
        dirWatcher.refCount--;
      }
      function createDirectoryWatcher(directory, dirPath, nonRecursive) {
        return resolutionHost.watchDirectoryOfFailedLookupLocation(directory, function(fileOrDirectory) {
          var fileOrDirectoryPath = resolutionHost.toPath(fileOrDirectory);
          if (cachedDirectoryStructureHost) {
            cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
          }
          scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, dirPath === fileOrDirectoryPath);
        }, nonRecursive ? 0 : 1);
      }
      function removeResolutionsOfFileFromCache(cache, filePath, getResolutionWithResolvedFileName) {
        var resolutions = cache.get(filePath);
        if (resolutions) {
          resolutions.forEach(function(resolution) {
            return stopWatchFailedLookupLocationOfResolution(resolution, filePath, getResolutionWithResolvedFileName);
          });
          cache.delete(filePath);
        }
      }
      function removeResolutionsFromProjectReferenceRedirects(filePath) {
        if (!ts2.fileExtensionIs(filePath, ".json"))
          return;
        var program = resolutionHost.getCurrentProgram();
        if (!program)
          return;
        var resolvedProjectReference = program.getResolvedProjectReferenceByPath(filePath);
        if (!resolvedProjectReference)
          return;
        resolvedProjectReference.commandLine.fileNames.forEach(function(f) {
          return removeResolutionsOfFile(resolutionHost.toPath(f));
        });
      }
      function removeResolutionsOfFile(filePath) {
        removeResolutionsOfFileFromCache(resolvedModuleNames, filePath, getResolvedModule);
        removeResolutionsOfFileFromCache(resolvedTypeReferenceDirectives, filePath, getResolvedTypeReferenceDirective);
      }
      function invalidateResolutions(resolutions, canInvalidate) {
        if (!resolutions)
          return false;
        var invalidated = false;
        for (var _i = 0, resolutions_1 = resolutions; _i < resolutions_1.length; _i++) {
          var resolution = resolutions_1[_i];
          if (resolution.isInvalidated || !canInvalidate(resolution))
            continue;
          resolution.isInvalidated = invalidated = true;
          for (var _a = 0, _b = ts2.Debug.assertDefined(resolution.files); _a < _b.length; _a++) {
            var containingFilePath = _b[_a];
            (filesWithInvalidatedResolutions || (filesWithInvalidatedResolutions = new ts2.Set())).add(containingFilePath);
            hasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames || ts2.endsWith(containingFilePath, ts2.inferredTypesContainingFile);
          }
        }
        return invalidated;
      }
      function invalidateResolutionOfFile(filePath) {
        removeResolutionsOfFile(filePath);
        var prevHasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames;
        if (invalidateResolutions(resolvedFileToResolution.get(filePath), ts2.returnTrue) && hasChangedAutomaticTypeDirectiveNames && !prevHasChangedAutomaticTypeDirectiveNames) {
          resolutionHost.onChangedAutomaticTypeDirectiveNames();
        }
      }
      function setFilesWithInvalidatedNonRelativeUnresolvedImports(filesMap) {
        ts2.Debug.assert(filesWithInvalidatedNonRelativeUnresolvedImports === filesMap || filesWithInvalidatedNonRelativeUnresolvedImports === void 0);
        filesWithInvalidatedNonRelativeUnresolvedImports = filesMap;
      }
      function scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, isCreatingWatchedDirectory) {
        if (isCreatingWatchedDirectory) {
          (isInDirectoryChecks || (isInDirectoryChecks = [])).push(fileOrDirectoryPath);
        } else {
          var updatedPath = removeIgnoredPath(fileOrDirectoryPath);
          if (!updatedPath)
            return false;
          fileOrDirectoryPath = updatedPath;
          if (resolutionHost.fileIsOpen(fileOrDirectoryPath)) {
            return false;
          }
          var dirOfFileOrDirectory = ts2.getDirectoryPath(fileOrDirectoryPath);
          if (isNodeModulesAtTypesDirectory(fileOrDirectoryPath) || ts2.isNodeModulesDirectory(fileOrDirectoryPath) || isNodeModulesAtTypesDirectory(dirOfFileOrDirectory) || ts2.isNodeModulesDirectory(dirOfFileOrDirectory)) {
            (failedLookupChecks || (failedLookupChecks = [])).push(fileOrDirectoryPath);
            (startsWithPathChecks || (startsWithPathChecks = new ts2.Set())).add(fileOrDirectoryPath);
          } else {
            if (!isPathWithDefaultFailedLookupExtension(fileOrDirectoryPath) && !customFailedLookupPaths.has(fileOrDirectoryPath)) {
              return false;
            }
            if (ts2.isEmittedFileOfProgram(resolutionHost.getCurrentProgram(), fileOrDirectoryPath)) {
              return false;
            }
            (failedLookupChecks || (failedLookupChecks = [])).push(fileOrDirectoryPath);
            var packagePath = ts2.parseNodeModuleFromPath(fileOrDirectoryPath);
            if (packagePath)
              (startsWithPathChecks || (startsWithPathChecks = new ts2.Set())).add(packagePath);
          }
        }
        resolutionHost.scheduleInvalidateResolutionsOfFailedLookupLocations();
      }
      function invalidateResolutionsOfFailedLookupLocations() {
        if (!failedLookupChecks && !startsWithPathChecks && !isInDirectoryChecks) {
          return false;
        }
        var invalidated = invalidateResolutions(resolutionsWithFailedLookups, canInvalidateFailedLookupResolution);
        failedLookupChecks = void 0;
        startsWithPathChecks = void 0;
        isInDirectoryChecks = void 0;
        return invalidated;
      }
      function canInvalidateFailedLookupResolution(resolution) {
        return resolution.failedLookupLocations.some(function(location) {
          var locationPath = resolutionHost.toPath(location);
          return ts2.contains(failedLookupChecks, locationPath) || ts2.firstDefinedIterator((startsWithPathChecks === null || startsWithPathChecks === void 0 ? void 0 : startsWithPathChecks.keys()) || ts2.emptyIterator, function(fileOrDirectoryPath) {
            return ts2.startsWith(locationPath, fileOrDirectoryPath) ? true : void 0;
          }) || (isInDirectoryChecks === null || isInDirectoryChecks === void 0 ? void 0 : isInDirectoryChecks.some(function(fileOrDirectoryPath) {
            return isInDirectoryPath(fileOrDirectoryPath, locationPath);
          }));
        });
      }
      function closeTypeRootsWatch() {
        ts2.clearMap(typeRootsWatches, ts2.closeFileWatcher);
      }
      function getDirectoryToWatchFailedLookupLocationFromTypeRoot(typeRoot, typeRootPath) {
        if (isInDirectoryPath(rootPath, typeRootPath)) {
          return rootPath;
        }
        var toWatch = getDirectoryToWatchFromFailedLookupLocationDirectory(typeRoot, typeRootPath);
        return toWatch && directoryWatchesOfFailedLookups.has(toWatch.dirPath) ? toWatch.dirPath : void 0;
      }
      function createTypeRootsWatch(typeRootPath, typeRoot) {
        return resolutionHost.watchTypeRootsDirectory(typeRoot, function(fileOrDirectory) {
          var fileOrDirectoryPath = resolutionHost.toPath(fileOrDirectory);
          if (cachedDirectoryStructureHost) {
            cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
          }
          hasChangedAutomaticTypeDirectiveNames = true;
          resolutionHost.onChangedAutomaticTypeDirectiveNames();
          var dirPath = getDirectoryToWatchFailedLookupLocationFromTypeRoot(typeRoot, typeRootPath);
          if (dirPath) {
            scheduleInvalidateResolutionOfFailedLookupLocation(fileOrDirectoryPath, dirPath === fileOrDirectoryPath);
          }
        }, 1);
      }
      function updateTypeRootsWatch() {
        var options = resolutionHost.getCompilationSettings();
        if (options.types) {
          closeTypeRootsWatch();
          return;
        }
        var typeRoots = ts2.getEffectiveTypeRoots(options, { directoryExists: directoryExistsForTypeRootWatch, getCurrentDirectory });
        if (typeRoots) {
          ts2.mutateMap(typeRootsWatches, ts2.arrayToMap(typeRoots, function(tr) {
            return resolutionHost.toPath(tr);
          }), {
            createNewValue: createTypeRootsWatch,
            onDeleteValue: ts2.closeFileWatcher
          });
        } else {
          closeTypeRootsWatch();
        }
      }
      function directoryExistsForTypeRootWatch(nodeTypesDirectory) {
        var dir = ts2.getDirectoryPath(ts2.getDirectoryPath(nodeTypesDirectory));
        var dirPath = resolutionHost.toPath(dir);
        return dirPath === rootPath || canWatchDirectory(dirPath);
      }
    }
    ts2.createResolutionCache = createResolutionCache;
    function resolutionIsSymlink(resolution) {
      var _a, _b;
      return !!(((_a = resolution.resolvedModule) === null || _a === void 0 ? void 0 : _a.originalPath) || ((_b = resolution.resolvedTypeReferenceDirective) === null || _b === void 0 ? void 0 : _b.originalPath));
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var moduleSpecifiers;
    (function(moduleSpecifiers_1) {
      var RelativePreference;
      (function(RelativePreference2) {
        RelativePreference2[RelativePreference2["Relative"] = 0] = "Relative";
        RelativePreference2[RelativePreference2["NonRelative"] = 1] = "NonRelative";
        RelativePreference2[RelativePreference2["Shortest"] = 2] = "Shortest";
        RelativePreference2[RelativePreference2["ExternalNonRelative"] = 3] = "ExternalNonRelative";
      })(RelativePreference || (RelativePreference = {}));
      var Ending;
      (function(Ending2) {
        Ending2[Ending2["Minimal"] = 0] = "Minimal";
        Ending2[Ending2["Index"] = 1] = "Index";
        Ending2[Ending2["JsExtension"] = 2] = "JsExtension";
      })(Ending || (Ending = {}));
      function getPreferences(host, _a, compilerOptions, importingSourceFile) {
        var importModuleSpecifierPreference = _a.importModuleSpecifierPreference, importModuleSpecifierEnding = _a.importModuleSpecifierEnding;
        return {
          relativePreference: importModuleSpecifierPreference === "relative" ? 0 : importModuleSpecifierPreference === "non-relative" ? 1 : importModuleSpecifierPreference === "project-relative" ? 3 : 2,
          ending: getEnding()
        };
        function getEnding() {
          switch (importModuleSpecifierEnding) {
            case "minimal":
              return 0;
            case "index":
              return 1;
            case "js":
              return 2;
            default:
              return usesJsExtensionOnImports(importingSourceFile) || isFormatRequiringExtensions(compilerOptions, importingSourceFile.path, host) ? 2 : ts2.getEmitModuleResolutionKind(compilerOptions) !== ts2.ModuleResolutionKind.NodeJs ? 1 : 0;
          }
        }
      }
      function getPreferencesForUpdate(compilerOptions, oldImportSpecifier, importingSourceFileName, host) {
        return {
          relativePreference: ts2.isExternalModuleNameRelative(oldImportSpecifier) ? 0 : 1,
          ending: ts2.hasJSFileExtension(oldImportSpecifier) || isFormatRequiringExtensions(compilerOptions, importingSourceFileName, host) ? 2 : ts2.getEmitModuleResolutionKind(compilerOptions) !== ts2.ModuleResolutionKind.NodeJs || ts2.endsWith(oldImportSpecifier, "index") ? 1 : 0
        };
      }
      function isFormatRequiringExtensions(compilerOptions, importingSourceFileName, host) {
        if (ts2.getEmitModuleResolutionKind(compilerOptions) !== ts2.ModuleResolutionKind.Node12 && ts2.getEmitModuleResolutionKind(compilerOptions) !== ts2.ModuleResolutionKind.NodeNext) {
          return false;
        }
        return ts2.getImpliedNodeFormatForFile(importingSourceFileName, void 0, getModuleResolutionHost(host), compilerOptions) !== ts2.ModuleKind.CommonJS;
      }
      function getModuleResolutionHost(host) {
        var _a;
        return {
          fileExists: host.fileExists,
          readFile: ts2.Debug.checkDefined(host.readFile),
          directoryExists: host.directoryExists,
          getCurrentDirectory: host.getCurrentDirectory,
          realpath: host.realpath,
          useCaseSensitiveFileNames: (_a = host.useCaseSensitiveFileNames) === null || _a === void 0 ? void 0 : _a.call(host)
        };
      }
      function updateModuleSpecifier(compilerOptions, importingSourceFileName, toFileName, host, oldImportSpecifier) {
        var res = getModuleSpecifierWorker(compilerOptions, importingSourceFileName, toFileName, host, getPreferencesForUpdate(compilerOptions, oldImportSpecifier, importingSourceFileName, host), {});
        if (res === oldImportSpecifier)
          return void 0;
        return res;
      }
      moduleSpecifiers_1.updateModuleSpecifier = updateModuleSpecifier;
      function getModuleSpecifier(compilerOptions, importingSourceFile, importingSourceFileName, toFileName, host) {
        return getModuleSpecifierWorker(compilerOptions, importingSourceFileName, toFileName, host, getPreferences(host, {}, compilerOptions, importingSourceFile), {});
      }
      moduleSpecifiers_1.getModuleSpecifier = getModuleSpecifier;
      function getNodeModulesPackageName(compilerOptions, importingSourceFileName, nodeModulesFileName, host, preferences) {
        var info = getInfo(importingSourceFileName, host);
        var modulePaths = getAllModulePaths(importingSourceFileName, nodeModulesFileName, host, preferences);
        return ts2.firstDefined(modulePaths, function(modulePath) {
          return tryGetModuleNameAsNodeModule(modulePath, info, host, compilerOptions, true);
        });
      }
      moduleSpecifiers_1.getNodeModulesPackageName = getNodeModulesPackageName;
      function getModuleSpecifierWorker(compilerOptions, importingSourceFileName, toFileName, host, preferences, userPreferences) {
        var info = getInfo(importingSourceFileName, host);
        var modulePaths = getAllModulePaths(importingSourceFileName, toFileName, host, userPreferences);
        return ts2.firstDefined(modulePaths, function(modulePath) {
          return tryGetModuleNameAsNodeModule(modulePath, info, host, compilerOptions);
        }) || getLocalModuleSpecifier(toFileName, info, compilerOptions, host, preferences);
      }
      function tryGetModuleSpecifiersFromCache(moduleSymbol, importingSourceFile, host, userPreferences) {
        return tryGetModuleSpecifiersFromCacheWorker(moduleSymbol, importingSourceFile, host, userPreferences)[0];
      }
      moduleSpecifiers_1.tryGetModuleSpecifiersFromCache = tryGetModuleSpecifiersFromCache;
      function tryGetModuleSpecifiersFromCacheWorker(moduleSymbol, importingSourceFile, host, userPreferences) {
        var _a;
        var moduleSourceFile = ts2.getSourceFileOfModule(moduleSymbol);
        if (!moduleSourceFile) {
          return ts2.emptyArray;
        }
        var cache = (_a = host.getModuleSpecifierCache) === null || _a === void 0 ? void 0 : _a.call(host);
        var cached = cache === null || cache === void 0 ? void 0 : cache.get(importingSourceFile.path, moduleSourceFile.path, userPreferences);
        return [cached === null || cached === void 0 ? void 0 : cached.moduleSpecifiers, moduleSourceFile, cached === null || cached === void 0 ? void 0 : cached.modulePaths, cache];
      }
      function getModuleSpecifiers(moduleSymbol, checker, compilerOptions, importingSourceFile, host, userPreferences) {
        return getModuleSpecifiersWithCacheInfo(moduleSymbol, checker, compilerOptions, importingSourceFile, host, userPreferences).moduleSpecifiers;
      }
      moduleSpecifiers_1.getModuleSpecifiers = getModuleSpecifiers;
      function getModuleSpecifiersWithCacheInfo(moduleSymbol, checker, compilerOptions, importingSourceFile, host, userPreferences) {
        var computedWithoutCache = false;
        var ambient = tryGetModuleNameFromAmbientModule(moduleSymbol, checker);
        if (ambient)
          return { moduleSpecifiers: [ambient], computedWithoutCache };
        var _a = tryGetModuleSpecifiersFromCacheWorker(moduleSymbol, importingSourceFile, host, userPreferences), specifiers = _a[0], moduleSourceFile = _a[1], modulePaths = _a[2], cache = _a[3];
        if (specifiers)
          return { moduleSpecifiers: specifiers, computedWithoutCache };
        if (!moduleSourceFile)
          return { moduleSpecifiers: ts2.emptyArray, computedWithoutCache };
        computedWithoutCache = true;
        modulePaths || (modulePaths = getAllModulePathsWorker(importingSourceFile.path, moduleSourceFile.originalFileName, host));
        var result = computeModuleSpecifiers(modulePaths, compilerOptions, importingSourceFile, host, userPreferences);
        cache === null || cache === void 0 ? void 0 : cache.set(importingSourceFile.path, moduleSourceFile.path, userPreferences, modulePaths, result);
        return { moduleSpecifiers: result, computedWithoutCache };
      }
      moduleSpecifiers_1.getModuleSpecifiersWithCacheInfo = getModuleSpecifiersWithCacheInfo;
      function computeModuleSpecifiers(modulePaths, compilerOptions, importingSourceFile, host, userPreferences) {
        var info = getInfo(importingSourceFile.path, host);
        var preferences = getPreferences(host, userPreferences, compilerOptions, importingSourceFile);
        var existingSpecifier = ts2.forEach(modulePaths, function(modulePath2) {
          return ts2.forEach(host.getFileIncludeReasons().get(ts2.toPath(modulePath2.path, host.getCurrentDirectory(), info.getCanonicalFileName)), function(reason) {
            if (reason.kind !== ts2.FileIncludeKind.Import || reason.file !== importingSourceFile.path)
              return void 0;
            var specifier2 = ts2.getModuleNameStringLiteralAt(importingSourceFile, reason.index).text;
            return preferences.relativePreference !== 1 || !ts2.pathIsRelative(specifier2) ? specifier2 : void 0;
          });
        });
        if (existingSpecifier) {
          var moduleSpecifiers_2 = [existingSpecifier];
          return moduleSpecifiers_2;
        }
        var importedFileIsInNodeModules = ts2.some(modulePaths, function(p) {
          return p.isInNodeModules;
        });
        var nodeModulesSpecifiers;
        var pathsSpecifiers;
        var relativeSpecifiers;
        for (var _i = 0, modulePaths_1 = modulePaths; _i < modulePaths_1.length; _i++) {
          var modulePath = modulePaths_1[_i];
          var specifier = tryGetModuleNameAsNodeModule(modulePath, info, host, compilerOptions);
          nodeModulesSpecifiers = ts2.append(nodeModulesSpecifiers, specifier);
          if (specifier && modulePath.isRedirect) {
            return nodeModulesSpecifiers;
          }
          if (!specifier && !modulePath.isRedirect) {
            var local = getLocalModuleSpecifier(modulePath.path, info, compilerOptions, host, preferences);
            if (ts2.pathIsBareSpecifier(local)) {
              pathsSpecifiers = ts2.append(pathsSpecifiers, local);
            } else if (!importedFileIsInNodeModules || modulePath.isInNodeModules) {
              relativeSpecifiers = ts2.append(relativeSpecifiers, local);
            }
          }
        }
        return (pathsSpecifiers === null || pathsSpecifiers === void 0 ? void 0 : pathsSpecifiers.length) ? pathsSpecifiers : (nodeModulesSpecifiers === null || nodeModulesSpecifiers === void 0 ? void 0 : nodeModulesSpecifiers.length) ? nodeModulesSpecifiers : ts2.Debug.checkDefined(relativeSpecifiers);
      }
      function getInfo(importingSourceFileName, host) {
        var getCanonicalFileName = ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames ? host.useCaseSensitiveFileNames() : true);
        var sourceDirectory = ts2.getDirectoryPath(importingSourceFileName);
        return { getCanonicalFileName, importingSourceFileName, sourceDirectory };
      }
      function getLocalModuleSpecifier(moduleFileName, info, compilerOptions, host, _a) {
        var ending = _a.ending, relativePreference = _a.relativePreference;
        var baseUrl = compilerOptions.baseUrl, paths = compilerOptions.paths, rootDirs = compilerOptions.rootDirs;
        var sourceDirectory = info.sourceDirectory, getCanonicalFileName = info.getCanonicalFileName;
        var relativePath = rootDirs && tryGetModuleNameFromRootDirs(rootDirs, moduleFileName, sourceDirectory, getCanonicalFileName, ending, compilerOptions) || removeExtensionAndIndexPostFix(ts2.ensurePathIsNonModuleName(ts2.getRelativePathFromDirectory(sourceDirectory, moduleFileName, getCanonicalFileName)), ending, compilerOptions);
        if (!baseUrl && !paths || relativePreference === 0) {
          return relativePath;
        }
        var baseDirectory = ts2.getNormalizedAbsolutePath(ts2.getPathsBasePath(compilerOptions, host) || baseUrl, host.getCurrentDirectory());
        var relativeToBaseUrl = getRelativePathIfInDirectory(moduleFileName, baseDirectory, getCanonicalFileName);
        if (!relativeToBaseUrl) {
          return relativePath;
        }
        var importRelativeToBaseUrl = removeExtensionAndIndexPostFix(relativeToBaseUrl, ending, compilerOptions);
        var fromPaths = paths && tryGetModuleNameFromPaths(ts2.removeFileExtension(relativeToBaseUrl), importRelativeToBaseUrl, paths);
        var nonRelative = fromPaths === void 0 && baseUrl !== void 0 ? importRelativeToBaseUrl : fromPaths;
        if (!nonRelative) {
          return relativePath;
        }
        if (relativePreference === 1) {
          return nonRelative;
        }
        if (relativePreference === 3) {
          var projectDirectory = compilerOptions.configFilePath ? ts2.toPath(ts2.getDirectoryPath(compilerOptions.configFilePath), host.getCurrentDirectory(), info.getCanonicalFileName) : info.getCanonicalFileName(host.getCurrentDirectory());
          var modulePath = ts2.toPath(moduleFileName, projectDirectory, getCanonicalFileName);
          var sourceIsInternal = ts2.startsWith(sourceDirectory, projectDirectory);
          var targetIsInternal = ts2.startsWith(modulePath, projectDirectory);
          if (sourceIsInternal && !targetIsInternal || !sourceIsInternal && targetIsInternal) {
            return nonRelative;
          }
          var nearestTargetPackageJson = getNearestAncestorDirectoryWithPackageJson(host, ts2.getDirectoryPath(modulePath));
          var nearestSourcePackageJson = getNearestAncestorDirectoryWithPackageJson(host, sourceDirectory);
          if (nearestSourcePackageJson !== nearestTargetPackageJson) {
            return nonRelative;
          }
          return relativePath;
        }
        if (relativePreference !== 2)
          ts2.Debug.assertNever(relativePreference);
        return isPathRelativeToParent(nonRelative) || countPathComponents(relativePath) < countPathComponents(nonRelative) ? relativePath : nonRelative;
      }
      function countPathComponents(path) {
        var count = 0;
        for (var i = ts2.startsWith(path, "./") ? 2 : 0; i < path.length; i++) {
          if (path.charCodeAt(i) === 47)
            count++;
        }
        return count;
      }
      moduleSpecifiers_1.countPathComponents = countPathComponents;
      function usesJsExtensionOnImports(_a) {
        var imports = _a.imports;
        return ts2.firstDefined(imports, function(_a2) {
          var text = _a2.text;
          return ts2.pathIsRelative(text) ? ts2.hasJSFileExtension(text) : void 0;
        }) || false;
      }
      function comparePathsByRedirectAndNumberOfDirectorySeparators(a, b) {
        return ts2.compareBooleans(b.isRedirect, a.isRedirect) || ts2.compareNumberOfDirectorySeparators(a.path, b.path);
      }
      function getNearestAncestorDirectoryWithPackageJson(host, fileName) {
        if (host.getNearestAncestorDirectoryWithPackageJson) {
          return host.getNearestAncestorDirectoryWithPackageJson(fileName);
        }
        return !!ts2.forEachAncestorDirectory(fileName, function(directory) {
          return host.fileExists(ts2.combinePaths(directory, "package.json")) ? true : void 0;
        });
      }
      function forEachFileNameOfModule(importingFileName, importedFileName, host, preferSymlinks, cb) {
        var _a;
        var getCanonicalFileName = ts2.hostGetCanonicalFileName(host);
        var cwd = host.getCurrentDirectory();
        var referenceRedirect = host.isSourceOfProjectReferenceRedirect(importedFileName) ? host.getProjectReferenceRedirect(importedFileName) : void 0;
        var importedPath = ts2.toPath(importedFileName, cwd, getCanonicalFileName);
        var redirects = host.redirectTargetsMap.get(importedPath) || ts2.emptyArray;
        var importedFileNames = __spreadArray(__spreadArray(__spreadArray([], referenceRedirect ? [referenceRedirect] : ts2.emptyArray, true), [importedFileName], false), redirects, true);
        var targets = importedFileNames.map(function(f) {
          return ts2.getNormalizedAbsolutePath(f, cwd);
        });
        var shouldFilterIgnoredPaths = !ts2.every(targets, ts2.containsIgnoredPath);
        if (!preferSymlinks) {
          var result_14 = ts2.forEach(targets, function(p) {
            return !(shouldFilterIgnoredPaths && ts2.containsIgnoredPath(p)) && cb(p, referenceRedirect === p);
          });
          if (result_14)
            return result_14;
        }
        var symlinkedDirectories = (_a = host.getSymlinkCache) === null || _a === void 0 ? void 0 : _a.call(host).getSymlinkedDirectoriesByRealpath();
        var fullImportedFileName = ts2.getNormalizedAbsolutePath(importedFileName, cwd);
        var result = symlinkedDirectories && ts2.forEachAncestorDirectory(ts2.getDirectoryPath(fullImportedFileName), function(realPathDirectory) {
          var symlinkDirectories = symlinkedDirectories.get(ts2.ensureTrailingDirectorySeparator(ts2.toPath(realPathDirectory, cwd, getCanonicalFileName)));
          if (!symlinkDirectories)
            return void 0;
          if (ts2.startsWithDirectory(importingFileName, realPathDirectory, getCanonicalFileName)) {
            return false;
          }
          return ts2.forEach(targets, function(target) {
            if (!ts2.startsWithDirectory(target, realPathDirectory, getCanonicalFileName)) {
              return;
            }
            var relative = ts2.getRelativePathFromDirectory(realPathDirectory, target, getCanonicalFileName);
            for (var _i = 0, symlinkDirectories_1 = symlinkDirectories; _i < symlinkDirectories_1.length; _i++) {
              var symlinkDirectory = symlinkDirectories_1[_i];
              var option = ts2.resolvePath(symlinkDirectory, relative);
              var result_15 = cb(option, target === referenceRedirect);
              shouldFilterIgnoredPaths = true;
              if (result_15)
                return result_15;
            }
          });
        });
        return result || (preferSymlinks ? ts2.forEach(targets, function(p) {
          return shouldFilterIgnoredPaths && ts2.containsIgnoredPath(p) ? void 0 : cb(p, p === referenceRedirect);
        }) : void 0);
      }
      moduleSpecifiers_1.forEachFileNameOfModule = forEachFileNameOfModule;
      function getAllModulePaths(importingFilePath, importedFileName, host, preferences, importedFilePath) {
        var _a;
        if (importedFilePath === void 0) {
          importedFilePath = ts2.toPath(importedFileName, host.getCurrentDirectory(), ts2.hostGetCanonicalFileName(host));
        }
        var cache = (_a = host.getModuleSpecifierCache) === null || _a === void 0 ? void 0 : _a.call(host);
        if (cache) {
          var cached = cache.get(importingFilePath, importedFilePath, preferences);
          if (cached === null || cached === void 0 ? void 0 : cached.modulePaths)
            return cached.modulePaths;
        }
        var modulePaths = getAllModulePathsWorker(importingFilePath, importedFileName, host);
        if (cache) {
          cache.setModulePaths(importingFilePath, importedFilePath, preferences, modulePaths);
        }
        return modulePaths;
      }
      function getAllModulePathsWorker(importingFileName, importedFileName, host) {
        var getCanonicalFileName = ts2.hostGetCanonicalFileName(host);
        var allFileNames = new ts2.Map();
        var importedFileFromNodeModules = false;
        forEachFileNameOfModule(importingFileName, importedFileName, host, true, function(path, isRedirect) {
          var isInNodeModules = ts2.pathContainsNodeModules(path);
          allFileNames.set(path, { path: getCanonicalFileName(path), isRedirect, isInNodeModules });
          importedFileFromNodeModules = importedFileFromNodeModules || isInNodeModules;
        });
        var sortedPaths = [];
        var _loop_31 = function(directory2) {
          var directoryStart = ts2.ensureTrailingDirectorySeparator(directory2);
          var pathsInDirectory;
          allFileNames.forEach(function(_a, fileName) {
            var path = _a.path, isRedirect = _a.isRedirect, isInNodeModules = _a.isInNodeModules;
            if (ts2.startsWith(path, directoryStart)) {
              (pathsInDirectory || (pathsInDirectory = [])).push({ path: fileName, isRedirect, isInNodeModules });
              allFileNames.delete(fileName);
            }
          });
          if (pathsInDirectory) {
            if (pathsInDirectory.length > 1) {
              pathsInDirectory.sort(comparePathsByRedirectAndNumberOfDirectorySeparators);
            }
            sortedPaths.push.apply(sortedPaths, pathsInDirectory);
          }
          var newDirectory = ts2.getDirectoryPath(directory2);
          if (newDirectory === directory2)
            return out_directory_1 = directory2, "break";
          directory2 = newDirectory;
          out_directory_1 = directory2;
        };
        var out_directory_1;
        for (var directory = ts2.getDirectoryPath(importingFileName); allFileNames.size !== 0; ) {
          var state_9 = _loop_31(directory);
          directory = out_directory_1;
          if (state_9 === "break")
            break;
        }
        if (allFileNames.size) {
          var remainingPaths = ts2.arrayFrom(allFileNames.values());
          if (remainingPaths.length > 1)
            remainingPaths.sort(comparePathsByRedirectAndNumberOfDirectorySeparators);
          sortedPaths.push.apply(sortedPaths, remainingPaths);
        }
        return sortedPaths;
      }
      function tryGetModuleNameFromAmbientModule(moduleSymbol, checker) {
        var _a;
        var decl = (_a = moduleSymbol.declarations) === null || _a === void 0 ? void 0 : _a.find(function(d) {
          return ts2.isNonGlobalAmbientModule(d) && (!ts2.isExternalModuleAugmentation(d) || !ts2.isExternalModuleNameRelative(ts2.getTextOfIdentifierOrLiteral(d.name)));
        });
        if (decl) {
          return decl.name.text;
        }
        var ambientModuleDeclareCandidates = ts2.mapDefined(moduleSymbol.declarations, function(d) {
          var _a2, _b, _c, _d;
          if (!ts2.isModuleDeclaration(d))
            return;
          var topNamespace = getTopNamespace(d);
          if (!(((_a2 = topNamespace === null || topNamespace === void 0 ? void 0 : topNamespace.parent) === null || _a2 === void 0 ? void 0 : _a2.parent) && ts2.isModuleBlock(topNamespace.parent) && ts2.isAmbientModule(topNamespace.parent.parent) && ts2.isSourceFile(topNamespace.parent.parent.parent)))
            return;
          var exportAssignment = (_d = (_c = (_b = topNamespace.parent.parent.symbol.exports) === null || _b === void 0 ? void 0 : _b.get("export=")) === null || _c === void 0 ? void 0 : _c.valueDeclaration) === null || _d === void 0 ? void 0 : _d.expression;
          if (!exportAssignment)
            return;
          var exportSymbol = checker.getSymbolAtLocation(exportAssignment);
          if (!exportSymbol)
            return;
          var originalExportSymbol = (exportSymbol === null || exportSymbol === void 0 ? void 0 : exportSymbol.flags) & 2097152 ? checker.getAliasedSymbol(exportSymbol) : exportSymbol;
          if (originalExportSymbol === d.symbol)
            return topNamespace.parent.parent;
          function getTopNamespace(namespaceDeclaration) {
            while (namespaceDeclaration.flags & 4) {
              namespaceDeclaration = namespaceDeclaration.parent;
            }
            return namespaceDeclaration;
          }
        });
        var ambientModuleDeclare = ambientModuleDeclareCandidates[0];
        if (ambientModuleDeclare) {
          return ambientModuleDeclare.name.text;
        }
      }
      function tryGetModuleNameFromPaths(relativeToBaseUrlWithIndex, relativeToBaseUrl, paths) {
        for (var key in paths) {
          for (var _i = 0, _a = paths[key]; _i < _a.length; _i++) {
            var patternText_1 = _a[_i];
            var pattern = ts2.removeFileExtension(ts2.normalizePath(patternText_1));
            var indexOfStar = pattern.indexOf("*");
            if (indexOfStar !== -1) {
              var prefix = pattern.substr(0, indexOfStar);
              var suffix = pattern.substr(indexOfStar + 1);
              if (relativeToBaseUrl.length >= prefix.length + suffix.length && ts2.startsWith(relativeToBaseUrl, prefix) && ts2.endsWith(relativeToBaseUrl, suffix) || !suffix && relativeToBaseUrl === ts2.removeTrailingDirectorySeparator(prefix)) {
                var matchedStar = relativeToBaseUrl.substr(prefix.length, relativeToBaseUrl.length - suffix.length - prefix.length);
                return key.replace("*", matchedStar);
              }
            } else if (pattern === relativeToBaseUrl || pattern === relativeToBaseUrlWithIndex) {
              return key;
            }
          }
        }
      }
      var MatchingMode;
      (function(MatchingMode2) {
        MatchingMode2[MatchingMode2["Exact"] = 0] = "Exact";
        MatchingMode2[MatchingMode2["Directory"] = 1] = "Directory";
        MatchingMode2[MatchingMode2["Pattern"] = 2] = "Pattern";
      })(MatchingMode || (MatchingMode = {}));
      function tryGetModuleNameFromExports(options, targetFilePath, packageDirectory, packageName, exports, conditions, mode) {
        if (mode === void 0) {
          mode = 0;
        }
        if (typeof exports === "string") {
          var pathOrPattern = ts2.getNormalizedAbsolutePath(ts2.combinePaths(packageDirectory, exports), void 0);
          var extensionSwappedTarget = ts2.hasTSFileExtension(targetFilePath) ? ts2.removeFileExtension(targetFilePath) + tryGetJSExtensionForFile(targetFilePath, options) : void 0;
          switch (mode) {
            case 0:
              if (ts2.comparePaths(targetFilePath, pathOrPattern) === 0 || extensionSwappedTarget && ts2.comparePaths(extensionSwappedTarget, pathOrPattern) === 0) {
                return { moduleFileToTry: packageName };
              }
              break;
            case 1:
              if (ts2.containsPath(pathOrPattern, targetFilePath)) {
                var fragment = ts2.getRelativePathFromDirectory(pathOrPattern, targetFilePath, false);
                return { moduleFileToTry: ts2.getNormalizedAbsolutePath(ts2.combinePaths(ts2.combinePaths(packageName, exports), fragment), void 0) };
              }
              break;
            case 2:
              var starPos = pathOrPattern.indexOf("*");
              var leadingSlice = pathOrPattern.slice(0, starPos);
              var trailingSlice = pathOrPattern.slice(starPos + 1);
              if (ts2.startsWith(targetFilePath, leadingSlice) && ts2.endsWith(targetFilePath, trailingSlice)) {
                var starReplacement = targetFilePath.slice(leadingSlice.length, targetFilePath.length - trailingSlice.length);
                return { moduleFileToTry: packageName.replace("*", starReplacement) };
              }
              if (extensionSwappedTarget && ts2.startsWith(extensionSwappedTarget, leadingSlice) && ts2.endsWith(extensionSwappedTarget, trailingSlice)) {
                var starReplacement = extensionSwappedTarget.slice(leadingSlice.length, extensionSwappedTarget.length - trailingSlice.length);
                return { moduleFileToTry: packageName.replace("*", starReplacement) };
              }
              break;
          }
        } else if (Array.isArray(exports)) {
          return ts2.forEach(exports, function(e) {
            return tryGetModuleNameFromExports(options, targetFilePath, packageDirectory, packageName, e, conditions);
          });
        } else if (typeof exports === "object" && exports !== null) {
          if (ts2.allKeysStartWithDot(exports)) {
            return ts2.forEach(ts2.getOwnKeys(exports), function(k) {
              var subPackageName = ts2.getNormalizedAbsolutePath(ts2.combinePaths(packageName, k), void 0);
              var mode2 = ts2.endsWith(k, "/") ? 1 : ts2.stringContains(k, "*") ? 2 : 0;
              return tryGetModuleNameFromExports(options, targetFilePath, packageDirectory, subPackageName, exports[k], conditions, mode2);
            });
          } else {
            for (var _i = 0, _a = ts2.getOwnKeys(exports); _i < _a.length; _i++) {
              var key = _a[_i];
              if (key === "default" || conditions.indexOf(key) >= 0 || ts2.isApplicableVersionedTypesKey(conditions, key)) {
                var subTarget = exports[key];
                var result = tryGetModuleNameFromExports(options, targetFilePath, packageDirectory, packageName, subTarget, conditions);
                if (result) {
                  return result;
                }
              }
            }
          }
        }
        return void 0;
      }
      function tryGetModuleNameFromRootDirs(rootDirs, moduleFileName, sourceDirectory, getCanonicalFileName, ending, compilerOptions) {
        var normalizedTargetPath = getPathRelativeToRootDirs(moduleFileName, rootDirs, getCanonicalFileName);
        if (normalizedTargetPath === void 0) {
          return void 0;
        }
        var normalizedSourcePath = getPathRelativeToRootDirs(sourceDirectory, rootDirs, getCanonicalFileName);
        var relativePath = normalizedSourcePath !== void 0 ? ts2.ensurePathIsNonModuleName(ts2.getRelativePathFromDirectory(normalizedSourcePath, normalizedTargetPath, getCanonicalFileName)) : normalizedTargetPath;
        return ts2.getEmitModuleResolutionKind(compilerOptions) === ts2.ModuleResolutionKind.NodeJs ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions) : ts2.removeFileExtension(relativePath);
      }
      function tryGetModuleNameAsNodeModule(_a, _b, host, options, packageNameOnly) {
        var path = _a.path, isRedirect = _a.isRedirect;
        var getCanonicalFileName = _b.getCanonicalFileName, sourceDirectory = _b.sourceDirectory;
        if (!host.fileExists || !host.readFile) {
          return void 0;
        }
        var parts = getNodeModulePathParts(path);
        if (!parts) {
          return void 0;
        }
        var moduleSpecifier = path;
        var isPackageRootPath = false;
        if (!packageNameOnly) {
          var packageRootIndex = parts.packageRootIndex;
          var moduleFileNameForExtensionless = void 0;
          while (true) {
            var _c = tryDirectoryWithPackageJson(packageRootIndex), moduleFileToTry = _c.moduleFileToTry, packageRootPath = _c.packageRootPath, blockedByExports = _c.blockedByExports, verbatimFromExports = _c.verbatimFromExports;
            if (ts2.getEmitModuleResolutionKind(options) !== ts2.ModuleResolutionKind.Classic) {
              if (blockedByExports) {
                return void 0;
              }
              if (verbatimFromExports) {
                return moduleFileToTry;
              }
            }
            if (packageRootPath) {
              moduleSpecifier = packageRootPath;
              isPackageRootPath = true;
              break;
            }
            if (!moduleFileNameForExtensionless)
              moduleFileNameForExtensionless = moduleFileToTry;
            packageRootIndex = path.indexOf(ts2.directorySeparator, packageRootIndex + 1);
            if (packageRootIndex === -1) {
              moduleSpecifier = getExtensionlessFileName(moduleFileNameForExtensionless);
              break;
            }
          }
        }
        if (isRedirect && !isPackageRootPath) {
          return void 0;
        }
        var globalTypingsCacheLocation = host.getGlobalTypingsCacheLocation && host.getGlobalTypingsCacheLocation();
        var pathToTopLevelNodeModules = getCanonicalFileName(moduleSpecifier.substring(0, parts.topLevelNodeModulesIndex));
        if (!(ts2.startsWith(sourceDirectory, pathToTopLevelNodeModules) || globalTypingsCacheLocation && ts2.startsWith(getCanonicalFileName(globalTypingsCacheLocation), pathToTopLevelNodeModules))) {
          return void 0;
        }
        var nodeModulesDirectoryName = moduleSpecifier.substring(parts.topLevelPackageNameIndex + 1);
        var packageName = ts2.getPackageNameFromTypesPackageName(nodeModulesDirectoryName);
        return ts2.getEmitModuleResolutionKind(options) === ts2.ModuleResolutionKind.Classic && packageName === nodeModulesDirectoryName ? void 0 : packageName;
        function tryDirectoryWithPackageJson(packageRootIndex2) {
          var packageRootPath2 = path.substring(0, packageRootIndex2);
          var packageJsonPath = ts2.combinePaths(packageRootPath2, "package.json");
          var moduleFileToTry2 = path;
          if (host.fileExists(packageJsonPath)) {
            var packageJsonContent = JSON.parse(host.readFile(packageJsonPath));
            if (ts2.getEmitModuleResolutionKind(options) === ts2.ModuleResolutionKind.Node12 || ts2.getEmitModuleResolutionKind(options) === ts2.ModuleResolutionKind.NodeNext) {
              var fromExports = packageJsonContent.exports && typeof packageJsonContent.name === "string" ? tryGetModuleNameFromExports(options, path, packageRootPath2, packageJsonContent.name, packageJsonContent.exports, ["node", "types"]) : void 0;
              if (fromExports) {
                var withJsExtension = !ts2.hasTSFileExtension(fromExports.moduleFileToTry) ? fromExports : { moduleFileToTry: ts2.removeFileExtension(fromExports.moduleFileToTry) + tryGetJSExtensionForFile(fromExports.moduleFileToTry, options) };
                return __assign(__assign({}, withJsExtension), { verbatimFromExports: true });
              }
              if (packageJsonContent.exports) {
                return { moduleFileToTry: path, blockedByExports: true };
              }
            }
            var versionPaths = packageJsonContent.typesVersions ? ts2.getPackageJsonTypesVersionsPaths(packageJsonContent.typesVersions) : void 0;
            if (versionPaths) {
              var subModuleName = path.slice(packageRootPath2.length + 1);
              var fromPaths = tryGetModuleNameFromPaths(ts2.removeFileExtension(subModuleName), removeExtensionAndIndexPostFix(subModuleName, 0, options), versionPaths.paths);
              if (fromPaths !== void 0) {
                moduleFileToTry2 = ts2.combinePaths(packageRootPath2, fromPaths);
              }
            }
            var mainFileRelative = packageJsonContent.typings || packageJsonContent.types || packageJsonContent.main;
            if (ts2.isString(mainFileRelative)) {
              var mainExportFile = ts2.toPath(mainFileRelative, packageRootPath2, getCanonicalFileName);
              if (ts2.removeFileExtension(mainExportFile) === ts2.removeFileExtension(getCanonicalFileName(moduleFileToTry2))) {
                return { packageRootPath: packageRootPath2, moduleFileToTry: moduleFileToTry2 };
              }
            }
          }
          return { moduleFileToTry: moduleFileToTry2 };
        }
        function getExtensionlessFileName(path2) {
          var fullModulePathWithoutExtension = ts2.removeFileExtension(path2);
          if (getCanonicalFileName(fullModulePathWithoutExtension.substring(parts.fileNameIndex)) === "/index" && !tryGetAnyFileFromPath(host, fullModulePathWithoutExtension.substring(0, parts.fileNameIndex))) {
            return fullModulePathWithoutExtension.substring(0, parts.fileNameIndex);
          }
          return fullModulePathWithoutExtension;
        }
      }
      function tryGetAnyFileFromPath(host, path) {
        if (!host.fileExists)
          return;
        var extensions = ts2.flatten(ts2.getSupportedExtensions({ allowJs: true }, [{ extension: "node", isMixedContent: false }, { extension: "json", isMixedContent: false, scriptKind: 6 }]));
        for (var _i = 0, extensions_3 = extensions; _i < extensions_3.length; _i++) {
          var e = extensions_3[_i];
          var fullPath = path + e;
          if (host.fileExists(fullPath)) {
            return fullPath;
          }
        }
      }
      function getNodeModulePathParts(fullPath) {
        var topLevelNodeModulesIndex = 0;
        var topLevelPackageNameIndex = 0;
        var packageRootIndex = 0;
        var fileNameIndex = 0;
        var States;
        (function(States2) {
          States2[States2["BeforeNodeModules"] = 0] = "BeforeNodeModules";
          States2[States2["NodeModules"] = 1] = "NodeModules";
          States2[States2["Scope"] = 2] = "Scope";
          States2[States2["PackageContent"] = 3] = "PackageContent";
        })(States || (States = {}));
        var partStart = 0;
        var partEnd = 0;
        var state = 0;
        while (partEnd >= 0) {
          partStart = partEnd;
          partEnd = fullPath.indexOf("/", partStart + 1);
          switch (state) {
            case 0:
              if (fullPath.indexOf(ts2.nodeModulesPathPart, partStart) === partStart) {
                topLevelNodeModulesIndex = partStart;
                topLevelPackageNameIndex = partEnd;
                state = 1;
              }
              break;
            case 1:
            case 2:
              if (state === 1 && fullPath.charAt(partStart + 1) === "@") {
                state = 2;
              } else {
                packageRootIndex = partEnd;
                state = 3;
              }
              break;
            case 3:
              if (fullPath.indexOf(ts2.nodeModulesPathPart, partStart) === partStart) {
                state = 1;
              } else {
                state = 3;
              }
              break;
          }
        }
        fileNameIndex = partStart;
        return state > 1 ? { topLevelNodeModulesIndex, topLevelPackageNameIndex, packageRootIndex, fileNameIndex } : void 0;
      }
      function getPathRelativeToRootDirs(path, rootDirs, getCanonicalFileName) {
        return ts2.firstDefined(rootDirs, function(rootDir) {
          var relativePath = getRelativePathIfInDirectory(path, rootDir, getCanonicalFileName);
          return isPathRelativeToParent(relativePath) ? void 0 : relativePath;
        });
      }
      function removeExtensionAndIndexPostFix(fileName, ending, options) {
        if (ts2.fileExtensionIsOneOf(fileName, [".json", ".mjs", ".cjs"]))
          return fileName;
        var noExtension = ts2.removeFileExtension(fileName);
        if (ts2.fileExtensionIsOneOf(fileName, [".d.mts", ".mts", ".d.cts", ".cts"]))
          return noExtension + getJSExtensionForFile(fileName, options);
        switch (ending) {
          case 0:
            return ts2.removeSuffix(noExtension, "/index");
          case 1:
            return noExtension;
          case 2:
            return noExtension + getJSExtensionForFile(fileName, options);
          default:
            return ts2.Debug.assertNever(ending);
        }
      }
      function getJSExtensionForFile(fileName, options) {
        var _a;
        return (_a = tryGetJSExtensionForFile(fileName, options)) !== null && _a !== void 0 ? _a : ts2.Debug.fail("Extension ".concat(ts2.extensionFromPath(fileName), " is unsupported:: FileName:: ").concat(fileName));
      }
      function tryGetJSExtensionForFile(fileName, options) {
        var ext = ts2.tryGetExtensionFromPath(fileName);
        switch (ext) {
          case ".ts":
          case ".d.ts":
            return ".js";
          case ".tsx":
            return options.jsx === 1 ? ".jsx" : ".js";
          case ".js":
          case ".jsx":
          case ".json":
            return ext;
          case ".d.mts":
          case ".mts":
          case ".mjs":
            return ".mjs";
          case ".d.cts":
          case ".cts":
          case ".cjs":
            return ".cjs";
          default:
            return void 0;
        }
      }
      moduleSpecifiers_1.tryGetJSExtensionForFile = tryGetJSExtensionForFile;
      function getRelativePathIfInDirectory(path, directoryPath, getCanonicalFileName) {
        var relativePath = ts2.getRelativePathToDirectoryOrUrl(directoryPath, path, directoryPath, getCanonicalFileName, false);
        return ts2.isRootedDiskPath(relativePath) ? void 0 : relativePath;
      }
      function isPathRelativeToParent(path) {
        return ts2.startsWith(path, "..");
      }
    })(moduleSpecifiers = ts2.moduleSpecifiers || (ts2.moduleSpecifiers = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var sysFormatDiagnosticsHost = ts2.sys ? {
      getCurrentDirectory: function() {
        return ts2.sys.getCurrentDirectory();
      },
      getNewLine: function() {
        return ts2.sys.newLine;
      },
      getCanonicalFileName: ts2.createGetCanonicalFileName(ts2.sys.useCaseSensitiveFileNames)
    } : void 0;
    function createDiagnosticReporter(system, pretty) {
      var host = system === ts2.sys && sysFormatDiagnosticsHost ? sysFormatDiagnosticsHost : {
        getCurrentDirectory: function() {
          return system.getCurrentDirectory();
        },
        getNewLine: function() {
          return system.newLine;
        },
        getCanonicalFileName: ts2.createGetCanonicalFileName(system.useCaseSensitiveFileNames)
      };
      if (!pretty) {
        return function(diagnostic) {
          return system.write(ts2.formatDiagnostic(diagnostic, host));
        };
      }
      var diagnostics = new Array(1);
      return function(diagnostic) {
        diagnostics[0] = diagnostic;
        system.write(ts2.formatDiagnosticsWithColorAndContext(diagnostics, host) + host.getNewLine());
        diagnostics[0] = void 0;
      };
    }
    ts2.createDiagnosticReporter = createDiagnosticReporter;
    function clearScreenIfNotWatchingForFileChanges(system, diagnostic, options) {
      if (system.clearScreen && !options.preserveWatchOutput && !options.extendedDiagnostics && !options.diagnostics && ts2.contains(ts2.screenStartingMessageCodes, diagnostic.code)) {
        system.clearScreen();
        return true;
      }
      return false;
    }
    ts2.screenStartingMessageCodes = [
      ts2.Diagnostics.Starting_compilation_in_watch_mode.code,
      ts2.Diagnostics.File_change_detected_Starting_incremental_compilation.code
    ];
    function getPlainDiagnosticFollowingNewLines(diagnostic, newLine) {
      return ts2.contains(ts2.screenStartingMessageCodes, diagnostic.code) ? newLine + newLine : newLine;
    }
    function getLocaleTimeString(system) {
      return !system.now ? new Date().toLocaleTimeString() : system.now().toLocaleTimeString("en-US", { timeZone: "UTC" });
    }
    ts2.getLocaleTimeString = getLocaleTimeString;
    function createWatchStatusReporter(system, pretty) {
      return pretty ? function(diagnostic, newLine, options) {
        clearScreenIfNotWatchingForFileChanges(system, diagnostic, options);
        var output = "[".concat(ts2.formatColorAndReset(getLocaleTimeString(system), ts2.ForegroundColorEscapeSequences.Grey), "] ");
        output += "".concat(ts2.flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)).concat(newLine + newLine);
        system.write(output);
      } : function(diagnostic, newLine, options) {
        var output = "";
        if (!clearScreenIfNotWatchingForFileChanges(system, diagnostic, options)) {
          output += newLine;
        }
        output += "".concat(getLocaleTimeString(system), " - ");
        output += "".concat(ts2.flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)).concat(getPlainDiagnosticFollowingNewLines(diagnostic, newLine));
        system.write(output);
      };
    }
    ts2.createWatchStatusReporter = createWatchStatusReporter;
    function parseConfigFileWithSystem(configFileName, optionsToExtend, extendedConfigCache, watchOptionsToExtend, system, reportDiagnostic) {
      var host = system;
      host.onUnRecoverableConfigFileDiagnostic = function(diagnostic) {
        return reportUnrecoverableDiagnostic(system, reportDiagnostic, diagnostic);
      };
      var result = ts2.getParsedCommandLineOfConfigFile(configFileName, optionsToExtend, host, extendedConfigCache, watchOptionsToExtend);
      host.onUnRecoverableConfigFileDiagnostic = void 0;
      return result;
    }
    ts2.parseConfigFileWithSystem = parseConfigFileWithSystem;
    function getErrorCountForSummary(diagnostics) {
      return ts2.countWhere(diagnostics, function(diagnostic) {
        return diagnostic.category === ts2.DiagnosticCategory.Error;
      });
    }
    ts2.getErrorCountForSummary = getErrorCountForSummary;
    function getWatchErrorSummaryDiagnosticMessage(errorCount) {
      return errorCount === 1 ? ts2.Diagnostics.Found_1_error_Watching_for_file_changes : ts2.Diagnostics.Found_0_errors_Watching_for_file_changes;
    }
    ts2.getWatchErrorSummaryDiagnosticMessage = getWatchErrorSummaryDiagnosticMessage;
    function getErrorSummaryText(errorCount, newLine) {
      if (errorCount === 0)
        return "";
      var d = ts2.createCompilerDiagnostic(errorCount === 1 ? ts2.Diagnostics.Found_1_error : ts2.Diagnostics.Found_0_errors, errorCount);
      return "".concat(newLine).concat(ts2.flattenDiagnosticMessageText(d.messageText, newLine)).concat(newLine).concat(newLine);
    }
    ts2.getErrorSummaryText = getErrorSummaryText;
    function isBuilderProgram(program) {
      return !!program.getState;
    }
    ts2.isBuilderProgram = isBuilderProgram;
    function listFiles(program, write) {
      var options = program.getCompilerOptions();
      if (options.explainFiles) {
        explainFiles(isBuilderProgram(program) ? program.getProgram() : program, write);
      } else if (options.listFiles || options.listFilesOnly) {
        ts2.forEach(program.getSourceFiles(), function(file) {
          write(file.fileName);
        });
      }
    }
    ts2.listFiles = listFiles;
    function explainFiles(program, write) {
      var _a, _b;
      var reasons = program.getFileIncludeReasons();
      var getCanonicalFileName = ts2.createGetCanonicalFileName(program.useCaseSensitiveFileNames());
      var relativeFileName = function(fileName) {
        return ts2.convertToRelativePath(fileName, program.getCurrentDirectory(), getCanonicalFileName);
      };
      for (var _i = 0, _c = program.getSourceFiles(); _i < _c.length; _i++) {
        var file = _c[_i];
        write("".concat(toFileName(file, relativeFileName)));
        (_a = reasons.get(file.path)) === null || _a === void 0 ? void 0 : _a.forEach(function(reason) {
          return write("  ".concat(fileIncludeReasonToDiagnostics(program, reason, relativeFileName).messageText));
        });
        (_b = explainIfFileIsRedirect(file, relativeFileName)) === null || _b === void 0 ? void 0 : _b.forEach(function(d) {
          return write("  ".concat(d.messageText));
        });
      }
    }
    ts2.explainFiles = explainFiles;
    function explainIfFileIsRedirect(file, fileNameConvertor) {
      var result;
      if (file.path !== file.resolvedPath) {
        (result || (result = [])).push(ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.File_is_output_of_project_reference_source_0, toFileName(file.originalFileName, fileNameConvertor)));
      }
      if (file.redirectInfo) {
        (result || (result = [])).push(ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.File_redirects_to_file_0, toFileName(file.redirectInfo.redirectTarget, fileNameConvertor)));
      }
      return result;
    }
    ts2.explainIfFileIsRedirect = explainIfFileIsRedirect;
    function getMatchedFileSpec(program, fileName) {
      var _a;
      var configFile = program.getCompilerOptions().configFile;
      if (!((_a = configFile === null || configFile === void 0 ? void 0 : configFile.configFileSpecs) === null || _a === void 0 ? void 0 : _a.validatedFilesSpec))
        return void 0;
      var getCanonicalFileName = ts2.createGetCanonicalFileName(program.useCaseSensitiveFileNames());
      var filePath = getCanonicalFileName(fileName);
      var basePath = ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(configFile.fileName, program.getCurrentDirectory()));
      return ts2.find(configFile.configFileSpecs.validatedFilesSpec, function(fileSpec) {
        return getCanonicalFileName(ts2.getNormalizedAbsolutePath(fileSpec, basePath)) === filePath;
      });
    }
    ts2.getMatchedFileSpec = getMatchedFileSpec;
    function getMatchedIncludeSpec(program, fileName) {
      var _a, _b;
      var configFile = program.getCompilerOptions().configFile;
      if (!((_a = configFile === null || configFile === void 0 ? void 0 : configFile.configFileSpecs) === null || _a === void 0 ? void 0 : _a.validatedIncludeSpecs))
        return void 0;
      var isJsonFile = ts2.fileExtensionIs(fileName, ".json");
      var basePath = ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(configFile.fileName, program.getCurrentDirectory()));
      var useCaseSensitiveFileNames = program.useCaseSensitiveFileNames();
      return ts2.find((_b = configFile === null || configFile === void 0 ? void 0 : configFile.configFileSpecs) === null || _b === void 0 ? void 0 : _b.validatedIncludeSpecs, function(includeSpec) {
        if (isJsonFile && !ts2.endsWith(includeSpec, ".json"))
          return false;
        var pattern = ts2.getPatternFromSpec(includeSpec, basePath, "files");
        return !!pattern && ts2.getRegexFromPattern("(".concat(pattern, ")$"), useCaseSensitiveFileNames).test(fileName);
      });
    }
    ts2.getMatchedIncludeSpec = getMatchedIncludeSpec;
    function fileIncludeReasonToDiagnostics(program, reason, fileNameConvertor) {
      var _a, _b;
      var options = program.getCompilerOptions();
      if (ts2.isReferencedFile(reason)) {
        var referenceLocation = ts2.getReferencedFileLocation(function(path) {
          return program.getSourceFileByPath(path);
        }, reason);
        var referenceText = ts2.isReferenceFileLocation(referenceLocation) ? referenceLocation.file.text.substring(referenceLocation.pos, referenceLocation.end) : '"'.concat(referenceLocation.text, '"');
        var message = void 0;
        ts2.Debug.assert(ts2.isReferenceFileLocation(referenceLocation) || reason.kind === ts2.FileIncludeKind.Import, "Only synthetic references are imports");
        switch (reason.kind) {
          case ts2.FileIncludeKind.Import:
            if (ts2.isReferenceFileLocation(referenceLocation)) {
              message = referenceLocation.packageId ? ts2.Diagnostics.Imported_via_0_from_file_1_with_packageId_2 : ts2.Diagnostics.Imported_via_0_from_file_1;
            } else if (referenceLocation.text === ts2.externalHelpersModuleNameText) {
              message = referenceLocation.packageId ? ts2.Diagnostics.Imported_via_0_from_file_1_with_packageId_2_to_import_importHelpers_as_specified_in_compilerOptions : ts2.Diagnostics.Imported_via_0_from_file_1_to_import_importHelpers_as_specified_in_compilerOptions;
            } else {
              message = referenceLocation.packageId ? ts2.Diagnostics.Imported_via_0_from_file_1_with_packageId_2_to_import_jsx_and_jsxs_factory_functions : ts2.Diagnostics.Imported_via_0_from_file_1_to_import_jsx_and_jsxs_factory_functions;
            }
            break;
          case ts2.FileIncludeKind.ReferenceFile:
            ts2.Debug.assert(!referenceLocation.packageId);
            message = ts2.Diagnostics.Referenced_via_0_from_file_1;
            break;
          case ts2.FileIncludeKind.TypeReferenceDirective:
            message = referenceLocation.packageId ? ts2.Diagnostics.Type_library_referenced_via_0_from_file_1_with_packageId_2 : ts2.Diagnostics.Type_library_referenced_via_0_from_file_1;
            break;
          case ts2.FileIncludeKind.LibReferenceDirective:
            ts2.Debug.assert(!referenceLocation.packageId);
            message = ts2.Diagnostics.Library_referenced_via_0_from_file_1;
            break;
          default:
            ts2.Debug.assertNever(reason);
        }
        return ts2.chainDiagnosticMessages(void 0, message, referenceText, toFileName(referenceLocation.file, fileNameConvertor), referenceLocation.packageId && ts2.packageIdToString(referenceLocation.packageId));
      }
      switch (reason.kind) {
        case ts2.FileIncludeKind.RootFile:
          if (!((_a = options.configFile) === null || _a === void 0 ? void 0 : _a.configFileSpecs))
            return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Root_file_specified_for_compilation);
          var fileName = ts2.getNormalizedAbsolutePath(program.getRootFileNames()[reason.index], program.getCurrentDirectory());
          var matchedByFiles = getMatchedFileSpec(program, fileName);
          if (matchedByFiles)
            return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Part_of_files_list_in_tsconfig_json);
          var matchedByInclude = getMatchedIncludeSpec(program, fileName);
          return matchedByInclude ? ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Matched_by_include_pattern_0_in_1, matchedByInclude, toFileName(options.configFile, fileNameConvertor)) : ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Root_file_specified_for_compilation);
        case ts2.FileIncludeKind.SourceFromProjectReference:
        case ts2.FileIncludeKind.OutputFromProjectReference:
          var isOutput = reason.kind === ts2.FileIncludeKind.OutputFromProjectReference;
          var referencedResolvedRef = ts2.Debug.checkDefined((_b = program.getResolvedProjectReferences()) === null || _b === void 0 ? void 0 : _b[reason.index]);
          return ts2.chainDiagnosticMessages(void 0, ts2.outFile(options) ? isOutput ? ts2.Diagnostics.Output_from_referenced_project_0_included_because_1_specified : ts2.Diagnostics.Source_from_referenced_project_0_included_because_1_specified : isOutput ? ts2.Diagnostics.Output_from_referenced_project_0_included_because_module_is_specified_as_none : ts2.Diagnostics.Source_from_referenced_project_0_included_because_module_is_specified_as_none, toFileName(referencedResolvedRef.sourceFile.fileName, fileNameConvertor), options.outFile ? "--outFile" : "--out");
        case ts2.FileIncludeKind.AutomaticTypeDirectiveFile:
          return ts2.chainDiagnosticMessages(void 0, options.types ? reason.packageId ? ts2.Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions_with_packageId_1 : ts2.Diagnostics.Entry_point_of_type_library_0_specified_in_compilerOptions : reason.packageId ? ts2.Diagnostics.Entry_point_for_implicit_type_library_0_with_packageId_1 : ts2.Diagnostics.Entry_point_for_implicit_type_library_0, reason.typeReference, reason.packageId && ts2.packageIdToString(reason.packageId));
        case ts2.FileIncludeKind.LibFile:
          if (reason.index !== void 0)
            return ts2.chainDiagnosticMessages(void 0, ts2.Diagnostics.Library_0_specified_in_compilerOptions, options.lib[reason.index]);
          var target = ts2.forEachEntry(ts2.targetOptionDeclaration.type, function(value, key) {
            return value === ts2.getEmitScriptTarget(options) ? key : void 0;
          });
          return ts2.chainDiagnosticMessages(void 0, target ? ts2.Diagnostics.Default_library_for_target_0 : ts2.Diagnostics.Default_library, target);
        default:
          ts2.Debug.assertNever(reason);
      }
    }
    ts2.fileIncludeReasonToDiagnostics = fileIncludeReasonToDiagnostics;
    function toFileName(file, fileNameConvertor) {
      var fileName = ts2.isString(file) ? file : file.fileName;
      return fileNameConvertor ? fileNameConvertor(fileName) : fileName;
    }
    function emitFilesAndReportErrors(program, reportDiagnostic, write, reportSummary, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers) {
      var isListFilesOnly = !!program.getCompilerOptions().listFilesOnly;
      var allDiagnostics = program.getConfigFileParsingDiagnostics().slice();
      var configFileParsingDiagnosticsLength = allDiagnostics.length;
      ts2.addRange(allDiagnostics, program.getSyntacticDiagnostics(void 0, cancellationToken));
      if (allDiagnostics.length === configFileParsingDiagnosticsLength) {
        ts2.addRange(allDiagnostics, program.getOptionsDiagnostics(cancellationToken));
        if (!isListFilesOnly) {
          ts2.addRange(allDiagnostics, program.getGlobalDiagnostics(cancellationToken));
          if (allDiagnostics.length === configFileParsingDiagnosticsLength) {
            ts2.addRange(allDiagnostics, program.getSemanticDiagnostics(void 0, cancellationToken));
          }
        }
      }
      var emitResult = isListFilesOnly ? { emitSkipped: true, diagnostics: ts2.emptyArray } : program.emit(void 0, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers);
      var emittedFiles = emitResult.emittedFiles, emitDiagnostics = emitResult.diagnostics;
      ts2.addRange(allDiagnostics, emitDiagnostics);
      var diagnostics = ts2.sortAndDeduplicateDiagnostics(allDiagnostics);
      diagnostics.forEach(reportDiagnostic);
      if (write) {
        var currentDir_1 = program.getCurrentDirectory();
        ts2.forEach(emittedFiles, function(file) {
          var filepath = ts2.getNormalizedAbsolutePath(file, currentDir_1);
          write("TSFILE: ".concat(filepath));
        });
        listFiles(program, write);
      }
      if (reportSummary) {
        reportSummary(getErrorCountForSummary(diagnostics));
      }
      return {
        emitResult,
        diagnostics
      };
    }
    ts2.emitFilesAndReportErrors = emitFilesAndReportErrors;
    function emitFilesAndReportErrorsAndGetExitStatus(program, reportDiagnostic, write, reportSummary, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers) {
      var _a = emitFilesAndReportErrors(program, reportDiagnostic, write, reportSummary, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers), emitResult = _a.emitResult, diagnostics = _a.diagnostics;
      if (emitResult.emitSkipped && diagnostics.length > 0) {
        return ts2.ExitStatus.DiagnosticsPresent_OutputsSkipped;
      } else if (diagnostics.length > 0) {
        return ts2.ExitStatus.DiagnosticsPresent_OutputsGenerated;
      }
      return ts2.ExitStatus.Success;
    }
    ts2.emitFilesAndReportErrorsAndGetExitStatus = emitFilesAndReportErrorsAndGetExitStatus;
    ts2.noopFileWatcher = { close: ts2.noop };
    ts2.returnNoopFileWatcher = function() {
      return ts2.noopFileWatcher;
    };
    function createWatchHost(system, reportWatchStatus) {
      if (system === void 0) {
        system = ts2.sys;
      }
      var onWatchStatusChange = reportWatchStatus || createWatchStatusReporter(system);
      return {
        onWatchStatusChange,
        watchFile: ts2.maybeBind(system, system.watchFile) || ts2.returnNoopFileWatcher,
        watchDirectory: ts2.maybeBind(system, system.watchDirectory) || ts2.returnNoopFileWatcher,
        setTimeout: ts2.maybeBind(system, system.setTimeout) || ts2.noop,
        clearTimeout: ts2.maybeBind(system, system.clearTimeout) || ts2.noop
      };
    }
    ts2.createWatchHost = createWatchHost;
    ts2.WatchType = {
      ConfigFile: "Config file",
      ExtendedConfigFile: "Extended config file",
      SourceFile: "Source file",
      MissingFile: "Missing file",
      WildcardDirectory: "Wild card directory",
      FailedLookupLocations: "Failed Lookup Locations",
      TypeRoots: "Type roots",
      ConfigFileOfReferencedProject: "Config file of referened project",
      ExtendedConfigOfReferencedProject: "Extended config file of referenced project",
      WildcardDirectoryOfReferencedProject: "Wild card directory of referenced project",
      PackageJson: "package.json file"
    };
    function createWatchFactory(host, options) {
      var watchLogLevel = host.trace ? options.extendedDiagnostics ? ts2.WatchLogLevel.Verbose : options.diagnostics ? ts2.WatchLogLevel.TriggerOnly : ts2.WatchLogLevel.None : ts2.WatchLogLevel.None;
      var writeLog = watchLogLevel !== ts2.WatchLogLevel.None ? function(s) {
        return host.trace(s);
      } : ts2.noop;
      var result = ts2.getWatchFactory(host, watchLogLevel, writeLog);
      result.writeLog = writeLog;
      return result;
    }
    ts2.createWatchFactory = createWatchFactory;
    function createCompilerHostFromProgramHost(host, getCompilerOptions, directoryStructureHost) {
      if (directoryStructureHost === void 0) {
        directoryStructureHost = host;
      }
      var useCaseSensitiveFileNames = host.useCaseSensitiveFileNames();
      var hostGetNewLine = ts2.memoize(function() {
        return host.getNewLine();
      });
      return {
        getSourceFile: function(fileName, languageVersion, onError) {
          var text;
          try {
            ts2.performance.mark("beforeIORead");
            text = host.readFile(fileName, getCompilerOptions().charset);
            ts2.performance.mark("afterIORead");
            ts2.performance.measure("I/O Read", "beforeIORead", "afterIORead");
          } catch (e) {
            if (onError) {
              onError(e.message);
            }
            text = "";
          }
          return text !== void 0 ? ts2.createSourceFile(fileName, text, languageVersion) : void 0;
        },
        getDefaultLibLocation: ts2.maybeBind(host, host.getDefaultLibLocation),
        getDefaultLibFileName: function(options) {
          return host.getDefaultLibFileName(options);
        },
        writeFile,
        getCurrentDirectory: ts2.memoize(function() {
          return host.getCurrentDirectory();
        }),
        useCaseSensitiveFileNames: function() {
          return useCaseSensitiveFileNames;
        },
        getCanonicalFileName: ts2.createGetCanonicalFileName(useCaseSensitiveFileNames),
        getNewLine: function() {
          return ts2.getNewLineCharacter(getCompilerOptions(), hostGetNewLine);
        },
        fileExists: function(f) {
          return host.fileExists(f);
        },
        readFile: function(f) {
          return host.readFile(f);
        },
        trace: ts2.maybeBind(host, host.trace),
        directoryExists: ts2.maybeBind(directoryStructureHost, directoryStructureHost.directoryExists),
        getDirectories: ts2.maybeBind(directoryStructureHost, directoryStructureHost.getDirectories),
        realpath: ts2.maybeBind(host, host.realpath),
        getEnvironmentVariable: ts2.maybeBind(host, host.getEnvironmentVariable) || function() {
          return "";
        },
        createHash: ts2.maybeBind(host, host.createHash),
        readDirectory: ts2.maybeBind(host, host.readDirectory),
        disableUseFileVersionAsSignature: host.disableUseFileVersionAsSignature
      };
      function writeFile(fileName, text, writeByteOrderMark, onError) {
        try {
          ts2.performance.mark("beforeIOWrite");
          ts2.writeFileEnsuringDirectories(fileName, text, writeByteOrderMark, function(path, data, writeByteOrderMark2) {
            return host.writeFile(path, data, writeByteOrderMark2);
          }, function(path) {
            return host.createDirectory(path);
          }, function(path) {
            return host.directoryExists(path);
          });
          ts2.performance.mark("afterIOWrite");
          ts2.performance.measure("I/O Write", "beforeIOWrite", "afterIOWrite");
        } catch (e) {
          if (onError) {
            onError(e.message);
          }
        }
      }
    }
    ts2.createCompilerHostFromProgramHost = createCompilerHostFromProgramHost;
    function setGetSourceFileAsHashVersioned(compilerHost, host) {
      var originalGetSourceFile = compilerHost.getSourceFile;
      var computeHash = ts2.maybeBind(host, host.createHash) || ts2.generateDjb2Hash;
      compilerHost.getSourceFile = function() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i];
        }
        var result = originalGetSourceFile.call.apply(originalGetSourceFile, __spreadArray([compilerHost], args, false));
        if (result) {
          result.version = computeHash(result.text);
        }
        return result;
      };
    }
    ts2.setGetSourceFileAsHashVersioned = setGetSourceFileAsHashVersioned;
    function createProgramHost(system, createProgram) {
      var getDefaultLibLocation = ts2.memoize(function() {
        return ts2.getDirectoryPath(ts2.normalizePath(system.getExecutingFilePath()));
      });
      return {
        useCaseSensitiveFileNames: function() {
          return system.useCaseSensitiveFileNames;
        },
        getNewLine: function() {
          return system.newLine;
        },
        getCurrentDirectory: ts2.memoize(function() {
          return system.getCurrentDirectory();
        }),
        getDefaultLibLocation,
        getDefaultLibFileName: function(options) {
          return ts2.combinePaths(getDefaultLibLocation(), ts2.getDefaultLibFileName(options));
        },
        fileExists: function(path) {
          return system.fileExists(path);
        },
        readFile: function(path, encoding) {
          return system.readFile(path, encoding);
        },
        directoryExists: function(path) {
          return system.directoryExists(path);
        },
        getDirectories: function(path) {
          return system.getDirectories(path);
        },
        readDirectory: function(path, extensions, exclude, include, depth) {
          return system.readDirectory(path, extensions, exclude, include, depth);
        },
        realpath: ts2.maybeBind(system, system.realpath),
        getEnvironmentVariable: ts2.maybeBind(system, system.getEnvironmentVariable),
        trace: function(s) {
          return system.write(s + system.newLine);
        },
        createDirectory: function(path) {
          return system.createDirectory(path);
        },
        writeFile: function(path, data, writeByteOrderMark) {
          return system.writeFile(path, data, writeByteOrderMark);
        },
        createHash: ts2.maybeBind(system, system.createHash),
        createProgram: createProgram || ts2.createEmitAndSemanticDiagnosticsBuilderProgram,
        disableUseFileVersionAsSignature: system.disableUseFileVersionAsSignature
      };
    }
    ts2.createProgramHost = createProgramHost;
    function createWatchCompilerHost(system, createProgram, reportDiagnostic, reportWatchStatus) {
      if (system === void 0) {
        system = ts2.sys;
      }
      var write = function(s) {
        return system.write(s + system.newLine);
      };
      var result = createProgramHost(system, createProgram);
      ts2.copyProperties(result, createWatchHost(system, reportWatchStatus));
      result.afterProgramCreate = function(builderProgram) {
        var compilerOptions = builderProgram.getCompilerOptions();
        var newLine = ts2.getNewLineCharacter(compilerOptions, function() {
          return system.newLine;
        });
        emitFilesAndReportErrors(builderProgram, reportDiagnostic, write, function(errorCount) {
          return result.onWatchStatusChange(ts2.createCompilerDiagnostic(getWatchErrorSummaryDiagnosticMessage(errorCount), errorCount), newLine, compilerOptions, errorCount);
        });
      };
      return result;
    }
    function reportUnrecoverableDiagnostic(system, reportDiagnostic, diagnostic) {
      reportDiagnostic(diagnostic);
      system.exit(ts2.ExitStatus.DiagnosticsPresent_OutputsSkipped);
    }
    function createWatchCompilerHostOfConfigFile(_a) {
      var configFileName = _a.configFileName, optionsToExtend = _a.optionsToExtend, watchOptionsToExtend = _a.watchOptionsToExtend, extraFileExtensions = _a.extraFileExtensions, system = _a.system, createProgram = _a.createProgram, reportDiagnostic = _a.reportDiagnostic, reportWatchStatus = _a.reportWatchStatus;
      var diagnosticReporter = reportDiagnostic || createDiagnosticReporter(system);
      var host = createWatchCompilerHost(system, createProgram, diagnosticReporter, reportWatchStatus);
      host.onUnRecoverableConfigFileDiagnostic = function(diagnostic) {
        return reportUnrecoverableDiagnostic(system, diagnosticReporter, diagnostic);
      };
      host.configFileName = configFileName;
      host.optionsToExtend = optionsToExtend;
      host.watchOptionsToExtend = watchOptionsToExtend;
      host.extraFileExtensions = extraFileExtensions;
      return host;
    }
    ts2.createWatchCompilerHostOfConfigFile = createWatchCompilerHostOfConfigFile;
    function createWatchCompilerHostOfFilesAndCompilerOptions(_a) {
      var rootFiles = _a.rootFiles, options = _a.options, watchOptions = _a.watchOptions, projectReferences = _a.projectReferences, system = _a.system, createProgram = _a.createProgram, reportDiagnostic = _a.reportDiagnostic, reportWatchStatus = _a.reportWatchStatus;
      var host = createWatchCompilerHost(system, createProgram, reportDiagnostic || createDiagnosticReporter(system), reportWatchStatus);
      host.rootFiles = rootFiles;
      host.options = options;
      host.watchOptions = watchOptions;
      host.projectReferences = projectReferences;
      return host;
    }
    ts2.createWatchCompilerHostOfFilesAndCompilerOptions = createWatchCompilerHostOfFilesAndCompilerOptions;
    function performIncrementalCompilation(input) {
      var system = input.system || ts2.sys;
      var host = input.host || (input.host = ts2.createIncrementalCompilerHost(input.options, system));
      var builderProgram = ts2.createIncrementalProgram(input);
      var exitStatus = emitFilesAndReportErrorsAndGetExitStatus(builderProgram, input.reportDiagnostic || createDiagnosticReporter(system), function(s) {
        return host.trace && host.trace(s);
      }, input.reportErrorSummary || input.options.pretty ? function(errorCount) {
        return system.write(getErrorSummaryText(errorCount, system.newLine));
      } : void 0);
      if (input.afterProgramEmitAndDiagnostics)
        input.afterProgramEmitAndDiagnostics(builderProgram);
      return exitStatus;
    }
    ts2.performIncrementalCompilation = performIncrementalCompilation;
  })(ts || (ts = {}));
  (function(ts2) {
    function readBuilderProgram(compilerOptions, host) {
      if (ts2.outFile(compilerOptions))
        return void 0;
      var buildInfoPath = ts2.getTsBuildInfoEmitOutputFilePath(compilerOptions);
      if (!buildInfoPath)
        return void 0;
      var content = host.readFile(buildInfoPath);
      if (!content)
        return void 0;
      var buildInfo = ts2.getBuildInfo(content);
      if (buildInfo.version !== ts2.version)
        return void 0;
      if (!buildInfo.program)
        return void 0;
      return ts2.createBuildProgramUsingProgramBuildInfo(buildInfo.program, buildInfoPath, host);
    }
    ts2.readBuilderProgram = readBuilderProgram;
    function createIncrementalCompilerHost(options, system) {
      if (system === void 0) {
        system = ts2.sys;
      }
      var host = ts2.createCompilerHostWorker(options, void 0, system);
      host.createHash = ts2.maybeBind(system, system.createHash);
      host.disableUseFileVersionAsSignature = system.disableUseFileVersionAsSignature;
      ts2.setGetSourceFileAsHashVersioned(host, system);
      ts2.changeCompilerHostLikeToUseCache(host, function(fileName) {
        return ts2.toPath(fileName, host.getCurrentDirectory(), host.getCanonicalFileName);
      });
      return host;
    }
    ts2.createIncrementalCompilerHost = createIncrementalCompilerHost;
    function createIncrementalProgram(_a) {
      var rootNames = _a.rootNames, options = _a.options, configFileParsingDiagnostics = _a.configFileParsingDiagnostics, projectReferences = _a.projectReferences, host = _a.host, createProgram = _a.createProgram;
      host = host || createIncrementalCompilerHost(options);
      createProgram = createProgram || ts2.createEmitAndSemanticDiagnosticsBuilderProgram;
      var oldProgram = readBuilderProgram(options, host);
      return createProgram(rootNames, options, host, oldProgram, configFileParsingDiagnostics, projectReferences);
    }
    ts2.createIncrementalProgram = createIncrementalProgram;
    function createWatchCompilerHost(rootFilesOrConfigFileName, options, system, createProgram, reportDiagnostic, reportWatchStatus, projectReferencesOrWatchOptionsToExtend, watchOptionsOrExtraFileExtensions) {
      if (ts2.isArray(rootFilesOrConfigFileName)) {
        return ts2.createWatchCompilerHostOfFilesAndCompilerOptions({
          rootFiles: rootFilesOrConfigFileName,
          options,
          watchOptions: watchOptionsOrExtraFileExtensions,
          projectReferences: projectReferencesOrWatchOptionsToExtend,
          system,
          createProgram,
          reportDiagnostic,
          reportWatchStatus
        });
      } else {
        return ts2.createWatchCompilerHostOfConfigFile({
          configFileName: rootFilesOrConfigFileName,
          optionsToExtend: options,
          watchOptionsToExtend: projectReferencesOrWatchOptionsToExtend,
          extraFileExtensions: watchOptionsOrExtraFileExtensions,
          system,
          createProgram,
          reportDiagnostic,
          reportWatchStatus
        });
      }
    }
    ts2.createWatchCompilerHost = createWatchCompilerHost;
    function createWatchProgram(host) {
      var builderProgram;
      var reloadLevel;
      var missingFilesMap;
      var packageJsonMap;
      var watchedWildcardDirectories;
      var timerToUpdateProgram;
      var timerToInvalidateFailedLookupResolutions;
      var parsedConfigs;
      var sharedExtendedConfigFileWatchers;
      var extendedConfigCache = host.extendedConfigCache;
      var changesAffectResolution = false;
      var sourceFilesCache = new ts2.Map();
      var missingFilePathsRequestedForRelease;
      var hasChangedCompilerOptions = false;
      var useCaseSensitiveFileNames = host.useCaseSensitiveFileNames();
      var currentDirectory = host.getCurrentDirectory();
      var configFileName = host.configFileName, _a = host.optionsToExtend, optionsToExtendForConfigFile = _a === void 0 ? {} : _a, watchOptionsToExtend = host.watchOptionsToExtend, extraFileExtensions = host.extraFileExtensions, createProgram = host.createProgram;
      var rootFileNames = host.rootFiles, compilerOptions = host.options, watchOptions = host.watchOptions, projectReferences = host.projectReferences;
      var wildcardDirectories;
      var configFileParsingDiagnostics;
      var canConfigFileJsonReportNoInputFiles = false;
      var hasChangedConfigFileParsingErrors = false;
      var cachedDirectoryStructureHost = configFileName === void 0 ? void 0 : ts2.createCachedDirectoryStructureHost(host, currentDirectory, useCaseSensitiveFileNames);
      var directoryStructureHost = cachedDirectoryStructureHost || host;
      var parseConfigFileHost = ts2.parseConfigHostFromCompilerHostLike(host, directoryStructureHost);
      var newLine = updateNewLine();
      if (configFileName && host.configFileParsingResult) {
        setConfigFileParsingResult(host.configFileParsingResult);
        newLine = updateNewLine();
      }
      reportWatchDiagnostic(ts2.Diagnostics.Starting_compilation_in_watch_mode);
      if (configFileName && !host.configFileParsingResult) {
        newLine = ts2.getNewLineCharacter(optionsToExtendForConfigFile, function() {
          return host.getNewLine();
        });
        ts2.Debug.assert(!rootFileNames);
        parseConfigFile();
        newLine = updateNewLine();
      }
      var _b = ts2.createWatchFactory(host, compilerOptions), watchFile = _b.watchFile, watchDirectory = _b.watchDirectory, writeLog = _b.writeLog;
      var getCanonicalFileName = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      writeLog("Current directory: ".concat(currentDirectory, " CaseSensitiveFileNames: ").concat(useCaseSensitiveFileNames));
      var configFileWatcher;
      if (configFileName) {
        configFileWatcher = watchFile(configFileName, scheduleProgramReload, ts2.PollingInterval.High, watchOptions, ts2.WatchType.ConfigFile);
      }
      var compilerHost = ts2.createCompilerHostFromProgramHost(host, function() {
        return compilerOptions;
      }, directoryStructureHost);
      ts2.setGetSourceFileAsHashVersioned(compilerHost, host);
      var getNewSourceFile = compilerHost.getSourceFile;
      compilerHost.getSourceFile = function(fileName) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
          args[_i - 1] = arguments[_i];
        }
        return getVersionedSourceFileByPath.apply(void 0, __spreadArray([fileName, toPath(fileName)], args, false));
      };
      compilerHost.getSourceFileByPath = getVersionedSourceFileByPath;
      compilerHost.getNewLine = function() {
        return newLine;
      };
      compilerHost.fileExists = fileExists;
      compilerHost.onReleaseOldSourceFile = onReleaseOldSourceFile;
      compilerHost.onReleaseParsedCommandLine = onReleaseParsedCommandLine;
      compilerHost.toPath = toPath;
      compilerHost.getCompilationSettings = function() {
        return compilerOptions;
      };
      compilerHost.useSourceOfProjectReferenceRedirect = ts2.maybeBind(host, host.useSourceOfProjectReferenceRedirect);
      compilerHost.watchDirectoryOfFailedLookupLocation = function(dir, cb, flags) {
        return watchDirectory(dir, cb, flags, watchOptions, ts2.WatchType.FailedLookupLocations);
      };
      compilerHost.watchTypeRootsDirectory = function(dir, cb, flags) {
        return watchDirectory(dir, cb, flags, watchOptions, ts2.WatchType.TypeRoots);
      };
      compilerHost.getCachedDirectoryStructureHost = function() {
        return cachedDirectoryStructureHost;
      };
      compilerHost.scheduleInvalidateResolutionsOfFailedLookupLocations = scheduleInvalidateResolutionsOfFailedLookupLocations;
      compilerHost.onInvalidatedResolution = scheduleProgramUpdate;
      compilerHost.onChangedAutomaticTypeDirectiveNames = scheduleProgramUpdate;
      compilerHost.fileIsOpen = ts2.returnFalse;
      compilerHost.getCurrentProgram = getCurrentProgram;
      compilerHost.writeLog = writeLog;
      compilerHost.getParsedCommandLine = getParsedCommandLine;
      var resolutionCache = ts2.createResolutionCache(compilerHost, configFileName ? ts2.getDirectoryPath(ts2.getNormalizedAbsolutePath(configFileName, currentDirectory)) : currentDirectory, false);
      compilerHost.resolveModuleNames = host.resolveModuleNames ? function() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i];
        }
        return host.resolveModuleNames.apply(host, args);
      } : function(moduleNames, containingFile, reusedNames, redirectedReference, _options, sourceFile) {
        return resolutionCache.resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference, sourceFile);
      };
      compilerHost.resolveTypeReferenceDirectives = host.resolveTypeReferenceDirectives ? function() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i];
        }
        return host.resolveTypeReferenceDirectives.apply(host, args);
      } : function(typeDirectiveNames, containingFile, redirectedReference) {
        return resolutionCache.resolveTypeReferenceDirectives(typeDirectiveNames, containingFile, redirectedReference);
      };
      var userProvidedResolution = !!host.resolveModuleNames || !!host.resolveTypeReferenceDirectives;
      builderProgram = readBuilderProgram(compilerOptions, compilerHost);
      synchronizeProgram();
      watchConfigFileWildCardDirectories();
      if (configFileName)
        updateExtendedConfigFilesWatches(toPath(configFileName), compilerOptions, watchOptions, ts2.WatchType.ExtendedConfigFile);
      return configFileName ? { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, close } : { getCurrentProgram: getCurrentBuilderProgram, getProgram: updateProgram, updateRootFileNames, close };
      function close() {
        clearInvalidateResolutionsOfFailedLookupLocations();
        resolutionCache.clear();
        ts2.clearMap(sourceFilesCache, function(value) {
          if (value && value.fileWatcher) {
            value.fileWatcher.close();
            value.fileWatcher = void 0;
          }
        });
        if (configFileWatcher) {
          configFileWatcher.close();
          configFileWatcher = void 0;
        }
        extendedConfigCache === null || extendedConfigCache === void 0 ? void 0 : extendedConfigCache.clear();
        extendedConfigCache = void 0;
        if (sharedExtendedConfigFileWatchers) {
          ts2.clearMap(sharedExtendedConfigFileWatchers, ts2.closeFileWatcherOf);
          sharedExtendedConfigFileWatchers = void 0;
        }
        if (watchedWildcardDirectories) {
          ts2.clearMap(watchedWildcardDirectories, ts2.closeFileWatcherOf);
          watchedWildcardDirectories = void 0;
        }
        if (missingFilesMap) {
          ts2.clearMap(missingFilesMap, ts2.closeFileWatcher);
          missingFilesMap = void 0;
        }
        if (parsedConfigs) {
          ts2.clearMap(parsedConfigs, function(config) {
            var _a2;
            (_a2 = config.watcher) === null || _a2 === void 0 ? void 0 : _a2.close();
            config.watcher = void 0;
            if (config.watchedDirectories)
              ts2.clearMap(config.watchedDirectories, ts2.closeFileWatcherOf);
            config.watchedDirectories = void 0;
          });
          parsedConfigs = void 0;
        }
        if (packageJsonMap) {
          ts2.clearMap(packageJsonMap, ts2.closeFileWatcher);
          packageJsonMap = void 0;
        }
      }
      function getCurrentBuilderProgram() {
        return builderProgram;
      }
      function getCurrentProgram() {
        return builderProgram && builderProgram.getProgramOrUndefined();
      }
      function synchronizeProgram() {
        writeLog("Synchronizing program");
        clearInvalidateResolutionsOfFailedLookupLocations();
        var program = getCurrentBuilderProgram();
        if (hasChangedCompilerOptions) {
          newLine = updateNewLine();
          if (program && (changesAffectResolution || ts2.changesAffectModuleResolution(program.getCompilerOptions(), compilerOptions))) {
            resolutionCache.clear();
          }
        }
        var hasInvalidatedResolution = resolutionCache.createHasInvalidatedResolution(userProvidedResolution || changesAffectResolution);
        if (ts2.isProgramUptoDate(getCurrentProgram(), rootFileNames, compilerOptions, getSourceVersion, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) {
          if (hasChangedConfigFileParsingErrors) {
            builderProgram = createProgram(void 0, void 0, compilerHost, builderProgram, configFileParsingDiagnostics, projectReferences);
            hasChangedConfigFileParsingErrors = false;
          }
        } else {
          createNewProgram(hasInvalidatedResolution);
        }
        changesAffectResolution = false;
        if (host.afterProgramCreate && program !== builderProgram) {
          host.afterProgramCreate(builderProgram);
        }
        return builderProgram;
      }
      function createNewProgram(hasInvalidatedResolution) {
        writeLog("CreatingProgramWith::");
        writeLog("  roots: ".concat(JSON.stringify(rootFileNames)));
        writeLog("  options: ".concat(JSON.stringify(compilerOptions)));
        if (projectReferences)
          writeLog("  projectReferences: ".concat(JSON.stringify(projectReferences)));
        var needsUpdateInTypeRootWatch = hasChangedCompilerOptions || !getCurrentProgram();
        hasChangedCompilerOptions = false;
        hasChangedConfigFileParsingErrors = false;
        resolutionCache.startCachingPerDirectoryResolution();
        compilerHost.hasInvalidatedResolution = hasInvalidatedResolution;
        compilerHost.hasChangedAutomaticTypeDirectiveNames = hasChangedAutomaticTypeDirectiveNames;
        builderProgram = createProgram(rootFileNames, compilerOptions, compilerHost, builderProgram, configFileParsingDiagnostics, projectReferences);
        var packageCacheEntries = ts2.map(resolutionCache.getModuleResolutionCache().getPackageJsonInfoCache().entries(), function(_a2) {
          var path = _a2[0], data = _a2[1];
          return [compilerHost.realpath ? toPath(compilerHost.realpath(path)) : path, data];
        });
        resolutionCache.finishCachingPerDirectoryResolution();
        ts2.updateMissingFilePathsWatch(builderProgram.getProgram(), missingFilesMap || (missingFilesMap = new ts2.Map()), watchMissingFilePath);
        ts2.updatePackageJsonWatch(packageCacheEntries, packageJsonMap || (packageJsonMap = new ts2.Map()), watchPackageJsonLookupPath);
        if (needsUpdateInTypeRootWatch) {
          resolutionCache.updateTypeRootsWatch();
        }
        if (missingFilePathsRequestedForRelease) {
          for (var _i = 0, missingFilePathsRequestedForRelease_1 = missingFilePathsRequestedForRelease; _i < missingFilePathsRequestedForRelease_1.length; _i++) {
            var missingFilePath = missingFilePathsRequestedForRelease_1[_i];
            if (!missingFilesMap.has(missingFilePath)) {
              sourceFilesCache.delete(missingFilePath);
            }
          }
          missingFilePathsRequestedForRelease = void 0;
        }
      }
      function updateRootFileNames(files) {
        ts2.Debug.assert(!configFileName, "Cannot update root file names with config file watch mode");
        rootFileNames = files;
        scheduleProgramUpdate();
      }
      function updateNewLine() {
        return ts2.getNewLineCharacter(compilerOptions || optionsToExtendForConfigFile, function() {
          return host.getNewLine();
        });
      }
      function toPath(fileName) {
        return ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
      }
      function isFileMissingOnHost(hostSourceFile) {
        return typeof hostSourceFile === "boolean";
      }
      function isFilePresenceUnknownOnHost(hostSourceFile) {
        return typeof hostSourceFile.version === "boolean";
      }
      function fileExists(fileName) {
        var path = toPath(fileName);
        if (isFileMissingOnHost(sourceFilesCache.get(path))) {
          return false;
        }
        return directoryStructureHost.fileExists(fileName);
      }
      function getVersionedSourceFileByPath(fileName, path, languageVersion, onError, shouldCreateNewSourceFile) {
        var hostSourceFile = sourceFilesCache.get(path);
        if (isFileMissingOnHost(hostSourceFile)) {
          return void 0;
        }
        if (hostSourceFile === void 0 || shouldCreateNewSourceFile || isFilePresenceUnknownOnHost(hostSourceFile)) {
          var sourceFile = getNewSourceFile(fileName, languageVersion, onError);
          if (hostSourceFile) {
            if (sourceFile) {
              hostSourceFile.sourceFile = sourceFile;
              hostSourceFile.version = sourceFile.version;
              if (!hostSourceFile.fileWatcher) {
                hostSourceFile.fileWatcher = watchFilePath(path, fileName, onSourceFileChange, ts2.PollingInterval.Low, watchOptions, ts2.WatchType.SourceFile);
              }
            } else {
              if (hostSourceFile.fileWatcher) {
                hostSourceFile.fileWatcher.close();
              }
              sourceFilesCache.set(path, false);
            }
          } else {
            if (sourceFile) {
              var fileWatcher = watchFilePath(path, fileName, onSourceFileChange, ts2.PollingInterval.Low, watchOptions, ts2.WatchType.SourceFile);
              sourceFilesCache.set(path, { sourceFile, version: sourceFile.version, fileWatcher });
            } else {
              sourceFilesCache.set(path, false);
            }
          }
          if (sourceFile) {
            sourceFile.impliedNodeFormat = ts2.getImpliedNodeFormatForFile(path, resolutionCache.getModuleResolutionCache().getPackageJsonInfoCache(), compilerHost, compilerHost.getCompilationSettings());
          }
          return sourceFile;
        }
        return hostSourceFile.sourceFile;
      }
      function nextSourceFileVersion(path) {
        var hostSourceFile = sourceFilesCache.get(path);
        if (hostSourceFile !== void 0) {
          if (isFileMissingOnHost(hostSourceFile)) {
            sourceFilesCache.set(path, { version: false });
          } else {
            hostSourceFile.version = false;
          }
        }
      }
      function getSourceVersion(path) {
        var hostSourceFile = sourceFilesCache.get(path);
        return !hostSourceFile || !hostSourceFile.version ? void 0 : hostSourceFile.version;
      }
      function onReleaseOldSourceFile(oldSourceFile, _oldOptions, hasSourceFileByPath) {
        var hostSourceFileInfo = sourceFilesCache.get(oldSourceFile.resolvedPath);
        if (hostSourceFileInfo !== void 0) {
          if (isFileMissingOnHost(hostSourceFileInfo)) {
            (missingFilePathsRequestedForRelease || (missingFilePathsRequestedForRelease = [])).push(oldSourceFile.path);
          } else if (hostSourceFileInfo.sourceFile === oldSourceFile) {
            if (hostSourceFileInfo.fileWatcher) {
              hostSourceFileInfo.fileWatcher.close();
            }
            sourceFilesCache.delete(oldSourceFile.resolvedPath);
            if (!hasSourceFileByPath) {
              resolutionCache.removeResolutionsOfFile(oldSourceFile.path);
            }
          }
        }
      }
      function reportWatchDiagnostic(message) {
        if (host.onWatchStatusChange) {
          host.onWatchStatusChange(ts2.createCompilerDiagnostic(message), newLine, compilerOptions || optionsToExtendForConfigFile);
        }
      }
      function hasChangedAutomaticTypeDirectiveNames() {
        return resolutionCache.hasChangedAutomaticTypeDirectiveNames();
      }
      function clearInvalidateResolutionsOfFailedLookupLocations() {
        if (!timerToInvalidateFailedLookupResolutions)
          return false;
        host.clearTimeout(timerToInvalidateFailedLookupResolutions);
        timerToInvalidateFailedLookupResolutions = void 0;
        return true;
      }
      function scheduleInvalidateResolutionsOfFailedLookupLocations() {
        if (!host.setTimeout || !host.clearTimeout) {
          return resolutionCache.invalidateResolutionsOfFailedLookupLocations();
        }
        var pending = clearInvalidateResolutionsOfFailedLookupLocations();
        writeLog("Scheduling invalidateFailedLookup".concat(pending ? ", Cancelled earlier one" : ""));
        timerToInvalidateFailedLookupResolutions = host.setTimeout(invalidateResolutionsOfFailedLookup, 250);
      }
      function invalidateResolutionsOfFailedLookup() {
        timerToInvalidateFailedLookupResolutions = void 0;
        if (resolutionCache.invalidateResolutionsOfFailedLookupLocations()) {
          scheduleProgramUpdate();
        }
      }
      function scheduleProgramUpdate() {
        if (!host.setTimeout || !host.clearTimeout) {
          return;
        }
        if (timerToUpdateProgram) {
          host.clearTimeout(timerToUpdateProgram);
        }
        writeLog("Scheduling update");
        timerToUpdateProgram = host.setTimeout(updateProgramWithWatchStatus, 250);
      }
      function scheduleProgramReload() {
        ts2.Debug.assert(!!configFileName);
        reloadLevel = ts2.ConfigFileProgramReloadLevel.Full;
        scheduleProgramUpdate();
      }
      function updateProgramWithWatchStatus() {
        timerToUpdateProgram = void 0;
        reportWatchDiagnostic(ts2.Diagnostics.File_change_detected_Starting_incremental_compilation);
        updateProgram();
      }
      function updateProgram() {
        switch (reloadLevel) {
          case ts2.ConfigFileProgramReloadLevel.Partial:
            ts2.perfLogger.logStartUpdateProgram("PartialConfigReload");
            reloadFileNamesFromConfigFile();
            break;
          case ts2.ConfigFileProgramReloadLevel.Full:
            ts2.perfLogger.logStartUpdateProgram("FullConfigReload");
            reloadConfigFile();
            break;
          default:
            ts2.perfLogger.logStartUpdateProgram("SynchronizeProgram");
            synchronizeProgram();
            break;
        }
        ts2.perfLogger.logStopUpdateProgram("Done");
        return getCurrentBuilderProgram();
      }
      function reloadFileNamesFromConfigFile() {
        writeLog("Reloading new file names and options");
        rootFileNames = ts2.getFileNamesFromConfigSpecs(compilerOptions.configFile.configFileSpecs, ts2.getNormalizedAbsolutePath(ts2.getDirectoryPath(configFileName), currentDirectory), compilerOptions, parseConfigFileHost, extraFileExtensions);
        if (ts2.updateErrorForNoInputFiles(rootFileNames, ts2.getNormalizedAbsolutePath(configFileName, currentDirectory), compilerOptions.configFile.configFileSpecs, configFileParsingDiagnostics, canConfigFileJsonReportNoInputFiles)) {
          hasChangedConfigFileParsingErrors = true;
        }
        synchronizeProgram();
      }
      function reloadConfigFile() {
        writeLog("Reloading config file: ".concat(configFileName));
        reloadLevel = ts2.ConfigFileProgramReloadLevel.None;
        if (cachedDirectoryStructureHost) {
          cachedDirectoryStructureHost.clearCache();
        }
        parseConfigFile();
        hasChangedCompilerOptions = true;
        synchronizeProgram();
        watchConfigFileWildCardDirectories();
        updateExtendedConfigFilesWatches(toPath(configFileName), compilerOptions, watchOptions, ts2.WatchType.ExtendedConfigFile);
      }
      function parseConfigFile() {
        setConfigFileParsingResult(ts2.getParsedCommandLineOfConfigFile(configFileName, optionsToExtendForConfigFile, parseConfigFileHost, extendedConfigCache || (extendedConfigCache = new ts2.Map()), watchOptionsToExtend, extraFileExtensions));
      }
      function setConfigFileParsingResult(configFileParseResult) {
        rootFileNames = configFileParseResult.fileNames;
        compilerOptions = configFileParseResult.options;
        watchOptions = configFileParseResult.watchOptions;
        projectReferences = configFileParseResult.projectReferences;
        wildcardDirectories = configFileParseResult.wildcardDirectories;
        configFileParsingDiagnostics = ts2.getConfigFileParsingDiagnostics(configFileParseResult).slice();
        canConfigFileJsonReportNoInputFiles = ts2.canJsonReportNoInputFiles(configFileParseResult.raw);
        hasChangedConfigFileParsingErrors = true;
      }
      function getParsedCommandLine(configFileName2) {
        var configPath = toPath(configFileName2);
        var config = parsedConfigs === null || parsedConfigs === void 0 ? void 0 : parsedConfigs.get(configPath);
        if (config) {
          if (!config.reloadLevel)
            return config.parsedCommandLine;
          if (config.parsedCommandLine && config.reloadLevel === ts2.ConfigFileProgramReloadLevel.Partial && !host.getParsedCommandLine) {
            writeLog("Reloading new file names and options");
            var fileNames = ts2.getFileNamesFromConfigSpecs(config.parsedCommandLine.options.configFile.configFileSpecs, ts2.getNormalizedAbsolutePath(ts2.getDirectoryPath(configFileName2), currentDirectory), compilerOptions, parseConfigFileHost);
            config.parsedCommandLine = __assign(__assign({}, config.parsedCommandLine), { fileNames });
            config.reloadLevel = void 0;
            return config.parsedCommandLine;
          }
        }
        writeLog("Loading config file: ".concat(configFileName2));
        var parsedCommandLine = host.getParsedCommandLine ? host.getParsedCommandLine(configFileName2) : getParsedCommandLineFromConfigFileHost(configFileName2);
        if (config) {
          config.parsedCommandLine = parsedCommandLine;
          config.reloadLevel = void 0;
        } else {
          (parsedConfigs || (parsedConfigs = new ts2.Map())).set(configPath, config = { parsedCommandLine });
        }
        watchReferencedProject(configFileName2, configPath, config);
        return parsedCommandLine;
      }
      function getParsedCommandLineFromConfigFileHost(configFileName2) {
        var onUnRecoverableConfigFileDiagnostic = parseConfigFileHost.onUnRecoverableConfigFileDiagnostic;
        parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = ts2.noop;
        var parsedCommandLine = ts2.getParsedCommandLineOfConfigFile(configFileName2, void 0, parseConfigFileHost, extendedConfigCache || (extendedConfigCache = new ts2.Map()), watchOptionsToExtend);
        parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = onUnRecoverableConfigFileDiagnostic;
        return parsedCommandLine;
      }
      function onReleaseParsedCommandLine(fileName) {
        var _a2;
        var path = toPath(fileName);
        var config = parsedConfigs === null || parsedConfigs === void 0 ? void 0 : parsedConfigs.get(path);
        if (!config)
          return;
        parsedConfigs.delete(path);
        if (config.watchedDirectories)
          ts2.clearMap(config.watchedDirectories, ts2.closeFileWatcherOf);
        (_a2 = config.watcher) === null || _a2 === void 0 ? void 0 : _a2.close();
        ts2.clearSharedExtendedConfigFileWatcher(path, sharedExtendedConfigFileWatchers);
      }
      function watchFilePath(path, file, callback, pollingInterval, options, watchType) {
        return watchFile(file, function(fileName, eventKind) {
          return callback(fileName, eventKind, path);
        }, pollingInterval, options, watchType);
      }
      function onSourceFileChange(fileName, eventKind, path) {
        updateCachedSystemWithFile(fileName, path, eventKind);
        if (eventKind === ts2.FileWatcherEventKind.Deleted && sourceFilesCache.has(path)) {
          resolutionCache.invalidateResolutionOfFile(path);
        }
        nextSourceFileVersion(path);
        scheduleProgramUpdate();
      }
      function updateCachedSystemWithFile(fileName, path, eventKind) {
        if (cachedDirectoryStructureHost) {
          cachedDirectoryStructureHost.addOrDeleteFile(fileName, path, eventKind);
        }
      }
      function watchMissingFilePath(missingFilePath) {
        return (parsedConfigs === null || parsedConfigs === void 0 ? void 0 : parsedConfigs.has(missingFilePath)) ? ts2.noopFileWatcher : watchFilePath(missingFilePath, missingFilePath, onMissingFileChange, ts2.PollingInterval.Medium, watchOptions, ts2.WatchType.MissingFile);
      }
      function watchPackageJsonLookupPath(packageJsonPath) {
        return sourceFilesCache.has(packageJsonPath) ? ts2.noopFileWatcher : watchFilePath(packageJsonPath, packageJsonPath, onPackageJsonChange, ts2.PollingInterval.High, watchOptions, ts2.WatchType.PackageJson);
      }
      function onPackageJsonChange(fileName, eventKind, path) {
        updateCachedSystemWithFile(fileName, path, eventKind);
        reloadLevel = ts2.ConfigFileProgramReloadLevel.Full;
        changesAffectResolution = true;
        scheduleProgramUpdate();
      }
      function onMissingFileChange(fileName, eventKind, missingFilePath) {
        updateCachedSystemWithFile(fileName, missingFilePath, eventKind);
        if (eventKind === ts2.FileWatcherEventKind.Created && missingFilesMap.has(missingFilePath)) {
          missingFilesMap.get(missingFilePath).close();
          missingFilesMap.delete(missingFilePath);
          nextSourceFileVersion(missingFilePath);
          scheduleProgramUpdate();
        }
      }
      function watchConfigFileWildCardDirectories() {
        if (wildcardDirectories) {
          ts2.updateWatchingWildcardDirectories(watchedWildcardDirectories || (watchedWildcardDirectories = new ts2.Map()), new ts2.Map(ts2.getEntries(wildcardDirectories)), watchWildcardDirectory);
        } else if (watchedWildcardDirectories) {
          ts2.clearMap(watchedWildcardDirectories, ts2.closeFileWatcherOf);
        }
      }
      function watchWildcardDirectory(directory, flags) {
        return watchDirectory(directory, function(fileOrDirectory) {
          ts2.Debug.assert(!!configFileName);
          var fileOrDirectoryPath = toPath(fileOrDirectory);
          if (cachedDirectoryStructureHost) {
            cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
          }
          nextSourceFileVersion(fileOrDirectoryPath);
          if (ts2.isIgnoredFileFromWildCardWatching({
            watchedDirPath: toPath(directory),
            fileOrDirectory,
            fileOrDirectoryPath,
            configFileName,
            extraFileExtensions,
            options: compilerOptions,
            program: getCurrentBuilderProgram() || rootFileNames,
            currentDirectory,
            useCaseSensitiveFileNames,
            writeLog,
            toPath
          }))
            return;
          if (reloadLevel !== ts2.ConfigFileProgramReloadLevel.Full) {
            reloadLevel = ts2.ConfigFileProgramReloadLevel.Partial;
            scheduleProgramUpdate();
          }
        }, flags, watchOptions, ts2.WatchType.WildcardDirectory);
      }
      function updateExtendedConfigFilesWatches(forProjectPath, options, watchOptions2, watchType) {
        ts2.updateSharedExtendedConfigFileWatcher(forProjectPath, options, sharedExtendedConfigFileWatchers || (sharedExtendedConfigFileWatchers = new ts2.Map()), function(extendedConfigFileName, extendedConfigFilePath) {
          return watchFile(extendedConfigFileName, function(_fileName, eventKind) {
            var _a2;
            updateCachedSystemWithFile(extendedConfigFileName, extendedConfigFilePath, eventKind);
            if (extendedConfigCache)
              ts2.cleanExtendedConfigCache(extendedConfigCache, extendedConfigFilePath, toPath);
            var projects = (_a2 = sharedExtendedConfigFileWatchers.get(extendedConfigFilePath)) === null || _a2 === void 0 ? void 0 : _a2.projects;
            if (!(projects === null || projects === void 0 ? void 0 : projects.size))
              return;
            projects.forEach(function(projectPath) {
              if (toPath(configFileName) === projectPath) {
                reloadLevel = ts2.ConfigFileProgramReloadLevel.Full;
              } else {
                var config = parsedConfigs === null || parsedConfigs === void 0 ? void 0 : parsedConfigs.get(projectPath);
                if (config)
                  config.reloadLevel = ts2.ConfigFileProgramReloadLevel.Full;
                resolutionCache.removeResolutionsFromProjectReferenceRedirects(projectPath);
              }
              scheduleProgramUpdate();
            });
          }, ts2.PollingInterval.High, watchOptions2, watchType);
        }, toPath);
      }
      function watchReferencedProject(configFileName2, configPath, commandLine) {
        var _a2, _b2, _c, _d, _e;
        commandLine.watcher || (commandLine.watcher = watchFile(configFileName2, function(_fileName, eventKind) {
          updateCachedSystemWithFile(configFileName2, configPath, eventKind);
          var config = parsedConfigs === null || parsedConfigs === void 0 ? void 0 : parsedConfigs.get(configPath);
          if (config)
            config.reloadLevel = ts2.ConfigFileProgramReloadLevel.Full;
          resolutionCache.removeResolutionsFromProjectReferenceRedirects(configPath);
          scheduleProgramUpdate();
        }, ts2.PollingInterval.High, ((_a2 = commandLine.parsedCommandLine) === null || _a2 === void 0 ? void 0 : _a2.watchOptions) || watchOptions, ts2.WatchType.ConfigFileOfReferencedProject));
        if ((_b2 = commandLine.parsedCommandLine) === null || _b2 === void 0 ? void 0 : _b2.wildcardDirectories) {
          ts2.updateWatchingWildcardDirectories(commandLine.watchedDirectories || (commandLine.watchedDirectories = new ts2.Map()), new ts2.Map(ts2.getEntries((_c = commandLine.parsedCommandLine) === null || _c === void 0 ? void 0 : _c.wildcardDirectories)), function(directory, flags) {
            var _a3;
            return watchDirectory(directory, function(fileOrDirectory) {
              var fileOrDirectoryPath = toPath(fileOrDirectory);
              if (cachedDirectoryStructureHost) {
                cachedDirectoryStructureHost.addOrDeleteFileOrDirectory(fileOrDirectory, fileOrDirectoryPath);
              }
              nextSourceFileVersion(fileOrDirectoryPath);
              var config = parsedConfigs === null || parsedConfigs === void 0 ? void 0 : parsedConfigs.get(configPath);
              if (!(config === null || config === void 0 ? void 0 : config.parsedCommandLine))
                return;
              if (ts2.isIgnoredFileFromWildCardWatching({
                watchedDirPath: toPath(directory),
                fileOrDirectory,
                fileOrDirectoryPath,
                configFileName: configFileName2,
                options: config.parsedCommandLine.options,
                program: config.parsedCommandLine.fileNames,
                currentDirectory,
                useCaseSensitiveFileNames,
                writeLog,
                toPath
              }))
                return;
              if (config.reloadLevel !== ts2.ConfigFileProgramReloadLevel.Full) {
                config.reloadLevel = ts2.ConfigFileProgramReloadLevel.Partial;
                scheduleProgramUpdate();
              }
            }, flags, ((_a3 = commandLine.parsedCommandLine) === null || _a3 === void 0 ? void 0 : _a3.watchOptions) || watchOptions, ts2.WatchType.WildcardDirectoryOfReferencedProject);
          });
        } else if (commandLine.watchedDirectories) {
          ts2.clearMap(commandLine.watchedDirectories, ts2.closeFileWatcherOf);
          commandLine.watchedDirectories = void 0;
        }
        updateExtendedConfigFilesWatches(configPath, (_d = commandLine.parsedCommandLine) === null || _d === void 0 ? void 0 : _d.options, ((_e = commandLine.parsedCommandLine) === null || _e === void 0 ? void 0 : _e.watchOptions) || watchOptions, ts2.WatchType.ExtendedConfigOfReferencedProject);
      }
    }
    ts2.createWatchProgram = createWatchProgram;
  })(ts || (ts = {}));
  (function(ts2) {
    var UpToDateStatusType;
    (function(UpToDateStatusType2) {
      UpToDateStatusType2[UpToDateStatusType2["Unbuildable"] = 0] = "Unbuildable";
      UpToDateStatusType2[UpToDateStatusType2["UpToDate"] = 1] = "UpToDate";
      UpToDateStatusType2[UpToDateStatusType2["UpToDateWithUpstreamTypes"] = 2] = "UpToDateWithUpstreamTypes";
      UpToDateStatusType2[UpToDateStatusType2["OutOfDateWithPrepend"] = 3] = "OutOfDateWithPrepend";
      UpToDateStatusType2[UpToDateStatusType2["OutputMissing"] = 4] = "OutputMissing";
      UpToDateStatusType2[UpToDateStatusType2["OutOfDateWithSelf"] = 5] = "OutOfDateWithSelf";
      UpToDateStatusType2[UpToDateStatusType2["OutOfDateWithUpstream"] = 6] = "OutOfDateWithUpstream";
      UpToDateStatusType2[UpToDateStatusType2["UpstreamOutOfDate"] = 7] = "UpstreamOutOfDate";
      UpToDateStatusType2[UpToDateStatusType2["UpstreamBlocked"] = 8] = "UpstreamBlocked";
      UpToDateStatusType2[UpToDateStatusType2["ComputingUpstream"] = 9] = "ComputingUpstream";
      UpToDateStatusType2[UpToDateStatusType2["TsVersionOutputOfDate"] = 10] = "TsVersionOutputOfDate";
      UpToDateStatusType2[UpToDateStatusType2["ContainerOnly"] = 11] = "ContainerOnly";
    })(UpToDateStatusType = ts2.UpToDateStatusType || (ts2.UpToDateStatusType = {}));
    function resolveConfigFileProjectName(project) {
      if (ts2.fileExtensionIs(project, ".json")) {
        return project;
      }
      return ts2.combinePaths(project, "tsconfig.json");
    }
    ts2.resolveConfigFileProjectName = resolveConfigFileProjectName;
  })(ts || (ts = {}));
  (function(ts2) {
    var minimumDate = new Date(-864e13);
    var maximumDate = new Date(864e13);
    var BuildResultFlags;
    (function(BuildResultFlags2) {
      BuildResultFlags2[BuildResultFlags2["None"] = 0] = "None";
      BuildResultFlags2[BuildResultFlags2["Success"] = 1] = "Success";
      BuildResultFlags2[BuildResultFlags2["DeclarationOutputUnchanged"] = 2] = "DeclarationOutputUnchanged";
      BuildResultFlags2[BuildResultFlags2["ConfigFileErrors"] = 4] = "ConfigFileErrors";
      BuildResultFlags2[BuildResultFlags2["SyntaxErrors"] = 8] = "SyntaxErrors";
      BuildResultFlags2[BuildResultFlags2["TypeErrors"] = 16] = "TypeErrors";
      BuildResultFlags2[BuildResultFlags2["DeclarationEmitErrors"] = 32] = "DeclarationEmitErrors";
      BuildResultFlags2[BuildResultFlags2["EmitErrors"] = 64] = "EmitErrors";
      BuildResultFlags2[BuildResultFlags2["AnyErrors"] = 124] = "AnyErrors";
    })(BuildResultFlags || (BuildResultFlags = {}));
    function getOrCreateValueFromConfigFileMap(configFileMap, resolved, createT) {
      var existingValue = configFileMap.get(resolved);
      var newValue;
      if (!existingValue) {
        newValue = createT();
        configFileMap.set(resolved, newValue);
      }
      return existingValue || newValue;
    }
    function getOrCreateValueMapFromConfigFileMap(configFileMap, resolved) {
      return getOrCreateValueFromConfigFileMap(configFileMap, resolved, function() {
        return new ts2.Map();
      });
    }
    function newer(date1, date2) {
      return date2 > date1 ? date2 : date1;
    }
    function isDeclarationFile(fileName) {
      return ts2.fileExtensionIs(fileName, ".d.ts");
    }
    function isCircularBuildOrder(buildOrder) {
      return !!buildOrder && !!buildOrder.buildOrder;
    }
    ts2.isCircularBuildOrder = isCircularBuildOrder;
    function getBuildOrderFromAnyBuildOrder(anyBuildOrder) {
      return isCircularBuildOrder(anyBuildOrder) ? anyBuildOrder.buildOrder : anyBuildOrder;
    }
    ts2.getBuildOrderFromAnyBuildOrder = getBuildOrderFromAnyBuildOrder;
    function createBuilderStatusReporter(system, pretty) {
      return function(diagnostic) {
        var output = pretty ? "[".concat(ts2.formatColorAndReset(ts2.getLocaleTimeString(system), ts2.ForegroundColorEscapeSequences.Grey), "] ") : "".concat(ts2.getLocaleTimeString(system), " - ");
        output += "".concat(ts2.flattenDiagnosticMessageText(diagnostic.messageText, system.newLine)).concat(system.newLine + system.newLine);
        system.write(output);
      };
    }
    ts2.createBuilderStatusReporter = createBuilderStatusReporter;
    function createSolutionBuilderHostBase(system, createProgram, reportDiagnostic, reportSolutionBuilderStatus) {
      var host = ts2.createProgramHost(system, createProgram);
      host.getModifiedTime = system.getModifiedTime ? function(path) {
        return system.getModifiedTime(path);
      } : ts2.returnUndefined;
      host.setModifiedTime = system.setModifiedTime ? function(path, date) {
        return system.setModifiedTime(path, date);
      } : ts2.noop;
      host.deleteFile = system.deleteFile ? function(path) {
        return system.deleteFile(path);
      } : ts2.noop;
      host.reportDiagnostic = reportDiagnostic || ts2.createDiagnosticReporter(system);
      host.reportSolutionBuilderStatus = reportSolutionBuilderStatus || createBuilderStatusReporter(system);
      host.now = ts2.maybeBind(system, system.now);
      return host;
    }
    function createSolutionBuilderHost(system, createProgram, reportDiagnostic, reportSolutionBuilderStatus, reportErrorSummary2) {
      if (system === void 0) {
        system = ts2.sys;
      }
      var host = createSolutionBuilderHostBase(system, createProgram, reportDiagnostic, reportSolutionBuilderStatus);
      host.reportErrorSummary = reportErrorSummary2;
      return host;
    }
    ts2.createSolutionBuilderHost = createSolutionBuilderHost;
    function createSolutionBuilderWithWatchHost(system, createProgram, reportDiagnostic, reportSolutionBuilderStatus, reportWatchStatus2) {
      if (system === void 0) {
        system = ts2.sys;
      }
      var host = createSolutionBuilderHostBase(system, createProgram, reportDiagnostic, reportSolutionBuilderStatus);
      var watchHost = ts2.createWatchHost(system, reportWatchStatus2);
      ts2.copyProperties(host, watchHost);
      return host;
    }
    ts2.createSolutionBuilderWithWatchHost = createSolutionBuilderWithWatchHost;
    function getCompilerOptionsOfBuildOptions(buildOptions) {
      var result = {};
      ts2.commonOptionsWithBuild.forEach(function(option) {
        if (ts2.hasProperty(buildOptions, option.name))
          result[option.name] = buildOptions[option.name];
      });
      return result;
    }
    function createSolutionBuilder(host, rootNames, defaultOptions) {
      return createSolutionBuilderWorker(false, host, rootNames, defaultOptions);
    }
    ts2.createSolutionBuilder = createSolutionBuilder;
    function createSolutionBuilderWithWatch(host, rootNames, defaultOptions, baseWatchOptions) {
      return createSolutionBuilderWorker(true, host, rootNames, defaultOptions, baseWatchOptions);
    }
    ts2.createSolutionBuilderWithWatch = createSolutionBuilderWithWatch;
    function createSolutionBuilderState(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions) {
      var host = hostOrHostWithWatch;
      var hostWithWatch = hostOrHostWithWatch;
      var currentDirectory = host.getCurrentDirectory();
      var getCanonicalFileName = ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames());
      var baseCompilerOptions = getCompilerOptionsOfBuildOptions(options);
      var compilerHost = ts2.createCompilerHostFromProgramHost(host, function() {
        return state.projectCompilerOptions;
      });
      ts2.setGetSourceFileAsHashVersioned(compilerHost, host);
      compilerHost.getParsedCommandLine = function(fileName) {
        return parseConfigFile(state, fileName, toResolvedConfigFilePath(state, fileName));
      };
      compilerHost.resolveModuleNames = ts2.maybeBind(host, host.resolveModuleNames);
      compilerHost.resolveTypeReferenceDirectives = ts2.maybeBind(host, host.resolveTypeReferenceDirectives);
      var moduleResolutionCache = !compilerHost.resolveModuleNames ? ts2.createModuleResolutionCache(currentDirectory, getCanonicalFileName) : void 0;
      var typeReferenceDirectiveResolutionCache = !compilerHost.resolveTypeReferenceDirectives ? ts2.createTypeReferenceDirectiveResolutionCache(currentDirectory, getCanonicalFileName, void 0, moduleResolutionCache === null || moduleResolutionCache === void 0 ? void 0 : moduleResolutionCache.getPackageJsonInfoCache()) : void 0;
      if (!compilerHost.resolveModuleNames) {
        var loader_3 = function(moduleName, resolverMode, containingFile, redirectedReference) {
          return ts2.resolveModuleName(moduleName, containingFile, state.projectCompilerOptions, compilerHost, moduleResolutionCache, redirectedReference, resolverMode).resolvedModule;
        };
        compilerHost.resolveModuleNames = function(moduleNames, containingFile, _reusedNames, redirectedReference, _options, containingSourceFile) {
          return ts2.loadWithModeAwareCache(ts2.Debug.checkEachDefined(moduleNames), ts2.Debug.checkDefined(containingSourceFile), containingFile, redirectedReference, loader_3);
        };
        compilerHost.getModuleResolutionCache = function() {
          return moduleResolutionCache;
        };
      }
      if (!compilerHost.resolveTypeReferenceDirectives) {
        var loader_4 = function(moduleName, containingFile, redirectedReference) {
          return ts2.resolveTypeReferenceDirective(moduleName, containingFile, state.projectCompilerOptions, compilerHost, redirectedReference, state.typeReferenceDirectiveResolutionCache).resolvedTypeReferenceDirective;
        };
        compilerHost.resolveTypeReferenceDirectives = function(typeReferenceDirectiveNames, containingFile, redirectedReference) {
          return ts2.loadWithLocalCache(ts2.Debug.checkEachDefined(typeReferenceDirectiveNames), containingFile, redirectedReference, loader_4);
        };
      }
      var _a = ts2.createWatchFactory(hostWithWatch, options), watchFile = _a.watchFile, watchDirectory = _a.watchDirectory, writeLog = _a.writeLog;
      var state = {
        host,
        hostWithWatch,
        currentDirectory,
        getCanonicalFileName,
        parseConfigFileHost: ts2.parseConfigHostFromCompilerHostLike(host),
        write: ts2.maybeBind(host, host.trace),
        options,
        baseCompilerOptions,
        rootNames,
        baseWatchOptions,
        resolvedConfigFilePaths: new ts2.Map(),
        configFileCache: new ts2.Map(),
        projectStatus: new ts2.Map(),
        buildInfoChecked: new ts2.Map(),
        extendedConfigCache: new ts2.Map(),
        builderPrograms: new ts2.Map(),
        diagnostics: new ts2.Map(),
        projectPendingBuild: new ts2.Map(),
        projectErrorsReported: new ts2.Map(),
        compilerHost,
        moduleResolutionCache,
        typeReferenceDirectiveResolutionCache,
        buildOrder: void 0,
        readFileWithCache: function(f) {
          return host.readFile(f);
        },
        projectCompilerOptions: baseCompilerOptions,
        cache: void 0,
        allProjectBuildPending: true,
        needsSummary: true,
        watchAllProjectsPending: watch,
        currentInvalidatedProject: void 0,
        watch,
        allWatchedWildcardDirectories: new ts2.Map(),
        allWatchedInputFiles: new ts2.Map(),
        allWatchedConfigFiles: new ts2.Map(),
        allWatchedExtendedConfigFiles: new ts2.Map(),
        allWatchedPackageJsonFiles: new ts2.Map(),
        lastCachedPackageJsonLookups: new ts2.Map(),
        timerToBuildInvalidatedProject: void 0,
        reportFileChangeDetected: false,
        watchFile,
        watchDirectory,
        writeLog
      };
      return state;
    }
    function toPath(state, fileName) {
      return ts2.toPath(fileName, state.currentDirectory, state.getCanonicalFileName);
    }
    function toResolvedConfigFilePath(state, fileName) {
      var resolvedConfigFilePaths = state.resolvedConfigFilePaths;
      var path = resolvedConfigFilePaths.get(fileName);
      if (path !== void 0)
        return path;
      var resolvedPath = toPath(state, fileName);
      resolvedConfigFilePaths.set(fileName, resolvedPath);
      return resolvedPath;
    }
    function isParsedCommandLine(entry) {
      return !!entry.options;
    }
    function getCachedParsedConfigFile(state, configFilePath) {
      var value = state.configFileCache.get(configFilePath);
      return value && isParsedCommandLine(value) ? value : void 0;
    }
    function parseConfigFile(state, configFileName, configFilePath) {
      var configFileCache = state.configFileCache;
      var value = configFileCache.get(configFilePath);
      if (value) {
        return isParsedCommandLine(value) ? value : void 0;
      }
      var diagnostic;
      var parseConfigFileHost = state.parseConfigFileHost, baseCompilerOptions = state.baseCompilerOptions, baseWatchOptions = state.baseWatchOptions, extendedConfigCache = state.extendedConfigCache, host = state.host;
      var parsed;
      if (host.getParsedCommandLine) {
        parsed = host.getParsedCommandLine(configFileName);
        if (!parsed)
          diagnostic = ts2.createCompilerDiagnostic(ts2.Diagnostics.File_0_not_found, configFileName);
      } else {
        parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = function(d) {
          return diagnostic = d;
        };
        parsed = ts2.getParsedCommandLineOfConfigFile(configFileName, baseCompilerOptions, parseConfigFileHost, extendedConfigCache, baseWatchOptions);
        parseConfigFileHost.onUnRecoverableConfigFileDiagnostic = ts2.noop;
      }
      configFileCache.set(configFilePath, parsed || diagnostic);
      return parsed;
    }
    function resolveProjectName(state, name) {
      return ts2.resolveConfigFileProjectName(ts2.resolvePath(state.currentDirectory, name));
    }
    function createBuildOrder(state, roots) {
      var temporaryMarks = new ts2.Map();
      var permanentMarks = new ts2.Map();
      var circularityReportStack = [];
      var buildOrder;
      var circularDiagnostics;
      for (var _i = 0, roots_1 = roots; _i < roots_1.length; _i++) {
        var root = roots_1[_i];
        visit(root);
      }
      return circularDiagnostics ? { buildOrder: buildOrder || ts2.emptyArray, circularDiagnostics } : buildOrder || ts2.emptyArray;
      function visit(configFileName, inCircularContext) {
        var projPath = toResolvedConfigFilePath(state, configFileName);
        if (permanentMarks.has(projPath))
          return;
        if (temporaryMarks.has(projPath)) {
          if (!inCircularContext) {
            (circularDiagnostics || (circularDiagnostics = [])).push(ts2.createCompilerDiagnostic(ts2.Diagnostics.Project_references_may_not_form_a_circular_graph_Cycle_detected_Colon_0, circularityReportStack.join("\r\n")));
          }
          return;
        }
        temporaryMarks.set(projPath, true);
        circularityReportStack.push(configFileName);
        var parsed = parseConfigFile(state, configFileName, projPath);
        if (parsed && parsed.projectReferences) {
          for (var _i2 = 0, _a = parsed.projectReferences; _i2 < _a.length; _i2++) {
            var ref = _a[_i2];
            var resolvedRefPath = resolveProjectName(state, ref.path);
            visit(resolvedRefPath, inCircularContext || ref.circular);
          }
        }
        circularityReportStack.pop();
        permanentMarks.set(projPath, true);
        (buildOrder || (buildOrder = [])).push(configFileName);
      }
    }
    function getBuildOrder(state) {
      return state.buildOrder || createStateBuildOrder(state);
    }
    function createStateBuildOrder(state) {
      var buildOrder = createBuildOrder(state, state.rootNames.map(function(f) {
        return resolveProjectName(state, f);
      }));
      state.resolvedConfigFilePaths.clear();
      var currentProjects = new ts2.Map(getBuildOrderFromAnyBuildOrder(buildOrder).map(function(resolved) {
        return [toResolvedConfigFilePath(state, resolved), true];
      }));
      var noopOnDelete = { onDeleteValue: ts2.noop };
      ts2.mutateMapSkippingNewValues(state.configFileCache, currentProjects, noopOnDelete);
      ts2.mutateMapSkippingNewValues(state.projectStatus, currentProjects, noopOnDelete);
      ts2.mutateMapSkippingNewValues(state.buildInfoChecked, currentProjects, noopOnDelete);
      ts2.mutateMapSkippingNewValues(state.builderPrograms, currentProjects, noopOnDelete);
      ts2.mutateMapSkippingNewValues(state.diagnostics, currentProjects, noopOnDelete);
      ts2.mutateMapSkippingNewValues(state.projectPendingBuild, currentProjects, noopOnDelete);
      ts2.mutateMapSkippingNewValues(state.projectErrorsReported, currentProjects, noopOnDelete);
      if (state.watch) {
        ts2.mutateMapSkippingNewValues(state.allWatchedConfigFiles, currentProjects, { onDeleteValue: ts2.closeFileWatcher });
        state.allWatchedExtendedConfigFiles.forEach(function(watcher) {
          watcher.projects.forEach(function(project) {
            if (!currentProjects.has(project)) {
              watcher.projects.delete(project);
            }
          });
          watcher.close();
        });
        ts2.mutateMapSkippingNewValues(state.allWatchedWildcardDirectories, currentProjects, { onDeleteValue: function(existingMap) {
          return existingMap.forEach(ts2.closeFileWatcherOf);
        } });
        ts2.mutateMapSkippingNewValues(state.allWatchedInputFiles, currentProjects, { onDeleteValue: function(existingMap) {
          return existingMap.forEach(ts2.closeFileWatcher);
        } });
        ts2.mutateMapSkippingNewValues(state.allWatchedPackageJsonFiles, currentProjects, { onDeleteValue: function(existingMap) {
          return existingMap.forEach(ts2.closeFileWatcher);
        } });
      }
      return state.buildOrder = buildOrder;
    }
    function getBuildOrderFor(state, project, onlyReferences) {
      var resolvedProject = project && resolveProjectName(state, project);
      var buildOrderFromState = getBuildOrder(state);
      if (isCircularBuildOrder(buildOrderFromState))
        return buildOrderFromState;
      if (resolvedProject) {
        var projectPath_1 = toResolvedConfigFilePath(state, resolvedProject);
        var projectIndex = ts2.findIndex(buildOrderFromState, function(configFileName) {
          return toResolvedConfigFilePath(state, configFileName) === projectPath_1;
        });
        if (projectIndex === -1)
          return void 0;
      }
      var buildOrder = resolvedProject ? createBuildOrder(state, [resolvedProject]) : buildOrderFromState;
      ts2.Debug.assert(!isCircularBuildOrder(buildOrder));
      ts2.Debug.assert(!onlyReferences || resolvedProject !== void 0);
      ts2.Debug.assert(!onlyReferences || buildOrder[buildOrder.length - 1] === resolvedProject);
      return onlyReferences ? buildOrder.slice(0, buildOrder.length - 1) : buildOrder;
    }
    function enableCache(state) {
      if (state.cache) {
        disableCache(state);
      }
      var compilerHost = state.compilerHost, host = state.host;
      var originalReadFileWithCache = state.readFileWithCache;
      var originalGetSourceFile = compilerHost.getSourceFile;
      var _a = ts2.changeCompilerHostLikeToUseCache(host, function(fileName) {
        return toPath(state, fileName);
      }, function() {
        var args = [];
        for (var _i = 0; _i < arguments.length; _i++) {
          args[_i] = arguments[_i];
        }
        return originalGetSourceFile.call.apply(originalGetSourceFile, __spreadArray([compilerHost], args, false));
      }), originalReadFile = _a.originalReadFile, originalFileExists = _a.originalFileExists, originalDirectoryExists = _a.originalDirectoryExists, originalCreateDirectory = _a.originalCreateDirectory, originalWriteFile = _a.originalWriteFile, getSourceFileWithCache = _a.getSourceFileWithCache, readFileWithCache = _a.readFileWithCache;
      state.readFileWithCache = readFileWithCache;
      compilerHost.getSourceFile = getSourceFileWithCache;
      state.cache = {
        originalReadFile,
        originalFileExists,
        originalDirectoryExists,
        originalCreateDirectory,
        originalWriteFile,
        originalReadFileWithCache,
        originalGetSourceFile
      };
    }
    function disableCache(state) {
      if (!state.cache)
        return;
      var cache = state.cache, host = state.host, compilerHost = state.compilerHost, extendedConfigCache = state.extendedConfigCache, moduleResolutionCache = state.moduleResolutionCache, typeReferenceDirectiveResolutionCache = state.typeReferenceDirectiveResolutionCache;
      host.readFile = cache.originalReadFile;
      host.fileExists = cache.originalFileExists;
      host.directoryExists = cache.originalDirectoryExists;
      host.createDirectory = cache.originalCreateDirectory;
      host.writeFile = cache.originalWriteFile;
      compilerHost.getSourceFile = cache.originalGetSourceFile;
      state.readFileWithCache = cache.originalReadFileWithCache;
      extendedConfigCache.clear();
      moduleResolutionCache === null || moduleResolutionCache === void 0 ? void 0 : moduleResolutionCache.clear();
      typeReferenceDirectiveResolutionCache === null || typeReferenceDirectiveResolutionCache === void 0 ? void 0 : typeReferenceDirectiveResolutionCache.clear();
      state.cache = void 0;
    }
    function clearProjectStatus(state, resolved) {
      state.projectStatus.delete(resolved);
      state.diagnostics.delete(resolved);
    }
    function addProjToQueue(_a, proj, reloadLevel) {
      var projectPendingBuild = _a.projectPendingBuild;
      var value = projectPendingBuild.get(proj);
      if (value === void 0) {
        projectPendingBuild.set(proj, reloadLevel);
      } else if (value < reloadLevel) {
        projectPendingBuild.set(proj, reloadLevel);
      }
    }
    function setupInitialBuild(state, cancellationToken) {
      if (!state.allProjectBuildPending)
        return;
      state.allProjectBuildPending = false;
      if (state.options.watch)
        reportWatchStatus(state, ts2.Diagnostics.Starting_compilation_in_watch_mode);
      enableCache(state);
      var buildOrder = getBuildOrderFromAnyBuildOrder(getBuildOrder(state));
      buildOrder.forEach(function(configFileName) {
        return state.projectPendingBuild.set(toResolvedConfigFilePath(state, configFileName), ts2.ConfigFileProgramReloadLevel.None);
      });
      if (cancellationToken) {
        cancellationToken.throwIfCancellationRequested();
      }
    }
    var InvalidatedProjectKind;
    (function(InvalidatedProjectKind2) {
      InvalidatedProjectKind2[InvalidatedProjectKind2["Build"] = 0] = "Build";
      InvalidatedProjectKind2[InvalidatedProjectKind2["UpdateBundle"] = 1] = "UpdateBundle";
      InvalidatedProjectKind2[InvalidatedProjectKind2["UpdateOutputFileStamps"] = 2] = "UpdateOutputFileStamps";
    })(InvalidatedProjectKind = ts2.InvalidatedProjectKind || (ts2.InvalidatedProjectKind = {}));
    function doneInvalidatedProject(state, projectPath) {
      state.projectPendingBuild.delete(projectPath);
      state.currentInvalidatedProject = void 0;
      return state.diagnostics.has(projectPath) ? ts2.ExitStatus.DiagnosticsPresent_OutputsSkipped : ts2.ExitStatus.Success;
    }
    function createUpdateOutputFileStampsProject(state, project, projectPath, config, buildOrder) {
      var updateOutputFileStampsPending = true;
      return {
        kind: InvalidatedProjectKind.UpdateOutputFileStamps,
        project,
        projectPath,
        buildOrder,
        getCompilerOptions: function() {
          return config.options;
        },
        getCurrentDirectory: function() {
          return state.currentDirectory;
        },
        updateOutputFileStatmps: function() {
          updateOutputTimestamps(state, config, projectPath);
          updateOutputFileStampsPending = false;
        },
        done: function() {
          if (updateOutputFileStampsPending) {
            updateOutputTimestamps(state, config, projectPath);
          }
          return doneInvalidatedProject(state, projectPath);
        }
      };
    }
    var BuildStep;
    (function(BuildStep2) {
      BuildStep2[BuildStep2["CreateProgram"] = 0] = "CreateProgram";
      BuildStep2[BuildStep2["SyntaxDiagnostics"] = 1] = "SyntaxDiagnostics";
      BuildStep2[BuildStep2["SemanticDiagnostics"] = 2] = "SemanticDiagnostics";
      BuildStep2[BuildStep2["Emit"] = 3] = "Emit";
      BuildStep2[BuildStep2["EmitBundle"] = 4] = "EmitBundle";
      BuildStep2[BuildStep2["EmitBuildInfo"] = 5] = "EmitBuildInfo";
      BuildStep2[BuildStep2["BuildInvalidatedProjectOfBundle"] = 6] = "BuildInvalidatedProjectOfBundle";
      BuildStep2[BuildStep2["QueueReferencingProjects"] = 7] = "QueueReferencingProjects";
      BuildStep2[BuildStep2["Done"] = 8] = "Done";
    })(BuildStep || (BuildStep = {}));
    function createBuildOrUpdateInvalidedProject(kind, state, project, projectPath, projectIndex, config, buildOrder) {
      var step = kind === InvalidatedProjectKind.Build ? BuildStep.CreateProgram : BuildStep.EmitBundle;
      var program;
      var buildResult;
      var invalidatedProjectOfBundle;
      return kind === InvalidatedProjectKind.Build ? {
        kind,
        project,
        projectPath,
        buildOrder,
        getCompilerOptions: function() {
          return config.options;
        },
        getCurrentDirectory: function() {
          return state.currentDirectory;
        },
        getBuilderProgram: function() {
          return withProgramOrUndefined(ts2.identity);
        },
        getProgram: function() {
          return withProgramOrUndefined(function(program2) {
            return program2.getProgramOrUndefined();
          });
        },
        getSourceFile: function(fileName) {
          return withProgramOrUndefined(function(program2) {
            return program2.getSourceFile(fileName);
          });
        },
        getSourceFiles: function() {
          return withProgramOrEmptyArray(function(program2) {
            return program2.getSourceFiles();
          });
        },
        getOptionsDiagnostics: function(cancellationToken) {
          return withProgramOrEmptyArray(function(program2) {
            return program2.getOptionsDiagnostics(cancellationToken);
          });
        },
        getGlobalDiagnostics: function(cancellationToken) {
          return withProgramOrEmptyArray(function(program2) {
            return program2.getGlobalDiagnostics(cancellationToken);
          });
        },
        getConfigFileParsingDiagnostics: function() {
          return withProgramOrEmptyArray(function(program2) {
            return program2.getConfigFileParsingDiagnostics();
          });
        },
        getSyntacticDiagnostics: function(sourceFile, cancellationToken) {
          return withProgramOrEmptyArray(function(program2) {
            return program2.getSyntacticDiagnostics(sourceFile, cancellationToken);
          });
        },
        getAllDependencies: function(sourceFile) {
          return withProgramOrEmptyArray(function(program2) {
            return program2.getAllDependencies(sourceFile);
          });
        },
        getSemanticDiagnostics: function(sourceFile, cancellationToken) {
          return withProgramOrEmptyArray(function(program2) {
            return program2.getSemanticDiagnostics(sourceFile, cancellationToken);
          });
        },
        getSemanticDiagnosticsOfNextAffectedFile: function(cancellationToken, ignoreSourceFile) {
          return withProgramOrUndefined(function(program2) {
            return program2.getSemanticDiagnosticsOfNextAffectedFile && program2.getSemanticDiagnosticsOfNextAffectedFile(cancellationToken, ignoreSourceFile);
          });
        },
        emit: function(targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers) {
          if (targetSourceFile || emitOnlyDtsFiles) {
            return withProgramOrUndefined(function(program2) {
              var _a, _b;
              return program2.emit(targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers || ((_b = (_a = state.host).getCustomTransformers) === null || _b === void 0 ? void 0 : _b.call(_a, project)));
            });
          }
          executeSteps(BuildStep.SemanticDiagnostics, cancellationToken);
          if (step === BuildStep.EmitBuildInfo) {
            return emitBuildInfo(writeFile, cancellationToken);
          }
          if (step !== BuildStep.Emit)
            return void 0;
          return emit(writeFile, cancellationToken, customTransformers);
        },
        done
      } : {
        kind,
        project,
        projectPath,
        buildOrder,
        getCompilerOptions: function() {
          return config.options;
        },
        getCurrentDirectory: function() {
          return state.currentDirectory;
        },
        emit: function(writeFile, customTransformers) {
          if (step !== BuildStep.EmitBundle)
            return invalidatedProjectOfBundle;
          return emitBundle(writeFile, customTransformers);
        },
        done
      };
      function done(cancellationToken, writeFile, customTransformers) {
        executeSteps(BuildStep.Done, cancellationToken, writeFile, customTransformers);
        return doneInvalidatedProject(state, projectPath);
      }
      function withProgramOrUndefined(action) {
        executeSteps(BuildStep.CreateProgram);
        return program && action(program);
      }
      function withProgramOrEmptyArray(action) {
        return withProgramOrUndefined(action) || ts2.emptyArray;
      }
      function createProgram() {
        var _a, _b;
        ts2.Debug.assert(program === void 0);
        if (state.options.dry) {
          reportStatus(state, ts2.Diagnostics.A_non_dry_build_would_build_project_0, project);
          buildResult = BuildResultFlags.Success;
          step = BuildStep.QueueReferencingProjects;
          return;
        }
        if (state.options.verbose)
          reportStatus(state, ts2.Diagnostics.Building_project_0, project);
        if (config.fileNames.length === 0) {
          reportAndStoreErrors(state, projectPath, ts2.getConfigFileParsingDiagnostics(config));
          buildResult = BuildResultFlags.None;
          step = BuildStep.QueueReferencingProjects;
          return;
        }
        var host = state.host, compilerHost = state.compilerHost;
        state.projectCompilerOptions = config.options;
        (_a = state.moduleResolutionCache) === null || _a === void 0 ? void 0 : _a.update(config.options);
        (_b = state.typeReferenceDirectiveResolutionCache) === null || _b === void 0 ? void 0 : _b.update(config.options);
        program = host.createProgram(config.fileNames, config.options, compilerHost, getOldProgram(state, projectPath, config), ts2.getConfigFileParsingDiagnostics(config), config.projectReferences);
        if (state.watch) {
          state.lastCachedPackageJsonLookups.set(projectPath, state.moduleResolutionCache && ts2.map(state.moduleResolutionCache.getPackageJsonInfoCache().entries(), function(_a2) {
            var path = _a2[0], data = _a2[1];
            return [state.host.realpath && data ? toPath(state, state.host.realpath(path)) : path, data];
          }));
          state.builderPrograms.set(projectPath, program);
        }
        step++;
      }
      function handleDiagnostics(diagnostics, errorFlags, errorType) {
        var _a;
        if (diagnostics.length) {
          _a = buildErrors(state, projectPath, program, config, diagnostics, errorFlags, errorType), buildResult = _a.buildResult, step = _a.step;
        } else {
          step++;
        }
      }
      function getSyntaxDiagnostics(cancellationToken) {
        ts2.Debug.assertIsDefined(program);
        handleDiagnostics(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], program.getConfigFileParsingDiagnostics(), true), program.getOptionsDiagnostics(cancellationToken), true), program.getGlobalDiagnostics(cancellationToken), true), program.getSyntacticDiagnostics(void 0, cancellationToken), true), BuildResultFlags.SyntaxErrors, "Syntactic");
      }
      function getSemanticDiagnostics(cancellationToken) {
        handleDiagnostics(ts2.Debug.checkDefined(program).getSemanticDiagnostics(void 0, cancellationToken), BuildResultFlags.TypeErrors, "Semantic");
      }
      function emit(writeFileCallback, cancellationToken, customTransformers) {
        var _a;
        var _b, _c;
        ts2.Debug.assertIsDefined(program);
        ts2.Debug.assert(step === BuildStep.Emit);
        program.backupState();
        var declDiagnostics;
        var reportDeclarationDiagnostics = function(d) {
          return (declDiagnostics || (declDiagnostics = [])).push(d);
        };
        var outputFiles = [];
        var emitResult = ts2.emitFilesAndReportErrors(program, reportDeclarationDiagnostics, void 0, void 0, function(name, text, writeByteOrderMark) {
          return outputFiles.push({ name, text, writeByteOrderMark });
        }, cancellationToken, false, customTransformers || ((_c = (_b = state.host).getCustomTransformers) === null || _c === void 0 ? void 0 : _c.call(_b, project))).emitResult;
        if (declDiagnostics) {
          program.restoreState();
          _a = buildErrors(state, projectPath, program, config, declDiagnostics, BuildResultFlags.DeclarationEmitErrors, "Declaration file"), buildResult = _a.buildResult, step = _a.step;
          return {
            emitSkipped: true,
            diagnostics: emitResult.diagnostics
          };
        }
        var host = state.host, compilerHost = state.compilerHost;
        var resultFlags = BuildResultFlags.DeclarationOutputUnchanged;
        var newestDeclarationFileContentChangedTime = minimumDate;
        var anyDtsChanged = false;
        var emitterDiagnostics = ts2.createDiagnosticCollection();
        var emittedOutputs = new ts2.Map();
        outputFiles.forEach(function(_a2) {
          var name = _a2.name, text = _a2.text, writeByteOrderMark = _a2.writeByteOrderMark;
          var priorChangeTime;
          if (!anyDtsChanged && isDeclarationFile(name)) {
            if (host.fileExists(name) && state.readFileWithCache(name) === text) {
              priorChangeTime = host.getModifiedTime(name);
            } else {
              resultFlags &= ~BuildResultFlags.DeclarationOutputUnchanged;
              anyDtsChanged = true;
            }
          }
          emittedOutputs.set(toPath(state, name), name);
          ts2.writeFile(writeFileCallback ? { writeFile: writeFileCallback } : compilerHost, emitterDiagnostics, name, text, writeByteOrderMark);
          if (priorChangeTime !== void 0) {
            newestDeclarationFileContentChangedTime = newer(priorChangeTime, newestDeclarationFileContentChangedTime);
          }
        });
        finishEmit(emitterDiagnostics, emittedOutputs, newestDeclarationFileContentChangedTime, anyDtsChanged, outputFiles.length ? outputFiles[0].name : ts2.getFirstProjectOutput(config, !host.useCaseSensitiveFileNames()), resultFlags);
        return emitResult;
      }
      function emitBuildInfo(writeFileCallback, cancellationToken) {
        ts2.Debug.assertIsDefined(program);
        ts2.Debug.assert(step === BuildStep.EmitBuildInfo);
        var emitResult = program.emitBuildInfo(writeFileCallback, cancellationToken);
        if (emitResult.diagnostics.length) {
          reportErrors(state, emitResult.diagnostics);
          state.diagnostics.set(projectPath, __spreadArray(__spreadArray([], state.diagnostics.get(projectPath), true), emitResult.diagnostics, true));
          buildResult = BuildResultFlags.EmitErrors & buildResult;
        }
        if (emitResult.emittedFiles && state.write) {
          emitResult.emittedFiles.forEach(function(name) {
            return listEmittedFile(state, config, name);
          });
        }
        afterProgramDone(state, program, config);
        step = BuildStep.QueueReferencingProjects;
        return emitResult;
      }
      function finishEmit(emitterDiagnostics, emittedOutputs, priorNewestUpdateTime, newestDeclarationFileContentChangedTimeIsMaximumDate, oldestOutputFileName, resultFlags) {
        var _a;
        var emitDiagnostics = emitterDiagnostics.getDiagnostics();
        if (emitDiagnostics.length) {
          _a = buildErrors(state, projectPath, program, config, emitDiagnostics, BuildResultFlags.EmitErrors, "Emit"), buildResult = _a.buildResult, step = _a.step;
          return emitDiagnostics;
        }
        if (state.write) {
          emittedOutputs.forEach(function(name) {
            return listEmittedFile(state, config, name);
          });
        }
        var newestDeclarationFileContentChangedTime = updateOutputTimestampsWorker(state, config, priorNewestUpdateTime, ts2.Diagnostics.Updating_unchanged_output_timestamps_of_project_0, emittedOutputs);
        state.diagnostics.delete(projectPath);
        state.projectStatus.set(projectPath, {
          type: ts2.UpToDateStatusType.UpToDate,
          newestDeclarationFileContentChangedTime: newestDeclarationFileContentChangedTimeIsMaximumDate ? maximumDate : newestDeclarationFileContentChangedTime,
          oldestOutputFileName
        });
        afterProgramDone(state, program, config);
        step = BuildStep.QueueReferencingProjects;
        buildResult = resultFlags;
        return emitDiagnostics;
      }
      function emitBundle(writeFileCallback, customTransformers) {
        var _a, _b;
        ts2.Debug.assert(kind === InvalidatedProjectKind.UpdateBundle);
        if (state.options.dry) {
          reportStatus(state, ts2.Diagnostics.A_non_dry_build_would_update_output_of_project_0, project);
          buildResult = BuildResultFlags.Success;
          step = BuildStep.QueueReferencingProjects;
          return void 0;
        }
        if (state.options.verbose)
          reportStatus(state, ts2.Diagnostics.Updating_output_of_project_0, project);
        var compilerHost = state.compilerHost;
        state.projectCompilerOptions = config.options;
        var outputFiles = ts2.emitUsingBuildInfo(config, compilerHost, function(ref) {
          var refName = resolveProjectName(state, ref.path);
          return parseConfigFile(state, refName, toResolvedConfigFilePath(state, refName));
        }, customTransformers || ((_b = (_a = state.host).getCustomTransformers) === null || _b === void 0 ? void 0 : _b.call(_a, project)));
        if (ts2.isString(outputFiles)) {
          reportStatus(state, ts2.Diagnostics.Cannot_update_output_of_project_0_because_there_was_error_reading_file_1, project, relName(state, outputFiles));
          step = BuildStep.BuildInvalidatedProjectOfBundle;
          return invalidatedProjectOfBundle = createBuildOrUpdateInvalidedProject(InvalidatedProjectKind.Build, state, project, projectPath, projectIndex, config, buildOrder);
        }
        ts2.Debug.assert(!!outputFiles.length);
        var emitterDiagnostics = ts2.createDiagnosticCollection();
        var emittedOutputs = new ts2.Map();
        outputFiles.forEach(function(_a2) {
          var name = _a2.name, text = _a2.text, writeByteOrderMark = _a2.writeByteOrderMark;
          emittedOutputs.set(toPath(state, name), name);
          ts2.writeFile(writeFileCallback ? { writeFile: writeFileCallback } : compilerHost, emitterDiagnostics, name, text, writeByteOrderMark);
        });
        var emitDiagnostics = finishEmit(emitterDiagnostics, emittedOutputs, minimumDate, false, outputFiles[0].name, BuildResultFlags.DeclarationOutputUnchanged);
        return { emitSkipped: false, diagnostics: emitDiagnostics };
      }
      function executeSteps(till, cancellationToken, writeFile, customTransformers) {
        while (step <= till && step < BuildStep.Done) {
          var currentStep = step;
          switch (step) {
            case BuildStep.CreateProgram:
              createProgram();
              break;
            case BuildStep.SyntaxDiagnostics:
              getSyntaxDiagnostics(cancellationToken);
              break;
            case BuildStep.SemanticDiagnostics:
              getSemanticDiagnostics(cancellationToken);
              break;
            case BuildStep.Emit:
              emit(writeFile, cancellationToken, customTransformers);
              break;
            case BuildStep.EmitBuildInfo:
              emitBuildInfo(writeFile, cancellationToken);
              break;
            case BuildStep.EmitBundle:
              emitBundle(writeFile, customTransformers);
              break;
            case BuildStep.BuildInvalidatedProjectOfBundle:
              ts2.Debug.checkDefined(invalidatedProjectOfBundle).done(cancellationToken, writeFile, customTransformers);
              step = BuildStep.Done;
              break;
            case BuildStep.QueueReferencingProjects:
              queueReferencingProjects(state, project, projectPath, projectIndex, config, buildOrder, ts2.Debug.checkDefined(buildResult));
              step++;
              break;
            case BuildStep.Done:
            default:
              ts2.assertType(step);
          }
          ts2.Debug.assert(step > currentStep);
        }
      }
    }
    function needsBuild(_a, status, config) {
      var options = _a.options;
      if (status.type !== ts2.UpToDateStatusType.OutOfDateWithPrepend || options.force)
        return true;
      return config.fileNames.length === 0 || !!ts2.getConfigFileParsingDiagnostics(config).length || !ts2.isIncrementalCompilation(config.options);
    }
    function getNextInvalidatedProject(state, buildOrder, reportQueue) {
      if (!state.projectPendingBuild.size)
        return void 0;
      if (isCircularBuildOrder(buildOrder))
        return void 0;
      if (state.currentInvalidatedProject) {
        return ts2.arrayIsEqualTo(state.currentInvalidatedProject.buildOrder, buildOrder) ? state.currentInvalidatedProject : void 0;
      }
      var options = state.options, projectPendingBuild = state.projectPendingBuild;
      for (var projectIndex = 0; projectIndex < buildOrder.length; projectIndex++) {
        var project = buildOrder[projectIndex];
        var projectPath = toResolvedConfigFilePath(state, project);
        var reloadLevel = state.projectPendingBuild.get(projectPath);
        if (reloadLevel === void 0)
          continue;
        if (reportQueue) {
          reportQueue = false;
          reportBuildQueue(state, buildOrder);
        }
        var config = parseConfigFile(state, project, projectPath);
        if (!config) {
          reportParseConfigFileDiagnostic(state, projectPath);
          projectPendingBuild.delete(projectPath);
          continue;
        }
        if (reloadLevel === ts2.ConfigFileProgramReloadLevel.Full) {
          watchConfigFile(state, project, projectPath, config);
          watchExtendedConfigFiles(state, projectPath, config);
          watchWildCardDirectories(state, project, projectPath, config);
          watchInputFiles(state, project, projectPath, config);
          watchPackageJsonFiles(state, project, projectPath, config);
        } else if (reloadLevel === ts2.ConfigFileProgramReloadLevel.Partial) {
          config.fileNames = ts2.getFileNamesFromConfigSpecs(config.options.configFile.configFileSpecs, ts2.getDirectoryPath(project), config.options, state.parseConfigFileHost);
          ts2.updateErrorForNoInputFiles(config.fileNames, project, config.options.configFile.configFileSpecs, config.errors, ts2.canJsonReportNoInputFiles(config.raw));
          watchInputFiles(state, project, projectPath, config);
          watchPackageJsonFiles(state, project, projectPath, config);
        }
        var status = getUpToDateStatus(state, config, projectPath);
        verboseReportProjectStatus(state, project, status);
        if (!options.force) {
          if (status.type === ts2.UpToDateStatusType.UpToDate) {
            reportAndStoreErrors(state, projectPath, ts2.getConfigFileParsingDiagnostics(config));
            projectPendingBuild.delete(projectPath);
            if (options.dry) {
              reportStatus(state, ts2.Diagnostics.Project_0_is_up_to_date, project);
            }
            continue;
          }
          if (status.type === ts2.UpToDateStatusType.UpToDateWithUpstreamTypes) {
            reportAndStoreErrors(state, projectPath, ts2.getConfigFileParsingDiagnostics(config));
            return createUpdateOutputFileStampsProject(state, project, projectPath, config, buildOrder);
          }
        }
        if (status.type === ts2.UpToDateStatusType.UpstreamBlocked) {
          reportAndStoreErrors(state, projectPath, ts2.getConfigFileParsingDiagnostics(config));
          projectPendingBuild.delete(projectPath);
          if (options.verbose) {
            reportStatus(state, status.upstreamProjectBlocked ? ts2.Diagnostics.Skipping_build_of_project_0_because_its_dependency_1_was_not_built : ts2.Diagnostics.Skipping_build_of_project_0_because_its_dependency_1_has_errors, project, status.upstreamProjectName);
          }
          continue;
        }
        if (status.type === ts2.UpToDateStatusType.ContainerOnly) {
          reportAndStoreErrors(state, projectPath, ts2.getConfigFileParsingDiagnostics(config));
          projectPendingBuild.delete(projectPath);
          continue;
        }
        return createBuildOrUpdateInvalidedProject(needsBuild(state, status, config) ? InvalidatedProjectKind.Build : InvalidatedProjectKind.UpdateBundle, state, project, projectPath, projectIndex, config, buildOrder);
      }
      return void 0;
    }
    function listEmittedFile(_a, proj, file) {
      var write = _a.write;
      if (write && proj.options.listEmittedFiles) {
        write("TSFILE: ".concat(file));
      }
    }
    function getOldProgram(_a, proj, parsed) {
      var options = _a.options, builderPrograms = _a.builderPrograms, compilerHost = _a.compilerHost;
      if (options.force)
        return void 0;
      var value = builderPrograms.get(proj);
      if (value)
        return value;
      return ts2.readBuilderProgram(parsed.options, compilerHost);
    }
    function afterProgramDone(state, program, config) {
      if (program) {
        if (program && state.write)
          ts2.listFiles(program, state.write);
        if (state.host.afterProgramEmitAndDiagnostics) {
          state.host.afterProgramEmitAndDiagnostics(program);
        }
        program.releaseProgram();
      } else if (state.host.afterEmitBundle) {
        state.host.afterEmitBundle(config);
      }
      state.projectCompilerOptions = state.baseCompilerOptions;
    }
    function buildErrors(state, resolvedPath, program, config, diagnostics, buildResult, errorType) {
      var canEmitBuildInfo = !(buildResult & BuildResultFlags.SyntaxErrors) && program && !ts2.outFile(program.getCompilerOptions());
      reportAndStoreErrors(state, resolvedPath, diagnostics);
      state.projectStatus.set(resolvedPath, { type: ts2.UpToDateStatusType.Unbuildable, reason: "".concat(errorType, " errors") });
      if (canEmitBuildInfo)
        return { buildResult, step: BuildStep.EmitBuildInfo };
      afterProgramDone(state, program, config);
      return { buildResult, step: BuildStep.QueueReferencingProjects };
    }
    function checkConfigFileUpToDateStatus(state, configFile, oldestOutputFileTime, oldestOutputFileName) {
      var tsconfigTime = ts2.getModifiedTime(state.host, configFile);
      if (oldestOutputFileTime < tsconfigTime) {
        return {
          type: ts2.UpToDateStatusType.OutOfDateWithSelf,
          outOfDateOutputFileName: oldestOutputFileName,
          newerInputFileName: configFile
        };
      }
    }
    function getUpToDateStatusWorker(state, project, resolvedPath) {
      var force = !!state.options.force;
      var newestInputFileName = void 0;
      var newestInputFileTime = minimumDate;
      var host = state.host;
      for (var _i = 0, _a = project.fileNames; _i < _a.length; _i++) {
        var inputFile = _a[_i];
        if (!host.fileExists(inputFile)) {
          return {
            type: ts2.UpToDateStatusType.Unbuildable,
            reason: "".concat(inputFile, " does not exist")
          };
        }
        if (!force) {
          var inputTime = ts2.getModifiedTime(host, inputFile);
          if (inputTime > newestInputFileTime) {
            newestInputFileName = inputFile;
            newestInputFileTime = inputTime;
          }
        }
      }
      if (!project.fileNames.length && !ts2.canJsonReportNoInputFiles(project.raw)) {
        return {
          type: ts2.UpToDateStatusType.ContainerOnly
        };
      }
      var outputs = ts2.getAllProjectOutputs(project, !host.useCaseSensitiveFileNames());
      var oldestOutputFileName = "(none)";
      var oldestOutputFileTime = maximumDate;
      var newestOutputFileName = "(none)";
      var newestOutputFileTime = minimumDate;
      var missingOutputFileName;
      var newestDeclarationFileContentChangedTime = minimumDate;
      var isOutOfDateWithInputs = false;
      if (!force) {
        for (var _b = 0, outputs_1 = outputs; _b < outputs_1.length; _b++) {
          var output = outputs_1[_b];
          if (!host.fileExists(output)) {
            missingOutputFileName = output;
            break;
          }
          var outputTime = ts2.getModifiedTime(host, output);
          if (outputTime < oldestOutputFileTime) {
            oldestOutputFileTime = outputTime;
            oldestOutputFileName = output;
          }
          if (outputTime < newestInputFileTime) {
            isOutOfDateWithInputs = true;
            break;
          }
          if (outputTime > newestOutputFileTime) {
            newestOutputFileTime = outputTime;
            newestOutputFileName = output;
          }
          if (isDeclarationFile(output)) {
            var outputModifiedTime = ts2.getModifiedTime(host, output);
            newestDeclarationFileContentChangedTime = newer(newestDeclarationFileContentChangedTime, outputModifiedTime);
          }
        }
      }
      var pseudoUpToDate = false;
      var usesPrepend = false;
      var upstreamChangedProject;
      if (project.projectReferences) {
        state.projectStatus.set(resolvedPath, { type: ts2.UpToDateStatusType.ComputingUpstream });
        for (var _c = 0, _d = project.projectReferences; _c < _d.length; _c++) {
          var ref = _d[_c];
          usesPrepend = usesPrepend || !!ref.prepend;
          var resolvedRef = ts2.resolveProjectReferencePath(ref);
          var resolvedRefPath = toResolvedConfigFilePath(state, resolvedRef);
          var refStatus = getUpToDateStatus(state, parseConfigFile(state, resolvedRef, resolvedRefPath), resolvedRefPath);
          if (refStatus.type === ts2.UpToDateStatusType.ComputingUpstream || refStatus.type === ts2.UpToDateStatusType.ContainerOnly) {
            continue;
          }
          if (refStatus.type === ts2.UpToDateStatusType.Unbuildable || refStatus.type === ts2.UpToDateStatusType.UpstreamBlocked) {
            return {
              type: ts2.UpToDateStatusType.UpstreamBlocked,
              upstreamProjectName: ref.path,
              upstreamProjectBlocked: refStatus.type === ts2.UpToDateStatusType.UpstreamBlocked
            };
          }
          if (refStatus.type !== ts2.UpToDateStatusType.UpToDate) {
            return {
              type: ts2.UpToDateStatusType.UpstreamOutOfDate,
              upstreamProjectName: ref.path
            };
          }
          if (!force && !missingOutputFileName) {
            if (refStatus.newestInputFileTime && refStatus.newestInputFileTime <= oldestOutputFileTime) {
              continue;
            }
            if (refStatus.newestDeclarationFileContentChangedTime && refStatus.newestDeclarationFileContentChangedTime <= oldestOutputFileTime) {
              pseudoUpToDate = true;
              upstreamChangedProject = ref.path;
              continue;
            }
            ts2.Debug.assert(oldestOutputFileName !== void 0, "Should have an oldest output filename here");
            return {
              type: ts2.UpToDateStatusType.OutOfDateWithUpstream,
              outOfDateOutputFileName: oldestOutputFileName,
              newerProjectName: ref.path
            };
          }
        }
      }
      if (missingOutputFileName !== void 0) {
        return {
          type: ts2.UpToDateStatusType.OutputMissing,
          missingOutputFileName
        };
      }
      if (isOutOfDateWithInputs) {
        return {
          type: ts2.UpToDateStatusType.OutOfDateWithSelf,
          outOfDateOutputFileName: oldestOutputFileName,
          newerInputFileName: newestInputFileName
        };
      } else {
        var configStatus = checkConfigFileUpToDateStatus(state, project.options.configFilePath, oldestOutputFileTime, oldestOutputFileName);
        if (configStatus)
          return configStatus;
        var extendedConfigStatus = ts2.forEach(project.options.configFile.extendedSourceFiles || ts2.emptyArray, function(configFile) {
          return checkConfigFileUpToDateStatus(state, configFile, oldestOutputFileTime, oldestOutputFileName);
        });
        if (extendedConfigStatus)
          return extendedConfigStatus;
        var dependentPackageFileStatus = ts2.forEach(state.lastCachedPackageJsonLookups.get(resolvedPath) || ts2.emptyArray, function(_a2) {
          var path = _a2[0];
          return checkConfigFileUpToDateStatus(state, path, oldestOutputFileTime, oldestOutputFileName);
        });
        if (dependentPackageFileStatus)
          return dependentPackageFileStatus;
      }
      if (!force && !state.buildInfoChecked.has(resolvedPath)) {
        state.buildInfoChecked.set(resolvedPath, true);
        var buildInfoPath = ts2.getTsBuildInfoEmitOutputFilePath(project.options);
        if (buildInfoPath) {
          var value = state.readFileWithCache(buildInfoPath);
          var buildInfo = value && ts2.getBuildInfo(value);
          if (buildInfo && (buildInfo.bundle || buildInfo.program) && buildInfo.version !== ts2.version) {
            return {
              type: ts2.UpToDateStatusType.TsVersionOutputOfDate,
              version: buildInfo.version
            };
          }
        }
      }
      if (usesPrepend && pseudoUpToDate) {
        return {
          type: ts2.UpToDateStatusType.OutOfDateWithPrepend,
          outOfDateOutputFileName: oldestOutputFileName,
          newerProjectName: upstreamChangedProject
        };
      }
      return {
        type: pseudoUpToDate ? ts2.UpToDateStatusType.UpToDateWithUpstreamTypes : ts2.UpToDateStatusType.UpToDate,
        newestDeclarationFileContentChangedTime,
        newestInputFileTime,
        newestOutputFileTime,
        newestInputFileName,
        newestOutputFileName,
        oldestOutputFileName
      };
    }
    function getUpToDateStatus(state, project, resolvedPath) {
      if (project === void 0) {
        return { type: ts2.UpToDateStatusType.Unbuildable, reason: "File deleted mid-build" };
      }
      var prior = state.projectStatus.get(resolvedPath);
      if (prior !== void 0) {
        return prior;
      }
      var actual = getUpToDateStatusWorker(state, project, resolvedPath);
      state.projectStatus.set(resolvedPath, actual);
      return actual;
    }
    function updateOutputTimestampsWorker(state, proj, priorNewestUpdateTime, verboseMessage, skipOutputs) {
      if (proj.options.noEmit)
        return priorNewestUpdateTime;
      var host = state.host;
      var outputs = ts2.getAllProjectOutputs(proj, !host.useCaseSensitiveFileNames());
      if (!skipOutputs || outputs.length !== skipOutputs.size) {
        var reportVerbose = !!state.options.verbose;
        var now = host.now ? host.now() : new Date();
        for (var _i = 0, outputs_2 = outputs; _i < outputs_2.length; _i++) {
          var file = outputs_2[_i];
          if (skipOutputs && skipOutputs.has(toPath(state, file))) {
            continue;
          }
          if (reportVerbose) {
            reportVerbose = false;
            reportStatus(state, verboseMessage, proj.options.configFilePath);
          }
          if (isDeclarationFile(file)) {
            priorNewestUpdateTime = newer(priorNewestUpdateTime, ts2.getModifiedTime(host, file));
          }
          host.setModifiedTime(file, now);
        }
      }
      return priorNewestUpdateTime;
    }
    function updateOutputTimestamps(state, proj, resolvedPath) {
      if (state.options.dry) {
        return reportStatus(state, ts2.Diagnostics.A_non_dry_build_would_update_timestamps_for_output_of_project_0, proj.options.configFilePath);
      }
      var priorNewestUpdateTime = updateOutputTimestampsWorker(state, proj, minimumDate, ts2.Diagnostics.Updating_output_timestamps_of_project_0);
      state.projectStatus.set(resolvedPath, {
        type: ts2.UpToDateStatusType.UpToDate,
        newestDeclarationFileContentChangedTime: priorNewestUpdateTime,
        oldestOutputFileName: ts2.getFirstProjectOutput(proj, !state.host.useCaseSensitiveFileNames())
      });
    }
    function queueReferencingProjects(state, project, projectPath, projectIndex, config, buildOrder, buildResult) {
      if (buildResult & BuildResultFlags.AnyErrors)
        return;
      if (!config.options.composite)
        return;
      for (var index = projectIndex + 1; index < buildOrder.length; index++) {
        var nextProject = buildOrder[index];
        var nextProjectPath = toResolvedConfigFilePath(state, nextProject);
        if (state.projectPendingBuild.has(nextProjectPath))
          continue;
        var nextProjectConfig = parseConfigFile(state, nextProject, nextProjectPath);
        if (!nextProjectConfig || !nextProjectConfig.projectReferences)
          continue;
        for (var _i = 0, _a = nextProjectConfig.projectReferences; _i < _a.length; _i++) {
          var ref = _a[_i];
          var resolvedRefPath = resolveProjectName(state, ref.path);
          if (toResolvedConfigFilePath(state, resolvedRefPath) !== projectPath)
            continue;
          var status = state.projectStatus.get(nextProjectPath);
          if (status) {
            switch (status.type) {
              case ts2.UpToDateStatusType.UpToDate:
                if (buildResult & BuildResultFlags.DeclarationOutputUnchanged) {
                  if (ref.prepend) {
                    state.projectStatus.set(nextProjectPath, {
                      type: ts2.UpToDateStatusType.OutOfDateWithPrepend,
                      outOfDateOutputFileName: status.oldestOutputFileName,
                      newerProjectName: project
                    });
                  } else {
                    status.type = ts2.UpToDateStatusType.UpToDateWithUpstreamTypes;
                  }
                  break;
                }
              case ts2.UpToDateStatusType.UpToDateWithUpstreamTypes:
              case ts2.UpToDateStatusType.OutOfDateWithPrepend:
                if (!(buildResult & BuildResultFlags.DeclarationOutputUnchanged)) {
                  state.projectStatus.set(nextProjectPath, {
                    type: ts2.UpToDateStatusType.OutOfDateWithUpstream,
                    outOfDateOutputFileName: status.type === ts2.UpToDateStatusType.OutOfDateWithPrepend ? status.outOfDateOutputFileName : status.oldestOutputFileName,
                    newerProjectName: project
                  });
                }
                break;
              case ts2.UpToDateStatusType.UpstreamBlocked:
                if (toResolvedConfigFilePath(state, resolveProjectName(state, status.upstreamProjectName)) === projectPath) {
                  clearProjectStatus(state, nextProjectPath);
                }
                break;
            }
          }
          addProjToQueue(state, nextProjectPath, ts2.ConfigFileProgramReloadLevel.None);
          break;
        }
      }
    }
    function build(state, project, cancellationToken, writeFile, getCustomTransformers, onlyReferences) {
      var buildOrder = getBuildOrderFor(state, project, onlyReferences);
      if (!buildOrder)
        return ts2.ExitStatus.InvalidProject_OutputsSkipped;
      setupInitialBuild(state, cancellationToken);
      var reportQueue = true;
      var successfulProjects = 0;
      while (true) {
        var invalidatedProject = getNextInvalidatedProject(state, buildOrder, reportQueue);
        if (!invalidatedProject)
          break;
        reportQueue = false;
        invalidatedProject.done(cancellationToken, writeFile, getCustomTransformers === null || getCustomTransformers === void 0 ? void 0 : getCustomTransformers(invalidatedProject.project));
        if (!state.diagnostics.has(invalidatedProject.projectPath))
          successfulProjects++;
      }
      disableCache(state);
      reportErrorSummary(state, buildOrder);
      startWatching(state, buildOrder);
      return isCircularBuildOrder(buildOrder) ? ts2.ExitStatus.ProjectReferenceCycle_OutputsSkipped : !buildOrder.some(function(p) {
        return state.diagnostics.has(toResolvedConfigFilePath(state, p));
      }) ? ts2.ExitStatus.Success : successfulProjects ? ts2.ExitStatus.DiagnosticsPresent_OutputsGenerated : ts2.ExitStatus.DiagnosticsPresent_OutputsSkipped;
    }
    function clean(state, project, onlyReferences) {
      var buildOrder = getBuildOrderFor(state, project, onlyReferences);
      if (!buildOrder)
        return ts2.ExitStatus.InvalidProject_OutputsSkipped;
      if (isCircularBuildOrder(buildOrder)) {
        reportErrors(state, buildOrder.circularDiagnostics);
        return ts2.ExitStatus.ProjectReferenceCycle_OutputsSkipped;
      }
      var options = state.options, host = state.host;
      var filesToDelete = options.dry ? [] : void 0;
      for (var _i = 0, buildOrder_1 = buildOrder; _i < buildOrder_1.length; _i++) {
        var proj = buildOrder_1[_i];
        var resolvedPath = toResolvedConfigFilePath(state, proj);
        var parsed = parseConfigFile(state, proj, resolvedPath);
        if (parsed === void 0) {
          reportParseConfigFileDiagnostic(state, resolvedPath);
          continue;
        }
        var outputs = ts2.getAllProjectOutputs(parsed, !host.useCaseSensitiveFileNames());
        if (!outputs.length)
          continue;
        var inputFileNames = new ts2.Set(parsed.fileNames.map(function(f) {
          return toPath(state, f);
        }));
        for (var _a = 0, outputs_3 = outputs; _a < outputs_3.length; _a++) {
          var output = outputs_3[_a];
          if (inputFileNames.has(toPath(state, output)))
            continue;
          if (host.fileExists(output)) {
            if (filesToDelete) {
              filesToDelete.push(output);
            } else {
              host.deleteFile(output);
              invalidateProject(state, resolvedPath, ts2.ConfigFileProgramReloadLevel.None);
            }
          }
        }
      }
      if (filesToDelete) {
        reportStatus(state, ts2.Diagnostics.A_non_dry_build_would_delete_the_following_files_Colon_0, filesToDelete.map(function(f) {
          return "\r\n * ".concat(f);
        }).join(""));
      }
      return ts2.ExitStatus.Success;
    }
    function invalidateProject(state, resolved, reloadLevel) {
      if (state.host.getParsedCommandLine && reloadLevel === ts2.ConfigFileProgramReloadLevel.Partial) {
        reloadLevel = ts2.ConfigFileProgramReloadLevel.Full;
      }
      if (reloadLevel === ts2.ConfigFileProgramReloadLevel.Full) {
        state.configFileCache.delete(resolved);
        state.buildOrder = void 0;
      }
      state.needsSummary = true;
      clearProjectStatus(state, resolved);
      addProjToQueue(state, resolved, reloadLevel);
      enableCache(state);
    }
    function invalidateProjectAndScheduleBuilds(state, resolvedPath, reloadLevel) {
      state.reportFileChangeDetected = true;
      invalidateProject(state, resolvedPath, reloadLevel);
      scheduleBuildInvalidatedProject(state);
    }
    function scheduleBuildInvalidatedProject(state) {
      var hostWithWatch = state.hostWithWatch;
      if (!hostWithWatch.setTimeout || !hostWithWatch.clearTimeout) {
        return;
      }
      if (state.timerToBuildInvalidatedProject) {
        hostWithWatch.clearTimeout(state.timerToBuildInvalidatedProject);
      }
      state.timerToBuildInvalidatedProject = hostWithWatch.setTimeout(buildNextInvalidatedProject, 250, state);
    }
    function buildNextInvalidatedProject(state) {
      state.timerToBuildInvalidatedProject = void 0;
      if (state.reportFileChangeDetected) {
        state.reportFileChangeDetected = false;
        state.projectErrorsReported.clear();
        reportWatchStatus(state, ts2.Diagnostics.File_change_detected_Starting_incremental_compilation);
      }
      var buildOrder = getBuildOrder(state);
      var invalidatedProject = getNextInvalidatedProject(state, buildOrder, false);
      if (invalidatedProject) {
        invalidatedProject.done();
        if (state.projectPendingBuild.size) {
          if (state.watch && !state.timerToBuildInvalidatedProject) {
            scheduleBuildInvalidatedProject(state);
          }
          return;
        }
      }
      disableCache(state);
      reportErrorSummary(state, buildOrder);
    }
    function watchConfigFile(state, resolved, resolvedPath, parsed) {
      if (!state.watch || state.allWatchedConfigFiles.has(resolvedPath))
        return;
      state.allWatchedConfigFiles.set(resolvedPath, state.watchFile(resolved, function() {
        invalidateProjectAndScheduleBuilds(state, resolvedPath, ts2.ConfigFileProgramReloadLevel.Full);
      }, ts2.PollingInterval.High, parsed === null || parsed === void 0 ? void 0 : parsed.watchOptions, ts2.WatchType.ConfigFile, resolved));
    }
    function watchExtendedConfigFiles(state, resolvedPath, parsed) {
      ts2.updateSharedExtendedConfigFileWatcher(resolvedPath, parsed === null || parsed === void 0 ? void 0 : parsed.options, state.allWatchedExtendedConfigFiles, function(extendedConfigFileName, extendedConfigFilePath) {
        return state.watchFile(extendedConfigFileName, function() {
          var _a;
          return (_a = state.allWatchedExtendedConfigFiles.get(extendedConfigFilePath)) === null || _a === void 0 ? void 0 : _a.projects.forEach(function(projectConfigFilePath) {
            return invalidateProjectAndScheduleBuilds(state, projectConfigFilePath, ts2.ConfigFileProgramReloadLevel.Full);
          });
        }, ts2.PollingInterval.High, parsed === null || parsed === void 0 ? void 0 : parsed.watchOptions, ts2.WatchType.ExtendedConfigFile);
      }, function(fileName) {
        return toPath(state, fileName);
      });
    }
    function watchWildCardDirectories(state, resolved, resolvedPath, parsed) {
      if (!state.watch)
        return;
      ts2.updateWatchingWildcardDirectories(getOrCreateValueMapFromConfigFileMap(state.allWatchedWildcardDirectories, resolvedPath), new ts2.Map(ts2.getEntries(parsed.wildcardDirectories)), function(dir, flags) {
        return state.watchDirectory(dir, function(fileOrDirectory) {
          var _a;
          if (ts2.isIgnoredFileFromWildCardWatching({
            watchedDirPath: toPath(state, dir),
            fileOrDirectory,
            fileOrDirectoryPath: toPath(state, fileOrDirectory),
            configFileName: resolved,
            currentDirectory: state.currentDirectory,
            options: parsed.options,
            program: state.builderPrograms.get(resolvedPath) || ((_a = getCachedParsedConfigFile(state, resolvedPath)) === null || _a === void 0 ? void 0 : _a.fileNames),
            useCaseSensitiveFileNames: state.parseConfigFileHost.useCaseSensitiveFileNames,
            writeLog: function(s) {
              return state.writeLog(s);
            },
            toPath: function(fileName) {
              return toPath(state, fileName);
            }
          }))
            return;
          invalidateProjectAndScheduleBuilds(state, resolvedPath, ts2.ConfigFileProgramReloadLevel.Partial);
        }, flags, parsed === null || parsed === void 0 ? void 0 : parsed.watchOptions, ts2.WatchType.WildcardDirectory, resolved);
      });
    }
    function watchInputFiles(state, resolved, resolvedPath, parsed) {
      if (!state.watch)
        return;
      ts2.mutateMap(getOrCreateValueMapFromConfigFileMap(state.allWatchedInputFiles, resolvedPath), ts2.arrayToMap(parsed.fileNames, function(fileName) {
        return toPath(state, fileName);
      }), {
        createNewValue: function(_path, input) {
          return state.watchFile(input, function() {
            return invalidateProjectAndScheduleBuilds(state, resolvedPath, ts2.ConfigFileProgramReloadLevel.None);
          }, ts2.PollingInterval.Low, parsed === null || parsed === void 0 ? void 0 : parsed.watchOptions, ts2.WatchType.SourceFile, resolved);
        },
        onDeleteValue: ts2.closeFileWatcher
      });
    }
    function watchPackageJsonFiles(state, resolved, resolvedPath, parsed) {
      if (!state.watch || !state.lastCachedPackageJsonLookups)
        return;
      ts2.mutateMap(getOrCreateValueMapFromConfigFileMap(state.allWatchedPackageJsonFiles, resolvedPath), new ts2.Map(state.lastCachedPackageJsonLookups.get(resolvedPath)), {
        createNewValue: function(path, _input) {
          return state.watchFile(path, function() {
            return invalidateProjectAndScheduleBuilds(state, resolvedPath, ts2.ConfigFileProgramReloadLevel.Full);
          }, ts2.PollingInterval.High, parsed === null || parsed === void 0 ? void 0 : parsed.watchOptions, ts2.WatchType.PackageJson, resolved);
        },
        onDeleteValue: ts2.closeFileWatcher
      });
    }
    function startWatching(state, buildOrder) {
      if (!state.watchAllProjectsPending)
        return;
      state.watchAllProjectsPending = false;
      for (var _i = 0, _a = getBuildOrderFromAnyBuildOrder(buildOrder); _i < _a.length; _i++) {
        var resolved = _a[_i];
        var resolvedPath = toResolvedConfigFilePath(state, resolved);
        var cfg = parseConfigFile(state, resolved, resolvedPath);
        watchConfigFile(state, resolved, resolvedPath, cfg);
        watchExtendedConfigFiles(state, resolvedPath, cfg);
        if (cfg) {
          watchWildCardDirectories(state, resolved, resolvedPath, cfg);
          watchInputFiles(state, resolved, resolvedPath, cfg);
          watchPackageJsonFiles(state, resolved, resolvedPath, cfg);
        }
      }
    }
    function stopWatching(state) {
      ts2.clearMap(state.allWatchedConfigFiles, ts2.closeFileWatcher);
      ts2.clearMap(state.allWatchedExtendedConfigFiles, ts2.closeFileWatcherOf);
      ts2.clearMap(state.allWatchedWildcardDirectories, function(watchedWildcardDirectories) {
        return ts2.clearMap(watchedWildcardDirectories, ts2.closeFileWatcherOf);
      });
      ts2.clearMap(state.allWatchedInputFiles, function(watchedWildcardDirectories) {
        return ts2.clearMap(watchedWildcardDirectories, ts2.closeFileWatcher);
      });
      ts2.clearMap(state.allWatchedPackageJsonFiles, function(watchedPacageJsonFiles) {
        return ts2.clearMap(watchedPacageJsonFiles, ts2.closeFileWatcher);
      });
    }
    function createSolutionBuilderWorker(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions) {
      var state = createSolutionBuilderState(watch, hostOrHostWithWatch, rootNames, options, baseWatchOptions);
      return {
        build: function(project, cancellationToken, writeFile, getCustomTransformers) {
          return build(state, project, cancellationToken, writeFile, getCustomTransformers);
        },
        clean: function(project) {
          return clean(state, project);
        },
        buildReferences: function(project, cancellationToken, writeFile, getCustomTransformers) {
          return build(state, project, cancellationToken, writeFile, getCustomTransformers, true);
        },
        cleanReferences: function(project) {
          return clean(state, project, true);
        },
        getNextInvalidatedProject: function(cancellationToken) {
          setupInitialBuild(state, cancellationToken);
          return getNextInvalidatedProject(state, getBuildOrder(state), false);
        },
        getBuildOrder: function() {
          return getBuildOrder(state);
        },
        getUpToDateStatusOfProject: function(project) {
          var configFileName = resolveProjectName(state, project);
          var configFilePath = toResolvedConfigFilePath(state, configFileName);
          return getUpToDateStatus(state, parseConfigFile(state, configFileName, configFilePath), configFilePath);
        },
        invalidateProject: function(configFilePath, reloadLevel) {
          return invalidateProject(state, configFilePath, reloadLevel || ts2.ConfigFileProgramReloadLevel.None);
        },
        buildNextInvalidatedProject: function() {
          return buildNextInvalidatedProject(state);
        },
        getAllParsedConfigs: function() {
          return ts2.arrayFrom(ts2.mapDefinedIterator(state.configFileCache.values(), function(config) {
            return isParsedCommandLine(config) ? config : void 0;
          }));
        },
        close: function() {
          return stopWatching(state);
        }
      };
    }
    function relName(state, path) {
      return ts2.convertToRelativePath(path, state.currentDirectory, function(f) {
        return state.getCanonicalFileName(f);
      });
    }
    function reportStatus(state, message) {
      var args = [];
      for (var _i = 2; _i < arguments.length; _i++) {
        args[_i - 2] = arguments[_i];
      }
      state.host.reportSolutionBuilderStatus(ts2.createCompilerDiagnostic.apply(void 0, __spreadArray([message], args, false)));
    }
    function reportWatchStatus(state, message) {
      var _a, _b;
      var args = [];
      for (var _i = 2; _i < arguments.length; _i++) {
        args[_i - 2] = arguments[_i];
      }
      (_b = (_a = state.hostWithWatch).onWatchStatusChange) === null || _b === void 0 ? void 0 : _b.call(_a, ts2.createCompilerDiagnostic.apply(void 0, __spreadArray([message], args, false)), state.host.getNewLine(), state.baseCompilerOptions);
    }
    function reportErrors(_a, errors) {
      var host = _a.host;
      errors.forEach(function(err) {
        return host.reportDiagnostic(err);
      });
    }
    function reportAndStoreErrors(state, proj, errors) {
      reportErrors(state, errors);
      state.projectErrorsReported.set(proj, true);
      if (errors.length) {
        state.diagnostics.set(proj, errors);
      }
    }
    function reportParseConfigFileDiagnostic(state, proj) {
      reportAndStoreErrors(state, proj, [state.configFileCache.get(proj)]);
    }
    function reportErrorSummary(state, buildOrder) {
      if (!state.needsSummary)
        return;
      state.needsSummary = false;
      var canReportSummary = state.watch || !!state.host.reportErrorSummary;
      var diagnostics = state.diagnostics;
      var totalErrors = 0;
      if (isCircularBuildOrder(buildOrder)) {
        reportBuildQueue(state, buildOrder.buildOrder);
        reportErrors(state, buildOrder.circularDiagnostics);
        if (canReportSummary)
          totalErrors += ts2.getErrorCountForSummary(buildOrder.circularDiagnostics);
      } else {
        buildOrder.forEach(function(project) {
          var projectPath = toResolvedConfigFilePath(state, project);
          if (!state.projectErrorsReported.has(projectPath)) {
            reportErrors(state, diagnostics.get(projectPath) || ts2.emptyArray);
          }
        });
        if (canReportSummary)
          diagnostics.forEach(function(singleProjectErrors) {
            return totalErrors += ts2.getErrorCountForSummary(singleProjectErrors);
          });
      }
      if (state.watch) {
        reportWatchStatus(state, ts2.getWatchErrorSummaryDiagnosticMessage(totalErrors), totalErrors);
      } else if (state.host.reportErrorSummary) {
        state.host.reportErrorSummary(totalErrors);
      }
    }
    function reportBuildQueue(state, buildQueue) {
      if (state.options.verbose) {
        reportStatus(state, ts2.Diagnostics.Projects_in_this_build_Colon_0, buildQueue.map(function(s) {
          return "\r\n    * " + relName(state, s);
        }).join(""));
      }
    }
    function reportUpToDateStatus(state, configFileName, status) {
      if (state.options.force && (status.type === ts2.UpToDateStatusType.UpToDate || status.type === ts2.UpToDateStatusType.UpToDateWithUpstreamTypes)) {
        return reportStatus(state, ts2.Diagnostics.Project_0_is_being_forcibly_rebuilt, relName(state, configFileName));
      }
      switch (status.type) {
        case ts2.UpToDateStatusType.OutOfDateWithSelf:
          return reportStatus(state, ts2.Diagnostics.Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2, relName(state, configFileName), relName(state, status.outOfDateOutputFileName), relName(state, status.newerInputFileName));
        case ts2.UpToDateStatusType.OutOfDateWithUpstream:
          return reportStatus(state, ts2.Diagnostics.Project_0_is_out_of_date_because_oldest_output_1_is_older_than_newest_input_2, relName(state, configFileName), relName(state, status.outOfDateOutputFileName), relName(state, status.newerProjectName));
        case ts2.UpToDateStatusType.OutputMissing:
          return reportStatus(state, ts2.Diagnostics.Project_0_is_out_of_date_because_output_file_1_does_not_exist, relName(state, configFileName), relName(state, status.missingOutputFileName));
        case ts2.UpToDateStatusType.UpToDate:
          if (status.newestInputFileTime !== void 0) {
            return reportStatus(state, ts2.Diagnostics.Project_0_is_up_to_date_because_newest_input_1_is_older_than_oldest_output_2, relName(state, configFileName), relName(state, status.newestInputFileName || ""), relName(state, status.oldestOutputFileName || ""));
          }
          break;
        case ts2.UpToDateStatusType.OutOfDateWithPrepend:
          return reportStatus(state, ts2.Diagnostics.Project_0_is_out_of_date_because_output_of_its_dependency_1_has_changed, relName(state, configFileName), relName(state, status.newerProjectName));
        case ts2.UpToDateStatusType.UpToDateWithUpstreamTypes:
          return reportStatus(state, ts2.Diagnostics.Project_0_is_up_to_date_with_d_ts_files_from_its_dependencies, relName(state, configFileName));
        case ts2.UpToDateStatusType.UpstreamOutOfDate:
          return reportStatus(state, ts2.Diagnostics.Project_0_is_out_of_date_because_its_dependency_1_is_out_of_date, relName(state, configFileName), relName(state, status.upstreamProjectName));
        case ts2.UpToDateStatusType.UpstreamBlocked:
          return reportStatus(state, status.upstreamProjectBlocked ? ts2.Diagnostics.Project_0_can_t_be_built_because_its_dependency_1_was_not_built : ts2.Diagnostics.Project_0_can_t_be_built_because_its_dependency_1_has_errors, relName(state, configFileName), relName(state, status.upstreamProjectName));
        case ts2.UpToDateStatusType.Unbuildable:
          return reportStatus(state, ts2.Diagnostics.Failed_to_parse_file_0_Colon_1, relName(state, configFileName), status.reason);
        case ts2.UpToDateStatusType.TsVersionOutputOfDate:
          return reportStatus(state, ts2.Diagnostics.Project_0_is_out_of_date_because_output_for_it_was_generated_with_version_1_that_differs_with_current_version_2, relName(state, configFileName), status.version, ts2.version);
        case ts2.UpToDateStatusType.ContainerOnly:
        case ts2.UpToDateStatusType.ComputingUpstream:
          break;
        default:
          ts2.assertType(status);
      }
    }
    function verboseReportProjectStatus(state, configFileName, status) {
      if (state.options.verbose) {
        reportUpToDateStatus(state, configFileName, status);
      }
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var server;
    (function(server2) {
      server2.ActionSet = "action::set";
      server2.ActionInvalidate = "action::invalidate";
      server2.ActionPackageInstalled = "action::packageInstalled";
      server2.EventTypesRegistry = "event::typesRegistry";
      server2.EventBeginInstallTypes = "event::beginInstallTypes";
      server2.EventEndInstallTypes = "event::endInstallTypes";
      server2.EventInitializationFailed = "event::initializationFailed";
      var Arguments;
      (function(Arguments2) {
        Arguments2.GlobalCacheLocation = "--globalTypingsCacheLocation";
        Arguments2.LogFile = "--logFile";
        Arguments2.EnableTelemetry = "--enableTelemetry";
        Arguments2.TypingSafeListLocation = "--typingSafeListLocation";
        Arguments2.TypesMapLocation = "--typesMapLocation";
        Arguments2.NpmLocation = "--npmLocation";
        Arguments2.ValidateDefaultNpmLocation = "--validateDefaultNpmLocation";
      })(Arguments = server2.Arguments || (server2.Arguments = {}));
      function hasArgument(argumentName) {
        return ts2.sys.args.indexOf(argumentName) >= 0;
      }
      server2.hasArgument = hasArgument;
      function findArgument(argumentName) {
        var index = ts2.sys.args.indexOf(argumentName);
        return index >= 0 && index < ts2.sys.args.length - 1 ? ts2.sys.args[index + 1] : void 0;
      }
      server2.findArgument = findArgument;
      function nowString() {
        var d = new Date();
        return "".concat(ts2.padLeft(d.getHours().toString(), 2, "0"), ":").concat(ts2.padLeft(d.getMinutes().toString(), 2, "0"), ":").concat(ts2.padLeft(d.getSeconds().toString(), 2, "0"), ".").concat(ts2.padLeft(d.getMilliseconds().toString(), 3, "0"));
      }
      server2.nowString = nowString;
    })(server = ts2.server || (ts2.server = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var JsTyping;
    (function(JsTyping2) {
      function isTypingUpToDate(cachedTyping, availableTypingVersions) {
        var availableVersion = new ts2.Version(ts2.getProperty(availableTypingVersions, "ts".concat(ts2.versionMajorMinor)) || ts2.getProperty(availableTypingVersions, "latest"));
        return availableVersion.compareTo(cachedTyping.version) <= 0;
      }
      JsTyping2.isTypingUpToDate = isTypingUpToDate;
      var unprefixedNodeCoreModuleList = [
        "assert",
        "assert/strict",
        "async_hooks",
        "buffer",
        "child_process",
        "cluster",
        "console",
        "constants",
        "crypto",
        "dgram",
        "diagnostics_channel",
        "dns",
        "dns/promises",
        "domain",
        "events",
        "fs",
        "fs/promises",
        "http",
        "https",
        "http2",
        "inspector",
        "module",
        "net",
        "os",
        "path",
        "perf_hooks",
        "process",
        "punycode",
        "querystring",
        "readline",
        "repl",
        "stream",
        "stream/promises",
        "string_decoder",
        "timers",
        "timers/promises",
        "tls",
        "trace_events",
        "tty",
        "url",
        "util",
        "util/types",
        "v8",
        "vm",
        "wasi",
        "worker_threads",
        "zlib"
      ];
      JsTyping2.prefixedNodeCoreModuleList = unprefixedNodeCoreModuleList.map(function(name) {
        return "node:".concat(name);
      });
      JsTyping2.nodeCoreModuleList = __spreadArray(__spreadArray([], unprefixedNodeCoreModuleList, true), JsTyping2.prefixedNodeCoreModuleList, true);
      JsTyping2.nodeCoreModules = new ts2.Set(JsTyping2.nodeCoreModuleList);
      function nonRelativeModuleNameForTypingCache(moduleName) {
        return JsTyping2.nodeCoreModules.has(moduleName) ? "node" : moduleName;
      }
      JsTyping2.nonRelativeModuleNameForTypingCache = nonRelativeModuleNameForTypingCache;
      function loadSafeList(host, safeListPath) {
        var result = ts2.readConfigFile(safeListPath, function(path) {
          return host.readFile(path);
        });
        return new ts2.Map(ts2.getEntries(result.config));
      }
      JsTyping2.loadSafeList = loadSafeList;
      function loadTypesMap(host, typesMapPath) {
        var result = ts2.readConfigFile(typesMapPath, function(path) {
          return host.readFile(path);
        });
        if (result.config) {
          return new ts2.Map(ts2.getEntries(result.config.simpleMap));
        }
        return void 0;
      }
      JsTyping2.loadTypesMap = loadTypesMap;
      function discoverTypings(host, log, fileNames, projectRootPath, safeList, packageNameToTypingLocation, typeAcquisition, unresolvedImports, typesRegistry) {
        if (!typeAcquisition || !typeAcquisition.enable) {
          return { cachedTypingPaths: [], newTypingNames: [], filesToWatch: [] };
        }
        var inferredTypings = new ts2.Map();
        fileNames = ts2.mapDefined(fileNames, function(fileName) {
          var path = ts2.normalizePath(fileName);
          if (ts2.hasJSFileExtension(path)) {
            return path;
          }
        });
        var filesToWatch = [];
        if (typeAcquisition.include)
          addInferredTypings(typeAcquisition.include, "Explicitly included types");
        var exclude = typeAcquisition.exclude || [];
        var possibleSearchDirs = new ts2.Set(fileNames.map(ts2.getDirectoryPath));
        possibleSearchDirs.add(projectRootPath);
        possibleSearchDirs.forEach(function(searchDir) {
          var packageJsonPath = ts2.combinePaths(searchDir, "package.json");
          getTypingNamesFromJson(packageJsonPath, filesToWatch);
          var bowerJsonPath = ts2.combinePaths(searchDir, "bower.json");
          getTypingNamesFromJson(bowerJsonPath, filesToWatch);
          var bowerComponentsPath = ts2.combinePaths(searchDir, "bower_components");
          getTypingNamesFromPackagesFolder(bowerComponentsPath, filesToWatch);
          var nodeModulesPath = ts2.combinePaths(searchDir, "node_modules");
          getTypingNamesFromPackagesFolder(nodeModulesPath, filesToWatch);
        });
        if (!typeAcquisition.disableFilenameBasedTypeAcquisition) {
          getTypingNamesFromSourceFileNames(fileNames);
        }
        if (unresolvedImports) {
          var module_1 = ts2.deduplicate(unresolvedImports.map(nonRelativeModuleNameForTypingCache), ts2.equateStringsCaseSensitive, ts2.compareStringsCaseSensitive);
          addInferredTypings(module_1, "Inferred typings from unresolved imports");
        }
        packageNameToTypingLocation.forEach(function(typing, name) {
          var registryEntry = typesRegistry.get(name);
          if (inferredTypings.has(name) && inferredTypings.get(name) === void 0 && registryEntry !== void 0 && isTypingUpToDate(typing, registryEntry)) {
            inferredTypings.set(name, typing.typingLocation);
          }
        });
        for (var _i = 0, exclude_1 = exclude; _i < exclude_1.length; _i++) {
          var excludeTypingName = exclude_1[_i];
          var didDelete = inferredTypings.delete(excludeTypingName);
          if (didDelete && log)
            log("Typing for ".concat(excludeTypingName, " is in exclude list, will be ignored."));
        }
        var newTypingNames = [];
        var cachedTypingPaths = [];
        inferredTypings.forEach(function(inferred, typing) {
          if (inferred !== void 0) {
            cachedTypingPaths.push(inferred);
          } else {
            newTypingNames.push(typing);
          }
        });
        var result = { cachedTypingPaths, newTypingNames, filesToWatch };
        if (log)
          log("Result: ".concat(JSON.stringify(result)));
        return result;
        function addInferredTyping(typingName) {
          if (!inferredTypings.has(typingName)) {
            inferredTypings.set(typingName, void 0);
          }
        }
        function addInferredTypings(typingNames, message) {
          if (log)
            log("".concat(message, ": ").concat(JSON.stringify(typingNames)));
          ts2.forEach(typingNames, addInferredTyping);
        }
        function getTypingNamesFromJson(jsonPath, filesToWatch2) {
          if (!host.fileExists(jsonPath)) {
            return;
          }
          filesToWatch2.push(jsonPath);
          var jsonConfig = ts2.readConfigFile(jsonPath, function(path) {
            return host.readFile(path);
          }).config;
          var jsonTypingNames = ts2.flatMap([jsonConfig.dependencies, jsonConfig.devDependencies, jsonConfig.optionalDependencies, jsonConfig.peerDependencies], ts2.getOwnKeys);
          addInferredTypings(jsonTypingNames, "Typing names in '".concat(jsonPath, "' dependencies"));
        }
        function getTypingNamesFromSourceFileNames(fileNames2) {
          var fromFileNames = ts2.mapDefined(fileNames2, function(j) {
            if (!ts2.hasJSFileExtension(j))
              return void 0;
            var inferredTypingName = ts2.removeFileExtension(ts2.getBaseFileName(j.toLowerCase()));
            var cleanedTypingName = ts2.removeMinAndVersionNumbers(inferredTypingName);
            return safeList.get(cleanedTypingName);
          });
          if (fromFileNames.length) {
            addInferredTypings(fromFileNames, "Inferred typings from file names");
          }
          var hasJsxFile = ts2.some(fileNames2, function(f) {
            return ts2.fileExtensionIs(f, ".jsx");
          });
          if (hasJsxFile) {
            if (log)
              log("Inferred 'react' typings due to presence of '.jsx' extension");
            addInferredTyping("react");
          }
        }
        function getTypingNamesFromPackagesFolder(packagesFolderPath, filesToWatch2) {
          filesToWatch2.push(packagesFolderPath);
          if (!host.directoryExists(packagesFolderPath)) {
            return;
          }
          var fileNames2 = host.readDirectory(packagesFolderPath, [".json"], void 0, void 0, 2);
          if (log)
            log("Searching for typing names in ".concat(packagesFolderPath, "; all files: ").concat(JSON.stringify(fileNames2)));
          var packageNames = [];
          for (var _i2 = 0, fileNames_1 = fileNames2; _i2 < fileNames_1.length; _i2++) {
            var fileName = fileNames_1[_i2];
            var normalizedFileName = ts2.normalizePath(fileName);
            var baseFileName = ts2.getBaseFileName(normalizedFileName);
            if (baseFileName !== "package.json" && baseFileName !== "bower.json") {
              continue;
            }
            var result_1 = ts2.readConfigFile(normalizedFileName, function(path) {
              return host.readFile(path);
            });
            var packageJson = result_1.config;
            if (baseFileName === "package.json" && packageJson._requiredBy && ts2.filter(packageJson._requiredBy, function(r) {
              return r[0] === "#" || r === "/";
            }).length === 0) {
              continue;
            }
            if (!packageJson.name) {
              continue;
            }
            var ownTypes = packageJson.types || packageJson.typings;
            if (ownTypes) {
              var absolutePath = ts2.getNormalizedAbsolutePath(ownTypes, ts2.getDirectoryPath(normalizedFileName));
              if (log)
                log("    Package '".concat(packageJson.name, "' provides its own types."));
              inferredTypings.set(packageJson.name, absolutePath);
            } else {
              packageNames.push(packageJson.name);
            }
          }
          addInferredTypings(packageNames, "    Found package names");
        }
      }
      JsTyping2.discoverTypings = discoverTypings;
      var NameValidationResult;
      (function(NameValidationResult2) {
        NameValidationResult2[NameValidationResult2["Ok"] = 0] = "Ok";
        NameValidationResult2[NameValidationResult2["EmptyName"] = 1] = "EmptyName";
        NameValidationResult2[NameValidationResult2["NameTooLong"] = 2] = "NameTooLong";
        NameValidationResult2[NameValidationResult2["NameStartsWithDot"] = 3] = "NameStartsWithDot";
        NameValidationResult2[NameValidationResult2["NameStartsWithUnderscore"] = 4] = "NameStartsWithUnderscore";
        NameValidationResult2[NameValidationResult2["NameContainsNonURISafeCharacters"] = 5] = "NameContainsNonURISafeCharacters";
      })(NameValidationResult = JsTyping2.NameValidationResult || (JsTyping2.NameValidationResult = {}));
      var maxPackageNameLength = 214;
      function validatePackageName(packageName) {
        return validatePackageNameWorker(packageName, true);
      }
      JsTyping2.validatePackageName = validatePackageName;
      function validatePackageNameWorker(packageName, supportScopedPackage) {
        if (!packageName) {
          return 1;
        }
        if (packageName.length > maxPackageNameLength) {
          return 2;
        }
        if (packageName.charCodeAt(0) === 46) {
          return 3;
        }
        if (packageName.charCodeAt(0) === 95) {
          return 4;
        }
        if (supportScopedPackage) {
          var matches = /^@([^/]+)\/([^/]+)$/.exec(packageName);
          if (matches) {
            var scopeResult = validatePackageNameWorker(matches[1], false);
            if (scopeResult !== 0) {
              return { name: matches[1], isScopeName: true, result: scopeResult };
            }
            var packageResult = validatePackageNameWorker(matches[2], false);
            if (packageResult !== 0) {
              return { name: matches[2], isScopeName: false, result: packageResult };
            }
            return 0;
          }
        }
        if (encodeURIComponent(packageName) !== packageName) {
          return 5;
        }
        return 0;
      }
      function renderPackageNameValidationFailure(result, typing) {
        return typeof result === "object" ? renderPackageNameValidationFailureWorker(typing, result.result, result.name, result.isScopeName) : renderPackageNameValidationFailureWorker(typing, result, typing, false);
      }
      JsTyping2.renderPackageNameValidationFailure = renderPackageNameValidationFailure;
      function renderPackageNameValidationFailureWorker(typing, result, name, isScopeName) {
        var kind = isScopeName ? "Scope" : "Package";
        switch (result) {
          case 1:
            return "'".concat(typing, "':: ").concat(kind, " name '").concat(name, "' cannot be empty");
          case 2:
            return "'".concat(typing, "':: ").concat(kind, " name '").concat(name, "' should be less than ").concat(maxPackageNameLength, " characters");
          case 3:
            return "'".concat(typing, "':: ").concat(kind, " name '").concat(name, "' cannot start with '.'");
          case 4:
            return "'".concat(typing, "':: ").concat(kind, " name '").concat(name, "' cannot start with '_'");
          case 5:
            return "'".concat(typing, "':: ").concat(kind, " name '").concat(name, "' contains non URI safe characters");
          case 0:
            return ts2.Debug.fail();
          default:
            throw ts2.Debug.assertNever(result);
        }
      }
    })(JsTyping = ts2.JsTyping || (ts2.JsTyping = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var ScriptSnapshot;
    (function(ScriptSnapshot2) {
      var StringScriptSnapshot = function() {
        function StringScriptSnapshot2(text) {
          this.text = text;
        }
        StringScriptSnapshot2.prototype.getText = function(start, end) {
          return start === 0 && end === this.text.length ? this.text : this.text.substring(start, end);
        };
        StringScriptSnapshot2.prototype.getLength = function() {
          return this.text.length;
        };
        StringScriptSnapshot2.prototype.getChangeRange = function() {
          return void 0;
        };
        return StringScriptSnapshot2;
      }();
      function fromString(text) {
        return new StringScriptSnapshot(text);
      }
      ScriptSnapshot2.fromString = fromString;
    })(ScriptSnapshot = ts2.ScriptSnapshot || (ts2.ScriptSnapshot = {}));
    var PackageJsonDependencyGroup;
    (function(PackageJsonDependencyGroup2) {
      PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["Dependencies"] = 1] = "Dependencies";
      PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["DevDependencies"] = 2] = "DevDependencies";
      PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["PeerDependencies"] = 4] = "PeerDependencies";
      PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["OptionalDependencies"] = 8] = "OptionalDependencies";
      PackageJsonDependencyGroup2[PackageJsonDependencyGroup2["All"] = 15] = "All";
    })(PackageJsonDependencyGroup = ts2.PackageJsonDependencyGroup || (ts2.PackageJsonDependencyGroup = {}));
    var PackageJsonAutoImportPreference;
    (function(PackageJsonAutoImportPreference2) {
      PackageJsonAutoImportPreference2[PackageJsonAutoImportPreference2["Off"] = 0] = "Off";
      PackageJsonAutoImportPreference2[PackageJsonAutoImportPreference2["On"] = 1] = "On";
      PackageJsonAutoImportPreference2[PackageJsonAutoImportPreference2["Auto"] = 2] = "Auto";
    })(PackageJsonAutoImportPreference = ts2.PackageJsonAutoImportPreference || (ts2.PackageJsonAutoImportPreference = {}));
    var LanguageServiceMode;
    (function(LanguageServiceMode2) {
      LanguageServiceMode2[LanguageServiceMode2["Semantic"] = 0] = "Semantic";
      LanguageServiceMode2[LanguageServiceMode2["PartialSemantic"] = 1] = "PartialSemantic";
      LanguageServiceMode2[LanguageServiceMode2["Syntactic"] = 2] = "Syntactic";
    })(LanguageServiceMode = ts2.LanguageServiceMode || (ts2.LanguageServiceMode = {}));
    ts2.emptyOptions = {};
    var SemanticClassificationFormat;
    (function(SemanticClassificationFormat2) {
      SemanticClassificationFormat2["Original"] = "original";
      SemanticClassificationFormat2["TwentyTwenty"] = "2020";
    })(SemanticClassificationFormat = ts2.SemanticClassificationFormat || (ts2.SemanticClassificationFormat = {}));
    var CompletionTriggerKind;
    (function(CompletionTriggerKind2) {
      CompletionTriggerKind2[CompletionTriggerKind2["Invoked"] = 1] = "Invoked";
      CompletionTriggerKind2[CompletionTriggerKind2["TriggerCharacter"] = 2] = "TriggerCharacter";
      CompletionTriggerKind2[CompletionTriggerKind2["TriggerForIncompleteCompletions"] = 3] = "TriggerForIncompleteCompletions";
    })(CompletionTriggerKind = ts2.CompletionTriggerKind || (ts2.CompletionTriggerKind = {}));
    var InlayHintKind;
    (function(InlayHintKind2) {
      InlayHintKind2["Type"] = "Type";
      InlayHintKind2["Parameter"] = "Parameter";
      InlayHintKind2["Enum"] = "Enum";
    })(InlayHintKind = ts2.InlayHintKind || (ts2.InlayHintKind = {}));
    var HighlightSpanKind;
    (function(HighlightSpanKind2) {
      HighlightSpanKind2["none"] = "none";
      HighlightSpanKind2["definition"] = "definition";
      HighlightSpanKind2["reference"] = "reference";
      HighlightSpanKind2["writtenReference"] = "writtenReference";
    })(HighlightSpanKind = ts2.HighlightSpanKind || (ts2.HighlightSpanKind = {}));
    var IndentStyle2;
    (function(IndentStyle3) {
      IndentStyle3[IndentStyle3["None"] = 0] = "None";
      IndentStyle3[IndentStyle3["Block"] = 1] = "Block";
      IndentStyle3[IndentStyle3["Smart"] = 2] = "Smart";
    })(IndentStyle2 = ts2.IndentStyle || (ts2.IndentStyle = {}));
    var SemicolonPreference;
    (function(SemicolonPreference2) {
      SemicolonPreference2["Ignore"] = "ignore";
      SemicolonPreference2["Insert"] = "insert";
      SemicolonPreference2["Remove"] = "remove";
    })(SemicolonPreference = ts2.SemicolonPreference || (ts2.SemicolonPreference = {}));
    function getDefaultFormatCodeSettings(newLineCharacter) {
      return {
        indentSize: 4,
        tabSize: 4,
        newLineCharacter: newLineCharacter || "\n",
        convertTabsToSpaces: true,
        indentStyle: IndentStyle2.Smart,
        insertSpaceAfterConstructor: false,
        insertSpaceAfterCommaDelimiter: true,
        insertSpaceAfterSemicolonInForStatements: true,
        insertSpaceBeforeAndAfterBinaryOperators: true,
        insertSpaceAfterKeywordsInControlFlowStatements: true,
        insertSpaceAfterFunctionKeywordForAnonymousFunctions: false,
        insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: false,
        insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: false,
        insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,
        insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: false,
        insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces: false,
        insertSpaceBeforeFunctionParenthesis: false,
        placeOpenBraceOnNewLineForFunctions: false,
        placeOpenBraceOnNewLineForControlBlocks: false,
        semicolons: SemicolonPreference.Ignore,
        trimTrailingWhitespace: true
      };
    }
    ts2.getDefaultFormatCodeSettings = getDefaultFormatCodeSettings;
    ts2.testFormatSettings = getDefaultFormatCodeSettings("\n");
    var SymbolDisplayPartKind;
    (function(SymbolDisplayPartKind2) {
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["aliasName"] = 0] = "aliasName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["className"] = 1] = "className";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["enumName"] = 2] = "enumName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["fieldName"] = 3] = "fieldName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["interfaceName"] = 4] = "interfaceName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["keyword"] = 5] = "keyword";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["lineBreak"] = 6] = "lineBreak";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["numericLiteral"] = 7] = "numericLiteral";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["stringLiteral"] = 8] = "stringLiteral";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["localName"] = 9] = "localName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["methodName"] = 10] = "methodName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["moduleName"] = 11] = "moduleName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["operator"] = 12] = "operator";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["parameterName"] = 13] = "parameterName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["propertyName"] = 14] = "propertyName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["punctuation"] = 15] = "punctuation";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["space"] = 16] = "space";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["text"] = 17] = "text";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["typeParameterName"] = 18] = "typeParameterName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["enumMemberName"] = 19] = "enumMemberName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["functionName"] = 20] = "functionName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["regularExpressionLiteral"] = 21] = "regularExpressionLiteral";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["link"] = 22] = "link";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["linkName"] = 23] = "linkName";
      SymbolDisplayPartKind2[SymbolDisplayPartKind2["linkText"] = 24] = "linkText";
    })(SymbolDisplayPartKind = ts2.SymbolDisplayPartKind || (ts2.SymbolDisplayPartKind = {}));
    var OutliningSpanKind;
    (function(OutliningSpanKind2) {
      OutliningSpanKind2["Comment"] = "comment";
      OutliningSpanKind2["Region"] = "region";
      OutliningSpanKind2["Code"] = "code";
      OutliningSpanKind2["Imports"] = "imports";
    })(OutliningSpanKind = ts2.OutliningSpanKind || (ts2.OutliningSpanKind = {}));
    var OutputFileType;
    (function(OutputFileType2) {
      OutputFileType2[OutputFileType2["JavaScript"] = 0] = "JavaScript";
      OutputFileType2[OutputFileType2["SourceMap"] = 1] = "SourceMap";
      OutputFileType2[OutputFileType2["Declaration"] = 2] = "Declaration";
    })(OutputFileType = ts2.OutputFileType || (ts2.OutputFileType = {}));
    var EndOfLineState2;
    (function(EndOfLineState3) {
      EndOfLineState3[EndOfLineState3["None"] = 0] = "None";
      EndOfLineState3[EndOfLineState3["InMultiLineCommentTrivia"] = 1] = "InMultiLineCommentTrivia";
      EndOfLineState3[EndOfLineState3["InSingleQuoteStringLiteral"] = 2] = "InSingleQuoteStringLiteral";
      EndOfLineState3[EndOfLineState3["InDoubleQuoteStringLiteral"] = 3] = "InDoubleQuoteStringLiteral";
      EndOfLineState3[EndOfLineState3["InTemplateHeadOrNoSubstitutionTemplate"] = 4] = "InTemplateHeadOrNoSubstitutionTemplate";
      EndOfLineState3[EndOfLineState3["InTemplateMiddleOrTail"] = 5] = "InTemplateMiddleOrTail";
      EndOfLineState3[EndOfLineState3["InTemplateSubstitutionPosition"] = 6] = "InTemplateSubstitutionPosition";
    })(EndOfLineState2 = ts2.EndOfLineState || (ts2.EndOfLineState = {}));
    var TokenClass2;
    (function(TokenClass3) {
      TokenClass3[TokenClass3["Punctuation"] = 0] = "Punctuation";
      TokenClass3[TokenClass3["Keyword"] = 1] = "Keyword";
      TokenClass3[TokenClass3["Operator"] = 2] = "Operator";
      TokenClass3[TokenClass3["Comment"] = 3] = "Comment";
      TokenClass3[TokenClass3["Whitespace"] = 4] = "Whitespace";
      TokenClass3[TokenClass3["Identifier"] = 5] = "Identifier";
      TokenClass3[TokenClass3["NumberLiteral"] = 6] = "NumberLiteral";
      TokenClass3[TokenClass3["BigIntLiteral"] = 7] = "BigIntLiteral";
      TokenClass3[TokenClass3["StringLiteral"] = 8] = "StringLiteral";
      TokenClass3[TokenClass3["RegExpLiteral"] = 9] = "RegExpLiteral";
    })(TokenClass2 = ts2.TokenClass || (ts2.TokenClass = {}));
    var ScriptElementKind;
    (function(ScriptElementKind2) {
      ScriptElementKind2["unknown"] = "";
      ScriptElementKind2["warning"] = "warning";
      ScriptElementKind2["keyword"] = "keyword";
      ScriptElementKind2["scriptElement"] = "script";
      ScriptElementKind2["moduleElement"] = "module";
      ScriptElementKind2["classElement"] = "class";
      ScriptElementKind2["localClassElement"] = "local class";
      ScriptElementKind2["interfaceElement"] = "interface";
      ScriptElementKind2["typeElement"] = "type";
      ScriptElementKind2["enumElement"] = "enum";
      ScriptElementKind2["enumMemberElement"] = "enum member";
      ScriptElementKind2["variableElement"] = "var";
      ScriptElementKind2["localVariableElement"] = "local var";
      ScriptElementKind2["functionElement"] = "function";
      ScriptElementKind2["localFunctionElement"] = "local function";
      ScriptElementKind2["memberFunctionElement"] = "method";
      ScriptElementKind2["memberGetAccessorElement"] = "getter";
      ScriptElementKind2["memberSetAccessorElement"] = "setter";
      ScriptElementKind2["memberVariableElement"] = "property";
      ScriptElementKind2["constructorImplementationElement"] = "constructor";
      ScriptElementKind2["callSignatureElement"] = "call";
      ScriptElementKind2["indexSignatureElement"] = "index";
      ScriptElementKind2["constructSignatureElement"] = "construct";
      ScriptElementKind2["parameterElement"] = "parameter";
      ScriptElementKind2["typeParameterElement"] = "type parameter";
      ScriptElementKind2["primitiveType"] = "primitive type";
      ScriptElementKind2["label"] = "label";
      ScriptElementKind2["alias"] = "alias";
      ScriptElementKind2["constElement"] = "const";
      ScriptElementKind2["letElement"] = "let";
      ScriptElementKind2["directory"] = "directory";
      ScriptElementKind2["externalModuleName"] = "external module name";
      ScriptElementKind2["jsxAttribute"] = "JSX attribute";
      ScriptElementKind2["string"] = "string";
      ScriptElementKind2["link"] = "link";
      ScriptElementKind2["linkName"] = "link name";
      ScriptElementKind2["linkText"] = "link text";
    })(ScriptElementKind = ts2.ScriptElementKind || (ts2.ScriptElementKind = {}));
    var ScriptElementKindModifier;
    (function(ScriptElementKindModifier2) {
      ScriptElementKindModifier2["none"] = "";
      ScriptElementKindModifier2["publicMemberModifier"] = "public";
      ScriptElementKindModifier2["privateMemberModifier"] = "private";
      ScriptElementKindModifier2["protectedMemberModifier"] = "protected";
      ScriptElementKindModifier2["exportedModifier"] = "export";
      ScriptElementKindModifier2["ambientModifier"] = "declare";
      ScriptElementKindModifier2["staticModifier"] = "static";
      ScriptElementKindModifier2["abstractModifier"] = "abstract";
      ScriptElementKindModifier2["optionalModifier"] = "optional";
      ScriptElementKindModifier2["deprecatedModifier"] = "deprecated";
      ScriptElementKindModifier2["dtsModifier"] = ".d.ts";
      ScriptElementKindModifier2["tsModifier"] = ".ts";
      ScriptElementKindModifier2["tsxModifier"] = ".tsx";
      ScriptElementKindModifier2["jsModifier"] = ".js";
      ScriptElementKindModifier2["jsxModifier"] = ".jsx";
      ScriptElementKindModifier2["jsonModifier"] = ".json";
      ScriptElementKindModifier2["dmtsModifier"] = ".d.mts";
      ScriptElementKindModifier2["mtsModifier"] = ".mts";
      ScriptElementKindModifier2["mjsModifier"] = ".mjs";
      ScriptElementKindModifier2["dctsModifier"] = ".d.cts";
      ScriptElementKindModifier2["ctsModifier"] = ".cts";
      ScriptElementKindModifier2["cjsModifier"] = ".cjs";
    })(ScriptElementKindModifier = ts2.ScriptElementKindModifier || (ts2.ScriptElementKindModifier = {}));
    var ClassificationTypeNames;
    (function(ClassificationTypeNames2) {
      ClassificationTypeNames2["comment"] = "comment";
      ClassificationTypeNames2["identifier"] = "identifier";
      ClassificationTypeNames2["keyword"] = "keyword";
      ClassificationTypeNames2["numericLiteral"] = "number";
      ClassificationTypeNames2["bigintLiteral"] = "bigint";
      ClassificationTypeNames2["operator"] = "operator";
      ClassificationTypeNames2["stringLiteral"] = "string";
      ClassificationTypeNames2["whiteSpace"] = "whitespace";
      ClassificationTypeNames2["text"] = "text";
      ClassificationTypeNames2["punctuation"] = "punctuation";
      ClassificationTypeNames2["className"] = "class name";
      ClassificationTypeNames2["enumName"] = "enum name";
      ClassificationTypeNames2["interfaceName"] = "interface name";
      ClassificationTypeNames2["moduleName"] = "module name";
      ClassificationTypeNames2["typeParameterName"] = "type parameter name";
      ClassificationTypeNames2["typeAliasName"] = "type alias name";
      ClassificationTypeNames2["parameterName"] = "parameter name";
      ClassificationTypeNames2["docCommentTagName"] = "doc comment tag name";
      ClassificationTypeNames2["jsxOpenTagName"] = "jsx open tag name";
      ClassificationTypeNames2["jsxCloseTagName"] = "jsx close tag name";
      ClassificationTypeNames2["jsxSelfClosingTagName"] = "jsx self closing tag name";
      ClassificationTypeNames2["jsxAttribute"] = "jsx attribute";
      ClassificationTypeNames2["jsxText"] = "jsx text";
      ClassificationTypeNames2["jsxAttributeStringLiteralValue"] = "jsx attribute string literal value";
    })(ClassificationTypeNames = ts2.ClassificationTypeNames || (ts2.ClassificationTypeNames = {}));
    var ClassificationType;
    (function(ClassificationType2) {
      ClassificationType2[ClassificationType2["comment"] = 1] = "comment";
      ClassificationType2[ClassificationType2["identifier"] = 2] = "identifier";
      ClassificationType2[ClassificationType2["keyword"] = 3] = "keyword";
      ClassificationType2[ClassificationType2["numericLiteral"] = 4] = "numericLiteral";
      ClassificationType2[ClassificationType2["operator"] = 5] = "operator";
      ClassificationType2[ClassificationType2["stringLiteral"] = 6] = "stringLiteral";
      ClassificationType2[ClassificationType2["regularExpressionLiteral"] = 7] = "regularExpressionLiteral";
      ClassificationType2[ClassificationType2["whiteSpace"] = 8] = "whiteSpace";
      ClassificationType2[ClassificationType2["text"] = 9] = "text";
      ClassificationType2[ClassificationType2["punctuation"] = 10] = "punctuation";
      ClassificationType2[ClassificationType2["className"] = 11] = "className";
      ClassificationType2[ClassificationType2["enumName"] = 12] = "enumName";
      ClassificationType2[ClassificationType2["interfaceName"] = 13] = "interfaceName";
      ClassificationType2[ClassificationType2["moduleName"] = 14] = "moduleName";
      ClassificationType2[ClassificationType2["typeParameterName"] = 15] = "typeParameterName";
      ClassificationType2[ClassificationType2["typeAliasName"] = 16] = "typeAliasName";
      ClassificationType2[ClassificationType2["parameterName"] = 17] = "parameterName";
      ClassificationType2[ClassificationType2["docCommentTagName"] = 18] = "docCommentTagName";
      ClassificationType2[ClassificationType2["jsxOpenTagName"] = 19] = "jsxOpenTagName";
      ClassificationType2[ClassificationType2["jsxCloseTagName"] = 20] = "jsxCloseTagName";
      ClassificationType2[ClassificationType2["jsxSelfClosingTagName"] = 21] = "jsxSelfClosingTagName";
      ClassificationType2[ClassificationType2["jsxAttribute"] = 22] = "jsxAttribute";
      ClassificationType2[ClassificationType2["jsxText"] = 23] = "jsxText";
      ClassificationType2[ClassificationType2["jsxAttributeStringLiteralValue"] = 24] = "jsxAttributeStringLiteralValue";
      ClassificationType2[ClassificationType2["bigintLiteral"] = 25] = "bigintLiteral";
    })(ClassificationType = ts2.ClassificationType || (ts2.ClassificationType = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    ts2.scanner = ts2.createScanner(99, true);
    var SemanticMeaning;
    (function(SemanticMeaning2) {
      SemanticMeaning2[SemanticMeaning2["None"] = 0] = "None";
      SemanticMeaning2[SemanticMeaning2["Value"] = 1] = "Value";
      SemanticMeaning2[SemanticMeaning2["Type"] = 2] = "Type";
      SemanticMeaning2[SemanticMeaning2["Namespace"] = 4] = "Namespace";
      SemanticMeaning2[SemanticMeaning2["All"] = 7] = "All";
    })(SemanticMeaning = ts2.SemanticMeaning || (ts2.SemanticMeaning = {}));
    function getMeaningFromDeclaration(node) {
      switch (node.kind) {
        case 253:
          return ts2.isInJSFile(node) && ts2.getJSDocEnumTag(node) ? 7 : 1;
        case 163:
        case 202:
        case 166:
        case 165:
        case 294:
        case 295:
        case 168:
        case 167:
        case 170:
        case 171:
        case 172:
        case 255:
        case 212:
        case 213:
        case 291:
        case 284:
          return 1;
        case 162:
        case 257:
        case 258:
        case 181:
          return 2;
        case 343:
          return node.name === void 0 ? 1 | 2 : 2;
        case 297:
        case 256:
          return 1 | 2;
        case 260:
          if (ts2.isAmbientModule(node)) {
            return 4 | 1;
          } else if (ts2.getModuleInstanceState(node) === 1) {
            return 4 | 1;
          } else {
            return 4;
          }
        case 259:
        case 268:
        case 269:
        case 264:
        case 265:
        case 270:
        case 271:
          return 7;
        case 303:
          return 4 | 1;
      }
      return 7;
    }
    ts2.getMeaningFromDeclaration = getMeaningFromDeclaration;
    function getMeaningFromLocation(node) {
      node = getAdjustedReferenceLocation(node);
      var parent = node.parent;
      if (node.kind === 303) {
        return 1;
      } else if (ts2.isExportAssignment(parent) || ts2.isExportSpecifier(parent) || ts2.isExternalModuleReference(parent) || ts2.isImportSpecifier(parent) || ts2.isImportClause(parent) || ts2.isImportEqualsDeclaration(parent) && node === parent.name) {
        var decl = parent;
        while (decl) {
          if (ts2.isImportEqualsDeclaration(decl) || ts2.isImportClause(decl) || ts2.isExportDeclaration(decl)) {
            return decl.isTypeOnly ? 2 : 7;
          }
          decl = decl.parent;
        }
        return 7;
      } else if (isInRightSideOfInternalImportEqualsDeclaration(node)) {
        return getMeaningFromRightHandSideOfImportEquals(node);
      } else if (ts2.isDeclarationName(node)) {
        return getMeaningFromDeclaration(parent);
      } else if (ts2.isEntityName(node) && ts2.findAncestor(node, ts2.or(ts2.isJSDocNameReference, ts2.isJSDocLinkLike, ts2.isJSDocMemberName))) {
        return 7;
      } else if (isTypeReference(node)) {
        return 2;
      } else if (isNamespaceReference(node)) {
        return 4;
      } else if (ts2.isTypeParameterDeclaration(parent)) {
        ts2.Debug.assert(ts2.isJSDocTemplateTag(parent.parent));
        return 2;
      } else if (ts2.isLiteralTypeNode(parent)) {
        return 2 | 1;
      } else {
        return 1;
      }
    }
    ts2.getMeaningFromLocation = getMeaningFromLocation;
    function getMeaningFromRightHandSideOfImportEquals(node) {
      var name = node.kind === 160 ? node : ts2.isQualifiedName(node.parent) && node.parent.right === node ? node.parent : void 0;
      return name && name.parent.kind === 264 ? 7 : 4;
    }
    function isInRightSideOfInternalImportEqualsDeclaration(node) {
      while (node.parent.kind === 160) {
        node = node.parent;
      }
      return ts2.isInternalModuleImportEqualsDeclaration(node.parent) && node.parent.moduleReference === node;
    }
    ts2.isInRightSideOfInternalImportEqualsDeclaration = isInRightSideOfInternalImportEqualsDeclaration;
    function isNamespaceReference(node) {
      return isQualifiedNameNamespaceReference(node) || isPropertyAccessNamespaceReference(node);
    }
    function isQualifiedNameNamespaceReference(node) {
      var root = node;
      var isLastClause = true;
      if (root.parent.kind === 160) {
        while (root.parent && root.parent.kind === 160) {
          root = root.parent;
        }
        isLastClause = root.right === node;
      }
      return root.parent.kind === 177 && !isLastClause;
    }
    function isPropertyAccessNamespaceReference(node) {
      var root = node;
      var isLastClause = true;
      if (root.parent.kind === 205) {
        while (root.parent && root.parent.kind === 205) {
          root = root.parent;
        }
        isLastClause = root.name === node;
      }
      if (!isLastClause && root.parent.kind === 227 && root.parent.parent.kind === 290) {
        var decl = root.parent.parent.parent;
        return decl.kind === 256 && root.parent.parent.token === 117 || decl.kind === 257 && root.parent.parent.token === 94;
      }
      return false;
    }
    function isTypeReference(node) {
      if (ts2.isRightSideOfQualifiedNameOrPropertyAccess(node)) {
        node = node.parent;
      }
      switch (node.kind) {
        case 108:
          return !ts2.isExpressionNode(node);
        case 191:
          return true;
      }
      switch (node.parent.kind) {
        case 177:
          return true;
        case 199:
          return !node.parent.isTypeOf;
        case 227:
          return !ts2.isExpressionWithTypeArgumentsInClassExtendsClause(node.parent);
      }
      return false;
    }
    function isCallExpressionTarget(node, includeElementAccess, skipPastOuterExpressions) {
      if (includeElementAccess === void 0) {
        includeElementAccess = false;
      }
      if (skipPastOuterExpressions === void 0) {
        skipPastOuterExpressions = false;
      }
      return isCalleeWorker(node, ts2.isCallExpression, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
    }
    ts2.isCallExpressionTarget = isCallExpressionTarget;
    function isNewExpressionTarget(node, includeElementAccess, skipPastOuterExpressions) {
      if (includeElementAccess === void 0) {
        includeElementAccess = false;
      }
      if (skipPastOuterExpressions === void 0) {
        skipPastOuterExpressions = false;
      }
      return isCalleeWorker(node, ts2.isNewExpression, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
    }
    ts2.isNewExpressionTarget = isNewExpressionTarget;
    function isCallOrNewExpressionTarget(node, includeElementAccess, skipPastOuterExpressions) {
      if (includeElementAccess === void 0) {
        includeElementAccess = false;
      }
      if (skipPastOuterExpressions === void 0) {
        skipPastOuterExpressions = false;
      }
      return isCalleeWorker(node, ts2.isCallOrNewExpression, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
    }
    ts2.isCallOrNewExpressionTarget = isCallOrNewExpressionTarget;
    function isTaggedTemplateTag(node, includeElementAccess, skipPastOuterExpressions) {
      if (includeElementAccess === void 0) {
        includeElementAccess = false;
      }
      if (skipPastOuterExpressions === void 0) {
        skipPastOuterExpressions = false;
      }
      return isCalleeWorker(node, ts2.isTaggedTemplateExpression, selectTagOfTaggedTemplateExpression, includeElementAccess, skipPastOuterExpressions);
    }
    ts2.isTaggedTemplateTag = isTaggedTemplateTag;
    function isDecoratorTarget(node, includeElementAccess, skipPastOuterExpressions) {
      if (includeElementAccess === void 0) {
        includeElementAccess = false;
      }
      if (skipPastOuterExpressions === void 0) {
        skipPastOuterExpressions = false;
      }
      return isCalleeWorker(node, ts2.isDecorator, selectExpressionOfCallOrNewExpressionOrDecorator, includeElementAccess, skipPastOuterExpressions);
    }
    ts2.isDecoratorTarget = isDecoratorTarget;
    function isJsxOpeningLikeElementTagName(node, includeElementAccess, skipPastOuterExpressions) {
      if (includeElementAccess === void 0) {
        includeElementAccess = false;
      }
      if (skipPastOuterExpressions === void 0) {
        skipPastOuterExpressions = false;
      }
      return isCalleeWorker(node, ts2.isJsxOpeningLikeElement, selectTagNameOfJsxOpeningLikeElement, includeElementAccess, skipPastOuterExpressions);
    }
    ts2.isJsxOpeningLikeElementTagName = isJsxOpeningLikeElementTagName;
    function selectExpressionOfCallOrNewExpressionOrDecorator(node) {
      return node.expression;
    }
    function selectTagOfTaggedTemplateExpression(node) {
      return node.tag;
    }
    function selectTagNameOfJsxOpeningLikeElement(node) {
      return node.tagName;
    }
    function isCalleeWorker(node, pred, calleeSelector, includeElementAccess, skipPastOuterExpressions) {
      var target = includeElementAccess ? climbPastPropertyOrElementAccess(node) : climbPastPropertyAccess(node);
      if (skipPastOuterExpressions) {
        target = ts2.skipOuterExpressions(target);
      }
      return !!target && !!target.parent && pred(target.parent) && calleeSelector(target.parent) === target;
    }
    function climbPastPropertyAccess(node) {
      return isRightSideOfPropertyAccess(node) ? node.parent : node;
    }
    ts2.climbPastPropertyAccess = climbPastPropertyAccess;
    function climbPastPropertyOrElementAccess(node) {
      return isRightSideOfPropertyAccess(node) || isArgumentExpressionOfElementAccess(node) ? node.parent : node;
    }
    ts2.climbPastPropertyOrElementAccess = climbPastPropertyOrElementAccess;
    function getTargetLabel(referenceNode, labelName) {
      while (referenceNode) {
        if (referenceNode.kind === 249 && referenceNode.label.escapedText === labelName) {
          return referenceNode.label;
        }
        referenceNode = referenceNode.parent;
      }
      return void 0;
    }
    ts2.getTargetLabel = getTargetLabel;
    function hasPropertyAccessExpressionWithName(node, funcName) {
      if (!ts2.isPropertyAccessExpression(node.expression)) {
        return false;
      }
      return node.expression.name.text === funcName;
    }
    ts2.hasPropertyAccessExpressionWithName = hasPropertyAccessExpressionWithName;
    function isJumpStatementTarget(node) {
      var _a;
      return ts2.isIdentifier(node) && ((_a = ts2.tryCast(node.parent, ts2.isBreakOrContinueStatement)) === null || _a === void 0 ? void 0 : _a.label) === node;
    }
    ts2.isJumpStatementTarget = isJumpStatementTarget;
    function isLabelOfLabeledStatement(node) {
      var _a;
      return ts2.isIdentifier(node) && ((_a = ts2.tryCast(node.parent, ts2.isLabeledStatement)) === null || _a === void 0 ? void 0 : _a.label) === node;
    }
    ts2.isLabelOfLabeledStatement = isLabelOfLabeledStatement;
    function isLabelName(node) {
      return isLabelOfLabeledStatement(node) || isJumpStatementTarget(node);
    }
    ts2.isLabelName = isLabelName;
    function isTagName(node) {
      var _a;
      return ((_a = ts2.tryCast(node.parent, ts2.isJSDocTag)) === null || _a === void 0 ? void 0 : _a.tagName) === node;
    }
    ts2.isTagName = isTagName;
    function isRightSideOfQualifiedName(node) {
      var _a;
      return ((_a = ts2.tryCast(node.parent, ts2.isQualifiedName)) === null || _a === void 0 ? void 0 : _a.right) === node;
    }
    ts2.isRightSideOfQualifiedName = isRightSideOfQualifiedName;
    function isRightSideOfPropertyAccess(node) {
      var _a;
      return ((_a = ts2.tryCast(node.parent, ts2.isPropertyAccessExpression)) === null || _a === void 0 ? void 0 : _a.name) === node;
    }
    ts2.isRightSideOfPropertyAccess = isRightSideOfPropertyAccess;
    function isArgumentExpressionOfElementAccess(node) {
      var _a;
      return ((_a = ts2.tryCast(node.parent, ts2.isElementAccessExpression)) === null || _a === void 0 ? void 0 : _a.argumentExpression) === node;
    }
    ts2.isArgumentExpressionOfElementAccess = isArgumentExpressionOfElementAccess;
    function isNameOfModuleDeclaration(node) {
      var _a;
      return ((_a = ts2.tryCast(node.parent, ts2.isModuleDeclaration)) === null || _a === void 0 ? void 0 : _a.name) === node;
    }
    ts2.isNameOfModuleDeclaration = isNameOfModuleDeclaration;
    function isNameOfFunctionDeclaration(node) {
      var _a;
      return ts2.isIdentifier(node) && ((_a = ts2.tryCast(node.parent, ts2.isFunctionLike)) === null || _a === void 0 ? void 0 : _a.name) === node;
    }
    ts2.isNameOfFunctionDeclaration = isNameOfFunctionDeclaration;
    function isLiteralNameOfPropertyDeclarationOrIndexAccess(node) {
      switch (node.parent.kind) {
        case 166:
        case 165:
        case 294:
        case 297:
        case 168:
        case 167:
        case 171:
        case 172:
        case 260:
          return ts2.getNameOfDeclaration(node.parent) === node;
        case 206:
          return node.parent.argumentExpression === node;
        case 161:
          return true;
        case 195:
          return node.parent.parent.kind === 193;
        default:
          return false;
      }
    }
    ts2.isLiteralNameOfPropertyDeclarationOrIndexAccess = isLiteralNameOfPropertyDeclarationOrIndexAccess;
    function isExpressionOfExternalModuleImportEqualsDeclaration(node) {
      return ts2.isExternalModuleImportEqualsDeclaration(node.parent.parent) && ts2.getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node;
    }
    ts2.isExpressionOfExternalModuleImportEqualsDeclaration = isExpressionOfExternalModuleImportEqualsDeclaration;
    function getContainerNode(node) {
      if (ts2.isJSDocTypeAlias(node)) {
        node = node.parent.parent;
      }
      while (true) {
        node = node.parent;
        if (!node) {
          return void 0;
        }
        switch (node.kind) {
          case 303:
          case 168:
          case 167:
          case 255:
          case 212:
          case 171:
          case 172:
          case 256:
          case 257:
          case 259:
          case 260:
            return node;
        }
      }
    }
    ts2.getContainerNode = getContainerNode;
    function getNodeKind(node) {
      switch (node.kind) {
        case 303:
          return ts2.isExternalModule(node) ? "module" : "script";
        case 260:
          return "module";
        case 256:
        case 225:
          return "class";
        case 257:
          return "interface";
        case 258:
        case 336:
        case 343:
          return "type";
        case 259:
          return "enum";
        case 253:
          return getKindOfVariableDeclaration(node);
        case 202:
          return getKindOfVariableDeclaration(ts2.getRootDeclaration(node));
        case 213:
        case 255:
        case 212:
          return "function";
        case 171:
          return "getter";
        case 172:
          return "setter";
        case 168:
        case 167:
          return "method";
        case 294:
          var initializer = node.initializer;
          return ts2.isFunctionLike(initializer) ? "method" : "property";
        case 166:
        case 165:
        case 295:
        case 296:
          return "property";
        case 175:
          return "index";
        case 174:
          return "construct";
        case 173:
          return "call";
        case 170:
        case 169:
          return "constructor";
        case 162:
          return "type parameter";
        case 297:
          return "enum member";
        case 163:
          return ts2.hasSyntacticModifier(node, 16476) ? "property" : "parameter";
        case 264:
        case 269:
        case 274:
        case 267:
        case 273:
          return "alias";
        case 220:
          var kind = ts2.getAssignmentDeclarationKind(node);
          var right = node.right;
          switch (kind) {
            case 7:
            case 8:
            case 9:
            case 0:
              return "";
            case 1:
            case 2:
              var rightKind = getNodeKind(right);
              return rightKind === "" ? "const" : rightKind;
            case 3:
              return ts2.isFunctionExpression(right) ? "method" : "property";
            case 4:
              return "property";
            case 5:
              return ts2.isFunctionExpression(right) ? "method" : "property";
            case 6:
              return "local class";
            default: {
              ts2.assertType(kind);
              return "";
            }
          }
        case 79:
          return ts2.isImportClause(node.parent) ? "alias" : "";
        case 270:
          var scriptKind = getNodeKind(node.expression);
          return scriptKind === "" ? "const" : scriptKind;
        default:
          return "";
      }
      function getKindOfVariableDeclaration(v) {
        return ts2.isVarConst(v) ? "const" : ts2.isLet(v) ? "let" : "var";
      }
    }
    ts2.getNodeKind = getNodeKind;
    function isThis(node) {
      switch (node.kind) {
        case 108:
          return true;
        case 79:
          return ts2.identifierIsThisKeyword(node) && node.parent.kind === 163;
        default:
          return false;
      }
    }
    ts2.isThis = isThis;
    var tripleSlashDirectivePrefixRegex = /^\/\/\/\s*</;
    function getLineStartPositionForPosition(position, sourceFile) {
      var lineStarts = ts2.getLineStarts(sourceFile);
      var line = sourceFile.getLineAndCharacterOfPosition(position).line;
      return lineStarts[line];
    }
    ts2.getLineStartPositionForPosition = getLineStartPositionForPosition;
    function rangeContainsRange(r1, r2) {
      return startEndContainsRange(r1.pos, r1.end, r2);
    }
    ts2.rangeContainsRange = rangeContainsRange;
    function rangeContainsRangeExclusive(r1, r2) {
      return rangeContainsPositionExclusive(r1, r2.pos) && rangeContainsPositionExclusive(r1, r2.end);
    }
    ts2.rangeContainsRangeExclusive = rangeContainsRangeExclusive;
    function rangeContainsPosition(r, pos) {
      return r.pos <= pos && pos <= r.end;
    }
    ts2.rangeContainsPosition = rangeContainsPosition;
    function rangeContainsPositionExclusive(r, pos) {
      return r.pos < pos && pos < r.end;
    }
    ts2.rangeContainsPositionExclusive = rangeContainsPositionExclusive;
    function startEndContainsRange(start, end, range) {
      return start <= range.pos && end >= range.end;
    }
    ts2.startEndContainsRange = startEndContainsRange;
    function rangeContainsStartEnd(range, start, end) {
      return range.pos <= start && range.end >= end;
    }
    ts2.rangeContainsStartEnd = rangeContainsStartEnd;
    function rangeOverlapsWithStartEnd(r1, start, end) {
      return startEndOverlapsWithStartEnd(r1.pos, r1.end, start, end);
    }
    ts2.rangeOverlapsWithStartEnd = rangeOverlapsWithStartEnd;
    function nodeOverlapsWithStartEnd(node, sourceFile, start, end) {
      return startEndOverlapsWithStartEnd(node.getStart(sourceFile), node.end, start, end);
    }
    ts2.nodeOverlapsWithStartEnd = nodeOverlapsWithStartEnd;
    function startEndOverlapsWithStartEnd(start1, end1, start2, end2) {
      var start = Math.max(start1, start2);
      var end = Math.min(end1, end2);
      return start < end;
    }
    ts2.startEndOverlapsWithStartEnd = startEndOverlapsWithStartEnd;
    function positionBelongsToNode(candidate, position, sourceFile) {
      ts2.Debug.assert(candidate.pos <= position);
      return position < candidate.end || !isCompletedNode(candidate, sourceFile);
    }
    ts2.positionBelongsToNode = positionBelongsToNode;
    function isCompletedNode(n, sourceFile) {
      if (n === void 0 || ts2.nodeIsMissing(n)) {
        return false;
      }
      switch (n.kind) {
        case 256:
        case 257:
        case 259:
        case 204:
        case 200:
        case 181:
        case 234:
        case 261:
        case 262:
        case 268:
        case 272:
          return nodeEndsWith(n, 19, sourceFile);
        case 291:
          return isCompletedNode(n.block, sourceFile);
        case 208:
          if (!n.arguments) {
            return true;
          }
        case 207:
        case 211:
        case 190:
          return nodeEndsWith(n, 21, sourceFile);
        case 178:
        case 179:
          return isCompletedNode(n.type, sourceFile);
        case 170:
        case 171:
        case 172:
        case 255:
        case 212:
        case 168:
        case 167:
        case 174:
        case 173:
        case 213:
          if (n.body) {
            return isCompletedNode(n.body, sourceFile);
          }
          if (n.type) {
            return isCompletedNode(n.type, sourceFile);
          }
          return hasChildOfKind(n, 21, sourceFile);
        case 260:
          return !!n.body && isCompletedNode(n.body, sourceFile);
        case 238:
          if (n.elseStatement) {
            return isCompletedNode(n.elseStatement, sourceFile);
          }
          return isCompletedNode(n.thenStatement, sourceFile);
        case 237:
          return isCompletedNode(n.expression, sourceFile) || hasChildOfKind(n, 26, sourceFile);
        case 203:
        case 201:
        case 206:
        case 161:
        case 183:
          return nodeEndsWith(n, 23, sourceFile);
        case 175:
          if (n.type) {
            return isCompletedNode(n.type, sourceFile);
          }
          return hasChildOfKind(n, 23, sourceFile);
        case 288:
        case 289:
          return false;
        case 241:
        case 242:
        case 243:
        case 240:
          return isCompletedNode(n.statement, sourceFile);
        case 239:
          return hasChildOfKind(n, 115, sourceFile) ? nodeEndsWith(n, 21, sourceFile) : isCompletedNode(n.statement, sourceFile);
        case 180:
          return isCompletedNode(n.exprName, sourceFile);
        case 215:
        case 214:
        case 216:
        case 223:
        case 224:
          var unaryWordExpression = n;
          return isCompletedNode(unaryWordExpression.expression, sourceFile);
        case 209:
          return isCompletedNode(n.template, sourceFile);
        case 222:
          var lastSpan = ts2.lastOrUndefined(n.templateSpans);
          return isCompletedNode(lastSpan, sourceFile);
        case 232:
          return ts2.nodeIsPresent(n.literal);
        case 271:
        case 265:
          return ts2.nodeIsPresent(n.moduleSpecifier);
        case 218:
          return isCompletedNode(n.operand, sourceFile);
        case 220:
          return isCompletedNode(n.right, sourceFile);
        case 221:
          return isCompletedNode(n.whenFalse, sourceFile);
        default:
          return true;
      }
    }
    function nodeEndsWith(n, expectedLastToken, sourceFile) {
      var children = n.getChildren(sourceFile);
      if (children.length) {
        var lastChild = ts2.last(children);
        if (lastChild.kind === expectedLastToken) {
          return true;
        } else if (lastChild.kind === 26 && children.length !== 1) {
          return children[children.length - 2].kind === expectedLastToken;
        }
      }
      return false;
    }
    function findListItemInfo(node) {
      var list = findContainingList(node);
      if (!list) {
        return void 0;
      }
      var children = list.getChildren();
      var listItemIndex = ts2.indexOfNode(children, node);
      return {
        listItemIndex,
        list
      };
    }
    ts2.findListItemInfo = findListItemInfo;
    function hasChildOfKind(n, kind, sourceFile) {
      return !!findChildOfKind(n, kind, sourceFile);
    }
    ts2.hasChildOfKind = hasChildOfKind;
    function findChildOfKind(n, kind, sourceFile) {
      return ts2.find(n.getChildren(sourceFile), function(c) {
        return c.kind === kind;
      });
    }
    ts2.findChildOfKind = findChildOfKind;
    function findContainingList(node) {
      var syntaxList = ts2.find(node.parent.getChildren(), function(c) {
        return ts2.isSyntaxList(c) && rangeContainsRange(c, node);
      });
      ts2.Debug.assert(!syntaxList || ts2.contains(syntaxList.getChildren(), node));
      return syntaxList;
    }
    ts2.findContainingList = findContainingList;
    function isDefaultModifier(node) {
      return node.kind === 88;
    }
    function isClassKeyword(node) {
      return node.kind === 84;
    }
    function isFunctionKeyword(node) {
      return node.kind === 98;
    }
    function getAdjustedLocationForClass(node) {
      if (ts2.isNamedDeclaration(node)) {
        return node.name;
      }
      if (ts2.isClassDeclaration(node)) {
        var defaultModifier = node.modifiers && ts2.find(node.modifiers, isDefaultModifier);
        if (defaultModifier)
          return defaultModifier;
      }
      if (ts2.isClassExpression(node)) {
        var classKeyword = ts2.find(node.getChildren(), isClassKeyword);
        if (classKeyword)
          return classKeyword;
      }
    }
    function getAdjustedLocationForFunction(node) {
      if (ts2.isNamedDeclaration(node)) {
        return node.name;
      }
      if (ts2.isFunctionDeclaration(node)) {
        var defaultModifier = ts2.find(node.modifiers, isDefaultModifier);
        if (defaultModifier)
          return defaultModifier;
      }
      if (ts2.isFunctionExpression(node)) {
        var functionKeyword = ts2.find(node.getChildren(), isFunctionKeyword);
        if (functionKeyword)
          return functionKeyword;
      }
    }
    function getAncestorTypeNode(node) {
      var lastTypeNode;
      ts2.findAncestor(node, function(a) {
        if (ts2.isTypeNode(a)) {
          lastTypeNode = a;
        }
        return !ts2.isQualifiedName(a.parent) && !ts2.isTypeNode(a.parent) && !ts2.isTypeElement(a.parent);
      });
      return lastTypeNode;
    }
    function getContextualTypeFromParentOrAncestorTypeNode(node, checker) {
      var contextualType = getContextualTypeFromParent(node, checker);
      if (contextualType)
        return contextualType;
      var ancestorTypeNode = getAncestorTypeNode(node);
      return ancestorTypeNode && checker.getTypeAtLocation(ancestorTypeNode);
    }
    ts2.getContextualTypeFromParentOrAncestorTypeNode = getContextualTypeFromParentOrAncestorTypeNode;
    function getAdjustedLocationForDeclaration(node, forRename) {
      if (!forRename) {
        switch (node.kind) {
          case 256:
          case 225:
            return getAdjustedLocationForClass(node);
          case 255:
          case 212:
            return getAdjustedLocationForFunction(node);
        }
      }
      if (ts2.isNamedDeclaration(node)) {
        return node.name;
      }
    }
    function getAdjustedLocationForImportDeclaration(node, forRename) {
      if (node.importClause) {
        if (node.importClause.name && node.importClause.namedBindings) {
          return;
        }
        if (node.importClause.name) {
          return node.importClause.name;
        }
        if (node.importClause.namedBindings) {
          if (ts2.isNamedImports(node.importClause.namedBindings)) {
            var onlyBinding = ts2.singleOrUndefined(node.importClause.namedBindings.elements);
            if (!onlyBinding) {
              return;
            }
            return onlyBinding.name;
          } else if (ts2.isNamespaceImport(node.importClause.namedBindings)) {
            return node.importClause.namedBindings.name;
          }
        }
      }
      if (!forRename) {
        return node.moduleSpecifier;
      }
    }
    function getAdjustedLocationForExportDeclaration(node, forRename) {
      if (node.exportClause) {
        if (ts2.isNamedExports(node.exportClause)) {
          var onlyBinding = ts2.singleOrUndefined(node.exportClause.elements);
          if (!onlyBinding) {
            return;
          }
          return node.exportClause.elements[0].name;
        } else if (ts2.isNamespaceExport(node.exportClause)) {
          return node.exportClause.name;
        }
      }
      if (!forRename) {
        return node.moduleSpecifier;
      }
    }
    function getAdjustedLocationForHeritageClause(node) {
      if (node.types.length === 1) {
        return node.types[0].expression;
      }
    }
    function getAdjustedLocation(node, forRename) {
      var parent = node.parent;
      if (ts2.isModifier(node) && (forRename || node.kind !== 88) ? ts2.contains(parent.modifiers, node) : node.kind === 84 ? ts2.isClassDeclaration(parent) || ts2.isClassExpression(node) : node.kind === 98 ? ts2.isFunctionDeclaration(parent) || ts2.isFunctionExpression(node) : node.kind === 118 ? ts2.isInterfaceDeclaration(parent) : node.kind === 92 ? ts2.isEnumDeclaration(parent) : node.kind === 151 ? ts2.isTypeAliasDeclaration(parent) : node.kind === 142 || node.kind === 141 ? ts2.isModuleDeclaration(parent) : node.kind === 100 ? ts2.isImportEqualsDeclaration(parent) : node.kind === 136 ? ts2.isGetAccessorDeclaration(parent) : node.kind === 148 && ts2.isSetAccessorDeclaration(parent)) {
        var location = getAdjustedLocationForDeclaration(parent, forRename);
        if (location) {
          return location;
        }
      }
      if ((node.kind === 113 || node.kind === 85 || node.kind === 119) && ts2.isVariableDeclarationList(parent) && parent.declarations.length === 1) {
        var decl = parent.declarations[0];
        if (ts2.isIdentifier(decl.name)) {
          return decl.name;
        }
      }
      if (node.kind === 151) {
        if (ts2.isImportClause(parent) && parent.isTypeOnly) {
          var location = getAdjustedLocationForImportDeclaration(parent.parent, forRename);
          if (location) {
            return location;
          }
        }
        if (ts2.isExportDeclaration(parent) && parent.isTypeOnly) {
          var location = getAdjustedLocationForExportDeclaration(parent, forRename);
          if (location) {
            return location;
          }
        }
      }
      if (node.kind === 127) {
        if (ts2.isImportSpecifier(parent) && parent.propertyName || ts2.isExportSpecifier(parent) && parent.propertyName || ts2.isNamespaceImport(parent) || ts2.isNamespaceExport(parent)) {
          return parent.name;
        }
        if (ts2.isExportDeclaration(parent) && parent.exportClause && ts2.isNamespaceExport(parent.exportClause)) {
          return parent.exportClause.name;
        }
      }
      if (node.kind === 100 && ts2.isImportDeclaration(parent)) {
        var location = getAdjustedLocationForImportDeclaration(parent, forRename);
        if (location) {
          return location;
        }
      }
      if (node.kind === 93) {
        if (ts2.isExportDeclaration(parent)) {
          var location = getAdjustedLocationForExportDeclaration(parent, forRename);
          if (location) {
            return location;
          }
        }
        if (ts2.isExportAssignment(parent)) {
          return ts2.skipOuterExpressions(parent.expression);
        }
      }
      if (node.kind === 145 && ts2.isExternalModuleReference(parent)) {
        return parent.expression;
      }
      if (node.kind === 155 && (ts2.isImportDeclaration(parent) || ts2.isExportDeclaration(parent)) && parent.moduleSpecifier) {
        return parent.moduleSpecifier;
      }
      if ((node.kind === 94 || node.kind === 117) && ts2.isHeritageClause(parent) && parent.token === node.kind) {
        var location = getAdjustedLocationForHeritageClause(parent);
        if (location) {
          return location;
        }
      }
      if (node.kind === 94) {
        if (ts2.isTypeParameterDeclaration(parent) && parent.constraint && ts2.isTypeReferenceNode(parent.constraint)) {
          return parent.constraint.typeName;
        }
        if (ts2.isConditionalTypeNode(parent) && ts2.isTypeReferenceNode(parent.extendsType)) {
          return parent.extendsType.typeName;
        }
      }
      if (node.kind === 137 && ts2.isInferTypeNode(parent)) {
        return parent.typeParameter.name;
      }
      if (node.kind === 101 && ts2.isTypeParameterDeclaration(parent) && ts2.isMappedTypeNode(parent.parent)) {
        return parent.name;
      }
      if (node.kind === 140 && ts2.isTypeOperatorNode(parent) && parent.operator === 140 && ts2.isTypeReferenceNode(parent.type)) {
        return parent.type.typeName;
      }
      if (node.kind === 144 && ts2.isTypeOperatorNode(parent) && parent.operator === 144 && ts2.isArrayTypeNode(parent.type) && ts2.isTypeReferenceNode(parent.type.elementType)) {
        return parent.type.elementType.typeName;
      }
      if (!forRename) {
        if (node.kind === 103 && ts2.isNewExpression(parent) || node.kind === 114 && ts2.isVoidExpression(parent) || node.kind === 112 && ts2.isTypeOfExpression(parent) || node.kind === 132 && ts2.isAwaitExpression(parent) || node.kind === 125 && ts2.isYieldExpression(parent) || node.kind === 89 && ts2.isDeleteExpression(parent)) {
          if (parent.expression) {
            return ts2.skipOuterExpressions(parent.expression);
          }
        }
        if ((node.kind === 101 || node.kind === 102) && ts2.isBinaryExpression(parent) && parent.operatorToken === node) {
          return ts2.skipOuterExpressions(parent.right);
        }
        if (node.kind === 127 && ts2.isAsExpression(parent) && ts2.isTypeReferenceNode(parent.type)) {
          return parent.type.typeName;
        }
        if (node.kind === 101 && ts2.isForInStatement(parent) || node.kind === 159 && ts2.isForOfStatement(parent)) {
          return ts2.skipOuterExpressions(parent.expression);
        }
      }
      return node;
    }
    function getAdjustedReferenceLocation(node) {
      return getAdjustedLocation(node, false);
    }
    ts2.getAdjustedReferenceLocation = getAdjustedReferenceLocation;
    function getAdjustedRenameLocation(node) {
      return getAdjustedLocation(node, true);
    }
    ts2.getAdjustedRenameLocation = getAdjustedRenameLocation;
    function getTouchingPropertyName(sourceFile, position) {
      return getTouchingToken(sourceFile, position, function(n) {
        return ts2.isPropertyNameLiteral(n) || ts2.isKeyword(n.kind) || ts2.isPrivateIdentifier(n);
      });
    }
    ts2.getTouchingPropertyName = getTouchingPropertyName;
    function getTouchingToken(sourceFile, position, includePrecedingTokenAtEndPosition) {
      return getTokenAtPositionWorker(sourceFile, position, false, includePrecedingTokenAtEndPosition, false);
    }
    ts2.getTouchingToken = getTouchingToken;
    function getTokenAtPosition(sourceFile, position) {
      return getTokenAtPositionWorker(sourceFile, position, true, void 0, false);
    }
    ts2.getTokenAtPosition = getTokenAtPosition;
    function getTokenAtPositionWorker(sourceFile, position, allowPositionInLeadingTrivia, includePrecedingTokenAtEndPosition, includeEndPosition) {
      var current = sourceFile;
      var foundToken;
      var _loop_1 = function() {
        var children = current.getChildren(sourceFile);
        var i = ts2.binarySearchKey(children, position, function(_, i2) {
          return i2;
        }, function(middle, _) {
          var start = allowPositionInLeadingTrivia ? children[middle].getFullStart() : children[middle].getStart(sourceFile, true);
          if (start > position) {
            return 1;
          }
          if (nodeContainsPosition(children[middle])) {
            if (children[middle - 1]) {
              if (nodeContainsPosition(children[middle - 1])) {
                return 1;
              }
            }
            return 0;
          }
          if (includePrecedingTokenAtEndPosition && start === position && children[middle - 1] && children[middle - 1].getEnd() === position && nodeContainsPosition(children[middle - 1])) {
            return 1;
          }
          return -1;
        });
        if (foundToken) {
          return { value: foundToken };
        }
        if (i >= 0 && children[i]) {
          current = children[i];
          return "continue-outer";
        }
        return { value: current };
      };
      outer:
        while (true) {
          var state_1 = _loop_1();
          if (typeof state_1 === "object")
            return state_1.value;
          switch (state_1) {
            case "continue-outer":
              continue outer;
          }
        }
      function nodeContainsPosition(node) {
        var start = allowPositionInLeadingTrivia ? node.getFullStart() : node.getStart(sourceFile, true);
        if (start > position) {
          return false;
        }
        var end = node.getEnd();
        if (position < end || position === end && (node.kind === 1 || includeEndPosition)) {
          return true;
        } else if (includePrecedingTokenAtEndPosition && end === position) {
          var previousToken = findPrecedingToken(position, sourceFile, node);
          if (previousToken && includePrecedingTokenAtEndPosition(previousToken)) {
            foundToken = previousToken;
            return true;
          }
        }
        return false;
      }
    }
    function findFirstNonJsxWhitespaceToken(sourceFile, position) {
      var tokenAtPosition = getTokenAtPosition(sourceFile, position);
      while (isWhiteSpaceOnlyJsxText(tokenAtPosition)) {
        var nextToken = findNextToken(tokenAtPosition, tokenAtPosition.parent, sourceFile);
        if (!nextToken)
          return;
        tokenAtPosition = nextToken;
      }
      return tokenAtPosition;
    }
    ts2.findFirstNonJsxWhitespaceToken = findFirstNonJsxWhitespaceToken;
    function findTokenOnLeftOfPosition(file, position) {
      var tokenAtPosition = getTokenAtPosition(file, position);
      if (ts2.isToken(tokenAtPosition) && position > tokenAtPosition.getStart(file) && position < tokenAtPosition.getEnd()) {
        return tokenAtPosition;
      }
      return findPrecedingToken(position, file);
    }
    ts2.findTokenOnLeftOfPosition = findTokenOnLeftOfPosition;
    function findNextToken(previousToken, parent, sourceFile) {
      return find(parent);
      function find(n) {
        if (ts2.isToken(n) && n.pos === previousToken.end) {
          return n;
        }
        return ts2.firstDefined(n.getChildren(sourceFile), function(child) {
          var shouldDiveInChildNode = child.pos <= previousToken.pos && child.end > previousToken.end || child.pos === previousToken.end;
          return shouldDiveInChildNode && nodeHasTokens(child, sourceFile) ? find(child) : void 0;
        });
      }
    }
    ts2.findNextToken = findNextToken;
    function findPrecedingToken(position, sourceFile, startNode, excludeJsdoc) {
      var result = find(startNode || sourceFile);
      ts2.Debug.assert(!(result && isWhiteSpaceOnlyJsxText(result)));
      return result;
      function find(n) {
        if (isNonWhitespaceToken(n) && n.kind !== 1) {
          return n;
        }
        var children = n.getChildren(sourceFile);
        var i = ts2.binarySearchKey(children, position, function(_, i2) {
          return i2;
        }, function(middle, _) {
          if (position < children[middle].end) {
            if (!children[middle - 1] || position >= children[middle - 1].end) {
              return 0;
            }
            return 1;
          }
          return -1;
        });
        if (i >= 0 && children[i]) {
          var child = children[i];
          if (position < child.end) {
            var start = child.getStart(sourceFile, !excludeJsdoc);
            var lookInPreviousChild = start >= position || !nodeHasTokens(child, sourceFile) || isWhiteSpaceOnlyJsxText(child);
            if (lookInPreviousChild) {
              var candidate_1 = findRightmostChildNodeWithTokens(children, i, sourceFile, n.kind);
              return candidate_1 && findRightmostToken(candidate_1, sourceFile);
            } else {
              return find(child);
            }
          }
        }
        ts2.Debug.assert(startNode !== void 0 || n.kind === 303 || n.kind === 1 || ts2.isJSDocCommentContainingNode(n));
        var candidate = findRightmostChildNodeWithTokens(children, children.length, sourceFile, n.kind);
        return candidate && findRightmostToken(candidate, sourceFile);
      }
    }
    ts2.findPrecedingToken = findPrecedingToken;
    function isNonWhitespaceToken(n) {
      return ts2.isToken(n) && !isWhiteSpaceOnlyJsxText(n);
    }
    function findRightmostToken(n, sourceFile) {
      if (isNonWhitespaceToken(n)) {
        return n;
      }
      var children = n.getChildren(sourceFile);
      if (children.length === 0) {
        return n;
      }
      var candidate = findRightmostChildNodeWithTokens(children, children.length, sourceFile, n.kind);
      return candidate && findRightmostToken(candidate, sourceFile);
    }
    function findRightmostChildNodeWithTokens(children, exclusiveStartPosition, sourceFile, parentKind) {
      for (var i = exclusiveStartPosition - 1; i >= 0; i--) {
        var child = children[i];
        if (isWhiteSpaceOnlyJsxText(child)) {
          if (i === 0 && (parentKind === 11 || parentKind === 278)) {
            ts2.Debug.fail("`JsxText` tokens should not be the first child of `JsxElement | JsxSelfClosingElement`");
          }
        } else if (nodeHasTokens(children[i], sourceFile)) {
          return children[i];
        }
      }
    }
    function isInString(sourceFile, position, previousToken) {
      if (previousToken === void 0) {
        previousToken = findPrecedingToken(position, sourceFile);
      }
      if (previousToken && ts2.isStringTextContainingNode(previousToken)) {
        var start = previousToken.getStart(sourceFile);
        var end = previousToken.getEnd();
        if (start < position && position < end) {
          return true;
        }
        if (position === end) {
          return !!previousToken.isUnterminated;
        }
      }
      return false;
    }
    ts2.isInString = isInString;
    function isInsideJsxElementOrAttribute(sourceFile, position) {
      var token = getTokenAtPosition(sourceFile, position);
      if (!token) {
        return false;
      }
      if (token.kind === 11) {
        return true;
      }
      if (token.kind === 29 && token.parent.kind === 11) {
        return true;
      }
      if (token.kind === 29 && token.parent.kind === 287) {
        return true;
      }
      if (token && token.kind === 19 && token.parent.kind === 287) {
        return true;
      }
      if (token.kind === 29 && token.parent.kind === 280) {
        return true;
      }
      return false;
    }
    ts2.isInsideJsxElementOrAttribute = isInsideJsxElementOrAttribute;
    function isWhiteSpaceOnlyJsxText(node) {
      return ts2.isJsxText(node) && node.containsOnlyTriviaWhiteSpaces;
    }
    function isInTemplateString(sourceFile, position) {
      var token = getTokenAtPosition(sourceFile, position);
      return ts2.isTemplateLiteralKind(token.kind) && position > token.getStart(sourceFile);
    }
    ts2.isInTemplateString = isInTemplateString;
    function isInJSXText(sourceFile, position) {
      var token = getTokenAtPosition(sourceFile, position);
      if (ts2.isJsxText(token)) {
        return true;
      }
      if (token.kind === 18 && ts2.isJsxExpression(token.parent) && ts2.isJsxElement(token.parent.parent)) {
        return true;
      }
      if (token.kind === 29 && ts2.isJsxOpeningLikeElement(token.parent) && ts2.isJsxElement(token.parent.parent)) {
        return true;
      }
      return false;
    }
    ts2.isInJSXText = isInJSXText;
    function isInsideJsxElement(sourceFile, position) {
      function isInsideJsxElementTraversal(node) {
        while (node) {
          if (node.kind >= 278 && node.kind <= 287 || node.kind === 11 || node.kind === 29 || node.kind === 31 || node.kind === 79 || node.kind === 19 || node.kind === 18 || node.kind === 43) {
            node = node.parent;
          } else if (node.kind === 277) {
            if (position > node.getStart(sourceFile))
              return true;
            node = node.parent;
          } else {
            return false;
          }
        }
        return false;
      }
      return isInsideJsxElementTraversal(getTokenAtPosition(sourceFile, position));
    }
    ts2.isInsideJsxElement = isInsideJsxElement;
    function findPrecedingMatchingToken(token, matchingTokenKind, sourceFile) {
      var closeTokenText = ts2.tokenToString(token.kind);
      var matchingTokenText = ts2.tokenToString(matchingTokenKind);
      var tokenFullStart = token.getFullStart();
      var bestGuessIndex = sourceFile.text.lastIndexOf(matchingTokenText, tokenFullStart);
      if (bestGuessIndex === -1) {
        return void 0;
      }
      if (sourceFile.text.lastIndexOf(closeTokenText, tokenFullStart - 1) < bestGuessIndex) {
        var nodeAtGuess = findPrecedingToken(bestGuessIndex + 1, sourceFile);
        if (nodeAtGuess && nodeAtGuess.kind === matchingTokenKind) {
          return nodeAtGuess;
        }
      }
      var tokenKind = token.kind;
      var remainingMatchingTokens = 0;
      while (true) {
        var preceding = findPrecedingToken(token.getFullStart(), sourceFile);
        if (!preceding) {
          return void 0;
        }
        token = preceding;
        if (token.kind === matchingTokenKind) {
          if (remainingMatchingTokens === 0) {
            return token;
          }
          remainingMatchingTokens--;
        } else if (token.kind === tokenKind) {
          remainingMatchingTokens++;
        }
      }
    }
    ts2.findPrecedingMatchingToken = findPrecedingMatchingToken;
    function removeOptionality(type, isOptionalExpression, isOptionalChain) {
      return isOptionalExpression ? type.getNonNullableType() : isOptionalChain ? type.getNonOptionalType() : type;
    }
    ts2.removeOptionality = removeOptionality;
    function isPossiblyTypeArgumentPosition(token, sourceFile, checker) {
      var info = getPossibleTypeArgumentsInfo(token, sourceFile);
      return info !== void 0 && (ts2.isPartOfTypeNode(info.called) || getPossibleGenericSignatures(info.called, info.nTypeArguments, checker).length !== 0 || isPossiblyTypeArgumentPosition(info.called, sourceFile, checker));
    }
    ts2.isPossiblyTypeArgumentPosition = isPossiblyTypeArgumentPosition;
    function getPossibleGenericSignatures(called, typeArgumentCount, checker) {
      var type = checker.getTypeAtLocation(called);
      if (ts2.isOptionalChain(called.parent)) {
        type = removeOptionality(type, ts2.isOptionalChainRoot(called.parent), true);
      }
      var signatures = ts2.isNewExpression(called.parent) ? type.getConstructSignatures() : type.getCallSignatures();
      return signatures.filter(function(candidate) {
        return !!candidate.typeParameters && candidate.typeParameters.length >= typeArgumentCount;
      });
    }
    ts2.getPossibleGenericSignatures = getPossibleGenericSignatures;
    function getPossibleTypeArgumentsInfo(tokenIn, sourceFile) {
      if (sourceFile.text.lastIndexOf("<", tokenIn ? tokenIn.pos : sourceFile.text.length) === -1) {
        return void 0;
      }
      var token = tokenIn;
      var remainingLessThanTokens = 0;
      var nTypeArguments = 0;
      while (token) {
        switch (token.kind) {
          case 29:
            token = findPrecedingToken(token.getFullStart(), sourceFile);
            if (token && token.kind === 28) {
              token = findPrecedingToken(token.getFullStart(), sourceFile);
            }
            if (!token || !ts2.isIdentifier(token))
              return void 0;
            if (!remainingLessThanTokens) {
              return ts2.isDeclarationName(token) ? void 0 : { called: token, nTypeArguments };
            }
            remainingLessThanTokens--;
            break;
          case 49:
            remainingLessThanTokens = 3;
            break;
          case 48:
            remainingLessThanTokens = 2;
            break;
          case 31:
            remainingLessThanTokens++;
            break;
          case 19:
            token = findPrecedingMatchingToken(token, 18, sourceFile);
            if (!token)
              return void 0;
            break;
          case 21:
            token = findPrecedingMatchingToken(token, 20, sourceFile);
            if (!token)
              return void 0;
            break;
          case 23:
            token = findPrecedingMatchingToken(token, 22, sourceFile);
            if (!token)
              return void 0;
            break;
          case 27:
            nTypeArguments++;
            break;
          case 38:
          case 79:
          case 10:
          case 8:
          case 9:
          case 110:
          case 95:
          case 112:
          case 94:
          case 140:
          case 24:
          case 51:
          case 57:
          case 58:
            break;
          default:
            if (ts2.isTypeNode(token)) {
              break;
            }
            return void 0;
        }
        token = findPrecedingToken(token.getFullStart(), sourceFile);
      }
      return void 0;
    }
    ts2.getPossibleTypeArgumentsInfo = getPossibleTypeArgumentsInfo;
    function isInComment(sourceFile, position, tokenAtPosition) {
      return ts2.formatting.getRangeOfEnclosingComment(sourceFile, position, void 0, tokenAtPosition);
    }
    ts2.isInComment = isInComment;
    function hasDocComment(sourceFile, position) {
      var token = getTokenAtPosition(sourceFile, position);
      return !!ts2.findAncestor(token, ts2.isJSDoc);
    }
    ts2.hasDocComment = hasDocComment;
    function nodeHasTokens(n, sourceFile) {
      return n.kind === 1 ? !!n.jsDoc : n.getWidth(sourceFile) !== 0;
    }
    function getNodeModifiers(node, excludeFlags) {
      if (excludeFlags === void 0) {
        excludeFlags = 0;
      }
      var result = [];
      var flags = ts2.isDeclaration(node) ? ts2.getCombinedNodeFlagsAlwaysIncludeJSDoc(node) & ~excludeFlags : 0;
      if (flags & 8)
        result.push("private");
      if (flags & 16)
        result.push("protected");
      if (flags & 4)
        result.push("public");
      if (flags & 32 || ts2.isClassStaticBlockDeclaration(node))
        result.push("static");
      if (flags & 128)
        result.push("abstract");
      if (flags & 1)
        result.push("export");
      if (flags & 8192)
        result.push("deprecated");
      if (node.flags & 8388608)
        result.push("declare");
      if (node.kind === 270)
        result.push("export");
      return result.length > 0 ? result.join(",") : "";
    }
    ts2.getNodeModifiers = getNodeModifiers;
    function getTypeArgumentOrTypeParameterList(node) {
      if (node.kind === 177 || node.kind === 207) {
        return node.typeArguments;
      }
      if (ts2.isFunctionLike(node) || node.kind === 256 || node.kind === 257) {
        return node.typeParameters;
      }
      return void 0;
    }
    ts2.getTypeArgumentOrTypeParameterList = getTypeArgumentOrTypeParameterList;
    function isComment(kind) {
      return kind === 2 || kind === 3;
    }
    ts2.isComment = isComment;
    function isStringOrRegularExpressionOrTemplateLiteral(kind) {
      if (kind === 10 || kind === 13 || ts2.isTemplateLiteralKind(kind)) {
        return true;
      }
      return false;
    }
    ts2.isStringOrRegularExpressionOrTemplateLiteral = isStringOrRegularExpressionOrTemplateLiteral;
    function isPunctuation(kind) {
      return 18 <= kind && kind <= 78;
    }
    ts2.isPunctuation = isPunctuation;
    function isInsideTemplateLiteral(node, position, sourceFile) {
      return ts2.isTemplateLiteralKind(node.kind) && (node.getStart(sourceFile) < position && position < node.end) || !!node.isUnterminated && position === node.end;
    }
    ts2.isInsideTemplateLiteral = isInsideTemplateLiteral;
    function isAccessibilityModifier(kind) {
      switch (kind) {
        case 123:
        case 121:
        case 122:
          return true;
      }
      return false;
    }
    ts2.isAccessibilityModifier = isAccessibilityModifier;
    function cloneCompilerOptions(options) {
      var result = ts2.clone(options);
      ts2.setConfigFileInOptions(result, options && options.configFile);
      return result;
    }
    ts2.cloneCompilerOptions = cloneCompilerOptions;
    function isArrayLiteralOrObjectLiteralDestructuringPattern(node) {
      if (node.kind === 203 || node.kind === 204) {
        if (node.parent.kind === 220 && node.parent.left === node && node.parent.operatorToken.kind === 63) {
          return true;
        }
        if (node.parent.kind === 243 && node.parent.initializer === node) {
          return true;
        }
        if (isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent.kind === 294 ? node.parent.parent : node.parent)) {
          return true;
        }
      }
      return false;
    }
    ts2.isArrayLiteralOrObjectLiteralDestructuringPattern = isArrayLiteralOrObjectLiteralDestructuringPattern;
    function isInReferenceComment(sourceFile, position) {
      return isInReferenceCommentWorker(sourceFile, position, true);
    }
    ts2.isInReferenceComment = isInReferenceComment;
    function isInNonReferenceComment(sourceFile, position) {
      return isInReferenceCommentWorker(sourceFile, position, false);
    }
    ts2.isInNonReferenceComment = isInNonReferenceComment;
    function isInReferenceCommentWorker(sourceFile, position, shouldBeReference) {
      var range = isInComment(sourceFile, position, void 0);
      return !!range && shouldBeReference === tripleSlashDirectivePrefixRegex.test(sourceFile.text.substring(range.pos, range.end));
    }
    function getReplacementSpanForContextToken(contextToken) {
      if (!contextToken)
        return void 0;
      switch (contextToken.kind) {
        case 10:
        case 14:
          return createTextSpanFromStringLiteralLikeContent(contextToken);
        default:
          return createTextSpanFromNode(contextToken);
      }
    }
    ts2.getReplacementSpanForContextToken = getReplacementSpanForContextToken;
    function createTextSpanFromNode(node, sourceFile, endNode) {
      return ts2.createTextSpanFromBounds(node.getStart(sourceFile), (endNode || node).getEnd());
    }
    ts2.createTextSpanFromNode = createTextSpanFromNode;
    function createTextSpanFromStringLiteralLikeContent(node) {
      if (node.isUnterminated)
        return void 0;
      return ts2.createTextSpanFromBounds(node.getStart() + 1, node.getEnd() - 1);
    }
    ts2.createTextSpanFromStringLiteralLikeContent = createTextSpanFromStringLiteralLikeContent;
    function createTextRangeFromNode(node, sourceFile) {
      return ts2.createRange(node.getStart(sourceFile), node.end);
    }
    ts2.createTextRangeFromNode = createTextRangeFromNode;
    function createTextSpanFromRange(range) {
      return ts2.createTextSpanFromBounds(range.pos, range.end);
    }
    ts2.createTextSpanFromRange = createTextSpanFromRange;
    function createTextRangeFromSpan(span) {
      return ts2.createRange(span.start, span.start + span.length);
    }
    ts2.createTextRangeFromSpan = createTextRangeFromSpan;
    function createTextChangeFromStartLength(start, length, newText) {
      return createTextChange(ts2.createTextSpan(start, length), newText);
    }
    ts2.createTextChangeFromStartLength = createTextChangeFromStartLength;
    function createTextChange(span, newText) {
      return { span, newText };
    }
    ts2.createTextChange = createTextChange;
    ts2.typeKeywords = [
      130,
      128,
      157,
      133,
      95,
      137,
      140,
      143,
      104,
      146,
      147,
      144,
      149,
      150,
      110,
      114,
      152,
      153,
      154
    ];
    function isTypeKeyword(kind) {
      return ts2.contains(ts2.typeKeywords, kind);
    }
    ts2.isTypeKeyword = isTypeKeyword;
    function isTypeKeywordToken(node) {
      return node.kind === 151;
    }
    ts2.isTypeKeywordToken = isTypeKeywordToken;
    function isTypeKeywordTokenOrIdentifier(node) {
      return isTypeKeywordToken(node) || ts2.isIdentifier(node) && node.text === "type";
    }
    ts2.isTypeKeywordTokenOrIdentifier = isTypeKeywordTokenOrIdentifier;
    function isExternalModuleSymbol(moduleSymbol) {
      return !!(moduleSymbol.flags & 1536) && moduleSymbol.name.charCodeAt(0) === 34;
    }
    ts2.isExternalModuleSymbol = isExternalModuleSymbol;
    function nodeSeenTracker() {
      var seen = [];
      return function(node) {
        var id = ts2.getNodeId(node);
        return !seen[id] && (seen[id] = true);
      };
    }
    ts2.nodeSeenTracker = nodeSeenTracker;
    function getSnapshotText(snap) {
      return snap.getText(0, snap.getLength());
    }
    ts2.getSnapshotText = getSnapshotText;
    function repeatString(str, count) {
      var result = "";
      for (var i = 0; i < count; i++) {
        result += str;
      }
      return result;
    }
    ts2.repeatString = repeatString;
    function skipConstraint(type) {
      return type.isTypeParameter() ? type.getConstraint() || type : type;
    }
    ts2.skipConstraint = skipConstraint;
    function getNameFromPropertyName(name) {
      return name.kind === 161 ? ts2.isStringOrNumericLiteralLike(name.expression) ? name.expression.text : void 0 : ts2.isPrivateIdentifier(name) ? ts2.idText(name) : ts2.getTextOfIdentifierOrLiteral(name);
    }
    ts2.getNameFromPropertyName = getNameFromPropertyName;
    function programContainsModules(program) {
      return program.getSourceFiles().some(function(s) {
        return !s.isDeclarationFile && !program.isSourceFileFromExternalLibrary(s) && !!(s.externalModuleIndicator || s.commonJsModuleIndicator);
      });
    }
    ts2.programContainsModules = programContainsModules;
    function programContainsEsModules(program) {
      return program.getSourceFiles().some(function(s) {
        return !s.isDeclarationFile && !program.isSourceFileFromExternalLibrary(s) && !!s.externalModuleIndicator;
      });
    }
    ts2.programContainsEsModules = programContainsEsModules;
    function compilerOptionsIndicateEsModules(compilerOptions) {
      return !!compilerOptions.module || ts2.getEmitScriptTarget(compilerOptions) >= 2 || !!compilerOptions.noEmit;
    }
    ts2.compilerOptionsIndicateEsModules = compilerOptionsIndicateEsModules;
    function createModuleSpecifierResolutionHost(program, host) {
      return {
        fileExists: function(fileName) {
          return program.fileExists(fileName);
        },
        getCurrentDirectory: function() {
          return host.getCurrentDirectory();
        },
        readFile: ts2.maybeBind(host, host.readFile),
        useCaseSensitiveFileNames: ts2.maybeBind(host, host.useCaseSensitiveFileNames),
        getSymlinkCache: ts2.maybeBind(host, host.getSymlinkCache) || program.getSymlinkCache,
        getModuleSpecifierCache: ts2.maybeBind(host, host.getModuleSpecifierCache),
        getGlobalTypingsCacheLocation: ts2.maybeBind(host, host.getGlobalTypingsCacheLocation),
        redirectTargetsMap: program.redirectTargetsMap,
        getProjectReferenceRedirect: function(fileName) {
          return program.getProjectReferenceRedirect(fileName);
        },
        isSourceOfProjectReferenceRedirect: function(fileName) {
          return program.isSourceOfProjectReferenceRedirect(fileName);
        },
        getNearestAncestorDirectoryWithPackageJson: ts2.maybeBind(host, host.getNearestAncestorDirectoryWithPackageJson),
        getFileIncludeReasons: function() {
          return program.getFileIncludeReasons();
        }
      };
    }
    ts2.createModuleSpecifierResolutionHost = createModuleSpecifierResolutionHost;
    function getModuleSpecifierResolverHost(program, host) {
      return __assign(__assign({}, createModuleSpecifierResolutionHost(program, host)), { getCommonSourceDirectory: function() {
        return program.getCommonSourceDirectory();
      } });
    }
    ts2.getModuleSpecifierResolverHost = getModuleSpecifierResolverHost;
    function makeImportIfNecessary(defaultImport, namedImports, moduleSpecifier, quotePreference) {
      return defaultImport || namedImports && namedImports.length ? makeImport(defaultImport, namedImports, moduleSpecifier, quotePreference) : void 0;
    }
    ts2.makeImportIfNecessary = makeImportIfNecessary;
    function makeImport(defaultImport, namedImports, moduleSpecifier, quotePreference, isTypeOnly) {
      return ts2.factory.createImportDeclaration(void 0, void 0, defaultImport || namedImports ? ts2.factory.createImportClause(!!isTypeOnly, defaultImport, namedImports && namedImports.length ? ts2.factory.createNamedImports(namedImports) : void 0) : void 0, typeof moduleSpecifier === "string" ? makeStringLiteral(moduleSpecifier, quotePreference) : moduleSpecifier, void 0);
    }
    ts2.makeImport = makeImport;
    function makeStringLiteral(text, quotePreference) {
      return ts2.factory.createStringLiteral(text, quotePreference === 0);
    }
    ts2.makeStringLiteral = makeStringLiteral;
    var QuotePreference;
    (function(QuotePreference2) {
      QuotePreference2[QuotePreference2["Single"] = 0] = "Single";
      QuotePreference2[QuotePreference2["Double"] = 1] = "Double";
    })(QuotePreference = ts2.QuotePreference || (ts2.QuotePreference = {}));
    function quotePreferenceFromString(str, sourceFile) {
      return ts2.isStringDoubleQuoted(str, sourceFile) ? 1 : 0;
    }
    ts2.quotePreferenceFromString = quotePreferenceFromString;
    function getQuotePreference(sourceFile, preferences) {
      if (preferences.quotePreference && preferences.quotePreference !== "auto") {
        return preferences.quotePreference === "single" ? 0 : 1;
      } else {
        var firstModuleSpecifier = sourceFile.imports && ts2.find(sourceFile.imports, function(n) {
          return ts2.isStringLiteral(n) && !ts2.nodeIsSynthesized(n.parent);
        });
        return firstModuleSpecifier ? quotePreferenceFromString(firstModuleSpecifier, sourceFile) : 1;
      }
    }
    ts2.getQuotePreference = getQuotePreference;
    function getQuoteFromPreference(qp) {
      switch (qp) {
        case 0:
          return "'";
        case 1:
          return '"';
        default:
          return ts2.Debug.assertNever(qp);
      }
    }
    ts2.getQuoteFromPreference = getQuoteFromPreference;
    function symbolNameNoDefault(symbol) {
      var escaped = symbolEscapedNameNoDefault(symbol);
      return escaped === void 0 ? void 0 : ts2.unescapeLeadingUnderscores(escaped);
    }
    ts2.symbolNameNoDefault = symbolNameNoDefault;
    function symbolEscapedNameNoDefault(symbol) {
      if (symbol.escapedName !== "default") {
        return symbol.escapedName;
      }
      return ts2.firstDefined(symbol.declarations, function(decl) {
        var name = ts2.getNameOfDeclaration(decl);
        return name && name.kind === 79 ? name.escapedText : void 0;
      });
    }
    ts2.symbolEscapedNameNoDefault = symbolEscapedNameNoDefault;
    function isModuleSpecifierLike(node) {
      return ts2.isStringLiteralLike(node) && (ts2.isExternalModuleReference(node.parent) || ts2.isImportDeclaration(node.parent) || ts2.isRequireCall(node.parent, false) && node.parent.arguments[0] === node || ts2.isImportCall(node.parent) && node.parent.arguments[0] === node);
    }
    ts2.isModuleSpecifierLike = isModuleSpecifierLike;
    function isObjectBindingElementWithoutPropertyName(bindingElement) {
      return ts2.isBindingElement(bindingElement) && ts2.isObjectBindingPattern(bindingElement.parent) && ts2.isIdentifier(bindingElement.name) && !bindingElement.propertyName;
    }
    ts2.isObjectBindingElementWithoutPropertyName = isObjectBindingElementWithoutPropertyName;
    function getPropertySymbolFromBindingElement(checker, bindingElement) {
      var typeOfPattern = checker.getTypeAtLocation(bindingElement.parent);
      return typeOfPattern && checker.getPropertyOfType(typeOfPattern, bindingElement.name.text);
    }
    ts2.getPropertySymbolFromBindingElement = getPropertySymbolFromBindingElement;
    function getParentNodeInSpan(node, file, span) {
      if (!node)
        return void 0;
      while (node.parent) {
        if (ts2.isSourceFile(node.parent) || !spanContainsNode(span, node.parent, file)) {
          return node;
        }
        node = node.parent;
      }
    }
    ts2.getParentNodeInSpan = getParentNodeInSpan;
    function spanContainsNode(span, node, file) {
      return ts2.textSpanContainsPosition(span, node.getStart(file)) && node.getEnd() <= ts2.textSpanEnd(span);
    }
    function findModifier(node, kind) {
      return node.modifiers && ts2.find(node.modifiers, function(m) {
        return m.kind === kind;
      });
    }
    ts2.findModifier = findModifier;
    function insertImports(changes, sourceFile, imports, blankLineBetween) {
      var decl = ts2.isArray(imports) ? imports[0] : imports;
      var importKindPredicate = decl.kind === 236 ? ts2.isRequireVariableStatement : ts2.isAnyImportSyntax;
      var existingImportStatements = ts2.filter(sourceFile.statements, importKindPredicate);
      var sortedNewImports = ts2.isArray(imports) ? ts2.stableSort(imports, ts2.OrganizeImports.compareImportsOrRequireStatements) : [imports];
      if (!existingImportStatements.length) {
        changes.insertNodesAtTopOfFile(sourceFile, sortedNewImports, blankLineBetween);
      } else if (existingImportStatements && ts2.OrganizeImports.importsAreSorted(existingImportStatements)) {
        for (var _i = 0, sortedNewImports_1 = sortedNewImports; _i < sortedNewImports_1.length; _i++) {
          var newImport = sortedNewImports_1[_i];
          var insertionIndex = ts2.OrganizeImports.getImportDeclarationInsertionIndex(existingImportStatements, newImport);
          if (insertionIndex === 0) {
            var options = existingImportStatements[0] === sourceFile.statements[0] ? { leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.Exclude } : {};
            changes.insertNodeBefore(sourceFile, existingImportStatements[0], newImport, false, options);
          } else {
            var prevImport = existingImportStatements[insertionIndex - 1];
            changes.insertNodeAfter(sourceFile, prevImport, newImport);
          }
        }
      } else {
        var lastExistingImport = ts2.lastOrUndefined(existingImportStatements);
        if (lastExistingImport) {
          changes.insertNodesAfter(sourceFile, lastExistingImport, sortedNewImports);
        } else {
          changes.insertNodesAtTopOfFile(sourceFile, sortedNewImports, blankLineBetween);
        }
      }
    }
    ts2.insertImports = insertImports;
    function getTypeKeywordOfTypeOnlyImport(importClause, sourceFile) {
      ts2.Debug.assert(importClause.isTypeOnly);
      return ts2.cast(importClause.getChildAt(0, sourceFile), isTypeKeywordToken);
    }
    ts2.getTypeKeywordOfTypeOnlyImport = getTypeKeywordOfTypeOnlyImport;
    function textSpansEqual(a, b) {
      return !!a && !!b && a.start === b.start && a.length === b.length;
    }
    ts2.textSpansEqual = textSpansEqual;
    function documentSpansEqual(a, b) {
      return a.fileName === b.fileName && textSpansEqual(a.textSpan, b.textSpan);
    }
    ts2.documentSpansEqual = documentSpansEqual;
    function forEachUnique(array, callback) {
      if (array) {
        for (var i = 0; i < array.length; i++) {
          if (array.indexOf(array[i]) === i) {
            var result = callback(array[i], i);
            if (result) {
              return result;
            }
          }
        }
      }
      return void 0;
    }
    ts2.forEachUnique = forEachUnique;
    function isTextWhiteSpaceLike(text, startPos, endPos) {
      for (var i = startPos; i < endPos; i++) {
        if (!ts2.isWhiteSpaceLike(text.charCodeAt(i))) {
          return false;
        }
      }
      return true;
    }
    ts2.isTextWhiteSpaceLike = isTextWhiteSpaceLike;
    function isFirstDeclarationOfSymbolParameter(symbol) {
      var declaration = symbol.declarations ? ts2.firstOrUndefined(symbol.declarations) : void 0;
      return !!ts2.findAncestor(declaration, function(n) {
        return ts2.isParameter(n) ? true : ts2.isBindingElement(n) || ts2.isObjectBindingPattern(n) || ts2.isArrayBindingPattern(n) ? false : "quit";
      });
    }
    ts2.isFirstDeclarationOfSymbolParameter = isFirstDeclarationOfSymbolParameter;
    var displayPartWriter = getDisplayPartWriter();
    function getDisplayPartWriter() {
      var absoluteMaximumLength = ts2.defaultMaximumTruncationLength * 10;
      var displayParts;
      var lineStart;
      var indent;
      var length;
      resetWriter();
      var unknownWrite = function(text) {
        return writeKind(text, ts2.SymbolDisplayPartKind.text);
      };
      return {
        displayParts: function() {
          var finalText = displayParts.length && displayParts[displayParts.length - 1].text;
          if (length > absoluteMaximumLength && finalText && finalText !== "...") {
            if (!ts2.isWhiteSpaceLike(finalText.charCodeAt(finalText.length - 1))) {
              displayParts.push(displayPart(" ", ts2.SymbolDisplayPartKind.space));
            }
            displayParts.push(displayPart("...", ts2.SymbolDisplayPartKind.punctuation));
          }
          return displayParts;
        },
        writeKeyword: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.keyword);
        },
        writeOperator: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.operator);
        },
        writePunctuation: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.punctuation);
        },
        writeTrailingSemicolon: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.punctuation);
        },
        writeSpace: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.space);
        },
        writeStringLiteral: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.stringLiteral);
        },
        writeParameter: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.parameterName);
        },
        writeProperty: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.propertyName);
        },
        writeLiteral: function(text) {
          return writeKind(text, ts2.SymbolDisplayPartKind.stringLiteral);
        },
        writeSymbol,
        writeLine,
        write: unknownWrite,
        writeComment: unknownWrite,
        getText: function() {
          return "";
        },
        getTextPos: function() {
          return 0;
        },
        getColumn: function() {
          return 0;
        },
        getLine: function() {
          return 0;
        },
        isAtStartOfLine: function() {
          return false;
        },
        hasTrailingWhitespace: function() {
          return false;
        },
        hasTrailingComment: function() {
          return false;
        },
        rawWrite: ts2.notImplemented,
        getIndent: function() {
          return indent;
        },
        increaseIndent: function() {
          indent++;
        },
        decreaseIndent: function() {
          indent--;
        },
        clear: resetWriter,
        trackSymbol: function() {
          return false;
        },
        reportInaccessibleThisError: ts2.noop,
        reportInaccessibleUniqueSymbolError: ts2.noop,
        reportPrivateInBaseOfClassExpression: ts2.noop
      };
      function writeIndent() {
        if (length > absoluteMaximumLength)
          return;
        if (lineStart) {
          var indentString = ts2.getIndentString(indent);
          if (indentString) {
            length += indentString.length;
            displayParts.push(displayPart(indentString, ts2.SymbolDisplayPartKind.space));
          }
          lineStart = false;
        }
      }
      function writeKind(text, kind) {
        if (length > absoluteMaximumLength)
          return;
        writeIndent();
        length += text.length;
        displayParts.push(displayPart(text, kind));
      }
      function writeSymbol(text, symbol) {
        if (length > absoluteMaximumLength)
          return;
        writeIndent();
        length += text.length;
        displayParts.push(symbolPart(text, symbol));
      }
      function writeLine() {
        if (length > absoluteMaximumLength)
          return;
        length += 1;
        displayParts.push(lineBreakPart());
        lineStart = true;
      }
      function resetWriter() {
        displayParts = [];
        lineStart = true;
        indent = 0;
        length = 0;
      }
    }
    function symbolPart(text, symbol) {
      return displayPart(text, displayPartKind(symbol));
      function displayPartKind(symbol2) {
        var flags = symbol2.flags;
        if (flags & 3) {
          return isFirstDeclarationOfSymbolParameter(symbol2) ? ts2.SymbolDisplayPartKind.parameterName : ts2.SymbolDisplayPartKind.localName;
        }
        if (flags & 4)
          return ts2.SymbolDisplayPartKind.propertyName;
        if (flags & 32768)
          return ts2.SymbolDisplayPartKind.propertyName;
        if (flags & 65536)
          return ts2.SymbolDisplayPartKind.propertyName;
        if (flags & 8)
          return ts2.SymbolDisplayPartKind.enumMemberName;
        if (flags & 16)
          return ts2.SymbolDisplayPartKind.functionName;
        if (flags & 32)
          return ts2.SymbolDisplayPartKind.className;
        if (flags & 64)
          return ts2.SymbolDisplayPartKind.interfaceName;
        if (flags & 384)
          return ts2.SymbolDisplayPartKind.enumName;
        if (flags & 1536)
          return ts2.SymbolDisplayPartKind.moduleName;
        if (flags & 8192)
          return ts2.SymbolDisplayPartKind.methodName;
        if (flags & 262144)
          return ts2.SymbolDisplayPartKind.typeParameterName;
        if (flags & 524288)
          return ts2.SymbolDisplayPartKind.aliasName;
        if (flags & 2097152)
          return ts2.SymbolDisplayPartKind.aliasName;
        return ts2.SymbolDisplayPartKind.text;
      }
    }
    ts2.symbolPart = symbolPart;
    function displayPart(text, kind) {
      return { text, kind: ts2.SymbolDisplayPartKind[kind] };
    }
    ts2.displayPart = displayPart;
    function spacePart() {
      return displayPart(" ", ts2.SymbolDisplayPartKind.space);
    }
    ts2.spacePart = spacePart;
    function keywordPart(kind) {
      return displayPart(ts2.tokenToString(kind), ts2.SymbolDisplayPartKind.keyword);
    }
    ts2.keywordPart = keywordPart;
    function punctuationPart(kind) {
      return displayPart(ts2.tokenToString(kind), ts2.SymbolDisplayPartKind.punctuation);
    }
    ts2.punctuationPart = punctuationPart;
    function operatorPart(kind) {
      return displayPart(ts2.tokenToString(kind), ts2.SymbolDisplayPartKind.operator);
    }
    ts2.operatorPart = operatorPart;
    function parameterNamePart(text) {
      return displayPart(text, ts2.SymbolDisplayPartKind.parameterName);
    }
    ts2.parameterNamePart = parameterNamePart;
    function propertyNamePart(text) {
      return displayPart(text, ts2.SymbolDisplayPartKind.propertyName);
    }
    ts2.propertyNamePart = propertyNamePart;
    function textOrKeywordPart(text) {
      var kind = ts2.stringToToken(text);
      return kind === void 0 ? textPart(text) : keywordPart(kind);
    }
    ts2.textOrKeywordPart = textOrKeywordPart;
    function textPart(text) {
      return displayPart(text, ts2.SymbolDisplayPartKind.text);
    }
    ts2.textPart = textPart;
    function typeAliasNamePart(text) {
      return displayPart(text, ts2.SymbolDisplayPartKind.aliasName);
    }
    ts2.typeAliasNamePart = typeAliasNamePart;
    function typeParameterNamePart(text) {
      return displayPart(text, ts2.SymbolDisplayPartKind.typeParameterName);
    }
    ts2.typeParameterNamePart = typeParameterNamePart;
    function linkTextPart(text) {
      return displayPart(text, ts2.SymbolDisplayPartKind.linkText);
    }
    ts2.linkTextPart = linkTextPart;
    function linkNamePart(text, target) {
      return {
        text,
        kind: ts2.SymbolDisplayPartKind[ts2.SymbolDisplayPartKind.linkName],
        target: {
          fileName: ts2.getSourceFileOfNode(target).fileName,
          textSpan: createTextSpanFromNode(target)
        }
      };
    }
    ts2.linkNamePart = linkNamePart;
    function linkPart(text) {
      return displayPart(text, ts2.SymbolDisplayPartKind.link);
    }
    ts2.linkPart = linkPart;
    function buildLinkParts(link, checker) {
      var _a;
      var prefix = ts2.isJSDocLink(link) ? "link" : ts2.isJSDocLinkCode(link) ? "linkcode" : "linkplain";
      var parts = [linkPart("{@".concat(prefix, " "))];
      if (!link.name) {
        if (link.text)
          parts.push(linkTextPart(link.text));
      } else {
        var symbol = checker === null || checker === void 0 ? void 0 : checker.getSymbolAtLocation(link.name);
        var suffix = findLinkNameEnd(link.text);
        var name = ts2.getTextOfNode(link.name) + link.text.slice(0, suffix);
        var text = link.text.slice(suffix);
        var decl = (symbol === null || symbol === void 0 ? void 0 : symbol.valueDeclaration) || ((_a = symbol === null || symbol === void 0 ? void 0 : symbol.declarations) === null || _a === void 0 ? void 0 : _a[0]);
        if (decl) {
          parts.push(linkNamePart(name, decl));
          if (text)
            parts.push(linkTextPart(text));
        } else {
          parts.push(linkTextPart(name + (suffix ? "" : " ") + text));
        }
      }
      parts.push(linkPart("}"));
      return parts;
    }
    ts2.buildLinkParts = buildLinkParts;
    function findLinkNameEnd(text) {
      if (text.indexOf("()") === 0)
        return 2;
      if (text[0] !== "<")
        return 0;
      var brackets = 0;
      var i = 0;
      while (i < text.length) {
        if (text[i] === "<")
          brackets++;
        if (text[i] === ">")
          brackets--;
        i++;
        if (!brackets)
          return i;
      }
      return 0;
    }
    var carriageReturnLineFeed = "\r\n";
    function getNewLineOrDefaultFromHost(host, formatSettings) {
      var _a;
      return (formatSettings === null || formatSettings === void 0 ? void 0 : formatSettings.newLineCharacter) || ((_a = host.getNewLine) === null || _a === void 0 ? void 0 : _a.call(host)) || carriageReturnLineFeed;
    }
    ts2.getNewLineOrDefaultFromHost = getNewLineOrDefaultFromHost;
    function lineBreakPart() {
      return displayPart("\n", ts2.SymbolDisplayPartKind.lineBreak);
    }
    ts2.lineBreakPart = lineBreakPart;
    function mapToDisplayParts(writeDisplayParts) {
      try {
        writeDisplayParts(displayPartWriter);
        return displayPartWriter.displayParts();
      } finally {
        displayPartWriter.clear();
      }
    }
    ts2.mapToDisplayParts = mapToDisplayParts;
    function typeToDisplayParts(typechecker, type, enclosingDeclaration, flags) {
      if (flags === void 0) {
        flags = 0;
      }
      return mapToDisplayParts(function(writer) {
        typechecker.writeType(type, enclosingDeclaration, flags | 1024 | 16384, writer);
      });
    }
    ts2.typeToDisplayParts = typeToDisplayParts;
    function symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration, meaning, flags) {
      if (flags === void 0) {
        flags = 0;
      }
      return mapToDisplayParts(function(writer) {
        typeChecker.writeSymbol(symbol, enclosingDeclaration, meaning, flags | 8, writer);
      });
    }
    ts2.symbolToDisplayParts = symbolToDisplayParts;
    function signatureToDisplayParts(typechecker, signature, enclosingDeclaration, flags) {
      if (flags === void 0) {
        flags = 0;
      }
      flags |= 16384 | 1024 | 32 | 8192;
      return mapToDisplayParts(function(writer) {
        typechecker.writeSignature(signature, enclosingDeclaration, flags, void 0, writer);
      });
    }
    ts2.signatureToDisplayParts = signatureToDisplayParts;
    function isImportOrExportSpecifierName(location) {
      return !!location.parent && ts2.isImportOrExportSpecifier(location.parent) && location.parent.propertyName === location;
    }
    ts2.isImportOrExportSpecifierName = isImportOrExportSpecifierName;
    function getScriptKind(fileName, host) {
      return ts2.ensureScriptKind(fileName, host.getScriptKind && host.getScriptKind(fileName));
    }
    ts2.getScriptKind = getScriptKind;
    function getSymbolTarget(symbol, checker) {
      var next = symbol;
      while (isAliasSymbol(next) || isTransientSymbol(next) && next.target) {
        if (isTransientSymbol(next) && next.target) {
          next = next.target;
        } else {
          next = ts2.skipAlias(next, checker);
        }
      }
      return next;
    }
    ts2.getSymbolTarget = getSymbolTarget;
    function isTransientSymbol(symbol) {
      return (symbol.flags & 33554432) !== 0;
    }
    function isAliasSymbol(symbol) {
      return (symbol.flags & 2097152) !== 0;
    }
    function getUniqueSymbolId(symbol, checker) {
      return ts2.getSymbolId(ts2.skipAlias(symbol, checker));
    }
    ts2.getUniqueSymbolId = getUniqueSymbolId;
    function getFirstNonSpaceCharacterPosition(text, position) {
      while (ts2.isWhiteSpaceLike(text.charCodeAt(position))) {
        position += 1;
      }
      return position;
    }
    ts2.getFirstNonSpaceCharacterPosition = getFirstNonSpaceCharacterPosition;
    function getPrecedingNonSpaceCharacterPosition(text, position) {
      while (position > -1 && ts2.isWhiteSpaceSingleLine(text.charCodeAt(position))) {
        position -= 1;
      }
      return position + 1;
    }
    ts2.getPrecedingNonSpaceCharacterPosition = getPrecedingNonSpaceCharacterPosition;
    function getSynthesizedDeepClone(node, includeTrivia) {
      if (includeTrivia === void 0) {
        includeTrivia = true;
      }
      var clone = node && getSynthesizedDeepCloneWorker(node);
      if (clone && !includeTrivia)
        suppressLeadingAndTrailingTrivia(clone);
      return clone;
    }
    ts2.getSynthesizedDeepClone = getSynthesizedDeepClone;
    function getSynthesizedDeepCloneWithReplacements(node, includeTrivia, replaceNode) {
      var clone = replaceNode(node);
      if (clone) {
        ts2.setOriginalNode(clone, node);
      } else {
        clone = getSynthesizedDeepCloneWorker(node, replaceNode);
      }
      if (clone && !includeTrivia)
        suppressLeadingAndTrailingTrivia(clone);
      return clone;
    }
    ts2.getSynthesizedDeepCloneWithReplacements = getSynthesizedDeepCloneWithReplacements;
    function getSynthesizedDeepCloneWorker(node, replaceNode) {
      var nodeClone = replaceNode ? function(n) {
        return getSynthesizedDeepCloneWithReplacements(n, true, replaceNode);
      } : getSynthesizedDeepClone;
      var nodesClone = replaceNode ? function(ns) {
        return ns && getSynthesizedDeepClonesWithReplacements(ns, true, replaceNode);
      } : function(ns) {
        return ns && getSynthesizedDeepClones(ns);
      };
      var visited = ts2.visitEachChild(node, nodeClone, ts2.nullTransformationContext, nodesClone, nodeClone);
      if (visited === node) {
        var clone_1 = ts2.isStringLiteral(node) ? ts2.setOriginalNode(ts2.factory.createStringLiteralFromNode(node), node) : ts2.isNumericLiteral(node) ? ts2.setOriginalNode(ts2.factory.createNumericLiteral(node.text, node.numericLiteralFlags), node) : ts2.factory.cloneNode(node);
        return ts2.setTextRange(clone_1, node);
      }
      visited.parent = void 0;
      return visited;
    }
    function getSynthesizedDeepClones(nodes, includeTrivia) {
      if (includeTrivia === void 0) {
        includeTrivia = true;
      }
      return nodes && ts2.factory.createNodeArray(nodes.map(function(n) {
        return getSynthesizedDeepClone(n, includeTrivia);
      }), nodes.hasTrailingComma);
    }
    ts2.getSynthesizedDeepClones = getSynthesizedDeepClones;
    function getSynthesizedDeepClonesWithReplacements(nodes, includeTrivia, replaceNode) {
      return ts2.factory.createNodeArray(nodes.map(function(n) {
        return getSynthesizedDeepCloneWithReplacements(n, includeTrivia, replaceNode);
      }), nodes.hasTrailingComma);
    }
    ts2.getSynthesizedDeepClonesWithReplacements = getSynthesizedDeepClonesWithReplacements;
    function suppressLeadingAndTrailingTrivia(node) {
      suppressLeadingTrivia(node);
      suppressTrailingTrivia(node);
    }
    ts2.suppressLeadingAndTrailingTrivia = suppressLeadingAndTrailingTrivia;
    function suppressLeadingTrivia(node) {
      addEmitFlagsRecursively(node, 512, getFirstChild);
    }
    ts2.suppressLeadingTrivia = suppressLeadingTrivia;
    function suppressTrailingTrivia(node) {
      addEmitFlagsRecursively(node, 1024, ts2.getLastChild);
    }
    ts2.suppressTrailingTrivia = suppressTrailingTrivia;
    function copyComments(sourceNode, targetNode) {
      var sourceFile = sourceNode.getSourceFile();
      var text = sourceFile.text;
      if (hasLeadingLineBreak(sourceNode, text)) {
        copyLeadingComments(sourceNode, targetNode, sourceFile);
      } else {
        copyTrailingAsLeadingComments(sourceNode, targetNode, sourceFile);
      }
      copyTrailingComments(sourceNode, targetNode, sourceFile);
    }
    ts2.copyComments = copyComments;
    function hasLeadingLineBreak(node, text) {
      var start = node.getFullStart();
      var end = node.getStart();
      for (var i = start; i < end; i++) {
        if (text.charCodeAt(i) === 10)
          return true;
      }
      return false;
    }
    function addEmitFlagsRecursively(node, flag, getChild) {
      ts2.addEmitFlags(node, flag);
      var child = getChild(node);
      if (child)
        addEmitFlagsRecursively(child, flag, getChild);
    }
    function getFirstChild(node) {
      return node.forEachChild(function(child) {
        return child;
      });
    }
    function getUniqueName(baseName, sourceFile) {
      var nameText = baseName;
      for (var i = 1; !ts2.isFileLevelUniqueName(sourceFile, nameText); i++) {
        nameText = "".concat(baseName, "_").concat(i);
      }
      return nameText;
    }
    ts2.getUniqueName = getUniqueName;
    function getRenameLocation(edits, renameFilename, name, preferLastLocation) {
      var delta = 0;
      var lastPos = -1;
      for (var _i = 0, edits_1 = edits; _i < edits_1.length; _i++) {
        var _a = edits_1[_i], fileName = _a.fileName, textChanges_2 = _a.textChanges;
        ts2.Debug.assert(fileName === renameFilename);
        for (var _b = 0, textChanges_1 = textChanges_2; _b < textChanges_1.length; _b++) {
          var change = textChanges_1[_b];
          var span = change.span, newText = change.newText;
          var index = indexInTextChange(newText, name);
          if (index !== -1) {
            lastPos = span.start + delta + index;
            if (!preferLastLocation) {
              return lastPos;
            }
          }
          delta += newText.length - span.length;
        }
      }
      ts2.Debug.assert(preferLastLocation);
      ts2.Debug.assert(lastPos >= 0);
      return lastPos;
    }
    ts2.getRenameLocation = getRenameLocation;
    function copyLeadingComments(sourceNode, targetNode, sourceFile, commentKind, hasTrailingNewLine) {
      ts2.forEachLeadingCommentRange(sourceFile.text, sourceNode.pos, getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, ts2.addSyntheticLeadingComment));
    }
    ts2.copyLeadingComments = copyLeadingComments;
    function copyTrailingComments(sourceNode, targetNode, sourceFile, commentKind, hasTrailingNewLine) {
      ts2.forEachTrailingCommentRange(sourceFile.text, sourceNode.end, getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, ts2.addSyntheticTrailingComment));
    }
    ts2.copyTrailingComments = copyTrailingComments;
    function copyTrailingAsLeadingComments(sourceNode, targetNode, sourceFile, commentKind, hasTrailingNewLine) {
      ts2.forEachTrailingCommentRange(sourceFile.text, sourceNode.pos, getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, ts2.addSyntheticLeadingComment));
    }
    ts2.copyTrailingAsLeadingComments = copyTrailingAsLeadingComments;
    function getAddCommentsFunction(targetNode, sourceFile, commentKind, hasTrailingNewLine, cb) {
      return function(pos, end, kind, htnl) {
        if (kind === 3) {
          pos += 2;
          end -= 2;
        } else {
          pos += 2;
        }
        cb(targetNode, commentKind || kind, sourceFile.text.slice(pos, end), hasTrailingNewLine !== void 0 ? hasTrailingNewLine : htnl);
      };
    }
    function indexInTextChange(change, name) {
      if (ts2.startsWith(change, name))
        return 0;
      var idx = change.indexOf(" " + name);
      if (idx === -1)
        idx = change.indexOf("." + name);
      if (idx === -1)
        idx = change.indexOf('"' + name);
      return idx === -1 ? -1 : idx + 1;
    }
    function needsParentheses(expression) {
      return ts2.isBinaryExpression(expression) && expression.operatorToken.kind === 27 || ts2.isObjectLiteralExpression(expression) || ts2.isAsExpression(expression) && ts2.isObjectLiteralExpression(expression.expression);
    }
    ts2.needsParentheses = needsParentheses;
    function getContextualTypeFromParent(node, checker) {
      var parent = node.parent;
      switch (parent.kind) {
        case 208:
          return checker.getContextualType(parent);
        case 220: {
          var _a = parent, left = _a.left, operatorToken = _a.operatorToken, right = _a.right;
          return isEqualityOperatorKind(operatorToken.kind) ? checker.getTypeAtLocation(node === right ? left : right) : checker.getContextualType(node);
        }
        case 288:
          return parent.expression === node ? getSwitchedType(parent, checker) : void 0;
        default:
          return checker.getContextualType(node);
      }
    }
    ts2.getContextualTypeFromParent = getContextualTypeFromParent;
    function quote(sourceFile, preferences, text) {
      var quotePreference = getQuotePreference(sourceFile, preferences);
      var quoted = JSON.stringify(text);
      return quotePreference === 0 ? "'".concat(ts2.stripQuotes(quoted).replace(/'/g, "\\'").replace(/\\"/g, '"'), "'") : quoted;
    }
    ts2.quote = quote;
    function isEqualityOperatorKind(kind) {
      switch (kind) {
        case 36:
        case 34:
        case 37:
        case 35:
          return true;
        default:
          return false;
      }
    }
    ts2.isEqualityOperatorKind = isEqualityOperatorKind;
    function isStringLiteralOrTemplate(node) {
      switch (node.kind) {
        case 10:
        case 14:
        case 222:
        case 209:
          return true;
        default:
          return false;
      }
    }
    ts2.isStringLiteralOrTemplate = isStringLiteralOrTemplate;
    function hasIndexSignature(type) {
      return !!type.getStringIndexType() || !!type.getNumberIndexType();
    }
    ts2.hasIndexSignature = hasIndexSignature;
    function getSwitchedType(caseClause, checker) {
      return checker.getTypeAtLocation(caseClause.parent.parent.expression);
    }
    ts2.getSwitchedType = getSwitchedType;
    ts2.ANONYMOUS = "anonymous function";
    function getTypeNodeIfAccessible(type, enclosingScope, program, host) {
      var checker = program.getTypeChecker();
      var typeIsAccessible = true;
      var notAccessible = function() {
        return typeIsAccessible = false;
      };
      var res = checker.typeToTypeNode(type, enclosingScope, 1, {
        trackSymbol: function(symbol, declaration, meaning) {
          typeIsAccessible = typeIsAccessible && checker.isSymbolAccessible(symbol, declaration, meaning, false).accessibility === 0;
          return !typeIsAccessible;
        },
        reportInaccessibleThisError: notAccessible,
        reportPrivateInBaseOfClassExpression: notAccessible,
        reportInaccessibleUniqueSymbolError: notAccessible,
        moduleResolverHost: getModuleSpecifierResolverHost(program, host)
      });
      return typeIsAccessible ? res : void 0;
    }
    ts2.getTypeNodeIfAccessible = getTypeNodeIfAccessible;
    function syntaxRequiresTrailingCommaOrSemicolonOrASI(kind) {
      return kind === 173 || kind === 174 || kind === 175 || kind === 165 || kind === 167;
    }
    ts2.syntaxRequiresTrailingCommaOrSemicolonOrASI = syntaxRequiresTrailingCommaOrSemicolonOrASI;
    function syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI(kind) {
      return kind === 255 || kind === 170 || kind === 168 || kind === 171 || kind === 172;
    }
    ts2.syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI = syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI;
    function syntaxRequiresTrailingModuleBlockOrSemicolonOrASI(kind) {
      return kind === 260;
    }
    ts2.syntaxRequiresTrailingModuleBlockOrSemicolonOrASI = syntaxRequiresTrailingModuleBlockOrSemicolonOrASI;
    function syntaxRequiresTrailingSemicolonOrASI(kind) {
      return kind === 236 || kind === 237 || kind === 239 || kind === 244 || kind === 245 || kind === 246 || kind === 250 || kind === 252 || kind === 166 || kind === 258 || kind === 265 || kind === 264 || kind === 271 || kind === 263 || kind === 270;
    }
    ts2.syntaxRequiresTrailingSemicolonOrASI = syntaxRequiresTrailingSemicolonOrASI;
    ts2.syntaxMayBeASICandidate = ts2.or(syntaxRequiresTrailingCommaOrSemicolonOrASI, syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI, syntaxRequiresTrailingModuleBlockOrSemicolonOrASI, syntaxRequiresTrailingSemicolonOrASI);
    function nodeIsASICandidate(node, sourceFile) {
      var lastToken = node.getLastToken(sourceFile);
      if (lastToken && lastToken.kind === 26) {
        return false;
      }
      if (syntaxRequiresTrailingCommaOrSemicolonOrASI(node.kind)) {
        if (lastToken && lastToken.kind === 27) {
          return false;
        }
      } else if (syntaxRequiresTrailingModuleBlockOrSemicolonOrASI(node.kind)) {
        var lastChild = ts2.last(node.getChildren(sourceFile));
        if (lastChild && ts2.isModuleBlock(lastChild)) {
          return false;
        }
      } else if (syntaxRequiresTrailingFunctionBlockOrSemicolonOrASI(node.kind)) {
        var lastChild = ts2.last(node.getChildren(sourceFile));
        if (lastChild && ts2.isFunctionBlock(lastChild)) {
          return false;
        }
      } else if (!syntaxRequiresTrailingSemicolonOrASI(node.kind)) {
        return false;
      }
      if (node.kind === 239) {
        return true;
      }
      var topNode = ts2.findAncestor(node, function(ancestor) {
        return !ancestor.parent;
      });
      var nextToken = findNextToken(node, topNode, sourceFile);
      if (!nextToken || nextToken.kind === 19) {
        return true;
      }
      var startLine = sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line;
      var endLine = sourceFile.getLineAndCharacterOfPosition(nextToken.getStart(sourceFile)).line;
      return startLine !== endLine;
    }
    function positionIsASICandidate(pos, context, sourceFile) {
      var contextAncestor = ts2.findAncestor(context, function(ancestor) {
        if (ancestor.end !== pos) {
          return "quit";
        }
        return ts2.syntaxMayBeASICandidate(ancestor.kind);
      });
      return !!contextAncestor && nodeIsASICandidate(contextAncestor, sourceFile);
    }
    ts2.positionIsASICandidate = positionIsASICandidate;
    function probablyUsesSemicolons(sourceFile) {
      var withSemicolon = 0;
      var withoutSemicolon = 0;
      var nStatementsToObserve = 5;
      ts2.forEachChild(sourceFile, function visit(node) {
        if (syntaxRequiresTrailingSemicolonOrASI(node.kind)) {
          var lastToken = node.getLastToken(sourceFile);
          if (lastToken && lastToken.kind === 26) {
            withSemicolon++;
          } else {
            withoutSemicolon++;
          }
        }
        if (withSemicolon + withoutSemicolon >= nStatementsToObserve) {
          return true;
        }
        return ts2.forEachChild(node, visit);
      });
      if (withSemicolon === 0 && withoutSemicolon <= 1) {
        return true;
      }
      return withSemicolon / withoutSemicolon > 1 / nStatementsToObserve;
    }
    ts2.probablyUsesSemicolons = probablyUsesSemicolons;
    function tryGetDirectories(host, directoryName) {
      return tryIOAndConsumeErrors(host, host.getDirectories, directoryName) || [];
    }
    ts2.tryGetDirectories = tryGetDirectories;
    function tryReadDirectory(host, path, extensions, exclude, include) {
      return tryIOAndConsumeErrors(host, host.readDirectory, path, extensions, exclude, include) || ts2.emptyArray;
    }
    ts2.tryReadDirectory = tryReadDirectory;
    function tryFileExists(host, path) {
      return tryIOAndConsumeErrors(host, host.fileExists, path);
    }
    ts2.tryFileExists = tryFileExists;
    function tryDirectoryExists(host, path) {
      return tryAndIgnoreErrors(function() {
        return ts2.directoryProbablyExists(path, host);
      }) || false;
    }
    ts2.tryDirectoryExists = tryDirectoryExists;
    function tryAndIgnoreErrors(cb) {
      try {
        return cb();
      } catch (_a) {
        return void 0;
      }
    }
    ts2.tryAndIgnoreErrors = tryAndIgnoreErrors;
    function tryIOAndConsumeErrors(host, toApply) {
      var args = [];
      for (var _i = 2; _i < arguments.length; _i++) {
        args[_i - 2] = arguments[_i];
      }
      return tryAndIgnoreErrors(function() {
        return toApply && toApply.apply(host, args);
      });
    }
    ts2.tryIOAndConsumeErrors = tryIOAndConsumeErrors;
    function findPackageJsons(startDirectory, host, stopDirectory) {
      var paths = [];
      ts2.forEachAncestorDirectory(startDirectory, function(ancestor) {
        if (ancestor === stopDirectory) {
          return true;
        }
        var currentConfigPath = ts2.combinePaths(ancestor, "package.json");
        if (tryFileExists(host, currentConfigPath)) {
          paths.push(currentConfigPath);
        }
      });
      return paths;
    }
    ts2.findPackageJsons = findPackageJsons;
    function findPackageJson(directory, host) {
      var packageJson;
      ts2.forEachAncestorDirectory(directory, function(ancestor) {
        if (ancestor === "node_modules")
          return true;
        packageJson = ts2.findConfigFile(ancestor, function(f) {
          return tryFileExists(host, f);
        }, "package.json");
        if (packageJson) {
          return true;
        }
      });
      return packageJson;
    }
    ts2.findPackageJson = findPackageJson;
    function getPackageJsonsVisibleToFile(fileName, host) {
      if (!host.fileExists) {
        return [];
      }
      var packageJsons = [];
      ts2.forEachAncestorDirectory(ts2.getDirectoryPath(fileName), function(ancestor) {
        var packageJsonFileName = ts2.combinePaths(ancestor, "package.json");
        if (host.fileExists(packageJsonFileName)) {
          var info = createPackageJsonInfo(packageJsonFileName, host);
          if (info) {
            packageJsons.push(info);
          }
        }
      });
      return packageJsons;
    }
    ts2.getPackageJsonsVisibleToFile = getPackageJsonsVisibleToFile;
    function createPackageJsonInfo(fileName, host) {
      if (!host.readFile) {
        return void 0;
      }
      var dependencyKeys = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
      var stringContent = host.readFile(fileName) || "";
      var content = tryParseJson(stringContent);
      var info = {};
      if (content) {
        for (var _i = 0, dependencyKeys_1 = dependencyKeys; _i < dependencyKeys_1.length; _i++) {
          var key = dependencyKeys_1[_i];
          var dependencies = content[key];
          if (!dependencies) {
            continue;
          }
          var dependencyMap = new ts2.Map();
          for (var packageName in dependencies) {
            dependencyMap.set(packageName, dependencies[packageName]);
          }
          info[key] = dependencyMap;
        }
      }
      var dependencyGroups = [
        [1, info.dependencies],
        [2, info.devDependencies],
        [8, info.optionalDependencies],
        [4, info.peerDependencies]
      ];
      return __assign(__assign({}, info), { parseable: !!content, fileName, get, has: function(dependencyName, inGroups) {
        return !!get(dependencyName, inGroups);
      } });
      function get(dependencyName, inGroups) {
        if (inGroups === void 0) {
          inGroups = 15;
        }
        for (var _i2 = 0, dependencyGroups_1 = dependencyGroups; _i2 < dependencyGroups_1.length; _i2++) {
          var _a = dependencyGroups_1[_i2], group_1 = _a[0], deps = _a[1];
          if (deps && inGroups & group_1) {
            var dep = deps.get(dependencyName);
            if (dep !== void 0) {
              return dep;
            }
          }
        }
      }
    }
    ts2.createPackageJsonInfo = createPackageJsonInfo;
    function createPackageJsonImportFilter(fromFile, preferences, host) {
      var packageJsons = (host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName) || getPackageJsonsVisibleToFile(fromFile.fileName, host)).filter(function(p) {
        return p.parseable;
      });
      var usesNodeCoreModules;
      return { allowsImportingAmbientModule, allowsImportingSourceFile, allowsImportingSpecifier };
      function moduleSpecifierIsCoveredByPackageJson(specifier) {
        var packageName = getNodeModuleRootSpecifier(specifier);
        for (var _i = 0, packageJsons_1 = packageJsons; _i < packageJsons_1.length; _i++) {
          var packageJson = packageJsons_1[_i];
          if (packageJson.has(packageName) || packageJson.has(ts2.getTypesPackageName(packageName))) {
            return true;
          }
        }
        return false;
      }
      function allowsImportingAmbientModule(moduleSymbol, moduleSpecifierResolutionHost) {
        if (!packageJsons.length || !moduleSymbol.valueDeclaration) {
          return true;
        }
        var declaringSourceFile = moduleSymbol.valueDeclaration.getSourceFile();
        var declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName, moduleSpecifierResolutionHost);
        if (typeof declaringNodeModuleName === "undefined") {
          return true;
        }
        var declaredModuleSpecifier = ts2.stripQuotes(moduleSymbol.getName());
        if (isAllowedCoreNodeModulesImport(declaredModuleSpecifier)) {
          return true;
        }
        return moduleSpecifierIsCoveredByPackageJson(declaringNodeModuleName) || moduleSpecifierIsCoveredByPackageJson(declaredModuleSpecifier);
      }
      function allowsImportingSourceFile(sourceFile, moduleSpecifierResolutionHost) {
        if (!packageJsons.length) {
          return true;
        }
        var moduleSpecifier = getNodeModulesPackageNameFromFileName(sourceFile.fileName, moduleSpecifierResolutionHost);
        if (!moduleSpecifier) {
          return true;
        }
        return moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
      }
      function allowsImportingSpecifier(moduleSpecifier) {
        if (!packageJsons.length || isAllowedCoreNodeModulesImport(moduleSpecifier)) {
          return true;
        }
        if (ts2.pathIsRelative(moduleSpecifier) || ts2.isRootedDiskPath(moduleSpecifier)) {
          return true;
        }
        return moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
      }
      function isAllowedCoreNodeModulesImport(moduleSpecifier) {
        if (ts2.isSourceFileJS(fromFile) && ts2.JsTyping.nodeCoreModules.has(moduleSpecifier)) {
          if (usesNodeCoreModules === void 0) {
            usesNodeCoreModules = consumesNodeCoreModules(fromFile);
          }
          if (usesNodeCoreModules) {
            return true;
          }
        }
        return false;
      }
      function getNodeModulesPackageNameFromFileName(importedFileName, moduleSpecifierResolutionHost) {
        if (!ts2.stringContains(importedFileName, "node_modules")) {
          return void 0;
        }
        var specifier = ts2.moduleSpecifiers.getNodeModulesPackageName(host.getCompilationSettings(), fromFile.path, importedFileName, moduleSpecifierResolutionHost, preferences);
        if (!specifier) {
          return void 0;
        }
        if (!ts2.pathIsRelative(specifier) && !ts2.isRootedDiskPath(specifier)) {
          return getNodeModuleRootSpecifier(specifier);
        }
      }
      function getNodeModuleRootSpecifier(fullSpecifier) {
        var components = ts2.getPathComponents(ts2.getPackageNameFromTypesPackageName(fullSpecifier)).slice(1);
        if (ts2.startsWith(components[0], "@")) {
          return "".concat(components[0], "/").concat(components[1]);
        }
        return components[0];
      }
    }
    ts2.createPackageJsonImportFilter = createPackageJsonImportFilter;
    function tryParseJson(text) {
      try {
        return JSON.parse(text);
      } catch (_a) {
        return void 0;
      }
    }
    function consumesNodeCoreModules(sourceFile) {
      return ts2.some(sourceFile.imports, function(_a) {
        var text = _a.text;
        return ts2.JsTyping.nodeCoreModules.has(text);
      });
    }
    ts2.consumesNodeCoreModules = consumesNodeCoreModules;
    function isInsideNodeModules(fileOrDirectory) {
      return ts2.contains(ts2.getPathComponents(fileOrDirectory), "node_modules");
    }
    ts2.isInsideNodeModules = isInsideNodeModules;
    function isDiagnosticWithLocation(diagnostic) {
      return diagnostic.file !== void 0 && diagnostic.start !== void 0 && diagnostic.length !== void 0;
    }
    ts2.isDiagnosticWithLocation = isDiagnosticWithLocation;
    function findDiagnosticForNode(node, sortedFileDiagnostics) {
      var span = createTextSpanFromNode(node);
      var index = ts2.binarySearchKey(sortedFileDiagnostics, span, ts2.identity, ts2.compareTextSpans);
      if (index >= 0) {
        var diagnostic = sortedFileDiagnostics[index];
        ts2.Debug.assertEqual(diagnostic.file, node.getSourceFile(), "Diagnostics proided to 'findDiagnosticForNode' must be from a single SourceFile");
        return ts2.cast(diagnostic, isDiagnosticWithLocation);
      }
    }
    ts2.findDiagnosticForNode = findDiagnosticForNode;
    function getDiagnosticsWithinSpan(span, sortedFileDiagnostics) {
      var _a;
      var index = ts2.binarySearchKey(sortedFileDiagnostics, span.start, function(diag) {
        return diag.start;
      }, ts2.compareValues);
      if (index < 0) {
        index = ~index;
      }
      while (((_a = sortedFileDiagnostics[index - 1]) === null || _a === void 0 ? void 0 : _a.start) === span.start) {
        index--;
      }
      var result = [];
      var end = ts2.textSpanEnd(span);
      while (true) {
        var diagnostic = ts2.tryCast(sortedFileDiagnostics[index], isDiagnosticWithLocation);
        if (!diagnostic || diagnostic.start > end) {
          break;
        }
        if (ts2.textSpanContainsTextSpan(span, diagnostic)) {
          result.push(diagnostic);
        }
        index++;
      }
      return result;
    }
    ts2.getDiagnosticsWithinSpan = getDiagnosticsWithinSpan;
    function getRefactorContextSpan(_a) {
      var startPosition = _a.startPosition, endPosition = _a.endPosition;
      return ts2.createTextSpanFromBounds(startPosition, endPosition === void 0 ? startPosition : endPosition);
    }
    ts2.getRefactorContextSpan = getRefactorContextSpan;
    function getFixableErrorSpanExpression(sourceFile, span) {
      var token = getTokenAtPosition(sourceFile, span.start);
      var expression = ts2.findAncestor(token, function(node) {
        if (node.getStart(sourceFile) < span.start || node.getEnd() > ts2.textSpanEnd(span)) {
          return "quit";
        }
        return ts2.isExpression(node) && textSpansEqual(span, createTextSpanFromNode(node, sourceFile));
      });
      return expression;
    }
    ts2.getFixableErrorSpanExpression = getFixableErrorSpanExpression;
    function mapOneOrMany(valueOrArray, f, resultSelector) {
      if (resultSelector === void 0) {
        resultSelector = ts2.identity;
      }
      return valueOrArray ? ts2.isArray(valueOrArray) ? resultSelector(ts2.map(valueOrArray, f)) : f(valueOrArray, 0) : void 0;
    }
    ts2.mapOneOrMany = mapOneOrMany;
    function firstOrOnly(valueOrArray) {
      return ts2.isArray(valueOrArray) ? ts2.first(valueOrArray) : valueOrArray;
    }
    ts2.firstOrOnly = firstOrOnly;
    function getNameForExportedSymbol(symbol, scriptTarget) {
      if (!(symbol.flags & 33554432) && (symbol.escapedName === "export=" || symbol.escapedName === "default")) {
        return ts2.firstDefined(symbol.declarations, function(d) {
          var _a;
          return ts2.isExportAssignment(d) ? (_a = ts2.tryCast(ts2.skipOuterExpressions(d.expression), ts2.isIdentifier)) === null || _a === void 0 ? void 0 : _a.text : void 0;
        }) || ts2.codefix.moduleSymbolToValidIdentifier(getSymbolParentOrFail(symbol), scriptTarget);
      }
      return symbol.name;
    }
    ts2.getNameForExportedSymbol = getNameForExportedSymbol;
    function getSymbolParentOrFail(symbol) {
      var _a;
      return ts2.Debug.checkDefined(symbol.parent, "Symbol parent was undefined. Flags: ".concat(ts2.Debug.formatSymbolFlags(symbol.flags), ". ") + "Declarations: ".concat((_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.map(function(d) {
        var kind = ts2.Debug.formatSyntaxKind(d.kind);
        var inJS = ts2.isInJSFile(d);
        var expression = d.expression;
        return (inJS ? "[JS]" : "") + kind + (expression ? " (expression: ".concat(ts2.Debug.formatSyntaxKind(expression.kind), ")") : "");
      }).join(", "), "."));
    }
    function stringContainsAt(haystack, needle, startIndex) {
      var needleLength = needle.length;
      if (needleLength + startIndex > haystack.length) {
        return false;
      }
      for (var i = 0; i < needleLength; i++) {
        if (needle.charCodeAt(i) !== haystack.charCodeAt(i + startIndex))
          return false;
      }
      return true;
    }
    ts2.stringContainsAt = stringContainsAt;
    function startsWithUnderscore(name) {
      return name.charCodeAt(0) === 95;
    }
    ts2.startsWithUnderscore = startsWithUnderscore;
    function isGlobalDeclaration(declaration) {
      return !isNonGlobalDeclaration(declaration);
    }
    ts2.isGlobalDeclaration = isGlobalDeclaration;
    function isNonGlobalDeclaration(declaration) {
      var sourceFile = declaration.getSourceFile();
      if (!sourceFile.externalModuleIndicator && !sourceFile.commonJsModuleIndicator) {
        return false;
      }
      return ts2.isInJSFile(declaration) || !ts2.findAncestor(declaration, ts2.isGlobalScopeAugmentation);
    }
    ts2.isNonGlobalDeclaration = isNonGlobalDeclaration;
    function isDeprecatedDeclaration(decl) {
      return !!(ts2.getCombinedNodeFlagsAlwaysIncludeJSDoc(decl) & 8192);
    }
    ts2.isDeprecatedDeclaration = isDeprecatedDeclaration;
    function shouldUseUriStyleNodeCoreModules(file, program) {
      var decisionFromFile = ts2.firstDefined(file.imports, function(node) {
        if (ts2.JsTyping.nodeCoreModules.has(node.text)) {
          return ts2.startsWith(node.text, "node:");
        }
      });
      return decisionFromFile !== null && decisionFromFile !== void 0 ? decisionFromFile : program.usesUriStyleNodeCoreModules;
    }
    ts2.shouldUseUriStyleNodeCoreModules = shouldUseUriStyleNodeCoreModules;
    function getNewLineKind(newLineCharacter) {
      return newLineCharacter === "\n" ? 1 : 0;
    }
    ts2.getNewLineKind = getNewLineKind;
    function diagnosticToString(diag) {
      return ts2.isArray(diag) ? ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(diag[0]), diag.slice(1)) : ts2.getLocaleSpecificMessage(diag);
    }
    ts2.diagnosticToString = diagnosticToString;
  })(ts || (ts = {}));
  (function(ts2) {
    var ImportKind;
    (function(ImportKind2) {
      ImportKind2[ImportKind2["Named"] = 0] = "Named";
      ImportKind2[ImportKind2["Default"] = 1] = "Default";
      ImportKind2[ImportKind2["Namespace"] = 2] = "Namespace";
      ImportKind2[ImportKind2["CommonJS"] = 3] = "CommonJS";
    })(ImportKind = ts2.ImportKind || (ts2.ImportKind = {}));
    var ExportKind;
    (function(ExportKind2) {
      ExportKind2[ExportKind2["Named"] = 0] = "Named";
      ExportKind2[ExportKind2["Default"] = 1] = "Default";
      ExportKind2[ExportKind2["ExportEquals"] = 2] = "ExportEquals";
      ExportKind2[ExportKind2["UMD"] = 3] = "UMD";
    })(ExportKind = ts2.ExportKind || (ts2.ExportKind = {}));
    function createCacheableExportInfoMap(host) {
      var exportInfoId = 1;
      var exportInfo = ts2.createMultiMap();
      var symbols = new ts2.Map();
      var usableByFileName;
      var cache = {
        isUsableByFile: function(importingFile) {
          return importingFile === usableByFileName;
        },
        isEmpty: function() {
          return !exportInfo.size;
        },
        clear: function() {
          exportInfo.clear();
          symbols.clear();
          usableByFileName = void 0;
        },
        add: function(importingFile, symbol, symbolTableKey, moduleSymbol, moduleFile, exportKind, isFromPackageJson, scriptTarget, checker) {
          if (importingFile !== usableByFileName) {
            cache.clear();
            usableByFileName = importingFile;
          }
          var isDefault = exportKind === 1;
          var namedSymbol = isDefault && ts2.getLocalSymbolForExportDefault(symbol) || symbol;
          var importedName = exportKind === 0 || ts2.isExternalModuleSymbol(namedSymbol) ? ts2.unescapeLeadingUnderscores(symbolTableKey) : ts2.getNameForExportedSymbol(namedSymbol, scriptTarget);
          var moduleName = ts2.stripQuotes(moduleSymbol.name);
          var id = exportInfoId++;
          var target = ts2.skipAlias(symbol, checker);
          var storedSymbol = symbol.flags & 33554432 ? void 0 : symbol;
          var storedModuleSymbol = moduleSymbol.flags & 33554432 ? void 0 : moduleSymbol;
          if (!storedSymbol || !storedModuleSymbol)
            symbols.set(id, [symbol, moduleSymbol]);
          exportInfo.add(key(importedName, symbol, ts2.isExternalModuleNameRelative(moduleName) ? void 0 : moduleName, checker), {
            id,
            symbolTableKey,
            symbolName: importedName,
            moduleName,
            moduleFile,
            moduleFileName: moduleFile === null || moduleFile === void 0 ? void 0 : moduleFile.fileName,
            exportKind,
            targetFlags: target.flags,
            isFromPackageJson,
            symbol: storedSymbol,
            moduleSymbol: storedModuleSymbol
          });
        },
        get: function(importingFile, key2) {
          if (importingFile !== usableByFileName)
            return;
          var result = exportInfo.get(key2);
          return result === null || result === void 0 ? void 0 : result.map(rehydrateCachedInfo);
        },
        forEach: function(importingFile, action) {
          if (importingFile !== usableByFileName)
            return;
          exportInfo.forEach(function(info, key2) {
            var _a = parseKey(key2), symbolName = _a.symbolName, ambientModuleName = _a.ambientModuleName;
            action(info.map(rehydrateCachedInfo), symbolName, !!ambientModuleName, key2);
          });
        },
        releaseSymbols: function() {
          symbols.clear();
        },
        onFileChanged: function(oldSourceFile, newSourceFile, typeAcquisitionEnabled) {
          if (fileIsGlobalOnly(oldSourceFile) && fileIsGlobalOnly(newSourceFile)) {
            return false;
          }
          if (usableByFileName && usableByFileName !== newSourceFile.path || typeAcquisitionEnabled && ts2.consumesNodeCoreModules(oldSourceFile) !== ts2.consumesNodeCoreModules(newSourceFile) || !ts2.arrayIsEqualTo(oldSourceFile.moduleAugmentations, newSourceFile.moduleAugmentations) || !ambientModuleDeclarationsAreEqual(oldSourceFile, newSourceFile)) {
            cache.clear();
            return true;
          }
          usableByFileName = newSourceFile.path;
          return false;
        }
      };
      if (ts2.Debug.isDebugging) {
        Object.defineProperty(cache, "__cache", { get: function() {
          return exportInfo;
        } });
      }
      return cache;
      function rehydrateCachedInfo(info) {
        if (info.symbol && info.moduleSymbol)
          return info;
        var id = info.id, exportKind = info.exportKind, targetFlags = info.targetFlags, isFromPackageJson = info.isFromPackageJson, moduleFileName = info.moduleFileName;
        var _a = symbols.get(id) || ts2.emptyArray, cachedSymbol = _a[0], cachedModuleSymbol = _a[1];
        if (cachedSymbol && cachedModuleSymbol) {
          return {
            symbol: cachedSymbol,
            moduleSymbol: cachedModuleSymbol,
            moduleFileName,
            exportKind,
            targetFlags,
            isFromPackageJson
          };
        }
        var checker = (isFromPackageJson ? host.getPackageJsonAutoImportProvider() : host.getCurrentProgram()).getTypeChecker();
        var moduleSymbol = info.moduleSymbol || cachedModuleSymbol || ts2.Debug.checkDefined(info.moduleFile ? checker.getMergedSymbol(info.moduleFile.symbol) : checker.tryFindAmbientModule(info.moduleName));
        var symbol = info.symbol || cachedSymbol || ts2.Debug.checkDefined(exportKind === 2 ? checker.resolveExternalModuleSymbol(moduleSymbol) : checker.tryGetMemberInModuleExportsAndProperties(ts2.unescapeLeadingUnderscores(info.symbolTableKey), moduleSymbol), "Could not find symbol '".concat(info.symbolName, "' by key '").concat(info.symbolTableKey, "' in module ").concat(moduleSymbol.name));
        symbols.set(id, [symbol, moduleSymbol]);
        return {
          symbol,
          moduleSymbol,
          moduleFileName,
          exportKind,
          targetFlags,
          isFromPackageJson
        };
      }
      function key(importedName, symbol, ambientModuleName, checker) {
        var moduleKey = ambientModuleName || "";
        return "".concat(importedName, "|").concat(ts2.getSymbolId(ts2.skipAlias(symbol, checker)), "|").concat(moduleKey);
      }
      function parseKey(key2) {
        var symbolName = key2.substring(0, key2.indexOf("|"));
        var moduleKey = key2.substring(key2.lastIndexOf("|") + 1);
        var ambientModuleName = moduleKey === "" ? void 0 : moduleKey;
        return { symbolName, ambientModuleName };
      }
      function fileIsGlobalOnly(file) {
        return !file.commonJsModuleIndicator && !file.externalModuleIndicator && !file.moduleAugmentations && !file.ambientModuleNames;
      }
      function ambientModuleDeclarationsAreEqual(oldSourceFile, newSourceFile) {
        if (!ts2.arrayIsEqualTo(oldSourceFile.ambientModuleNames, newSourceFile.ambientModuleNames)) {
          return false;
        }
        var oldFileStatementIndex = -1;
        var newFileStatementIndex = -1;
        var _loop_2 = function(ambientModuleName2) {
          var isMatchingModuleDeclaration = function(node) {
            return ts2.isNonGlobalAmbientModule(node) && node.name.text === ambientModuleName2;
          };
          oldFileStatementIndex = ts2.findIndex(oldSourceFile.statements, isMatchingModuleDeclaration, oldFileStatementIndex + 1);
          newFileStatementIndex = ts2.findIndex(newSourceFile.statements, isMatchingModuleDeclaration, newFileStatementIndex + 1);
          if (oldSourceFile.statements[oldFileStatementIndex] !== newSourceFile.statements[newFileStatementIndex]) {
            return { value: false };
          }
        };
        for (var _i = 0, _a = newSourceFile.ambientModuleNames; _i < _a.length; _i++) {
          var ambientModuleName = _a[_i];
          var state_2 = _loop_2(ambientModuleName);
          if (typeof state_2 === "object")
            return state_2.value;
        }
        return true;
      }
    }
    ts2.createCacheableExportInfoMap = createCacheableExportInfoMap;
    function isImportableFile(program, from, to, preferences, packageJsonFilter, moduleSpecifierResolutionHost, moduleSpecifierCache) {
      var _a;
      if (from === to)
        return false;
      var cachedResult = moduleSpecifierCache === null || moduleSpecifierCache === void 0 ? void 0 : moduleSpecifierCache.get(from.path, to.path, preferences);
      if ((cachedResult === null || cachedResult === void 0 ? void 0 : cachedResult.isAutoImportable) !== void 0) {
        return cachedResult.isAutoImportable;
      }
      var getCanonicalFileName = ts2.hostGetCanonicalFileName(moduleSpecifierResolutionHost);
      var globalTypingsCache = (_a = moduleSpecifierResolutionHost.getGlobalTypingsCacheLocation) === null || _a === void 0 ? void 0 : _a.call(moduleSpecifierResolutionHost);
      var hasImportablePath = !!ts2.moduleSpecifiers.forEachFileNameOfModule(from.fileName, to.fileName, moduleSpecifierResolutionHost, false, function(toPath) {
        var toFile = program.getSourceFile(toPath);
        return (toFile === to || !toFile) && isImportablePath(from.fileName, toPath, getCanonicalFileName, globalTypingsCache);
      });
      if (packageJsonFilter) {
        var isAutoImportable = hasImportablePath && packageJsonFilter.allowsImportingSourceFile(to, moduleSpecifierResolutionHost);
        moduleSpecifierCache === null || moduleSpecifierCache === void 0 ? void 0 : moduleSpecifierCache.setIsAutoImportable(from.path, to.path, preferences, isAutoImportable);
        return isAutoImportable;
      }
      return hasImportablePath;
    }
    ts2.isImportableFile = isImportableFile;
    function isImportablePath(fromPath, toPath, getCanonicalFileName, globalCachePath) {
      var toNodeModules = ts2.forEachAncestorDirectory(toPath, function(ancestor) {
        return ts2.getBaseFileName(ancestor) === "node_modules" ? ancestor : void 0;
      });
      var toNodeModulesParent = toNodeModules && ts2.getDirectoryPath(getCanonicalFileName(toNodeModules));
      return toNodeModulesParent === void 0 || ts2.startsWith(getCanonicalFileName(fromPath), toNodeModulesParent) || !!globalCachePath && ts2.startsWith(getCanonicalFileName(globalCachePath), toNodeModulesParent);
    }
    function forEachExternalModuleToImportFrom(program, host, useAutoImportProvider, cb) {
      var _a, _b;
      forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), function(module2, file) {
        return cb(module2, file, program, false);
      });
      var autoImportProvider = useAutoImportProvider && ((_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host));
      if (autoImportProvider) {
        var start = ts2.timestamp();
        forEachExternalModule(autoImportProvider.getTypeChecker(), autoImportProvider.getSourceFiles(), function(module2, file) {
          return cb(module2, file, autoImportProvider, true);
        });
        (_b = host.log) === null || _b === void 0 ? void 0 : _b.call(host, "forEachExternalModuleToImportFrom autoImportProvider: ".concat(ts2.timestamp() - start));
      }
    }
    ts2.forEachExternalModuleToImportFrom = forEachExternalModuleToImportFrom;
    function forEachExternalModule(checker, allSourceFiles, cb) {
      for (var _i = 0, _a = checker.getAmbientModules(); _i < _a.length; _i++) {
        var ambient = _a[_i];
        if (!ts2.stringContains(ambient.name, "*")) {
          cb(ambient, void 0);
        }
      }
      for (var _b = 0, allSourceFiles_1 = allSourceFiles; _b < allSourceFiles_1.length; _b++) {
        var sourceFile = allSourceFiles_1[_b];
        if (ts2.isExternalOrCommonJsModule(sourceFile)) {
          cb(checker.getMergedSymbol(sourceFile.symbol), sourceFile);
        }
      }
    }
    function getExportInfoMap(importingFile, host, program, cancellationToken) {
      var _a, _b, _c, _d, _e;
      var start = ts2.timestamp();
      (_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host);
      var cache = ((_b = host.getCachedExportInfoMap) === null || _b === void 0 ? void 0 : _b.call(host)) || createCacheableExportInfoMap({
        getCurrentProgram: function() {
          return program;
        },
        getPackageJsonAutoImportProvider: function() {
          var _a2;
          return (_a2 = host.getPackageJsonAutoImportProvider) === null || _a2 === void 0 ? void 0 : _a2.call(host);
        }
      });
      if (cache.isUsableByFile(importingFile.path)) {
        (_c = host.log) === null || _c === void 0 ? void 0 : _c.call(host, "getExportInfoMap: cache hit");
        return cache;
      }
      (_d = host.log) === null || _d === void 0 ? void 0 : _d.call(host, "getExportInfoMap: cache miss or empty; calculating new results");
      var compilerOptions = program.getCompilerOptions();
      var scriptTarget = ts2.getEmitScriptTarget(compilerOptions);
      var moduleCount = 0;
      forEachExternalModuleToImportFrom(program, host, true, function(moduleSymbol, moduleFile, program2, isFromPackageJson) {
        if (++moduleCount % 100 === 0)
          cancellationToken === null || cancellationToken === void 0 ? void 0 : cancellationToken.throwIfCancellationRequested();
        var seenExports = new ts2.Map();
        var checker = program2.getTypeChecker();
        var defaultInfo = getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions);
        if (defaultInfo && isImportableSymbol(defaultInfo.symbol, checker)) {
          cache.add(importingFile.path, defaultInfo.symbol, defaultInfo.exportKind === 1 ? "default" : "export=", moduleSymbol, moduleFile, defaultInfo.exportKind, isFromPackageJson, scriptTarget, checker);
        }
        checker.forEachExportAndPropertyOfModule(moduleSymbol, function(exported, key) {
          if (exported !== (defaultInfo === null || defaultInfo === void 0 ? void 0 : defaultInfo.symbol) && isImportableSymbol(exported, checker) && ts2.addToSeen(seenExports, key)) {
            cache.add(importingFile.path, exported, key, moduleSymbol, moduleFile, 0, isFromPackageJson, scriptTarget, checker);
          }
        });
      });
      (_e = host.log) === null || _e === void 0 ? void 0 : _e.call(host, "getExportInfoMap: done in ".concat(ts2.timestamp() - start, " ms"));
      return cache;
    }
    ts2.getExportInfoMap = getExportInfoMap;
    function getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions) {
      var exported = getDefaultLikeExportWorker(moduleSymbol, checker);
      if (!exported)
        return void 0;
      var symbol = exported.symbol, exportKind = exported.exportKind;
      var info = getDefaultExportInfoWorker(symbol, checker, compilerOptions);
      return info && __assign({ symbol, exportKind }, info);
    }
    ts2.getDefaultLikeExportInfo = getDefaultLikeExportInfo;
    function isImportableSymbol(symbol, checker) {
      return !checker.isUndefinedSymbol(symbol) && !checker.isUnknownSymbol(symbol) && !ts2.isKnownSymbol(symbol) && !ts2.isPrivateIdentifierSymbol(symbol);
    }
    function getDefaultLikeExportWorker(moduleSymbol, checker) {
      var exportEquals = checker.resolveExternalModuleSymbol(moduleSymbol);
      if (exportEquals !== moduleSymbol)
        return { symbol: exportEquals, exportKind: 2 };
      var defaultExport = checker.tryGetMemberInModuleExports("default", moduleSymbol);
      if (defaultExport)
        return { symbol: defaultExport, exportKind: 1 };
    }
    function getDefaultExportInfoWorker(defaultExport, checker, compilerOptions) {
      var localSymbol = ts2.getLocalSymbolForExportDefault(defaultExport);
      if (localSymbol)
        return { symbolForMeaning: localSymbol, name: localSymbol.name };
      var name = getNameForExportDefault(defaultExport);
      if (name !== void 0)
        return { symbolForMeaning: defaultExport, name };
      if (defaultExport.flags & 2097152) {
        var aliased = checker.getImmediateAliasedSymbol(defaultExport);
        if (aliased && aliased.parent) {
          return getDefaultExportInfoWorker(aliased, checker, compilerOptions);
        }
      }
      if (defaultExport.escapedName !== "default" && defaultExport.escapedName !== "export=") {
        return { symbolForMeaning: defaultExport, name: defaultExport.getName() };
      }
      return { symbolForMeaning: defaultExport, name: ts2.getNameForExportedSymbol(defaultExport, compilerOptions.target) };
    }
    function getNameForExportDefault(symbol) {
      return symbol.declarations && ts2.firstDefined(symbol.declarations, function(declaration) {
        var _a;
        if (ts2.isExportAssignment(declaration)) {
          return (_a = ts2.tryCast(ts2.skipOuterExpressions(declaration.expression), ts2.isIdentifier)) === null || _a === void 0 ? void 0 : _a.text;
        } else if (ts2.isExportSpecifier(declaration)) {
          ts2.Debug.assert(declaration.name.text === "default", "Expected the specifier to be a default export");
          return declaration.propertyName && declaration.propertyName.text;
        }
      });
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function createClassifier2() {
      var scanner = ts2.createScanner(99, false);
      function getClassificationsForLine(text, lexState, syntacticClassifierAbsent) {
        return convertClassificationsToResult(getEncodedLexicalClassifications(text, lexState, syntacticClassifierAbsent), text);
      }
      function getEncodedLexicalClassifications(text, lexState, syntacticClassifierAbsent) {
        var token = 0;
        var lastNonTriviaToken = 0;
        var templateStack = [];
        var _a = getPrefixFromLexState(lexState), prefix = _a.prefix, pushTemplate = _a.pushTemplate;
        text = prefix + text;
        var offset = prefix.length;
        if (pushTemplate) {
          templateStack.push(15);
        }
        scanner.setText(text);
        var endOfLineState = 0;
        var spans = [];
        var angleBracketStack = 0;
        do {
          token = scanner.scan();
          if (!ts2.isTrivia(token)) {
            handleToken();
            lastNonTriviaToken = token;
          }
          var end = scanner.getTextPos();
          pushEncodedClassification(scanner.getTokenPos(), end, offset, classFromKind(token), spans);
          if (end >= text.length) {
            var end_1 = getNewEndOfLineState(scanner, token, ts2.lastOrUndefined(templateStack));
            if (end_1 !== void 0) {
              endOfLineState = end_1;
            }
          }
        } while (token !== 1);
        function handleToken() {
          switch (token) {
            case 43:
            case 68:
              if (!noRegexTable[lastNonTriviaToken] && scanner.reScanSlashToken() === 13) {
                token = 13;
              }
              break;
            case 29:
              if (lastNonTriviaToken === 79) {
                angleBracketStack++;
              }
              break;
            case 31:
              if (angleBracketStack > 0) {
                angleBracketStack--;
              }
              break;
            case 130:
            case 149:
            case 146:
            case 133:
            case 150:
              if (angleBracketStack > 0 && !syntacticClassifierAbsent) {
                token = 79;
              }
              break;
            case 15:
              templateStack.push(token);
              break;
            case 18:
              if (templateStack.length > 0) {
                templateStack.push(token);
              }
              break;
            case 19:
              if (templateStack.length > 0) {
                var lastTemplateStackToken = ts2.lastOrUndefined(templateStack);
                if (lastTemplateStackToken === 15) {
                  token = scanner.reScanTemplateToken(false);
                  if (token === 17) {
                    templateStack.pop();
                  } else {
                    ts2.Debug.assertEqual(token, 16, "Should have been a template middle.");
                  }
                } else {
                  ts2.Debug.assertEqual(lastTemplateStackToken, 18, "Should have been an open brace");
                  templateStack.pop();
                }
              }
              break;
            default:
              if (!ts2.isKeyword(token)) {
                break;
              }
              if (lastNonTriviaToken === 24) {
                token = 79;
              } else if (ts2.isKeyword(lastNonTriviaToken) && ts2.isKeyword(token) && !canFollow(lastNonTriviaToken, token)) {
                token = 79;
              }
          }
        }
        return { endOfLineState, spans };
      }
      return { getClassificationsForLine, getEncodedLexicalClassifications };
    }
    ts2.createClassifier = createClassifier2;
    var noRegexTable = ts2.arrayToNumericMap([
      79,
      10,
      8,
      9,
      13,
      108,
      45,
      46,
      21,
      23,
      19,
      110,
      95
    ], function(token) {
      return token;
    }, function() {
      return true;
    });
    function getNewEndOfLineState(scanner, token, lastOnTemplateStack) {
      switch (token) {
        case 10: {
          if (!scanner.isUnterminated())
            return void 0;
          var tokenText = scanner.getTokenText();
          var lastCharIndex = tokenText.length - 1;
          var numBackslashes = 0;
          while (tokenText.charCodeAt(lastCharIndex - numBackslashes) === 92) {
            numBackslashes++;
          }
          if ((numBackslashes & 1) === 0)
            return void 0;
          return tokenText.charCodeAt(0) === 34 ? 3 : 2;
        }
        case 3:
          return scanner.isUnterminated() ? 1 : void 0;
        default:
          if (ts2.isTemplateLiteralKind(token)) {
            if (!scanner.isUnterminated()) {
              return void 0;
            }
            switch (token) {
              case 17:
                return 5;
              case 14:
                return 4;
              default:
                return ts2.Debug.fail("Only 'NoSubstitutionTemplateLiteral's and 'TemplateTail's can be unterminated; got SyntaxKind #" + token);
            }
          }
          return lastOnTemplateStack === 15 ? 6 : void 0;
      }
    }
    function pushEncodedClassification(start, end, offset, classification, result) {
      if (classification === 8) {
        return;
      }
      if (start === 0 && offset > 0) {
        start += offset;
      }
      var length = end - start;
      if (length > 0) {
        result.push(start - offset, length, classification);
      }
    }
    function convertClassificationsToResult(classifications, text) {
      var entries = [];
      var dense = classifications.spans;
      var lastEnd = 0;
      for (var i = 0; i < dense.length; i += 3) {
        var start = dense[i];
        var length_1 = dense[i + 1];
        var type = dense[i + 2];
        if (lastEnd >= 0) {
          var whitespaceLength_1 = start - lastEnd;
          if (whitespaceLength_1 > 0) {
            entries.push({ length: whitespaceLength_1, classification: ts2.TokenClass.Whitespace });
          }
        }
        entries.push({ length: length_1, classification: convertClassification(type) });
        lastEnd = start + length_1;
      }
      var whitespaceLength = text.length - lastEnd;
      if (whitespaceLength > 0) {
        entries.push({ length: whitespaceLength, classification: ts2.TokenClass.Whitespace });
      }
      return { entries, finalLexState: classifications.endOfLineState };
    }
    function convertClassification(type) {
      switch (type) {
        case 1:
          return ts2.TokenClass.Comment;
        case 3:
          return ts2.TokenClass.Keyword;
        case 4:
          return ts2.TokenClass.NumberLiteral;
        case 25:
          return ts2.TokenClass.BigIntLiteral;
        case 5:
          return ts2.TokenClass.Operator;
        case 6:
          return ts2.TokenClass.StringLiteral;
        case 8:
          return ts2.TokenClass.Whitespace;
        case 10:
          return ts2.TokenClass.Punctuation;
        case 2:
        case 11:
        case 12:
        case 13:
        case 14:
        case 15:
        case 16:
        case 9:
        case 17:
          return ts2.TokenClass.Identifier;
        default:
          return void 0;
      }
    }
    function canFollow(keyword1, keyword2) {
      if (!ts2.isAccessibilityModifier(keyword1)) {
        return true;
      }
      switch (keyword2) {
        case 136:
        case 148:
        case 134:
        case 124:
          return true;
        default:
          return false;
      }
    }
    function getPrefixFromLexState(lexState) {
      switch (lexState) {
        case 3:
          return { prefix: '"\\\n' };
        case 2:
          return { prefix: "'\\\n" };
        case 1:
          return { prefix: "/*\n" };
        case 4:
          return { prefix: "`\n" };
        case 5:
          return { prefix: "}\n", pushTemplate: true };
        case 6:
          return { prefix: "", pushTemplate: true };
        case 0:
          return { prefix: "" };
        default:
          return ts2.Debug.assertNever(lexState);
      }
    }
    function isBinaryExpressionOperatorToken(token) {
      switch (token) {
        case 41:
        case 43:
        case 44:
        case 39:
        case 40:
        case 47:
        case 48:
        case 49:
        case 29:
        case 31:
        case 32:
        case 33:
        case 102:
        case 101:
        case 127:
        case 34:
        case 35:
        case 36:
        case 37:
        case 50:
        case 52:
        case 51:
        case 55:
        case 56:
        case 74:
        case 73:
        case 78:
        case 70:
        case 71:
        case 72:
        case 64:
        case 65:
        case 66:
        case 68:
        case 69:
        case 63:
        case 27:
        case 60:
        case 75:
        case 76:
        case 77:
          return true;
        default:
          return false;
      }
    }
    function isPrefixUnaryExpressionOperatorToken(token) {
      switch (token) {
        case 39:
        case 40:
        case 54:
        case 53:
        case 45:
        case 46:
          return true;
        default:
          return false;
      }
    }
    function classFromKind(token) {
      if (ts2.isKeyword(token)) {
        return 3;
      } else if (isBinaryExpressionOperatorToken(token) || isPrefixUnaryExpressionOperatorToken(token)) {
        return 5;
      } else if (token >= 18 && token <= 78) {
        return 10;
      }
      switch (token) {
        case 8:
          return 4;
        case 9:
          return 25;
        case 10:
          return 6;
        case 13:
          return 7;
        case 7:
        case 3:
        case 2:
          return 1;
        case 5:
        case 4:
          return 8;
        case 79:
        default:
          if (ts2.isTemplateLiteralKind(token)) {
            return 6;
          }
          return 2;
      }
    }
    function getSemanticClassifications(typeChecker, cancellationToken, sourceFile, classifiableNames, span) {
      return convertClassificationsToSpans(getEncodedSemanticClassifications(typeChecker, cancellationToken, sourceFile, classifiableNames, span));
    }
    ts2.getSemanticClassifications = getSemanticClassifications;
    function checkForClassificationCancellation(cancellationToken, kind) {
      switch (kind) {
        case 260:
        case 256:
        case 257:
        case 255:
        case 225:
        case 212:
        case 213:
          cancellationToken.throwIfCancellationRequested();
      }
    }
    function getEncodedSemanticClassifications(typeChecker, cancellationToken, sourceFile, classifiableNames, span) {
      var spans = [];
      sourceFile.forEachChild(function cb(node) {
        if (!node || !ts2.textSpanIntersectsWith(span, node.pos, node.getFullWidth())) {
          return;
        }
        checkForClassificationCancellation(cancellationToken, node.kind);
        if (ts2.isIdentifier(node) && !ts2.nodeIsMissing(node) && classifiableNames.has(node.escapedText)) {
          var symbol = typeChecker.getSymbolAtLocation(node);
          var type = symbol && classifySymbol(symbol, ts2.getMeaningFromLocation(node), typeChecker);
          if (type) {
            pushClassification(node.getStart(sourceFile), node.getEnd(), type);
          }
        }
        node.forEachChild(cb);
      });
      return { spans, endOfLineState: 0 };
      function pushClassification(start, end, type) {
        var length = end - start;
        ts2.Debug.assert(length > 0, "Classification had non-positive length of ".concat(length));
        spans.push(start);
        spans.push(length);
        spans.push(type);
      }
    }
    ts2.getEncodedSemanticClassifications = getEncodedSemanticClassifications;
    function classifySymbol(symbol, meaningAtPosition, checker) {
      var flags = symbol.getFlags();
      if ((flags & 2885600) === 0) {
        return void 0;
      } else if (flags & 32) {
        return 11;
      } else if (flags & 384) {
        return 12;
      } else if (flags & 524288) {
        return 16;
      } else if (flags & 1536) {
        return meaningAtPosition & 4 || meaningAtPosition & 1 && hasValueSideModule(symbol) ? 14 : void 0;
      } else if (flags & 2097152) {
        return classifySymbol(checker.getAliasedSymbol(symbol), meaningAtPosition, checker);
      } else if (meaningAtPosition & 2) {
        return flags & 64 ? 13 : flags & 262144 ? 15 : void 0;
      } else {
        return void 0;
      }
    }
    function hasValueSideModule(symbol) {
      return ts2.some(symbol.declarations, function(declaration) {
        return ts2.isModuleDeclaration(declaration) && ts2.getModuleInstanceState(declaration) === 1;
      });
    }
    function getClassificationTypeName(type) {
      switch (type) {
        case 1:
          return "comment";
        case 2:
          return "identifier";
        case 3:
          return "keyword";
        case 4:
          return "number";
        case 25:
          return "bigint";
        case 5:
          return "operator";
        case 6:
          return "string";
        case 8:
          return "whitespace";
        case 9:
          return "text";
        case 10:
          return "punctuation";
        case 11:
          return "class name";
        case 12:
          return "enum name";
        case 13:
          return "interface name";
        case 14:
          return "module name";
        case 15:
          return "type parameter name";
        case 16:
          return "type alias name";
        case 17:
          return "parameter name";
        case 18:
          return "doc comment tag name";
        case 19:
          return "jsx open tag name";
        case 20:
          return "jsx close tag name";
        case 21:
          return "jsx self closing tag name";
        case 22:
          return "jsx attribute";
        case 23:
          return "jsx text";
        case 24:
          return "jsx attribute string literal value";
        default:
          return void 0;
      }
    }
    function convertClassificationsToSpans(classifications) {
      ts2.Debug.assert(classifications.spans.length % 3 === 0);
      var dense = classifications.spans;
      var result = [];
      for (var i = 0; i < dense.length; i += 3) {
        result.push({
          textSpan: ts2.createTextSpan(dense[i], dense[i + 1]),
          classificationType: getClassificationTypeName(dense[i + 2])
        });
      }
      return result;
    }
    function getSyntacticClassifications(cancellationToken, sourceFile, span) {
      return convertClassificationsToSpans(getEncodedSyntacticClassifications(cancellationToken, sourceFile, span));
    }
    ts2.getSyntacticClassifications = getSyntacticClassifications;
    function getEncodedSyntacticClassifications(cancellationToken, sourceFile, span) {
      var spanStart = span.start;
      var spanLength = span.length;
      var triviaScanner = ts2.createScanner(99, false, sourceFile.languageVariant, sourceFile.text);
      var mergeConflictScanner = ts2.createScanner(99, false, sourceFile.languageVariant, sourceFile.text);
      var result = [];
      processElement(sourceFile);
      return { spans: result, endOfLineState: 0 };
      function pushClassification(start, length, type) {
        result.push(start);
        result.push(length);
        result.push(type);
      }
      function classifyLeadingTriviaAndGetTokenStart(token) {
        triviaScanner.setTextPos(token.pos);
        while (true) {
          var start = triviaScanner.getTextPos();
          if (!ts2.couldStartTrivia(sourceFile.text, start)) {
            return start;
          }
          var kind = triviaScanner.scan();
          var end = triviaScanner.getTextPos();
          var width = end - start;
          if (!ts2.isTrivia(kind)) {
            return start;
          }
          switch (kind) {
            case 4:
            case 5:
              continue;
            case 2:
            case 3:
              classifyComment(token, kind, start, width);
              triviaScanner.setTextPos(end);
              continue;
            case 7:
              var text = sourceFile.text;
              var ch = text.charCodeAt(start);
              if (ch === 60 || ch === 62) {
                pushClassification(start, width, 1);
                continue;
              }
              ts2.Debug.assert(ch === 124 || ch === 61);
              classifyDisabledMergeCode(text, start, end);
              break;
            case 6:
              break;
            default:
              ts2.Debug.assertNever(kind);
          }
        }
      }
      function classifyComment(token, kind, start, width) {
        if (kind === 3) {
          var docCommentAndDiagnostics = ts2.parseIsolatedJSDocComment(sourceFile.text, start, width);
          if (docCommentAndDiagnostics && docCommentAndDiagnostics.jsDoc) {
            ts2.setParent(docCommentAndDiagnostics.jsDoc, token);
            classifyJSDocComment(docCommentAndDiagnostics.jsDoc);
            return;
          }
        } else if (kind === 2) {
          if (tryClassifyTripleSlashComment(start, width)) {
            return;
          }
        }
        pushCommentRange(start, width);
      }
      function pushCommentRange(start, width) {
        pushClassification(start, width, 1);
      }
      function classifyJSDocComment(docComment) {
        var _a, _b, _c, _d, _e, _f, _g;
        var pos = docComment.pos;
        if (docComment.tags) {
          for (var _i = 0, _h = docComment.tags; _i < _h.length; _i++) {
            var tag = _h[_i];
            if (tag.pos !== pos) {
              pushCommentRange(pos, tag.pos - pos);
            }
            pushClassification(tag.pos, 1, 10);
            pushClassification(tag.tagName.pos, tag.tagName.end - tag.tagName.pos, 18);
            pos = tag.tagName.end;
            var commentStart = tag.tagName.end;
            switch (tag.kind) {
              case 338:
                var param = tag;
                processJSDocParameterTag(param);
                commentStart = param.isNameFirst && ((_a = param.typeExpression) === null || _a === void 0 ? void 0 : _a.end) || param.name.end;
                break;
              case 345:
                var prop = tag;
                commentStart = prop.isNameFirst && ((_b = prop.typeExpression) === null || _b === void 0 ? void 0 : _b.end) || prop.name.end;
                break;
              case 342:
                processJSDocTemplateTag(tag);
                pos = tag.end;
                commentStart = tag.typeParameters.end;
                break;
              case 343:
                var type = tag;
                commentStart = ((_c = type.typeExpression) === null || _c === void 0 ? void 0 : _c.kind) === 307 && ((_d = type.fullName) === null || _d === void 0 ? void 0 : _d.end) || ((_e = type.typeExpression) === null || _e === void 0 ? void 0 : _e.end) || commentStart;
                break;
              case 336:
                commentStart = tag.typeExpression.end;
                break;
              case 341:
                processElement(tag.typeExpression);
                pos = tag.end;
                commentStart = tag.typeExpression.end;
                break;
              case 340:
              case 337:
                commentStart = tag.typeExpression.end;
                break;
              case 339:
                processElement(tag.typeExpression);
                pos = tag.end;
                commentStart = ((_f = tag.typeExpression) === null || _f === void 0 ? void 0 : _f.end) || commentStart;
                break;
              case 344:
                commentStart = ((_g = tag.name) === null || _g === void 0 ? void 0 : _g.end) || commentStart;
                break;
              case 326:
              case 327:
                commentStart = tag.class.end;
                break;
            }
            if (typeof tag.comment === "object") {
              pushCommentRange(tag.comment.pos, tag.comment.end - tag.comment.pos);
            } else if (typeof tag.comment === "string") {
              pushCommentRange(commentStart, tag.end - commentStart);
            }
          }
        }
        if (pos !== docComment.end) {
          pushCommentRange(pos, docComment.end - pos);
        }
        return;
        function processJSDocParameterTag(tag2) {
          if (tag2.isNameFirst) {
            pushCommentRange(pos, tag2.name.pos - pos);
            pushClassification(tag2.name.pos, tag2.name.end - tag2.name.pos, 17);
            pos = tag2.name.end;
          }
          if (tag2.typeExpression) {
            pushCommentRange(pos, tag2.typeExpression.pos - pos);
            processElement(tag2.typeExpression);
            pos = tag2.typeExpression.end;
          }
          if (!tag2.isNameFirst) {
            pushCommentRange(pos, tag2.name.pos - pos);
            pushClassification(tag2.name.pos, tag2.name.end - tag2.name.pos, 17);
            pos = tag2.name.end;
          }
        }
      }
      function tryClassifyTripleSlashComment(start, width) {
        var tripleSlashXMLCommentRegEx = /^(\/\/\/\s*)(<)(?:(\S+)((?:[^/]|\/[^>])*)(\/>)?)?/im;
        var attributeRegex = /(\s)(\S+)(\s*)(=)(\s*)('[^']+'|"[^"]+")/img;
        var text = sourceFile.text.substr(start, width);
        var match = tripleSlashXMLCommentRegEx.exec(text);
        if (!match) {
          return false;
        }
        if (!match[3] || !(match[3] in ts2.commentPragmas)) {
          return false;
        }
        var pos = start;
        pushCommentRange(pos, match[1].length);
        pos += match[1].length;
        pushClassification(pos, match[2].length, 10);
        pos += match[2].length;
        pushClassification(pos, match[3].length, 21);
        pos += match[3].length;
        var attrText = match[4];
        var attrPos = pos;
        while (true) {
          var attrMatch = attributeRegex.exec(attrText);
          if (!attrMatch) {
            break;
          }
          var newAttrPos = pos + attrMatch.index + attrMatch[1].length;
          if (newAttrPos > attrPos) {
            pushCommentRange(attrPos, newAttrPos - attrPos);
            attrPos = newAttrPos;
          }
          pushClassification(attrPos, attrMatch[2].length, 22);
          attrPos += attrMatch[2].length;
          if (attrMatch[3].length) {
            pushCommentRange(attrPos, attrMatch[3].length);
            attrPos += attrMatch[3].length;
          }
          pushClassification(attrPos, attrMatch[4].length, 5);
          attrPos += attrMatch[4].length;
          if (attrMatch[5].length) {
            pushCommentRange(attrPos, attrMatch[5].length);
            attrPos += attrMatch[5].length;
          }
          pushClassification(attrPos, attrMatch[6].length, 24);
          attrPos += attrMatch[6].length;
        }
        pos += match[4].length;
        if (pos > attrPos) {
          pushCommentRange(attrPos, pos - attrPos);
        }
        if (match[5]) {
          pushClassification(pos, match[5].length, 10);
          pos += match[5].length;
        }
        var end = start + width;
        if (pos < end) {
          pushCommentRange(pos, end - pos);
        }
        return true;
      }
      function processJSDocTemplateTag(tag) {
        for (var _i = 0, _a = tag.getChildren(); _i < _a.length; _i++) {
          var child = _a[_i];
          processElement(child);
        }
      }
      function classifyDisabledMergeCode(text, start, end) {
        var i;
        for (i = start; i < end; i++) {
          if (ts2.isLineBreak(text.charCodeAt(i))) {
            break;
          }
        }
        pushClassification(start, i - start, 1);
        mergeConflictScanner.setTextPos(i);
        while (mergeConflictScanner.getTextPos() < end) {
          classifyDisabledCodeToken();
        }
      }
      function classifyDisabledCodeToken() {
        var start = mergeConflictScanner.getTextPos();
        var tokenKind = mergeConflictScanner.scan();
        var end = mergeConflictScanner.getTextPos();
        var type = classifyTokenType(tokenKind);
        if (type) {
          pushClassification(start, end - start, type);
        }
      }
      function tryClassifyNode(node) {
        if (ts2.isJSDoc(node)) {
          return true;
        }
        if (ts2.nodeIsMissing(node)) {
          return true;
        }
        var classifiedElementName = tryClassifyJsxElementName(node);
        if (!ts2.isToken(node) && node.kind !== 11 && classifiedElementName === void 0) {
          return false;
        }
        var tokenStart = node.kind === 11 ? node.pos : classifyLeadingTriviaAndGetTokenStart(node);
        var tokenWidth = node.end - tokenStart;
        ts2.Debug.assert(tokenWidth >= 0);
        if (tokenWidth > 0) {
          var type = classifiedElementName || classifyTokenType(node.kind, node);
          if (type) {
            pushClassification(tokenStart, tokenWidth, type);
          }
        }
        return true;
      }
      function tryClassifyJsxElementName(token) {
        switch (token.parent && token.parent.kind) {
          case 279:
            if (token.parent.tagName === token) {
              return 19;
            }
            break;
          case 280:
            if (token.parent.tagName === token) {
              return 20;
            }
            break;
          case 278:
            if (token.parent.tagName === token) {
              return 21;
            }
            break;
          case 284:
            if (token.parent.name === token) {
              return 22;
            }
            break;
        }
        return void 0;
      }
      function classifyTokenType(tokenKind, token) {
        if (ts2.isKeyword(tokenKind)) {
          return 3;
        }
        if (tokenKind === 29 || tokenKind === 31) {
          if (token && ts2.getTypeArgumentOrTypeParameterList(token.parent)) {
            return 10;
          }
        }
        if (ts2.isPunctuation(tokenKind)) {
          if (token) {
            var parent = token.parent;
            if (tokenKind === 63) {
              if (parent.kind === 253 || parent.kind === 166 || parent.kind === 163 || parent.kind === 284) {
                return 5;
              }
            }
            if (parent.kind === 220 || parent.kind === 218 || parent.kind === 219 || parent.kind === 221) {
              return 5;
            }
          }
          return 10;
        } else if (tokenKind === 8) {
          return 4;
        } else if (tokenKind === 9) {
          return 25;
        } else if (tokenKind === 10) {
          return token && token.parent.kind === 284 ? 24 : 6;
        } else if (tokenKind === 13) {
          return 6;
        } else if (ts2.isTemplateLiteralKind(tokenKind)) {
          return 6;
        } else if (tokenKind === 11) {
          return 23;
        } else if (tokenKind === 79) {
          if (token) {
            switch (token.parent.kind) {
              case 256:
                if (token.parent.name === token) {
                  return 11;
                }
                return;
              case 162:
                if (token.parent.name === token) {
                  return 15;
                }
                return;
              case 257:
                if (token.parent.name === token) {
                  return 13;
                }
                return;
              case 259:
                if (token.parent.name === token) {
                  return 12;
                }
                return;
              case 260:
                if (token.parent.name === token) {
                  return 14;
                }
                return;
              case 163:
                if (token.parent.name === token) {
                  return ts2.isThisIdentifier(token) ? 3 : 17;
                }
                return;
            }
          }
          return 2;
        }
      }
      function processElement(element) {
        if (!element) {
          return;
        }
        if (ts2.decodedTextSpanIntersectsWith(spanStart, spanLength, element.pos, element.getFullWidth())) {
          checkForClassificationCancellation(cancellationToken, element.kind);
          for (var _i = 0, _a = element.getChildren(sourceFile); _i < _a.length; _i++) {
            var child = _a[_i];
            if (!tryClassifyNode(child)) {
              processElement(child);
            }
          }
        }
      }
    }
    ts2.getEncodedSyntacticClassifications = getEncodedSyntacticClassifications;
  })(ts || (ts = {}));
  (function(ts2) {
    var classifier;
    (function(classifier2) {
      var v2020;
      (function(v20202) {
        var TokenEncodingConsts;
        (function(TokenEncodingConsts2) {
          TokenEncodingConsts2[TokenEncodingConsts2["typeOffset"] = 8] = "typeOffset";
          TokenEncodingConsts2[TokenEncodingConsts2["modifierMask"] = 255] = "modifierMask";
        })(TokenEncodingConsts = v20202.TokenEncodingConsts || (v20202.TokenEncodingConsts = {}));
        var TokenType;
        (function(TokenType2) {
          TokenType2[TokenType2["class"] = 0] = "class";
          TokenType2[TokenType2["enum"] = 1] = "enum";
          TokenType2[TokenType2["interface"] = 2] = "interface";
          TokenType2[TokenType2["namespace"] = 3] = "namespace";
          TokenType2[TokenType2["typeParameter"] = 4] = "typeParameter";
          TokenType2[TokenType2["type"] = 5] = "type";
          TokenType2[TokenType2["parameter"] = 6] = "parameter";
          TokenType2[TokenType2["variable"] = 7] = "variable";
          TokenType2[TokenType2["enumMember"] = 8] = "enumMember";
          TokenType2[TokenType2["property"] = 9] = "property";
          TokenType2[TokenType2["function"] = 10] = "function";
          TokenType2[TokenType2["member"] = 11] = "member";
        })(TokenType = v20202.TokenType || (v20202.TokenType = {}));
        var TokenModifier;
        (function(TokenModifier2) {
          TokenModifier2[TokenModifier2["declaration"] = 0] = "declaration";
          TokenModifier2[TokenModifier2["static"] = 1] = "static";
          TokenModifier2[TokenModifier2["async"] = 2] = "async";
          TokenModifier2[TokenModifier2["readonly"] = 3] = "readonly";
          TokenModifier2[TokenModifier2["defaultLibrary"] = 4] = "defaultLibrary";
          TokenModifier2[TokenModifier2["local"] = 5] = "local";
        })(TokenModifier = v20202.TokenModifier || (v20202.TokenModifier = {}));
        function getSemanticClassifications(program, cancellationToken, sourceFile, span) {
          var classifications = getEncodedSemanticClassifications(program, cancellationToken, sourceFile, span);
          ts2.Debug.assert(classifications.spans.length % 3 === 0);
          var dense = classifications.spans;
          var result = [];
          for (var i = 0; i < dense.length; i += 3) {
            result.push({
              textSpan: ts2.createTextSpan(dense[i], dense[i + 1]),
              classificationType: dense[i + 2]
            });
          }
          return result;
        }
        v20202.getSemanticClassifications = getSemanticClassifications;
        function getEncodedSemanticClassifications(program, cancellationToken, sourceFile, span) {
          return {
            spans: getSemanticTokens(program, sourceFile, span, cancellationToken),
            endOfLineState: 0
          };
        }
        v20202.getEncodedSemanticClassifications = getEncodedSemanticClassifications;
        function getSemanticTokens(program, sourceFile, span, cancellationToken) {
          var resultTokens = [];
          var collector = function(node, typeIdx, modifierSet) {
            resultTokens.push(node.getStart(sourceFile), node.getWidth(sourceFile), (typeIdx + 1 << 8) + modifierSet);
          };
          if (program && sourceFile) {
            collectTokens(program, sourceFile, span, collector, cancellationToken);
          }
          return resultTokens;
        }
        function collectTokens(program, sourceFile, span, collector, cancellationToken) {
          var typeChecker = program.getTypeChecker();
          var inJSXElement = false;
          function visit(node) {
            switch (node.kind) {
              case 260:
              case 256:
              case 257:
              case 255:
              case 225:
              case 212:
              case 213:
                cancellationToken.throwIfCancellationRequested();
            }
            if (!node || !ts2.textSpanIntersectsWith(span, node.pos, node.getFullWidth()) || node.getFullWidth() === 0) {
              return;
            }
            var prevInJSXElement = inJSXElement;
            if (ts2.isJsxElement(node) || ts2.isJsxSelfClosingElement(node)) {
              inJSXElement = true;
            }
            if (ts2.isJsxExpression(node)) {
              inJSXElement = false;
            }
            if (ts2.isIdentifier(node) && !inJSXElement && !inImportClause(node) && !ts2.isInfinityOrNaNString(node.escapedText)) {
              var symbol = typeChecker.getSymbolAtLocation(node);
              if (symbol) {
                if (symbol.flags & 2097152) {
                  symbol = typeChecker.getAliasedSymbol(symbol);
                }
                var typeIdx = classifySymbol(symbol, ts2.getMeaningFromLocation(node));
                if (typeIdx !== void 0) {
                  var modifierSet = 0;
                  if (node.parent) {
                    var parentIsDeclaration = ts2.isBindingElement(node.parent) || tokenFromDeclarationMapping.get(node.parent.kind) === typeIdx;
                    if (parentIsDeclaration && node.parent.name === node) {
                      modifierSet = 1 << 0;
                    }
                  }
                  if (typeIdx === 6 && isRightSideOfQualifiedNameOrPropertyAccess(node)) {
                    typeIdx = 9;
                  }
                  typeIdx = reclassifyByType(typeChecker, node, typeIdx);
                  var decl = symbol.valueDeclaration;
                  if (decl) {
                    var modifiers = ts2.getCombinedModifierFlags(decl);
                    var nodeFlags = ts2.getCombinedNodeFlags(decl);
                    if (modifiers & 32) {
                      modifierSet |= 1 << 1;
                    }
                    if (modifiers & 256) {
                      modifierSet |= 1 << 2;
                    }
                    if (typeIdx !== 0 && typeIdx !== 2) {
                      if (modifiers & 64 || nodeFlags & 2 || symbol.getFlags() & 8) {
                        modifierSet |= 1 << 3;
                      }
                    }
                    if ((typeIdx === 7 || typeIdx === 10) && isLocalDeclaration(decl, sourceFile)) {
                      modifierSet |= 1 << 5;
                    }
                    if (program.isSourceFileDefaultLibrary(decl.getSourceFile())) {
                      modifierSet |= 1 << 4;
                    }
                  } else if (symbol.declarations && symbol.declarations.some(function(d) {
                    return program.isSourceFileDefaultLibrary(d.getSourceFile());
                  })) {
                    modifierSet |= 1 << 4;
                  }
                  collector(node, typeIdx, modifierSet);
                }
              }
            }
            ts2.forEachChild(node, visit);
            inJSXElement = prevInJSXElement;
          }
          visit(sourceFile);
        }
        function classifySymbol(symbol, meaning) {
          var flags = symbol.getFlags();
          if (flags & 32) {
            return 0;
          } else if (flags & 384) {
            return 1;
          } else if (flags & 524288) {
            return 5;
          } else if (flags & 64) {
            if (meaning & 2) {
              return 2;
            }
          } else if (flags & 262144) {
            return 4;
          }
          var decl = symbol.valueDeclaration || symbol.declarations && symbol.declarations[0];
          if (decl && ts2.isBindingElement(decl)) {
            decl = getDeclarationForBindingElement(decl);
          }
          return decl && tokenFromDeclarationMapping.get(decl.kind);
        }
        function reclassifyByType(typeChecker, node, typeIdx) {
          if (typeIdx === 7 || typeIdx === 9 || typeIdx === 6) {
            var type_1 = typeChecker.getTypeAtLocation(node);
            if (type_1) {
              var test = function(condition) {
                return condition(type_1) || type_1.isUnion() && type_1.types.some(condition);
              };
              if (typeIdx !== 6 && test(function(t) {
                return t.getConstructSignatures().length > 0;
              })) {
                return 0;
              }
              if (test(function(t) {
                return t.getCallSignatures().length > 0;
              }) && !test(function(t) {
                return t.getProperties().length > 0;
              }) || isExpressionInCallExpression(node)) {
                return typeIdx === 9 ? 11 : 10;
              }
            }
          }
          return typeIdx;
        }
        function isLocalDeclaration(decl, sourceFile) {
          if (ts2.isBindingElement(decl)) {
            decl = getDeclarationForBindingElement(decl);
          }
          if (ts2.isVariableDeclaration(decl)) {
            return (!ts2.isSourceFile(decl.parent.parent.parent) || ts2.isCatchClause(decl.parent)) && decl.getSourceFile() === sourceFile;
          } else if (ts2.isFunctionDeclaration(decl)) {
            return !ts2.isSourceFile(decl.parent) && decl.getSourceFile() === sourceFile;
          }
          return false;
        }
        function getDeclarationForBindingElement(element) {
          while (true) {
            if (ts2.isBindingElement(element.parent.parent)) {
              element = element.parent.parent;
            } else {
              return element.parent.parent;
            }
          }
        }
        function inImportClause(node) {
          var parent = node.parent;
          return parent && (ts2.isImportClause(parent) || ts2.isImportSpecifier(parent) || ts2.isNamespaceImport(parent));
        }
        function isExpressionInCallExpression(node) {
          while (isRightSideOfQualifiedNameOrPropertyAccess(node)) {
            node = node.parent;
          }
          return ts2.isCallExpression(node.parent) && node.parent.expression === node;
        }
        function isRightSideOfQualifiedNameOrPropertyAccess(node) {
          return ts2.isQualifiedName(node.parent) && node.parent.right === node || ts2.isPropertyAccessExpression(node.parent) && node.parent.name === node;
        }
        var tokenFromDeclarationMapping = new ts2.Map([
          [253, 7],
          [163, 6],
          [166, 9],
          [260, 3],
          [259, 1],
          [297, 8],
          [256, 0],
          [168, 11],
          [255, 10],
          [212, 10],
          [167, 11],
          [171, 9],
          [172, 9],
          [165, 9],
          [257, 2],
          [258, 5],
          [162, 4],
          [294, 9],
          [295, 9]
        ]);
      })(v2020 = classifier2.v2020 || (classifier2.v2020 = {}));
    })(classifier = ts2.classifier || (ts2.classifier = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var Completions;
    (function(Completions2) {
      var StringCompletions;
      (function(StringCompletions2) {
        function getStringLiteralCompletions(sourceFile, position, contextToken, options, host, program, log, preferences) {
          if (ts2.isInReferenceComment(sourceFile, position)) {
            var entries = getTripleSlashReferenceCompletion(sourceFile, position, options, host);
            return entries && convertPathCompletions(entries);
          }
          if (ts2.isInString(sourceFile, position, contextToken)) {
            if (!contextToken || !ts2.isStringLiteralLike(contextToken))
              return void 0;
            var entries = getStringLiteralCompletionEntries(sourceFile, contextToken, position, program.getTypeChecker(), options, host, preferences);
            return convertStringLiteralCompletions(entries, contextToken, sourceFile, host, program, log, options, preferences);
          }
        }
        StringCompletions2.getStringLiteralCompletions = getStringLiteralCompletions;
        function convertStringLiteralCompletions(completion, contextToken, sourceFile, host, program, log, options, preferences) {
          if (completion === void 0) {
            return void 0;
          }
          var optionalReplacementSpan = ts2.createTextSpanFromStringLiteralLikeContent(contextToken);
          switch (completion.kind) {
            case 0:
              return convertPathCompletions(completion.paths);
            case 1: {
              var entries = [];
              Completions2.getCompletionEntriesFromSymbols(completion.symbols, entries, contextToken, contextToken, sourceFile, sourceFile, host, program, 99, log, 4, preferences, options);
              return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: completion.hasIndexSignature, optionalReplacementSpan, entries };
            }
            case 2: {
              var entries = completion.types.map(function(type) {
                return {
                  name: type.value,
                  kindModifiers: "",
                  kind: "string",
                  sortText: Completions2.SortText.LocationPriority,
                  replacementSpan: ts2.getReplacementSpanForContextToken(contextToken)
                };
              });
              return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: completion.isNewIdentifier, optionalReplacementSpan, entries };
            }
            default:
              return ts2.Debug.assertNever(completion);
          }
        }
        function getStringLiteralCompletionDetails(name, sourceFile, position, contextToken, checker, options, host, cancellationToken, preferences) {
          if (!contextToken || !ts2.isStringLiteralLike(contextToken))
            return void 0;
          var completions = getStringLiteralCompletionEntries(sourceFile, contextToken, position, checker, options, host, preferences);
          return completions && stringLiteralCompletionDetails(name, contextToken, completions, sourceFile, checker, cancellationToken);
        }
        StringCompletions2.getStringLiteralCompletionDetails = getStringLiteralCompletionDetails;
        function stringLiteralCompletionDetails(name, location, completion, sourceFile, checker, cancellationToken) {
          switch (completion.kind) {
            case 0: {
              var match = ts2.find(completion.paths, function(p) {
                return p.name === name;
              });
              return match && Completions2.createCompletionDetails(name, kindModifiersFromExtension(match.extension), match.kind, [ts2.textPart(name)]);
            }
            case 1: {
              var match = ts2.find(completion.symbols, function(s) {
                return s.name === name;
              });
              return match && Completions2.createCompletionDetailsForSymbol(match, checker, sourceFile, location, cancellationToken);
            }
            case 2:
              return ts2.find(completion.types, function(t) {
                return t.value === name;
              }) ? Completions2.createCompletionDetails(name, "", "type", [ts2.textPart(name)]) : void 0;
            default:
              return ts2.Debug.assertNever(completion);
          }
        }
        function convertPathCompletions(pathCompletions) {
          var isGlobalCompletion = false;
          var isNewIdentifierLocation = true;
          var entries = pathCompletions.map(function(_a) {
            var name = _a.name, kind = _a.kind, span = _a.span, extension = _a.extension;
            return { name, kind, kindModifiers: kindModifiersFromExtension(extension), sortText: Completions2.SortText.LocationPriority, replacementSpan: span };
          });
          return { isGlobalCompletion, isMemberCompletion: false, isNewIdentifierLocation, entries };
        }
        function kindModifiersFromExtension(extension) {
          switch (extension) {
            case ".d.ts":
              return ".d.ts";
            case ".js":
              return ".js";
            case ".json":
              return ".json";
            case ".jsx":
              return ".jsx";
            case ".ts":
              return ".ts";
            case ".tsx":
              return ".tsx";
            case ".d.mts":
              return ".d.mts";
            case ".mjs":
              return ".mjs";
            case ".mts":
              return ".mts";
            case ".d.cts":
              return ".d.cts";
            case ".cjs":
              return ".cjs";
            case ".cts":
              return ".cts";
            case ".tsbuildinfo":
              return ts2.Debug.fail("Extension ".concat(".tsbuildinfo", " is unsupported."));
            case void 0:
              return "";
            default:
              return ts2.Debug.assertNever(extension);
          }
        }
        var StringLiteralCompletionKind;
        (function(StringLiteralCompletionKind2) {
          StringLiteralCompletionKind2[StringLiteralCompletionKind2["Paths"] = 0] = "Paths";
          StringLiteralCompletionKind2[StringLiteralCompletionKind2["Properties"] = 1] = "Properties";
          StringLiteralCompletionKind2[StringLiteralCompletionKind2["Types"] = 2] = "Types";
        })(StringLiteralCompletionKind || (StringLiteralCompletionKind = {}));
        function getStringLiteralCompletionEntries(sourceFile, node, position, typeChecker, compilerOptions, host, preferences) {
          var parent = walkUpParentheses(node.parent);
          switch (parent.kind) {
            case 195: {
              var grandParent = walkUpParentheses(parent.parent);
              switch (grandParent.kind) {
                case 177: {
                  var typeReference_1 = grandParent;
                  var typeArgument = ts2.findAncestor(parent, function(n) {
                    return n.parent === typeReference_1;
                  });
                  if (typeArgument) {
                    return { kind: 2, types: getStringLiteralTypes(typeChecker.getTypeArgumentConstraint(typeArgument)), isNewIdentifier: false };
                  }
                  return void 0;
                }
                case 193:
                  var _a = grandParent, indexType = _a.indexType, objectType = _a.objectType;
                  if (!ts2.rangeContainsPosition(indexType, position)) {
                    return void 0;
                  }
                  return stringLiteralCompletionsFromProperties(typeChecker.getTypeFromTypeNode(objectType));
                case 199:
                  return { kind: 0, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) };
                case 186: {
                  if (!ts2.isTypeReferenceNode(grandParent.parent)) {
                    return void 0;
                  }
                  var alreadyUsedTypes_1 = getAlreadyUsedTypesInStringLiteralUnion(grandParent, parent);
                  var types = getStringLiteralTypes(typeChecker.getTypeArgumentConstraint(grandParent)).filter(function(t) {
                    return !ts2.contains(alreadyUsedTypes_1, t.value);
                  });
                  return { kind: 2, types, isNewIdentifier: false };
                }
                default:
                  return void 0;
              }
            }
            case 294:
              if (ts2.isObjectLiteralExpression(parent.parent) && parent.name === node) {
                return stringLiteralCompletionsForObjectLiteral(typeChecker, parent.parent);
              }
              return fromContextualType();
            case 206: {
              var _b = parent, expression = _b.expression, argumentExpression = _b.argumentExpression;
              if (node === ts2.skipParentheses(argumentExpression)) {
                return stringLiteralCompletionsFromProperties(typeChecker.getTypeAtLocation(expression));
              }
              return void 0;
            }
            case 207:
            case 208:
              if (!isRequireCallArgument(node) && !ts2.isImportCall(parent)) {
                var argumentInfo = ts2.SignatureHelp.getArgumentInfoForCompletions(node, position, sourceFile);
                return argumentInfo ? getStringLiteralCompletionsFromSignature(argumentInfo, typeChecker) : fromContextualType();
              }
            case 265:
            case 271:
            case 276:
              return { kind: 0, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) };
            default:
              return fromContextualType();
          }
          function fromContextualType() {
            return { kind: 2, types: getStringLiteralTypes(ts2.getContextualTypeFromParent(node, typeChecker)), isNewIdentifier: false };
          }
        }
        function walkUpParentheses(node) {
          switch (node.kind) {
            case 190:
              return ts2.walkUpParenthesizedTypes(node);
            case 211:
              return ts2.walkUpParenthesizedExpressions(node);
            default:
              return node;
          }
        }
        function getAlreadyUsedTypesInStringLiteralUnion(union, current) {
          return ts2.mapDefined(union.types, function(type) {
            return type !== current && ts2.isLiteralTypeNode(type) && ts2.isStringLiteral(type.literal) ? type.literal.text : void 0;
          });
        }
        function getStringLiteralCompletionsFromSignature(argumentInfo, checker) {
          var isNewIdentifier = false;
          var uniques = new ts2.Map();
          var candidates = [];
          checker.getResolvedSignature(argumentInfo.invocation, candidates, argumentInfo.argumentCount);
          var types = ts2.flatMap(candidates, function(candidate) {
            if (!ts2.signatureHasRestParameter(candidate) && argumentInfo.argumentCount > candidate.parameters.length)
              return;
            var type = checker.getParameterType(candidate, argumentInfo.argumentIndex);
            isNewIdentifier = isNewIdentifier || !!(type.flags & 4);
            return getStringLiteralTypes(type, uniques);
          });
          return { kind: 2, types, isNewIdentifier };
        }
        function stringLiteralCompletionsFromProperties(type) {
          return type && {
            kind: 1,
            symbols: ts2.filter(type.getApparentProperties(), function(prop) {
              return !(prop.valueDeclaration && ts2.isPrivateIdentifierClassElementDeclaration(prop.valueDeclaration));
            }),
            hasIndexSignature: ts2.hasIndexSignature(type)
          };
        }
        function stringLiteralCompletionsForObjectLiteral(checker, objectLiteralExpression) {
          var contextualType = checker.getContextualType(objectLiteralExpression);
          if (!contextualType)
            return void 0;
          var completionsType = checker.getContextualType(objectLiteralExpression, 4);
          var symbols = Completions2.getPropertiesForObjectExpression(contextualType, completionsType, objectLiteralExpression, checker);
          return {
            kind: 1,
            symbols,
            hasIndexSignature: ts2.hasIndexSignature(contextualType)
          };
        }
        function getStringLiteralTypes(type, uniques) {
          if (uniques === void 0) {
            uniques = new ts2.Map();
          }
          if (!type)
            return ts2.emptyArray;
          type = ts2.skipConstraint(type);
          return type.isUnion() ? ts2.flatMap(type.types, function(t) {
            return getStringLiteralTypes(t, uniques);
          }) : type.isStringLiteral() && !(type.flags & 1024) && ts2.addToSeen(uniques, type.value) ? [type] : ts2.emptyArray;
        }
        function nameAndKind(name, kind, extension) {
          return { name, kind, extension };
        }
        function directoryResult(name) {
          return nameAndKind(name, "directory", void 0);
        }
        function addReplacementSpans(text, textStart, names) {
          var span = getDirectoryFragmentTextSpan(text, textStart);
          var wholeSpan = text.length === 0 ? void 0 : ts2.createTextSpan(textStart, text.length);
          return names.map(function(_a) {
            var name = _a.name, kind = _a.kind, extension = _a.extension;
            return Math.max(name.indexOf(ts2.directorySeparator), name.indexOf(ts2.altDirectorySeparator)) !== -1 ? { name, kind, extension, span: wholeSpan } : { name, kind, extension, span };
          });
        }
        function getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) {
          return addReplacementSpans(node.text, node.getStart(sourceFile) + 1, getStringLiteralCompletionsFromModuleNamesWorker(sourceFile, node, compilerOptions, host, typeChecker, preferences));
        }
        function getStringLiteralCompletionsFromModuleNamesWorker(sourceFile, node, compilerOptions, host, typeChecker, preferences) {
          var literalValue = ts2.normalizeSlashes(node.text);
          var scriptPath = sourceFile.path;
          var scriptDirectory = ts2.getDirectoryPath(scriptPath);
          return isPathRelativeToScript(literalValue) || !compilerOptions.baseUrl && (ts2.isRootedDiskPath(literalValue) || ts2.isUrl(literalValue)) ? getCompletionEntriesForRelativeModules(literalValue, scriptDirectory, compilerOptions, host, scriptPath, getIncludeExtensionOption()) : getCompletionEntriesForNonRelativeModules(literalValue, scriptDirectory, compilerOptions, host, typeChecker);
          function getIncludeExtensionOption() {
            var mode = ts2.isStringLiteralLike(node) ? ts2.getModeForUsageLocation(sourceFile, node) : void 0;
            return preferences.importModuleSpecifierEnding === "js" || mode === ts2.ModuleKind.ESNext ? 2 : 0;
          }
        }
        function getExtensionOptions(compilerOptions, includeExtensionsOption) {
          if (includeExtensionsOption === void 0) {
            includeExtensionsOption = 0;
          }
          return { extensions: ts2.flatten(getSupportedExtensionsForModuleResolution(compilerOptions)), includeExtensionsOption };
        }
        function getCompletionEntriesForRelativeModules(literalValue, scriptDirectory, compilerOptions, host, scriptPath, includeExtensions) {
          var extensionOptions = getExtensionOptions(compilerOptions, includeExtensions);
          if (compilerOptions.rootDirs) {
            return getCompletionEntriesForDirectoryFragmentWithRootDirs(compilerOptions.rootDirs, literalValue, scriptDirectory, extensionOptions, compilerOptions, host, scriptPath);
          } else {
            return getCompletionEntriesForDirectoryFragment(literalValue, scriptDirectory, extensionOptions, host, scriptPath);
          }
        }
        function getSupportedExtensionsForModuleResolution(compilerOptions) {
          var extensions = ts2.getSupportedExtensions(compilerOptions);
          return ts2.getEmitModuleResolutionKind(compilerOptions) === ts2.ModuleResolutionKind.NodeJs ? ts2.getSupportedExtensionsWithJsonIfResolveJsonModule(compilerOptions, extensions) : extensions;
        }
        function getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptDirectory, ignoreCase) {
          rootDirs = rootDirs.map(function(rootDirectory) {
            return ts2.normalizePath(ts2.isRootedDiskPath(rootDirectory) ? rootDirectory : ts2.combinePaths(basePath, rootDirectory));
          });
          var relativeDirectory = ts2.firstDefined(rootDirs, function(rootDirectory) {
            return ts2.containsPath(rootDirectory, scriptDirectory, basePath, ignoreCase) ? scriptDirectory.substr(rootDirectory.length) : void 0;
          });
          return ts2.deduplicate(__spreadArray(__spreadArray([], rootDirs.map(function(rootDirectory) {
            return ts2.combinePaths(rootDirectory, relativeDirectory);
          }), true), [scriptDirectory], false), ts2.equateStringsCaseSensitive, ts2.compareStringsCaseSensitive);
        }
        function getCompletionEntriesForDirectoryFragmentWithRootDirs(rootDirs, fragment, scriptDirectory, extensionOptions, compilerOptions, host, exclude) {
          var basePath = compilerOptions.project || host.getCurrentDirectory();
          var ignoreCase = !(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames());
          var baseDirectories = getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptDirectory, ignoreCase);
          return ts2.flatMap(baseDirectories, function(baseDirectory) {
            return getCompletionEntriesForDirectoryFragment(fragment, baseDirectory, extensionOptions, host, exclude);
          });
        }
        var IncludeExtensionsOption;
        (function(IncludeExtensionsOption2) {
          IncludeExtensionsOption2[IncludeExtensionsOption2["Exclude"] = 0] = "Exclude";
          IncludeExtensionsOption2[IncludeExtensionsOption2["Include"] = 1] = "Include";
          IncludeExtensionsOption2[IncludeExtensionsOption2["ModuleSpecifierCompletion"] = 2] = "ModuleSpecifierCompletion";
        })(IncludeExtensionsOption || (IncludeExtensionsOption = {}));
        function getCompletionEntriesForDirectoryFragment(fragment, scriptPath, _a, host, exclude, result) {
          var extensions = _a.extensions, includeExtensionsOption = _a.includeExtensionsOption;
          if (result === void 0) {
            result = [];
          }
          if (fragment === void 0) {
            fragment = "";
          }
          fragment = ts2.normalizeSlashes(fragment);
          if (!ts2.hasTrailingDirectorySeparator(fragment)) {
            fragment = ts2.getDirectoryPath(fragment);
          }
          if (fragment === "") {
            fragment = "." + ts2.directorySeparator;
          }
          fragment = ts2.ensureTrailingDirectorySeparator(fragment);
          var absolutePath = ts2.resolvePath(scriptPath, fragment);
          var baseDirectory = ts2.hasTrailingDirectorySeparator(absolutePath) ? absolutePath : ts2.getDirectoryPath(absolutePath);
          var ignoreCase = !(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames());
          if (!ts2.tryDirectoryExists(host, baseDirectory))
            return result;
          var files = ts2.tryReadDirectory(host, baseDirectory, extensions, void 0, ["./*"]);
          if (files) {
            var foundFiles = new ts2.Map();
            for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
              var filePath = files_1[_i];
              filePath = ts2.normalizePath(filePath);
              if (exclude && ts2.comparePaths(filePath, exclude, scriptPath, ignoreCase) === 0) {
                continue;
              }
              var foundFileName = void 0;
              var outputExtension = ts2.moduleSpecifiers.tryGetJSExtensionForFile(filePath, host.getCompilationSettings());
              if (includeExtensionsOption === 0 && !ts2.fileExtensionIsOneOf(filePath, [".json", ".mts", ".cts", ".d.mts", ".d.cts", ".mjs", ".cjs"])) {
                foundFileName = ts2.removeFileExtension(ts2.getBaseFileName(filePath));
                foundFiles.set(foundFileName, ts2.tryGetExtensionFromPath(filePath));
              } else if ((ts2.fileExtensionIsOneOf(filePath, [".mts", ".cts", ".d.mts", ".d.cts", ".mjs", ".cjs"]) || includeExtensionsOption === 2) && outputExtension) {
                foundFileName = ts2.changeExtension(ts2.getBaseFileName(filePath), outputExtension);
                foundFiles.set(foundFileName, outputExtension);
              } else {
                foundFileName = ts2.getBaseFileName(filePath);
                foundFiles.set(foundFileName, ts2.tryGetExtensionFromPath(filePath));
              }
            }
            foundFiles.forEach(function(ext, foundFile) {
              result.push(nameAndKind(foundFile, "script", ext));
            });
          }
          var directories = ts2.tryGetDirectories(host, baseDirectory);
          if (directories) {
            for (var _b = 0, directories_1 = directories; _b < directories_1.length; _b++) {
              var directory = directories_1[_b];
              var directoryName = ts2.getBaseFileName(ts2.normalizePath(directory));
              if (directoryName !== "@types") {
                result.push(directoryResult(directoryName));
              }
            }
          }
          var packageJsonPath = ts2.findPackageJson(baseDirectory, host);
          if (packageJsonPath) {
            var packageJson = ts2.readJson(packageJsonPath, host);
            var typesVersions = packageJson.typesVersions;
            if (typeof typesVersions === "object") {
              var versionResult = ts2.getPackageJsonTypesVersionsPaths(typesVersions);
              var versionPaths = versionResult && versionResult.paths;
              var rest = absolutePath.slice(ts2.ensureTrailingDirectorySeparator(baseDirectory).length);
              if (versionPaths) {
                addCompletionEntriesFromPaths(result, rest, baseDirectory, extensions, versionPaths, host);
              }
            }
          }
          return result;
        }
        function addCompletionEntriesFromPaths(result, fragment, baseDirectory, fileExtensions, paths, host) {
          for (var path in paths) {
            if (!ts2.hasProperty(paths, path))
              continue;
            var patterns = paths[path];
            if (patterns) {
              var _loop_3 = function(name2, kind2, extension2) {
                if (!result.some(function(entry) {
                  return entry.name === name2;
                })) {
                  result.push(nameAndKind(name2, kind2, extension2));
                }
              };
              for (var _i = 0, _a = getCompletionsForPathMapping(path, patterns, fragment, baseDirectory, fileExtensions, host); _i < _a.length; _i++) {
                var _b = _a[_i], name = _b.name, kind = _b.kind, extension = _b.extension;
                _loop_3(name, kind, extension);
              }
            }
          }
        }
        function getCompletionEntriesForNonRelativeModules(fragment, scriptPath, compilerOptions, host, typeChecker) {
          var baseUrl = compilerOptions.baseUrl, paths = compilerOptions.paths;
          var result = [];
          var extensionOptions = getExtensionOptions(compilerOptions);
          if (baseUrl) {
            var projectDir = compilerOptions.project || host.getCurrentDirectory();
            var absolute = ts2.normalizePath(ts2.combinePaths(projectDir, baseUrl));
            getCompletionEntriesForDirectoryFragment(fragment, absolute, extensionOptions, host, void 0, result);
            if (paths) {
              addCompletionEntriesFromPaths(result, fragment, absolute, extensionOptions.extensions, paths, host);
            }
          }
          var fragmentDirectory = getFragmentDirectory(fragment);
          for (var _i = 0, _a = getAmbientModuleCompletions(fragment, fragmentDirectory, typeChecker); _i < _a.length; _i++) {
            var ambientName = _a[_i];
            result.push(nameAndKind(ambientName, "external module name", void 0));
          }
          getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, fragmentDirectory, extensionOptions, result);
          if (ts2.getEmitModuleResolutionKind(compilerOptions) === ts2.ModuleResolutionKind.NodeJs) {
            var foundGlobal = false;
            if (fragmentDirectory === void 0) {
              var _loop_4 = function(moduleName2) {
                if (!result.some(function(entry) {
                  return entry.name === moduleName2;
                })) {
                  foundGlobal = true;
                  result.push(nameAndKind(moduleName2, "external module name", void 0));
                }
              };
              for (var _b = 0, _c = enumerateNodeModulesVisibleToScript(host, scriptPath); _b < _c.length; _b++) {
                var moduleName = _c[_b];
                _loop_4(moduleName);
              }
            }
            if (!foundGlobal) {
              ts2.forEachAncestorDirectory(scriptPath, function(ancestor) {
                var nodeModules = ts2.combinePaths(ancestor, "node_modules");
                if (ts2.tryDirectoryExists(host, nodeModules)) {
                  getCompletionEntriesForDirectoryFragment(fragment, nodeModules, extensionOptions, host, void 0, result);
                }
              });
            }
          }
          return result;
        }
        function getFragmentDirectory(fragment) {
          return containsSlash(fragment) ? ts2.hasTrailingDirectorySeparator(fragment) ? fragment : ts2.getDirectoryPath(fragment) : void 0;
        }
        function getCompletionsForPathMapping(path, patterns, fragment, baseUrl, fileExtensions, host) {
          if (!ts2.endsWith(path, "*")) {
            return !ts2.stringContains(path, "*") ? justPathMappingName(path) : ts2.emptyArray;
          }
          var pathPrefix = path.slice(0, path.length - 1);
          var remainingFragment = ts2.tryRemovePrefix(fragment, pathPrefix);
          return remainingFragment === void 0 ? justPathMappingName(pathPrefix) : ts2.flatMap(patterns, function(pattern) {
            return getModulesForPathsPattern(remainingFragment, baseUrl, pattern, fileExtensions, host);
          });
          function justPathMappingName(name) {
            return ts2.startsWith(name, fragment) ? [directoryResult(name)] : ts2.emptyArray;
          }
        }
        function getModulesForPathsPattern(fragment, baseUrl, pattern, fileExtensions, host) {
          if (!host.readDirectory) {
            return void 0;
          }
          var parsed = ts2.tryParsePattern(pattern);
          if (parsed === void 0 || ts2.isString(parsed)) {
            return void 0;
          }
          var normalizedPrefix = ts2.resolvePath(parsed.prefix);
          var normalizedPrefixDirectory = ts2.hasTrailingDirectorySeparator(parsed.prefix) ? normalizedPrefix : ts2.getDirectoryPath(normalizedPrefix);
          var normalizedPrefixBase = ts2.hasTrailingDirectorySeparator(parsed.prefix) ? "" : ts2.getBaseFileName(normalizedPrefix);
          var fragmentHasPath = containsSlash(fragment);
          var fragmentDirectory = fragmentHasPath ? ts2.hasTrailingDirectorySeparator(fragment) ? fragment : ts2.getDirectoryPath(fragment) : void 0;
          var expandedPrefixDirectory = fragmentHasPath ? ts2.combinePaths(normalizedPrefixDirectory, normalizedPrefixBase + fragmentDirectory) : normalizedPrefixDirectory;
          var normalizedSuffix = ts2.normalizePath(parsed.suffix);
          var baseDirectory = ts2.normalizePath(ts2.combinePaths(baseUrl, expandedPrefixDirectory));
          var completePrefix = fragmentHasPath ? baseDirectory : ts2.ensureTrailingDirectorySeparator(baseDirectory) + normalizedPrefixBase;
          var includeGlob = normalizedSuffix ? "**/*" : "./*";
          var matches = ts2.mapDefined(ts2.tryReadDirectory(host, baseDirectory, fileExtensions, void 0, [includeGlob]), function(match) {
            var extension = ts2.tryGetExtensionFromPath(match);
            var name = trimPrefixAndSuffix(match);
            return name === void 0 ? void 0 : nameAndKind(ts2.removeFileExtension(name), "script", extension);
          });
          var directories = ts2.mapDefined(ts2.tryGetDirectories(host, baseDirectory).map(function(d) {
            return ts2.combinePaths(baseDirectory, d);
          }), function(dir) {
            var name = trimPrefixAndSuffix(dir);
            return name === void 0 ? void 0 : directoryResult(name);
          });
          return __spreadArray(__spreadArray([], matches, true), directories, true);
          function trimPrefixAndSuffix(path) {
            var inner = withoutStartAndEnd(ts2.normalizePath(path), completePrefix, normalizedSuffix);
            return inner === void 0 ? void 0 : removeLeadingDirectorySeparator(inner);
          }
        }
        function withoutStartAndEnd(s, start, end) {
          return ts2.startsWith(s, start) && ts2.endsWith(s, end) ? s.slice(start.length, s.length - end.length) : void 0;
        }
        function removeLeadingDirectorySeparator(path) {
          return path[0] === ts2.directorySeparator ? path.slice(1) : path;
        }
        function getAmbientModuleCompletions(fragment, fragmentDirectory, checker) {
          var ambientModules = checker.getAmbientModules().map(function(sym) {
            return ts2.stripQuotes(sym.name);
          });
          var nonRelativeModuleNames = ambientModules.filter(function(moduleName) {
            return ts2.startsWith(moduleName, fragment);
          });
          if (fragmentDirectory !== void 0) {
            var moduleNameWithSeparator_1 = ts2.ensureTrailingDirectorySeparator(fragmentDirectory);
            return nonRelativeModuleNames.map(function(nonRelativeModuleName) {
              return ts2.removePrefix(nonRelativeModuleName, moduleNameWithSeparator_1);
            });
          }
          return nonRelativeModuleNames;
        }
        function getTripleSlashReferenceCompletion(sourceFile, position, compilerOptions, host) {
          var token = ts2.getTokenAtPosition(sourceFile, position);
          var commentRanges = ts2.getLeadingCommentRanges(sourceFile.text, token.pos);
          var range = commentRanges && ts2.find(commentRanges, function(commentRange) {
            return position >= commentRange.pos && position <= commentRange.end;
          });
          if (!range) {
            return void 0;
          }
          var text = sourceFile.text.slice(range.pos, position);
          var match = tripleSlashDirectiveFragmentRegex.exec(text);
          if (!match) {
            return void 0;
          }
          var prefix = match[1], kind = match[2], toComplete = match[3];
          var scriptPath = ts2.getDirectoryPath(sourceFile.path);
          var names = kind === "path" ? getCompletionEntriesForDirectoryFragment(toComplete, scriptPath, getExtensionOptions(compilerOptions, 1), host, sourceFile.path) : kind === "types" ? getCompletionEntriesFromTypings(host, compilerOptions, scriptPath, getFragmentDirectory(toComplete), getExtensionOptions(compilerOptions)) : ts2.Debug.fail();
          return addReplacementSpans(toComplete, range.pos + prefix.length, names);
        }
        function getCompletionEntriesFromTypings(host, options, scriptPath, fragmentDirectory, extensionOptions, result) {
          if (result === void 0) {
            result = [];
          }
          var seen = new ts2.Map();
          var typeRoots = ts2.tryAndIgnoreErrors(function() {
            return ts2.getEffectiveTypeRoots(options, host);
          }) || ts2.emptyArray;
          for (var _i = 0, typeRoots_1 = typeRoots; _i < typeRoots_1.length; _i++) {
            var root = typeRoots_1[_i];
            getCompletionEntriesFromDirectories(root);
          }
          for (var _a = 0, _b = ts2.findPackageJsons(scriptPath, host); _a < _b.length; _a++) {
            var packageJson = _b[_a];
            var typesDir = ts2.combinePaths(ts2.getDirectoryPath(packageJson), "node_modules/@types");
            getCompletionEntriesFromDirectories(typesDir);
          }
          return result;
          function getCompletionEntriesFromDirectories(directory) {
            if (!ts2.tryDirectoryExists(host, directory))
              return;
            for (var _i2 = 0, _a2 = ts2.tryGetDirectories(host, directory); _i2 < _a2.length; _i2++) {
              var typeDirectoryName = _a2[_i2];
              var packageName = ts2.unmangleScopedPackageName(typeDirectoryName);
              if (options.types && !ts2.contains(options.types, packageName))
                continue;
              if (fragmentDirectory === void 0) {
                if (!seen.has(packageName)) {
                  result.push(nameAndKind(packageName, "external module name", void 0));
                  seen.set(packageName, true);
                }
              } else {
                var baseDirectory = ts2.combinePaths(directory, typeDirectoryName);
                var remainingFragment = ts2.tryRemoveDirectoryPrefix(fragmentDirectory, packageName, ts2.hostGetCanonicalFileName(host));
                if (remainingFragment !== void 0) {
                  getCompletionEntriesForDirectoryFragment(remainingFragment, baseDirectory, extensionOptions, host, void 0, result);
                }
              }
            }
          }
        }
        function enumerateNodeModulesVisibleToScript(host, scriptPath) {
          if (!host.readFile || !host.fileExists)
            return ts2.emptyArray;
          var result = [];
          for (var _i = 0, _a = ts2.findPackageJsons(scriptPath, host); _i < _a.length; _i++) {
            var packageJson = _a[_i];
            var contents = ts2.readJson(packageJson, host);
            for (var _b = 0, nodeModulesDependencyKeys_1 = nodeModulesDependencyKeys; _b < nodeModulesDependencyKeys_1.length; _b++) {
              var key = nodeModulesDependencyKeys_1[_b];
              var dependencies = contents[key];
              if (!dependencies)
                continue;
              for (var dep in dependencies) {
                if (dependencies.hasOwnProperty(dep) && !ts2.startsWith(dep, "@types/")) {
                  result.push(dep);
                }
              }
            }
          }
          return result;
        }
        function getDirectoryFragmentTextSpan(text, textStart) {
          var index = Math.max(text.lastIndexOf(ts2.directorySeparator), text.lastIndexOf(ts2.altDirectorySeparator));
          var offset = index !== -1 ? index + 1 : 0;
          var length = text.length - offset;
          return length === 0 || ts2.isIdentifierText(text.substr(offset, length), 99) ? void 0 : ts2.createTextSpan(textStart + offset, length);
        }
        function isPathRelativeToScript(path) {
          if (path && path.length >= 2 && path.charCodeAt(0) === 46) {
            var slashIndex = path.length >= 3 && path.charCodeAt(1) === 46 ? 2 : 1;
            var slashCharCode = path.charCodeAt(slashIndex);
            return slashCharCode === 47 || slashCharCode === 92;
          }
          return false;
        }
        var tripleSlashDirectiveFragmentRegex = /^(\/\/\/\s*<reference\s+(path|types)\s*=\s*(?:'|"))([^\3"]*)$/;
        var nodeModulesDependencyKeys = ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
        function containsSlash(fragment) {
          return ts2.stringContains(fragment, ts2.directorySeparator);
        }
        function isRequireCallArgument(node) {
          return ts2.isCallExpression(node.parent) && ts2.firstOrUndefined(node.parent.arguments) === node && ts2.isIdentifier(node.parent.expression) && node.parent.expression.escapedText === "require";
        }
      })(StringCompletions = Completions2.StringCompletions || (Completions2.StringCompletions = {}));
    })(Completions = ts2.Completions || (ts2.Completions = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var Completions;
    (function(Completions2) {
      Completions2.moduleSpecifierResolutionLimit = 100;
      Completions2.moduleSpecifierResolutionCacheAttemptLimit = 1e3;
      var SortText;
      (function(SortText2) {
        SortText2["LocalDeclarationPriority"] = "10";
        SortText2["LocationPriority"] = "11";
        SortText2["OptionalMember"] = "12";
        SortText2["MemberDeclaredBySpreadAssignment"] = "13";
        SortText2["SuggestedClassMembers"] = "14";
        SortText2["GlobalsOrKeywords"] = "15";
        SortText2["AutoImportSuggestions"] = "16";
        SortText2["JavascriptIdentifiers"] = "17";
        SortText2["DeprecatedLocalDeclarationPriority"] = "18";
        SortText2["DeprecatedLocationPriority"] = "19";
        SortText2["DeprecatedOptionalMember"] = "20";
        SortText2["DeprecatedMemberDeclaredBySpreadAssignment"] = "21";
        SortText2["DeprecatedSuggestedClassMembers"] = "22";
        SortText2["DeprecatedGlobalsOrKeywords"] = "23";
        SortText2["DeprecatedAutoImportSuggestions"] = "24";
      })(SortText = Completions2.SortText || (Completions2.SortText = {}));
      var SortTextId;
      (function(SortTextId2) {
        SortTextId2[SortTextId2["LocalDeclarationPriority"] = 10] = "LocalDeclarationPriority";
        SortTextId2[SortTextId2["LocationPriority"] = 11] = "LocationPriority";
        SortTextId2[SortTextId2["OptionalMember"] = 12] = "OptionalMember";
        SortTextId2[SortTextId2["MemberDeclaredBySpreadAssignment"] = 13] = "MemberDeclaredBySpreadAssignment";
        SortTextId2[SortTextId2["SuggestedClassMembers"] = 14] = "SuggestedClassMembers";
        SortTextId2[SortTextId2["GlobalsOrKeywords"] = 15] = "GlobalsOrKeywords";
        SortTextId2[SortTextId2["AutoImportSuggestions"] = 16] = "AutoImportSuggestions";
        SortTextId2[SortTextId2["_JavaScriptIdentifiers"] = 17] = "_JavaScriptIdentifiers";
        SortTextId2[SortTextId2["_DeprecatedStart"] = 18] = "_DeprecatedStart";
        SortTextId2[SortTextId2["_First"] = 10] = "_First";
        SortTextId2[SortTextId2["DeprecatedOffset"] = 8] = "DeprecatedOffset";
      })(SortTextId || (SortTextId = {}));
      var CompletionSource;
      (function(CompletionSource2) {
        CompletionSource2["ThisProperty"] = "ThisProperty/";
        CompletionSource2["ClassMemberSnippet"] = "ClassMemberSnippet/";
      })(CompletionSource = Completions2.CompletionSource || (Completions2.CompletionSource = {}));
      var SymbolOriginInfoKind;
      (function(SymbolOriginInfoKind2) {
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["ThisType"] = 1] = "ThisType";
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMember"] = 2] = "SymbolMember";
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["Export"] = 4] = "Export";
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["Promise"] = 8] = "Promise";
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["Nullable"] = 16] = "Nullable";
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["ResolvedExport"] = 32] = "ResolvedExport";
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMemberNoExport"] = 2] = "SymbolMemberNoExport";
        SymbolOriginInfoKind2[SymbolOriginInfoKind2["SymbolMemberExport"] = 6] = "SymbolMemberExport";
      })(SymbolOriginInfoKind || (SymbolOriginInfoKind = {}));
      function originIsThisType(origin) {
        return !!(origin.kind & 1);
      }
      function originIsSymbolMember(origin) {
        return !!(origin.kind & 2);
      }
      function originIsExport(origin) {
        return !!(origin && origin.kind & 4);
      }
      function originIsResolvedExport(origin) {
        return !!(origin && origin.kind === 32);
      }
      function originIncludesSymbolName(origin) {
        return originIsExport(origin) || originIsResolvedExport(origin);
      }
      function originIsPackageJsonImport(origin) {
        return (originIsExport(origin) || originIsResolvedExport(origin)) && !!origin.isFromPackageJson;
      }
      function originIsPromise(origin) {
        return !!(origin.kind & 8);
      }
      function originIsNullableMember(origin) {
        return !!(origin.kind & 16);
      }
      var KeywordCompletionFilters;
      (function(KeywordCompletionFilters2) {
        KeywordCompletionFilters2[KeywordCompletionFilters2["None"] = 0] = "None";
        KeywordCompletionFilters2[KeywordCompletionFilters2["All"] = 1] = "All";
        KeywordCompletionFilters2[KeywordCompletionFilters2["ClassElementKeywords"] = 2] = "ClassElementKeywords";
        KeywordCompletionFilters2[KeywordCompletionFilters2["InterfaceElementKeywords"] = 3] = "InterfaceElementKeywords";
        KeywordCompletionFilters2[KeywordCompletionFilters2["ConstructorParameterKeywords"] = 4] = "ConstructorParameterKeywords";
        KeywordCompletionFilters2[KeywordCompletionFilters2["FunctionLikeBodyKeywords"] = 5] = "FunctionLikeBodyKeywords";
        KeywordCompletionFilters2[KeywordCompletionFilters2["TypeAssertionKeywords"] = 6] = "TypeAssertionKeywords";
        KeywordCompletionFilters2[KeywordCompletionFilters2["TypeKeywords"] = 7] = "TypeKeywords";
        KeywordCompletionFilters2[KeywordCompletionFilters2["TypeKeyword"] = 8] = "TypeKeyword";
        KeywordCompletionFilters2[KeywordCompletionFilters2["Last"] = 7] = "Last";
      })(KeywordCompletionFilters || (KeywordCompletionFilters = {}));
      var GlobalsSearch;
      (function(GlobalsSearch2) {
        GlobalsSearch2[GlobalsSearch2["Continue"] = 0] = "Continue";
        GlobalsSearch2[GlobalsSearch2["Success"] = 1] = "Success";
        GlobalsSearch2[GlobalsSearch2["Fail"] = 2] = "Fail";
      })(GlobalsSearch || (GlobalsSearch = {}));
      function resolvingModuleSpecifiers(logPrefix, host, program, sourceFile, preferences, isForImportStatementCompletion, cb) {
        var _a, _b, _c;
        var start = ts2.timestamp();
        var resolutionLimitExceeded = false;
        var ambientCount = 0;
        var resolvedCount = 0;
        var resolvedFromCacheCount = 0;
        var cacheAttemptCount = 0;
        var result = cb({ tryResolve, resolutionLimitExceeded: function() {
          return resolutionLimitExceeded;
        } });
        var hitRateMessage = cacheAttemptCount ? " (".concat((resolvedFromCacheCount / cacheAttemptCount * 100).toFixed(1), "% hit rate)") : "";
        (_a = host.log) === null || _a === void 0 ? void 0 : _a.call(host, "".concat(logPrefix, ": resolved ").concat(resolvedCount, " module specifiers, plus ").concat(ambientCount, " ambient and ").concat(resolvedFromCacheCount, " from cache").concat(hitRateMessage));
        (_b = host.log) === null || _b === void 0 ? void 0 : _b.call(host, "".concat(logPrefix, ": response is ").concat(resolutionLimitExceeded ? "incomplete" : "complete"));
        (_c = host.log) === null || _c === void 0 ? void 0 : _c.call(host, "".concat(logPrefix, ": ").concat(ts2.timestamp() - start));
        return result;
        function tryResolve(exportInfo, isFromAmbientModule) {
          if (isFromAmbientModule) {
            var result_1 = ts2.codefix.getModuleSpecifierForBestExportInfo(exportInfo, sourceFile, program, host, preferences);
            if (result_1) {
              ambientCount++;
            }
            return result_1;
          }
          var shouldResolveModuleSpecifier = isForImportStatementCompletion || preferences.allowIncompleteCompletions && resolvedCount < Completions2.moduleSpecifierResolutionLimit;
          var shouldGetModuleSpecifierFromCache = !shouldResolveModuleSpecifier && preferences.allowIncompleteCompletions && cacheAttemptCount < Completions2.moduleSpecifierResolutionCacheAttemptLimit;
          var result2 = shouldResolveModuleSpecifier || shouldGetModuleSpecifierFromCache ? ts2.codefix.getModuleSpecifierForBestExportInfo(exportInfo, sourceFile, program, host, preferences, shouldGetModuleSpecifierFromCache) : void 0;
          if (!shouldResolveModuleSpecifier && !shouldGetModuleSpecifierFromCache || shouldGetModuleSpecifierFromCache && !result2) {
            resolutionLimitExceeded = true;
          }
          resolvedCount += (result2 === null || result2 === void 0 ? void 0 : result2.computedWithoutCacheCount) || 0;
          resolvedFromCacheCount += exportInfo.length - resolvedCount;
          if (shouldGetModuleSpecifierFromCache) {
            cacheAttemptCount++;
          }
          return result2;
        }
      }
      function getCompletionsAtPosition(host, program, log, sourceFile, position, preferences, triggerCharacter, completionKind, cancellationToken) {
        var _a;
        var previousToken = getRelevantTokens(position, sourceFile).previousToken;
        if (triggerCharacter && !ts2.isInString(sourceFile, position, previousToken) && !isValidTrigger(sourceFile, triggerCharacter, previousToken, position)) {
          return void 0;
        }
        if (triggerCharacter === " ") {
          if (preferences.includeCompletionsForImportStatements && preferences.includeCompletionsWithInsertText) {
            return { isGlobalCompletion: true, isMemberCompletion: false, isNewIdentifierLocation: true, isIncomplete: true, entries: [] };
          }
          return void 0;
        }
        var compilerOptions = program.getCompilerOptions();
        var incompleteCompletionsCache = preferences.allowIncompleteCompletions ? (_a = host.getIncompleteCompletionsCache) === null || _a === void 0 ? void 0 : _a.call(host) : void 0;
        if (incompleteCompletionsCache && completionKind === 3 && previousToken && ts2.isIdentifier(previousToken)) {
          var incompleteContinuation = continuePreviousIncompleteResponse(incompleteCompletionsCache, sourceFile, previousToken, program, host, preferences, cancellationToken);
          if (incompleteContinuation) {
            return incompleteContinuation;
          }
        } else {
          incompleteCompletionsCache === null || incompleteCompletionsCache === void 0 ? void 0 : incompleteCompletionsCache.clear();
        }
        var stringCompletions = Completions2.StringCompletions.getStringLiteralCompletions(sourceFile, position, previousToken, compilerOptions, host, program, log, preferences);
        if (stringCompletions) {
          return stringCompletions;
        }
        if (previousToken && ts2.isBreakOrContinueStatement(previousToken.parent) && (previousToken.kind === 81 || previousToken.kind === 86 || previousToken.kind === 79)) {
          return getLabelCompletionAtPosition(previousToken.parent);
        }
        var completionData = getCompletionData(program, log, sourceFile, isUncheckedFile(sourceFile, compilerOptions), position, preferences, void 0, host, cancellationToken);
        if (!completionData) {
          return void 0;
        }
        switch (completionData.kind) {
          case 0:
            var response = completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences);
            if (response === null || response === void 0 ? void 0 : response.isIncomplete) {
              incompleteCompletionsCache === null || incompleteCompletionsCache === void 0 ? void 0 : incompleteCompletionsCache.set(response);
            }
            return response;
          case 1:
            return jsdocCompletionInfo(ts2.JsDoc.getJSDocTagNameCompletions());
          case 2:
            return jsdocCompletionInfo(ts2.JsDoc.getJSDocTagCompletions());
          case 3:
            return jsdocCompletionInfo(ts2.JsDoc.getJSDocParameterNameCompletions(completionData.tag));
          case 4:
            return specificKeywordCompletionInfo(completionData.keywordCompletions, completionData.isNewIdentifierLocation);
          default:
            return ts2.Debug.assertNever(completionData);
        }
      }
      Completions2.getCompletionsAtPosition = getCompletionsAtPosition;
      function completionEntryDataIsResolved(data) {
        return !!(data === null || data === void 0 ? void 0 : data.moduleSpecifier);
      }
      function continuePreviousIncompleteResponse(cache, file, location, program, host, preferences, cancellationToken) {
        var previousResponse = cache.get();
        if (!previousResponse)
          return void 0;
        var lowerCaseTokenText = location.text.toLowerCase();
        var exportMap = ts2.getExportInfoMap(file, host, program, cancellationToken);
        var newEntries = resolvingModuleSpecifiers("continuePreviousIncompleteResponse", host, program, file, preferences, false, function(context) {
          var entries = ts2.mapDefined(previousResponse.entries, function(entry) {
            if (!entry.hasAction || !entry.source || !entry.data || completionEntryDataIsResolved(entry.data)) {
              return entry;
            }
            if (!charactersFuzzyMatchInString(entry.name, lowerCaseTokenText)) {
              return void 0;
            }
            var origin = ts2.Debug.checkDefined(getAutoImportSymbolFromCompletionEntryData(entry.name, entry.data, program, host)).origin;
            var info = exportMap.get(file.path, entry.data.exportMapKey);
            var result = info && context.tryResolve(info, !ts2.isExternalModuleNameRelative(ts2.stripQuotes(origin.moduleSymbol.name)));
            if (!result)
              return entry;
            var newOrigin = __assign(__assign({}, origin), { kind: 32, moduleSpecifier: result.moduleSpecifier });
            entry.data = originToCompletionEntryData(newOrigin);
            entry.source = getSourceFromOrigin(newOrigin);
            entry.sourceDisplay = [ts2.textPart(newOrigin.moduleSpecifier)];
            return entry;
          });
          if (!context.resolutionLimitExceeded()) {
            previousResponse.isIncomplete = void 0;
          }
          return entries;
        });
        previousResponse.entries = newEntries;
        return previousResponse;
      }
      function jsdocCompletionInfo(entries) {
        return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: false, entries };
      }
      function keywordToCompletionEntry(keyword) {
        return {
          name: ts2.tokenToString(keyword),
          kind: "keyword",
          kindModifiers: "",
          sortText: SortText.GlobalsOrKeywords
        };
      }
      function specificKeywordCompletionInfo(entries, isNewIdentifierLocation) {
        return {
          isGlobalCompletion: false,
          isMemberCompletion: false,
          isNewIdentifierLocation,
          entries: entries.slice()
        };
      }
      function keywordCompletionData(keywordFilters, filterOutTsOnlyKeywords, isNewIdentifierLocation) {
        return {
          kind: 4,
          keywordCompletions: getKeywordCompletions(keywordFilters, filterOutTsOnlyKeywords),
          isNewIdentifierLocation
        };
      }
      function keywordFiltersFromSyntaxKind(keywordCompletion) {
        switch (keywordCompletion) {
          case 151:
            return 8;
          default:
            ts2.Debug.fail("Unknown mapping from SyntaxKind to KeywordCompletionFilters");
        }
      }
      function getOptionalReplacementSpan(location) {
        return (location === null || location === void 0 ? void 0 : location.kind) === 79 ? ts2.createTextSpanFromNode(location) : void 0;
      }
      function completionInfoFromData(sourceFile, host, program, compilerOptions, log, completionData, preferences) {
        var symbols = completionData.symbols, contextToken = completionData.contextToken, completionKind = completionData.completionKind, isInSnippetScope = completionData.isInSnippetScope, isNewIdentifierLocation = completionData.isNewIdentifierLocation, location = completionData.location, propertyAccessToConvert = completionData.propertyAccessToConvert, keywordFilters = completionData.keywordFilters, literals = completionData.literals, symbolToOriginInfoMap = completionData.symbolToOriginInfoMap, recommendedCompletion = completionData.recommendedCompletion, isJsxInitializer = completionData.isJsxInitializer, isTypeOnlyLocation = completionData.isTypeOnlyLocation, isJsxIdentifierExpected = completionData.isJsxIdentifierExpected, isRightOfOpenTag = completionData.isRightOfOpenTag, importCompletionNode = completionData.importCompletionNode, insideJsDocTagTypeExpression = completionData.insideJsDocTagTypeExpression, symbolToSortTextIdMap = completionData.symbolToSortTextIdMap, hasUnresolvedAutoImports = completionData.hasUnresolvedAutoImports;
        if (ts2.getLanguageVariant(sourceFile.scriptKind) === 1) {
          var completionInfo = getJsxClosingTagCompletion(location, sourceFile);
          if (completionInfo) {
            return completionInfo;
          }
        }
        var entries = [];
        if (isUncheckedFile(sourceFile, compilerOptions)) {
          var uniqueNames = getCompletionEntriesFromSymbols(symbols, entries, void 0, contextToken, location, sourceFile, host, program, ts2.getEmitScriptTarget(compilerOptions), log, completionKind, preferences, compilerOptions, isTypeOnlyLocation, propertyAccessToConvert, isJsxIdentifierExpected, isJsxInitializer, importCompletionNode, recommendedCompletion, symbolToOriginInfoMap, symbolToSortTextIdMap, isJsxIdentifierExpected, isRightOfOpenTag);
          getJSCompletionEntries(sourceFile, location.pos, uniqueNames, ts2.getEmitScriptTarget(compilerOptions), entries);
        } else {
          if (!isNewIdentifierLocation && (!symbols || symbols.length === 0) && keywordFilters === 0) {
            return void 0;
          }
          getCompletionEntriesFromSymbols(symbols, entries, void 0, contextToken, location, sourceFile, host, program, ts2.getEmitScriptTarget(compilerOptions), log, completionKind, preferences, compilerOptions, isTypeOnlyLocation, propertyAccessToConvert, isJsxIdentifierExpected, isJsxInitializer, importCompletionNode, recommendedCompletion, symbolToOriginInfoMap, symbolToSortTextIdMap, isJsxIdentifierExpected, isRightOfOpenTag);
        }
        if (keywordFilters !== 0) {
          var entryNames = new ts2.Set(entries.map(function(e) {
            return e.name;
          }));
          for (var _i = 0, _a = getKeywordCompletions(keywordFilters, !insideJsDocTagTypeExpression && ts2.isSourceFileJS(sourceFile)); _i < _a.length; _i++) {
            var keywordEntry = _a[_i];
            if (!entryNames.has(keywordEntry.name)) {
              entries.push(keywordEntry);
            }
          }
        }
        for (var _b = 0, literals_1 = literals; _b < literals_1.length; _b++) {
          var literal = literals_1[_b];
          entries.push(createCompletionEntryForLiteral(sourceFile, preferences, literal));
        }
        return {
          isGlobalCompletion: isInSnippetScope,
          isIncomplete: preferences.allowIncompleteCompletions && hasUnresolvedAutoImports ? true : void 0,
          isMemberCompletion: isMemberCompletionKind(completionKind),
          isNewIdentifierLocation,
          optionalReplacementSpan: getOptionalReplacementSpan(location),
          entries
        };
      }
      function isUncheckedFile(sourceFile, compilerOptions) {
        return ts2.isSourceFileJS(sourceFile) && !ts2.isCheckJsEnabledForFile(sourceFile, compilerOptions);
      }
      function isMemberCompletionKind(kind) {
        switch (kind) {
          case 0:
          case 3:
          case 2:
            return true;
          default:
            return false;
        }
      }
      function getJsxClosingTagCompletion(location, sourceFile) {
        var jsxClosingElement = ts2.findAncestor(location, function(node) {
          switch (node.kind) {
            case 280:
              return true;
            case 43:
            case 31:
            case 79:
            case 205:
              return false;
            default:
              return "quit";
          }
        });
        if (jsxClosingElement) {
          var hasClosingAngleBracket = !!ts2.findChildOfKind(jsxClosingElement, 31, sourceFile);
          var tagName = jsxClosingElement.parent.openingElement.tagName;
          var closingTag = tagName.getText(sourceFile);
          var fullClosingTag = closingTag + (hasClosingAngleBracket ? "" : ">");
          var replacementSpan = ts2.createTextSpanFromNode(jsxClosingElement.tagName);
          var entry = {
            name: fullClosingTag,
            kind: "class",
            kindModifiers: void 0,
            sortText: SortText.LocationPriority
          };
          return { isGlobalCompletion: false, isMemberCompletion: true, isNewIdentifierLocation: false, optionalReplacementSpan: replacementSpan, entries: [entry] };
        }
        return;
      }
      function getJSCompletionEntries(sourceFile, position, uniqueNames, target, entries) {
        ts2.getNameTable(sourceFile).forEach(function(pos, name) {
          if (pos === position) {
            return;
          }
          var realName = ts2.unescapeLeadingUnderscores(name);
          if (!uniqueNames.has(realName) && ts2.isIdentifierText(realName, target)) {
            uniqueNames.add(realName);
            entries.push({
              name: realName,
              kind: "warning",
              kindModifiers: "",
              sortText: SortText.JavascriptIdentifiers,
              isFromUncheckedFile: true
            });
          }
        });
      }
      function completionNameForLiteral(sourceFile, preferences, literal) {
        return typeof literal === "object" ? ts2.pseudoBigIntToString(literal) + "n" : ts2.isString(literal) ? ts2.quote(sourceFile, preferences, literal) : JSON.stringify(literal);
      }
      function createCompletionEntryForLiteral(sourceFile, preferences, literal) {
        return { name: completionNameForLiteral(sourceFile, preferences, literal), kind: "string", kindModifiers: "", sortText: SortText.LocationPriority };
      }
      function createCompletionEntry(symbol, sortText, replacementToken, contextToken, location, sourceFile, host, program, name, needsConvertPropertyAccess, origin, recommendedCompletion, propertyAccessToConvert, isJsxInitializer, importCompletionNode, useSemicolons, options, preferences, completionKind, isJsxIdentifierExpected, isRightOfOpenTag) {
        var _a, _b;
        var insertText;
        var replacementSpan = ts2.getReplacementSpanForContextToken(replacementToken);
        var data;
        var isSnippet;
        var source = getSourceFromOrigin(origin);
        var sourceDisplay;
        var hasAction;
        var typeChecker = program.getTypeChecker();
        var insertQuestionDot = origin && originIsNullableMember(origin);
        var useBraces = origin && originIsSymbolMember(origin) || needsConvertPropertyAccess;
        if (origin && originIsThisType(origin)) {
          insertText = needsConvertPropertyAccess ? "this".concat(insertQuestionDot ? "?." : "", "[").concat(quotePropertyName(sourceFile, preferences, name), "]") : "this".concat(insertQuestionDot ? "?." : ".").concat(name);
        } else if ((useBraces || insertQuestionDot) && propertyAccessToConvert) {
          insertText = useBraces ? needsConvertPropertyAccess ? "[".concat(quotePropertyName(sourceFile, preferences, name), "]") : "[".concat(name, "]") : name;
          if (insertQuestionDot || propertyAccessToConvert.questionDotToken) {
            insertText = "?.".concat(insertText);
          }
          var dot = ts2.findChildOfKind(propertyAccessToConvert, 24, sourceFile) || ts2.findChildOfKind(propertyAccessToConvert, 28, sourceFile);
          if (!dot) {
            return void 0;
          }
          var end = ts2.startsWith(name, propertyAccessToConvert.name.text) ? propertyAccessToConvert.name.end : dot.end;
          replacementSpan = ts2.createTextSpanFromBounds(dot.getStart(sourceFile), end);
        }
        if (isJsxInitializer) {
          if (insertText === void 0)
            insertText = name;
          insertText = "{".concat(insertText, "}");
          if (typeof isJsxInitializer !== "boolean") {
            replacementSpan = ts2.createTextSpanFromNode(isJsxInitializer, sourceFile);
          }
        }
        if (origin && originIsPromise(origin) && propertyAccessToConvert) {
          if (insertText === void 0)
            insertText = name;
          var precedingToken = ts2.findPrecedingToken(propertyAccessToConvert.pos, sourceFile);
          var awaitText = "";
          if (precedingToken && ts2.positionIsASICandidate(precedingToken.end, precedingToken.parent, sourceFile)) {
            awaitText = ";";
          }
          awaitText += "(await ".concat(propertyAccessToConvert.expression.getText(), ")");
          insertText = needsConvertPropertyAccess ? "".concat(awaitText).concat(insertText) : "".concat(awaitText).concat(insertQuestionDot ? "?." : ".").concat(insertText);
          replacementSpan = ts2.createTextSpanFromBounds(propertyAccessToConvert.getStart(sourceFile), propertyAccessToConvert.end);
        }
        if (originIsResolvedExport(origin)) {
          sourceDisplay = [ts2.textPart(origin.moduleSpecifier)];
          if (importCompletionNode) {
            _a = getInsertTextAndReplacementSpanForImportCompletion(name, importCompletionNode, contextToken, origin, useSemicolons, options, preferences), insertText = _a.insertText, replacementSpan = _a.replacementSpan;
            isSnippet = preferences.includeCompletionsWithSnippetText ? true : void 0;
          }
        }
        if (preferences.includeCompletionsWithClassMemberSnippets && preferences.includeCompletionsWithInsertText && completionKind === 3 && isClassLikeMemberCompletion(symbol, location)) {
          var importAdder = void 0;
          _b = getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, contextToken), insertText = _b.insertText, isSnippet = _b.isSnippet, importAdder = _b.importAdder;
          if (importAdder === null || importAdder === void 0 ? void 0 : importAdder.hasFixes()) {
            hasAction = true;
            source = CompletionSource.ClassMemberSnippet;
          }
        }
        if (isJsxIdentifierExpected && !isRightOfOpenTag && preferences.includeCompletionsWithSnippetText && preferences.jsxAttributeCompletionStyle && preferences.jsxAttributeCompletionStyle !== "none") {
          var useBraces_1 = preferences.jsxAttributeCompletionStyle === "braces";
          var type = typeChecker.getTypeOfSymbolAtLocation(symbol, location);
          if (preferences.jsxAttributeCompletionStyle === "auto" && !(type.flags & 528) && !(type.flags & 1048576 && ts2.find(type.types, function(type2) {
            return !!(type2.flags & 528);
          }))) {
            if (type.flags & 402653316 || type.flags & 1048576 && ts2.every(type.types, function(type2) {
              return !!(type2.flags & (402653316 | 32768));
            })) {
              insertText = "".concat(ts2.escapeSnippetText(name), "=").concat(ts2.quote(sourceFile, preferences, "$1"));
              isSnippet = true;
            } else {
              useBraces_1 = true;
            }
          }
          if (useBraces_1) {
            insertText = "".concat(ts2.escapeSnippetText(name), "={$1}");
            isSnippet = true;
          }
        }
        if (insertText !== void 0 && !preferences.includeCompletionsWithInsertText) {
          return void 0;
        }
        if (originIsExport(origin) || originIsResolvedExport(origin)) {
          data = originToCompletionEntryData(origin);
          hasAction = !importCompletionNode;
        }
        return {
          name,
          kind: ts2.SymbolDisplay.getSymbolKind(typeChecker, symbol, location),
          kindModifiers: ts2.SymbolDisplay.getSymbolModifiers(typeChecker, symbol),
          sortText,
          source,
          hasAction: hasAction ? true : void 0,
          isRecommended: isRecommendedCompletionMatch(symbol, recommendedCompletion, typeChecker) || void 0,
          insertText,
          replacementSpan,
          sourceDisplay,
          isSnippet,
          isPackageJsonImport: originIsPackageJsonImport(origin) || void 0,
          isImportStatementCompletion: !!importCompletionNode || void 0,
          data
        };
      }
      function isClassLikeMemberCompletion(symbol, location) {
        if (ts2.isInJSFile(location)) {
          return false;
        }
        var memberFlags = 106500 & 900095;
        return !!(symbol.flags & memberFlags) && (ts2.isClassLike(location) || location.parent && location.parent.parent && ts2.isClassElement(location.parent) && location === location.parent.name && ts2.isClassLike(location.parent.parent) || location.parent && ts2.isSyntaxList(location) && ts2.isClassLike(location.parent));
      }
      function getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, contextToken) {
        var classLikeDeclaration = ts2.findAncestor(location, ts2.isClassLike);
        if (!classLikeDeclaration) {
          return { insertText: name };
        }
        var isSnippet;
        var insertText = name;
        var checker = program.getTypeChecker();
        var sourceFile = location.getSourceFile();
        var printer = createSnippetPrinter({
          removeComments: true,
          module: options.module,
          target: options.target,
          omitTrailingSemicolon: false,
          newLine: ts2.getNewLineKind(ts2.getNewLineCharacter(options, ts2.maybeBind(host, host.getNewLine)))
        });
        var importAdder = ts2.codefix.createImportAdder(sourceFile, program, preferences, host);
        var body;
        if (preferences.includeCompletionsWithSnippetText) {
          isSnippet = true;
          var emptyStatement = ts2.factory.createExpressionStatement(ts2.factory.createIdentifier(""));
          ts2.setSnippetElement(emptyStatement, { kind: 0, order: 0 });
          body = ts2.factory.createBlock([emptyStatement], true);
        } else {
          body = ts2.factory.createBlock([], true);
        }
        var modifiers = 0;
        var isAbstract = contextToken && isModifierLike(contextToken) === 126;
        var completionNodes = [];
        ts2.codefix.addNewNodeForMemberSymbol(symbol, classLikeDeclaration, sourceFile, { program, host }, preferences, importAdder, function(node) {
          var requiredModifiers = 0;
          if (isAbstract) {
            requiredModifiers |= 128;
          }
          if (ts2.isClassElement(node) && checker.getMemberOverrideModifierStatus(classLikeDeclaration, node) === 1) {
            requiredModifiers |= 16384;
          }
          var presentModifiers = 0;
          if (!completionNodes.length) {
            if (contextToken) {
              presentModifiers = getPresentModifiers(contextToken);
            }
            modifiers = node.modifierFlagsCache | requiredModifiers | presentModifiers;
          }
          node = ts2.factory.updateModifiers(node, modifiers & ~presentModifiers);
          completionNodes.push(node);
        }, body, 2, isAbstract);
        if (completionNodes.length) {
          insertText = printer.printSnippetList(1 | 131072, ts2.factory.createNodeArray(completionNodes), sourceFile);
        }
        return { insertText, isSnippet, importAdder };
      }
      function getPresentModifiers(contextToken) {
        var modifiers = 0;
        var contextMod;
        if (contextMod = isModifierLike(contextToken)) {
          modifiers |= ts2.modifierToFlag(contextMod);
        }
        if (ts2.isPropertyDeclaration(contextToken.parent)) {
          modifiers |= ts2.modifiersToFlags(contextToken.parent.modifiers);
        }
        return modifiers;
      }
      function isModifierLike(node) {
        if (ts2.isModifier(node)) {
          return node.kind;
        }
        if (ts2.isIdentifier(node) && node.originalKeywordKind && ts2.isModifierKind(node.originalKeywordKind)) {
          return node.originalKeywordKind;
        }
        return void 0;
      }
      function createSnippetPrinter(printerOptions) {
        var printer = ts2.createPrinter(printerOptions);
        var baseWriter = ts2.createTextWriter(ts2.getNewLineCharacter(printerOptions));
        var writer = __assign(__assign({}, baseWriter), { write: function(s) {
          return baseWriter.write(ts2.escapeSnippetText(s));
        }, nonEscapingWrite: baseWriter.write, writeLiteral: function(s) {
          return baseWriter.writeLiteral(ts2.escapeSnippetText(s));
        }, writeStringLiteral: function(s) {
          return baseWriter.writeStringLiteral(ts2.escapeSnippetText(s));
        }, writeSymbol: function(s, symbol) {
          return baseWriter.writeSymbol(ts2.escapeSnippetText(s), symbol);
        }, writeParameter: function(s) {
          return baseWriter.writeParameter(ts2.escapeSnippetText(s));
        }, writeComment: function(s) {
          return baseWriter.writeComment(ts2.escapeSnippetText(s));
        }, writeProperty: function(s) {
          return baseWriter.writeProperty(ts2.escapeSnippetText(s));
        } });
        return {
          printSnippetList
        };
        function printSnippetList(format, list, sourceFile) {
          writer.clear();
          printer.writeList(format, list, sourceFile, writer);
          return writer.getText();
        }
      }
      function originToCompletionEntryData(origin) {
        var ambientModuleName = origin.fileName ? void 0 : ts2.stripQuotes(origin.moduleSymbol.name);
        var isPackageJsonImport = origin.isFromPackageJson ? true : void 0;
        if (originIsResolvedExport(origin)) {
          var resolvedData = {
            exportName: origin.exportName,
            moduleSpecifier: origin.moduleSpecifier,
            ambientModuleName,
            fileName: origin.fileName,
            isPackageJsonImport
          };
          return resolvedData;
        }
        var unresolvedData = {
          exportName: origin.exportName,
          exportMapKey: origin.exportMapKey,
          fileName: origin.fileName,
          ambientModuleName: origin.fileName ? void 0 : ts2.stripQuotes(origin.moduleSymbol.name),
          isPackageJsonImport: origin.isFromPackageJson ? true : void 0
        };
        return unresolvedData;
      }
      function completionEntryDataToSymbolOriginInfo(data, completionName, moduleSymbol) {
        var isDefaultExport = data.exportName === "default";
        var isFromPackageJson = !!data.isPackageJsonImport;
        if (completionEntryDataIsResolved(data)) {
          var resolvedOrigin = {
            kind: 32,
            exportName: data.exportName,
            moduleSpecifier: data.moduleSpecifier,
            symbolName: completionName,
            fileName: data.fileName,
            moduleSymbol,
            isDefaultExport,
            isFromPackageJson
          };
          return resolvedOrigin;
        }
        var unresolvedOrigin = {
          kind: 4,
          exportName: data.exportName,
          exportMapKey: data.exportMapKey,
          symbolName: completionName,
          fileName: data.fileName,
          moduleSymbol,
          isDefaultExport,
          isFromPackageJson
        };
        return unresolvedOrigin;
      }
      function getInsertTextAndReplacementSpanForImportCompletion(name, importCompletionNode, contextToken, origin, useSemicolons, options, preferences) {
        var _a, _b, _c;
        var sourceFile = importCompletionNode.getSourceFile();
        var replacementSpan = ts2.createTextSpanFromNode(ts2.findAncestor(importCompletionNode, ts2.or(ts2.isImportDeclaration, ts2.isImportEqualsDeclaration)) || importCompletionNode, sourceFile);
        var quotedModuleSpecifier = ts2.quote(sourceFile, preferences, origin.moduleSpecifier);
        var exportKind = origin.isDefaultExport ? 1 : origin.exportName === "export=" ? 2 : 0;
        var tabStop = preferences.includeCompletionsWithSnippetText ? "$1" : "";
        var importKind = ts2.codefix.getImportKind(sourceFile, exportKind, options, true);
        var isTopLevelTypeOnly = ((_b = (_a = ts2.tryCast(importCompletionNode, ts2.isImportDeclaration)) === null || _a === void 0 ? void 0 : _a.importClause) === null || _b === void 0 ? void 0 : _b.isTypeOnly) || ((_c = ts2.tryCast(importCompletionNode, ts2.isImportEqualsDeclaration)) === null || _c === void 0 ? void 0 : _c.isTypeOnly);
        var isImportSpecifierTypeOnly = couldBeTypeOnlyImportSpecifier(importCompletionNode, contextToken);
        var topLevelTypeOnlyText = isTopLevelTypeOnly ? " ".concat(ts2.tokenToString(151), " ") : " ";
        var importSpecifierTypeOnlyText = isImportSpecifierTypeOnly ? "".concat(ts2.tokenToString(151), " ") : "";
        var suffix = useSemicolons ? ";" : "";
        switch (importKind) {
          case 3:
            return { replacementSpan, insertText: "import".concat(topLevelTypeOnlyText).concat(ts2.escapeSnippetText(name)).concat(tabStop, " = require(").concat(quotedModuleSpecifier, ")").concat(suffix) };
          case 1:
            return { replacementSpan, insertText: "import".concat(topLevelTypeOnlyText).concat(ts2.escapeSnippetText(name)).concat(tabStop, " from ").concat(quotedModuleSpecifier).concat(suffix) };
          case 2:
            return { replacementSpan, insertText: "import".concat(topLevelTypeOnlyText, "* as ").concat(ts2.escapeSnippetText(name), " from ").concat(quotedModuleSpecifier).concat(suffix) };
          case 0:
            return { replacementSpan, insertText: "import".concat(topLevelTypeOnlyText, "{ ").concat(importSpecifierTypeOnlyText).concat(ts2.escapeSnippetText(name)).concat(tabStop, " } from ").concat(quotedModuleSpecifier).concat(suffix) };
        }
      }
      function quotePropertyName(sourceFile, preferences, name) {
        if (/^\d+$/.test(name)) {
          return name;
        }
        return ts2.quote(sourceFile, preferences, name);
      }
      function isRecommendedCompletionMatch(localSymbol, recommendedCompletion, checker) {
        return localSymbol === recommendedCompletion || !!(localSymbol.flags & 1048576) && checker.getExportSymbolOfSymbol(localSymbol) === recommendedCompletion;
      }
      function getSourceFromOrigin(origin) {
        if (originIsExport(origin)) {
          return ts2.stripQuotes(origin.moduleSymbol.name);
        }
        if (originIsResolvedExport(origin)) {
          return origin.moduleSpecifier;
        }
        if ((origin === null || origin === void 0 ? void 0 : origin.kind) === 1) {
          return CompletionSource.ThisProperty;
        }
      }
      function getCompletionEntriesFromSymbols(symbols, entries, replacementToken, contextToken, location, sourceFile, host, program, target, log, kind, preferences, compilerOptions, isTypeOnlyLocation, propertyAccessToConvert, jsxIdentifierExpected, isJsxInitializer, importCompletionNode, recommendedCompletion, symbolToOriginInfoMap, symbolToSortTextIdMap, isJsxIdentifierExpected, isRightOfOpenTag) {
        var _a;
        var start = ts2.timestamp();
        var variableDeclaration = getVariableDeclaration(location);
        var useSemicolons = ts2.probablyUsesSemicolons(sourceFile);
        var typeChecker = program.getTypeChecker();
        var uniques = new ts2.Map();
        for (var i = 0; i < symbols.length; i++) {
          var symbol = symbols[i];
          var origin = symbolToOriginInfoMap === null || symbolToOriginInfoMap === void 0 ? void 0 : symbolToOriginInfoMap[i];
          var info = getCompletionEntryDisplayNameForSymbol(symbol, target, origin, kind, !!jsxIdentifierExpected);
          if (!info || uniques.get(info.name) || kind === 1 && symbolToSortTextIdMap && !shouldIncludeSymbol(symbol, symbolToSortTextIdMap)) {
            continue;
          }
          var name = info.name, needsConvertPropertyAccess = info.needsConvertPropertyAccess;
          var sortTextId = (_a = symbolToSortTextIdMap === null || symbolToSortTextIdMap === void 0 ? void 0 : symbolToSortTextIdMap[ts2.getSymbolId(symbol)]) !== null && _a !== void 0 ? _a : 11;
          var sortText = (isDeprecated(symbol, typeChecker) ? 8 + sortTextId : sortTextId).toString();
          var entry = createCompletionEntry(symbol, sortText, replacementToken, contextToken, location, sourceFile, host, program, name, needsConvertPropertyAccess, origin, recommendedCompletion, propertyAccessToConvert, isJsxInitializer, importCompletionNode, useSemicolons, compilerOptions, preferences, kind, isJsxIdentifierExpected, isRightOfOpenTag);
          if (!entry) {
            continue;
          }
          var shouldShadowLaterSymbols = !origin && !(symbol.parent === void 0 && !ts2.some(symbol.declarations, function(d) {
            return d.getSourceFile() === location.getSourceFile();
          }));
          uniques.set(name, shouldShadowLaterSymbols);
          entries.push(entry);
        }
        log("getCompletionsAtPosition: getCompletionEntriesFromSymbols: " + (ts2.timestamp() - start));
        return {
          has: function(name2) {
            return uniques.has(name2);
          },
          add: function(name2) {
            return uniques.set(name2, true);
          }
        };
        function shouldIncludeSymbol(symbol2, symbolToSortTextIdMap2) {
          if (!ts2.isSourceFile(location)) {
            if (ts2.isExportAssignment(location.parent)) {
              return true;
            }
            if (variableDeclaration && symbol2.valueDeclaration === variableDeclaration) {
              return false;
            }
            var symbolOrigin = ts2.skipAlias(symbol2, typeChecker);
            if (!!sourceFile.externalModuleIndicator && !compilerOptions.allowUmdGlobalAccess && symbolToSortTextIdMap2[ts2.getSymbolId(symbol2)] === 15 && (symbolToSortTextIdMap2[ts2.getSymbolId(symbolOrigin)] === 16 || symbolToSortTextIdMap2[ts2.getSymbolId(symbolOrigin)] === 11)) {
              return false;
            }
            symbol2 = symbolOrigin;
            if (ts2.isInRightSideOfInternalImportEqualsDeclaration(location)) {
              return !!(symbol2.flags & 1920);
            }
            if (isTypeOnlyLocation) {
              return symbolCanBeReferencedAtTypeLocation(symbol2, typeChecker);
            }
          }
          return !!(ts2.getCombinedLocalAndExportSymbolFlags(symbol2) & 111551);
        }
      }
      Completions2.getCompletionEntriesFromSymbols = getCompletionEntriesFromSymbols;
      function getLabelCompletionAtPosition(node) {
        var entries = getLabelStatementCompletions(node);
        if (entries.length) {
          return { isGlobalCompletion: false, isMemberCompletion: false, isNewIdentifierLocation: false, entries };
        }
      }
      function getLabelStatementCompletions(node) {
        var entries = [];
        var uniques = new ts2.Map();
        var current = node;
        while (current) {
          if (ts2.isFunctionLike(current)) {
            break;
          }
          if (ts2.isLabeledStatement(current)) {
            var name = current.label.text;
            if (!uniques.has(name)) {
              uniques.set(name, true);
              entries.push({
                name,
                kindModifiers: "",
                kind: "label",
                sortText: SortText.LocationPriority
              });
            }
          }
          current = current.parent;
        }
        return entries;
      }
      function getSymbolCompletionFromEntryId(program, log, sourceFile, position, entryId, host, preferences) {
        if (entryId.data) {
          var autoImport = getAutoImportSymbolFromCompletionEntryData(entryId.name, entryId.data, program, host);
          if (autoImport) {
            var _a = getRelevantTokens(position, sourceFile), contextToken_1 = _a.contextToken, previousToken_1 = _a.previousToken;
            return {
              type: "symbol",
              symbol: autoImport.symbol,
              location: ts2.getTouchingPropertyName(sourceFile, position),
              previousToken: previousToken_1,
              contextToken: contextToken_1,
              isJsxInitializer: false,
              isTypeOnlyLocation: false,
              origin: autoImport.origin
            };
          }
        }
        var compilerOptions = program.getCompilerOptions();
        var completionData = getCompletionData(program, log, sourceFile, isUncheckedFile(sourceFile, compilerOptions), position, { includeCompletionsForModuleExports: true, includeCompletionsWithInsertText: true }, entryId, host);
        if (!completionData) {
          return { type: "none" };
        }
        if (completionData.kind !== 0) {
          return { type: "request", request: completionData };
        }
        var symbols = completionData.symbols, literals = completionData.literals, location = completionData.location, completionKind = completionData.completionKind, symbolToOriginInfoMap = completionData.symbolToOriginInfoMap, contextToken = completionData.contextToken, previousToken = completionData.previousToken, isJsxInitializer = completionData.isJsxInitializer, isTypeOnlyLocation = completionData.isTypeOnlyLocation;
        var literal = ts2.find(literals, function(l) {
          return completionNameForLiteral(sourceFile, preferences, l) === entryId.name;
        });
        if (literal !== void 0)
          return { type: "literal", literal };
        return ts2.firstDefined(symbols, function(symbol, index) {
          var origin = symbolToOriginInfoMap[index];
          var info = getCompletionEntryDisplayNameForSymbol(symbol, ts2.getEmitScriptTarget(compilerOptions), origin, completionKind, completionData.isJsxIdentifierExpected);
          return info && info.name === entryId.name && (entryId.source === CompletionSource.ClassMemberSnippet && symbol.flags & 106500 || getSourceFromOrigin(origin) === entryId.source) ? { type: "symbol", symbol, location, origin, contextToken, previousToken, isJsxInitializer, isTypeOnlyLocation } : void 0;
        }) || { type: "none" };
      }
      function getCompletionEntryDetails(program, log, sourceFile, position, entryId, host, formatContext, preferences, cancellationToken) {
        var typeChecker = program.getTypeChecker();
        var compilerOptions = program.getCompilerOptions();
        var name = entryId.name, source = entryId.source, data = entryId.data;
        var contextToken = ts2.findPrecedingToken(position, sourceFile);
        if (ts2.isInString(sourceFile, position, contextToken)) {
          return Completions2.StringCompletions.getStringLiteralCompletionDetails(name, sourceFile, position, contextToken, typeChecker, compilerOptions, host, cancellationToken, preferences);
        }
        var symbolCompletion = getSymbolCompletionFromEntryId(program, log, sourceFile, position, entryId, host, preferences);
        switch (symbolCompletion.type) {
          case "request": {
            var request = symbolCompletion.request;
            switch (request.kind) {
              case 1:
                return ts2.JsDoc.getJSDocTagNameCompletionDetails(name);
              case 2:
                return ts2.JsDoc.getJSDocTagCompletionDetails(name);
              case 3:
                return ts2.JsDoc.getJSDocParameterNameCompletionDetails(name);
              case 4:
                return ts2.some(request.keywordCompletions, function(c) {
                  return c.name === name;
                }) ? createSimpleDetails(name, "keyword", ts2.SymbolDisplayPartKind.keyword) : void 0;
              default:
                return ts2.Debug.assertNever(request);
            }
          }
          case "symbol": {
            var symbol = symbolCompletion.symbol, location = symbolCompletion.location, contextToken_2 = symbolCompletion.contextToken, origin = symbolCompletion.origin, previousToken = symbolCompletion.previousToken;
            var _a = getCompletionEntryCodeActionsAndSourceDisplay(name, location, contextToken_2, origin, symbol, program, host, compilerOptions, sourceFile, position, previousToken, formatContext, preferences, data, source), codeActions = _a.codeActions, sourceDisplay = _a.sourceDisplay;
            return createCompletionDetailsForSymbol(symbol, typeChecker, sourceFile, location, cancellationToken, codeActions, sourceDisplay);
          }
          case "literal": {
            var literal = symbolCompletion.literal;
            return createSimpleDetails(completionNameForLiteral(sourceFile, preferences, literal), "string", typeof literal === "string" ? ts2.SymbolDisplayPartKind.stringLiteral : ts2.SymbolDisplayPartKind.numericLiteral);
          }
          case "none":
            return allKeywordsCompletions().some(function(c) {
              return c.name === name;
            }) ? createSimpleDetails(name, "keyword", ts2.SymbolDisplayPartKind.keyword) : void 0;
          default:
            ts2.Debug.assertNever(symbolCompletion);
        }
      }
      Completions2.getCompletionEntryDetails = getCompletionEntryDetails;
      function createSimpleDetails(name, kind, kind2) {
        return createCompletionDetails(name, "", kind, [ts2.displayPart(name, kind2)]);
      }
      function createCompletionDetailsForSymbol(symbol, checker, sourceFile, location, cancellationToken, codeActions, sourceDisplay) {
        var _a = checker.runWithCancellationToken(cancellationToken, function(checker2) {
          return ts2.SymbolDisplay.getSymbolDisplayPartsDocumentationAndSymbolKind(checker2, symbol, sourceFile, location, location, 7);
        }), displayParts = _a.displayParts, documentation = _a.documentation, symbolKind = _a.symbolKind, tags = _a.tags;
        return createCompletionDetails(symbol.name, ts2.SymbolDisplay.getSymbolModifiers(checker, symbol), symbolKind, displayParts, documentation, tags, codeActions, sourceDisplay);
      }
      Completions2.createCompletionDetailsForSymbol = createCompletionDetailsForSymbol;
      function createCompletionDetails(name, kindModifiers, kind, displayParts, documentation, tags, codeActions, source) {
        return { name, kindModifiers, kind, displayParts, documentation, tags, codeActions, source, sourceDisplay: source };
      }
      Completions2.createCompletionDetails = createCompletionDetails;
      function getCompletionEntryCodeActionsAndSourceDisplay(name, location, contextToken, origin, symbol, program, host, compilerOptions, sourceFile, position, previousToken, formatContext, preferences, data, source) {
        if (data === null || data === void 0 ? void 0 : data.moduleSpecifier) {
          var _a = getRelevantTokens(position, sourceFile), contextToken_3 = _a.contextToken, previousToken_2 = _a.previousToken;
          if (previousToken_2 && getImportStatementCompletionInfo(contextToken_3 || previousToken_2).replacementNode) {
            return { codeActions: void 0, sourceDisplay: [ts2.textPart(data.moduleSpecifier)] };
          }
        }
        if (source === CompletionSource.ClassMemberSnippet) {
          var importAdder = getEntryForMemberCompletion(host, program, compilerOptions, preferences, name, symbol, location, contextToken).importAdder;
          if (importAdder) {
            var changes = ts2.textChanges.ChangeTracker.with({ host, formatContext, preferences }, importAdder.writeFixes);
            return {
              sourceDisplay: void 0,
              codeActions: [{
                changes,
                description: ts2.diagnosticToString([ts2.Diagnostics.Includes_imports_of_types_referenced_by_0, name])
              }]
            };
          }
        }
        if (!origin || !(originIsExport(origin) || originIsResolvedExport(origin))) {
          return { codeActions: void 0, sourceDisplay: void 0 };
        }
        var checker = origin.isFromPackageJson ? host.getPackageJsonAutoImportProvider().getTypeChecker() : program.getTypeChecker();
        var moduleSymbol = origin.moduleSymbol;
        var targetSymbol = checker.getMergedSymbol(ts2.skipAlias(symbol.exportSymbol || symbol, checker));
        var _b = ts2.codefix.getImportCompletionAction(targetSymbol, moduleSymbol, sourceFile, ts2.getNameForExportedSymbol(symbol, ts2.getEmitScriptTarget(compilerOptions)), host, program, formatContext, previousToken && ts2.isIdentifier(previousToken) ? previousToken.getStart(sourceFile) : position, preferences), moduleSpecifier = _b.moduleSpecifier, codeAction = _b.codeAction;
        ts2.Debug.assert(!(data === null || data === void 0 ? void 0 : data.moduleSpecifier) || moduleSpecifier === data.moduleSpecifier);
        return { sourceDisplay: [ts2.textPart(moduleSpecifier)], codeActions: [codeAction] };
      }
      function getCompletionEntrySymbol(program, log, sourceFile, position, entryId, host, preferences) {
        var completion = getSymbolCompletionFromEntryId(program, log, sourceFile, position, entryId, host, preferences);
        return completion.type === "symbol" ? completion.symbol : void 0;
      }
      Completions2.getCompletionEntrySymbol = getCompletionEntrySymbol;
      var CompletionDataKind;
      (function(CompletionDataKind2) {
        CompletionDataKind2[CompletionDataKind2["Data"] = 0] = "Data";
        CompletionDataKind2[CompletionDataKind2["JsDocTagName"] = 1] = "JsDocTagName";
        CompletionDataKind2[CompletionDataKind2["JsDocTag"] = 2] = "JsDocTag";
        CompletionDataKind2[CompletionDataKind2["JsDocParameterName"] = 3] = "JsDocParameterName";
        CompletionDataKind2[CompletionDataKind2["Keywords"] = 4] = "Keywords";
      })(CompletionDataKind || (CompletionDataKind = {}));
      var CompletionKind;
      (function(CompletionKind2) {
        CompletionKind2[CompletionKind2["ObjectPropertyDeclaration"] = 0] = "ObjectPropertyDeclaration";
        CompletionKind2[CompletionKind2["Global"] = 1] = "Global";
        CompletionKind2[CompletionKind2["PropertyAccess"] = 2] = "PropertyAccess";
        CompletionKind2[CompletionKind2["MemberLike"] = 3] = "MemberLike";
        CompletionKind2[CompletionKind2["String"] = 4] = "String";
        CompletionKind2[CompletionKind2["None"] = 5] = "None";
      })(CompletionKind = Completions2.CompletionKind || (Completions2.CompletionKind = {}));
      function getRecommendedCompletion(previousToken, contextualType, checker) {
        return ts2.firstDefined(contextualType && (contextualType.isUnion() ? contextualType.types : [contextualType]), function(type) {
          var symbol = type && type.symbol;
          return symbol && (symbol.flags & (8 | 384 | 32) && !ts2.isAbstractConstructorSymbol(symbol)) ? getFirstSymbolInChain(symbol, previousToken, checker) : void 0;
        });
      }
      function getContextualType(previousToken, position, sourceFile, checker) {
        var parent = previousToken.parent;
        switch (previousToken.kind) {
          case 79:
            return ts2.getContextualTypeFromParent(previousToken, checker);
          case 63:
            switch (parent.kind) {
              case 253:
                return checker.getContextualType(parent.initializer);
              case 220:
                return checker.getTypeAtLocation(parent.left);
              case 284:
                return checker.getContextualTypeForJsxAttribute(parent);
              default:
                return void 0;
            }
          case 103:
            return checker.getContextualType(parent);
          case 82:
            return ts2.getSwitchedType(ts2.cast(parent, ts2.isCaseClause), checker);
          case 18:
            return ts2.isJsxExpression(parent) && !ts2.isJsxElement(parent.parent) && !ts2.isJsxFragment(parent.parent) ? checker.getContextualTypeForJsxAttribute(parent.parent) : void 0;
          default:
            var argInfo = ts2.SignatureHelp.getArgumentInfoForCompletions(previousToken, position, sourceFile);
            return argInfo ? checker.getContextualTypeForArgumentAtIndex(argInfo.invocation, argInfo.argumentIndex + (previousToken.kind === 27 ? 1 : 0)) : ts2.isEqualityOperatorKind(previousToken.kind) && ts2.isBinaryExpression(parent) && ts2.isEqualityOperatorKind(parent.operatorToken.kind) ? checker.getTypeAtLocation(parent.left) : checker.getContextualType(previousToken);
        }
      }
      function getFirstSymbolInChain(symbol, enclosingDeclaration, checker) {
        var chain = checker.getAccessibleSymbolChain(symbol, enclosingDeclaration, 67108863, false);
        if (chain)
          return ts2.first(chain);
        return symbol.parent && (isModuleSymbol(symbol.parent) ? symbol : getFirstSymbolInChain(symbol.parent, enclosingDeclaration, checker));
      }
      function isModuleSymbol(symbol) {
        var _a;
        return !!((_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.some(function(d) {
          return d.kind === 303;
        }));
      }
      function getCompletionData(program, log, sourceFile, isUncheckedFile2, position, preferences, detailsEntryId, host, cancellationToken) {
        var typeChecker = program.getTypeChecker();
        var start = ts2.timestamp();
        var currentToken = ts2.getTokenAtPosition(sourceFile, position);
        log("getCompletionData: Get current token: " + (ts2.timestamp() - start));
        start = ts2.timestamp();
        var insideComment = ts2.isInComment(sourceFile, position, currentToken);
        log("getCompletionData: Is inside comment: " + (ts2.timestamp() - start));
        var insideJsDocTagTypeExpression = false;
        var isInSnippetScope = false;
        if (insideComment) {
          if (ts2.hasDocComment(sourceFile, position)) {
            if (sourceFile.text.charCodeAt(position - 1) === 64) {
              return { kind: 1 };
            } else {
              var lineStart = ts2.getLineStartPositionForPosition(position, sourceFile);
              if (!/[^\*|\s(/)]/.test(sourceFile.text.substring(lineStart, position))) {
                return { kind: 2 };
              }
            }
          }
          var tag = getJsDocTagAtPosition(currentToken, position);
          if (tag) {
            if (tag.tagName.pos <= position && position <= tag.tagName.end) {
              return { kind: 1 };
            }
            if (isTagWithTypeExpression(tag) && tag.typeExpression && tag.typeExpression.kind === 307) {
              currentToken = ts2.getTokenAtPosition(sourceFile, position);
              if (!currentToken || !ts2.isDeclarationName(currentToken) && (currentToken.parent.kind !== 345 || currentToken.parent.name !== currentToken)) {
                insideJsDocTagTypeExpression = isCurrentlyEditingNode(tag.typeExpression);
              }
            }
            if (!insideJsDocTagTypeExpression && ts2.isJSDocParameterTag(tag) && (ts2.nodeIsMissing(tag.name) || tag.name.pos <= position && position <= tag.name.end)) {
              return { kind: 3, tag };
            }
          }
          if (!insideJsDocTagTypeExpression) {
            log("Returning an empty list because completion was inside a regular comment or plain text part of a JsDoc comment.");
            return void 0;
          }
        }
        start = ts2.timestamp();
        var isJsOnlyLocation = !insideJsDocTagTypeExpression && ts2.isSourceFileJS(sourceFile);
        var tokens = getRelevantTokens(position, sourceFile);
        var previousToken = tokens.previousToken;
        var contextToken = tokens.contextToken;
        log("getCompletionData: Get previous token: " + (ts2.timestamp() - start));
        var node = currentToken;
        var propertyAccessToConvert;
        var isRightOfDot = false;
        var isRightOfQuestionDot = false;
        var isRightOfOpenTag = false;
        var isStartingCloseTag = false;
        var isJsxInitializer = false;
        var isJsxIdentifierExpected = false;
        var importCompletionNode;
        var location = ts2.getTouchingPropertyName(sourceFile, position);
        var keywordFilters = 0;
        var isNewIdentifierLocation = false;
        if (contextToken) {
          var importStatementCompletion = getImportStatementCompletionInfo(contextToken);
          isNewIdentifierLocation = importStatementCompletion.isNewIdentifierLocation;
          if (importStatementCompletion.keywordCompletion) {
            if (importStatementCompletion.isKeywordOnlyCompletion) {
              return {
                kind: 4,
                keywordCompletions: [keywordToCompletionEntry(importStatementCompletion.keywordCompletion)],
                isNewIdentifierLocation
              };
            }
            keywordFilters = keywordFiltersFromSyntaxKind(importStatementCompletion.keywordCompletion);
          }
          if (importStatementCompletion.replacementNode && preferences.includeCompletionsForImportStatements && preferences.includeCompletionsWithInsertText) {
            importCompletionNode = importStatementCompletion.replacementNode;
          }
          if (!importCompletionNode && isCompletionListBlocker(contextToken)) {
            log("Returning an empty list because completion was requested in an invalid position.");
            return keywordFilters ? keywordCompletionData(keywordFilters, isJsOnlyLocation, isNewIdentifierDefinitionLocation()) : void 0;
          }
          var parent = contextToken.parent;
          if (contextToken.kind === 24 || contextToken.kind === 28) {
            isRightOfDot = contextToken.kind === 24;
            isRightOfQuestionDot = contextToken.kind === 28;
            switch (parent.kind) {
              case 205:
                propertyAccessToConvert = parent;
                node = propertyAccessToConvert.expression;
                var leftmostAccessExpression = ts2.getLeftmostAccessExpression(propertyAccessToConvert);
                if (ts2.nodeIsMissing(leftmostAccessExpression) || (ts2.isCallExpression(node) || ts2.isFunctionLike(node)) && node.end === contextToken.pos && node.getChildCount(sourceFile) && ts2.last(node.getChildren(sourceFile)).kind !== 21) {
                  return void 0;
                }
                break;
              case 160:
                node = parent.left;
                break;
              case 260:
                node = parent.name;
                break;
              case 199:
                node = parent;
                break;
              case 230:
                node = parent.getFirstToken(sourceFile);
                ts2.Debug.assert(node.kind === 100 || node.kind === 103);
                break;
              default:
                return void 0;
            }
          } else if (!importCompletionNode && sourceFile.languageVariant === 1) {
            if (parent && parent.kind === 205) {
              contextToken = parent;
              parent = parent.parent;
            }
            if (currentToken.parent === location) {
              switch (currentToken.kind) {
                case 31:
                  if (currentToken.parent.kind === 277 || currentToken.parent.kind === 279) {
                    location = currentToken;
                  }
                  break;
                case 43:
                  if (currentToken.parent.kind === 278) {
                    location = currentToken;
                  }
                  break;
              }
            }
            switch (parent.kind) {
              case 280:
                if (contextToken.kind === 43) {
                  isStartingCloseTag = true;
                  location = contextToken;
                }
                break;
              case 220:
                if (!binaryExpressionMayBeOpenTag(parent)) {
                  break;
                }
              case 278:
              case 277:
              case 279:
                isJsxIdentifierExpected = true;
                if (contextToken.kind === 29) {
                  isRightOfOpenTag = true;
                  location = contextToken;
                }
                break;
              case 287:
              case 286:
                if (previousToken.kind === 19 && currentToken.kind === 31) {
                  isJsxIdentifierExpected = true;
                }
                break;
              case 284:
                if (parent.initializer === previousToken && previousToken.end < position) {
                  isJsxIdentifierExpected = true;
                  break;
                }
                switch (previousToken.kind) {
                  case 63:
                    isJsxInitializer = true;
                    break;
                  case 79:
                    isJsxIdentifierExpected = true;
                    if (parent !== previousToken.parent && !parent.initializer && ts2.findChildOfKind(parent, 63, sourceFile)) {
                      isJsxInitializer = previousToken;
                    }
                }
                break;
            }
          }
        }
        var semanticStart = ts2.timestamp();
        var completionKind = 5;
        var isNonContextualObjectLiteral = false;
        var hasUnresolvedAutoImports = false;
        var symbols = [];
        var symbolToOriginInfoMap = [];
        var symbolToSortTextIdMap = [];
        var seenPropertySymbols = new ts2.Map();
        var isTypeOnlyLocation = isTypeOnlyCompletion();
        var getModuleSpecifierResolutionHost = ts2.memoizeOne(function(isFromPackageJson) {
          return ts2.createModuleSpecifierResolutionHost(isFromPackageJson ? host.getPackageJsonAutoImportProvider() : program, host);
        });
        if (isRightOfDot || isRightOfQuestionDot) {
          getTypeScriptMemberSymbols();
        } else if (isRightOfOpenTag) {
          symbols = typeChecker.getJsxIntrinsicTagNamesAt(location);
          ts2.Debug.assertEachIsDefined(symbols, "getJsxIntrinsicTagNames() should all be defined");
          tryGetGlobalSymbols();
          completionKind = 1;
          keywordFilters = 0;
        } else if (isStartingCloseTag) {
          var tagName = contextToken.parent.parent.openingElement.tagName;
          var tagSymbol = typeChecker.getSymbolAtLocation(tagName);
          if (tagSymbol) {
            symbols = [tagSymbol];
          }
          completionKind = 1;
          keywordFilters = 0;
        } else {
          if (!tryGetGlobalSymbols()) {
            return keywordFilters ? keywordCompletionData(keywordFilters, isJsOnlyLocation, isNewIdentifierLocation) : void 0;
          }
        }
        log("getCompletionData: Semantic work: " + (ts2.timestamp() - semanticStart));
        var contextualType = previousToken && getContextualType(previousToken, position, sourceFile, typeChecker);
        var literals = ts2.mapDefined(contextualType && (contextualType.isUnion() ? contextualType.types : [contextualType]), function(t) {
          return t.isLiteral() && !(t.flags & 1024) ? t.value : void 0;
        });
        var recommendedCompletion = previousToken && contextualType && getRecommendedCompletion(previousToken, contextualType, typeChecker);
        return {
          kind: 0,
          symbols,
          completionKind,
          isInSnippetScope,
          propertyAccessToConvert,
          isNewIdentifierLocation,
          location,
          keywordFilters,
          literals,
          symbolToOriginInfoMap,
          recommendedCompletion,
          previousToken,
          contextToken,
          isJsxInitializer,
          insideJsDocTagTypeExpression,
          symbolToSortTextIdMap,
          isTypeOnlyLocation,
          isJsxIdentifierExpected,
          isRightOfOpenTag,
          importCompletionNode,
          hasUnresolvedAutoImports
        };
        function isTagWithTypeExpression(tag2) {
          switch (tag2.kind) {
            case 338:
            case 345:
            case 339:
            case 341:
            case 343:
              return true;
            default:
              return false;
          }
        }
        function getTypeScriptMemberSymbols() {
          completionKind = 2;
          var isImportType = ts2.isLiteralImportTypeNode(node);
          var isTypeLocation = insideJsDocTagTypeExpression || isImportType && !node.isTypeOf || ts2.isPartOfTypeNode(node.parent) || ts2.isPossiblyTypeArgumentPosition(contextToken, sourceFile, typeChecker);
          var isRhsOfImportDeclaration = ts2.isInRightSideOfInternalImportEqualsDeclaration(node);
          if (ts2.isEntityName(node) || isImportType || ts2.isPropertyAccessExpression(node)) {
            var isNamespaceName = ts2.isModuleDeclaration(node.parent);
            if (isNamespaceName)
              isNewIdentifierLocation = true;
            var symbol = typeChecker.getSymbolAtLocation(node);
            if (symbol) {
              symbol = ts2.skipAlias(symbol, typeChecker);
              if (symbol.flags & (1536 | 384)) {
                var exportedSymbols = typeChecker.getExportsOfModule(symbol);
                ts2.Debug.assertEachIsDefined(exportedSymbols, "getExportsOfModule() should all be defined");
                var isValidValueAccess_1 = function(symbol2) {
                  return typeChecker.isValidPropertyAccess(isImportType ? node : node.parent, symbol2.name);
                };
                var isValidTypeAccess_1 = function(symbol2) {
                  return symbolCanBeReferencedAtTypeLocation(symbol2, typeChecker);
                };
                var isValidAccess = isNamespaceName ? function(symbol2) {
                  var _a;
                  return !!(symbol2.flags & 1920) && !((_a = symbol2.declarations) === null || _a === void 0 ? void 0 : _a.every(function(d) {
                    return d.parent === node.parent;
                  }));
                } : isRhsOfImportDeclaration ? function(symbol2) {
                  return isValidTypeAccess_1(symbol2) || isValidValueAccess_1(symbol2);
                } : isTypeLocation ? isValidTypeAccess_1 : isValidValueAccess_1;
                for (var _i = 0, exportedSymbols_1 = exportedSymbols; _i < exportedSymbols_1.length; _i++) {
                  var exportedSymbol = exportedSymbols_1[_i];
                  if (isValidAccess(exportedSymbol)) {
                    symbols.push(exportedSymbol);
                  }
                }
                if (!isTypeLocation && symbol.declarations && symbol.declarations.some(function(d) {
                  return d.kind !== 303 && d.kind !== 260 && d.kind !== 259;
                })) {
                  var type = typeChecker.getTypeOfSymbolAtLocation(symbol, node).getNonOptionalType();
                  var insertQuestionDot = false;
                  if (type.isNullableType()) {
                    var canCorrectToQuestionDot = isRightOfDot && !isRightOfQuestionDot && preferences.includeAutomaticOptionalChainCompletions !== false;
                    if (canCorrectToQuestionDot || isRightOfQuestionDot) {
                      type = type.getNonNullableType();
                      if (canCorrectToQuestionDot) {
                        insertQuestionDot = true;
                      }
                    }
                  }
                  addTypeProperties(type, !!(node.flags & 32768), insertQuestionDot);
                }
                return;
              }
            }
          }
          if (!isTypeLocation) {
            var container = ts2.getThisContainer(node, false);
            if (!ts2.isSourceFile(container) && container.parent)
              typeChecker.getTypeAtLocation(container);
            var type = typeChecker.getTypeAtLocation(node).getNonOptionalType();
            var insertQuestionDot = false;
            if (type.isNullableType()) {
              var canCorrectToQuestionDot = isRightOfDot && !isRightOfQuestionDot && preferences.includeAutomaticOptionalChainCompletions !== false;
              if (canCorrectToQuestionDot || isRightOfQuestionDot) {
                type = type.getNonNullableType();
                if (canCorrectToQuestionDot) {
                  insertQuestionDot = true;
                }
              }
            }
            addTypeProperties(type, !!(node.flags & 32768), insertQuestionDot);
          }
        }
        function addTypeProperties(type, insertAwait, insertQuestionDot) {
          isNewIdentifierLocation = !!type.getStringIndexType();
          if (isRightOfQuestionDot && ts2.some(type.getCallSignatures())) {
            isNewIdentifierLocation = true;
          }
          var propertyAccess = node.kind === 199 ? node : node.parent;
          if (isUncheckedFile2) {
            symbols.push.apply(symbols, ts2.filter(getPropertiesForCompletion(type, typeChecker), function(s) {
              return typeChecker.isValidPropertyAccessForCompletions(propertyAccess, type, s);
            }));
          } else {
            for (var _i = 0, _a = type.getApparentProperties(); _i < _a.length; _i++) {
              var symbol = _a[_i];
              if (typeChecker.isValidPropertyAccessForCompletions(propertyAccess, type, symbol)) {
                addPropertySymbol(symbol, false, insertQuestionDot);
              }
            }
          }
          if (insertAwait && preferences.includeCompletionsWithInsertText) {
            var promiseType = typeChecker.getPromisedTypeOfPromise(type);
            if (promiseType) {
              for (var _b = 0, _c = promiseType.getApparentProperties(); _b < _c.length; _b++) {
                var symbol = _c[_b];
                if (typeChecker.isValidPropertyAccessForCompletions(propertyAccess, promiseType, symbol)) {
                  addPropertySymbol(symbol, true, insertQuestionDot);
                }
              }
            }
          }
        }
        function addPropertySymbol(symbol, insertAwait, insertQuestionDot) {
          var _a;
          var computedPropertyName = ts2.firstDefined(symbol.declarations, function(decl) {
            return ts2.tryCast(ts2.getNameOfDeclaration(decl), ts2.isComputedPropertyName);
          });
          if (computedPropertyName) {
            var leftMostName = getLeftMostName(computedPropertyName.expression);
            var nameSymbol = leftMostName && typeChecker.getSymbolAtLocation(leftMostName);
            var firstAccessibleSymbol = nameSymbol && getFirstSymbolInChain(nameSymbol, contextToken, typeChecker);
            if (firstAccessibleSymbol && ts2.addToSeen(seenPropertySymbols, ts2.getSymbolId(firstAccessibleSymbol))) {
              var index = symbols.length;
              symbols.push(firstAccessibleSymbol);
              var moduleSymbol = firstAccessibleSymbol.parent;
              if (!moduleSymbol || !ts2.isExternalModuleSymbol(moduleSymbol) || typeChecker.tryGetMemberInModuleExportsAndProperties(firstAccessibleSymbol.name, moduleSymbol) !== firstAccessibleSymbol) {
                symbolToOriginInfoMap[index] = { kind: getNullableSymbolOriginInfoKind(2) };
              } else {
                var fileName = ts2.isExternalModuleNameRelative(ts2.stripQuotes(moduleSymbol.name)) ? (_a = ts2.getSourceFileOfModule(moduleSymbol)) === null || _a === void 0 ? void 0 : _a.fileName : void 0;
                var moduleSpecifier = (ts2.codefix.getModuleSpecifierForBestExportInfo([{
                  exportKind: 0,
                  moduleFileName: fileName,
                  isFromPackageJson: false,
                  moduleSymbol,
                  symbol: firstAccessibleSymbol,
                  targetFlags: ts2.skipAlias(firstAccessibleSymbol, typeChecker).flags
                }], sourceFile, program, host, preferences) || {}).moduleSpecifier;
                if (moduleSpecifier) {
                  var origin = {
                    kind: getNullableSymbolOriginInfoKind(6),
                    moduleSymbol,
                    isDefaultExport: false,
                    symbolName: firstAccessibleSymbol.name,
                    exportName: firstAccessibleSymbol.name,
                    fileName,
                    moduleSpecifier
                  };
                  symbolToOriginInfoMap[index] = origin;
                }
              }
            } else if (preferences.includeCompletionsWithInsertText) {
              addSymbolOriginInfo(symbol);
              addSymbolSortInfo(symbol);
              symbols.push(symbol);
            }
          } else {
            addSymbolOriginInfo(symbol);
            addSymbolSortInfo(symbol);
            symbols.push(symbol);
          }
          function addSymbolSortInfo(symbol2) {
            if (isStaticProperty(symbol2)) {
              symbolToSortTextIdMap[ts2.getSymbolId(symbol2)] = 10;
            }
          }
          function addSymbolOriginInfo(symbol2) {
            if (preferences.includeCompletionsWithInsertText) {
              if (insertAwait && ts2.addToSeen(seenPropertySymbols, ts2.getSymbolId(symbol2))) {
                symbolToOriginInfoMap[symbols.length] = { kind: getNullableSymbolOriginInfoKind(8) };
              } else if (insertQuestionDot) {
                symbolToOriginInfoMap[symbols.length] = { kind: 16 };
              }
            }
          }
          function getNullableSymbolOriginInfoKind(kind) {
            return insertQuestionDot ? kind | 16 : kind;
          }
        }
        function getLeftMostName(e) {
          return ts2.isIdentifier(e) ? e : ts2.isPropertyAccessExpression(e) ? getLeftMostName(e.expression) : void 0;
        }
        function tryGetGlobalSymbols() {
          var result = tryGetObjectTypeLiteralInTypeArgumentCompletionSymbols() || tryGetObjectLikeCompletionSymbols() || tryGetImportCompletionSymbols() || tryGetImportOrExportClauseCompletionSymbols() || tryGetLocalNamedExportCompletionSymbols() || tryGetConstructorCompletion() || tryGetClassLikeCompletionSymbols() || tryGetJsxCompletionSymbols() || (getGlobalCompletions(), 1);
          return result === 1;
        }
        function tryGetConstructorCompletion() {
          if (!tryGetConstructorLikeCompletionContainer(contextToken))
            return 0;
          completionKind = 5;
          isNewIdentifierLocation = true;
          keywordFilters = 4;
          return 1;
        }
        function tryGetJsxCompletionSymbols() {
          var jsxContainer = tryGetContainingJsxElement(contextToken);
          var attrsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes);
          if (!attrsType)
            return 0;
          var completionsType = jsxContainer && typeChecker.getContextualType(jsxContainer.attributes, 4);
          symbols = ts2.concatenate(symbols, filterJsxAttributes(getPropertiesForObjectExpression(attrsType, completionsType, jsxContainer.attributes, typeChecker), jsxContainer.attributes.properties));
          setSortTextToOptionalMember();
          completionKind = 3;
          isNewIdentifierLocation = false;
          return 1;
        }
        function tryGetImportCompletionSymbols() {
          if (!importCompletionNode)
            return 0;
          isNewIdentifierLocation = true;
          collectAutoImports();
          return 1;
        }
        function getGlobalCompletions() {
          keywordFilters = tryGetFunctionLikeBodyCompletionContainer(contextToken) ? 5 : 1;
          completionKind = 1;
          isNewIdentifierLocation = isNewIdentifierDefinitionLocation();
          if (previousToken !== contextToken) {
            ts2.Debug.assert(!!previousToken, "Expected 'contextToken' to be defined when different from 'previousToken'.");
          }
          var adjustedPosition = previousToken !== contextToken ? previousToken.getStart() : position;
          var scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile;
          isInSnippetScope = isSnippetScope(scopeNode);
          var symbolMeanings = (isTypeOnlyLocation ? 0 : 111551) | 788968 | 1920 | 2097152;
          symbols = ts2.concatenate(symbols, typeChecker.getSymbolsInScope(scopeNode, symbolMeanings));
          ts2.Debug.assertEachIsDefined(symbols, "getSymbolsInScope() should all be defined");
          for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
            var symbol = symbols_1[_i];
            if (!typeChecker.isArgumentsSymbol(symbol) && !ts2.some(symbol.declarations, function(d) {
              return d.getSourceFile() === sourceFile;
            })) {
              symbolToSortTextIdMap[ts2.getSymbolId(symbol)] = 15;
            }
          }
          if (preferences.includeCompletionsWithInsertText && scopeNode.kind !== 303) {
            var thisType = typeChecker.tryGetThisTypeAt(scopeNode, false);
            if (thisType && !isProbablyGlobalType(thisType, sourceFile, typeChecker)) {
              for (var _a = 0, _b = getPropertiesForCompletion(thisType, typeChecker); _a < _b.length; _a++) {
                var symbol = _b[_a];
                symbolToOriginInfoMap[symbols.length] = { kind: 1 };
                symbols.push(symbol);
                symbolToSortTextIdMap[ts2.getSymbolId(symbol)] = 14;
              }
            }
          }
          collectAutoImports();
          if (isTypeOnlyLocation) {
            keywordFilters = contextToken && ts2.isAssertionExpression(contextToken.parent) ? 6 : 7;
          }
        }
        function shouldOfferImportCompletions() {
          if (importCompletionNode)
            return true;
          if (isNonContextualObjectLiteral)
            return false;
          if (!preferences.includeCompletionsForModuleExports)
            return false;
          if (sourceFile.externalModuleIndicator || sourceFile.commonJsModuleIndicator)
            return true;
          if (ts2.compilerOptionsIndicateEsModules(program.getCompilerOptions()))
            return true;
          return ts2.programContainsModules(program);
        }
        function isSnippetScope(scopeNode) {
          switch (scopeNode.kind) {
            case 303:
            case 222:
            case 287:
            case 234:
              return true;
            default:
              return ts2.isStatement(scopeNode);
          }
        }
        function isTypeOnlyCompletion() {
          return insideJsDocTagTypeExpression || !!importCompletionNode && ts2.isTypeOnlyImportOrExportDeclaration(location.parent) || !isContextTokenValueLocation(contextToken) && (ts2.isPossiblyTypeArgumentPosition(contextToken, sourceFile, typeChecker) || ts2.isPartOfTypeNode(location) || isContextTokenTypeLocation(contextToken));
        }
        function isContextTokenValueLocation(contextToken2) {
          return contextToken2 && (contextToken2.kind === 112 && (contextToken2.parent.kind === 180 || ts2.isTypeOfExpression(contextToken2.parent)) || contextToken2.kind === 128 && contextToken2.parent.kind === 176);
        }
        function isContextTokenTypeLocation(contextToken2) {
          if (contextToken2) {
            var parentKind = contextToken2.parent.kind;
            switch (contextToken2.kind) {
              case 58:
                return parentKind === 166 || parentKind === 165 || parentKind === 163 || parentKind === 253 || ts2.isFunctionLikeKind(parentKind);
              case 63:
                return parentKind === 258;
              case 127:
                return parentKind === 228;
              case 29:
                return parentKind === 177 || parentKind === 210;
              case 94:
                return parentKind === 162;
            }
          }
          return false;
        }
        function collectAutoImports() {
          var _a, _b;
          if (!shouldOfferImportCompletions())
            return;
          ts2.Debug.assert(!(detailsEntryId === null || detailsEntryId === void 0 ? void 0 : detailsEntryId.data), "Should not run 'collectAutoImports' when faster path is available via `data`");
          if (detailsEntryId && !detailsEntryId.source) {
            return;
          }
          var isAfterTypeOnlyImportSpecifierModifier = previousToken === contextToken && importCompletionNode && couldBeTypeOnlyImportSpecifier(importCompletionNode, contextToken);
          var lowerCaseTokenText = isAfterTypeOnlyImportSpecifierModifier ? "" : previousToken && ts2.isIdentifier(previousToken) ? previousToken.text.toLowerCase() : "";
          var moduleSpecifierCache = (_a = host.getModuleSpecifierCache) === null || _a === void 0 ? void 0 : _a.call(host);
          var exportInfo = ts2.getExportInfoMap(sourceFile, host, program, cancellationToken);
          var packageJsonAutoImportProvider = (_b = host.getPackageJsonAutoImportProvider) === null || _b === void 0 ? void 0 : _b.call(host);
          var packageJsonFilter = detailsEntryId ? void 0 : ts2.createPackageJsonImportFilter(sourceFile, preferences, host);
          resolvingModuleSpecifiers("collectAutoImports", host, program, sourceFile, preferences, !!importCompletionNode, function(context) {
            exportInfo.forEach(sourceFile.path, function(info, symbolName, isFromAmbientModule, exportMapKey) {
              if (!ts2.isIdentifierText(symbolName, ts2.getEmitScriptTarget(host.getCompilationSettings())))
                return;
              if (!detailsEntryId && ts2.isStringANonContextualKeyword(symbolName))
                return;
              if (!isTypeOnlyLocation && !importCompletionNode && !(info[0].targetFlags & 111551))
                return;
              if (isTypeOnlyLocation && !(info[0].targetFlags & (1536 | 788968)))
                return;
              var isCompletionDetailsMatch = detailsEntryId && ts2.some(info, function(i) {
                return detailsEntryId.source === ts2.stripQuotes(i.moduleSymbol.name);
              });
              if (isCompletionDetailsMatch || !detailsEntryId && charactersFuzzyMatchInString(symbolName, lowerCaseTokenText)) {
                var defaultExportInfo = ts2.find(info, isImportableExportInfo);
                if (!defaultExportInfo) {
                  return;
                }
                var _a2 = context.tryResolve(info, isFromAmbientModule) || {}, _b2 = _a2.exportInfo, exportInfo_1 = _b2 === void 0 ? defaultExportInfo : _b2, moduleSpecifier = _a2.moduleSpecifier;
                var isDefaultExport = exportInfo_1.exportKind === 1;
                var symbol = isDefaultExport && ts2.getLocalSymbolForExportDefault(exportInfo_1.symbol) || exportInfo_1.symbol;
                pushAutoImportSymbol(symbol, {
                  kind: moduleSpecifier ? 32 : 4,
                  moduleSpecifier,
                  symbolName,
                  exportMapKey,
                  exportName: exportInfo_1.exportKind === 2 ? "export=" : exportInfo_1.symbol.name,
                  fileName: exportInfo_1.moduleFileName,
                  isDefaultExport,
                  moduleSymbol: exportInfo_1.moduleSymbol,
                  isFromPackageJson: exportInfo_1.isFromPackageJson
                });
              }
            });
            hasUnresolvedAutoImports = context.resolutionLimitExceeded();
          });
          function isImportableExportInfo(info) {
            var moduleFile = ts2.tryCast(info.moduleSymbol.valueDeclaration, ts2.isSourceFile);
            if (!moduleFile) {
              var moduleName = ts2.stripQuotes(info.moduleSymbol.name);
              if (ts2.JsTyping.nodeCoreModules.has(moduleName) && ts2.startsWith(moduleName, "node:") !== ts2.shouldUseUriStyleNodeCoreModules(sourceFile, program)) {
                return false;
              }
              return packageJsonFilter ? packageJsonFilter.allowsImportingAmbientModule(info.moduleSymbol, getModuleSpecifierResolutionHost(info.isFromPackageJson)) : true;
            }
            return ts2.isImportableFile(info.isFromPackageJson ? packageJsonAutoImportProvider : program, sourceFile, moduleFile, preferences, packageJsonFilter, getModuleSpecifierResolutionHost(info.isFromPackageJson), moduleSpecifierCache);
          }
        }
        function pushAutoImportSymbol(symbol, origin) {
          var symbolId = ts2.getSymbolId(symbol);
          if (symbolToSortTextIdMap[symbolId] === 15) {
            return;
          }
          symbolToOriginInfoMap[symbols.length] = origin;
          symbolToSortTextIdMap[symbolId] = importCompletionNode ? 11 : 16;
          symbols.push(symbol);
        }
        function getScopeNode(initialToken, position2, sourceFile2) {
          var scope = initialToken;
          while (scope && !ts2.positionBelongsToNode(scope, position2, sourceFile2)) {
            scope = scope.parent;
          }
          return scope;
        }
        function isCompletionListBlocker(contextToken2) {
          var start2 = ts2.timestamp();
          var result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken2) || isSolelyIdentifierDefinitionLocation(contextToken2) || isDotOfNumericLiteral(contextToken2) || isInJsxText(contextToken2) || ts2.isBigIntLiteral(contextToken2);
          log("getCompletionsAtPosition: isCompletionListBlocker: " + (ts2.timestamp() - start2));
          return result;
        }
        function isInJsxText(contextToken2) {
          if (contextToken2.kind === 11) {
            return true;
          }
          if (contextToken2.kind === 31 && contextToken2.parent) {
            if (contextToken2.parent.kind === 279) {
              return location.parent.kind !== 279;
            }
            if (contextToken2.parent.kind === 280 || contextToken2.parent.kind === 278) {
              return !!contextToken2.parent.parent && contextToken2.parent.parent.kind === 277;
            }
          }
          return false;
        }
        function isNewIdentifierDefinitionLocation() {
          if (contextToken) {
            var containingNodeKind = contextToken.parent.kind;
            var tokenKind = keywordForNode(contextToken);
            switch (tokenKind) {
              case 27:
                return containingNodeKind === 207 || containingNodeKind === 170 || containingNodeKind === 208 || containingNodeKind === 203 || containingNodeKind === 220 || containingNodeKind === 178 || containingNodeKind === 204;
              case 20:
                return containingNodeKind === 207 || containingNodeKind === 170 || containingNodeKind === 208 || containingNodeKind === 211 || containingNodeKind === 190;
              case 22:
                return containingNodeKind === 203 || containingNodeKind === 175 || containingNodeKind === 161;
              case 141:
              case 142:
              case 100:
                return true;
              case 24:
                return containingNodeKind === 260;
              case 18:
                return containingNodeKind === 256 || containingNodeKind === 204;
              case 63:
                return containingNodeKind === 253 || containingNodeKind === 220;
              case 15:
                return containingNodeKind === 222;
              case 16:
                return containingNodeKind === 232;
              case 131:
                return containingNodeKind === 168 || containingNodeKind === 295;
              case 41:
                return containingNodeKind === 168;
            }
            if (isClassMemberCompletionKeyword(tokenKind)) {
              return true;
            }
          }
          return false;
        }
        function isInStringOrRegularExpressionOrTemplateLiteral(contextToken2) {
          return (ts2.isRegularExpressionLiteral(contextToken2) || ts2.isStringTextContainingNode(contextToken2)) && (ts2.rangeContainsPositionExclusive(ts2.createTextRangeFromSpan(ts2.createTextSpanFromNode(contextToken2)), position) || position === contextToken2.end && (!!contextToken2.isUnterminated || ts2.isRegularExpressionLiteral(contextToken2)));
        }
        function tryGetObjectTypeLiteralInTypeArgumentCompletionSymbols() {
          var typeLiteralNode = tryGetTypeLiteralNode(contextToken);
          if (!typeLiteralNode)
            return 0;
          var intersectionTypeNode = ts2.isIntersectionTypeNode(typeLiteralNode.parent) ? typeLiteralNode.parent : void 0;
          var containerTypeNode = intersectionTypeNode || typeLiteralNode;
          var containerExpectedType = getConstraintOfTypeArgumentProperty(containerTypeNode, typeChecker);
          if (!containerExpectedType)
            return 0;
          var containerActualType = typeChecker.getTypeFromTypeNode(containerTypeNode);
          var members = getPropertiesForCompletion(containerExpectedType, typeChecker);
          var existingMembers = getPropertiesForCompletion(containerActualType, typeChecker);
          var existingMemberEscapedNames = new ts2.Set();
          existingMembers.forEach(function(s) {
            return existingMemberEscapedNames.add(s.escapedName);
          });
          symbols = ts2.concatenate(symbols, ts2.filter(members, function(s) {
            return !existingMemberEscapedNames.has(s.escapedName);
          }));
          completionKind = 0;
          isNewIdentifierLocation = true;
          return 1;
        }
        function tryGetObjectLikeCompletionSymbols() {
          var objectLikeContainer = tryGetObjectLikeCompletionContainer(contextToken);
          if (!objectLikeContainer)
            return 0;
          completionKind = 0;
          var typeMembers;
          var existingMembers;
          if (objectLikeContainer.kind === 204) {
            var instantiatedType = tryGetObjectLiteralContextualType(objectLikeContainer, typeChecker);
            if (instantiatedType === void 0) {
              if (objectLikeContainer.flags & 16777216) {
                return 2;
              }
              isNonContextualObjectLiteral = true;
              return 0;
            }
            var completionsType = typeChecker.getContextualType(objectLikeContainer, 4);
            var hasStringIndexType = (completionsType || instantiatedType).getStringIndexType();
            var hasNumberIndextype = (completionsType || instantiatedType).getNumberIndexType();
            isNewIdentifierLocation = !!hasStringIndexType || !!hasNumberIndextype;
            typeMembers = getPropertiesForObjectExpression(instantiatedType, completionsType, objectLikeContainer, typeChecker);
            existingMembers = objectLikeContainer.properties;
            if (typeMembers.length === 0) {
              if (!hasNumberIndextype) {
                isNonContextualObjectLiteral = true;
                return 0;
              }
            }
          } else {
            ts2.Debug.assert(objectLikeContainer.kind === 200);
            isNewIdentifierLocation = false;
            var rootDeclaration = ts2.getRootDeclaration(objectLikeContainer.parent);
            if (!ts2.isVariableLike(rootDeclaration))
              return ts2.Debug.fail("Root declaration is not variable-like.");
            var canGetType = ts2.hasInitializer(rootDeclaration) || ts2.hasType(rootDeclaration) || rootDeclaration.parent.parent.kind === 243;
            if (!canGetType && rootDeclaration.kind === 163) {
              if (ts2.isExpression(rootDeclaration.parent)) {
                canGetType = !!typeChecker.getContextualType(rootDeclaration.parent);
              } else if (rootDeclaration.parent.kind === 168 || rootDeclaration.parent.kind === 172) {
                canGetType = ts2.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent);
              }
            }
            if (canGetType) {
              var typeForObject_1 = typeChecker.getTypeAtLocation(objectLikeContainer);
              if (!typeForObject_1)
                return 2;
              typeMembers = typeChecker.getPropertiesOfType(typeForObject_1).filter(function(propertySymbol) {
                return typeChecker.isPropertyAccessible(objectLikeContainer, false, false, typeForObject_1, propertySymbol);
              });
              existingMembers = objectLikeContainer.elements;
            }
          }
          if (typeMembers && typeMembers.length > 0) {
            symbols = ts2.concatenate(symbols, filterObjectMembersList(typeMembers, ts2.Debug.checkDefined(existingMembers)));
          }
          setSortTextToOptionalMember();
          return 1;
        }
        function tryGetImportOrExportClauseCompletionSymbols() {
          if (!contextToken)
            return 0;
          var namedImportsOrExports = contextToken.kind === 18 || contextToken.kind === 27 ? ts2.tryCast(contextToken.parent, ts2.isNamedImportsOrExports) : ts2.isTypeKeywordTokenOrIdentifier(contextToken) ? ts2.tryCast(contextToken.parent.parent, ts2.isNamedImportsOrExports) : void 0;
          if (!namedImportsOrExports)
            return 0;
          if (!ts2.isTypeKeywordTokenOrIdentifier(contextToken)) {
            keywordFilters = 8;
          }
          var moduleSpecifier = (namedImportsOrExports.kind === 268 ? namedImportsOrExports.parent.parent : namedImportsOrExports.parent).moduleSpecifier;
          if (!moduleSpecifier) {
            isNewIdentifierLocation = true;
            return namedImportsOrExports.kind === 268 ? 2 : 0;
          }
          var moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(moduleSpecifier);
          if (!moduleSpecifierSymbol) {
            isNewIdentifierLocation = true;
            return 2;
          }
          completionKind = 3;
          isNewIdentifierLocation = false;
          var exports = typeChecker.getExportsAndPropertiesOfModule(moduleSpecifierSymbol);
          var existing = new ts2.Set(namedImportsOrExports.elements.filter(function(n) {
            return !isCurrentlyEditingNode(n);
          }).map(function(n) {
            return (n.propertyName || n.name).escapedText;
          }));
          var uniques = exports.filter(function(e) {
            return e.escapedName !== "default" && !existing.has(e.escapedName);
          });
          symbols = ts2.concatenate(symbols, uniques);
          if (!uniques.length) {
            keywordFilters = 0;
          }
          return 1;
        }
        function tryGetLocalNamedExportCompletionSymbols() {
          var _a;
          var namedExports = contextToken && (contextToken.kind === 18 || contextToken.kind === 27) ? ts2.tryCast(contextToken.parent, ts2.isNamedExports) : void 0;
          if (!namedExports) {
            return 0;
          }
          var localsContainer = ts2.findAncestor(namedExports, ts2.or(ts2.isSourceFile, ts2.isModuleDeclaration));
          completionKind = 5;
          isNewIdentifierLocation = false;
          (_a = localsContainer.locals) === null || _a === void 0 ? void 0 : _a.forEach(function(symbol, name) {
            var _a2, _b;
            symbols.push(symbol);
            if ((_b = (_a2 = localsContainer.symbol) === null || _a2 === void 0 ? void 0 : _a2.exports) === null || _b === void 0 ? void 0 : _b.has(name)) {
              symbolToSortTextIdMap[ts2.getSymbolId(symbol)] = 12;
            }
          });
          return 1;
        }
        function tryGetClassLikeCompletionSymbols() {
          var decl = tryGetObjectTypeDeclarationCompletionContainer(sourceFile, contextToken, location, position);
          if (!decl)
            return 0;
          completionKind = 3;
          isNewIdentifierLocation = true;
          keywordFilters = contextToken.kind === 41 ? 0 : ts2.isClassLike(decl) ? 2 : 3;
          if (!ts2.isClassLike(decl))
            return 1;
          var classElement = contextToken.kind === 26 ? contextToken.parent.parent : contextToken.parent;
          var classElementModifierFlags = ts2.isClassElement(classElement) ? ts2.getEffectiveModifierFlags(classElement) : 0;
          if (contextToken.kind === 79 && !isCurrentlyEditingNode(contextToken)) {
            switch (contextToken.getText()) {
              case "private":
                classElementModifierFlags = classElementModifierFlags | 8;
                break;
              case "static":
                classElementModifierFlags = classElementModifierFlags | 32;
                break;
              case "override":
                classElementModifierFlags = classElementModifierFlags | 16384;
                break;
            }
          }
          if (ts2.isClassStaticBlockDeclaration(classElement)) {
            classElementModifierFlags |= 32;
          }
          if (!(classElementModifierFlags & 8)) {
            var baseTypeNodes = ts2.isClassLike(decl) && classElementModifierFlags & 16384 ? ts2.singleElementArray(ts2.getEffectiveBaseTypeNode(decl)) : ts2.getAllSuperTypeNodes(decl);
            var baseSymbols = ts2.flatMap(baseTypeNodes, function(baseTypeNode) {
              var type = typeChecker.getTypeAtLocation(baseTypeNode);
              return classElementModifierFlags & 32 ? (type === null || type === void 0 ? void 0 : type.symbol) && typeChecker.getPropertiesOfType(typeChecker.getTypeOfSymbolAtLocation(type.symbol, decl)) : type && typeChecker.getPropertiesOfType(type);
            });
            symbols = ts2.concatenate(symbols, filterClassMembersList(baseSymbols, decl.members, classElementModifierFlags));
          }
          return 1;
        }
        function tryGetObjectLikeCompletionContainer(contextToken2) {
          if (contextToken2) {
            var parent2 = contextToken2.parent;
            switch (contextToken2.kind) {
              case 18:
              case 27:
                if (ts2.isObjectLiteralExpression(parent2) || ts2.isObjectBindingPattern(parent2)) {
                  return parent2;
                }
                break;
              case 41:
                return ts2.isMethodDeclaration(parent2) ? ts2.tryCast(parent2.parent, ts2.isObjectLiteralExpression) : void 0;
              case 79:
                return contextToken2.text === "async" && ts2.isShorthandPropertyAssignment(contextToken2.parent) ? contextToken2.parent.parent : void 0;
            }
          }
          return void 0;
        }
        function isConstructorParameterCompletion(node2) {
          return !!node2.parent && ts2.isParameter(node2.parent) && ts2.isConstructorDeclaration(node2.parent.parent) && (ts2.isParameterPropertyModifier(node2.kind) || ts2.isDeclarationName(node2));
        }
        function tryGetConstructorLikeCompletionContainer(contextToken2) {
          if (contextToken2) {
            var parent2 = contextToken2.parent;
            switch (contextToken2.kind) {
              case 20:
              case 27:
                return ts2.isConstructorDeclaration(contextToken2.parent) ? contextToken2.parent : void 0;
              default:
                if (isConstructorParameterCompletion(contextToken2)) {
                  return parent2.parent;
                }
            }
          }
          return void 0;
        }
        function tryGetFunctionLikeBodyCompletionContainer(contextToken2) {
          if (contextToken2) {
            var prev_1;
            var container = ts2.findAncestor(contextToken2.parent, function(node2) {
              if (ts2.isClassLike(node2)) {
                return "quit";
              }
              if (ts2.isFunctionLikeDeclaration(node2) && prev_1 === node2.body) {
                return true;
              }
              prev_1 = node2;
              return false;
            });
            return container && container;
          }
        }
        function tryGetContainingJsxElement(contextToken2) {
          if (contextToken2) {
            var parent2 = contextToken2.parent;
            switch (contextToken2.kind) {
              case 31:
              case 30:
              case 43:
              case 79:
              case 205:
              case 285:
              case 284:
              case 286:
                if (parent2 && (parent2.kind === 278 || parent2.kind === 279)) {
                  if (contextToken2.kind === 31) {
                    var precedingToken = ts2.findPrecedingToken(contextToken2.pos, sourceFile, void 0);
                    if (!parent2.typeArguments || precedingToken && precedingToken.kind === 43)
                      break;
                  }
                  return parent2;
                } else if (parent2.kind === 284) {
                  return parent2.parent.parent;
                }
                break;
              case 10:
                if (parent2 && (parent2.kind === 284 || parent2.kind === 286)) {
                  return parent2.parent.parent;
                }
                break;
              case 19:
                if (parent2 && parent2.kind === 287 && parent2.parent && parent2.parent.kind === 284) {
                  return parent2.parent.parent.parent;
                }
                if (parent2 && parent2.kind === 286) {
                  return parent2.parent.parent;
                }
                break;
            }
          }
          return void 0;
        }
        function isSolelyIdentifierDefinitionLocation(contextToken2) {
          var parent2 = contextToken2.parent;
          var containingNodeKind = parent2.kind;
          switch (contextToken2.kind) {
            case 27:
              return containingNodeKind === 253 || isVariableDeclarationListButNotTypeArgument(contextToken2) || containingNodeKind === 236 || containingNodeKind === 259 || isFunctionLikeButNotConstructor(containingNodeKind) || containingNodeKind === 257 || containingNodeKind === 201 || containingNodeKind === 258 || ts2.isClassLike(parent2) && !!parent2.typeParameters && parent2.typeParameters.end >= contextToken2.pos;
            case 24:
              return containingNodeKind === 201;
            case 58:
              return containingNodeKind === 202;
            case 22:
              return containingNodeKind === 201;
            case 20:
              return containingNodeKind === 291 || isFunctionLikeButNotConstructor(containingNodeKind);
            case 18:
              return containingNodeKind === 259;
            case 29:
              return containingNodeKind === 256 || containingNodeKind === 225 || containingNodeKind === 257 || containingNodeKind === 258 || ts2.isFunctionLikeKind(containingNodeKind);
            case 124:
              return containingNodeKind === 166 && !ts2.isClassLike(parent2.parent);
            case 25:
              return containingNodeKind === 163 || !!parent2.parent && parent2.parent.kind === 201;
            case 123:
            case 121:
            case 122:
              return containingNodeKind === 163 && !ts2.isConstructorDeclaration(parent2.parent);
            case 127:
              return containingNodeKind === 269 || containingNodeKind === 274 || containingNodeKind === 267;
            case 136:
            case 148:
              return !isFromObjectTypeDeclaration(contextToken2);
            case 79:
              if (containingNodeKind === 269 && contextToken2 === parent2.name && contextToken2.text === "type") {
                return false;
              }
              break;
            case 84:
            case 92:
            case 118:
            case 98:
            case 113:
            case 100:
            case 119:
            case 85:
            case 137:
              return true;
            case 151:
              return containingNodeKind !== 269;
            case 41:
              return ts2.isFunctionLike(contextToken2.parent) && !ts2.isMethodDeclaration(contextToken2.parent);
          }
          if (isClassMemberCompletionKeyword(keywordForNode(contextToken2)) && isFromObjectTypeDeclaration(contextToken2)) {
            return false;
          }
          if (isConstructorParameterCompletion(contextToken2)) {
            if (!ts2.isIdentifier(contextToken2) || ts2.isParameterPropertyModifier(keywordForNode(contextToken2)) || isCurrentlyEditingNode(contextToken2)) {
              return false;
            }
          }
          switch (keywordForNode(contextToken2)) {
            case 126:
            case 84:
            case 85:
            case 135:
            case 92:
            case 98:
            case 118:
            case 119:
            case 121:
            case 122:
            case 123:
            case 124:
            case 113:
              return true;
            case 131:
              return ts2.isPropertyDeclaration(contextToken2.parent);
          }
          var ancestorClassLike = ts2.findAncestor(contextToken2.parent, ts2.isClassLike);
          if (ancestorClassLike && contextToken2 === previousToken && isPreviousPropertyDeclarationTerminated(contextToken2, position)) {
            return false;
          }
          var ancestorPropertyDeclaraion = ts2.getAncestor(contextToken2.parent, 166);
          if (ancestorPropertyDeclaraion && contextToken2 !== previousToken && ts2.isClassLike(previousToken.parent.parent) && position <= previousToken.end) {
            if (isPreviousPropertyDeclarationTerminated(contextToken2, previousToken.end)) {
              return false;
            } else if (contextToken2.kind !== 63 && (ts2.isInitializedProperty(ancestorPropertyDeclaraion) || ts2.hasType(ancestorPropertyDeclaraion))) {
              return true;
            }
          }
          return ts2.isDeclarationName(contextToken2) && !ts2.isShorthandPropertyAssignment(contextToken2.parent) && !ts2.isJsxAttribute(contextToken2.parent) && !(ts2.isClassLike(contextToken2.parent) && (contextToken2 !== previousToken || position > previousToken.end));
        }
        function isPreviousPropertyDeclarationTerminated(contextToken2, position2) {
          return contextToken2.kind !== 63 && (contextToken2.kind === 26 || !ts2.positionsAreOnSameLine(contextToken2.end, position2, sourceFile));
        }
        function isFunctionLikeButNotConstructor(kind) {
          return ts2.isFunctionLikeKind(kind) && kind !== 170;
        }
        function isDotOfNumericLiteral(contextToken2) {
          if (contextToken2.kind === 8) {
            var text = contextToken2.getFullText();
            return text.charAt(text.length - 1) === ".";
          }
          return false;
        }
        function isVariableDeclarationListButNotTypeArgument(node2) {
          return node2.parent.kind === 254 && !ts2.isPossiblyTypeArgumentPosition(node2, sourceFile, typeChecker);
        }
        function filterObjectMembersList(contextualMemberSymbols, existingMembers) {
          if (existingMembers.length === 0) {
            return contextualMemberSymbols;
          }
          var membersDeclaredBySpreadAssignment = new ts2.Set();
          var existingMemberNames = new ts2.Set();
          for (var _i = 0, existingMembers_1 = existingMembers; _i < existingMembers_1.length; _i++) {
            var m = existingMembers_1[_i];
            if (m.kind !== 294 && m.kind !== 295 && m.kind !== 202 && m.kind !== 168 && m.kind !== 171 && m.kind !== 172 && m.kind !== 296) {
              continue;
            }
            if (isCurrentlyEditingNode(m)) {
              continue;
            }
            var existingName = void 0;
            if (ts2.isSpreadAssignment(m)) {
              setMembersDeclaredBySpreadAssignment(m, membersDeclaredBySpreadAssignment);
            } else if (ts2.isBindingElement(m) && m.propertyName) {
              if (m.propertyName.kind === 79) {
                existingName = m.propertyName.escapedText;
              }
            } else {
              var name = ts2.getNameOfDeclaration(m);
              existingName = name && ts2.isPropertyNameLiteral(name) ? ts2.getEscapedTextOfIdentifierOrLiteral(name) : void 0;
            }
            if (existingName !== void 0) {
              existingMemberNames.add(existingName);
            }
          }
          var filteredSymbols = contextualMemberSymbols.filter(function(m2) {
            return !existingMemberNames.has(m2.escapedName);
          });
          setSortTextToMemberDeclaredBySpreadAssignment(membersDeclaredBySpreadAssignment, filteredSymbols);
          return filteredSymbols;
        }
        function setMembersDeclaredBySpreadAssignment(declaration, membersDeclaredBySpreadAssignment) {
          var expression = declaration.expression;
          var symbol = typeChecker.getSymbolAtLocation(expression);
          var type = symbol && typeChecker.getTypeOfSymbolAtLocation(symbol, expression);
          var properties = type && type.properties;
          if (properties) {
            properties.forEach(function(property) {
              membersDeclaredBySpreadAssignment.add(property.name);
            });
          }
        }
        function setSortTextToOptionalMember() {
          symbols.forEach(function(m) {
            var _a;
            if (m.flags & 16777216) {
              var symbolId = ts2.getSymbolId(m);
              symbolToSortTextIdMap[symbolId] = (_a = symbolToSortTextIdMap[symbolId]) !== null && _a !== void 0 ? _a : 12;
            }
          });
        }
        function setSortTextToMemberDeclaredBySpreadAssignment(membersDeclaredBySpreadAssignment, contextualMemberSymbols) {
          if (membersDeclaredBySpreadAssignment.size === 0) {
            return;
          }
          for (var _i = 0, contextualMemberSymbols_1 = contextualMemberSymbols; _i < contextualMemberSymbols_1.length; _i++) {
            var contextualMemberSymbol = contextualMemberSymbols_1[_i];
            if (membersDeclaredBySpreadAssignment.has(contextualMemberSymbol.name)) {
              symbolToSortTextIdMap[ts2.getSymbolId(contextualMemberSymbol)] = 13;
            }
          }
        }
        function filterClassMembersList(baseSymbols, existingMembers, currentClassElementModifierFlags) {
          var existingMemberNames = new ts2.Set();
          for (var _i = 0, existingMembers_2 = existingMembers; _i < existingMembers_2.length; _i++) {
            var m = existingMembers_2[_i];
            if (m.kind !== 166 && m.kind !== 168 && m.kind !== 171 && m.kind !== 172) {
              continue;
            }
            if (isCurrentlyEditingNode(m)) {
              continue;
            }
            if (ts2.hasEffectiveModifier(m, 8)) {
              continue;
            }
            if (ts2.isStatic(m) !== !!(currentClassElementModifierFlags & 32)) {
              continue;
            }
            var existingName = ts2.getPropertyNameForPropertyNameNode(m.name);
            if (existingName) {
              existingMemberNames.add(existingName);
            }
          }
          return baseSymbols.filter(function(propertySymbol) {
            return !existingMemberNames.has(propertySymbol.escapedName) && !!propertySymbol.declarations && !(ts2.getDeclarationModifierFlagsFromSymbol(propertySymbol) & 8) && !(propertySymbol.valueDeclaration && ts2.isPrivateIdentifierClassElementDeclaration(propertySymbol.valueDeclaration));
          });
        }
        function filterJsxAttributes(symbols2, attributes) {
          var seenNames = new ts2.Set();
          var membersDeclaredBySpreadAssignment = new ts2.Set();
          for (var _i = 0, attributes_1 = attributes; _i < attributes_1.length; _i++) {
            var attr = attributes_1[_i];
            if (isCurrentlyEditingNode(attr)) {
              continue;
            }
            if (attr.kind === 284) {
              seenNames.add(attr.name.escapedText);
            } else if (ts2.isJsxSpreadAttribute(attr)) {
              setMembersDeclaredBySpreadAssignment(attr, membersDeclaredBySpreadAssignment);
            }
          }
          var filteredSymbols = symbols2.filter(function(a) {
            return !seenNames.has(a.escapedName);
          });
          setSortTextToMemberDeclaredBySpreadAssignment(membersDeclaredBySpreadAssignment, filteredSymbols);
          return filteredSymbols;
        }
        function isCurrentlyEditingNode(node2) {
          return node2.getStart(sourceFile) <= position && position <= node2.getEnd();
        }
      }
      function getRelevantTokens(position, sourceFile) {
        var previousToken = ts2.findPrecedingToken(position, sourceFile);
        if (previousToken && position <= previousToken.end && (ts2.isMemberName(previousToken) || ts2.isKeyword(previousToken.kind))) {
          var contextToken = ts2.findPrecedingToken(previousToken.getFullStart(), sourceFile, void 0);
          return { contextToken, previousToken };
        }
        return { contextToken: previousToken, previousToken };
      }
      function getAutoImportSymbolFromCompletionEntryData(name, data, program, host) {
        var containingProgram = data.isPackageJsonImport ? host.getPackageJsonAutoImportProvider() : program;
        var checker = containingProgram.getTypeChecker();
        var moduleSymbol = data.ambientModuleName ? checker.tryFindAmbientModule(data.ambientModuleName) : data.fileName ? checker.getMergedSymbol(ts2.Debug.checkDefined(containingProgram.getSourceFile(data.fileName)).symbol) : void 0;
        if (!moduleSymbol)
          return void 0;
        var symbol = data.exportName === "export=" ? checker.resolveExternalModuleSymbol(moduleSymbol) : checker.tryGetMemberInModuleExportsAndProperties(data.exportName, moduleSymbol);
        if (!symbol)
          return void 0;
        var isDefaultExport = data.exportName === "default";
        symbol = isDefaultExport && ts2.getLocalSymbolForExportDefault(symbol) || symbol;
        return { symbol, origin: completionEntryDataToSymbolOriginInfo(data, name, moduleSymbol) };
      }
      function getCompletionEntryDisplayNameForSymbol(symbol, target, origin, kind, jsxIdentifierExpected) {
        var name = originIncludesSymbolName(origin) ? origin.symbolName : symbol.name;
        if (name === void 0 || symbol.flags & 1536 && ts2.isSingleOrDoubleQuote(name.charCodeAt(0)) || ts2.isKnownSymbol(symbol)) {
          return void 0;
        }
        var validNameResult = { name, needsConvertPropertyAccess: false };
        if (ts2.isIdentifierText(name, target, jsxIdentifierExpected ? 1 : 0) || symbol.valueDeclaration && ts2.isPrivateIdentifierClassElementDeclaration(symbol.valueDeclaration)) {
          return validNameResult;
        }
        switch (kind) {
          case 3:
            return void 0;
          case 0:
            return { name: JSON.stringify(name), needsConvertPropertyAccess: false };
          case 2:
          case 1:
            return name.charCodeAt(0) === 32 ? void 0 : { name, needsConvertPropertyAccess: true };
          case 5:
          case 4:
            return validNameResult;
          default:
            ts2.Debug.assertNever(kind);
        }
      }
      var _keywordCompletions = [];
      var allKeywordsCompletions = ts2.memoize(function() {
        var res = [];
        for (var i = 81; i <= 159; i++) {
          res.push({
            name: ts2.tokenToString(i),
            kind: "keyword",
            kindModifiers: "",
            sortText: SortText.GlobalsOrKeywords
          });
        }
        return res;
      });
      function getKeywordCompletions(keywordFilter, filterOutTsOnlyKeywords) {
        if (!filterOutTsOnlyKeywords)
          return getTypescriptKeywordCompletions(keywordFilter);
        var index = keywordFilter + 7 + 1;
        return _keywordCompletions[index] || (_keywordCompletions[index] = getTypescriptKeywordCompletions(keywordFilter).filter(function(entry) {
          return !isTypeScriptOnlyKeyword(ts2.stringToToken(entry.name));
        }));
      }
      function getTypescriptKeywordCompletions(keywordFilter) {
        return _keywordCompletions[keywordFilter] || (_keywordCompletions[keywordFilter] = allKeywordsCompletions().filter(function(entry) {
          var kind = ts2.stringToToken(entry.name);
          switch (keywordFilter) {
            case 0:
              return false;
            case 1:
              return isFunctionLikeBodyKeyword(kind) || kind === 135 || kind === 141 || kind === 151 || kind === 142 || kind === 126 || ts2.isTypeKeyword(kind) && kind !== 152;
            case 5:
              return isFunctionLikeBodyKeyword(kind);
            case 2:
              return isClassMemberCompletionKeyword(kind);
            case 3:
              return isInterfaceOrTypeLiteralCompletionKeyword(kind);
            case 4:
              return ts2.isParameterPropertyModifier(kind);
            case 6:
              return ts2.isTypeKeyword(kind) || kind === 85;
            case 7:
              return ts2.isTypeKeyword(kind);
            case 8:
              return kind === 151;
            default:
              return ts2.Debug.assertNever(keywordFilter);
          }
        }));
      }
      function isTypeScriptOnlyKeyword(kind) {
        switch (kind) {
          case 126:
          case 130:
          case 157:
          case 133:
          case 135:
          case 92:
          case 156:
          case 117:
          case 137:
          case 118:
          case 139:
          case 140:
          case 141:
          case 142:
          case 143:
          case 146:
          case 147:
          case 158:
          case 121:
          case 122:
          case 123:
          case 144:
          case 149:
          case 150:
          case 151:
          case 153:
          case 154:
            return true;
          default:
            return false;
        }
      }
      function isInterfaceOrTypeLiteralCompletionKeyword(kind) {
        return kind === 144;
      }
      function isClassMemberCompletionKeyword(kind) {
        switch (kind) {
          case 126:
          case 134:
          case 136:
          case 148:
          case 131:
          case 135:
          case 158:
            return true;
          default:
            return ts2.isClassMemberModifier(kind);
        }
      }
      function isFunctionLikeBodyKeyword(kind) {
        return kind === 131 || kind === 132 || kind === 127 || !ts2.isContextualKeyword(kind) && !isClassMemberCompletionKeyword(kind);
      }
      function keywordForNode(node) {
        return ts2.isIdentifier(node) ? node.originalKeywordKind || 0 : node.kind;
      }
      function getJsDocTagAtPosition(node, position) {
        var jsdoc = ts2.findAncestor(node, ts2.isJSDoc);
        return jsdoc && jsdoc.tags && (ts2.rangeContainsPosition(jsdoc, position) ? ts2.findLast(jsdoc.tags, function(tag) {
          return tag.pos < position;
        }) : void 0);
      }
      function getPropertiesForObjectExpression(contextualType, completionsType, obj, checker) {
        var hasCompletionsType = completionsType && completionsType !== contextualType;
        var type = hasCompletionsType && !(completionsType.flags & 3) ? checker.getUnionType([contextualType, completionsType]) : contextualType;
        var properties = getApparentProperties(type, obj, checker);
        return type.isClass() && containsNonPublicProperties(properties) ? [] : hasCompletionsType ? ts2.filter(properties, hasDeclarationOtherThanSelf) : properties;
        function hasDeclarationOtherThanSelf(member) {
          return ts2.some(member.declarations, function(decl) {
            return decl.parent !== obj;
          });
        }
      }
      Completions2.getPropertiesForObjectExpression = getPropertiesForObjectExpression;
      function getApparentProperties(type, node, checker) {
        if (!type.isUnion())
          return type.getApparentProperties();
        return checker.getAllPossiblePropertiesOfTypes(ts2.filter(type.types, function(memberType) {
          return !(memberType.flags & 131068 || checker.isArrayLikeType(memberType) || checker.isTypeInvalidDueToUnionDiscriminant(memberType, node) || ts2.typeHasCallOrConstructSignatures(memberType, checker) || memberType.isClass() && containsNonPublicProperties(memberType.getApparentProperties()));
        }));
      }
      function containsNonPublicProperties(props) {
        return ts2.some(props, function(p) {
          return !!(ts2.getDeclarationModifierFlagsFromSymbol(p) & 24);
        });
      }
      function getPropertiesForCompletion(type, checker) {
        return type.isUnion() ? ts2.Debug.checkEachDefined(checker.getAllPossiblePropertiesOfTypes(type.types), "getAllPossiblePropertiesOfTypes() should all be defined") : ts2.Debug.checkEachDefined(type.getApparentProperties(), "getApparentProperties() should all be defined");
      }
      function tryGetObjectTypeDeclarationCompletionContainer(sourceFile, contextToken, location, position) {
        switch (location.kind) {
          case 346:
            return ts2.tryCast(location.parent, ts2.isObjectTypeDeclaration);
          case 1:
            var cls = ts2.tryCast(ts2.lastOrUndefined(ts2.cast(location.parent, ts2.isSourceFile).statements), ts2.isObjectTypeDeclaration);
            if (cls && !ts2.findChildOfKind(cls, 19, sourceFile)) {
              return cls;
            }
            break;
          case 79: {
            if (ts2.isPropertyDeclaration(location.parent) && location.parent.initializer === location) {
              return void 0;
            }
            if (isFromObjectTypeDeclaration(location)) {
              return ts2.findAncestor(location, ts2.isObjectTypeDeclaration);
            }
          }
        }
        if (!contextToken)
          return void 0;
        if (location.kind === 134 || ts2.isIdentifier(contextToken) && ts2.isPropertyDeclaration(contextToken.parent) && ts2.isClassLike(location)) {
          return ts2.findAncestor(contextToken, ts2.isClassLike);
        }
        switch (contextToken.kind) {
          case 63:
            return void 0;
          case 26:
          case 19:
            return isFromObjectTypeDeclaration(location) && location.parent.name === location ? location.parent.parent : ts2.tryCast(location, ts2.isObjectTypeDeclaration);
          case 18:
          case 27:
            return ts2.tryCast(contextToken.parent, ts2.isObjectTypeDeclaration);
          default:
            if (!isFromObjectTypeDeclaration(contextToken)) {
              if (ts2.getLineAndCharacterOfPosition(sourceFile, contextToken.getEnd()).line !== ts2.getLineAndCharacterOfPosition(sourceFile, position).line && ts2.isObjectTypeDeclaration(location)) {
                return location;
              }
              return void 0;
            }
            var isValidKeyword = ts2.isClassLike(contextToken.parent.parent) ? isClassMemberCompletionKeyword : isInterfaceOrTypeLiteralCompletionKeyword;
            return isValidKeyword(contextToken.kind) || contextToken.kind === 41 || ts2.isIdentifier(contextToken) && isValidKeyword(ts2.stringToToken(contextToken.text)) ? contextToken.parent.parent : void 0;
        }
      }
      function tryGetTypeLiteralNode(node) {
        if (!node)
          return void 0;
        var parent = node.parent;
        switch (node.kind) {
          case 18:
            if (ts2.isTypeLiteralNode(parent)) {
              return parent;
            }
            break;
          case 26:
          case 27:
          case 79:
            if (parent.kind === 165 && ts2.isTypeLiteralNode(parent.parent)) {
              return parent.parent;
            }
            break;
        }
        return void 0;
      }
      function getConstraintOfTypeArgumentProperty(node, checker) {
        if (!node)
          return void 0;
        if (ts2.isTypeNode(node) && ts2.isTypeReferenceType(node.parent)) {
          return checker.getTypeArgumentConstraint(node);
        }
        var t = getConstraintOfTypeArgumentProperty(node.parent, checker);
        if (!t)
          return void 0;
        switch (node.kind) {
          case 165:
            return checker.getTypeOfPropertyOfContextualType(t, node.symbol.escapedName);
          case 187:
          case 181:
          case 186:
            return t;
        }
      }
      function isFromObjectTypeDeclaration(node) {
        return node.parent && ts2.isClassOrTypeElement(node.parent) && ts2.isObjectTypeDeclaration(node.parent.parent);
      }
      function isValidTrigger(sourceFile, triggerCharacter, contextToken, position) {
        switch (triggerCharacter) {
          case ".":
          case "@":
            return true;
          case '"':
          case "'":
          case "`":
            return !!contextToken && ts2.isStringLiteralOrTemplate(contextToken) && position === contextToken.getStart(sourceFile) + 1;
          case "#":
            return !!contextToken && ts2.isPrivateIdentifier(contextToken) && !!ts2.getContainingClass(contextToken);
          case "<":
            return !!contextToken && contextToken.kind === 29 && (!ts2.isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent));
          case "/":
            return !!contextToken && (ts2.isStringLiteralLike(contextToken) ? !!ts2.tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 43 && ts2.isJsxClosingElement(contextToken.parent));
          case " ":
            return !!contextToken && ts2.isImportKeyword(contextToken) && contextToken.parent.kind === 303;
          default:
            return ts2.Debug.assertNever(triggerCharacter);
        }
      }
      function binaryExpressionMayBeOpenTag(_a) {
        var left = _a.left;
        return ts2.nodeIsMissing(left);
      }
      function isProbablyGlobalType(type, sourceFile, checker) {
        var selfSymbol = checker.resolveName("self", void 0, 111551, false);
        if (selfSymbol && checker.getTypeOfSymbolAtLocation(selfSymbol, sourceFile) === type) {
          return true;
        }
        var globalSymbol = checker.resolveName("global", void 0, 111551, false);
        if (globalSymbol && checker.getTypeOfSymbolAtLocation(globalSymbol, sourceFile) === type) {
          return true;
        }
        var globalThisSymbol = checker.resolveName("globalThis", void 0, 111551, false);
        if (globalThisSymbol && checker.getTypeOfSymbolAtLocation(globalThisSymbol, sourceFile) === type) {
          return true;
        }
        return false;
      }
      function isStaticProperty(symbol) {
        return !!(symbol.valueDeclaration && ts2.getEffectiveModifierFlags(symbol.valueDeclaration) & 32 && ts2.isClassLike(symbol.valueDeclaration.parent));
      }
      function tryGetObjectLiteralContextualType(node, typeChecker) {
        var type = typeChecker.getContextualType(node);
        if (type) {
          return type;
        }
        if (ts2.isBinaryExpression(node.parent) && node.parent.operatorToken.kind === 63 && node === node.parent.left) {
          return typeChecker.getTypeAtLocation(node.parent);
        }
        return void 0;
      }
      function getImportStatementCompletionInfo(contextToken) {
        var keywordCompletion;
        var isKeywordOnlyCompletion = false;
        var candidate = getCandidate();
        return {
          isKeywordOnlyCompletion,
          keywordCompletion,
          isNewIdentifierLocation: !!(candidate || keywordCompletion === 151),
          replacementNode: candidate && ts2.rangeIsOnSingleLine(candidate, candidate.getSourceFile()) ? candidate : void 0
        };
        function getCandidate() {
          var parent = contextToken.parent;
          if (ts2.isImportEqualsDeclaration(parent)) {
            keywordCompletion = contextToken.kind === 151 ? void 0 : 151;
            return isModuleSpecifierMissingOrEmpty(parent.moduleReference) ? parent : void 0;
          }
          if (couldBeTypeOnlyImportSpecifier(parent, contextToken) && canCompleteFromNamedBindings(parent.parent)) {
            return parent;
          }
          if (ts2.isNamedImports(parent) || ts2.isNamespaceImport(parent)) {
            if (!parent.parent.isTypeOnly && (contextToken.kind === 18 || contextToken.kind === 100 || contextToken.kind === 27)) {
              keywordCompletion = 151;
            }
            if (canCompleteFromNamedBindings(parent)) {
              if (contextToken.kind === 19 || contextToken.kind === 79) {
                isKeywordOnlyCompletion = true;
                keywordCompletion = 155;
              } else {
                return parent.parent.parent;
              }
            }
            return void 0;
          }
          if (ts2.isImportKeyword(contextToken) && ts2.isSourceFile(parent)) {
            keywordCompletion = 151;
            return contextToken;
          }
          if (ts2.isImportKeyword(contextToken) && ts2.isImportDeclaration(parent)) {
            keywordCompletion = 151;
            return isModuleSpecifierMissingOrEmpty(parent.moduleSpecifier) ? parent : void 0;
          }
          return void 0;
        }
      }
      function couldBeTypeOnlyImportSpecifier(importSpecifier, contextToken) {
        return ts2.isImportSpecifier(importSpecifier) && (importSpecifier.isTypeOnly || contextToken === importSpecifier.name && ts2.isTypeKeywordTokenOrIdentifier(contextToken));
      }
      function canCompleteFromNamedBindings(namedBindings) {
        return isModuleSpecifierMissingOrEmpty(namedBindings.parent.parent.moduleSpecifier) && (ts2.isNamespaceImport(namedBindings) || namedBindings.elements.length < 2) && !namedBindings.parent.name;
      }
      function isModuleSpecifierMissingOrEmpty(specifier) {
        var _a;
        if (ts2.nodeIsMissing(specifier))
          return true;
        return !((_a = ts2.tryCast(ts2.isExternalModuleReference(specifier) ? specifier.expression : specifier, ts2.isStringLiteralLike)) === null || _a === void 0 ? void 0 : _a.text);
      }
      function getVariableDeclaration(property) {
        var variableDeclaration = ts2.findAncestor(property, function(node) {
          return ts2.isFunctionBlock(node) || isArrowFunctionBody(node) || ts2.isBindingPattern(node) ? "quit" : ts2.isVariableDeclaration(node);
        });
        return variableDeclaration;
      }
      function isArrowFunctionBody(node) {
        return node.parent && ts2.isArrowFunction(node.parent) && node.parent.body === node;
      }
      ;
      function symbolCanBeReferencedAtTypeLocation(symbol, checker, seenModules) {
        if (seenModules === void 0) {
          seenModules = new ts2.Map();
        }
        var sym = ts2.skipAlias(symbol.exportSymbol || symbol, checker);
        return !!(sym.flags & 788968) || checker.isUnknownSymbol(sym) || !!(sym.flags & 1536) && ts2.addToSeen(seenModules, ts2.getSymbolId(sym)) && checker.getExportsOfModule(sym).some(function(e) {
          return symbolCanBeReferencedAtTypeLocation(e, checker, seenModules);
        });
      }
      function isDeprecated(symbol, checker) {
        var declarations = ts2.skipAlias(symbol, checker).declarations;
        return !!ts2.length(declarations) && ts2.every(declarations, ts2.isDeprecatedDeclaration);
      }
      function charactersFuzzyMatchInString(identifierString, lowercaseCharacters) {
        if (lowercaseCharacters.length === 0) {
          return true;
        }
        var matchedFirstCharacter = false;
        var prevChar;
        var characterIndex = 0;
        var len = identifierString.length;
        for (var strIndex = 0; strIndex < len; strIndex++) {
          var strChar = identifierString.charCodeAt(strIndex);
          var testChar = lowercaseCharacters.charCodeAt(characterIndex);
          if (strChar === testChar || strChar === toUpperCharCode(testChar)) {
            matchedFirstCharacter || (matchedFirstCharacter = prevChar === void 0 || 97 <= prevChar && prevChar <= 122 && 65 <= strChar && strChar <= 90 || prevChar === 95 && strChar !== 95);
            if (matchedFirstCharacter) {
              characterIndex++;
            }
            if (characterIndex === lowercaseCharacters.length) {
              return true;
            }
          }
          prevChar = strChar;
        }
        return false;
      }
      function toUpperCharCode(charCode) {
        if (97 <= charCode && charCode <= 122) {
          return charCode - 32;
        }
        return charCode;
      }
    })(Completions = ts2.Completions || (ts2.Completions = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var DocumentHighlights;
    (function(DocumentHighlights2) {
      function getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch) {
        var node = ts2.getTouchingPropertyName(sourceFile, position);
        if (node.parent && (ts2.isJsxOpeningElement(node.parent) && node.parent.tagName === node || ts2.isJsxClosingElement(node.parent))) {
          var _a = node.parent.parent, openingElement = _a.openingElement, closingElement = _a.closingElement;
          var highlightSpans = [openingElement, closingElement].map(function(_a2) {
            var tagName = _a2.tagName;
            return getHighlightSpanForNode(tagName, sourceFile);
          });
          return [{ fileName: sourceFile.fileName, highlightSpans }];
        }
        return getSemanticDocumentHighlights(position, node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile);
      }
      DocumentHighlights2.getDocumentHighlights = getDocumentHighlights;
      function getHighlightSpanForNode(node, sourceFile) {
        return {
          fileName: sourceFile.fileName,
          textSpan: ts2.createTextSpanFromNode(node, sourceFile),
          kind: "none"
        };
      }
      function getSemanticDocumentHighlights(position, node, program, cancellationToken, sourceFilesToSearch) {
        var sourceFilesSet = new ts2.Set(sourceFilesToSearch.map(function(f) {
          return f.fileName;
        }));
        var referenceEntries = ts2.FindAllReferences.getReferenceEntriesForNode(position, node, program, sourceFilesToSearch, cancellationToken, void 0, sourceFilesSet);
        if (!referenceEntries)
          return void 0;
        var map = ts2.arrayToMultiMap(referenceEntries.map(ts2.FindAllReferences.toHighlightSpan), function(e) {
          return e.fileName;
        }, function(e) {
          return e.span;
        });
        var getCanonicalFileName = ts2.createGetCanonicalFileName(program.useCaseSensitiveFileNames());
        return ts2.mapDefined(ts2.arrayFrom(map.entries()), function(_a) {
          var fileName = _a[0], highlightSpans = _a[1];
          if (!sourceFilesSet.has(fileName)) {
            if (!program.redirectTargetsMap.has(ts2.toPath(fileName, program.getCurrentDirectory(), getCanonicalFileName))) {
              return void 0;
            }
            var redirectTarget_1 = program.getSourceFile(fileName);
            var redirect = ts2.find(sourceFilesToSearch, function(f) {
              return !!f.redirectInfo && f.redirectInfo.redirectTarget === redirectTarget_1;
            });
            fileName = redirect.fileName;
            ts2.Debug.assert(sourceFilesSet.has(fileName));
          }
          return { fileName, highlightSpans };
        });
      }
      function getSyntacticDocumentHighlights(node, sourceFile) {
        var highlightSpans = getHighlightSpans(node, sourceFile);
        return highlightSpans && [{ fileName: sourceFile.fileName, highlightSpans }];
      }
      function getHighlightSpans(node, sourceFile) {
        switch (node.kind) {
          case 99:
          case 91:
            return ts2.isIfStatement(node.parent) ? getIfElseOccurrences(node.parent, sourceFile) : void 0;
          case 105:
            return useParent(node.parent, ts2.isReturnStatement, getReturnOccurrences);
          case 109:
            return useParent(node.parent, ts2.isThrowStatement, getThrowOccurrences);
          case 111:
          case 83:
          case 96:
            var tryStatement = node.kind === 83 ? node.parent.parent : node.parent;
            return useParent(tryStatement, ts2.isTryStatement, getTryCatchFinallyOccurrences);
          case 107:
            return useParent(node.parent, ts2.isSwitchStatement, getSwitchCaseDefaultOccurrences);
          case 82:
          case 88: {
            if (ts2.isDefaultClause(node.parent) || ts2.isCaseClause(node.parent)) {
              return useParent(node.parent.parent.parent, ts2.isSwitchStatement, getSwitchCaseDefaultOccurrences);
            }
            return void 0;
          }
          case 81:
          case 86:
            return useParent(node.parent, ts2.isBreakOrContinueStatement, getBreakOrContinueStatementOccurrences);
          case 97:
          case 115:
          case 90:
            return useParent(node.parent, function(n) {
              return ts2.isIterationStatement(n, true);
            }, getLoopBreakContinueOccurrences);
          case 134:
            return getFromAllDeclarations(ts2.isConstructorDeclaration, [134]);
          case 136:
          case 148:
            return getFromAllDeclarations(ts2.isAccessor, [136, 148]);
          case 132:
            return useParent(node.parent, ts2.isAwaitExpression, getAsyncAndAwaitOccurrences);
          case 131:
            return highlightSpans(getAsyncAndAwaitOccurrences(node));
          case 125:
            return highlightSpans(getYieldOccurrences(node));
          default:
            return ts2.isModifierKind(node.kind) && (ts2.isDeclaration(node.parent) || ts2.isVariableStatement(node.parent)) ? highlightSpans(getModifierOccurrences(node.kind, node.parent)) : void 0;
        }
        function getFromAllDeclarations(nodeTest, keywords) {
          return useParent(node.parent, nodeTest, function(decl) {
            return ts2.mapDefined(decl.symbol.declarations, function(d) {
              return nodeTest(d) ? ts2.find(d.getChildren(sourceFile), function(c) {
                return ts2.contains(keywords, c.kind);
              }) : void 0;
            });
          });
        }
        function useParent(node2, nodeTest, getNodes) {
          return nodeTest(node2) ? highlightSpans(getNodes(node2, sourceFile)) : void 0;
        }
        function highlightSpans(nodes) {
          return nodes && nodes.map(function(node2) {
            return getHighlightSpanForNode(node2, sourceFile);
          });
        }
      }
      function aggregateOwnedThrowStatements(node) {
        if (ts2.isThrowStatement(node)) {
          return [node];
        } else if (ts2.isTryStatement(node)) {
          return ts2.concatenate(node.catchClause ? aggregateOwnedThrowStatements(node.catchClause) : node.tryBlock && aggregateOwnedThrowStatements(node.tryBlock), node.finallyBlock && aggregateOwnedThrowStatements(node.finallyBlock));
        }
        return ts2.isFunctionLike(node) ? void 0 : flatMapChildren(node, aggregateOwnedThrowStatements);
      }
      function getThrowStatementOwner(throwStatement) {
        var child = throwStatement;
        while (child.parent) {
          var parent = child.parent;
          if (ts2.isFunctionBlock(parent) || parent.kind === 303) {
            return parent;
          }
          if (ts2.isTryStatement(parent) && parent.tryBlock === child && parent.catchClause) {
            return child;
          }
          child = parent;
        }
        return void 0;
      }
      function aggregateAllBreakAndContinueStatements(node) {
        return ts2.isBreakOrContinueStatement(node) ? [node] : ts2.isFunctionLike(node) ? void 0 : flatMapChildren(node, aggregateAllBreakAndContinueStatements);
      }
      function flatMapChildren(node, cb) {
        var result = [];
        node.forEachChild(function(child) {
          var value = cb(child);
          if (value !== void 0) {
            result.push.apply(result, ts2.toArray(value));
          }
        });
        return result;
      }
      function ownsBreakOrContinueStatement(owner, statement) {
        var actualOwner = getBreakOrContinueOwner(statement);
        return !!actualOwner && actualOwner === owner;
      }
      function getBreakOrContinueOwner(statement) {
        return ts2.findAncestor(statement, function(node) {
          switch (node.kind) {
            case 248:
              if (statement.kind === 244) {
                return false;
              }
            case 241:
            case 242:
            case 243:
            case 240:
            case 239:
              return !statement.label || isLabeledBy(node, statement.label.escapedText);
            default:
              return ts2.isFunctionLike(node) && "quit";
          }
        });
      }
      function getModifierOccurrences(modifier, declaration) {
        return ts2.mapDefined(getNodesToSearchForModifier(declaration, ts2.modifierToFlag(modifier)), function(node) {
          return ts2.findModifier(node, modifier);
        });
      }
      function getNodesToSearchForModifier(declaration, modifierFlag) {
        var container = declaration.parent;
        switch (container.kind) {
          case 261:
          case 303:
          case 234:
          case 288:
          case 289:
            if (modifierFlag & 128 && ts2.isClassDeclaration(declaration)) {
              return __spreadArray(__spreadArray([], declaration.members, true), [declaration], false);
            } else {
              return container.statements;
            }
          case 170:
          case 168:
          case 255:
            return __spreadArray(__spreadArray([], container.parameters, true), ts2.isClassLike(container.parent) ? container.parent.members : [], true);
          case 256:
          case 225:
          case 257:
          case 181:
            var nodes = container.members;
            if (modifierFlag & (28 | 64)) {
              var constructor = ts2.find(container.members, ts2.isConstructorDeclaration);
              if (constructor) {
                return __spreadArray(__spreadArray([], nodes, true), constructor.parameters, true);
              }
            } else if (modifierFlag & 128) {
              return __spreadArray(__spreadArray([], nodes, true), [container], false);
            }
            return nodes;
          case 204:
            return void 0;
          default:
            ts2.Debug.assertNever(container, "Invalid container kind.");
        }
      }
      function pushKeywordIf(keywordList, token) {
        var expected = [];
        for (var _i = 2; _i < arguments.length; _i++) {
          expected[_i - 2] = arguments[_i];
        }
        if (token && ts2.contains(expected, token.kind)) {
          keywordList.push(token);
          return true;
        }
        return false;
      }
      function getLoopBreakContinueOccurrences(loopNode) {
        var keywords = [];
        if (pushKeywordIf(keywords, loopNode.getFirstToken(), 97, 115, 90)) {
          if (loopNode.kind === 239) {
            var loopTokens = loopNode.getChildren();
            for (var i = loopTokens.length - 1; i >= 0; i--) {
              if (pushKeywordIf(keywords, loopTokens[i], 115)) {
                break;
              }
            }
          }
        }
        ts2.forEach(aggregateAllBreakAndContinueStatements(loopNode.statement), function(statement) {
          if (ownsBreakOrContinueStatement(loopNode, statement)) {
            pushKeywordIf(keywords, statement.getFirstToken(), 81, 86);
          }
        });
        return keywords;
      }
      function getBreakOrContinueStatementOccurrences(breakOrContinueStatement) {
        var owner = getBreakOrContinueOwner(breakOrContinueStatement);
        if (owner) {
          switch (owner.kind) {
            case 241:
            case 242:
            case 243:
            case 239:
            case 240:
              return getLoopBreakContinueOccurrences(owner);
            case 248:
              return getSwitchCaseDefaultOccurrences(owner);
          }
        }
        return void 0;
      }
      function getSwitchCaseDefaultOccurrences(switchStatement) {
        var keywords = [];
        pushKeywordIf(keywords, switchStatement.getFirstToken(), 107);
        ts2.forEach(switchStatement.caseBlock.clauses, function(clause) {
          pushKeywordIf(keywords, clause.getFirstToken(), 82, 88);
          ts2.forEach(aggregateAllBreakAndContinueStatements(clause), function(statement) {
            if (ownsBreakOrContinueStatement(switchStatement, statement)) {
              pushKeywordIf(keywords, statement.getFirstToken(), 81);
            }
          });
        });
        return keywords;
      }
      function getTryCatchFinallyOccurrences(tryStatement, sourceFile) {
        var keywords = [];
        pushKeywordIf(keywords, tryStatement.getFirstToken(), 111);
        if (tryStatement.catchClause) {
          pushKeywordIf(keywords, tryStatement.catchClause.getFirstToken(), 83);
        }
        if (tryStatement.finallyBlock) {
          var finallyKeyword = ts2.findChildOfKind(tryStatement, 96, sourceFile);
          pushKeywordIf(keywords, finallyKeyword, 96);
        }
        return keywords;
      }
      function getThrowOccurrences(throwStatement, sourceFile) {
        var owner = getThrowStatementOwner(throwStatement);
        if (!owner) {
          return void 0;
        }
        var keywords = [];
        ts2.forEach(aggregateOwnedThrowStatements(owner), function(throwStatement2) {
          keywords.push(ts2.findChildOfKind(throwStatement2, 109, sourceFile));
        });
        if (ts2.isFunctionBlock(owner)) {
          ts2.forEachReturnStatement(owner, function(returnStatement) {
            keywords.push(ts2.findChildOfKind(returnStatement, 105, sourceFile));
          });
        }
        return keywords;
      }
      function getReturnOccurrences(returnStatement, sourceFile) {
        var func = ts2.getContainingFunction(returnStatement);
        if (!func) {
          return void 0;
        }
        var keywords = [];
        ts2.forEachReturnStatement(ts2.cast(func.body, ts2.isBlock), function(returnStatement2) {
          keywords.push(ts2.findChildOfKind(returnStatement2, 105, sourceFile));
        });
        ts2.forEach(aggregateOwnedThrowStatements(func.body), function(throwStatement) {
          keywords.push(ts2.findChildOfKind(throwStatement, 109, sourceFile));
        });
        return keywords;
      }
      function getAsyncAndAwaitOccurrences(node) {
        var func = ts2.getContainingFunction(node);
        if (!func) {
          return void 0;
        }
        var keywords = [];
        if (func.modifiers) {
          func.modifiers.forEach(function(modifier) {
            pushKeywordIf(keywords, modifier, 131);
          });
        }
        ts2.forEachChild(func, function(child) {
          traverseWithoutCrossingFunction(child, function(node2) {
            if (ts2.isAwaitExpression(node2)) {
              pushKeywordIf(keywords, node2.getFirstToken(), 132);
            }
          });
        });
        return keywords;
      }
      function getYieldOccurrences(node) {
        var func = ts2.getContainingFunction(node);
        if (!func) {
          return void 0;
        }
        var keywords = [];
        ts2.forEachChild(func, function(child) {
          traverseWithoutCrossingFunction(child, function(node2) {
            if (ts2.isYieldExpression(node2)) {
              pushKeywordIf(keywords, node2.getFirstToken(), 125);
            }
          });
        });
        return keywords;
      }
      function traverseWithoutCrossingFunction(node, cb) {
        cb(node);
        if (!ts2.isFunctionLike(node) && !ts2.isClassLike(node) && !ts2.isInterfaceDeclaration(node) && !ts2.isModuleDeclaration(node) && !ts2.isTypeAliasDeclaration(node) && !ts2.isTypeNode(node)) {
          ts2.forEachChild(node, function(child) {
            return traverseWithoutCrossingFunction(child, cb);
          });
        }
      }
      function getIfElseOccurrences(ifStatement, sourceFile) {
        var keywords = getIfElseKeywords(ifStatement, sourceFile);
        var result = [];
        for (var i = 0; i < keywords.length; i++) {
          if (keywords[i].kind === 91 && i < keywords.length - 1) {
            var elseKeyword = keywords[i];
            var ifKeyword = keywords[i + 1];
            var shouldCombineElseAndIf = true;
            for (var j = ifKeyword.getStart(sourceFile) - 1; j >= elseKeyword.end; j--) {
              if (!ts2.isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(j))) {
                shouldCombineElseAndIf = false;
                break;
              }
            }
            if (shouldCombineElseAndIf) {
              result.push({
                fileName: sourceFile.fileName,
                textSpan: ts2.createTextSpanFromBounds(elseKeyword.getStart(), ifKeyword.end),
                kind: "reference"
              });
              i++;
              continue;
            }
          }
          result.push(getHighlightSpanForNode(keywords[i], sourceFile));
        }
        return result;
      }
      function getIfElseKeywords(ifStatement, sourceFile) {
        var keywords = [];
        while (ts2.isIfStatement(ifStatement.parent) && ifStatement.parent.elseStatement === ifStatement) {
          ifStatement = ifStatement.parent;
        }
        while (true) {
          var children = ifStatement.getChildren(sourceFile);
          pushKeywordIf(keywords, children[0], 99);
          for (var i = children.length - 1; i >= 0; i--) {
            if (pushKeywordIf(keywords, children[i], 91)) {
              break;
            }
          }
          if (!ifStatement.elseStatement || !ts2.isIfStatement(ifStatement.elseStatement)) {
            break;
          }
          ifStatement = ifStatement.elseStatement;
        }
        return keywords;
      }
      function isLabeledBy(node, labelName) {
        return !!ts2.findAncestor(node.parent, function(owner) {
          return !ts2.isLabeledStatement(owner) ? "quit" : owner.label.escapedText === labelName;
        });
      }
    })(DocumentHighlights = ts2.DocumentHighlights || (ts2.DocumentHighlights = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    function isDocumentRegistryEntry(entry) {
      return !!entry.sourceFile;
    }
    function createDocumentRegistry(useCaseSensitiveFileNames, currentDirectory) {
      return createDocumentRegistryInternal(useCaseSensitiveFileNames, currentDirectory);
    }
    ts2.createDocumentRegistry = createDocumentRegistry;
    function createDocumentRegistryInternal(useCaseSensitiveFileNames, currentDirectory, externalCache) {
      if (currentDirectory === void 0) {
        currentDirectory = "";
      }
      var buckets = new ts2.Map();
      var getCanonicalFileName = ts2.createGetCanonicalFileName(!!useCaseSensitiveFileNames);
      function reportStats() {
        var bucketInfoArray = ts2.arrayFrom(buckets.keys()).filter(function(name) {
          return name && name.charAt(0) === "_";
        }).map(function(name) {
          var entries = buckets.get(name);
          var sourceFiles = [];
          entries.forEach(function(entry, name2) {
            if (isDocumentRegistryEntry(entry)) {
              sourceFiles.push({
                name: name2,
                scriptKind: entry.sourceFile.scriptKind,
                refCount: entry.languageServiceRefCount
              });
            } else {
              entry.forEach(function(value, scriptKind) {
                return sourceFiles.push({ name: name2, scriptKind, refCount: value.languageServiceRefCount });
              });
            }
          });
          sourceFiles.sort(function(x, y) {
            return y.refCount - x.refCount;
          });
          return {
            bucket: name,
            sourceFiles
          };
        });
        return JSON.stringify(bucketInfoArray, void 0, 2);
      }
      function acquireDocument(fileName, compilationSettings, scriptSnapshot, version, scriptKind) {
        var path = ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
        var key = getKeyForCompilationSettings(compilationSettings);
        return acquireDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version, scriptKind);
      }
      function acquireDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version, scriptKind) {
        return acquireOrUpdateDocument(fileName, path, compilationSettings, key, scriptSnapshot, version, true, scriptKind);
      }
      function updateDocument(fileName, compilationSettings, scriptSnapshot, version, scriptKind) {
        var path = ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
        var key = getKeyForCompilationSettings(compilationSettings);
        return updateDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version, scriptKind);
      }
      function updateDocumentWithKey(fileName, path, compilationSettings, key, scriptSnapshot, version, scriptKind) {
        return acquireOrUpdateDocument(fileName, path, compilationSettings, key, scriptSnapshot, version, false, scriptKind);
      }
      function getDocumentRegistryEntry(bucketEntry, scriptKind) {
        var entry = isDocumentRegistryEntry(bucketEntry) ? bucketEntry : bucketEntry.get(ts2.Debug.checkDefined(scriptKind, "If there are more than one scriptKind's for same document the scriptKind should be provided"));
        ts2.Debug.assert(scriptKind === void 0 || !entry || entry.sourceFile.scriptKind === scriptKind, "Script kind should match provided ScriptKind:".concat(scriptKind, " and sourceFile.scriptKind: ").concat(entry === null || entry === void 0 ? void 0 : entry.sourceFile.scriptKind, ", !entry: ").concat(!entry));
        return entry;
      }
      function acquireOrUpdateDocument(fileName, path, compilationSettings, key, scriptSnapshot, version, acquiring, scriptKind) {
        scriptKind = ts2.ensureScriptKind(fileName, scriptKind);
        var scriptTarget = scriptKind === 6 ? 100 : ts2.getEmitScriptTarget(compilationSettings);
        var bucket = ts2.getOrUpdate(buckets, key, function() {
          return new ts2.Map();
        });
        var bucketEntry = bucket.get(path);
        var entry = bucketEntry && getDocumentRegistryEntry(bucketEntry, scriptKind);
        if (!entry && externalCache) {
          var sourceFile = externalCache.getDocument(key, path);
          if (sourceFile) {
            ts2.Debug.assert(acquiring);
            entry = {
              sourceFile,
              languageServiceRefCount: 0
            };
            setBucketEntry();
          }
        }
        if (!entry) {
          var sourceFile = ts2.createLanguageServiceSourceFile(fileName, scriptSnapshot, scriptTarget, version, false, scriptKind);
          if (externalCache) {
            externalCache.setDocument(key, path, sourceFile);
          }
          entry = {
            sourceFile,
            languageServiceRefCount: 1
          };
          setBucketEntry();
        } else {
          if (entry.sourceFile.version !== version) {
            entry.sourceFile = ts2.updateLanguageServiceSourceFile(entry.sourceFile, scriptSnapshot, version, scriptSnapshot.getChangeRange(entry.sourceFile.scriptSnapshot));
            if (externalCache) {
              externalCache.setDocument(key, path, entry.sourceFile);
            }
          }
          if (acquiring) {
            entry.languageServiceRefCount++;
          }
        }
        ts2.Debug.assert(entry.languageServiceRefCount !== 0);
        return entry.sourceFile;
        function setBucketEntry() {
          if (!bucketEntry) {
            bucket.set(path, entry);
          } else if (isDocumentRegistryEntry(bucketEntry)) {
            var scriptKindMap = new ts2.Map();
            scriptKindMap.set(bucketEntry.sourceFile.scriptKind, bucketEntry);
            scriptKindMap.set(scriptKind, entry);
            bucket.set(path, scriptKindMap);
          } else {
            bucketEntry.set(scriptKind, entry);
          }
        }
      }
      function releaseDocument(fileName, compilationSettings, scriptKind) {
        var path = ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
        var key = getKeyForCompilationSettings(compilationSettings);
        return releaseDocumentWithKey(path, key, scriptKind);
      }
      function releaseDocumentWithKey(path, key, scriptKind) {
        var bucket = ts2.Debug.checkDefined(buckets.get(key));
        var bucketEntry = bucket.get(path);
        var entry = getDocumentRegistryEntry(bucketEntry, scriptKind);
        entry.languageServiceRefCount--;
        ts2.Debug.assert(entry.languageServiceRefCount >= 0);
        if (entry.languageServiceRefCount === 0) {
          if (isDocumentRegistryEntry(bucketEntry)) {
            bucket.delete(path);
          } else {
            bucketEntry.delete(scriptKind);
            if (bucketEntry.size === 1) {
              bucket.set(path, ts2.firstDefinedIterator(bucketEntry.values(), ts2.identity));
            }
          }
        }
      }
      function getLanguageServiceRefCounts(path, scriptKind) {
        return ts2.arrayFrom(buckets.entries(), function(_a) {
          var key = _a[0], bucket = _a[1];
          var bucketEntry = bucket.get(path);
          var entry = bucketEntry && getDocumentRegistryEntry(bucketEntry, scriptKind);
          return [key, entry && entry.languageServiceRefCount];
        });
      }
      return {
        acquireDocument,
        acquireDocumentWithKey,
        updateDocument,
        updateDocumentWithKey,
        releaseDocument,
        releaseDocumentWithKey,
        getLanguageServiceRefCounts,
        reportStats,
        getKeyForCompilationSettings
      };
    }
    ts2.createDocumentRegistryInternal = createDocumentRegistryInternal;
    function getKeyForCompilationSettings(settings) {
      return ts2.sourceFileAffectingCompilerOptions.map(function(option) {
        return ts2.getCompilerOptionValue(settings, option);
      }).join("|");
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var FindAllReferences;
    (function(FindAllReferences2) {
      function createImportTracker(sourceFiles, sourceFilesSet, checker, cancellationToken) {
        var allDirectImports = getDirectImportsMap(sourceFiles, checker, cancellationToken);
        return function(exportSymbol, exportInfo, isForRename) {
          var _a = getImportersForExport(sourceFiles, sourceFilesSet, allDirectImports, exportInfo, checker, cancellationToken), directImports = _a.directImports, indirectUsers = _a.indirectUsers;
          return __assign({ indirectUsers }, getSearchesFromDirectImports(directImports, exportSymbol, exportInfo.exportKind, checker, isForRename));
        };
      }
      FindAllReferences2.createImportTracker = createImportTracker;
      var ExportKind;
      (function(ExportKind2) {
        ExportKind2[ExportKind2["Named"] = 0] = "Named";
        ExportKind2[ExportKind2["Default"] = 1] = "Default";
        ExportKind2[ExportKind2["ExportEquals"] = 2] = "ExportEquals";
      })(ExportKind = FindAllReferences2.ExportKind || (FindAllReferences2.ExportKind = {}));
      var ImportExport;
      (function(ImportExport2) {
        ImportExport2[ImportExport2["Import"] = 0] = "Import";
        ImportExport2[ImportExport2["Export"] = 1] = "Export";
      })(ImportExport = FindAllReferences2.ImportExport || (FindAllReferences2.ImportExport = {}));
      function getImportersForExport(sourceFiles, sourceFilesSet, allDirectImports, _a, checker, cancellationToken) {
        var exportingModuleSymbol = _a.exportingModuleSymbol, exportKind = _a.exportKind;
        var markSeenDirectImport = ts2.nodeSeenTracker();
        var markSeenIndirectUser = ts2.nodeSeenTracker();
        var directImports = [];
        var isAvailableThroughGlobal = !!exportingModuleSymbol.globalExports;
        var indirectUserDeclarations = isAvailableThroughGlobal ? void 0 : [];
        handleDirectImports(exportingModuleSymbol);
        return { directImports, indirectUsers: getIndirectUsers() };
        function getIndirectUsers() {
          if (isAvailableThroughGlobal) {
            return sourceFiles;
          }
          if (exportingModuleSymbol.declarations) {
            for (var _i = 0, _a2 = exportingModuleSymbol.declarations; _i < _a2.length; _i++) {
              var decl = _a2[_i];
              if (ts2.isExternalModuleAugmentation(decl) && sourceFilesSet.has(decl.getSourceFile().fileName)) {
                addIndirectUser(decl);
              }
            }
          }
          return indirectUserDeclarations.map(ts2.getSourceFileOfNode);
        }
        function handleDirectImports(exportingModuleSymbol2) {
          var theseDirectImports = getDirectImports(exportingModuleSymbol2);
          if (theseDirectImports) {
            for (var _i = 0, theseDirectImports_1 = theseDirectImports; _i < theseDirectImports_1.length; _i++) {
              var direct = theseDirectImports_1[_i];
              if (!markSeenDirectImport(direct)) {
                continue;
              }
              if (cancellationToken)
                cancellationToken.throwIfCancellationRequested();
              switch (direct.kind) {
                case 207:
                  if (ts2.isImportCall(direct)) {
                    handleImportCall(direct);
                    break;
                  }
                  if (!isAvailableThroughGlobal) {
                    var parent = direct.parent;
                    if (exportKind === 2 && parent.kind === 253) {
                      var name = parent.name;
                      if (name.kind === 79) {
                        directImports.push(name);
                        break;
                      }
                    }
                  }
                  break;
                case 79:
                  break;
                case 264:
                  handleNamespaceImport(direct, direct.name, ts2.hasSyntacticModifier(direct, 1), false);
                  break;
                case 265:
                  directImports.push(direct);
                  var namedBindings = direct.importClause && direct.importClause.namedBindings;
                  if (namedBindings && namedBindings.kind === 267) {
                    handleNamespaceImport(direct, namedBindings.name, false, true);
                  } else if (!isAvailableThroughGlobal && ts2.isDefaultImport(direct)) {
                    addIndirectUser(getSourceFileLikeForImportDeclaration(direct));
                  }
                  break;
                case 271:
                  if (!direct.exportClause) {
                    handleDirectImports(getContainingModuleSymbol(direct, checker));
                  } else if (direct.exportClause.kind === 273) {
                    addIndirectUser(getSourceFileLikeForImportDeclaration(direct), true);
                  } else {
                    directImports.push(direct);
                  }
                  break;
                case 199:
                  if (direct.isTypeOf && !direct.qualifier && isExported(direct)) {
                    addIndirectUser(direct.getSourceFile(), true);
                  }
                  directImports.push(direct);
                  break;
                default:
                  ts2.Debug.failBadSyntaxKind(direct, "Unexpected import kind.");
              }
            }
          }
        }
        function handleImportCall(importCall) {
          var top = ts2.findAncestor(importCall, isAmbientModuleDeclaration) || importCall.getSourceFile();
          addIndirectUser(top, !!isExported(importCall, true));
        }
        function isExported(node, stopAtAmbientModule) {
          if (stopAtAmbientModule === void 0) {
            stopAtAmbientModule = false;
          }
          return ts2.findAncestor(node, function(node2) {
            if (stopAtAmbientModule && isAmbientModuleDeclaration(node2))
              return "quit";
            return ts2.some(node2.modifiers, function(mod) {
              return mod.kind === 93;
            });
          });
        }
        function handleNamespaceImport(importDeclaration, name, isReExport, alreadyAddedDirect) {
          if (exportKind === 2) {
            if (!alreadyAddedDirect)
              directImports.push(importDeclaration);
          } else if (!isAvailableThroughGlobal) {
            var sourceFileLike = getSourceFileLikeForImportDeclaration(importDeclaration);
            ts2.Debug.assert(sourceFileLike.kind === 303 || sourceFileLike.kind === 260);
            if (isReExport || findNamespaceReExports(sourceFileLike, name, checker)) {
              addIndirectUser(sourceFileLike, true);
            } else {
              addIndirectUser(sourceFileLike);
            }
          }
        }
        function addIndirectUser(sourceFileLike, addTransitiveDependencies) {
          if (addTransitiveDependencies === void 0) {
            addTransitiveDependencies = false;
          }
          ts2.Debug.assert(!isAvailableThroughGlobal);
          var isNew = markSeenIndirectUser(sourceFileLike);
          if (!isNew)
            return;
          indirectUserDeclarations.push(sourceFileLike);
          if (!addTransitiveDependencies)
            return;
          var moduleSymbol = checker.getMergedSymbol(sourceFileLike.symbol);
          if (!moduleSymbol)
            return;
          ts2.Debug.assert(!!(moduleSymbol.flags & 1536));
          var directImports2 = getDirectImports(moduleSymbol);
          if (directImports2) {
            for (var _i = 0, directImports_1 = directImports2; _i < directImports_1.length; _i++) {
              var directImport = directImports_1[_i];
              if (!ts2.isImportTypeNode(directImport)) {
                addIndirectUser(getSourceFileLikeForImportDeclaration(directImport), true);
              }
            }
          }
        }
        function getDirectImports(moduleSymbol) {
          return allDirectImports.get(ts2.getSymbolId(moduleSymbol).toString());
        }
      }
      function getSearchesFromDirectImports(directImports, exportSymbol, exportKind, checker, isForRename) {
        var importSearches = [];
        var singleReferences = [];
        function addSearch(location, symbol) {
          importSearches.push([location, symbol]);
        }
        if (directImports) {
          for (var _i = 0, directImports_2 = directImports; _i < directImports_2.length; _i++) {
            var decl = directImports_2[_i];
            handleImport(decl);
          }
        }
        return { importSearches, singleReferences };
        function handleImport(decl2) {
          if (decl2.kind === 264) {
            if (isExternalModuleImportEquals(decl2)) {
              handleNamespaceImportLike(decl2.name);
            }
            return;
          }
          if (decl2.kind === 79) {
            handleNamespaceImportLike(decl2);
            return;
          }
          if (decl2.kind === 199) {
            if (decl2.qualifier) {
              var firstIdentifier = ts2.getFirstIdentifier(decl2.qualifier);
              if (firstIdentifier.escapedText === ts2.symbolName(exportSymbol)) {
                singleReferences.push(firstIdentifier);
              }
            } else if (exportKind === 2) {
              singleReferences.push(decl2.argument.literal);
            }
            return;
          }
          if (decl2.moduleSpecifier.kind !== 10) {
            return;
          }
          if (decl2.kind === 271) {
            if (decl2.exportClause && ts2.isNamedExports(decl2.exportClause)) {
              searchForNamedImport(decl2.exportClause);
            }
            return;
          }
          var _a = decl2.importClause || { name: void 0, namedBindings: void 0 }, name = _a.name, namedBindings = _a.namedBindings;
          if (namedBindings) {
            switch (namedBindings.kind) {
              case 267:
                handleNamespaceImportLike(namedBindings.name);
                break;
              case 268:
                if (exportKind === 0 || exportKind === 1) {
                  searchForNamedImport(namedBindings);
                }
                break;
              default:
                ts2.Debug.assertNever(namedBindings);
            }
          }
          if (name && (exportKind === 1 || exportKind === 2) && (!isForRename || name.escapedText === ts2.symbolEscapedNameNoDefault(exportSymbol))) {
            var defaultImportAlias = checker.getSymbolAtLocation(name);
            addSearch(name, defaultImportAlias);
          }
        }
        function handleNamespaceImportLike(importName) {
          if (exportKind === 2 && (!isForRename || isNameMatch(importName.escapedText))) {
            addSearch(importName, checker.getSymbolAtLocation(importName));
          }
        }
        function searchForNamedImport(namedBindings) {
          if (!namedBindings) {
            return;
          }
          for (var _i2 = 0, _a = namedBindings.elements; _i2 < _a.length; _i2++) {
            var element = _a[_i2];
            var name = element.name, propertyName = element.propertyName;
            if (!isNameMatch((propertyName || name).escapedText)) {
              continue;
            }
            if (propertyName) {
              singleReferences.push(propertyName);
              if (!isForRename || name.escapedText === exportSymbol.escapedName) {
                addSearch(name, checker.getSymbolAtLocation(name));
              }
            } else {
              var localSymbol = element.kind === 274 && element.propertyName ? checker.getExportSpecifierLocalTargetSymbol(element) : checker.getSymbolAtLocation(name);
              addSearch(name, localSymbol);
            }
          }
        }
        function isNameMatch(name) {
          return name === exportSymbol.escapedName || exportKind !== 0 && name === "default";
        }
      }
      function findNamespaceReExports(sourceFileLike, name, checker) {
        var namespaceImportSymbol = checker.getSymbolAtLocation(name);
        return !!forEachPossibleImportOrExportStatement(sourceFileLike, function(statement) {
          if (!ts2.isExportDeclaration(statement))
            return;
          var exportClause = statement.exportClause, moduleSpecifier = statement.moduleSpecifier;
          return !moduleSpecifier && exportClause && ts2.isNamedExports(exportClause) && exportClause.elements.some(function(element) {
            return checker.getExportSpecifierLocalTargetSymbol(element) === namespaceImportSymbol;
          });
        });
      }
      function findModuleReferences(program, sourceFiles, searchModuleSymbol) {
        var refs = [];
        var checker = program.getTypeChecker();
        for (var _i = 0, sourceFiles_1 = sourceFiles; _i < sourceFiles_1.length; _i++) {
          var referencingFile = sourceFiles_1[_i];
          var searchSourceFile = searchModuleSymbol.valueDeclaration;
          if ((searchSourceFile === null || searchSourceFile === void 0 ? void 0 : searchSourceFile.kind) === 303) {
            for (var _a = 0, _b = referencingFile.referencedFiles; _a < _b.length; _a++) {
              var ref = _b[_a];
              if (program.getSourceFileFromReference(referencingFile, ref) === searchSourceFile) {
                refs.push({ kind: "reference", referencingFile, ref });
              }
            }
            for (var _c = 0, _d = referencingFile.typeReferenceDirectives; _c < _d.length; _c++) {
              var ref = _d[_c];
              var referenced = program.getResolvedTypeReferenceDirectives().get(ref.fileName);
              if (referenced !== void 0 && referenced.resolvedFileName === searchSourceFile.fileName) {
                refs.push({ kind: "reference", referencingFile, ref });
              }
            }
          }
          forEachImport(referencingFile, function(_importDecl, moduleSpecifier) {
            var moduleSymbol = checker.getSymbolAtLocation(moduleSpecifier);
            if (moduleSymbol === searchModuleSymbol) {
              refs.push({ kind: "import", literal: moduleSpecifier });
            }
          });
        }
        return refs;
      }
      FindAllReferences2.findModuleReferences = findModuleReferences;
      function getDirectImportsMap(sourceFiles, checker, cancellationToken) {
        var map = new ts2.Map();
        for (var _i = 0, sourceFiles_2 = sourceFiles; _i < sourceFiles_2.length; _i++) {
          var sourceFile = sourceFiles_2[_i];
          if (cancellationToken)
            cancellationToken.throwIfCancellationRequested();
          forEachImport(sourceFile, function(importDecl, moduleSpecifier) {
            var moduleSymbol = checker.getSymbolAtLocation(moduleSpecifier);
            if (moduleSymbol) {
              var id = ts2.getSymbolId(moduleSymbol).toString();
              var imports = map.get(id);
              if (!imports) {
                map.set(id, imports = []);
              }
              imports.push(importDecl);
            }
          });
        }
        return map;
      }
      function forEachPossibleImportOrExportStatement(sourceFileLike, action) {
        return ts2.forEach(sourceFileLike.kind === 303 ? sourceFileLike.statements : sourceFileLike.body.statements, function(statement) {
          return action(statement) || isAmbientModuleDeclaration(statement) && ts2.forEach(statement.body && statement.body.statements, action);
        });
      }
      function forEachImport(sourceFile, action) {
        if (sourceFile.externalModuleIndicator || sourceFile.imports !== void 0) {
          for (var _i = 0, _a = sourceFile.imports; _i < _a.length; _i++) {
            var i = _a[_i];
            action(ts2.importFromModuleSpecifier(i), i);
          }
        } else {
          forEachPossibleImportOrExportStatement(sourceFile, function(statement) {
            switch (statement.kind) {
              case 271:
              case 265: {
                var decl = statement;
                if (decl.moduleSpecifier && ts2.isStringLiteral(decl.moduleSpecifier)) {
                  action(decl, decl.moduleSpecifier);
                }
                break;
              }
              case 264: {
                var decl = statement;
                if (isExternalModuleImportEquals(decl)) {
                  action(decl, decl.moduleReference.expression);
                }
                break;
              }
            }
          });
        }
      }
      function getImportOrExportSymbol(node, symbol, checker, comingFromExport) {
        return comingFromExport ? getExport() : getExport() || getImport();
        function getExport() {
          var _a;
          var parent = node.parent;
          var grandparent = parent.parent;
          if (symbol.exportSymbol) {
            if (parent.kind === 205) {
              return ((_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.some(function(d) {
                return d === parent;
              })) && ts2.isBinaryExpression(grandparent) ? getSpecialPropertyExport(grandparent, false) : void 0;
            } else {
              return exportInfo(symbol.exportSymbol, getExportKindForDeclaration(parent));
            }
          } else {
            var exportNode = getExportNode(parent, node);
            if (exportNode && ts2.hasSyntacticModifier(exportNode, 1)) {
              if (ts2.isImportEqualsDeclaration(exportNode) && exportNode.moduleReference === node) {
                if (comingFromExport) {
                  return void 0;
                }
                var lhsSymbol = checker.getSymbolAtLocation(exportNode.name);
                return { kind: 0, symbol: lhsSymbol };
              } else {
                return exportInfo(symbol, getExportKindForDeclaration(exportNode));
              }
            } else if (ts2.isNamespaceExport(parent)) {
              return exportInfo(symbol, 0);
            } else if (ts2.isExportAssignment(parent)) {
              return getExportAssignmentExport(parent);
            } else if (ts2.isExportAssignment(grandparent)) {
              return getExportAssignmentExport(grandparent);
            } else if (ts2.isBinaryExpression(parent)) {
              return getSpecialPropertyExport(parent, true);
            } else if (ts2.isBinaryExpression(grandparent)) {
              return getSpecialPropertyExport(grandparent, true);
            } else if (ts2.isJSDocTypedefTag(parent)) {
              return exportInfo(symbol, 0);
            }
          }
          function getExportAssignmentExport(ex) {
            if (!ex.symbol.parent)
              return void 0;
            var exportKind = ex.isExportEquals ? 2 : 1;
            return { kind: 1, symbol, exportInfo: { exportingModuleSymbol: ex.symbol.parent, exportKind } };
          }
          function getSpecialPropertyExport(node2, useLhsSymbol) {
            var kind;
            switch (ts2.getAssignmentDeclarationKind(node2)) {
              case 1:
                kind = 0;
                break;
              case 2:
                kind = 2;
                break;
              default:
                return void 0;
            }
            var sym = useLhsSymbol ? checker.getSymbolAtLocation(ts2.getNameOfAccessExpression(ts2.cast(node2.left, ts2.isAccessExpression))) : symbol;
            return sym && exportInfo(sym, kind);
          }
        }
        function getImport() {
          var isImport = isNodeImport(node);
          if (!isImport)
            return void 0;
          var importedSymbol = checker.getImmediateAliasedSymbol(symbol);
          if (!importedSymbol)
            return void 0;
          importedSymbol = skipExportSpecifierSymbol(importedSymbol, checker);
          if (importedSymbol.escapedName === "export=") {
            importedSymbol = getExportEqualsLocalSymbol(importedSymbol, checker);
          }
          var importedName = ts2.symbolEscapedNameNoDefault(importedSymbol);
          if (importedName === void 0 || importedName === "default" || importedName === symbol.escapedName) {
            return { kind: 0, symbol: importedSymbol };
          }
        }
        function exportInfo(symbol2, kind) {
          var exportInfo2 = getExportInfo(symbol2, kind, checker);
          return exportInfo2 && { kind: 1, symbol: symbol2, exportInfo: exportInfo2 };
        }
        function getExportKindForDeclaration(node2) {
          return ts2.hasSyntacticModifier(node2, 512) ? 1 : 0;
        }
      }
      FindAllReferences2.getImportOrExportSymbol = getImportOrExportSymbol;
      function getExportEqualsLocalSymbol(importedSymbol, checker) {
        if (importedSymbol.flags & 2097152) {
          return ts2.Debug.checkDefined(checker.getImmediateAliasedSymbol(importedSymbol));
        }
        var decl = ts2.Debug.checkDefined(importedSymbol.valueDeclaration);
        if (ts2.isExportAssignment(decl)) {
          return ts2.Debug.checkDefined(decl.expression.symbol);
        } else if (ts2.isBinaryExpression(decl)) {
          return ts2.Debug.checkDefined(decl.right.symbol);
        } else if (ts2.isSourceFile(decl)) {
          return ts2.Debug.checkDefined(decl.symbol);
        }
        return ts2.Debug.fail();
      }
      function getExportNode(parent, node) {
        var declaration = ts2.isVariableDeclaration(parent) ? parent : ts2.isBindingElement(parent) ? ts2.walkUpBindingElementsAndPatterns(parent) : void 0;
        if (declaration) {
          return parent.name !== node ? void 0 : ts2.isCatchClause(declaration.parent) ? void 0 : ts2.isVariableStatement(declaration.parent.parent) ? declaration.parent.parent : void 0;
        } else {
          return parent;
        }
      }
      function isNodeImport(node) {
        var parent = node.parent;
        switch (parent.kind) {
          case 264:
            return parent.name === node && isExternalModuleImportEquals(parent);
          case 269:
            return !parent.propertyName;
          case 266:
          case 267:
            ts2.Debug.assert(parent.name === node);
            return true;
          case 202:
            return ts2.isInJSFile(node) && ts2.isVariableDeclarationInitializedToBareOrAccessedRequire(parent);
          default:
            return false;
        }
      }
      function getExportInfo(exportSymbol, exportKind, checker) {
        var moduleSymbol = exportSymbol.parent;
        if (!moduleSymbol)
          return void 0;
        var exportingModuleSymbol = checker.getMergedSymbol(moduleSymbol);
        return ts2.isExternalModuleSymbol(exportingModuleSymbol) ? { exportingModuleSymbol, exportKind } : void 0;
      }
      FindAllReferences2.getExportInfo = getExportInfo;
      function skipExportSpecifierSymbol(symbol, checker) {
        if (symbol.declarations) {
          for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            if (ts2.isExportSpecifier(declaration) && !declaration.propertyName && !declaration.parent.parent.moduleSpecifier) {
              return checker.getExportSpecifierLocalTargetSymbol(declaration);
            } else if (ts2.isPropertyAccessExpression(declaration) && ts2.isModuleExportsAccessExpression(declaration.expression) && !ts2.isPrivateIdentifier(declaration.name)) {
              return checker.getSymbolAtLocation(declaration);
            } else if (ts2.isShorthandPropertyAssignment(declaration) && ts2.isBinaryExpression(declaration.parent.parent) && ts2.getAssignmentDeclarationKind(declaration.parent.parent) === 2) {
              return checker.getExportSpecifierLocalTargetSymbol(declaration.name);
            }
          }
        }
        return symbol;
      }
      function getContainingModuleSymbol(importer, checker) {
        return checker.getMergedSymbol(getSourceFileLikeForImportDeclaration(importer).symbol);
      }
      function getSourceFileLikeForImportDeclaration(node) {
        if (node.kind === 207) {
          return node.getSourceFile();
        }
        var parent = node.parent;
        if (parent.kind === 303) {
          return parent;
        }
        ts2.Debug.assert(parent.kind === 261);
        return ts2.cast(parent.parent, isAmbientModuleDeclaration);
      }
      function isAmbientModuleDeclaration(node) {
        return node.kind === 260 && node.name.kind === 10;
      }
      function isExternalModuleImportEquals(eq) {
        return eq.moduleReference.kind === 276 && eq.moduleReference.expression.kind === 10;
      }
    })(FindAllReferences = ts2.FindAllReferences || (ts2.FindAllReferences = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var FindAllReferences;
    (function(FindAllReferences2) {
      var DefinitionKind;
      (function(DefinitionKind2) {
        DefinitionKind2[DefinitionKind2["Symbol"] = 0] = "Symbol";
        DefinitionKind2[DefinitionKind2["Label"] = 1] = "Label";
        DefinitionKind2[DefinitionKind2["Keyword"] = 2] = "Keyword";
        DefinitionKind2[DefinitionKind2["This"] = 3] = "This";
        DefinitionKind2[DefinitionKind2["String"] = 4] = "String";
        DefinitionKind2[DefinitionKind2["TripleSlashReference"] = 5] = "TripleSlashReference";
      })(DefinitionKind = FindAllReferences2.DefinitionKind || (FindAllReferences2.DefinitionKind = {}));
      var EntryKind;
      (function(EntryKind2) {
        EntryKind2[EntryKind2["Span"] = 0] = "Span";
        EntryKind2[EntryKind2["Node"] = 1] = "Node";
        EntryKind2[EntryKind2["StringLiteral"] = 2] = "StringLiteral";
        EntryKind2[EntryKind2["SearchedLocalFoundProperty"] = 3] = "SearchedLocalFoundProperty";
        EntryKind2[EntryKind2["SearchedPropertyFoundLocal"] = 4] = "SearchedPropertyFoundLocal";
      })(EntryKind = FindAllReferences2.EntryKind || (FindAllReferences2.EntryKind = {}));
      function nodeEntry(node, kind) {
        if (kind === void 0) {
          kind = 1;
        }
        return {
          kind,
          node: node.name || node,
          context: getContextNodeForNodeEntry(node)
        };
      }
      FindAllReferences2.nodeEntry = nodeEntry;
      function isContextWithStartAndEndNode(node) {
        return node && node.kind === void 0;
      }
      FindAllReferences2.isContextWithStartAndEndNode = isContextWithStartAndEndNode;
      function getContextNodeForNodeEntry(node) {
        if (ts2.isDeclaration(node)) {
          return getContextNode(node);
        }
        if (!node.parent)
          return void 0;
        if (!ts2.isDeclaration(node.parent) && !ts2.isExportAssignment(node.parent)) {
          if (ts2.isInJSFile(node)) {
            var binaryExpression = ts2.isBinaryExpression(node.parent) ? node.parent : ts2.isAccessExpression(node.parent) && ts2.isBinaryExpression(node.parent.parent) && node.parent.parent.left === node.parent ? node.parent.parent : void 0;
            if (binaryExpression && ts2.getAssignmentDeclarationKind(binaryExpression) !== 0) {
              return getContextNode(binaryExpression);
            }
          }
          if (ts2.isJsxOpeningElement(node.parent) || ts2.isJsxClosingElement(node.parent)) {
            return node.parent.parent;
          } else if (ts2.isJsxSelfClosingElement(node.parent) || ts2.isLabeledStatement(node.parent) || ts2.isBreakOrContinueStatement(node.parent)) {
            return node.parent;
          } else if (ts2.isStringLiteralLike(node)) {
            var validImport = ts2.tryGetImportFromModuleSpecifier(node);
            if (validImport) {
              var declOrStatement = ts2.findAncestor(validImport, function(node2) {
                return ts2.isDeclaration(node2) || ts2.isStatement(node2) || ts2.isJSDocTag(node2);
              });
              return ts2.isDeclaration(declOrStatement) ? getContextNode(declOrStatement) : declOrStatement;
            }
          }
          var propertyName = ts2.findAncestor(node, ts2.isComputedPropertyName);
          return propertyName ? getContextNode(propertyName.parent) : void 0;
        }
        if (node.parent.name === node || ts2.isConstructorDeclaration(node.parent) || ts2.isExportAssignment(node.parent) || (ts2.isImportOrExportSpecifier(node.parent) || ts2.isBindingElement(node.parent)) && node.parent.propertyName === node || node.kind === 88 && ts2.hasSyntacticModifier(node.parent, 513)) {
          return getContextNode(node.parent);
        }
        return void 0;
      }
      function getContextNode(node) {
        if (!node)
          return void 0;
        switch (node.kind) {
          case 253:
            return !ts2.isVariableDeclarationList(node.parent) || node.parent.declarations.length !== 1 ? node : ts2.isVariableStatement(node.parent.parent) ? node.parent.parent : ts2.isForInOrOfStatement(node.parent.parent) ? getContextNode(node.parent.parent) : node.parent;
          case 202:
            return getContextNode(node.parent.parent);
          case 269:
            return node.parent.parent.parent;
          case 274:
          case 267:
            return node.parent.parent;
          case 266:
          case 273:
            return node.parent;
          case 220:
            return ts2.isExpressionStatement(node.parent) ? node.parent : node;
          case 243:
          case 242:
            return {
              start: node.initializer,
              end: node.expression
            };
          case 294:
          case 295:
            return ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent) ? getContextNode(ts2.findAncestor(node.parent, function(node2) {
              return ts2.isBinaryExpression(node2) || ts2.isForInOrOfStatement(node2);
            })) : node;
          default:
            return node;
        }
      }
      FindAllReferences2.getContextNode = getContextNode;
      function toContextSpan(textSpan, sourceFile, context) {
        if (!context)
          return void 0;
        var contextSpan = isContextWithStartAndEndNode(context) ? getTextSpan(context.start, sourceFile, context.end) : getTextSpan(context, sourceFile);
        return contextSpan.start !== textSpan.start || contextSpan.length !== textSpan.length ? { contextSpan } : void 0;
      }
      FindAllReferences2.toContextSpan = toContextSpan;
      var FindReferencesUse;
      (function(FindReferencesUse2) {
        FindReferencesUse2[FindReferencesUse2["Other"] = 0] = "Other";
        FindReferencesUse2[FindReferencesUse2["References"] = 1] = "References";
        FindReferencesUse2[FindReferencesUse2["Rename"] = 2] = "Rename";
      })(FindReferencesUse = FindAllReferences2.FindReferencesUse || (FindAllReferences2.FindReferencesUse = {}));
      function findReferencedSymbols(program, cancellationToken, sourceFiles, sourceFile, position) {
        var node = ts2.getTouchingPropertyName(sourceFile, position);
        var referencedSymbols = Core.getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, { use: 1 });
        var checker = program.getTypeChecker();
        var symbol = checker.getSymbolAtLocation(node);
        return !referencedSymbols || !referencedSymbols.length ? void 0 : ts2.mapDefined(referencedSymbols, function(_a) {
          var definition = _a.definition, references = _a.references;
          return definition && {
            definition: checker.runWithCancellationToken(cancellationToken, function(checker2) {
              return definitionToReferencedSymbolDefinitionInfo(definition, checker2, node);
            }),
            references: references.map(function(r) {
              return toReferenceEntry(r, symbol);
            })
          };
        });
      }
      FindAllReferences2.findReferencedSymbols = findReferencedSymbols;
      function getImplementationsAtPosition(program, cancellationToken, sourceFiles, sourceFile, position) {
        var node = ts2.getTouchingPropertyName(sourceFile, position);
        var referenceEntries;
        var entries = getImplementationReferenceEntries(program, cancellationToken, sourceFiles, node, position);
        if (node.parent.kind === 205 || node.parent.kind === 202 || node.parent.kind === 206 || node.kind === 106) {
          referenceEntries = entries && __spreadArray([], entries, true);
        } else {
          var queue = entries && __spreadArray([], entries, true);
          var seenNodes = new ts2.Map();
          while (queue && queue.length) {
            var entry = queue.shift();
            if (!ts2.addToSeen(seenNodes, ts2.getNodeId(entry.node))) {
              continue;
            }
            referenceEntries = ts2.append(referenceEntries, entry);
            var entries_1 = getImplementationReferenceEntries(program, cancellationToken, sourceFiles, entry.node, entry.node.pos);
            if (entries_1) {
              queue.push.apply(queue, entries_1);
            }
          }
        }
        var checker = program.getTypeChecker();
        return ts2.map(referenceEntries, function(entry2) {
          return toImplementationLocation(entry2, checker);
        });
      }
      FindAllReferences2.getImplementationsAtPosition = getImplementationsAtPosition;
      function getImplementationReferenceEntries(program, cancellationToken, sourceFiles, node, position) {
        if (node.kind === 303) {
          return void 0;
        }
        var checker = program.getTypeChecker();
        if (node.parent.kind === 295) {
          var result_2 = [];
          Core.getReferenceEntriesForShorthandPropertyAssignment(node, checker, function(node2) {
            return result_2.push(nodeEntry(node2));
          });
          return result_2;
        } else if (node.kind === 106 || ts2.isSuperProperty(node.parent)) {
          var symbol = checker.getSymbolAtLocation(node);
          return symbol.valueDeclaration && [nodeEntry(symbol.valueDeclaration)];
        } else {
          return getReferenceEntriesForNode(position, node, program, sourceFiles, cancellationToken, { implementations: true, use: 1 });
        }
      }
      function findReferenceOrRenameEntries(program, cancellationToken, sourceFiles, node, position, options, convertEntry) {
        return ts2.map(flattenEntries(Core.getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, options)), function(entry) {
          return convertEntry(entry, node, program.getTypeChecker());
        });
      }
      FindAllReferences2.findReferenceOrRenameEntries = findReferenceOrRenameEntries;
      function getReferenceEntriesForNode(position, node, program, sourceFiles, cancellationToken, options, sourceFilesSet) {
        if (options === void 0) {
          options = {};
        }
        if (sourceFilesSet === void 0) {
          sourceFilesSet = new ts2.Set(sourceFiles.map(function(f) {
            return f.fileName;
          }));
        }
        return flattenEntries(Core.getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, options, sourceFilesSet));
      }
      FindAllReferences2.getReferenceEntriesForNode = getReferenceEntriesForNode;
      function flattenEntries(referenceSymbols) {
        return referenceSymbols && ts2.flatMap(referenceSymbols, function(r) {
          return r.references;
        });
      }
      function definitionToReferencedSymbolDefinitionInfo(def, checker, originalNode) {
        var info = function() {
          switch (def.type) {
            case 0: {
              var symbol = def.symbol;
              var _a = getDefinitionKindAndDisplayParts(symbol, checker, originalNode), displayParts_1 = _a.displayParts, kind_1 = _a.kind;
              var name_1 = displayParts_1.map(function(p) {
                return p.text;
              }).join("");
              var declaration = symbol.declarations && ts2.firstOrUndefined(symbol.declarations);
              var node = declaration ? ts2.getNameOfDeclaration(declaration) || declaration : originalNode;
              return __assign(__assign({}, getFileAndTextSpanFromNode(node)), { name: name_1, kind: kind_1, displayParts: displayParts_1, context: getContextNode(declaration) });
            }
            case 1: {
              var node = def.node;
              return __assign(__assign({}, getFileAndTextSpanFromNode(node)), { name: node.text, kind: "label", displayParts: [ts2.displayPart(node.text, ts2.SymbolDisplayPartKind.text)] });
            }
            case 2: {
              var node = def.node;
              var name_2 = ts2.tokenToString(node.kind);
              return __assign(__assign({}, getFileAndTextSpanFromNode(node)), { name: name_2, kind: "keyword", displayParts: [{ text: name_2, kind: "keyword" }] });
            }
            case 3: {
              var node = def.node;
              var symbol = checker.getSymbolAtLocation(node);
              var displayParts_2 = symbol && ts2.SymbolDisplay.getSymbolDisplayPartsDocumentationAndSymbolKind(checker, symbol, node.getSourceFile(), ts2.getContainerNode(node), node).displayParts || [ts2.textPart("this")];
              return __assign(__assign({}, getFileAndTextSpanFromNode(node)), { name: "this", kind: "var", displayParts: displayParts_2 });
            }
            case 4: {
              var node = def.node;
              return __assign(__assign({}, getFileAndTextSpanFromNode(node)), { name: node.text, kind: "var", displayParts: [ts2.displayPart(ts2.getTextOfNode(node), ts2.SymbolDisplayPartKind.stringLiteral)] });
            }
            case 5: {
              return {
                textSpan: ts2.createTextSpanFromRange(def.reference),
                sourceFile: def.file,
                name: def.reference.fileName,
                kind: "string",
                displayParts: [ts2.displayPart('"'.concat(def.reference.fileName, '"'), ts2.SymbolDisplayPartKind.stringLiteral)]
              };
            }
            default:
              return ts2.Debug.assertNever(def);
          }
        }();
        var sourceFile = info.sourceFile, textSpan = info.textSpan, name = info.name, kind = info.kind, displayParts = info.displayParts, context = info.context;
        return __assign({ containerKind: "", containerName: "", fileName: sourceFile.fileName, kind, name, textSpan, displayParts }, toContextSpan(textSpan, sourceFile, context));
      }
      function getFileAndTextSpanFromNode(node) {
        var sourceFile = node.getSourceFile();
        return {
          sourceFile,
          textSpan: getTextSpan(ts2.isComputedPropertyName(node) ? node.expression : node, sourceFile)
        };
      }
      function getDefinitionKindAndDisplayParts(symbol, checker, node) {
        var meaning = Core.getIntersectingMeaningFromDeclarations(node, symbol);
        var enclosingDeclaration = symbol.declarations && ts2.firstOrUndefined(symbol.declarations) || node;
        var _a = ts2.SymbolDisplay.getSymbolDisplayPartsDocumentationAndSymbolKind(checker, symbol, enclosingDeclaration.getSourceFile(), enclosingDeclaration, enclosingDeclaration, meaning), displayParts = _a.displayParts, symbolKind = _a.symbolKind;
        return { displayParts, kind: symbolKind };
      }
      function toRenameLocation(entry, originalNode, checker, providePrefixAndSuffixText) {
        return __assign(__assign({}, entryToDocumentSpan(entry)), providePrefixAndSuffixText && getPrefixAndSuffixText(entry, originalNode, checker));
      }
      FindAllReferences2.toRenameLocation = toRenameLocation;
      function toReferenceEntry(entry, symbol) {
        var documentSpan = entryToDocumentSpan(entry);
        if (entry.kind === 0) {
          return __assign(__assign({}, documentSpan), { isWriteAccess: false, isDefinition: false });
        }
        var kind = entry.kind, node = entry.node;
        return __assign(__assign({}, documentSpan), { isWriteAccess: isWriteAccessForReference(node), isDefinition: isDeclarationOfSymbol(node, symbol), isInString: kind === 2 ? true : void 0 });
      }
      FindAllReferences2.toReferenceEntry = toReferenceEntry;
      function entryToDocumentSpan(entry) {
        if (entry.kind === 0) {
          return { textSpan: entry.textSpan, fileName: entry.fileName };
        } else {
          var sourceFile = entry.node.getSourceFile();
          var textSpan = getTextSpan(entry.node, sourceFile);
          return __assign({ textSpan, fileName: sourceFile.fileName }, toContextSpan(textSpan, sourceFile, entry.context));
        }
      }
      function getPrefixAndSuffixText(entry, originalNode, checker) {
        if (entry.kind !== 0 && ts2.isIdentifier(originalNode)) {
          var node = entry.node, kind = entry.kind;
          var parent = node.parent;
          var name = originalNode.text;
          var isShorthandAssignment = ts2.isShorthandPropertyAssignment(parent);
          if (isShorthandAssignment || ts2.isObjectBindingElementWithoutPropertyName(parent) && parent.name === node && parent.dotDotDotToken === void 0) {
            var prefixColon = { prefixText: name + ": " };
            var suffixColon = { suffixText: ": " + name };
            if (kind === 3) {
              return prefixColon;
            }
            if (kind === 4) {
              return suffixColon;
            }
            if (isShorthandAssignment) {
              var grandParent = parent.parent;
              if (ts2.isObjectLiteralExpression(grandParent) && ts2.isBinaryExpression(grandParent.parent) && ts2.isModuleExportsAccessExpression(grandParent.parent.left)) {
                return prefixColon;
              }
              return suffixColon;
            } else {
              return prefixColon;
            }
          } else if (ts2.isImportSpecifier(parent) && !parent.propertyName) {
            var originalSymbol = ts2.isExportSpecifier(originalNode.parent) ? checker.getExportSpecifierLocalTargetSymbol(originalNode.parent) : checker.getSymbolAtLocation(originalNode);
            return ts2.contains(originalSymbol.declarations, parent) ? { prefixText: name + " as " } : ts2.emptyOptions;
          } else if (ts2.isExportSpecifier(parent) && !parent.propertyName) {
            return originalNode === entry.node || checker.getSymbolAtLocation(originalNode) === checker.getSymbolAtLocation(entry.node) ? { prefixText: name + " as " } : { suffixText: " as " + name };
          }
        }
        return ts2.emptyOptions;
      }
      function toImplementationLocation(entry, checker) {
        var documentSpan = entryToDocumentSpan(entry);
        if (entry.kind !== 0) {
          var node = entry.node;
          return __assign(__assign({}, documentSpan), implementationKindDisplayParts(node, checker));
        } else {
          return __assign(__assign({}, documentSpan), { kind: "", displayParts: [] });
        }
      }
      function implementationKindDisplayParts(node, checker) {
        var symbol = checker.getSymbolAtLocation(ts2.isDeclaration(node) && node.name ? node.name : node);
        if (symbol) {
          return getDefinitionKindAndDisplayParts(symbol, checker, node);
        } else if (node.kind === 204) {
          return {
            kind: "interface",
            displayParts: [ts2.punctuationPart(20), ts2.textPart("object literal"), ts2.punctuationPart(21)]
          };
        } else if (node.kind === 225) {
          return {
            kind: "local class",
            displayParts: [ts2.punctuationPart(20), ts2.textPart("anonymous local class"), ts2.punctuationPart(21)]
          };
        } else {
          return { kind: ts2.getNodeKind(node), displayParts: [] };
        }
      }
      function toHighlightSpan(entry) {
        var documentSpan = entryToDocumentSpan(entry);
        if (entry.kind === 0) {
          return {
            fileName: documentSpan.fileName,
            span: {
              textSpan: documentSpan.textSpan,
              kind: "reference"
            }
          };
        }
        var writeAccess = isWriteAccessForReference(entry.node);
        var span = __assign({ textSpan: documentSpan.textSpan, kind: writeAccess ? "writtenReference" : "reference", isInString: entry.kind === 2 ? true : void 0 }, documentSpan.contextSpan && { contextSpan: documentSpan.contextSpan });
        return { fileName: documentSpan.fileName, span };
      }
      FindAllReferences2.toHighlightSpan = toHighlightSpan;
      function getTextSpan(node, sourceFile, endNode) {
        var start = node.getStart(sourceFile);
        var end = (endNode || node).getEnd();
        if (ts2.isStringLiteralLike(node)) {
          ts2.Debug.assert(endNode === void 0);
          start += 1;
          end -= 1;
        }
        return ts2.createTextSpanFromBounds(start, end);
      }
      function getTextSpanOfEntry(entry) {
        return entry.kind === 0 ? entry.textSpan : getTextSpan(entry.node, entry.node.getSourceFile());
      }
      FindAllReferences2.getTextSpanOfEntry = getTextSpanOfEntry;
      function isWriteAccessForReference(node) {
        var decl = ts2.getDeclarationFromName(node);
        return !!decl && declarationIsWriteAccess(decl) || node.kind === 88 || ts2.isWriteAccess(node);
      }
      function isDeclarationOfSymbol(node, target) {
        var _a;
        if (!target)
          return false;
        var source = ts2.getDeclarationFromName(node) || (node.kind === 88 ? node.parent : ts2.isLiteralComputedPropertyDeclarationName(node) ? node.parent.parent : node.kind === 134 && ts2.isConstructorDeclaration(node.parent) ? node.parent.parent : void 0);
        var commonjsSource = source && ts2.isBinaryExpression(source) ? source.left : void 0;
        return !!(source && ((_a = target.declarations) === null || _a === void 0 ? void 0 : _a.some(function(d) {
          return d === source || d === commonjsSource;
        })));
      }
      function declarationIsWriteAccess(decl) {
        if (!!(decl.flags & 8388608))
          return true;
        switch (decl.kind) {
          case 220:
          case 202:
          case 256:
          case 225:
          case 88:
          case 259:
          case 297:
          case 274:
          case 266:
          case 264:
          case 269:
          case 257:
          case 336:
          case 343:
          case 284:
          case 260:
          case 263:
          case 267:
          case 273:
          case 163:
          case 295:
          case 258:
          case 162:
            return true;
          case 294:
            return !ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(decl.parent);
          case 255:
          case 212:
          case 170:
          case 168:
          case 171:
          case 172:
            return !!decl.body;
          case 253:
          case 166:
            return !!decl.initializer || ts2.isCatchClause(decl.parent);
          case 167:
          case 165:
          case 345:
          case 338:
            return false;
          default:
            return ts2.Debug.failBadSyntaxKind(decl);
        }
      }
      var Core;
      (function(Core2) {
        function getReferencedSymbolsForNode(position, node, program, sourceFiles, cancellationToken, options, sourceFilesSet) {
          var _a, _b;
          if (options === void 0) {
            options = {};
          }
          if (sourceFilesSet === void 0) {
            sourceFilesSet = new ts2.Set(sourceFiles.map(function(f) {
              return f.fileName;
            }));
          }
          if (options.use === 1) {
            node = ts2.getAdjustedReferenceLocation(node);
          } else if (options.use === 2) {
            node = ts2.getAdjustedRenameLocation(node);
          }
          if (ts2.isSourceFile(node)) {
            var resolvedRef = ts2.GoToDefinition.getReferenceAtPosition(node, position, program);
            if (!(resolvedRef === null || resolvedRef === void 0 ? void 0 : resolvedRef.file)) {
              return void 0;
            }
            var moduleSymbol = program.getTypeChecker().getMergedSymbol(resolvedRef.file.symbol);
            if (moduleSymbol) {
              return getReferencedSymbolsForModule(program, moduleSymbol, false, sourceFiles, sourceFilesSet);
            }
            var fileIncludeReasons = program.getFileIncludeReasons();
            if (!fileIncludeReasons) {
              return void 0;
            }
            return [{
              definition: { type: 5, reference: resolvedRef.reference, file: node },
              references: getReferencesForNonModule(resolvedRef.file, fileIncludeReasons, program) || ts2.emptyArray
            }];
          }
          if (!options.implementations) {
            var special = getReferencedSymbolsSpecial(node, sourceFiles, cancellationToken);
            if (special) {
              return special;
            }
          }
          var checker = program.getTypeChecker();
          var symbol = checker.getSymbolAtLocation(ts2.isConstructorDeclaration(node) && node.parent.name || node);
          if (!symbol) {
            if (!options.implementations && ts2.isStringLiteralLike(node)) {
              if (ts2.isModuleSpecifierLike(node)) {
                var fileIncludeReasons = program.getFileIncludeReasons();
                var referencedFileName = (_b = (_a = node.getSourceFile().resolvedModules) === null || _a === void 0 ? void 0 : _a.get(node.text, ts2.getModeForUsageLocation(node.getSourceFile(), node))) === null || _b === void 0 ? void 0 : _b.resolvedFileName;
                var referencedFile = referencedFileName ? program.getSourceFile(referencedFileName) : void 0;
                if (referencedFile) {
                  return [{ definition: { type: 4, node }, references: getReferencesForNonModule(referencedFile, fileIncludeReasons, program) || ts2.emptyArray }];
                }
              }
              return getReferencesForStringLiteral(node, sourceFiles, checker, cancellationToken);
            }
            return void 0;
          }
          if (symbol.escapedName === "export=") {
            return getReferencedSymbolsForModule(program, symbol.parent, false, sourceFiles, sourceFilesSet);
          }
          var moduleReferences = getReferencedSymbolsForModuleIfDeclaredBySourceFile(symbol, program, sourceFiles, cancellationToken, options, sourceFilesSet);
          if (moduleReferences && !(symbol.flags & 33554432)) {
            return moduleReferences;
          }
          var aliasedSymbol = getMergedAliasedSymbolOfNamespaceExportDeclaration(node, symbol, checker);
          var moduleReferencesOfExportTarget = aliasedSymbol && getReferencedSymbolsForModuleIfDeclaredBySourceFile(aliasedSymbol, program, sourceFiles, cancellationToken, options, sourceFilesSet);
          var references = getReferencedSymbolsForSymbol(symbol, node, sourceFiles, sourceFilesSet, checker, cancellationToken, options);
          return mergeReferences(program, moduleReferences, references, moduleReferencesOfExportTarget);
        }
        Core2.getReferencedSymbolsForNode = getReferencedSymbolsForNode;
        function getReferencesForFileName(fileName, program, sourceFiles, sourceFilesSet) {
          var _a, _b;
          if (sourceFilesSet === void 0) {
            sourceFilesSet = new ts2.Set(sourceFiles.map(function(f) {
              return f.fileName;
            }));
          }
          var moduleSymbol = (_a = program.getSourceFile(fileName)) === null || _a === void 0 ? void 0 : _a.symbol;
          if (moduleSymbol) {
            return ((_b = getReferencedSymbolsForModule(program, moduleSymbol, false, sourceFiles, sourceFilesSet)[0]) === null || _b === void 0 ? void 0 : _b.references) || ts2.emptyArray;
          }
          var fileIncludeReasons = program.getFileIncludeReasons();
          var referencedFile = program.getSourceFile(fileName);
          return referencedFile && fileIncludeReasons && getReferencesForNonModule(referencedFile, fileIncludeReasons, program) || ts2.emptyArray;
        }
        Core2.getReferencesForFileName = getReferencesForFileName;
        function getReferencesForNonModule(referencedFile, refFileMap, program) {
          var entries;
          var references = refFileMap.get(referencedFile.path) || ts2.emptyArray;
          for (var _i = 0, references_1 = references; _i < references_1.length; _i++) {
            var ref = references_1[_i];
            if (ts2.isReferencedFile(ref)) {
              var referencingFile = program.getSourceFileByPath(ref.file);
              var location = ts2.getReferencedFileLocation(program.getSourceFileByPath, ref);
              if (ts2.isReferenceFileLocation(location)) {
                entries = ts2.append(entries, {
                  kind: 0,
                  fileName: referencingFile.fileName,
                  textSpan: ts2.createTextSpanFromRange(location)
                });
              }
            }
          }
          return entries;
        }
        function getMergedAliasedSymbolOfNamespaceExportDeclaration(node, symbol, checker) {
          if (node.parent && ts2.isNamespaceExportDeclaration(node.parent)) {
            var aliasedSymbol = checker.getAliasedSymbol(symbol);
            var targetSymbol = checker.getMergedSymbol(aliasedSymbol);
            if (aliasedSymbol !== targetSymbol) {
              return targetSymbol;
            }
          }
          return void 0;
        }
        function getReferencedSymbolsForModuleIfDeclaredBySourceFile(symbol, program, sourceFiles, cancellationToken, options, sourceFilesSet) {
          var moduleSourceFile = symbol.flags & 1536 && symbol.declarations && ts2.find(symbol.declarations, ts2.isSourceFile);
          if (!moduleSourceFile)
            return void 0;
          var exportEquals = symbol.exports.get("export=");
          var moduleReferences = getReferencedSymbolsForModule(program, symbol, !!exportEquals, sourceFiles, sourceFilesSet);
          if (!exportEquals || !sourceFilesSet.has(moduleSourceFile.fileName))
            return moduleReferences;
          var checker = program.getTypeChecker();
          symbol = ts2.skipAlias(exportEquals, checker);
          return mergeReferences(program, moduleReferences, getReferencedSymbolsForSymbol(symbol, void 0, sourceFiles, sourceFilesSet, checker, cancellationToken, options));
        }
        function mergeReferences(program) {
          var referencesToMerge = [];
          for (var _i = 1; _i < arguments.length; _i++) {
            referencesToMerge[_i - 1] = arguments[_i];
          }
          var result;
          for (var _a = 0, referencesToMerge_1 = referencesToMerge; _a < referencesToMerge_1.length; _a++) {
            var references = referencesToMerge_1[_a];
            if (!references || !references.length)
              continue;
            if (!result) {
              result = references;
              continue;
            }
            var _loop_5 = function(entry2) {
              if (!entry2.definition || entry2.definition.type !== 0) {
                result.push(entry2);
                return "continue";
              }
              var symbol = entry2.definition.symbol;
              var refIndex = ts2.findIndex(result, function(ref) {
                return !!ref.definition && ref.definition.type === 0 && ref.definition.symbol === symbol;
              });
              if (refIndex === -1) {
                result.push(entry2);
                return "continue";
              }
              var reference = result[refIndex];
              result[refIndex] = {
                definition: reference.definition,
                references: reference.references.concat(entry2.references).sort(function(entry1, entry22) {
                  var entry1File = getSourceFileIndexOfEntry(program, entry1);
                  var entry2File = getSourceFileIndexOfEntry(program, entry22);
                  if (entry1File !== entry2File) {
                    return ts2.compareValues(entry1File, entry2File);
                  }
                  var entry1Span = getTextSpanOfEntry(entry1);
                  var entry2Span = getTextSpanOfEntry(entry22);
                  return entry1Span.start !== entry2Span.start ? ts2.compareValues(entry1Span.start, entry2Span.start) : ts2.compareValues(entry1Span.length, entry2Span.length);
                })
              };
            };
            for (var _b = 0, references_2 = references; _b < references_2.length; _b++) {
              var entry = references_2[_b];
              _loop_5(entry);
            }
          }
          return result;
        }
        function getSourceFileIndexOfEntry(program, entry) {
          var sourceFile = entry.kind === 0 ? program.getSourceFile(entry.fileName) : entry.node.getSourceFile();
          return program.getSourceFiles().indexOf(sourceFile);
        }
        function getReferencedSymbolsForModule(program, symbol, excludeImportTypeOfExportEquals, sourceFiles, sourceFilesSet) {
          ts2.Debug.assert(!!symbol.valueDeclaration);
          var references = ts2.mapDefined(FindAllReferences2.findModuleReferences(program, sourceFiles, symbol), function(reference) {
            if (reference.kind === "import") {
              var parent = reference.literal.parent;
              if (ts2.isLiteralTypeNode(parent)) {
                var importType = ts2.cast(parent.parent, ts2.isImportTypeNode);
                if (excludeImportTypeOfExportEquals && !importType.qualifier) {
                  return void 0;
                }
              }
              return nodeEntry(reference.literal);
            } else {
              return {
                kind: 0,
                fileName: reference.referencingFile.fileName,
                textSpan: ts2.createTextSpanFromRange(reference.ref)
              };
            }
          });
          if (symbol.declarations) {
            for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
              var decl = _a[_i];
              switch (decl.kind) {
                case 303:
                  break;
                case 260:
                  if (sourceFilesSet.has(decl.getSourceFile().fileName)) {
                    references.push(nodeEntry(decl.name));
                  }
                  break;
                default:
                  ts2.Debug.assert(!!(symbol.flags & 33554432), "Expected a module symbol to be declared by a SourceFile or ModuleDeclaration.");
              }
            }
          }
          var exported = symbol.exports.get("export=");
          if (exported === null || exported === void 0 ? void 0 : exported.declarations) {
            for (var _b = 0, _c = exported.declarations; _b < _c.length; _b++) {
              var decl = _c[_b];
              var sourceFile = decl.getSourceFile();
              if (sourceFilesSet.has(sourceFile.fileName)) {
                var node = ts2.isBinaryExpression(decl) && ts2.isPropertyAccessExpression(decl.left) ? decl.left.expression : ts2.isExportAssignment(decl) ? ts2.Debug.checkDefined(ts2.findChildOfKind(decl, 93, sourceFile)) : ts2.getNameOfDeclaration(decl) || decl;
                references.push(nodeEntry(node));
              }
            }
          }
          return references.length ? [{ definition: { type: 0, symbol }, references }] : ts2.emptyArray;
        }
        function isReadonlyTypeOperator(node) {
          return node.kind === 144 && ts2.isTypeOperatorNode(node.parent) && node.parent.operator === 144;
        }
        function getReferencedSymbolsSpecial(node, sourceFiles, cancellationToken) {
          if (ts2.isTypeKeyword(node.kind)) {
            if (node.kind === 114 && ts2.isVoidExpression(node.parent)) {
              return void 0;
            }
            if (node.kind === 144 && !isReadonlyTypeOperator(node)) {
              return void 0;
            }
            return getAllReferencesForKeyword(sourceFiles, node.kind, cancellationToken, node.kind === 144 ? isReadonlyTypeOperator : void 0);
          }
          if (ts2.isStaticModifier(node) && ts2.isClassStaticBlockDeclaration(node.parent)) {
            return [{ definition: { type: 2, node }, references: [nodeEntry(node)] }];
          }
          if (ts2.isJumpStatementTarget(node)) {
            var labelDefinition = ts2.getTargetLabel(node.parent, node.text);
            return labelDefinition && getLabelReferencesInNode(labelDefinition.parent, labelDefinition);
          } else if (ts2.isLabelOfLabeledStatement(node)) {
            return getLabelReferencesInNode(node.parent, node);
          }
          if (ts2.isThis(node)) {
            return getReferencesForThisKeyword(node, sourceFiles, cancellationToken);
          }
          if (node.kind === 106) {
            return getReferencesForSuperKeyword(node);
          }
          return void 0;
        }
        function getReferencedSymbolsForSymbol(originalSymbol, node, sourceFiles, sourceFilesSet, checker, cancellationToken, options) {
          var symbol = node && skipPastExportOrImportSpecifierOrUnion(originalSymbol, node, checker, !isForRenameWithPrefixAndSuffixText(options)) || originalSymbol;
          var searchMeaning = node ? getIntersectingMeaningFromDeclarations(node, symbol) : 7;
          var result = [];
          var state = new State(sourceFiles, sourceFilesSet, node ? getSpecialSearchKind(node) : 0, checker, cancellationToken, searchMeaning, options, result);
          var exportSpecifier = !isForRenameWithPrefixAndSuffixText(options) || !symbol.declarations ? void 0 : ts2.find(symbol.declarations, ts2.isExportSpecifier);
          if (exportSpecifier) {
            getReferencesAtExportSpecifier(exportSpecifier.name, symbol, exportSpecifier, state.createSearch(node, originalSymbol, void 0), state, true, true);
          } else if (node && node.kind === 88 && symbol.escapedName === "default" && symbol.parent) {
            addReference(node, symbol, state);
            searchForImportsOfExport(node, symbol, { exportingModuleSymbol: symbol.parent, exportKind: 1 }, state);
          } else {
            var search = state.createSearch(node, symbol, void 0, { allSearchSymbols: node ? populateSearchSymbolSet(symbol, node, checker, options.use === 2, !!options.providePrefixAndSuffixTextForRename, !!options.implementations) : [symbol] });
            getReferencesInContainerOrFiles(symbol, state, search);
          }
          return result;
        }
        function getReferencesInContainerOrFiles(symbol, state, search) {
          var scope = getSymbolScope(symbol);
          if (scope) {
            getReferencesInContainer(scope, scope.getSourceFile(), search, state, !(ts2.isSourceFile(scope) && !ts2.contains(state.sourceFiles, scope)));
          } else {
            for (var _i = 0, _a = state.sourceFiles; _i < _a.length; _i++) {
              var sourceFile = _a[_i];
              state.cancellationToken.throwIfCancellationRequested();
              searchForName(sourceFile, search, state);
            }
          }
        }
        function getSpecialSearchKind(node) {
          switch (node.kind) {
            case 170:
            case 134:
              return 1;
            case 79:
              if (ts2.isClassLike(node.parent)) {
                ts2.Debug.assert(node.parent.name === node);
                return 2;
              }
            default:
              return 0;
          }
        }
        function skipPastExportOrImportSpecifierOrUnion(symbol, node, checker, useLocalSymbolForExportSpecifier) {
          var parent = node.parent;
          if (ts2.isExportSpecifier(parent) && useLocalSymbolForExportSpecifier) {
            return getLocalSymbolForExportSpecifier(node, symbol, parent, checker);
          }
          return ts2.firstDefined(symbol.declarations, function(decl) {
            if (!decl.parent) {
              if (symbol.flags & 33554432)
                return void 0;
              ts2.Debug.fail("Unexpected symbol at ".concat(ts2.Debug.formatSyntaxKind(node.kind), ": ").concat(ts2.Debug.formatSymbol(symbol)));
            }
            return ts2.isTypeLiteralNode(decl.parent) && ts2.isUnionTypeNode(decl.parent.parent) ? checker.getPropertyOfType(checker.getTypeFromTypeNode(decl.parent.parent), symbol.name) : void 0;
          });
        }
        var SpecialSearchKind;
        (function(SpecialSearchKind2) {
          SpecialSearchKind2[SpecialSearchKind2["None"] = 0] = "None";
          SpecialSearchKind2[SpecialSearchKind2["Constructor"] = 1] = "Constructor";
          SpecialSearchKind2[SpecialSearchKind2["Class"] = 2] = "Class";
        })(SpecialSearchKind || (SpecialSearchKind = {}));
        function getNonModuleSymbolOfMergedModuleSymbol(symbol) {
          if (!(symbol.flags & (1536 | 33554432)))
            return void 0;
          var decl = symbol.declarations && ts2.find(symbol.declarations, function(d) {
            return !ts2.isSourceFile(d) && !ts2.isModuleDeclaration(d);
          });
          return decl && decl.symbol;
        }
        var State = function() {
          function State2(sourceFiles, sourceFilesSet, specialSearchKind, checker, cancellationToken, searchMeaning, options, result) {
            this.sourceFiles = sourceFiles;
            this.sourceFilesSet = sourceFilesSet;
            this.specialSearchKind = specialSearchKind;
            this.checker = checker;
            this.cancellationToken = cancellationToken;
            this.searchMeaning = searchMeaning;
            this.options = options;
            this.result = result;
            this.inheritsFromCache = new ts2.Map();
            this.markSeenContainingTypeReference = ts2.nodeSeenTracker();
            this.markSeenReExportRHS = ts2.nodeSeenTracker();
            this.symbolIdToReferences = [];
            this.sourceFileToSeenSymbols = [];
          }
          State2.prototype.includesSourceFile = function(sourceFile) {
            return this.sourceFilesSet.has(sourceFile.fileName);
          };
          State2.prototype.getImportSearches = function(exportSymbol, exportInfo) {
            if (!this.importTracker)
              this.importTracker = FindAllReferences2.createImportTracker(this.sourceFiles, this.sourceFilesSet, this.checker, this.cancellationToken);
            return this.importTracker(exportSymbol, exportInfo, this.options.use === 2);
          };
          State2.prototype.createSearch = function(location, symbol, comingFrom, searchOptions) {
            if (searchOptions === void 0) {
              searchOptions = {};
            }
            var _a = searchOptions.text, text = _a === void 0 ? ts2.stripQuotes(ts2.symbolName(ts2.getLocalSymbolForExportDefault(symbol) || getNonModuleSymbolOfMergedModuleSymbol(symbol) || symbol)) : _a, _b = searchOptions.allSearchSymbols, allSearchSymbols = _b === void 0 ? [symbol] : _b;
            var escapedText = ts2.escapeLeadingUnderscores(text);
            var parents = this.options.implementations && location ? getParentSymbolsOfPropertyAccess(location, symbol, this.checker) : void 0;
            return { symbol, comingFrom, text, escapedText, parents, allSearchSymbols, includes: function(sym) {
              return ts2.contains(allSearchSymbols, sym);
            } };
          };
          State2.prototype.referenceAdder = function(searchSymbol) {
            var symbolId = ts2.getSymbolId(searchSymbol);
            var references = this.symbolIdToReferences[symbolId];
            if (!references) {
              references = this.symbolIdToReferences[symbolId] = [];
              this.result.push({ definition: { type: 0, symbol: searchSymbol }, references });
            }
            return function(node, kind) {
              return references.push(nodeEntry(node, kind));
            };
          };
          State2.prototype.addStringOrCommentReference = function(fileName, textSpan) {
            this.result.push({
              definition: void 0,
              references: [{ kind: 0, fileName, textSpan }]
            });
          };
          State2.prototype.markSearchedSymbols = function(sourceFile, symbols) {
            var sourceId = ts2.getNodeId(sourceFile);
            var seenSymbols = this.sourceFileToSeenSymbols[sourceId] || (this.sourceFileToSeenSymbols[sourceId] = new ts2.Set());
            var anyNewSymbols = false;
            for (var _i = 0, symbols_2 = symbols; _i < symbols_2.length; _i++) {
              var sym = symbols_2[_i];
              anyNewSymbols = ts2.tryAddToSet(seenSymbols, ts2.getSymbolId(sym)) || anyNewSymbols;
            }
            return anyNewSymbols;
          };
          return State2;
        }();
        function searchForImportsOfExport(exportLocation, exportSymbol, exportInfo, state) {
          var _a = state.getImportSearches(exportSymbol, exportInfo), importSearches = _a.importSearches, singleReferences = _a.singleReferences, indirectUsers = _a.indirectUsers;
          if (singleReferences.length) {
            var addRef = state.referenceAdder(exportSymbol);
            for (var _i = 0, singleReferences_1 = singleReferences; _i < singleReferences_1.length; _i++) {
              var singleRef = singleReferences_1[_i];
              if (shouldAddSingleReference(singleRef, state))
                addRef(singleRef);
            }
          }
          for (var _b = 0, importSearches_1 = importSearches; _b < importSearches_1.length; _b++) {
            var _c = importSearches_1[_b], importLocation = _c[0], importSymbol = _c[1];
            getReferencesInSourceFile(importLocation.getSourceFile(), state.createSearch(importLocation, importSymbol, 1), state);
          }
          if (indirectUsers.length) {
            var indirectSearch = void 0;
            switch (exportInfo.exportKind) {
              case 0:
                indirectSearch = state.createSearch(exportLocation, exportSymbol, 1);
                break;
              case 1:
                indirectSearch = state.options.use === 2 ? void 0 : state.createSearch(exportLocation, exportSymbol, 1, { text: "default" });
                break;
              case 2:
                break;
            }
            if (indirectSearch) {
              for (var _d = 0, indirectUsers_1 = indirectUsers; _d < indirectUsers_1.length; _d++) {
                var indirectUser = indirectUsers_1[_d];
                searchForName(indirectUser, indirectSearch, state);
              }
            }
          }
        }
        function eachExportReference(sourceFiles, checker, cancellationToken, exportSymbol, exportingModuleSymbol, exportName, isDefaultExport, cb) {
          var importTracker = FindAllReferences2.createImportTracker(sourceFiles, new ts2.Set(sourceFiles.map(function(f) {
            return f.fileName;
          })), checker, cancellationToken);
          var _a = importTracker(exportSymbol, { exportKind: isDefaultExport ? 1 : 0, exportingModuleSymbol }, false), importSearches = _a.importSearches, indirectUsers = _a.indirectUsers;
          for (var _i = 0, importSearches_2 = importSearches; _i < importSearches_2.length; _i++) {
            var importLocation = importSearches_2[_i][0];
            cb(importLocation);
          }
          for (var _b = 0, indirectUsers_2 = indirectUsers; _b < indirectUsers_2.length; _b++) {
            var indirectUser = indirectUsers_2[_b];
            for (var _c = 0, _d = getPossibleSymbolReferenceNodes(indirectUser, isDefaultExport ? "default" : exportName); _c < _d.length; _c++) {
              var node = _d[_c];
              var symbol = checker.getSymbolAtLocation(node);
              var hasExportAssignmentDeclaration = ts2.some(symbol === null || symbol === void 0 ? void 0 : symbol.declarations, function(d) {
                return ts2.tryCast(d, ts2.isExportAssignment) ? true : false;
              });
              if (ts2.isIdentifier(node) && !ts2.isImportOrExportSpecifier(node.parent) && (symbol === exportSymbol || hasExportAssignmentDeclaration)) {
                cb(node);
              }
            }
          }
        }
        Core2.eachExportReference = eachExportReference;
        function shouldAddSingleReference(singleRef, state) {
          if (!hasMatchingMeaning(singleRef, state))
            return false;
          if (state.options.use !== 2)
            return true;
          if (!ts2.isIdentifier(singleRef))
            return false;
          return !(ts2.isImportOrExportSpecifier(singleRef.parent) && singleRef.escapedText === "default");
        }
        function searchForImportedSymbol(symbol, state) {
          if (!symbol.declarations)
            return;
          for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
            var declaration = _a[_i];
            var exportingFile = declaration.getSourceFile();
            getReferencesInSourceFile(exportingFile, state.createSearch(declaration, symbol, 0), state, state.includesSourceFile(exportingFile));
          }
        }
        function searchForName(sourceFile, search, state) {
          if (ts2.getNameTable(sourceFile).get(search.escapedText) !== void 0) {
            getReferencesInSourceFile(sourceFile, search, state);
          }
        }
        function getPropertySymbolOfDestructuringAssignment(location, checker) {
          return ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(location.parent.parent) ? checker.getPropertySymbolOfDestructuringAssignment(location) : void 0;
        }
        function getSymbolScope(symbol) {
          var declarations = symbol.declarations, flags = symbol.flags, parent = symbol.parent, valueDeclaration = symbol.valueDeclaration;
          if (valueDeclaration && (valueDeclaration.kind === 212 || valueDeclaration.kind === 225)) {
            return valueDeclaration;
          }
          if (!declarations) {
            return void 0;
          }
          if (flags & (4 | 8192)) {
            var privateDeclaration = ts2.find(declarations, function(d) {
              return ts2.hasEffectiveModifier(d, 8) || ts2.isPrivateIdentifierClassElementDeclaration(d);
            });
            if (privateDeclaration) {
              return ts2.getAncestor(privateDeclaration, 256);
            }
            return void 0;
          }
          if (declarations.some(ts2.isObjectBindingElementWithoutPropertyName)) {
            return void 0;
          }
          var exposedByParent = parent && !(symbol.flags & 262144);
          if (exposedByParent && !(ts2.isExternalModuleSymbol(parent) && !parent.globalExports)) {
            return void 0;
          }
          var scope;
          for (var _i = 0, declarations_1 = declarations; _i < declarations_1.length; _i++) {
            var declaration = declarations_1[_i];
            var container = ts2.getContainerNode(declaration);
            if (scope && scope !== container) {
              return void 0;
            }
            if (!container || container.kind === 303 && !ts2.isExternalOrCommonJsModule(container)) {
              return void 0;
            }
            scope = container;
            if (ts2.isFunctionExpression(scope)) {
              var next = void 0;
              while (next = ts2.getNextJSDocCommentLocation(scope)) {
                scope = next;
              }
            }
          }
          return exposedByParent ? scope.getSourceFile() : scope;
        }
        function isSymbolReferencedInFile(definition, checker, sourceFile, searchContainer) {
          if (searchContainer === void 0) {
            searchContainer = sourceFile;
          }
          return eachSymbolReferenceInFile(definition, checker, sourceFile, function() {
            return true;
          }, searchContainer) || false;
        }
        Core2.isSymbolReferencedInFile = isSymbolReferencedInFile;
        function eachSymbolReferenceInFile(definition, checker, sourceFile, cb, searchContainer) {
          if (searchContainer === void 0) {
            searchContainer = sourceFile;
          }
          var symbol = ts2.isParameterPropertyDeclaration(definition.parent, definition.parent.parent) ? ts2.first(checker.getSymbolsOfParameterPropertyDeclaration(definition.parent, definition.text)) : checker.getSymbolAtLocation(definition);
          if (!symbol)
            return void 0;
          for (var _i = 0, _a = getPossibleSymbolReferenceNodes(sourceFile, symbol.name, searchContainer); _i < _a.length; _i++) {
            var token = _a[_i];
            if (!ts2.isIdentifier(token) || token === definition || token.escapedText !== definition.escapedText)
              continue;
            var referenceSymbol = checker.getSymbolAtLocation(token);
            if (referenceSymbol === symbol || checker.getShorthandAssignmentValueSymbol(token.parent) === symbol || ts2.isExportSpecifier(token.parent) && getLocalSymbolForExportSpecifier(token, referenceSymbol, token.parent, checker) === symbol) {
              var res = cb(token);
              if (res)
                return res;
            }
          }
        }
        Core2.eachSymbolReferenceInFile = eachSymbolReferenceInFile;
        function someSignatureUsage(signature, sourceFiles, checker, cb) {
          if (!signature.name || !ts2.isIdentifier(signature.name))
            return false;
          var symbol = ts2.Debug.checkDefined(checker.getSymbolAtLocation(signature.name));
          for (var _i = 0, sourceFiles_3 = sourceFiles; _i < sourceFiles_3.length; _i++) {
            var sourceFile = sourceFiles_3[_i];
            for (var _a = 0, _b = getPossibleSymbolReferenceNodes(sourceFile, symbol.name); _a < _b.length; _a++) {
              var name = _b[_a];
              if (!ts2.isIdentifier(name) || name === signature.name || name.escapedText !== signature.name.escapedText)
                continue;
              var called = ts2.climbPastPropertyAccess(name);
              var call = ts2.isCallExpression(called.parent) && called.parent.expression === called ? called.parent : void 0;
              var referenceSymbol = checker.getSymbolAtLocation(name);
              if (referenceSymbol && checker.getRootSymbols(referenceSymbol).some(function(s) {
                return s === symbol;
              })) {
                if (cb(name, call)) {
                  return true;
                }
              }
            }
          }
          return false;
        }
        Core2.someSignatureUsage = someSignatureUsage;
        function getPossibleSymbolReferenceNodes(sourceFile, symbolName, container) {
          if (container === void 0) {
            container = sourceFile;
          }
          return getPossibleSymbolReferencePositions(sourceFile, symbolName, container).map(function(pos) {
            return ts2.getTouchingPropertyName(sourceFile, pos);
          });
        }
        function getPossibleSymbolReferencePositions(sourceFile, symbolName, container) {
          if (container === void 0) {
            container = sourceFile;
          }
          var positions = [];
          if (!symbolName || !symbolName.length) {
            return positions;
          }
          var text = sourceFile.text;
          var sourceLength = text.length;
          var symbolNameLength = symbolName.length;
          var position = text.indexOf(symbolName, container.pos);
          while (position >= 0) {
            if (position > container.end)
              break;
            var endPosition = position + symbolNameLength;
            if ((position === 0 || !ts2.isIdentifierPart(text.charCodeAt(position - 1), 99)) && (endPosition === sourceLength || !ts2.isIdentifierPart(text.charCodeAt(endPosition), 99))) {
              positions.push(position);
            }
            position = text.indexOf(symbolName, position + symbolNameLength + 1);
          }
          return positions;
        }
        function getLabelReferencesInNode(container, targetLabel) {
          var sourceFile = container.getSourceFile();
          var labelName = targetLabel.text;
          var references = ts2.mapDefined(getPossibleSymbolReferenceNodes(sourceFile, labelName, container), function(node) {
            return node === targetLabel || ts2.isJumpStatementTarget(node) && ts2.getTargetLabel(node, labelName) === targetLabel ? nodeEntry(node) : void 0;
          });
          return [{ definition: { type: 1, node: targetLabel }, references }];
        }
        function isValidReferencePosition(node, searchSymbolName) {
          switch (node.kind) {
            case 80:
              if (ts2.isJSDocMemberName(node.parent)) {
                return true;
              }
            case 79:
              return node.text.length === searchSymbolName.length;
            case 14:
            case 10: {
              var str = node;
              return (ts2.isLiteralNameOfPropertyDeclarationOrIndexAccess(str) || ts2.isNameOfModuleDeclaration(node) || ts2.isExpressionOfExternalModuleImportEqualsDeclaration(node) || ts2.isCallExpression(node.parent) && ts2.isBindableObjectDefinePropertyCall(node.parent) && node.parent.arguments[1] === node) && str.text.length === searchSymbolName.length;
            }
            case 8:
              return ts2.isLiteralNameOfPropertyDeclarationOrIndexAccess(node) && node.text.length === searchSymbolName.length;
            case 88:
              return "default".length === searchSymbolName.length;
            default:
              return false;
          }
        }
        function getAllReferencesForKeyword(sourceFiles, keywordKind, cancellationToken, filter) {
          var references = ts2.flatMap(sourceFiles, function(sourceFile) {
            cancellationToken.throwIfCancellationRequested();
            return ts2.mapDefined(getPossibleSymbolReferenceNodes(sourceFile, ts2.tokenToString(keywordKind), sourceFile), function(referenceLocation) {
              if (referenceLocation.kind === keywordKind && (!filter || filter(referenceLocation))) {
                return nodeEntry(referenceLocation);
              }
            });
          });
          return references.length ? [{ definition: { type: 2, node: references[0].node }, references }] : void 0;
        }
        function getReferencesInSourceFile(sourceFile, search, state, addReferencesHere) {
          if (addReferencesHere === void 0) {
            addReferencesHere = true;
          }
          state.cancellationToken.throwIfCancellationRequested();
          return getReferencesInContainer(sourceFile, sourceFile, search, state, addReferencesHere);
        }
        function getReferencesInContainer(container, sourceFile, search, state, addReferencesHere) {
          if (!state.markSearchedSymbols(sourceFile, search.allSearchSymbols)) {
            return;
          }
          for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container); _i < _a.length; _i++) {
            var position = _a[_i];
            getReferencesAtLocation(sourceFile, position, search, state, addReferencesHere);
          }
        }
        function hasMatchingMeaning(referenceLocation, state) {
          return !!(ts2.getMeaningFromLocation(referenceLocation) & state.searchMeaning);
        }
        function getReferencesAtLocation(sourceFile, position, search, state, addReferencesHere) {
          var referenceLocation = ts2.getTouchingPropertyName(sourceFile, position);
          if (!isValidReferencePosition(referenceLocation, search.text)) {
            if (!state.options.implementations && (state.options.findInStrings && ts2.isInString(sourceFile, position) || state.options.findInComments && ts2.isInNonReferenceComment(sourceFile, position))) {
              state.addStringOrCommentReference(sourceFile.fileName, ts2.createTextSpan(position, search.text.length));
            }
            return;
          }
          if (!hasMatchingMeaning(referenceLocation, state))
            return;
          var referenceSymbol = state.checker.getSymbolAtLocation(referenceLocation);
          if (!referenceSymbol) {
            return;
          }
          var parent = referenceLocation.parent;
          if (ts2.isImportSpecifier(parent) && parent.propertyName === referenceLocation) {
            return;
          }
          if (ts2.isExportSpecifier(parent)) {
            ts2.Debug.assert(referenceLocation.kind === 79);
            getReferencesAtExportSpecifier(referenceLocation, referenceSymbol, parent, search, state, addReferencesHere);
            return;
          }
          var relatedSymbol = getRelatedSymbol(search, referenceSymbol, referenceLocation, state);
          if (!relatedSymbol) {
            getReferenceForShorthandProperty(referenceSymbol, search, state);
            return;
          }
          switch (state.specialSearchKind) {
            case 0:
              if (addReferencesHere)
                addReference(referenceLocation, relatedSymbol, state);
              break;
            case 1:
              addConstructorReferences(referenceLocation, sourceFile, search, state);
              break;
            case 2:
              addClassStaticThisReferences(referenceLocation, search, state);
              break;
            default:
              ts2.Debug.assertNever(state.specialSearchKind);
          }
          if (ts2.isInJSFile(referenceLocation) && referenceLocation.parent.kind === 202 && ts2.isVariableDeclarationInitializedToBareOrAccessedRequire(referenceLocation.parent)) {
            referenceSymbol = referenceLocation.parent.symbol;
            if (!referenceSymbol)
              return;
          }
          getImportOrExportReferences(referenceLocation, referenceSymbol, search, state);
        }
        function getReferencesAtExportSpecifier(referenceLocation, referenceSymbol, exportSpecifier, search, state, addReferencesHere, alwaysGetReferences) {
          ts2.Debug.assert(!alwaysGetReferences || !!state.options.providePrefixAndSuffixTextForRename, "If alwaysGetReferences is true, then prefix/suffix text must be enabled");
          var parent = exportSpecifier.parent, propertyName = exportSpecifier.propertyName, name = exportSpecifier.name;
          var exportDeclaration = parent.parent;
          var localSymbol = getLocalSymbolForExportSpecifier(referenceLocation, referenceSymbol, exportSpecifier, state.checker);
          if (!alwaysGetReferences && !search.includes(localSymbol)) {
            return;
          }
          if (!propertyName) {
            if (!(state.options.use === 2 && name.escapedText === "default")) {
              addRef();
            }
          } else if (referenceLocation === propertyName) {
            if (!exportDeclaration.moduleSpecifier) {
              addRef();
            }
            if (addReferencesHere && state.options.use !== 2 && state.markSeenReExportRHS(name)) {
              addReference(name, ts2.Debug.checkDefined(exportSpecifier.symbol), state);
            }
          } else {
            if (state.markSeenReExportRHS(referenceLocation)) {
              addRef();
            }
          }
          if (!isForRenameWithPrefixAndSuffixText(state.options) || alwaysGetReferences) {
            var isDefaultExport = referenceLocation.originalKeywordKind === 88 || exportSpecifier.name.originalKeywordKind === 88;
            var exportKind = isDefaultExport ? 1 : 0;
            var exportSymbol = ts2.Debug.checkDefined(exportSpecifier.symbol);
            var exportInfo = FindAllReferences2.getExportInfo(exportSymbol, exportKind, state.checker);
            if (exportInfo) {
              searchForImportsOfExport(referenceLocation, exportSymbol, exportInfo, state);
            }
          }
          if (search.comingFrom !== 1 && exportDeclaration.moduleSpecifier && !propertyName && !isForRenameWithPrefixAndSuffixText(state.options)) {
            var imported = state.checker.getExportSpecifierLocalTargetSymbol(exportSpecifier);
            if (imported)
              searchForImportedSymbol(imported, state);
          }
          function addRef() {
            if (addReferencesHere)
              addReference(referenceLocation, localSymbol, state);
          }
        }
        function getLocalSymbolForExportSpecifier(referenceLocation, referenceSymbol, exportSpecifier, checker) {
          return isExportSpecifierAlias(referenceLocation, exportSpecifier) && checker.getExportSpecifierLocalTargetSymbol(exportSpecifier) || referenceSymbol;
        }
        function isExportSpecifierAlias(referenceLocation, exportSpecifier) {
          var parent = exportSpecifier.parent, propertyName = exportSpecifier.propertyName, name = exportSpecifier.name;
          ts2.Debug.assert(propertyName === referenceLocation || name === referenceLocation);
          if (propertyName) {
            return propertyName === referenceLocation;
          } else {
            return !parent.parent.moduleSpecifier;
          }
        }
        function getImportOrExportReferences(referenceLocation, referenceSymbol, search, state) {
          var importOrExport = FindAllReferences2.getImportOrExportSymbol(referenceLocation, referenceSymbol, state.checker, search.comingFrom === 1);
          if (!importOrExport)
            return;
          var symbol = importOrExport.symbol;
          if (importOrExport.kind === 0) {
            if (!isForRenameWithPrefixAndSuffixText(state.options)) {
              searchForImportedSymbol(symbol, state);
            }
          } else {
            searchForImportsOfExport(referenceLocation, symbol, importOrExport.exportInfo, state);
          }
        }
        function getReferenceForShorthandProperty(_a, search, state) {
          var flags = _a.flags, valueDeclaration = _a.valueDeclaration;
          var shorthandValueSymbol = state.checker.getShorthandAssignmentValueSymbol(valueDeclaration);
          var name = valueDeclaration && ts2.getNameOfDeclaration(valueDeclaration);
          if (!(flags & 33554432) && name && search.includes(shorthandValueSymbol)) {
            addReference(name, shorthandValueSymbol, state);
          }
        }
        function addReference(referenceLocation, relatedSymbol, state) {
          var _a = "kind" in relatedSymbol ? relatedSymbol : { kind: void 0, symbol: relatedSymbol }, kind = _a.kind, symbol = _a.symbol;
          var addRef = state.referenceAdder(symbol);
          if (state.options.implementations) {
            addImplementationReferences(referenceLocation, addRef, state);
          } else {
            addRef(referenceLocation, kind);
          }
        }
        function addConstructorReferences(referenceLocation, sourceFile, search, state) {
          if (ts2.isNewExpressionTarget(referenceLocation)) {
            addReference(referenceLocation, search.symbol, state);
          }
          var pusher = function() {
            return state.referenceAdder(search.symbol);
          };
          if (ts2.isClassLike(referenceLocation.parent)) {
            ts2.Debug.assert(referenceLocation.kind === 88 || referenceLocation.parent.name === referenceLocation);
            findOwnConstructorReferences(search.symbol, sourceFile, pusher());
          } else {
            var classExtending = tryGetClassByExtendingIdentifier(referenceLocation);
            if (classExtending) {
              findSuperConstructorAccesses(classExtending, pusher());
              findInheritedConstructorReferences(classExtending, state);
            }
          }
        }
        function addClassStaticThisReferences(referenceLocation, search, state) {
          addReference(referenceLocation, search.symbol, state);
          var classLike = referenceLocation.parent;
          if (state.options.use === 2 || !ts2.isClassLike(classLike))
            return;
          ts2.Debug.assert(classLike.name === referenceLocation);
          var addRef = state.referenceAdder(search.symbol);
          for (var _i = 0, _a = classLike.members; _i < _a.length; _i++) {
            var member = _a[_i];
            if (!(ts2.isMethodOrAccessor(member) && ts2.isStatic(member))) {
              continue;
            }
            if (member.body) {
              member.body.forEachChild(function cb(node) {
                if (node.kind === 108) {
                  addRef(node);
                } else if (!ts2.isFunctionLike(node) && !ts2.isClassLike(node)) {
                  node.forEachChild(cb);
                }
              });
            }
          }
        }
        function findOwnConstructorReferences(classSymbol, sourceFile, addNode) {
          var constructorSymbol = getClassConstructorSymbol(classSymbol);
          if (constructorSymbol && constructorSymbol.declarations) {
            for (var _i = 0, _a = constructorSymbol.declarations; _i < _a.length; _i++) {
              var decl = _a[_i];
              var ctrKeyword = ts2.findChildOfKind(decl, 134, sourceFile);
              ts2.Debug.assert(decl.kind === 170 && !!ctrKeyword);
              addNode(ctrKeyword);
            }
          }
          if (classSymbol.exports) {
            classSymbol.exports.forEach(function(member) {
              var decl2 = member.valueDeclaration;
              if (decl2 && decl2.kind === 168) {
                var body = decl2.body;
                if (body) {
                  forEachDescendantOfKind(body, 108, function(thisKeyword) {
                    if (ts2.isNewExpressionTarget(thisKeyword)) {
                      addNode(thisKeyword);
                    }
                  });
                }
              }
            });
          }
        }
        function getClassConstructorSymbol(classSymbol) {
          return classSymbol.members && classSymbol.members.get("__constructor");
        }
        function findSuperConstructorAccesses(classDeclaration, addNode) {
          var constructor = getClassConstructorSymbol(classDeclaration.symbol);
          if (!(constructor && constructor.declarations)) {
            return;
          }
          for (var _i = 0, _a = constructor.declarations; _i < _a.length; _i++) {
            var decl = _a[_i];
            ts2.Debug.assert(decl.kind === 170);
            var body = decl.body;
            if (body) {
              forEachDescendantOfKind(body, 106, function(node) {
                if (ts2.isCallExpressionTarget(node)) {
                  addNode(node);
                }
              });
            }
          }
        }
        function hasOwnConstructor(classDeclaration) {
          return !!getClassConstructorSymbol(classDeclaration.symbol);
        }
        function findInheritedConstructorReferences(classDeclaration, state) {
          if (hasOwnConstructor(classDeclaration))
            return;
          var classSymbol = classDeclaration.symbol;
          var search = state.createSearch(void 0, classSymbol, void 0);
          getReferencesInContainerOrFiles(classSymbol, state, search);
        }
        function addImplementationReferences(refNode, addReference2, state) {
          if (ts2.isDeclarationName(refNode) && isImplementation(refNode.parent)) {
            addReference2(refNode);
            return;
          }
          if (refNode.kind !== 79) {
            return;
          }
          if (refNode.parent.kind === 295) {
            getReferenceEntriesForShorthandPropertyAssignment(refNode, state.checker, addReference2);
          }
          var containingClass = getContainingClassIfInHeritageClause(refNode);
          if (containingClass) {
            addReference2(containingClass);
            return;
          }
          var typeNode = ts2.findAncestor(refNode, function(a) {
            return !ts2.isQualifiedName(a.parent) && !ts2.isTypeNode(a.parent) && !ts2.isTypeElement(a.parent);
          });
          var typeHavingNode = typeNode.parent;
          if (ts2.hasType(typeHavingNode) && typeHavingNode.type === typeNode && state.markSeenContainingTypeReference(typeHavingNode)) {
            if (ts2.hasInitializer(typeHavingNode)) {
              addIfImplementation(typeHavingNode.initializer);
            } else if (ts2.isFunctionLike(typeHavingNode) && typeHavingNode.body) {
              var body = typeHavingNode.body;
              if (body.kind === 234) {
                ts2.forEachReturnStatement(body, function(returnStatement) {
                  if (returnStatement.expression)
                    addIfImplementation(returnStatement.expression);
                });
              } else {
                addIfImplementation(body);
              }
            } else if (ts2.isAssertionExpression(typeHavingNode)) {
              addIfImplementation(typeHavingNode.expression);
            }
          }
          function addIfImplementation(e) {
            if (isImplementationExpression(e))
              addReference2(e);
          }
        }
        function getContainingClassIfInHeritageClause(node) {
          return ts2.isIdentifier(node) || ts2.isPropertyAccessExpression(node) ? getContainingClassIfInHeritageClause(node.parent) : ts2.isExpressionWithTypeArguments(node) ? ts2.tryCast(node.parent.parent, ts2.isClassLike) : void 0;
        }
        function isImplementationExpression(node) {
          switch (node.kind) {
            case 211:
              return isImplementationExpression(node.expression);
            case 213:
            case 212:
            case 204:
            case 225:
            case 203:
              return true;
            default:
              return false;
          }
        }
        function explicitlyInheritsFrom(symbol, parent, cachedResults, checker) {
          if (symbol === parent) {
            return true;
          }
          var key = ts2.getSymbolId(symbol) + "," + ts2.getSymbolId(parent);
          var cached = cachedResults.get(key);
          if (cached !== void 0) {
            return cached;
          }
          cachedResults.set(key, false);
          var inherits = !!symbol.declarations && symbol.declarations.some(function(declaration) {
            return ts2.getAllSuperTypeNodes(declaration).some(function(typeReference) {
              var type = checker.getTypeAtLocation(typeReference);
              return !!type && !!type.symbol && explicitlyInheritsFrom(type.symbol, parent, cachedResults, checker);
            });
          });
          cachedResults.set(key, inherits);
          return inherits;
        }
        function getReferencesForSuperKeyword(superKeyword) {
          var searchSpaceNode = ts2.getSuperContainer(superKeyword, false);
          if (!searchSpaceNode) {
            return void 0;
          }
          var staticFlag = 32;
          switch (searchSpaceNode.kind) {
            case 166:
            case 165:
            case 168:
            case 167:
            case 170:
            case 171:
            case 172:
              staticFlag &= ts2.getSyntacticModifierFlags(searchSpaceNode);
              searchSpaceNode = searchSpaceNode.parent;
              break;
            default:
              return void 0;
          }
          var sourceFile = searchSpaceNode.getSourceFile();
          var references = ts2.mapDefined(getPossibleSymbolReferenceNodes(sourceFile, "super", searchSpaceNode), function(node) {
            if (node.kind !== 106) {
              return;
            }
            var container = ts2.getSuperContainer(node, false);
            return container && ts2.isStatic(container) === !!staticFlag && container.parent.symbol === searchSpaceNode.symbol ? nodeEntry(node) : void 0;
          });
          return [{ definition: { type: 0, symbol: searchSpaceNode.symbol }, references }];
        }
        function isParameterName(node) {
          return node.kind === 79 && node.parent.kind === 163 && node.parent.name === node;
        }
        function getReferencesForThisKeyword(thisOrSuperKeyword, sourceFiles, cancellationToken) {
          var searchSpaceNode = ts2.getThisContainer(thisOrSuperKeyword, false);
          var staticFlag = 32;
          switch (searchSpaceNode.kind) {
            case 168:
            case 167:
              if (ts2.isObjectLiteralMethod(searchSpaceNode)) {
                staticFlag &= ts2.getSyntacticModifierFlags(searchSpaceNode);
                searchSpaceNode = searchSpaceNode.parent;
                break;
              }
            case 166:
            case 165:
            case 170:
            case 171:
            case 172:
              staticFlag &= ts2.getSyntacticModifierFlags(searchSpaceNode);
              searchSpaceNode = searchSpaceNode.parent;
              break;
            case 303:
              if (ts2.isExternalModule(searchSpaceNode) || isParameterName(thisOrSuperKeyword)) {
                return void 0;
              }
            case 255:
            case 212:
              break;
            default:
              return void 0;
          }
          var references = ts2.flatMap(searchSpaceNode.kind === 303 ? sourceFiles : [searchSpaceNode.getSourceFile()], function(sourceFile) {
            cancellationToken.throwIfCancellationRequested();
            return getPossibleSymbolReferenceNodes(sourceFile, "this", ts2.isSourceFile(searchSpaceNode) ? sourceFile : searchSpaceNode).filter(function(node) {
              if (!ts2.isThis(node)) {
                return false;
              }
              var container = ts2.getThisContainer(node, false);
              switch (searchSpaceNode.kind) {
                case 212:
                case 255:
                  return searchSpaceNode.symbol === container.symbol;
                case 168:
                case 167:
                  return ts2.isObjectLiteralMethod(searchSpaceNode) && searchSpaceNode.symbol === container.symbol;
                case 225:
                case 256:
                case 204:
                  return container.parent && searchSpaceNode.symbol === container.parent.symbol && ts2.isStatic(container) === !!staticFlag;
                case 303:
                  return container.kind === 303 && !ts2.isExternalModule(container) && !isParameterName(node);
              }
            });
          }).map(function(n) {
            return nodeEntry(n);
          });
          var thisParameter = ts2.firstDefined(references, function(r) {
            return ts2.isParameter(r.node.parent) ? r.node : void 0;
          });
          return [{
            definition: { type: 3, node: thisParameter || thisOrSuperKeyword },
            references
          }];
        }
        function getReferencesForStringLiteral(node, sourceFiles, checker, cancellationToken) {
          var type = ts2.getContextualTypeFromParentOrAncestorTypeNode(node, checker);
          var references = ts2.flatMap(sourceFiles, function(sourceFile) {
            cancellationToken.throwIfCancellationRequested();
            return ts2.mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), function(ref) {
              if (ts2.isStringLiteralLike(ref) && ref.text === node.text) {
                if (type) {
                  var refType = ts2.getContextualTypeFromParentOrAncestorTypeNode(ref, checker);
                  if (type !== checker.getStringType() && type === refType) {
                    return nodeEntry(ref, 2);
                  }
                } else {
                  return nodeEntry(ref, 2);
                }
              }
            });
          });
          return [{
            definition: { type: 4, node },
            references
          }];
        }
        function populateSearchSymbolSet(symbol, location, checker, isForRename, providePrefixAndSuffixText, implementations) {
          var result = [];
          forEachRelatedSymbol(symbol, location, checker, isForRename, !(isForRename && providePrefixAndSuffixText), function(sym, root, base) {
            if (base) {
              if (isStaticSymbol(symbol) !== isStaticSymbol(base)) {
                base = void 0;
              }
            }
            result.push(base || root || sym);
          }, function() {
            return !implementations;
          });
          return result;
        }
        function forEachRelatedSymbol(symbol, location, checker, isForRenamePopulateSearchSymbolSet, onlyIncludeBindingElementAtReferenceLocation, cbSymbol, allowBaseTypes) {
          var containingObjectLiteralElement = ts2.getContainingObjectLiteralElement(location);
          if (containingObjectLiteralElement) {
            var shorthandValueSymbol = checker.getShorthandAssignmentValueSymbol(location.parent);
            if (shorthandValueSymbol && isForRenamePopulateSearchSymbolSet) {
              return cbSymbol(shorthandValueSymbol, void 0, void 0, 3);
            }
            var contextualType = checker.getContextualType(containingObjectLiteralElement.parent);
            var res_1 = contextualType && ts2.firstDefined(ts2.getPropertySymbolsFromContextualType(containingObjectLiteralElement, checker, contextualType, true), function(sym) {
              return fromRoot(sym, 4);
            });
            if (res_1)
              return res_1;
            var propertySymbol = getPropertySymbolOfDestructuringAssignment(location, checker);
            var res1 = propertySymbol && cbSymbol(propertySymbol, void 0, void 0, 4);
            if (res1)
              return res1;
            var res2 = shorthandValueSymbol && cbSymbol(shorthandValueSymbol, void 0, void 0, 3);
            if (res2)
              return res2;
          }
          var aliasedSymbol = getMergedAliasedSymbolOfNamespaceExportDeclaration(location, symbol, checker);
          if (aliasedSymbol) {
            var res_2 = cbSymbol(aliasedSymbol, void 0, void 0, 1);
            if (res_2)
              return res_2;
          }
          var res = fromRoot(symbol);
          if (res)
            return res;
          if (symbol.valueDeclaration && ts2.isParameterPropertyDeclaration(symbol.valueDeclaration, symbol.valueDeclaration.parent)) {
            var paramProps = checker.getSymbolsOfParameterPropertyDeclaration(ts2.cast(symbol.valueDeclaration, ts2.isParameter), symbol.name);
            ts2.Debug.assert(paramProps.length === 2 && !!(paramProps[0].flags & 1) && !!(paramProps[1].flags & 4));
            return fromRoot(symbol.flags & 1 ? paramProps[1] : paramProps[0]);
          }
          var exportSpecifier = ts2.getDeclarationOfKind(symbol, 274);
          if (!isForRenamePopulateSearchSymbolSet || exportSpecifier && !exportSpecifier.propertyName) {
            var localSymbol = exportSpecifier && checker.getExportSpecifierLocalTargetSymbol(exportSpecifier);
            if (localSymbol) {
              var res_3 = cbSymbol(localSymbol, void 0, void 0, 1);
              if (res_3)
                return res_3;
            }
          }
          if (!isForRenamePopulateSearchSymbolSet) {
            var bindingElementPropertySymbol = void 0;
            if (onlyIncludeBindingElementAtReferenceLocation) {
              bindingElementPropertySymbol = ts2.isObjectBindingElementWithoutPropertyName(location.parent) ? ts2.getPropertySymbolFromBindingElement(checker, location.parent) : void 0;
            } else {
              bindingElementPropertySymbol = getPropertySymbolOfObjectBindingPatternWithoutPropertyName(symbol, checker);
            }
            return bindingElementPropertySymbol && fromRoot(bindingElementPropertySymbol, 4);
          }
          ts2.Debug.assert(isForRenamePopulateSearchSymbolSet);
          var includeOriginalSymbolOfBindingElement = onlyIncludeBindingElementAtReferenceLocation;
          if (includeOriginalSymbolOfBindingElement) {
            var bindingElementPropertySymbol = getPropertySymbolOfObjectBindingPatternWithoutPropertyName(symbol, checker);
            return bindingElementPropertySymbol && fromRoot(bindingElementPropertySymbol, 4);
          }
          function fromRoot(sym, kind) {
            return ts2.firstDefined(checker.getRootSymbols(sym), function(rootSymbol) {
              return cbSymbol(sym, rootSymbol, void 0, kind) || (rootSymbol.parent && rootSymbol.parent.flags & (32 | 64) && allowBaseTypes(rootSymbol) ? getPropertySymbolsFromBaseTypes(rootSymbol.parent, rootSymbol.name, checker, function(base) {
                return cbSymbol(sym, rootSymbol, base, kind);
              }) : void 0);
            });
          }
          function getPropertySymbolOfObjectBindingPatternWithoutPropertyName(symbol2, checker2) {
            var bindingElement = ts2.getDeclarationOfKind(symbol2, 202);
            if (bindingElement && ts2.isObjectBindingElementWithoutPropertyName(bindingElement)) {
              return ts2.getPropertySymbolFromBindingElement(checker2, bindingElement);
            }
          }
        }
        function getPropertySymbolsFromBaseTypes(symbol, propertyName, checker, cb) {
          var seen = new ts2.Map();
          return recur(symbol);
          function recur(symbol2) {
            if (!(symbol2.flags & (32 | 64)) || !ts2.addToSeen(seen, ts2.getSymbolId(symbol2)))
              return;
            return ts2.firstDefined(symbol2.declarations, function(declaration) {
              return ts2.firstDefined(ts2.getAllSuperTypeNodes(declaration), function(typeReference) {
                var type = checker.getTypeAtLocation(typeReference);
                var propertySymbol = type && type.symbol && checker.getPropertyOfType(type, propertyName);
                return type && propertySymbol && (ts2.firstDefined(checker.getRootSymbols(propertySymbol), cb) || recur(type.symbol));
              });
            });
          }
        }
        function isStaticSymbol(symbol) {
          if (!symbol.valueDeclaration)
            return false;
          var modifierFlags = ts2.getEffectiveModifierFlags(symbol.valueDeclaration);
          return !!(modifierFlags & 32);
        }
        function getRelatedSymbol(search, referenceSymbol, referenceLocation, state) {
          var checker = state.checker;
          return forEachRelatedSymbol(referenceSymbol, referenceLocation, checker, false, state.options.use !== 2 || !!state.options.providePrefixAndSuffixTextForRename, function(sym, rootSymbol, baseSymbol, kind) {
            if (baseSymbol) {
              if (isStaticSymbol(referenceSymbol) !== isStaticSymbol(baseSymbol)) {
                baseSymbol = void 0;
              }
            }
            return search.includes(baseSymbol || rootSymbol || sym) ? { symbol: rootSymbol && !(ts2.getCheckFlags(sym) & 6) ? rootSymbol : sym, kind } : void 0;
          }, function(rootSymbol) {
            return !(search.parents && !search.parents.some(function(parent) {
              return explicitlyInheritsFrom(rootSymbol.parent, parent, state.inheritsFromCache, checker);
            }));
          });
        }
        function getIntersectingMeaningFromDeclarations(node, symbol) {
          var meaning = ts2.getMeaningFromLocation(node);
          var declarations = symbol.declarations;
          if (declarations) {
            var lastIterationMeaning = void 0;
            do {
              lastIterationMeaning = meaning;
              for (var _i = 0, declarations_2 = declarations; _i < declarations_2.length; _i++) {
                var declaration = declarations_2[_i];
                var declarationMeaning = ts2.getMeaningFromDeclaration(declaration);
                if (declarationMeaning & meaning) {
                  meaning |= declarationMeaning;
                }
              }
            } while (meaning !== lastIterationMeaning);
          }
          return meaning;
        }
        Core2.getIntersectingMeaningFromDeclarations = getIntersectingMeaningFromDeclarations;
        function isImplementation(node) {
          return !!(node.flags & 8388608) ? !(ts2.isInterfaceDeclaration(node) || ts2.isTypeAliasDeclaration(node)) : ts2.isVariableLike(node) ? ts2.hasInitializer(node) : ts2.isFunctionLikeDeclaration(node) ? !!node.body : ts2.isClassLike(node) || ts2.isModuleOrEnumDeclaration(node);
        }
        function getReferenceEntriesForShorthandPropertyAssignment(node, checker, addReference2) {
          var refSymbol = checker.getSymbolAtLocation(node);
          var shorthandSymbol = checker.getShorthandAssignmentValueSymbol(refSymbol.valueDeclaration);
          if (shorthandSymbol) {
            for (var _i = 0, _a = shorthandSymbol.getDeclarations(); _i < _a.length; _i++) {
              var declaration = _a[_i];
              if (ts2.getMeaningFromDeclaration(declaration) & 1) {
                addReference2(declaration);
              }
            }
          }
        }
        Core2.getReferenceEntriesForShorthandPropertyAssignment = getReferenceEntriesForShorthandPropertyAssignment;
        function forEachDescendantOfKind(node, kind, action) {
          ts2.forEachChild(node, function(child) {
            if (child.kind === kind) {
              action(child);
            }
            forEachDescendantOfKind(child, kind, action);
          });
        }
        function tryGetClassByExtendingIdentifier(node) {
          return ts2.tryGetClassExtendingExpressionWithTypeArguments(ts2.climbPastPropertyAccess(node).parent);
        }
        function getParentSymbolsOfPropertyAccess(location, symbol, checker) {
          var propertyAccessExpression = ts2.isRightSideOfPropertyAccess(location) ? location.parent : void 0;
          var lhsType = propertyAccessExpression && checker.getTypeAtLocation(propertyAccessExpression.expression);
          var res = ts2.mapDefined(lhsType && (lhsType.isUnionOrIntersection() ? lhsType.types : lhsType.symbol === symbol.parent ? void 0 : [lhsType]), function(t) {
            return t.symbol && t.symbol.flags & (32 | 64) ? t.symbol : void 0;
          });
          return res.length === 0 ? void 0 : res;
        }
        function isForRenameWithPrefixAndSuffixText(options) {
          return options.use === 2 && options.providePrefixAndSuffixTextForRename;
        }
      })(Core = FindAllReferences2.Core || (FindAllReferences2.Core = {}));
    })(FindAllReferences = ts2.FindAllReferences || (ts2.FindAllReferences = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var CallHierarchy;
    (function(CallHierarchy2) {
      function isNamedExpression(node) {
        return (ts2.isFunctionExpression(node) || ts2.isClassExpression(node)) && ts2.isNamedDeclaration(node);
      }
      function isConstNamedExpression(node) {
        return (ts2.isFunctionExpression(node) || ts2.isArrowFunction(node) || ts2.isClassExpression(node)) && ts2.isVariableDeclaration(node.parent) && node === node.parent.initializer && ts2.isIdentifier(node.parent.name) && !!(ts2.getCombinedNodeFlags(node.parent) & 2);
      }
      function isPossibleCallHierarchyDeclaration(node) {
        return ts2.isSourceFile(node) || ts2.isModuleDeclaration(node) || ts2.isFunctionDeclaration(node) || ts2.isFunctionExpression(node) || ts2.isClassDeclaration(node) || ts2.isClassExpression(node) || ts2.isClassStaticBlockDeclaration(node) || ts2.isMethodDeclaration(node) || ts2.isMethodSignature(node) || ts2.isGetAccessorDeclaration(node) || ts2.isSetAccessorDeclaration(node);
      }
      function isValidCallHierarchyDeclaration(node) {
        return ts2.isSourceFile(node) || ts2.isModuleDeclaration(node) && ts2.isIdentifier(node.name) || ts2.isFunctionDeclaration(node) || ts2.isClassDeclaration(node) || ts2.isClassStaticBlockDeclaration(node) || ts2.isMethodDeclaration(node) || ts2.isMethodSignature(node) || ts2.isGetAccessorDeclaration(node) || ts2.isSetAccessorDeclaration(node) || isNamedExpression(node) || isConstNamedExpression(node);
      }
      function getCallHierarchyDeclarationReferenceNode(node) {
        if (ts2.isSourceFile(node))
          return node;
        if (ts2.isNamedDeclaration(node))
          return node.name;
        if (isConstNamedExpression(node))
          return node.parent.name;
        return ts2.Debug.checkDefined(node.modifiers && ts2.find(node.modifiers, isDefaultModifier));
      }
      function isDefaultModifier(node) {
        return node.kind === 88;
      }
      function getSymbolOfCallHierarchyDeclaration(typeChecker, node) {
        var location = getCallHierarchyDeclarationReferenceNode(node);
        return location && typeChecker.getSymbolAtLocation(location);
      }
      function getCallHierarchyItemName(program, node) {
        if (ts2.isSourceFile(node)) {
          return { text: node.fileName, pos: 0, end: 0 };
        }
        if ((ts2.isFunctionDeclaration(node) || ts2.isClassDeclaration(node)) && !ts2.isNamedDeclaration(node)) {
          var defaultModifier = node.modifiers && ts2.find(node.modifiers, isDefaultModifier);
          if (defaultModifier) {
            return { text: "default", pos: defaultModifier.getStart(), end: defaultModifier.getEnd() };
          }
        }
        if (ts2.isClassStaticBlockDeclaration(node)) {
          var sourceFile = node.getSourceFile();
          var pos = ts2.skipTrivia(sourceFile.text, ts2.moveRangePastModifiers(node).pos);
          var end = pos + 6;
          var typeChecker = program.getTypeChecker();
          var symbol = typeChecker.getSymbolAtLocation(node.parent);
          var prefix = symbol ? "".concat(typeChecker.symbolToString(symbol, node.parent), " ") : "";
          return { text: "".concat(prefix, "static {}"), pos, end };
        }
        var declName = isConstNamedExpression(node) ? node.parent.name : ts2.Debug.checkDefined(ts2.getNameOfDeclaration(node), "Expected call hierarchy item to have a name");
        var text = ts2.isIdentifier(declName) ? ts2.idText(declName) : ts2.isStringOrNumericLiteralLike(declName) ? declName.text : ts2.isComputedPropertyName(declName) ? ts2.isStringOrNumericLiteralLike(declName.expression) ? declName.expression.text : void 0 : void 0;
        if (text === void 0) {
          var typeChecker = program.getTypeChecker();
          var symbol = typeChecker.getSymbolAtLocation(declName);
          if (symbol) {
            text = typeChecker.symbolToString(symbol, node);
          }
        }
        if (text === void 0) {
          var printer_1 = ts2.createPrinter({ removeComments: true, omitTrailingSemicolon: true });
          text = ts2.usingSingleLineStringWriter(function(writer) {
            return printer_1.writeNode(4, node, node.getSourceFile(), writer);
          });
        }
        return { text, pos: declName.getStart(), end: declName.getEnd() };
      }
      function getCallHierarchItemContainerName(node) {
        var _a, _b;
        if (isConstNamedExpression(node)) {
          if (ts2.isModuleBlock(node.parent.parent.parent.parent) && ts2.isIdentifier(node.parent.parent.parent.parent.parent.name)) {
            return node.parent.parent.parent.parent.parent.name.getText();
          }
          return;
        }
        switch (node.kind) {
          case 171:
          case 172:
          case 168:
            if (node.parent.kind === 204) {
              return (_a = ts2.getAssignedName(node.parent)) === null || _a === void 0 ? void 0 : _a.getText();
            }
            return (_b = ts2.getNameOfDeclaration(node.parent)) === null || _b === void 0 ? void 0 : _b.getText();
          case 255:
          case 256:
          case 260:
            if (ts2.isModuleBlock(node.parent) && ts2.isIdentifier(node.parent.parent.name)) {
              return node.parent.parent.name.getText();
            }
        }
      }
      function findImplementation(typeChecker, node) {
        if (node.body) {
          return node;
        }
        if (ts2.isConstructorDeclaration(node)) {
          return ts2.getFirstConstructorWithBody(node.parent);
        }
        if (ts2.isFunctionDeclaration(node) || ts2.isMethodDeclaration(node)) {
          var symbol = getSymbolOfCallHierarchyDeclaration(typeChecker, node);
          if (symbol && symbol.valueDeclaration && ts2.isFunctionLikeDeclaration(symbol.valueDeclaration) && symbol.valueDeclaration.body) {
            return symbol.valueDeclaration;
          }
          return void 0;
        }
        return node;
      }
      function findAllInitialDeclarations(typeChecker, node) {
        var symbol = getSymbolOfCallHierarchyDeclaration(typeChecker, node);
        var declarations;
        if (symbol && symbol.declarations) {
          var indices = ts2.indicesOf(symbol.declarations);
          var keys_1 = ts2.map(symbol.declarations, function(decl2) {
            return { file: decl2.getSourceFile().fileName, pos: decl2.pos };
          });
          indices.sort(function(a, b) {
            return ts2.compareStringsCaseSensitive(keys_1[a].file, keys_1[b].file) || keys_1[a].pos - keys_1[b].pos;
          });
          var sortedDeclarations = ts2.map(indices, function(i) {
            return symbol.declarations[i];
          });
          var lastDecl = void 0;
          for (var _i = 0, sortedDeclarations_1 = sortedDeclarations; _i < sortedDeclarations_1.length; _i++) {
            var decl = sortedDeclarations_1[_i];
            if (isValidCallHierarchyDeclaration(decl)) {
              if (!lastDecl || lastDecl.parent !== decl.parent || lastDecl.end !== decl.pos) {
                declarations = ts2.append(declarations, decl);
              }
              lastDecl = decl;
            }
          }
        }
        return declarations;
      }
      function findImplementationOrAllInitialDeclarations(typeChecker, node) {
        var _a, _b, _c;
        if (ts2.isClassStaticBlockDeclaration(node)) {
          return node;
        }
        if (ts2.isFunctionLikeDeclaration(node)) {
          return (_b = (_a = findImplementation(typeChecker, node)) !== null && _a !== void 0 ? _a : findAllInitialDeclarations(typeChecker, node)) !== null && _b !== void 0 ? _b : node;
        }
        return (_c = findAllInitialDeclarations(typeChecker, node)) !== null && _c !== void 0 ? _c : node;
      }
      function resolveCallHierarchyDeclaration(program, location) {
        var typeChecker = program.getTypeChecker();
        var followingSymbol = false;
        while (true) {
          if (isValidCallHierarchyDeclaration(location)) {
            return findImplementationOrAllInitialDeclarations(typeChecker, location);
          }
          if (isPossibleCallHierarchyDeclaration(location)) {
            var ancestor = ts2.findAncestor(location, isValidCallHierarchyDeclaration);
            return ancestor && findImplementationOrAllInitialDeclarations(typeChecker, ancestor);
          }
          if (ts2.isDeclarationName(location)) {
            if (isValidCallHierarchyDeclaration(location.parent)) {
              return findImplementationOrAllInitialDeclarations(typeChecker, location.parent);
            }
            if (isPossibleCallHierarchyDeclaration(location.parent)) {
              var ancestor = ts2.findAncestor(location.parent, isValidCallHierarchyDeclaration);
              return ancestor && findImplementationOrAllInitialDeclarations(typeChecker, ancestor);
            }
            if (ts2.isVariableDeclaration(location.parent) && location.parent.initializer && isConstNamedExpression(location.parent.initializer)) {
              return location.parent.initializer;
            }
            return void 0;
          }
          if (ts2.isConstructorDeclaration(location)) {
            if (isValidCallHierarchyDeclaration(location.parent)) {
              return location.parent;
            }
            return void 0;
          }
          if (location.kind === 124 && ts2.isClassStaticBlockDeclaration(location.parent)) {
            location = location.parent;
            continue;
          }
          if (ts2.isVariableDeclaration(location) && location.initializer && isConstNamedExpression(location.initializer)) {
            return location.initializer;
          }
          if (!followingSymbol) {
            var symbol = typeChecker.getSymbolAtLocation(location);
            if (symbol) {
              if (symbol.flags & 2097152) {
                symbol = typeChecker.getAliasedSymbol(symbol);
              }
              if (symbol.valueDeclaration) {
                followingSymbol = true;
                location = symbol.valueDeclaration;
                continue;
              }
            }
          }
          return void 0;
        }
      }
      CallHierarchy2.resolveCallHierarchyDeclaration = resolveCallHierarchyDeclaration;
      function createCallHierarchyItem(program, node) {
        var sourceFile = node.getSourceFile();
        var name = getCallHierarchyItemName(program, node);
        var containerName = getCallHierarchItemContainerName(node);
        var kind = ts2.getNodeKind(node);
        var kindModifiers = ts2.getNodeModifiers(node);
        var span = ts2.createTextSpanFromBounds(ts2.skipTrivia(sourceFile.text, node.getFullStart(), false, true), node.getEnd());
        var selectionSpan = ts2.createTextSpanFromBounds(name.pos, name.end);
        return { file: sourceFile.fileName, kind, kindModifiers, name: name.text, containerName, span, selectionSpan };
      }
      CallHierarchy2.createCallHierarchyItem = createCallHierarchyItem;
      function isDefined(x) {
        return x !== void 0;
      }
      function convertEntryToCallSite(entry) {
        if (entry.kind === 1) {
          var node = entry.node;
          if (ts2.isCallOrNewExpressionTarget(node, true, true) || ts2.isTaggedTemplateTag(node, true, true) || ts2.isDecoratorTarget(node, true, true) || ts2.isJsxOpeningLikeElementTagName(node, true, true) || ts2.isRightSideOfPropertyAccess(node) || ts2.isArgumentExpressionOfElementAccess(node)) {
            var sourceFile = node.getSourceFile();
            var ancestor = ts2.findAncestor(node, isValidCallHierarchyDeclaration) || sourceFile;
            return { declaration: ancestor, range: ts2.createTextRangeFromNode(node, sourceFile) };
          }
        }
      }
      function getCallSiteGroupKey(entry) {
        return ts2.getNodeId(entry.declaration);
      }
      function createCallHierarchyIncomingCall(from, fromSpans) {
        return { from, fromSpans };
      }
      function convertCallSiteGroupToIncomingCall(program, entries) {
        return createCallHierarchyIncomingCall(createCallHierarchyItem(program, entries[0].declaration), ts2.map(entries, function(entry) {
          return ts2.createTextSpanFromRange(entry.range);
        }));
      }
      function getIncomingCalls(program, declaration, cancellationToken) {
        if (ts2.isSourceFile(declaration) || ts2.isModuleDeclaration(declaration) || ts2.isClassStaticBlockDeclaration(declaration)) {
          return [];
        }
        var location = getCallHierarchyDeclarationReferenceNode(declaration);
        var calls = ts2.filter(ts2.FindAllReferences.findReferenceOrRenameEntries(program, cancellationToken, program.getSourceFiles(), location, 0, { use: 1 }, convertEntryToCallSite), isDefined);
        return calls ? ts2.group(calls, getCallSiteGroupKey, function(entries) {
          return convertCallSiteGroupToIncomingCall(program, entries);
        }) : [];
      }
      CallHierarchy2.getIncomingCalls = getIncomingCalls;
      function createCallSiteCollector(program, callSites) {
        function recordCallSite(node) {
          var target = ts2.isTaggedTemplateExpression(node) ? node.tag : ts2.isJsxOpeningLikeElement(node) ? node.tagName : ts2.isAccessExpression(node) ? node : ts2.isClassStaticBlockDeclaration(node) ? node : node.expression;
          var declaration = resolveCallHierarchyDeclaration(program, target);
          if (declaration) {
            var range = ts2.createTextRangeFromNode(target, node.getSourceFile());
            if (ts2.isArray(declaration)) {
              for (var _i = 0, declaration_1 = declaration; _i < declaration_1.length; _i++) {
                var decl = declaration_1[_i];
                callSites.push({ declaration: decl, range });
              }
            } else {
              callSites.push({ declaration, range });
            }
          }
        }
        function collect(node) {
          if (!node)
            return;
          if (node.flags & 8388608) {
            return;
          }
          if (isValidCallHierarchyDeclaration(node)) {
            if (ts2.isClassLike(node)) {
              for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
                var member = _a[_i];
                if (member.name && ts2.isComputedPropertyName(member.name)) {
                  collect(member.name.expression);
                }
              }
            }
            return;
          }
          switch (node.kind) {
            case 79:
            case 264:
            case 265:
            case 271:
            case 257:
            case 258:
              return;
            case 169:
              recordCallSite(node);
              return;
            case 210:
            case 228:
              collect(node.expression);
              return;
            case 253:
            case 163:
              collect(node.name);
              collect(node.initializer);
              return;
            case 207:
              recordCallSite(node);
              collect(node.expression);
              ts2.forEach(node.arguments, collect);
              return;
            case 208:
              recordCallSite(node);
              collect(node.expression);
              ts2.forEach(node.arguments, collect);
              return;
            case 209:
              recordCallSite(node);
              collect(node.tag);
              collect(node.template);
              return;
            case 279:
            case 278:
              recordCallSite(node);
              collect(node.tagName);
              collect(node.attributes);
              return;
            case 164:
              recordCallSite(node);
              collect(node.expression);
              return;
            case 205:
            case 206:
              recordCallSite(node);
              ts2.forEachChild(node, collect);
              break;
          }
          if (ts2.isPartOfTypeNode(node)) {
            return;
          }
          ts2.forEachChild(node, collect);
        }
        return collect;
      }
      function collectCallSitesOfSourceFile(node, collect) {
        ts2.forEach(node.statements, collect);
      }
      function collectCallSitesOfModuleDeclaration(node, collect) {
        if (!ts2.hasSyntacticModifier(node, 2) && node.body && ts2.isModuleBlock(node.body)) {
          ts2.forEach(node.body.statements, collect);
        }
      }
      function collectCallSitesOfFunctionLikeDeclaration(typeChecker, node, collect) {
        var implementation = findImplementation(typeChecker, node);
        if (implementation) {
          ts2.forEach(implementation.parameters, collect);
          collect(implementation.body);
        }
      }
      function collectCallSitesOfClassStaticBlockDeclaration(node, collect) {
        collect(node.body);
      }
      function collectCallSitesOfClassLikeDeclaration(node, collect) {
        ts2.forEach(node.decorators, collect);
        var heritage = ts2.getClassExtendsHeritageElement(node);
        if (heritage) {
          collect(heritage.expression);
        }
        for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
          var member = _a[_i];
          ts2.forEach(member.decorators, collect);
          if (ts2.isPropertyDeclaration(member)) {
            collect(member.initializer);
          } else if (ts2.isConstructorDeclaration(member) && member.body) {
            ts2.forEach(member.parameters, collect);
            collect(member.body);
          } else if (ts2.isClassStaticBlockDeclaration(member)) {
            collect(member);
          }
        }
      }
      function collectCallSites(program, node) {
        var callSites = [];
        var collect = createCallSiteCollector(program, callSites);
        switch (node.kind) {
          case 303:
            collectCallSitesOfSourceFile(node, collect);
            break;
          case 260:
            collectCallSitesOfModuleDeclaration(node, collect);
            break;
          case 255:
          case 212:
          case 213:
          case 168:
          case 171:
          case 172:
            collectCallSitesOfFunctionLikeDeclaration(program.getTypeChecker(), node, collect);
            break;
          case 256:
          case 225:
            collectCallSitesOfClassLikeDeclaration(node, collect);
            break;
          case 169:
            collectCallSitesOfClassStaticBlockDeclaration(node, collect);
            break;
          default:
            ts2.Debug.assertNever(node);
        }
        return callSites;
      }
      function createCallHierarchyOutgoingCall(to, fromSpans) {
        return { to, fromSpans };
      }
      function convertCallSiteGroupToOutgoingCall(program, entries) {
        return createCallHierarchyOutgoingCall(createCallHierarchyItem(program, entries[0].declaration), ts2.map(entries, function(entry) {
          return ts2.createTextSpanFromRange(entry.range);
        }));
      }
      function getOutgoingCalls(program, declaration) {
        if (declaration.flags & 8388608 || ts2.isMethodSignature(declaration)) {
          return [];
        }
        return ts2.group(collectCallSites(program, declaration), getCallSiteGroupKey, function(entries) {
          return convertCallSiteGroupToOutgoingCall(program, entries);
        });
      }
      CallHierarchy2.getOutgoingCalls = getOutgoingCalls;
    })(CallHierarchy = ts2.CallHierarchy || (ts2.CallHierarchy = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    function getEditsForFileRename(program, oldFileOrDirPath, newFileOrDirPath, host, formatContext, preferences, sourceMapper) {
      var useCaseSensitiveFileNames = ts2.hostUsesCaseSensitiveFileNames(host);
      var getCanonicalFileName = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      var oldToNew = getPathUpdater(oldFileOrDirPath, newFileOrDirPath, getCanonicalFileName, sourceMapper);
      var newToOld = getPathUpdater(newFileOrDirPath, oldFileOrDirPath, getCanonicalFileName, sourceMapper);
      return ts2.textChanges.ChangeTracker.with({ host, formatContext, preferences }, function(changeTracker) {
        updateTsconfigFiles(program, changeTracker, oldToNew, oldFileOrDirPath, newFileOrDirPath, host.getCurrentDirectory(), useCaseSensitiveFileNames);
        updateImports(program, changeTracker, oldToNew, newToOld, host, getCanonicalFileName);
      });
    }
    ts2.getEditsForFileRename = getEditsForFileRename;
    function getPathUpdater(oldFileOrDirPath, newFileOrDirPath, getCanonicalFileName, sourceMapper) {
      var canonicalOldPath = getCanonicalFileName(oldFileOrDirPath);
      return function(path) {
        var originalPath = sourceMapper && sourceMapper.tryGetSourcePosition({ fileName: path, pos: 0 });
        var updatedPath = getUpdatedPath(originalPath ? originalPath.fileName : path);
        return originalPath ? updatedPath === void 0 ? void 0 : makeCorrespondingRelativeChange(originalPath.fileName, updatedPath, path, getCanonicalFileName) : updatedPath;
      };
      function getUpdatedPath(pathToUpdate) {
        if (getCanonicalFileName(pathToUpdate) === canonicalOldPath)
          return newFileOrDirPath;
        var suffix = ts2.tryRemoveDirectoryPrefix(pathToUpdate, canonicalOldPath, getCanonicalFileName);
        return suffix === void 0 ? void 0 : newFileOrDirPath + "/" + suffix;
      }
    }
    ts2.getPathUpdater = getPathUpdater;
    function makeCorrespondingRelativeChange(a0, b0, a1, getCanonicalFileName) {
      var rel = ts2.getRelativePathFromFile(a0, b0, getCanonicalFileName);
      return combinePathsSafe(ts2.getDirectoryPath(a1), rel);
    }
    function updateTsconfigFiles(program, changeTracker, oldToNew, oldFileOrDirPath, newFileOrDirPath, currentDirectory, useCaseSensitiveFileNames) {
      var configFile = program.getCompilerOptions().configFile;
      if (!configFile)
        return;
      var configDir = ts2.getDirectoryPath(configFile.fileName);
      var jsonObjectLiteral = ts2.getTsConfigObjectLiteralExpression(configFile);
      if (!jsonObjectLiteral)
        return;
      forEachProperty(jsonObjectLiteral, function(property, propertyName) {
        switch (propertyName) {
          case "files":
          case "include":
          case "exclude": {
            var foundExactMatch = updatePaths(property);
            if (foundExactMatch || propertyName !== "include" || !ts2.isArrayLiteralExpression(property.initializer))
              return;
            var includes = ts2.mapDefined(property.initializer.elements, function(e) {
              return ts2.isStringLiteral(e) ? e.text : void 0;
            });
            if (includes.length === 0)
              return;
            var matchers = ts2.getFileMatcherPatterns(configDir, [], includes, useCaseSensitiveFileNames, currentDirectory);
            if (ts2.getRegexFromPattern(ts2.Debug.checkDefined(matchers.includeFilePattern), useCaseSensitiveFileNames).test(oldFileOrDirPath) && !ts2.getRegexFromPattern(ts2.Debug.checkDefined(matchers.includeFilePattern), useCaseSensitiveFileNames).test(newFileOrDirPath)) {
              changeTracker.insertNodeAfter(configFile, ts2.last(property.initializer.elements), ts2.factory.createStringLiteral(relativePath(newFileOrDirPath)));
            }
            return;
          }
          case "compilerOptions":
            forEachProperty(property.initializer, function(property2, propertyName2) {
              var option = ts2.getOptionFromName(propertyName2);
              if (option && (option.isFilePath || option.type === "list" && option.element.isFilePath)) {
                updatePaths(property2);
              } else if (propertyName2 === "paths") {
                forEachProperty(property2.initializer, function(pathsProperty) {
                  if (!ts2.isArrayLiteralExpression(pathsProperty.initializer))
                    return;
                  for (var _i = 0, _a = pathsProperty.initializer.elements; _i < _a.length; _i++) {
                    var e = _a[_i];
                    tryUpdateString(e);
                  }
                });
              }
            });
            return;
        }
      });
      function updatePaths(property) {
        var elements = ts2.isArrayLiteralExpression(property.initializer) ? property.initializer.elements : [property.initializer];
        var foundExactMatch = false;
        for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {
          var element = elements_1[_i];
          foundExactMatch = tryUpdateString(element) || foundExactMatch;
        }
        return foundExactMatch;
      }
      function tryUpdateString(element) {
        if (!ts2.isStringLiteral(element))
          return false;
        var elementFileName = combinePathsSafe(configDir, element.text);
        var updated = oldToNew(elementFileName);
        if (updated !== void 0) {
          changeTracker.replaceRangeWithText(configFile, createStringRange(element, configFile), relativePath(updated));
          return true;
        }
        return false;
      }
      function relativePath(path) {
        return ts2.getRelativePathFromDirectory(configDir, path, !useCaseSensitiveFileNames);
      }
    }
    function updateImports(program, changeTracker, oldToNew, newToOld, host, getCanonicalFileName) {
      var allFiles = program.getSourceFiles();
      var _loop_6 = function(sourceFile2) {
        var newFromOld = oldToNew(sourceFile2.fileName);
        var newImportFromPath = newFromOld !== null && newFromOld !== void 0 ? newFromOld : sourceFile2.fileName;
        var newImportFromDirectory = ts2.getDirectoryPath(newImportFromPath);
        var oldFromNew = newToOld(sourceFile2.fileName);
        var oldImportFromPath = oldFromNew || sourceFile2.fileName;
        var oldImportFromDirectory = ts2.getDirectoryPath(oldImportFromPath);
        var importingSourceFileMoved = newFromOld !== void 0 || oldFromNew !== void 0;
        updateImportsWorker(sourceFile2, changeTracker, function(referenceText) {
          if (!ts2.pathIsRelative(referenceText))
            return void 0;
          var oldAbsolute = combinePathsSafe(oldImportFromDirectory, referenceText);
          var newAbsolute = oldToNew(oldAbsolute);
          return newAbsolute === void 0 ? void 0 : ts2.ensurePathIsNonModuleName(ts2.getRelativePathFromDirectory(newImportFromDirectory, newAbsolute, getCanonicalFileName));
        }, function(importLiteral) {
          var importedModuleSymbol = program.getTypeChecker().getSymbolAtLocation(importLiteral);
          if ((importedModuleSymbol === null || importedModuleSymbol === void 0 ? void 0 : importedModuleSymbol.declarations) && importedModuleSymbol.declarations.some(function(d) {
            return ts2.isAmbientModule(d);
          }))
            return void 0;
          var toImport = oldFromNew !== void 0 ? getSourceFileToImportFromResolved(importLiteral, ts2.resolveModuleName(importLiteral.text, oldImportFromPath, program.getCompilerOptions(), host), oldToNew, allFiles) : getSourceFileToImport(importedModuleSymbol, importLiteral, sourceFile2, program, host, oldToNew);
          return toImport !== void 0 && (toImport.updated || importingSourceFileMoved && ts2.pathIsRelative(importLiteral.text)) ? ts2.moduleSpecifiers.updateModuleSpecifier(program.getCompilerOptions(), getCanonicalFileName(newImportFromPath), toImport.newFileName, ts2.createModuleSpecifierResolutionHost(program, host), importLiteral.text) : void 0;
        });
      };
      for (var _i = 0, allFiles_1 = allFiles; _i < allFiles_1.length; _i++) {
        var sourceFile = allFiles_1[_i];
        _loop_6(sourceFile);
      }
    }
    function combineNormal(pathA, pathB) {
      return ts2.normalizePath(ts2.combinePaths(pathA, pathB));
    }
    function combinePathsSafe(pathA, pathB) {
      return ts2.ensurePathIsNonModuleName(combineNormal(pathA, pathB));
    }
    function getSourceFileToImport(importedModuleSymbol, importLiteral, importingSourceFile, program, host, oldToNew) {
      if (importedModuleSymbol) {
        var oldFileName = ts2.find(importedModuleSymbol.declarations, ts2.isSourceFile).fileName;
        var newFileName = oldToNew(oldFileName);
        return newFileName === void 0 ? { newFileName: oldFileName, updated: false } : { newFileName, updated: true };
      } else {
        var mode = ts2.getModeForUsageLocation(importingSourceFile, importLiteral);
        var resolved = host.resolveModuleNames ? host.getResolvedModuleWithFailedLookupLocationsFromCache && host.getResolvedModuleWithFailedLookupLocationsFromCache(importLiteral.text, importingSourceFile.fileName, mode) : program.getResolvedModuleWithFailedLookupLocationsFromCache(importLiteral.text, importingSourceFile.fileName, mode);
        return getSourceFileToImportFromResolved(importLiteral, resolved, oldToNew, program.getSourceFiles());
      }
    }
    function getSourceFileToImportFromResolved(importLiteral, resolved, oldToNew, sourceFiles) {
      if (!resolved)
        return void 0;
      if (resolved.resolvedModule) {
        var result_3 = tryChange(resolved.resolvedModule.resolvedFileName);
        if (result_3)
          return result_3;
      }
      var result = ts2.forEach(resolved.failedLookupLocations, tryChangeWithIgnoringPackageJsonExisting) || ts2.pathIsRelative(importLiteral.text) && ts2.forEach(resolved.failedLookupLocations, tryChangeWithIgnoringPackageJson);
      if (result)
        return result;
      return resolved.resolvedModule && { newFileName: resolved.resolvedModule.resolvedFileName, updated: false };
      function tryChangeWithIgnoringPackageJsonExisting(oldFileName) {
        var newFileName = oldToNew(oldFileName);
        return newFileName && ts2.find(sourceFiles, function(src) {
          return src.fileName === newFileName;
        }) ? tryChangeWithIgnoringPackageJson(oldFileName) : void 0;
      }
      function tryChangeWithIgnoringPackageJson(oldFileName) {
        return !ts2.endsWith(oldFileName, "/package.json") ? tryChange(oldFileName) : void 0;
      }
      function tryChange(oldFileName) {
        var newFileName = oldToNew(oldFileName);
        return newFileName && { newFileName, updated: true };
      }
    }
    function updateImportsWorker(sourceFile, changeTracker, updateRef, updateImport) {
      for (var _i = 0, _a = sourceFile.referencedFiles || ts2.emptyArray; _i < _a.length; _i++) {
        var ref = _a[_i];
        var updated = updateRef(ref.fileName);
        if (updated !== void 0 && updated !== sourceFile.text.slice(ref.pos, ref.end))
          changeTracker.replaceRangeWithText(sourceFile, ref, updated);
      }
      for (var _b = 0, _c = sourceFile.imports; _b < _c.length; _b++) {
        var importStringLiteral = _c[_b];
        var updated = updateImport(importStringLiteral);
        if (updated !== void 0 && updated !== importStringLiteral.text)
          changeTracker.replaceRangeWithText(sourceFile, createStringRange(importStringLiteral, sourceFile), updated);
      }
    }
    function createStringRange(node, sourceFile) {
      return ts2.createRange(node.getStart(sourceFile) + 1, node.end - 1);
    }
    function forEachProperty(objectLiteral, cb) {
      if (!ts2.isObjectLiteralExpression(objectLiteral))
        return;
      for (var _i = 0, _a = objectLiteral.properties; _i < _a.length; _i++) {
        var property = _a[_i];
        if (ts2.isPropertyAssignment(property) && ts2.isStringLiteral(property.name)) {
          cb(property, property.name.text);
        }
      }
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var GoToDefinition;
    (function(GoToDefinition2) {
      function getDefinitionAtPosition(program, sourceFile, position) {
        var resolvedRef = getReferenceAtPosition(sourceFile, position, program);
        var fileReferenceDefinition = resolvedRef && [getDefinitionInfoForFileReference(resolvedRef.reference.fileName, resolvedRef.fileName, resolvedRef.unverified)] || ts2.emptyArray;
        if (resolvedRef === null || resolvedRef === void 0 ? void 0 : resolvedRef.file) {
          return fileReferenceDefinition;
        }
        var node = ts2.getTouchingPropertyName(sourceFile, position);
        if (node === sourceFile) {
          return void 0;
        }
        var parent = node.parent;
        var typeChecker = program.getTypeChecker();
        if (node.kind === 158 || ts2.isJSDocOverrideTag(node) && ts2.rangeContainsPosition(node.tagName, position)) {
          return getDefinitionFromOverriddenMember(typeChecker, node) || ts2.emptyArray;
        }
        if (ts2.isJumpStatementTarget(node)) {
          var label = ts2.getTargetLabel(node.parent, node.text);
          return label ? [createDefinitionInfoFromName(typeChecker, label, "label", node.text, void 0)] : void 0;
        }
        if (ts2.isStaticModifier(node) && ts2.isClassStaticBlockDeclaration(node.parent)) {
          var classDecl = node.parent.parent;
          var symbol_1 = getSymbol(classDecl, typeChecker);
          var staticBlocks = ts2.filter(classDecl.members, ts2.isClassStaticBlockDeclaration);
          var containerName_1 = symbol_1 ? typeChecker.symbolToString(symbol_1, classDecl) : "";
          var sourceFile_1 = node.getSourceFile();
          return ts2.map(staticBlocks, function(staticBlock) {
            var pos = ts2.moveRangePastModifiers(staticBlock).pos;
            pos = ts2.skipTrivia(sourceFile_1.text, pos);
            return createDefinitionInfoFromName(typeChecker, staticBlock, "constructor", "static {}", containerName_1, { start: pos, length: "static".length });
          });
        }
        var symbol = getSymbol(node, typeChecker);
        if (!symbol) {
          return ts2.concatenate(fileReferenceDefinition, getDefinitionInfoForIndexSignatures(node, typeChecker));
        }
        var calledDeclaration = tryGetSignatureDeclaration(typeChecker, node);
        if (calledDeclaration && !(ts2.isJsxOpeningLikeElement(node.parent) && isConstructorLike(calledDeclaration))) {
          var sigInfo = createDefinitionFromSignatureDeclaration(typeChecker, calledDeclaration);
          if (typeChecker.getRootSymbols(symbol).some(function(s) {
            return symbolMatchesSignature(s, calledDeclaration);
          })) {
            return [sigInfo];
          } else {
            var defs = getDefinitionFromSymbol(typeChecker, symbol, node, calledDeclaration) || ts2.emptyArray;
            return node.kind === 106 ? __spreadArray([sigInfo], defs, true) : __spreadArray(__spreadArray([], defs, true), [sigInfo], false);
          }
        }
        if (node.parent.kind === 295) {
          var shorthandSymbol_1 = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration);
          var definitions = (shorthandSymbol_1 === null || shorthandSymbol_1 === void 0 ? void 0 : shorthandSymbol_1.declarations) ? shorthandSymbol_1.declarations.map(function(decl) {
            return createDefinitionInfo(decl, typeChecker, shorthandSymbol_1, node);
          }) : ts2.emptyArray;
          return ts2.concatenate(definitions, getDefinitionFromObjectLiteralElement(typeChecker, node) || ts2.emptyArray);
        }
        if (ts2.isPropertyName(node) && ts2.isBindingElement(parent) && ts2.isObjectBindingPattern(parent.parent) && node === (parent.propertyName || parent.name)) {
          var name_3 = ts2.getNameFromPropertyName(node);
          var type = typeChecker.getTypeAtLocation(parent.parent);
          return name_3 === void 0 ? ts2.emptyArray : ts2.flatMap(type.isUnion() ? type.types : [type], function(t) {
            var prop = t.getProperty(name_3);
            return prop && getDefinitionFromSymbol(typeChecker, prop, node);
          });
        }
        return ts2.concatenate(fileReferenceDefinition, getDefinitionFromObjectLiteralElement(typeChecker, node) || getDefinitionFromSymbol(typeChecker, symbol, node));
      }
      GoToDefinition2.getDefinitionAtPosition = getDefinitionAtPosition;
      function symbolMatchesSignature(s, calledDeclaration) {
        return s === calledDeclaration.symbol || s === calledDeclaration.symbol.parent || ts2.isAssignmentExpression(calledDeclaration.parent) || !ts2.isCallLikeExpression(calledDeclaration.parent) && s === calledDeclaration.parent.symbol;
      }
      function getDefinitionFromObjectLiteralElement(typeChecker, node) {
        var element = ts2.getContainingObjectLiteralElement(node);
        if (element) {
          var contextualType = element && typeChecker.getContextualType(element.parent);
          if (contextualType) {
            return ts2.flatMap(ts2.getPropertySymbolsFromContextualType(element, typeChecker, contextualType, false), function(propertySymbol) {
              return getDefinitionFromSymbol(typeChecker, propertySymbol, node);
            });
          }
        }
      }
      function getDefinitionFromOverriddenMember(typeChecker, node) {
        var classElement = ts2.findAncestor(node, ts2.isClassElement);
        if (!(classElement && classElement.name))
          return;
        var baseDeclaration = ts2.findAncestor(classElement, ts2.isClassLike);
        if (!baseDeclaration)
          return;
        var baseTypeNode = ts2.getEffectiveBaseTypeNode(baseDeclaration);
        var baseType = baseTypeNode ? typeChecker.getTypeAtLocation(baseTypeNode) : void 0;
        if (!baseType)
          return;
        var name = ts2.unescapeLeadingUnderscores(ts2.getTextOfPropertyName(classElement.name));
        var symbol = ts2.hasStaticModifier(classElement) ? typeChecker.getPropertyOfType(typeChecker.getTypeOfSymbolAtLocation(baseType.symbol, baseDeclaration), name) : typeChecker.getPropertyOfType(baseType, name);
        if (!symbol)
          return;
        return getDefinitionFromSymbol(typeChecker, symbol, node);
      }
      function getReferenceAtPosition(sourceFile, position, program) {
        var _a, _b;
        var referencePath = findReferenceInPosition(sourceFile.referencedFiles, position);
        if (referencePath) {
          var file = program.getSourceFileFromReference(sourceFile, referencePath);
          return file && { reference: referencePath, fileName: file.fileName, file, unverified: false };
        }
        var typeReferenceDirective = findReferenceInPosition(sourceFile.typeReferenceDirectives, position);
        if (typeReferenceDirective) {
          var reference = program.getResolvedTypeReferenceDirectives().get(typeReferenceDirective.fileName);
          var file = reference && program.getSourceFile(reference.resolvedFileName);
          return file && { reference: typeReferenceDirective, fileName: file.fileName, file, unverified: false };
        }
        var libReferenceDirective = findReferenceInPosition(sourceFile.libReferenceDirectives, position);
        if (libReferenceDirective) {
          var file = program.getLibFileFromReference(libReferenceDirective);
          return file && { reference: libReferenceDirective, fileName: file.fileName, file, unverified: false };
        }
        if ((_a = sourceFile.resolvedModules) === null || _a === void 0 ? void 0 : _a.size()) {
          var node = ts2.getTokenAtPosition(sourceFile, position);
          if (ts2.isModuleSpecifierLike(node) && ts2.isExternalModuleNameRelative(node.text) && sourceFile.resolvedModules.has(node.text, ts2.getModeForUsageLocation(sourceFile, node))) {
            var verifiedFileName = (_b = sourceFile.resolvedModules.get(node.text, ts2.getModeForUsageLocation(sourceFile, node))) === null || _b === void 0 ? void 0 : _b.resolvedFileName;
            var fileName = verifiedFileName || ts2.resolvePath(ts2.getDirectoryPath(sourceFile.fileName), node.text);
            return {
              file: program.getSourceFile(fileName),
              fileName,
              reference: {
                pos: node.getStart(),
                end: node.getEnd(),
                fileName: node.text
              },
              unverified: !verifiedFileName
            };
          }
        }
        return void 0;
      }
      GoToDefinition2.getReferenceAtPosition = getReferenceAtPosition;
      function getTypeDefinitionAtPosition(typeChecker, sourceFile, position) {
        var node = ts2.getTouchingPropertyName(sourceFile, position);
        if (node === sourceFile) {
          return void 0;
        }
        var symbol = typeChecker.getSymbolAtLocation(node);
        if (!symbol)
          return void 0;
        var typeAtLocation = typeChecker.getTypeOfSymbolAtLocation(symbol, node);
        var returnType = tryGetReturnTypeOfFunction(symbol, typeAtLocation, typeChecker);
        var fromReturnType = returnType && definitionFromType(returnType, typeChecker, node);
        return fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node);
      }
      GoToDefinition2.getTypeDefinitionAtPosition = getTypeDefinitionAtPosition;
      function definitionFromType(type, checker, node) {
        return ts2.flatMap(type.isUnion() && !(type.flags & 32) ? type.types : [type], function(t) {
          return t.symbol && getDefinitionFromSymbol(checker, t.symbol, node);
        });
      }
      function tryGetReturnTypeOfFunction(symbol, type, checker) {
        if (type.symbol === symbol || symbol.valueDeclaration && type.symbol && ts2.isVariableDeclaration(symbol.valueDeclaration) && symbol.valueDeclaration.initializer === type.symbol.valueDeclaration) {
          var sigs = type.getCallSignatures();
          if (sigs.length === 1)
            return checker.getReturnTypeOfSignature(ts2.first(sigs));
        }
        return void 0;
      }
      function getDefinitionAndBoundSpan(program, sourceFile, position) {
        var definitions = getDefinitionAtPosition(program, sourceFile, position);
        if (!definitions || definitions.length === 0) {
          return void 0;
        }
        var comment = findReferenceInPosition(sourceFile.referencedFiles, position) || findReferenceInPosition(sourceFile.typeReferenceDirectives, position) || findReferenceInPosition(sourceFile.libReferenceDirectives, position);
        if (comment) {
          return { definitions, textSpan: ts2.createTextSpanFromRange(comment) };
        }
        var node = ts2.getTouchingPropertyName(sourceFile, position);
        var textSpan = ts2.createTextSpan(node.getStart(), node.getWidth());
        return { definitions, textSpan };
      }
      GoToDefinition2.getDefinitionAndBoundSpan = getDefinitionAndBoundSpan;
      function getDefinitionInfoForIndexSignatures(node, checker) {
        return ts2.mapDefined(checker.getIndexInfosAtLocation(node), function(info) {
          return info.declaration && createDefinitionFromSignatureDeclaration(checker, info.declaration);
        });
      }
      function getSymbol(node, checker) {
        var symbol = checker.getSymbolAtLocation(node);
        if ((symbol === null || symbol === void 0 ? void 0 : symbol.declarations) && symbol.flags & 2097152 && shouldSkipAlias(node, symbol.declarations[0])) {
          var aliased = checker.getAliasedSymbol(symbol);
          if (aliased.declarations) {
            return aliased;
          }
        }
        return symbol;
      }
      function shouldSkipAlias(node, declaration) {
        if (node.kind !== 79) {
          return false;
        }
        if (node.parent === declaration) {
          return true;
        }
        switch (declaration.kind) {
          case 266:
          case 264:
            return true;
          case 269:
            return declaration.parent.kind === 268;
          case 202:
          case 253:
            return ts2.isInJSFile(declaration) && ts2.isVariableDeclarationInitializedToBareOrAccessedRequire(declaration);
          default:
            return false;
        }
      }
      function getDefinitionFromSymbol(typeChecker, symbol, node, declarationNode) {
        var filteredDeclarations = ts2.filter(symbol.declarations, function(d) {
          return d !== declarationNode && (!ts2.isAssignmentDeclaration(d) || d === symbol.valueDeclaration);
        }) || void 0;
        return getConstructSignatureDefinition() || getCallSignatureDefinition() || ts2.map(filteredDeclarations, function(declaration) {
          return createDefinitionInfo(declaration, typeChecker, symbol, node);
        });
        function getConstructSignatureDefinition() {
          if (symbol.flags & 32 && !(symbol.flags & (16 | 3)) && (ts2.isNewExpressionTarget(node) || node.kind === 134)) {
            var cls = ts2.find(filteredDeclarations, ts2.isClassLike) || ts2.Debug.fail("Expected declaration to have at least one class-like declaration");
            return getSignatureDefinition(cls.members, true);
          }
        }
        function getCallSignatureDefinition() {
          return ts2.isCallOrNewExpressionTarget(node) || ts2.isNameOfFunctionDeclaration(node) ? getSignatureDefinition(filteredDeclarations, false) : void 0;
        }
        function getSignatureDefinition(signatureDeclarations, selectConstructors) {
          if (!signatureDeclarations) {
            return void 0;
          }
          var declarations = signatureDeclarations.filter(selectConstructors ? ts2.isConstructorDeclaration : ts2.isFunctionLike);
          var declarationsWithBody = declarations.filter(function(d) {
            return !!d.body;
          });
          return declarations.length ? declarationsWithBody.length !== 0 ? declarationsWithBody.map(function(x) {
            return createDefinitionInfo(x, typeChecker, symbol, node);
          }) : [createDefinitionInfo(ts2.last(declarations), typeChecker, symbol, node)] : void 0;
        }
      }
      function createDefinitionInfo(declaration, checker, symbol, node) {
        var symbolName = checker.symbolToString(symbol);
        var symbolKind = ts2.SymbolDisplay.getSymbolKind(checker, symbol, node);
        var containerName = symbol.parent ? checker.symbolToString(symbol.parent, node) : "";
        return createDefinitionInfoFromName(checker, declaration, symbolKind, symbolName, containerName);
      }
      function createDefinitionInfoFromName(checker, declaration, symbolKind, symbolName, containerName, textSpan) {
        var sourceFile = declaration.getSourceFile();
        if (!textSpan) {
          var name = ts2.getNameOfDeclaration(declaration) || declaration;
          textSpan = ts2.createTextSpanFromNode(name, sourceFile);
        }
        return __assign(__assign({
          fileName: sourceFile.fileName,
          textSpan,
          kind: symbolKind,
          name: symbolName,
          containerKind: void 0,
          containerName
        }, ts2.FindAllReferences.toContextSpan(textSpan, sourceFile, ts2.FindAllReferences.getContextNode(declaration))), { isLocal: !isDefinitionVisible(checker, declaration) });
      }
      function isDefinitionVisible(checker, declaration) {
        if (checker.isDeclarationVisible(declaration))
          return true;
        if (!declaration.parent)
          return false;
        if (ts2.hasInitializer(declaration.parent) && declaration.parent.initializer === declaration)
          return isDefinitionVisible(checker, declaration.parent);
        switch (declaration.kind) {
          case 166:
          case 171:
          case 172:
          case 168:
            if (ts2.hasEffectiveModifier(declaration, 8))
              return false;
          case 170:
          case 294:
          case 295:
          case 204:
          case 225:
          case 213:
          case 212:
            return isDefinitionVisible(checker, declaration.parent);
          default:
            return false;
        }
      }
      function createDefinitionFromSignatureDeclaration(typeChecker, decl) {
        return createDefinitionInfo(decl, typeChecker, decl.symbol, decl);
      }
      function findReferenceInPosition(refs, pos) {
        return ts2.find(refs, function(ref) {
          return ts2.textRangeContainsPositionInclusive(ref, pos);
        });
      }
      GoToDefinition2.findReferenceInPosition = findReferenceInPosition;
      function getDefinitionInfoForFileReference(name, targetFileName, unverified) {
        return {
          fileName: targetFileName,
          textSpan: ts2.createTextSpanFromBounds(0, 0),
          kind: "script",
          name,
          containerName: void 0,
          containerKind: void 0,
          unverified
        };
      }
      function getAncestorCallLikeExpression(node) {
        var target = ts2.findAncestor(node, function(n) {
          return !ts2.isRightSideOfPropertyAccess(n);
        });
        var callLike = target === null || target === void 0 ? void 0 : target.parent;
        return callLike && ts2.isCallLikeExpression(callLike) && ts2.getInvokedExpression(callLike) === target ? callLike : void 0;
      }
      function tryGetSignatureDeclaration(typeChecker, node) {
        var callLike = getAncestorCallLikeExpression(node);
        var signature = callLike && typeChecker.getResolvedSignature(callLike);
        return ts2.tryCast(signature && signature.declaration, function(d) {
          return ts2.isFunctionLike(d) && !ts2.isFunctionTypeNode(d);
        });
      }
      function isConstructorLike(node) {
        switch (node.kind) {
          case 170:
          case 179:
          case 174:
            return true;
          default:
            return false;
        }
      }
    })(GoToDefinition = ts2.GoToDefinition || (ts2.GoToDefinition = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var JsDoc;
    (function(JsDoc2) {
      var jsDocTagNames = [
        "abstract",
        "access",
        "alias",
        "argument",
        "async",
        "augments",
        "author",
        "borrows",
        "callback",
        "class",
        "classdesc",
        "constant",
        "constructor",
        "constructs",
        "copyright",
        "default",
        "deprecated",
        "description",
        "emits",
        "enum",
        "event",
        "example",
        "exports",
        "extends",
        "external",
        "field",
        "file",
        "fileoverview",
        "fires",
        "function",
        "generator",
        "global",
        "hideconstructor",
        "host",
        "ignore",
        "implements",
        "inheritdoc",
        "inner",
        "instance",
        "interface",
        "kind",
        "lends",
        "license",
        "link",
        "listens",
        "member",
        "memberof",
        "method",
        "mixes",
        "module",
        "name",
        "namespace",
        "override",
        "package",
        "param",
        "private",
        "property",
        "protected",
        "public",
        "readonly",
        "requires",
        "returns",
        "see",
        "since",
        "static",
        "summary",
        "template",
        "this",
        "throws",
        "todo",
        "tutorial",
        "type",
        "typedef",
        "var",
        "variation",
        "version",
        "virtual",
        "yields"
      ];
      var jsDocTagNameCompletionEntries;
      var jsDocTagCompletionEntries;
      function getJsDocCommentsFromDeclarations(declarations, checker) {
        var parts = [];
        ts2.forEachUnique(declarations, function(declaration) {
          for (var _i = 0, _a = getCommentHavingNodes(declaration); _i < _a.length; _i++) {
            var jsdoc = _a[_i];
            if (jsdoc.comment === void 0 || ts2.isJSDoc(jsdoc) && declaration.kind !== 343 && declaration.kind !== 336 && jsdoc.tags && jsdoc.tags.some(function(t) {
              return t.kind === 343 || t.kind === 336;
            }) && !jsdoc.tags.some(function(t) {
              return t.kind === 338 || t.kind === 339;
            })) {
              continue;
            }
            var newparts = getDisplayPartsFromComment(jsdoc.comment, checker);
            if (!ts2.contains(parts, newparts, isIdenticalListOfDisplayParts)) {
              parts.push(newparts);
            }
          }
        });
        return ts2.flatten(ts2.intersperse(parts, [ts2.lineBreakPart()]));
      }
      JsDoc2.getJsDocCommentsFromDeclarations = getJsDocCommentsFromDeclarations;
      function isIdenticalListOfDisplayParts(parts1, parts2) {
        return ts2.arraysEqual(parts1, parts2, function(p1, p2) {
          return p1.kind === p2.kind && p1.text === p2.text;
        });
      }
      function getCommentHavingNodes(declaration) {
        switch (declaration.kind) {
          case 338:
          case 345:
            return [declaration];
          case 336:
          case 343:
            return [declaration, declaration.parent];
          default:
            return ts2.getJSDocCommentsAndTags(declaration);
        }
      }
      function getJsDocTagsFromDeclarations(declarations, checker) {
        var infos = [];
        ts2.forEachUnique(declarations, function(declaration) {
          var tags = ts2.getJSDocTags(declaration);
          if (tags.some(function(t) {
            return t.kind === 343 || t.kind === 336;
          }) && !tags.some(function(t) {
            return t.kind === 338 || t.kind === 339;
          })) {
            return;
          }
          for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
            var tag = tags_1[_i];
            infos.push({ name: tag.tagName.text, text: getCommentDisplayParts(tag, checker) });
          }
        });
        return infos;
      }
      JsDoc2.getJsDocTagsFromDeclarations = getJsDocTagsFromDeclarations;
      function getDisplayPartsFromComment(comment, checker) {
        if (typeof comment === "string") {
          return [ts2.textPart(comment)];
        }
        return ts2.flatMap(comment, function(node) {
          return node.kind === 319 ? [ts2.textPart(node.text)] : ts2.buildLinkParts(node, checker);
        });
      }
      function getCommentDisplayParts(tag, checker) {
        var comment = tag.comment, kind = tag.kind;
        var namePart = getTagNameDisplayPart(kind);
        switch (kind) {
          case 327:
            return withNode(tag.class);
          case 326:
            return withNode(tag.class);
          case 342:
            return addComment(tag.typeParameters.map(function(tp) {
              return tp.getText();
            }).join(", "));
          case 341:
            return withNode(tag.typeExpression);
          case 343:
          case 336:
          case 345:
          case 338:
          case 344:
            var name = tag.name;
            return name ? withNode(name) : comment === void 0 ? void 0 : getDisplayPartsFromComment(comment, checker);
          default:
            return comment === void 0 ? void 0 : getDisplayPartsFromComment(comment, checker);
        }
        function withNode(node) {
          return addComment(node.getText());
        }
        function addComment(s) {
          if (comment) {
            if (s.match(/^https?$/)) {
              return __spreadArray([ts2.textPart(s)], getDisplayPartsFromComment(comment, checker), true);
            } else {
              return __spreadArray([namePart(s), ts2.spacePart()], getDisplayPartsFromComment(comment, checker), true);
            }
          } else {
            return [ts2.textPart(s)];
          }
        }
      }
      function getTagNameDisplayPart(kind) {
        switch (kind) {
          case 338:
            return ts2.parameterNamePart;
          case 345:
            return ts2.propertyNamePart;
          case 342:
            return ts2.typeParameterNamePart;
          case 343:
          case 336:
            return ts2.typeAliasNamePart;
          default:
            return ts2.textPart;
        }
      }
      function getJSDocTagNameCompletions() {
        return jsDocTagNameCompletionEntries || (jsDocTagNameCompletionEntries = ts2.map(jsDocTagNames, function(tagName) {
          return {
            name: tagName,
            kind: "keyword",
            kindModifiers: "",
            sortText: ts2.Completions.SortText.LocationPriority
          };
        }));
      }
      JsDoc2.getJSDocTagNameCompletions = getJSDocTagNameCompletions;
      JsDoc2.getJSDocTagNameCompletionDetails = getJSDocTagCompletionDetails;
      function getJSDocTagCompletions() {
        return jsDocTagCompletionEntries || (jsDocTagCompletionEntries = ts2.map(jsDocTagNames, function(tagName) {
          return {
            name: "@".concat(tagName),
            kind: "keyword",
            kindModifiers: "",
            sortText: ts2.Completions.SortText.LocationPriority
          };
        }));
      }
      JsDoc2.getJSDocTagCompletions = getJSDocTagCompletions;
      function getJSDocTagCompletionDetails(name) {
        return {
          name,
          kind: "",
          kindModifiers: "",
          displayParts: [ts2.textPart(name)],
          documentation: ts2.emptyArray,
          tags: void 0,
          codeActions: void 0
        };
      }
      JsDoc2.getJSDocTagCompletionDetails = getJSDocTagCompletionDetails;
      function getJSDocParameterNameCompletions(tag) {
        if (!ts2.isIdentifier(tag.name)) {
          return ts2.emptyArray;
        }
        var nameThusFar = tag.name.text;
        var jsdoc = tag.parent;
        var fn = jsdoc.parent;
        if (!ts2.isFunctionLike(fn))
          return [];
        return ts2.mapDefined(fn.parameters, function(param) {
          if (!ts2.isIdentifier(param.name))
            return void 0;
          var name = param.name.text;
          if (jsdoc.tags.some(function(t) {
            return t !== tag && ts2.isJSDocParameterTag(t) && ts2.isIdentifier(t.name) && t.name.escapedText === name;
          }) || nameThusFar !== void 0 && !ts2.startsWith(name, nameThusFar)) {
            return void 0;
          }
          return { name, kind: "parameter", kindModifiers: "", sortText: ts2.Completions.SortText.LocationPriority };
        });
      }
      JsDoc2.getJSDocParameterNameCompletions = getJSDocParameterNameCompletions;
      function getJSDocParameterNameCompletionDetails(name) {
        return {
          name,
          kind: "parameter",
          kindModifiers: "",
          displayParts: [ts2.textPart(name)],
          documentation: ts2.emptyArray,
          tags: void 0,
          codeActions: void 0
        };
      }
      JsDoc2.getJSDocParameterNameCompletionDetails = getJSDocParameterNameCompletionDetails;
      function getDocCommentTemplateAtPosition(newLine, sourceFile, position, options) {
        var tokenAtPos = ts2.getTokenAtPosition(sourceFile, position);
        var existingDocComment = ts2.findAncestor(tokenAtPos, ts2.isJSDoc);
        if (existingDocComment && (existingDocComment.comment !== void 0 || ts2.length(existingDocComment.tags))) {
          return void 0;
        }
        var tokenStart = tokenAtPos.getStart(sourceFile);
        if (!existingDocComment && tokenStart < position) {
          return void 0;
        }
        var commentOwnerInfo = getCommentOwnerInfo(tokenAtPos, options);
        if (!commentOwnerInfo) {
          return void 0;
        }
        var commentOwner = commentOwnerInfo.commentOwner, parameters = commentOwnerInfo.parameters, hasReturn2 = commentOwnerInfo.hasReturn;
        if (commentOwner.getStart(sourceFile) < position) {
          return void 0;
        }
        var indentationStr = getIndentationStringAtPosition(sourceFile, position);
        var isJavaScriptFile = ts2.hasJSFileExtension(sourceFile.fileName);
        var tags = (parameters ? parameterDocComments(parameters || [], isJavaScriptFile, indentationStr, newLine) : "") + (hasReturn2 ? returnsDocComment(indentationStr, newLine) : "");
        var openComment = "/**";
        var closeComment = " */";
        if (tags) {
          var preamble = openComment + newLine + indentationStr + " * ";
          var endLine = tokenStart === position ? newLine + indentationStr : "";
          var result = preamble + newLine + tags + indentationStr + closeComment + endLine;
          return { newText: result, caretOffset: preamble.length };
        }
        return { newText: openComment + closeComment, caretOffset: 3 };
      }
      JsDoc2.getDocCommentTemplateAtPosition = getDocCommentTemplateAtPosition;
      function getIndentationStringAtPosition(sourceFile, position) {
        var text = sourceFile.text;
        var lineStart = ts2.getLineStartPositionForPosition(position, sourceFile);
        var pos = lineStart;
        for (; pos <= position && ts2.isWhiteSpaceSingleLine(text.charCodeAt(pos)); pos++)
          ;
        return text.slice(lineStart, pos);
      }
      function parameterDocComments(parameters, isJavaScriptFile, indentationStr, newLine) {
        return parameters.map(function(_a, i) {
          var name = _a.name, dotDotDotToken = _a.dotDotDotToken;
          var paramName = name.kind === 79 ? name.text : "param" + i;
          var type = isJavaScriptFile ? dotDotDotToken ? "{...any} " : "{any} " : "";
          return "".concat(indentationStr, " * @param ").concat(type).concat(paramName).concat(newLine);
        }).join("");
      }
      function returnsDocComment(indentationStr, newLine) {
        return "".concat(indentationStr, " * @returns").concat(newLine);
      }
      function getCommentOwnerInfo(tokenAtPos, options) {
        return ts2.forEachAncestor(tokenAtPos, function(n) {
          return getCommentOwnerInfoWorker(n, options);
        });
      }
      function getCommentOwnerInfoWorker(commentOwner, options) {
        switch (commentOwner.kind) {
          case 255:
          case 212:
          case 168:
          case 170:
          case 167:
          case 213:
            var host = commentOwner;
            return { commentOwner, parameters: host.parameters, hasReturn: hasReturn(host, options) };
          case 294:
            return getCommentOwnerInfoWorker(commentOwner.initializer, options);
          case 256:
          case 257:
          case 165:
          case 259:
          case 297:
          case 258:
            return { commentOwner };
          case 236: {
            var varStatement = commentOwner;
            var varDeclarations = varStatement.declarationList.declarations;
            var host_1 = varDeclarations.length === 1 && varDeclarations[0].initializer ? getRightHandSideOfAssignment(varDeclarations[0].initializer) : void 0;
            return host_1 ? { commentOwner, parameters: host_1.parameters, hasReturn: hasReturn(host_1, options) } : { commentOwner };
          }
          case 303:
            return "quit";
          case 260:
            return commentOwner.parent.kind === 260 ? void 0 : { commentOwner };
          case 237:
            return getCommentOwnerInfoWorker(commentOwner.expression, options);
          case 220: {
            var be = commentOwner;
            if (ts2.getAssignmentDeclarationKind(be) === 0) {
              return "quit";
            }
            return ts2.isFunctionLike(be.right) ? { commentOwner, parameters: be.right.parameters, hasReturn: hasReturn(be.right, options) } : { commentOwner };
          }
          case 166:
            var init = commentOwner.initializer;
            if (init && (ts2.isFunctionExpression(init) || ts2.isArrowFunction(init))) {
              return { commentOwner, parameters: init.parameters, hasReturn: hasReturn(init, options) };
            }
        }
      }
      function hasReturn(node, options) {
        return !!(options === null || options === void 0 ? void 0 : options.generateReturnInDocTemplate) && (ts2.isArrowFunction(node) && ts2.isExpression(node.body) || ts2.isFunctionLikeDeclaration(node) && node.body && ts2.isBlock(node.body) && !!ts2.forEachReturnStatement(node.body, function(n) {
          return n;
        }));
      }
      function getRightHandSideOfAssignment(rightHandSide) {
        while (rightHandSide.kind === 211) {
          rightHandSide = rightHandSide.expression;
        }
        switch (rightHandSide.kind) {
          case 212:
          case 213:
            return rightHandSide;
          case 225:
            return ts2.find(rightHandSide.members, ts2.isConstructorDeclaration);
        }
      }
    })(JsDoc = ts2.JsDoc || (ts2.JsDoc = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var NavigateTo;
    (function(NavigateTo2) {
      function getNavigateToItems(sourceFiles, checker, cancellationToken, searchValue, maxResultCount, excludeDtsFiles) {
        var patternMatcher = ts2.createPatternMatcher(searchValue);
        if (!patternMatcher)
          return ts2.emptyArray;
        var rawItems = [];
        var _loop_7 = function(sourceFile2) {
          cancellationToken.throwIfCancellationRequested();
          if (excludeDtsFiles && sourceFile2.isDeclarationFile) {
            return "continue";
          }
          sourceFile2.getNamedDeclarations().forEach(function(declarations, name) {
            getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, sourceFile2.fileName, rawItems);
          });
        };
        for (var _i = 0, sourceFiles_4 = sourceFiles; _i < sourceFiles_4.length; _i++) {
          var sourceFile = sourceFiles_4[_i];
          _loop_7(sourceFile);
        }
        rawItems.sort(compareNavigateToItems);
        return (maxResultCount === void 0 ? rawItems : rawItems.slice(0, maxResultCount)).map(createNavigateToItem);
      }
      NavigateTo2.getNavigateToItems = getNavigateToItems;
      function getItemsFromNamedDeclaration(patternMatcher, name, declarations, checker, fileName, rawItems) {
        var match = patternMatcher.getMatchForLastSegmentOfPattern(name);
        if (!match) {
          return;
        }
        for (var _i = 0, declarations_3 = declarations; _i < declarations_3.length; _i++) {
          var declaration = declarations_3[_i];
          if (!shouldKeepItem(declaration, checker))
            continue;
          if (patternMatcher.patternContainsDots) {
            var fullMatch = patternMatcher.getFullMatch(getContainers(declaration), name);
            if (fullMatch) {
              rawItems.push({ name, fileName, matchKind: fullMatch.kind, isCaseSensitive: fullMatch.isCaseSensitive, declaration });
            }
          } else {
            rawItems.push({ name, fileName, matchKind: match.kind, isCaseSensitive: match.isCaseSensitive, declaration });
          }
        }
      }
      function shouldKeepItem(declaration, checker) {
        switch (declaration.kind) {
          case 266:
          case 269:
          case 264:
            var importer = checker.getSymbolAtLocation(declaration.name);
            var imported = checker.getAliasedSymbol(importer);
            return importer.escapedName !== imported.escapedName;
          default:
            return true;
        }
      }
      function tryAddSingleDeclarationName(declaration, containers) {
        var name = ts2.getNameOfDeclaration(declaration);
        return !!name && (pushLiteral(name, containers) || name.kind === 161 && tryAddComputedPropertyName(name.expression, containers));
      }
      function tryAddComputedPropertyName(expression, containers) {
        return pushLiteral(expression, containers) || ts2.isPropertyAccessExpression(expression) && (containers.push(expression.name.text), true) && tryAddComputedPropertyName(expression.expression, containers);
      }
      function pushLiteral(node, containers) {
        return ts2.isPropertyNameLiteral(node) && (containers.push(ts2.getTextOfIdentifierOrLiteral(node)), true);
      }
      function getContainers(declaration) {
        var containers = [];
        var name = ts2.getNameOfDeclaration(declaration);
        if (name && name.kind === 161 && !tryAddComputedPropertyName(name.expression, containers)) {
          return ts2.emptyArray;
        }
        containers.shift();
        var container = ts2.getContainerNode(declaration);
        while (container) {
          if (!tryAddSingleDeclarationName(container, containers)) {
            return ts2.emptyArray;
          }
          container = ts2.getContainerNode(container);
        }
        return containers.reverse();
      }
      function compareNavigateToItems(i1, i2) {
        return ts2.compareValues(i1.matchKind, i2.matchKind) || ts2.compareStringsCaseSensitiveUI(i1.name, i2.name);
      }
      function createNavigateToItem(rawItem) {
        var declaration = rawItem.declaration;
        var container = ts2.getContainerNode(declaration);
        var containerName = container && ts2.getNameOfDeclaration(container);
        return {
          name: rawItem.name,
          kind: ts2.getNodeKind(declaration),
          kindModifiers: ts2.getNodeModifiers(declaration),
          matchKind: ts2.PatternMatchKind[rawItem.matchKind],
          isCaseSensitive: rawItem.isCaseSensitive,
          fileName: rawItem.fileName,
          textSpan: ts2.createTextSpanFromNode(declaration),
          containerName: containerName ? containerName.text : "",
          containerKind: containerName ? ts2.getNodeKind(container) : ""
        };
      }
    })(NavigateTo = ts2.NavigateTo || (ts2.NavigateTo = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var NavigationBar;
    (function(NavigationBar2) {
      var _a;
      var whiteSpaceRegex = /\s+/g;
      var maxLength = 150;
      var curCancellationToken;
      var curSourceFile;
      var parentsStack = [];
      var parent;
      var trackedEs5ClassesStack = [];
      var trackedEs5Classes;
      var emptyChildItemArray = [];
      function getNavigationBarItems(sourceFile, cancellationToken) {
        curCancellationToken = cancellationToken;
        curSourceFile = sourceFile;
        try {
          return ts2.map(primaryNavBarMenuItems(rootNavigationBarNode(sourceFile)), convertToPrimaryNavBarMenuItem);
        } finally {
          reset();
        }
      }
      NavigationBar2.getNavigationBarItems = getNavigationBarItems;
      function getNavigationTree(sourceFile, cancellationToken) {
        curCancellationToken = cancellationToken;
        curSourceFile = sourceFile;
        try {
          return convertToTree(rootNavigationBarNode(sourceFile));
        } finally {
          reset();
        }
      }
      NavigationBar2.getNavigationTree = getNavigationTree;
      function reset() {
        curSourceFile = void 0;
        curCancellationToken = void 0;
        parentsStack = [];
        parent = void 0;
        emptyChildItemArray = [];
      }
      function nodeText(node) {
        return cleanText(node.getText(curSourceFile));
      }
      function navigationBarNodeKind(n) {
        return n.node.kind;
      }
      function pushChild(parent2, child) {
        if (parent2.children) {
          parent2.children.push(child);
        } else {
          parent2.children = [child];
        }
      }
      function rootNavigationBarNode(sourceFile) {
        ts2.Debug.assert(!parentsStack.length);
        var root = { node: sourceFile, name: void 0, additionalNodes: void 0, parent: void 0, children: void 0, indent: 0 };
        parent = root;
        for (var _i = 0, _a2 = sourceFile.statements; _i < _a2.length; _i++) {
          var statement = _a2[_i];
          addChildrenRecursively(statement);
        }
        endNode();
        ts2.Debug.assert(!parent && !parentsStack.length);
        return root;
      }
      function addLeafNode(node, name) {
        pushChild(parent, emptyNavigationBarNode(node, name));
      }
      function emptyNavigationBarNode(node, name) {
        return {
          node,
          name: name || (ts2.isDeclaration(node) || ts2.isExpression(node) ? ts2.getNameOfDeclaration(node) : void 0),
          additionalNodes: void 0,
          parent,
          children: void 0,
          indent: parent.indent + 1
        };
      }
      function addTrackedEs5Class(name) {
        if (!trackedEs5Classes) {
          trackedEs5Classes = new ts2.Map();
        }
        trackedEs5Classes.set(name, true);
      }
      function endNestedNodes(depth) {
        for (var i = 0; i < depth; i++)
          endNode();
      }
      function startNestedNodes(targetNode, entityName) {
        var names = [];
        while (!ts2.isPropertyNameLiteral(entityName)) {
          var name = ts2.getNameOrArgument(entityName);
          var nameText = ts2.getElementOrPropertyAccessName(entityName);
          entityName = entityName.expression;
          if (nameText === "prototype" || ts2.isPrivateIdentifier(name))
            continue;
          names.push(name);
        }
        names.push(entityName);
        for (var i = names.length - 1; i > 0; i--) {
          var name = names[i];
          startNode(targetNode, name);
        }
        return [names.length - 1, names[0]];
      }
      function startNode(node, name) {
        var navNode = emptyNavigationBarNode(node, name);
        pushChild(parent, navNode);
        parentsStack.push(parent);
        trackedEs5ClassesStack.push(trackedEs5Classes);
        trackedEs5Classes = void 0;
        parent = navNode;
      }
      function endNode() {
        if (parent.children) {
          mergeChildren(parent.children, parent);
          sortChildren(parent.children);
        }
        parent = parentsStack.pop();
        trackedEs5Classes = trackedEs5ClassesStack.pop();
      }
      function addNodeWithRecursiveChild(node, child, name) {
        startNode(node, name);
        addChildrenRecursively(child);
        endNode();
      }
      function addNodeWithRecursiveInitializer(node) {
        if (node.initializer && isFunctionOrClassExpression(node.initializer)) {
          startNode(node);
          ts2.forEachChild(node.initializer, addChildrenRecursively);
          endNode();
        } else {
          addNodeWithRecursiveChild(node, node.initializer);
        }
      }
      function hasNavigationBarName(node) {
        return !ts2.hasDynamicName(node) || node.kind !== 220 && ts2.isPropertyAccessExpression(node.name.expression) && ts2.isIdentifier(node.name.expression.expression) && ts2.idText(node.name.expression.expression) === "Symbol";
      }
      function addChildrenRecursively(node) {
        var _a2;
        curCancellationToken.throwIfCancellationRequested();
        if (!node || ts2.isToken(node)) {
          return;
        }
        switch (node.kind) {
          case 170:
            var ctr = node;
            addNodeWithRecursiveChild(ctr, ctr.body);
            for (var _i = 0, _b = ctr.parameters; _i < _b.length; _i++) {
              var param = _b[_i];
              if (ts2.isParameterPropertyDeclaration(param, ctr)) {
                addLeafNode(param);
              }
            }
            break;
          case 168:
          case 171:
          case 172:
          case 167:
            if (hasNavigationBarName(node)) {
              addNodeWithRecursiveChild(node, node.body);
            }
            break;
          case 166:
            if (hasNavigationBarName(node)) {
              addNodeWithRecursiveInitializer(node);
            }
            break;
          case 165:
            if (hasNavigationBarName(node)) {
              addLeafNode(node);
            }
            break;
          case 266:
            var importClause = node;
            if (importClause.name) {
              addLeafNode(importClause.name);
            }
            var namedBindings = importClause.namedBindings;
            if (namedBindings) {
              if (namedBindings.kind === 267) {
                addLeafNode(namedBindings);
              } else {
                for (var _c = 0, _d = namedBindings.elements; _c < _d.length; _c++) {
                  var element = _d[_c];
                  addLeafNode(element);
                }
              }
            }
            break;
          case 295:
            addNodeWithRecursiveChild(node, node.name);
            break;
          case 296:
            var expression = node.expression;
            ts2.isIdentifier(expression) ? addLeafNode(node, expression) : addLeafNode(node);
            break;
          case 202:
          case 294:
          case 253: {
            var child = node;
            if (ts2.isBindingPattern(child.name)) {
              addChildrenRecursively(child.name);
            } else {
              addNodeWithRecursiveInitializer(child);
            }
            break;
          }
          case 255:
            var nameNode = node.name;
            if (nameNode && ts2.isIdentifier(nameNode)) {
              addTrackedEs5Class(nameNode.text);
            }
            addNodeWithRecursiveChild(node, node.body);
            break;
          case 213:
          case 212:
            addNodeWithRecursiveChild(node, node.body);
            break;
          case 259:
            startNode(node);
            for (var _e = 0, _f = node.members; _e < _f.length; _e++) {
              var member = _f[_e];
              if (!isComputedProperty(member)) {
                addLeafNode(member);
              }
            }
            endNode();
            break;
          case 256:
          case 225:
          case 257:
            startNode(node);
            for (var _g = 0, _h = node.members; _g < _h.length; _g++) {
              var member = _h[_g];
              addChildrenRecursively(member);
            }
            endNode();
            break;
          case 260:
            addNodeWithRecursiveChild(node, getInteriorModule(node).body);
            break;
          case 270: {
            var expression_1 = node.expression;
            var child = ts2.isObjectLiteralExpression(expression_1) || ts2.isCallExpression(expression_1) ? expression_1 : ts2.isArrowFunction(expression_1) || ts2.isFunctionExpression(expression_1) ? expression_1.body : void 0;
            if (child) {
              startNode(node);
              addChildrenRecursively(child);
              endNode();
            } else {
              addLeafNode(node);
            }
            break;
          }
          case 274:
          case 264:
          case 175:
          case 173:
          case 174:
          case 258:
            addLeafNode(node);
            break;
          case 207:
          case 220: {
            var special = ts2.getAssignmentDeclarationKind(node);
            switch (special) {
              case 1:
              case 2:
                addNodeWithRecursiveChild(node, node.right);
                return;
              case 6:
              case 3: {
                var binaryExpression = node;
                var assignmentTarget = binaryExpression.left;
                var prototypeAccess = special === 3 ? assignmentTarget.expression : assignmentTarget;
                var depth = 0;
                var className = void 0;
                if (ts2.isIdentifier(prototypeAccess.expression)) {
                  addTrackedEs5Class(prototypeAccess.expression.text);
                  className = prototypeAccess.expression;
                } else {
                  _a2 = startNestedNodes(binaryExpression, prototypeAccess.expression), depth = _a2[0], className = _a2[1];
                }
                if (special === 6) {
                  if (ts2.isObjectLiteralExpression(binaryExpression.right)) {
                    if (binaryExpression.right.properties.length > 0) {
                      startNode(binaryExpression, className);
                      ts2.forEachChild(binaryExpression.right, addChildrenRecursively);
                      endNode();
                    }
                  }
                } else if (ts2.isFunctionExpression(binaryExpression.right) || ts2.isArrowFunction(binaryExpression.right)) {
                  addNodeWithRecursiveChild(node, binaryExpression.right, className);
                } else {
                  startNode(binaryExpression, className);
                  addNodeWithRecursiveChild(node, binaryExpression.right, assignmentTarget.name);
                  endNode();
                }
                endNestedNodes(depth);
                return;
              }
              case 7:
              case 9: {
                var defineCall = node;
                var className = special === 7 ? defineCall.arguments[0] : defineCall.arguments[0].expression;
                var memberName = defineCall.arguments[1];
                var _j = startNestedNodes(node, className), depth = _j[0], classNameIdentifier = _j[1];
                startNode(node, classNameIdentifier);
                startNode(node, ts2.setTextRange(ts2.factory.createIdentifier(memberName.text), memberName));
                addChildrenRecursively(node.arguments[2]);
                endNode();
                endNode();
                endNestedNodes(depth);
                return;
              }
              case 5: {
                var binaryExpression = node;
                var assignmentTarget = binaryExpression.left;
                var targetFunction = assignmentTarget.expression;
                if (ts2.isIdentifier(targetFunction) && ts2.getElementOrPropertyAccessName(assignmentTarget) !== "prototype" && trackedEs5Classes && trackedEs5Classes.has(targetFunction.text)) {
                  if (ts2.isFunctionExpression(binaryExpression.right) || ts2.isArrowFunction(binaryExpression.right)) {
                    addNodeWithRecursiveChild(node, binaryExpression.right, targetFunction);
                  } else if (ts2.isBindableStaticAccessExpression(assignmentTarget)) {
                    startNode(binaryExpression, targetFunction);
                    addNodeWithRecursiveChild(binaryExpression.left, binaryExpression.right, ts2.getNameOrArgument(assignmentTarget));
                    endNode();
                  }
                  return;
                }
                break;
              }
              case 4:
              case 0:
              case 8:
                break;
              default:
                ts2.Debug.assertNever(special);
            }
          }
          default:
            if (ts2.hasJSDocNodes(node)) {
              ts2.forEach(node.jsDoc, function(jsDoc) {
                ts2.forEach(jsDoc.tags, function(tag) {
                  if (ts2.isJSDocTypeAlias(tag)) {
                    addLeafNode(tag);
                  }
                });
              });
            }
            ts2.forEachChild(node, addChildrenRecursively);
        }
      }
      function mergeChildren(children, node) {
        var nameToItems = new ts2.Map();
        ts2.filterMutate(children, function(child, index) {
          var declName = child.name || ts2.getNameOfDeclaration(child.node);
          var name = declName && nodeText(declName);
          if (!name) {
            return true;
          }
          var itemsWithSameName = nameToItems.get(name);
          if (!itemsWithSameName) {
            nameToItems.set(name, child);
            return true;
          }
          if (itemsWithSameName instanceof Array) {
            for (var _i = 0, itemsWithSameName_1 = itemsWithSameName; _i < itemsWithSameName_1.length; _i++) {
              var itemWithSameName = itemsWithSameName_1[_i];
              if (tryMerge(itemWithSameName, child, index, node)) {
                return false;
              }
            }
            itemsWithSameName.push(child);
            return true;
          } else {
            var itemWithSameName = itemsWithSameName;
            if (tryMerge(itemWithSameName, child, index, node)) {
              return false;
            }
            nameToItems.set(name, [itemWithSameName, child]);
            return true;
          }
        });
      }
      var isEs5ClassMember = (_a = {}, _a[5] = true, _a[3] = true, _a[7] = true, _a[9] = true, _a[0] = false, _a[1] = false, _a[2] = false, _a[8] = false, _a[6] = true, _a[4] = false, _a);
      function tryMergeEs5Class(a, b, bIndex, parent2) {
        function isPossibleConstructor(node) {
          return ts2.isFunctionExpression(node) || ts2.isFunctionDeclaration(node) || ts2.isVariableDeclaration(node);
        }
        var bAssignmentDeclarationKind = ts2.isBinaryExpression(b.node) || ts2.isCallExpression(b.node) ? ts2.getAssignmentDeclarationKind(b.node) : 0;
        var aAssignmentDeclarationKind = ts2.isBinaryExpression(a.node) || ts2.isCallExpression(a.node) ? ts2.getAssignmentDeclarationKind(a.node) : 0;
        if (isEs5ClassMember[bAssignmentDeclarationKind] && isEs5ClassMember[aAssignmentDeclarationKind] || isPossibleConstructor(a.node) && isEs5ClassMember[bAssignmentDeclarationKind] || isPossibleConstructor(b.node) && isEs5ClassMember[aAssignmentDeclarationKind] || ts2.isClassDeclaration(a.node) && isSynthesized(a.node) && isEs5ClassMember[bAssignmentDeclarationKind] || ts2.isClassDeclaration(b.node) && isEs5ClassMember[aAssignmentDeclarationKind] || ts2.isClassDeclaration(a.node) && isSynthesized(a.node) && isPossibleConstructor(b.node) || ts2.isClassDeclaration(b.node) && isPossibleConstructor(a.node) && isSynthesized(a.node)) {
          var lastANode = a.additionalNodes && ts2.lastOrUndefined(a.additionalNodes) || a.node;
          if (!ts2.isClassDeclaration(a.node) && !ts2.isClassDeclaration(b.node) || isPossibleConstructor(a.node) || isPossibleConstructor(b.node)) {
            var ctorFunction = isPossibleConstructor(a.node) ? a.node : isPossibleConstructor(b.node) ? b.node : void 0;
            if (ctorFunction !== void 0) {
              var ctorNode = ts2.setTextRange(ts2.factory.createConstructorDeclaration(void 0, void 0, [], void 0), ctorFunction);
              var ctor = emptyNavigationBarNode(ctorNode);
              ctor.indent = a.indent + 1;
              ctor.children = a.node === ctorFunction ? a.children : b.children;
              a.children = a.node === ctorFunction ? ts2.concatenate([ctor], b.children || [b]) : ts2.concatenate(a.children || [__assign({}, a)], [ctor]);
            } else {
              if (a.children || b.children) {
                a.children = ts2.concatenate(a.children || [__assign({}, a)], b.children || [b]);
                if (a.children) {
                  mergeChildren(a.children, a);
                  sortChildren(a.children);
                }
              }
            }
            lastANode = a.node = ts2.setTextRange(ts2.factory.createClassDeclaration(void 0, void 0, a.name || ts2.factory.createIdentifier("__class__"), void 0, void 0, []), a.node);
          } else {
            a.children = ts2.concatenate(a.children, b.children);
            if (a.children) {
              mergeChildren(a.children, a);
            }
          }
          var bNode = b.node;
          if (parent2.children[bIndex - 1].node.end === lastANode.end) {
            ts2.setTextRange(lastANode, { pos: lastANode.pos, end: bNode.end });
          } else {
            if (!a.additionalNodes)
              a.additionalNodes = [];
            a.additionalNodes.push(ts2.setTextRange(ts2.factory.createClassDeclaration(void 0, void 0, a.name || ts2.factory.createIdentifier("__class__"), void 0, void 0, []), b.node));
          }
          return true;
        }
        return bAssignmentDeclarationKind === 0 ? false : true;
      }
      function tryMerge(a, b, bIndex, parent2) {
        if (tryMergeEs5Class(a, b, bIndex, parent2)) {
          return true;
        }
        if (shouldReallyMerge(a.node, b.node, parent2)) {
          merge(a, b);
          return true;
        }
        return false;
      }
      function shouldReallyMerge(a, b, parent2) {
        if (a.kind !== b.kind || a.parent !== b.parent && !(isOwnChild(a, parent2) && isOwnChild(b, parent2))) {
          return false;
        }
        switch (a.kind) {
          case 166:
          case 168:
          case 171:
          case 172:
            return ts2.isStatic(a) === ts2.isStatic(b);
          case 260:
            return areSameModule(a, b) && getFullyQualifiedModuleName(a) === getFullyQualifiedModuleName(b);
          default:
            return true;
        }
      }
      function isSynthesized(node) {
        return !!(node.flags & 8);
      }
      function isOwnChild(n, parent2) {
        var par = ts2.isModuleBlock(n.parent) ? n.parent.parent : n.parent;
        return par === parent2.node || ts2.contains(parent2.additionalNodes, par);
      }
      function areSameModule(a, b) {
        if (!a.body || !b.body) {
          return a.body === b.body;
        }
        return a.body.kind === b.body.kind && (a.body.kind !== 260 || areSameModule(a.body, b.body));
      }
      function merge(target, source) {
        var _a2;
        target.additionalNodes = target.additionalNodes || [];
        target.additionalNodes.push(source.node);
        if (source.additionalNodes) {
          (_a2 = target.additionalNodes).push.apply(_a2, source.additionalNodes);
        }
        target.children = ts2.concatenate(target.children, source.children);
        if (target.children) {
          mergeChildren(target.children, target);
          sortChildren(target.children);
        }
      }
      function sortChildren(children) {
        children.sort(compareChildren);
      }
      function compareChildren(child1, child2) {
        return ts2.compareStringsCaseSensitiveUI(tryGetName(child1.node), tryGetName(child2.node)) || ts2.compareValues(navigationBarNodeKind(child1), navigationBarNodeKind(child2));
      }
      function tryGetName(node) {
        if (node.kind === 260) {
          return getModuleName(node);
        }
        var declName = ts2.getNameOfDeclaration(node);
        if (declName && ts2.isPropertyName(declName)) {
          var propertyName = ts2.getPropertyNameForPropertyNameNode(declName);
          return propertyName && ts2.unescapeLeadingUnderscores(propertyName);
        }
        switch (node.kind) {
          case 212:
          case 213:
          case 225:
            return getFunctionOrClassName(node);
          default:
            return void 0;
        }
      }
      function getItemName(node, name) {
        if (node.kind === 260) {
          return cleanText(getModuleName(node));
        }
        if (name) {
          var text = ts2.isIdentifier(name) ? name.text : ts2.isElementAccessExpression(name) ? "[".concat(nodeText(name.argumentExpression), "]") : nodeText(name);
          if (text.length > 0) {
            return cleanText(text);
          }
        }
        switch (node.kind) {
          case 303:
            var sourceFile = node;
            return ts2.isExternalModule(sourceFile) ? '"'.concat(ts2.escapeString(ts2.getBaseFileName(ts2.removeFileExtension(ts2.normalizePath(sourceFile.fileName)))), '"') : "<global>";
          case 270:
            return ts2.isExportAssignment(node) && node.isExportEquals ? "export=" : "default";
          case 213:
          case 255:
          case 212:
          case 256:
          case 225:
            if (ts2.getSyntacticModifierFlags(node) & 512) {
              return "default";
            }
            return getFunctionOrClassName(node);
          case 170:
            return "constructor";
          case 174:
            return "new()";
          case 173:
            return "()";
          case 175:
            return "[]";
          default:
            return "<unknown>";
        }
      }
      function primaryNavBarMenuItems(root) {
        var primaryNavBarMenuItems2 = [];
        function recur(item) {
          if (shouldAppearInPrimaryNavBarMenu(item)) {
            primaryNavBarMenuItems2.push(item);
            if (item.children) {
              for (var _i = 0, _a2 = item.children; _i < _a2.length; _i++) {
                var child = _a2[_i];
                recur(child);
              }
            }
          }
        }
        recur(root);
        return primaryNavBarMenuItems2;
        function shouldAppearInPrimaryNavBarMenu(item) {
          if (item.children) {
            return true;
          }
          switch (navigationBarNodeKind(item)) {
            case 256:
            case 225:
            case 259:
            case 257:
            case 260:
            case 303:
            case 258:
            case 343:
            case 336:
              return true;
            case 213:
            case 255:
            case 212:
              return isTopLevelFunctionDeclaration(item);
            default:
              return false;
          }
          function isTopLevelFunctionDeclaration(item2) {
            if (!item2.node.body) {
              return false;
            }
            switch (navigationBarNodeKind(item2.parent)) {
              case 261:
              case 303:
              case 168:
              case 170:
                return true;
              default:
                return false;
            }
          }
        }
      }
      function convertToTree(n) {
        return {
          text: getItemName(n.node, n.name),
          kind: ts2.getNodeKind(n.node),
          kindModifiers: getModifiers(n.node),
          spans: getSpans(n),
          nameSpan: n.name && getNodeSpan(n.name),
          childItems: ts2.map(n.children, convertToTree)
        };
      }
      function convertToPrimaryNavBarMenuItem(n) {
        return {
          text: getItemName(n.node, n.name),
          kind: ts2.getNodeKind(n.node),
          kindModifiers: getModifiers(n.node),
          spans: getSpans(n),
          childItems: ts2.map(n.children, convertToSecondaryNavBarMenuItem) || emptyChildItemArray,
          indent: n.indent,
          bolded: false,
          grayed: false
        };
        function convertToSecondaryNavBarMenuItem(n2) {
          return {
            text: getItemName(n2.node, n2.name),
            kind: ts2.getNodeKind(n2.node),
            kindModifiers: ts2.getNodeModifiers(n2.node),
            spans: getSpans(n2),
            childItems: emptyChildItemArray,
            indent: 0,
            bolded: false,
            grayed: false
          };
        }
      }
      function getSpans(n) {
        var spans = [getNodeSpan(n.node)];
        if (n.additionalNodes) {
          for (var _i = 0, _a2 = n.additionalNodes; _i < _a2.length; _i++) {
            var node = _a2[_i];
            spans.push(getNodeSpan(node));
          }
        }
        return spans;
      }
      function getModuleName(moduleDeclaration) {
        if (ts2.isAmbientModule(moduleDeclaration)) {
          return ts2.getTextOfNode(moduleDeclaration.name);
        }
        return getFullyQualifiedModuleName(moduleDeclaration);
      }
      function getFullyQualifiedModuleName(moduleDeclaration) {
        var result = [ts2.getTextOfIdentifierOrLiteral(moduleDeclaration.name)];
        while (moduleDeclaration.body && moduleDeclaration.body.kind === 260) {
          moduleDeclaration = moduleDeclaration.body;
          result.push(ts2.getTextOfIdentifierOrLiteral(moduleDeclaration.name));
        }
        return result.join(".");
      }
      function getInteriorModule(decl) {
        return decl.body && ts2.isModuleDeclaration(decl.body) ? getInteriorModule(decl.body) : decl;
      }
      function isComputedProperty(member) {
        return !member.name || member.name.kind === 161;
      }
      function getNodeSpan(node) {
        return node.kind === 303 ? ts2.createTextSpanFromRange(node) : ts2.createTextSpanFromNode(node, curSourceFile);
      }
      function getModifiers(node) {
        if (node.parent && node.parent.kind === 253) {
          node = node.parent;
        }
        return ts2.getNodeModifiers(node);
      }
      function getFunctionOrClassName(node) {
        var parent2 = node.parent;
        if (node.name && ts2.getFullWidth(node.name) > 0) {
          return cleanText(ts2.declarationNameToString(node.name));
        } else if (ts2.isVariableDeclaration(parent2)) {
          return cleanText(ts2.declarationNameToString(parent2.name));
        } else if (ts2.isBinaryExpression(parent2) && parent2.operatorToken.kind === 63) {
          return nodeText(parent2.left).replace(whiteSpaceRegex, "");
        } else if (ts2.isPropertyAssignment(parent2)) {
          return nodeText(parent2.name);
        } else if (ts2.getSyntacticModifierFlags(node) & 512) {
          return "default";
        } else if (ts2.isClassLike(node)) {
          return "<class>";
        } else if (ts2.isCallExpression(parent2)) {
          var name = getCalledExpressionName(parent2.expression);
          if (name !== void 0) {
            name = cleanText(name);
            if (name.length > maxLength) {
              return "".concat(name, " callback");
            }
            var args = cleanText(ts2.mapDefined(parent2.arguments, function(a) {
              return ts2.isStringLiteralLike(a) ? a.getText(curSourceFile) : void 0;
            }).join(", "));
            return "".concat(name, "(").concat(args, ") callback");
          }
        }
        return "<function>";
      }
      function getCalledExpressionName(expr) {
        if (ts2.isIdentifier(expr)) {
          return expr.text;
        } else if (ts2.isPropertyAccessExpression(expr)) {
          var left = getCalledExpressionName(expr.expression);
          var right = expr.name.text;
          return left === void 0 ? right : "".concat(left, ".").concat(right);
        } else {
          return void 0;
        }
      }
      function isFunctionOrClassExpression(node) {
        switch (node.kind) {
          case 213:
          case 212:
          case 225:
            return true;
          default:
            return false;
        }
      }
      function cleanText(text) {
        text = text.length > maxLength ? text.substring(0, maxLength) + "..." : text;
        return text.replace(/\\?(\r?\n|\r|\u2028|\u2029)/g, "");
      }
    })(NavigationBar = ts2.NavigationBar || (ts2.NavigationBar = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var OrganizeImports;
    (function(OrganizeImports2) {
      function organizeImports(sourceFile, formatContext, host, program, preferences, skipDestructiveCodeActions) {
        var changeTracker = ts2.textChanges.ChangeTracker.fromContext({ host, formatContext, preferences });
        var coalesceAndOrganizeImports = function(importGroup) {
          return ts2.stableSort(coalesceImports(removeUnusedImports(importGroup, sourceFile, program, skipDestructiveCodeActions)), function(s1, s2) {
            return compareImportsOrRequireStatements(s1, s2);
          });
        };
        var topLevelImportDecls = sourceFile.statements.filter(ts2.isImportDeclaration);
        organizeImportsWorker(topLevelImportDecls, coalesceAndOrganizeImports);
        var topLevelExportDecls = sourceFile.statements.filter(ts2.isExportDeclaration);
        organizeImportsWorker(topLevelExportDecls, coalesceExports);
        for (var _i = 0, _a = sourceFile.statements.filter(ts2.isAmbientModule); _i < _a.length; _i++) {
          var ambientModule = _a[_i];
          if (!ambientModule.body)
            continue;
          var ambientModuleImportDecls = ambientModule.body.statements.filter(ts2.isImportDeclaration);
          organizeImportsWorker(ambientModuleImportDecls, coalesceAndOrganizeImports);
          var ambientModuleExportDecls = ambientModule.body.statements.filter(ts2.isExportDeclaration);
          organizeImportsWorker(ambientModuleExportDecls, coalesceExports);
        }
        return changeTracker.getChanges();
        function organizeImportsWorker(oldImportDecls, coalesce) {
          if (ts2.length(oldImportDecls) === 0) {
            return;
          }
          ts2.suppressLeadingTrivia(oldImportDecls[0]);
          var oldImportGroups = ts2.group(oldImportDecls, function(importDecl) {
            return getExternalModuleName(importDecl.moduleSpecifier);
          });
          var sortedImportGroups = ts2.stableSort(oldImportGroups, function(group1, group2) {
            return compareModuleSpecifiers(group1[0].moduleSpecifier, group2[0].moduleSpecifier);
          });
          var newImportDecls = ts2.flatMap(sortedImportGroups, function(importGroup) {
            return getExternalModuleName(importGroup[0].moduleSpecifier) ? coalesce(importGroup) : importGroup;
          });
          if (newImportDecls.length === 0) {
            changeTracker.deleteNodes(sourceFile, oldImportDecls, {
              trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Include
            }, true);
          } else {
            var replaceOptions = {
              leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.Exclude,
              trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Include,
              suffix: ts2.getNewLineOrDefaultFromHost(host, formatContext.options)
            };
            changeTracker.replaceNodeWithNodes(sourceFile, oldImportDecls[0], newImportDecls, replaceOptions);
            var hasTrailingComment = changeTracker.nodeHasTrailingComment(sourceFile, oldImportDecls[0], replaceOptions);
            changeTracker.deleteNodes(sourceFile, oldImportDecls.slice(1), {
              trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Include
            }, hasTrailingComment);
          }
        }
      }
      OrganizeImports2.organizeImports = organizeImports;
      function removeUnusedImports(oldImports, sourceFile, program, skipDestructiveCodeActions) {
        if (skipDestructiveCodeActions) {
          return oldImports;
        }
        var typeChecker = program.getTypeChecker();
        var jsxNamespace = typeChecker.getJsxNamespace(sourceFile);
        var jsxFragmentFactory = typeChecker.getJsxFragmentFactory(sourceFile);
        var jsxElementsPresent = !!(sourceFile.transformFlags & 2);
        var usedImports = [];
        for (var _i = 0, oldImports_1 = oldImports; _i < oldImports_1.length; _i++) {
          var importDecl = oldImports_1[_i];
          var importClause = importDecl.importClause, moduleSpecifier = importDecl.moduleSpecifier;
          if (!importClause) {
            usedImports.push(importDecl);
            continue;
          }
          var name = importClause.name, namedBindings = importClause.namedBindings;
          if (name && !isDeclarationUsed(name)) {
            name = void 0;
          }
          if (namedBindings) {
            if (ts2.isNamespaceImport(namedBindings)) {
              if (!isDeclarationUsed(namedBindings.name)) {
                namedBindings = void 0;
              }
            } else {
              var newElements = namedBindings.elements.filter(function(e) {
                return isDeclarationUsed(e.name);
              });
              if (newElements.length < namedBindings.elements.length) {
                namedBindings = newElements.length ? ts2.factory.updateNamedImports(namedBindings, newElements) : void 0;
              }
            }
          }
          if (name || namedBindings) {
            usedImports.push(updateImportDeclarationAndClause(importDecl, name, namedBindings));
          } else if (hasModuleDeclarationMatchingSpecifier(sourceFile, moduleSpecifier)) {
            if (sourceFile.isDeclarationFile) {
              usedImports.push(ts2.factory.createImportDeclaration(importDecl.decorators, importDecl.modifiers, void 0, moduleSpecifier, void 0));
            } else {
              usedImports.push(importDecl);
            }
          }
        }
        return usedImports;
        function isDeclarationUsed(identifier) {
          return jsxElementsPresent && (identifier.text === jsxNamespace || jsxFragmentFactory && identifier.text === jsxFragmentFactory) || ts2.FindAllReferences.Core.isSymbolReferencedInFile(identifier, typeChecker, sourceFile);
        }
      }
      function hasModuleDeclarationMatchingSpecifier(sourceFile, moduleSpecifier) {
        var moduleSpecifierText = ts2.isStringLiteral(moduleSpecifier) && moduleSpecifier.text;
        return ts2.isString(moduleSpecifierText) && ts2.some(sourceFile.moduleAugmentations, function(moduleName) {
          return ts2.isStringLiteral(moduleName) && moduleName.text === moduleSpecifierText;
        });
      }
      function getExternalModuleName(specifier) {
        return specifier !== void 0 && ts2.isStringLiteralLike(specifier) ? specifier.text : void 0;
      }
      function coalesceImports(importGroup) {
        var _a;
        if (importGroup.length === 0) {
          return importGroup;
        }
        var _b = getCategorizedImports(importGroup), importWithoutClause = _b.importWithoutClause, typeOnlyImports = _b.typeOnlyImports, regularImports = _b.regularImports;
        var coalescedImports = [];
        if (importWithoutClause) {
          coalescedImports.push(importWithoutClause);
        }
        for (var _i = 0, _c = [regularImports, typeOnlyImports]; _i < _c.length; _i++) {
          var group_2 = _c[_i];
          var isTypeOnly = group_2 === typeOnlyImports;
          var defaultImports = group_2.defaultImports, namespaceImports = group_2.namespaceImports, namedImports = group_2.namedImports;
          if (!isTypeOnly && defaultImports.length === 1 && namespaceImports.length === 1 && namedImports.length === 0) {
            var defaultImport = defaultImports[0];
            coalescedImports.push(updateImportDeclarationAndClause(defaultImport, defaultImport.importClause.name, namespaceImports[0].importClause.namedBindings));
            continue;
          }
          var sortedNamespaceImports = ts2.stableSort(namespaceImports, function(i1, i2) {
            return compareIdentifiers(i1.importClause.namedBindings.name, i2.importClause.namedBindings.name);
          });
          for (var _d = 0, sortedNamespaceImports_1 = sortedNamespaceImports; _d < sortedNamespaceImports_1.length; _d++) {
            var namespaceImport = sortedNamespaceImports_1[_d];
            coalescedImports.push(updateImportDeclarationAndClause(namespaceImport, void 0, namespaceImport.importClause.namedBindings));
          }
          if (defaultImports.length === 0 && namedImports.length === 0) {
            continue;
          }
          var newDefaultImport = void 0;
          var newImportSpecifiers = [];
          if (defaultImports.length === 1) {
            newDefaultImport = defaultImports[0].importClause.name;
          } else {
            for (var _e = 0, defaultImports_1 = defaultImports; _e < defaultImports_1.length; _e++) {
              var defaultImport = defaultImports_1[_e];
              newImportSpecifiers.push(ts2.factory.createImportSpecifier(false, ts2.factory.createIdentifier("default"), defaultImport.importClause.name));
            }
          }
          newImportSpecifiers.push.apply(newImportSpecifiers, ts2.flatMap(namedImports, function(i) {
            return i.importClause.namedBindings.elements;
          }));
          var sortedImportSpecifiers = sortSpecifiers(newImportSpecifiers);
          var importDecl = defaultImports.length > 0 ? defaultImports[0] : namedImports[0];
          var newNamedImports = sortedImportSpecifiers.length === 0 ? newDefaultImport ? void 0 : ts2.factory.createNamedImports(ts2.emptyArray) : namedImports.length === 0 ? ts2.factory.createNamedImports(sortedImportSpecifiers) : ts2.factory.updateNamedImports(namedImports[0].importClause.namedBindings, sortedImportSpecifiers);
          if (isTypeOnly && newDefaultImport && newNamedImports) {
            coalescedImports.push(updateImportDeclarationAndClause(importDecl, newDefaultImport, void 0));
            coalescedImports.push(updateImportDeclarationAndClause((_a = namedImports[0]) !== null && _a !== void 0 ? _a : importDecl, void 0, newNamedImports));
          } else {
            coalescedImports.push(updateImportDeclarationAndClause(importDecl, newDefaultImport, newNamedImports));
          }
        }
        return coalescedImports;
      }
      OrganizeImports2.coalesceImports = coalesceImports;
      function getCategorizedImports(importGroup) {
        var importWithoutClause;
        var typeOnlyImports = { defaultImports: [], namespaceImports: [], namedImports: [] };
        var regularImports = { defaultImports: [], namespaceImports: [], namedImports: [] };
        for (var _i = 0, importGroup_1 = importGroup; _i < importGroup_1.length; _i++) {
          var importDeclaration = importGroup_1[_i];
          if (importDeclaration.importClause === void 0) {
            importWithoutClause = importWithoutClause || importDeclaration;
            continue;
          }
          var group_3 = importDeclaration.importClause.isTypeOnly ? typeOnlyImports : regularImports;
          var _a = importDeclaration.importClause, name = _a.name, namedBindings = _a.namedBindings;
          if (name) {
            group_3.defaultImports.push(importDeclaration);
          }
          if (namedBindings) {
            if (ts2.isNamespaceImport(namedBindings)) {
              group_3.namespaceImports.push(importDeclaration);
            } else {
              group_3.namedImports.push(importDeclaration);
            }
          }
        }
        return {
          importWithoutClause,
          typeOnlyImports,
          regularImports
        };
      }
      function coalesceExports(exportGroup) {
        if (exportGroup.length === 0) {
          return exportGroup;
        }
        var _a = getCategorizedExports(exportGroup), exportWithoutClause = _a.exportWithoutClause, namedExports = _a.namedExports, typeOnlyExports = _a.typeOnlyExports;
        var coalescedExports = [];
        if (exportWithoutClause) {
          coalescedExports.push(exportWithoutClause);
        }
        for (var _i = 0, _b = [namedExports, typeOnlyExports]; _i < _b.length; _i++) {
          var exportGroup_1 = _b[_i];
          if (exportGroup_1.length === 0) {
            continue;
          }
          var newExportSpecifiers = [];
          newExportSpecifiers.push.apply(newExportSpecifiers, ts2.flatMap(exportGroup_1, function(i) {
            return i.exportClause && ts2.isNamedExports(i.exportClause) ? i.exportClause.elements : ts2.emptyArray;
          }));
          var sortedExportSpecifiers = sortSpecifiers(newExportSpecifiers);
          var exportDecl = exportGroup_1[0];
          coalescedExports.push(ts2.factory.updateExportDeclaration(exportDecl, exportDecl.decorators, exportDecl.modifiers, exportDecl.isTypeOnly, exportDecl.exportClause && (ts2.isNamedExports(exportDecl.exportClause) ? ts2.factory.updateNamedExports(exportDecl.exportClause, sortedExportSpecifiers) : ts2.factory.updateNamespaceExport(exportDecl.exportClause, exportDecl.exportClause.name)), exportDecl.moduleSpecifier, exportDecl.assertClause));
        }
        return coalescedExports;
        function getCategorizedExports(exportGroup2) {
          var exportWithoutClause2;
          var namedExports2 = [];
          var typeOnlyExports2 = [];
          for (var _i2 = 0, exportGroup_2 = exportGroup2; _i2 < exportGroup_2.length; _i2++) {
            var exportDeclaration = exportGroup_2[_i2];
            if (exportDeclaration.exportClause === void 0) {
              exportWithoutClause2 = exportWithoutClause2 || exportDeclaration;
            } else if (exportDeclaration.isTypeOnly) {
              typeOnlyExports2.push(exportDeclaration);
            } else {
              namedExports2.push(exportDeclaration);
            }
          }
          return {
            exportWithoutClause: exportWithoutClause2,
            namedExports: namedExports2,
            typeOnlyExports: typeOnlyExports2
          };
        }
      }
      OrganizeImports2.coalesceExports = coalesceExports;
      function updateImportDeclarationAndClause(importDeclaration, name, namedBindings) {
        return ts2.factory.updateImportDeclaration(importDeclaration, importDeclaration.decorators, importDeclaration.modifiers, ts2.factory.updateImportClause(importDeclaration.importClause, importDeclaration.importClause.isTypeOnly, name, namedBindings), importDeclaration.moduleSpecifier, importDeclaration.assertClause);
      }
      function sortSpecifiers(specifiers) {
        return ts2.stableSort(specifiers, compareImportOrExportSpecifiers);
      }
      function compareImportOrExportSpecifiers(s1, s2) {
        return ts2.compareBooleans(s1.isTypeOnly, s2.isTypeOnly) || compareIdentifiers(s1.propertyName || s1.name, s2.propertyName || s2.name) || compareIdentifiers(s1.name, s2.name);
      }
      OrganizeImports2.compareImportOrExportSpecifiers = compareImportOrExportSpecifiers;
      function compareModuleSpecifiers(m1, m2) {
        var name1 = m1 === void 0 ? void 0 : getExternalModuleName(m1);
        var name2 = m2 === void 0 ? void 0 : getExternalModuleName(m2);
        return ts2.compareBooleans(name1 === void 0, name2 === void 0) || ts2.compareBooleans(ts2.isExternalModuleNameRelative(name1), ts2.isExternalModuleNameRelative(name2)) || ts2.compareStringsCaseInsensitive(name1, name2);
      }
      OrganizeImports2.compareModuleSpecifiers = compareModuleSpecifiers;
      function compareIdentifiers(s1, s2) {
        return ts2.compareStringsCaseInsensitive(s1.text, s2.text);
      }
      function getModuleSpecifierExpression(declaration) {
        var _a;
        switch (declaration.kind) {
          case 264:
            return (_a = ts2.tryCast(declaration.moduleReference, ts2.isExternalModuleReference)) === null || _a === void 0 ? void 0 : _a.expression;
          case 265:
            return declaration.moduleSpecifier;
          case 236:
            return declaration.declarationList.declarations[0].initializer.arguments[0];
        }
      }
      function importsAreSorted(imports) {
        return ts2.arrayIsSorted(imports, compareImportsOrRequireStatements);
      }
      OrganizeImports2.importsAreSorted = importsAreSorted;
      function importSpecifiersAreSorted(imports) {
        return ts2.arrayIsSorted(imports, compareImportOrExportSpecifiers);
      }
      OrganizeImports2.importSpecifiersAreSorted = importSpecifiersAreSorted;
      function getImportDeclarationInsertionIndex(sortedImports, newImport) {
        var index = ts2.binarySearch(sortedImports, newImport, ts2.identity, compareImportsOrRequireStatements);
        return index < 0 ? ~index : index;
      }
      OrganizeImports2.getImportDeclarationInsertionIndex = getImportDeclarationInsertionIndex;
      function getImportSpecifierInsertionIndex(sortedImports, newImport) {
        var index = ts2.binarySearch(sortedImports, newImport, ts2.identity, compareImportOrExportSpecifiers);
        return index < 0 ? ~index : index;
      }
      OrganizeImports2.getImportSpecifierInsertionIndex = getImportSpecifierInsertionIndex;
      function compareImportsOrRequireStatements(s1, s2) {
        return compareModuleSpecifiers(getModuleSpecifierExpression(s1), getModuleSpecifierExpression(s2)) || compareImportKind(s1, s2);
      }
      OrganizeImports2.compareImportsOrRequireStatements = compareImportsOrRequireStatements;
      function compareImportKind(s1, s2) {
        return ts2.compareValues(getImportKindOrder(s1), getImportKindOrder(s2));
      }
      function getImportKindOrder(s1) {
        var _a;
        switch (s1.kind) {
          case 265:
            if (!s1.importClause)
              return 0;
            if (s1.importClause.isTypeOnly)
              return 1;
            if (((_a = s1.importClause.namedBindings) === null || _a === void 0 ? void 0 : _a.kind) === 267)
              return 2;
            if (s1.importClause.name)
              return 3;
            return 4;
          case 264:
            return 5;
          case 236:
            return 6;
        }
      }
    })(OrganizeImports = ts2.OrganizeImports || (ts2.OrganizeImports = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var OutliningElementsCollector;
    (function(OutliningElementsCollector2) {
      function collectElements(sourceFile, cancellationToken) {
        var res = [];
        addNodeOutliningSpans(sourceFile, cancellationToken, res);
        addRegionOutliningSpans(sourceFile, res);
        return res.sort(function(span1, span2) {
          return span1.textSpan.start - span2.textSpan.start;
        });
      }
      OutliningElementsCollector2.collectElements = collectElements;
      function addNodeOutliningSpans(sourceFile, cancellationToken, out) {
        var depthRemaining = 40;
        var current = 0;
        var statements = __spreadArray(__spreadArray([], sourceFile.statements, true), [sourceFile.endOfFileToken], false);
        var n = statements.length;
        while (current < n) {
          while (current < n && !ts2.isAnyImportSyntax(statements[current])) {
            visitNonImportNode(statements[current]);
            current++;
          }
          if (current === n)
            break;
          var firstImport = current;
          while (current < n && ts2.isAnyImportSyntax(statements[current])) {
            addOutliningForLeadingCommentsForNode(statements[current], sourceFile, cancellationToken, out);
            current++;
          }
          var lastImport = current - 1;
          if (lastImport !== firstImport) {
            out.push(createOutliningSpanFromBounds(ts2.findChildOfKind(statements[firstImport], 100, sourceFile).getStart(sourceFile), statements[lastImport].getEnd(), "imports"));
          }
        }
        function visitNonImportNode(n2) {
          var _a;
          if (depthRemaining === 0)
            return;
          cancellationToken.throwIfCancellationRequested();
          if (ts2.isDeclaration(n2) || ts2.isVariableStatement(n2) || ts2.isReturnStatement(n2) || n2.kind === 1) {
            addOutliningForLeadingCommentsForNode(n2, sourceFile, cancellationToken, out);
          }
          if (ts2.isFunctionLike(n2) && ts2.isBinaryExpression(n2.parent) && ts2.isPropertyAccessExpression(n2.parent.left)) {
            addOutliningForLeadingCommentsForNode(n2.parent.left, sourceFile, cancellationToken, out);
          }
          if (ts2.isBlock(n2) || ts2.isModuleBlock(n2)) {
            addOutliningForLeadingCommentsForPos(n2.statements.end, sourceFile, cancellationToken, out);
          }
          if (ts2.isClassLike(n2) || ts2.isInterfaceDeclaration(n2)) {
            addOutliningForLeadingCommentsForPos(n2.members.end, sourceFile, cancellationToken, out);
          }
          var span = getOutliningSpanForNode(n2, sourceFile);
          if (span)
            out.push(span);
          depthRemaining--;
          if (ts2.isCallExpression(n2)) {
            depthRemaining++;
            visitNonImportNode(n2.expression);
            depthRemaining--;
            n2.arguments.forEach(visitNonImportNode);
            (_a = n2.typeArguments) === null || _a === void 0 ? void 0 : _a.forEach(visitNonImportNode);
          } else if (ts2.isIfStatement(n2) && n2.elseStatement && ts2.isIfStatement(n2.elseStatement)) {
            visitNonImportNode(n2.expression);
            visitNonImportNode(n2.thenStatement);
            depthRemaining++;
            visitNonImportNode(n2.elseStatement);
            depthRemaining--;
          } else {
            n2.forEachChild(visitNonImportNode);
          }
          depthRemaining++;
        }
      }
      function addRegionOutliningSpans(sourceFile, out) {
        var regions = [];
        var lineStarts = sourceFile.getLineStarts();
        for (var _i = 0, lineStarts_1 = lineStarts; _i < lineStarts_1.length; _i++) {
          var currentLineStart = lineStarts_1[_i];
          var lineEnd = sourceFile.getLineEndOfPosition(currentLineStart);
          var lineText = sourceFile.text.substring(currentLineStart, lineEnd);
          var result = isRegionDelimiter(lineText);
          if (!result || ts2.isInComment(sourceFile, currentLineStart)) {
            continue;
          }
          if (!result[1]) {
            var span = ts2.createTextSpanFromBounds(sourceFile.text.indexOf("//", currentLineStart), lineEnd);
            regions.push(createOutliningSpan(span, "region", span, false, result[2] || "#region"));
          } else {
            var region = regions.pop();
            if (region) {
              region.textSpan.length = lineEnd - region.textSpan.start;
              region.hintSpan.length = lineEnd - region.textSpan.start;
              out.push(region);
            }
          }
        }
      }
      var regionDelimiterRegExp = /^#(end)?region(?:\s+(.*))?(?:\r)?$/;
      function isRegionDelimiter(lineText) {
        lineText = ts2.trimStringStart(lineText);
        if (!ts2.startsWith(lineText, "//")) {
          return null;
        }
        lineText = ts2.trimString(lineText.slice(2));
        return regionDelimiterRegExp.exec(lineText);
      }
      function addOutliningForLeadingCommentsForPos(pos, sourceFile, cancellationToken, out) {
        var comments = ts2.getLeadingCommentRanges(sourceFile.text, pos);
        if (!comments)
          return;
        var firstSingleLineCommentStart = -1;
        var lastSingleLineCommentEnd = -1;
        var singleLineCommentCount = 0;
        var sourceText = sourceFile.getFullText();
        for (var _i = 0, comments_1 = comments; _i < comments_1.length; _i++) {
          var _a = comments_1[_i], kind = _a.kind, pos_1 = _a.pos, end = _a.end;
          cancellationToken.throwIfCancellationRequested();
          switch (kind) {
            case 2:
              var commentText = sourceText.slice(pos_1, end);
              if (isRegionDelimiter(commentText)) {
                combineAndAddMultipleSingleLineComments();
                singleLineCommentCount = 0;
                break;
              }
              if (singleLineCommentCount === 0) {
                firstSingleLineCommentStart = pos_1;
              }
              lastSingleLineCommentEnd = end;
              singleLineCommentCount++;
              break;
            case 3:
              combineAndAddMultipleSingleLineComments();
              out.push(createOutliningSpanFromBounds(pos_1, end, "comment"));
              singleLineCommentCount = 0;
              break;
            default:
              ts2.Debug.assertNever(kind);
          }
        }
        combineAndAddMultipleSingleLineComments();
        function combineAndAddMultipleSingleLineComments() {
          if (singleLineCommentCount > 1) {
            out.push(createOutliningSpanFromBounds(firstSingleLineCommentStart, lastSingleLineCommentEnd, "comment"));
          }
        }
      }
      function addOutliningForLeadingCommentsForNode(n, sourceFile, cancellationToken, out) {
        if (ts2.isJsxText(n))
          return;
        addOutliningForLeadingCommentsForPos(n.pos, sourceFile, cancellationToken, out);
      }
      function createOutliningSpanFromBounds(pos, end, kind) {
        return createOutliningSpan(ts2.createTextSpanFromBounds(pos, end), kind);
      }
      function getOutliningSpanForNode(n, sourceFile) {
        switch (n.kind) {
          case 234:
            if (ts2.isFunctionLike(n.parent)) {
              return functionSpan(n.parent, n, sourceFile);
            }
            switch (n.parent.kind) {
              case 239:
              case 242:
              case 243:
              case 241:
              case 238:
              case 240:
              case 247:
              case 291:
                return spanForNode(n.parent);
              case 251:
                var tryStatement = n.parent;
                if (tryStatement.tryBlock === n) {
                  return spanForNode(n.parent);
                } else if (tryStatement.finallyBlock === n) {
                  var node = ts2.findChildOfKind(tryStatement, 96, sourceFile);
                  if (node)
                    return spanForNode(node);
                }
              default:
                return createOutliningSpan(ts2.createTextSpanFromNode(n, sourceFile), "code");
            }
          case 261:
            return spanForNode(n.parent);
          case 256:
          case 225:
          case 257:
          case 259:
          case 262:
          case 181:
          case 200:
            return spanForNode(n);
          case 183:
            return spanForNode(n, false, !ts2.isTupleTypeNode(n.parent), 22);
          case 288:
          case 289:
            return spanForNodeArray(n.statements);
          case 204:
            return spanForObjectOrArrayLiteral(n);
          case 203:
            return spanForObjectOrArrayLiteral(n, 22);
          case 277:
            return spanForJSXElement(n);
          case 281:
            return spanForJSXFragment(n);
          case 278:
          case 279:
            return spanForJSXAttributes(n.attributes);
          case 222:
          case 14:
            return spanForTemplateLiteral(n);
          case 201:
            return spanForNode(n, false, !ts2.isBindingElement(n.parent), 22);
          case 213:
            return spanForArrowFunction(n);
          case 207:
            return spanForCallExpression(n);
        }
        function spanForCallExpression(node2) {
          if (!node2.arguments.length) {
            return void 0;
          }
          var openToken = ts2.findChildOfKind(node2, 20, sourceFile);
          var closeToken = ts2.findChildOfKind(node2, 21, sourceFile);
          if (!openToken || !closeToken || ts2.positionsAreOnSameLine(openToken.pos, closeToken.pos, sourceFile)) {
            return void 0;
          }
          return spanBetweenTokens(openToken, closeToken, node2, sourceFile, false, true);
        }
        function spanForArrowFunction(node2) {
          if (ts2.isBlock(node2.body) || ts2.positionsAreOnSameLine(node2.body.getFullStart(), node2.body.getEnd(), sourceFile)) {
            return void 0;
          }
          var textSpan = ts2.createTextSpanFromBounds(node2.body.getFullStart(), node2.body.getEnd());
          return createOutliningSpan(textSpan, "code", ts2.createTextSpanFromNode(node2));
        }
        function spanForJSXElement(node2) {
          var textSpan = ts2.createTextSpanFromBounds(node2.openingElement.getStart(sourceFile), node2.closingElement.getEnd());
          var tagName = node2.openingElement.tagName.getText(sourceFile);
          var bannerText = "<" + tagName + ">...</" + tagName + ">";
          return createOutliningSpan(textSpan, "code", textSpan, false, bannerText);
        }
        function spanForJSXFragment(node2) {
          var textSpan = ts2.createTextSpanFromBounds(node2.openingFragment.getStart(sourceFile), node2.closingFragment.getEnd());
          var bannerText = "<>...</>";
          return createOutliningSpan(textSpan, "code", textSpan, false, bannerText);
        }
        function spanForJSXAttributes(node2) {
          if (node2.properties.length === 0) {
            return void 0;
          }
          return createOutliningSpanFromBounds(node2.getStart(sourceFile), node2.getEnd(), "code");
        }
        function spanForTemplateLiteral(node2) {
          if (node2.kind === 14 && node2.text.length === 0) {
            return void 0;
          }
          return createOutliningSpanFromBounds(node2.getStart(sourceFile), node2.getEnd(), "code");
        }
        function spanForObjectOrArrayLiteral(node2, open) {
          if (open === void 0) {
            open = 18;
          }
          return spanForNode(node2, false, !ts2.isArrayLiteralExpression(node2.parent) && !ts2.isCallExpression(node2.parent), open);
        }
        function spanForNode(hintSpanNode, autoCollapse, useFullStart, open, close) {
          if (autoCollapse === void 0) {
            autoCollapse = false;
          }
          if (useFullStart === void 0) {
            useFullStart = true;
          }
          if (open === void 0) {
            open = 18;
          }
          if (close === void 0) {
            close = open === 18 ? 19 : 23;
          }
          var openToken = ts2.findChildOfKind(n, open, sourceFile);
          var closeToken = ts2.findChildOfKind(n, close, sourceFile);
          return openToken && closeToken && spanBetweenTokens(openToken, closeToken, hintSpanNode, sourceFile, autoCollapse, useFullStart);
        }
        function spanForNodeArray(nodeArray) {
          return nodeArray.length ? createOutliningSpan(ts2.createTextSpanFromRange(nodeArray), "code") : void 0;
        }
      }
      function functionSpan(node, body, sourceFile) {
        var openToken = tryGetFunctionOpenToken(node, body, sourceFile);
        var closeToken = ts2.findChildOfKind(body, 19, sourceFile);
        return openToken && closeToken && spanBetweenTokens(openToken, closeToken, node, sourceFile, node.kind !== 213);
      }
      function spanBetweenTokens(openToken, closeToken, hintSpanNode, sourceFile, autoCollapse, useFullStart) {
        if (autoCollapse === void 0) {
          autoCollapse = false;
        }
        if (useFullStart === void 0) {
          useFullStart = true;
        }
        var textSpan = ts2.createTextSpanFromBounds(useFullStart ? openToken.getFullStart() : openToken.getStart(sourceFile), closeToken.getEnd());
        return createOutliningSpan(textSpan, "code", ts2.createTextSpanFromNode(hintSpanNode, sourceFile), autoCollapse);
      }
      function createOutliningSpan(textSpan, kind, hintSpan, autoCollapse, bannerText) {
        if (hintSpan === void 0) {
          hintSpan = textSpan;
        }
        if (autoCollapse === void 0) {
          autoCollapse = false;
        }
        if (bannerText === void 0) {
          bannerText = "...";
        }
        return { textSpan, kind, hintSpan, bannerText, autoCollapse };
      }
      function tryGetFunctionOpenToken(node, body, sourceFile) {
        if (ts2.isNodeArrayMultiLine(node.parameters, sourceFile)) {
          var openParenToken = ts2.findChildOfKind(node, 20, sourceFile);
          if (openParenToken) {
            return openParenToken;
          }
        }
        return ts2.findChildOfKind(body, 18, sourceFile);
      }
    })(OutliningElementsCollector = ts2.OutliningElementsCollector || (ts2.OutliningElementsCollector = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var PatternMatchKind;
    (function(PatternMatchKind2) {
      PatternMatchKind2[PatternMatchKind2["exact"] = 0] = "exact";
      PatternMatchKind2[PatternMatchKind2["prefix"] = 1] = "prefix";
      PatternMatchKind2[PatternMatchKind2["substring"] = 2] = "substring";
      PatternMatchKind2[PatternMatchKind2["camelCase"] = 3] = "camelCase";
    })(PatternMatchKind = ts2.PatternMatchKind || (ts2.PatternMatchKind = {}));
    function createPatternMatch(kind, isCaseSensitive) {
      return {
        kind,
        isCaseSensitive
      };
    }
    function createPatternMatcher(pattern) {
      var stringToWordSpans = new ts2.Map();
      var dotSeparatedSegments = pattern.trim().split(".").map(function(p) {
        return createSegment(p.trim());
      });
      if (dotSeparatedSegments.some(function(segment) {
        return !segment.subWordTextChunks.length;
      }))
        return void 0;
      return {
        getFullMatch: function(containers, candidate) {
          return getFullMatch(containers, candidate, dotSeparatedSegments, stringToWordSpans);
        },
        getMatchForLastSegmentOfPattern: function(candidate) {
          return matchSegment(candidate, ts2.last(dotSeparatedSegments), stringToWordSpans);
        },
        patternContainsDots: dotSeparatedSegments.length > 1
      };
    }
    ts2.createPatternMatcher = createPatternMatcher;
    function getFullMatch(candidateContainers, candidate, dotSeparatedSegments, stringToWordSpans) {
      var candidateMatch = matchSegment(candidate, ts2.last(dotSeparatedSegments), stringToWordSpans);
      if (!candidateMatch) {
        return void 0;
      }
      if (dotSeparatedSegments.length - 1 > candidateContainers.length) {
        return void 0;
      }
      var bestMatch;
      for (var i = dotSeparatedSegments.length - 2, j = candidateContainers.length - 1; i >= 0; i -= 1, j -= 1) {
        bestMatch = betterMatch(bestMatch, matchSegment(candidateContainers[j], dotSeparatedSegments[i], stringToWordSpans));
      }
      return bestMatch;
    }
    function getWordSpans(word, stringToWordSpans) {
      var spans = stringToWordSpans.get(word);
      if (!spans) {
        stringToWordSpans.set(word, spans = breakIntoWordSpans(word));
      }
      return spans;
    }
    function matchTextChunk(candidate, chunk, stringToWordSpans) {
      var index = indexOfIgnoringCase(candidate, chunk.textLowerCase);
      if (index === 0) {
        return createPatternMatch(chunk.text.length === candidate.length ? PatternMatchKind.exact : PatternMatchKind.prefix, ts2.startsWith(candidate, chunk.text));
      }
      if (chunk.isLowerCase) {
        if (index === -1)
          return void 0;
        var wordSpans = getWordSpans(candidate, stringToWordSpans);
        for (var _i = 0, wordSpans_1 = wordSpans; _i < wordSpans_1.length; _i++) {
          var span = wordSpans_1[_i];
          if (partStartsWith(candidate, span, chunk.text, true)) {
            return createPatternMatch(PatternMatchKind.substring, partStartsWith(candidate, span, chunk.text, false));
          }
        }
        if (chunk.text.length < candidate.length && isUpperCaseLetter(candidate.charCodeAt(index))) {
          return createPatternMatch(PatternMatchKind.substring, false);
        }
      } else {
        if (candidate.indexOf(chunk.text) > 0) {
          return createPatternMatch(PatternMatchKind.substring, true);
        }
        if (chunk.characterSpans.length > 0) {
          var candidateParts = getWordSpans(candidate, stringToWordSpans);
          var isCaseSensitive = tryCamelCaseMatch(candidate, candidateParts, chunk, false) ? true : tryCamelCaseMatch(candidate, candidateParts, chunk, true) ? false : void 0;
          if (isCaseSensitive !== void 0) {
            return createPatternMatch(PatternMatchKind.camelCase, isCaseSensitive);
          }
        }
      }
    }
    function matchSegment(candidate, segment, stringToWordSpans) {
      if (every(segment.totalTextChunk.text, function(ch) {
        return ch !== 32 && ch !== 42;
      })) {
        var match = matchTextChunk(candidate, segment.totalTextChunk, stringToWordSpans);
        if (match)
          return match;
      }
      var subWordTextChunks = segment.subWordTextChunks;
      var bestMatch;
      for (var _i = 0, subWordTextChunks_1 = subWordTextChunks; _i < subWordTextChunks_1.length; _i++) {
        var subWordTextChunk = subWordTextChunks_1[_i];
        bestMatch = betterMatch(bestMatch, matchTextChunk(candidate, subWordTextChunk, stringToWordSpans));
      }
      return bestMatch;
    }
    function betterMatch(a, b) {
      return ts2.min(a, b, compareMatches);
    }
    function compareMatches(a, b) {
      return a === void 0 ? 1 : b === void 0 ? -1 : ts2.compareValues(a.kind, b.kind) || ts2.compareBooleans(!a.isCaseSensitive, !b.isCaseSensitive);
    }
    function partStartsWith(candidate, candidateSpan, pattern, ignoreCase, patternSpan) {
      if (patternSpan === void 0) {
        patternSpan = { start: 0, length: pattern.length };
      }
      return patternSpan.length <= candidateSpan.length && everyInRange(0, patternSpan.length, function(i) {
        return equalChars(pattern.charCodeAt(patternSpan.start + i), candidate.charCodeAt(candidateSpan.start + i), ignoreCase);
      });
    }
    function equalChars(ch1, ch2, ignoreCase) {
      return ignoreCase ? toLowerCase(ch1) === toLowerCase(ch2) : ch1 === ch2;
    }
    function tryCamelCaseMatch(candidate, candidateParts, chunk, ignoreCase) {
      var chunkCharacterSpans = chunk.characterSpans;
      var currentCandidate = 0;
      var currentChunkSpan = 0;
      var firstMatch;
      var contiguous;
      while (true) {
        if (currentChunkSpan === chunkCharacterSpans.length) {
          return true;
        } else if (currentCandidate === candidateParts.length) {
          return false;
        }
        var candidatePart = candidateParts[currentCandidate];
        var gotOneMatchThisCandidate = false;
        for (; currentChunkSpan < chunkCharacterSpans.length; currentChunkSpan++) {
          var chunkCharacterSpan = chunkCharacterSpans[currentChunkSpan];
          if (gotOneMatchThisCandidate) {
            if (!isUpperCaseLetter(chunk.text.charCodeAt(chunkCharacterSpans[currentChunkSpan - 1].start)) || !isUpperCaseLetter(chunk.text.charCodeAt(chunkCharacterSpans[currentChunkSpan].start))) {
              break;
            }
          }
          if (!partStartsWith(candidate, candidatePart, chunk.text, ignoreCase, chunkCharacterSpan)) {
            break;
          }
          gotOneMatchThisCandidate = true;
          firstMatch = firstMatch === void 0 ? currentCandidate : firstMatch;
          contiguous = contiguous === void 0 ? true : contiguous;
          candidatePart = ts2.createTextSpan(candidatePart.start + chunkCharacterSpan.length, candidatePart.length - chunkCharacterSpan.length);
        }
        if (!gotOneMatchThisCandidate && contiguous !== void 0) {
          contiguous = false;
        }
        currentCandidate++;
      }
    }
    function createSegment(text) {
      return {
        totalTextChunk: createTextChunk(text),
        subWordTextChunks: breakPatternIntoTextChunks(text)
      };
    }
    function isUpperCaseLetter(ch) {
      if (ch >= 65 && ch <= 90) {
        return true;
      }
      if (ch < 127 || !ts2.isUnicodeIdentifierStart(ch, 99)) {
        return false;
      }
      var str = String.fromCharCode(ch);
      return str === str.toUpperCase();
    }
    function isLowerCaseLetter(ch) {
      if (ch >= 97 && ch <= 122) {
        return true;
      }
      if (ch < 127 || !ts2.isUnicodeIdentifierStart(ch, 99)) {
        return false;
      }
      var str = String.fromCharCode(ch);
      return str === str.toLowerCase();
    }
    function indexOfIgnoringCase(str, value) {
      var n = str.length - value.length;
      var _loop_8 = function(start2) {
        if (every(value, function(valueChar, i) {
          return toLowerCase(str.charCodeAt(i + start2)) === valueChar;
        })) {
          return { value: start2 };
        }
      };
      for (var start = 0; start <= n; start++) {
        var state_3 = _loop_8(start);
        if (typeof state_3 === "object")
          return state_3.value;
      }
      return -1;
    }
    function toLowerCase(ch) {
      if (ch >= 65 && ch <= 90) {
        return 97 + (ch - 65);
      }
      if (ch < 127) {
        return ch;
      }
      return String.fromCharCode(ch).toLowerCase().charCodeAt(0);
    }
    function isDigit(ch) {
      return ch >= 48 && ch <= 57;
    }
    function isWordChar(ch) {
      return isUpperCaseLetter(ch) || isLowerCaseLetter(ch) || isDigit(ch) || ch === 95 || ch === 36;
    }
    function breakPatternIntoTextChunks(pattern) {
      var result = [];
      var wordStart = 0;
      var wordLength = 0;
      for (var i = 0; i < pattern.length; i++) {
        var ch = pattern.charCodeAt(i);
        if (isWordChar(ch)) {
          if (wordLength === 0) {
            wordStart = i;
          }
          wordLength++;
        } else {
          if (wordLength > 0) {
            result.push(createTextChunk(pattern.substr(wordStart, wordLength)));
            wordLength = 0;
          }
        }
      }
      if (wordLength > 0) {
        result.push(createTextChunk(pattern.substr(wordStart, wordLength)));
      }
      return result;
    }
    function createTextChunk(text) {
      var textLowerCase = text.toLowerCase();
      return {
        text,
        textLowerCase,
        isLowerCase: text === textLowerCase,
        characterSpans: breakIntoCharacterSpans(text)
      };
    }
    function breakIntoCharacterSpans(identifier) {
      return breakIntoSpans(identifier, false);
    }
    ts2.breakIntoCharacterSpans = breakIntoCharacterSpans;
    function breakIntoWordSpans(identifier) {
      return breakIntoSpans(identifier, true);
    }
    ts2.breakIntoWordSpans = breakIntoWordSpans;
    function breakIntoSpans(identifier, word) {
      var result = [];
      var wordStart = 0;
      for (var i = 1; i < identifier.length; i++) {
        var lastIsDigit = isDigit(identifier.charCodeAt(i - 1));
        var currentIsDigit = isDigit(identifier.charCodeAt(i));
        var hasTransitionFromLowerToUpper = transitionFromLowerToUpper(identifier, word, i);
        var hasTransitionFromUpperToLower = word && transitionFromUpperToLower(identifier, i, wordStart);
        if (charIsPunctuation(identifier.charCodeAt(i - 1)) || charIsPunctuation(identifier.charCodeAt(i)) || lastIsDigit !== currentIsDigit || hasTransitionFromLowerToUpper || hasTransitionFromUpperToLower) {
          if (!isAllPunctuation(identifier, wordStart, i)) {
            result.push(ts2.createTextSpan(wordStart, i - wordStart));
          }
          wordStart = i;
        }
      }
      if (!isAllPunctuation(identifier, wordStart, identifier.length)) {
        result.push(ts2.createTextSpan(wordStart, identifier.length - wordStart));
      }
      return result;
    }
    function charIsPunctuation(ch) {
      switch (ch) {
        case 33:
        case 34:
        case 35:
        case 37:
        case 38:
        case 39:
        case 40:
        case 41:
        case 42:
        case 44:
        case 45:
        case 46:
        case 47:
        case 58:
        case 59:
        case 63:
        case 64:
        case 91:
        case 92:
        case 93:
        case 95:
        case 123:
        case 125:
          return true;
      }
      return false;
    }
    function isAllPunctuation(identifier, start, end) {
      return every(identifier, function(ch) {
        return charIsPunctuation(ch) && ch !== 95;
      }, start, end);
    }
    function transitionFromUpperToLower(identifier, index, wordStart) {
      return index !== wordStart && index + 1 < identifier.length && isUpperCaseLetter(identifier.charCodeAt(index)) && isLowerCaseLetter(identifier.charCodeAt(index + 1)) && every(identifier, isUpperCaseLetter, wordStart, index);
    }
    function transitionFromLowerToUpper(identifier, word, index) {
      var lastIsUpper = isUpperCaseLetter(identifier.charCodeAt(index - 1));
      var currentIsUpper = isUpperCaseLetter(identifier.charCodeAt(index));
      return currentIsUpper && (!word || !lastIsUpper);
    }
    function everyInRange(start, end, pred) {
      for (var i = start; i < end; i++) {
        if (!pred(i)) {
          return false;
        }
      }
      return true;
    }
    function every(s, pred, start, end) {
      if (start === void 0) {
        start = 0;
      }
      if (end === void 0) {
        end = s.length;
      }
      return everyInRange(start, end, function(i) {
        return pred(s.charCodeAt(i), i);
      });
    }
  })(ts || (ts = {}));
  (function(ts2) {
    function preProcessFile(sourceText, readImportFiles, detectJavaScriptImports) {
      if (readImportFiles === void 0) {
        readImportFiles = true;
      }
      if (detectJavaScriptImports === void 0) {
        detectJavaScriptImports = false;
      }
      var pragmaContext = {
        languageVersion: 1,
        pragmas: void 0,
        checkJsDirective: void 0,
        referencedFiles: [],
        typeReferenceDirectives: [],
        libReferenceDirectives: [],
        amdDependencies: [],
        hasNoDefaultLib: void 0,
        moduleName: void 0
      };
      var importedFiles = [];
      var ambientExternalModules;
      var lastToken;
      var currentToken;
      var braceNesting = 0;
      var externalModule = false;
      function nextToken() {
        lastToken = currentToken;
        currentToken = ts2.scanner.scan();
        if (currentToken === 18) {
          braceNesting++;
        } else if (currentToken === 19) {
          braceNesting--;
        }
        return currentToken;
      }
      function getFileReference() {
        var fileName = ts2.scanner.getTokenValue();
        var pos = ts2.scanner.getTokenPos();
        return { fileName, pos, end: pos + fileName.length };
      }
      function recordAmbientExternalModule() {
        if (!ambientExternalModules) {
          ambientExternalModules = [];
        }
        ambientExternalModules.push({ ref: getFileReference(), depth: braceNesting });
      }
      function recordModuleName() {
        importedFiles.push(getFileReference());
        markAsExternalModuleIfTopLevel();
      }
      function markAsExternalModuleIfTopLevel() {
        if (braceNesting === 0) {
          externalModule = true;
        }
      }
      function tryConsumeDeclare() {
        var token = ts2.scanner.getToken();
        if (token === 135) {
          token = nextToken();
          if (token === 141) {
            token = nextToken();
            if (token === 10) {
              recordAmbientExternalModule();
            }
          }
          return true;
        }
        return false;
      }
      function tryConsumeImport() {
        if (lastToken === 24) {
          return false;
        }
        var token = ts2.scanner.getToken();
        if (token === 100) {
          token = nextToken();
          if (token === 20) {
            token = nextToken();
            if (token === 10 || token === 14) {
              recordModuleName();
              return true;
            }
          } else if (token === 10) {
            recordModuleName();
            return true;
          } else {
            if (token === 151) {
              var skipTypeKeyword = ts2.scanner.lookAhead(function() {
                var token2 = ts2.scanner.scan();
                return token2 !== 155 && (token2 === 41 || token2 === 18 || token2 === 79 || ts2.isKeyword(token2));
              });
              if (skipTypeKeyword) {
                token = nextToken();
              }
            }
            if (token === 79 || ts2.isKeyword(token)) {
              token = nextToken();
              if (token === 155) {
                token = nextToken();
                if (token === 10) {
                  recordModuleName();
                  return true;
                }
              } else if (token === 63) {
                if (tryConsumeRequireCall(true)) {
                  return true;
                }
              } else if (token === 27) {
                token = nextToken();
              } else {
                return true;
              }
            }
            if (token === 18) {
              token = nextToken();
              while (token !== 19 && token !== 1) {
                token = nextToken();
              }
              if (token === 19) {
                token = nextToken();
                if (token === 155) {
                  token = nextToken();
                  if (token === 10) {
                    recordModuleName();
                  }
                }
              }
            } else if (token === 41) {
              token = nextToken();
              if (token === 127) {
                token = nextToken();
                if (token === 79 || ts2.isKeyword(token)) {
                  token = nextToken();
                  if (token === 155) {
                    token = nextToken();
                    if (token === 10) {
                      recordModuleName();
                    }
                  }
                }
              }
            }
          }
          return true;
        }
        return false;
      }
      function tryConsumeExport() {
        var token = ts2.scanner.getToken();
        if (token === 93) {
          markAsExternalModuleIfTopLevel();
          token = nextToken();
          if (token === 151) {
            var skipTypeKeyword = ts2.scanner.lookAhead(function() {
              var token2 = ts2.scanner.scan();
              return token2 === 41 || token2 === 18;
            });
            if (skipTypeKeyword) {
              token = nextToken();
            }
          }
          if (token === 18) {
            token = nextToken();
            while (token !== 19 && token !== 1) {
              token = nextToken();
            }
            if (token === 19) {
              token = nextToken();
              if (token === 155) {
                token = nextToken();
                if (token === 10) {
                  recordModuleName();
                }
              }
            }
          } else if (token === 41) {
            token = nextToken();
            if (token === 155) {
              token = nextToken();
              if (token === 10) {
                recordModuleName();
              }
            }
          } else if (token === 100) {
            token = nextToken();
            if (token === 151) {
              var skipTypeKeyword = ts2.scanner.lookAhead(function() {
                var token2 = ts2.scanner.scan();
                return token2 === 79 || ts2.isKeyword(token2);
              });
              if (skipTypeKeyword) {
                token = nextToken();
              }
            }
            if (token === 79 || ts2.isKeyword(token)) {
              token = nextToken();
              if (token === 63) {
                if (tryConsumeRequireCall(true)) {
                  return true;
                }
              }
            }
          }
          return true;
        }
        return false;
      }
      function tryConsumeRequireCall(skipCurrentToken, allowTemplateLiterals) {
        if (allowTemplateLiterals === void 0) {
          allowTemplateLiterals = false;
        }
        var token = skipCurrentToken ? nextToken() : ts2.scanner.getToken();
        if (token === 145) {
          token = nextToken();
          if (token === 20) {
            token = nextToken();
            if (token === 10 || allowTemplateLiterals && token === 14) {
              recordModuleName();
            }
          }
          return true;
        }
        return false;
      }
      function tryConsumeDefine() {
        var token = ts2.scanner.getToken();
        if (token === 79 && ts2.scanner.getTokenValue() === "define") {
          token = nextToken();
          if (token !== 20) {
            return true;
          }
          token = nextToken();
          if (token === 10 || token === 14) {
            token = nextToken();
            if (token === 27) {
              token = nextToken();
            } else {
              return true;
            }
          }
          if (token !== 22) {
            return true;
          }
          token = nextToken();
          while (token !== 23 && token !== 1) {
            if (token === 10 || token === 14) {
              recordModuleName();
            }
            token = nextToken();
          }
          return true;
        }
        return false;
      }
      function processImports() {
        ts2.scanner.setText(sourceText);
        nextToken();
        while (true) {
          if (ts2.scanner.getToken() === 1) {
            break;
          }
          if (tryConsumeDeclare() || tryConsumeImport() || tryConsumeExport() || detectJavaScriptImports && (tryConsumeRequireCall(false, true) || tryConsumeDefine())) {
            continue;
          } else {
            nextToken();
          }
        }
        ts2.scanner.setText(void 0);
      }
      if (readImportFiles) {
        processImports();
      }
      ts2.processCommentPragmas(pragmaContext, sourceText);
      ts2.processPragmasIntoFields(pragmaContext, ts2.noop);
      if (externalModule) {
        if (ambientExternalModules) {
          for (var _i = 0, ambientExternalModules_1 = ambientExternalModules; _i < ambientExternalModules_1.length; _i++) {
            var decl = ambientExternalModules_1[_i];
            importedFiles.push(decl.ref);
          }
        }
        return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: !!pragmaContext.hasNoDefaultLib, ambientExternalModules: void 0 };
      } else {
        var ambientModuleNames = void 0;
        if (ambientExternalModules) {
          for (var _a = 0, ambientExternalModules_2 = ambientExternalModules; _a < ambientExternalModules_2.length; _a++) {
            var decl = ambientExternalModules_2[_a];
            if (decl.depth === 0) {
              if (!ambientModuleNames) {
                ambientModuleNames = [];
              }
              ambientModuleNames.push(decl.ref.fileName);
            } else {
              importedFiles.push(decl.ref);
            }
          }
        }
        return { referencedFiles: pragmaContext.referencedFiles, typeReferenceDirectives: pragmaContext.typeReferenceDirectives, libReferenceDirectives: pragmaContext.libReferenceDirectives, importedFiles, isLibFile: !!pragmaContext.hasNoDefaultLib, ambientExternalModules: ambientModuleNames };
      }
    }
    ts2.preProcessFile = preProcessFile;
  })(ts || (ts = {}));
  (function(ts2) {
    var Rename;
    (function(Rename2) {
      function getRenameInfo(program, sourceFile, position, options) {
        var node = ts2.getAdjustedRenameLocation(ts2.getTouchingPropertyName(sourceFile, position));
        if (nodeIsEligibleForRename(node)) {
          var renameInfo = getRenameInfoForNode(node, program.getTypeChecker(), sourceFile, program, options);
          if (renameInfo) {
            return renameInfo;
          }
        }
        return getRenameInfoError(ts2.Diagnostics.You_cannot_rename_this_element);
      }
      Rename2.getRenameInfo = getRenameInfo;
      function getRenameInfoForNode(node, typeChecker, sourceFile, program, options) {
        var symbol = typeChecker.getSymbolAtLocation(node);
        if (!symbol) {
          if (ts2.isStringLiteralLike(node)) {
            var type = ts2.getContextualTypeFromParentOrAncestorTypeNode(node, typeChecker);
            if (type && (type.flags & 128 || type.flags & 1048576 && ts2.every(type.types, function(type2) {
              return !!(type2.flags & 128);
            }))) {
              return getRenameInfoSuccess(node.text, node.text, "string", "", node, sourceFile);
            }
          } else if (ts2.isLabelName(node)) {
            var name = ts2.getTextOfNode(node);
            return getRenameInfoSuccess(name, name, "label", "", node, sourceFile);
          }
          return void 0;
        }
        var declarations = symbol.declarations;
        if (!declarations || declarations.length === 0)
          return;
        if (declarations.some(function(declaration) {
          return isDefinedInLibraryFile(program, declaration);
        })) {
          return getRenameInfoError(ts2.Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library);
        }
        if (ts2.isIdentifier(node) && node.originalKeywordKind === 88 && symbol.parent && symbol.parent.flags & 1536) {
          return void 0;
        }
        if (ts2.isStringLiteralLike(node) && ts2.tryGetImportFromModuleSpecifier(node)) {
          return options && options.allowRenameOfImportPath ? getRenameInfoForModule(node, sourceFile, symbol) : void 0;
        }
        var kind = ts2.SymbolDisplay.getSymbolKind(typeChecker, symbol, node);
        var specifierName = ts2.isImportOrExportSpecifierName(node) || ts2.isStringOrNumericLiteralLike(node) && node.parent.kind === 161 ? ts2.stripQuotes(ts2.getTextOfIdentifierOrLiteral(node)) : void 0;
        var displayName = specifierName || typeChecker.symbolToString(symbol);
        var fullDisplayName = specifierName || typeChecker.getFullyQualifiedName(symbol);
        return getRenameInfoSuccess(displayName, fullDisplayName, kind, ts2.SymbolDisplay.getSymbolModifiers(typeChecker, symbol), node, sourceFile);
      }
      function isDefinedInLibraryFile(program, declaration) {
        var sourceFile = declaration.getSourceFile();
        return program.isSourceFileDefaultLibrary(sourceFile) && ts2.fileExtensionIs(sourceFile.fileName, ".d.ts");
      }
      function getRenameInfoForModule(node, sourceFile, moduleSymbol) {
        if (!ts2.isExternalModuleNameRelative(node.text)) {
          return getRenameInfoError(ts2.Diagnostics.You_cannot_rename_a_module_via_a_global_import);
        }
        var moduleSourceFile = moduleSymbol.declarations && ts2.find(moduleSymbol.declarations, ts2.isSourceFile);
        if (!moduleSourceFile)
          return void 0;
        var withoutIndex = ts2.endsWith(node.text, "/index") || ts2.endsWith(node.text, "/index.js") ? void 0 : ts2.tryRemoveSuffix(ts2.removeFileExtension(moduleSourceFile.fileName), "/index");
        var name = withoutIndex === void 0 ? moduleSourceFile.fileName : withoutIndex;
        var kind = withoutIndex === void 0 ? "module" : "directory";
        var indexAfterLastSlash = node.text.lastIndexOf("/") + 1;
        var triggerSpan = ts2.createTextSpan(node.getStart(sourceFile) + 1 + indexAfterLastSlash, node.text.length - indexAfterLastSlash);
        return {
          canRename: true,
          fileToRename: name,
          kind,
          displayName: name,
          fullDisplayName: name,
          kindModifiers: "",
          triggerSpan
        };
      }
      function getRenameInfoSuccess(displayName, fullDisplayName, kind, kindModifiers, node, sourceFile) {
        return {
          canRename: true,
          fileToRename: void 0,
          kind,
          displayName,
          fullDisplayName,
          kindModifiers,
          triggerSpan: createTriggerSpanForNode(node, sourceFile)
        };
      }
      function getRenameInfoError(diagnostic) {
        return { canRename: false, localizedErrorMessage: ts2.getLocaleSpecificMessage(diagnostic) };
      }
      function createTriggerSpanForNode(node, sourceFile) {
        var start = node.getStart(sourceFile);
        var width = node.getWidth(sourceFile);
        if (ts2.isStringLiteralLike(node)) {
          start += 1;
          width -= 2;
        }
        return ts2.createTextSpan(start, width);
      }
      function nodeIsEligibleForRename(node) {
        switch (node.kind) {
          case 79:
          case 80:
          case 10:
          case 14:
          case 108:
            return true;
          case 8:
            return ts2.isLiteralNameOfPropertyDeclarationOrIndexAccess(node);
          default:
            return false;
        }
      }
      Rename2.nodeIsEligibleForRename = nodeIsEligibleForRename;
    })(Rename = ts2.Rename || (ts2.Rename = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var SmartSelectionRange;
    (function(SmartSelectionRange2) {
      function getSmartSelectionRange(pos, sourceFile) {
        var _a;
        var selectionRange = {
          textSpan: ts2.createTextSpanFromBounds(sourceFile.getFullStart(), sourceFile.getEnd())
        };
        var parentNode = sourceFile;
        outer:
          while (true) {
            var children = getSelectionChildren(parentNode);
            if (!children.length)
              break;
            for (var i = 0; i < children.length; i++) {
              var prevNode = children[i - 1];
              var node = children[i];
              var nextNode = children[i + 1];
              if (ts2.getTokenPosOfNode(node, sourceFile, true) > pos) {
                break outer;
              }
              var comment = ts2.singleOrUndefined(ts2.getTrailingCommentRanges(sourceFile.text, node.end));
              if (comment && comment.kind === 2) {
                pushSelectionCommentRange(comment.pos, comment.end);
              }
              if (positionShouldSnapToNode(sourceFile, pos, node)) {
                if (ts2.isBlock(node) || ts2.isTemplateSpan(node) || ts2.isTemplateHead(node) || ts2.isTemplateTail(node) || prevNode && ts2.isTemplateHead(prevNode) || ts2.isVariableDeclarationList(node) && ts2.isVariableStatement(parentNode) || ts2.isSyntaxList(node) && ts2.isVariableDeclarationList(parentNode) || ts2.isVariableDeclaration(node) && ts2.isSyntaxList(parentNode) && children.length === 1 || ts2.isJSDocTypeExpression(node) || ts2.isJSDocSignature(node) || ts2.isJSDocTypeLiteral(node)) {
                  parentNode = node;
                  break;
                }
                if (ts2.isTemplateSpan(parentNode) && nextNode && ts2.isTemplateMiddleOrTemplateTail(nextNode)) {
                  var start_1 = node.getFullStart() - "${".length;
                  var end_2 = nextNode.getStart() + "}".length;
                  pushSelectionRange(start_1, end_2);
                }
                var isBetweenMultiLineBookends = ts2.isSyntaxList(node) && isListOpener(prevNode) && isListCloser(nextNode) && !ts2.positionsAreOnSameLine(prevNode.getStart(), nextNode.getStart(), sourceFile);
                var start = isBetweenMultiLineBookends ? prevNode.getEnd() : node.getStart();
                var end = isBetweenMultiLineBookends ? nextNode.getStart() : getEndPos(sourceFile, node);
                if (ts2.hasJSDocNodes(node) && ((_a = node.jsDoc) === null || _a === void 0 ? void 0 : _a.length)) {
                  pushSelectionRange(ts2.first(node.jsDoc).getStart(), end);
                }
                pushSelectionRange(start, end);
                if (ts2.isStringLiteral(node) || ts2.isTemplateLiteral(node)) {
                  pushSelectionRange(start + 1, end - 1);
                }
                parentNode = node;
                break;
              }
              if (i === children.length - 1) {
                break outer;
              }
            }
          }
        return selectionRange;
        function pushSelectionRange(start2, end2) {
          if (start2 !== end2) {
            var textSpan = ts2.createTextSpanFromBounds(start2, end2);
            if (!selectionRange || !ts2.textSpansEqual(textSpan, selectionRange.textSpan) && ts2.textSpanIntersectsWithPosition(textSpan, pos)) {
              selectionRange = __assign({ textSpan }, selectionRange && { parent: selectionRange });
            }
          }
        }
        function pushSelectionCommentRange(start2, end2) {
          pushSelectionRange(start2, end2);
          var pos2 = start2;
          while (sourceFile.text.charCodeAt(pos2) === 47) {
            pos2++;
          }
          pushSelectionRange(pos2, end2);
        }
      }
      SmartSelectionRange2.getSmartSelectionRange = getSmartSelectionRange;
      function positionShouldSnapToNode(sourceFile, pos, node) {
        ts2.Debug.assert(node.pos <= pos);
        if (pos < node.end) {
          return true;
        }
        var nodeEnd = node.getEnd();
        if (nodeEnd === pos) {
          return ts2.getTouchingPropertyName(sourceFile, pos).pos < node.end;
        }
        return false;
      }
      var isImport = ts2.or(ts2.isImportDeclaration, ts2.isImportEqualsDeclaration);
      function getSelectionChildren(node) {
        if (ts2.isSourceFile(node)) {
          return groupChildren(node.getChildAt(0).getChildren(), isImport);
        }
        if (ts2.isMappedTypeNode(node)) {
          var _a = node.getChildren(), openBraceToken = _a[0], children = _a.slice(1);
          var closeBraceToken = ts2.Debug.checkDefined(children.pop());
          ts2.Debug.assertEqual(openBraceToken.kind, 18);
          ts2.Debug.assertEqual(closeBraceToken.kind, 19);
          var groupedWithPlusMinusTokens = groupChildren(children, function(child) {
            return child === node.readonlyToken || child.kind === 144 || child === node.questionToken || child.kind === 57;
          });
          var groupedWithBrackets = groupChildren(groupedWithPlusMinusTokens, function(_a2) {
            var kind = _a2.kind;
            return kind === 22 || kind === 162 || kind === 23;
          });
          return [
            openBraceToken,
            createSyntaxList(splitChildren(groupedWithBrackets, function(_a2) {
              var kind = _a2.kind;
              return kind === 58;
            })),
            closeBraceToken
          ];
        }
        if (ts2.isPropertySignature(node)) {
          var children = groupChildren(node.getChildren(), function(child) {
            return child === node.name || ts2.contains(node.modifiers, child);
          });
          return splitChildren(children, function(_a2) {
            var kind = _a2.kind;
            return kind === 58;
          });
        }
        if (ts2.isParameter(node)) {
          var groupedDotDotDotAndName_1 = groupChildren(node.getChildren(), function(child) {
            return child === node.dotDotDotToken || child === node.name;
          });
          var groupedWithQuestionToken = groupChildren(groupedDotDotDotAndName_1, function(child) {
            return child === groupedDotDotDotAndName_1[0] || child === node.questionToken;
          });
          return splitChildren(groupedWithQuestionToken, function(_a2) {
            var kind = _a2.kind;
            return kind === 63;
          });
        }
        if (ts2.isBindingElement(node)) {
          return splitChildren(node.getChildren(), function(_a2) {
            var kind = _a2.kind;
            return kind === 63;
          });
        }
        return node.getChildren();
      }
      function groupChildren(children, groupOn) {
        var result = [];
        var group;
        for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
          var child = children_1[_i];
          if (groupOn(child)) {
            group = group || [];
            group.push(child);
          } else {
            if (group) {
              result.push(createSyntaxList(group));
              group = void 0;
            }
            result.push(child);
          }
        }
        if (group) {
          result.push(createSyntaxList(group));
        }
        return result;
      }
      function splitChildren(children, pivotOn, separateTrailingSemicolon) {
        if (separateTrailingSemicolon === void 0) {
          separateTrailingSemicolon = true;
        }
        if (children.length < 2) {
          return children;
        }
        var splitTokenIndex = ts2.findIndex(children, pivotOn);
        if (splitTokenIndex === -1) {
          return children;
        }
        var leftChildren = children.slice(0, splitTokenIndex);
        var splitToken = children[splitTokenIndex];
        var lastToken = ts2.last(children);
        var separateLastToken = separateTrailingSemicolon && lastToken.kind === 26;
        var rightChildren = children.slice(splitTokenIndex + 1, separateLastToken ? children.length - 1 : void 0);
        var result = ts2.compact([
          leftChildren.length ? createSyntaxList(leftChildren) : void 0,
          splitToken,
          rightChildren.length ? createSyntaxList(rightChildren) : void 0
        ]);
        return separateLastToken ? result.concat(lastToken) : result;
      }
      function createSyntaxList(children) {
        ts2.Debug.assertGreaterThanOrEqual(children.length, 1);
        return ts2.setTextRangePosEnd(ts2.parseNodeFactory.createSyntaxList(children), children[0].pos, ts2.last(children).end);
      }
      function isListOpener(token) {
        var kind = token && token.kind;
        return kind === 18 || kind === 22 || kind === 20 || kind === 279;
      }
      function isListCloser(token) {
        var kind = token && token.kind;
        return kind === 19 || kind === 23 || kind === 21 || kind === 280;
      }
      function getEndPos(sourceFile, node) {
        switch (node.kind) {
          case 338:
          case 336:
          case 345:
          case 343:
          case 340:
            return sourceFile.getLineEndOfPosition(node.getStart());
          default:
            return node.getEnd();
        }
      }
    })(SmartSelectionRange = ts2.SmartSelectionRange || (ts2.SmartSelectionRange = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var SignatureHelp;
    (function(SignatureHelp2) {
      var InvocationKind;
      (function(InvocationKind2) {
        InvocationKind2[InvocationKind2["Call"] = 0] = "Call";
        InvocationKind2[InvocationKind2["TypeArgs"] = 1] = "TypeArgs";
        InvocationKind2[InvocationKind2["Contextual"] = 2] = "Contextual";
      })(InvocationKind || (InvocationKind = {}));
      function getSignatureHelpItems(program, sourceFile, position, triggerReason, cancellationToken) {
        var typeChecker = program.getTypeChecker();
        var startingToken = ts2.findTokenOnLeftOfPosition(sourceFile, position);
        if (!startingToken) {
          return void 0;
        }
        var onlyUseSyntacticOwners = !!triggerReason && triggerReason.kind === "characterTyped";
        if (onlyUseSyntacticOwners && (ts2.isInString(sourceFile, position, startingToken) || ts2.isInComment(sourceFile, position))) {
          return void 0;
        }
        var isManuallyInvoked = !!triggerReason && triggerReason.kind === "invoked";
        var argumentInfo = getContainingArgumentInfo(startingToken, position, sourceFile, typeChecker, isManuallyInvoked);
        if (!argumentInfo)
          return void 0;
        cancellationToken.throwIfCancellationRequested();
        var candidateInfo = getCandidateOrTypeInfo(argumentInfo, typeChecker, sourceFile, startingToken, onlyUseSyntacticOwners);
        cancellationToken.throwIfCancellationRequested();
        if (!candidateInfo) {
          return ts2.isSourceFileJS(sourceFile) ? createJSSignatureHelpItems(argumentInfo, program, cancellationToken) : void 0;
        }
        return typeChecker.runWithCancellationToken(cancellationToken, function(typeChecker2) {
          return candidateInfo.kind === 0 ? createSignatureHelpItems(candidateInfo.candidates, candidateInfo.resolvedSignature, argumentInfo, sourceFile, typeChecker2) : createTypeHelpItems(candidateInfo.symbol, argumentInfo, sourceFile, typeChecker2);
        });
      }
      SignatureHelp2.getSignatureHelpItems = getSignatureHelpItems;
      var CandidateOrTypeKind;
      (function(CandidateOrTypeKind2) {
        CandidateOrTypeKind2[CandidateOrTypeKind2["Candidate"] = 0] = "Candidate";
        CandidateOrTypeKind2[CandidateOrTypeKind2["Type"] = 1] = "Type";
      })(CandidateOrTypeKind || (CandidateOrTypeKind = {}));
      function getCandidateOrTypeInfo(_a, checker, sourceFile, startingToken, onlyUseSyntacticOwners) {
        var invocation = _a.invocation, argumentCount = _a.argumentCount;
        switch (invocation.kind) {
          case 0: {
            if (onlyUseSyntacticOwners && !isSyntacticOwner(startingToken, invocation.node, sourceFile)) {
              return void 0;
            }
            var candidates = [];
            var resolvedSignature = checker.getResolvedSignatureForSignatureHelp(invocation.node, candidates, argumentCount);
            return candidates.length === 0 ? void 0 : { kind: 0, candidates, resolvedSignature };
          }
          case 1: {
            var called = invocation.called;
            if (onlyUseSyntacticOwners && !containsPrecedingToken(startingToken, sourceFile, ts2.isIdentifier(called) ? called.parent : called)) {
              return void 0;
            }
            var candidates = ts2.getPossibleGenericSignatures(called, argumentCount, checker);
            if (candidates.length !== 0)
              return { kind: 0, candidates, resolvedSignature: ts2.first(candidates) };
            var symbol = checker.getSymbolAtLocation(called);
            return symbol && { kind: 1, symbol };
          }
          case 2:
            return { kind: 0, candidates: [invocation.signature], resolvedSignature: invocation.signature };
          default:
            return ts2.Debug.assertNever(invocation);
        }
      }
      function isSyntacticOwner(startingToken, node, sourceFile) {
        if (!ts2.isCallOrNewExpression(node))
          return false;
        var invocationChildren = node.getChildren(sourceFile);
        switch (startingToken.kind) {
          case 20:
            return ts2.contains(invocationChildren, startingToken);
          case 27: {
            var containingList = ts2.findContainingList(startingToken);
            return !!containingList && ts2.contains(invocationChildren, containingList);
          }
          case 29:
            return containsPrecedingToken(startingToken, sourceFile, node.expression);
          default:
            return false;
        }
      }
      function createJSSignatureHelpItems(argumentInfo, program, cancellationToken) {
        if (argumentInfo.invocation.kind === 2)
          return void 0;
        var expression = getExpressionFromInvocation(argumentInfo.invocation);
        var name = ts2.isPropertyAccessExpression(expression) ? expression.name.text : void 0;
        var typeChecker = program.getTypeChecker();
        return name === void 0 ? void 0 : ts2.firstDefined(program.getSourceFiles(), function(sourceFile) {
          return ts2.firstDefined(sourceFile.getNamedDeclarations().get(name), function(declaration) {
            var type = declaration.symbol && typeChecker.getTypeOfSymbolAtLocation(declaration.symbol, declaration);
            var callSignatures = type && type.getCallSignatures();
            if (callSignatures && callSignatures.length) {
              return typeChecker.runWithCancellationToken(cancellationToken, function(typeChecker2) {
                return createSignatureHelpItems(callSignatures, callSignatures[0], argumentInfo, sourceFile, typeChecker2, true);
              });
            }
          });
        });
      }
      function containsPrecedingToken(startingToken, sourceFile, container) {
        var pos = startingToken.getFullStart();
        var currentParent = startingToken.parent;
        while (currentParent) {
          var precedingToken = ts2.findPrecedingToken(pos, sourceFile, currentParent, true);
          if (precedingToken) {
            return ts2.rangeContainsRange(container, precedingToken);
          }
          currentParent = currentParent.parent;
        }
        return ts2.Debug.fail("Could not find preceding token");
      }
      function getArgumentInfoForCompletions(node, position, sourceFile) {
        var info = getImmediatelyContainingArgumentInfo(node, position, sourceFile);
        return !info || info.isTypeParameterList || info.invocation.kind !== 0 ? void 0 : { invocation: info.invocation.node, argumentCount: info.argumentCount, argumentIndex: info.argumentIndex };
      }
      SignatureHelp2.getArgumentInfoForCompletions = getArgumentInfoForCompletions;
      function getArgumentOrParameterListInfo(node, sourceFile) {
        var info = getArgumentOrParameterListAndIndex(node, sourceFile);
        if (!info)
          return void 0;
        var list = info.list, argumentIndex = info.argumentIndex;
        var argumentCount = getArgumentCount(list);
        if (argumentIndex !== 0) {
          ts2.Debug.assertLessThan(argumentIndex, argumentCount);
        }
        var argumentsSpan = getApplicableSpanForArguments(list, sourceFile);
        return { list, argumentIndex, argumentCount, argumentsSpan };
      }
      function getArgumentOrParameterListAndIndex(node, sourceFile) {
        if (node.kind === 29 || node.kind === 20) {
          return { list: getChildListThatStartsWithOpenerToken(node.parent, node, sourceFile), argumentIndex: 0 };
        } else {
          var list = ts2.findContainingList(node);
          return list && { list, argumentIndex: getArgumentIndex(list, node) };
        }
      }
      function getImmediatelyContainingArgumentInfo(node, position, sourceFile) {
        var parent = node.parent;
        if (ts2.isCallOrNewExpression(parent)) {
          var invocation = parent;
          var info = getArgumentOrParameterListInfo(node, sourceFile);
          if (!info)
            return void 0;
          var list = info.list, argumentIndex = info.argumentIndex, argumentCount = info.argumentCount, argumentsSpan = info.argumentsSpan;
          var isTypeParameterList = !!parent.typeArguments && parent.typeArguments.pos === list.pos;
          return { isTypeParameterList, invocation: { kind: 0, node: invocation }, argumentsSpan, argumentIndex, argumentCount };
        } else if (ts2.isNoSubstitutionTemplateLiteral(node) && ts2.isTaggedTemplateExpression(parent)) {
          if (ts2.isInsideTemplateLiteral(node, position, sourceFile)) {
            return getArgumentListInfoForTemplate(parent, 0, sourceFile);
          }
          return void 0;
        } else if (ts2.isTemplateHead(node) && parent.parent.kind === 209) {
          var templateExpression = parent;
          var tagExpression = templateExpression.parent;
          ts2.Debug.assert(templateExpression.kind === 222);
          var argumentIndex = ts2.isInsideTemplateLiteral(node, position, sourceFile) ? 0 : 1;
          return getArgumentListInfoForTemplate(tagExpression, argumentIndex, sourceFile);
        } else if (ts2.isTemplateSpan(parent) && ts2.isTaggedTemplateExpression(parent.parent.parent)) {
          var templateSpan = parent;
          var tagExpression = parent.parent.parent;
          if (ts2.isTemplateTail(node) && !ts2.isInsideTemplateLiteral(node, position, sourceFile)) {
            return void 0;
          }
          var spanIndex = templateSpan.parent.templateSpans.indexOf(templateSpan);
          var argumentIndex = getArgumentIndexForTemplatePiece(spanIndex, node, position, sourceFile);
          return getArgumentListInfoForTemplate(tagExpression, argumentIndex, sourceFile);
        } else if (ts2.isJsxOpeningLikeElement(parent)) {
          var attributeSpanStart = parent.attributes.pos;
          var attributeSpanEnd = ts2.skipTrivia(sourceFile.text, parent.attributes.end, false);
          return {
            isTypeParameterList: false,
            invocation: { kind: 0, node: parent },
            argumentsSpan: ts2.createTextSpan(attributeSpanStart, attributeSpanEnd - attributeSpanStart),
            argumentIndex: 0,
            argumentCount: 1
          };
        } else {
          var typeArgInfo = ts2.getPossibleTypeArgumentsInfo(node, sourceFile);
          if (typeArgInfo) {
            var called = typeArgInfo.called, nTypeArguments = typeArgInfo.nTypeArguments;
            var invocation = { kind: 1, called };
            var argumentsSpan = ts2.createTextSpanFromBounds(called.getStart(sourceFile), node.end);
            return { isTypeParameterList: true, invocation, argumentsSpan, argumentIndex: nTypeArguments, argumentCount: nTypeArguments + 1 };
          }
          return void 0;
        }
      }
      function getImmediatelyContainingArgumentOrContextualParameterInfo(node, position, sourceFile, checker) {
        return tryGetParameterInfo(node, position, sourceFile, checker) || getImmediatelyContainingArgumentInfo(node, position, sourceFile);
      }
      function getHighestBinary(b) {
        return ts2.isBinaryExpression(b.parent) ? getHighestBinary(b.parent) : b;
      }
      function countBinaryExpressionParameters(b) {
        return ts2.isBinaryExpression(b.left) ? countBinaryExpressionParameters(b.left) + 1 : 2;
      }
      function tryGetParameterInfo(startingToken, _position, sourceFile, checker) {
        var info = getContextualSignatureLocationInfo(startingToken, sourceFile, checker);
        if (!info)
          return void 0;
        var contextualType = info.contextualType, argumentIndex = info.argumentIndex, argumentCount = info.argumentCount, argumentsSpan = info.argumentsSpan;
        var nonNullableContextualType = contextualType.getNonNullableType();
        var signatures = nonNullableContextualType.getCallSignatures();
        if (signatures.length !== 1)
          return void 0;
        var invocation = { kind: 2, signature: ts2.first(signatures), node: startingToken, symbol: chooseBetterSymbol(nonNullableContextualType.symbol) };
        return { isTypeParameterList: false, invocation, argumentsSpan, argumentIndex, argumentCount };
      }
      function getContextualSignatureLocationInfo(startingToken, sourceFile, checker) {
        if (startingToken.kind !== 20 && startingToken.kind !== 27)
          return void 0;
        var parent = startingToken.parent;
        switch (parent.kind) {
          case 211:
          case 168:
          case 212:
          case 213:
            var info = getArgumentOrParameterListInfo(startingToken, sourceFile);
            if (!info)
              return void 0;
            var argumentIndex = info.argumentIndex, argumentCount = info.argumentCount, argumentsSpan = info.argumentsSpan;
            var contextualType = ts2.isMethodDeclaration(parent) ? checker.getContextualTypeForObjectLiteralElement(parent) : checker.getContextualType(parent);
            return contextualType && { contextualType, argumentIndex, argumentCount, argumentsSpan };
          case 220: {
            var highestBinary = getHighestBinary(parent);
            var contextualType_1 = checker.getContextualType(highestBinary);
            var argumentIndex_1 = startingToken.kind === 20 ? 0 : countBinaryExpressionParameters(parent) - 1;
            var argumentCount_1 = countBinaryExpressionParameters(highestBinary);
            return contextualType_1 && { contextualType: contextualType_1, argumentIndex: argumentIndex_1, argumentCount: argumentCount_1, argumentsSpan: ts2.createTextSpanFromNode(parent) };
          }
          default:
            return void 0;
        }
      }
      function chooseBetterSymbol(s) {
        return s.name === "__type" ? ts2.firstDefined(s.declarations, function(d) {
          return ts2.isFunctionTypeNode(d) ? d.parent.symbol : void 0;
        }) || s : s;
      }
      function getArgumentIndex(argumentsList, node) {
        var argumentIndex = 0;
        for (var _i = 0, _a = argumentsList.getChildren(); _i < _a.length; _i++) {
          var child = _a[_i];
          if (child === node) {
            break;
          }
          if (child.kind !== 27) {
            argumentIndex++;
          }
        }
        return argumentIndex;
      }
      function getArgumentCount(argumentsList) {
        var listChildren = argumentsList.getChildren();
        var argumentCount = ts2.countWhere(listChildren, function(arg) {
          return arg.kind !== 27;
        });
        if (listChildren.length > 0 && ts2.last(listChildren).kind === 27) {
          argumentCount++;
        }
        return argumentCount;
      }
      function getArgumentIndexForTemplatePiece(spanIndex, node, position, sourceFile) {
        ts2.Debug.assert(position >= node.getStart(), "Assumed 'position' could not occur before node.");
        if (ts2.isTemplateLiteralToken(node)) {
          if (ts2.isInsideTemplateLiteral(node, position, sourceFile)) {
            return 0;
          }
          return spanIndex + 2;
        }
        return spanIndex + 1;
      }
      function getArgumentListInfoForTemplate(tagExpression, argumentIndex, sourceFile) {
        var argumentCount = ts2.isNoSubstitutionTemplateLiteral(tagExpression.template) ? 1 : tagExpression.template.templateSpans.length + 1;
        if (argumentIndex !== 0) {
          ts2.Debug.assertLessThan(argumentIndex, argumentCount);
        }
        return {
          isTypeParameterList: false,
          invocation: { kind: 0, node: tagExpression },
          argumentsSpan: getApplicableSpanForTaggedTemplate(tagExpression, sourceFile),
          argumentIndex,
          argumentCount
        };
      }
      function getApplicableSpanForArguments(argumentsList, sourceFile) {
        var applicableSpanStart = argumentsList.getFullStart();
        var applicableSpanEnd = ts2.skipTrivia(sourceFile.text, argumentsList.getEnd(), false);
        return ts2.createTextSpan(applicableSpanStart, applicableSpanEnd - applicableSpanStart);
      }
      function getApplicableSpanForTaggedTemplate(taggedTemplate, sourceFile) {
        var template = taggedTemplate.template;
        var applicableSpanStart = template.getStart();
        var applicableSpanEnd = template.getEnd();
        if (template.kind === 222) {
          var lastSpan = ts2.last(template.templateSpans);
          if (lastSpan.literal.getFullWidth() === 0) {
            applicableSpanEnd = ts2.skipTrivia(sourceFile.text, applicableSpanEnd, false);
          }
        }
        return ts2.createTextSpan(applicableSpanStart, applicableSpanEnd - applicableSpanStart);
      }
      function getContainingArgumentInfo(node, position, sourceFile, checker, isManuallyInvoked) {
        var _loop_9 = function(n2) {
          ts2.Debug.assert(ts2.rangeContainsRange(n2.parent, n2), "Not a subspan", function() {
            return "Child: ".concat(ts2.Debug.formatSyntaxKind(n2.kind), ", parent: ").concat(ts2.Debug.formatSyntaxKind(n2.parent.kind));
          });
          var argumentInfo = getImmediatelyContainingArgumentOrContextualParameterInfo(n2, position, sourceFile, checker);
          if (argumentInfo) {
            return { value: argumentInfo };
          }
        };
        for (var n = node; !ts2.isSourceFile(n) && (isManuallyInvoked || !ts2.isBlock(n)); n = n.parent) {
          var state_4 = _loop_9(n);
          if (typeof state_4 === "object")
            return state_4.value;
        }
        return void 0;
      }
      function getChildListThatStartsWithOpenerToken(parent, openerToken, sourceFile) {
        var children = parent.getChildren(sourceFile);
        var indexOfOpenerToken = children.indexOf(openerToken);
        ts2.Debug.assert(indexOfOpenerToken >= 0 && children.length > indexOfOpenerToken + 1);
        return children[indexOfOpenerToken + 1];
      }
      function getExpressionFromInvocation(invocation) {
        return invocation.kind === 0 ? ts2.getInvokedExpression(invocation.node) : invocation.called;
      }
      function getEnclosingDeclarationFromInvocation(invocation) {
        return invocation.kind === 0 ? invocation.node : invocation.kind === 1 ? invocation.called : invocation.node;
      }
      var signatureHelpNodeBuilderFlags = 8192 | 70221824 | 16384;
      function createSignatureHelpItems(candidates, resolvedSignature, _a, sourceFile, typeChecker, useFullPrefix) {
        var _b;
        var isTypeParameterList = _a.isTypeParameterList, argumentCount = _a.argumentCount, applicableSpan = _a.argumentsSpan, invocation = _a.invocation, argumentIndex = _a.argumentIndex;
        var enclosingDeclaration = getEnclosingDeclarationFromInvocation(invocation);
        var callTargetSymbol = invocation.kind === 2 ? invocation.symbol : typeChecker.getSymbolAtLocation(getExpressionFromInvocation(invocation)) || useFullPrefix && ((_b = resolvedSignature.declaration) === null || _b === void 0 ? void 0 : _b.symbol);
        var callTargetDisplayParts = callTargetSymbol ? ts2.symbolToDisplayParts(typeChecker, callTargetSymbol, useFullPrefix ? sourceFile : void 0, void 0) : ts2.emptyArray;
        var items = ts2.map(candidates, function(candidateSignature) {
          return getSignatureHelpItem(candidateSignature, callTargetDisplayParts, isTypeParameterList, typeChecker, enclosingDeclaration, sourceFile);
        });
        if (argumentIndex !== 0) {
          ts2.Debug.assertLessThan(argumentIndex, argumentCount);
        }
        var selectedItemIndex = 0;
        var itemsSeen = 0;
        for (var i = 0; i < items.length; i++) {
          var item = items[i];
          if (candidates[i] === resolvedSignature) {
            selectedItemIndex = itemsSeen;
            if (item.length > 1) {
              var count = 0;
              for (var _i = 0, item_1 = item; _i < item_1.length; _i++) {
                var i_1 = item_1[_i];
                if (i_1.isVariadic || i_1.parameters.length >= argumentCount) {
                  selectedItemIndex = itemsSeen + count;
                  break;
                }
                count++;
              }
            }
          }
          itemsSeen += item.length;
        }
        ts2.Debug.assert(selectedItemIndex !== -1);
        var help = { items: ts2.flatMapToMutable(items, ts2.identity), applicableSpan, selectedItemIndex, argumentIndex, argumentCount };
        var selected = help.items[selectedItemIndex];
        if (selected.isVariadic) {
          var firstRest = ts2.findIndex(selected.parameters, function(p) {
            return !!p.isRest;
          });
          if (-1 < firstRest && firstRest < selected.parameters.length - 1) {
            help.argumentIndex = selected.parameters.length;
          } else {
            help.argumentIndex = Math.min(help.argumentIndex, selected.parameters.length - 1);
          }
        }
        return help;
      }
      function createTypeHelpItems(symbol, _a, sourceFile, checker) {
        var argumentCount = _a.argumentCount, applicableSpan = _a.argumentsSpan, invocation = _a.invocation, argumentIndex = _a.argumentIndex;
        var typeParameters = checker.getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
        if (!typeParameters)
          return void 0;
        var items = [getTypeHelpItem(symbol, typeParameters, checker, getEnclosingDeclarationFromInvocation(invocation), sourceFile)];
        return { items, applicableSpan, selectedItemIndex: 0, argumentIndex, argumentCount };
      }
      function getTypeHelpItem(symbol, typeParameters, checker, enclosingDeclaration, sourceFile) {
        var typeSymbolDisplay = ts2.symbolToDisplayParts(checker, symbol);
        var printer = ts2.createPrinter({ removeComments: true });
        var parameters = typeParameters.map(function(t) {
          return createSignatureHelpParameterForTypeParameter(t, checker, enclosingDeclaration, sourceFile, printer);
        });
        var documentation = symbol.getDocumentationComment(checker);
        var tags = symbol.getJsDocTags(checker);
        var prefixDisplayParts = __spreadArray(__spreadArray([], typeSymbolDisplay, true), [ts2.punctuationPart(29)], false);
        return { isVariadic: false, prefixDisplayParts, suffixDisplayParts: [ts2.punctuationPart(31)], separatorDisplayParts, parameters, documentation, tags };
      }
      var separatorDisplayParts = [ts2.punctuationPart(27), ts2.spacePart()];
      function getSignatureHelpItem(candidateSignature, callTargetDisplayParts, isTypeParameterList, checker, enclosingDeclaration, sourceFile) {
        var infos = (isTypeParameterList ? itemInfoForTypeParameters : itemInfoForParameters)(candidateSignature, checker, enclosingDeclaration, sourceFile);
        return ts2.map(infos, function(_a) {
          var isVariadic = _a.isVariadic, parameters = _a.parameters, prefix = _a.prefix, suffix = _a.suffix;
          var prefixDisplayParts = __spreadArray(__spreadArray([], callTargetDisplayParts, true), prefix, true);
          var suffixDisplayParts = __spreadArray(__spreadArray([], suffix, true), returnTypeToDisplayParts(candidateSignature, enclosingDeclaration, checker), true);
          var documentation = candidateSignature.getDocumentationComment(checker);
          var tags = candidateSignature.getJsDocTags();
          return { isVariadic, prefixDisplayParts, suffixDisplayParts, separatorDisplayParts, parameters, documentation, tags };
        });
      }
      function returnTypeToDisplayParts(candidateSignature, enclosingDeclaration, checker) {
        return ts2.mapToDisplayParts(function(writer) {
          writer.writePunctuation(":");
          writer.writeSpace(" ");
          var predicate = checker.getTypePredicateOfSignature(candidateSignature);
          if (predicate) {
            checker.writeTypePredicate(predicate, enclosingDeclaration, void 0, writer);
          } else {
            checker.writeType(checker.getReturnTypeOfSignature(candidateSignature), enclosingDeclaration, void 0, writer);
          }
        });
      }
      function itemInfoForTypeParameters(candidateSignature, checker, enclosingDeclaration, sourceFile) {
        var typeParameters = (candidateSignature.target || candidateSignature).typeParameters;
        var printer = ts2.createPrinter({ removeComments: true });
        var parameters = (typeParameters || ts2.emptyArray).map(function(t) {
          return createSignatureHelpParameterForTypeParameter(t, checker, enclosingDeclaration, sourceFile, printer);
        });
        var thisParameter = candidateSignature.thisParameter ? [checker.symbolToParameterDeclaration(candidateSignature.thisParameter, enclosingDeclaration, signatureHelpNodeBuilderFlags)] : [];
        return checker.getExpandedParameters(candidateSignature).map(function(paramList) {
          var params = ts2.factory.createNodeArray(__spreadArray(__spreadArray([], thisParameter, true), ts2.map(paramList, function(param) {
            return checker.symbolToParameterDeclaration(param, enclosingDeclaration, signatureHelpNodeBuilderFlags);
          }), true));
          var parameterParts = ts2.mapToDisplayParts(function(writer) {
            printer.writeList(2576, params, sourceFile, writer);
          });
          return { isVariadic: false, parameters, prefix: [ts2.punctuationPart(29)], suffix: __spreadArray([ts2.punctuationPart(31)], parameterParts, true) };
        });
      }
      function itemInfoForParameters(candidateSignature, checker, enclosingDeclaration, sourceFile) {
        var printer = ts2.createPrinter({ removeComments: true });
        var typeParameterParts = ts2.mapToDisplayParts(function(writer) {
          if (candidateSignature.typeParameters && candidateSignature.typeParameters.length) {
            var args = ts2.factory.createNodeArray(candidateSignature.typeParameters.map(function(p) {
              return checker.typeParameterToDeclaration(p, enclosingDeclaration, signatureHelpNodeBuilderFlags);
            }));
            printer.writeList(53776, args, sourceFile, writer);
          }
        });
        var lists = checker.getExpandedParameters(candidateSignature);
        var isVariadic = !checker.hasEffectiveRestParameter(candidateSignature) ? function(_) {
          return false;
        } : lists.length === 1 ? function(_) {
          return true;
        } : function(pList) {
          return !!(pList.length && pList[pList.length - 1].checkFlags & 32768);
        };
        return lists.map(function(parameterList) {
          return {
            isVariadic: isVariadic(parameterList),
            parameters: parameterList.map(function(p) {
              return createSignatureHelpParameterForParameter(p, checker, enclosingDeclaration, sourceFile, printer);
            }),
            prefix: __spreadArray(__spreadArray([], typeParameterParts, true), [ts2.punctuationPart(20)], false),
            suffix: [ts2.punctuationPart(21)]
          };
        });
      }
      function createSignatureHelpParameterForParameter(parameter, checker, enclosingDeclaration, sourceFile, printer) {
        var displayParts = ts2.mapToDisplayParts(function(writer) {
          var param = checker.symbolToParameterDeclaration(parameter, enclosingDeclaration, signatureHelpNodeBuilderFlags);
          printer.writeNode(4, param, sourceFile, writer);
        });
        var isOptional = checker.isOptionalParameter(parameter.valueDeclaration);
        var isRest = !!(parameter.checkFlags & 32768);
        return { name: parameter.name, documentation: parameter.getDocumentationComment(checker), displayParts, isOptional, isRest };
      }
      function createSignatureHelpParameterForTypeParameter(typeParameter, checker, enclosingDeclaration, sourceFile, printer) {
        var displayParts = ts2.mapToDisplayParts(function(writer) {
          var param = checker.typeParameterToDeclaration(typeParameter, enclosingDeclaration, signatureHelpNodeBuilderFlags);
          printer.writeNode(4, param, sourceFile, writer);
        });
        return { name: typeParameter.symbol.name, documentation: typeParameter.symbol.getDocumentationComment(checker), displayParts, isOptional: false, isRest: false };
      }
    })(SignatureHelp = ts2.SignatureHelp || (ts2.SignatureHelp = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var InlayHints;
    (function(InlayHints2) {
      var maxHintsLength = 30;
      var leadingParameterNameCommentRegexFactory = function(name) {
        return new RegExp("^\\s?/\\*\\*?\\s?".concat(name, "\\s?\\*\\/\\s?$"));
      };
      function shouldShowParameterNameHints(preferences) {
        return preferences.includeInlayParameterNameHints === "literals" || preferences.includeInlayParameterNameHints === "all";
      }
      function shouldShowLiteralParameterNameHintsOnly(preferences) {
        return preferences.includeInlayParameterNameHints === "literals";
      }
      function provideInlayHints(context) {
        var file = context.file, program = context.program, span = context.span, cancellationToken = context.cancellationToken, preferences = context.preferences;
        var sourceFileText = file.text;
        var compilerOptions = program.getCompilerOptions();
        var checker = program.getTypeChecker();
        var result = [];
        visitor(file);
        return result;
        function visitor(node) {
          if (!node || node.getFullWidth() === 0) {
            return;
          }
          switch (node.kind) {
            case 260:
            case 256:
            case 257:
            case 255:
            case 225:
            case 212:
            case 168:
            case 213:
              cancellationToken.throwIfCancellationRequested();
          }
          if (!ts2.textSpanIntersectsWith(span, node.pos, node.getFullWidth())) {
            return;
          }
          if (ts2.isTypeNode(node)) {
            return;
          }
          if (preferences.includeInlayVariableTypeHints && ts2.isVariableDeclaration(node)) {
            visitVariableLikeDeclaration(node);
          } else if (preferences.includeInlayPropertyDeclarationTypeHints && ts2.isPropertyDeclaration(node)) {
            visitVariableLikeDeclaration(node);
          } else if (preferences.includeInlayEnumMemberValueHints && ts2.isEnumMember(node)) {
            visitEnumMember(node);
          } else if (shouldShowParameterNameHints(preferences) && (ts2.isCallExpression(node) || ts2.isNewExpression(node))) {
            visitCallOrNewExpression(node);
          } else {
            if (preferences.includeInlayFunctionParameterTypeHints && ts2.isFunctionLikeDeclaration(node) && ts2.hasContextSensitiveParameters(node)) {
              visitFunctionLikeForParameterType(node);
            }
            if (preferences.includeInlayFunctionLikeReturnTypeHints && isSignatureSupportingReturnAnnotation(node)) {
              visitFunctionDeclarationLikeForReturnType(node);
            }
          }
          return ts2.forEachChild(node, visitor);
        }
        function isSignatureSupportingReturnAnnotation(node) {
          return ts2.isArrowFunction(node) || ts2.isFunctionExpression(node) || ts2.isFunctionDeclaration(node) || ts2.isMethodDeclaration(node) || ts2.isGetAccessorDeclaration(node);
        }
        function addParameterHints(text, position, isFirstVariadicArgument) {
          result.push({
            text: "".concat(isFirstVariadicArgument ? "..." : "").concat(truncation(text, maxHintsLength), ":"),
            position,
            kind: "Parameter",
            whitespaceAfter: true
          });
        }
        function addTypeHints(text, position) {
          result.push({
            text: ": ".concat(truncation(text, maxHintsLength)),
            position,
            kind: "Type",
            whitespaceBefore: true
          });
        }
        function addEnumMemberValueHints(text, position) {
          result.push({
            text: "= ".concat(truncation(text, maxHintsLength)),
            position,
            kind: "Enum",
            whitespaceBefore: true
          });
        }
        function visitEnumMember(member) {
          if (member.initializer) {
            return;
          }
          var enumValue = checker.getConstantValue(member);
          if (enumValue !== void 0) {
            addEnumMemberValueHints(enumValue.toString(), member.end);
          }
        }
        function isModuleReferenceType(type) {
          return type.symbol && type.symbol.flags & 1536;
        }
        function visitVariableLikeDeclaration(decl) {
          if (!decl.initializer || ts2.isBindingPattern(decl.name)) {
            return;
          }
          var effectiveTypeAnnotation = ts2.getEffectiveTypeAnnotationNode(decl);
          if (effectiveTypeAnnotation) {
            return;
          }
          var declarationType = checker.getTypeAtLocation(decl);
          if (isModuleReferenceType(declarationType)) {
            return;
          }
          var typeDisplayString = printTypeInSingleLine(declarationType);
          if (typeDisplayString) {
            addTypeHints(typeDisplayString, decl.name.end);
          }
        }
        function visitCallOrNewExpression(expr) {
          var args = expr.arguments;
          if (!args || !args.length) {
            return;
          }
          var candidates = [];
          var signature = checker.getResolvedSignatureForSignatureHelp(expr, candidates);
          if (!signature || !candidates.length) {
            return;
          }
          for (var i = 0; i < args.length; ++i) {
            var originalArg = args[i];
            var arg = ts2.skipParentheses(originalArg);
            if (shouldShowLiteralParameterNameHintsOnly(preferences) && !isHintableLiteral(arg)) {
              continue;
            }
            var identifierNameInfo = checker.getParameterIdentifierNameAtPosition(signature, i);
            if (identifierNameInfo) {
              var parameterName = identifierNameInfo[0], isFirstVariadicArgument = identifierNameInfo[1];
              var isParameterNameNotSameAsArgument = preferences.includeInlayParameterNameHintsWhenArgumentMatchesName || !identifierOrAccessExpressionPostfixMatchesParameterName(arg, parameterName);
              if (!isParameterNameNotSameAsArgument && !isFirstVariadicArgument) {
                continue;
              }
              var name = ts2.unescapeLeadingUnderscores(parameterName);
              if (leadingCommentsContainsParameterName(arg, name)) {
                continue;
              }
              addParameterHints(name, originalArg.getStart(), isFirstVariadicArgument);
            }
          }
        }
        function identifierOrAccessExpressionPostfixMatchesParameterName(expr, parameterName) {
          if (ts2.isIdentifier(expr)) {
            return expr.text === parameterName;
          }
          if (ts2.isPropertyAccessExpression(expr)) {
            return expr.name.text === parameterName;
          }
          return false;
        }
        function leadingCommentsContainsParameterName(node, name) {
          if (!ts2.isIdentifierText(name, compilerOptions.target, ts2.getLanguageVariant(file.scriptKind))) {
            return false;
          }
          var ranges = ts2.getLeadingCommentRanges(sourceFileText, node.pos);
          if (!(ranges === null || ranges === void 0 ? void 0 : ranges.length)) {
            return false;
          }
          var regex = leadingParameterNameCommentRegexFactory(name);
          return ts2.some(ranges, function(range) {
            return regex.test(sourceFileText.substring(range.pos, range.end));
          });
        }
        function isHintableLiteral(node) {
          switch (node.kind) {
            case 218: {
              var operand = node.operand;
              return ts2.isLiteralExpression(operand) || ts2.isIdentifier(operand) && ts2.isInfinityOrNaNString(operand.escapedText);
            }
            case 110:
            case 95:
            case 104:
            case 14:
            case 222:
              return true;
            case 79: {
              var name = node.escapedText;
              return isUndefined(name) || ts2.isInfinityOrNaNString(name);
            }
          }
          return ts2.isLiteralExpression(node);
        }
        function visitFunctionDeclarationLikeForReturnType(decl) {
          if (ts2.isArrowFunction(decl)) {
            if (!ts2.findChildOfKind(decl, 20, file)) {
              return;
            }
          }
          var effectiveTypeAnnotation = ts2.getEffectiveReturnTypeNode(decl);
          if (effectiveTypeAnnotation || !decl.body) {
            return;
          }
          var signature = checker.getSignatureFromDeclaration(decl);
          if (!signature) {
            return;
          }
          var returnType = checker.getReturnTypeOfSignature(signature);
          if (isModuleReferenceType(returnType)) {
            return;
          }
          var typeDisplayString = printTypeInSingleLine(returnType);
          if (!typeDisplayString) {
            return;
          }
          addTypeHints(typeDisplayString, getTypeAnnotationPosition(decl));
        }
        function getTypeAnnotationPosition(decl) {
          var closeParenToken = ts2.findChildOfKind(decl, 21, file);
          if (closeParenToken) {
            return closeParenToken.end;
          }
          return decl.parameters.end;
        }
        function visitFunctionLikeForParameterType(node) {
          var signature = checker.getSignatureFromDeclaration(node);
          if (!signature) {
            return;
          }
          for (var i = 0; i < node.parameters.length && i < signature.parameters.length; ++i) {
            var param = node.parameters[i];
            var effectiveTypeAnnotation = ts2.getEffectiveTypeAnnotationNode(param);
            if (effectiveTypeAnnotation) {
              continue;
            }
            var typeDisplayString = getParameterDeclarationTypeDisplayString(signature.parameters[i]);
            if (!typeDisplayString) {
              continue;
            }
            addTypeHints(typeDisplayString, param.name.end);
          }
        }
        function getParameterDeclarationTypeDisplayString(symbol) {
          var valueDeclaration = symbol.valueDeclaration;
          if (!valueDeclaration || !ts2.isParameter(valueDeclaration)) {
            return void 0;
          }
          var signatureParamType = checker.getTypeOfSymbolAtLocation(symbol, valueDeclaration);
          if (isModuleReferenceType(signatureParamType)) {
            return void 0;
          }
          return printTypeInSingleLine(signatureParamType);
        }
        function truncation(text, maxLength) {
          if (text.length > maxLength) {
            return text.substr(0, maxLength - "...".length) + "...";
          }
          return text;
        }
        function printTypeInSingleLine(type) {
          var flags = 70221824 | 1048576 | 16384;
          var options = { removeComments: true };
          var printer = ts2.createPrinter(options);
          return ts2.usingSingleLineStringWriter(function(writer) {
            var typeNode = checker.typeToTypeNode(type, void 0, flags, writer);
            ts2.Debug.assertIsDefined(typeNode, "should always get typenode");
            printer.writeNode(4, typeNode, file, writer);
          });
        }
        function isUndefined(name) {
          return name === "undefined";
        }
      }
      InlayHints2.provideInlayHints = provideInlayHints;
    })(InlayHints = ts2.InlayHints || (ts2.InlayHints = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var base64UrlRegExp = /^data:(?:application\/json(?:;charset=[uU][tT][fF]-8);base64,([A-Za-z0-9+\/=]+)$)?/;
    function getSourceMapper(host) {
      var getCanonicalFileName = ts2.createGetCanonicalFileName(host.useCaseSensitiveFileNames());
      var currentDirectory = host.getCurrentDirectory();
      var sourceFileLike = new ts2.Map();
      var documentPositionMappers = new ts2.Map();
      return { tryGetSourcePosition, tryGetGeneratedPosition, toLineColumnOffset, clearCache };
      function toPath(fileName) {
        return ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
      }
      function getDocumentPositionMapper2(generatedFileName, sourceFileName) {
        var path = toPath(generatedFileName);
        var value = documentPositionMappers.get(path);
        if (value)
          return value;
        var mapper;
        if (host.getDocumentPositionMapper) {
          mapper = host.getDocumentPositionMapper(generatedFileName, sourceFileName);
        } else if (host.readFile) {
          var file = getSourceFileLike(generatedFileName);
          mapper = file && ts2.getDocumentPositionMapper({ getSourceFileLike, getCanonicalFileName, log: function(s) {
            return host.log(s);
          } }, generatedFileName, ts2.getLineInfo(file.text, ts2.getLineStarts(file)), function(f) {
            return !host.fileExists || host.fileExists(f) ? host.readFile(f) : void 0;
          });
        }
        documentPositionMappers.set(path, mapper || ts2.identitySourceMapConsumer);
        return mapper || ts2.identitySourceMapConsumer;
      }
      function tryGetSourcePosition(info) {
        if (!ts2.isDeclarationFileName(info.fileName))
          return void 0;
        var file = getSourceFile(info.fileName);
        if (!file)
          return void 0;
        var newLoc = getDocumentPositionMapper2(info.fileName).getSourcePosition(info);
        return !newLoc || newLoc === info ? void 0 : tryGetSourcePosition(newLoc) || newLoc;
      }
      function tryGetGeneratedPosition(info) {
        if (ts2.isDeclarationFileName(info.fileName))
          return void 0;
        var sourceFile = getSourceFile(info.fileName);
        if (!sourceFile)
          return void 0;
        var program = host.getProgram();
        if (program.isSourceOfProjectReferenceRedirect(sourceFile.fileName)) {
          return void 0;
        }
        var options = program.getCompilerOptions();
        var outPath = ts2.outFile(options);
        var declarationPath = outPath ? ts2.removeFileExtension(outPath) + ".d.ts" : ts2.getDeclarationEmitOutputFilePathWorker(info.fileName, program.getCompilerOptions(), currentDirectory, program.getCommonSourceDirectory(), getCanonicalFileName);
        if (declarationPath === void 0)
          return void 0;
        var newLoc = getDocumentPositionMapper2(declarationPath, info.fileName).getGeneratedPosition(info);
        return newLoc === info ? void 0 : newLoc;
      }
      function getSourceFile(fileName) {
        var program = host.getProgram();
        if (!program)
          return void 0;
        var path = toPath(fileName);
        var file = program.getSourceFileByPath(path);
        return file && file.resolvedPath === path ? file : void 0;
      }
      function getOrCreateSourceFileLike(fileName) {
        var path = toPath(fileName);
        var fileFromCache = sourceFileLike.get(path);
        if (fileFromCache !== void 0)
          return fileFromCache ? fileFromCache : void 0;
        if (!host.readFile || host.fileExists && !host.fileExists(path)) {
          sourceFileLike.set(path, false);
          return void 0;
        }
        var text = host.readFile(path);
        var file = text ? createSourceFileLike(text) : false;
        sourceFileLike.set(path, file);
        return file ? file : void 0;
      }
      function getSourceFileLike(fileName) {
        return !host.getSourceFileLike ? getSourceFile(fileName) || getOrCreateSourceFileLike(fileName) : host.getSourceFileLike(fileName);
      }
      function toLineColumnOffset(fileName, position) {
        var file = getSourceFileLike(fileName);
        return file.getLineAndCharacterOfPosition(position);
      }
      function clearCache() {
        sourceFileLike.clear();
        documentPositionMappers.clear();
      }
    }
    ts2.getSourceMapper = getSourceMapper;
    function getDocumentPositionMapper(host, generatedFileName, generatedFileLineInfo, readMapFile) {
      var mapFileName = ts2.tryGetSourceMappingURL(generatedFileLineInfo);
      if (mapFileName) {
        var match = base64UrlRegExp.exec(mapFileName);
        if (match) {
          if (match[1]) {
            var base64Object = match[1];
            return convertDocumentToSourceMapper(host, ts2.base64decode(ts2.sys, base64Object), generatedFileName);
          }
          mapFileName = void 0;
        }
      }
      var possibleMapLocations = [];
      if (mapFileName) {
        possibleMapLocations.push(mapFileName);
      }
      possibleMapLocations.push(generatedFileName + ".map");
      var originalMapFileName = mapFileName && ts2.getNormalizedAbsolutePath(mapFileName, ts2.getDirectoryPath(generatedFileName));
      for (var _i = 0, possibleMapLocations_1 = possibleMapLocations; _i < possibleMapLocations_1.length; _i++) {
        var location = possibleMapLocations_1[_i];
        var mapFileName_1 = ts2.getNormalizedAbsolutePath(location, ts2.getDirectoryPath(generatedFileName));
        var mapFileContents = readMapFile(mapFileName_1, originalMapFileName);
        if (ts2.isString(mapFileContents)) {
          return convertDocumentToSourceMapper(host, mapFileContents, mapFileName_1);
        }
        if (mapFileContents !== void 0) {
          return mapFileContents || void 0;
        }
      }
      return void 0;
    }
    ts2.getDocumentPositionMapper = getDocumentPositionMapper;
    function convertDocumentToSourceMapper(host, contents, mapFileName) {
      var map = ts2.tryParseRawSourceMap(contents);
      if (!map || !map.sources || !map.file || !map.mappings) {
        return void 0;
      }
      if (map.sourcesContent && map.sourcesContent.some(ts2.isString))
        return void 0;
      return ts2.createDocumentPositionMapper(host, map, mapFileName);
    }
    function createSourceFileLike(text, lineMap) {
      return {
        text,
        lineMap,
        getLineAndCharacterOfPosition: function(pos) {
          return ts2.computeLineAndCharacterOfPosition(ts2.getLineStarts(this), pos);
        }
      };
    }
  })(ts || (ts = {}));
  (function(ts2) {
    var visitedNestedConvertibleFunctions = new ts2.Map();
    function computeSuggestionDiagnostics(sourceFile, program, cancellationToken) {
      program.getSemanticDiagnostics(sourceFile, cancellationToken);
      var diags = [];
      var checker = program.getTypeChecker();
      var isCommonJSFile = sourceFile.impliedNodeFormat === ts2.ModuleKind.CommonJS || ts2.fileExtensionIsOneOf(sourceFile.fileName, [".cts", ".cjs"]);
      if (!isCommonJSFile && sourceFile.commonJsModuleIndicator && (ts2.programContainsEsModules(program) || ts2.compilerOptionsIndicateEsModules(program.getCompilerOptions())) && containsTopLevelCommonjs(sourceFile)) {
        diags.push(ts2.createDiagnosticForNode(getErrorNodeFromCommonJsIndicator(sourceFile.commonJsModuleIndicator), ts2.Diagnostics.File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module));
      }
      var isJsFile = ts2.isSourceFileJS(sourceFile);
      visitedNestedConvertibleFunctions.clear();
      check(sourceFile);
      if (ts2.getAllowSyntheticDefaultImports(program.getCompilerOptions())) {
        for (var _i = 0, _a = sourceFile.imports; _i < _a.length; _i++) {
          var moduleSpecifier = _a[_i];
          var importNode = ts2.importFromModuleSpecifier(moduleSpecifier);
          var name = importNameForConvertToDefaultImport(importNode);
          if (!name)
            continue;
          var module_1 = ts2.getResolvedModule(sourceFile, moduleSpecifier.text, ts2.getModeForUsageLocation(sourceFile, moduleSpecifier));
          var resolvedFile = module_1 && program.getSourceFile(module_1.resolvedFileName);
          if (resolvedFile && resolvedFile.externalModuleIndicator && ts2.isExportAssignment(resolvedFile.externalModuleIndicator) && resolvedFile.externalModuleIndicator.isExportEquals) {
            diags.push(ts2.createDiagnosticForNode(name, ts2.Diagnostics.Import_may_be_converted_to_a_default_import));
          }
        }
      }
      ts2.addRange(diags, sourceFile.bindSuggestionDiagnostics);
      ts2.addRange(diags, program.getSuggestionDiagnostics(sourceFile, cancellationToken));
      return diags.sort(function(d1, d2) {
        return d1.start - d2.start;
      });
      function check(node) {
        if (isJsFile) {
          if (canBeConvertedToClass(node, checker)) {
            diags.push(ts2.createDiagnosticForNode(ts2.isVariableDeclaration(node.parent) ? node.parent.name : node, ts2.Diagnostics.This_constructor_function_may_be_converted_to_a_class_declaration));
          }
        } else {
          if (ts2.isVariableStatement(node) && node.parent === sourceFile && node.declarationList.flags & 2 && node.declarationList.declarations.length === 1) {
            var init = node.declarationList.declarations[0].initializer;
            if (init && ts2.isRequireCall(init, true)) {
              diags.push(ts2.createDiagnosticForNode(init, ts2.Diagnostics.require_call_may_be_converted_to_an_import));
            }
          }
          if (ts2.codefix.parameterShouldGetTypeFromJSDoc(node)) {
            diags.push(ts2.createDiagnosticForNode(node.name || node, ts2.Diagnostics.JSDoc_types_may_be_moved_to_TypeScript_types));
          }
        }
        if (canBeConvertedToAsync(node)) {
          addConvertToAsyncFunctionDiagnostics(node, checker, diags);
        }
        node.forEachChild(check);
      }
    }
    ts2.computeSuggestionDiagnostics = computeSuggestionDiagnostics;
    function containsTopLevelCommonjs(sourceFile) {
      return sourceFile.statements.some(function(statement) {
        switch (statement.kind) {
          case 236:
            return statement.declarationList.declarations.some(function(decl) {
              return !!decl.initializer && ts2.isRequireCall(propertyAccessLeftHandSide(decl.initializer), true);
            });
          case 237: {
            var expression = statement.expression;
            if (!ts2.isBinaryExpression(expression))
              return ts2.isRequireCall(expression, true);
            var kind = ts2.getAssignmentDeclarationKind(expression);
            return kind === 1 || kind === 2;
          }
          default:
            return false;
        }
      });
    }
    function propertyAccessLeftHandSide(node) {
      return ts2.isPropertyAccessExpression(node) ? propertyAccessLeftHandSide(node.expression) : node;
    }
    function importNameForConvertToDefaultImport(node) {
      switch (node.kind) {
        case 265:
          var importClause = node.importClause, moduleSpecifier = node.moduleSpecifier;
          return importClause && !importClause.name && importClause.namedBindings && importClause.namedBindings.kind === 267 && ts2.isStringLiteral(moduleSpecifier) ? importClause.namedBindings.name : void 0;
        case 264:
          return node.name;
        default:
          return void 0;
      }
    }
    function addConvertToAsyncFunctionDiagnostics(node, checker, diags) {
      if (isConvertibleFunction(node, checker) && !visitedNestedConvertibleFunctions.has(getKeyFromNode(node))) {
        diags.push(ts2.createDiagnosticForNode(!node.name && ts2.isVariableDeclaration(node.parent) && ts2.isIdentifier(node.parent.name) ? node.parent.name : node, ts2.Diagnostics.This_may_be_converted_to_an_async_function));
      }
    }
    function isConvertibleFunction(node, checker) {
      return !ts2.isAsyncFunction(node) && node.body && ts2.isBlock(node.body) && hasReturnStatementWithPromiseHandler(node.body, checker) && returnsPromise(node, checker);
    }
    function returnsPromise(node, checker) {
      var signature = checker.getSignatureFromDeclaration(node);
      var returnType = signature ? checker.getReturnTypeOfSignature(signature) : void 0;
      return !!returnType && !!checker.getPromisedTypeOfPromise(returnType);
    }
    ts2.returnsPromise = returnsPromise;
    function getErrorNodeFromCommonJsIndicator(commonJsModuleIndicator) {
      return ts2.isBinaryExpression(commonJsModuleIndicator) ? commonJsModuleIndicator.left : commonJsModuleIndicator;
    }
    function hasReturnStatementWithPromiseHandler(body, checker) {
      return !!ts2.forEachReturnStatement(body, function(statement) {
        return isReturnStatementWithFixablePromiseHandler(statement, checker);
      });
    }
    function isReturnStatementWithFixablePromiseHandler(node, checker) {
      return ts2.isReturnStatement(node) && !!node.expression && isFixablePromiseHandler(node.expression, checker);
    }
    ts2.isReturnStatementWithFixablePromiseHandler = isReturnStatementWithFixablePromiseHandler;
    function isFixablePromiseHandler(node, checker) {
      if (!isPromiseHandler(node) || !hasSupportedNumberOfArguments(node) || !node.arguments.every(function(arg) {
        return isFixablePromiseArgument(arg, checker);
      })) {
        return false;
      }
      var currentNode = node.expression.expression;
      while (isPromiseHandler(currentNode) || ts2.isPropertyAccessExpression(currentNode)) {
        if (ts2.isCallExpression(currentNode)) {
          if (!hasSupportedNumberOfArguments(currentNode) || !currentNode.arguments.every(function(arg) {
            return isFixablePromiseArgument(arg, checker);
          })) {
            return false;
          }
          currentNode = currentNode.expression.expression;
        } else {
          currentNode = currentNode.expression;
        }
      }
      return true;
    }
    ts2.isFixablePromiseHandler = isFixablePromiseHandler;
    function isPromiseHandler(node) {
      return ts2.isCallExpression(node) && (ts2.hasPropertyAccessExpressionWithName(node, "then") || ts2.hasPropertyAccessExpressionWithName(node, "catch") || ts2.hasPropertyAccessExpressionWithName(node, "finally"));
    }
    function hasSupportedNumberOfArguments(node) {
      var name = node.expression.name.text;
      var maxArguments = name === "then" ? 2 : name === "catch" ? 1 : name === "finally" ? 1 : 0;
      if (node.arguments.length > maxArguments)
        return false;
      if (node.arguments.length < maxArguments)
        return true;
      return maxArguments === 1 || ts2.some(node.arguments, function(arg) {
        return arg.kind === 104 || ts2.isIdentifier(arg) && arg.text === "undefined";
      });
    }
    function isFixablePromiseArgument(arg, checker) {
      switch (arg.kind) {
        case 255:
        case 212:
          var functionFlags = ts2.getFunctionFlags(arg);
          if (functionFlags & 1) {
            return false;
          }
        case 213:
          visitedNestedConvertibleFunctions.set(getKeyFromNode(arg), true);
        case 104:
          return true;
        case 79:
        case 205: {
          var symbol = checker.getSymbolAtLocation(arg);
          if (!symbol) {
            return false;
          }
          return checker.isUndefinedSymbol(symbol) || ts2.some(ts2.skipAlias(symbol, checker).declarations, function(d) {
            return ts2.isFunctionLike(d) || ts2.hasInitializer(d) && !!d.initializer && ts2.isFunctionLike(d.initializer);
          });
        }
        default:
          return false;
      }
    }
    function getKeyFromNode(exp) {
      return "".concat(exp.pos.toString(), ":").concat(exp.end.toString());
    }
    function canBeConvertedToClass(node, checker) {
      var _a, _b, _c, _d;
      if (node.kind === 212) {
        if (ts2.isVariableDeclaration(node.parent) && ((_a = node.symbol.members) === null || _a === void 0 ? void 0 : _a.size)) {
          return true;
        }
        var symbol = checker.getSymbolOfExpando(node, false);
        return !!(symbol && (((_b = symbol.exports) === null || _b === void 0 ? void 0 : _b.size) || ((_c = symbol.members) === null || _c === void 0 ? void 0 : _c.size)));
      }
      if (node.kind === 255) {
        return !!((_d = node.symbol.members) === null || _d === void 0 ? void 0 : _d.size);
      }
      return false;
    }
    function canBeConvertedToAsync(node) {
      switch (node.kind) {
        case 255:
        case 168:
        case 212:
        case 213:
          return true;
        default:
          return false;
      }
    }
    ts2.canBeConvertedToAsync = canBeConvertedToAsync;
  })(ts || (ts = {}));
  (function(ts2) {
    var SymbolDisplay;
    (function(SymbolDisplay2) {
      var symbolDisplayNodeBuilderFlags = 8192 | 70221824 | 16384;
      function getSymbolKind(typeChecker, symbol, location) {
        var result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(typeChecker, symbol, location);
        if (result !== "") {
          return result;
        }
        var flags = ts2.getCombinedLocalAndExportSymbolFlags(symbol);
        if (flags & 32) {
          return ts2.getDeclarationOfKind(symbol, 225) ? "local class" : "class";
        }
        if (flags & 384)
          return "enum";
        if (flags & 524288)
          return "type";
        if (flags & 64)
          return "interface";
        if (flags & 262144)
          return "type parameter";
        if (flags & 8)
          return "enum member";
        if (flags & 2097152)
          return "alias";
        if (flags & 1536)
          return "module";
        return result;
      }
      SymbolDisplay2.getSymbolKind = getSymbolKind;
      function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(typeChecker, symbol, location) {
        var roots = typeChecker.getRootSymbols(symbol);
        if (roots.length === 1 && ts2.first(roots).flags & 8192 && typeChecker.getTypeOfSymbolAtLocation(symbol, location).getNonNullableType().getCallSignatures().length !== 0) {
          return "method";
        }
        if (typeChecker.isUndefinedSymbol(symbol)) {
          return "var";
        }
        if (typeChecker.isArgumentsSymbol(symbol)) {
          return "local var";
        }
        if (location.kind === 108 && ts2.isExpression(location)) {
          return "parameter";
        }
        var flags = ts2.getCombinedLocalAndExportSymbolFlags(symbol);
        if (flags & 3) {
          if (ts2.isFirstDeclarationOfSymbolParameter(symbol)) {
            return "parameter";
          } else if (symbol.valueDeclaration && ts2.isVarConst(symbol.valueDeclaration)) {
            return "const";
          } else if (ts2.forEach(symbol.declarations, ts2.isLet)) {
            return "let";
          }
          return isLocalVariableOrFunction(symbol) ? "local var" : "var";
        }
        if (flags & 16)
          return isLocalVariableOrFunction(symbol) ? "local function" : "function";
        if (flags & 32768)
          return "getter";
        if (flags & 65536)
          return "setter";
        if (flags & 8192)
          return "method";
        if (flags & 16384)
          return "constructor";
        if (flags & 4) {
          if (flags & 33554432 && symbol.checkFlags & 6) {
            var unionPropertyKind = ts2.forEach(typeChecker.getRootSymbols(symbol), function(rootSymbol) {
              var rootSymbolFlags = rootSymbol.getFlags();
              if (rootSymbolFlags & (98308 | 3)) {
                return "property";
              }
            });
            if (!unionPropertyKind) {
              var typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location);
              if (typeOfUnionProperty.getCallSignatures().length) {
                return "method";
              }
              return "property";
            }
            return unionPropertyKind;
          }
          switch (location.parent && location.parent.kind) {
            case 279:
            case 277:
            case 278:
              return location.kind === 79 ? "property" : "JSX attribute";
            case 284:
              return "JSX attribute";
            default:
              return "property";
          }
        }
        return "";
      }
      function getNormalizedSymbolModifiers(symbol) {
        if (symbol.declarations && symbol.declarations.length) {
          var _a = symbol.declarations, declaration = _a[0], declarations = _a.slice(1);
          var excludeFlags = ts2.length(declarations) && ts2.isDeprecatedDeclaration(declaration) && ts2.some(declarations, function(d) {
            return !ts2.isDeprecatedDeclaration(d);
          }) ? 8192 : 0;
          var modifiers = ts2.getNodeModifiers(declaration, excludeFlags);
          if (modifiers) {
            return modifiers.split(",");
          }
        }
        return [];
      }
      function getSymbolModifiers(typeChecker, symbol) {
        if (!symbol) {
          return "";
        }
        var modifiers = new ts2.Set(getNormalizedSymbolModifiers(symbol));
        if (symbol.flags & 2097152) {
          var resolvedSymbol = typeChecker.getAliasedSymbol(symbol);
          if (resolvedSymbol !== symbol) {
            ts2.forEach(getNormalizedSymbolModifiers(resolvedSymbol), function(modifier) {
              modifiers.add(modifier);
            });
          }
        }
        if (symbol.flags & 16777216) {
          modifiers.add("optional");
        }
        return modifiers.size > 0 ? ts2.arrayFrom(modifiers.values()).join(",") : "";
      }
      SymbolDisplay2.getSymbolModifiers = getSymbolModifiers;
      function getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker, symbol, sourceFile, enclosingDeclaration, location, semanticMeaning, alias) {
        var _a;
        if (semanticMeaning === void 0) {
          semanticMeaning = ts2.getMeaningFromLocation(location);
        }
        var displayParts = [];
        var documentation = [];
        var tags = [];
        var symbolFlags = ts2.getCombinedLocalAndExportSymbolFlags(symbol);
        var symbolKind = semanticMeaning & 1 ? getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(typeChecker, symbol, location) : "";
        var hasAddedSymbolInfo = false;
        var isThisExpression = location.kind === 108 && ts2.isInExpressionContext(location);
        var type;
        var printer;
        var documentationFromAlias;
        var tagsFromAlias;
        var hasMultipleSignatures = false;
        if (location.kind === 108 && !isThisExpression) {
          return { displayParts: [ts2.keywordPart(108)], documentation: [], symbolKind: "primitive type", tags: void 0 };
        }
        if (symbolKind !== "" || symbolFlags & 32 || symbolFlags & 2097152) {
          if (symbolKind === "getter" || symbolKind === "setter") {
            symbolKind = "property";
          }
          var signature = void 0;
          type = isThisExpression ? typeChecker.getTypeAtLocation(location) : typeChecker.getTypeOfSymbolAtLocation(symbol, location);
          if (location.parent && location.parent.kind === 205) {
            var right = location.parent.name;
            if (right === location || right && right.getFullWidth() === 0) {
              location = location.parent;
            }
          }
          var callExpressionLike = void 0;
          if (ts2.isCallOrNewExpression(location)) {
            callExpressionLike = location;
          } else if (ts2.isCallExpressionTarget(location) || ts2.isNewExpressionTarget(location)) {
            callExpressionLike = location.parent;
          } else if (location.parent && (ts2.isJsxOpeningLikeElement(location.parent) || ts2.isTaggedTemplateExpression(location.parent)) && ts2.isFunctionLike(symbol.valueDeclaration)) {
            callExpressionLike = location.parent;
          }
          if (callExpressionLike) {
            signature = typeChecker.getResolvedSignature(callExpressionLike);
            var useConstructSignatures = callExpressionLike.kind === 208 || ts2.isCallExpression(callExpressionLike) && callExpressionLike.expression.kind === 106;
            var allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures();
            if (signature && !ts2.contains(allSignatures, signature.target) && !ts2.contains(allSignatures, signature)) {
              signature = allSignatures.length ? allSignatures[0] : void 0;
            }
            if (signature) {
              if (useConstructSignatures && symbolFlags & 32) {
                symbolKind = "constructor";
                addPrefixForAnyFunctionOrVar(type.symbol, symbolKind);
              } else if (symbolFlags & 2097152) {
                symbolKind = "alias";
                pushSymbolKind(symbolKind);
                displayParts.push(ts2.spacePart());
                if (useConstructSignatures) {
                  if (signature.flags & 4) {
                    displayParts.push(ts2.keywordPart(126));
                    displayParts.push(ts2.spacePart());
                  }
                  displayParts.push(ts2.keywordPart(103));
                  displayParts.push(ts2.spacePart());
                }
                addFullSymbolName(symbol);
              } else {
                addPrefixForAnyFunctionOrVar(symbol, symbolKind);
              }
              switch (symbolKind) {
                case "JSX attribute":
                case "property":
                case "var":
                case "const":
                case "let":
                case "parameter":
                case "local var":
                  displayParts.push(ts2.punctuationPart(58));
                  displayParts.push(ts2.spacePart());
                  if (!(ts2.getObjectFlags(type) & 16) && type.symbol) {
                    ts2.addRange(displayParts, ts2.symbolToDisplayParts(typeChecker, type.symbol, enclosingDeclaration, void 0, 4 | 1));
                    displayParts.push(ts2.lineBreakPart());
                  }
                  if (useConstructSignatures) {
                    if (signature.flags & 4) {
                      displayParts.push(ts2.keywordPart(126));
                      displayParts.push(ts2.spacePart());
                    }
                    displayParts.push(ts2.keywordPart(103));
                    displayParts.push(ts2.spacePart());
                  }
                  addSignatureDisplayParts(signature, allSignatures, 262144);
                  break;
                default:
                  addSignatureDisplayParts(signature, allSignatures);
              }
              hasAddedSymbolInfo = true;
              hasMultipleSignatures = allSignatures.length > 1;
            }
          } else if (ts2.isNameOfFunctionDeclaration(location) && !(symbolFlags & 98304) || location.kind === 134 && location.parent.kind === 170) {
            var functionDeclaration_1 = location.parent;
            var locationIsSymbolDeclaration = symbol.declarations && ts2.find(symbol.declarations, function(declaration2) {
              return declaration2 === (location.kind === 134 ? functionDeclaration_1.parent : functionDeclaration_1);
            });
            if (locationIsSymbolDeclaration) {
              var allSignatures = functionDeclaration_1.kind === 170 ? type.getNonNullableType().getConstructSignatures() : type.getNonNullableType().getCallSignatures();
              if (!typeChecker.isImplementationOfOverload(functionDeclaration_1)) {
                signature = typeChecker.getSignatureFromDeclaration(functionDeclaration_1);
              } else {
                signature = allSignatures[0];
              }
              if (functionDeclaration_1.kind === 170) {
                symbolKind = "constructor";
                addPrefixForAnyFunctionOrVar(type.symbol, symbolKind);
              } else {
                addPrefixForAnyFunctionOrVar(functionDeclaration_1.kind === 173 && !(type.symbol.flags & 2048 || type.symbol.flags & 4096) ? type.symbol : symbol, symbolKind);
              }
              if (signature) {
                addSignatureDisplayParts(signature, allSignatures);
              }
              hasAddedSymbolInfo = true;
              hasMultipleSignatures = allSignatures.length > 1;
            }
          }
        }
        if (symbolFlags & 32 && !hasAddedSymbolInfo && !isThisExpression) {
          addAliasPrefixIfNecessary();
          if (ts2.getDeclarationOfKind(symbol, 225)) {
            pushSymbolKind("local class");
          } else {
            displayParts.push(ts2.keywordPart(84));
          }
          displayParts.push(ts2.spacePart());
          addFullSymbolName(symbol);
          writeTypeParametersOfSymbol(symbol, sourceFile);
        }
        if (symbolFlags & 64 && semanticMeaning & 2) {
          prefixNextMeaning();
          displayParts.push(ts2.keywordPart(118));
          displayParts.push(ts2.spacePart());
          addFullSymbolName(symbol);
          writeTypeParametersOfSymbol(symbol, sourceFile);
        }
        if (symbolFlags & 524288 && semanticMeaning & 2) {
          prefixNextMeaning();
          displayParts.push(ts2.keywordPart(151));
          displayParts.push(ts2.spacePart());
          addFullSymbolName(symbol);
          writeTypeParametersOfSymbol(symbol, sourceFile);
          displayParts.push(ts2.spacePart());
          displayParts.push(ts2.operatorPart(63));
          displayParts.push(ts2.spacePart());
          ts2.addRange(displayParts, ts2.typeToDisplayParts(typeChecker, typeChecker.getDeclaredTypeOfSymbol(symbol), enclosingDeclaration, 8388608));
        }
        if (symbolFlags & 384) {
          prefixNextMeaning();
          if (ts2.some(symbol.declarations, function(d) {
            return ts2.isEnumDeclaration(d) && ts2.isEnumConst(d);
          })) {
            displayParts.push(ts2.keywordPart(85));
            displayParts.push(ts2.spacePart());
          }
          displayParts.push(ts2.keywordPart(92));
          displayParts.push(ts2.spacePart());
          addFullSymbolName(symbol);
        }
        if (symbolFlags & 1536 && !isThisExpression) {
          prefixNextMeaning();
          var declaration = ts2.getDeclarationOfKind(symbol, 260);
          var isNamespace = declaration && declaration.name && declaration.name.kind === 79;
          displayParts.push(ts2.keywordPart(isNamespace ? 142 : 141));
          displayParts.push(ts2.spacePart());
          addFullSymbolName(symbol);
        }
        if (symbolFlags & 262144 && semanticMeaning & 2) {
          prefixNextMeaning();
          displayParts.push(ts2.punctuationPart(20));
          displayParts.push(ts2.textPart("type parameter"));
          displayParts.push(ts2.punctuationPart(21));
          displayParts.push(ts2.spacePart());
          addFullSymbolName(symbol);
          if (symbol.parent) {
            addInPrefix();
            addFullSymbolName(symbol.parent, enclosingDeclaration);
            writeTypeParametersOfSymbol(symbol.parent, enclosingDeclaration);
          } else {
            var decl = ts2.getDeclarationOfKind(symbol, 162);
            if (decl === void 0)
              return ts2.Debug.fail();
            var declaration = decl.parent;
            if (declaration) {
              if (ts2.isFunctionLikeKind(declaration.kind)) {
                addInPrefix();
                var signature = typeChecker.getSignatureFromDeclaration(declaration);
                if (declaration.kind === 174) {
                  displayParts.push(ts2.keywordPart(103));
                  displayParts.push(ts2.spacePart());
                } else if (declaration.kind !== 173 && declaration.name) {
                  addFullSymbolName(declaration.symbol);
                }
                ts2.addRange(displayParts, ts2.signatureToDisplayParts(typeChecker, signature, sourceFile, 32));
              } else if (declaration.kind === 258) {
                addInPrefix();
                displayParts.push(ts2.keywordPart(151));
                displayParts.push(ts2.spacePart());
                addFullSymbolName(declaration.symbol);
                writeTypeParametersOfSymbol(declaration.symbol, sourceFile);
              }
            }
          }
        }
        if (symbolFlags & 8) {
          symbolKind = "enum member";
          addPrefixForAnyFunctionOrVar(symbol, "enum member");
          var declaration = (_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a[0];
          if ((declaration === null || declaration === void 0 ? void 0 : declaration.kind) === 297) {
            var constantValue = typeChecker.getConstantValue(declaration);
            if (constantValue !== void 0) {
              displayParts.push(ts2.spacePart());
              displayParts.push(ts2.operatorPart(63));
              displayParts.push(ts2.spacePart());
              displayParts.push(ts2.displayPart(ts2.getTextOfConstantValue(constantValue), typeof constantValue === "number" ? ts2.SymbolDisplayPartKind.numericLiteral : ts2.SymbolDisplayPartKind.stringLiteral));
            }
          }
        }
        if (symbol.flags & 2097152) {
          prefixNextMeaning();
          if (!hasAddedSymbolInfo) {
            var resolvedSymbol = typeChecker.getAliasedSymbol(symbol);
            if (resolvedSymbol !== symbol && resolvedSymbol.declarations && resolvedSymbol.declarations.length > 0) {
              var resolvedNode = resolvedSymbol.declarations[0];
              var declarationName = ts2.getNameOfDeclaration(resolvedNode);
              if (declarationName) {
                var isExternalModuleDeclaration = ts2.isModuleWithStringLiteralName(resolvedNode) && ts2.hasSyntacticModifier(resolvedNode, 2);
                var shouldUseAliasName = symbol.name !== "default" && !isExternalModuleDeclaration;
                var resolvedInfo = getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker, resolvedSymbol, ts2.getSourceFileOfNode(resolvedNode), resolvedNode, declarationName, semanticMeaning, shouldUseAliasName ? symbol : resolvedSymbol);
                displayParts.push.apply(displayParts, resolvedInfo.displayParts);
                displayParts.push(ts2.lineBreakPart());
                documentationFromAlias = resolvedInfo.documentation;
                tagsFromAlias = resolvedInfo.tags;
              } else {
                documentationFromAlias = resolvedSymbol.getContextualDocumentationComment(resolvedNode, typeChecker);
                tagsFromAlias = resolvedSymbol.getJsDocTags(typeChecker);
              }
            }
          }
          if (symbol.declarations) {
            switch (symbol.declarations[0].kind) {
              case 263:
                displayParts.push(ts2.keywordPart(93));
                displayParts.push(ts2.spacePart());
                displayParts.push(ts2.keywordPart(142));
                break;
              case 270:
                displayParts.push(ts2.keywordPart(93));
                displayParts.push(ts2.spacePart());
                displayParts.push(ts2.keywordPart(symbol.declarations[0].isExportEquals ? 63 : 88));
                break;
              case 274:
                displayParts.push(ts2.keywordPart(93));
                break;
              default:
                displayParts.push(ts2.keywordPart(100));
            }
          }
          displayParts.push(ts2.spacePart());
          addFullSymbolName(symbol);
          ts2.forEach(symbol.declarations, function(declaration2) {
            if (declaration2.kind === 264) {
              var importEqualsDeclaration = declaration2;
              if (ts2.isExternalModuleImportEqualsDeclaration(importEqualsDeclaration)) {
                displayParts.push(ts2.spacePart());
                displayParts.push(ts2.operatorPart(63));
                displayParts.push(ts2.spacePart());
                displayParts.push(ts2.keywordPart(145));
                displayParts.push(ts2.punctuationPart(20));
                displayParts.push(ts2.displayPart(ts2.getTextOfNode(ts2.getExternalModuleImportEqualsDeclarationExpression(importEqualsDeclaration)), ts2.SymbolDisplayPartKind.stringLiteral));
                displayParts.push(ts2.punctuationPart(21));
              } else {
                var internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference);
                if (internalAliasSymbol) {
                  displayParts.push(ts2.spacePart());
                  displayParts.push(ts2.operatorPart(63));
                  displayParts.push(ts2.spacePart());
                  addFullSymbolName(internalAliasSymbol, enclosingDeclaration);
                }
              }
              return true;
            }
          });
        }
        if (!hasAddedSymbolInfo) {
          if (symbolKind !== "") {
            if (type) {
              if (isThisExpression) {
                prefixNextMeaning();
                displayParts.push(ts2.keywordPart(108));
              } else {
                addPrefixForAnyFunctionOrVar(symbol, symbolKind);
              }
              if (symbolKind === "property" || symbolKind === "JSX attribute" || symbolFlags & 3 || symbolKind === "local var" || isThisExpression) {
                displayParts.push(ts2.punctuationPart(58));
                displayParts.push(ts2.spacePart());
                if (type.symbol && type.symbol.flags & 262144) {
                  var typeParameterParts = ts2.mapToDisplayParts(function(writer) {
                    var param = typeChecker.typeParameterToDeclaration(type, enclosingDeclaration, symbolDisplayNodeBuilderFlags);
                    getPrinter().writeNode(4, param, ts2.getSourceFileOfNode(ts2.getParseTreeNode(enclosingDeclaration)), writer);
                  });
                  ts2.addRange(displayParts, typeParameterParts);
                } else {
                  ts2.addRange(displayParts, ts2.typeToDisplayParts(typeChecker, type, enclosingDeclaration));
                }
                if (symbol.target && symbol.target.tupleLabelDeclaration) {
                  var labelDecl = symbol.target.tupleLabelDeclaration;
                  ts2.Debug.assertNode(labelDecl.name, ts2.isIdentifier);
                  displayParts.push(ts2.spacePart());
                  displayParts.push(ts2.punctuationPart(20));
                  displayParts.push(ts2.textPart(ts2.idText(labelDecl.name)));
                  displayParts.push(ts2.punctuationPart(21));
                }
              } else if (symbolFlags & 16 || symbolFlags & 8192 || symbolFlags & 16384 || symbolFlags & 131072 || symbolFlags & 98304 || symbolKind === "method") {
                var allSignatures = type.getNonNullableType().getCallSignatures();
                if (allSignatures.length) {
                  addSignatureDisplayParts(allSignatures[0], allSignatures);
                  hasMultipleSignatures = allSignatures.length > 1;
                }
              }
            }
          } else {
            symbolKind = getSymbolKind(typeChecker, symbol, location);
          }
        }
        if (documentation.length === 0 && !hasMultipleSignatures) {
          documentation = symbol.getContextualDocumentationComment(enclosingDeclaration, typeChecker);
        }
        if (documentation.length === 0 && symbolFlags & 4) {
          if (symbol.parent && symbol.declarations && ts2.forEach(symbol.parent.declarations, function(declaration2) {
            return declaration2.kind === 303;
          })) {
            for (var _i = 0, _b = symbol.declarations; _i < _b.length; _i++) {
              var declaration = _b[_i];
              if (!declaration.parent || declaration.parent.kind !== 220) {
                continue;
              }
              var rhsSymbol = typeChecker.getSymbolAtLocation(declaration.parent.right);
              if (!rhsSymbol) {
                continue;
              }
              documentation = rhsSymbol.getDocumentationComment(typeChecker);
              tags = rhsSymbol.getJsDocTags(typeChecker);
              if (documentation.length > 0) {
                break;
              }
            }
          }
        }
        if (tags.length === 0 && !hasMultipleSignatures) {
          tags = symbol.getJsDocTags(typeChecker);
        }
        if (documentation.length === 0 && documentationFromAlias) {
          documentation = documentationFromAlias;
        }
        if (tags.length === 0 && tagsFromAlias) {
          tags = tagsFromAlias;
        }
        return { displayParts, documentation, symbolKind, tags: tags.length === 0 ? void 0 : tags };
        function getPrinter() {
          if (!printer) {
            printer = ts2.createPrinter({ removeComments: true });
          }
          return printer;
        }
        function prefixNextMeaning() {
          if (displayParts.length) {
            displayParts.push(ts2.lineBreakPart());
          }
          addAliasPrefixIfNecessary();
        }
        function addAliasPrefixIfNecessary() {
          if (alias) {
            pushSymbolKind("alias");
            displayParts.push(ts2.spacePart());
          }
        }
        function addInPrefix() {
          displayParts.push(ts2.spacePart());
          displayParts.push(ts2.keywordPart(101));
          displayParts.push(ts2.spacePart());
        }
        function addFullSymbolName(symbolToDisplay, enclosingDeclaration2) {
          if (alias && symbolToDisplay === symbol) {
            symbolToDisplay = alias;
          }
          var fullSymbolDisplayParts = ts2.symbolToDisplayParts(typeChecker, symbolToDisplay, enclosingDeclaration2 || sourceFile, void 0, 1 | 2 | 4);
          ts2.addRange(displayParts, fullSymbolDisplayParts);
          if (symbol.flags & 16777216) {
            displayParts.push(ts2.punctuationPart(57));
          }
        }
        function addPrefixForAnyFunctionOrVar(symbol2, symbolKind2) {
          prefixNextMeaning();
          if (symbolKind2) {
            pushSymbolKind(symbolKind2);
            if (symbol2 && !ts2.some(symbol2.declarations, function(d) {
              return ts2.isArrowFunction(d) || (ts2.isFunctionExpression(d) || ts2.isClassExpression(d)) && !d.name;
            })) {
              displayParts.push(ts2.spacePart());
              addFullSymbolName(symbol2);
            }
          }
        }
        function pushSymbolKind(symbolKind2) {
          switch (symbolKind2) {
            case "var":
            case "function":
            case "let":
            case "const":
            case "constructor":
              displayParts.push(ts2.textOrKeywordPart(symbolKind2));
              return;
            default:
              displayParts.push(ts2.punctuationPart(20));
              displayParts.push(ts2.textOrKeywordPart(symbolKind2));
              displayParts.push(ts2.punctuationPart(21));
              return;
          }
        }
        function addSignatureDisplayParts(signature2, allSignatures2, flags) {
          if (flags === void 0) {
            flags = 0;
          }
          ts2.addRange(displayParts, ts2.signatureToDisplayParts(typeChecker, signature2, enclosingDeclaration, flags | 32));
          if (allSignatures2.length > 1) {
            displayParts.push(ts2.spacePart());
            displayParts.push(ts2.punctuationPart(20));
            displayParts.push(ts2.operatorPart(39));
            displayParts.push(ts2.displayPart((allSignatures2.length - 1).toString(), ts2.SymbolDisplayPartKind.numericLiteral));
            displayParts.push(ts2.spacePart());
            displayParts.push(ts2.textPart(allSignatures2.length === 2 ? "overload" : "overloads"));
            displayParts.push(ts2.punctuationPart(21));
          }
          documentation = signature2.getDocumentationComment(typeChecker);
          tags = signature2.getJsDocTags();
          if (allSignatures2.length > 1 && documentation.length === 0 && tags.length === 0) {
            documentation = allSignatures2[0].getDocumentationComment(typeChecker);
            tags = allSignatures2[0].getJsDocTags();
          }
        }
        function writeTypeParametersOfSymbol(symbol2, enclosingDeclaration2) {
          var typeParameterParts2 = ts2.mapToDisplayParts(function(writer) {
            var params = typeChecker.symbolToTypeParameterDeclarations(symbol2, enclosingDeclaration2, symbolDisplayNodeBuilderFlags);
            getPrinter().writeList(53776, params, ts2.getSourceFileOfNode(ts2.getParseTreeNode(enclosingDeclaration2)), writer);
          });
          ts2.addRange(displayParts, typeParameterParts2);
        }
      }
      SymbolDisplay2.getSymbolDisplayPartsDocumentationAndSymbolKind = getSymbolDisplayPartsDocumentationAndSymbolKind;
      function isLocalVariableOrFunction(symbol) {
        if (symbol.parent) {
          return false;
        }
        return ts2.forEach(symbol.declarations, function(declaration) {
          if (declaration.kind === 212) {
            return true;
          }
          if (declaration.kind !== 253 && declaration.kind !== 255) {
            return false;
          }
          for (var parent = declaration.parent; !ts2.isFunctionBlock(parent); parent = parent.parent) {
            if (parent.kind === 303 || parent.kind === 261) {
              return false;
            }
          }
          return true;
        });
      }
    })(SymbolDisplay = ts2.SymbolDisplay || (ts2.SymbolDisplay = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    function transpileModule(input, transpileOptions) {
      var diagnostics = [];
      var options = transpileOptions.compilerOptions ? fixupCompilerOptions(transpileOptions.compilerOptions, diagnostics) : {};
      var defaultOptions = ts2.getDefaultCompilerOptions();
      for (var key in defaultOptions) {
        if (ts2.hasProperty(defaultOptions, key) && options[key] === void 0) {
          options[key] = defaultOptions[key];
        }
      }
      for (var _i = 0, transpileOptionValueCompilerOptions_1 = ts2.transpileOptionValueCompilerOptions; _i < transpileOptionValueCompilerOptions_1.length; _i++) {
        var option = transpileOptionValueCompilerOptions_1[_i];
        options[option.name] = option.transpileOptionValue;
      }
      options.suppressOutputPathCheck = true;
      options.allowNonTsExtensions = true;
      var inputFileName = transpileOptions.fileName || (transpileOptions.compilerOptions && transpileOptions.compilerOptions.jsx ? "module.tsx" : "module.ts");
      var sourceFile = ts2.createSourceFile(inputFileName, input, ts2.getEmitScriptTarget(options));
      if (transpileOptions.moduleName) {
        sourceFile.moduleName = transpileOptions.moduleName;
      }
      if (transpileOptions.renamedDependencies) {
        sourceFile.renamedDependencies = new ts2.Map(ts2.getEntries(transpileOptions.renamedDependencies));
      }
      var newLine = ts2.getNewLineCharacter(options);
      var outputText;
      var sourceMapText;
      var compilerHost = {
        getSourceFile: function(fileName) {
          return fileName === ts2.normalizePath(inputFileName) ? sourceFile : void 0;
        },
        writeFile: function(name, text) {
          if (ts2.fileExtensionIs(name, ".map")) {
            ts2.Debug.assertEqual(sourceMapText, void 0, "Unexpected multiple source map outputs, file:", name);
            sourceMapText = text;
          } else {
            ts2.Debug.assertEqual(outputText, void 0, "Unexpected multiple outputs, file:", name);
            outputText = text;
          }
        },
        getDefaultLibFileName: function() {
          return "lib.d.ts";
        },
        useCaseSensitiveFileNames: function() {
          return false;
        },
        getCanonicalFileName: function(fileName) {
          return fileName;
        },
        getCurrentDirectory: function() {
          return "";
        },
        getNewLine: function() {
          return newLine;
        },
        fileExists: function(fileName) {
          return fileName === inputFileName;
        },
        readFile: function() {
          return "";
        },
        directoryExists: function() {
          return true;
        },
        getDirectories: function() {
          return [];
        }
      };
      var program = ts2.createProgram([inputFileName], options, compilerHost);
      if (transpileOptions.reportDiagnostics) {
        ts2.addRange(diagnostics, program.getSyntacticDiagnostics(sourceFile));
        ts2.addRange(diagnostics, program.getOptionsDiagnostics());
      }
      program.emit(void 0, void 0, void 0, void 0, transpileOptions.transformers);
      if (outputText === void 0)
        return ts2.Debug.fail("Output generation failed");
      return { outputText, diagnostics, sourceMapText };
    }
    ts2.transpileModule = transpileModule;
    function transpile(input, compilerOptions, fileName, diagnostics, moduleName) {
      var output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName });
      ts2.addRange(diagnostics, output.diagnostics);
      return output.outputText;
    }
    ts2.transpile = transpile;
    var commandLineOptionsStringToEnum;
    function fixupCompilerOptions(options, diagnostics) {
      commandLineOptionsStringToEnum = commandLineOptionsStringToEnum || ts2.filter(ts2.optionDeclarations, function(o) {
        return typeof o.type === "object" && !ts2.forEachEntry(o.type, function(v) {
          return typeof v !== "number";
        });
      });
      options = ts2.cloneCompilerOptions(options);
      var _loop_10 = function(opt2) {
        if (!ts2.hasProperty(options, opt2.name)) {
          return "continue";
        }
        var value = options[opt2.name];
        if (ts2.isString(value)) {
          options[opt2.name] = ts2.parseCustomTypeOption(opt2, value, diagnostics);
        } else {
          if (!ts2.forEachEntry(opt2.type, function(v) {
            return v === value;
          })) {
            diagnostics.push(ts2.createCompilerDiagnosticForInvalidCustomType(opt2));
          }
        }
      };
      for (var _i = 0, commandLineOptionsStringToEnum_1 = commandLineOptionsStringToEnum; _i < commandLineOptionsStringToEnum_1.length; _i++) {
        var opt = commandLineOptionsStringToEnum_1[_i];
        _loop_10(opt);
      }
      return options;
    }
    ts2.fixupCompilerOptions = fixupCompilerOptions;
  })(ts || (ts = {}));
  (function(ts2) {
    var formatting;
    (function(formatting2) {
      var FormattingRequestKind;
      (function(FormattingRequestKind2) {
        FormattingRequestKind2[FormattingRequestKind2["FormatDocument"] = 0] = "FormatDocument";
        FormattingRequestKind2[FormattingRequestKind2["FormatSelection"] = 1] = "FormatSelection";
        FormattingRequestKind2[FormattingRequestKind2["FormatOnEnter"] = 2] = "FormatOnEnter";
        FormattingRequestKind2[FormattingRequestKind2["FormatOnSemicolon"] = 3] = "FormatOnSemicolon";
        FormattingRequestKind2[FormattingRequestKind2["FormatOnOpeningCurlyBrace"] = 4] = "FormatOnOpeningCurlyBrace";
        FormattingRequestKind2[FormattingRequestKind2["FormatOnClosingCurlyBrace"] = 5] = "FormatOnClosingCurlyBrace";
      })(FormattingRequestKind = formatting2.FormattingRequestKind || (formatting2.FormattingRequestKind = {}));
      var FormattingContext = function() {
        function FormattingContext2(sourceFile, formattingRequestKind, options) {
          this.sourceFile = sourceFile;
          this.formattingRequestKind = formattingRequestKind;
          this.options = options;
        }
        FormattingContext2.prototype.updateContext = function(currentRange, currentTokenParent, nextRange, nextTokenParent, commonParent) {
          this.currentTokenSpan = ts2.Debug.checkDefined(currentRange);
          this.currentTokenParent = ts2.Debug.checkDefined(currentTokenParent);
          this.nextTokenSpan = ts2.Debug.checkDefined(nextRange);
          this.nextTokenParent = ts2.Debug.checkDefined(nextTokenParent);
          this.contextNode = ts2.Debug.checkDefined(commonParent);
          this.contextNodeAllOnSameLine = void 0;
          this.nextNodeAllOnSameLine = void 0;
          this.tokensAreOnSameLine = void 0;
          this.contextNodeBlockIsOnOneLine = void 0;
          this.nextNodeBlockIsOnOneLine = void 0;
        };
        FormattingContext2.prototype.ContextNodeAllOnSameLine = function() {
          if (this.contextNodeAllOnSameLine === void 0) {
            this.contextNodeAllOnSameLine = this.NodeIsOnOneLine(this.contextNode);
          }
          return this.contextNodeAllOnSameLine;
        };
        FormattingContext2.prototype.NextNodeAllOnSameLine = function() {
          if (this.nextNodeAllOnSameLine === void 0) {
            this.nextNodeAllOnSameLine = this.NodeIsOnOneLine(this.nextTokenParent);
          }
          return this.nextNodeAllOnSameLine;
        };
        FormattingContext2.prototype.TokensAreOnSameLine = function() {
          if (this.tokensAreOnSameLine === void 0) {
            var startLine = this.sourceFile.getLineAndCharacterOfPosition(this.currentTokenSpan.pos).line;
            var endLine = this.sourceFile.getLineAndCharacterOfPosition(this.nextTokenSpan.pos).line;
            this.tokensAreOnSameLine = startLine === endLine;
          }
          return this.tokensAreOnSameLine;
        };
        FormattingContext2.prototype.ContextNodeBlockIsOnOneLine = function() {
          if (this.contextNodeBlockIsOnOneLine === void 0) {
            this.contextNodeBlockIsOnOneLine = this.BlockIsOnOneLine(this.contextNode);
          }
          return this.contextNodeBlockIsOnOneLine;
        };
        FormattingContext2.prototype.NextNodeBlockIsOnOneLine = function() {
          if (this.nextNodeBlockIsOnOneLine === void 0) {
            this.nextNodeBlockIsOnOneLine = this.BlockIsOnOneLine(this.nextTokenParent);
          }
          return this.nextNodeBlockIsOnOneLine;
        };
        FormattingContext2.prototype.NodeIsOnOneLine = function(node) {
          var startLine = this.sourceFile.getLineAndCharacterOfPosition(node.getStart(this.sourceFile)).line;
          var endLine = this.sourceFile.getLineAndCharacterOfPosition(node.getEnd()).line;
          return startLine === endLine;
        };
        FormattingContext2.prototype.BlockIsOnOneLine = function(node) {
          var openBrace = ts2.findChildOfKind(node, 18, this.sourceFile);
          var closeBrace = ts2.findChildOfKind(node, 19, this.sourceFile);
          if (openBrace && closeBrace) {
            var startLine = this.sourceFile.getLineAndCharacterOfPosition(openBrace.getEnd()).line;
            var endLine = this.sourceFile.getLineAndCharacterOfPosition(closeBrace.getStart(this.sourceFile)).line;
            return startLine === endLine;
          }
          return false;
        };
        return FormattingContext2;
      }();
      formatting2.FormattingContext = FormattingContext;
    })(formatting = ts2.formatting || (ts2.formatting = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var formatting;
    (function(formatting2) {
      var standardScanner = ts2.createScanner(99, false, 0);
      var jsxScanner = ts2.createScanner(99, false, 1);
      var ScanAction;
      (function(ScanAction2) {
        ScanAction2[ScanAction2["Scan"] = 0] = "Scan";
        ScanAction2[ScanAction2["RescanGreaterThanToken"] = 1] = "RescanGreaterThanToken";
        ScanAction2[ScanAction2["RescanSlashToken"] = 2] = "RescanSlashToken";
        ScanAction2[ScanAction2["RescanTemplateToken"] = 3] = "RescanTemplateToken";
        ScanAction2[ScanAction2["RescanJsxIdentifier"] = 4] = "RescanJsxIdentifier";
        ScanAction2[ScanAction2["RescanJsxText"] = 5] = "RescanJsxText";
        ScanAction2[ScanAction2["RescanJsxAttributeValue"] = 6] = "RescanJsxAttributeValue";
      })(ScanAction || (ScanAction = {}));
      function getFormattingScanner(text, languageVariant, startPos, endPos, cb) {
        var scanner = languageVariant === 1 ? jsxScanner : standardScanner;
        scanner.setText(text);
        scanner.setTextPos(startPos);
        var wasNewLine = true;
        var leadingTrivia;
        var trailingTrivia;
        var savedPos;
        var lastScanAction;
        var lastTokenInfo;
        var res = cb({
          advance,
          readTokenInfo,
          readEOFTokenRange,
          isOnToken,
          isOnEOF,
          getCurrentLeadingTrivia: function() {
            return leadingTrivia;
          },
          lastTrailingTriviaWasNewLine: function() {
            return wasNewLine;
          },
          skipToEndOf,
          skipToStartOf
        });
        lastTokenInfo = void 0;
        scanner.setText(void 0);
        return res;
        function advance() {
          lastTokenInfo = void 0;
          var isStarted = scanner.getStartPos() !== startPos;
          if (isStarted) {
            wasNewLine = !!trailingTrivia && ts2.last(trailingTrivia).kind === 4;
          } else {
            scanner.scan();
          }
          leadingTrivia = void 0;
          trailingTrivia = void 0;
          var pos = scanner.getStartPos();
          while (pos < endPos) {
            var t = scanner.getToken();
            if (!ts2.isTrivia(t)) {
              break;
            }
            scanner.scan();
            var item = {
              pos,
              end: scanner.getStartPos(),
              kind: t
            };
            pos = scanner.getStartPos();
            leadingTrivia = ts2.append(leadingTrivia, item);
          }
          savedPos = scanner.getStartPos();
        }
        function shouldRescanGreaterThanToken(node) {
          switch (node.kind) {
            case 33:
            case 71:
            case 72:
            case 49:
            case 48:
              return true;
          }
          return false;
        }
        function shouldRescanJsxIdentifier(node) {
          if (node.parent) {
            switch (node.parent.kind) {
              case 284:
              case 279:
              case 280:
              case 278:
                return ts2.isKeyword(node.kind) || node.kind === 79;
            }
          }
          return false;
        }
        function shouldRescanJsxText(node) {
          return ts2.isJsxText(node);
        }
        function shouldRescanSlashToken(container) {
          return container.kind === 13;
        }
        function shouldRescanTemplateToken(container) {
          return container.kind === 16 || container.kind === 17;
        }
        function shouldRescanJsxAttributeValue(node) {
          return node.parent && ts2.isJsxAttribute(node.parent) && node.parent.initializer === node;
        }
        function startsWithSlashToken(t) {
          return t === 43 || t === 68;
        }
        function readTokenInfo(n) {
          ts2.Debug.assert(isOnToken());
          var expectedScanAction = shouldRescanGreaterThanToken(n) ? 1 : shouldRescanSlashToken(n) ? 2 : shouldRescanTemplateToken(n) ? 3 : shouldRescanJsxIdentifier(n) ? 4 : shouldRescanJsxText(n) ? 5 : shouldRescanJsxAttributeValue(n) ? 6 : 0;
          if (lastTokenInfo && expectedScanAction === lastScanAction) {
            return fixTokenKind(lastTokenInfo, n);
          }
          if (scanner.getStartPos() !== savedPos) {
            ts2.Debug.assert(lastTokenInfo !== void 0);
            scanner.setTextPos(savedPos);
            scanner.scan();
          }
          var currentToken = getNextToken(n, expectedScanAction);
          var token = formatting2.createTextRangeWithKind(scanner.getStartPos(), scanner.getTextPos(), currentToken);
          if (trailingTrivia) {
            trailingTrivia = void 0;
          }
          while (scanner.getStartPos() < endPos) {
            currentToken = scanner.scan();
            if (!ts2.isTrivia(currentToken)) {
              break;
            }
            var trivia = formatting2.createTextRangeWithKind(scanner.getStartPos(), scanner.getTextPos(), currentToken);
            if (!trailingTrivia) {
              trailingTrivia = [];
            }
            trailingTrivia.push(trivia);
            if (currentToken === 4) {
              scanner.scan();
              break;
            }
          }
          lastTokenInfo = { leadingTrivia, trailingTrivia, token };
          return fixTokenKind(lastTokenInfo, n);
        }
        function getNextToken(n, expectedScanAction) {
          var token = scanner.getToken();
          lastScanAction = 0;
          switch (expectedScanAction) {
            case 1:
              if (token === 31) {
                lastScanAction = 1;
                var newToken = scanner.reScanGreaterToken();
                ts2.Debug.assert(n.kind === newToken);
                return newToken;
              }
              break;
            case 2:
              if (startsWithSlashToken(token)) {
                lastScanAction = 2;
                var newToken = scanner.reScanSlashToken();
                ts2.Debug.assert(n.kind === newToken);
                return newToken;
              }
              break;
            case 3:
              if (token === 19) {
                lastScanAction = 3;
                return scanner.reScanTemplateToken(false);
              }
              break;
            case 4:
              lastScanAction = 4;
              return scanner.scanJsxIdentifier();
            case 5:
              lastScanAction = 5;
              return scanner.reScanJsxToken(false);
            case 6:
              lastScanAction = 6;
              return scanner.reScanJsxAttributeValue();
            case 0:
              break;
            default:
              ts2.Debug.assertNever(expectedScanAction);
          }
          return token;
        }
        function readEOFTokenRange() {
          ts2.Debug.assert(isOnEOF());
          return formatting2.createTextRangeWithKind(scanner.getStartPos(), scanner.getTextPos(), 1);
        }
        function isOnToken() {
          var current = lastTokenInfo ? lastTokenInfo.token.kind : scanner.getToken();
          var startPos2 = lastTokenInfo ? lastTokenInfo.token.pos : scanner.getStartPos();
          return startPos2 < endPos && current !== 1 && !ts2.isTrivia(current);
        }
        function isOnEOF() {
          var current = lastTokenInfo ? lastTokenInfo.token.kind : scanner.getToken();
          return current === 1;
        }
        function fixTokenKind(tokenInfo, container) {
          if (ts2.isToken(container) && tokenInfo.token.kind !== container.kind) {
            tokenInfo.token.kind = container.kind;
          }
          return tokenInfo;
        }
        function skipToEndOf(node) {
          scanner.setTextPos(node.end);
          savedPos = scanner.getStartPos();
          lastScanAction = void 0;
          lastTokenInfo = void 0;
          wasNewLine = false;
          leadingTrivia = void 0;
          trailingTrivia = void 0;
        }
        function skipToStartOf(node) {
          scanner.setTextPos(node.pos);
          savedPos = scanner.getStartPos();
          lastScanAction = void 0;
          lastTokenInfo = void 0;
          wasNewLine = false;
          leadingTrivia = void 0;
          trailingTrivia = void 0;
        }
      }
      formatting2.getFormattingScanner = getFormattingScanner;
    })(formatting = ts2.formatting || (ts2.formatting = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var formatting;
    (function(formatting2) {
      formatting2.anyContext = ts2.emptyArray;
      var RuleAction;
      (function(RuleAction2) {
        RuleAction2[RuleAction2["StopProcessingSpaceActions"] = 1] = "StopProcessingSpaceActions";
        RuleAction2[RuleAction2["StopProcessingTokenActions"] = 2] = "StopProcessingTokenActions";
        RuleAction2[RuleAction2["InsertSpace"] = 4] = "InsertSpace";
        RuleAction2[RuleAction2["InsertNewLine"] = 8] = "InsertNewLine";
        RuleAction2[RuleAction2["DeleteSpace"] = 16] = "DeleteSpace";
        RuleAction2[RuleAction2["DeleteToken"] = 32] = "DeleteToken";
        RuleAction2[RuleAction2["InsertTrailingSemicolon"] = 64] = "InsertTrailingSemicolon";
        RuleAction2[RuleAction2["StopAction"] = 3] = "StopAction";
        RuleAction2[RuleAction2["ModifySpaceAction"] = 28] = "ModifySpaceAction";
        RuleAction2[RuleAction2["ModifyTokenAction"] = 96] = "ModifyTokenAction";
      })(RuleAction = formatting2.RuleAction || (formatting2.RuleAction = {}));
      var RuleFlags;
      (function(RuleFlags2) {
        RuleFlags2[RuleFlags2["None"] = 0] = "None";
        RuleFlags2[RuleFlags2["CanDeleteNewLines"] = 1] = "CanDeleteNewLines";
      })(RuleFlags = formatting2.RuleFlags || (formatting2.RuleFlags = {}));
    })(formatting = ts2.formatting || (ts2.formatting = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var formatting;
    (function(formatting2) {
      function getAllRules() {
        var allTokens = [];
        for (var token = 0; token <= 159; token++) {
          if (token !== 1) {
            allTokens.push(token);
          }
        }
        function anyTokenExcept() {
          var tokens = [];
          for (var _i = 0; _i < arguments.length; _i++) {
            tokens[_i] = arguments[_i];
          }
          return { tokens: allTokens.filter(function(t) {
            return !tokens.some(function(t2) {
              return t2 === t;
            });
          }), isSpecific: false };
        }
        var anyToken = { tokens: allTokens, isSpecific: false };
        var anyTokenIncludingMultilineComments = tokenRangeFrom(__spreadArray(__spreadArray([], allTokens, true), [3], false));
        var anyTokenIncludingEOF = tokenRangeFrom(__spreadArray(__spreadArray([], allTokens, true), [1], false));
        var keywords = tokenRangeFromRange(81, 159);
        var binaryOperators = tokenRangeFromRange(29, 78);
        var binaryKeywordOperators = [101, 102, 159, 127, 139];
        var unaryPrefixOperators = [45, 46, 54, 53];
        var unaryPrefixExpressions = [
          8,
          9,
          79,
          20,
          22,
          18,
          108,
          103
        ];
        var unaryPreincrementExpressions = [79, 20, 108, 103];
        var unaryPostincrementExpressions = [79, 21, 23, 103];
        var unaryPredecrementExpressions = [79, 20, 108, 103];
        var unaryPostdecrementExpressions = [79, 21, 23, 103];
        var comments = [2, 3];
        var typeNames = __spreadArray([79], ts2.typeKeywords, true);
        var functionOpenBraceLeftTokenRange = anyTokenIncludingMultilineComments;
        var typeScriptOpenBraceLeftTokenRange = tokenRangeFrom([79, 3, 84, 93, 100]);
        var controlOpenBraceLeftTokenRange = tokenRangeFrom([21, 3, 90, 111, 96, 91]);
        var highPriorityCommonRules = [
          rule("IgnoreBeforeComment", anyToken, comments, formatting2.anyContext, 1),
          rule("IgnoreAfterLineComment", 2, anyToken, formatting2.anyContext, 1),
          rule("NotSpaceBeforeColon", anyToken, 58, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], 16),
          rule("SpaceAfterColon", 58, anyToken, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], 4),
          rule("NoSpaceBeforeQuestionMark", anyToken, 57, [isNonJsxSameLineTokenContext, isNotBinaryOpContext, isNotTypeAnnotationContext], 16),
          rule("SpaceAfterQuestionMarkInConditionalOperator", 57, anyToken, [isNonJsxSameLineTokenContext, isConditionalOperatorContext], 4),
          rule("NoSpaceAfterQuestionMark", 57, anyToken, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBeforeDot", anyToken, [24, 28], [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterDot", [24, 28], anyToken, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBetweenImportParenInImportType", 100, 20, [isNonJsxSameLineTokenContext, isImportTypeContext], 16),
          rule("NoSpaceAfterUnaryPrefixOperator", unaryPrefixOperators, unaryPrefixExpressions, [isNonJsxSameLineTokenContext, isNotBinaryOpContext], 16),
          rule("NoSpaceAfterUnaryPreincrementOperator", 45, unaryPreincrementExpressions, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterUnaryPredecrementOperator", 46, unaryPredecrementExpressions, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBeforeUnaryPostincrementOperator", unaryPostincrementExpressions, 45, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], 16),
          rule("NoSpaceBeforeUnaryPostdecrementOperator", unaryPostdecrementExpressions, 46, [isNonJsxSameLineTokenContext, isNotStatementConditionContext], 16),
          rule("SpaceAfterPostincrementWhenFollowedByAdd", 45, 39, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterAddWhenFollowedByUnaryPlus", 39, 39, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterAddWhenFollowedByPreincrement", 39, 45, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterPostdecrementWhenFollowedBySubtract", 46, 40, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterSubtractWhenFollowedByUnaryMinus", 40, 40, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterSubtractWhenFollowedByPredecrement", 40, 46, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("NoSpaceAfterCloseBrace", 19, [27, 26], [isNonJsxSameLineTokenContext], 16),
          rule("NewLineBeforeCloseBraceInBlockContext", anyTokenIncludingMultilineComments, 19, [isMultilineBlockContext], 8),
          rule("SpaceAfterCloseBrace", 19, anyTokenExcept(21), [isNonJsxSameLineTokenContext, isAfterCodeBlockContext], 4),
          rule("SpaceBetweenCloseBraceAndElse", 19, 91, [isNonJsxSameLineTokenContext], 4),
          rule("SpaceBetweenCloseBraceAndWhile", 19, 115, [isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceBetweenEmptyBraceBrackets", 18, 19, [isNonJsxSameLineTokenContext, isObjectContext], 16),
          rule("SpaceAfterConditionalClosingParen", 21, 22, [isControlDeclContext], 4),
          rule("NoSpaceBetweenFunctionKeywordAndStar", 98, 41, [isFunctionDeclarationOrFunctionExpressionContext], 16),
          rule("SpaceAfterStarInGeneratorDeclaration", 41, 79, [isFunctionDeclarationOrFunctionExpressionContext], 4),
          rule("SpaceAfterFunctionInFuncDecl", 98, anyToken, [isFunctionDeclContext], 4),
          rule("NewLineAfterOpenBraceInBlockContext", 18, anyToken, [isMultilineBlockContext], 8),
          rule("SpaceAfterGetSetInMember", [136, 148], 79, [isFunctionDeclContext], 4),
          rule("NoSpaceBetweenYieldKeywordAndStar", 125, 41, [isNonJsxSameLineTokenContext, isYieldOrYieldStarWithOperand], 16),
          rule("SpaceBetweenYieldOrYieldStarAndOperand", [125, 41], anyToken, [isNonJsxSameLineTokenContext, isYieldOrYieldStarWithOperand], 4),
          rule("NoSpaceBetweenReturnAndSemicolon", 105, 26, [isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterCertainKeywords", [113, 109, 103, 89, 105, 112, 132], anyToken, [isNonJsxSameLineTokenContext], 4),
          rule("SpaceAfterLetConstInVariableDeclaration", [119, 85], anyToken, [isNonJsxSameLineTokenContext, isStartOfVariableDeclarationList], 4),
          rule("NoSpaceBeforeOpenParenInFuncCall", anyToken, 20, [isNonJsxSameLineTokenContext, isFunctionCallOrNewContext, isPreviousTokenNotComma], 16),
          rule("SpaceBeforeBinaryKeywordOperator", anyToken, binaryKeywordOperators, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterBinaryKeywordOperator", binaryKeywordOperators, anyToken, [isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterVoidOperator", 114, anyToken, [isNonJsxSameLineTokenContext, isVoidOpContext], 4),
          rule("SpaceBetweenAsyncAndOpenParen", 131, 20, [isArrowFunctionContext, isNonJsxSameLineTokenContext], 4),
          rule("SpaceBetweenAsyncAndFunctionKeyword", 131, [98, 79], [isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceBetweenTagAndTemplateString", [79, 21], [14, 15], [isNonJsxSameLineTokenContext], 16),
          rule("SpaceBeforeJsxAttribute", anyToken, 79, [isNextTokenParentJsxAttribute, isNonJsxSameLineTokenContext], 4),
          rule("SpaceBeforeSlashInJsxOpeningElement", anyToken, 43, [isJsxSelfClosingElementContext, isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceBeforeGreaterThanTokenInJsxOpeningElement", 43, 31, [isJsxSelfClosingElementContext, isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBeforeEqualInJsxAttribute", anyToken, 63, [isJsxAttributeContext, isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterEqualInJsxAttribute", 63, anyToken, [isJsxAttributeContext, isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterModuleImport", [141, 145], 20, [isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterCertainTypeScriptKeywords", [
            126,
            84,
            135,
            88,
            92,
            93,
            94,
            136,
            117,
            100,
            118,
            141,
            142,
            121,
            123,
            122,
            144,
            148,
            124,
            151,
            155,
            140,
            137
          ], anyToken, [isNonJsxSameLineTokenContext], 4),
          rule("SpaceBeforeCertainTypeScriptKeywords", anyToken, [94, 117, 155], [isNonJsxSameLineTokenContext], 4),
          rule("SpaceAfterModuleName", 10, 18, [isModuleDeclContext], 4),
          rule("SpaceBeforeArrow", anyToken, 38, [isNonJsxSameLineTokenContext], 4),
          rule("SpaceAfterArrow", 38, anyToken, [isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceAfterEllipsis", 25, 79, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterOptionalParameters", 57, [21, 27], [isNonJsxSameLineTokenContext, isNotBinaryOpContext], 16),
          rule("NoSpaceBetweenEmptyInterfaceBraceBrackets", 18, 19, [isNonJsxSameLineTokenContext, isObjectTypeContext], 16),
          rule("NoSpaceBeforeOpenAngularBracket", typeNames, 29, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16),
          rule("NoSpaceBetweenCloseParenAndAngularBracket", 21, 29, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16),
          rule("NoSpaceAfterOpenAngularBracket", 29, anyToken, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16),
          rule("NoSpaceBeforeCloseAngularBracket", anyToken, 31, [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext], 16),
          rule("NoSpaceAfterCloseAngularBracket", 31, [20, 22, 31, 27], [isNonJsxSameLineTokenContext, isTypeArgumentOrParameterOrAssertionContext, isNotFunctionDeclContext], 16),
          rule("SpaceBeforeAt", [21, 79], 59, [isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceAfterAt", 59, anyToken, [isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterDecorator", anyToken, [
            126,
            79,
            93,
            88,
            84,
            124,
            123,
            121,
            122,
            136,
            148,
            22,
            41
          ], [isEndOfDecoratorContextOnSameLine], 4),
          rule("NoSpaceBeforeNonNullAssertionOperator", anyToken, 53, [isNonJsxSameLineTokenContext, isNonNullAssertionContext], 16),
          rule("NoSpaceAfterNewKeywordOnConstructorSignature", 103, 20, [isNonJsxSameLineTokenContext, isConstructorSignatureContext], 16),
          rule("SpaceLessThanAndNonJSXTypeAnnotation", 29, 29, [isNonJsxSameLineTokenContext], 4)
        ];
        var userConfigurableRules = [
          rule("SpaceAfterConstructor", 134, 20, [isOptionEnabled("insertSpaceAfterConstructor"), isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceAfterConstructor", 134, 20, [isOptionDisabledOrUndefined("insertSpaceAfterConstructor"), isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterComma", 27, anyToken, [isOptionEnabled("insertSpaceAfterCommaDelimiter"), isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext, isNextTokenNotCloseBracket, isNextTokenNotCloseParen], 4),
          rule("NoSpaceAfterComma", 27, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterCommaDelimiter"), isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext], 16),
          rule("SpaceAfterAnonymousFunctionKeyword", [98, 41], 20, [isOptionEnabled("insertSpaceAfterFunctionKeywordForAnonymousFunctions"), isFunctionDeclContext], 4),
          rule("NoSpaceAfterAnonymousFunctionKeyword", [98, 41], 20, [isOptionDisabledOrUndefined("insertSpaceAfterFunctionKeywordForAnonymousFunctions"), isFunctionDeclContext], 16),
          rule("SpaceAfterKeywordInControl", keywords, 20, [isOptionEnabled("insertSpaceAfterKeywordsInControlFlowStatements"), isControlDeclContext], 4),
          rule("NoSpaceAfterKeywordInControl", keywords, 20, [isOptionDisabledOrUndefined("insertSpaceAfterKeywordsInControlFlowStatements"), isControlDeclContext], 16),
          rule("SpaceAfterOpenParen", 20, anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 4),
          rule("SpaceBeforeCloseParen", anyToken, 21, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 4),
          rule("SpaceBetweenOpenParens", 20, 20, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceBetweenParens", 20, 21, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterOpenParen", 20, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBeforeCloseParen", anyToken, 21, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis"), isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterOpenBracket", 22, anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 4),
          rule("SpaceBeforeCloseBracket", anyToken, 23, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceBetweenBrackets", 22, 23, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterOpenBracket", 22, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBeforeCloseBracket", anyToken, 23, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets"), isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterOpenBrace", 18, anyToken, [isOptionEnabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isBraceWrappedContext], 4),
          rule("SpaceBeforeCloseBrace", anyToken, 19, [isOptionEnabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isBraceWrappedContext], 4),
          rule("NoSpaceBetweenEmptyBraceBrackets", 18, 19, [isNonJsxSameLineTokenContext, isObjectContext], 16),
          rule("NoSpaceAfterOpenBrace", 18, anyToken, [isOptionDisabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBeforeCloseBrace", anyToken, 19, [isOptionDisabled("insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces"), isNonJsxSameLineTokenContext], 16),
          rule("SpaceBetweenEmptyBraceBrackets", 18, 19, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingEmptyBraces")], 4),
          rule("NoSpaceBetweenEmptyBraceBrackets", 18, 19, [isOptionDisabled("insertSpaceAfterOpeningAndBeforeClosingEmptyBraces"), isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterTemplateHeadAndMiddle", [15, 16], anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxTextContext], 4, 1),
          rule("SpaceBeforeTemplateMiddleAndTail", anyToken, [16, 17], [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxSameLineTokenContext], 4),
          rule("NoSpaceAfterTemplateHeadAndMiddle", [15, 16], anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxTextContext], 16, 1),
          rule("NoSpaceBeforeTemplateMiddleAndTail", anyToken, [16, 17], [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces"), isNonJsxSameLineTokenContext], 16),
          rule("SpaceAfterOpenBraceInJsxExpression", 18, anyToken, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 4),
          rule("SpaceBeforeCloseBraceInJsxExpression", anyToken, 19, [isOptionEnabled("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 4),
          rule("NoSpaceAfterOpenBraceInJsxExpression", 18, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 16),
          rule("NoSpaceBeforeCloseBraceInJsxExpression", anyToken, 19, [isOptionDisabledOrUndefined("insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces"), isNonJsxSameLineTokenContext, isJsxExpressionContext], 16),
          rule("SpaceAfterSemicolonInFor", 26, anyToken, [isOptionEnabled("insertSpaceAfterSemicolonInForStatements"), isNonJsxSameLineTokenContext, isForContext], 4),
          rule("NoSpaceAfterSemicolonInFor", 26, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterSemicolonInForStatements"), isNonJsxSameLineTokenContext, isForContext], 16),
          rule("SpaceBeforeBinaryOperator", anyToken, binaryOperators, [isOptionEnabled("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("SpaceAfterBinaryOperator", binaryOperators, anyToken, [isOptionEnabled("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 4),
          rule("NoSpaceBeforeBinaryOperator", anyToken, binaryOperators, [isOptionDisabledOrUndefined("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 16),
          rule("NoSpaceAfterBinaryOperator", binaryOperators, anyToken, [isOptionDisabledOrUndefined("insertSpaceBeforeAndAfterBinaryOperators"), isNonJsxSameLineTokenContext, isBinaryOpContext], 16),
          rule("SpaceBeforeOpenParenInFuncDecl", anyToken, 20, [isOptionEnabled("insertSpaceBeforeFunctionParenthesis"), isNonJsxSameLineTokenContext, isFunctionDeclContext], 4),
          rule("NoSpaceBeforeOpenParenInFuncDecl", anyToken, 20, [isOptionDisabledOrUndefined("insertSpaceBeforeFunctionParenthesis"), isNonJsxSameLineTokenContext, isFunctionDeclContext], 16),
          rule("NewLineBeforeOpenBraceInControl", controlOpenBraceLeftTokenRange, 18, [isOptionEnabled("placeOpenBraceOnNewLineForControlBlocks"), isControlDeclContext, isBeforeMultilineBlockContext], 8, 1),
          rule("NewLineBeforeOpenBraceInFunction", functionOpenBraceLeftTokenRange, 18, [isOptionEnabled("placeOpenBraceOnNewLineForFunctions"), isFunctionDeclContext, isBeforeMultilineBlockContext], 8, 1),
          rule("NewLineBeforeOpenBraceInTypeScriptDeclWithBlock", typeScriptOpenBraceLeftTokenRange, 18, [isOptionEnabled("placeOpenBraceOnNewLineForFunctions"), isTypeScriptDeclWithBlockContext, isBeforeMultilineBlockContext], 8, 1),
          rule("SpaceAfterTypeAssertion", 31, anyToken, [isOptionEnabled("insertSpaceAfterTypeAssertion"), isNonJsxSameLineTokenContext, isTypeAssertionContext], 4),
          rule("NoSpaceAfterTypeAssertion", 31, anyToken, [isOptionDisabledOrUndefined("insertSpaceAfterTypeAssertion"), isNonJsxSameLineTokenContext, isTypeAssertionContext], 16),
          rule("SpaceBeforeTypeAnnotation", anyToken, [57, 58], [isOptionEnabled("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], 4),
          rule("NoSpaceBeforeTypeAnnotation", anyToken, [57, 58], [isOptionDisabledOrUndefined("insertSpaceBeforeTypeAnnotation"), isNonJsxSameLineTokenContext, isTypeAnnotationContext], 16),
          rule("NoOptionalSemicolon", 26, anyTokenIncludingEOF, [optionEquals("semicolons", ts2.SemicolonPreference.Remove), isSemicolonDeletionContext], 32),
          rule("OptionalSemicolon", anyToken, anyTokenIncludingEOF, [optionEquals("semicolons", ts2.SemicolonPreference.Insert), isSemicolonInsertionContext], 64)
        ];
        var lowPriorityCommonRules = [
          rule("NoSpaceBeforeSemicolon", anyToken, 26, [isNonJsxSameLineTokenContext], 16),
          rule("SpaceBeforeOpenBraceInControl", controlOpenBraceLeftTokenRange, 18, [isOptionDisabledOrUndefinedOrTokensOnSameLine("placeOpenBraceOnNewLineForControlBlocks"), isControlDeclContext, isNotFormatOnEnter, isSameLineTokenOrBeforeBlockContext], 4, 1),
          rule("SpaceBeforeOpenBraceInFunction", functionOpenBraceLeftTokenRange, 18, [isOptionDisabledOrUndefinedOrTokensOnSameLine("placeOpenBraceOnNewLineForFunctions"), isFunctionDeclContext, isBeforeBlockContext, isNotFormatOnEnter, isSameLineTokenOrBeforeBlockContext], 4, 1),
          rule("SpaceBeforeOpenBraceInTypeScriptDeclWithBlock", typeScriptOpenBraceLeftTokenRange, 18, [isOptionDisabledOrUndefinedOrTokensOnSameLine("placeOpenBraceOnNewLineForFunctions"), isTypeScriptDeclWithBlockContext, isNotFormatOnEnter, isSameLineTokenOrBeforeBlockContext], 4, 1),
          rule("NoSpaceBeforeComma", anyToken, 27, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceBeforeOpenBracket", anyTokenExcept(131, 82), 22, [isNonJsxSameLineTokenContext], 16),
          rule("NoSpaceAfterCloseBracket", 23, anyToken, [isNonJsxSameLineTokenContext, isNotBeforeBlockInFunctionDeclarationContext], 16),
          rule("SpaceAfterSemicolon", 26, anyToken, [isNonJsxSameLineTokenContext], 4),
          rule("SpaceBetweenForAndAwaitKeyword", 97, 132, [isNonJsxSameLineTokenContext], 4),
          rule("SpaceBetweenStatements", [21, 90, 91, 82], anyToken, [isNonJsxSameLineTokenContext, isNonJsxElementOrFragmentContext, isNotForContext], 4),
          rule("SpaceAfterTryCatchFinally", [111, 83, 96], 18, [isNonJsxSameLineTokenContext], 4)
        ];
        return __spreadArray(__spreadArray(__spreadArray([], highPriorityCommonRules, true), userConfigurableRules, true), lowPriorityCommonRules, true);
      }
      formatting2.getAllRules = getAllRules;
      function rule(debugName, left, right, context, action, flags) {
        if (flags === void 0) {
          flags = 0;
        }
        return { leftTokenRange: toTokenRange(left), rightTokenRange: toTokenRange(right), rule: { debugName, context, action, flags } };
      }
      function tokenRangeFrom(tokens) {
        return { tokens, isSpecific: true };
      }
      function toTokenRange(arg) {
        return typeof arg === "number" ? tokenRangeFrom([arg]) : ts2.isArray(arg) ? tokenRangeFrom(arg) : arg;
      }
      function tokenRangeFromRange(from, to, except) {
        if (except === void 0) {
          except = [];
        }
        var tokens = [];
        for (var token = from; token <= to; token++) {
          if (!ts2.contains(except, token)) {
            tokens.push(token);
          }
        }
        return tokenRangeFrom(tokens);
      }
      function optionEquals(optionName, optionValue) {
        return function(context) {
          return context.options && context.options[optionName] === optionValue;
        };
      }
      function isOptionEnabled(optionName) {
        return function(context) {
          return context.options && context.options.hasOwnProperty(optionName) && !!context.options[optionName];
        };
      }
      function isOptionDisabled(optionName) {
        return function(context) {
          return context.options && context.options.hasOwnProperty(optionName) && !context.options[optionName];
        };
      }
      function isOptionDisabledOrUndefined(optionName) {
        return function(context) {
          return !context.options || !context.options.hasOwnProperty(optionName) || !context.options[optionName];
        };
      }
      function isOptionDisabledOrUndefinedOrTokensOnSameLine(optionName) {
        return function(context) {
          return !context.options || !context.options.hasOwnProperty(optionName) || !context.options[optionName] || context.TokensAreOnSameLine();
        };
      }
      function isOptionEnabledOrUndefined(optionName) {
        return function(context) {
          return !context.options || !context.options.hasOwnProperty(optionName) || !!context.options[optionName];
        };
      }
      function isForContext(context) {
        return context.contextNode.kind === 241;
      }
      function isNotForContext(context) {
        return !isForContext(context);
      }
      function isBinaryOpContext(context) {
        switch (context.contextNode.kind) {
          case 220:
            return context.contextNode.operatorToken.kind !== 27;
          case 221:
          case 188:
          case 228:
          case 274:
          case 269:
          case 176:
          case 186:
          case 187:
            return true;
          case 202:
          case 258:
          case 264:
          case 270:
          case 253:
          case 163:
          case 297:
          case 166:
          case 165:
            return context.currentTokenSpan.kind === 63 || context.nextTokenSpan.kind === 63;
          case 242:
          case 162:
            return context.currentTokenSpan.kind === 101 || context.nextTokenSpan.kind === 101 || context.currentTokenSpan.kind === 63 || context.nextTokenSpan.kind === 63;
          case 243:
            return context.currentTokenSpan.kind === 159 || context.nextTokenSpan.kind === 159;
        }
        return false;
      }
      function isNotBinaryOpContext(context) {
        return !isBinaryOpContext(context);
      }
      function isNotTypeAnnotationContext(context) {
        return !isTypeAnnotationContext(context);
      }
      function isTypeAnnotationContext(context) {
        var contextKind = context.contextNode.kind;
        return contextKind === 166 || contextKind === 165 || contextKind === 163 || contextKind === 253 || ts2.isFunctionLikeKind(contextKind);
      }
      function isConditionalOperatorContext(context) {
        return context.contextNode.kind === 221 || context.contextNode.kind === 188;
      }
      function isSameLineTokenOrBeforeBlockContext(context) {
        return context.TokensAreOnSameLine() || isBeforeBlockContext(context);
      }
      function isBraceWrappedContext(context) {
        return context.contextNode.kind === 200 || context.contextNode.kind === 194 || isSingleLineBlockContext(context);
      }
      function isBeforeMultilineBlockContext(context) {
        return isBeforeBlockContext(context) && !(context.NextNodeAllOnSameLine() || context.NextNodeBlockIsOnOneLine());
      }
      function isMultilineBlockContext(context) {
        return isBlockContext(context) && !(context.ContextNodeAllOnSameLine() || context.ContextNodeBlockIsOnOneLine());
      }
      function isSingleLineBlockContext(context) {
        return isBlockContext(context) && (context.ContextNodeAllOnSameLine() || context.ContextNodeBlockIsOnOneLine());
      }
      function isBlockContext(context) {
        return nodeIsBlockContext(context.contextNode);
      }
      function isBeforeBlockContext(context) {
        return nodeIsBlockContext(context.nextTokenParent);
      }
      function nodeIsBlockContext(node) {
        if (nodeIsTypeScriptDeclWithBlockContext(node)) {
          return true;
        }
        switch (node.kind) {
          case 234:
          case 262:
          case 204:
          case 261:
            return true;
        }
        return false;
      }
      function isFunctionDeclContext(context) {
        switch (context.contextNode.kind) {
          case 255:
          case 168:
          case 167:
          case 171:
          case 172:
          case 173:
          case 212:
          case 170:
          case 213:
          case 257:
            return true;
        }
        return false;
      }
      function isNotFunctionDeclContext(context) {
        return !isFunctionDeclContext(context);
      }
      function isFunctionDeclarationOrFunctionExpressionContext(context) {
        return context.contextNode.kind === 255 || context.contextNode.kind === 212;
      }
      function isTypeScriptDeclWithBlockContext(context) {
        return nodeIsTypeScriptDeclWithBlockContext(context.contextNode);
      }
      function nodeIsTypeScriptDeclWithBlockContext(node) {
        switch (node.kind) {
          case 256:
          case 225:
          case 257:
          case 259:
          case 181:
          case 260:
          case 271:
          case 272:
          case 265:
          case 268:
            return true;
        }
        return false;
      }
      function isAfterCodeBlockContext(context) {
        switch (context.currentTokenParent.kind) {
          case 256:
          case 260:
          case 259:
          case 291:
          case 261:
          case 248:
            return true;
          case 234: {
            var blockParent = context.currentTokenParent.parent;
            if (!blockParent || blockParent.kind !== 213 && blockParent.kind !== 212) {
              return true;
            }
          }
        }
        return false;
      }
      function isControlDeclContext(context) {
        switch (context.contextNode.kind) {
          case 238:
          case 248:
          case 241:
          case 242:
          case 243:
          case 240:
          case 251:
          case 239:
          case 247:
          case 291:
            return true;
          default:
            return false;
        }
      }
      function isObjectContext(context) {
        return context.contextNode.kind === 204;
      }
      function isFunctionCallContext(context) {
        return context.contextNode.kind === 207;
      }
      function isNewContext(context) {
        return context.contextNode.kind === 208;
      }
      function isFunctionCallOrNewContext(context) {
        return isFunctionCallContext(context) || isNewContext(context);
      }
      function isPreviousTokenNotComma(context) {
        return context.currentTokenSpan.kind !== 27;
      }
      function isNextTokenNotCloseBracket(context) {
        return context.nextTokenSpan.kind !== 23;
      }
      function isNextTokenNotCloseParen(context) {
        return context.nextTokenSpan.kind !== 21;
      }
      function isArrowFunctionContext(context) {
        return context.contextNode.kind === 213;
      }
      function isImportTypeContext(context) {
        return context.contextNode.kind === 199;
      }
      function isNonJsxSameLineTokenContext(context) {
        return context.TokensAreOnSameLine() && context.contextNode.kind !== 11;
      }
      function isNonJsxTextContext(context) {
        return context.contextNode.kind !== 11;
      }
      function isNonJsxElementOrFragmentContext(context) {
        return context.contextNode.kind !== 277 && context.contextNode.kind !== 281;
      }
      function isJsxExpressionContext(context) {
        return context.contextNode.kind === 287 || context.contextNode.kind === 286;
      }
      function isNextTokenParentJsxAttribute(context) {
        return context.nextTokenParent.kind === 284;
      }
      function isJsxAttributeContext(context) {
        return context.contextNode.kind === 284;
      }
      function isJsxSelfClosingElementContext(context) {
        return context.contextNode.kind === 278;
      }
      function isNotBeforeBlockInFunctionDeclarationContext(context) {
        return !isFunctionDeclContext(context) && !isBeforeBlockContext(context);
      }
      function isEndOfDecoratorContextOnSameLine(context) {
        return context.TokensAreOnSameLine() && !!context.contextNode.decorators && nodeIsInDecoratorContext(context.currentTokenParent) && !nodeIsInDecoratorContext(context.nextTokenParent);
      }
      function nodeIsInDecoratorContext(node) {
        while (ts2.isExpressionNode(node)) {
          node = node.parent;
        }
        return node.kind === 164;
      }
      function isStartOfVariableDeclarationList(context) {
        return context.currentTokenParent.kind === 254 && context.currentTokenParent.getStart(context.sourceFile) === context.currentTokenSpan.pos;
      }
      function isNotFormatOnEnter(context) {
        return context.formattingRequestKind !== 2;
      }
      function isModuleDeclContext(context) {
        return context.contextNode.kind === 260;
      }
      function isObjectTypeContext(context) {
        return context.contextNode.kind === 181;
      }
      function isConstructorSignatureContext(context) {
        return context.contextNode.kind === 174;
      }
      function isTypeArgumentOrParameterOrAssertion(token, parent) {
        if (token.kind !== 29 && token.kind !== 31) {
          return false;
        }
        switch (parent.kind) {
          case 177:
          case 210:
          case 258:
          case 256:
          case 225:
          case 257:
          case 255:
          case 212:
          case 213:
          case 168:
          case 167:
          case 173:
          case 174:
          case 207:
          case 208:
          case 227:
            return true;
          default:
            return false;
        }
      }
      function isTypeArgumentOrParameterOrAssertionContext(context) {
        return isTypeArgumentOrParameterOrAssertion(context.currentTokenSpan, context.currentTokenParent) || isTypeArgumentOrParameterOrAssertion(context.nextTokenSpan, context.nextTokenParent);
      }
      function isTypeAssertionContext(context) {
        return context.contextNode.kind === 210;
      }
      function isVoidOpContext(context) {
        return context.currentTokenSpan.kind === 114 && context.currentTokenParent.kind === 216;
      }
      function isYieldOrYieldStarWithOperand(context) {
        return context.contextNode.kind === 223 && context.contextNode.expression !== void 0;
      }
      function isNonNullAssertionContext(context) {
        return context.contextNode.kind === 229;
      }
      function isNotStatementConditionContext(context) {
        return !isStatementConditionContext(context);
      }
      function isStatementConditionContext(context) {
        switch (context.contextNode.kind) {
          case 238:
          case 241:
          case 242:
          case 243:
          case 239:
          case 240:
            return true;
          default:
            return false;
        }
      }
      function isSemicolonDeletionContext(context) {
        var nextTokenKind = context.nextTokenSpan.kind;
        var nextTokenStart = context.nextTokenSpan.pos;
        if (ts2.isTrivia(nextTokenKind)) {
          var nextRealToken = context.nextTokenParent === context.currentTokenParent ? ts2.findNextToken(context.currentTokenParent, ts2.findAncestor(context.currentTokenParent, function(a) {
            return !a.parent;
          }), context.sourceFile) : context.nextTokenParent.getFirstToken(context.sourceFile);
          if (!nextRealToken) {
            return true;
          }
          nextTokenKind = nextRealToken.kind;
          nextTokenStart = nextRealToken.getStart(context.sourceFile);
        }
        var startLine = context.sourceFile.getLineAndCharacterOfPosition(context.currentTokenSpan.pos).line;
        var endLine = context.sourceFile.getLineAndCharacterOfPosition(nextTokenStart).line;
        if (startLine === endLine) {
          return nextTokenKind === 19 || nextTokenKind === 1;
        }
        if (nextTokenKind === 233 || nextTokenKind === 26) {
          return false;
        }
        if (context.contextNode.kind === 257 || context.contextNode.kind === 258) {
          return !ts2.isPropertySignature(context.currentTokenParent) || !!context.currentTokenParent.type || nextTokenKind !== 20;
        }
        if (ts2.isPropertyDeclaration(context.currentTokenParent)) {
          return !context.currentTokenParent.initializer;
        }
        return context.currentTokenParent.kind !== 241 && context.currentTokenParent.kind !== 235 && context.currentTokenParent.kind !== 233 && nextTokenKind !== 22 && nextTokenKind !== 20 && nextTokenKind !== 39 && nextTokenKind !== 40 && nextTokenKind !== 43 && nextTokenKind !== 13 && nextTokenKind !== 27 && nextTokenKind !== 222 && nextTokenKind !== 15 && nextTokenKind !== 14 && nextTokenKind !== 24;
      }
      function isSemicolonInsertionContext(context) {
        return ts2.positionIsASICandidate(context.currentTokenSpan.end, context.currentTokenParent, context.sourceFile);
      }
    })(formatting = ts2.formatting || (ts2.formatting = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var formatting;
    (function(formatting2) {
      function getFormatContext(options, host) {
        return { options, getRules: getRulesMap(), host };
      }
      formatting2.getFormatContext = getFormatContext;
      var rulesMapCache;
      function getRulesMap() {
        if (rulesMapCache === void 0) {
          rulesMapCache = createRulesMap(formatting2.getAllRules());
        }
        return rulesMapCache;
      }
      function getRuleActionExclusion(ruleAction) {
        var mask2 = 0;
        if (ruleAction & 1) {
          mask2 |= 28;
        }
        if (ruleAction & 2) {
          mask2 |= 96;
        }
        if (ruleAction & 28) {
          mask2 |= 28;
        }
        if (ruleAction & 96) {
          mask2 |= 96;
        }
        return mask2;
      }
      function createRulesMap(rules) {
        var map = buildMap(rules);
        return function(context) {
          var bucket = map[getRuleBucketIndex(context.currentTokenSpan.kind, context.nextTokenSpan.kind)];
          if (bucket) {
            var rules_1 = [];
            var ruleActionMask = 0;
            for (var _i = 0, bucket_1 = bucket; _i < bucket_1.length; _i++) {
              var rule = bucket_1[_i];
              var acceptRuleActions = ~getRuleActionExclusion(ruleActionMask);
              if (rule.action & acceptRuleActions && ts2.every(rule.context, function(c) {
                return c(context);
              })) {
                rules_1.push(rule);
                ruleActionMask |= rule.action;
              }
            }
            if (rules_1.length) {
              return rules_1;
            }
          }
        };
      }
      function buildMap(rules) {
        var map = new Array(mapRowLength * mapRowLength);
        var rulesBucketConstructionStateList = new Array(map.length);
        for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) {
          var rule = rules_2[_i];
          var specificRule = rule.leftTokenRange.isSpecific && rule.rightTokenRange.isSpecific;
          for (var _a = 0, _b = rule.leftTokenRange.tokens; _a < _b.length; _a++) {
            var left = _b[_a];
            for (var _c = 0, _d = rule.rightTokenRange.tokens; _c < _d.length; _c++) {
              var right = _d[_c];
              var index = getRuleBucketIndex(left, right);
              var rulesBucket = map[index];
              if (rulesBucket === void 0) {
                rulesBucket = map[index] = [];
              }
              addRule(rulesBucket, rule.rule, specificRule, rulesBucketConstructionStateList, index);
            }
          }
        }
        return map;
      }
      function getRuleBucketIndex(row, column) {
        ts2.Debug.assert(row <= 159 && column <= 159, "Must compute formatting context from tokens");
        return row * mapRowLength + column;
      }
      var maskBitSize = 5;
      var mask = 31;
      var mapRowLength = 159 + 1;
      var RulesPosition;
      (function(RulesPosition2) {
        RulesPosition2[RulesPosition2["StopRulesSpecific"] = 0] = "StopRulesSpecific";
        RulesPosition2[RulesPosition2["StopRulesAny"] = maskBitSize * 1] = "StopRulesAny";
        RulesPosition2[RulesPosition2["ContextRulesSpecific"] = maskBitSize * 2] = "ContextRulesSpecific";
        RulesPosition2[RulesPosition2["ContextRulesAny"] = maskBitSize * 3] = "ContextRulesAny";
        RulesPosition2[RulesPosition2["NoContextRulesSpecific"] = maskBitSize * 4] = "NoContextRulesSpecific";
        RulesPosition2[RulesPosition2["NoContextRulesAny"] = maskBitSize * 5] = "NoContextRulesAny";
      })(RulesPosition || (RulesPosition = {}));
      function addRule(rules, rule, specificTokens, constructionState, rulesBucketIndex) {
        var position = rule.action & 3 ? specificTokens ? RulesPosition.StopRulesSpecific : RulesPosition.StopRulesAny : rule.context !== formatting2.anyContext ? specificTokens ? RulesPosition.ContextRulesSpecific : RulesPosition.ContextRulesAny : specificTokens ? RulesPosition.NoContextRulesSpecific : RulesPosition.NoContextRulesAny;
        var state = constructionState[rulesBucketIndex] || 0;
        rules.splice(getInsertionIndex(state, position), 0, rule);
        constructionState[rulesBucketIndex] = increaseInsertionIndex(state, position);
      }
      function getInsertionIndex(indexBitmap, maskPosition) {
        var index = 0;
        for (var pos = 0; pos <= maskPosition; pos += maskBitSize) {
          index += indexBitmap & mask;
          indexBitmap >>= maskBitSize;
        }
        return index;
      }
      function increaseInsertionIndex(indexBitmap, maskPosition) {
        var value = (indexBitmap >> maskPosition & mask) + 1;
        ts2.Debug.assert((value & mask) === value, "Adding more rules into the sub-bucket than allowed. Maximum allowed is 32 rules.");
        return indexBitmap & ~(mask << maskPosition) | value << maskPosition;
      }
    })(formatting = ts2.formatting || (ts2.formatting = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var formatting;
    (function(formatting2) {
      function createTextRangeWithKind(pos, end, kind) {
        var textRangeWithKind = { pos, end, kind };
        if (ts2.Debug.isDebugging) {
          Object.defineProperty(textRangeWithKind, "__debugKind", {
            get: function() {
              return ts2.Debug.formatSyntaxKind(kind);
            }
          });
        }
        return textRangeWithKind;
      }
      formatting2.createTextRangeWithKind = createTextRangeWithKind;
      var Constants;
      (function(Constants2) {
        Constants2[Constants2["Unknown"] = -1] = "Unknown";
      })(Constants || (Constants = {}));
      function formatOnEnter(position, sourceFile, formatContext) {
        var line = sourceFile.getLineAndCharacterOfPosition(position).line;
        if (line === 0) {
          return [];
        }
        var endOfFormatSpan = ts2.getEndLinePosition(line, sourceFile);
        while (ts2.isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(endOfFormatSpan))) {
          endOfFormatSpan--;
        }
        if (ts2.isLineBreak(sourceFile.text.charCodeAt(endOfFormatSpan))) {
          endOfFormatSpan--;
        }
        var span = {
          pos: ts2.getStartPositionOfLine(line - 1, sourceFile),
          end: endOfFormatSpan + 1
        };
        return formatSpan(span, sourceFile, formatContext, 2);
      }
      formatting2.formatOnEnter = formatOnEnter;
      function formatOnSemicolon(position, sourceFile, formatContext) {
        var semicolon = findImmediatelyPrecedingTokenOfKind(position, 26, sourceFile);
        return formatNodeLines(findOutermostNodeWithinListLevel(semicolon), sourceFile, formatContext, 3);
      }
      formatting2.formatOnSemicolon = formatOnSemicolon;
      function formatOnOpeningCurly(position, sourceFile, formatContext) {
        var openingCurly = findImmediatelyPrecedingTokenOfKind(position, 18, sourceFile);
        if (!openingCurly) {
          return [];
        }
        var curlyBraceRange = openingCurly.parent;
        var outermostNode = findOutermostNodeWithinListLevel(curlyBraceRange);
        var textRange = {
          pos: ts2.getLineStartPositionForPosition(outermostNode.getStart(sourceFile), sourceFile),
          end: position
        };
        return formatSpan(textRange, sourceFile, formatContext, 4);
      }
      formatting2.formatOnOpeningCurly = formatOnOpeningCurly;
      function formatOnClosingCurly(position, sourceFile, formatContext) {
        var precedingToken = findImmediatelyPrecedingTokenOfKind(position, 19, sourceFile);
        return formatNodeLines(findOutermostNodeWithinListLevel(precedingToken), sourceFile, formatContext, 5);
      }
      formatting2.formatOnClosingCurly = formatOnClosingCurly;
      function formatDocument(sourceFile, formatContext) {
        var span = {
          pos: 0,
          end: sourceFile.text.length
        };
        return formatSpan(span, sourceFile, formatContext, 0);
      }
      formatting2.formatDocument = formatDocument;
      function formatSelection(start, end, sourceFile, formatContext) {
        var span = {
          pos: ts2.getLineStartPositionForPosition(start, sourceFile),
          end
        };
        return formatSpan(span, sourceFile, formatContext, 1);
      }
      formatting2.formatSelection = formatSelection;
      function findImmediatelyPrecedingTokenOfKind(end, expectedTokenKind, sourceFile) {
        var precedingToken = ts2.findPrecedingToken(end, sourceFile);
        return precedingToken && precedingToken.kind === expectedTokenKind && end === precedingToken.getEnd() ? precedingToken : void 0;
      }
      function findOutermostNodeWithinListLevel(node) {
        var current = node;
        while (current && current.parent && current.parent.end === node.end && !isListElement(current.parent, current)) {
          current = current.parent;
        }
        return current;
      }
      function isListElement(parent, node) {
        switch (parent.kind) {
          case 256:
          case 257:
            return ts2.rangeContainsRange(parent.members, node);
          case 260:
            var body = parent.body;
            return !!body && body.kind === 261 && ts2.rangeContainsRange(body.statements, node);
          case 303:
          case 234:
          case 261:
            return ts2.rangeContainsRange(parent.statements, node);
          case 291:
            return ts2.rangeContainsRange(parent.block.statements, node);
        }
        return false;
      }
      function findEnclosingNode(range, sourceFile) {
        return find(sourceFile);
        function find(n) {
          var candidate = ts2.forEachChild(n, function(c) {
            return ts2.startEndContainsRange(c.getStart(sourceFile), c.end, range) && c;
          });
          if (candidate) {
            var result = find(candidate);
            if (result) {
              return result;
            }
          }
          return n;
        }
      }
      function prepareRangeContainsErrorFunction(errors, originalRange) {
        if (!errors.length) {
          return rangeHasNoErrors;
        }
        var sorted = errors.filter(function(d) {
          return ts2.rangeOverlapsWithStartEnd(originalRange, d.start, d.start + d.length);
        }).sort(function(e1, e2) {
          return e1.start - e2.start;
        });
        if (!sorted.length) {
          return rangeHasNoErrors;
        }
        var index = 0;
        return function(r) {
          while (true) {
            if (index >= sorted.length) {
              return false;
            }
            var error = sorted[index];
            if (r.end <= error.start) {
              return false;
            }
            if (ts2.startEndOverlapsWithStartEnd(r.pos, r.end, error.start, error.start + error.length)) {
              return true;
            }
            index++;
          }
        };
        function rangeHasNoErrors() {
          return false;
        }
      }
      function getScanStartPosition(enclosingNode, originalRange, sourceFile) {
        var start = enclosingNode.getStart(sourceFile);
        if (start === originalRange.pos && enclosingNode.end === originalRange.end) {
          return start;
        }
        var precedingToken = ts2.findPrecedingToken(originalRange.pos, sourceFile);
        if (!precedingToken) {
          return enclosingNode.pos;
        }
        if (precedingToken.end >= originalRange.pos) {
          return enclosingNode.pos;
        }
        return precedingToken.end;
      }
      function getOwnOrInheritedDelta(n, options, sourceFile) {
        var previousLine = -1;
        var child;
        while (n) {
          var line = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile)).line;
          if (previousLine !== -1 && line !== previousLine) {
            break;
          }
          if (formatting2.SmartIndenter.shouldIndentChildNode(options, n, child, sourceFile)) {
            return options.indentSize;
          }
          previousLine = line;
          child = n;
          n = n.parent;
        }
        return 0;
      }
      function formatNodeGivenIndentation(node, sourceFileLike, languageVariant, initialIndentation, delta, formatContext) {
        var range = { pos: 0, end: sourceFileLike.text.length };
        return formatting2.getFormattingScanner(sourceFileLike.text, languageVariant, range.pos, range.end, function(scanner) {
          return formatSpanWorker(range, node, initialIndentation, delta, scanner, formatContext, 1, function(_) {
            return false;
          }, sourceFileLike);
        });
      }
      formatting2.formatNodeGivenIndentation = formatNodeGivenIndentation;
      function formatNodeLines(node, sourceFile, formatContext, requestKind) {
        if (!node) {
          return [];
        }
        var span = {
          pos: ts2.getLineStartPositionForPosition(node.getStart(sourceFile), sourceFile),
          end: node.end
        };
        return formatSpan(span, sourceFile, formatContext, requestKind);
      }
      function formatSpan(originalRange, sourceFile, formatContext, requestKind) {
        var enclosingNode = findEnclosingNode(originalRange, sourceFile);
        return formatting2.getFormattingScanner(sourceFile.text, sourceFile.languageVariant, getScanStartPosition(enclosingNode, originalRange, sourceFile), originalRange.end, function(scanner) {
          return formatSpanWorker(originalRange, enclosingNode, formatting2.SmartIndenter.getIndentationForNode(enclosingNode, originalRange, sourceFile, formatContext.options), getOwnOrInheritedDelta(enclosingNode, formatContext.options, sourceFile), scanner, formatContext, requestKind, prepareRangeContainsErrorFunction(sourceFile.parseDiagnostics, originalRange), sourceFile);
        });
      }
      function formatSpanWorker(originalRange, enclosingNode, initialIndentation, delta, formattingScanner, _a, requestKind, rangeContainsError, sourceFile) {
        var options = _a.options, getRules = _a.getRules, host = _a.host;
        var formattingContext = new formatting2.FormattingContext(sourceFile, requestKind, options);
        var previousRange;
        var previousParent;
        var previousRangeStartLine;
        var lastIndentedLine;
        var indentationOnLastIndentedLine = -1;
        var edits = [];
        formattingScanner.advance();
        if (formattingScanner.isOnToken()) {
          var startLine = sourceFile.getLineAndCharacterOfPosition(enclosingNode.getStart(sourceFile)).line;
          var undecoratedStartLine = startLine;
          if (enclosingNode.decorators) {
            undecoratedStartLine = sourceFile.getLineAndCharacterOfPosition(ts2.getNonDecoratorTokenPosOfNode(enclosingNode, sourceFile)).line;
          }
          processNode(enclosingNode, enclosingNode, startLine, undecoratedStartLine, initialIndentation, delta);
        }
        if (!formattingScanner.isOnToken()) {
          var indentation = formatting2.SmartIndenter.nodeWillIndentChild(options, enclosingNode, void 0, sourceFile, false) ? initialIndentation + options.indentSize : initialIndentation;
          var leadingTrivia = formattingScanner.getCurrentLeadingTrivia();
          if (leadingTrivia) {
            indentTriviaItems(leadingTrivia, indentation, false, function(item) {
              return processRange(item, sourceFile.getLineAndCharacterOfPosition(item.pos), enclosingNode, enclosingNode, void 0);
            });
            if (options.trimTrailingWhitespace !== false) {
              trimTrailingWhitespacesForRemainingRange(leadingTrivia);
            }
          }
        }
        return edits;
        function tryComputeIndentationForListItem(startPos, endPos, parentStartLine, range, inheritedIndentation) {
          if (ts2.rangeOverlapsWithStartEnd(range, startPos, endPos) || ts2.rangeContainsStartEnd(range, startPos, endPos)) {
            if (inheritedIndentation !== -1) {
              return inheritedIndentation;
            }
          } else {
            var startLine2 = sourceFile.getLineAndCharacterOfPosition(startPos).line;
            var startLinePosition = ts2.getLineStartPositionForPosition(startPos, sourceFile);
            var column = formatting2.SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, startPos, sourceFile, options);
            if (startLine2 !== parentStartLine || startPos === column) {
              var baseIndentSize = formatting2.SmartIndenter.getBaseIndentation(options);
              return baseIndentSize > column ? baseIndentSize : column;
            }
          }
          return -1;
        }
        function computeIndentation(node, startLine2, inheritedIndentation, parent, parentDynamicIndentation, effectiveParentStartLine) {
          var delta2 = formatting2.SmartIndenter.shouldIndentChildNode(options, node) ? options.indentSize : 0;
          if (effectiveParentStartLine === startLine2) {
            return {
              indentation: startLine2 === lastIndentedLine ? indentationOnLastIndentedLine : parentDynamicIndentation.getIndentation(),
              delta: Math.min(options.indentSize, parentDynamicIndentation.getDelta(node) + delta2)
            };
          } else if (inheritedIndentation === -1) {
            if (node.kind === 20 && startLine2 === lastIndentedLine) {
              return { indentation: indentationOnLastIndentedLine, delta: parentDynamicIndentation.getDelta(node) };
            } else if (formatting2.SmartIndenter.childStartsOnTheSameLineWithElseInIfStatement(parent, node, startLine2, sourceFile) || formatting2.SmartIndenter.childIsUnindentedBranchOfConditionalExpression(parent, node, startLine2, sourceFile) || formatting2.SmartIndenter.argumentStartsOnSameLineAsPreviousArgument(parent, node, startLine2, sourceFile)) {
              return { indentation: parentDynamicIndentation.getIndentation(), delta: delta2 };
            } else {
              return { indentation: parentDynamicIndentation.getIndentation() + parentDynamicIndentation.getDelta(node), delta: delta2 };
            }
          } else {
            return { indentation: inheritedIndentation, delta: delta2 };
          }
        }
        function getFirstNonDecoratorTokenOfNode(node) {
          if (node.modifiers && node.modifiers.length) {
            return node.modifiers[0].kind;
          }
          switch (node.kind) {
            case 256:
              return 84;
            case 257:
              return 118;
            case 255:
              return 98;
            case 259:
              return 259;
            case 171:
              return 136;
            case 172:
              return 148;
            case 168:
              if (node.asteriskToken) {
                return 41;
              }
            case 166:
            case 163:
              var name = ts2.getNameOfDeclaration(node);
              if (name) {
                return name.kind;
              }
          }
        }
        function getDynamicIndentation(node, nodeStartLine, indentation2, delta2) {
          return {
            getIndentationForComment: function(kind, tokenIndentation, container) {
              switch (kind) {
                case 19:
                case 23:
                case 21:
                  return indentation2 + getDelta(container);
              }
              return tokenIndentation !== -1 ? tokenIndentation : indentation2;
            },
            getIndentationForToken: function(line, kind, container, suppressDelta) {
              return !suppressDelta && shouldAddDelta(line, kind, container) ? indentation2 + getDelta(container) : indentation2;
            },
            getIndentation: function() {
              return indentation2;
            },
            getDelta,
            recomputeIndentation: function(lineAdded, parent) {
              if (formatting2.SmartIndenter.shouldIndentChildNode(options, parent, node, sourceFile)) {
                indentation2 += lineAdded ? options.indentSize : -options.indentSize;
                delta2 = formatting2.SmartIndenter.shouldIndentChildNode(options, node) ? options.indentSize : 0;
              }
            }
          };
          function shouldAddDelta(line, kind, container) {
            switch (kind) {
              case 18:
              case 19:
              case 21:
              case 91:
              case 115:
              case 59:
                return false;
              case 43:
              case 31:
                switch (container.kind) {
                  case 279:
                  case 280:
                  case 278:
                  case 227:
                    return false;
                }
                break;
              case 22:
              case 23:
                if (container.kind !== 194) {
                  return false;
                }
                break;
            }
            return nodeStartLine !== line && !(node.decorators && kind === getFirstNonDecoratorTokenOfNode(node));
          }
          function getDelta(child) {
            return formatting2.SmartIndenter.nodeWillIndentChild(options, node, child, sourceFile, true) ? delta2 : 0;
          }
        }
        function processNode(node, contextNode, nodeStartLine, undecoratedNodeStartLine, indentation2, delta2) {
          if (!ts2.rangeOverlapsWithStartEnd(originalRange, node.getStart(sourceFile), node.getEnd())) {
            return;
          }
          var nodeDynamicIndentation = getDynamicIndentation(node, nodeStartLine, indentation2, delta2);
          var childContextNode = contextNode;
          ts2.forEachChild(node, function(child) {
            processChildNode(child, -1, node, nodeDynamicIndentation, nodeStartLine, undecoratedNodeStartLine, false);
          }, function(nodes) {
            processChildNodes(nodes, node, nodeStartLine, nodeDynamicIndentation);
          });
          while (formattingScanner.isOnToken()) {
            var tokenInfo = formattingScanner.readTokenInfo(node);
            if (tokenInfo.token.end > node.end) {
              break;
            }
            consumeTokenAndAdvanceScanner(tokenInfo, node, nodeDynamicIndentation, node);
          }
          if (!node.parent && formattingScanner.isOnEOF()) {
            var token = formattingScanner.readEOFTokenRange();
            if (token.end <= node.end && previousRange) {
              processPair(token, sourceFile.getLineAndCharacterOfPosition(token.pos).line, node, previousRange, previousRangeStartLine, previousParent, contextNode, nodeDynamicIndentation);
            }
          }
          function processChildNode(child, inheritedIndentation, parent, parentDynamicIndentation, parentStartLine, undecoratedParentStartLine, isListItem, isFirstListItem) {
            var childStartPos = child.getStart(sourceFile);
            var childStartLine = sourceFile.getLineAndCharacterOfPosition(childStartPos).line;
            var undecoratedChildStartLine = childStartLine;
            if (child.decorators) {
              undecoratedChildStartLine = sourceFile.getLineAndCharacterOfPosition(ts2.getNonDecoratorTokenPosOfNode(child, sourceFile)).line;
            }
            var childIndentationAmount = -1;
            if (isListItem && ts2.rangeContainsRange(originalRange, parent)) {
              childIndentationAmount = tryComputeIndentationForListItem(childStartPos, child.end, parentStartLine, originalRange, inheritedIndentation);
              if (childIndentationAmount !== -1) {
                inheritedIndentation = childIndentationAmount;
              }
            }
            if (!ts2.rangeOverlapsWithStartEnd(originalRange, child.pos, child.end)) {
              if (child.end < originalRange.pos) {
                formattingScanner.skipToEndOf(child);
              }
              return inheritedIndentation;
            }
            if (child.getFullWidth() === 0) {
              return inheritedIndentation;
            }
            while (formattingScanner.isOnToken()) {
              var tokenInfo2 = formattingScanner.readTokenInfo(node);
              if (tokenInfo2.token.end > childStartPos) {
                if (tokenInfo2.token.pos > childStartPos) {
                  formattingScanner.skipToStartOf(child);
                }
                break;
              }
              consumeTokenAndAdvanceScanner(tokenInfo2, node, parentDynamicIndentation, node);
            }
            if (!formattingScanner.isOnToken()) {
              return inheritedIndentation;
            }
            if (ts2.isToken(child)) {
              var tokenInfo2 = formattingScanner.readTokenInfo(child);
              if (child.kind !== 11) {
                ts2.Debug.assert(tokenInfo2.token.end === child.end, "Token end is child end");
                consumeTokenAndAdvanceScanner(tokenInfo2, node, parentDynamicIndentation, child);
                return inheritedIndentation;
              }
            }
            var effectiveParentStartLine = child.kind === 164 ? childStartLine : undecoratedParentStartLine;
            var childIndentation = computeIndentation(child, childStartLine, childIndentationAmount, node, parentDynamicIndentation, effectiveParentStartLine);
            processNode(child, childContextNode, childStartLine, undecoratedChildStartLine, childIndentation.indentation, childIndentation.delta);
            childContextNode = node;
            if (isFirstListItem && parent.kind === 203 && inheritedIndentation === -1) {
              inheritedIndentation = childIndentation.indentation;
            }
            return inheritedIndentation;
          }
          function processChildNodes(nodes, parent, parentStartLine, parentDynamicIndentation) {
            ts2.Debug.assert(ts2.isNodeArray(nodes));
            var listStartToken = getOpenTokenForList(parent, nodes);
            var listDynamicIndentation = parentDynamicIndentation;
            var startLine2 = parentStartLine;
            if (listStartToken !== 0) {
              while (formattingScanner.isOnToken()) {
                var tokenInfo2 = formattingScanner.readTokenInfo(parent);
                if (tokenInfo2.token.end > nodes.pos) {
                  break;
                } else if (tokenInfo2.token.kind === listStartToken) {
                  startLine2 = sourceFile.getLineAndCharacterOfPosition(tokenInfo2.token.pos).line;
                  consumeTokenAndAdvanceScanner(tokenInfo2, parent, parentDynamicIndentation, parent);
                  var indentationOnListStartToken = void 0;
                  if (indentationOnLastIndentedLine !== -1) {
                    indentationOnListStartToken = indentationOnLastIndentedLine;
                  } else {
                    var startLinePosition = ts2.getLineStartPositionForPosition(tokenInfo2.token.pos, sourceFile);
                    indentationOnListStartToken = formatting2.SmartIndenter.findFirstNonWhitespaceColumn(startLinePosition, tokenInfo2.token.pos, sourceFile, options);
                  }
                  listDynamicIndentation = getDynamicIndentation(parent, parentStartLine, indentationOnListStartToken, options.indentSize);
                } else {
                  consumeTokenAndAdvanceScanner(tokenInfo2, parent, parentDynamicIndentation, parent);
                }
              }
            }
            var inheritedIndentation = -1;
            for (var i = 0; i < nodes.length; i++) {
              var child = nodes[i];
              inheritedIndentation = processChildNode(child, inheritedIndentation, node, listDynamicIndentation, startLine2, startLine2, true, i === 0);
            }
            var listEndToken = getCloseTokenForOpenToken(listStartToken);
            if (listEndToken !== 0 && formattingScanner.isOnToken()) {
              var tokenInfo2 = formattingScanner.readTokenInfo(parent);
              if (tokenInfo2.token.kind === 27 && ts2.isCallLikeExpression(parent)) {
                var commaTokenLine = sourceFile.getLineAndCharacterOfPosition(tokenInfo2.token.pos).line;
                if (startLine2 !== commaTokenLine) {
                  formattingScanner.advance();
                  tokenInfo2 = formattingScanner.isOnToken() ? formattingScanner.readTokenInfo(parent) : void 0;
                }
              }
              if (tokenInfo2 && tokenInfo2.token.kind === listEndToken && ts2.rangeContainsRange(parent, tokenInfo2.token)) {
                consumeTokenAndAdvanceScanner(tokenInfo2, parent, listDynamicIndentation, parent, true);
              }
            }
          }
          function consumeTokenAndAdvanceScanner(currentTokenInfo, parent, dynamicIndentation, container, isListEndToken) {
            ts2.Debug.assert(ts2.rangeContainsRange(parent, currentTokenInfo.token));
            var lastTriviaWasNewLine = formattingScanner.lastTrailingTriviaWasNewLine();
            var indentToken = false;
            if (currentTokenInfo.leadingTrivia) {
              processTrivia(currentTokenInfo.leadingTrivia, parent, childContextNode, dynamicIndentation);
            }
            var lineAction = 0;
            var isTokenInRange = ts2.rangeContainsRange(originalRange, currentTokenInfo.token);
            var tokenStart = sourceFile.getLineAndCharacterOfPosition(currentTokenInfo.token.pos);
            if (isTokenInRange) {
              var rangeHasError = rangeContainsError(currentTokenInfo.token);
              var savePreviousRange = previousRange;
              lineAction = processRange(currentTokenInfo.token, tokenStart, parent, childContextNode, dynamicIndentation);
              if (!rangeHasError) {
                if (lineAction === 0) {
                  var prevEndLine = savePreviousRange && sourceFile.getLineAndCharacterOfPosition(savePreviousRange.end).line;
                  indentToken = lastTriviaWasNewLine && tokenStart.line !== prevEndLine;
                } else {
                  indentToken = lineAction === 1;
                }
              }
            }
            if (currentTokenInfo.trailingTrivia) {
              processTrivia(currentTokenInfo.trailingTrivia, parent, childContextNode, dynamicIndentation);
            }
            if (indentToken) {
              var tokenIndentation = isTokenInRange && !rangeContainsError(currentTokenInfo.token) ? dynamicIndentation.getIndentationForToken(tokenStart.line, currentTokenInfo.token.kind, container, !!isListEndToken) : -1;
              var indentNextTokenOrTrivia = true;
              if (currentTokenInfo.leadingTrivia) {
                var commentIndentation_1 = dynamicIndentation.getIndentationForComment(currentTokenInfo.token.kind, tokenIndentation, container);
                indentNextTokenOrTrivia = indentTriviaItems(currentTokenInfo.leadingTrivia, commentIndentation_1, indentNextTokenOrTrivia, function(item) {
                  return insertIndentation(item.pos, commentIndentation_1, false);
                });
              }
              if (tokenIndentation !== -1 && indentNextTokenOrTrivia) {
                insertIndentation(currentTokenInfo.token.pos, tokenIndentation, lineAction === 1);
                lastIndentedLine = tokenStart.line;
                indentationOnLastIndentedLine = tokenIndentation;
              }
            }
            formattingScanner.advance();
            childContextNode = parent;
          }
        }
        function indentTriviaItems(trivia, commentIndentation, indentNextTokenOrTrivia, indentSingleLine) {
          for (var _i = 0, trivia_1 = trivia; _i < trivia_1.length; _i++) {
            var triviaItem = trivia_1[_i];
            var triviaInRange = ts2.rangeContainsRange(originalRange, triviaItem);
            switch (triviaItem.kind) {
              case 3:
                if (triviaInRange) {
                  indentMultilineComment(triviaItem, commentIndentation, !indentNextTokenOrTrivia);
                }
                indentNextTokenOrTrivia = false;
                break;
              case 2:
                if (indentNextTokenOrTrivia && triviaInRange) {
                  indentSingleLine(triviaItem);
                }
                indentNextTokenOrTrivia = false;
                break;
              case 4:
                indentNextTokenOrTrivia = true;
                break;
            }
          }
          return indentNextTokenOrTrivia;
        }
        function processTrivia(trivia, parent, contextNode, dynamicIndentation) {
          for (var _i = 0, trivia_2 = trivia; _i < trivia_2.length; _i++) {
            var triviaItem = trivia_2[_i];
            if (ts2.isComment(triviaItem.kind) && ts2.rangeContainsRange(originalRange, triviaItem)) {
              var triviaItemStart = sourceFile.getLineAndCharacterOfPosition(triviaItem.pos);
              processRange(triviaItem, triviaItemStart, parent, contextNode, dynamicIndentation);
            }
          }
        }
        function processRange(range, rangeStart, parent, contextNode, dynamicIndentation) {
          var rangeHasError = rangeContainsError(range);
          var lineAction = 0;
          if (!rangeHasError) {
            if (!previousRange) {
              var originalStart = sourceFile.getLineAndCharacterOfPosition(originalRange.pos);
              trimTrailingWhitespacesForLines(originalStart.line, rangeStart.line);
            } else {
              lineAction = processPair(range, rangeStart.line, parent, previousRange, previousRangeStartLine, previousParent, contextNode, dynamicIndentation);
            }
          }
          previousRange = range;
          previousParent = parent;
          previousRangeStartLine = rangeStart.line;
          return lineAction;
        }
        function processPair(currentItem, currentStartLine, currentParent, previousItem, previousStartLine, previousParent2, contextNode, dynamicIndentation) {
          formattingContext.updateContext(previousItem, previousParent2, currentItem, currentParent, contextNode);
          var rules = getRules(formattingContext);
          var trimTrailingWhitespaces = formattingContext.options.trimTrailingWhitespace !== false;
          var lineAction = 0;
          if (rules) {
            ts2.forEachRight(rules, function(rule) {
              lineAction = applyRuleEdits(rule, previousItem, previousStartLine, currentItem, currentStartLine);
              switch (lineAction) {
                case 2:
                  if (currentParent.getStart(sourceFile) === currentItem.pos) {
                    dynamicIndentation.recomputeIndentation(false, contextNode);
                  }
                  break;
                case 1:
                  if (currentParent.getStart(sourceFile) === currentItem.pos) {
                    dynamicIndentation.recomputeIndentation(true, contextNode);
                  }
                  break;
                default:
                  ts2.Debug.assert(lineAction === 0);
              }
              trimTrailingWhitespaces = trimTrailingWhitespaces && !(rule.action & 16) && rule.flags !== 1;
            });
          } else {
            trimTrailingWhitespaces = trimTrailingWhitespaces && currentItem.kind !== 1;
          }
          if (currentStartLine !== previousStartLine && trimTrailingWhitespaces) {
            trimTrailingWhitespacesForLines(previousStartLine, currentStartLine, previousItem);
          }
          return lineAction;
        }
        function insertIndentation(pos, indentation2, lineAdded) {
          var indentationString = getIndentationString(indentation2, options);
          if (lineAdded) {
            recordReplace(pos, 0, indentationString);
          } else {
            var tokenStart = sourceFile.getLineAndCharacterOfPosition(pos);
            var startLinePosition = ts2.getStartPositionOfLine(tokenStart.line, sourceFile);
            if (indentation2 !== characterToColumn(startLinePosition, tokenStart.character) || indentationIsDifferent(indentationString, startLinePosition)) {
              recordReplace(startLinePosition, tokenStart.character, indentationString);
            }
          }
        }
        function characterToColumn(startLinePosition, characterInLine) {
          var column = 0;
          for (var i = 0; i < characterInLine; i++) {
            if (sourceFile.text.charCodeAt(startLinePosition + i) === 9) {
              column += options.tabSize - column % options.tabSize;
            } else {
              column++;
            }
          }
          return column;
        }
        function indentationIsDifferent(indentationString, startLinePosition) {
          return indentationString !== sourceFile.text.substr(startLinePosition, indentationString.length);
        }
        function indentMultilineComment(commentRange, indentation2, firstLineIsIndented, indentFinalLine) {
          if (indentFinalLine === void 0) {
            indentFinalLine = true;
          }
          var startLine2 = sourceFile.getLineAndCharacterOfPosition(commentRange.pos).line;
          var endLine = sourceFile.getLineAndCharacterOfPosition(commentRange.end).line;
          if (startLine2 === endLine) {
            if (!firstLineIsIndented) {
              insertIndentation(commentRange.pos, indentation2, false);
            }
            return;
          }
          var parts = [];
          var startPos = commentRange.pos;
          for (var line = startLine2; line < endLine; line++) {
            var endOfLine = ts2.getEndLinePosition(line, sourceFile);
            parts.push({ pos: startPos, end: endOfLine });
            startPos = ts2.getStartPositionOfLine(line + 1, sourceFile);
          }
          if (indentFinalLine) {
            parts.push({ pos: startPos, end: commentRange.end });
          }
          if (parts.length === 0)
            return;
          var startLinePos = ts2.getStartPositionOfLine(startLine2, sourceFile);
          var nonWhitespaceColumnInFirstPart = formatting2.SmartIndenter.findFirstNonWhitespaceCharacterAndColumn(startLinePos, parts[0].pos, sourceFile, options);
          var startIndex = 0;
          if (firstLineIsIndented) {
            startIndex = 1;
            startLine2++;
          }
          var delta2 = indentation2 - nonWhitespaceColumnInFirstPart.column;
          for (var i = startIndex; i < parts.length; i++, startLine2++) {
            var startLinePos_1 = ts2.getStartPositionOfLine(startLine2, sourceFile);
            var nonWhitespaceCharacterAndColumn = i === 0 ? nonWhitespaceColumnInFirstPart : formatting2.SmartIndenter.findFirstNonWhitespaceCharacterAndColumn(parts[i].pos, parts[i].end, sourceFile, options);
            var newIndentation = nonWhitespaceCharacterAndColumn.column + delta2;
            if (newIndentation > 0) {
              var indentationString = getIndentationString(newIndentation, options);
              recordReplace(startLinePos_1, nonWhitespaceCharacterAndColumn.character, indentationString);
            } else {
              recordDelete(startLinePos_1, nonWhitespaceCharacterAndColumn.character);
            }
          }
        }
        function trimTrailingWhitespacesForLines(line1, line2, range) {
          for (var line = line1; line < line2; line++) {
            var lineStartPosition = ts2.getStartPositionOfLine(line, sourceFile);
            var lineEndPosition = ts2.getEndLinePosition(line, sourceFile);
            if (range && (ts2.isComment(range.kind) || ts2.isStringOrRegularExpressionOrTemplateLiteral(range.kind)) && range.pos <= lineEndPosition && range.end > lineEndPosition) {
              continue;
            }
            var whitespaceStart = getTrailingWhitespaceStartPosition(lineStartPosition, lineEndPosition);
            if (whitespaceStart !== -1) {
              ts2.Debug.assert(whitespaceStart === lineStartPosition || !ts2.isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(whitespaceStart - 1)));
              recordDelete(whitespaceStart, lineEndPosition + 1 - whitespaceStart);
            }
          }
        }
        function getTrailingWhitespaceStartPosition(start, end) {
          var pos = end;
          while (pos >= start && ts2.isWhiteSpaceSingleLine(sourceFile.text.charCodeAt(pos))) {
            pos--;
          }
          if (pos !== end) {
            return pos + 1;
          }
          return -1;
        }
        function trimTrailingWhitespacesForRemainingRange(trivias) {
          var startPos = previousRange ? previousRange.end : originalRange.pos;
          for (var _i = 0, trivias_1 = trivias; _i < trivias_1.length; _i++) {
            var trivia = trivias_1[_i];
            if (ts2.isComment(trivia.kind)) {
              if (startPos < trivia.pos) {
                trimTrailingWitespacesForPositions(startPos, trivia.pos - 1, previousRange);
              }
              startPos = trivia.end + 1;
            }
          }
          if (startPos < originalRange.end) {
            trimTrailingWitespacesForPositions(startPos, originalRange.end, previousRange);
          }
        }
        function trimTrailingWitespacesForPositions(startPos, endPos, previousRange2) {
          var startLine2 = sourceFile.getLineAndCharacterOfPosition(startPos).line;
          var endLine = sourceFile.getLineAndCharacterOfPosition(endPos).line;
          trimTrailingWhitespacesForLines(startLine2, endLine + 1, previousRange2);
        }
        function recordDelete(start, len) {
          if (len) {
            edits.push(ts2.createTextChangeFromStartLength(start, len, ""));
          }
        }
        function recordReplace(start, len, newText) {
          if (len || newText) {
            edits.push(ts2.createTextChangeFromStartLength(start, len, newText));
          }
        }
        function recordInsert(start, text) {
          if (text) {
            edits.push(ts2.createTextChangeFromStartLength(start, 0, text));
          }
        }
        function applyRuleEdits(rule, previousRange2, previousStartLine, currentRange, currentStartLine) {
          var onLaterLine = currentStartLine !== previousStartLine;
          switch (rule.action) {
            case 1:
              return 0;
            case 16:
              if (previousRange2.end !== currentRange.pos) {
                recordDelete(previousRange2.end, currentRange.pos - previousRange2.end);
                return onLaterLine ? 2 : 0;
              }
              break;
            case 32:
              recordDelete(previousRange2.pos, previousRange2.end - previousRange2.pos);
              break;
            case 8:
              if (rule.flags !== 1 && previousStartLine !== currentStartLine) {
                return 0;
              }
              var lineDelta = currentStartLine - previousStartLine;
              if (lineDelta !== 1) {
                recordReplace(previousRange2.end, currentRange.pos - previousRange2.end, ts2.getNewLineOrDefaultFromHost(host, options));
                return onLaterLine ? 0 : 1;
              }
              break;
            case 4:
              if (rule.flags !== 1 && previousStartLine !== currentStartLine) {
                return 0;
              }
              var posDelta = currentRange.pos - previousRange2.end;
              if (posDelta !== 1 || sourceFile.text.charCodeAt(previousRange2.end) !== 32) {
                recordReplace(previousRange2.end, currentRange.pos - previousRange2.end, " ");
                return onLaterLine ? 2 : 0;
              }
              break;
            case 64:
              recordInsert(previousRange2.end, ";");
          }
          return 0;
        }
      }
      var LineAction;
      (function(LineAction2) {
        LineAction2[LineAction2["None"] = 0] = "None";
        LineAction2[LineAction2["LineAdded"] = 1] = "LineAdded";
        LineAction2[LineAction2["LineRemoved"] = 2] = "LineRemoved";
      })(LineAction || (LineAction = {}));
      function getRangeOfEnclosingComment(sourceFile, position, precedingToken, tokenAtPosition) {
        if (tokenAtPosition === void 0) {
          tokenAtPosition = ts2.getTokenAtPosition(sourceFile, position);
        }
        var jsdoc = ts2.findAncestor(tokenAtPosition, ts2.isJSDoc);
        if (jsdoc)
          tokenAtPosition = jsdoc.parent;
        var tokenStart = tokenAtPosition.getStart(sourceFile);
        if (tokenStart <= position && position < tokenAtPosition.getEnd()) {
          return void 0;
        }
        precedingToken = precedingToken === null ? void 0 : precedingToken === void 0 ? ts2.findPrecedingToken(position, sourceFile) : precedingToken;
        var trailingRangesOfPreviousToken = precedingToken && ts2.getTrailingCommentRanges(sourceFile.text, precedingToken.end);
        var leadingCommentRangesOfNextToken = ts2.getLeadingCommentRangesOfNode(tokenAtPosition, sourceFile);
        var commentRanges = ts2.concatenate(trailingRangesOfPreviousToken, leadingCommentRangesOfNextToken);
        return commentRanges && ts2.find(commentRanges, function(range) {
          return ts2.rangeContainsPositionExclusive(range, position) || position === range.end && (range.kind === 2 || position === sourceFile.getFullWidth());
        });
      }
      formatting2.getRangeOfEnclosingComment = getRangeOfEnclosingComment;
      function getOpenTokenForList(node, list) {
        switch (node.kind) {
          case 170:
          case 255:
          case 212:
          case 168:
          case 167:
          case 213:
            if (node.typeParameters === list) {
              return 29;
            } else if (node.parameters === list) {
              return 20;
            }
            break;
          case 207:
          case 208:
            if (node.typeArguments === list) {
              return 29;
            } else if (node.arguments === list) {
              return 20;
            }
            break;
          case 177:
            if (node.typeArguments === list) {
              return 29;
            }
            break;
          case 181:
            return 18;
        }
        return 0;
      }
      function getCloseTokenForOpenToken(kind) {
        switch (kind) {
          case 20:
            return 21;
          case 29:
            return 31;
          case 18:
            return 19;
        }
        return 0;
      }
      var internedSizes;
      var internedTabsIndentation;
      var internedSpacesIndentation;
      function getIndentationString(indentation, options) {
        var resetInternedStrings = !internedSizes || (internedSizes.tabSize !== options.tabSize || internedSizes.indentSize !== options.indentSize);
        if (resetInternedStrings) {
          internedSizes = { tabSize: options.tabSize, indentSize: options.indentSize };
          internedTabsIndentation = internedSpacesIndentation = void 0;
        }
        if (!options.convertTabsToSpaces) {
          var tabs = Math.floor(indentation / options.tabSize);
          var spaces = indentation - tabs * options.tabSize;
          var tabString = void 0;
          if (!internedTabsIndentation) {
            internedTabsIndentation = [];
          }
          if (internedTabsIndentation[tabs] === void 0) {
            internedTabsIndentation[tabs] = tabString = ts2.repeatString("	", tabs);
          } else {
            tabString = internedTabsIndentation[tabs];
          }
          return spaces ? tabString + ts2.repeatString(" ", spaces) : tabString;
        } else {
          var spacesString = void 0;
          var quotient = Math.floor(indentation / options.indentSize);
          var remainder = indentation % options.indentSize;
          if (!internedSpacesIndentation) {
            internedSpacesIndentation = [];
          }
          if (internedSpacesIndentation[quotient] === void 0) {
            spacesString = ts2.repeatString(" ", options.indentSize * quotient);
            internedSpacesIndentation[quotient] = spacesString;
          } else {
            spacesString = internedSpacesIndentation[quotient];
          }
          return remainder ? spacesString + ts2.repeatString(" ", remainder) : spacesString;
        }
      }
      formatting2.getIndentationString = getIndentationString;
    })(formatting = ts2.formatting || (ts2.formatting = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var formatting;
    (function(formatting2) {
      var SmartIndenter;
      (function(SmartIndenter2) {
        var Value;
        (function(Value2) {
          Value2[Value2["Unknown"] = -1] = "Unknown";
        })(Value || (Value = {}));
        function getIndentation(position, sourceFile, options, assumeNewLineBeforeCloseBrace) {
          if (assumeNewLineBeforeCloseBrace === void 0) {
            assumeNewLineBeforeCloseBrace = false;
          }
          if (position > sourceFile.text.length) {
            return getBaseIndentation(options);
          }
          if (options.indentStyle === ts2.IndentStyle.None) {
            return 0;
          }
          var precedingToken = ts2.findPrecedingToken(position, sourceFile, void 0, true);
          var enclosingCommentRange = formatting2.getRangeOfEnclosingComment(sourceFile, position, precedingToken || null);
          if (enclosingCommentRange && enclosingCommentRange.kind === 3) {
            return getCommentIndent(sourceFile, position, options, enclosingCommentRange);
          }
          if (!precedingToken) {
            return getBaseIndentation(options);
          }
          var precedingTokenIsLiteral = ts2.isStringOrRegularExpressionOrTemplateLiteral(precedingToken.kind);
          if (precedingTokenIsLiteral && precedingToken.getStart(sourceFile) <= position && position < precedingToken.end) {
            return 0;
          }
          var lineAtPosition = sourceFile.getLineAndCharacterOfPosition(position).line;
          if (options.indentStyle === ts2.IndentStyle.Block) {
            return getBlockIndent(sourceFile, position, options);
          }
          if (precedingToken.kind === 27 && precedingToken.parent.kind !== 220) {
            var actualIndentation = getActualIndentationForListItemBeforeComma(precedingToken, sourceFile, options);
            if (actualIndentation !== -1) {
              return actualIndentation;
            }
          }
          var containerList = getListByPosition(position, precedingToken.parent, sourceFile);
          if (containerList && !ts2.rangeContainsRange(containerList, precedingToken)) {
            return getActualIndentationForListStartLine(containerList, sourceFile, options) + options.indentSize;
          }
          return getSmartIndent(sourceFile, position, precedingToken, lineAtPosition, assumeNewLineBeforeCloseBrace, options);
        }
        SmartIndenter2.getIndentation = getIndentation;
        function getCommentIndent(sourceFile, position, options, enclosingCommentRange) {
          var previousLine = ts2.getLineAndCharacterOfPosition(sourceFile, position).line - 1;
          var commentStartLine = ts2.getLineAndCharacterOfPosition(sourceFile, enclosingCommentRange.pos).line;
          ts2.Debug.assert(commentStartLine >= 0);
          if (previousLine <= commentStartLine) {
            return findFirstNonWhitespaceColumn(ts2.getStartPositionOfLine(commentStartLine, sourceFile), position, sourceFile, options);
          }
          var startPositionOfLine = ts2.getStartPositionOfLine(previousLine, sourceFile);
          var _a = findFirstNonWhitespaceCharacterAndColumn(startPositionOfLine, position, sourceFile, options), column = _a.column, character = _a.character;
          if (column === 0) {
            return column;
          }
          var firstNonWhitespaceCharacterCode = sourceFile.text.charCodeAt(startPositionOfLine + character);
          return firstNonWhitespaceCharacterCode === 42 ? column - 1 : column;
        }
        function getBlockIndent(sourceFile, position, options) {
          var current = position;
          while (current > 0) {
            var char = sourceFile.text.charCodeAt(current);
            if (!ts2.isWhiteSpaceLike(char)) {
              break;
            }
            current--;
          }
          var lineStart = ts2.getLineStartPositionForPosition(current, sourceFile);
          return findFirstNonWhitespaceColumn(lineStart, current, sourceFile, options);
        }
        function getSmartIndent(sourceFile, position, precedingToken, lineAtPosition, assumeNewLineBeforeCloseBrace, options) {
          var previous;
          var current = precedingToken;
          while (current) {
            if (ts2.positionBelongsToNode(current, position, sourceFile) && shouldIndentChildNode(options, current, previous, sourceFile, true)) {
              var currentStart = getStartLineAndCharacterForNode(current, sourceFile);
              var nextTokenKind = nextTokenIsCurlyBraceOnSameLineAsCursor(precedingToken, current, lineAtPosition, sourceFile);
              var indentationDelta = nextTokenKind !== 0 ? assumeNewLineBeforeCloseBrace && nextTokenKind === 2 ? options.indentSize : 0 : lineAtPosition !== currentStart.line ? options.indentSize : 0;
              return getIndentationForNodeWorker(current, currentStart, void 0, indentationDelta, sourceFile, true, options);
            }
            var actualIndentation = getActualIndentationForListItem(current, sourceFile, options, true);
            if (actualIndentation !== -1) {
              return actualIndentation;
            }
            previous = current;
            current = current.parent;
          }
          return getBaseIndentation(options);
        }
        function getIndentationForNode(n, ignoreActualIndentationRange, sourceFile, options) {
          var start = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile));
          return getIndentationForNodeWorker(n, start, ignoreActualIndentationRange, 0, sourceFile, false, options);
        }
        SmartIndenter2.getIndentationForNode = getIndentationForNode;
        function getBaseIndentation(options) {
          return options.baseIndentSize || 0;
        }
        SmartIndenter2.getBaseIndentation = getBaseIndentation;
        function getIndentationForNodeWorker(current, currentStart, ignoreActualIndentationRange, indentationDelta, sourceFile, isNextChild, options) {
          var _a;
          var parent = current.parent;
          while (parent) {
            var useActualIndentation = true;
            if (ignoreActualIndentationRange) {
              var start = current.getStart(sourceFile);
              useActualIndentation = start < ignoreActualIndentationRange.pos || start > ignoreActualIndentationRange.end;
            }
            var containingListOrParentStart = getContainingListOrParentStart(parent, current, sourceFile);
            var parentAndChildShareLine = containingListOrParentStart.line === currentStart.line || childStartsOnTheSameLineWithElseInIfStatement(parent, current, currentStart.line, sourceFile);
            if (useActualIndentation) {
              var firstListChild = (_a = getContainingList(current, sourceFile)) === null || _a === void 0 ? void 0 : _a[0];
              var listIndentsChild = !!firstListChild && getStartLineAndCharacterForNode(firstListChild, sourceFile).line > containingListOrParentStart.line;
              var actualIndentation = getActualIndentationForListItem(current, sourceFile, options, listIndentsChild);
              if (actualIndentation !== -1) {
                return actualIndentation + indentationDelta;
              }
              actualIndentation = getActualIndentationForNode(current, parent, currentStart, parentAndChildShareLine, sourceFile, options);
              if (actualIndentation !== -1) {
                return actualIndentation + indentationDelta;
              }
            }
            if (shouldIndentChildNode(options, parent, current, sourceFile, isNextChild) && !parentAndChildShareLine) {
              indentationDelta += options.indentSize;
            }
            var useTrueStart = isArgumentAndStartLineOverlapsExpressionBeingCalled(parent, current, currentStart.line, sourceFile);
            current = parent;
            parent = current.parent;
            currentStart = useTrueStart ? sourceFile.getLineAndCharacterOfPosition(current.getStart(sourceFile)) : containingListOrParentStart;
          }
          return indentationDelta + getBaseIndentation(options);
        }
        function getContainingListOrParentStart(parent, child, sourceFile) {
          var containingList = getContainingList(child, sourceFile);
          var startPos = containingList ? containingList.pos : parent.getStart(sourceFile);
          return sourceFile.getLineAndCharacterOfPosition(startPos);
        }
        function getActualIndentationForListItemBeforeComma(commaToken, sourceFile, options) {
          var commaItemInfo = ts2.findListItemInfo(commaToken);
          if (commaItemInfo && commaItemInfo.listItemIndex > 0) {
            return deriveActualIndentationFromList(commaItemInfo.list.getChildren(), commaItemInfo.listItemIndex - 1, sourceFile, options);
          } else {
            return -1;
          }
        }
        function getActualIndentationForNode(current, parent, currentLineAndChar, parentAndChildShareLine, sourceFile, options) {
          var useActualIndentation = (ts2.isDeclaration(current) || ts2.isStatementButNotDeclaration(current)) && (parent.kind === 303 || !parentAndChildShareLine);
          if (!useActualIndentation) {
            return -1;
          }
          return findColumnForFirstNonWhitespaceCharacterInLine(currentLineAndChar, sourceFile, options);
        }
        var NextTokenKind;
        (function(NextTokenKind2) {
          NextTokenKind2[NextTokenKind2["Unknown"] = 0] = "Unknown";
          NextTokenKind2[NextTokenKind2["OpenBrace"] = 1] = "OpenBrace";
          NextTokenKind2[NextTokenKind2["CloseBrace"] = 2] = "CloseBrace";
        })(NextTokenKind || (NextTokenKind = {}));
        function nextTokenIsCurlyBraceOnSameLineAsCursor(precedingToken, current, lineAtPosition, sourceFile) {
          var nextToken = ts2.findNextToken(precedingToken, current, sourceFile);
          if (!nextToken) {
            return 0;
          }
          if (nextToken.kind === 18) {
            return 1;
          } else if (nextToken.kind === 19) {
            var nextTokenStartLine = getStartLineAndCharacterForNode(nextToken, sourceFile).line;
            return lineAtPosition === nextTokenStartLine ? 2 : 0;
          }
          return 0;
        }
        function getStartLineAndCharacterForNode(n, sourceFile) {
          return sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile));
        }
        function isArgumentAndStartLineOverlapsExpressionBeingCalled(parent, child, childStartLine, sourceFile) {
          if (!(ts2.isCallExpression(parent) && ts2.contains(parent.arguments, child))) {
            return false;
          }
          var expressionOfCallExpressionEnd = parent.expression.getEnd();
          var expressionOfCallExpressionEndLine = ts2.getLineAndCharacterOfPosition(sourceFile, expressionOfCallExpressionEnd).line;
          return expressionOfCallExpressionEndLine === childStartLine;
        }
        SmartIndenter2.isArgumentAndStartLineOverlapsExpressionBeingCalled = isArgumentAndStartLineOverlapsExpressionBeingCalled;
        function childStartsOnTheSameLineWithElseInIfStatement(parent, child, childStartLine, sourceFile) {
          if (parent.kind === 238 && parent.elseStatement === child) {
            var elseKeyword = ts2.findChildOfKind(parent, 91, sourceFile);
            ts2.Debug.assert(elseKeyword !== void 0);
            var elseKeywordStartLine = getStartLineAndCharacterForNode(elseKeyword, sourceFile).line;
            return elseKeywordStartLine === childStartLine;
          }
          return false;
        }
        SmartIndenter2.childStartsOnTheSameLineWithElseInIfStatement = childStartsOnTheSameLineWithElseInIfStatement;
        function childIsUnindentedBranchOfConditionalExpression(parent, child, childStartLine, sourceFile) {
          if (ts2.isConditionalExpression(parent) && (child === parent.whenTrue || child === parent.whenFalse)) {
            var conditionEndLine = ts2.getLineAndCharacterOfPosition(sourceFile, parent.condition.end).line;
            if (child === parent.whenTrue) {
              return childStartLine === conditionEndLine;
            } else {
              var trueStartLine = getStartLineAndCharacterForNode(parent.whenTrue, sourceFile).line;
              var trueEndLine = ts2.getLineAndCharacterOfPosition(sourceFile, parent.whenTrue.end).line;
              return conditionEndLine === trueStartLine && trueEndLine === childStartLine;
            }
          }
          return false;
        }
        SmartIndenter2.childIsUnindentedBranchOfConditionalExpression = childIsUnindentedBranchOfConditionalExpression;
        function argumentStartsOnSameLineAsPreviousArgument(parent, child, childStartLine, sourceFile) {
          if (ts2.isCallOrNewExpression(parent)) {
            if (!parent.arguments)
              return false;
            var currentNode = ts2.find(parent.arguments, function(arg) {
              return arg.pos === child.pos;
            });
            if (!currentNode)
              return false;
            var currentIndex = parent.arguments.indexOf(currentNode);
            if (currentIndex === 0)
              return false;
            var previousNode = parent.arguments[currentIndex - 1];
            var lineOfPreviousNode = ts2.getLineAndCharacterOfPosition(sourceFile, previousNode.getEnd()).line;
            if (childStartLine === lineOfPreviousNode) {
              return true;
            }
          }
          return false;
        }
        SmartIndenter2.argumentStartsOnSameLineAsPreviousArgument = argumentStartsOnSameLineAsPreviousArgument;
        function getContainingList(node, sourceFile) {
          return node.parent && getListByRange(node.getStart(sourceFile), node.getEnd(), node.parent, sourceFile);
        }
        SmartIndenter2.getContainingList = getContainingList;
        function getListByPosition(pos, node, sourceFile) {
          return node && getListByRange(pos, pos, node, sourceFile);
        }
        function getListByRange(start, end, node, sourceFile) {
          switch (node.kind) {
            case 177:
              return getList(node.typeArguments);
            case 204:
              return getList(node.properties);
            case 203:
              return getList(node.elements);
            case 181:
              return getList(node.members);
            case 255:
            case 212:
            case 213:
            case 168:
            case 167:
            case 173:
            case 170:
            case 179:
            case 174:
              return getList(node.typeParameters) || getList(node.parameters);
            case 256:
            case 225:
            case 257:
            case 258:
            case 342:
              return getList(node.typeParameters);
            case 208:
            case 207:
              return getList(node.typeArguments) || getList(node.arguments);
            case 254:
              return getList(node.declarations);
            case 268:
            case 272:
              return getList(node.elements);
            case 200:
            case 201:
              return getList(node.elements);
          }
          function getList(list) {
            return list && ts2.rangeContainsStartEnd(getVisualListRange(node, list, sourceFile), start, end) ? list : void 0;
          }
        }
        function getVisualListRange(node, list, sourceFile) {
          var children = node.getChildren(sourceFile);
          for (var i = 1; i < children.length - 1; i++) {
            if (children[i].pos === list.pos && children[i].end === list.end) {
              return { pos: children[i - 1].end, end: children[i + 1].getStart(sourceFile) };
            }
          }
          return list;
        }
        function getActualIndentationForListStartLine(list, sourceFile, options) {
          if (!list) {
            return -1;
          }
          return findColumnForFirstNonWhitespaceCharacterInLine(sourceFile.getLineAndCharacterOfPosition(list.pos), sourceFile, options);
        }
        function getActualIndentationForListItem(node, sourceFile, options, listIndentsChild) {
          if (node.parent && node.parent.kind === 254) {
            return -1;
          }
          var containingList = getContainingList(node, sourceFile);
          if (containingList) {
            var index = containingList.indexOf(node);
            if (index !== -1) {
              var result = deriveActualIndentationFromList(containingList, index, sourceFile, options);
              if (result !== -1) {
                return result;
              }
            }
            return getActualIndentationForListStartLine(containingList, sourceFile, options) + (listIndentsChild ? options.indentSize : 0);
          }
          return -1;
        }
        function deriveActualIndentationFromList(list, index, sourceFile, options) {
          ts2.Debug.assert(index >= 0 && index < list.length);
          var node = list[index];
          var lineAndCharacter = getStartLineAndCharacterForNode(node, sourceFile);
          for (var i = index - 1; i >= 0; i--) {
            if (list[i].kind === 27) {
              continue;
            }
            var prevEndLine = sourceFile.getLineAndCharacterOfPosition(list[i].end).line;
            if (prevEndLine !== lineAndCharacter.line) {
              return findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options);
            }
            lineAndCharacter = getStartLineAndCharacterForNode(list[i], sourceFile);
          }
          return -1;
        }
        function findColumnForFirstNonWhitespaceCharacterInLine(lineAndCharacter, sourceFile, options) {
          var lineStart = sourceFile.getPositionOfLineAndCharacter(lineAndCharacter.line, 0);
          return findFirstNonWhitespaceColumn(lineStart, lineStart + lineAndCharacter.character, sourceFile, options);
        }
        function findFirstNonWhitespaceCharacterAndColumn(startPos, endPos, sourceFile, options) {
          var character = 0;
          var column = 0;
          for (var pos = startPos; pos < endPos; pos++) {
            var ch = sourceFile.text.charCodeAt(pos);
            if (!ts2.isWhiteSpaceSingleLine(ch)) {
              break;
            }
            if (ch === 9) {
              column += options.tabSize + column % options.tabSize;
            } else {
              column++;
            }
            character++;
          }
          return { column, character };
        }
        SmartIndenter2.findFirstNonWhitespaceCharacterAndColumn = findFirstNonWhitespaceCharacterAndColumn;
        function findFirstNonWhitespaceColumn(startPos, endPos, sourceFile, options) {
          return findFirstNonWhitespaceCharacterAndColumn(startPos, endPos, sourceFile, options).column;
        }
        SmartIndenter2.findFirstNonWhitespaceColumn = findFirstNonWhitespaceColumn;
        function nodeWillIndentChild(settings, parent, child, sourceFile, indentByDefault) {
          var childKind = child ? child.kind : 0;
          switch (parent.kind) {
            case 237:
            case 256:
            case 225:
            case 257:
            case 259:
            case 258:
            case 203:
            case 234:
            case 261:
            case 204:
            case 181:
            case 194:
            case 183:
            case 262:
            case 289:
            case 288:
            case 211:
            case 205:
            case 207:
            case 208:
            case 236:
            case 270:
            case 246:
            case 221:
            case 201:
            case 200:
            case 279:
            case 282:
            case 278:
            case 287:
            case 167:
            case 173:
            case 174:
            case 163:
            case 178:
            case 179:
            case 190:
            case 209:
            case 217:
            case 272:
            case 268:
            case 274:
            case 269:
            case 166:
              return true;
            case 253:
            case 294:
            case 220:
              if (!settings.indentMultiLineObjectLiteralBeginningOnBlankLine && sourceFile && childKind === 204) {
                return rangeIsOnOneLine(sourceFile, child);
              }
              if (parent.kind === 220 && sourceFile && child && childKind === 277) {
                var parentStartLine = sourceFile.getLineAndCharacterOfPosition(ts2.skipTrivia(sourceFile.text, parent.pos)).line;
                var childStartLine = sourceFile.getLineAndCharacterOfPosition(ts2.skipTrivia(sourceFile.text, child.pos)).line;
                return parentStartLine !== childStartLine;
              }
              if (parent.kind !== 220) {
                return true;
              }
              break;
            case 239:
            case 240:
            case 242:
            case 243:
            case 241:
            case 238:
            case 255:
            case 212:
            case 168:
            case 170:
            case 171:
            case 172:
              return childKind !== 234;
            case 213:
              if (sourceFile && childKind === 211) {
                return rangeIsOnOneLine(sourceFile, child);
              }
              return childKind !== 234;
            case 271:
              return childKind !== 272;
            case 265:
              return childKind !== 266 || !!child.namedBindings && child.namedBindings.kind !== 268;
            case 277:
              return childKind !== 280;
            case 281:
              return childKind !== 283;
            case 187:
            case 186:
              if (childKind === 181 || childKind === 183) {
                return false;
              }
              break;
          }
          return indentByDefault;
        }
        SmartIndenter2.nodeWillIndentChild = nodeWillIndentChild;
        function isControlFlowEndingStatement(kind, parent) {
          switch (kind) {
            case 246:
            case 250:
            case 244:
            case 245:
              return parent.kind !== 234;
            default:
              return false;
          }
        }
        function shouldIndentChildNode(settings, parent, child, sourceFile, isNextChild) {
          if (isNextChild === void 0) {
            isNextChild = false;
          }
          return nodeWillIndentChild(settings, parent, child, sourceFile, false) && !(isNextChild && child && isControlFlowEndingStatement(child.kind, parent));
        }
        SmartIndenter2.shouldIndentChildNode = shouldIndentChildNode;
        function rangeIsOnOneLine(sourceFile, range) {
          var rangeStart = ts2.skipTrivia(sourceFile.text, range.pos);
          var startLine = sourceFile.getLineAndCharacterOfPosition(rangeStart).line;
          var endLine = sourceFile.getLineAndCharacterOfPosition(range.end).line;
          return startLine === endLine;
        }
      })(SmartIndenter = formatting2.SmartIndenter || (formatting2.SmartIndenter = {}));
    })(formatting = ts2.formatting || (ts2.formatting = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var textChanges;
    (function(textChanges_3) {
      function getPos(n) {
        var result = n.__pos;
        ts2.Debug.assert(typeof result === "number");
        return result;
      }
      function setPos(n, pos) {
        ts2.Debug.assert(typeof pos === "number");
        n.__pos = pos;
      }
      function getEnd(n) {
        var result = n.__end;
        ts2.Debug.assert(typeof result === "number");
        return result;
      }
      function setEnd(n, end) {
        ts2.Debug.assert(typeof end === "number");
        n.__end = end;
      }
      var LeadingTriviaOption;
      (function(LeadingTriviaOption2) {
        LeadingTriviaOption2[LeadingTriviaOption2["Exclude"] = 0] = "Exclude";
        LeadingTriviaOption2[LeadingTriviaOption2["IncludeAll"] = 1] = "IncludeAll";
        LeadingTriviaOption2[LeadingTriviaOption2["JSDoc"] = 2] = "JSDoc";
        LeadingTriviaOption2[LeadingTriviaOption2["StartLine"] = 3] = "StartLine";
      })(LeadingTriviaOption = textChanges_3.LeadingTriviaOption || (textChanges_3.LeadingTriviaOption = {}));
      var TrailingTriviaOption;
      (function(TrailingTriviaOption2) {
        TrailingTriviaOption2[TrailingTriviaOption2["Exclude"] = 0] = "Exclude";
        TrailingTriviaOption2[TrailingTriviaOption2["ExcludeWhitespace"] = 1] = "ExcludeWhitespace";
        TrailingTriviaOption2[TrailingTriviaOption2["Include"] = 2] = "Include";
      })(TrailingTriviaOption = textChanges_3.TrailingTriviaOption || (textChanges_3.TrailingTriviaOption = {}));
      function skipWhitespacesAndLineBreaks(text, start) {
        return ts2.skipTrivia(text, start, false, true);
      }
      function hasCommentsBeforeLineBreak(text, start) {
        var i = start;
        while (i < text.length) {
          var ch = text.charCodeAt(i);
          if (ts2.isWhiteSpaceSingleLine(ch)) {
            i++;
            continue;
          }
          return ch === 47;
        }
        return false;
      }
      var useNonAdjustedPositions = {
        leadingTriviaOption: LeadingTriviaOption.Exclude,
        trailingTriviaOption: TrailingTriviaOption.Exclude
      };
      var ChangeKind;
      (function(ChangeKind2) {
        ChangeKind2[ChangeKind2["Remove"] = 0] = "Remove";
        ChangeKind2[ChangeKind2["ReplaceWithSingleNode"] = 1] = "ReplaceWithSingleNode";
        ChangeKind2[ChangeKind2["ReplaceWithMultipleNodes"] = 2] = "ReplaceWithMultipleNodes";
        ChangeKind2[ChangeKind2["Text"] = 3] = "Text";
      })(ChangeKind || (ChangeKind = {}));
      function getAdjustedRange(sourceFile, startNode, endNode, options) {
        return { pos: getAdjustedStartPosition(sourceFile, startNode, options), end: getAdjustedEndPosition(sourceFile, endNode, options) };
      }
      function getAdjustedStartPosition(sourceFile, node, options, hasTrailingComment) {
        var _a, _b;
        if (hasTrailingComment === void 0) {
          hasTrailingComment = false;
        }
        var leadingTriviaOption = options.leadingTriviaOption;
        if (leadingTriviaOption === LeadingTriviaOption.Exclude) {
          return node.getStart(sourceFile);
        }
        if (leadingTriviaOption === LeadingTriviaOption.StartLine) {
          var startPos = node.getStart(sourceFile);
          var pos = ts2.getLineStartPositionForPosition(startPos, sourceFile);
          return ts2.rangeContainsPosition(node, pos) ? pos : startPos;
        }
        if (leadingTriviaOption === LeadingTriviaOption.JSDoc) {
          var JSDocComments = ts2.getJSDocCommentRanges(node, sourceFile.text);
          if (JSDocComments === null || JSDocComments === void 0 ? void 0 : JSDocComments.length) {
            return ts2.getLineStartPositionForPosition(JSDocComments[0].pos, sourceFile);
          }
        }
        var fullStart = node.getFullStart();
        var start = node.getStart(sourceFile);
        if (fullStart === start) {
          return start;
        }
        var fullStartLine = ts2.getLineStartPositionForPosition(fullStart, sourceFile);
        var startLine = ts2.getLineStartPositionForPosition(start, sourceFile);
        if (startLine === fullStartLine) {
          return leadingTriviaOption === LeadingTriviaOption.IncludeAll ? fullStart : start;
        }
        if (hasTrailingComment) {
          var comment = ((_a = ts2.getLeadingCommentRanges(sourceFile.text, fullStart)) === null || _a === void 0 ? void 0 : _a[0]) || ((_b = ts2.getTrailingCommentRanges(sourceFile.text, fullStart)) === null || _b === void 0 ? void 0 : _b[0]);
          if (comment) {
            return ts2.skipTrivia(sourceFile.text, comment.end, true, true);
          }
        }
        var nextLineStart = fullStart > 0 ? 1 : 0;
        var adjustedStartPosition = ts2.getStartPositionOfLine(ts2.getLineOfLocalPosition(sourceFile, fullStartLine) + nextLineStart, sourceFile);
        adjustedStartPosition = skipWhitespacesAndLineBreaks(sourceFile.text, adjustedStartPosition);
        return ts2.getStartPositionOfLine(ts2.getLineOfLocalPosition(sourceFile, adjustedStartPosition), sourceFile);
      }
      function getEndPositionOfMultilineTrailingComment(sourceFile, node, options) {
        var end = node.end;
        var trailingTriviaOption = options.trailingTriviaOption;
        if (trailingTriviaOption === TrailingTriviaOption.Include) {
          var comments = ts2.getTrailingCommentRanges(sourceFile.text, end);
          if (comments) {
            var nodeEndLine = ts2.getLineOfLocalPosition(sourceFile, node.end);
            for (var _i = 0, comments_2 = comments; _i < comments_2.length; _i++) {
              var comment = comments_2[_i];
              if (comment.kind === 2 || ts2.getLineOfLocalPosition(sourceFile, comment.pos) > nodeEndLine) {
                break;
              }
              var commentEndLine = ts2.getLineOfLocalPosition(sourceFile, comment.end);
              if (commentEndLine > nodeEndLine) {
                return ts2.skipTrivia(sourceFile.text, comment.end, true, true);
              }
            }
          }
        }
        return void 0;
      }
      function getAdjustedEndPosition(sourceFile, node, options) {
        var _a;
        var end = node.end;
        var trailingTriviaOption = options.trailingTriviaOption;
        if (trailingTriviaOption === TrailingTriviaOption.Exclude) {
          return end;
        }
        if (trailingTriviaOption === TrailingTriviaOption.ExcludeWhitespace) {
          var comments = ts2.concatenate(ts2.getTrailingCommentRanges(sourceFile.text, end), ts2.getLeadingCommentRanges(sourceFile.text, end));
          var realEnd = (_a = comments === null || comments === void 0 ? void 0 : comments[comments.length - 1]) === null || _a === void 0 ? void 0 : _a.end;
          if (realEnd) {
            return realEnd;
          }
          return end;
        }
        var multilineEndPosition = getEndPositionOfMultilineTrailingComment(sourceFile, node, options);
        if (multilineEndPosition) {
          return multilineEndPosition;
        }
        var newEnd = ts2.skipTrivia(sourceFile.text, end, true);
        return newEnd !== end && (trailingTriviaOption === TrailingTriviaOption.Include || ts2.isLineBreak(sourceFile.text.charCodeAt(newEnd - 1))) ? newEnd : end;
      }
      function isSeparator(node, candidate) {
        return !!candidate && !!node.parent && (candidate.kind === 27 || candidate.kind === 26 && node.parent.kind === 204);
      }
      function isThisTypeAnnotatable(containingFunction) {
        return ts2.isFunctionExpression(containingFunction) || ts2.isFunctionDeclaration(containingFunction);
      }
      textChanges_3.isThisTypeAnnotatable = isThisTypeAnnotatable;
      var ChangeTracker = function() {
        function ChangeTracker2(newLineCharacter, formatContext) {
          this.newLineCharacter = newLineCharacter;
          this.formatContext = formatContext;
          this.changes = [];
          this.newFiles = [];
          this.classesWithNodesInsertedAtStart = new ts2.Map();
          this.deletedNodes = [];
        }
        ChangeTracker2.fromContext = function(context) {
          return new ChangeTracker2(ts2.getNewLineOrDefaultFromHost(context.host, context.formatContext.options), context.formatContext);
        };
        ChangeTracker2.with = function(context, cb) {
          var tracker = ChangeTracker2.fromContext(context);
          cb(tracker);
          return tracker.getChanges();
        };
        ChangeTracker2.prototype.pushRaw = function(sourceFile, change) {
          ts2.Debug.assertEqual(sourceFile.fileName, change.fileName);
          for (var _i = 0, _a = change.textChanges; _i < _a.length; _i++) {
            var c = _a[_i];
            this.changes.push({
              kind: ChangeKind.Text,
              sourceFile,
              text: c.newText,
              range: ts2.createTextRangeFromSpan(c.span)
            });
          }
        };
        ChangeTracker2.prototype.deleteRange = function(sourceFile, range) {
          this.changes.push({ kind: ChangeKind.Remove, sourceFile, range });
        };
        ChangeTracker2.prototype.delete = function(sourceFile, node) {
          this.deletedNodes.push({ sourceFile, node });
        };
        ChangeTracker2.prototype.deleteNode = function(sourceFile, node, options) {
          if (options === void 0) {
            options = { leadingTriviaOption: LeadingTriviaOption.IncludeAll };
          }
          this.deleteRange(sourceFile, getAdjustedRange(sourceFile, node, node, options));
        };
        ChangeTracker2.prototype.deleteNodes = function(sourceFile, nodes, options, hasTrailingComment) {
          if (options === void 0) {
            options = { leadingTriviaOption: LeadingTriviaOption.IncludeAll };
          }
          for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
            var node = nodes_1[_i];
            var pos = getAdjustedStartPosition(sourceFile, node, options, hasTrailingComment);
            var end = getAdjustedEndPosition(sourceFile, node, options);
            this.deleteRange(sourceFile, { pos, end });
            hasTrailingComment = !!getEndPositionOfMultilineTrailingComment(sourceFile, node, options);
          }
        };
        ChangeTracker2.prototype.deleteModifier = function(sourceFile, modifier) {
          this.deleteRange(sourceFile, { pos: modifier.getStart(sourceFile), end: ts2.skipTrivia(sourceFile.text, modifier.end, true) });
        };
        ChangeTracker2.prototype.deleteNodeRange = function(sourceFile, startNode, endNode, options) {
          if (options === void 0) {
            options = { leadingTriviaOption: LeadingTriviaOption.IncludeAll };
          }
          var startPosition = getAdjustedStartPosition(sourceFile, startNode, options);
          var endPosition = getAdjustedEndPosition(sourceFile, endNode, options);
          this.deleteRange(sourceFile, { pos: startPosition, end: endPosition });
        };
        ChangeTracker2.prototype.deleteNodeRangeExcludingEnd = function(sourceFile, startNode, afterEndNode, options) {
          if (options === void 0) {
            options = { leadingTriviaOption: LeadingTriviaOption.IncludeAll };
          }
          var startPosition = getAdjustedStartPosition(sourceFile, startNode, options);
          var endPosition = afterEndNode === void 0 ? sourceFile.text.length : getAdjustedStartPosition(sourceFile, afterEndNode, options);
          this.deleteRange(sourceFile, { pos: startPosition, end: endPosition });
        };
        ChangeTracker2.prototype.replaceRange = function(sourceFile, range, newNode, options) {
          if (options === void 0) {
            options = {};
          }
          this.changes.push({ kind: ChangeKind.ReplaceWithSingleNode, sourceFile, range, options, node: newNode });
        };
        ChangeTracker2.prototype.replaceNode = function(sourceFile, oldNode, newNode, options) {
          if (options === void 0) {
            options = useNonAdjustedPositions;
          }
          this.replaceRange(sourceFile, getAdjustedRange(sourceFile, oldNode, oldNode, options), newNode, options);
        };
        ChangeTracker2.prototype.replaceNodeRange = function(sourceFile, startNode, endNode, newNode, options) {
          if (options === void 0) {
            options = useNonAdjustedPositions;
          }
          this.replaceRange(sourceFile, getAdjustedRange(sourceFile, startNode, endNode, options), newNode, options);
        };
        ChangeTracker2.prototype.replaceRangeWithNodes = function(sourceFile, range, newNodes, options) {
          if (options === void 0) {
            options = {};
          }
          this.changes.push({ kind: ChangeKind.ReplaceWithMultipleNodes, sourceFile, range, options, nodes: newNodes });
        };
        ChangeTracker2.prototype.replaceNodeWithNodes = function(sourceFile, oldNode, newNodes, options) {
          if (options === void 0) {
            options = useNonAdjustedPositions;
          }
          this.replaceRangeWithNodes(sourceFile, getAdjustedRange(sourceFile, oldNode, oldNode, options), newNodes, options);
        };
        ChangeTracker2.prototype.replaceNodeWithText = function(sourceFile, oldNode, text) {
          this.replaceRangeWithText(sourceFile, getAdjustedRange(sourceFile, oldNode, oldNode, useNonAdjustedPositions), text);
        };
        ChangeTracker2.prototype.replaceNodeRangeWithNodes = function(sourceFile, startNode, endNode, newNodes, options) {
          if (options === void 0) {
            options = useNonAdjustedPositions;
          }
          this.replaceRangeWithNodes(sourceFile, getAdjustedRange(sourceFile, startNode, endNode, options), newNodes, options);
        };
        ChangeTracker2.prototype.nodeHasTrailingComment = function(sourceFile, oldNode, configurableEnd) {
          if (configurableEnd === void 0) {
            configurableEnd = useNonAdjustedPositions;
          }
          return !!getEndPositionOfMultilineTrailingComment(sourceFile, oldNode, configurableEnd);
        };
        ChangeTracker2.prototype.nextCommaToken = function(sourceFile, node) {
          var next = ts2.findNextToken(node, node.parent, sourceFile);
          return next && next.kind === 27 ? next : void 0;
        };
        ChangeTracker2.prototype.replacePropertyAssignment = function(sourceFile, oldNode, newNode) {
          var suffix = this.nextCommaToken(sourceFile, oldNode) ? "" : "," + this.newLineCharacter;
          this.replaceNode(sourceFile, oldNode, newNode, { suffix });
        };
        ChangeTracker2.prototype.insertNodeAt = function(sourceFile, pos, newNode, options) {
          if (options === void 0) {
            options = {};
          }
          this.replaceRange(sourceFile, ts2.createRange(pos), newNode, options);
        };
        ChangeTracker2.prototype.insertNodesAt = function(sourceFile, pos, newNodes, options) {
          if (options === void 0) {
            options = {};
          }
          this.replaceRangeWithNodes(sourceFile, ts2.createRange(pos), newNodes, options);
        };
        ChangeTracker2.prototype.insertNodeAtTopOfFile = function(sourceFile, newNode, blankLineBetween) {
          this.insertAtTopOfFile(sourceFile, newNode, blankLineBetween);
        };
        ChangeTracker2.prototype.insertNodesAtTopOfFile = function(sourceFile, newNodes, blankLineBetween) {
          this.insertAtTopOfFile(sourceFile, newNodes, blankLineBetween);
        };
        ChangeTracker2.prototype.insertAtTopOfFile = function(sourceFile, insert, blankLineBetween) {
          var pos = getInsertionPositionAtSourceFileTop(sourceFile);
          var options = {
            prefix: pos === 0 ? void 0 : this.newLineCharacter,
            suffix: (ts2.isLineBreak(sourceFile.text.charCodeAt(pos)) ? "" : this.newLineCharacter) + (blankLineBetween ? this.newLineCharacter : "")
          };
          if (ts2.isArray(insert)) {
            this.insertNodesAt(sourceFile, pos, insert, options);
          } else {
            this.insertNodeAt(sourceFile, pos, insert, options);
          }
        };
        ChangeTracker2.prototype.insertFirstParameter = function(sourceFile, parameters, newParam) {
          var p0 = ts2.firstOrUndefined(parameters);
          if (p0) {
            this.insertNodeBefore(sourceFile, p0, newParam);
          } else {
            this.insertNodeAt(sourceFile, parameters.pos, newParam);
          }
        };
        ChangeTracker2.prototype.insertNodeBefore = function(sourceFile, before, newNode, blankLineBetween, options) {
          if (blankLineBetween === void 0) {
            blankLineBetween = false;
          }
          if (options === void 0) {
            options = {};
          }
          this.insertNodeAt(sourceFile, getAdjustedStartPosition(sourceFile, before, options), newNode, this.getOptionsForInsertNodeBefore(before, newNode, blankLineBetween));
        };
        ChangeTracker2.prototype.insertModifierAt = function(sourceFile, pos, modifier, options) {
          if (options === void 0) {
            options = {};
          }
          this.insertNodeAt(sourceFile, pos, ts2.factory.createToken(modifier), options);
        };
        ChangeTracker2.prototype.insertModifierBefore = function(sourceFile, modifier, before) {
          return this.insertModifierAt(sourceFile, before.getStart(sourceFile), modifier, { suffix: " " });
        };
        ChangeTracker2.prototype.insertCommentBeforeLine = function(sourceFile, lineNumber, position, commentText) {
          var lineStartPosition = ts2.getStartPositionOfLine(lineNumber, sourceFile);
          var startPosition = ts2.getFirstNonSpaceCharacterPosition(sourceFile.text, lineStartPosition);
          var insertAtLineStart = isValidLocationToAddComment(sourceFile, startPosition);
          var token = ts2.getTouchingToken(sourceFile, insertAtLineStart ? startPosition : position);
          var indent = sourceFile.text.slice(lineStartPosition, startPosition);
          var text = "".concat(insertAtLineStart ? "" : this.newLineCharacter, "//").concat(commentText).concat(this.newLineCharacter).concat(indent);
          this.insertText(sourceFile, token.getStart(sourceFile), text);
        };
        ChangeTracker2.prototype.insertJsdocCommentBefore = function(sourceFile, node, tag) {
          var fnStart = node.getStart(sourceFile);
          if (node.jsDoc) {
            for (var _i = 0, _a = node.jsDoc; _i < _a.length; _i++) {
              var jsdoc = _a[_i];
              this.deleteRange(sourceFile, {
                pos: ts2.getLineStartPositionForPosition(jsdoc.getStart(sourceFile), sourceFile),
                end: getAdjustedEndPosition(sourceFile, jsdoc, {})
              });
            }
          }
          var startPosition = ts2.getPrecedingNonSpaceCharacterPosition(sourceFile.text, fnStart - 1);
          var indent = sourceFile.text.slice(startPosition, fnStart);
          this.insertNodeAt(sourceFile, fnStart, tag, { preserveLeadingWhitespace: false, suffix: this.newLineCharacter + indent });
        };
        ChangeTracker2.prototype.replaceRangeWithText = function(sourceFile, range, text) {
          this.changes.push({ kind: ChangeKind.Text, sourceFile, range, text });
        };
        ChangeTracker2.prototype.insertText = function(sourceFile, pos, text) {
          this.replaceRangeWithText(sourceFile, ts2.createRange(pos), text);
        };
        ChangeTracker2.prototype.tryInsertTypeAnnotation = function(sourceFile, node, type) {
          var _a;
          var endNode;
          if (ts2.isFunctionLike(node)) {
            endNode = ts2.findChildOfKind(node, 21, sourceFile);
            if (!endNode) {
              if (!ts2.isArrowFunction(node))
                return false;
              endNode = ts2.first(node.parameters);
            }
          } else {
            endNode = (_a = node.kind === 253 ? node.exclamationToken : node.questionToken) !== null && _a !== void 0 ? _a : node.name;
          }
          this.insertNodeAt(sourceFile, endNode.end, type, { prefix: ": " });
          return true;
        };
        ChangeTracker2.prototype.tryInsertThisTypeAnnotation = function(sourceFile, node, type) {
          var start = ts2.findChildOfKind(node, 20, sourceFile).getStart(sourceFile) + 1;
          var suffix = node.parameters.length ? ", " : "";
          this.insertNodeAt(sourceFile, start, type, { prefix: "this: ", suffix });
        };
        ChangeTracker2.prototype.insertTypeParameters = function(sourceFile, node, typeParameters) {
          var start = (ts2.findChildOfKind(node, 20, sourceFile) || ts2.first(node.parameters)).getStart(sourceFile);
          this.insertNodesAt(sourceFile, start, typeParameters, { prefix: "<", suffix: ">", joiner: ", " });
        };
        ChangeTracker2.prototype.getOptionsForInsertNodeBefore = function(before, inserted, blankLineBetween) {
          if (ts2.isStatement(before) || ts2.isClassElement(before)) {
            return { suffix: blankLineBetween ? this.newLineCharacter + this.newLineCharacter : this.newLineCharacter };
          } else if (ts2.isVariableDeclaration(before)) {
            return { suffix: ", " };
          } else if (ts2.isParameter(before)) {
            return ts2.isParameter(inserted) ? { suffix: ", " } : {};
          } else if (ts2.isStringLiteral(before) && ts2.isImportDeclaration(before.parent) || ts2.isNamedImports(before)) {
            return { suffix: ", " };
          } else if (ts2.isImportSpecifier(before)) {
            return { suffix: "," + (blankLineBetween ? this.newLineCharacter : " ") };
          }
          return ts2.Debug.failBadSyntaxKind(before);
        };
        ChangeTracker2.prototype.insertNodeAtConstructorStart = function(sourceFile, ctr, newStatement) {
          var firstStatement = ts2.firstOrUndefined(ctr.body.statements);
          if (!firstStatement || !ctr.body.multiLine) {
            this.replaceConstructorBody(sourceFile, ctr, __spreadArray([newStatement], ctr.body.statements, true));
          } else {
            this.insertNodeBefore(sourceFile, firstStatement, newStatement);
          }
        };
        ChangeTracker2.prototype.insertNodeAtConstructorStartAfterSuperCall = function(sourceFile, ctr, newStatement) {
          var superCallStatement = ts2.find(ctr.body.statements, function(stmt) {
            return ts2.isExpressionStatement(stmt) && ts2.isSuperCall(stmt.expression);
          });
          if (!superCallStatement || !ctr.body.multiLine) {
            this.replaceConstructorBody(sourceFile, ctr, __spreadArray(__spreadArray([], ctr.body.statements, true), [newStatement], false));
          } else {
            this.insertNodeAfter(sourceFile, superCallStatement, newStatement);
          }
        };
        ChangeTracker2.prototype.insertNodeAtConstructorEnd = function(sourceFile, ctr, newStatement) {
          var lastStatement = ts2.lastOrUndefined(ctr.body.statements);
          if (!lastStatement || !ctr.body.multiLine) {
            this.replaceConstructorBody(sourceFile, ctr, __spreadArray(__spreadArray([], ctr.body.statements, true), [newStatement], false));
          } else {
            this.insertNodeAfter(sourceFile, lastStatement, newStatement);
          }
        };
        ChangeTracker2.prototype.replaceConstructorBody = function(sourceFile, ctr, statements) {
          this.replaceNode(sourceFile, ctr.body, ts2.factory.createBlock(statements, true));
        };
        ChangeTracker2.prototype.insertNodeAtEndOfScope = function(sourceFile, scope, newNode) {
          var pos = getAdjustedStartPosition(sourceFile, scope.getLastToken(), {});
          this.insertNodeAt(sourceFile, pos, newNode, {
            prefix: ts2.isLineBreak(sourceFile.text.charCodeAt(scope.getLastToken().pos)) ? this.newLineCharacter : this.newLineCharacter + this.newLineCharacter,
            suffix: this.newLineCharacter
          });
        };
        ChangeTracker2.prototype.insertNodeAtClassStart = function(sourceFile, cls, newElement) {
          this.insertNodeAtStartWorker(sourceFile, cls, newElement);
        };
        ChangeTracker2.prototype.insertNodeAtObjectStart = function(sourceFile, obj, newElement) {
          this.insertNodeAtStartWorker(sourceFile, obj, newElement);
        };
        ChangeTracker2.prototype.insertNodeAtStartWorker = function(sourceFile, cls, newElement) {
          var _a;
          var indentation = (_a = this.guessIndentationFromExistingMembers(sourceFile, cls)) !== null && _a !== void 0 ? _a : this.computeIndentationForNewMember(sourceFile, cls);
          this.insertNodeAt(sourceFile, getMembersOrProperties(cls).pos, newElement, this.getInsertNodeAtStartInsertOptions(sourceFile, cls, indentation));
        };
        ChangeTracker2.prototype.guessIndentationFromExistingMembers = function(sourceFile, cls) {
          var indentation;
          var lastRange = cls;
          for (var _i = 0, _a = getMembersOrProperties(cls); _i < _a.length; _i++) {
            var member = _a[_i];
            if (ts2.rangeStartPositionsAreOnSameLine(lastRange, member, sourceFile)) {
              return void 0;
            }
            var memberStart = member.getStart(sourceFile);
            var memberIndentation = ts2.formatting.SmartIndenter.findFirstNonWhitespaceColumn(ts2.getLineStartPositionForPosition(memberStart, sourceFile), memberStart, sourceFile, this.formatContext.options);
            if (indentation === void 0) {
              indentation = memberIndentation;
            } else if (memberIndentation !== indentation) {
              return void 0;
            }
            lastRange = member;
          }
          return indentation;
        };
        ChangeTracker2.prototype.computeIndentationForNewMember = function(sourceFile, cls) {
          var _a;
          var clsStart = cls.getStart(sourceFile);
          return ts2.formatting.SmartIndenter.findFirstNonWhitespaceColumn(ts2.getLineStartPositionForPosition(clsStart, sourceFile), clsStart, sourceFile, this.formatContext.options) + ((_a = this.formatContext.options.indentSize) !== null && _a !== void 0 ? _a : 4);
        };
        ChangeTracker2.prototype.getInsertNodeAtStartInsertOptions = function(sourceFile, cls, indentation) {
          var members = getMembersOrProperties(cls);
          var isEmpty = members.length === 0;
          var isFirstInsertion = ts2.addToSeen(this.classesWithNodesInsertedAtStart, ts2.getNodeId(cls), { node: cls, sourceFile });
          var insertTrailingComma = ts2.isObjectLiteralExpression(cls) && (!ts2.isJsonSourceFile(sourceFile) || !isEmpty);
          var insertLeadingComma = ts2.isObjectLiteralExpression(cls) && ts2.isJsonSourceFile(sourceFile) && isEmpty && !isFirstInsertion;
          return {
            indentation,
            prefix: (insertLeadingComma ? "," : "") + this.newLineCharacter,
            suffix: insertTrailingComma ? "," : ""
          };
        };
        ChangeTracker2.prototype.insertNodeAfterComma = function(sourceFile, after, newNode) {
          var endPosition = this.insertNodeAfterWorker(sourceFile, this.nextCommaToken(sourceFile, after) || after, newNode);
          this.insertNodeAt(sourceFile, endPosition, newNode, this.getInsertNodeAfterOptions(sourceFile, after));
        };
        ChangeTracker2.prototype.insertNodeAfter = function(sourceFile, after, newNode) {
          var endPosition = this.insertNodeAfterWorker(sourceFile, after, newNode);
          this.insertNodeAt(sourceFile, endPosition, newNode, this.getInsertNodeAfterOptions(sourceFile, after));
        };
        ChangeTracker2.prototype.insertNodeAtEndOfList = function(sourceFile, list, newNode) {
          this.insertNodeAt(sourceFile, list.end, newNode, { prefix: ", " });
        };
        ChangeTracker2.prototype.insertNodesAfter = function(sourceFile, after, newNodes) {
          var endPosition = this.insertNodeAfterWorker(sourceFile, after, ts2.first(newNodes));
          this.insertNodesAt(sourceFile, endPosition, newNodes, this.getInsertNodeAfterOptions(sourceFile, after));
        };
        ChangeTracker2.prototype.insertNodeAfterWorker = function(sourceFile, after, newNode) {
          if (needSemicolonBetween(after, newNode)) {
            if (sourceFile.text.charCodeAt(after.end - 1) !== 59) {
              this.replaceRange(sourceFile, ts2.createRange(after.end), ts2.factory.createToken(26));
            }
          }
          var endPosition = getAdjustedEndPosition(sourceFile, after, {});
          return endPosition;
        };
        ChangeTracker2.prototype.getInsertNodeAfterOptions = function(sourceFile, after) {
          var options = this.getInsertNodeAfterOptionsWorker(after);
          return __assign(__assign({}, options), { prefix: after.end === sourceFile.end && ts2.isStatement(after) ? options.prefix ? "\n".concat(options.prefix) : "\n" : options.prefix });
        };
        ChangeTracker2.prototype.getInsertNodeAfterOptionsWorker = function(node) {
          switch (node.kind) {
            case 256:
            case 260:
              return { prefix: this.newLineCharacter, suffix: this.newLineCharacter };
            case 253:
            case 10:
            case 79:
              return { prefix: ", " };
            case 294:
              return { suffix: "," + this.newLineCharacter };
            case 93:
              return { prefix: " " };
            case 163:
              return {};
            default:
              ts2.Debug.assert(ts2.isStatement(node) || ts2.isClassOrTypeElement(node));
              return { suffix: this.newLineCharacter };
          }
        };
        ChangeTracker2.prototype.insertName = function(sourceFile, node, name) {
          ts2.Debug.assert(!node.name);
          if (node.kind === 213) {
            var arrow = ts2.findChildOfKind(node, 38, sourceFile);
            var lparen = ts2.findChildOfKind(node, 20, sourceFile);
            if (lparen) {
              this.insertNodesAt(sourceFile, lparen.getStart(sourceFile), [ts2.factory.createToken(98), ts2.factory.createIdentifier(name)], { joiner: " " });
              deleteNode(this, sourceFile, arrow);
            } else {
              this.insertText(sourceFile, ts2.first(node.parameters).getStart(sourceFile), "function ".concat(name, "("));
              this.replaceRange(sourceFile, arrow, ts2.factory.createToken(21));
            }
            if (node.body.kind !== 234) {
              this.insertNodesAt(sourceFile, node.body.getStart(sourceFile), [ts2.factory.createToken(18), ts2.factory.createToken(105)], { joiner: " ", suffix: " " });
              this.insertNodesAt(sourceFile, node.body.end, [ts2.factory.createToken(26), ts2.factory.createToken(19)], { joiner: " " });
            }
          } else {
            var pos = ts2.findChildOfKind(node, node.kind === 212 ? 98 : 84, sourceFile).end;
            this.insertNodeAt(sourceFile, pos, ts2.factory.createIdentifier(name), { prefix: " " });
          }
        };
        ChangeTracker2.prototype.insertExportModifier = function(sourceFile, node) {
          this.insertText(sourceFile, node.getStart(sourceFile), "export ");
        };
        ChangeTracker2.prototype.insertNodeInListAfter = function(sourceFile, after, newNode, containingList) {
          if (containingList === void 0) {
            containingList = ts2.formatting.SmartIndenter.getContainingList(after, sourceFile);
          }
          if (!containingList) {
            ts2.Debug.fail("node is not a list element");
            return;
          }
          var index = ts2.indexOfNode(containingList, after);
          if (index < 0) {
            return;
          }
          var end = after.getEnd();
          if (index !== containingList.length - 1) {
            var nextToken = ts2.getTokenAtPosition(sourceFile, after.end);
            if (nextToken && isSeparator(after, nextToken)) {
              var nextNode = containingList[index + 1];
              var startPos = skipWhitespacesAndLineBreaks(sourceFile.text, nextNode.getFullStart());
              var suffix = "".concat(ts2.tokenToString(nextToken.kind)).concat(sourceFile.text.substring(nextToken.end, startPos));
              this.insertNodesAt(sourceFile, startPos, [newNode], { suffix });
            }
          } else {
            var afterStart = after.getStart(sourceFile);
            var afterStartLinePosition = ts2.getLineStartPositionForPosition(afterStart, sourceFile);
            var separator = void 0;
            var multilineList = false;
            if (containingList.length === 1) {
              separator = 27;
            } else {
              var tokenBeforeInsertPosition = ts2.findPrecedingToken(after.pos, sourceFile);
              separator = isSeparator(after, tokenBeforeInsertPosition) ? tokenBeforeInsertPosition.kind : 27;
              var afterMinusOneStartLinePosition = ts2.getLineStartPositionForPosition(containingList[index - 1].getStart(sourceFile), sourceFile);
              multilineList = afterMinusOneStartLinePosition !== afterStartLinePosition;
            }
            if (hasCommentsBeforeLineBreak(sourceFile.text, after.end)) {
              multilineList = true;
            }
            if (multilineList) {
              this.replaceRange(sourceFile, ts2.createRange(end), ts2.factory.createToken(separator));
              var indentation = ts2.formatting.SmartIndenter.findFirstNonWhitespaceColumn(afterStartLinePosition, afterStart, sourceFile, this.formatContext.options);
              var insertPos = ts2.skipTrivia(sourceFile.text, end, true, false);
              while (insertPos !== end && ts2.isLineBreak(sourceFile.text.charCodeAt(insertPos - 1))) {
                insertPos--;
              }
              this.replaceRange(sourceFile, ts2.createRange(insertPos), newNode, { indentation, prefix: this.newLineCharacter });
            } else {
              this.replaceRange(sourceFile, ts2.createRange(end), newNode, { prefix: "".concat(ts2.tokenToString(separator), " ") });
            }
          }
        };
        ChangeTracker2.prototype.parenthesizeExpression = function(sourceFile, expression) {
          this.replaceRange(sourceFile, ts2.rangeOfNode(expression), ts2.factory.createParenthesizedExpression(expression));
        };
        ChangeTracker2.prototype.finishClassesWithNodesInsertedAtStart = function() {
          var _this = this;
          this.classesWithNodesInsertedAtStart.forEach(function(_a) {
            var node = _a.node, sourceFile = _a.sourceFile;
            var _b = getClassOrObjectBraceEnds(node, sourceFile), openBraceEnd = _b[0], closeBraceEnd = _b[1];
            if (openBraceEnd !== void 0 && closeBraceEnd !== void 0) {
              var isEmpty = getMembersOrProperties(node).length === 0;
              var isSingleLine = ts2.positionsAreOnSameLine(openBraceEnd, closeBraceEnd, sourceFile);
              if (isEmpty && isSingleLine && openBraceEnd !== closeBraceEnd - 1) {
                _this.deleteRange(sourceFile, ts2.createRange(openBraceEnd, closeBraceEnd - 1));
              }
              if (isSingleLine) {
                _this.insertText(sourceFile, closeBraceEnd - 1, _this.newLineCharacter);
              }
            }
          });
        };
        ChangeTracker2.prototype.finishDeleteDeclarations = function() {
          var _this = this;
          var deletedNodesInLists = new ts2.Set();
          var _loop_11 = function(sourceFile2, node2) {
            if (!this_1.deletedNodes.some(function(d) {
              return d.sourceFile === sourceFile2 && ts2.rangeContainsRangeExclusive(d.node, node2);
            })) {
              if (ts2.isArray(node2)) {
                this_1.deleteRange(sourceFile2, ts2.rangeOfTypeParameters(sourceFile2, node2));
              } else {
                deleteDeclaration.deleteDeclaration(this_1, deletedNodesInLists, sourceFile2, node2);
              }
            }
          };
          var this_1 = this;
          for (var _i = 0, _a = this.deletedNodes; _i < _a.length; _i++) {
            var _b = _a[_i], sourceFile = _b.sourceFile, node = _b.node;
            _loop_11(sourceFile, node);
          }
          deletedNodesInLists.forEach(function(node2) {
            var sourceFile2 = node2.getSourceFile();
            var list = ts2.formatting.SmartIndenter.getContainingList(node2, sourceFile2);
            if (node2 !== ts2.last(list))
              return;
            var lastNonDeletedIndex = ts2.findLastIndex(list, function(n) {
              return !deletedNodesInLists.has(n);
            }, list.length - 2);
            if (lastNonDeletedIndex !== -1) {
              _this.deleteRange(sourceFile2, { pos: list[lastNonDeletedIndex].end, end: startPositionToDeleteNodeInList(sourceFile2, list[lastNonDeletedIndex + 1]) });
            }
          });
        };
        ChangeTracker2.prototype.getChanges = function(validate) {
          this.finishDeleteDeclarations();
          this.finishClassesWithNodesInsertedAtStart();
          var changes = changesToText.getTextChangesFromChanges(this.changes, this.newLineCharacter, this.formatContext, validate);
          for (var _i = 0, _a = this.newFiles; _i < _a.length; _i++) {
            var _b = _a[_i], oldFile = _b.oldFile, fileName = _b.fileName, statements = _b.statements;
            changes.push(changesToText.newFileChanges(oldFile, fileName, statements, this.newLineCharacter, this.formatContext));
          }
          return changes;
        };
        ChangeTracker2.prototype.createNewFile = function(oldFile, fileName, statements) {
          this.newFiles.push({ oldFile, fileName, statements });
        };
        return ChangeTracker2;
      }();
      textChanges_3.ChangeTracker = ChangeTracker;
      function startPositionToDeleteNodeInList(sourceFile, node) {
        return ts2.skipTrivia(sourceFile.text, getAdjustedStartPosition(sourceFile, node, { leadingTriviaOption: LeadingTriviaOption.IncludeAll }), false, true);
      }
      function getClassOrObjectBraceEnds(cls, sourceFile) {
        var open = ts2.findChildOfKind(cls, 18, sourceFile);
        var close = ts2.findChildOfKind(cls, 19, sourceFile);
        return [open === null || open === void 0 ? void 0 : open.end, close === null || close === void 0 ? void 0 : close.end];
      }
      function getMembersOrProperties(cls) {
        return ts2.isObjectLiteralExpression(cls) ? cls.properties : cls.members;
      }
      function getNewFileText(statements, scriptKind, newLineCharacter, formatContext) {
        return changesToText.newFileChangesWorker(void 0, scriptKind, statements, newLineCharacter, formatContext);
      }
      textChanges_3.getNewFileText = getNewFileText;
      var changesToText;
      (function(changesToText2) {
        function getTextChangesFromChanges(changes, newLineCharacter, formatContext, validate) {
          return ts2.mapDefined(ts2.group(changes, function(c) {
            return c.sourceFile.path;
          }), function(changesInFile) {
            var sourceFile = changesInFile[0].sourceFile;
            var normalized = ts2.stableSort(changesInFile, function(a, b) {
              return a.range.pos - b.range.pos || a.range.end - b.range.end;
            });
            var _loop_12 = function(i2) {
              ts2.Debug.assert(normalized[i2].range.end <= normalized[i2 + 1].range.pos, "Changes overlap", function() {
                return "".concat(JSON.stringify(normalized[i2].range), " and ").concat(JSON.stringify(normalized[i2 + 1].range));
              });
            };
            for (var i = 0; i < normalized.length - 1; i++) {
              _loop_12(i);
            }
            var textChanges2 = ts2.mapDefined(normalized, function(c) {
              var span = ts2.createTextSpanFromRange(c.range);
              var newText = computeNewText(c, sourceFile, newLineCharacter, formatContext, validate);
              if (span.length === newText.length && ts2.stringContainsAt(sourceFile.text, newText, span.start)) {
                return void 0;
              }
              return ts2.createTextChange(span, newText);
            });
            return textChanges2.length > 0 ? { fileName: sourceFile.fileName, textChanges: textChanges2 } : void 0;
          });
        }
        changesToText2.getTextChangesFromChanges = getTextChangesFromChanges;
        function newFileChanges(oldFile, fileName, statements, newLineCharacter, formatContext) {
          var text = newFileChangesWorker(oldFile, ts2.getScriptKindFromFileName(fileName), statements, newLineCharacter, formatContext);
          return { fileName, textChanges: [ts2.createTextChange(ts2.createTextSpan(0, 0), text)], isNewFile: true };
        }
        changesToText2.newFileChanges = newFileChanges;
        function newFileChangesWorker(oldFile, scriptKind, statements, newLineCharacter, formatContext) {
          var nonFormattedText = statements.map(function(s) {
            return s === 4 ? "" : getNonformattedText(s, oldFile, newLineCharacter).text;
          }).join(newLineCharacter);
          var sourceFile = ts2.createSourceFile("any file name", nonFormattedText, 99, true, scriptKind);
          var changes = ts2.formatting.formatDocument(sourceFile, formatContext);
          return applyChanges(nonFormattedText, changes) + newLineCharacter;
        }
        changesToText2.newFileChangesWorker = newFileChangesWorker;
        function computeNewText(change, sourceFile, newLineCharacter, formatContext, validate) {
          var _a;
          if (change.kind === ChangeKind.Remove) {
            return "";
          }
          if (change.kind === ChangeKind.Text) {
            return change.text;
          }
          var _b = change.options, options = _b === void 0 ? {} : _b, pos = change.range.pos;
          var format = function(n) {
            return getFormattedTextOfNode(n, sourceFile, pos, options, newLineCharacter, formatContext, validate);
          };
          var text = change.kind === ChangeKind.ReplaceWithMultipleNodes ? change.nodes.map(function(n) {
            return ts2.removeSuffix(format(n), newLineCharacter);
          }).join(((_a = change.options) === null || _a === void 0 ? void 0 : _a.joiner) || newLineCharacter) : format(change.node);
          var noIndent = options.preserveLeadingWhitespace || options.indentation !== void 0 || ts2.getLineStartPositionForPosition(pos, sourceFile) === pos ? text : text.replace(/^\s+/, "");
          return (options.prefix || "") + noIndent + (!options.suffix || ts2.endsWith(noIndent, options.suffix) ? "" : options.suffix);
        }
        function getFormatCodeSettingsForWriting(_a, sourceFile) {
          var options = _a.options;
          var shouldAutoDetectSemicolonPreference = !options.semicolons || options.semicolons === ts2.SemicolonPreference.Ignore;
          var shouldRemoveSemicolons = options.semicolons === ts2.SemicolonPreference.Remove || shouldAutoDetectSemicolonPreference && !ts2.probablyUsesSemicolons(sourceFile);
          return __assign(__assign({}, options), { semicolons: shouldRemoveSemicolons ? ts2.SemicolonPreference.Remove : ts2.SemicolonPreference.Ignore });
        }
        function getFormattedTextOfNode(nodeIn, sourceFile, pos, _a, newLineCharacter, formatContext, validate) {
          var indentation = _a.indentation, prefix = _a.prefix, delta = _a.delta;
          var _b = getNonformattedText(nodeIn, sourceFile, newLineCharacter), node = _b.node, text = _b.text;
          if (validate)
            validate(node, text);
          var formatOptions = getFormatCodeSettingsForWriting(formatContext, sourceFile);
          var initialIndentation = indentation !== void 0 ? indentation : ts2.formatting.SmartIndenter.getIndentation(pos, sourceFile, formatOptions, prefix === newLineCharacter || ts2.getLineStartPositionForPosition(pos, sourceFile) === pos);
          if (delta === void 0) {
            delta = ts2.formatting.SmartIndenter.shouldIndentChildNode(formatOptions, nodeIn) ? formatOptions.indentSize || 0 : 0;
          }
          var file = {
            text,
            getLineAndCharacterOfPosition: function(pos2) {
              return ts2.getLineAndCharacterOfPosition(this, pos2);
            }
          };
          var changes = ts2.formatting.formatNodeGivenIndentation(node, file, sourceFile.languageVariant, initialIndentation, delta, __assign(__assign({}, formatContext), { options: formatOptions }));
          return applyChanges(text, changes);
        }
        function getNonformattedText(node, sourceFile, newLineCharacter) {
          var writer = createWriter(newLineCharacter);
          var newLine = ts2.getNewLineKind(newLineCharacter);
          ts2.createPrinter({
            newLine,
            neverAsciiEscape: true,
            preserveSourceNewlines: true,
            terminateUnterminatedLiterals: true
          }, writer).writeNode(4, node, sourceFile, writer);
          return { text: writer.getText(), node: assignPositionsToNode(node) };
        }
        changesToText2.getNonformattedText = getNonformattedText;
      })(changesToText || (changesToText = {}));
      function applyChanges(text, changes) {
        for (var i = changes.length - 1; i >= 0; i--) {
          var _a = changes[i], span = _a.span, newText = _a.newText;
          text = "".concat(text.substring(0, span.start)).concat(newText).concat(text.substring(ts2.textSpanEnd(span)));
        }
        return text;
      }
      textChanges_3.applyChanges = applyChanges;
      function isTrivia(s) {
        return ts2.skipTrivia(s, 0) === s.length;
      }
      function assignPositionsToNode(node) {
        var visited = ts2.visitEachChild(node, assignPositionsToNode, ts2.nullTransformationContext, assignPositionsToNodeArray, assignPositionsToNode);
        var newNode = ts2.nodeIsSynthesized(visited) ? visited : Object.create(visited);
        ts2.setTextRangePosEnd(newNode, getPos(node), getEnd(node));
        return newNode;
      }
      function assignPositionsToNodeArray(nodes, visitor, test, start, count) {
        var visited = ts2.visitNodes(nodes, visitor, test, start, count);
        if (!visited) {
          return visited;
        }
        var nodeArray = visited === nodes ? ts2.factory.createNodeArray(visited.slice(0)) : visited;
        ts2.setTextRangePosEnd(nodeArray, getPos(nodes), getEnd(nodes));
        return nodeArray;
      }
      function createWriter(newLine) {
        var lastNonTriviaPosition = 0;
        var writer = ts2.createTextWriter(newLine);
        var onBeforeEmitNode = function(node) {
          if (node) {
            setPos(node, lastNonTriviaPosition);
          }
        };
        var onAfterEmitNode = function(node) {
          if (node) {
            setEnd(node, lastNonTriviaPosition);
          }
        };
        var onBeforeEmitNodeArray = function(nodes) {
          if (nodes) {
            setPos(nodes, lastNonTriviaPosition);
          }
        };
        var onAfterEmitNodeArray = function(nodes) {
          if (nodes) {
            setEnd(nodes, lastNonTriviaPosition);
          }
        };
        var onBeforeEmitToken = function(node) {
          if (node) {
            setPos(node, lastNonTriviaPosition);
          }
        };
        var onAfterEmitToken = function(node) {
          if (node) {
            setEnd(node, lastNonTriviaPosition);
          }
        };
        function setLastNonTriviaPosition(s, force) {
          if (force || !isTrivia(s)) {
            lastNonTriviaPosition = writer.getTextPos();
            var i = 0;
            while (ts2.isWhiteSpaceLike(s.charCodeAt(s.length - i - 1))) {
              i++;
            }
            lastNonTriviaPosition -= i;
          }
        }
        function write(s) {
          writer.write(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeComment(s) {
          writer.writeComment(s);
        }
        function writeKeyword(s) {
          writer.writeKeyword(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeOperator(s) {
          writer.writeOperator(s);
          setLastNonTriviaPosition(s, false);
        }
        function writePunctuation(s) {
          writer.writePunctuation(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeTrailingSemicolon(s) {
          writer.writeTrailingSemicolon(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeParameter(s) {
          writer.writeParameter(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeProperty(s) {
          writer.writeProperty(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeSpace(s) {
          writer.writeSpace(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeStringLiteral(s) {
          writer.writeStringLiteral(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeSymbol(s, sym) {
          writer.writeSymbol(s, sym);
          setLastNonTriviaPosition(s, false);
        }
        function writeLine(force) {
          writer.writeLine(force);
        }
        function increaseIndent() {
          writer.increaseIndent();
        }
        function decreaseIndent() {
          writer.decreaseIndent();
        }
        function getText() {
          return writer.getText();
        }
        function rawWrite(s) {
          writer.rawWrite(s);
          setLastNonTriviaPosition(s, false);
        }
        function writeLiteral(s) {
          writer.writeLiteral(s);
          setLastNonTriviaPosition(s, true);
        }
        function getTextPos() {
          return writer.getTextPos();
        }
        function getLine() {
          return writer.getLine();
        }
        function getColumn() {
          return writer.getColumn();
        }
        function getIndent() {
          return writer.getIndent();
        }
        function isAtStartOfLine() {
          return writer.isAtStartOfLine();
        }
        function clear() {
          writer.clear();
          lastNonTriviaPosition = 0;
        }
        return {
          onBeforeEmitNode,
          onAfterEmitNode,
          onBeforeEmitNodeArray,
          onAfterEmitNodeArray,
          onBeforeEmitToken,
          onAfterEmitToken,
          write,
          writeComment,
          writeKeyword,
          writeOperator,
          writePunctuation,
          writeTrailingSemicolon,
          writeParameter,
          writeProperty,
          writeSpace,
          writeStringLiteral,
          writeSymbol,
          writeLine,
          increaseIndent,
          decreaseIndent,
          getText,
          rawWrite,
          writeLiteral,
          getTextPos,
          getLine,
          getColumn,
          getIndent,
          isAtStartOfLine,
          hasTrailingComment: function() {
            return writer.hasTrailingComment();
          },
          hasTrailingWhitespace: function() {
            return writer.hasTrailingWhitespace();
          },
          clear
        };
      }
      function getInsertionPositionAtSourceFileTop(sourceFile) {
        var lastPrologue;
        for (var _i = 0, _a = sourceFile.statements; _i < _a.length; _i++) {
          var node = _a[_i];
          if (ts2.isPrologueDirective(node)) {
            lastPrologue = node;
          } else {
            break;
          }
        }
        var position = 0;
        var text = sourceFile.text;
        if (lastPrologue) {
          position = lastPrologue.end;
          advancePastLineBreak();
          return position;
        }
        var shebang = ts2.getShebang(text);
        if (shebang !== void 0) {
          position = shebang.length;
          advancePastLineBreak();
        }
        var ranges = ts2.getLeadingCommentRanges(text, position);
        if (!ranges)
          return position;
        var lastComment;
        var firstNodeLine;
        for (var _b = 0, ranges_1 = ranges; _b < ranges_1.length; _b++) {
          var range = ranges_1[_b];
          if (range.kind === 3) {
            if (ts2.isPinnedComment(text, range.pos)) {
              lastComment = { range, pinnedOrTripleSlash: true };
              continue;
            }
          } else if (ts2.isRecognizedTripleSlashComment(text, range.pos, range.end)) {
            lastComment = { range, pinnedOrTripleSlash: true };
            continue;
          }
          if (lastComment) {
            if (lastComment.pinnedOrTripleSlash)
              break;
            var commentLine = sourceFile.getLineAndCharacterOfPosition(range.pos).line;
            var lastCommentEndLine = sourceFile.getLineAndCharacterOfPosition(lastComment.range.end).line;
            if (commentLine >= lastCommentEndLine + 2)
              break;
          }
          if (sourceFile.statements.length) {
            if (firstNodeLine === void 0)
              firstNodeLine = sourceFile.getLineAndCharacterOfPosition(sourceFile.statements[0].getStart()).line;
            var commentEndLine = sourceFile.getLineAndCharacterOfPosition(range.end).line;
            if (firstNodeLine < commentEndLine + 2)
              break;
          }
          lastComment = { range, pinnedOrTripleSlash: false };
        }
        if (lastComment) {
          position = lastComment.range.end;
          advancePastLineBreak();
        }
        return position;
        function advancePastLineBreak() {
          if (position < text.length) {
            var charCode = text.charCodeAt(position);
            if (ts2.isLineBreak(charCode)) {
              position++;
              if (position < text.length && charCode === 13 && text.charCodeAt(position) === 10) {
                position++;
              }
            }
          }
        }
      }
      function isValidLocationToAddComment(sourceFile, position) {
        return !ts2.isInComment(sourceFile, position) && !ts2.isInString(sourceFile, position) && !ts2.isInTemplateString(sourceFile, position) && !ts2.isInJSXText(sourceFile, position);
      }
      textChanges_3.isValidLocationToAddComment = isValidLocationToAddComment;
      function needSemicolonBetween(a, b) {
        return (ts2.isPropertySignature(a) || ts2.isPropertyDeclaration(a)) && ts2.isClassOrTypeElement(b) && b.name.kind === 161 || ts2.isStatementButNotDeclaration(a) && ts2.isStatementButNotDeclaration(b);
      }
      var deleteDeclaration;
      (function(deleteDeclaration_1) {
        function deleteDeclaration2(changes, deletedNodesInLists, sourceFile, node) {
          switch (node.kind) {
            case 163: {
              var oldFunction = node.parent;
              if (ts2.isArrowFunction(oldFunction) && oldFunction.parameters.length === 1 && !ts2.findChildOfKind(oldFunction, 20, sourceFile)) {
                changes.replaceNodeWithText(sourceFile, node, "()");
              } else {
                deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
              }
              break;
            }
            case 265:
            case 264:
              var isFirstImport = sourceFile.imports.length && node === ts2.first(sourceFile.imports).parent || node === ts2.find(sourceFile.statements, ts2.isAnyImportSyntax);
              deleteNode(changes, sourceFile, node, {
                leadingTriviaOption: isFirstImport ? LeadingTriviaOption.Exclude : ts2.hasJSDocNodes(node) ? LeadingTriviaOption.JSDoc : LeadingTriviaOption.StartLine
              });
              break;
            case 202:
              var pattern = node.parent;
              var preserveComma = pattern.kind === 201 && node !== ts2.last(pattern.elements);
              if (preserveComma) {
                deleteNode(changes, sourceFile, node);
              } else {
                deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
              }
              break;
            case 253:
              deleteVariableDeclaration(changes, deletedNodesInLists, sourceFile, node);
              break;
            case 162:
              deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
              break;
            case 269:
              var namedImports = node.parent;
              if (namedImports.elements.length === 1) {
                deleteImportBinding(changes, sourceFile, namedImports);
              } else {
                deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
              }
              break;
            case 267:
              deleteImportBinding(changes, sourceFile, node);
              break;
            case 26:
              deleteNode(changes, sourceFile, node, { trailingTriviaOption: TrailingTriviaOption.Exclude });
              break;
            case 98:
              deleteNode(changes, sourceFile, node, { leadingTriviaOption: LeadingTriviaOption.Exclude });
              break;
            case 256:
            case 255:
              deleteNode(changes, sourceFile, node, { leadingTriviaOption: ts2.hasJSDocNodes(node) ? LeadingTriviaOption.JSDoc : LeadingTriviaOption.StartLine });
              break;
            default:
              if (!node.parent) {
                deleteNode(changes, sourceFile, node);
              } else if (ts2.isImportClause(node.parent) && node.parent.name === node) {
                deleteDefaultImport(changes, sourceFile, node.parent);
              } else if (ts2.isCallExpression(node.parent) && ts2.contains(node.parent.arguments, node)) {
                deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
              } else {
                deleteNode(changes, sourceFile, node);
              }
          }
        }
        deleteDeclaration_1.deleteDeclaration = deleteDeclaration2;
        function deleteDefaultImport(changes, sourceFile, importClause) {
          if (!importClause.namedBindings) {
            deleteNode(changes, sourceFile, importClause.parent);
          } else {
            var start = importClause.name.getStart(sourceFile);
            var nextToken = ts2.getTokenAtPosition(sourceFile, importClause.name.end);
            if (nextToken && nextToken.kind === 27) {
              var end = ts2.skipTrivia(sourceFile.text, nextToken.end, false, true);
              changes.deleteRange(sourceFile, { pos: start, end });
            } else {
              deleteNode(changes, sourceFile, importClause.name);
            }
          }
        }
        function deleteImportBinding(changes, sourceFile, node) {
          if (node.parent.name) {
            var previousToken = ts2.Debug.checkDefined(ts2.getTokenAtPosition(sourceFile, node.pos - 1));
            changes.deleteRange(sourceFile, { pos: previousToken.getStart(sourceFile), end: node.end });
          } else {
            var importDecl = ts2.getAncestor(node, 265);
            deleteNode(changes, sourceFile, importDecl);
          }
        }
        function deleteVariableDeclaration(changes, deletedNodesInLists, sourceFile, node) {
          var parent = node.parent;
          if (parent.kind === 291) {
            changes.deleteNodeRange(sourceFile, ts2.findChildOfKind(parent, 20, sourceFile), ts2.findChildOfKind(parent, 21, sourceFile));
            return;
          }
          if (parent.declarations.length !== 1) {
            deleteNodeInList(changes, deletedNodesInLists, sourceFile, node);
            return;
          }
          var gp = parent.parent;
          switch (gp.kind) {
            case 243:
            case 242:
              changes.replaceNode(sourceFile, node, ts2.factory.createObjectLiteralExpression());
              break;
            case 241:
              deleteNode(changes, sourceFile, parent);
              break;
            case 236:
              deleteNode(changes, sourceFile, gp, { leadingTriviaOption: ts2.hasJSDocNodes(gp) ? LeadingTriviaOption.JSDoc : LeadingTriviaOption.StartLine });
              break;
            default:
              ts2.Debug.assertNever(gp);
          }
        }
      })(deleteDeclaration || (deleteDeclaration = {}));
      function deleteNode(changes, sourceFile, node, options) {
        if (options === void 0) {
          options = { leadingTriviaOption: LeadingTriviaOption.IncludeAll };
        }
        var startPosition = getAdjustedStartPosition(sourceFile, node, options);
        var endPosition = getAdjustedEndPosition(sourceFile, node, options);
        changes.deleteRange(sourceFile, { pos: startPosition, end: endPosition });
      }
      textChanges_3.deleteNode = deleteNode;
      function deleteNodeInList(changes, deletedNodesInLists, sourceFile, node) {
        var containingList = ts2.Debug.checkDefined(ts2.formatting.SmartIndenter.getContainingList(node, sourceFile));
        var index = ts2.indexOfNode(containingList, node);
        ts2.Debug.assert(index !== -1);
        if (containingList.length === 1) {
          deleteNode(changes, sourceFile, node);
          return;
        }
        ts2.Debug.assert(!deletedNodesInLists.has(node), "Deleting a node twice");
        deletedNodesInLists.add(node);
        changes.deleteRange(sourceFile, {
          pos: startPositionToDeleteNodeInList(sourceFile, node),
          end: index === containingList.length - 1 ? getAdjustedEndPosition(sourceFile, node, {}) : startPositionToDeleteNodeInList(sourceFile, containingList[index + 1])
        });
      }
    })(textChanges = ts2.textChanges || (ts2.textChanges = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var errorCodeToFixes = ts2.createMultiMap();
      var fixIdToRegistration = new ts2.Map();
      function createCodeFixActionWithoutFixAll(fixName, changes, description) {
        return createCodeFixActionWorker(fixName, ts2.diagnosticToString(description), changes, void 0, void 0);
      }
      codefix2.createCodeFixActionWithoutFixAll = createCodeFixActionWithoutFixAll;
      function createCodeFixAction(fixName, changes, description, fixId, fixAllDescription, command) {
        return createCodeFixActionWorker(fixName, ts2.diagnosticToString(description), changes, fixId, ts2.diagnosticToString(fixAllDescription), command);
      }
      codefix2.createCodeFixAction = createCodeFixAction;
      function createCodeFixActionMaybeFixAll(fixName, changes, description, fixId, fixAllDescription, command) {
        return createCodeFixActionWorker(fixName, ts2.diagnosticToString(description), changes, fixId, fixAllDescription && ts2.diagnosticToString(fixAllDescription), command);
      }
      codefix2.createCodeFixActionMaybeFixAll = createCodeFixActionMaybeFixAll;
      function createCodeFixActionWorker(fixName, description, changes, fixId, fixAllDescription, command) {
        return { fixName, description, changes, fixId, fixAllDescription, commands: command ? [command] : void 0 };
      }
      function registerCodeFix(reg) {
        for (var _i = 0, _a = reg.errorCodes; _i < _a.length; _i++) {
          var error = _a[_i];
          errorCodeToFixes.add(String(error), reg);
        }
        if (reg.fixIds) {
          for (var _b = 0, _c = reg.fixIds; _b < _c.length; _b++) {
            var fixId = _c[_b];
            ts2.Debug.assert(!fixIdToRegistration.has(fixId));
            fixIdToRegistration.set(fixId, reg);
          }
        }
      }
      codefix2.registerCodeFix = registerCodeFix;
      function getSupportedErrorCodes() {
        return ts2.arrayFrom(errorCodeToFixes.keys());
      }
      codefix2.getSupportedErrorCodes = getSupportedErrorCodes;
      function removeFixIdIfFixAllUnavailable(registration, diagnostics) {
        var errorCodes = registration.errorCodes;
        var maybeFixableDiagnostics = 0;
        for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) {
          var diag = diagnostics_1[_i];
          if (ts2.contains(errorCodes, diag.code))
            maybeFixableDiagnostics++;
          if (maybeFixableDiagnostics > 1)
            break;
        }
        var fixAllUnavailable = maybeFixableDiagnostics < 2;
        return function(_a) {
          var fixId = _a.fixId, fixAllDescription = _a.fixAllDescription, action = __rest(_a, ["fixId", "fixAllDescription"]);
          return fixAllUnavailable ? action : __assign(__assign({}, action), { fixId, fixAllDescription });
        };
      }
      function getFixes(context) {
        var diagnostics = getDiagnostics(context);
        var registrations = errorCodeToFixes.get(String(context.errorCode));
        return ts2.flatMap(registrations, function(f) {
          return ts2.map(f.getCodeActions(context), removeFixIdIfFixAllUnavailable(f, diagnostics));
        });
      }
      codefix2.getFixes = getFixes;
      function getAllFixes(context) {
        return fixIdToRegistration.get(ts2.cast(context.fixId, ts2.isString)).getAllCodeActions(context);
      }
      codefix2.getAllFixes = getAllFixes;
      function createCombinedCodeActions(changes, commands) {
        return { changes, commands };
      }
      codefix2.createCombinedCodeActions = createCombinedCodeActions;
      function createFileTextChanges(fileName, textChanges) {
        return { fileName, textChanges };
      }
      codefix2.createFileTextChanges = createFileTextChanges;
      function codeFixAll(context, errorCodes, use) {
        var commands = [];
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return eachDiagnostic(context, errorCodes, function(diag) {
            return use(t, diag, commands);
          });
        });
        return createCombinedCodeActions(changes, commands.length === 0 ? void 0 : commands);
      }
      codefix2.codeFixAll = codeFixAll;
      function eachDiagnostic(context, errorCodes, cb) {
        for (var _i = 0, _a = getDiagnostics(context); _i < _a.length; _i++) {
          var diag = _a[_i];
          if (ts2.contains(errorCodes, diag.code)) {
            cb(diag);
          }
        }
      }
      codefix2.eachDiagnostic = eachDiagnostic;
      function getDiagnostics(_a) {
        var program = _a.program, sourceFile = _a.sourceFile, cancellationToken = _a.cancellationToken;
        return __spreadArray(__spreadArray(__spreadArray([], program.getSemanticDiagnostics(sourceFile, cancellationToken), true), program.getSyntacticDiagnostics(sourceFile, cancellationToken), true), ts2.computeSuggestionDiagnostics(sourceFile, program, cancellationToken), true);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor_1) {
      var refactors = new ts2.Map();
      function registerRefactor(name, refactor2) {
        refactors.set(name, refactor2);
      }
      refactor_1.registerRefactor = registerRefactor;
      function getApplicableRefactors(context) {
        return ts2.arrayFrom(ts2.flatMapIterator(refactors.values(), function(refactor2) {
          var _a;
          return context.cancellationToken && context.cancellationToken.isCancellationRequested() || !((_a = refactor2.kinds) === null || _a === void 0 ? void 0 : _a.some(function(kind) {
            return refactor_1.refactorKindBeginsWith(kind, context.kind);
          })) ? void 0 : refactor2.getAvailableActions(context);
        }));
      }
      refactor_1.getApplicableRefactors = getApplicableRefactors;
      function getEditsForRefactor(context, refactorName, actionName) {
        var refactor2 = refactors.get(refactorName);
        return refactor2 && refactor2.getEditsForAction(context, actionName);
      }
      refactor_1.getEditsForRefactor = getEditsForRefactor;
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addConvertToUnknownForNonOverlappingTypes";
      var errorCodes = [ts2.Diagnostics.Conversion_of_type_0_to_type_1_may_be_a_mistake_because_neither_type_sufficiently_overlaps_with_the_other_If_this_was_intentional_convert_the_expression_to_unknown_first.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span.start);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_unknown_conversion_for_non_overlapping_types, fixId, ts2.Diagnostics.Add_unknown_to_all_conversions_of_non_overlapping_types)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag.start);
          });
        }
      });
      function makeChange(changeTracker, sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var assertion = ts2.Debug.checkDefined(ts2.findAncestor(token, function(n) {
          return ts2.isAsExpression(n) || ts2.isTypeAssertionExpression(n);
        }), "Expected to find an assertion expression");
        var replacement = ts2.isAsExpression(assertion) ? ts2.factory.createAsExpression(assertion.expression, ts2.factory.createKeywordTypeNode(154)) : ts2.factory.createTypeAssertion(ts2.factory.createKeywordTypeNode(154), assertion.expression);
        changeTracker.replaceNode(sourceFile, assertion.expression, replacement);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      codefix2.registerCodeFix({
        errorCodes: [
          ts2.Diagnostics.await_expressions_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module.code,
          ts2.Diagnostics.for_await_loops_are_only_allowed_at_the_top_level_of_a_file_when_that_file_is_a_module_but_this_file_has_no_imports_or_exports_Consider_adding_an_empty_export_to_make_this_file_a_module.code
        ],
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(changes2) {
            var exportDeclaration = ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports([]), void 0);
            changes2.insertNodeAtEndOfScope(sourceFile, sourceFile, exportDeclaration);
          });
          return [codefix2.createCodeFixActionWithoutFixAll("addEmptyExportDeclaration", changes, ts2.Diagnostics.Add_export_to_make_this_file_into_a_module)];
        }
      });
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addMissingAsync";
      var errorCodes = [
        ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
        ts2.Diagnostics.Type_0_is_not_assignable_to_type_1.code,
        ts2.Diagnostics.Type_0_is_not_comparable_to_type_1.code
      ];
      codefix2.registerCodeFix({
        fixIds: [fixId],
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, errorCode = context.errorCode, cancellationToken = context.cancellationToken, program = context.program, span = context.span;
          var diagnostic = ts2.find(program.getDiagnosticsProducingTypeChecker().getDiagnostics(sourceFile, cancellationToken), getIsMatchingAsyncError(span, errorCode));
          var directSpan = diagnostic && diagnostic.relatedInformation && ts2.find(diagnostic.relatedInformation, function(r) {
            return r.code === ts2.Diagnostics.Did_you_mean_to_mark_this_function_as_async.code;
          });
          var decl = getFixableErrorSpanDeclaration(sourceFile, directSpan);
          if (!decl) {
            return;
          }
          var trackChanges = function(cb) {
            return ts2.textChanges.ChangeTracker.with(context, cb);
          };
          return [getFix(context, decl, trackChanges)];
        },
        getAllCodeActions: function(context) {
          var sourceFile = context.sourceFile;
          var fixedDeclarations = new ts2.Set();
          return codefix2.codeFixAll(context, errorCodes, function(t, diagnostic) {
            var span = diagnostic.relatedInformation && ts2.find(diagnostic.relatedInformation, function(r) {
              return r.code === ts2.Diagnostics.Did_you_mean_to_mark_this_function_as_async.code;
            });
            var decl = getFixableErrorSpanDeclaration(sourceFile, span);
            if (!decl) {
              return;
            }
            var trackChanges = function(cb) {
              return cb(t), [];
            };
            return getFix(context, decl, trackChanges, fixedDeclarations);
          });
        }
      });
      function getFix(context, decl, trackChanges, fixedDeclarations) {
        var changes = trackChanges(function(t) {
          return makeChange(t, context.sourceFile, decl, fixedDeclarations);
        });
        return codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_async_modifier_to_containing_function, fixId, ts2.Diagnostics.Add_all_missing_async_modifiers);
      }
      function makeChange(changeTracker, sourceFile, insertionSite, fixedDeclarations) {
        if (fixedDeclarations) {
          if (fixedDeclarations.has(ts2.getNodeId(insertionSite))) {
            return;
          }
        }
        fixedDeclarations === null || fixedDeclarations === void 0 ? void 0 : fixedDeclarations.add(ts2.getNodeId(insertionSite));
        var cloneWithModifier = ts2.factory.updateModifiers(ts2.getSynthesizedDeepClone(insertionSite, true), ts2.factory.createNodeArray(ts2.factory.createModifiersFromModifierFlags(ts2.getSyntacticModifierFlags(insertionSite) | 256)));
        changeTracker.replaceNode(sourceFile, insertionSite, cloneWithModifier);
      }
      function getFixableErrorSpanDeclaration(sourceFile, span) {
        if (!span)
          return void 0;
        var token = ts2.getTokenAtPosition(sourceFile, span.start);
        var decl = ts2.findAncestor(token, function(node) {
          if (node.getStart(sourceFile) < span.start || node.getEnd() > ts2.textSpanEnd(span)) {
            return "quit";
          }
          return (ts2.isArrowFunction(node) || ts2.isMethodDeclaration(node) || ts2.isFunctionExpression(node) || ts2.isFunctionDeclaration(node)) && ts2.textSpansEqual(span, ts2.createTextSpanFromNode(node, sourceFile));
        });
        return decl;
      }
      function getIsMatchingAsyncError(span, errorCode) {
        return function(_a) {
          var start = _a.start, length = _a.length, relatedInformation = _a.relatedInformation, code = _a.code;
          return ts2.isNumber(start) && ts2.isNumber(length) && ts2.textSpansEqual({ start, length }, span) && code === errorCode && !!relatedInformation && ts2.some(relatedInformation, function(related) {
            return related.code === ts2.Diagnostics.Did_you_mean_to_mark_this_function_as_async.code;
          });
        };
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addMissingAwait";
      var propertyAccessCode = ts2.Diagnostics.Property_0_does_not_exist_on_type_1.code;
      var callableConstructableErrorCodes = [
        ts2.Diagnostics.This_expression_is_not_callable.code,
        ts2.Diagnostics.This_expression_is_not_constructable.code
      ];
      var errorCodes = __spreadArray([
        ts2.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_bigint_or_an_enum_type.code,
        ts2.Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type.code,
        ts2.Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type.code,
        ts2.Diagnostics.Operator_0_cannot_be_applied_to_type_1.code,
        ts2.Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2.code,
        ts2.Diagnostics.This_condition_will_always_return_0_since_the_types_1_and_2_have_no_overlap.code,
        ts2.Diagnostics.This_condition_will_always_return_true_since_this_0_is_always_defined.code,
        ts2.Diagnostics.Type_0_is_not_an_array_type.code,
        ts2.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type.code,
        ts2.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type_Use_compiler_option_downlevelIteration_to_allow_iterating_of_iterators.code,
        ts2.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator.code,
        ts2.Diagnostics.Type_0_is_not_an_array_type_or_does_not_have_a_Symbol_iterator_method_that_returns_an_iterator.code,
        ts2.Diagnostics.Type_0_must_have_a_Symbol_iterator_method_that_returns_an_iterator.code,
        ts2.Diagnostics.Type_0_must_have_a_Symbol_asyncIterator_method_that_returns_an_async_iterator.code,
        ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
        propertyAccessCode
      ], callableConstructableErrorCodes, true);
      codefix2.registerCodeFix({
        fixIds: [fixId],
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, errorCode = context.errorCode, span = context.span, cancellationToken = context.cancellationToken, program = context.program;
          var expression = getAwaitErrorSpanExpression(sourceFile, errorCode, span, cancellationToken, program);
          if (!expression) {
            return;
          }
          var checker = context.program.getTypeChecker();
          var trackChanges = function(cb) {
            return ts2.textChanges.ChangeTracker.with(context, cb);
          };
          return ts2.compact([
            getDeclarationSiteFix(context, expression, errorCode, checker, trackChanges),
            getUseSiteFix(context, expression, errorCode, checker, trackChanges)
          ]);
        },
        getAllCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, cancellationToken = context.cancellationToken;
          var checker = context.program.getTypeChecker();
          var fixedDeclarations = new ts2.Set();
          return codefix2.codeFixAll(context, errorCodes, function(t, diagnostic) {
            var expression = getAwaitErrorSpanExpression(sourceFile, diagnostic.code, diagnostic, cancellationToken, program);
            if (!expression) {
              return;
            }
            var trackChanges = function(cb) {
              return cb(t), [];
            };
            return getDeclarationSiteFix(context, expression, diagnostic.code, checker, trackChanges, fixedDeclarations) || getUseSiteFix(context, expression, diagnostic.code, checker, trackChanges, fixedDeclarations);
          });
        }
      });
      function getAwaitErrorSpanExpression(sourceFile, errorCode, span, cancellationToken, program) {
        var expression = ts2.getFixableErrorSpanExpression(sourceFile, span);
        return expression && isMissingAwaitError(sourceFile, errorCode, span, cancellationToken, program) && isInsideAwaitableBody(expression) ? expression : void 0;
      }
      function getDeclarationSiteFix(context, expression, errorCode, checker, trackChanges, fixedDeclarations) {
        var sourceFile = context.sourceFile, program = context.program, cancellationToken = context.cancellationToken;
        var awaitableInitializers = findAwaitableInitializers(expression, sourceFile, cancellationToken, program, checker);
        if (awaitableInitializers) {
          var initializerChanges = trackChanges(function(t) {
            ts2.forEach(awaitableInitializers.initializers, function(_a) {
              var expression2 = _a.expression;
              return makeChange(t, errorCode, sourceFile, checker, expression2, fixedDeclarations);
            });
            if (fixedDeclarations && awaitableInitializers.needsSecondPassForFixAll) {
              makeChange(t, errorCode, sourceFile, checker, expression, fixedDeclarations);
            }
          });
          return codefix2.createCodeFixActionWithoutFixAll("addMissingAwaitToInitializer", initializerChanges, awaitableInitializers.initializers.length === 1 ? [ts2.Diagnostics.Add_await_to_initializer_for_0, awaitableInitializers.initializers[0].declarationSymbol.name] : ts2.Diagnostics.Add_await_to_initializers);
        }
      }
      function getUseSiteFix(context, expression, errorCode, checker, trackChanges, fixedDeclarations) {
        var changes = trackChanges(function(t) {
          return makeChange(t, errorCode, context.sourceFile, checker, expression, fixedDeclarations);
        });
        return codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_await, fixId, ts2.Diagnostics.Fix_all_expressions_possibly_missing_await);
      }
      function isMissingAwaitError(sourceFile, errorCode, span, cancellationToken, program) {
        var checker = program.getDiagnosticsProducingTypeChecker();
        var diagnostics = checker.getDiagnostics(sourceFile, cancellationToken);
        return ts2.some(diagnostics, function(_a) {
          var start = _a.start, length = _a.length, relatedInformation = _a.relatedInformation, code = _a.code;
          return ts2.isNumber(start) && ts2.isNumber(length) && ts2.textSpansEqual({ start, length }, span) && code === errorCode && !!relatedInformation && ts2.some(relatedInformation, function(related) {
            return related.code === ts2.Diagnostics.Did_you_forget_to_use_await.code;
          });
        });
      }
      function findAwaitableInitializers(expression, sourceFile, cancellationToken, program, checker) {
        var identifiers = getIdentifiersFromErrorSpanExpression(expression, checker);
        if (!identifiers) {
          return;
        }
        var isCompleteFix = identifiers.isCompleteFix;
        var initializers;
        var _loop_13 = function(identifier2) {
          var symbol = checker.getSymbolAtLocation(identifier2);
          if (!symbol) {
            return "continue";
          }
          var declaration = ts2.tryCast(symbol.valueDeclaration, ts2.isVariableDeclaration);
          var variableName = declaration && ts2.tryCast(declaration.name, ts2.isIdentifier);
          var variableStatement = ts2.getAncestor(declaration, 236);
          if (!declaration || !variableStatement || declaration.type || !declaration.initializer || variableStatement.getSourceFile() !== sourceFile || ts2.hasSyntacticModifier(variableStatement, 1) || !variableName || !isInsideAwaitableBody(declaration.initializer)) {
            isCompleteFix = false;
            return "continue";
          }
          var diagnostics = program.getSemanticDiagnostics(sourceFile, cancellationToken);
          var isUsedElsewhere = ts2.FindAllReferences.Core.eachSymbolReferenceInFile(variableName, checker, sourceFile, function(reference) {
            return identifier2 !== reference && !symbolReferenceIsAlsoMissingAwait(reference, diagnostics, sourceFile, checker);
          });
          if (isUsedElsewhere) {
            isCompleteFix = false;
            return "continue";
          }
          (initializers || (initializers = [])).push({
            expression: declaration.initializer,
            declarationSymbol: symbol
          });
        };
        for (var _i = 0, _a = identifiers.identifiers; _i < _a.length; _i++) {
          var identifier = _a[_i];
          _loop_13(identifier);
        }
        return initializers && {
          initializers,
          needsSecondPassForFixAll: !isCompleteFix
        };
      }
      function getIdentifiersFromErrorSpanExpression(expression, checker) {
        if (ts2.isPropertyAccessExpression(expression.parent) && ts2.isIdentifier(expression.parent.expression)) {
          return { identifiers: [expression.parent.expression], isCompleteFix: true };
        }
        if (ts2.isIdentifier(expression)) {
          return { identifiers: [expression], isCompleteFix: true };
        }
        if (ts2.isBinaryExpression(expression)) {
          var sides = void 0;
          var isCompleteFix = true;
          for (var _i = 0, _a = [expression.left, expression.right]; _i < _a.length; _i++) {
            var side = _a[_i];
            var type = checker.getTypeAtLocation(side);
            if (checker.getPromisedTypeOfPromise(type)) {
              if (!ts2.isIdentifier(side)) {
                isCompleteFix = false;
                continue;
              }
              (sides || (sides = [])).push(side);
            }
          }
          return sides && { identifiers: sides, isCompleteFix };
        }
      }
      function symbolReferenceIsAlsoMissingAwait(reference, diagnostics, sourceFile, checker) {
        var errorNode = ts2.isPropertyAccessExpression(reference.parent) ? reference.parent.name : ts2.isBinaryExpression(reference.parent) ? reference.parent : reference;
        var diagnostic = ts2.find(diagnostics, function(diagnostic2) {
          return diagnostic2.start === errorNode.getStart(sourceFile) && diagnostic2.start + diagnostic2.length === errorNode.getEnd();
        });
        return diagnostic && ts2.contains(errorCodes, diagnostic.code) || checker.getTypeAtLocation(errorNode).flags & 1;
      }
      function isInsideAwaitableBody(node) {
        return node.kind & 32768 || !!ts2.findAncestor(node, function(ancestor) {
          return ancestor.parent && ts2.isArrowFunction(ancestor.parent) && ancestor.parent.body === ancestor || ts2.isBlock(ancestor) && (ancestor.parent.kind === 255 || ancestor.parent.kind === 212 || ancestor.parent.kind === 213 || ancestor.parent.kind === 168);
        });
      }
      function makeChange(changeTracker, errorCode, sourceFile, checker, insertionSite, fixedDeclarations) {
        if (ts2.isBinaryExpression(insertionSite)) {
          for (var _i = 0, _a = [insertionSite.left, insertionSite.right]; _i < _a.length; _i++) {
            var side = _a[_i];
            if (fixedDeclarations && ts2.isIdentifier(side)) {
              var symbol = checker.getSymbolAtLocation(side);
              if (symbol && fixedDeclarations.has(ts2.getSymbolId(symbol))) {
                continue;
              }
            }
            var type = checker.getTypeAtLocation(side);
            var newNode = checker.getPromisedTypeOfPromise(type) ? ts2.factory.createAwaitExpression(side) : side;
            changeTracker.replaceNode(sourceFile, side, newNode);
          }
        } else if (errorCode === propertyAccessCode && ts2.isPropertyAccessExpression(insertionSite.parent)) {
          if (fixedDeclarations && ts2.isIdentifier(insertionSite.parent.expression)) {
            var symbol = checker.getSymbolAtLocation(insertionSite.parent.expression);
            if (symbol && fixedDeclarations.has(ts2.getSymbolId(symbol))) {
              return;
            }
          }
          changeTracker.replaceNode(sourceFile, insertionSite.parent.expression, ts2.factory.createParenthesizedExpression(ts2.factory.createAwaitExpression(insertionSite.parent.expression)));
          insertLeadingSemicolonIfNeeded(changeTracker, insertionSite.parent.expression, sourceFile);
        } else if (ts2.contains(callableConstructableErrorCodes, errorCode) && ts2.isCallOrNewExpression(insertionSite.parent)) {
          if (fixedDeclarations && ts2.isIdentifier(insertionSite)) {
            var symbol = checker.getSymbolAtLocation(insertionSite);
            if (symbol && fixedDeclarations.has(ts2.getSymbolId(symbol))) {
              return;
            }
          }
          changeTracker.replaceNode(sourceFile, insertionSite, ts2.factory.createParenthesizedExpression(ts2.factory.createAwaitExpression(insertionSite)));
          insertLeadingSemicolonIfNeeded(changeTracker, insertionSite, sourceFile);
        } else {
          if (fixedDeclarations && ts2.isVariableDeclaration(insertionSite.parent) && ts2.isIdentifier(insertionSite.parent.name)) {
            var symbol = checker.getSymbolAtLocation(insertionSite.parent.name);
            if (symbol && !ts2.tryAddToSet(fixedDeclarations, ts2.getSymbolId(symbol))) {
              return;
            }
          }
          changeTracker.replaceNode(sourceFile, insertionSite, ts2.factory.createAwaitExpression(insertionSite));
        }
      }
      function insertLeadingSemicolonIfNeeded(changeTracker, beforeNode, sourceFile) {
        var precedingToken = ts2.findPrecedingToken(beforeNode.pos, sourceFile);
        if (precedingToken && ts2.positionIsASICandidate(precedingToken.end, precedingToken.parent, sourceFile)) {
          changeTracker.insertText(sourceFile, beforeNode.getStart(sourceFile), ";");
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addMissingConst";
      var errorCodes = [
        ts2.Diagnostics.Cannot_find_name_0.code,
        ts2.Diagnostics.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span.start, context.program);
          });
          if (changes.length > 0) {
            return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_const_to_unresolved_variable, fixId, ts2.Diagnostics.Add_const_to_all_unresolved_variables)];
          }
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var fixedNodes = new ts2.Set();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag.start, context.program, fixedNodes);
          });
        }
      });
      function makeChange(changeTracker, sourceFile, pos, program, fixedNodes) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var forInitializer = ts2.findAncestor(token, function(node) {
          return ts2.isForInOrOfStatement(node.parent) ? node.parent.initializer === node : isPossiblyPartOfDestructuring(node) ? false : "quit";
        });
        if (forInitializer)
          return applyChange(changeTracker, forInitializer, sourceFile, fixedNodes);
        var parent = token.parent;
        if (ts2.isBinaryExpression(parent) && parent.operatorToken.kind === 63 && ts2.isExpressionStatement(parent.parent)) {
          return applyChange(changeTracker, token, sourceFile, fixedNodes);
        }
        if (ts2.isArrayLiteralExpression(parent)) {
          var checker_1 = program.getTypeChecker();
          if (!ts2.every(parent.elements, function(element) {
            return arrayElementCouldBeVariableDeclaration(element, checker_1);
          })) {
            return;
          }
          return applyChange(changeTracker, parent, sourceFile, fixedNodes);
        }
        var commaExpression = ts2.findAncestor(token, function(node) {
          return ts2.isExpressionStatement(node.parent) ? true : isPossiblyPartOfCommaSeperatedInitializer(node) ? false : "quit";
        });
        if (commaExpression) {
          var checker = program.getTypeChecker();
          if (!expressionCouldBeVariableDeclaration(commaExpression, checker)) {
            return;
          }
          return applyChange(changeTracker, commaExpression, sourceFile, fixedNodes);
        }
      }
      function applyChange(changeTracker, initializer, sourceFile, fixedNodes) {
        if (!fixedNodes || ts2.tryAddToSet(fixedNodes, initializer)) {
          changeTracker.insertModifierBefore(sourceFile, 85, initializer);
        }
      }
      function isPossiblyPartOfDestructuring(node) {
        switch (node.kind) {
          case 79:
          case 203:
          case 204:
          case 294:
          case 295:
            return true;
          default:
            return false;
        }
      }
      function arrayElementCouldBeVariableDeclaration(expression, checker) {
        var identifier = ts2.isIdentifier(expression) ? expression : ts2.isAssignmentExpression(expression, true) && ts2.isIdentifier(expression.left) ? expression.left : void 0;
        return !!identifier && !checker.getSymbolAtLocation(identifier);
      }
      function isPossiblyPartOfCommaSeperatedInitializer(node) {
        switch (node.kind) {
          case 79:
          case 220:
          case 27:
            return true;
          default:
            return false;
        }
      }
      function expressionCouldBeVariableDeclaration(expression, checker) {
        if (!ts2.isBinaryExpression(expression)) {
          return false;
        }
        if (expression.operatorToken.kind === 27) {
          return ts2.every([expression.left, expression.right], function(expression2) {
            return expressionCouldBeVariableDeclaration(expression2, checker);
          });
        }
        return expression.operatorToken.kind === 63 && ts2.isIdentifier(expression.left) && !checker.getSymbolAtLocation(expression.left);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addMissingDeclareProperty";
      var errorCodes = [
        ts2.Diagnostics.Property_0_will_overwrite_the_base_property_in_1_If_this_is_intentional_add_an_initializer_Otherwise_add_a_declare_modifier_or_remove_the_redundant_declaration.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span.start);
          });
          if (changes.length > 0) {
            return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Prefix_with_declare, fixId, ts2.Diagnostics.Prefix_all_incorrect_property_declarations_with_declare)];
          }
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var fixedNodes = new ts2.Set();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag.start, fixedNodes);
          });
        }
      });
      function makeChange(changeTracker, sourceFile, pos, fixedNodes) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        if (!ts2.isIdentifier(token)) {
          return;
        }
        var declaration = token.parent;
        if (declaration.kind === 166 && (!fixedNodes || ts2.tryAddToSet(fixedNodes, declaration))) {
          changeTracker.insertModifierBefore(sourceFile, 135, declaration);
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addMissingInvocationForDecorator";
      var errorCodes = [ts2.Diagnostics._0_accepts_too_few_arguments_to_be_used_as_a_decorator_here_Did_you_mean_to_call_it_first_and_write_0.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span.start);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Call_decorator_expression, fixId, ts2.Diagnostics.Add_to_all_uncalled_decorators)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag.start);
          });
        }
      });
      function makeChange(changeTracker, sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var decorator = ts2.findAncestor(token, ts2.isDecorator);
        ts2.Debug.assert(!!decorator, "Expected position to be owned by a decorator.");
        var replacement = ts2.factory.createCallExpression(decorator.expression, void 0, void 0);
        changeTracker.replaceNode(sourceFile, decorator.expression, replacement);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addNameToNamelessParameter";
      var errorCodes = [ts2.Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span.start);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_parameter_name, fixId, ts2.Diagnostics.Add_names_to_all_parameters_without_names)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag.start);
          });
        }
      });
      function makeChange(changeTracker, sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var param = token.parent;
        if (!ts2.isParameter(param)) {
          return ts2.Debug.fail("Tried to add a parameter name to a non-parameter: " + ts2.Debug.formatSyntaxKind(token.kind));
        }
        var i = param.parent.parameters.indexOf(param);
        ts2.Debug.assert(!param.type, "Tried to add a parameter name to a parameter that already had one.");
        ts2.Debug.assert(i > -1, "Parameter not found in parent parameter list.");
        var typeNode = ts2.factory.createTypeReferenceNode(param.name, void 0);
        var replacement = ts2.factory.createParameterDeclaration(void 0, param.modifiers, param.dotDotDotToken, "arg" + i, param.questionToken, param.dotDotDotToken ? ts2.factory.createArrayTypeNode(typeNode) : typeNode, param.initializer);
        changeTracker.replaceNode(sourceFile, param, replacement);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var addOptionalPropertyUndefined = "addOptionalPropertyUndefined";
      var errorCodes = [
        ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_type_of_the_target.code,
        ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code,
        ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_with_exactOptionalPropertyTypes_Colon_true_Consider_adding_undefined_to_the_types_of_the_target_s_properties.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var typeChecker = context.program.getTypeChecker();
          var toAdd = getPropertiesToAdd(context.sourceFile, context.span, typeChecker);
          if (!toAdd.length) {
            return void 0;
          }
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return addUndefinedToOptionalProperty(t, toAdd);
          });
          return [codefix2.createCodeFixActionWithoutFixAll(addOptionalPropertyUndefined, changes, ts2.Diagnostics.Add_undefined_to_optional_property_type)];
        },
        fixIds: [addOptionalPropertyUndefined]
      });
      function getPropertiesToAdd(file, span, checker) {
        var _a, _b;
        var sourceTarget = getSourceTarget(ts2.getFixableErrorSpanExpression(file, span), checker);
        if (!sourceTarget) {
          return ts2.emptyArray;
        }
        var sourceNode = sourceTarget.source, targetNode = sourceTarget.target;
        var target = shouldUseParentTypeOfProperty(sourceNode, targetNode, checker) ? checker.getTypeAtLocation(targetNode.expression) : checker.getTypeAtLocation(targetNode);
        if ((_b = (_a = target.symbol) === null || _a === void 0 ? void 0 : _a.declarations) === null || _b === void 0 ? void 0 : _b.some(function(d) {
          return ts2.getSourceFileOfNode(d).fileName.match(/\.d\.ts$/);
        })) {
          return ts2.emptyArray;
        }
        return checker.getExactOptionalProperties(target);
      }
      function shouldUseParentTypeOfProperty(sourceNode, targetNode, checker) {
        return ts2.isPropertyAccessExpression(targetNode) && !!checker.getExactOptionalProperties(checker.getTypeAtLocation(targetNode.expression)).length && checker.getTypeAtLocation(sourceNode) === checker.getUndefinedType();
      }
      function getSourceTarget(errorNode, checker) {
        var _a;
        if (!errorNode) {
          return void 0;
        } else if (ts2.isBinaryExpression(errorNode.parent) && errorNode.parent.operatorToken.kind === 63) {
          return { source: errorNode.parent.right, target: errorNode.parent.left };
        } else if (ts2.isVariableDeclaration(errorNode.parent) && errorNode.parent.initializer) {
          return { source: errorNode.parent.initializer, target: errorNode.parent.name };
        } else if (ts2.isCallExpression(errorNode.parent)) {
          var n = checker.getSymbolAtLocation(errorNode.parent.expression);
          if (!(n === null || n === void 0 ? void 0 : n.valueDeclaration) || !ts2.isFunctionLikeKind(n.valueDeclaration.kind))
            return void 0;
          if (!ts2.isExpression(errorNode))
            return void 0;
          var i = errorNode.parent.arguments.indexOf(errorNode);
          if (i === -1)
            return void 0;
          var name = n.valueDeclaration.parameters[i].name;
          if (ts2.isIdentifier(name))
            return { source: errorNode, target: name };
        } else if (ts2.isPropertyAssignment(errorNode.parent) && ts2.isIdentifier(errorNode.parent.name) || ts2.isShorthandPropertyAssignment(errorNode.parent)) {
          var parentTarget = getSourceTarget(errorNode.parent.parent, checker);
          if (!parentTarget)
            return void 0;
          var prop = checker.getPropertyOfType(checker.getTypeAtLocation(parentTarget.target), errorNode.parent.name.text);
          var declaration = (_a = prop === null || prop === void 0 ? void 0 : prop.declarations) === null || _a === void 0 ? void 0 : _a[0];
          if (!declaration)
            return void 0;
          return {
            source: ts2.isPropertyAssignment(errorNode.parent) ? errorNode.parent.initializer : errorNode.parent.name,
            target: declaration
          };
        }
        return void 0;
      }
      function addUndefinedToOptionalProperty(changes, toAdd) {
        for (var _i = 0, toAdd_1 = toAdd; _i < toAdd_1.length; _i++) {
          var add = toAdd_1[_i];
          var d = add.valueDeclaration;
          if (d && (ts2.isPropertySignature(d) || ts2.isPropertyDeclaration(d)) && d.type) {
            var t = ts2.factory.createUnionTypeNode(__spreadArray(__spreadArray([], d.type.kind === 186 ? d.type.types : [d.type], true), [
              ts2.factory.createTypeReferenceNode("undefined")
            ], false));
            changes.replaceNode(d.getSourceFile(), d.type, t);
          }
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "annotateWithTypeFromJSDoc";
      var errorCodes = [ts2.Diagnostics.JSDoc_types_may_be_moved_to_TypeScript_types.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var decl = getDeclaration(context.sourceFile, context.span.start);
          if (!decl)
            return;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, decl);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Annotate_with_type_from_JSDoc, fixId, ts2.Diagnostics.Annotate_everything_with_types_from_JSDoc)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var decl = getDeclaration(diag.file, diag.start);
            if (decl)
              doChange(changes, diag.file, decl);
          });
        }
      });
      function getDeclaration(file, pos) {
        var name = ts2.getTokenAtPosition(file, pos);
        return ts2.tryCast(ts2.isParameter(name.parent) ? name.parent.parent : name.parent, parameterShouldGetTypeFromJSDoc);
      }
      function parameterShouldGetTypeFromJSDoc(node) {
        return isDeclarationWithType(node) && hasUsableJSDoc(node);
      }
      codefix2.parameterShouldGetTypeFromJSDoc = parameterShouldGetTypeFromJSDoc;
      function hasUsableJSDoc(decl) {
        return ts2.isFunctionLikeDeclaration(decl) ? decl.parameters.some(hasUsableJSDoc) || !decl.type && !!ts2.getJSDocReturnType(decl) : !decl.type && !!ts2.getJSDocType(decl);
      }
      function doChange(changes, sourceFile, decl) {
        if (ts2.isFunctionLikeDeclaration(decl) && (ts2.getJSDocReturnType(decl) || decl.parameters.some(function(p) {
          return !!ts2.getJSDocType(p);
        }))) {
          if (!decl.typeParameters) {
            var typeParameters = ts2.getJSDocTypeParameterDeclarations(decl);
            if (typeParameters.length)
              changes.insertTypeParameters(sourceFile, decl, typeParameters);
          }
          var needParens = ts2.isArrowFunction(decl) && !ts2.findChildOfKind(decl, 20, sourceFile);
          if (needParens)
            changes.insertNodeBefore(sourceFile, ts2.first(decl.parameters), ts2.factory.createToken(20));
          for (var _i = 0, _a = decl.parameters; _i < _a.length; _i++) {
            var param = _a[_i];
            if (!param.type) {
              var paramType = ts2.getJSDocType(param);
              if (paramType)
                changes.tryInsertTypeAnnotation(sourceFile, param, transformJSDocType(paramType));
            }
          }
          if (needParens)
            changes.insertNodeAfter(sourceFile, ts2.last(decl.parameters), ts2.factory.createToken(21));
          if (!decl.type) {
            var returnType = ts2.getJSDocReturnType(decl);
            if (returnType)
              changes.tryInsertTypeAnnotation(sourceFile, decl, transformJSDocType(returnType));
          }
        } else {
          var jsdocType = ts2.Debug.checkDefined(ts2.getJSDocType(decl), "A JSDocType for this declaration should exist");
          ts2.Debug.assert(!decl.type, "The JSDocType decl should have a type");
          changes.tryInsertTypeAnnotation(sourceFile, decl, transformJSDocType(jsdocType));
        }
      }
      function isDeclarationWithType(node) {
        return ts2.isFunctionLikeDeclaration(node) || node.kind === 253 || node.kind === 165 || node.kind === 166;
      }
      function transformJSDocType(node) {
        switch (node.kind) {
          case 310:
          case 311:
            return ts2.factory.createTypeReferenceNode("any", ts2.emptyArray);
          case 314:
            return transformJSDocOptionalType(node);
          case 313:
            return transformJSDocType(node.type);
          case 312:
            return transformJSDocNullableType(node);
          case 316:
            return transformJSDocVariadicType(node);
          case 315:
            return transformJSDocFunctionType(node);
          case 177:
            return transformJSDocTypeReference(node);
          default:
            var visited = ts2.visitEachChild(node, transformJSDocType, ts2.nullTransformationContext);
            ts2.setEmitFlags(visited, 1);
            return visited;
        }
      }
      function transformJSDocOptionalType(node) {
        return ts2.factory.createUnionTypeNode([ts2.visitNode(node.type, transformJSDocType), ts2.factory.createTypeReferenceNode("undefined", ts2.emptyArray)]);
      }
      function transformJSDocNullableType(node) {
        return ts2.factory.createUnionTypeNode([ts2.visitNode(node.type, transformJSDocType), ts2.factory.createTypeReferenceNode("null", ts2.emptyArray)]);
      }
      function transformJSDocVariadicType(node) {
        return ts2.factory.createArrayTypeNode(ts2.visitNode(node.type, transformJSDocType));
      }
      function transformJSDocFunctionType(node) {
        var _a;
        return ts2.factory.createFunctionTypeNode(ts2.emptyArray, node.parameters.map(transformJSDocParameter), (_a = node.type) !== null && _a !== void 0 ? _a : ts2.factory.createKeywordTypeNode(130));
      }
      function transformJSDocParameter(node) {
        var index = node.parent.parameters.indexOf(node);
        var isRest = node.type.kind === 316 && index === node.parent.parameters.length - 1;
        var name = node.name || (isRest ? "rest" : "arg" + index);
        var dotdotdot = isRest ? ts2.factory.createToken(25) : node.dotDotDotToken;
        return ts2.factory.createParameterDeclaration(node.decorators, node.modifiers, dotdotdot, name, node.questionToken, ts2.visitNode(node.type, transformJSDocType), node.initializer);
      }
      function transformJSDocTypeReference(node) {
        var name = node.typeName;
        var args = node.typeArguments;
        if (ts2.isIdentifier(node.typeName)) {
          if (ts2.isJSDocIndexSignature(node)) {
            return transformJSDocIndexSignature(node);
          }
          var text = node.typeName.text;
          switch (node.typeName.text) {
            case "String":
            case "Boolean":
            case "Object":
            case "Number":
              text = text.toLowerCase();
              break;
            case "array":
            case "date":
            case "promise":
              text = text[0].toUpperCase() + text.slice(1);
              break;
          }
          name = ts2.factory.createIdentifier(text);
          if ((text === "Array" || text === "Promise") && !node.typeArguments) {
            args = ts2.factory.createNodeArray([ts2.factory.createTypeReferenceNode("any", ts2.emptyArray)]);
          } else {
            args = ts2.visitNodes(node.typeArguments, transformJSDocType);
          }
        }
        return ts2.factory.createTypeReferenceNode(name, args);
      }
      function transformJSDocIndexSignature(node) {
        var index = ts2.factory.createParameterDeclaration(void 0, void 0, void 0, node.typeArguments[0].kind === 146 ? "n" : "s", void 0, ts2.factory.createTypeReferenceNode(node.typeArguments[0].kind === 146 ? "number" : "string", []), void 0);
        var indexSignature = ts2.factory.createTypeLiteralNode([ts2.factory.createIndexSignature(void 0, void 0, [index], node.typeArguments[1])]);
        ts2.setEmitFlags(indexSignature, 1);
        return indexSignature;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "convertFunctionToEs6Class";
      var errorCodes = [ts2.Diagnostics.This_constructor_function_may_be_converted_to_a_class_declaration.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, context.span.start, context.program.getTypeChecker(), context.preferences, context.program.getCompilerOptions());
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_function_to_an_ES2015_class, fixId, ts2.Diagnostics.Convert_all_constructor_functions_to_classes)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, err) {
            return doChange(changes, err.file, err.start, context.program.getTypeChecker(), context.preferences, context.program.getCompilerOptions());
          });
        }
      });
      function doChange(changes, sourceFile, position, checker, preferences, compilerOptions) {
        var ctorSymbol = checker.getSymbolAtLocation(ts2.getTokenAtPosition(sourceFile, position));
        if (!ctorSymbol || !ctorSymbol.valueDeclaration || !(ctorSymbol.flags & (16 | 3))) {
          return void 0;
        }
        var ctorDeclaration = ctorSymbol.valueDeclaration;
        if (ts2.isFunctionDeclaration(ctorDeclaration)) {
          changes.replaceNode(sourceFile, ctorDeclaration, createClassFromFunctionDeclaration(ctorDeclaration));
        } else if (ts2.isVariableDeclaration(ctorDeclaration)) {
          var classDeclaration = createClassFromVariableDeclaration(ctorDeclaration);
          if (!classDeclaration) {
            return void 0;
          }
          var ancestor = ctorDeclaration.parent.parent;
          if (ts2.isVariableDeclarationList(ctorDeclaration.parent) && ctorDeclaration.parent.declarations.length > 1) {
            changes.delete(sourceFile, ctorDeclaration);
            changes.insertNodeAfter(sourceFile, ancestor, classDeclaration);
          } else {
            changes.replaceNode(sourceFile, ancestor, classDeclaration);
          }
        }
        function createClassElementsFromSymbol(symbol) {
          var memberElements = [];
          if (symbol.members) {
            symbol.members.forEach(function(member, key) {
              if (key === "constructor" && member.valueDeclaration) {
                changes.delete(sourceFile, member.valueDeclaration.parent);
                return;
              }
              var memberElement = createClassElement(member, void 0);
              if (memberElement) {
                memberElements.push.apply(memberElements, memberElement);
              }
            });
          }
          if (symbol.exports) {
            symbol.exports.forEach(function(member) {
              if (member.name === "prototype" && member.declarations) {
                var firstDeclaration = member.declarations[0];
                if (member.declarations.length === 1 && ts2.isPropertyAccessExpression(firstDeclaration) && ts2.isBinaryExpression(firstDeclaration.parent) && firstDeclaration.parent.operatorToken.kind === 63 && ts2.isObjectLiteralExpression(firstDeclaration.parent.right)) {
                  var prototypes = firstDeclaration.parent.right;
                  var memberElement = createClassElement(prototypes.symbol, void 0);
                  if (memberElement) {
                    memberElements.push.apply(memberElements, memberElement);
                  }
                }
              } else {
                var memberElement = createClassElement(member, [ts2.factory.createToken(124)]);
                if (memberElement) {
                  memberElements.push.apply(memberElements, memberElement);
                }
              }
            });
          }
          return memberElements;
          function shouldConvertDeclaration(_target, source) {
            if (ts2.isAccessExpression(_target)) {
              if (ts2.isPropertyAccessExpression(_target) && isConstructorAssignment(_target))
                return true;
              return ts2.isFunctionLike(source);
            } else {
              return ts2.every(_target.properties, function(property) {
                if (ts2.isMethodDeclaration(property) || ts2.isGetOrSetAccessorDeclaration(property))
                  return true;
                if (ts2.isPropertyAssignment(property) && ts2.isFunctionExpression(property.initializer) && !!property.name)
                  return true;
                if (isConstructorAssignment(property))
                  return true;
                return false;
              });
            }
          }
          function createClassElement(symbol2, modifiers) {
            var members = [];
            if (!(symbol2.flags & 8192) && !(symbol2.flags & 4096)) {
              return members;
            }
            var memberDeclaration = symbol2.valueDeclaration;
            var assignmentBinaryExpression = memberDeclaration.parent;
            var assignmentExpr = assignmentBinaryExpression.right;
            if (!shouldConvertDeclaration(memberDeclaration, assignmentExpr)) {
              return members;
            }
            var nodeToDelete = assignmentBinaryExpression.parent && assignmentBinaryExpression.parent.kind === 237 ? assignmentBinaryExpression.parent : assignmentBinaryExpression;
            changes.delete(sourceFile, nodeToDelete);
            if (!assignmentExpr) {
              members.push(ts2.factory.createPropertyDeclaration([], modifiers, symbol2.name, void 0, void 0, void 0));
              return members;
            }
            if (ts2.isAccessExpression(memberDeclaration) && (ts2.isFunctionExpression(assignmentExpr) || ts2.isArrowFunction(assignmentExpr))) {
              var quotePreference = ts2.getQuotePreference(sourceFile, preferences);
              var name = tryGetPropertyName(memberDeclaration, compilerOptions, quotePreference);
              if (name) {
                return createFunctionLikeExpressionMember(members, assignmentExpr, name);
              }
              return members;
            } else if (ts2.isObjectLiteralExpression(assignmentExpr)) {
              return ts2.flatMap(assignmentExpr.properties, function(property) {
                if (ts2.isMethodDeclaration(property) || ts2.isGetOrSetAccessorDeclaration(property)) {
                  return members.concat(property);
                }
                if (ts2.isPropertyAssignment(property) && ts2.isFunctionExpression(property.initializer)) {
                  return createFunctionLikeExpressionMember(members, property.initializer, property.name);
                }
                if (isConstructorAssignment(property))
                  return members;
                return [];
              });
            } else {
              if (ts2.isSourceFileJS(sourceFile))
                return members;
              if (!ts2.isPropertyAccessExpression(memberDeclaration))
                return members;
              var prop = ts2.factory.createPropertyDeclaration(void 0, modifiers, memberDeclaration.name, void 0, void 0, assignmentExpr);
              ts2.copyLeadingComments(assignmentBinaryExpression.parent, prop, sourceFile);
              members.push(prop);
              return members;
            }
            function createFunctionLikeExpressionMember(members2, expression, name2) {
              if (ts2.isFunctionExpression(expression))
                return createFunctionExpressionMember(members2, expression, name2);
              else
                return createArrowFunctionExpressionMember(members2, expression, name2);
            }
            function createFunctionExpressionMember(members2, functionExpression, name2) {
              var fullModifiers = ts2.concatenate(modifiers, getModifierKindFromSource(functionExpression, 131));
              var method = ts2.factory.createMethodDeclaration(void 0, fullModifiers, void 0, name2, void 0, void 0, functionExpression.parameters, void 0, functionExpression.body);
              ts2.copyLeadingComments(assignmentBinaryExpression, method, sourceFile);
              return members2.concat(method);
            }
            function createArrowFunctionExpressionMember(members2, arrowFunction, name2) {
              var arrowFunctionBody = arrowFunction.body;
              var bodyBlock;
              if (arrowFunctionBody.kind === 234) {
                bodyBlock = arrowFunctionBody;
              } else {
                bodyBlock = ts2.factory.createBlock([ts2.factory.createReturnStatement(arrowFunctionBody)]);
              }
              var fullModifiers = ts2.concatenate(modifiers, getModifierKindFromSource(arrowFunction, 131));
              var method = ts2.factory.createMethodDeclaration(void 0, fullModifiers, void 0, name2, void 0, void 0, arrowFunction.parameters, void 0, bodyBlock);
              ts2.copyLeadingComments(assignmentBinaryExpression, method, sourceFile);
              return members2.concat(method);
            }
          }
        }
        function createClassFromVariableDeclaration(node) {
          var initializer = node.initializer;
          if (!initializer || !ts2.isFunctionExpression(initializer) || !ts2.isIdentifier(node.name)) {
            return void 0;
          }
          var memberElements = createClassElementsFromSymbol(node.symbol);
          if (initializer.body) {
            memberElements.unshift(ts2.factory.createConstructorDeclaration(void 0, void 0, initializer.parameters, initializer.body));
          }
          var modifiers = getModifierKindFromSource(node.parent.parent, 93);
          var cls = ts2.factory.createClassDeclaration(void 0, modifiers, node.name, void 0, void 0, memberElements);
          return cls;
        }
        function createClassFromFunctionDeclaration(node) {
          var memberElements = createClassElementsFromSymbol(ctorSymbol);
          if (node.body) {
            memberElements.unshift(ts2.factory.createConstructorDeclaration(void 0, void 0, node.parameters, node.body));
          }
          var modifiers = getModifierKindFromSource(node, 93);
          var cls = ts2.factory.createClassDeclaration(void 0, modifiers, node.name, void 0, void 0, memberElements);
          return cls;
        }
      }
      function getModifierKindFromSource(source, kind) {
        return ts2.filter(source.modifiers, function(modifier) {
          return modifier.kind === kind;
        });
      }
      function isConstructorAssignment(x) {
        if (!x.name)
          return false;
        if (ts2.isIdentifier(x.name) && x.name.text === "constructor")
          return true;
        return false;
      }
      function tryGetPropertyName(node, compilerOptions, quotePreference) {
        if (ts2.isPropertyAccessExpression(node)) {
          return node.name;
        }
        var propName = node.argumentExpression;
        if (ts2.isNumericLiteral(propName)) {
          return propName;
        }
        if (ts2.isStringLiteralLike(propName)) {
          return ts2.isIdentifierText(propName.text, ts2.getEmitScriptTarget(compilerOptions)) ? ts2.factory.createIdentifier(propName.text) : ts2.isNoSubstitutionTemplateLiteral(propName) ? ts2.factory.createStringLiteral(propName.text, quotePreference === 0) : propName;
        }
        return void 0;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "convertToAsyncFunction";
      var errorCodes = [ts2.Diagnostics.This_may_be_converted_to_an_async_function.code];
      var codeActionSucceeded = true;
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          codeActionSucceeded = true;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return convertToAsyncFunction(t, context.sourceFile, context.span.start, context.program.getTypeChecker());
          });
          return codeActionSucceeded ? [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_to_async_function, fixId, ts2.Diagnostics.Convert_all_to_async_functions)] : [];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, err) {
            return convertToAsyncFunction(changes, err.file, err.start, context.program.getTypeChecker());
          });
        }
      });
      var SynthBindingNameKind;
      (function(SynthBindingNameKind2) {
        SynthBindingNameKind2[SynthBindingNameKind2["Identifier"] = 0] = "Identifier";
        SynthBindingNameKind2[SynthBindingNameKind2["BindingPattern"] = 1] = "BindingPattern";
      })(SynthBindingNameKind || (SynthBindingNameKind = {}));
      function convertToAsyncFunction(changes, sourceFile, position, checker) {
        var tokenAtPosition = ts2.getTokenAtPosition(sourceFile, position);
        var functionToConvert;
        if (ts2.isIdentifier(tokenAtPosition) && ts2.isVariableDeclaration(tokenAtPosition.parent) && tokenAtPosition.parent.initializer && ts2.isFunctionLikeDeclaration(tokenAtPosition.parent.initializer)) {
          functionToConvert = tokenAtPosition.parent.initializer;
        } else {
          functionToConvert = ts2.tryCast(ts2.getContainingFunction(ts2.getTokenAtPosition(sourceFile, position)), ts2.canBeConvertedToAsync);
        }
        if (!functionToConvert) {
          return;
        }
        var synthNamesMap = new ts2.Map();
        var isInJavascript = ts2.isInJSFile(functionToConvert);
        var setOfExpressionsToReturn = getAllPromiseExpressionsToReturn(functionToConvert, checker);
        var functionToConvertRenamed = renameCollidingVarNames(functionToConvert, checker, synthNamesMap);
        if (!ts2.returnsPromise(functionToConvertRenamed, checker)) {
          return;
        }
        var returnStatements = functionToConvertRenamed.body && ts2.isBlock(functionToConvertRenamed.body) ? getReturnStatementsWithPromiseHandlers(functionToConvertRenamed.body, checker) : ts2.emptyArray;
        var transformer = { checker, synthNamesMap, setOfExpressionsToReturn, isInJSFile: isInJavascript };
        if (!returnStatements.length) {
          return;
        }
        var pos = functionToConvert.modifiers ? functionToConvert.modifiers.end : functionToConvert.decorators ? ts2.skipTrivia(sourceFile.text, functionToConvert.decorators.end) : functionToConvert.getStart(sourceFile);
        var options = functionToConvert.modifiers ? { prefix: " " } : { suffix: " " };
        changes.insertModifierAt(sourceFile, pos, 131, options);
        var _loop_14 = function(returnStatement2) {
          ts2.forEachChild(returnStatement2, function visit(node) {
            if (ts2.isCallExpression(node)) {
              var newNodes = transformExpression(node, node, transformer, false);
              if (hasFailed()) {
                return true;
              }
              changes.replaceNodeWithNodes(sourceFile, returnStatement2, newNodes);
            } else if (!ts2.isFunctionLike(node)) {
              ts2.forEachChild(node, visit);
              if (hasFailed()) {
                return true;
              }
            }
          });
          if (hasFailed()) {
            return { value: void 0 };
          }
        };
        for (var _i = 0, returnStatements_1 = returnStatements; _i < returnStatements_1.length; _i++) {
          var returnStatement = returnStatements_1[_i];
          var state_5 = _loop_14(returnStatement);
          if (typeof state_5 === "object")
            return state_5.value;
        }
      }
      function getReturnStatementsWithPromiseHandlers(body, checker) {
        var res = [];
        ts2.forEachReturnStatement(body, function(ret) {
          if (ts2.isReturnStatementWithFixablePromiseHandler(ret, checker))
            res.push(ret);
        });
        return res;
      }
      function getAllPromiseExpressionsToReturn(func, checker) {
        if (!func.body) {
          return new ts2.Set();
        }
        var setOfExpressionsToReturn = new ts2.Set();
        ts2.forEachChild(func.body, function visit(node) {
          if (isPromiseReturningCallExpression(node, checker, "then")) {
            setOfExpressionsToReturn.add(ts2.getNodeId(node));
            ts2.forEach(node.arguments, visit);
          } else if (isPromiseReturningCallExpression(node, checker, "catch") || isPromiseReturningCallExpression(node, checker, "finally")) {
            setOfExpressionsToReturn.add(ts2.getNodeId(node));
            ts2.forEachChild(node, visit);
          } else if (isPromiseTypedExpression(node, checker)) {
            setOfExpressionsToReturn.add(ts2.getNodeId(node));
          } else {
            ts2.forEachChild(node, visit);
          }
        });
        return setOfExpressionsToReturn;
      }
      function isPromiseReturningCallExpression(node, checker, name) {
        if (!ts2.isCallExpression(node))
          return false;
        var isExpressionOfName = ts2.hasPropertyAccessExpressionWithName(node, name);
        var nodeType = isExpressionOfName && checker.getTypeAtLocation(node);
        return !!(nodeType && checker.getPromisedTypeOfPromise(nodeType));
      }
      function isReferenceToType(type, target) {
        return (ts2.getObjectFlags(type) & 4) !== 0 && type.target === target;
      }
      function getExplicitPromisedTypeOfPromiseReturningCallExpression(node, callback, checker) {
        if (node.expression.name.escapedText === "finally") {
          return void 0;
        }
        var promiseType = checker.getTypeAtLocation(node.expression.expression);
        if (isReferenceToType(promiseType, checker.getPromiseType()) || isReferenceToType(promiseType, checker.getPromiseLikeType())) {
          if (node.expression.name.escapedText === "then") {
            if (callback === ts2.elementAt(node.arguments, 0)) {
              return ts2.elementAt(node.typeArguments, 0);
            } else if (callback === ts2.elementAt(node.arguments, 1)) {
              return ts2.elementAt(node.typeArguments, 1);
            }
          } else {
            return ts2.elementAt(node.typeArguments, 0);
          }
        }
      }
      function isPromiseTypedExpression(node, checker) {
        if (!ts2.isExpression(node))
          return false;
        return !!checker.getPromisedTypeOfPromise(checker.getTypeAtLocation(node));
      }
      function renameCollidingVarNames(nodeToRename, checker, synthNamesMap) {
        var identsToRenameMap = new ts2.Map();
        var collidingSymbolMap = ts2.createMultiMap();
        ts2.forEachChild(nodeToRename, function visit(node) {
          if (!ts2.isIdentifier(node)) {
            ts2.forEachChild(node, visit);
            return;
          }
          var symbol = checker.getSymbolAtLocation(node);
          if (symbol) {
            var type = checker.getTypeAtLocation(node);
            var lastCallSignature = getLastCallSignature(type, checker);
            var symbolIdString = ts2.getSymbolId(symbol).toString();
            if (lastCallSignature && !ts2.isParameter(node.parent) && !ts2.isFunctionLikeDeclaration(node.parent) && !synthNamesMap.has(symbolIdString)) {
              var firstParameter = ts2.firstOrUndefined(lastCallSignature.parameters);
              var ident = (firstParameter === null || firstParameter === void 0 ? void 0 : firstParameter.valueDeclaration) && ts2.isParameter(firstParameter.valueDeclaration) && ts2.tryCast(firstParameter.valueDeclaration.name, ts2.isIdentifier) || ts2.factory.createUniqueName("result", 16);
              var synthName = getNewNameIfConflict(ident, collidingSymbolMap);
              synthNamesMap.set(symbolIdString, synthName);
              collidingSymbolMap.add(ident.text, symbol);
            } else if (node.parent && (ts2.isParameter(node.parent) || ts2.isVariableDeclaration(node.parent) || ts2.isBindingElement(node.parent))) {
              var originalName = node.text;
              var collidingSymbols = collidingSymbolMap.get(originalName);
              if (collidingSymbols && collidingSymbols.some(function(prevSymbol) {
                return prevSymbol !== symbol;
              })) {
                var newName = getNewNameIfConflict(node, collidingSymbolMap);
                identsToRenameMap.set(symbolIdString, newName.identifier);
                synthNamesMap.set(symbolIdString, newName);
                collidingSymbolMap.add(originalName, symbol);
              } else {
                var identifier = ts2.getSynthesizedDeepClone(node);
                synthNamesMap.set(symbolIdString, createSynthIdentifier(identifier));
                collidingSymbolMap.add(originalName, symbol);
              }
            }
          }
        });
        return ts2.getSynthesizedDeepCloneWithReplacements(nodeToRename, true, function(original) {
          if (ts2.isBindingElement(original) && ts2.isIdentifier(original.name) && ts2.isObjectBindingPattern(original.parent)) {
            var symbol = checker.getSymbolAtLocation(original.name);
            var renameInfo = symbol && identsToRenameMap.get(String(ts2.getSymbolId(symbol)));
            if (renameInfo && renameInfo.text !== (original.name || original.propertyName).getText()) {
              return ts2.factory.createBindingElement(original.dotDotDotToken, original.propertyName || original.name, renameInfo, original.initializer);
            }
          } else if (ts2.isIdentifier(original)) {
            var symbol = checker.getSymbolAtLocation(original);
            var renameInfo = symbol && identsToRenameMap.get(String(ts2.getSymbolId(symbol)));
            if (renameInfo) {
              return ts2.factory.createIdentifier(renameInfo.text);
            }
          }
        });
      }
      function getNewNameIfConflict(name, originalNames) {
        var numVarsSameName = (originalNames.get(name.text) || ts2.emptyArray).length;
        var identifier = numVarsSameName === 0 ? name : ts2.factory.createIdentifier(name.text + "_" + numVarsSameName);
        return createSynthIdentifier(identifier);
      }
      function hasFailed() {
        return !codeActionSucceeded;
      }
      function silentFail() {
        codeActionSucceeded = false;
        return ts2.emptyArray;
      }
      function transformExpression(returnContextNode, node, transformer, hasContinuation, continuationArgName) {
        if (isPromiseReturningCallExpression(node, transformer.checker, "then")) {
          return transformThen(node, ts2.elementAt(node.arguments, 0), ts2.elementAt(node.arguments, 1), transformer, hasContinuation, continuationArgName);
        }
        if (isPromiseReturningCallExpression(node, transformer.checker, "catch")) {
          return transformCatch(node, ts2.elementAt(node.arguments, 0), transformer, hasContinuation, continuationArgName);
        }
        if (isPromiseReturningCallExpression(node, transformer.checker, "finally")) {
          return transformFinally(node, ts2.elementAt(node.arguments, 0), transformer, hasContinuation, continuationArgName);
        }
        if (ts2.isPropertyAccessExpression(node)) {
          return transformExpression(returnContextNode, node.expression, transformer, hasContinuation, continuationArgName);
        }
        var nodeType = transformer.checker.getTypeAtLocation(node);
        if (nodeType && transformer.checker.getPromisedTypeOfPromise(nodeType)) {
          ts2.Debug.assertNode(ts2.getOriginalNode(node).parent, ts2.isPropertyAccessExpression);
          return transformPromiseExpressionOfPropertyAccess(returnContextNode, node, transformer, hasContinuation, continuationArgName);
        }
        return silentFail();
      }
      function isNullOrUndefined(_a, node) {
        var checker = _a.checker;
        if (node.kind === 104)
          return true;
        if (ts2.isIdentifier(node) && !ts2.isGeneratedIdentifier(node) && ts2.idText(node) === "undefined") {
          var symbol = checker.getSymbolAtLocation(node);
          return !symbol || checker.isUndefinedSymbol(symbol);
        }
        return false;
      }
      function createUniqueSynthName(prevArgName) {
        var renamedPrevArg = ts2.factory.createUniqueName(prevArgName.identifier.text, 16);
        return createSynthIdentifier(renamedPrevArg);
      }
      function getPossibleNameForVarDecl(node, transformer, continuationArgName) {
        var possibleNameForVarDecl;
        if (continuationArgName && !shouldReturn(node, transformer)) {
          if (isSynthIdentifier(continuationArgName)) {
            possibleNameForVarDecl = continuationArgName;
            transformer.synthNamesMap.forEach(function(val, key) {
              if (val.identifier.text === continuationArgName.identifier.text) {
                var newSynthName = createUniqueSynthName(continuationArgName);
                transformer.synthNamesMap.set(key, newSynthName);
              }
            });
          } else {
            possibleNameForVarDecl = createSynthIdentifier(ts2.factory.createUniqueName("result", 16), continuationArgName.types);
          }
          declareSynthIdentifier(possibleNameForVarDecl);
        }
        return possibleNameForVarDecl;
      }
      function finishCatchOrFinallyTransform(node, transformer, tryStatement, possibleNameForVarDecl, continuationArgName) {
        var statements = [];
        var varDeclIdentifier;
        if (possibleNameForVarDecl && !shouldReturn(node, transformer)) {
          varDeclIdentifier = ts2.getSynthesizedDeepClone(declareSynthIdentifier(possibleNameForVarDecl));
          var typeArray = possibleNameForVarDecl.types;
          var unionType = transformer.checker.getUnionType(typeArray, 2);
          var unionTypeNode = transformer.isInJSFile ? void 0 : transformer.checker.typeToTypeNode(unionType, void 0, void 0);
          var varDecl = [ts2.factory.createVariableDeclaration(varDeclIdentifier, void 0, unionTypeNode)];
          var varDeclList = ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList(varDecl, 1));
          statements.push(varDeclList);
        }
        statements.push(tryStatement);
        if (continuationArgName && varDeclIdentifier && isSynthBindingPattern(continuationArgName)) {
          statements.push(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([
            ts2.factory.createVariableDeclaration(ts2.getSynthesizedDeepClone(declareSynthBindingPattern(continuationArgName)), void 0, void 0, varDeclIdentifier)
          ], 2)));
        }
        return statements;
      }
      function transformFinally(node, onFinally, transformer, hasContinuation, continuationArgName) {
        if (!onFinally || isNullOrUndefined(transformer, onFinally)) {
          return transformExpression(node, node.expression.expression, transformer, hasContinuation, continuationArgName);
        }
        var possibleNameForVarDecl = getPossibleNameForVarDecl(node, transformer, continuationArgName);
        var inlinedLeftHandSide = transformExpression(node, node.expression.expression, transformer, true, possibleNameForVarDecl);
        if (hasFailed())
          return silentFail();
        var inlinedCallback = transformCallbackArgument(onFinally, hasContinuation, void 0, void 0, node, transformer);
        if (hasFailed())
          return silentFail();
        var tryBlock = ts2.factory.createBlock(inlinedLeftHandSide);
        var finallyBlock = ts2.factory.createBlock(inlinedCallback);
        var tryStatement = ts2.factory.createTryStatement(tryBlock, void 0, finallyBlock);
        return finishCatchOrFinallyTransform(node, transformer, tryStatement, possibleNameForVarDecl, continuationArgName);
      }
      function transformCatch(node, onRejected, transformer, hasContinuation, continuationArgName) {
        if (!onRejected || isNullOrUndefined(transformer, onRejected)) {
          return transformExpression(node, node.expression.expression, transformer, hasContinuation, continuationArgName);
        }
        var inputArgName = getArgBindingName(onRejected, transformer);
        var possibleNameForVarDecl = getPossibleNameForVarDecl(node, transformer, continuationArgName);
        var inlinedLeftHandSide = transformExpression(node, node.expression.expression, transformer, true, possibleNameForVarDecl);
        if (hasFailed())
          return silentFail();
        var inlinedCallback = transformCallbackArgument(onRejected, hasContinuation, possibleNameForVarDecl, inputArgName, node, transformer);
        if (hasFailed())
          return silentFail();
        var tryBlock = ts2.factory.createBlock(inlinedLeftHandSide);
        var catchClause = ts2.factory.createCatchClause(inputArgName && ts2.getSynthesizedDeepClone(declareSynthBindingName(inputArgName)), ts2.factory.createBlock(inlinedCallback));
        var tryStatement = ts2.factory.createTryStatement(tryBlock, catchClause, void 0);
        return finishCatchOrFinallyTransform(node, transformer, tryStatement, possibleNameForVarDecl, continuationArgName);
      }
      function transformThen(node, onFulfilled, onRejected, transformer, hasContinuation, continuationArgName) {
        if (!onFulfilled || isNullOrUndefined(transformer, onFulfilled)) {
          return transformCatch(node, onRejected, transformer, hasContinuation, continuationArgName);
        }
        if (onRejected && !isNullOrUndefined(transformer, onRejected)) {
          return silentFail();
        }
        var inputArgName = getArgBindingName(onFulfilled, transformer);
        var inlinedLeftHandSide = transformExpression(node.expression.expression, node.expression.expression, transformer, true, inputArgName);
        if (hasFailed())
          return silentFail();
        var inlinedCallback = transformCallbackArgument(onFulfilled, hasContinuation, continuationArgName, inputArgName, node, transformer);
        if (hasFailed())
          return silentFail();
        return ts2.concatenate(inlinedLeftHandSide, inlinedCallback);
      }
      function transformPromiseExpressionOfPropertyAccess(returnContextNode, node, transformer, hasContinuation, continuationArgName) {
        if (shouldReturn(returnContextNode, transformer)) {
          var returnValue = ts2.getSynthesizedDeepClone(node);
          if (hasContinuation) {
            returnValue = ts2.factory.createAwaitExpression(returnValue);
          }
          return [ts2.factory.createReturnStatement(returnValue)];
        }
        return createVariableOrAssignmentOrExpressionStatement(continuationArgName, ts2.factory.createAwaitExpression(node), void 0);
      }
      function createVariableOrAssignmentOrExpressionStatement(variableName, rightHandSide, typeAnnotation) {
        if (!variableName || isEmptyBindingName(variableName)) {
          return [ts2.factory.createExpressionStatement(rightHandSide)];
        }
        if (isSynthIdentifier(variableName) && variableName.hasBeenDeclared) {
          return [ts2.factory.createExpressionStatement(ts2.factory.createAssignment(ts2.getSynthesizedDeepClone(referenceSynthIdentifier(variableName)), rightHandSide))];
        }
        return [
          ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([
            ts2.factory.createVariableDeclaration(ts2.getSynthesizedDeepClone(declareSynthBindingName(variableName)), void 0, typeAnnotation, rightHandSide)
          ], 2))
        ];
      }
      function maybeAnnotateAndReturn(expressionToReturn, typeAnnotation) {
        if (typeAnnotation && expressionToReturn) {
          var name = ts2.factory.createUniqueName("result", 16);
          return __spreadArray(__spreadArray([], createVariableOrAssignmentOrExpressionStatement(createSynthIdentifier(name), expressionToReturn, typeAnnotation), true), [
            ts2.factory.createReturnStatement(name)
          ], false);
        }
        return [ts2.factory.createReturnStatement(expressionToReturn)];
      }
      function transformCallbackArgument(func, hasContinuation, continuationArgName, inputArgName, parent, transformer) {
        var _a;
        switch (func.kind) {
          case 104:
            break;
          case 205:
          case 79:
            if (!inputArgName) {
              break;
            }
            var synthCall = ts2.factory.createCallExpression(ts2.getSynthesizedDeepClone(func), void 0, isSynthIdentifier(inputArgName) ? [referenceSynthIdentifier(inputArgName)] : []);
            if (shouldReturn(parent, transformer)) {
              return maybeAnnotateAndReturn(synthCall, getExplicitPromisedTypeOfPromiseReturningCallExpression(parent, func, transformer.checker));
            }
            var type = transformer.checker.getTypeAtLocation(func);
            var callSignatures = transformer.checker.getSignaturesOfType(type, 0);
            if (!callSignatures.length) {
              return silentFail();
            }
            var returnType = callSignatures[0].getReturnType();
            var varDeclOrAssignment = createVariableOrAssignmentOrExpressionStatement(continuationArgName, ts2.factory.createAwaitExpression(synthCall), getExplicitPromisedTypeOfPromiseReturningCallExpression(parent, func, transformer.checker));
            if (continuationArgName) {
              continuationArgName.types.push(transformer.checker.getAwaitedType(returnType) || returnType);
            }
            return varDeclOrAssignment;
          case 212:
          case 213: {
            var funcBody = func.body;
            var returnType_1 = (_a = getLastCallSignature(transformer.checker.getTypeAtLocation(func), transformer.checker)) === null || _a === void 0 ? void 0 : _a.getReturnType();
            if (ts2.isBlock(funcBody)) {
              var refactoredStmts = [];
              var seenReturnStatement = false;
              for (var _i = 0, _b = funcBody.statements; _i < _b.length; _i++) {
                var statement = _b[_i];
                if (ts2.isReturnStatement(statement)) {
                  seenReturnStatement = true;
                  if (ts2.isReturnStatementWithFixablePromiseHandler(statement, transformer.checker)) {
                    refactoredStmts = refactoredStmts.concat(transformReturnStatementWithFixablePromiseHandler(transformer, statement, hasContinuation, continuationArgName));
                  } else {
                    var possiblyAwaitedRightHandSide = returnType_1 && statement.expression ? getPossiblyAwaitedRightHandSide(transformer.checker, returnType_1, statement.expression) : statement.expression;
                    refactoredStmts.push.apply(refactoredStmts, maybeAnnotateAndReturn(possiblyAwaitedRightHandSide, getExplicitPromisedTypeOfPromiseReturningCallExpression(parent, func, transformer.checker)));
                  }
                } else if (hasContinuation && ts2.forEachReturnStatement(statement, ts2.returnTrue)) {
                  return silentFail();
                } else {
                  refactoredStmts.push(statement);
                }
              }
              return shouldReturn(parent, transformer) ? refactoredStmts.map(function(s) {
                return ts2.getSynthesizedDeepClone(s);
              }) : removeReturns(refactoredStmts, continuationArgName, transformer, seenReturnStatement);
            } else {
              var inlinedStatements = ts2.isFixablePromiseHandler(funcBody, transformer.checker) ? transformReturnStatementWithFixablePromiseHandler(transformer, ts2.factory.createReturnStatement(funcBody), hasContinuation, continuationArgName) : ts2.emptyArray;
              if (inlinedStatements.length > 0) {
                return inlinedStatements;
              }
              if (returnType_1) {
                var possiblyAwaitedRightHandSide = getPossiblyAwaitedRightHandSide(transformer.checker, returnType_1, funcBody);
                if (!shouldReturn(parent, transformer)) {
                  var transformedStatement = createVariableOrAssignmentOrExpressionStatement(continuationArgName, possiblyAwaitedRightHandSide, void 0);
                  if (continuationArgName) {
                    continuationArgName.types.push(transformer.checker.getAwaitedType(returnType_1) || returnType_1);
                  }
                  return transformedStatement;
                } else {
                  return maybeAnnotateAndReturn(possiblyAwaitedRightHandSide, getExplicitPromisedTypeOfPromiseReturningCallExpression(parent, func, transformer.checker));
                }
              } else {
                return silentFail();
              }
            }
          }
          default:
            return silentFail();
        }
        return ts2.emptyArray;
      }
      function getPossiblyAwaitedRightHandSide(checker, type, expr) {
        var rightHandSide = ts2.getSynthesizedDeepClone(expr);
        return !!checker.getPromisedTypeOfPromise(type) ? ts2.factory.createAwaitExpression(rightHandSide) : rightHandSide;
      }
      function getLastCallSignature(type, checker) {
        var callSignatures = checker.getSignaturesOfType(type, 0);
        return ts2.lastOrUndefined(callSignatures);
      }
      function removeReturns(stmts, prevArgName, transformer, seenReturnStatement) {
        var ret = [];
        for (var _i = 0, stmts_1 = stmts; _i < stmts_1.length; _i++) {
          var stmt = stmts_1[_i];
          if (ts2.isReturnStatement(stmt)) {
            if (stmt.expression) {
              var possiblyAwaitedExpression = isPromiseTypedExpression(stmt.expression, transformer.checker) ? ts2.factory.createAwaitExpression(stmt.expression) : stmt.expression;
              if (prevArgName === void 0) {
                ret.push(ts2.factory.createExpressionStatement(possiblyAwaitedExpression));
              } else if (isSynthIdentifier(prevArgName) && prevArgName.hasBeenDeclared) {
                ret.push(ts2.factory.createExpressionStatement(ts2.factory.createAssignment(referenceSynthIdentifier(prevArgName), possiblyAwaitedExpression)));
              } else {
                ret.push(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(declareSynthBindingName(prevArgName), void 0, void 0, possiblyAwaitedExpression)], 2)));
              }
            }
          } else {
            ret.push(ts2.getSynthesizedDeepClone(stmt));
          }
        }
        if (!seenReturnStatement && prevArgName !== void 0) {
          ret.push(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(declareSynthBindingName(prevArgName), void 0, void 0, ts2.factory.createIdentifier("undefined"))], 2)));
        }
        return ret;
      }
      function transformReturnStatementWithFixablePromiseHandler(transformer, innerRetStmt, hasContinuation, continuationArgName) {
        var innerCbBody = [];
        ts2.forEachChild(innerRetStmt, function visit(node) {
          if (ts2.isCallExpression(node)) {
            var temp = transformExpression(node, node, transformer, hasContinuation, continuationArgName);
            innerCbBody = innerCbBody.concat(temp);
            if (innerCbBody.length > 0) {
              return;
            }
          } else if (!ts2.isFunctionLike(node)) {
            ts2.forEachChild(node, visit);
          }
        });
        return innerCbBody;
      }
      function getArgBindingName(funcNode, transformer) {
        var types = [];
        var name;
        if (ts2.isFunctionLikeDeclaration(funcNode)) {
          if (funcNode.parameters.length > 0) {
            var param = funcNode.parameters[0].name;
            name = getMappedBindingNameOrDefault(param);
          }
        } else if (ts2.isIdentifier(funcNode)) {
          name = getMapEntryOrDefault(funcNode);
        } else if (ts2.isPropertyAccessExpression(funcNode) && ts2.isIdentifier(funcNode.name)) {
          name = getMapEntryOrDefault(funcNode.name);
        }
        if (!name || "identifier" in name && name.identifier.text === "undefined") {
          return void 0;
        }
        return name;
        function getMappedBindingNameOrDefault(bindingName) {
          if (ts2.isIdentifier(bindingName))
            return getMapEntryOrDefault(bindingName);
          var elements = ts2.flatMap(bindingName.elements, function(element) {
            if (ts2.isOmittedExpression(element))
              return [];
            return [getMappedBindingNameOrDefault(element.name)];
          });
          return createSynthBindingPattern(bindingName, elements);
        }
        function getMapEntryOrDefault(identifier) {
          var originalNode = getOriginalNode(identifier);
          var symbol = getSymbol(originalNode);
          if (!symbol) {
            return createSynthIdentifier(identifier, types);
          }
          var mapEntry = transformer.synthNamesMap.get(ts2.getSymbolId(symbol).toString());
          return mapEntry || createSynthIdentifier(identifier, types);
        }
        function getSymbol(node) {
          return node.symbol ? node.symbol : transformer.checker.getSymbolAtLocation(node);
        }
        function getOriginalNode(node) {
          return node.original ? node.original : node;
        }
      }
      function isEmptyBindingName(bindingName) {
        if (!bindingName) {
          return true;
        }
        if (isSynthIdentifier(bindingName)) {
          return !bindingName.identifier.text;
        }
        return ts2.every(bindingName.elements, isEmptyBindingName);
      }
      function createSynthIdentifier(identifier, types) {
        if (types === void 0) {
          types = [];
        }
        return { kind: 0, identifier, types, hasBeenDeclared: false, hasBeenReferenced: false };
      }
      function createSynthBindingPattern(bindingPattern, elements, types) {
        if (elements === void 0) {
          elements = ts2.emptyArray;
        }
        if (types === void 0) {
          types = [];
        }
        return { kind: 1, bindingPattern, elements, types };
      }
      function referenceSynthIdentifier(synthId) {
        synthId.hasBeenReferenced = true;
        return synthId.identifier;
      }
      function declareSynthBindingName(synthName) {
        return isSynthIdentifier(synthName) ? declareSynthIdentifier(synthName) : declareSynthBindingPattern(synthName);
      }
      function declareSynthBindingPattern(synthPattern) {
        for (var _i = 0, _a = synthPattern.elements; _i < _a.length; _i++) {
          var element = _a[_i];
          declareSynthBindingName(element);
        }
        return synthPattern.bindingPattern;
      }
      function declareSynthIdentifier(synthId) {
        synthId.hasBeenDeclared = true;
        return synthId.identifier;
      }
      function isSynthIdentifier(bindingName) {
        return bindingName.kind === 0;
      }
      function isSynthBindingPattern(bindingName) {
        return bindingName.kind === 1;
      }
      function shouldReturn(expression, transformer) {
        return !!expression.original && transformer.setOfExpressionsToReturn.has(ts2.getNodeId(expression.original));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      codefix2.registerCodeFix({
        errorCodes: [ts2.Diagnostics.File_is_a_CommonJS_module_it_may_be_converted_to_an_ES_module.code],
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, preferences = context.preferences;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(changes2) {
            var moduleExportsChangedToDefault = convertFileToEsModule(sourceFile, program.getTypeChecker(), changes2, ts2.getEmitScriptTarget(program.getCompilerOptions()), ts2.getQuotePreference(sourceFile, preferences));
            if (moduleExportsChangedToDefault) {
              for (var _i = 0, _a = program.getSourceFiles(); _i < _a.length; _i++) {
                var importingFile = _a[_i];
                fixImportOfModuleExports(importingFile, sourceFile, changes2, ts2.getQuotePreference(importingFile, preferences));
              }
            }
          });
          return [codefix2.createCodeFixActionWithoutFixAll("convertToEsModule", changes, ts2.Diagnostics.Convert_to_ES_module)];
        }
      });
      function fixImportOfModuleExports(importingFile, exportingFile, changes, quotePreference) {
        for (var _i = 0, _a = importingFile.imports; _i < _a.length; _i++) {
          var moduleSpecifier = _a[_i];
          var imported = ts2.getResolvedModule(importingFile, moduleSpecifier.text, ts2.getModeForUsageLocation(importingFile, moduleSpecifier));
          if (!imported || imported.resolvedFileName !== exportingFile.fileName) {
            continue;
          }
          var importNode = ts2.importFromModuleSpecifier(moduleSpecifier);
          switch (importNode.kind) {
            case 264:
              changes.replaceNode(importingFile, importNode, ts2.makeImport(importNode.name, void 0, moduleSpecifier, quotePreference));
              break;
            case 207:
              if (ts2.isRequireCall(importNode, false)) {
                changes.replaceNode(importingFile, importNode, ts2.factory.createPropertyAccessExpression(ts2.getSynthesizedDeepClone(importNode), "default"));
              }
              break;
          }
        }
      }
      function convertFileToEsModule(sourceFile, checker, changes, target, quotePreference) {
        var identifiers = { original: collectFreeIdentifiers(sourceFile), additional: new ts2.Set() };
        var exports = collectExportRenames(sourceFile, checker, identifiers);
        convertExportsAccesses(sourceFile, exports, changes);
        var moduleExportsChangedToDefault = false;
        var useSitesToUnqualify;
        for (var _i = 0, _a = ts2.filter(sourceFile.statements, ts2.isVariableStatement); _i < _a.length; _i++) {
          var statement = _a[_i];
          var newUseSites = convertVariableStatement(sourceFile, statement, changes, checker, identifiers, target, quotePreference);
          if (newUseSites) {
            ts2.copyEntries(newUseSites, useSitesToUnqualify !== null && useSitesToUnqualify !== void 0 ? useSitesToUnqualify : useSitesToUnqualify = new ts2.Map());
          }
        }
        for (var _b = 0, _c = ts2.filter(sourceFile.statements, function(s) {
          return !ts2.isVariableStatement(s);
        }); _b < _c.length; _b++) {
          var statement = _c[_b];
          var moduleExportsChanged = convertStatement(sourceFile, statement, checker, changes, identifiers, target, exports, useSitesToUnqualify, quotePreference);
          moduleExportsChangedToDefault = moduleExportsChangedToDefault || moduleExportsChanged;
        }
        useSitesToUnqualify === null || useSitesToUnqualify === void 0 ? void 0 : useSitesToUnqualify.forEach(function(replacement, original) {
          changes.replaceNode(sourceFile, original, replacement);
        });
        return moduleExportsChangedToDefault;
      }
      function collectExportRenames(sourceFile, checker, identifiers) {
        var res = new ts2.Map();
        forEachExportReference(sourceFile, function(node) {
          var _a = node.name, text = _a.text, originalKeywordKind = _a.originalKeywordKind;
          if (!res.has(text) && (originalKeywordKind !== void 0 && ts2.isNonContextualKeyword(originalKeywordKind) || checker.resolveName(text, node, 111551, true))) {
            res.set(text, makeUniqueName("_".concat(text), identifiers));
          }
        });
        return res;
      }
      function convertExportsAccesses(sourceFile, exports, changes) {
        forEachExportReference(sourceFile, function(node, isAssignmentLhs) {
          if (isAssignmentLhs) {
            return;
          }
          var text = node.name.text;
          changes.replaceNode(sourceFile, node, ts2.factory.createIdentifier(exports.get(text) || text));
        });
      }
      function forEachExportReference(sourceFile, cb) {
        sourceFile.forEachChild(function recur(node) {
          if (ts2.isPropertyAccessExpression(node) && ts2.isExportsOrModuleExportsOrAlias(sourceFile, node.expression) && ts2.isIdentifier(node.name)) {
            var parent = node.parent;
            cb(node, ts2.isBinaryExpression(parent) && parent.left === node && parent.operatorToken.kind === 63);
          }
          node.forEachChild(recur);
        });
      }
      function convertStatement(sourceFile, statement, checker, changes, identifiers, target, exports, useSitesToUnqualify, quotePreference) {
        switch (statement.kind) {
          case 236:
            convertVariableStatement(sourceFile, statement, changes, checker, identifiers, target, quotePreference);
            return false;
          case 237: {
            var expression = statement.expression;
            switch (expression.kind) {
              case 207: {
                if (ts2.isRequireCall(expression, true)) {
                  changes.replaceNode(sourceFile, statement, ts2.makeImport(void 0, void 0, expression.arguments[0], quotePreference));
                }
                return false;
              }
              case 220: {
                var operatorToken = expression.operatorToken;
                return operatorToken.kind === 63 && convertAssignment(sourceFile, checker, expression, changes, exports, useSitesToUnqualify);
              }
            }
          }
          default:
            return false;
        }
      }
      function convertVariableStatement(sourceFile, statement, changes, checker, identifiers, target, quotePreference) {
        var declarationList = statement.declarationList;
        var foundImport = false;
        var converted = ts2.map(declarationList.declarations, function(decl) {
          var name = decl.name, initializer = decl.initializer;
          if (initializer) {
            if (ts2.isExportsOrModuleExportsOrAlias(sourceFile, initializer)) {
              foundImport = true;
              return convertedImports([]);
            } else if (ts2.isRequireCall(initializer, true)) {
              foundImport = true;
              return convertSingleImport(name, initializer.arguments[0], checker, identifiers, target, quotePreference);
            } else if (ts2.isPropertyAccessExpression(initializer) && ts2.isRequireCall(initializer.expression, true)) {
              foundImport = true;
              return convertPropertyAccessImport(name, initializer.name.text, initializer.expression.arguments[0], identifiers, quotePreference);
            }
          }
          return convertedImports([ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([decl], declarationList.flags))]);
        });
        if (foundImport) {
          changes.replaceNodeWithNodes(sourceFile, statement, ts2.flatMap(converted, function(c) {
            return c.newImports;
          }));
          var combinedUseSites_1;
          ts2.forEach(converted, function(c) {
            if (c.useSitesToUnqualify) {
              ts2.copyEntries(c.useSitesToUnqualify, combinedUseSites_1 !== null && combinedUseSites_1 !== void 0 ? combinedUseSites_1 : combinedUseSites_1 = new ts2.Map());
            }
          });
          return combinedUseSites_1;
        }
      }
      function convertPropertyAccessImport(name, propertyName, moduleSpecifier, identifiers, quotePreference) {
        switch (name.kind) {
          case 200:
          case 201: {
            var tmp = makeUniqueName(propertyName, identifiers);
            return convertedImports([
              makeSingleImport(tmp, propertyName, moduleSpecifier, quotePreference),
              makeConst(void 0, name, ts2.factory.createIdentifier(tmp))
            ]);
          }
          case 79:
            return convertedImports([makeSingleImport(name.text, propertyName, moduleSpecifier, quotePreference)]);
          default:
            return ts2.Debug.assertNever(name, "Convert to ES module got invalid syntax form ".concat(name.kind));
        }
      }
      function convertAssignment(sourceFile, checker, assignment, changes, exports, useSitesToUnqualify) {
        var left = assignment.left, right = assignment.right;
        if (!ts2.isPropertyAccessExpression(left)) {
          return false;
        }
        if (ts2.isExportsOrModuleExportsOrAlias(sourceFile, left)) {
          if (ts2.isExportsOrModuleExportsOrAlias(sourceFile, right)) {
            changes.delete(sourceFile, assignment.parent);
          } else {
            var replacement = ts2.isObjectLiteralExpression(right) ? tryChangeModuleExportsObject(right, useSitesToUnqualify) : ts2.isRequireCall(right, true) ? convertReExportAll(right.arguments[0], checker) : void 0;
            if (replacement) {
              changes.replaceNodeWithNodes(sourceFile, assignment.parent, replacement[0]);
              return replacement[1];
            } else {
              changes.replaceRangeWithText(sourceFile, ts2.createRange(left.getStart(sourceFile), right.pos), "export default");
              return true;
            }
          }
        } else if (ts2.isExportsOrModuleExportsOrAlias(sourceFile, left.expression)) {
          convertNamedExport(sourceFile, assignment, changes, exports);
        }
        return false;
      }
      function tryChangeModuleExportsObject(object, useSitesToUnqualify) {
        var statements = ts2.mapAllOrFail(object.properties, function(prop) {
          switch (prop.kind) {
            case 171:
            case 172:
            case 295:
            case 296:
              return void 0;
            case 294:
              return !ts2.isIdentifier(prop.name) ? void 0 : convertExportsDotXEquals_replaceNode(prop.name.text, prop.initializer, useSitesToUnqualify);
            case 168:
              return !ts2.isIdentifier(prop.name) ? void 0 : functionExpressionToDeclaration(prop.name.text, [ts2.factory.createToken(93)], prop, useSitesToUnqualify);
            default:
              ts2.Debug.assertNever(prop, "Convert to ES6 got invalid prop kind ".concat(prop.kind));
          }
        });
        return statements && [statements, false];
      }
      function convertNamedExport(sourceFile, assignment, changes, exports) {
        var text = assignment.left.name.text;
        var rename = exports.get(text);
        if (rename !== void 0) {
          var newNodes = [
            makeConst(void 0, rename, assignment.right),
            makeExportDeclaration([ts2.factory.createExportSpecifier(false, rename, text)])
          ];
          changes.replaceNodeWithNodes(sourceFile, assignment.parent, newNodes);
        } else {
          convertExportsPropertyAssignment(assignment, sourceFile, changes);
        }
      }
      function convertReExportAll(reExported, checker) {
        var moduleSpecifier = reExported.text;
        var moduleSymbol = checker.getSymbolAtLocation(reExported);
        var exports = moduleSymbol ? moduleSymbol.exports : ts2.emptyMap;
        return exports.has("export=") ? [[reExportDefault(moduleSpecifier)], true] : !exports.has("default") ? [[reExportStar(moduleSpecifier)], false] : exports.size > 1 ? [[reExportStar(moduleSpecifier), reExportDefault(moduleSpecifier)], true] : [[reExportDefault(moduleSpecifier)], true];
      }
      function reExportStar(moduleSpecifier) {
        return makeExportDeclaration(void 0, moduleSpecifier);
      }
      function reExportDefault(moduleSpecifier) {
        return makeExportDeclaration([ts2.factory.createExportSpecifier(false, void 0, "default")], moduleSpecifier);
      }
      function convertExportsPropertyAssignment(_a, sourceFile, changes) {
        var left = _a.left, right = _a.right, parent = _a.parent;
        var name = left.name.text;
        if ((ts2.isFunctionExpression(right) || ts2.isArrowFunction(right) || ts2.isClassExpression(right)) && (!right.name || right.name.text === name)) {
          changes.replaceRange(sourceFile, { pos: left.getStart(sourceFile), end: right.getStart(sourceFile) }, ts2.factory.createToken(93), { suffix: " " });
          if (!right.name)
            changes.insertName(sourceFile, right, name);
          var semi = ts2.findChildOfKind(parent, 26, sourceFile);
          if (semi)
            changes.delete(sourceFile, semi);
        } else {
          changes.replaceNodeRangeWithNodes(sourceFile, left.expression, ts2.findChildOfKind(left, 24, sourceFile), [ts2.factory.createToken(93), ts2.factory.createToken(85)], { joiner: " ", suffix: " " });
        }
      }
      function convertExportsDotXEquals_replaceNode(name, exported, useSitesToUnqualify) {
        var modifiers = [ts2.factory.createToken(93)];
        switch (exported.kind) {
          case 212: {
            var expressionName = exported.name;
            if (expressionName && expressionName.text !== name) {
              return exportConst();
            }
          }
          case 213:
            return functionExpressionToDeclaration(name, modifiers, exported, useSitesToUnqualify);
          case 225:
            return classExpressionToDeclaration(name, modifiers, exported, useSitesToUnqualify);
          default:
            return exportConst();
        }
        function exportConst() {
          return makeConst(modifiers, ts2.factory.createIdentifier(name), replaceImportUseSites(exported, useSitesToUnqualify));
        }
      }
      function replaceImportUseSites(nodeOrNodes, useSitesToUnqualify) {
        if (!useSitesToUnqualify || !ts2.some(ts2.arrayFrom(useSitesToUnqualify.keys()), function(original) {
          return ts2.rangeContainsRange(nodeOrNodes, original);
        })) {
          return nodeOrNodes;
        }
        return ts2.isArray(nodeOrNodes) ? ts2.getSynthesizedDeepClonesWithReplacements(nodeOrNodes, true, replaceNode) : ts2.getSynthesizedDeepCloneWithReplacements(nodeOrNodes, true, replaceNode);
        function replaceNode(original) {
          if (original.kind === 205) {
            var replacement = useSitesToUnqualify.get(original);
            useSitesToUnqualify.delete(original);
            return replacement;
          }
        }
      }
      function convertSingleImport(name, moduleSpecifier, checker, identifiers, target, quotePreference) {
        switch (name.kind) {
          case 200: {
            var importSpecifiers = ts2.mapAllOrFail(name.elements, function(e) {
              return e.dotDotDotToken || e.initializer || e.propertyName && !ts2.isIdentifier(e.propertyName) || !ts2.isIdentifier(e.name) ? void 0 : makeImportSpecifier(e.propertyName && e.propertyName.text, e.name.text);
            });
            if (importSpecifiers) {
              return convertedImports([ts2.makeImport(void 0, importSpecifiers, moduleSpecifier, quotePreference)]);
            }
          }
          case 201: {
            var tmp = makeUniqueName(codefix2.moduleSpecifierToValidIdentifier(moduleSpecifier.text, target), identifiers);
            return convertedImports([
              ts2.makeImport(ts2.factory.createIdentifier(tmp), void 0, moduleSpecifier, quotePreference),
              makeConst(void 0, ts2.getSynthesizedDeepClone(name), ts2.factory.createIdentifier(tmp))
            ]);
          }
          case 79:
            return convertSingleIdentifierImport(name, moduleSpecifier, checker, identifiers, quotePreference);
          default:
            return ts2.Debug.assertNever(name, "Convert to ES module got invalid name kind ".concat(name.kind));
        }
      }
      function convertSingleIdentifierImport(name, moduleSpecifier, checker, identifiers, quotePreference) {
        var nameSymbol = checker.getSymbolAtLocation(name);
        var namedBindingsNames = new ts2.Map();
        var needDefaultImport = false;
        var useSitesToUnqualify;
        for (var _i = 0, _a = identifiers.original.get(name.text); _i < _a.length; _i++) {
          var use = _a[_i];
          if (checker.getSymbolAtLocation(use) !== nameSymbol || use === name) {
            continue;
          }
          var parent = use.parent;
          if (ts2.isPropertyAccessExpression(parent)) {
            var propertyName = parent.name.text;
            if (propertyName === "default") {
              needDefaultImport = true;
              var importDefaultName = use.getText();
              (useSitesToUnqualify !== null && useSitesToUnqualify !== void 0 ? useSitesToUnqualify : useSitesToUnqualify = new ts2.Map()).set(parent, ts2.factory.createIdentifier(importDefaultName));
            } else {
              ts2.Debug.assert(parent.expression === use, "Didn't expect expression === use");
              var idName = namedBindingsNames.get(propertyName);
              if (idName === void 0) {
                idName = makeUniqueName(propertyName, identifiers);
                namedBindingsNames.set(propertyName, idName);
              }
              (useSitesToUnqualify !== null && useSitesToUnqualify !== void 0 ? useSitesToUnqualify : useSitesToUnqualify = new ts2.Map()).set(parent, ts2.factory.createIdentifier(idName));
            }
          } else {
            needDefaultImport = true;
          }
        }
        var namedBindings = namedBindingsNames.size === 0 ? void 0 : ts2.arrayFrom(ts2.mapIterator(namedBindingsNames.entries(), function(_a2) {
          var propertyName2 = _a2[0], idName2 = _a2[1];
          return ts2.factory.createImportSpecifier(false, propertyName2 === idName2 ? void 0 : ts2.factory.createIdentifier(propertyName2), ts2.factory.createIdentifier(idName2));
        }));
        if (!namedBindings) {
          needDefaultImport = true;
        }
        return convertedImports([ts2.makeImport(needDefaultImport ? ts2.getSynthesizedDeepClone(name) : void 0, namedBindings, moduleSpecifier, quotePreference)], useSitesToUnqualify);
      }
      function makeUniqueName(name, identifiers) {
        while (identifiers.original.has(name) || identifiers.additional.has(name)) {
          name = "_".concat(name);
        }
        identifiers.additional.add(name);
        return name;
      }
      function collectFreeIdentifiers(file) {
        var map = ts2.createMultiMap();
        forEachFreeIdentifier(file, function(id) {
          return map.add(id.text, id);
        });
        return map;
      }
      function forEachFreeIdentifier(node, cb) {
        if (ts2.isIdentifier(node) && isFreeIdentifier(node))
          cb(node);
        node.forEachChild(function(child) {
          return forEachFreeIdentifier(child, cb);
        });
      }
      function isFreeIdentifier(node) {
        var parent = node.parent;
        switch (parent.kind) {
          case 205:
            return parent.name !== node;
          case 202:
            return parent.propertyName !== node;
          case 269:
            return parent.propertyName !== node;
          default:
            return true;
        }
      }
      function functionExpressionToDeclaration(name, additionalModifiers, fn, useSitesToUnqualify) {
        return ts2.factory.createFunctionDeclaration(ts2.getSynthesizedDeepClones(fn.decorators), ts2.concatenate(additionalModifiers, ts2.getSynthesizedDeepClones(fn.modifiers)), ts2.getSynthesizedDeepClone(fn.asteriskToken), name, ts2.getSynthesizedDeepClones(fn.typeParameters), ts2.getSynthesizedDeepClones(fn.parameters), ts2.getSynthesizedDeepClone(fn.type), ts2.factory.converters.convertToFunctionBlock(replaceImportUseSites(fn.body, useSitesToUnqualify)));
      }
      function classExpressionToDeclaration(name, additionalModifiers, cls, useSitesToUnqualify) {
        return ts2.factory.createClassDeclaration(ts2.getSynthesizedDeepClones(cls.decorators), ts2.concatenate(additionalModifiers, ts2.getSynthesizedDeepClones(cls.modifiers)), name, ts2.getSynthesizedDeepClones(cls.typeParameters), ts2.getSynthesizedDeepClones(cls.heritageClauses), replaceImportUseSites(cls.members, useSitesToUnqualify));
      }
      function makeSingleImport(localName, propertyName, moduleSpecifier, quotePreference) {
        return propertyName === "default" ? ts2.makeImport(ts2.factory.createIdentifier(localName), void 0, moduleSpecifier, quotePreference) : ts2.makeImport(void 0, [makeImportSpecifier(propertyName, localName)], moduleSpecifier, quotePreference);
      }
      function makeImportSpecifier(propertyName, name) {
        return ts2.factory.createImportSpecifier(false, propertyName !== void 0 && propertyName !== name ? ts2.factory.createIdentifier(propertyName) : void 0, ts2.factory.createIdentifier(name));
      }
      function makeConst(modifiers, name, init) {
        return ts2.factory.createVariableStatement(modifiers, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(name, void 0, void 0, init)], 2));
      }
      function makeExportDeclaration(exportSpecifiers, moduleSpecifier) {
        return ts2.factory.createExportDeclaration(void 0, void 0, false, exportSpecifiers && ts2.factory.createNamedExports(exportSpecifiers), moduleSpecifier === void 0 ? void 0 : ts2.factory.createStringLiteral(moduleSpecifier));
      }
      function convertedImports(newImports, useSitesToUnqualify) {
        return {
          newImports,
          useSitesToUnqualify
        };
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "correctQualifiedNameToIndexedAccessType";
      var errorCodes = [ts2.Diagnostics.Cannot_access_0_1_because_0_is_a_type_but_not_a_namespace_Did_you_mean_to_retrieve_the_type_of_the_property_1_in_0_with_0_1.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var qualifiedName = getQualifiedName(context.sourceFile, context.span.start);
          if (!qualifiedName)
            return void 0;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, qualifiedName);
          });
          var newText = "".concat(qualifiedName.left.text, '["').concat(qualifiedName.right.text, '"]');
          return [codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Rewrite_as_the_indexed_access_type_0, newText], fixId, ts2.Diagnostics.Rewrite_all_as_indexed_access_types)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var q = getQualifiedName(diag.file, diag.start);
            if (q) {
              doChange(changes, diag.file, q);
            }
          });
        }
      });
      function getQualifiedName(sourceFile, pos) {
        var qualifiedName = ts2.findAncestor(ts2.getTokenAtPosition(sourceFile, pos), ts2.isQualifiedName);
        ts2.Debug.assert(!!qualifiedName, "Expected position to be owned by a qualified name.");
        return ts2.isIdentifier(qualifiedName.left) ? qualifiedName : void 0;
      }
      function doChange(changeTracker, sourceFile, qualifiedName) {
        var rightText = qualifiedName.right.text;
        var replacement = ts2.factory.createIndexedAccessTypeNode(ts2.factory.createTypeReferenceNode(qualifiedName.left, void 0), ts2.factory.createLiteralTypeNode(ts2.factory.createStringLiteral(rightText)));
        changeTracker.replaceNode(sourceFile, qualifiedName, replacement);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var errorCodes = [ts2.Diagnostics.Re_exporting_a_type_when_the_isolatedModules_flag_is_provided_requires_using_export_type.code];
      var fixId = "convertToTypeOnlyExport";
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return fixSingleExportDeclaration(t, getExportSpecifierForDiagnosticSpan(context.span, context.sourceFile), context);
          });
          if (changes.length) {
            return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_to_type_only_export, fixId, ts2.Diagnostics.Convert_all_re_exported_types_to_type_only_exports)];
          }
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var fixedExportDeclarations = new ts2.Map();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var exportSpecifier = getExportSpecifierForDiagnosticSpan(diag, context.sourceFile);
            if (exportSpecifier && ts2.addToSeen(fixedExportDeclarations, ts2.getNodeId(exportSpecifier.parent.parent))) {
              fixSingleExportDeclaration(changes, exportSpecifier, context);
            }
          });
        }
      });
      function getExportSpecifierForDiagnosticSpan(span, sourceFile) {
        return ts2.tryCast(ts2.getTokenAtPosition(sourceFile, span.start).parent, ts2.isExportSpecifier);
      }
      function fixSingleExportDeclaration(changes, exportSpecifier, context) {
        if (!exportSpecifier) {
          return;
        }
        var exportClause = exportSpecifier.parent;
        var exportDeclaration = exportClause.parent;
        var typeExportSpecifiers = getTypeExportSpecifiers(exportSpecifier, context);
        if (typeExportSpecifiers.length === exportClause.elements.length) {
          changes.insertModifierBefore(context.sourceFile, 151, exportClause);
        } else {
          var valueExportDeclaration = ts2.factory.updateExportDeclaration(exportDeclaration, exportDeclaration.decorators, exportDeclaration.modifiers, false, ts2.factory.updateNamedExports(exportClause, ts2.filter(exportClause.elements, function(e) {
            return !ts2.contains(typeExportSpecifiers, e);
          })), exportDeclaration.moduleSpecifier, void 0);
          var typeExportDeclaration = ts2.factory.createExportDeclaration(void 0, void 0, true, ts2.factory.createNamedExports(typeExportSpecifiers), exportDeclaration.moduleSpecifier, void 0);
          changes.replaceNode(context.sourceFile, exportDeclaration, valueExportDeclaration, {
            leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.IncludeAll,
            trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Exclude
          });
          changes.insertNodeAfter(context.sourceFile, exportDeclaration, typeExportDeclaration);
        }
      }
      function getTypeExportSpecifiers(originExportSpecifier, context) {
        var exportClause = originExportSpecifier.parent;
        if (exportClause.elements.length === 1) {
          return exportClause.elements;
        }
        var diagnostics = ts2.getDiagnosticsWithinSpan(ts2.createTextSpanFromNode(exportClause), context.program.getSemanticDiagnostics(context.sourceFile, context.cancellationToken));
        return ts2.filter(exportClause.elements, function(element) {
          var _a;
          return element === originExportSpecifier || ((_a = ts2.findDiagnosticForNode(element, diagnostics)) === null || _a === void 0 ? void 0 : _a.code) === errorCodes[0];
        });
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var errorCodes = [ts2.Diagnostics.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error.code];
      var fixId = "convertToTypeOnlyImport";
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            var importDeclaration = getImportDeclarationForDiagnosticSpan(context.span, context.sourceFile);
            fixSingleImportDeclaration(t, importDeclaration, context);
          });
          if (changes.length) {
            return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_to_type_only_import, fixId, ts2.Diagnostics.Convert_all_imports_not_used_as_a_value_to_type_only_imports)];
          }
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var importDeclaration = getImportDeclarationForDiagnosticSpan(diag, context.sourceFile);
            fixSingleImportDeclaration(changes, importDeclaration, context);
          });
        }
      });
      function getImportDeclarationForDiagnosticSpan(span, sourceFile) {
        return ts2.tryCast(ts2.getTokenAtPosition(sourceFile, span.start).parent, ts2.isImportDeclaration);
      }
      function fixSingleImportDeclaration(changes, importDeclaration, context) {
        if (!(importDeclaration === null || importDeclaration === void 0 ? void 0 : importDeclaration.importClause)) {
          return;
        }
        var importClause = importDeclaration.importClause;
        changes.insertText(context.sourceFile, importDeclaration.getStart() + "import".length, " type");
        if (importClause.name && importClause.namedBindings) {
          changes.deleteNodeRangeExcludingEnd(context.sourceFile, importClause.name, importDeclaration.importClause.namedBindings);
          changes.insertNodeBefore(context.sourceFile, importDeclaration, ts2.factory.updateImportDeclaration(importDeclaration, void 0, void 0, ts2.factory.createImportClause(true, importClause.name, void 0), importDeclaration.moduleSpecifier, void 0));
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "convertLiteralTypeToMappedType";
      var errorCodes = [ts2.Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here_Did_you_mean_to_use_1_in_0.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var info = getInfo(sourceFile, span.start);
          if (!info) {
            return void 0;
          }
          var name = info.name, constraint = info.constraint;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, info);
          });
          return [codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Convert_0_to_1_in_0, constraint, name], fixId, ts2.Diagnostics.Convert_all_type_literals_to_mapped_type)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, diag.start);
            if (info) {
              doChange(changes, diag.file, info);
            }
          });
        }
      });
      function getInfo(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        if (ts2.isIdentifier(token)) {
          var propertySignature = ts2.cast(token.parent.parent, ts2.isPropertySignature);
          var propertyName = token.getText(sourceFile);
          return {
            container: ts2.cast(propertySignature.parent, ts2.isTypeLiteralNode),
            typeNode: propertySignature.type,
            constraint: propertyName,
            name: propertyName === "K" ? "P" : "K"
          };
        }
        return void 0;
      }
      function doChange(changes, sourceFile, _a) {
        var container = _a.container, typeNode = _a.typeNode, constraint = _a.constraint, name = _a.name;
        changes.replaceNode(sourceFile, container, ts2.factory.createMappedTypeNode(void 0, ts2.factory.createTypeParameterDeclaration(name, ts2.factory.createTypeReferenceNode(constraint)), void 0, void 0, typeNode, void 0));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var errorCodes = [
        ts2.Diagnostics.Class_0_incorrectly_implements_interface_1.code,
        ts2.Diagnostics.Class_0_incorrectly_implements_class_1_Did_you_mean_to_extend_1_and_inherit_its_members_as_a_subclass.code
      ];
      var fixId = "fixClassIncorrectlyImplementsInterface";
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var classDeclaration = getClass(sourceFile, span.start);
          return ts2.mapDefined(ts2.getEffectiveImplementsTypeNodes(classDeclaration), function(implementedTypeNode) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return addMissingDeclarations(context, implementedTypeNode, sourceFile, classDeclaration, t, context.preferences);
            });
            return changes.length === 0 ? void 0 : codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Implement_interface_0, implementedTypeNode.getText(sourceFile)], fixId, ts2.Diagnostics.Implement_all_unimplemented_interfaces);
          });
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var seenClassDeclarations = new ts2.Map();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var classDeclaration = getClass(diag.file, diag.start);
            if (ts2.addToSeen(seenClassDeclarations, ts2.getNodeId(classDeclaration))) {
              for (var _i = 0, _a = ts2.getEffectiveImplementsTypeNodes(classDeclaration); _i < _a.length; _i++) {
                var implementedTypeNode = _a[_i];
                addMissingDeclarations(context, implementedTypeNode, diag.file, classDeclaration, changes, context.preferences);
              }
            }
          });
        }
      });
      function getClass(sourceFile, pos) {
        return ts2.Debug.checkDefined(ts2.getContainingClass(ts2.getTokenAtPosition(sourceFile, pos)), "There should be a containing class");
      }
      function symbolPointsToNonPrivateMember(symbol) {
        return !symbol.valueDeclaration || !(ts2.getEffectiveModifierFlags(symbol.valueDeclaration) & 8);
      }
      function addMissingDeclarations(context, implementedTypeNode, sourceFile, classDeclaration, changeTracker, preferences) {
        var checker = context.program.getTypeChecker();
        var maybeHeritageClauseSymbol = getHeritageClauseSymbolTable(classDeclaration, checker);
        var implementedType = checker.getTypeAtLocation(implementedTypeNode);
        var implementedTypeSymbols = checker.getPropertiesOfType(implementedType);
        var nonPrivateAndNotExistedInHeritageClauseMembers = implementedTypeSymbols.filter(ts2.and(symbolPointsToNonPrivateMember, function(symbol) {
          return !maybeHeritageClauseSymbol.has(symbol.escapedName);
        }));
        var classType = checker.getTypeAtLocation(classDeclaration);
        var constructor = ts2.find(classDeclaration.members, function(m) {
          return ts2.isConstructorDeclaration(m);
        });
        if (!classType.getNumberIndexType()) {
          createMissingIndexSignatureDeclaration(implementedType, 1);
        }
        if (!classType.getStringIndexType()) {
          createMissingIndexSignatureDeclaration(implementedType, 0);
        }
        var importAdder = codefix2.createImportAdder(sourceFile, context.program, preferences, context.host);
        codefix2.createMissingMemberNodes(classDeclaration, nonPrivateAndNotExistedInHeritageClauseMembers, sourceFile, context, preferences, importAdder, function(member) {
          return insertInterfaceMemberNode(sourceFile, classDeclaration, member);
        });
        importAdder.writeFixes(changeTracker);
        function createMissingIndexSignatureDeclaration(type, kind) {
          var indexInfoOfKind = checker.getIndexInfoOfType(type, kind);
          if (indexInfoOfKind) {
            insertInterfaceMemberNode(sourceFile, classDeclaration, checker.indexInfoToIndexSignatureDeclaration(indexInfoOfKind, classDeclaration, void 0, codefix2.getNoopSymbolTrackerWithResolver(context)));
          }
        }
        function insertInterfaceMemberNode(sourceFile2, cls, newElement) {
          if (constructor) {
            changeTracker.insertNodeAfter(sourceFile2, constructor, newElement);
          } else {
            changeTracker.insertNodeAtClassStart(sourceFile2, cls, newElement);
          }
        }
      }
      function getHeritageClauseSymbolTable(classDeclaration, checker) {
        var heritageClauseNode = ts2.getEffectiveBaseTypeNode(classDeclaration);
        if (!heritageClauseNode)
          return ts2.createSymbolTable();
        var heritageClauseType = checker.getTypeAtLocation(heritageClauseNode);
        var heritageClauseTypeSymbols = checker.getPropertiesOfType(heritageClauseType);
        return ts2.createSymbolTable(heritageClauseTypeSymbols.filter(symbolPointsToNonPrivateMember));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      codefix2.importFixName = "import";
      var importFixId = "fixMissingImport";
      var errorCodes = [
        ts2.Diagnostics.Cannot_find_name_0.code,
        ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_1.code,
        ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code,
        ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code,
        ts2.Diagnostics.Cannot_find_namespace_0.code,
        ts2.Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code,
        ts2.Diagnostics._0_only_refers_to_a_type_but_is_being_used_as_a_value_here.code,
        ts2.Diagnostics.No_value_exists_in_scope_for_the_shorthand_property_0_Either_declare_one_or_provide_an_initializer.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var errorCode = context.errorCode, preferences = context.preferences, sourceFile = context.sourceFile, span = context.span, program = context.program;
          var info = getFixesInfo(context, errorCode, span.start, true);
          if (!info)
            return void 0;
          var fixes = info.fixes, symbolName = info.symbolName;
          var quotePreference = ts2.getQuotePreference(sourceFile, preferences);
          return fixes.map(function(fix) {
            return codeActionForFix(context, sourceFile, symbolName, fix, quotePreference, program.getCompilerOptions());
          });
        },
        fixIds: [importFixId],
        getAllCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, preferences = context.preferences, host = context.host;
          var importAdder = createImportAdderWorker(sourceFile, program, true, preferences, host);
          codefix2.eachDiagnostic(context, errorCodes, function(diag) {
            return importAdder.addImportFromDiagnostic(diag, context);
          });
          return codefix2.createCombinedCodeActions(ts2.textChanges.ChangeTracker.with(context, importAdder.writeFixes));
        }
      });
      function createImportAdder(sourceFile, program, preferences, host) {
        return createImportAdderWorker(sourceFile, program, false, preferences, host);
      }
      codefix2.createImportAdder = createImportAdder;
      function createImportAdderWorker(sourceFile, program, useAutoImportProvider, preferences, host) {
        var compilerOptions = program.getCompilerOptions();
        var addToNamespace = [];
        var importType = [];
        var addToExisting = new ts2.Map();
        var newImports = new ts2.Map();
        return { addImportFromDiagnostic, addImportFromExportedSymbol, writeFixes, hasFixes };
        function addImportFromDiagnostic(diagnostic, context) {
          var info = getFixesInfo(context, diagnostic.code, diagnostic.start, useAutoImportProvider);
          if (!info || !info.fixes.length)
            return;
          addImport(info);
        }
        function addImportFromExportedSymbol(exportedSymbol, isValidTypeOnlyUseSite) {
          var moduleSymbol = ts2.Debug.checkDefined(exportedSymbol.parent);
          var symbolName = ts2.getNameForExportedSymbol(exportedSymbol, ts2.getEmitScriptTarget(compilerOptions));
          var checker = program.getTypeChecker();
          var symbol = checker.getMergedSymbol(ts2.skipAlias(exportedSymbol, checker));
          var exportInfos = getAllReExportingModules(sourceFile, symbol, moduleSymbol, symbolName, host, program, preferences, useAutoImportProvider);
          var useRequire = shouldUseRequire(sourceFile, program);
          var fix = getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, void 0, !!isValidTypeOnlyUseSite, useRequire, host, preferences);
          if (fix) {
            addImport({ fixes: [fix], symbolName });
          }
        }
        function addImport(info) {
          var _a, _b;
          var fixes = info.fixes, symbolName = info.symbolName;
          var fix = ts2.first(fixes);
          switch (fix.kind) {
            case 0:
              addToNamespace.push(fix);
              break;
            case 1:
              importType.push(fix);
              break;
            case 2: {
              var importClauseOrBindingPattern = fix.importClauseOrBindingPattern, importKind = fix.importKind, addAsTypeOnly = fix.addAsTypeOnly;
              var key = String(ts2.getNodeId(importClauseOrBindingPattern));
              var entry = addToExisting.get(key);
              if (!entry) {
                addToExisting.set(key, entry = { importClauseOrBindingPattern, defaultImport: void 0, namedImports: new ts2.Map() });
              }
              if (importKind === 0) {
                var prevValue = entry === null || entry === void 0 ? void 0 : entry.namedImports.get(symbolName);
                entry.namedImports.set(symbolName, reduceAddAsTypeOnlyValues(prevValue, addAsTypeOnly));
              } else {
                ts2.Debug.assert(entry.defaultImport === void 0 || entry.defaultImport.name === symbolName, "(Add to Existing) Default import should be missing or match symbolName");
                entry.defaultImport = {
                  name: symbolName,
                  addAsTypeOnly: reduceAddAsTypeOnlyValues((_a = entry.defaultImport) === null || _a === void 0 ? void 0 : _a.addAsTypeOnly, addAsTypeOnly)
                };
              }
              break;
            }
            case 3: {
              var moduleSpecifier = fix.moduleSpecifier, importKind = fix.importKind, useRequire = fix.useRequire, addAsTypeOnly = fix.addAsTypeOnly;
              var entry = getNewImportEntry(moduleSpecifier, importKind, useRequire, addAsTypeOnly);
              ts2.Debug.assert(entry.useRequire === useRequire, "(Add new) Tried to add an `import` and a `require` for the same module");
              switch (importKind) {
                case 1:
                  ts2.Debug.assert(entry.defaultImport === void 0 || entry.defaultImport.name === symbolName, "(Add new) Default import should be missing or match symbolName");
                  entry.defaultImport = { name: symbolName, addAsTypeOnly: reduceAddAsTypeOnlyValues((_b = entry.defaultImport) === null || _b === void 0 ? void 0 : _b.addAsTypeOnly, addAsTypeOnly) };
                  break;
                case 0:
                  var prevValue = (entry.namedImports || (entry.namedImports = new ts2.Map())).get(symbolName);
                  entry.namedImports.set(symbolName, reduceAddAsTypeOnlyValues(prevValue, addAsTypeOnly));
                  break;
                case 3:
                case 2:
                  ts2.Debug.assert(entry.namespaceLikeImport === void 0 || entry.namespaceLikeImport.name === symbolName, "Namespacelike import shoudl be missing or match symbolName");
                  entry.namespaceLikeImport = { importKind, name: symbolName, addAsTypeOnly };
                  break;
              }
              break;
            }
            default:
              ts2.Debug.assertNever(fix, "fix wasn't never - got kind ".concat(fix.kind));
          }
          function reduceAddAsTypeOnlyValues(prevValue2, newValue) {
            return Math.max(prevValue2 !== null && prevValue2 !== void 0 ? prevValue2 : 0, newValue);
          }
          function getNewImportEntry(moduleSpecifier2, importKind2, useRequire2, addAsTypeOnly2) {
            var typeOnlyKey = newImportsKey(moduleSpecifier2, true);
            var nonTypeOnlyKey = newImportsKey(moduleSpecifier2, false);
            var typeOnlyEntry = newImports.get(typeOnlyKey);
            var nonTypeOnlyEntry = newImports.get(nonTypeOnlyKey);
            var newEntry = {
              defaultImport: void 0,
              namedImports: void 0,
              namespaceLikeImport: void 0,
              useRequire: useRequire2
            };
            if (importKind2 === 1 && addAsTypeOnly2 === 2) {
              if (typeOnlyEntry)
                return typeOnlyEntry;
              newImports.set(typeOnlyKey, newEntry);
              return newEntry;
            }
            if (addAsTypeOnly2 === 1 && (typeOnlyEntry || nonTypeOnlyEntry)) {
              return typeOnlyEntry || nonTypeOnlyEntry;
            }
            if (nonTypeOnlyEntry) {
              return nonTypeOnlyEntry;
            }
            newImports.set(nonTypeOnlyKey, newEntry);
            return newEntry;
          }
          function newImportsKey(moduleSpecifier2, topLevelTypeOnly) {
            return "".concat(topLevelTypeOnly ? 1 : 0, "|").concat(moduleSpecifier2);
          }
        }
        function writeFixes(changeTracker) {
          var quotePreference = ts2.getQuotePreference(sourceFile, preferences);
          for (var _i = 0, addToNamespace_1 = addToNamespace; _i < addToNamespace_1.length; _i++) {
            var fix = addToNamespace_1[_i];
            addNamespaceQualifier(changeTracker, sourceFile, fix);
          }
          for (var _a = 0, importType_1 = importType; _a < importType_1.length; _a++) {
            var fix = importType_1[_a];
            addImportType(changeTracker, sourceFile, fix, quotePreference);
          }
          addToExisting.forEach(function(_a2) {
            var importClauseOrBindingPattern = _a2.importClauseOrBindingPattern, defaultImport = _a2.defaultImport, namedImports = _a2.namedImports;
            doAddExistingFix(changeTracker, sourceFile, importClauseOrBindingPattern, defaultImport, ts2.arrayFrom(namedImports.entries(), function(_a3) {
              var name = _a3[0], addAsTypeOnly = _a3[1];
              return { addAsTypeOnly, name };
            }), compilerOptions);
          });
          var newDeclarations;
          newImports.forEach(function(_a2, key) {
            var useRequire = _a2.useRequire, defaultImport = _a2.defaultImport, namedImports = _a2.namedImports, namespaceLikeImport = _a2.namespaceLikeImport;
            var moduleSpecifier = key.slice(2);
            var getDeclarations = useRequire ? getNewRequires : getNewImports;
            var declarations = getDeclarations(moduleSpecifier, quotePreference, defaultImport, namedImports && ts2.arrayFrom(namedImports.entries(), function(_a3) {
              var name = _a3[0], addAsTypeOnly = _a3[1];
              return { addAsTypeOnly, name };
            }), namespaceLikeImport);
            newDeclarations = ts2.combine(newDeclarations, declarations);
          });
          if (newDeclarations) {
            ts2.insertImports(changeTracker, sourceFile, newDeclarations, true);
          }
        }
        function hasFixes() {
          return addToNamespace.length > 0 || importType.length > 0 || addToExisting.size > 0 || newImports.size > 0;
        }
      }
      var ImportFixKind;
      (function(ImportFixKind2) {
        ImportFixKind2[ImportFixKind2["UseNamespace"] = 0] = "UseNamespace";
        ImportFixKind2[ImportFixKind2["JsdocTypeImport"] = 1] = "JsdocTypeImport";
        ImportFixKind2[ImportFixKind2["AddToExisting"] = 2] = "AddToExisting";
        ImportFixKind2[ImportFixKind2["AddNew"] = 3] = "AddNew";
      })(ImportFixKind || (ImportFixKind = {}));
      var AddAsTypeOnly;
      (function(AddAsTypeOnly2) {
        AddAsTypeOnly2[AddAsTypeOnly2["Allowed"] = 1] = "Allowed";
        AddAsTypeOnly2[AddAsTypeOnly2["Required"] = 2] = "Required";
        AddAsTypeOnly2[AddAsTypeOnly2["NotAllowed"] = 4] = "NotAllowed";
      })(AddAsTypeOnly || (AddAsTypeOnly = {}));
      function getImportCompletionAction(targetSymbol, moduleSymbol, sourceFile, symbolName, host, program, formatContext, position, preferences) {
        var compilerOptions = program.getCompilerOptions();
        var exportInfos = ts2.pathIsBareSpecifier(ts2.stripQuotes(moduleSymbol.name)) ? [getSymbolExportInfoForSymbol(targetSymbol, moduleSymbol, program, host)] : getAllReExportingModules(sourceFile, targetSymbol, moduleSymbol, symbolName, host, program, preferences, true);
        var useRequire = shouldUseRequire(sourceFile, program);
        var isValidTypeOnlyUseSite = ts2.isValidTypeOnlyAliasUseSite(ts2.getTokenAtPosition(sourceFile, position));
        var fix = ts2.Debug.checkDefined(getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, position, isValidTypeOnlyUseSite, useRequire, host, preferences));
        return {
          moduleSpecifier: fix.moduleSpecifier,
          codeAction: codeFixActionToCodeAction(codeActionForFix({ host, formatContext, preferences }, sourceFile, symbolName, fix, ts2.getQuotePreference(sourceFile, preferences), compilerOptions))
        };
      }
      codefix2.getImportCompletionAction = getImportCompletionAction;
      function getImportFixForSymbol(sourceFile, exportInfos, moduleSymbol, symbolName, program, position, isValidTypeOnlyUseSite, useRequire, host, preferences) {
        ts2.Debug.assert(exportInfos.some(function(info) {
          return info.moduleSymbol === moduleSymbol || info.symbol.parent === moduleSymbol;
        }), "Some exportInfo should match the specified moduleSymbol");
        return getBestFix(getImportFixes(exportInfos, symbolName, position, isValidTypeOnlyUseSite, useRequire, program, sourceFile, host, preferences), sourceFile, program, host, preferences);
      }
      function codeFixActionToCodeAction(_a) {
        var description = _a.description, changes = _a.changes, commands = _a.commands;
        return { description, changes, commands };
      }
      function getSymbolExportInfoForSymbol(symbol, moduleSymbol, program, host) {
        var _a, _b;
        var compilerOptions = program.getCompilerOptions();
        var mainProgramInfo = getInfoWithChecker(program.getTypeChecker(), false);
        if (mainProgramInfo) {
          return mainProgramInfo;
        }
        var autoImportProvider = (_b = (_a = host.getPackageJsonAutoImportProvider) === null || _a === void 0 ? void 0 : _a.call(host)) === null || _b === void 0 ? void 0 : _b.getTypeChecker();
        return ts2.Debug.checkDefined(autoImportProvider && getInfoWithChecker(autoImportProvider, true), "Could not find symbol in specified module for code actions");
        function getInfoWithChecker(checker, isFromPackageJson) {
          var defaultInfo = ts2.getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions);
          if (defaultInfo && ts2.skipAlias(defaultInfo.symbol, checker) === symbol) {
            return { symbol: defaultInfo.symbol, moduleSymbol, moduleFileName: void 0, exportKind: defaultInfo.exportKind, targetFlags: ts2.skipAlias(symbol, checker).flags, isFromPackageJson };
          }
          var named = checker.tryGetMemberInModuleExportsAndProperties(symbol.name, moduleSymbol);
          if (named && ts2.skipAlias(named, checker) === symbol) {
            return { symbol: named, moduleSymbol, moduleFileName: void 0, exportKind: 0, targetFlags: ts2.skipAlias(symbol, checker).flags, isFromPackageJson };
          }
        }
      }
      function getAllReExportingModules(importingFile, targetSymbol, exportingModuleSymbol, symbolName, host, program, preferences, useAutoImportProvider) {
        var result = [];
        var compilerOptions = program.getCompilerOptions();
        var getModuleSpecifierResolutionHost = ts2.memoizeOne(function(isFromPackageJson) {
          return ts2.createModuleSpecifierResolutionHost(isFromPackageJson ? host.getPackageJsonAutoImportProvider() : program, host);
        });
        ts2.forEachExternalModuleToImportFrom(program, host, useAutoImportProvider, function(moduleSymbol, moduleFile, program2, isFromPackageJson) {
          var checker = program2.getTypeChecker();
          if (moduleFile && moduleSymbol !== exportingModuleSymbol && ts2.startsWith(importingFile.fileName, ts2.getDirectoryPath(moduleFile.fileName))) {
            return;
          }
          var defaultInfo = ts2.getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions);
          if (defaultInfo && (defaultInfo.name === symbolName || moduleSymbolToValidIdentifier(moduleSymbol, ts2.getEmitScriptTarget(compilerOptions)) === symbolName) && ts2.skipAlias(defaultInfo.symbol, checker) === targetSymbol && isImportable(program2, moduleFile, isFromPackageJson)) {
            result.push({ symbol: defaultInfo.symbol, moduleSymbol, moduleFileName: moduleFile === null || moduleFile === void 0 ? void 0 : moduleFile.fileName, exportKind: defaultInfo.exportKind, targetFlags: ts2.skipAlias(defaultInfo.symbol, checker).flags, isFromPackageJson });
          }
          for (var _i = 0, _a = checker.getExportsAndPropertiesOfModule(moduleSymbol); _i < _a.length; _i++) {
            var exported = _a[_i];
            if (exported.name === symbolName && checker.getMergedSymbol(ts2.skipAlias(exported, checker)) === targetSymbol && isImportable(program2, moduleFile, isFromPackageJson)) {
              result.push({ symbol: exported, moduleSymbol, moduleFileName: moduleFile === null || moduleFile === void 0 ? void 0 : moduleFile.fileName, exportKind: 0, targetFlags: ts2.skipAlias(exported, checker).flags, isFromPackageJson });
            }
          }
        });
        return result;
        function isImportable(program2, moduleFile, isFromPackageJson) {
          var _a;
          return !moduleFile || ts2.isImportableFile(program2, importingFile, moduleFile, preferences, void 0, getModuleSpecifierResolutionHost(isFromPackageJson), (_a = host.getModuleSpecifierCache) === null || _a === void 0 ? void 0 : _a.call(host));
        }
      }
      function getModuleSpecifierForBestExportInfo(exportInfo, importingFile, program, host, preferences, fromCacheOnly) {
        var _a = getNewImportFixes(program, importingFile, void 0, false, false, exportInfo, host, preferences, fromCacheOnly), fixes = _a.fixes, computedWithoutCacheCount = _a.computedWithoutCacheCount;
        var result = getBestFix(fixes, importingFile, program, host, preferences);
        return result && __assign(__assign({}, result), { computedWithoutCacheCount });
      }
      codefix2.getModuleSpecifierForBestExportInfo = getModuleSpecifierForBestExportInfo;
      function getImportFixes(exportInfos, symbolName, position, isValidTypeOnlyUseSite, useRequire, program, sourceFile, host, preferences) {
        var checker = program.getTypeChecker();
        var existingImports = ts2.flatMap(exportInfos, function(info) {
          return getExistingImportDeclarations(info, checker, sourceFile, program.getCompilerOptions());
        });
        var useNamespace = position === void 0 ? void 0 : tryUseExistingNamespaceImport(existingImports, symbolName, position, checker);
        var addToExisting = tryAddToExistingImport(existingImports, isValidTypeOnlyUseSite, checker, program.getCompilerOptions());
        var addImport = addToExisting ? [addToExisting] : getFixesForAddImport(exportInfos, existingImports, program, sourceFile, position, isValidTypeOnlyUseSite, useRequire, host, preferences);
        return __spreadArray(__spreadArray([], useNamespace ? [useNamespace] : ts2.emptyArray, true), addImport, true);
      }
      function tryUseExistingNamespaceImport(existingImports, symbolName, position, checker) {
        return ts2.firstDefined(existingImports, function(_a) {
          var declaration = _a.declaration;
          var namespacePrefix = getNamespaceLikeImportText(declaration);
          var moduleSpecifier = ts2.tryGetModuleSpecifierFromDeclaration(declaration);
          if (namespacePrefix && moduleSpecifier) {
            var moduleSymbol = getTargetModuleFromNamespaceLikeImport(declaration, checker);
            if (moduleSymbol && moduleSymbol.exports.has(ts2.escapeLeadingUnderscores(symbolName))) {
              return { kind: 0, namespacePrefix, position, moduleSpecifier };
            }
          }
        });
      }
      function getTargetModuleFromNamespaceLikeImport(declaration, checker) {
        var _a;
        switch (declaration.kind) {
          case 253:
            return checker.resolveExternalModuleName(declaration.initializer.arguments[0]);
          case 264:
            return checker.getAliasedSymbol(declaration.symbol);
          case 265:
            var namespaceImport = ts2.tryCast((_a = declaration.importClause) === null || _a === void 0 ? void 0 : _a.namedBindings, ts2.isNamespaceImport);
            return namespaceImport && checker.getAliasedSymbol(namespaceImport.symbol);
          default:
            return ts2.Debug.assertNever(declaration);
        }
      }
      function getNamespaceLikeImportText(declaration) {
        var _a, _b, _c;
        switch (declaration.kind) {
          case 253:
            return (_a = ts2.tryCast(declaration.name, ts2.isIdentifier)) === null || _a === void 0 ? void 0 : _a.text;
          case 264:
            return declaration.name.text;
          case 265:
            return (_c = ts2.tryCast((_b = declaration.importClause) === null || _b === void 0 ? void 0 : _b.namedBindings, ts2.isNamespaceImport)) === null || _c === void 0 ? void 0 : _c.name.text;
          default:
            return ts2.Debug.assertNever(declaration);
        }
      }
      function getAddAsTypeOnly(isValidTypeOnlyUseSite, isForNewImportDeclaration, symbol, targetFlags, checker, compilerOptions) {
        if (!isValidTypeOnlyUseSite) {
          return 4;
        }
        if (isForNewImportDeclaration && compilerOptions.importsNotUsedAsValues === 2) {
          return 2;
        }
        if (compilerOptions.isolatedModules && compilerOptions.preserveValueImports && (!(targetFlags & 111551) || !!checker.getTypeOnlyAliasDeclaration(symbol))) {
          return 2;
        }
        return 1;
      }
      function tryAddToExistingImport(existingImports, isValidTypeOnlyUseSite, checker, compilerOptions) {
        return ts2.firstDefined(existingImports, function(_a) {
          var declaration = _a.declaration, importKind = _a.importKind, symbol = _a.symbol, targetFlags = _a.targetFlags;
          if (importKind === 3 || importKind === 2 || declaration.kind === 264) {
            return void 0;
          }
          if (declaration.kind === 253) {
            return (importKind === 0 || importKind === 1) && declaration.name.kind === 200 ? { kind: 2, importClauseOrBindingPattern: declaration.name, importKind, moduleSpecifier: declaration.initializer.arguments[0].text, addAsTypeOnly: 4 } : void 0;
          }
          var importClause = declaration.importClause;
          if (!importClause || !ts2.isStringLiteralLike(declaration.moduleSpecifier))
            return void 0;
          var name = importClause.name, namedBindings = importClause.namedBindings;
          if (importClause.isTypeOnly && !(importKind === 0 && namedBindings))
            return void 0;
          var addAsTypeOnly = getAddAsTypeOnly(isValidTypeOnlyUseSite, false, symbol, targetFlags, checker, compilerOptions);
          if (importKind === 1 && (name || addAsTypeOnly === 2 && namedBindings))
            return void 0;
          if (importKind === 0 && (namedBindings === null || namedBindings === void 0 ? void 0 : namedBindings.kind) === 267)
            return void 0;
          return {
            kind: 2,
            importClauseOrBindingPattern: importClause,
            importKind,
            moduleSpecifier: declaration.moduleSpecifier.text,
            addAsTypeOnly
          };
        });
      }
      function getExistingImportDeclarations(_a, checker, importingFile, compilerOptions) {
        var moduleSymbol = _a.moduleSymbol, exportKind = _a.exportKind, targetFlags = _a.targetFlags, symbol = _a.symbol;
        if (!(targetFlags & 111551) && ts2.isSourceFileJS(importingFile))
          return ts2.emptyArray;
        var importKind = getImportKind(importingFile, exportKind, compilerOptions);
        return ts2.mapDefined(importingFile.imports, function(moduleSpecifier) {
          var i = ts2.importFromModuleSpecifier(moduleSpecifier);
          if (ts2.isVariableDeclarationInitializedToRequire(i.parent)) {
            return checker.resolveExternalModuleName(moduleSpecifier) === moduleSymbol ? { declaration: i.parent, importKind, symbol, targetFlags } : void 0;
          }
          if (i.kind === 265 || i.kind === 264) {
            return checker.getSymbolAtLocation(moduleSpecifier) === moduleSymbol ? { declaration: i, importKind, symbol, targetFlags } : void 0;
          }
        });
      }
      function shouldUseRequire(sourceFile, program) {
        if (!ts2.isSourceFileJS(sourceFile)) {
          return false;
        }
        if (sourceFile.commonJsModuleIndicator && !sourceFile.externalModuleIndicator)
          return true;
        if (sourceFile.externalModuleIndicator && !sourceFile.commonJsModuleIndicator)
          return false;
        var compilerOptions = program.getCompilerOptions();
        if (compilerOptions.configFile) {
          return ts2.getEmitModuleKind(compilerOptions) < ts2.ModuleKind.ES2015;
        }
        for (var _i = 0, _a = program.getSourceFiles(); _i < _a.length; _i++) {
          var otherFile = _a[_i];
          if (otherFile === sourceFile || !ts2.isSourceFileJS(otherFile) || program.isSourceFileFromExternalLibrary(otherFile))
            continue;
          if (otherFile.commonJsModuleIndicator && !otherFile.externalModuleIndicator)
            return true;
          if (otherFile.externalModuleIndicator && !otherFile.commonJsModuleIndicator)
            return false;
        }
        return true;
      }
      function getNewImportFixes(program, sourceFile, position, isValidTypeOnlyUseSite, useRequire, moduleSymbols, host, preferences, fromCacheOnly) {
        var isJs = ts2.isSourceFileJS(sourceFile);
        var compilerOptions = program.getCompilerOptions();
        var moduleSpecifierResolutionHost = ts2.createModuleSpecifierResolutionHost(program, host);
        var getChecker = ts2.memoizeOne(function(isFromPackageJson) {
          return isFromPackageJson ? host.getPackageJsonAutoImportProvider().getTypeChecker() : program.getTypeChecker();
        });
        var getModuleSpecifiers = fromCacheOnly ? function(moduleSymbol) {
          return { moduleSpecifiers: ts2.moduleSpecifiers.tryGetModuleSpecifiersFromCache(moduleSymbol, sourceFile, moduleSpecifierResolutionHost, preferences), computedWithoutCache: false };
        } : function(moduleSymbol, checker) {
          return ts2.moduleSpecifiers.getModuleSpecifiersWithCacheInfo(moduleSymbol, checker, compilerOptions, sourceFile, moduleSpecifierResolutionHost, preferences);
        };
        var computedWithoutCacheCount = 0;
        var fixes = ts2.flatMap(moduleSymbols, function(exportInfo) {
          var checker = getChecker(exportInfo.isFromPackageJson);
          var _a = getModuleSpecifiers(exportInfo.moduleSymbol, checker), computedWithoutCache = _a.computedWithoutCache, moduleSpecifiers = _a.moduleSpecifiers;
          var importedSymbolHasValueMeaning = !!(exportInfo.targetFlags & 111551);
          var addAsTypeOnly = getAddAsTypeOnly(isValidTypeOnlyUseSite, true, exportInfo.symbol, exportInfo.targetFlags, checker, compilerOptions);
          computedWithoutCacheCount += computedWithoutCache ? 1 : 0;
          return moduleSpecifiers === null || moduleSpecifiers === void 0 ? void 0 : moduleSpecifiers.map(function(moduleSpecifier) {
            return !importedSymbolHasValueMeaning && isJs && position !== void 0 ? { kind: 1, moduleSpecifier, position, exportInfo } : {
              kind: 3,
              moduleSpecifier,
              importKind: getImportKind(sourceFile, exportInfo.exportKind, compilerOptions),
              useRequire,
              addAsTypeOnly,
              exportInfo
            };
          });
        });
        return { computedWithoutCacheCount, fixes };
      }
      function getFixesForAddImport(exportInfos, existingImports, program, sourceFile, position, isValidTypeOnlyUseSite, useRequire, host, preferences) {
        var existingDeclaration = ts2.firstDefined(existingImports, function(info) {
          return newImportInfoFromExistingSpecifier(info, isValidTypeOnlyUseSite, useRequire, program.getTypeChecker(), program.getCompilerOptions());
        });
        return existingDeclaration ? [existingDeclaration] : getNewImportFixes(program, sourceFile, position, isValidTypeOnlyUseSite, useRequire, exportInfos, host, preferences).fixes;
      }
      function newImportInfoFromExistingSpecifier(_a, isValidTypeOnlyUseSite, useRequire, checker, compilerOptions) {
        var declaration = _a.declaration, importKind = _a.importKind, symbol = _a.symbol, targetFlags = _a.targetFlags;
        var moduleSpecifier = ts2.tryGetModuleSpecifierFromDeclaration(declaration);
        if (moduleSpecifier) {
          var addAsTypeOnly = useRequire ? 4 : getAddAsTypeOnly(isValidTypeOnlyUseSite, true, symbol, targetFlags, checker, compilerOptions);
          return { kind: 3, moduleSpecifier, importKind, addAsTypeOnly, useRequire };
        }
      }
      function getFixesInfo(context, errorCode, pos, useAutoImportProvider) {
        var symbolToken = ts2.getTokenAtPosition(context.sourceFile, pos);
        var info = errorCode === ts2.Diagnostics._0_refers_to_a_UMD_global_but_the_current_file_is_a_module_Consider_adding_an_import_instead.code ? getFixesInfoForUMDImport(context, symbolToken) : ts2.isIdentifier(symbolToken) ? getFixesInfoForNonUMDImport(context, symbolToken, useAutoImportProvider) : void 0;
        return info && __assign(__assign({}, info), { fixes: sortFixes(info.fixes, context.sourceFile, context.program, context.host, context.preferences) });
      }
      function sortFixes(fixes, sourceFile, program, host, preferences) {
        var allowsImportingSpecifier = ts2.createPackageJsonImportFilter(sourceFile, preferences, host).allowsImportingSpecifier;
        return ts2.sort(fixes, function(a, b) {
          return ts2.compareValues(a.kind, b.kind) || compareModuleSpecifiers(a, b, sourceFile, program, allowsImportingSpecifier);
        });
      }
      function getBestFix(fixes, sourceFile, program, host, preferences) {
        if (!ts2.some(fixes))
          return;
        if (fixes[0].kind === 0 || fixes[0].kind === 2) {
          return fixes[0];
        }
        var allowsImportingSpecifier = ts2.createPackageJsonImportFilter(sourceFile, preferences, host).allowsImportingSpecifier;
        return fixes.reduce(function(best, fix) {
          return compareModuleSpecifiers(fix, best, sourceFile, program, allowsImportingSpecifier) === -1 ? fix : best;
        });
      }
      function compareModuleSpecifiers(a, b, importingFile, program, allowsImportingSpecifier) {
        if (a.kind !== 0 && b.kind !== 0) {
          return ts2.compareBooleans(allowsImportingSpecifier(b.moduleSpecifier), allowsImportingSpecifier(a.moduleSpecifier)) || compareNodeCoreModuleSpecifiers(a.moduleSpecifier, b.moduleSpecifier, importingFile, program) || ts2.compareNumberOfDirectorySeparators(a.moduleSpecifier, b.moduleSpecifier);
        }
        return 0;
      }
      function compareNodeCoreModuleSpecifiers(a, b, importingFile, program) {
        if (ts2.startsWith(a, "node:") && !ts2.startsWith(b, "node:"))
          return ts2.shouldUseUriStyleNodeCoreModules(importingFile, program) ? -1 : 1;
        if (ts2.startsWith(b, "node:") && !ts2.startsWith(a, "node:"))
          return ts2.shouldUseUriStyleNodeCoreModules(importingFile, program) ? 1 : -1;
        return 0;
      }
      function getFixesInfoForUMDImport(_a, token) {
        var sourceFile = _a.sourceFile, program = _a.program, host = _a.host, preferences = _a.preferences;
        var checker = program.getTypeChecker();
        var umdSymbol = getUmdSymbol(token, checker);
        if (!umdSymbol)
          return void 0;
        var symbol = checker.getAliasedSymbol(umdSymbol);
        var symbolName = umdSymbol.name;
        var exportInfos = [{ symbol: umdSymbol, moduleSymbol: symbol, moduleFileName: void 0, exportKind: 3, targetFlags: symbol.flags, isFromPackageJson: false }];
        var useRequire = shouldUseRequire(sourceFile, program);
        var fixes = getImportFixes(exportInfos, symbolName, ts2.isIdentifier(token) ? token.getStart(sourceFile) : void 0, false, useRequire, program, sourceFile, host, preferences);
        return { fixes, symbolName };
      }
      function getUmdSymbol(token, checker) {
        var umdSymbol = ts2.isIdentifier(token) ? checker.getSymbolAtLocation(token) : void 0;
        if (ts2.isUMDExportSymbol(umdSymbol))
          return umdSymbol;
        var parent = token.parent;
        return ts2.isJsxOpeningLikeElement(parent) && parent.tagName === token || ts2.isJsxOpeningFragment(parent) ? ts2.tryCast(checker.resolveName(checker.getJsxNamespace(parent), ts2.isJsxOpeningLikeElement(parent) ? token : parent, 111551, false), ts2.isUMDExportSymbol) : void 0;
      }
      function getImportKind(importingFile, exportKind, compilerOptions, forceImportKeyword) {
        switch (exportKind) {
          case 0:
            return 0;
          case 1:
            return 1;
          case 2:
            return getExportEqualsImportKind(importingFile, compilerOptions, !!forceImportKeyword);
          case 3:
            return getUmdImportKind(importingFile, compilerOptions, !!forceImportKeyword);
          default:
            return ts2.Debug.assertNever(exportKind);
        }
      }
      codefix2.getImportKind = getImportKind;
      function getUmdImportKind(importingFile, compilerOptions, forceImportKeyword) {
        if (ts2.getAllowSyntheticDefaultImports(compilerOptions)) {
          return 1;
        }
        var moduleKind = ts2.getEmitModuleKind(compilerOptions);
        switch (moduleKind) {
          case ts2.ModuleKind.AMD:
          case ts2.ModuleKind.CommonJS:
          case ts2.ModuleKind.UMD:
            if (ts2.isInJSFile(importingFile)) {
              return ts2.isExternalModule(importingFile) || forceImportKeyword ? 2 : 3;
            }
            return 3;
          case ts2.ModuleKind.System:
          case ts2.ModuleKind.ES2015:
          case ts2.ModuleKind.ES2020:
          case ts2.ModuleKind.ES2022:
          case ts2.ModuleKind.ESNext:
          case ts2.ModuleKind.None:
            return 2;
          case ts2.ModuleKind.Node12:
          case ts2.ModuleKind.NodeNext:
            return importingFile.impliedNodeFormat === ts2.ModuleKind.ESNext ? 2 : 3;
          default:
            return ts2.Debug.assertNever(moduleKind, "Unexpected moduleKind ".concat(moduleKind));
        }
      }
      function getFixesInfoForNonUMDImport(_a, symbolToken, useAutoImportProvider) {
        var sourceFile = _a.sourceFile, program = _a.program, cancellationToken = _a.cancellationToken, host = _a.host, preferences = _a.preferences;
        var checker = program.getTypeChecker();
        var compilerOptions = program.getCompilerOptions();
        var symbolName = getSymbolName(sourceFile, checker, symbolToken, compilerOptions);
        ts2.Debug.assert(symbolName !== "default", "'default' isn't a legal identifier and couldn't occur here");
        var isValidTypeOnlyUseSite = ts2.isValidTypeOnlyAliasUseSite(symbolToken);
        var useRequire = shouldUseRequire(sourceFile, program);
        var exportInfos = getExportInfos(symbolName, ts2.getMeaningFromLocation(symbolToken), cancellationToken, sourceFile, program, useAutoImportProvider, host, preferences);
        var fixes = ts2.arrayFrom(ts2.flatMapIterator(exportInfos.entries(), function(_a2) {
          var _ = _a2[0], exportInfos2 = _a2[1];
          return getImportFixes(exportInfos2, symbolName, symbolToken.getStart(sourceFile), isValidTypeOnlyUseSite, useRequire, program, sourceFile, host, preferences);
        }));
        return { fixes, symbolName };
      }
      function jsxModeNeedsExplicitImport(jsx) {
        return jsx === 2 || jsx === 3;
      }
      function getSymbolName(sourceFile, checker, symbolToken, compilerOptions) {
        var parent = symbolToken.parent;
        if ((ts2.isJsxOpeningLikeElement(parent) || ts2.isJsxClosingElement(parent)) && parent.tagName === symbolToken && jsxModeNeedsExplicitImport(compilerOptions.jsx)) {
          var jsxNamespace = checker.getJsxNamespace(sourceFile);
          if (ts2.isIntrinsicJsxName(symbolToken.text) || !checker.resolveName(jsxNamespace, parent, 111551, true)) {
            return jsxNamespace;
          }
        }
        return symbolToken.text;
      }
      function getExportInfos(symbolName, currentTokenMeaning, cancellationToken, fromFile, program, useAutoImportProvider, host, preferences) {
        var _a;
        var originalSymbolToExportInfos = ts2.createMultiMap();
        var packageJsonFilter = ts2.createPackageJsonImportFilter(fromFile, preferences, host);
        var moduleSpecifierCache = (_a = host.getModuleSpecifierCache) === null || _a === void 0 ? void 0 : _a.call(host);
        var getModuleSpecifierResolutionHost = ts2.memoizeOne(function(isFromPackageJson) {
          return ts2.createModuleSpecifierResolutionHost(isFromPackageJson ? host.getPackageJsonAutoImportProvider() : program, host);
        });
        function addSymbol(moduleSymbol, toFile, exportedSymbol, exportKind, program2, isFromPackageJson) {
          var moduleSpecifierResolutionHost = getModuleSpecifierResolutionHost(isFromPackageJson);
          if (toFile && ts2.isImportableFile(program2, fromFile, toFile, preferences, packageJsonFilter, moduleSpecifierResolutionHost, moduleSpecifierCache) || !toFile && packageJsonFilter.allowsImportingAmbientModule(moduleSymbol, moduleSpecifierResolutionHost)) {
            var checker = program2.getTypeChecker();
            originalSymbolToExportInfos.add(ts2.getUniqueSymbolId(exportedSymbol, checker).toString(), { symbol: exportedSymbol, moduleSymbol, moduleFileName: toFile === null || toFile === void 0 ? void 0 : toFile.fileName, exportKind, targetFlags: ts2.skipAlias(exportedSymbol, checker).flags, isFromPackageJson });
          }
        }
        ts2.forEachExternalModuleToImportFrom(program, host, useAutoImportProvider, function(moduleSymbol, sourceFile, program2, isFromPackageJson) {
          var checker = program2.getTypeChecker();
          cancellationToken.throwIfCancellationRequested();
          var compilerOptions = program2.getCompilerOptions();
          var defaultInfo = ts2.getDefaultLikeExportInfo(moduleSymbol, checker, compilerOptions);
          if (defaultInfo && (defaultInfo.name === symbolName || moduleSymbolToValidIdentifier(moduleSymbol, ts2.getEmitScriptTarget(compilerOptions)) === symbolName) && symbolHasMeaning(defaultInfo.symbolForMeaning, currentTokenMeaning)) {
            addSymbol(moduleSymbol, sourceFile, defaultInfo.symbol, defaultInfo.exportKind, program2, isFromPackageJson);
          }
          var exportSymbolWithIdenticalName = checker.tryGetMemberInModuleExportsAndProperties(symbolName, moduleSymbol);
          if (exportSymbolWithIdenticalName && symbolHasMeaning(exportSymbolWithIdenticalName, currentTokenMeaning)) {
            addSymbol(moduleSymbol, sourceFile, exportSymbolWithIdenticalName, 0, program2, isFromPackageJson);
          }
        });
        return originalSymbolToExportInfos;
      }
      function getExportEqualsImportKind(importingFile, compilerOptions, forceImportKeyword) {
        var allowSyntheticDefaults = ts2.getAllowSyntheticDefaultImports(compilerOptions);
        var isJS = ts2.isInJSFile(importingFile);
        if (!isJS && ts2.getEmitModuleKind(compilerOptions) >= ts2.ModuleKind.ES2015) {
          return allowSyntheticDefaults ? 1 : 2;
        }
        if (isJS) {
          return ts2.isExternalModule(importingFile) || forceImportKeyword ? allowSyntheticDefaults ? 1 : 2 : 3;
        }
        for (var _i = 0, _a = importingFile.statements; _i < _a.length; _i++) {
          var statement = _a[_i];
          if (ts2.isImportEqualsDeclaration(statement) && !ts2.nodeIsMissing(statement.moduleReference)) {
            return 3;
          }
        }
        return allowSyntheticDefaults ? 1 : 3;
      }
      function codeActionForFix(context, sourceFile, symbolName, fix, quotePreference, compilerOptions) {
        var diag;
        var changes = ts2.textChanges.ChangeTracker.with(context, function(tracker) {
          diag = codeActionForFixWorker(tracker, sourceFile, symbolName, fix, quotePreference, compilerOptions);
        });
        return codefix2.createCodeFixAction(codefix2.importFixName, changes, diag, importFixId, ts2.Diagnostics.Add_all_missing_imports);
      }
      function codeActionForFixWorker(changes, sourceFile, symbolName, fix, quotePreference, compilerOptions) {
        switch (fix.kind) {
          case 0:
            addNamespaceQualifier(changes, sourceFile, fix);
            return [ts2.Diagnostics.Change_0_to_1, symbolName, "".concat(fix.namespacePrefix, ".").concat(symbolName)];
          case 1:
            addImportType(changes, sourceFile, fix, quotePreference);
            return [ts2.Diagnostics.Change_0_to_1, symbolName, getImportTypePrefix(fix.moduleSpecifier, quotePreference) + symbolName];
          case 2: {
            var importClauseOrBindingPattern = fix.importClauseOrBindingPattern, importKind = fix.importKind, addAsTypeOnly = fix.addAsTypeOnly, moduleSpecifier = fix.moduleSpecifier;
            doAddExistingFix(changes, sourceFile, importClauseOrBindingPattern, importKind === 1 ? { name: symbolName, addAsTypeOnly } : void 0, importKind === 0 ? [{ name: symbolName, addAsTypeOnly }] : ts2.emptyArray, compilerOptions);
            var moduleSpecifierWithoutQuotes = ts2.stripQuotes(moduleSpecifier);
            return [
              importKind === 1 ? ts2.Diagnostics.Add_default_import_0_to_existing_import_declaration_from_1 : ts2.Diagnostics.Add_0_to_existing_import_declaration_from_1,
              symbolName,
              moduleSpecifierWithoutQuotes
            ];
          }
          case 3: {
            var importKind = fix.importKind, moduleSpecifier = fix.moduleSpecifier, addAsTypeOnly = fix.addAsTypeOnly, useRequire = fix.useRequire;
            var getDeclarations = useRequire ? getNewRequires : getNewImports;
            var defaultImport = importKind === 1 ? { name: symbolName, addAsTypeOnly } : void 0;
            var namedImports = importKind === 0 ? [{ name: symbolName, addAsTypeOnly }] : void 0;
            var namespaceLikeImport = importKind === 2 || importKind === 3 ? { importKind, name: symbolName, addAsTypeOnly } : void 0;
            ts2.insertImports(changes, sourceFile, getDeclarations(moduleSpecifier, quotePreference, defaultImport, namedImports, namespaceLikeImport), true);
            return [importKind === 1 ? ts2.Diagnostics.Import_default_0_from_module_1 : ts2.Diagnostics.Import_0_from_module_1, symbolName, moduleSpecifier];
          }
          default:
            return ts2.Debug.assertNever(fix, "Unexpected fix kind ".concat(fix.kind));
        }
      }
      function doAddExistingFix(changes, sourceFile, clause, defaultImport, namedImports, compilerOptions) {
        var _a;
        if (clause.kind === 200) {
          if (defaultImport) {
            addElementToBindingPattern(clause, defaultImport.name, "default");
          }
          for (var _i = 0, namedImports_1 = namedImports; _i < namedImports_1.length; _i++) {
            var specifier = namedImports_1[_i];
            addElementToBindingPattern(clause, specifier.name, void 0);
          }
          return;
        }
        var promoteFromTypeOnly = clause.isTypeOnly && ts2.some(__spreadArray([defaultImport], namedImports, true), function(i) {
          return (i === null || i === void 0 ? void 0 : i.addAsTypeOnly) === 4;
        });
        var existingSpecifiers = clause.namedBindings && ((_a = ts2.tryCast(clause.namedBindings, ts2.isNamedImports)) === null || _a === void 0 ? void 0 : _a.elements);
        var convertExistingToTypeOnly = promoteFromTypeOnly && compilerOptions.preserveValueImports && compilerOptions.isolatedModules;
        if (defaultImport) {
          ts2.Debug.assert(!clause.name, "Cannot add a default import to an import clause that already has one");
          changes.insertNodeAt(sourceFile, clause.getStart(sourceFile), ts2.factory.createIdentifier(defaultImport.name), { suffix: ", " });
        }
        if (namedImports.length) {
          var newSpecifiers = ts2.stableSort(namedImports.map(function(namedImport) {
            return ts2.factory.createImportSpecifier((!clause.isTypeOnly || promoteFromTypeOnly) && needsTypeOnly(namedImport), void 0, ts2.factory.createIdentifier(namedImport.name));
          }), ts2.OrganizeImports.compareImportOrExportSpecifiers);
          if ((existingSpecifiers === null || existingSpecifiers === void 0 ? void 0 : existingSpecifiers.length) && ts2.OrganizeImports.importSpecifiersAreSorted(existingSpecifiers)) {
            for (var _b = 0, newSpecifiers_1 = newSpecifiers; _b < newSpecifiers_1.length; _b++) {
              var spec = newSpecifiers_1[_b];
              var insertionIndex = convertExistingToTypeOnly && !spec.isTypeOnly ? 0 : ts2.OrganizeImports.getImportSpecifierInsertionIndex(existingSpecifiers, spec);
              var prevSpecifier = clause.namedBindings.elements[insertionIndex - 1];
              if (prevSpecifier) {
                changes.insertNodeInListAfter(sourceFile, prevSpecifier, spec);
              } else {
                changes.insertNodeBefore(sourceFile, existingSpecifiers[0], spec, !ts2.positionsAreOnSameLine(existingSpecifiers[0].getStart(), clause.parent.getStart(), sourceFile));
              }
            }
          } else if (existingSpecifiers === null || existingSpecifiers === void 0 ? void 0 : existingSpecifiers.length) {
            for (var _c = 0, newSpecifiers_2 = newSpecifiers; _c < newSpecifiers_2.length; _c++) {
              var spec = newSpecifiers_2[_c];
              changes.insertNodeInListAfter(sourceFile, ts2.last(existingSpecifiers), spec, existingSpecifiers);
            }
          } else {
            if (newSpecifiers.length) {
              var namedImports_2 = ts2.factory.createNamedImports(newSpecifiers);
              if (clause.namedBindings) {
                changes.replaceNode(sourceFile, clause.namedBindings, namedImports_2);
              } else {
                changes.insertNodeAfter(sourceFile, ts2.Debug.checkDefined(clause.name, "Import clause must have either named imports or a default import"), namedImports_2);
              }
            }
          }
        }
        if (promoteFromTypeOnly) {
          changes.delete(sourceFile, ts2.getTypeKeywordOfTypeOnlyImport(clause, sourceFile));
          if (convertExistingToTypeOnly && existingSpecifiers) {
            for (var _d = 0, existingSpecifiers_1 = existingSpecifiers; _d < existingSpecifiers_1.length; _d++) {
              var specifier = existingSpecifiers_1[_d];
              changes.insertModifierBefore(sourceFile, 151, specifier);
            }
          }
        }
        function addElementToBindingPattern(bindingPattern, name, propertyName) {
          var element = ts2.factory.createBindingElement(void 0, propertyName, name);
          if (bindingPattern.elements.length) {
            changes.insertNodeInListAfter(sourceFile, ts2.last(bindingPattern.elements), element);
          } else {
            changes.replaceNode(sourceFile, bindingPattern, ts2.factory.createObjectBindingPattern([element]));
          }
        }
      }
      function addNamespaceQualifier(changes, sourceFile, _a) {
        var namespacePrefix = _a.namespacePrefix, position = _a.position;
        changes.insertText(sourceFile, position, namespacePrefix + ".");
      }
      function addImportType(changes, sourceFile, _a, quotePreference) {
        var moduleSpecifier = _a.moduleSpecifier, position = _a.position;
        changes.insertText(sourceFile, position, getImportTypePrefix(moduleSpecifier, quotePreference));
      }
      function getImportTypePrefix(moduleSpecifier, quotePreference) {
        var quote = ts2.getQuoteFromPreference(quotePreference);
        return "import(".concat(quote).concat(moduleSpecifier).concat(quote, ").");
      }
      function needsTypeOnly(_a) {
        var addAsTypeOnly = _a.addAsTypeOnly;
        return addAsTypeOnly === 2;
      }
      function getNewImports(moduleSpecifier, quotePreference, defaultImport, namedImports, namespaceLikeImport) {
        var quotedModuleSpecifier = ts2.makeStringLiteral(moduleSpecifier, quotePreference);
        var statements;
        if (defaultImport !== void 0 || (namedImports === null || namedImports === void 0 ? void 0 : namedImports.length)) {
          var topLevelTypeOnly_1 = (!defaultImport || needsTypeOnly(defaultImport)) && ts2.every(namedImports, needsTypeOnly);
          statements = ts2.combine(statements, ts2.makeImport(defaultImport && ts2.factory.createIdentifier(defaultImport.name), namedImports === null || namedImports === void 0 ? void 0 : namedImports.map(function(_a) {
            var addAsTypeOnly = _a.addAsTypeOnly, name = _a.name;
            return ts2.factory.createImportSpecifier(!topLevelTypeOnly_1 && addAsTypeOnly === 2, void 0, ts2.factory.createIdentifier(name));
          }), moduleSpecifier, quotePreference, topLevelTypeOnly_1));
        }
        if (namespaceLikeImport) {
          var declaration = namespaceLikeImport.importKind === 3 ? ts2.factory.createImportEqualsDeclaration(void 0, void 0, needsTypeOnly(namespaceLikeImport), ts2.factory.createIdentifier(namespaceLikeImport.name), ts2.factory.createExternalModuleReference(quotedModuleSpecifier)) : ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(needsTypeOnly(namespaceLikeImport), void 0, ts2.factory.createNamespaceImport(ts2.factory.createIdentifier(namespaceLikeImport.name))), quotedModuleSpecifier, void 0);
          statements = ts2.combine(statements, declaration);
        }
        return ts2.Debug.checkDefined(statements);
      }
      function getNewRequires(moduleSpecifier, quotePreference, defaultImport, namedImports, namespaceLikeImport) {
        var quotedModuleSpecifier = ts2.makeStringLiteral(moduleSpecifier, quotePreference);
        var statements;
        if (defaultImport || (namedImports === null || namedImports === void 0 ? void 0 : namedImports.length)) {
          var bindingElements = (namedImports === null || namedImports === void 0 ? void 0 : namedImports.map(function(_a) {
            var name = _a.name;
            return ts2.factory.createBindingElement(void 0, void 0, name);
          })) || [];
          if (defaultImport) {
            bindingElements.unshift(ts2.factory.createBindingElement(void 0, "default", defaultImport.name));
          }
          var declaration = createConstEqualsRequireDeclaration(ts2.factory.createObjectBindingPattern(bindingElements), quotedModuleSpecifier);
          statements = ts2.combine(statements, declaration);
        }
        if (namespaceLikeImport) {
          var declaration = createConstEqualsRequireDeclaration(namespaceLikeImport.name, quotedModuleSpecifier);
          statements = ts2.combine(statements, declaration);
        }
        return ts2.Debug.checkDefined(statements);
      }
      function createConstEqualsRequireDeclaration(name, quotedModuleSpecifier) {
        return ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([
          ts2.factory.createVariableDeclaration(typeof name === "string" ? ts2.factory.createIdentifier(name) : name, void 0, void 0, ts2.factory.createCallExpression(ts2.factory.createIdentifier("require"), void 0, [quotedModuleSpecifier]))
        ], 2));
      }
      function symbolHasMeaning(_a, meaning) {
        var declarations = _a.declarations;
        return ts2.some(declarations, function(decl) {
          return !!(ts2.getMeaningFromDeclaration(decl) & meaning);
        });
      }
      function moduleSymbolToValidIdentifier(moduleSymbol, target) {
        return moduleSpecifierToValidIdentifier(ts2.removeFileExtension(ts2.stripQuotes(moduleSymbol.name)), target);
      }
      codefix2.moduleSymbolToValidIdentifier = moduleSymbolToValidIdentifier;
      function moduleSpecifierToValidIdentifier(moduleSpecifier, target) {
        var baseName = ts2.getBaseFileName(ts2.removeSuffix(moduleSpecifier, "/index"));
        var res = "";
        var lastCharWasValid = true;
        var firstCharCode = baseName.charCodeAt(0);
        if (ts2.isIdentifierStart(firstCharCode, target)) {
          res += String.fromCharCode(firstCharCode);
        } else {
          lastCharWasValid = false;
        }
        for (var i = 1; i < baseName.length; i++) {
          var ch = baseName.charCodeAt(i);
          var isValid = ts2.isIdentifierPart(ch, target);
          if (isValid) {
            var char = String.fromCharCode(ch);
            if (!lastCharWasValid) {
              char = char.toUpperCase();
            }
            res += char;
          }
          lastCharWasValid = isValid;
        }
        return !ts2.isStringANonContextualKeyword(res) ? res || "_" : "_".concat(res);
      }
      codefix2.moduleSpecifierToValidIdentifier = moduleSpecifierToValidIdentifier;
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var _a;
      var fixName = "fixOverrideModifier";
      var fixAddOverrideId = "fixAddOverrideModifier";
      var fixRemoveOverrideId = "fixRemoveOverrideModifier";
      var errorCodes = [
        ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code,
        ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code,
        ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code,
        ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code,
        ts2.Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code
      ];
      var errorCodeFixIdMap = (_a = {}, _a[ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code] = [
        ts2.Diagnostics.Add_override_modifier,
        fixAddOverrideId,
        ts2.Diagnostics.Add_all_missing_override_modifiers
      ], _a[ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code] = [
        ts2.Diagnostics.Remove_override_modifier,
        fixRemoveOverrideId,
        ts2.Diagnostics.Remove_all_unnecessary_override_modifiers
      ], _a[ts2.Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code] = [
        ts2.Diagnostics.Add_override_modifier,
        fixAddOverrideId,
        ts2.Diagnostics.Add_all_missing_override_modifiers
      ], _a[ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code] = [
        ts2.Diagnostics.Add_override_modifier,
        fixAddOverrideId,
        ts2.Diagnostics.Remove_all_unnecessary_override_modifiers
      ], _a[ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code] = [
        ts2.Diagnostics.Remove_override_modifier,
        fixRemoveOverrideId,
        ts2.Diagnostics.Remove_all_unnecessary_override_modifiers
      ], _a);
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var errorCode = context.errorCode, span = context.span, sourceFile = context.sourceFile;
          var info = errorCodeFixIdMap[errorCode];
          if (!info)
            return ts2.emptyArray;
          var descriptions = info[0], fixId = info[1], fixAllDescriptions = info[2];
          if (ts2.isSourceFileJS(sourceFile))
            return ts2.emptyArray;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(changes2) {
            return dispatchChanges(changes2, context, errorCode, span.start);
          });
          return [
            codefix2.createCodeFixActionMaybeFixAll(fixName, changes, descriptions, fixId, fixAllDescriptions)
          ];
        },
        fixIds: [fixName, fixAddOverrideId, fixRemoveOverrideId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var code = diag.code, start = diag.start, file = diag.file;
            var info = errorCodeFixIdMap[code];
            if (!info || info[1] !== context.fixId || ts2.isSourceFileJS(file)) {
              return;
            }
            dispatchChanges(changes, context, code, start);
          });
        }
      });
      function dispatchChanges(changeTracker, context, errorCode, pos) {
        switch (errorCode) {
          case ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_a_member_in_the_base_class_0.code:
          case ts2.Diagnostics.This_member_must_have_an_override_modifier_because_it_overrides_an_abstract_method_that_is_declared_in_the_base_class_0.code:
          case ts2.Diagnostics.This_parameter_property_must_have_an_override_modifier_because_it_overrides_a_member_in_base_class_0.code:
            return doAddOverrideModifierChange(changeTracker, context.sourceFile, pos);
          case ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0.code:
          case ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_its_containing_class_0_does_not_extend_another_class.code:
            return doRemoveOverrideModifierChange(changeTracker, context.sourceFile, pos);
          default:
            ts2.Debug.fail("Unexpected error code: " + errorCode);
        }
      }
      function doAddOverrideModifierChange(changeTracker, sourceFile, pos) {
        var classElement = findContainerClassElementLike(sourceFile, pos);
        var modifiers = classElement.modifiers || ts2.emptyArray;
        var staticModifier = ts2.find(modifiers, ts2.isStaticModifier);
        var abstractModifier = ts2.find(modifiers, ts2.isAbstractModifier);
        var accessibilityModifier = ts2.find(modifiers, function(m) {
          return ts2.isAccessibilityModifier(m.kind);
        });
        var modifierPos = abstractModifier ? abstractModifier.end : staticModifier ? staticModifier.end : accessibilityModifier ? accessibilityModifier.end : classElement.decorators ? ts2.skipTrivia(sourceFile.text, classElement.decorators.end) : classElement.getStart(sourceFile);
        var options = accessibilityModifier || staticModifier || abstractModifier ? { prefix: " " } : { suffix: " " };
        changeTracker.insertModifierAt(sourceFile, modifierPos, 158, options);
      }
      function doRemoveOverrideModifierChange(changeTracker, sourceFile, pos) {
        var classElement = findContainerClassElementLike(sourceFile, pos);
        var overrideModifier = classElement.modifiers && ts2.find(classElement.modifiers, function(modifier) {
          return modifier.kind === 158;
        });
        ts2.Debug.assertIsDefined(overrideModifier);
        changeTracker.deleteModifier(sourceFile, overrideModifier);
      }
      function isClassElementLikeHasJSDoc(node) {
        switch (node.kind) {
          case 170:
          case 166:
          case 168:
          case 171:
          case 172:
            return true;
          case 163:
            return ts2.isParameterPropertyDeclaration(node, node.parent);
          default:
            return false;
        }
      }
      function findContainerClassElementLike(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var classElement = ts2.findAncestor(token, function(node) {
          if (ts2.isClassLike(node))
            return "quit";
          return isClassElementLikeHasJSDoc(node);
        });
        ts2.Debug.assert(classElement && isClassElementLikeHasJSDoc(classElement));
        return classElement;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixNoPropertyAccessFromIndexSignature";
      var errorCodes = [
        ts2.Diagnostics.Property_0_comes_from_an_index_signature_so_it_must_be_accessed_with_0.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixId],
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span, preferences = context.preferences;
          var property = getPropertyAccessExpression(sourceFile, span.start);
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, property, preferences);
          });
          return [codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Use_element_access_for_0, property.name.text], fixId, ts2.Diagnostics.Use_element_access_for_all_undeclared_properties)];
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return doChange(changes, diag.file, getPropertyAccessExpression(diag.file, diag.start), context.preferences);
          });
        }
      });
      function doChange(changes, sourceFile, node, preferences) {
        var quotePreference = ts2.getQuotePreference(sourceFile, preferences);
        var argumentsExpression = ts2.factory.createStringLiteral(node.name.text, quotePreference === 0);
        changes.replaceNode(sourceFile, node, ts2.isPropertyAccessChain(node) ? ts2.factory.createElementAccessChain(node.expression, node.questionDotToken, argumentsExpression) : ts2.factory.createElementAccessExpression(node.expression, argumentsExpression));
      }
      function getPropertyAccessExpression(sourceFile, pos) {
        return ts2.cast(ts2.getTokenAtPosition(sourceFile, pos).parent, ts2.isPropertyAccessExpression);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixImplicitThis";
      var errorCodes = [ts2.Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, span = context.span;
          var diagnostic;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            diagnostic = doChange(t, sourceFile, span.start, program.getTypeChecker());
          });
          return diagnostic ? [codefix2.createCodeFixAction(fixId, changes, diagnostic, fixId, ts2.Diagnostics.Fix_all_implicit_this_errors)] : ts2.emptyArray;
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            doChange(changes, diag.file, diag.start, context.program.getTypeChecker());
          });
        }
      });
      function doChange(changes, sourceFile, pos, checker) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        ts2.Debug.assert(token.kind === 108);
        var fn = ts2.getThisContainer(token, false);
        if (!ts2.isFunctionDeclaration(fn) && !ts2.isFunctionExpression(fn))
          return void 0;
        if (!ts2.isSourceFile(ts2.getThisContainer(fn, false))) {
          var fnKeyword = ts2.Debug.assertDefined(ts2.findChildOfKind(fn, 98, sourceFile));
          var name = fn.name;
          var body = ts2.Debug.assertDefined(fn.body);
          if (ts2.isFunctionExpression(fn)) {
            if (name && ts2.FindAllReferences.Core.isSymbolReferencedInFile(name, checker, sourceFile, body)) {
              return void 0;
            }
            changes.delete(sourceFile, fnKeyword);
            if (name) {
              changes.delete(sourceFile, name);
            }
            changes.insertText(sourceFile, body.pos, " =>");
            return [ts2.Diagnostics.Convert_function_expression_0_to_arrow_function, name ? name.text : ts2.ANONYMOUS];
          } else {
            changes.replaceNode(sourceFile, fnKeyword, ts2.factory.createToken(85));
            changes.insertText(sourceFile, name.end, " = ");
            changes.insertText(sourceFile, body.pos, " =>");
            return [ts2.Diagnostics.Convert_function_declaration_0_to_arrow_function, name.text];
          }
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixIncorrectNamedTupleSyntax";
      var errorCodes = [
        ts2.Diagnostics.A_labeled_tuple_element_is_declared_as_optional_with_a_question_mark_after_the_name_and_before_the_colon_rather_than_after_the_type.code,
        ts2.Diagnostics.A_labeled_tuple_element_is_declared_as_rest_with_a_before_the_name_rather_than_before_the_type.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var namedTupleMember = getNamedTupleMember(sourceFile, span.start);
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, namedTupleMember);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Move_labeled_tuple_element_modifiers_to_labels, fixId, ts2.Diagnostics.Move_labeled_tuple_element_modifiers_to_labels)];
        },
        fixIds: [fixId]
      });
      function getNamedTupleMember(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        return ts2.findAncestor(token, function(t) {
          return t.kind === 196;
        });
      }
      function doChange(changes, sourceFile, namedTupleMember) {
        if (!namedTupleMember) {
          return;
        }
        var unwrappedType = namedTupleMember.type;
        var sawOptional = false;
        var sawRest = false;
        while (unwrappedType.kind === 184 || unwrappedType.kind === 185 || unwrappedType.kind === 190) {
          if (unwrappedType.kind === 184) {
            sawOptional = true;
          } else if (unwrappedType.kind === 185) {
            sawRest = true;
          }
          unwrappedType = unwrappedType.type;
        }
        var updated = ts2.factory.updateNamedTupleMember(namedTupleMember, namedTupleMember.dotDotDotToken || (sawRest ? ts2.factory.createToken(25) : void 0), namedTupleMember.name, namedTupleMember.questionToken || (sawOptional ? ts2.factory.createToken(57) : void 0), unwrappedType);
        if (updated === namedTupleMember) {
          return;
        }
        changes.replaceNode(sourceFile, namedTupleMember, updated);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixSpelling";
      var errorCodes = [
        ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2.code,
        ts2.Diagnostics.Property_0_may_not_exist_on_type_1_Did_you_mean_2.code,
        ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_1.code,
        ts2.Diagnostics.Could_not_find_name_0_Did_you_mean_1.code,
        ts2.Diagnostics.Cannot_find_namespace_0_Did_you_mean_1.code,
        ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code,
        ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code,
        ts2.Diagnostics._0_has_no_exported_member_named_1_Did_you_mean_2.code,
        ts2.Diagnostics.This_member_cannot_have_an_override_modifier_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code,
        ts2.Diagnostics.This_member_cannot_have_a_JSDoc_comment_with_an_override_tag_because_it_is_not_declared_in_the_base_class_0_Did_you_mean_1.code,
        ts2.Diagnostics.No_overload_matches_this_call.code,
        ts2.Diagnostics.Type_0_is_not_assignable_to_type_1.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, errorCode = context.errorCode;
          var info = getInfo(sourceFile, context.span.start, context, errorCode);
          if (!info)
            return void 0;
          var node = info.node, suggestedSymbol = info.suggestedSymbol;
          var target = ts2.getEmitScriptTarget(context.host.getCompilationSettings());
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, node, suggestedSymbol, target);
          });
          return [codefix2.createCodeFixAction("spelling", changes, [ts2.Diagnostics.Change_spelling_to_0, ts2.symbolName(suggestedSymbol)], fixId, ts2.Diagnostics.Fix_all_detected_spelling_errors)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, diag.start, context, diag.code);
            var target = ts2.getEmitScriptTarget(context.host.getCompilationSettings());
            if (info)
              doChange(changes, context.sourceFile, info.node, info.suggestedSymbol, target);
          });
        }
      });
      function getInfo(sourceFile, pos, context, errorCode) {
        var node = ts2.getTokenAtPosition(sourceFile, pos);
        var parent = node.parent;
        if ((errorCode === ts2.Diagnostics.No_overload_matches_this_call.code || errorCode === ts2.Diagnostics.Type_0_is_not_assignable_to_type_1.code) && !ts2.isJsxAttribute(parent))
          return void 0;
        var checker = context.program.getTypeChecker();
        var suggestedSymbol;
        if (ts2.isPropertyAccessExpression(parent) && parent.name === node) {
          ts2.Debug.assert(ts2.isMemberName(node), "Expected an identifier for spelling (property access)");
          var containingType = checker.getTypeAtLocation(parent.expression);
          if (parent.flags & 32) {
            containingType = checker.getNonNullableType(containingType);
          }
          suggestedSymbol = checker.getSuggestedSymbolForNonexistentProperty(node, containingType);
        } else if (ts2.isBinaryExpression(parent) && parent.operatorToken.kind === 101 && parent.left === node && ts2.isPrivateIdentifier(node)) {
          var receiverType = checker.getTypeAtLocation(parent.right);
          suggestedSymbol = checker.getSuggestedSymbolForNonexistentProperty(node, receiverType);
        } else if (ts2.isQualifiedName(parent) && parent.right === node) {
          var symbol = checker.getSymbolAtLocation(parent.left);
          if (symbol && symbol.flags & 1536) {
            suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(parent.right, symbol);
          }
        } else if (ts2.isImportSpecifier(parent) && parent.name === node) {
          ts2.Debug.assertNode(node, ts2.isIdentifier, "Expected an identifier for spelling (import)");
          var importDeclaration = ts2.findAncestor(node, ts2.isImportDeclaration);
          var resolvedSourceFile = getResolvedSourceFileFromImportDeclaration(sourceFile, context, importDeclaration);
          if (resolvedSourceFile && resolvedSourceFile.symbol) {
            suggestedSymbol = checker.getSuggestedSymbolForNonexistentModule(node, resolvedSourceFile.symbol);
          }
        } else if (ts2.isJsxAttribute(parent) && parent.name === node) {
          ts2.Debug.assertNode(node, ts2.isIdentifier, "Expected an identifier for JSX attribute");
          var tag = ts2.findAncestor(node, ts2.isJsxOpeningLikeElement);
          var props = checker.getContextualTypeForArgumentAtIndex(tag, 0);
          suggestedSymbol = checker.getSuggestedSymbolForNonexistentJSXAttribute(node, props);
        } else if (ts2.hasSyntacticModifier(parent, 16384) && ts2.isClassElement(parent) && parent.name === node) {
          var baseDeclaration = ts2.findAncestor(node, ts2.isClassLike);
          var baseTypeNode = baseDeclaration ? ts2.getEffectiveBaseTypeNode(baseDeclaration) : void 0;
          var baseType = baseTypeNode ? checker.getTypeAtLocation(baseTypeNode) : void 0;
          if (baseType) {
            suggestedSymbol = checker.getSuggestedSymbolForNonexistentClassMember(ts2.getTextOfNode(node), baseType);
          }
        } else {
          var meaning = ts2.getMeaningFromLocation(node);
          var name = ts2.getTextOfNode(node);
          ts2.Debug.assert(name !== void 0, "name should be defined");
          suggestedSymbol = checker.getSuggestedSymbolForNonexistentSymbol(node, name, convertSemanticMeaningToSymbolFlags(meaning));
        }
        return suggestedSymbol === void 0 ? void 0 : { node, suggestedSymbol };
      }
      function doChange(changes, sourceFile, node, suggestedSymbol, target) {
        var suggestion = ts2.symbolName(suggestedSymbol);
        if (!ts2.isIdentifierText(suggestion, target) && ts2.isPropertyAccessExpression(node.parent)) {
          var valDecl = suggestedSymbol.valueDeclaration;
          if (valDecl && ts2.isNamedDeclaration(valDecl) && ts2.isPrivateIdentifier(valDecl.name)) {
            changes.replaceNode(sourceFile, node, ts2.factory.createIdentifier(suggestion));
          } else {
            changes.replaceNode(sourceFile, node.parent, ts2.factory.createElementAccessExpression(node.parent.expression, ts2.factory.createStringLiteral(suggestion)));
          }
        } else {
          changes.replaceNode(sourceFile, node, ts2.factory.createIdentifier(suggestion));
        }
      }
      function convertSemanticMeaningToSymbolFlags(meaning) {
        var flags = 0;
        if (meaning & 4) {
          flags |= 1920;
        }
        if (meaning & 2) {
          flags |= 788968;
        }
        if (meaning & 1) {
          flags |= 111551;
        }
        return flags;
      }
      function getResolvedSourceFileFromImportDeclaration(sourceFile, context, importDeclaration) {
        if (!importDeclaration || !ts2.isStringLiteralLike(importDeclaration.moduleSpecifier))
          return void 0;
        var resolvedModule = ts2.getResolvedModule(sourceFile, importDeclaration.moduleSpecifier.text, ts2.getModeForUsageLocation(sourceFile, importDeclaration.moduleSpecifier));
        if (!resolvedModule)
          return void 0;
        return context.program.getSourceFile(resolvedModule.resolvedFileName);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "returnValueCorrect";
      var fixIdAddReturnStatement = "fixAddReturnStatement";
      var fixRemoveBracesFromArrowFunctionBody = "fixRemoveBracesFromArrowFunctionBody";
      var fixIdWrapTheBlockWithParen = "fixWrapTheBlockWithParen";
      var errorCodes = [
        ts2.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value.code,
        ts2.Diagnostics.Type_0_is_not_assignable_to_type_1.code,
        ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code
      ];
      var ProblemKind;
      (function(ProblemKind2) {
        ProblemKind2[ProblemKind2["MissingReturnStatement"] = 0] = "MissingReturnStatement";
        ProblemKind2[ProblemKind2["MissingParentheses"] = 1] = "MissingParentheses";
      })(ProblemKind || (ProblemKind = {}));
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixIdAddReturnStatement, fixRemoveBracesFromArrowFunctionBody, fixIdWrapTheBlockWithParen],
        getCodeActions: function(context) {
          var program = context.program, sourceFile = context.sourceFile, start = context.span.start, errorCode = context.errorCode;
          var info = getInfo(program.getTypeChecker(), sourceFile, start, errorCode);
          if (!info)
            return void 0;
          if (info.kind === ProblemKind.MissingReturnStatement) {
            return ts2.append([getActionForfixAddReturnStatement(context, info.expression, info.statement)], ts2.isArrowFunction(info.declaration) ? getActionForFixRemoveBracesFromArrowFunctionBody(context, info.declaration, info.expression, info.commentSource) : void 0);
          } else {
            return [getActionForfixWrapTheBlockWithParen(context, info.declaration, info.expression)];
          }
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(context.program.getTypeChecker(), diag.file, diag.start, diag.code);
            if (!info)
              return void 0;
            switch (context.fixId) {
              case fixIdAddReturnStatement:
                addReturnStatement(changes, diag.file, info.expression, info.statement);
                break;
              case fixRemoveBracesFromArrowFunctionBody:
                if (!ts2.isArrowFunction(info.declaration))
                  return void 0;
                removeBlockBodyBrace(changes, diag.file, info.declaration, info.expression, info.commentSource, false);
                break;
              case fixIdWrapTheBlockWithParen:
                if (!ts2.isArrowFunction(info.declaration))
                  return void 0;
                wrapBlockWithParen(changes, diag.file, info.declaration, info.expression);
                break;
              default:
                ts2.Debug.fail(JSON.stringify(context.fixId));
            }
          });
        }
      });
      function createObjectTypeFromLabeledExpression(checker, label, expression) {
        var member = checker.createSymbol(4, label.escapedText);
        member.type = checker.getTypeAtLocation(expression);
        var members = ts2.createSymbolTable([member]);
        return checker.createAnonymousType(void 0, members, [], [], []);
      }
      function getFixInfo(checker, declaration, expectType, isFunctionType) {
        if (!declaration.body || !ts2.isBlock(declaration.body) || ts2.length(declaration.body.statements) !== 1)
          return void 0;
        var firstStatement = ts2.first(declaration.body.statements);
        if (ts2.isExpressionStatement(firstStatement) && checkFixedAssignableTo(checker, declaration, checker.getTypeAtLocation(firstStatement.expression), expectType, isFunctionType)) {
          return {
            declaration,
            kind: ProblemKind.MissingReturnStatement,
            expression: firstStatement.expression,
            statement: firstStatement,
            commentSource: firstStatement.expression
          };
        } else if (ts2.isLabeledStatement(firstStatement) && ts2.isExpressionStatement(firstStatement.statement)) {
          var node = ts2.factory.createObjectLiteralExpression([ts2.factory.createPropertyAssignment(firstStatement.label, firstStatement.statement.expression)]);
          var nodeType = createObjectTypeFromLabeledExpression(checker, firstStatement.label, firstStatement.statement.expression);
          if (checkFixedAssignableTo(checker, declaration, nodeType, expectType, isFunctionType)) {
            return ts2.isArrowFunction(declaration) ? {
              declaration,
              kind: ProblemKind.MissingParentheses,
              expression: node,
              statement: firstStatement,
              commentSource: firstStatement.statement.expression
            } : {
              declaration,
              kind: ProblemKind.MissingReturnStatement,
              expression: node,
              statement: firstStatement,
              commentSource: firstStatement.statement.expression
            };
          }
        } else if (ts2.isBlock(firstStatement) && ts2.length(firstStatement.statements) === 1) {
          var firstBlockStatement = ts2.first(firstStatement.statements);
          if (ts2.isLabeledStatement(firstBlockStatement) && ts2.isExpressionStatement(firstBlockStatement.statement)) {
            var node = ts2.factory.createObjectLiteralExpression([ts2.factory.createPropertyAssignment(firstBlockStatement.label, firstBlockStatement.statement.expression)]);
            var nodeType = createObjectTypeFromLabeledExpression(checker, firstBlockStatement.label, firstBlockStatement.statement.expression);
            if (checkFixedAssignableTo(checker, declaration, nodeType, expectType, isFunctionType)) {
              return {
                declaration,
                kind: ProblemKind.MissingReturnStatement,
                expression: node,
                statement: firstStatement,
                commentSource: firstBlockStatement
              };
            }
          }
        }
        return void 0;
      }
      function checkFixedAssignableTo(checker, declaration, exprType, type, isFunctionType) {
        if (isFunctionType) {
          var sig = checker.getSignatureFromDeclaration(declaration);
          if (sig) {
            if (ts2.hasSyntacticModifier(declaration, 256)) {
              exprType = checker.createPromiseType(exprType);
            }
            var newSig = checker.createSignature(declaration, sig.typeParameters, sig.thisParameter, sig.parameters, exprType, void 0, sig.minArgumentCount, sig.flags);
            exprType = checker.createAnonymousType(void 0, ts2.createSymbolTable(), [newSig], [], []);
          } else {
            exprType = checker.getAnyType();
          }
        }
        return checker.isTypeAssignableTo(exprType, type);
      }
      function getInfo(checker, sourceFile, position, errorCode) {
        var node = ts2.getTokenAtPosition(sourceFile, position);
        if (!node.parent)
          return void 0;
        var declaration = ts2.findAncestor(node.parent, ts2.isFunctionLikeDeclaration);
        switch (errorCode) {
          case ts2.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value.code:
            if (!declaration || !declaration.body || !declaration.type || !ts2.rangeContainsRange(declaration.type, node))
              return void 0;
            return getFixInfo(checker, declaration, checker.getTypeFromTypeNode(declaration.type), false);
          case ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code:
            if (!declaration || !ts2.isCallExpression(declaration.parent) || !declaration.body)
              return void 0;
            var pos = declaration.parent.arguments.indexOf(declaration);
            var type = checker.getContextualTypeForArgumentAtIndex(declaration.parent, pos);
            if (!type)
              return void 0;
            return getFixInfo(checker, declaration, type, true);
          case ts2.Diagnostics.Type_0_is_not_assignable_to_type_1.code:
            if (!ts2.isDeclarationName(node) || !ts2.isVariableLike(node.parent) && !ts2.isJsxAttribute(node.parent))
              return void 0;
            var initializer = getVariableLikeInitializer(node.parent);
            if (!initializer || !ts2.isFunctionLikeDeclaration(initializer) || !initializer.body)
              return void 0;
            return getFixInfo(checker, initializer, checker.getTypeAtLocation(node.parent), true);
        }
        return void 0;
      }
      function getVariableLikeInitializer(declaration) {
        switch (declaration.kind) {
          case 253:
          case 163:
          case 202:
          case 166:
          case 294:
            return declaration.initializer;
          case 284:
            return declaration.initializer && (ts2.isJsxExpression(declaration.initializer) ? declaration.initializer.expression : void 0);
          case 295:
          case 165:
          case 297:
          case 345:
          case 338:
            return void 0;
        }
      }
      function addReturnStatement(changes, sourceFile, expression, statement) {
        ts2.suppressLeadingAndTrailingTrivia(expression);
        var probablyNeedSemi = ts2.probablyUsesSemicolons(sourceFile);
        changes.replaceNode(sourceFile, statement, ts2.factory.createReturnStatement(expression), {
          leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.Exclude,
          trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Exclude,
          suffix: probablyNeedSemi ? ";" : void 0
        });
      }
      function removeBlockBodyBrace(changes, sourceFile, declaration, expression, commentSource, withParen) {
        var newBody = withParen || ts2.needsParentheses(expression) ? ts2.factory.createParenthesizedExpression(expression) : expression;
        ts2.suppressLeadingAndTrailingTrivia(commentSource);
        ts2.copyComments(commentSource, newBody);
        changes.replaceNode(sourceFile, declaration.body, newBody);
      }
      function wrapBlockWithParen(changes, sourceFile, declaration, expression) {
        changes.replaceNode(sourceFile, declaration.body, ts2.factory.createParenthesizedExpression(expression));
      }
      function getActionForfixAddReturnStatement(context, expression, statement) {
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return addReturnStatement(t, context.sourceFile, expression, statement);
        });
        return codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_a_return_statement, fixIdAddReturnStatement, ts2.Diagnostics.Add_all_missing_return_statement);
      }
      function getActionForFixRemoveBracesFromArrowFunctionBody(context, declaration, expression, commentSource) {
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return removeBlockBodyBrace(t, context.sourceFile, declaration, expression, commentSource, false);
        });
        return codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Remove_braces_from_arrow_function_body, fixRemoveBracesFromArrowFunctionBody, ts2.Diagnostics.Remove_braces_from_all_arrow_function_bodies_with_relevant_issues);
      }
      function getActionForfixWrapTheBlockWithParen(context, declaration, expression) {
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return wrapBlockWithParen(t, context.sourceFile, declaration, expression);
        });
        return codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Wrap_the_following_body_with_parentheses_which_should_be_an_object_literal, fixIdWrapTheBlockWithParen, ts2.Diagnostics.Wrap_all_object_literal_with_parentheses);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixMissingMember = "fixMissingMember";
      var fixMissingProperties = "fixMissingProperties";
      var fixMissingAttributes = "fixMissingAttributes";
      var fixMissingFunctionDeclaration = "fixMissingFunctionDeclaration";
      var errorCodes = [
        ts2.Diagnostics.Property_0_does_not_exist_on_type_1.code,
        ts2.Diagnostics.Property_0_does_not_exist_on_type_1_Did_you_mean_2.code,
        ts2.Diagnostics.Property_0_is_missing_in_type_1_but_required_in_type_2.code,
        ts2.Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2.code,
        ts2.Diagnostics.Type_0_is_missing_the_following_properties_from_type_1_Colon_2_and_3_more.code,
        ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
        ts2.Diagnostics.Cannot_find_name_0.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var typeChecker = context.program.getTypeChecker();
          var info = getInfo(context.sourceFile, context.span.start, context.errorCode, typeChecker, context.program);
          if (!info) {
            return void 0;
          }
          if (info.kind === 3) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return addObjectLiteralProperties(t, context, info);
            });
            return [codefix2.createCodeFixAction(fixMissingProperties, changes, ts2.Diagnostics.Add_missing_properties, fixMissingProperties, ts2.Diagnostics.Add_all_missing_properties)];
          }
          if (info.kind === 4) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return addJsxAttributes(t, context, info);
            });
            return [codefix2.createCodeFixAction(fixMissingAttributes, changes, ts2.Diagnostics.Add_missing_attributes, fixMissingAttributes, ts2.Diagnostics.Add_all_missing_attributes)];
          }
          if (info.kind === 2) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return addFunctionDeclaration(t, context, info);
            });
            return [codefix2.createCodeFixAction(fixMissingFunctionDeclaration, changes, [ts2.Diagnostics.Add_missing_function_declaration_0, info.token.text], fixMissingFunctionDeclaration, ts2.Diagnostics.Add_all_missing_function_declarations)];
          }
          if (info.kind === 0) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return addEnumMemberDeclaration(t, context.program.getTypeChecker(), info);
            });
            return [codefix2.createCodeFixAction(fixMissingMember, changes, [ts2.Diagnostics.Add_missing_enum_member_0, info.token.text], fixMissingMember, ts2.Diagnostics.Add_all_missing_members)];
          }
          return ts2.concatenate(getActionsForMissingMethodDeclaration(context, info), getActionsForMissingMemberDeclaration(context, info));
        },
        fixIds: [fixMissingMember, fixMissingFunctionDeclaration, fixMissingProperties, fixMissingAttributes],
        getAllCodeActions: function(context) {
          var program = context.program, fixId = context.fixId;
          var checker = program.getTypeChecker();
          var seen = new ts2.Map();
          var typeDeclToMembers = new ts2.Map();
          return codefix2.createCombinedCodeActions(ts2.textChanges.ChangeTracker.with(context, function(changes) {
            codefix2.eachDiagnostic(context, errorCodes, function(diag) {
              var info = getInfo(diag.file, diag.start, diag.code, checker, context.program);
              if (!info || !ts2.addToSeen(seen, ts2.getNodeId(info.parentDeclaration) + "#" + info.token.text)) {
                return;
              }
              if (fixId === fixMissingFunctionDeclaration && info.kind === 2) {
                addFunctionDeclaration(changes, context, info);
              } else if (fixId === fixMissingProperties && info.kind === 3) {
                addObjectLiteralProperties(changes, context, info);
              } else if (fixId === fixMissingAttributes && info.kind === 4) {
                addJsxAttributes(changes, context, info);
              } else {
                if (info.kind === 0) {
                  addEnumMemberDeclaration(changes, checker, info);
                }
                if (info.kind === 1) {
                  var parentDeclaration = info.parentDeclaration, token_1 = info.token;
                  var infos = ts2.getOrUpdate(typeDeclToMembers, parentDeclaration, function() {
                    return [];
                  });
                  if (!infos.some(function(i) {
                    return i.token.text === token_1.text;
                  })) {
                    infos.push(info);
                  }
                }
              }
            });
            typeDeclToMembers.forEach(function(infos, classDeclaration) {
              var supers = codefix2.getAllSupers(classDeclaration, checker);
              var _loop_15 = function(info2) {
                if (supers.some(function(superClassOrInterface) {
                  var superInfos = typeDeclToMembers.get(superClassOrInterface);
                  return !!superInfos && superInfos.some(function(_a) {
                    var token2 = _a.token;
                    return token2.text === info2.token.text;
                  });
                }))
                  return "continue";
                var parentDeclaration = info2.parentDeclaration, declSourceFile = info2.declSourceFile, modifierFlags = info2.modifierFlags, token = info2.token, call = info2.call, isJSFile = info2.isJSFile;
                if (call && !ts2.isPrivateIdentifier(token)) {
                  addMethodDeclaration(context, changes, call, token, modifierFlags & 32, parentDeclaration, declSourceFile);
                } else {
                  if (isJSFile && !ts2.isInterfaceDeclaration(parentDeclaration)) {
                    addMissingMemberInJs(changes, declSourceFile, parentDeclaration, token, !!(modifierFlags & 32));
                  } else {
                    var typeNode = getTypeNode(program.getTypeChecker(), parentDeclaration, token);
                    addPropertyDeclaration(changes, declSourceFile, parentDeclaration, token.text, typeNode, modifierFlags & 32);
                  }
                }
              };
              for (var _i = 0, infos_1 = infos; _i < infos_1.length; _i++) {
                var info = infos_1[_i];
                _loop_15(info);
              }
            });
          }));
        }
      });
      var InfoKind;
      (function(InfoKind2) {
        InfoKind2[InfoKind2["Enum"] = 0] = "Enum";
        InfoKind2[InfoKind2["ClassOrInterface"] = 1] = "ClassOrInterface";
        InfoKind2[InfoKind2["Function"] = 2] = "Function";
        InfoKind2[InfoKind2["ObjectLiteral"] = 3] = "ObjectLiteral";
        InfoKind2[InfoKind2["JsxAttributes"] = 4] = "JsxAttributes";
      })(InfoKind || (InfoKind = {}));
      function getInfo(sourceFile, tokenPos, errorCode, checker, program) {
        var token = ts2.getTokenAtPosition(sourceFile, tokenPos);
        var parent = token.parent;
        if (errorCode === ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code) {
          if (!(token.kind === 18 && ts2.isObjectLiteralExpression(parent) && ts2.isCallExpression(parent.parent)))
            return void 0;
          var argIndex = ts2.findIndex(parent.parent.arguments, function(arg) {
            return arg === parent;
          });
          if (argIndex < 0)
            return void 0;
          var signature = ts2.singleOrUndefined(checker.getSignaturesOfType(checker.getTypeAtLocation(parent.parent.expression), 0));
          if (!(signature && signature.declaration && signature.parameters[argIndex]))
            return void 0;
          var param = signature.parameters[argIndex].valueDeclaration;
          if (!(param && ts2.isParameter(param) && ts2.isIdentifier(param.name)))
            return void 0;
          var properties = ts2.arrayFrom(checker.getUnmatchedProperties(checker.getTypeAtLocation(parent), checker.getTypeAtLocation(param), false, false));
          if (!ts2.length(properties))
            return void 0;
          return { kind: 3, token: param.name, properties, indentation: 0, parentDeclaration: parent };
        }
        if (!ts2.isMemberName(token))
          return void 0;
        if (ts2.isIdentifier(token) && ts2.hasInitializer(parent) && parent.initializer && ts2.isObjectLiteralExpression(parent.initializer)) {
          var properties = ts2.arrayFrom(checker.getUnmatchedProperties(checker.getTypeAtLocation(parent.initializer), checker.getTypeAtLocation(token), false, false));
          if (!ts2.length(properties))
            return void 0;
          return { kind: 3, token, properties, indentation: void 0, parentDeclaration: parent.initializer };
        }
        if (ts2.isIdentifier(token) && ts2.isJsxOpeningLikeElement(token.parent)) {
          var attributes = getUnmatchedAttributes(checker, token.parent);
          if (!ts2.length(attributes))
            return void 0;
          return { kind: 4, token, attributes, parentDeclaration: token.parent };
        }
        if (ts2.isIdentifier(token) && ts2.isCallExpression(parent)) {
          return { kind: 2, token, call: parent, sourceFile, modifierFlags: 0, parentDeclaration: sourceFile };
        }
        if (!ts2.isPropertyAccessExpression(parent))
          return void 0;
        var leftExpressionType = ts2.skipConstraint(checker.getTypeAtLocation(parent.expression));
        var symbol = leftExpressionType.symbol;
        if (!symbol || !symbol.declarations)
          return void 0;
        if (ts2.isIdentifier(token) && ts2.isCallExpression(parent.parent)) {
          var moduleDeclaration = ts2.find(symbol.declarations, ts2.isModuleDeclaration);
          var moduleDeclarationSourceFile = moduleDeclaration === null || moduleDeclaration === void 0 ? void 0 : moduleDeclaration.getSourceFile();
          if (moduleDeclaration && moduleDeclarationSourceFile && !isSourceFileFromLibrary(program, moduleDeclarationSourceFile)) {
            return { kind: 2, token, call: parent.parent, sourceFile, modifierFlags: 1, parentDeclaration: moduleDeclaration };
          }
          var moduleSourceFile = ts2.find(symbol.declarations, ts2.isSourceFile);
          if (sourceFile.commonJsModuleIndicator)
            return void 0;
          if (moduleSourceFile && !isSourceFileFromLibrary(program, moduleSourceFile)) {
            return { kind: 2, token, call: parent.parent, sourceFile: moduleSourceFile, modifierFlags: 1, parentDeclaration: moduleSourceFile };
          }
        }
        var classDeclaration = ts2.find(symbol.declarations, ts2.isClassLike);
        if (!classDeclaration && ts2.isPrivateIdentifier(token))
          return void 0;
        var classOrInterface = classDeclaration || ts2.find(symbol.declarations, ts2.isInterfaceDeclaration);
        if (classOrInterface && !isSourceFileFromLibrary(program, classOrInterface.getSourceFile())) {
          var makeStatic = (leftExpressionType.target || leftExpressionType) !== checker.getDeclaredTypeOfSymbol(symbol);
          if (makeStatic && (ts2.isPrivateIdentifier(token) || ts2.isInterfaceDeclaration(classOrInterface)))
            return void 0;
          var declSourceFile = classOrInterface.getSourceFile();
          var modifierFlags = (makeStatic ? 32 : 0) | (ts2.startsWithUnderscore(token.text) ? 8 : 0);
          var isJSFile = ts2.isSourceFileJS(declSourceFile);
          var call = ts2.tryCast(parent.parent, ts2.isCallExpression);
          return { kind: 1, token, call, modifierFlags, parentDeclaration: classOrInterface, declSourceFile, isJSFile };
        }
        var enumDeclaration = ts2.find(symbol.declarations, ts2.isEnumDeclaration);
        if (enumDeclaration && !ts2.isPrivateIdentifier(token) && !isSourceFileFromLibrary(program, enumDeclaration.getSourceFile())) {
          return { kind: 0, token, parentDeclaration: enumDeclaration };
        }
        return void 0;
      }
      function isSourceFileFromLibrary(program, node) {
        return program.isSourceFileFromExternalLibrary(node) || program.isSourceFileDefaultLibrary(node);
      }
      function getActionsForMissingMemberDeclaration(context, info) {
        return info.isJSFile ? ts2.singleElementArray(createActionForAddMissingMemberInJavascriptFile(context, info)) : createActionsForAddMissingMemberInTypeScriptFile(context, info);
      }
      function createActionForAddMissingMemberInJavascriptFile(context, _a) {
        var parentDeclaration = _a.parentDeclaration, declSourceFile = _a.declSourceFile, modifierFlags = _a.modifierFlags, token = _a.token;
        if (ts2.isInterfaceDeclaration(parentDeclaration)) {
          return void 0;
        }
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return addMissingMemberInJs(t, declSourceFile, parentDeclaration, token, !!(modifierFlags & 32));
        });
        if (changes.length === 0) {
          return void 0;
        }
        var diagnostic = modifierFlags & 32 ? ts2.Diagnostics.Initialize_static_property_0 : ts2.isPrivateIdentifier(token) ? ts2.Diagnostics.Declare_a_private_field_named_0 : ts2.Diagnostics.Initialize_property_0_in_the_constructor;
        return codefix2.createCodeFixAction(fixMissingMember, changes, [diagnostic, token.text], fixMissingMember, ts2.Diagnostics.Add_all_missing_members);
      }
      function addMissingMemberInJs(changeTracker, declSourceFile, classDeclaration, token, makeStatic) {
        var tokenName = token.text;
        if (makeStatic) {
          if (classDeclaration.kind === 225) {
            return;
          }
          var className = classDeclaration.name.getText();
          var staticInitialization = initializePropertyToUndefined(ts2.factory.createIdentifier(className), tokenName);
          changeTracker.insertNodeAfter(declSourceFile, classDeclaration, staticInitialization);
        } else if (ts2.isPrivateIdentifier(token)) {
          var property = ts2.factory.createPropertyDeclaration(void 0, void 0, tokenName, void 0, void 0, void 0);
          var lastProp = getNodeToInsertPropertyAfter(classDeclaration);
          if (lastProp) {
            changeTracker.insertNodeAfter(declSourceFile, lastProp, property);
          } else {
            changeTracker.insertNodeAtClassStart(declSourceFile, classDeclaration, property);
          }
        } else {
          var classConstructor = ts2.getFirstConstructorWithBody(classDeclaration);
          if (!classConstructor) {
            return;
          }
          var propertyInitialization = initializePropertyToUndefined(ts2.factory.createThis(), tokenName);
          changeTracker.insertNodeAtConstructorEnd(declSourceFile, classConstructor, propertyInitialization);
        }
      }
      function initializePropertyToUndefined(obj, propertyName) {
        return ts2.factory.createExpressionStatement(ts2.factory.createAssignment(ts2.factory.createPropertyAccessExpression(obj, propertyName), createUndefined()));
      }
      function createActionsForAddMissingMemberInTypeScriptFile(context, _a) {
        var parentDeclaration = _a.parentDeclaration, declSourceFile = _a.declSourceFile, modifierFlags = _a.modifierFlags, token = _a.token;
        var memberName = token.text;
        var isStatic = modifierFlags & 32;
        var typeNode = getTypeNode(context.program.getTypeChecker(), parentDeclaration, token);
        var addPropertyDeclarationChanges = function(modifierFlags2) {
          return ts2.textChanges.ChangeTracker.with(context, function(t) {
            return addPropertyDeclaration(t, declSourceFile, parentDeclaration, memberName, typeNode, modifierFlags2);
          });
        };
        var actions = [codefix2.createCodeFixAction(fixMissingMember, addPropertyDeclarationChanges(modifierFlags & 32), [isStatic ? ts2.Diagnostics.Declare_static_property_0 : ts2.Diagnostics.Declare_property_0, memberName], fixMissingMember, ts2.Diagnostics.Add_all_missing_members)];
        if (isStatic || ts2.isPrivateIdentifier(token)) {
          return actions;
        }
        if (modifierFlags & 8) {
          actions.unshift(codefix2.createCodeFixActionWithoutFixAll(fixMissingMember, addPropertyDeclarationChanges(8), [ts2.Diagnostics.Declare_private_property_0, memberName]));
        }
        actions.push(createAddIndexSignatureAction(context, declSourceFile, parentDeclaration, token.text, typeNode));
        return actions;
      }
      function getTypeNode(checker, classDeclaration, token) {
        var typeNode;
        if (token.parent.parent.kind === 220) {
          var binaryExpression = token.parent.parent;
          var otherExpression = token.parent === binaryExpression.left ? binaryExpression.right : binaryExpression.left;
          var widenedType = checker.getWidenedType(checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(otherExpression)));
          typeNode = checker.typeToTypeNode(widenedType, classDeclaration, 1);
        } else {
          var contextualType = checker.getContextualType(token.parent);
          typeNode = contextualType ? checker.typeToTypeNode(contextualType, void 0, 1) : void 0;
        }
        return typeNode || ts2.factory.createKeywordTypeNode(130);
      }
      function addPropertyDeclaration(changeTracker, declSourceFile, classDeclaration, tokenName, typeNode, modifierFlags) {
        var property = ts2.factory.createPropertyDeclaration(void 0, modifierFlags ? ts2.factory.createNodeArray(ts2.factory.createModifiersFromModifierFlags(modifierFlags)) : void 0, tokenName, void 0, typeNode, void 0);
        var lastProp = getNodeToInsertPropertyAfter(classDeclaration);
        if (lastProp) {
          changeTracker.insertNodeAfter(declSourceFile, lastProp, property);
        } else {
          changeTracker.insertNodeAtClassStart(declSourceFile, classDeclaration, property);
        }
      }
      function getNodeToInsertPropertyAfter(cls) {
        var res;
        for (var _i = 0, _a = cls.members; _i < _a.length; _i++) {
          var member = _a[_i];
          if (!ts2.isPropertyDeclaration(member))
            break;
          res = member;
        }
        return res;
      }
      function createAddIndexSignatureAction(context, declSourceFile, classDeclaration, tokenName, typeNode) {
        var stringTypeNode = ts2.factory.createKeywordTypeNode(149);
        var indexingParameter = ts2.factory.createParameterDeclaration(void 0, void 0, void 0, "x", void 0, stringTypeNode, void 0);
        var indexSignature = ts2.factory.createIndexSignature(void 0, void 0, [indexingParameter], typeNode);
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return t.insertNodeAtClassStart(declSourceFile, classDeclaration, indexSignature);
        });
        return codefix2.createCodeFixActionWithoutFixAll(fixMissingMember, changes, [ts2.Diagnostics.Add_index_signature_for_property_0, tokenName]);
      }
      function getActionsForMissingMethodDeclaration(context, info) {
        var parentDeclaration = info.parentDeclaration, declSourceFile = info.declSourceFile, modifierFlags = info.modifierFlags, token = info.token, call = info.call;
        if (call === void 0) {
          return void 0;
        }
        if (ts2.isPrivateIdentifier(token)) {
          return void 0;
        }
        var methodName = token.text;
        var addMethodDeclarationChanges = function(modifierFlags2) {
          return ts2.textChanges.ChangeTracker.with(context, function(t) {
            return addMethodDeclaration(context, t, call, token, modifierFlags2, parentDeclaration, declSourceFile);
          });
        };
        var actions = [codefix2.createCodeFixAction(fixMissingMember, addMethodDeclarationChanges(modifierFlags & 32), [modifierFlags & 32 ? ts2.Diagnostics.Declare_static_method_0 : ts2.Diagnostics.Declare_method_0, methodName], fixMissingMember, ts2.Diagnostics.Add_all_missing_members)];
        if (modifierFlags & 8) {
          actions.unshift(codefix2.createCodeFixActionWithoutFixAll(fixMissingMember, addMethodDeclarationChanges(8), [ts2.Diagnostics.Declare_private_method_0, methodName]));
        }
        return actions;
      }
      function addMethodDeclaration(context, changes, callExpression, name, modifierFlags, parentDeclaration, sourceFile) {
        var importAdder = codefix2.createImportAdder(sourceFile, context.program, context.preferences, context.host);
        var methodDeclaration = codefix2.createSignatureDeclarationFromCallExpression(168, context, importAdder, callExpression, name, modifierFlags, parentDeclaration);
        var containingMethodDeclaration = ts2.findAncestor(callExpression, function(n) {
          return ts2.isMethodDeclaration(n) || ts2.isConstructorDeclaration(n);
        });
        if (containingMethodDeclaration && containingMethodDeclaration.parent === parentDeclaration) {
          changes.insertNodeAfter(sourceFile, containingMethodDeclaration, methodDeclaration);
        } else {
          changes.insertNodeAtClassStart(sourceFile, parentDeclaration, methodDeclaration);
        }
        importAdder.writeFixes(changes);
      }
      function addEnumMemberDeclaration(changes, checker, _a) {
        var token = _a.token, parentDeclaration = _a.parentDeclaration;
        var hasStringInitializer = ts2.some(parentDeclaration.members, function(member) {
          var type = checker.getTypeAtLocation(member);
          return !!(type && type.flags & 402653316);
        });
        var enumMember = ts2.factory.createEnumMember(token, hasStringInitializer ? ts2.factory.createStringLiteral(token.text) : void 0);
        changes.replaceNode(parentDeclaration.getSourceFile(), parentDeclaration, ts2.factory.updateEnumDeclaration(parentDeclaration, parentDeclaration.decorators, parentDeclaration.modifiers, parentDeclaration.name, ts2.concatenate(parentDeclaration.members, ts2.singleElementArray(enumMember))), {
          leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.IncludeAll,
          trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Exclude
        });
      }
      function addFunctionDeclaration(changes, context, info) {
        var importAdder = codefix2.createImportAdder(context.sourceFile, context.program, context.preferences, context.host);
        var functionDeclaration = codefix2.createSignatureDeclarationFromCallExpression(255, context, importAdder, info.call, ts2.idText(info.token), info.modifierFlags, info.parentDeclaration);
        changes.insertNodeAtEndOfScope(info.sourceFile, info.parentDeclaration, functionDeclaration);
      }
      function addJsxAttributes(changes, context, info) {
        var importAdder = codefix2.createImportAdder(context.sourceFile, context.program, context.preferences, context.host);
        var quotePreference = ts2.getQuotePreference(context.sourceFile, context.preferences);
        var checker = context.program.getTypeChecker();
        var jsxAttributesNode = info.parentDeclaration.attributes;
        var hasSpreadAttribute = ts2.some(jsxAttributesNode.properties, ts2.isJsxSpreadAttribute);
        var attrs = ts2.map(info.attributes, function(attr) {
          var value = attr.valueDeclaration ? tryGetValueFromType(context, checker, importAdder, quotePreference, checker.getTypeAtLocation(attr.valueDeclaration)) : createUndefined();
          return ts2.factory.createJsxAttribute(ts2.factory.createIdentifier(attr.name), ts2.factory.createJsxExpression(void 0, value));
        });
        var jsxAttributes = ts2.factory.createJsxAttributes(hasSpreadAttribute ? __spreadArray(__spreadArray([], attrs, true), jsxAttributesNode.properties, true) : __spreadArray(__spreadArray([], jsxAttributesNode.properties, true), attrs, true));
        var options = { prefix: jsxAttributesNode.pos === jsxAttributesNode.end ? " " : void 0 };
        changes.replaceNode(context.sourceFile, jsxAttributesNode, jsxAttributes, options);
      }
      function addObjectLiteralProperties(changes, context, info) {
        var importAdder = codefix2.createImportAdder(context.sourceFile, context.program, context.preferences, context.host);
        var quotePreference = ts2.getQuotePreference(context.sourceFile, context.preferences);
        var checker = context.program.getTypeChecker();
        var props = ts2.map(info.properties, function(prop) {
          var initializer = prop.valueDeclaration ? tryGetValueFromType(context, checker, importAdder, quotePreference, checker.getTypeAtLocation(prop.valueDeclaration)) : createUndefined();
          return ts2.factory.createPropertyAssignment(prop.name, initializer);
        });
        var options = {
          leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.Exclude,
          trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Exclude,
          indentation: info.indentation
        };
        changes.replaceNode(context.sourceFile, info.parentDeclaration, ts2.factory.createObjectLiteralExpression(__spreadArray(__spreadArray([], info.parentDeclaration.properties, true), props, true), true), options);
      }
      function tryGetValueFromType(context, checker, importAdder, quotePreference, type) {
        if (type.flags & 3) {
          return createUndefined();
        }
        if (type.flags & (4 | 134217728)) {
          return ts2.factory.createStringLiteral("", quotePreference === 0);
        }
        if (type.flags & 8) {
          return ts2.factory.createNumericLiteral(0);
        }
        if (type.flags & 64) {
          return ts2.factory.createBigIntLiteral("0n");
        }
        if (type.flags & 16) {
          return ts2.factory.createFalse();
        }
        if (type.flags & 1056) {
          var enumMember = type.symbol.exports ? ts2.firstOrUndefined(ts2.arrayFrom(type.symbol.exports.values())) : type.symbol;
          var name = checker.symbolToExpression(type.symbol.parent ? type.symbol.parent : type.symbol, 111551, void 0, void 0);
          return enumMember === void 0 || name === void 0 ? ts2.factory.createNumericLiteral(0) : ts2.factory.createPropertyAccessExpression(name, checker.symbolToString(enumMember));
        }
        if (type.flags & 256) {
          return ts2.factory.createNumericLiteral(type.value);
        }
        if (type.flags & 2048) {
          return ts2.factory.createBigIntLiteral(type.value);
        }
        if (type.flags & 128) {
          return ts2.factory.createStringLiteral(type.value, quotePreference === 0);
        }
        if (type.flags & 512) {
          return type === checker.getFalseType() || type === checker.getFalseType(true) ? ts2.factory.createFalse() : ts2.factory.createTrue();
        }
        if (type.flags & 65536) {
          return ts2.factory.createNull();
        }
        if (type.flags & 1048576) {
          var expression = ts2.firstDefined(type.types, function(t) {
            return tryGetValueFromType(context, checker, importAdder, quotePreference, t);
          });
          return expression !== null && expression !== void 0 ? expression : createUndefined();
        }
        if (checker.isArrayLikeType(type)) {
          return ts2.factory.createArrayLiteralExpression();
        }
        if (isObjectLiteralType(type)) {
          var props = ts2.map(checker.getPropertiesOfType(type), function(prop) {
            var initializer = prop.valueDeclaration ? tryGetValueFromType(context, checker, importAdder, quotePreference, checker.getTypeAtLocation(prop.valueDeclaration)) : createUndefined();
            return ts2.factory.createPropertyAssignment(prop.name, initializer);
          });
          return ts2.factory.createObjectLiteralExpression(props, true);
        }
        if (ts2.getObjectFlags(type) & 16) {
          var decl = ts2.find(type.symbol.declarations || ts2.emptyArray, ts2.or(ts2.isFunctionTypeNode, ts2.isMethodSignature, ts2.isMethodDeclaration));
          if (decl === void 0)
            return createUndefined();
          var signature = checker.getSignaturesOfType(type, 0);
          if (signature === void 0)
            return createUndefined();
          var func = codefix2.createSignatureDeclarationFromSignature(212, context, quotePreference, signature[0], codefix2.createStubbedBody(ts2.Diagnostics.Function_not_implemented.message, quotePreference), void 0, void 0, void 0, void 0, importAdder);
          return func !== null && func !== void 0 ? func : createUndefined();
        }
        if (ts2.getObjectFlags(type) & 1) {
          var classDeclaration = ts2.getClassLikeDeclarationOfSymbol(type.symbol);
          if (classDeclaration === void 0 || ts2.hasAbstractModifier(classDeclaration))
            return createUndefined();
          var constructorDeclaration = ts2.getFirstConstructorWithBody(classDeclaration);
          if (constructorDeclaration && ts2.length(constructorDeclaration.parameters))
            return createUndefined();
          return ts2.factory.createNewExpression(ts2.factory.createIdentifier(type.symbol.name), void 0, void 0);
        }
        return createUndefined();
      }
      function createUndefined() {
        return ts2.factory.createIdentifier("undefined");
      }
      function isObjectLiteralType(type) {
        return type.flags & 524288 && (ts2.getObjectFlags(type) & 128 || type.symbol && ts2.tryCast(ts2.singleOrUndefined(type.symbol.declarations), ts2.isTypeLiteralNode));
      }
      function getUnmatchedAttributes(checker, source) {
        var attrsType = checker.getContextualType(source.attributes);
        if (attrsType === void 0)
          return ts2.emptyArray;
        var targetProps = attrsType.getProperties();
        if (!ts2.length(targetProps))
          return ts2.emptyArray;
        var seenNames = new ts2.Set();
        for (var _i = 0, _a = source.attributes.properties; _i < _a.length; _i++) {
          var sourceProp = _a[_i];
          if (ts2.isJsxAttribute(sourceProp)) {
            seenNames.add(sourceProp.name.escapedText);
          }
          if (ts2.isJsxSpreadAttribute(sourceProp)) {
            var type = checker.getTypeAtLocation(sourceProp.expression);
            for (var _b = 0, _c = type.getProperties(); _b < _c.length; _b++) {
              var prop = _c[_b];
              seenNames.add(prop.escapedName);
            }
          }
        }
        return ts2.filter(targetProps, function(targetProp) {
          return !(targetProp.flags & 16777216 || ts2.getCheckFlags(targetProp) & 48 || seenNames.has(targetProp.escapedName));
        });
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "addMissingNewOperator";
      var errorCodes = [ts2.Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return addMissingNewOperator(t, sourceFile, span);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_missing_new_operator_to_call, fixId, ts2.Diagnostics.Add_missing_new_operator_to_all_calls)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return addMissingNewOperator(changes, context.sourceFile, diag);
          });
        }
      });
      function addMissingNewOperator(changes, sourceFile, span) {
        var call = ts2.cast(findAncestorMatchingSpan(sourceFile, span), ts2.isCallExpression);
        var newExpression = ts2.factory.createNewExpression(call.expression, call.typeArguments, call.arguments);
        changes.replaceNode(sourceFile, call, newExpression);
      }
      function findAncestorMatchingSpan(sourceFile, span) {
        var token = ts2.getTokenAtPosition(sourceFile, span.start);
        var end = ts2.textSpanEnd(span);
        while (token.end < end) {
          token = token.parent;
        }
        return token;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixName = "fixCannotFindModule";
      var fixIdInstallTypesPackage = "installTypesPackage";
      var errorCodeCannotFindModule = ts2.Diagnostics.Cannot_find_module_0_or_its_corresponding_type_declarations.code;
      var errorCodes = [
        errorCodeCannotFindModule,
        ts2.Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var host = context.host, sourceFile = context.sourceFile, start = context.span.start;
          var packageName = tryGetImportedPackageName(sourceFile, start);
          if (packageName === void 0)
            return void 0;
          var typesPackageName = getTypesPackageNameToInstall(packageName, host, context.errorCode);
          return typesPackageName === void 0 ? [] : [codefix2.createCodeFixAction(fixName, [], [ts2.Diagnostics.Install_0, typesPackageName], fixIdInstallTypesPackage, ts2.Diagnostics.Install_all_missing_types_packages, getInstallCommand(sourceFile.fileName, typesPackageName))];
        },
        fixIds: [fixIdInstallTypesPackage],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(_changes, diag, commands) {
            var packageName = tryGetImportedPackageName(diag.file, diag.start);
            if (packageName === void 0)
              return void 0;
            switch (context.fixId) {
              case fixIdInstallTypesPackage: {
                var pkg = getTypesPackageNameToInstall(packageName, context.host, diag.code);
                if (pkg) {
                  commands.push(getInstallCommand(diag.file.fileName, pkg));
                }
                break;
              }
              default:
                ts2.Debug.fail("Bad fixId: ".concat(context.fixId));
            }
          });
        }
      });
      function getInstallCommand(fileName, packageName) {
        return { type: "install package", file: fileName, packageName };
      }
      function tryGetImportedPackageName(sourceFile, pos) {
        var moduleSpecifierText = ts2.tryCast(ts2.getTokenAtPosition(sourceFile, pos), ts2.isStringLiteral);
        if (!moduleSpecifierText)
          return void 0;
        var moduleName = moduleSpecifierText.text;
        var packageName = ts2.parsePackageName(moduleName).packageName;
        return ts2.isExternalModuleNameRelative(packageName) ? void 0 : packageName;
      }
      function getTypesPackageNameToInstall(packageName, host, diagCode) {
        var _a;
        return diagCode === errorCodeCannotFindModule ? ts2.JsTyping.nodeCoreModules.has(packageName) ? "@types/node" : void 0 : ((_a = host.isKnownTypesPackageName) === null || _a === void 0 ? void 0 : _a.call(host, packageName)) ? ts2.getTypesPackageName(packageName) : void 0;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var errorCodes = [
        ts2.Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2.code,
        ts2.Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1.code
      ];
      var fixId = "fixClassDoesntImplementInheritedAbstractMember";
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return addMissingMembers(getClass(sourceFile, span.start), sourceFile, context, t, context.preferences);
          });
          return changes.length === 0 ? void 0 : [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Implement_inherited_abstract_class, fixId, ts2.Diagnostics.Implement_all_inherited_abstract_classes)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var seenClassDeclarations = new ts2.Map();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var classDeclaration = getClass(diag.file, diag.start);
            if (ts2.addToSeen(seenClassDeclarations, ts2.getNodeId(classDeclaration))) {
              addMissingMembers(classDeclaration, context.sourceFile, context, changes, context.preferences);
            }
          });
        }
      });
      function getClass(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        return ts2.cast(token.parent, ts2.isClassLike);
      }
      function addMissingMembers(classDeclaration, sourceFile, context, changeTracker, preferences) {
        var extendsNode = ts2.getEffectiveBaseTypeNode(classDeclaration);
        var checker = context.program.getTypeChecker();
        var instantiatedExtendsType = checker.getTypeAtLocation(extendsNode);
        var abstractAndNonPrivateExtendsSymbols = checker.getPropertiesOfType(instantiatedExtendsType).filter(symbolPointsToNonPrivateAndAbstractMember);
        var importAdder = codefix2.createImportAdder(sourceFile, context.program, preferences, context.host);
        codefix2.createMissingMemberNodes(classDeclaration, abstractAndNonPrivateExtendsSymbols, sourceFile, context, preferences, importAdder, function(member) {
          return changeTracker.insertNodeAtClassStart(sourceFile, classDeclaration, member);
        });
        importAdder.writeFixes(changeTracker);
      }
      function symbolPointsToNonPrivateAndAbstractMember(symbol) {
        var flags = ts2.getSyntacticModifierFlags(ts2.first(symbol.getDeclarations()));
        return !(flags & 8) && !!(flags & 128);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "classSuperMustPrecedeThisAccess";
      var errorCodes = [ts2.Diagnostics.super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var nodes = getNodes(sourceFile, span.start);
          if (!nodes)
            return void 0;
          var constructor = nodes.constructor, superCall = nodes.superCall;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, constructor, superCall);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Make_super_call_the_first_statement_in_the_constructor, fixId, ts2.Diagnostics.Make_all_super_calls_the_first_statement_in_their_constructor)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var sourceFile = context.sourceFile;
          var seenClasses = new ts2.Map();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var nodes = getNodes(diag.file, diag.start);
            if (!nodes)
              return;
            var constructor = nodes.constructor, superCall = nodes.superCall;
            if (ts2.addToSeen(seenClasses, ts2.getNodeId(constructor.parent))) {
              doChange(changes, sourceFile, constructor, superCall);
            }
          });
        }
      });
      function doChange(changes, sourceFile, constructor, superCall) {
        changes.insertNodeAtConstructorStart(sourceFile, constructor, superCall);
        changes.delete(sourceFile, superCall);
      }
      function getNodes(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        if (token.kind !== 108)
          return void 0;
        var constructor = ts2.getContainingFunction(token);
        var superCall = findSuperCall(constructor.body);
        return superCall && !superCall.expression.arguments.some(function(arg) {
          return ts2.isPropertyAccessExpression(arg) && arg.expression === token;
        }) ? { constructor, superCall } : void 0;
      }
      function findSuperCall(n) {
        return ts2.isExpressionStatement(n) && ts2.isSuperCall(n.expression) ? n : ts2.isFunctionLike(n) ? void 0 : ts2.forEachChild(n, findSuperCall);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "constructorForDerivedNeedSuperCall";
      var errorCodes = [ts2.Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var ctr = getNode(sourceFile, span.start);
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, ctr);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_missing_super_call, fixId, ts2.Diagnostics.Add_all_missing_super_calls)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return doChange(changes, context.sourceFile, getNode(diag.file, diag.start));
          });
        }
      });
      function getNode(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        ts2.Debug.assert(ts2.isConstructorDeclaration(token.parent), "token should be at the constructor declaration");
        return token.parent;
      }
      function doChange(changes, sourceFile, ctr) {
        var superCall = ts2.factory.createExpressionStatement(ts2.factory.createCallExpression(ts2.factory.createSuper(), void 0, ts2.emptyArray));
        changes.insertNodeAtConstructorStart(sourceFile, ctr, superCall);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "enableExperimentalDecorators";
      var errorCodes = [
        ts2.Diagnostics.Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_in_your_tsconfig_or_jsconfig_to_remove_this_warning.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var configFile = context.program.getCompilerOptions().configFile;
          if (configFile === void 0) {
            return void 0;
          }
          var changes = ts2.textChanges.ChangeTracker.with(context, function(changeTracker) {
            return doChange(changeTracker, configFile);
          });
          return [codefix2.createCodeFixActionWithoutFixAll(fixId, changes, ts2.Diagnostics.Enable_the_experimentalDecorators_option_in_your_configuration_file)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes) {
            var configFile = context.program.getCompilerOptions().configFile;
            if (configFile === void 0) {
              return void 0;
            }
            doChange(changes, configFile);
          });
        }
      });
      function doChange(changeTracker, configFile) {
        codefix2.setJsonCompilerOptionValue(changeTracker, configFile, "experimentalDecorators", ts2.factory.createTrue());
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixID = "fixEnableJsxFlag";
      var errorCodes = [ts2.Diagnostics.Cannot_use_JSX_unless_the_jsx_flag_is_provided.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var configFile = context.program.getCompilerOptions().configFile;
          if (configFile === void 0) {
            return void 0;
          }
          var changes = ts2.textChanges.ChangeTracker.with(context, function(changeTracker) {
            return doChange(changeTracker, configFile);
          });
          return [
            codefix2.createCodeFixActionWithoutFixAll(fixID, changes, ts2.Diagnostics.Enable_the_jsx_flag_in_your_configuration_file)
          ];
        },
        fixIds: [fixID],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes) {
            var configFile = context.program.getCompilerOptions().configFile;
            if (configFile === void 0) {
              return void 0;
            }
            doChange(changes, configFile);
          });
        }
      });
      function doChange(changeTracker, configFile) {
        codefix2.setJsonCompilerOptionValue(changeTracker, configFile, "jsx", ts2.factory.createStringLiteral("react"));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      codefix2.registerCodeFix({
        errorCodes: [
          ts2.Diagnostics.Top_level_await_expressions_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher.code,
          ts2.Diagnostics.Top_level_for_await_loops_are_only_allowed_when_the_module_option_is_set_to_es2022_esnext_system_or_nodenext_and_the_target_option_is_set_to_es2017_or_higher.code
        ],
        getCodeActions: function(context) {
          var compilerOptions = context.program.getCompilerOptions();
          var configFile = compilerOptions.configFile;
          if (configFile === void 0) {
            return void 0;
          }
          var codeFixes = [];
          var moduleKind = ts2.getEmitModuleKind(compilerOptions);
          var moduleOutOfRange = moduleKind >= ts2.ModuleKind.ES2015 && moduleKind < ts2.ModuleKind.ESNext;
          if (moduleOutOfRange) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(changes2) {
              codefix2.setJsonCompilerOptionValue(changes2, configFile, "module", ts2.factory.createStringLiteral("esnext"));
            });
            codeFixes.push(codefix2.createCodeFixActionWithoutFixAll("fixModuleOption", changes, [ts2.Diagnostics.Set_the_module_option_in_your_configuration_file_to_0, "esnext"]));
          }
          var target = ts2.getEmitScriptTarget(compilerOptions);
          var targetOutOfRange = target < 4 || target > 99;
          if (targetOutOfRange) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(tracker) {
              var configObject = ts2.getTsConfigObjectLiteralExpression(configFile);
              if (!configObject)
                return;
              var options = [["target", ts2.factory.createStringLiteral("es2017")]];
              if (moduleKind === ts2.ModuleKind.CommonJS) {
                options.push(["module", ts2.factory.createStringLiteral("commonjs")]);
              }
              codefix2.setJsonCompilerOptionValues(tracker, configFile, options);
            });
            codeFixes.push(codefix2.createCodeFixActionWithoutFixAll("fixTargetOption", changes, [ts2.Diagnostics.Set_the_target_option_in_your_configuration_file_to_0, "es2017"]));
          }
          return codeFixes.length ? codeFixes : void 0;
        }
      });
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixPropertyAssignment";
      var errorCodes = [
        ts2.Diagnostics.Did_you_mean_to_use_a_Colon_An_can_only_follow_a_property_name_when_the_containing_object_literal_is_part_of_a_destructuring_pattern.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixId],
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var property = getProperty(sourceFile, span.start);
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, property);
          });
          return [codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Change_0_to_1, "=", ":"], fixId, [ts2.Diagnostics.Switch_each_misused_0_to_1, "=", ":"])];
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return doChange(changes, diag.file, getProperty(diag.file, diag.start));
          });
        }
      });
      function doChange(changes, sourceFile, node) {
        changes.replaceNode(sourceFile, node, ts2.factory.createPropertyAssignment(node.name, node.objectAssignmentInitializer));
      }
      function getProperty(sourceFile, pos) {
        return ts2.cast(ts2.getTokenAtPosition(sourceFile, pos).parent, ts2.isShorthandPropertyAssignment);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "extendsInterfaceBecomesImplements";
      var errorCodes = [ts2.Diagnostics.Cannot_extend_an_interface_0_Did_you_mean_implements.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile;
          var nodes = getNodes(sourceFile, context.span.start);
          if (!nodes)
            return void 0;
          var extendsToken = nodes.extendsToken, heritageClauses = nodes.heritageClauses;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChanges(t, sourceFile, extendsToken, heritageClauses);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Change_extends_to_implements, fixId, ts2.Diagnostics.Change_all_extended_interfaces_to_implements)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var nodes = getNodes(diag.file, diag.start);
            if (nodes)
              doChanges(changes, diag.file, nodes.extendsToken, nodes.heritageClauses);
          });
        }
      });
      function getNodes(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var heritageClauses = ts2.getContainingClass(token).heritageClauses;
        var extendsToken = heritageClauses[0].getFirstToken();
        return extendsToken.kind === 94 ? { extendsToken, heritageClauses } : void 0;
      }
      function doChanges(changes, sourceFile, extendsToken, heritageClauses) {
        changes.replaceNode(sourceFile, extendsToken, ts2.factory.createToken(117));
        if (heritageClauses.length === 2 && heritageClauses[0].token === 94 && heritageClauses[1].token === 117) {
          var implementsToken = heritageClauses[1].getFirstToken();
          var implementsFullStart = implementsToken.getFullStart();
          changes.replaceRange(sourceFile, { pos: implementsFullStart, end: implementsFullStart }, ts2.factory.createToken(27));
          var text = sourceFile.text;
          var end = implementsToken.end;
          while (end < text.length && ts2.isWhiteSpaceSingleLine(text.charCodeAt(end))) {
            end++;
          }
          changes.deleteRange(sourceFile, { pos: implementsToken.getStart(), end });
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "forgottenThisPropertyAccess";
      var didYouMeanStaticMemberCode = ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0.code;
      var errorCodes = [
        ts2.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0.code,
        ts2.Diagnostics.Private_identifiers_are_only_allowed_in_class_bodies_and_may_only_be_used_as_part_of_a_class_member_declaration_property_access_or_on_the_left_hand_side_of_an_in_expression.code,
        didYouMeanStaticMemberCode
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile;
          var info = getInfo(sourceFile, context.span.start, context.errorCode);
          if (!info) {
            return void 0;
          }
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, info);
          });
          return [codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Add_0_to_unresolved_variable, info.className || "this"], fixId, ts2.Diagnostics.Add_qualifier_to_all_unresolved_variables_matching_a_member_name)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, diag.start, diag.code);
            if (info)
              doChange(changes, context.sourceFile, info);
          });
        }
      });
      function getInfo(sourceFile, pos, diagCode) {
        var node = ts2.getTokenAtPosition(sourceFile, pos);
        if (ts2.isIdentifier(node) || ts2.isPrivateIdentifier(node)) {
          return { node, className: diagCode === didYouMeanStaticMemberCode ? ts2.getContainingClass(node).name.text : void 0 };
        }
      }
      function doChange(changes, sourceFile, _a) {
        var node = _a.node, className = _a.className;
        ts2.suppressLeadingAndTrailingTrivia(node);
        changes.replaceNode(sourceFile, node, ts2.factory.createPropertyAccessExpression(className ? ts2.factory.createIdentifier(className) : ts2.factory.createThis(), node));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixIdExpression = "fixInvalidJsxCharacters_expression";
      var fixIdHtmlEntity = "fixInvalidJsxCharacters_htmlEntity";
      var errorCodes = [
        ts2.Diagnostics.Unexpected_token_Did_you_mean_or_gt.code,
        ts2.Diagnostics.Unexpected_token_Did_you_mean_or_rbrace.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixIdExpression, fixIdHtmlEntity],
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, preferences = context.preferences, span = context.span;
          var changeToExpression = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, preferences, sourceFile, span.start, false);
          });
          var changeToHtmlEntity = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, preferences, sourceFile, span.start, true);
          });
          return [
            codefix2.createCodeFixAction(fixIdExpression, changeToExpression, ts2.Diagnostics.Wrap_invalid_character_in_an_expression_container, fixIdExpression, ts2.Diagnostics.Wrap_all_invalid_characters_in_an_expression_container),
            codefix2.createCodeFixAction(fixIdHtmlEntity, changeToHtmlEntity, ts2.Diagnostics.Convert_invalid_character_to_its_html_entity_code, fixIdHtmlEntity, ts2.Diagnostics.Convert_all_invalid_characters_to_HTML_entity_code)
          ];
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diagnostic) {
            return doChange(changes, context.preferences, diagnostic.file, diagnostic.start, context.fixId === fixIdHtmlEntity);
          });
        }
      });
      var htmlEntity = {
        ">": "&gt;",
        "}": "&rbrace;"
      };
      function isValidCharacter(character) {
        return ts2.hasProperty(htmlEntity, character);
      }
      function doChange(changes, preferences, sourceFile, start, useHtmlEntity) {
        var character = sourceFile.getText()[start];
        if (!isValidCharacter(character)) {
          return;
        }
        var replacement = useHtmlEntity ? htmlEntity[character] : "{".concat(ts2.quote(sourceFile, preferences, character), "}");
        changes.replaceRangeWithText(sourceFile, { pos: start, end: start + 1 }, replacement);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixName = "unusedIdentifier";
      var fixIdPrefix = "unusedIdentifier_prefix";
      var fixIdDelete = "unusedIdentifier_delete";
      var fixIdDeleteImports = "unusedIdentifier_deleteImports";
      var fixIdInfer = "unusedIdentifier_infer";
      var errorCodes = [
        ts2.Diagnostics._0_is_declared_but_its_value_is_never_read.code,
        ts2.Diagnostics._0_is_declared_but_never_used.code,
        ts2.Diagnostics.Property_0_is_declared_but_its_value_is_never_read.code,
        ts2.Diagnostics.All_imports_in_import_declaration_are_unused.code,
        ts2.Diagnostics.All_destructured_elements_are_unused.code,
        ts2.Diagnostics.All_variables_are_unused.code,
        ts2.Diagnostics.All_type_parameters_are_unused.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var errorCode = context.errorCode, sourceFile = context.sourceFile, program = context.program, cancellationToken = context.cancellationToken;
          var checker = program.getTypeChecker();
          var sourceFiles = program.getSourceFiles();
          var token = ts2.getTokenAtPosition(sourceFile, context.span.start);
          if (ts2.isJSDocTemplateTag(token)) {
            return [createDeleteFix(ts2.textChanges.ChangeTracker.with(context, function(t) {
              return t.delete(sourceFile, token);
            }), ts2.Diagnostics.Remove_template_tag)];
          }
          if (token.kind === 29) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return deleteTypeParameters(t, sourceFile, token);
            });
            return [createDeleteFix(changes, ts2.Diagnostics.Remove_type_parameters)];
          }
          var importDecl = tryGetFullImport(token);
          if (importDecl) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return t.delete(sourceFile, importDecl);
            });
            return [codefix2.createCodeFixAction(fixName, changes, [ts2.Diagnostics.Remove_import_from_0, ts2.showModuleSpecifier(importDecl)], fixIdDeleteImports, ts2.Diagnostics.Delete_all_unused_imports)];
          } else if (isImport(token)) {
            var deletion = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return tryDeleteDeclaration(sourceFile, token, t, checker, sourceFiles, program, cancellationToken, false);
            });
            if (deletion.length) {
              return [codefix2.createCodeFixAction(fixName, deletion, [ts2.Diagnostics.Remove_unused_declaration_for_Colon_0, token.getText(sourceFile)], fixIdDeleteImports, ts2.Diagnostics.Delete_all_unused_imports)];
            }
          }
          if (ts2.isObjectBindingPattern(token.parent) || ts2.isArrayBindingPattern(token.parent)) {
            if (ts2.isParameter(token.parent.parent)) {
              var elements = token.parent.elements;
              var diagnostic = [
                elements.length > 1 ? ts2.Diagnostics.Remove_unused_declarations_for_Colon_0 : ts2.Diagnostics.Remove_unused_declaration_for_Colon_0,
                ts2.map(elements, function(e) {
                  return e.getText(sourceFile);
                }).join(", ")
              ];
              return [
                createDeleteFix(ts2.textChanges.ChangeTracker.with(context, function(t) {
                  return deleteDestructuringElements(t, sourceFile, token.parent);
                }), diagnostic)
              ];
            }
            return [
              createDeleteFix(ts2.textChanges.ChangeTracker.with(context, function(t) {
                return t.delete(sourceFile, token.parent.parent);
              }), ts2.Diagnostics.Remove_unused_destructuring_declaration)
            ];
          }
          if (canDeleteEntireVariableStatement(sourceFile, token)) {
            return [
              createDeleteFix(ts2.textChanges.ChangeTracker.with(context, function(t) {
                return deleteEntireVariableStatement(t, sourceFile, token.parent);
              }), ts2.Diagnostics.Remove_variable_statement)
            ];
          }
          var result = [];
          if (token.kind === 137) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return changeInferToUnknown(t, sourceFile, token);
            });
            var name = ts2.cast(token.parent, ts2.isInferTypeNode).typeParameter.name.text;
            result.push(codefix2.createCodeFixAction(fixName, changes, [ts2.Diagnostics.Replace_infer_0_with_unknown, name], fixIdInfer, ts2.Diagnostics.Replace_all_unused_infer_with_unknown));
          } else {
            var deletion = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return tryDeleteDeclaration(sourceFile, token, t, checker, sourceFiles, program, cancellationToken, false);
            });
            if (deletion.length) {
              var name = ts2.isComputedPropertyName(token.parent) ? token.parent : token;
              result.push(createDeleteFix(deletion, [ts2.Diagnostics.Remove_unused_declaration_for_Colon_0, name.getText(sourceFile)]));
            }
          }
          var prefix = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return tryPrefixDeclaration(t, errorCode, sourceFile, token);
          });
          if (prefix.length) {
            result.push(codefix2.createCodeFixAction(fixName, prefix, [ts2.Diagnostics.Prefix_0_with_an_underscore, token.getText(sourceFile)], fixIdPrefix, ts2.Diagnostics.Prefix_all_unused_declarations_with_where_possible));
          }
          return result;
        },
        fixIds: [fixIdPrefix, fixIdDelete, fixIdDeleteImports, fixIdInfer],
        getAllCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, cancellationToken = context.cancellationToken;
          var checker = program.getTypeChecker();
          var sourceFiles = program.getSourceFiles();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var token = ts2.getTokenAtPosition(sourceFile, diag.start);
            switch (context.fixId) {
              case fixIdPrefix:
                tryPrefixDeclaration(changes, diag.code, sourceFile, token);
                break;
              case fixIdDeleteImports: {
                var importDecl = tryGetFullImport(token);
                if (importDecl) {
                  changes.delete(sourceFile, importDecl);
                } else if (isImport(token)) {
                  tryDeleteDeclaration(sourceFile, token, changes, checker, sourceFiles, program, cancellationToken, true);
                }
                break;
              }
              case fixIdDelete: {
                if (token.kind === 137 || isImport(token)) {
                  break;
                } else if (ts2.isJSDocTemplateTag(token)) {
                  changes.delete(sourceFile, token);
                } else if (token.kind === 29) {
                  deleteTypeParameters(changes, sourceFile, token);
                } else if (ts2.isObjectBindingPattern(token.parent)) {
                  if (token.parent.parent.initializer) {
                    break;
                  } else if (!ts2.isParameter(token.parent.parent) || isNotProvidedArguments(token.parent.parent, checker, sourceFiles)) {
                    changes.delete(sourceFile, token.parent.parent);
                  }
                } else if (ts2.isArrayBindingPattern(token.parent.parent) && token.parent.parent.parent.initializer) {
                  break;
                } else if (canDeleteEntireVariableStatement(sourceFile, token)) {
                  deleteEntireVariableStatement(changes, sourceFile, token.parent);
                } else {
                  tryDeleteDeclaration(sourceFile, token, changes, checker, sourceFiles, program, cancellationToken, true);
                }
                break;
              }
              case fixIdInfer:
                if (token.kind === 137) {
                  changeInferToUnknown(changes, sourceFile, token);
                }
                break;
              default:
                ts2.Debug.fail(JSON.stringify(context.fixId));
            }
          });
        }
      });
      function changeInferToUnknown(changes, sourceFile, token) {
        changes.replaceNode(sourceFile, token.parent, ts2.factory.createKeywordTypeNode(154));
      }
      function createDeleteFix(changes, diag) {
        return codefix2.createCodeFixAction(fixName, changes, diag, fixIdDelete, ts2.Diagnostics.Delete_all_unused_declarations);
      }
      function deleteTypeParameters(changes, sourceFile, token) {
        changes.delete(sourceFile, ts2.Debug.checkDefined(ts2.cast(token.parent, ts2.isDeclarationWithTypeParameterChildren).typeParameters, "The type parameter to delete should exist"));
      }
      function isImport(token) {
        return token.kind === 100 || token.kind === 79 && (token.parent.kind === 269 || token.parent.kind === 266);
      }
      function tryGetFullImport(token) {
        return token.kind === 100 ? ts2.tryCast(token.parent, ts2.isImportDeclaration) : void 0;
      }
      function canDeleteEntireVariableStatement(sourceFile, token) {
        return ts2.isVariableDeclarationList(token.parent) && ts2.first(token.parent.getChildren(sourceFile)) === token;
      }
      function deleteEntireVariableStatement(changes, sourceFile, node) {
        changes.delete(sourceFile, node.parent.kind === 236 ? node.parent : node);
      }
      function deleteDestructuringElements(changes, sourceFile, node) {
        ts2.forEach(node.elements, function(n) {
          return changes.delete(sourceFile, n);
        });
      }
      function tryPrefixDeclaration(changes, errorCode, sourceFile, token) {
        if (errorCode === ts2.Diagnostics.Property_0_is_declared_but_its_value_is_never_read.code)
          return;
        if (token.kind === 137) {
          token = ts2.cast(token.parent, ts2.isInferTypeNode).typeParameter.name;
        }
        if (ts2.isIdentifier(token) && canPrefix(token)) {
          changes.replaceNode(sourceFile, token, ts2.factory.createIdentifier("_".concat(token.text)));
          if (ts2.isParameter(token.parent)) {
            ts2.getJSDocParameterTags(token.parent).forEach(function(tag) {
              if (ts2.isIdentifier(tag.name)) {
                changes.replaceNode(sourceFile, tag.name, ts2.factory.createIdentifier("_".concat(tag.name.text)));
              }
            });
          }
        }
      }
      function canPrefix(token) {
        switch (token.parent.kind) {
          case 163:
          case 162:
            return true;
          case 253: {
            var varDecl = token.parent;
            switch (varDecl.parent.parent.kind) {
              case 243:
              case 242:
                return true;
            }
          }
        }
        return false;
      }
      function tryDeleteDeclaration(sourceFile, token, changes, checker, sourceFiles, program, cancellationToken, isFixAll) {
        tryDeleteDeclarationWorker(token, changes, sourceFile, checker, sourceFiles, program, cancellationToken, isFixAll);
        if (ts2.isIdentifier(token)) {
          ts2.FindAllReferences.Core.eachSymbolReferenceInFile(token, checker, sourceFile, function(ref) {
            if (ts2.isPropertyAccessExpression(ref.parent) && ref.parent.name === ref)
              ref = ref.parent;
            if (!isFixAll && mayDeleteExpression(ref)) {
              changes.delete(sourceFile, ref.parent.parent);
            }
          });
        }
      }
      function tryDeleteDeclarationWorker(token, changes, sourceFile, checker, sourceFiles, program, cancellationToken, isFixAll) {
        var parent = token.parent;
        if (ts2.isParameter(parent)) {
          tryDeleteParameter(changes, sourceFile, parent, checker, sourceFiles, program, cancellationToken, isFixAll);
        } else if (!(isFixAll && ts2.isIdentifier(token) && ts2.FindAllReferences.Core.isSymbolReferencedInFile(token, checker, sourceFile))) {
          var node = ts2.isImportClause(parent) ? token : ts2.isComputedPropertyName(parent) ? parent.parent : parent;
          ts2.Debug.assert(node !== sourceFile, "should not delete whole source file");
          changes.delete(sourceFile, node);
        }
      }
      function tryDeleteParameter(changes, sourceFile, parameter, checker, sourceFiles, program, cancellationToken, isFixAll) {
        if (isFixAll === void 0) {
          isFixAll = false;
        }
        if (mayDeleteParameter(checker, sourceFile, parameter, sourceFiles, program, cancellationToken, isFixAll)) {
          if (parameter.modifiers && parameter.modifiers.length > 0 && (!ts2.isIdentifier(parameter.name) || ts2.FindAllReferences.Core.isSymbolReferencedInFile(parameter.name, checker, sourceFile))) {
            parameter.modifiers.forEach(function(modifier) {
              return changes.deleteModifier(sourceFile, modifier);
            });
          } else if (!parameter.initializer && isNotProvidedArguments(parameter, checker, sourceFiles)) {
            changes.delete(sourceFile, parameter);
          }
        }
      }
      function isNotProvidedArguments(parameter, checker, sourceFiles) {
        var index = parameter.parent.parameters.indexOf(parameter);
        return !ts2.FindAllReferences.Core.someSignatureUsage(parameter.parent, sourceFiles, checker, function(_, call) {
          return !call || call.arguments.length > index;
        });
      }
      function mayDeleteParameter(checker, sourceFile, parameter, sourceFiles, program, cancellationToken, isFixAll) {
        var parent = parameter.parent;
        switch (parent.kind) {
          case 168:
          case 170:
            var index = parent.parameters.indexOf(parameter);
            var referent = ts2.isMethodDeclaration(parent) ? parent.name : parent;
            var entries = ts2.FindAllReferences.Core.getReferencedSymbolsForNode(parent.pos, referent, program, sourceFiles, cancellationToken);
            if (entries) {
              for (var _i = 0, entries_2 = entries; _i < entries_2.length; _i++) {
                var entry = entries_2[_i];
                for (var _a = 0, _b = entry.references; _a < _b.length; _a++) {
                  var reference = _b[_a];
                  if (reference.kind === 1) {
                    var isSuperCall_1 = ts2.isSuperKeyword(reference.node) && ts2.isCallExpression(reference.node.parent) && reference.node.parent.arguments.length > index;
                    var isSuperMethodCall = ts2.isPropertyAccessExpression(reference.node.parent) && ts2.isSuperKeyword(reference.node.parent.expression) && ts2.isCallExpression(reference.node.parent.parent) && reference.node.parent.parent.arguments.length > index;
                    var isOverriddenMethod = (ts2.isMethodDeclaration(reference.node.parent) || ts2.isMethodSignature(reference.node.parent)) && reference.node.parent !== parameter.parent && reference.node.parent.parameters.length > index;
                    if (isSuperCall_1 || isSuperMethodCall || isOverriddenMethod)
                      return false;
                  }
                }
              }
            }
            return true;
          case 255: {
            if (parent.name && isCallbackLike(checker, sourceFile, parent.name)) {
              return isLastParameter(parent, parameter, isFixAll);
            }
            return true;
          }
          case 212:
          case 213:
            return isLastParameter(parent, parameter, isFixAll);
          case 172:
            return false;
          default:
            return ts2.Debug.failBadSyntaxKind(parent);
        }
      }
      function isCallbackLike(checker, sourceFile, name) {
        return !!ts2.FindAllReferences.Core.eachSymbolReferenceInFile(name, checker, sourceFile, function(reference) {
          return ts2.isIdentifier(reference) && ts2.isCallExpression(reference.parent) && reference.parent.arguments.indexOf(reference) >= 0;
        });
      }
      function isLastParameter(func, parameter, isFixAll) {
        var parameters = func.parameters;
        var index = parameters.indexOf(parameter);
        ts2.Debug.assert(index !== -1, "The parameter should already be in the list");
        return isFixAll ? parameters.slice(index + 1).every(function(p) {
          return ts2.isIdentifier(p.name) && !p.symbol.isReferenced;
        }) : index === parameters.length - 1;
      }
      function mayDeleteExpression(node) {
        return (ts2.isBinaryExpression(node.parent) && node.parent.left === node || (ts2.isPostfixUnaryExpression(node.parent) || ts2.isPrefixUnaryExpression(node.parent)) && node.parent.operand === node) && ts2.isExpressionStatement(node.parent.parent);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixUnreachableCode";
      var errorCodes = [ts2.Diagnostics.Unreachable_code_detected.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, context.span.start, context.span.length, context.errorCode);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Remove_unreachable_code, fixId, ts2.Diagnostics.Remove_all_unreachable_code)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return doChange(changes, diag.file, diag.start, diag.length, diag.code);
          });
        }
      });
      function doChange(changes, sourceFile, start, length, errorCode) {
        var token = ts2.getTokenAtPosition(sourceFile, start);
        var statement = ts2.findAncestor(token, ts2.isStatement);
        if (statement.getStart(sourceFile) !== token.getStart(sourceFile)) {
          var logData = JSON.stringify({
            statementKind: ts2.Debug.formatSyntaxKind(statement.kind),
            tokenKind: ts2.Debug.formatSyntaxKind(token.kind),
            errorCode,
            start,
            length
          });
          ts2.Debug.fail("Token and statement should start at the same point. " + logData);
        }
        var container = (ts2.isBlock(statement.parent) ? statement.parent : statement).parent;
        if (!ts2.isBlock(statement.parent) || statement === ts2.first(statement.parent.statements)) {
          switch (container.kind) {
            case 238:
              if (container.elseStatement) {
                if (ts2.isBlock(statement.parent)) {
                  break;
                } else {
                  changes.replaceNode(sourceFile, statement, ts2.factory.createBlock(ts2.emptyArray));
                }
                return;
              }
            case 240:
            case 241:
              changes.delete(sourceFile, container);
              return;
          }
        }
        if (ts2.isBlock(statement.parent)) {
          var end_3 = start + length;
          var lastStatement = ts2.Debug.checkDefined(lastWhere(ts2.sliceAfter(statement.parent.statements, statement), function(s) {
            return s.pos < end_3;
          }), "Some statement should be last");
          changes.deleteNodeRange(sourceFile, statement, lastStatement);
        } else {
          changes.delete(sourceFile, statement);
        }
      }
      function lastWhere(a, pred) {
        var last;
        for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
          var value = a_1[_i];
          if (!pred(value))
            break;
          last = value;
        }
        return last;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixUnusedLabel";
      var errorCodes = [ts2.Diagnostics.Unused_label.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, context.span.start);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Remove_unused_label, fixId, ts2.Diagnostics.Remove_all_unused_labels)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return doChange(changes, diag.file, diag.start);
          });
        }
      });
      function doChange(changes, sourceFile, start) {
        var token = ts2.getTokenAtPosition(sourceFile, start);
        var labeledStatement = ts2.cast(token.parent, ts2.isLabeledStatement);
        var pos = token.getStart(sourceFile);
        var statementPos = labeledStatement.statement.getStart(sourceFile);
        var end = ts2.positionsAreOnSameLine(pos, statementPos, sourceFile) ? statementPos : ts2.skipTrivia(sourceFile.text, ts2.findChildOfKind(labeledStatement, 58, sourceFile).end, true);
        changes.deleteRange(sourceFile, { pos, end });
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixIdPlain = "fixJSDocTypes_plain";
      var fixIdNullable = "fixJSDocTypes_nullable";
      var errorCodes = [ts2.Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile;
          var checker = context.program.getTypeChecker();
          var info = getInfo(sourceFile, context.span.start, checker);
          if (!info)
            return void 0;
          var typeNode = info.typeNode, type = info.type;
          var original = typeNode.getText(sourceFile);
          var actions = [fix(type, fixIdPlain, ts2.Diagnostics.Change_all_jsdoc_style_types_to_TypeScript)];
          if (typeNode.kind === 312) {
            actions.push(fix(checker.getNullableType(type, 32768), fixIdNullable, ts2.Diagnostics.Change_all_jsdoc_style_types_to_TypeScript_and_add_undefined_to_nullable_types));
          }
          return actions;
          function fix(type2, fixId, fixAllDescription) {
            var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return doChange(t, sourceFile, typeNode, type2, checker);
            });
            return codefix2.createCodeFixAction("jdocTypes", changes, [ts2.Diagnostics.Change_0_to_1, original, checker.typeToString(type2)], fixId, fixAllDescription);
          }
        },
        fixIds: [fixIdPlain, fixIdNullable],
        getAllCodeActions: function(context) {
          var fixId = context.fixId, program = context.program, sourceFile = context.sourceFile;
          var checker = program.getTypeChecker();
          return codefix2.codeFixAll(context, errorCodes, function(changes, err) {
            var info = getInfo(err.file, err.start, checker);
            if (!info)
              return;
            var typeNode = info.typeNode, type = info.type;
            var fixedType = typeNode.kind === 312 && fixId === fixIdNullable ? checker.getNullableType(type, 32768) : type;
            doChange(changes, sourceFile, typeNode, fixedType, checker);
          });
        }
      });
      function doChange(changes, sourceFile, oldTypeNode, newType, checker) {
        changes.replaceNode(sourceFile, oldTypeNode, checker.typeToTypeNode(newType, oldTypeNode, void 0));
      }
      function getInfo(sourceFile, pos, checker) {
        var decl = ts2.findAncestor(ts2.getTokenAtPosition(sourceFile, pos), isTypeContainer);
        var typeNode = decl && decl.type;
        return typeNode && { typeNode, type: checker.getTypeFromTypeNode(typeNode) };
      }
      function isTypeContainer(node) {
        switch (node.kind) {
          case 228:
          case 173:
          case 174:
          case 255:
          case 171:
          case 175:
          case 194:
          case 168:
          case 167:
          case 163:
          case 166:
          case 165:
          case 172:
          case 258:
          case 210:
          case 253:
            return true;
          default:
            return false;
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixMissingCallParentheses";
      var errorCodes = [
        ts2.Diagnostics.This_condition_will_always_return_true_since_this_function_is_always_defined_Did_you_mean_to_call_it_instead.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixId],
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var callName = getCallName(sourceFile, span.start);
          if (!callName)
            return;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, callName);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_missing_call_parentheses, fixId, ts2.Diagnostics.Add_all_missing_call_parentheses)];
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var callName = getCallName(diag.file, diag.start);
            if (callName)
              doChange(changes, diag.file, callName);
          });
        }
      });
      function doChange(changes, sourceFile, name) {
        changes.replaceNodeWithText(sourceFile, name, "".concat(name.text, "()"));
      }
      function getCallName(sourceFile, start) {
        var token = ts2.getTokenAtPosition(sourceFile, start);
        if (ts2.isPropertyAccessExpression(token.parent)) {
          var current = token.parent;
          while (ts2.isPropertyAccessExpression(current.parent)) {
            current = current.parent;
          }
          return current.name;
        }
        if (ts2.isIdentifier(token)) {
          return token;
        }
        return void 0;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixAwaitInSyncFunction";
      var errorCodes = [
        ts2.Diagnostics.await_expressions_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code,
        ts2.Diagnostics.for_await_loops_are_only_allowed_within_async_functions_and_at_the_top_levels_of_modules.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var nodes = getNodes(sourceFile, span.start);
          if (!nodes)
            return void 0;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, nodes);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_async_modifier_to_containing_function, fixId, ts2.Diagnostics.Add_all_missing_async_modifiers)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var seen = new ts2.Map();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var nodes = getNodes(diag.file, diag.start);
            if (!nodes || !ts2.addToSeen(seen, ts2.getNodeId(nodes.insertBefore)))
              return;
            doChange(changes, context.sourceFile, nodes);
          });
        }
      });
      function getReturnType(expr) {
        if (expr.type) {
          return expr.type;
        }
        if (ts2.isVariableDeclaration(expr.parent) && expr.parent.type && ts2.isFunctionTypeNode(expr.parent.type)) {
          return expr.parent.type.type;
        }
      }
      function getNodes(sourceFile, start) {
        var token = ts2.getTokenAtPosition(sourceFile, start);
        var containingFunction = ts2.getContainingFunction(token);
        if (!containingFunction) {
          return;
        }
        var insertBefore;
        switch (containingFunction.kind) {
          case 168:
            insertBefore = containingFunction.name;
            break;
          case 255:
          case 212:
            insertBefore = ts2.findChildOfKind(containingFunction, 98, sourceFile);
            break;
          case 213:
            var kind = containingFunction.typeParameters ? 29 : 20;
            insertBefore = ts2.findChildOfKind(containingFunction, kind, sourceFile) || ts2.first(containingFunction.parameters);
            break;
          default:
            return;
        }
        return insertBefore && {
          insertBefore,
          returnType: getReturnType(containingFunction)
        };
      }
      function doChange(changes, sourceFile, _a) {
        var insertBefore = _a.insertBefore, returnType = _a.returnType;
        if (returnType) {
          var entityName = ts2.getEntityNameFromTypeNode(returnType);
          if (!entityName || entityName.kind !== 79 || entityName.text !== "Promise") {
            changes.replaceNode(sourceFile, returnType, ts2.factory.createTypeReferenceNode("Promise", ts2.factory.createNodeArray([returnType])));
          }
        }
        changes.insertModifierBefore(sourceFile, 131, insertBefore);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var errorCodes = [
        ts2.Diagnostics._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property.code,
        ts2.Diagnostics._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor.code
      ];
      var fixId = "fixPropertyOverrideAccessor";
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var edits = doChange(context.sourceFile, context.span.start, context.span.length, context.errorCode, context);
          if (edits) {
            return [codefix2.createCodeFixAction(fixId, edits, ts2.Diagnostics.Generate_get_and_set_accessors, fixId, ts2.Diagnostics.Generate_get_and_set_accessors_for_all_overriding_properties)];
          }
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var edits = doChange(diag.file, diag.start, diag.length, diag.code, context);
            if (edits) {
              for (var _i = 0, edits_2 = edits; _i < edits_2.length; _i++) {
                var edit = edits_2[_i];
                changes.pushRaw(context.sourceFile, edit);
              }
            }
          });
        }
      });
      function doChange(file, start, length, code, context) {
        var startPosition;
        var endPosition;
        if (code === ts2.Diagnostics._0_is_defined_as_an_accessor_in_class_1_but_is_overridden_here_in_2_as_an_instance_property.code) {
          startPosition = start;
          endPosition = start + length;
        } else if (code === ts2.Diagnostics._0_is_defined_as_a_property_in_class_1_but_is_overridden_here_in_2_as_an_accessor.code) {
          var checker = context.program.getTypeChecker();
          var node = ts2.getTokenAtPosition(file, start).parent;
          ts2.Debug.assert(ts2.isAccessor(node), "error span of fixPropertyOverrideAccessor should only be on an accessor");
          var containingClass = node.parent;
          ts2.Debug.assert(ts2.isClassLike(containingClass), "erroneous accessors should only be inside classes");
          var base = ts2.singleOrUndefined(codefix2.getAllSupers(containingClass, checker));
          if (!base)
            return [];
          var name = ts2.unescapeLeadingUnderscores(ts2.getTextOfPropertyName(node.name));
          var baseProp = checker.getPropertyOfType(checker.getTypeAtLocation(base), name);
          if (!baseProp || !baseProp.valueDeclaration)
            return [];
          startPosition = baseProp.valueDeclaration.pos;
          endPosition = baseProp.valueDeclaration.end;
          file = ts2.getSourceFileOfNode(baseProp.valueDeclaration);
        } else {
          ts2.Debug.fail("fixPropertyOverrideAccessor codefix got unexpected error code " + code);
        }
        return codefix2.generateAccessorFromProperty(file, context.program, startPosition, endPosition, context, ts2.Diagnostics.Generate_get_and_set_accessors.message);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "inferFromUsage";
      var errorCodes = [
        ts2.Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code,
        ts2.Diagnostics.Variable_0_implicitly_has_an_1_type.code,
        ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type.code,
        ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code,
        ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code,
        ts2.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code,
        ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code,
        ts2.Diagnostics.Member_0_implicitly_has_an_1_type.code,
        ts2.Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage.code,
        ts2.Diagnostics.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code,
        ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code,
        ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code,
        ts2.Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage.code,
        ts2.Diagnostics._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage.code,
        ts2.Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage.code,
        ts2.Diagnostics.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code,
        ts2.Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, start = context.span.start, errorCode = context.errorCode, cancellationToken = context.cancellationToken, host = context.host, preferences = context.preferences;
          var token = ts2.getTokenAtPosition(sourceFile, start);
          var declaration;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(changes2) {
            declaration = doChange(changes2, sourceFile, token, errorCode, program, cancellationToken, ts2.returnTrue, host, preferences);
          });
          var name = declaration && ts2.getNameOfDeclaration(declaration);
          return !name || changes.length === 0 ? void 0 : [codefix2.createCodeFixAction(fixId, changes, [getDiagnostic(errorCode, token), name.getText(sourceFile)], fixId, ts2.Diagnostics.Infer_all_types_from_usage)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, cancellationToken = context.cancellationToken, host = context.host, preferences = context.preferences;
          var markSeen = ts2.nodeSeenTracker();
          return codefix2.codeFixAll(context, errorCodes, function(changes, err) {
            doChange(changes, sourceFile, ts2.getTokenAtPosition(err.file, err.start), err.code, program, cancellationToken, markSeen, host, preferences);
          });
        }
      });
      function getDiagnostic(errorCode, token) {
        switch (errorCode) {
          case ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type.code:
          case ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.isSetAccessorDeclaration(ts2.getContainingFunction(token)) ? ts2.Diagnostics.Infer_type_of_0_from_usage : ts2.Diagnostics.Infer_parameter_types_from_usage;
          case ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code:
          case ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Infer_parameter_types_from_usage;
          case ts2.Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code:
            return ts2.Diagnostics.Infer_this_type_of_0_from_usage;
          default:
            return ts2.Diagnostics.Infer_type_of_0_from_usage;
        }
      }
      function mapSuggestionDiagnostic(errorCode) {
        switch (errorCode) {
          case ts2.Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code;
          case ts2.Diagnostics.Variable_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Variable_0_implicitly_has_an_1_type.code;
          case ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type.code;
          case ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code;
          case ts2.Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_get_accessor_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code;
          case ts2.Diagnostics._0_implicitly_has_an_1_return_type_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code;
          case ts2.Diagnostics.Property_0_implicitly_has_type_any_but_a_better_type_for_its_set_accessor_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code;
          case ts2.Diagnostics.Member_0_implicitly_has_an_1_type_but_a_better_type_may_be_inferred_from_usage.code:
            return ts2.Diagnostics.Member_0_implicitly_has_an_1_type.code;
        }
        return errorCode;
      }
      function doChange(changes, sourceFile, token, errorCode, program, cancellationToken, markSeen, host, preferences) {
        if (!ts2.isParameterPropertyModifier(token.kind) && token.kind !== 79 && token.kind !== 25 && token.kind !== 108) {
          return void 0;
        }
        var parent = token.parent;
        var importAdder = codefix2.createImportAdder(sourceFile, program, preferences, host);
        errorCode = mapSuggestionDiagnostic(errorCode);
        switch (errorCode) {
          case ts2.Diagnostics.Member_0_implicitly_has_an_1_type.code:
          case ts2.Diagnostics.Variable_0_implicitly_has_type_1_in_some_locations_where_its_type_cannot_be_determined.code:
            if (ts2.isVariableDeclaration(parent) && markSeen(parent) || ts2.isPropertyDeclaration(parent) || ts2.isPropertySignature(parent)) {
              annotateVariableDeclaration(changes, importAdder, sourceFile, parent, program, host, cancellationToken);
              importAdder.writeFixes(changes);
              return parent;
            }
            if (ts2.isPropertyAccessExpression(parent)) {
              var type = inferTypeForVariableFromUsage(parent.name, program, cancellationToken);
              var typeNode = ts2.getTypeNodeIfAccessible(type, parent, program, host);
              if (typeNode) {
                var typeTag = ts2.factory.createJSDocTypeTag(void 0, ts2.factory.createJSDocTypeExpression(typeNode), void 0);
                addJSDocTags(changes, sourceFile, ts2.cast(parent.parent.parent, ts2.isExpressionStatement), [typeTag]);
              }
              importAdder.writeFixes(changes);
              return parent;
            }
            return void 0;
          case ts2.Diagnostics.Variable_0_implicitly_has_an_1_type.code: {
            var symbol = program.getTypeChecker().getSymbolAtLocation(token);
            if (symbol && symbol.valueDeclaration && ts2.isVariableDeclaration(symbol.valueDeclaration) && markSeen(symbol.valueDeclaration)) {
              annotateVariableDeclaration(changes, importAdder, sourceFile, symbol.valueDeclaration, program, host, cancellationToken);
              importAdder.writeFixes(changes);
              return symbol.valueDeclaration;
            }
            return void 0;
          }
        }
        var containingFunction = ts2.getContainingFunction(token);
        if (containingFunction === void 0) {
          return void 0;
        }
        var declaration;
        switch (errorCode) {
          case ts2.Diagnostics.Parameter_0_implicitly_has_an_1_type.code:
            if (ts2.isSetAccessorDeclaration(containingFunction)) {
              annotateSetAccessor(changes, importAdder, sourceFile, containingFunction, program, host, cancellationToken);
              declaration = containingFunction;
              break;
            }
          case ts2.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type.code:
            if (markSeen(containingFunction)) {
              var param = ts2.cast(parent, ts2.isParameter);
              annotateParameters(changes, importAdder, sourceFile, param, containingFunction, program, host, cancellationToken);
              declaration = param;
            }
            break;
          case ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation.code:
          case ts2.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type.code:
            if (ts2.isGetAccessorDeclaration(containingFunction) && ts2.isIdentifier(containingFunction.name)) {
              annotate(changes, importAdder, sourceFile, containingFunction, inferTypeForVariableFromUsage(containingFunction.name, program, cancellationToken), program, host);
              declaration = containingFunction;
            }
            break;
          case ts2.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation.code:
            if (ts2.isSetAccessorDeclaration(containingFunction)) {
              annotateSetAccessor(changes, importAdder, sourceFile, containingFunction, program, host, cancellationToken);
              declaration = containingFunction;
            }
            break;
          case ts2.Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation.code:
            if (ts2.textChanges.isThisTypeAnnotatable(containingFunction) && markSeen(containingFunction)) {
              annotateThis(changes, sourceFile, containingFunction, program, host, cancellationToken);
              declaration = containingFunction;
            }
            break;
          default:
            return ts2.Debug.fail(String(errorCode));
        }
        importAdder.writeFixes(changes);
        return declaration;
      }
      function annotateVariableDeclaration(changes, importAdder, sourceFile, declaration, program, host, cancellationToken) {
        if (ts2.isIdentifier(declaration.name)) {
          annotate(changes, importAdder, sourceFile, declaration, inferTypeForVariableFromUsage(declaration.name, program, cancellationToken), program, host);
        }
      }
      function annotateParameters(changes, importAdder, sourceFile, parameterDeclaration, containingFunction, program, host, cancellationToken) {
        if (!ts2.isIdentifier(parameterDeclaration.name)) {
          return;
        }
        var parameterInferences = inferTypeForParametersFromUsage(containingFunction, sourceFile, program, cancellationToken);
        ts2.Debug.assert(containingFunction.parameters.length === parameterInferences.length, "Parameter count and inference count should match");
        if (ts2.isInJSFile(containingFunction)) {
          annotateJSDocParameters(changes, sourceFile, parameterInferences, program, host);
        } else {
          var needParens = ts2.isArrowFunction(containingFunction) && !ts2.findChildOfKind(containingFunction, 20, sourceFile);
          if (needParens)
            changes.insertNodeBefore(sourceFile, ts2.first(containingFunction.parameters), ts2.factory.createToken(20));
          for (var _i = 0, parameterInferences_1 = parameterInferences; _i < parameterInferences_1.length; _i++) {
            var _a = parameterInferences_1[_i], declaration = _a.declaration, type = _a.type;
            if (declaration && !declaration.type && !declaration.initializer) {
              annotate(changes, importAdder, sourceFile, declaration, type, program, host);
            }
          }
          if (needParens)
            changes.insertNodeAfter(sourceFile, ts2.last(containingFunction.parameters), ts2.factory.createToken(21));
        }
      }
      function annotateThis(changes, sourceFile, containingFunction, program, host, cancellationToken) {
        var references = getFunctionReferences(containingFunction, sourceFile, program, cancellationToken);
        if (!references || !references.length) {
          return;
        }
        var thisInference = inferTypeFromReferences(program, references, cancellationToken).thisParameter();
        var typeNode = ts2.getTypeNodeIfAccessible(thisInference, containingFunction, program, host);
        if (!typeNode) {
          return;
        }
        if (ts2.isInJSFile(containingFunction)) {
          annotateJSDocThis(changes, sourceFile, containingFunction, typeNode);
        } else {
          changes.tryInsertThisTypeAnnotation(sourceFile, containingFunction, typeNode);
        }
      }
      function annotateJSDocThis(changes, sourceFile, containingFunction, typeNode) {
        addJSDocTags(changes, sourceFile, containingFunction, [
          ts2.factory.createJSDocThisTag(void 0, ts2.factory.createJSDocTypeExpression(typeNode))
        ]);
      }
      function annotateSetAccessor(changes, importAdder, sourceFile, setAccessorDeclaration, program, host, cancellationToken) {
        var param = ts2.firstOrUndefined(setAccessorDeclaration.parameters);
        if (param && ts2.isIdentifier(setAccessorDeclaration.name) && ts2.isIdentifier(param.name)) {
          var type = inferTypeForVariableFromUsage(setAccessorDeclaration.name, program, cancellationToken);
          if (type === program.getTypeChecker().getAnyType()) {
            type = inferTypeForVariableFromUsage(param.name, program, cancellationToken);
          }
          if (ts2.isInJSFile(setAccessorDeclaration)) {
            annotateJSDocParameters(changes, sourceFile, [{ declaration: param, type }], program, host);
          } else {
            annotate(changes, importAdder, sourceFile, param, type, program, host);
          }
        }
      }
      function annotate(changes, importAdder, sourceFile, declaration, type, program, host) {
        var typeNode = ts2.getTypeNodeIfAccessible(type, declaration, program, host);
        if (typeNode) {
          if (ts2.isInJSFile(sourceFile) && declaration.kind !== 165) {
            var parent = ts2.isVariableDeclaration(declaration) ? ts2.tryCast(declaration.parent.parent, ts2.isVariableStatement) : declaration;
            if (!parent) {
              return;
            }
            var typeExpression = ts2.factory.createJSDocTypeExpression(typeNode);
            var typeTag = ts2.isGetAccessorDeclaration(declaration) ? ts2.factory.createJSDocReturnTag(void 0, typeExpression, void 0) : ts2.factory.createJSDocTypeTag(void 0, typeExpression, void 0);
            addJSDocTags(changes, sourceFile, parent, [typeTag]);
          } else if (!tryReplaceImportTypeNodeWithAutoImport(typeNode, declaration, sourceFile, changes, importAdder, ts2.getEmitScriptTarget(program.getCompilerOptions()))) {
            changes.tryInsertTypeAnnotation(sourceFile, declaration, typeNode);
          }
        }
      }
      function tryReplaceImportTypeNodeWithAutoImport(typeNode, declaration, sourceFile, changes, importAdder, scriptTarget) {
        var importableReference = codefix2.tryGetAutoImportableReferenceFromTypeNode(typeNode, scriptTarget);
        if (importableReference && changes.tryInsertTypeAnnotation(sourceFile, declaration, importableReference.typeNode)) {
          ts2.forEach(importableReference.symbols, function(s) {
            return importAdder.addImportFromExportedSymbol(s, true);
          });
          return true;
        }
        return false;
      }
      function annotateJSDocParameters(changes, sourceFile, parameterInferences, program, host) {
        var signature = parameterInferences.length && parameterInferences[0].declaration.parent;
        if (!signature) {
          return;
        }
        var inferences = ts2.mapDefined(parameterInferences, function(inference) {
          var param = inference.declaration;
          if (param.initializer || ts2.getJSDocType(param) || !ts2.isIdentifier(param.name)) {
            return;
          }
          var typeNode = inference.type && ts2.getTypeNodeIfAccessible(inference.type, param, program, host);
          if (typeNode) {
            var name = ts2.factory.cloneNode(param.name);
            ts2.setEmitFlags(name, 1536 | 2048);
            return { name: ts2.factory.cloneNode(param.name), param, isOptional: !!inference.isOptional, typeNode };
          }
        });
        if (!inferences.length) {
          return;
        }
        if (ts2.isArrowFunction(signature) || ts2.isFunctionExpression(signature)) {
          var needParens = ts2.isArrowFunction(signature) && !ts2.findChildOfKind(signature, 20, sourceFile);
          if (needParens) {
            changes.insertNodeBefore(sourceFile, ts2.first(signature.parameters), ts2.factory.createToken(20));
          }
          ts2.forEach(inferences, function(_a) {
            var typeNode = _a.typeNode, param = _a.param;
            var typeTag = ts2.factory.createJSDocTypeTag(void 0, ts2.factory.createJSDocTypeExpression(typeNode));
            var jsDoc = ts2.factory.createJSDocComment(void 0, [typeTag]);
            changes.insertNodeAt(sourceFile, param.getStart(sourceFile), jsDoc, { suffix: " " });
          });
          if (needParens) {
            changes.insertNodeAfter(sourceFile, ts2.last(signature.parameters), ts2.factory.createToken(21));
          }
        } else {
          var paramTags = ts2.map(inferences, function(_a) {
            var name = _a.name, typeNode = _a.typeNode, isOptional = _a.isOptional;
            return ts2.factory.createJSDocParameterTag(void 0, name, !!isOptional, ts2.factory.createJSDocTypeExpression(typeNode), false, void 0);
          });
          addJSDocTags(changes, sourceFile, signature, paramTags);
        }
      }
      function addJSDocTags(changes, sourceFile, parent, newTags) {
        var comments = ts2.flatMap(parent.jsDoc, function(j) {
          return typeof j.comment === "string" ? ts2.factory.createJSDocText(j.comment) : j.comment;
        });
        var oldTags = ts2.flatMapToMutable(parent.jsDoc, function(j) {
          return j.tags;
        });
        var unmergedNewTags = newTags.filter(function(newTag) {
          return !oldTags || !oldTags.some(function(tag2, i) {
            var merged = tryMergeJsdocTags(tag2, newTag);
            if (merged)
              oldTags[i] = merged;
            return !!merged;
          });
        });
        var tag = ts2.factory.createJSDocComment(ts2.factory.createNodeArray(ts2.intersperse(comments, ts2.factory.createJSDocText("\n"))), ts2.factory.createNodeArray(__spreadArray(__spreadArray([], oldTags || ts2.emptyArray, true), unmergedNewTags, true)));
        var jsDocNode = parent.kind === 213 ? getJsDocNodeForArrowFunction(parent) : parent;
        jsDocNode.jsDoc = parent.jsDoc;
        jsDocNode.jsDocCache = parent.jsDocCache;
        changes.insertJsdocCommentBefore(sourceFile, jsDocNode, tag);
      }
      codefix2.addJSDocTags = addJSDocTags;
      function getJsDocNodeForArrowFunction(signature) {
        if (signature.parent.kind === 166) {
          return signature.parent;
        }
        return signature.parent.parent;
      }
      function tryMergeJsdocTags(oldTag, newTag) {
        if (oldTag.kind !== newTag.kind) {
          return void 0;
        }
        switch (oldTag.kind) {
          case 338: {
            var oldParam = oldTag;
            var newParam = newTag;
            return ts2.isIdentifier(oldParam.name) && ts2.isIdentifier(newParam.name) && oldParam.name.escapedText === newParam.name.escapedText ? ts2.factory.createJSDocParameterTag(void 0, newParam.name, false, newParam.typeExpression, newParam.isNameFirst, oldParam.comment) : void 0;
          }
          case 339:
            return ts2.factory.createJSDocReturnTag(void 0, newTag.typeExpression, oldTag.comment);
        }
      }
      function getReferences(token, program, cancellationToken) {
        return ts2.mapDefined(ts2.FindAllReferences.getReferenceEntriesForNode(-1, token, program, program.getSourceFiles(), cancellationToken), function(entry) {
          return entry.kind !== 0 ? ts2.tryCast(entry.node, ts2.isIdentifier) : void 0;
        });
      }
      function inferTypeForVariableFromUsage(token, program, cancellationToken) {
        var references = getReferences(token, program, cancellationToken);
        return inferTypeFromReferences(program, references, cancellationToken).single();
      }
      function inferTypeForParametersFromUsage(func, sourceFile, program, cancellationToken) {
        var references = getFunctionReferences(func, sourceFile, program, cancellationToken);
        return references && inferTypeFromReferences(program, references, cancellationToken).parameters(func) || func.parameters.map(function(p) {
          return {
            declaration: p,
            type: ts2.isIdentifier(p.name) ? inferTypeForVariableFromUsage(p.name, program, cancellationToken) : program.getTypeChecker().getAnyType()
          };
        });
      }
      function getFunctionReferences(containingFunction, sourceFile, program, cancellationToken) {
        var searchToken;
        switch (containingFunction.kind) {
          case 170:
            searchToken = ts2.findChildOfKind(containingFunction, 134, sourceFile);
            break;
          case 213:
          case 212:
            var parent = containingFunction.parent;
            searchToken = (ts2.isVariableDeclaration(parent) || ts2.isPropertyDeclaration(parent)) && ts2.isIdentifier(parent.name) ? parent.name : containingFunction.name;
            break;
          case 255:
          case 168:
          case 167:
            searchToken = containingFunction.name;
            break;
        }
        if (!searchToken) {
          return void 0;
        }
        return getReferences(searchToken, program, cancellationToken);
      }
      function inferTypeFromReferences(program, references, cancellationToken) {
        var checker = program.getTypeChecker();
        var builtinConstructors = {
          string: function() {
            return checker.getStringType();
          },
          number: function() {
            return checker.getNumberType();
          },
          Array: function(t) {
            return checker.createArrayType(t);
          },
          Promise: function(t) {
            return checker.createPromiseType(t);
          }
        };
        var builtins = [
          checker.getStringType(),
          checker.getNumberType(),
          checker.createArrayType(checker.getAnyType()),
          checker.createPromiseType(checker.getAnyType())
        ];
        return {
          single,
          parameters,
          thisParameter
        };
        function createEmptyUsage() {
          return {
            isNumber: void 0,
            isString: void 0,
            isNumberOrString: void 0,
            candidateTypes: void 0,
            properties: void 0,
            calls: void 0,
            constructs: void 0,
            numberIndex: void 0,
            stringIndex: void 0,
            candidateThisTypes: void 0,
            inferredTypes: void 0
          };
        }
        function combineUsages(usages) {
          var combinedProperties = new ts2.Map();
          for (var _i = 0, usages_1 = usages; _i < usages_1.length; _i++) {
            var u = usages_1[_i];
            if (u.properties) {
              u.properties.forEach(function(p, name) {
                if (!combinedProperties.has(name)) {
                  combinedProperties.set(name, []);
                }
                combinedProperties.get(name).push(p);
              });
            }
          }
          var properties = new ts2.Map();
          combinedProperties.forEach(function(ps, name) {
            properties.set(name, combineUsages(ps));
          });
          return {
            isNumber: usages.some(function(u2) {
              return u2.isNumber;
            }),
            isString: usages.some(function(u2) {
              return u2.isString;
            }),
            isNumberOrString: usages.some(function(u2) {
              return u2.isNumberOrString;
            }),
            candidateTypes: ts2.flatMap(usages, function(u2) {
              return u2.candidateTypes;
            }),
            properties,
            calls: ts2.flatMap(usages, function(u2) {
              return u2.calls;
            }),
            constructs: ts2.flatMap(usages, function(u2) {
              return u2.constructs;
            }),
            numberIndex: ts2.forEach(usages, function(u2) {
              return u2.numberIndex;
            }),
            stringIndex: ts2.forEach(usages, function(u2) {
              return u2.stringIndex;
            }),
            candidateThisTypes: ts2.flatMap(usages, function(u2) {
              return u2.candidateThisTypes;
            }),
            inferredTypes: void 0
          };
        }
        function single() {
          return combineTypes(inferTypesFromReferencesSingle(references));
        }
        function parameters(declaration) {
          if (references.length === 0 || !declaration.parameters) {
            return void 0;
          }
          var usage = createEmptyUsage();
          for (var _i = 0, references_3 = references; _i < references_3.length; _i++) {
            var reference = references_3[_i];
            cancellationToken.throwIfCancellationRequested();
            calculateUsageOfNode(reference, usage);
          }
          var calls = __spreadArray(__spreadArray([], usage.constructs || [], true), usage.calls || [], true);
          return declaration.parameters.map(function(parameter, parameterIndex) {
            var types = [];
            var isRest = ts2.isRestParameter(parameter);
            var isOptional = false;
            for (var _i2 = 0, calls_1 = calls; _i2 < calls_1.length; _i2++) {
              var call = calls_1[_i2];
              if (call.argumentTypes.length <= parameterIndex) {
                isOptional = ts2.isInJSFile(declaration);
                types.push(checker.getUndefinedType());
              } else if (isRest) {
                for (var i = parameterIndex; i < call.argumentTypes.length; i++) {
                  types.push(checker.getBaseTypeOfLiteralType(call.argumentTypes[i]));
                }
              } else {
                types.push(checker.getBaseTypeOfLiteralType(call.argumentTypes[parameterIndex]));
              }
            }
            if (ts2.isIdentifier(parameter.name)) {
              var inferred = inferTypesFromReferencesSingle(getReferences(parameter.name, program, cancellationToken));
              types.push.apply(types, isRest ? ts2.mapDefined(inferred, checker.getElementTypeOfArrayType) : inferred);
            }
            var type = combineTypes(types);
            return {
              type: isRest ? checker.createArrayType(type) : type,
              isOptional: isOptional && !isRest,
              declaration: parameter
            };
          });
        }
        function thisParameter() {
          var usage = createEmptyUsage();
          for (var _i = 0, references_4 = references; _i < references_4.length; _i++) {
            var reference = references_4[_i];
            cancellationToken.throwIfCancellationRequested();
            calculateUsageOfNode(reference, usage);
          }
          return combineTypes(usage.candidateThisTypes || ts2.emptyArray);
        }
        function inferTypesFromReferencesSingle(references2) {
          var usage = createEmptyUsage();
          for (var _i = 0, references_5 = references2; _i < references_5.length; _i++) {
            var reference = references_5[_i];
            cancellationToken.throwIfCancellationRequested();
            calculateUsageOfNode(reference, usage);
          }
          return inferTypes(usage);
        }
        function calculateUsageOfNode(node, usage) {
          while (ts2.isRightSideOfQualifiedNameOrPropertyAccess(node)) {
            node = node.parent;
          }
          switch (node.parent.kind) {
            case 237:
              inferTypeFromExpressionStatement(node, usage);
              break;
            case 219:
              usage.isNumber = true;
              break;
            case 218:
              inferTypeFromPrefixUnaryExpression(node.parent, usage);
              break;
            case 220:
              inferTypeFromBinaryExpression(node, node.parent, usage);
              break;
            case 288:
            case 289:
              inferTypeFromSwitchStatementLabel(node.parent, usage);
              break;
            case 207:
            case 208:
              if (node.parent.expression === node) {
                inferTypeFromCallExpression(node.parent, usage);
              } else {
                inferTypeFromContextualType(node, usage);
              }
              break;
            case 205:
              inferTypeFromPropertyAccessExpression(node.parent, usage);
              break;
            case 206:
              inferTypeFromPropertyElementExpression(node.parent, node, usage);
              break;
            case 294:
            case 295:
              inferTypeFromPropertyAssignment(node.parent, usage);
              break;
            case 166:
              inferTypeFromPropertyDeclaration(node.parent, usage);
              break;
            case 253: {
              var _a = node.parent, name = _a.name, initializer = _a.initializer;
              if (node === name) {
                if (initializer) {
                  addCandidateType(usage, checker.getTypeAtLocation(initializer));
                }
                break;
              }
            }
            default:
              return inferTypeFromContextualType(node, usage);
          }
        }
        function inferTypeFromContextualType(node, usage) {
          if (ts2.isExpressionNode(node)) {
            addCandidateType(usage, checker.getContextualType(node));
          }
        }
        function inferTypeFromExpressionStatement(node, usage) {
          addCandidateType(usage, ts2.isCallExpression(node) ? checker.getVoidType() : checker.getAnyType());
        }
        function inferTypeFromPrefixUnaryExpression(node, usage) {
          switch (node.operator) {
            case 45:
            case 46:
            case 40:
            case 54:
              usage.isNumber = true;
              break;
            case 39:
              usage.isNumberOrString = true;
              break;
          }
        }
        function inferTypeFromBinaryExpression(node, parent, usage) {
          switch (parent.operatorToken.kind) {
            case 42:
            case 41:
            case 43:
            case 44:
            case 47:
            case 48:
            case 49:
            case 50:
            case 51:
            case 52:
            case 65:
            case 67:
            case 66:
            case 68:
            case 69:
            case 73:
            case 74:
            case 78:
            case 70:
            case 72:
            case 71:
            case 40:
            case 29:
            case 32:
            case 31:
            case 33:
              var operandType = checker.getTypeAtLocation(parent.left === node ? parent.right : parent.left);
              if (operandType.flags & 1056) {
                addCandidateType(usage, operandType);
              } else {
                usage.isNumber = true;
              }
              break;
            case 64:
            case 39:
              var otherOperandType = checker.getTypeAtLocation(parent.left === node ? parent.right : parent.left);
              if (otherOperandType.flags & 1056) {
                addCandidateType(usage, otherOperandType);
              } else if (otherOperandType.flags & 296) {
                usage.isNumber = true;
              } else if (otherOperandType.flags & 402653316) {
                usage.isString = true;
              } else if (otherOperandType.flags & 1) {
              } else {
                usage.isNumberOrString = true;
              }
              break;
            case 63:
            case 34:
            case 36:
            case 37:
            case 35:
              addCandidateType(usage, checker.getTypeAtLocation(parent.left === node ? parent.right : parent.left));
              break;
            case 101:
              if (node === parent.left) {
                usage.isString = true;
              }
              break;
            case 56:
            case 60:
              if (node === parent.left && (node.parent.parent.kind === 253 || ts2.isAssignmentExpression(node.parent.parent, true))) {
                addCandidateType(usage, checker.getTypeAtLocation(parent.right));
              }
              break;
            case 55:
            case 27:
            case 102:
              break;
          }
        }
        function inferTypeFromSwitchStatementLabel(parent, usage) {
          addCandidateType(usage, checker.getTypeAtLocation(parent.parent.parent.expression));
        }
        function inferTypeFromCallExpression(parent, usage) {
          var call = {
            argumentTypes: [],
            return_: createEmptyUsage()
          };
          if (parent.arguments) {
            for (var _i = 0, _a = parent.arguments; _i < _a.length; _i++) {
              var argument = _a[_i];
              call.argumentTypes.push(checker.getTypeAtLocation(argument));
            }
          }
          calculateUsageOfNode(parent, call.return_);
          if (parent.kind === 207) {
            (usage.calls || (usage.calls = [])).push(call);
          } else {
            (usage.constructs || (usage.constructs = [])).push(call);
          }
        }
        function inferTypeFromPropertyAccessExpression(parent, usage) {
          var name = ts2.escapeLeadingUnderscores(parent.name.text);
          if (!usage.properties) {
            usage.properties = new ts2.Map();
          }
          var propertyUsage = usage.properties.get(name) || createEmptyUsage();
          calculateUsageOfNode(parent, propertyUsage);
          usage.properties.set(name, propertyUsage);
        }
        function inferTypeFromPropertyElementExpression(parent, node, usage) {
          if (node === parent.argumentExpression) {
            usage.isNumberOrString = true;
            return;
          } else {
            var indexType = checker.getTypeAtLocation(parent.argumentExpression);
            var indexUsage = createEmptyUsage();
            calculateUsageOfNode(parent, indexUsage);
            if (indexType.flags & 296) {
              usage.numberIndex = indexUsage;
            } else {
              usage.stringIndex = indexUsage;
            }
          }
        }
        function inferTypeFromPropertyAssignment(assignment, usage) {
          var nodeWithRealType = ts2.isVariableDeclaration(assignment.parent.parent) ? assignment.parent.parent : assignment.parent;
          addCandidateThisType(usage, checker.getTypeAtLocation(nodeWithRealType));
        }
        function inferTypeFromPropertyDeclaration(declaration, usage) {
          addCandidateThisType(usage, checker.getTypeAtLocation(declaration.parent));
        }
        function removeLowPriorityInferences(inferences, priorities) {
          var toRemove = [];
          for (var _i = 0, inferences_1 = inferences; _i < inferences_1.length; _i++) {
            var i = inferences_1[_i];
            for (var _a = 0, priorities_1 = priorities; _a < priorities_1.length; _a++) {
              var _b = priorities_1[_a], high = _b.high, low = _b.low;
              if (high(i)) {
                ts2.Debug.assert(!low(i), "Priority can't have both low and high");
                toRemove.push(low);
              }
            }
          }
          return inferences.filter(function(i2) {
            return toRemove.every(function(f) {
              return !f(i2);
            });
          });
        }
        function combineFromUsage(usage) {
          return combineTypes(inferTypes(usage));
        }
        function combineTypes(inferences) {
          if (!inferences.length)
            return checker.getAnyType();
          var stringNumber = checker.getUnionType([checker.getStringType(), checker.getNumberType()]);
          var priorities = [
            {
              high: function(t) {
                return t === checker.getStringType() || t === checker.getNumberType();
              },
              low: function(t) {
                return t === stringNumber;
              }
            },
            {
              high: function(t) {
                return !(t.flags & (1 | 16384));
              },
              low: function(t) {
                return !!(t.flags & (1 | 16384));
              }
            },
            {
              high: function(t) {
                return !(t.flags & (98304 | 1 | 16384)) && !(ts2.getObjectFlags(t) & 16);
              },
              low: function(t) {
                return !!(ts2.getObjectFlags(t) & 16);
              }
            }
          ];
          var good = removeLowPriorityInferences(inferences, priorities);
          var anons = good.filter(function(i) {
            return ts2.getObjectFlags(i) & 16;
          });
          if (anons.length) {
            good = good.filter(function(i) {
              return !(ts2.getObjectFlags(i) & 16);
            });
            good.push(combineAnonymousTypes(anons));
          }
          return checker.getWidenedType(checker.getUnionType(good.map(checker.getBaseTypeOfLiteralType), 2));
        }
        function combineAnonymousTypes(anons) {
          if (anons.length === 1) {
            return anons[0];
          }
          var calls = [];
          var constructs = [];
          var stringIndices = [];
          var numberIndices = [];
          var stringIndexReadonly = false;
          var numberIndexReadonly = false;
          var props = ts2.createMultiMap();
          for (var _i = 0, anons_1 = anons; _i < anons_1.length; _i++) {
            var anon = anons_1[_i];
            for (var _a = 0, _b = checker.getPropertiesOfType(anon); _a < _b.length; _a++) {
              var p = _b[_a];
              props.add(p.name, p.valueDeclaration ? checker.getTypeOfSymbolAtLocation(p, p.valueDeclaration) : checker.getAnyType());
            }
            calls.push.apply(calls, checker.getSignaturesOfType(anon, 0));
            constructs.push.apply(constructs, checker.getSignaturesOfType(anon, 1));
            var stringIndexInfo = checker.getIndexInfoOfType(anon, 0);
            if (stringIndexInfo) {
              stringIndices.push(stringIndexInfo.type);
              stringIndexReadonly = stringIndexReadonly || stringIndexInfo.isReadonly;
            }
            var numberIndexInfo = checker.getIndexInfoOfType(anon, 1);
            if (numberIndexInfo) {
              numberIndices.push(numberIndexInfo.type);
              numberIndexReadonly = numberIndexReadonly || numberIndexInfo.isReadonly;
            }
          }
          var members = ts2.mapEntries(props, function(name, types) {
            var isOptional = types.length < anons.length ? 16777216 : 0;
            var s = checker.createSymbol(4 | isOptional, name);
            s.type = checker.getUnionType(types);
            return [name, s];
          });
          var indexInfos = [];
          if (stringIndices.length)
            indexInfos.push(checker.createIndexInfo(checker.getStringType(), checker.getUnionType(stringIndices), stringIndexReadonly));
          if (numberIndices.length)
            indexInfos.push(checker.createIndexInfo(checker.getNumberType(), checker.getUnionType(numberIndices), numberIndexReadonly));
          return checker.createAnonymousType(anons[0].symbol, members, calls, constructs, indexInfos);
        }
        function inferTypes(usage) {
          var _a, _b, _c;
          var types = [];
          if (usage.isNumber) {
            types.push(checker.getNumberType());
          }
          if (usage.isString) {
            types.push(checker.getStringType());
          }
          if (usage.isNumberOrString) {
            types.push(checker.getUnionType([checker.getStringType(), checker.getNumberType()]));
          }
          if (usage.numberIndex) {
            types.push(checker.createArrayType(combineFromUsage(usage.numberIndex)));
          }
          if (((_a = usage.properties) === null || _a === void 0 ? void 0 : _a.size) || ((_b = usage.calls) === null || _b === void 0 ? void 0 : _b.length) || ((_c = usage.constructs) === null || _c === void 0 ? void 0 : _c.length) || usage.stringIndex) {
            types.push(inferStructuralType(usage));
          }
          types.push.apply(types, (usage.candidateTypes || []).map(function(t) {
            return checker.getBaseTypeOfLiteralType(t);
          }));
          types.push.apply(types, inferNamedTypesFromProperties(usage));
          return types;
        }
        function inferStructuralType(usage) {
          var members = new ts2.Map();
          if (usage.properties) {
            usage.properties.forEach(function(u, name) {
              var symbol = checker.createSymbol(4, name);
              symbol.type = combineFromUsage(u);
              members.set(name, symbol);
            });
          }
          var callSignatures = usage.calls ? [getSignatureFromCalls(usage.calls)] : [];
          var constructSignatures = usage.constructs ? [getSignatureFromCalls(usage.constructs)] : [];
          var indexInfos = usage.stringIndex ? [checker.createIndexInfo(checker.getStringType(), combineFromUsage(usage.stringIndex), false)] : [];
          return checker.createAnonymousType(void 0, members, callSignatures, constructSignatures, indexInfos);
        }
        function inferNamedTypesFromProperties(usage) {
          if (!usage.properties || !usage.properties.size)
            return [];
          var types = builtins.filter(function(t) {
            return allPropertiesAreAssignableToUsage(t, usage);
          });
          if (0 < types.length && types.length < 3) {
            return types.map(function(t) {
              return inferInstantiationFromUsage(t, usage);
            });
          }
          return [];
        }
        function allPropertiesAreAssignableToUsage(type, usage) {
          if (!usage.properties)
            return false;
          return !ts2.forEachEntry(usage.properties, function(propUsage, name) {
            var source = checker.getTypeOfPropertyOfType(type, name);
            if (!source) {
              return true;
            }
            if (propUsage.calls) {
              var sigs = checker.getSignaturesOfType(source, 0);
              return !sigs.length || !checker.isTypeAssignableTo(source, getFunctionFromCalls(propUsage.calls));
            } else {
              return !checker.isTypeAssignableTo(source, combineFromUsage(propUsage));
            }
          });
        }
        function inferInstantiationFromUsage(type, usage) {
          if (!(ts2.getObjectFlags(type) & 4) || !usage.properties) {
            return type;
          }
          var generic = type.target;
          var singleTypeParameter = ts2.singleOrUndefined(generic.typeParameters);
          if (!singleTypeParameter)
            return type;
          var types = [];
          usage.properties.forEach(function(propUsage, name) {
            var genericPropertyType = checker.getTypeOfPropertyOfType(generic, name);
            ts2.Debug.assert(!!genericPropertyType, "generic should have all the properties of its reference.");
            types.push.apply(types, inferTypeParameters(genericPropertyType, combineFromUsage(propUsage), singleTypeParameter));
          });
          return builtinConstructors[type.symbol.escapedName](combineTypes(types));
        }
        function inferTypeParameters(genericType, usageType, typeParameter) {
          if (genericType === typeParameter) {
            return [usageType];
          } else if (genericType.flags & 3145728) {
            return ts2.flatMap(genericType.types, function(t) {
              return inferTypeParameters(t, usageType, typeParameter);
            });
          } else if (ts2.getObjectFlags(genericType) & 4 && ts2.getObjectFlags(usageType) & 4) {
            var genericArgs = checker.getTypeArguments(genericType);
            var usageArgs = checker.getTypeArguments(usageType);
            var types = [];
            if (genericArgs && usageArgs) {
              for (var i = 0; i < genericArgs.length; i++) {
                if (usageArgs[i]) {
                  types.push.apply(types, inferTypeParameters(genericArgs[i], usageArgs[i], typeParameter));
                }
              }
            }
            return types;
          }
          var genericSigs = checker.getSignaturesOfType(genericType, 0);
          var usageSigs = checker.getSignaturesOfType(usageType, 0);
          if (genericSigs.length === 1 && usageSigs.length === 1) {
            return inferFromSignatures(genericSigs[0], usageSigs[0], typeParameter);
          }
          return [];
        }
        function inferFromSignatures(genericSig, usageSig, typeParameter) {
          var types = [];
          for (var i = 0; i < genericSig.parameters.length; i++) {
            var genericParam = genericSig.parameters[i];
            var usageParam = usageSig.parameters[i];
            var isRest = genericSig.declaration && ts2.isRestParameter(genericSig.declaration.parameters[i]);
            if (!usageParam) {
              break;
            }
            var genericParamType = genericParam.valueDeclaration ? checker.getTypeOfSymbolAtLocation(genericParam, genericParam.valueDeclaration) : checker.getAnyType();
            var elementType = isRest && checker.getElementTypeOfArrayType(genericParamType);
            if (elementType) {
              genericParamType = elementType;
            }
            var targetType = usageParam.type || (usageParam.valueDeclaration ? checker.getTypeOfSymbolAtLocation(usageParam, usageParam.valueDeclaration) : checker.getAnyType());
            types.push.apply(types, inferTypeParameters(genericParamType, targetType, typeParameter));
          }
          var genericReturn = checker.getReturnTypeOfSignature(genericSig);
          var usageReturn = checker.getReturnTypeOfSignature(usageSig);
          types.push.apply(types, inferTypeParameters(genericReturn, usageReturn, typeParameter));
          return types;
        }
        function getFunctionFromCalls(calls) {
          return checker.createAnonymousType(void 0, ts2.createSymbolTable(), [getSignatureFromCalls(calls)], ts2.emptyArray, ts2.emptyArray);
        }
        function getSignatureFromCalls(calls) {
          var parameters2 = [];
          var length = Math.max.apply(Math, calls.map(function(c) {
            return c.argumentTypes.length;
          }));
          var _loop_16 = function(i2) {
            var symbol = checker.createSymbol(1, ts2.escapeLeadingUnderscores("arg".concat(i2)));
            symbol.type = combineTypes(calls.map(function(call) {
              return call.argumentTypes[i2] || checker.getUndefinedType();
            }));
            if (calls.some(function(call) {
              return call.argumentTypes[i2] === void 0;
            })) {
              symbol.flags |= 16777216;
            }
            parameters2.push(symbol);
          };
          for (var i = 0; i < length; i++) {
            _loop_16(i);
          }
          var returnType = combineFromUsage(combineUsages(calls.map(function(call) {
            return call.return_;
          })));
          return checker.createSignature(void 0, void 0, void 0, parameters2, returnType, void 0, length, 0);
        }
        function addCandidateType(usage, type) {
          if (type && !(type.flags & 1) && !(type.flags & 131072)) {
            (usage.candidateTypes || (usage.candidateTypes = [])).push(type);
          }
        }
        function addCandidateThisType(usage, type) {
          if (type && !(type.flags & 1) && !(type.flags & 131072)) {
            (usage.candidateThisTypes || (usage.candidateThisTypes = [])).push(type);
          }
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixReturnTypeInAsyncFunction";
      var errorCodes = [
        ts2.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_Did_you_mean_to_write_Promise_0.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixId],
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, span = context.span;
          var checker = program.getTypeChecker();
          var info = getInfo(sourceFile, program.getTypeChecker(), span.start);
          if (!info) {
            return void 0;
          }
          var returnTypeNode = info.returnTypeNode, returnType = info.returnType, promisedTypeNode = info.promisedTypeNode, promisedType = info.promisedType;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, returnTypeNode, promisedTypeNode);
          });
          return [codefix2.createCodeFixAction(fixId, changes, [
            ts2.Diagnostics.Replace_0_with_Promise_1,
            checker.typeToString(returnType),
            checker.typeToString(promisedType)
          ], fixId, ts2.Diagnostics.Fix_all_incorrect_return_type_of_an_async_functions)];
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, context.program.getTypeChecker(), diag.start);
            if (info) {
              doChange(changes, diag.file, info.returnTypeNode, info.promisedTypeNode);
            }
          });
        }
      });
      function getInfo(sourceFile, checker, pos) {
        if (ts2.isInJSFile(sourceFile)) {
          return void 0;
        }
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var func = ts2.findAncestor(token, ts2.isFunctionLikeDeclaration);
        var returnTypeNode = func === null || func === void 0 ? void 0 : func.type;
        if (!returnTypeNode) {
          return void 0;
        }
        var returnType = checker.getTypeFromTypeNode(returnTypeNode);
        var promisedType = checker.getAwaitedType(returnType) || checker.getVoidType();
        var promisedTypeNode = checker.typeToTypeNode(promisedType, returnTypeNode, void 0);
        if (promisedTypeNode) {
          return { returnTypeNode, returnType, promisedTypeNode, promisedType };
        }
      }
      function doChange(changes, sourceFile, returnTypeNode, promisedTypeNode) {
        changes.replaceNode(sourceFile, returnTypeNode, ts2.factory.createTypeReferenceNode("Promise", [promisedTypeNode]));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixName = "disableJsDiagnostics";
      var fixId = "disableJsDiagnostics";
      var errorCodes = ts2.mapDefined(Object.keys(ts2.Diagnostics), function(key) {
        var diag = ts2.Diagnostics[key];
        return diag.category === ts2.DiagnosticCategory.Error ? diag.code : void 0;
      });
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, program = context.program, span = context.span, host = context.host, formatContext = context.formatContext;
          if (!ts2.isInJSFile(sourceFile) || !ts2.isCheckJsEnabledForFile(sourceFile, program.getCompilerOptions())) {
            return void 0;
          }
          var newLineCharacter = sourceFile.checkJsDirective ? "" : ts2.getNewLineOrDefaultFromHost(host, formatContext.options);
          var fixes = [
            codefix2.createCodeFixActionWithoutFixAll(fixName, [codefix2.createFileTextChanges(sourceFile.fileName, [
              ts2.createTextChange(sourceFile.checkJsDirective ? ts2.createTextSpanFromBounds(sourceFile.checkJsDirective.pos, sourceFile.checkJsDirective.end) : ts2.createTextSpan(0, 0), "// @ts-nocheck".concat(newLineCharacter))
            ])], ts2.Diagnostics.Disable_checking_for_this_file)
          ];
          if (ts2.textChanges.isValidLocationToAddComment(sourceFile, span.start)) {
            fixes.unshift(codefix2.createCodeFixAction(fixName, ts2.textChanges.ChangeTracker.with(context, function(t) {
              return makeChange(t, sourceFile, span.start);
            }), ts2.Diagnostics.Ignore_this_error_message, fixId, ts2.Diagnostics.Add_ts_ignore_to_all_error_messages));
          }
          return fixes;
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          var seenLines = new ts2.Set();
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            if (ts2.textChanges.isValidLocationToAddComment(diag.file, diag.start)) {
              makeChange(changes, diag.file, diag.start, seenLines);
            }
          });
        }
      });
      function makeChange(changes, sourceFile, position, seenLines) {
        var lineNumber = ts2.getLineAndCharacterOfPosition(sourceFile, position).line;
        if (!seenLines || ts2.tryAddToSet(seenLines, lineNumber)) {
          changes.insertCommentBeforeLine(sourceFile, lineNumber, position, " @ts-ignore");
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      function createMissingMemberNodes(classDeclaration, possiblyMissingSymbols, sourceFile, context, preferences, importAdder, addClassElement) {
        var classMembers = classDeclaration.symbol.members;
        for (var _i = 0, possiblyMissingSymbols_1 = possiblyMissingSymbols; _i < possiblyMissingSymbols_1.length; _i++) {
          var symbol = possiblyMissingSymbols_1[_i];
          if (!classMembers.has(symbol.escapedName)) {
            addNewNodeForMemberSymbol(symbol, classDeclaration, sourceFile, context, preferences, importAdder, addClassElement, void 0);
          }
        }
      }
      codefix2.createMissingMemberNodes = createMissingMemberNodes;
      function getNoopSymbolTrackerWithResolver(context) {
        return {
          trackSymbol: function() {
            return false;
          },
          moduleResolverHost: ts2.getModuleSpecifierResolverHost(context.program, context.host)
        };
      }
      codefix2.getNoopSymbolTrackerWithResolver = getNoopSymbolTrackerWithResolver;
      var PreserveOptionalFlags;
      (function(PreserveOptionalFlags2) {
        PreserveOptionalFlags2[PreserveOptionalFlags2["Method"] = 1] = "Method";
        PreserveOptionalFlags2[PreserveOptionalFlags2["Property"] = 2] = "Property";
        PreserveOptionalFlags2[PreserveOptionalFlags2["All"] = 3] = "All";
      })(PreserveOptionalFlags = codefix2.PreserveOptionalFlags || (codefix2.PreserveOptionalFlags = {}));
      function addNewNodeForMemberSymbol(symbol, enclosingDeclaration, sourceFile, context, preferences, importAdder, addClassElement, body, preserveOptional, isAmbient) {
        if (preserveOptional === void 0) {
          preserveOptional = 3;
        }
        if (isAmbient === void 0) {
          isAmbient = false;
        }
        var declarations = symbol.getDeclarations();
        if (!(declarations && declarations.length)) {
          return void 0;
        }
        var checker = context.program.getTypeChecker();
        var scriptTarget = ts2.getEmitScriptTarget(context.program.getCompilerOptions());
        var declaration = declarations[0];
        var name = ts2.getSynthesizedDeepClone(ts2.getNameOfDeclaration(declaration), false);
        var visibilityModifier = createVisibilityModifier(ts2.getEffectiveModifierFlags(declaration));
        var modifiers = visibilityModifier ? ts2.factory.createNodeArray([visibilityModifier]) : void 0;
        var type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration));
        var optional = !!(symbol.flags & 16777216);
        var ambient = !!(enclosingDeclaration.flags & 8388608) || isAmbient;
        var quotePreference = ts2.getQuotePreference(sourceFile, preferences);
        switch (declaration.kind) {
          case 165:
          case 166:
            var flags = quotePreference === 0 ? 268435456 : void 0;
            var typeNode = checker.typeToTypeNode(type, enclosingDeclaration, flags, getNoopSymbolTrackerWithResolver(context));
            if (importAdder) {
              var importableReference = tryGetAutoImportableReferenceFromTypeNode(typeNode, scriptTarget);
              if (importableReference) {
                typeNode = importableReference.typeNode;
                importSymbols(importAdder, importableReference.symbols);
              }
            }
            addClassElement(ts2.factory.createPropertyDeclaration(void 0, modifiers, name, optional && preserveOptional & 2 ? ts2.factory.createToken(57) : void 0, typeNode, void 0));
            break;
          case 171:
          case 172: {
            var typeNode_1 = checker.typeToTypeNode(type, enclosingDeclaration, void 0, getNoopSymbolTrackerWithResolver(context));
            var allAccessors = ts2.getAllAccessorDeclarations(declarations, declaration);
            var orderedAccessors = allAccessors.secondAccessor ? [allAccessors.firstAccessor, allAccessors.secondAccessor] : [allAccessors.firstAccessor];
            if (importAdder) {
              var importableReference = tryGetAutoImportableReferenceFromTypeNode(typeNode_1, scriptTarget);
              if (importableReference) {
                typeNode_1 = importableReference.typeNode;
                importSymbols(importAdder, importableReference.symbols);
              }
            }
            for (var _i = 0, orderedAccessors_1 = orderedAccessors; _i < orderedAccessors_1.length; _i++) {
              var accessor = orderedAccessors_1[_i];
              if (ts2.isGetAccessorDeclaration(accessor)) {
                addClassElement(ts2.factory.createGetAccessorDeclaration(void 0, modifiers, name, ts2.emptyArray, typeNode_1, ambient ? void 0 : body || createStubbedMethodBody(quotePreference)));
              } else {
                ts2.Debug.assertNode(accessor, ts2.isSetAccessorDeclaration, "The counterpart to a getter should be a setter");
                var parameter = ts2.getSetAccessorValueParameter(accessor);
                var parameterName = parameter && ts2.isIdentifier(parameter.name) ? ts2.idText(parameter.name) : void 0;
                addClassElement(ts2.factory.createSetAccessorDeclaration(void 0, modifiers, name, createDummyParameters(1, [parameterName], [typeNode_1], 1, false), ambient ? void 0 : body || createStubbedMethodBody(quotePreference)));
              }
            }
            break;
          }
          case 167:
          case 168:
            var signatures = checker.getSignaturesOfType(type, 0);
            if (!ts2.some(signatures)) {
              break;
            }
            if (declarations.length === 1) {
              ts2.Debug.assert(signatures.length === 1, "One declaration implies one signature");
              var signature = signatures[0];
              outputMethod(quotePreference, signature, modifiers, name, ambient ? void 0 : body || createStubbedMethodBody(quotePreference));
              break;
            }
            for (var _a = 0, signatures_1 = signatures; _a < signatures_1.length; _a++) {
              var signature = signatures_1[_a];
              outputMethod(quotePreference, signature, ts2.getSynthesizedDeepClones(modifiers, false), ts2.getSynthesizedDeepClone(name, false));
            }
            if (!ambient) {
              if (declarations.length > signatures.length) {
                var signature = checker.getSignatureFromDeclaration(declarations[declarations.length - 1]);
                outputMethod(quotePreference, signature, modifiers, name, body || createStubbedMethodBody(quotePreference));
              } else {
                ts2.Debug.assert(declarations.length === signatures.length, "Declarations and signatures should match count");
                addClassElement(createMethodImplementingSignatures(checker, context, enclosingDeclaration, signatures, name, optional && !!(preserveOptional & 1), modifiers, quotePreference, body));
              }
            }
            break;
        }
        function outputMethod(quotePreference2, signature2, modifiers2, name2, body2) {
          var method = createSignatureDeclarationFromSignature(168, context, quotePreference2, signature2, body2, name2, modifiers2, optional && !!(preserveOptional & 1), enclosingDeclaration, importAdder);
          if (method)
            addClassElement(method);
        }
      }
      codefix2.addNewNodeForMemberSymbol = addNewNodeForMemberSymbol;
      function createSignatureDeclarationFromSignature(kind, context, quotePreference, signature, body, name, modifiers, optional, enclosingDeclaration, importAdder) {
        var program = context.program;
        var checker = program.getTypeChecker();
        var scriptTarget = ts2.getEmitScriptTarget(program.getCompilerOptions());
        var flags = 1 | 1073741824 | 256 | (quotePreference === 0 ? 268435456 : 0);
        var signatureDeclaration = checker.signatureToSignatureDeclaration(signature, kind, enclosingDeclaration, flags, getNoopSymbolTrackerWithResolver(context));
        if (!signatureDeclaration) {
          return void 0;
        }
        var typeParameters = signatureDeclaration.typeParameters;
        var parameters = signatureDeclaration.parameters;
        var type = signatureDeclaration.type;
        if (importAdder) {
          if (typeParameters) {
            var newTypeParameters = ts2.sameMap(typeParameters, function(typeParameterDecl) {
              var constraint = typeParameterDecl.constraint;
              var defaultType = typeParameterDecl.default;
              if (constraint) {
                var importableReference2 = tryGetAutoImportableReferenceFromTypeNode(constraint, scriptTarget);
                if (importableReference2) {
                  constraint = importableReference2.typeNode;
                  importSymbols(importAdder, importableReference2.symbols);
                }
              }
              if (defaultType) {
                var importableReference2 = tryGetAutoImportableReferenceFromTypeNode(defaultType, scriptTarget);
                if (importableReference2) {
                  defaultType = importableReference2.typeNode;
                  importSymbols(importAdder, importableReference2.symbols);
                }
              }
              return ts2.factory.updateTypeParameterDeclaration(typeParameterDecl, typeParameterDecl.name, constraint, defaultType);
            });
            if (typeParameters !== newTypeParameters) {
              typeParameters = ts2.setTextRange(ts2.factory.createNodeArray(newTypeParameters, typeParameters.hasTrailingComma), typeParameters);
            }
          }
          var newParameters = ts2.sameMap(parameters, function(parameterDecl) {
            var importableReference2 = tryGetAutoImportableReferenceFromTypeNode(parameterDecl.type, scriptTarget);
            var type2 = parameterDecl.type;
            if (importableReference2) {
              type2 = importableReference2.typeNode;
              importSymbols(importAdder, importableReference2.symbols);
            }
            return ts2.factory.updateParameterDeclaration(parameterDecl, parameterDecl.decorators, parameterDecl.modifiers, parameterDecl.dotDotDotToken, parameterDecl.name, parameterDecl.questionToken, type2, parameterDecl.initializer);
          });
          if (parameters !== newParameters) {
            parameters = ts2.setTextRange(ts2.factory.createNodeArray(newParameters, parameters.hasTrailingComma), parameters);
          }
          if (type) {
            var importableReference = tryGetAutoImportableReferenceFromTypeNode(type, scriptTarget);
            if (importableReference) {
              type = importableReference.typeNode;
              importSymbols(importAdder, importableReference.symbols);
            }
          }
        }
        var questionToken = optional ? ts2.factory.createToken(57) : void 0;
        var asteriskToken = signatureDeclaration.asteriskToken;
        if (ts2.isFunctionExpression(signatureDeclaration)) {
          return ts2.factory.updateFunctionExpression(signatureDeclaration, modifiers, signatureDeclaration.asteriskToken, ts2.tryCast(name, ts2.isIdentifier), typeParameters, parameters, type, body !== null && body !== void 0 ? body : signatureDeclaration.body);
        }
        if (ts2.isArrowFunction(signatureDeclaration)) {
          return ts2.factory.updateArrowFunction(signatureDeclaration, modifiers, typeParameters, parameters, type, signatureDeclaration.equalsGreaterThanToken, body !== null && body !== void 0 ? body : signatureDeclaration.body);
        }
        if (ts2.isMethodDeclaration(signatureDeclaration)) {
          return ts2.factory.updateMethodDeclaration(signatureDeclaration, void 0, modifiers, asteriskToken, name !== null && name !== void 0 ? name : ts2.factory.createIdentifier(""), questionToken, typeParameters, parameters, type, body);
        }
        return void 0;
      }
      codefix2.createSignatureDeclarationFromSignature = createSignatureDeclarationFromSignature;
      function createSignatureDeclarationFromCallExpression(kind, context, importAdder, call, name, modifierFlags, contextNode) {
        var quotePreference = ts2.getQuotePreference(context.sourceFile, context.preferences);
        var scriptTarget = ts2.getEmitScriptTarget(context.program.getCompilerOptions());
        var tracker = getNoopSymbolTrackerWithResolver(context);
        var checker = context.program.getTypeChecker();
        var isJs = ts2.isInJSFile(contextNode);
        var typeArguments = call.typeArguments, args = call.arguments, parent = call.parent;
        var contextualType = isJs ? void 0 : checker.getContextualType(call);
        var names = ts2.map(args, function(arg) {
          return ts2.isIdentifier(arg) ? arg.text : ts2.isPropertyAccessExpression(arg) && ts2.isIdentifier(arg.name) ? arg.name.text : void 0;
        });
        var types = isJs ? [] : ts2.map(args, function(arg) {
          return typeToAutoImportableTypeNode(checker, importAdder, checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(arg)), contextNode, scriptTarget, void 0, tracker);
        });
        var modifiers = modifierFlags ? ts2.factory.createNodeArray(ts2.factory.createModifiersFromModifierFlags(modifierFlags)) : void 0;
        var asteriskToken = ts2.isYieldExpression(parent) ? ts2.factory.createToken(41) : void 0;
        var typeParameters = isJs || typeArguments === void 0 ? void 0 : ts2.map(typeArguments, function(_, i) {
          return ts2.factory.createTypeParameterDeclaration(84 + typeArguments.length - 1 <= 90 ? String.fromCharCode(84 + i) : "T".concat(i));
        });
        var parameters = createDummyParameters(args.length, names, types, void 0, isJs);
        var type = isJs || contextualType === void 0 ? void 0 : checker.typeToTypeNode(contextualType, contextNode, void 0, tracker);
        if (kind === 168) {
          return ts2.factory.createMethodDeclaration(void 0, modifiers, asteriskToken, name, void 0, typeParameters, parameters, type, ts2.isInterfaceDeclaration(contextNode) ? void 0 : createStubbedMethodBody(quotePreference));
        }
        return ts2.factory.createFunctionDeclaration(void 0, modifiers, asteriskToken, name, typeParameters, parameters, type, createStubbedBody(ts2.Diagnostics.Function_not_implemented.message, quotePreference));
      }
      codefix2.createSignatureDeclarationFromCallExpression = createSignatureDeclarationFromCallExpression;
      function typeToAutoImportableTypeNode(checker, importAdder, type, contextNode, scriptTarget, flags, tracker) {
        var typeNode = checker.typeToTypeNode(type, contextNode, flags, tracker);
        if (typeNode && ts2.isImportTypeNode(typeNode)) {
          var importableReference = tryGetAutoImportableReferenceFromTypeNode(typeNode, scriptTarget);
          if (importableReference) {
            importSymbols(importAdder, importableReference.symbols);
            typeNode = importableReference.typeNode;
          }
        }
        return ts2.getSynthesizedDeepClone(typeNode);
      }
      codefix2.typeToAutoImportableTypeNode = typeToAutoImportableTypeNode;
      function createDummyParameters(argCount, names, types, minArgumentCount, inJs) {
        var parameters = [];
        for (var i = 0; i < argCount; i++) {
          var newParameter = ts2.factory.createParameterDeclaration(void 0, void 0, void 0, names && names[i] || "arg".concat(i), minArgumentCount !== void 0 && i >= minArgumentCount ? ts2.factory.createToken(57) : void 0, inJs ? void 0 : types && types[i] || ts2.factory.createKeywordTypeNode(130), void 0);
          parameters.push(newParameter);
        }
        return parameters;
      }
      function createMethodImplementingSignatures(checker, context, enclosingDeclaration, signatures, name, optional, modifiers, quotePreference, body) {
        var maxArgsSignature = signatures[0];
        var minArgumentCount = signatures[0].minArgumentCount;
        var someSigHasRestParameter = false;
        for (var _i = 0, signatures_2 = signatures; _i < signatures_2.length; _i++) {
          var sig = signatures_2[_i];
          minArgumentCount = Math.min(sig.minArgumentCount, minArgumentCount);
          if (ts2.signatureHasRestParameter(sig)) {
            someSigHasRestParameter = true;
          }
          if (sig.parameters.length >= maxArgsSignature.parameters.length && (!ts2.signatureHasRestParameter(sig) || ts2.signatureHasRestParameter(maxArgsSignature))) {
            maxArgsSignature = sig;
          }
        }
        var maxNonRestArgs = maxArgsSignature.parameters.length - (ts2.signatureHasRestParameter(maxArgsSignature) ? 1 : 0);
        var maxArgsParameterSymbolNames = maxArgsSignature.parameters.map(function(symbol) {
          return symbol.name;
        });
        var parameters = createDummyParameters(maxNonRestArgs, maxArgsParameterSymbolNames, void 0, minArgumentCount, false);
        if (someSigHasRestParameter) {
          var anyArrayType = ts2.factory.createArrayTypeNode(ts2.factory.createKeywordTypeNode(130));
          var restParameter = ts2.factory.createParameterDeclaration(void 0, void 0, ts2.factory.createToken(25), maxArgsParameterSymbolNames[maxNonRestArgs] || "rest", maxNonRestArgs >= minArgumentCount ? ts2.factory.createToken(57) : void 0, anyArrayType, void 0);
          parameters.push(restParameter);
        }
        return createStubbedMethod(modifiers, name, optional, void 0, parameters, getReturnTypeFromSignatures(signatures, checker, context, enclosingDeclaration), quotePreference, body);
      }
      function getReturnTypeFromSignatures(signatures, checker, context, enclosingDeclaration) {
        if (ts2.length(signatures)) {
          var type = checker.getUnionType(ts2.map(signatures, checker.getReturnTypeOfSignature));
          return checker.typeToTypeNode(type, enclosingDeclaration, void 0, getNoopSymbolTrackerWithResolver(context));
        }
      }
      function createStubbedMethod(modifiers, name, optional, typeParameters, parameters, returnType, quotePreference, body) {
        return ts2.factory.createMethodDeclaration(void 0, modifiers, void 0, name, optional ? ts2.factory.createToken(57) : void 0, typeParameters, parameters, returnType, body || createStubbedMethodBody(quotePreference));
      }
      function createStubbedMethodBody(quotePreference) {
        return createStubbedBody(ts2.Diagnostics.Method_not_implemented.message, quotePreference);
      }
      function createStubbedBody(text, quotePreference) {
        return ts2.factory.createBlock([ts2.factory.createThrowStatement(ts2.factory.createNewExpression(ts2.factory.createIdentifier("Error"), void 0, [ts2.factory.createStringLiteral(text, quotePreference === 0)]))], true);
      }
      codefix2.createStubbedBody = createStubbedBody;
      function createVisibilityModifier(flags) {
        if (flags & 4) {
          return ts2.factory.createToken(123);
        } else if (flags & 16) {
          return ts2.factory.createToken(122);
        }
        return void 0;
      }
      function setJsonCompilerOptionValues(changeTracker, configFile, options) {
        var tsconfigObjectLiteral = ts2.getTsConfigObjectLiteralExpression(configFile);
        if (!tsconfigObjectLiteral)
          return void 0;
        var compilerOptionsProperty = findJsonProperty(tsconfigObjectLiteral, "compilerOptions");
        if (compilerOptionsProperty === void 0) {
          changeTracker.insertNodeAtObjectStart(configFile, tsconfigObjectLiteral, createJsonPropertyAssignment("compilerOptions", ts2.factory.createObjectLiteralExpression(options.map(function(_a2) {
            var optionName2 = _a2[0], optionValue2 = _a2[1];
            return createJsonPropertyAssignment(optionName2, optionValue2);
          }), true)));
          return;
        }
        var compilerOptions = compilerOptionsProperty.initializer;
        if (!ts2.isObjectLiteralExpression(compilerOptions)) {
          return;
        }
        for (var _i = 0, options_1 = options; _i < options_1.length; _i++) {
          var _a = options_1[_i], optionName = _a[0], optionValue = _a[1];
          var optionProperty = findJsonProperty(compilerOptions, optionName);
          if (optionProperty === void 0) {
            changeTracker.insertNodeAtObjectStart(configFile, compilerOptions, createJsonPropertyAssignment(optionName, optionValue));
          } else {
            changeTracker.replaceNode(configFile, optionProperty.initializer, optionValue);
          }
        }
      }
      codefix2.setJsonCompilerOptionValues = setJsonCompilerOptionValues;
      function setJsonCompilerOptionValue(changeTracker, configFile, optionName, optionValue) {
        setJsonCompilerOptionValues(changeTracker, configFile, [[optionName, optionValue]]);
      }
      codefix2.setJsonCompilerOptionValue = setJsonCompilerOptionValue;
      function createJsonPropertyAssignment(name, initializer) {
        return ts2.factory.createPropertyAssignment(ts2.factory.createStringLiteral(name), initializer);
      }
      codefix2.createJsonPropertyAssignment = createJsonPropertyAssignment;
      function findJsonProperty(obj, name) {
        return ts2.find(obj.properties, function(p) {
          return ts2.isPropertyAssignment(p) && !!p.name && ts2.isStringLiteral(p.name) && p.name.text === name;
        });
      }
      codefix2.findJsonProperty = findJsonProperty;
      function tryGetAutoImportableReferenceFromTypeNode(importTypeNode, scriptTarget) {
        var symbols;
        var typeNode = ts2.visitNode(importTypeNode, visit);
        if (symbols && typeNode) {
          return { typeNode, symbols };
        }
        function visit(node) {
          var _a;
          if (ts2.isLiteralImportTypeNode(node) && node.qualifier) {
            var firstIdentifier = ts2.getFirstIdentifier(node.qualifier);
            var name = ts2.getNameForExportedSymbol(firstIdentifier.symbol, scriptTarget);
            var qualifier = name !== firstIdentifier.text ? replaceFirstIdentifierOfEntityName(node.qualifier, ts2.factory.createIdentifier(name)) : node.qualifier;
            symbols = ts2.append(symbols, firstIdentifier.symbol);
            var typeArguments = (_a = node.typeArguments) === null || _a === void 0 ? void 0 : _a.map(visit);
            return ts2.factory.createTypeReferenceNode(qualifier, typeArguments);
          }
          return ts2.visitEachChild(node, visit, ts2.nullTransformationContext);
        }
      }
      codefix2.tryGetAutoImportableReferenceFromTypeNode = tryGetAutoImportableReferenceFromTypeNode;
      function replaceFirstIdentifierOfEntityName(name, newIdentifier) {
        if (name.kind === 79) {
          return newIdentifier;
        }
        return ts2.factory.createQualifiedName(replaceFirstIdentifierOfEntityName(name.left, newIdentifier), name.right);
      }
      function importSymbols(importAdder, symbols) {
        symbols.forEach(function(s) {
          return importAdder.addImportFromExportedSymbol(s, true);
        });
      }
      codefix2.importSymbols = importSymbols;
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      function generateAccessorFromProperty(file, program, start, end, context, _actionName) {
        var fieldInfo = getAccessorConvertiblePropertyAtPosition(file, program, start, end);
        if (!fieldInfo || ts2.refactor.isRefactorErrorInfo(fieldInfo))
          return void 0;
        var changeTracker = ts2.textChanges.ChangeTracker.fromContext(context);
        var isStatic = fieldInfo.isStatic, isReadonly = fieldInfo.isReadonly, fieldName = fieldInfo.fieldName, accessorName = fieldInfo.accessorName, originalName = fieldInfo.originalName, type = fieldInfo.type, container = fieldInfo.container, declaration = fieldInfo.declaration;
        ts2.suppressLeadingAndTrailingTrivia(fieldName);
        ts2.suppressLeadingAndTrailingTrivia(accessorName);
        ts2.suppressLeadingAndTrailingTrivia(declaration);
        ts2.suppressLeadingAndTrailingTrivia(container);
        var accessorModifiers;
        var fieldModifiers;
        if (ts2.isClassLike(container)) {
          var modifierFlags = ts2.getEffectiveModifierFlags(declaration);
          if (ts2.isSourceFileJS(file)) {
            var modifiers = ts2.createModifiers(modifierFlags);
            accessorModifiers = modifiers;
            fieldModifiers = modifiers;
          } else {
            accessorModifiers = ts2.createModifiers(prepareModifierFlagsForAccessor(modifierFlags));
            fieldModifiers = ts2.createModifiers(prepareModifierFlagsForField(modifierFlags));
          }
        }
        updateFieldDeclaration(changeTracker, file, declaration, type, fieldName, fieldModifiers);
        var getAccessor = generateGetAccessor(fieldName, accessorName, type, accessorModifiers, isStatic, container);
        ts2.suppressLeadingAndTrailingTrivia(getAccessor);
        insertAccessor(changeTracker, file, getAccessor, declaration, container);
        if (isReadonly) {
          var constructor = ts2.getFirstConstructorWithBody(container);
          if (constructor) {
            updateReadonlyPropertyInitializerStatementConstructor(changeTracker, file, constructor, fieldName.text, originalName);
          }
        } else {
          var setAccessor = generateSetAccessor(fieldName, accessorName, type, accessorModifiers, isStatic, container);
          ts2.suppressLeadingAndTrailingTrivia(setAccessor);
          insertAccessor(changeTracker, file, setAccessor, declaration, container);
        }
        return changeTracker.getChanges();
      }
      codefix2.generateAccessorFromProperty = generateAccessorFromProperty;
      function isConvertibleName(name) {
        return ts2.isIdentifier(name) || ts2.isStringLiteral(name);
      }
      function isAcceptedDeclaration(node) {
        return ts2.isParameterPropertyDeclaration(node, node.parent) || ts2.isPropertyDeclaration(node) || ts2.isPropertyAssignment(node);
      }
      function createPropertyName(name, originalName) {
        return ts2.isIdentifier(originalName) ? ts2.factory.createIdentifier(name) : ts2.factory.createStringLiteral(name);
      }
      function createAccessorAccessExpression(fieldName, isStatic, container) {
        var leftHead = isStatic ? container.name : ts2.factory.createThis();
        return ts2.isIdentifier(fieldName) ? ts2.factory.createPropertyAccessExpression(leftHead, fieldName) : ts2.factory.createElementAccessExpression(leftHead, ts2.factory.createStringLiteralFromNode(fieldName));
      }
      function prepareModifierFlagsForAccessor(modifierFlags) {
        modifierFlags &= ~64;
        modifierFlags &= ~8;
        if (!(modifierFlags & 16)) {
          modifierFlags |= 4;
        }
        return modifierFlags;
      }
      function prepareModifierFlagsForField(modifierFlags) {
        modifierFlags &= ~4;
        modifierFlags &= ~16;
        modifierFlags |= 8;
        return modifierFlags;
      }
      function getAccessorConvertiblePropertyAtPosition(file, program, start, end, considerEmptySpans) {
        if (considerEmptySpans === void 0) {
          considerEmptySpans = true;
        }
        var node = ts2.getTokenAtPosition(file, start);
        var cursorRequest = start === end && considerEmptySpans;
        var declaration = ts2.findAncestor(node.parent, isAcceptedDeclaration);
        var meaning = 28 | 32 | 64;
        if (!declaration || !(ts2.nodeOverlapsWithStartEnd(declaration.name, file, start, end) || cursorRequest)) {
          return {
            error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_property_for_which_to_generate_accessor)
          };
        }
        if (!isConvertibleName(declaration.name)) {
          return {
            error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Name_is_not_valid)
          };
        }
        if ((ts2.getEffectiveModifierFlags(declaration) | meaning) !== meaning) {
          return {
            error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Can_only_convert_property_with_modifier)
          };
        }
        var name = declaration.name.text;
        var startWithUnderscore = ts2.startsWithUnderscore(name);
        var fieldName = createPropertyName(startWithUnderscore ? name : ts2.getUniqueName("_".concat(name), file), declaration.name);
        var accessorName = createPropertyName(startWithUnderscore ? ts2.getUniqueName(name.substring(1), file) : name, declaration.name);
        return {
          isStatic: ts2.hasStaticModifier(declaration),
          isReadonly: ts2.hasEffectiveReadonlyModifier(declaration),
          type: getDeclarationType(declaration, program),
          container: declaration.kind === 163 ? declaration.parent.parent : declaration.parent,
          originalName: declaration.name.text,
          declaration,
          fieldName,
          accessorName,
          renameAccessor: startWithUnderscore
        };
      }
      codefix2.getAccessorConvertiblePropertyAtPosition = getAccessorConvertiblePropertyAtPosition;
      function generateGetAccessor(fieldName, accessorName, type, modifiers, isStatic, container) {
        return ts2.factory.createGetAccessorDeclaration(void 0, modifiers, accessorName, void 0, type, ts2.factory.createBlock([
          ts2.factory.createReturnStatement(createAccessorAccessExpression(fieldName, isStatic, container))
        ], true));
      }
      function generateSetAccessor(fieldName, accessorName, type, modifiers, isStatic, container) {
        return ts2.factory.createSetAccessorDeclaration(void 0, modifiers, accessorName, [ts2.factory.createParameterDeclaration(void 0, void 0, void 0, ts2.factory.createIdentifier("value"), void 0, type)], ts2.factory.createBlock([
          ts2.factory.createExpressionStatement(ts2.factory.createAssignment(createAccessorAccessExpression(fieldName, isStatic, container), ts2.factory.createIdentifier("value")))
        ], true));
      }
      function updatePropertyDeclaration(changeTracker, file, declaration, type, fieldName, modifiers) {
        var property = ts2.factory.updatePropertyDeclaration(declaration, declaration.decorators, modifiers, fieldName, declaration.questionToken || declaration.exclamationToken, type, declaration.initializer);
        changeTracker.replaceNode(file, declaration, property);
      }
      function updatePropertyAssignmentDeclaration(changeTracker, file, declaration, fieldName) {
        var assignment = ts2.factory.updatePropertyAssignment(declaration, fieldName, declaration.initializer);
        changeTracker.replacePropertyAssignment(file, declaration, assignment);
      }
      function updateFieldDeclaration(changeTracker, file, declaration, type, fieldName, modifiers) {
        if (ts2.isPropertyDeclaration(declaration)) {
          updatePropertyDeclaration(changeTracker, file, declaration, type, fieldName, modifiers);
        } else if (ts2.isPropertyAssignment(declaration)) {
          updatePropertyAssignmentDeclaration(changeTracker, file, declaration, fieldName);
        } else {
          changeTracker.replaceNode(file, declaration, ts2.factory.updateParameterDeclaration(declaration, declaration.decorators, modifiers, declaration.dotDotDotToken, ts2.cast(fieldName, ts2.isIdentifier), declaration.questionToken, declaration.type, declaration.initializer));
        }
      }
      function insertAccessor(changeTracker, file, accessor, declaration, container) {
        ts2.isParameterPropertyDeclaration(declaration, declaration.parent) ? changeTracker.insertNodeAtClassStart(file, container, accessor) : ts2.isPropertyAssignment(declaration) ? changeTracker.insertNodeAfterComma(file, declaration, accessor) : changeTracker.insertNodeAfter(file, declaration, accessor);
      }
      function updateReadonlyPropertyInitializerStatementConstructor(changeTracker, file, constructor, fieldName, originalName) {
        if (!constructor.body)
          return;
        constructor.body.forEachChild(function recur(node) {
          if (ts2.isElementAccessExpression(node) && node.expression.kind === 108 && ts2.isStringLiteral(node.argumentExpression) && node.argumentExpression.text === originalName && ts2.isWriteAccess(node)) {
            changeTracker.replaceNode(file, node.argumentExpression, ts2.factory.createStringLiteral(fieldName));
          }
          if (ts2.isPropertyAccessExpression(node) && node.expression.kind === 108 && node.name.text === originalName && ts2.isWriteAccess(node)) {
            changeTracker.replaceNode(file, node.name, ts2.factory.createIdentifier(fieldName));
          }
          if (!ts2.isFunctionLike(node) && !ts2.isClassLike(node)) {
            node.forEachChild(recur);
          }
        });
      }
      function getDeclarationType(declaration, program) {
        var typeNode = ts2.getTypeAnnotationNode(declaration);
        if (ts2.isPropertyDeclaration(declaration) && typeNode && declaration.questionToken) {
          var typeChecker = program.getTypeChecker();
          var type = typeChecker.getTypeFromTypeNode(typeNode);
          if (!typeChecker.isTypeAssignableTo(typeChecker.getUndefinedType(), type)) {
            var types = ts2.isUnionTypeNode(typeNode) ? typeNode.types : [typeNode];
            return ts2.factory.createUnionTypeNode(__spreadArray(__spreadArray([], types, true), [ts2.factory.createKeywordTypeNode(152)], false));
          }
        }
        return typeNode;
      }
      function getAllSupers(decl, checker) {
        var res = [];
        while (decl) {
          var superElement = ts2.getClassExtendsHeritageElement(decl);
          var superSymbol = superElement && checker.getSymbolAtLocation(superElement.expression);
          if (!superSymbol)
            break;
          var symbol = superSymbol.flags & 2097152 ? checker.getAliasedSymbol(superSymbol) : superSymbol;
          var superDecl = symbol.declarations && ts2.find(symbol.declarations, ts2.isClassLike);
          if (!superDecl)
            break;
          res.push(superDecl);
          decl = superDecl;
        }
        return res;
      }
      codefix2.getAllSupers = getAllSupers;
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixName = "invalidImportSyntax";
      function getCodeFixesForImportDeclaration(context, node) {
        var sourceFile = ts2.getSourceFileOfNode(node);
        var namespace = ts2.getNamespaceDeclarationNode(node);
        var opts = context.program.getCompilerOptions();
        var variations = [];
        variations.push(createAction(context, sourceFile, node, ts2.makeImport(namespace.name, void 0, node.moduleSpecifier, ts2.getQuotePreference(sourceFile, context.preferences))));
        if (ts2.getEmitModuleKind(opts) === ts2.ModuleKind.CommonJS) {
          variations.push(createAction(context, sourceFile, node, ts2.factory.createImportEqualsDeclaration(void 0, void 0, false, namespace.name, ts2.factory.createExternalModuleReference(node.moduleSpecifier))));
        }
        return variations;
      }
      function createAction(context, sourceFile, node, replacement) {
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return t.replaceNode(sourceFile, node, replacement);
        });
        return codefix2.createCodeFixActionWithoutFixAll(fixName, changes, [ts2.Diagnostics.Replace_import_with_0, changes[0].textChanges[0].newText]);
      }
      codefix2.registerCodeFix({
        errorCodes: [
          ts2.Diagnostics.This_expression_is_not_callable.code,
          ts2.Diagnostics.This_expression_is_not_constructable.code
        ],
        getCodeActions: getActionsForUsageOfInvalidImport
      });
      function getActionsForUsageOfInvalidImport(context) {
        var sourceFile = context.sourceFile;
        var targetKind = ts2.Diagnostics.This_expression_is_not_callable.code === context.errorCode ? 207 : 208;
        var node = ts2.findAncestor(ts2.getTokenAtPosition(sourceFile, context.span.start), function(a) {
          return a.kind === targetKind;
        });
        if (!node) {
          return [];
        }
        var expr = node.expression;
        return getImportCodeFixesForExpression(context, expr);
      }
      codefix2.registerCodeFix({
        errorCodes: [
          ts2.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1.code,
          ts2.Diagnostics.Type_0_does_not_satisfy_the_constraint_1.code,
          ts2.Diagnostics.Type_0_is_not_assignable_to_type_1.code,
          ts2.Diagnostics.Type_0_is_not_assignable_to_type_1_Two_different_types_with_this_name_exist_but_they_are_unrelated.code,
          ts2.Diagnostics.Type_predicate_0_is_not_assignable_to_1.code,
          ts2.Diagnostics.Property_0_of_type_1_is_not_assignable_to_2_index_type_3.code,
          ts2.Diagnostics._0_index_type_1_is_not_assignable_to_2_index_type_3.code,
          ts2.Diagnostics.Property_0_in_type_1_is_not_assignable_to_the_same_property_in_base_type_2.code,
          ts2.Diagnostics.Property_0_in_type_1_is_not_assignable_to_type_2.code,
          ts2.Diagnostics.Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property.code,
          ts2.Diagnostics.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1.code
        ],
        getCodeActions: getActionsForInvalidImportLocation
      });
      function getActionsForInvalidImportLocation(context) {
        var sourceFile = context.sourceFile;
        var node = ts2.findAncestor(ts2.getTokenAtPosition(sourceFile, context.span.start), function(a) {
          return a.getStart() === context.span.start && a.getEnd() === context.span.start + context.span.length;
        });
        if (!node) {
          return [];
        }
        return getImportCodeFixesForExpression(context, node);
      }
      function getImportCodeFixesForExpression(context, expr) {
        var type = context.program.getTypeChecker().getTypeAtLocation(expr);
        if (!(type.symbol && type.symbol.originatingImport)) {
          return [];
        }
        var fixes = [];
        var relatedImport = type.symbol.originatingImport;
        if (!ts2.isImportCall(relatedImport)) {
          ts2.addRange(fixes, getCodeFixesForImportDeclaration(context, relatedImport));
        }
        if (ts2.isExpression(expr) && !(ts2.isNamedDeclaration(expr.parent) && expr.parent.name === expr)) {
          var sourceFile_2 = context.sourceFile;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return t.replaceNode(sourceFile_2, expr, ts2.factory.createPropertyAccessExpression(expr, "default"), {});
          });
          fixes.push(codefix2.createCodeFixActionWithoutFixAll(fixName, changes, ts2.Diagnostics.Use_synthetic_default_member));
        }
        return fixes;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixName = "strictClassInitialization";
      var fixIdAddDefiniteAssignmentAssertions = "addMissingPropertyDefiniteAssignmentAssertions";
      var fixIdAddUndefinedType = "addMissingPropertyUndefinedType";
      var fixIdAddInitializer = "addMissingPropertyInitializer";
      var errorCodes = [ts2.Diagnostics.Property_0_has_no_initializer_and_is_not_definitely_assigned_in_the_constructor.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var propertyDeclaration = getPropertyDeclaration(context.sourceFile, context.span.start);
          if (!propertyDeclaration)
            return;
          var result = [
            getActionForAddMissingUndefinedType(context, propertyDeclaration),
            getActionForAddMissingDefiniteAssignmentAssertion(context, propertyDeclaration)
          ];
          ts2.append(result, getActionForAddMissingInitializer(context, propertyDeclaration));
          return result;
        },
        fixIds: [fixIdAddDefiniteAssignmentAssertions, fixIdAddUndefinedType, fixIdAddInitializer],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var propertyDeclaration = getPropertyDeclaration(diag.file, diag.start);
            if (!propertyDeclaration)
              return;
            switch (context.fixId) {
              case fixIdAddDefiniteAssignmentAssertions:
                addDefiniteAssignmentAssertion(changes, diag.file, propertyDeclaration);
                break;
              case fixIdAddUndefinedType:
                addUndefinedType(changes, diag.file, propertyDeclaration);
                break;
              case fixIdAddInitializer:
                var checker = context.program.getTypeChecker();
                var initializer = getInitializer(checker, propertyDeclaration);
                if (!initializer)
                  return;
                addInitializer(changes, diag.file, propertyDeclaration, initializer);
                break;
              default:
                ts2.Debug.fail(JSON.stringify(context.fixId));
            }
          });
        }
      });
      function getPropertyDeclaration(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        return ts2.isIdentifier(token) ? ts2.cast(token.parent, ts2.isPropertyDeclaration) : void 0;
      }
      function getActionForAddMissingDefiniteAssignmentAssertion(context, propertyDeclaration) {
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return addDefiniteAssignmentAssertion(t, context.sourceFile, propertyDeclaration);
        });
        return codefix2.createCodeFixAction(fixName, changes, [ts2.Diagnostics.Add_definite_assignment_assertion_to_property_0, propertyDeclaration.getText()], fixIdAddDefiniteAssignmentAssertions, ts2.Diagnostics.Add_definite_assignment_assertions_to_all_uninitialized_properties);
      }
      function addDefiniteAssignmentAssertion(changeTracker, propertyDeclarationSourceFile, propertyDeclaration) {
        var property = ts2.factory.updatePropertyDeclaration(propertyDeclaration, propertyDeclaration.decorators, propertyDeclaration.modifiers, propertyDeclaration.name, ts2.factory.createToken(53), propertyDeclaration.type, propertyDeclaration.initializer);
        changeTracker.replaceNode(propertyDeclarationSourceFile, propertyDeclaration, property);
      }
      function getActionForAddMissingUndefinedType(context, propertyDeclaration) {
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return addUndefinedType(t, context.sourceFile, propertyDeclaration);
        });
        return codefix2.createCodeFixAction(fixName, changes, [ts2.Diagnostics.Add_undefined_type_to_property_0, propertyDeclaration.name.getText()], fixIdAddUndefinedType, ts2.Diagnostics.Add_undefined_type_to_all_uninitialized_properties);
      }
      function addUndefinedType(changeTracker, propertyDeclarationSourceFile, propertyDeclaration) {
        var undefinedTypeNode = ts2.factory.createKeywordTypeNode(152);
        var type = propertyDeclaration.type;
        var types = ts2.isUnionTypeNode(type) ? type.types.concat(undefinedTypeNode) : [type, undefinedTypeNode];
        changeTracker.replaceNode(propertyDeclarationSourceFile, type, ts2.factory.createUnionTypeNode(types));
      }
      function getActionForAddMissingInitializer(context, propertyDeclaration) {
        var checker = context.program.getTypeChecker();
        var initializer = getInitializer(checker, propertyDeclaration);
        if (!initializer)
          return void 0;
        var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
          return addInitializer(t, context.sourceFile, propertyDeclaration, initializer);
        });
        return codefix2.createCodeFixAction(fixName, changes, [ts2.Diagnostics.Add_initializer_to_property_0, propertyDeclaration.name.getText()], fixIdAddInitializer, ts2.Diagnostics.Add_initializers_to_all_uninitialized_properties);
      }
      function addInitializer(changeTracker, propertyDeclarationSourceFile, propertyDeclaration, initializer) {
        var property = ts2.factory.updatePropertyDeclaration(propertyDeclaration, propertyDeclaration.decorators, propertyDeclaration.modifiers, propertyDeclaration.name, propertyDeclaration.questionToken, propertyDeclaration.type, initializer);
        changeTracker.replaceNode(propertyDeclarationSourceFile, propertyDeclaration, property);
      }
      function getInitializer(checker, propertyDeclaration) {
        return getDefaultValueFromType(checker, checker.getTypeFromTypeNode(propertyDeclaration.type));
      }
      function getDefaultValueFromType(checker, type) {
        if (type.flags & 512) {
          return type === checker.getFalseType() || type === checker.getFalseType(true) ? ts2.factory.createFalse() : ts2.factory.createTrue();
        } else if (type.isStringLiteral()) {
          return ts2.factory.createStringLiteral(type.value);
        } else if (type.isNumberLiteral()) {
          return ts2.factory.createNumericLiteral(type.value);
        } else if (type.flags & 2048) {
          return ts2.factory.createBigIntLiteral(type.value);
        } else if (type.isUnion()) {
          return ts2.firstDefined(type.types, function(t) {
            return getDefaultValueFromType(checker, t);
          });
        } else if (type.isClass()) {
          var classDeclaration = ts2.getClassLikeDeclarationOfSymbol(type.symbol);
          if (!classDeclaration || ts2.hasSyntacticModifier(classDeclaration, 128))
            return void 0;
          var constructorDeclaration = ts2.getFirstConstructorWithBody(classDeclaration);
          if (constructorDeclaration && constructorDeclaration.parameters.length)
            return void 0;
          return ts2.factory.createNewExpression(ts2.factory.createIdentifier(type.symbol.name), void 0, void 0);
        } else if (checker.isArrayLikeType(type)) {
          return ts2.factory.createArrayLiteralExpression();
        }
        return void 0;
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "requireInTs";
      var errorCodes = [ts2.Diagnostics.require_call_may_be_converted_to_an_import.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var info = getInfo(context.sourceFile, context.program, context.span.start);
          if (!info) {
            return void 0;
          }
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, context.sourceFile, info);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_require_to_import, fixId, ts2.Diagnostics.Convert_all_require_to_import)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, context.program, diag.start);
            if (info) {
              doChange(changes, context.sourceFile, info);
            }
          });
        }
      });
      function doChange(changes, sourceFile, info) {
        var allowSyntheticDefaults = info.allowSyntheticDefaults, defaultImportName = info.defaultImportName, namedImports = info.namedImports, statement = info.statement, required = info.required;
        changes.replaceNode(sourceFile, statement, defaultImportName && !allowSyntheticDefaults ? ts2.factory.createImportEqualsDeclaration(void 0, void 0, false, defaultImportName, ts2.factory.createExternalModuleReference(required)) : ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, defaultImportName, namedImports), required, void 0));
      }
      function getInfo(sourceFile, program, pos) {
        var parent = ts2.getTokenAtPosition(sourceFile, pos).parent;
        if (!ts2.isRequireCall(parent, true)) {
          throw ts2.Debug.failBadSyntaxKind(parent);
        }
        var decl = ts2.cast(parent.parent, ts2.isVariableDeclaration);
        var defaultImportName = ts2.tryCast(decl.name, ts2.isIdentifier);
        var namedImports = ts2.isObjectBindingPattern(decl.name) ? tryCreateNamedImportsFromObjectBindingPattern(decl.name) : void 0;
        if (defaultImportName || namedImports) {
          return {
            allowSyntheticDefaults: ts2.getAllowSyntheticDefaultImports(program.getCompilerOptions()),
            defaultImportName,
            namedImports,
            statement: ts2.cast(decl.parent.parent, ts2.isVariableStatement),
            required: ts2.first(parent.arguments)
          };
        }
      }
      function tryCreateNamedImportsFromObjectBindingPattern(node) {
        var importSpecifiers = [];
        for (var _i = 0, _a = node.elements; _i < _a.length; _i++) {
          var element = _a[_i];
          if (!ts2.isIdentifier(element.name) || element.initializer) {
            return void 0;
          }
          importSpecifiers.push(ts2.factory.createImportSpecifier(false, ts2.tryCast(element.propertyName, ts2.isIdentifier), element.name));
        }
        if (importSpecifiers.length) {
          return ts2.factory.createNamedImports(importSpecifiers);
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "useDefaultImport";
      var errorCodes = [ts2.Diagnostics.Import_may_be_converted_to_a_default_import.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, start = context.span.start;
          var info = getInfo(sourceFile, start);
          if (!info)
            return void 0;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, info, context.preferences);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_to_default_import, fixId, ts2.Diagnostics.Convert_all_to_default_imports)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, diag.start);
            if (info)
              doChange(changes, diag.file, info, context.preferences);
          });
        }
      });
      function getInfo(sourceFile, pos) {
        var name = ts2.getTokenAtPosition(sourceFile, pos);
        if (!ts2.isIdentifier(name))
          return void 0;
        var parent = name.parent;
        if (ts2.isImportEqualsDeclaration(parent) && ts2.isExternalModuleReference(parent.moduleReference)) {
          return { importNode: parent, name, moduleSpecifier: parent.moduleReference.expression };
        } else if (ts2.isNamespaceImport(parent)) {
          var importNode = parent.parent.parent;
          return { importNode, name, moduleSpecifier: importNode.moduleSpecifier };
        }
      }
      function doChange(changes, sourceFile, info, preferences) {
        changes.replaceNode(sourceFile, info.importNode, ts2.makeImport(info.name, void 0, info.moduleSpecifier, ts2.getQuotePreference(sourceFile, preferences)));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "useBigintLiteral";
      var errorCodes = [
        ts2.Diagnostics.Numeric_literals_with_absolute_values_equal_to_2_53_or_greater_are_too_large_to_be_represented_accurately_as_integers.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span);
          });
          if (changes.length > 0) {
            return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_to_a_bigint_numeric_literal, fixId, ts2.Diagnostics.Convert_all_to_bigint_numeric_literals)];
          }
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag);
          });
        }
      });
      function makeChange(changeTracker, sourceFile, span) {
        var numericLiteral = ts2.tryCast(ts2.getTokenAtPosition(sourceFile, span.start), ts2.isNumericLiteral);
        if (!numericLiteral) {
          return;
        }
        var newText = numericLiteral.getText(sourceFile) + "n";
        changeTracker.replaceNode(sourceFile, numericLiteral, ts2.factory.createBigIntLiteral(newText));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixIdAddMissingTypeof = "fixAddModuleReferTypeMissingTypeof";
      var fixId = fixIdAddMissingTypeof;
      var errorCodes = [ts2.Diagnostics.Module_0_does_not_refer_to_a_type_but_is_used_as_a_type_here_Did_you_mean_typeof_import_0.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var importType = getImportTypeNode(sourceFile, span.start);
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, importType);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Add_missing_typeof, fixId, ts2.Diagnostics.Add_missing_typeof)];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return doChange(changes, context.sourceFile, getImportTypeNode(diag.file, diag.start));
          });
        }
      });
      function getImportTypeNode(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        ts2.Debug.assert(token.kind === 100, "This token should be an ImportKeyword");
        ts2.Debug.assert(token.parent.kind === 199, "Token parent should be an ImportType");
        return token.parent;
      }
      function doChange(changes, sourceFile, importType) {
        var newTypeNode = ts2.factory.updateImportTypeNode(importType, importType.argument, importType.qualifier, importType.typeArguments, true);
        changes.replaceNode(sourceFile, importType, newTypeNode);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixID = "wrapJsxInFragment";
      var errorCodes = [ts2.Diagnostics.JSX_expressions_must_have_one_parent_element.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var node = findNodeToFix(sourceFile, span.start);
          if (!node)
            return void 0;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, node);
          });
          return [codefix2.createCodeFixAction(fixID, changes, ts2.Diagnostics.Wrap_in_JSX_fragment, fixID, ts2.Diagnostics.Wrap_all_unparented_JSX_in_JSX_fragment)];
        },
        fixIds: [fixID],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var node = findNodeToFix(context.sourceFile, diag.start);
            if (!node)
              return void 0;
            doChange(changes, context.sourceFile, node);
          });
        }
      });
      function findNodeToFix(sourceFile, pos) {
        var lessThanToken = ts2.getTokenAtPosition(sourceFile, pos);
        var firstJsxElementOrOpenElement = lessThanToken.parent;
        var binaryExpr = firstJsxElementOrOpenElement.parent;
        if (!ts2.isBinaryExpression(binaryExpr)) {
          binaryExpr = binaryExpr.parent;
          if (!ts2.isBinaryExpression(binaryExpr))
            return void 0;
        }
        if (!ts2.nodeIsMissing(binaryExpr.operatorToken))
          return void 0;
        return binaryExpr;
      }
      function doChange(changeTracker, sf, node) {
        var jsx = flattenInvalidBinaryExpr(node);
        if (jsx)
          changeTracker.replaceNode(sf, node, ts2.factory.createJsxFragment(ts2.factory.createJsxOpeningFragment(), jsx, ts2.factory.createJsxJsxClosingFragment()));
      }
      function flattenInvalidBinaryExpr(node) {
        var children = [];
        var current = node;
        while (true) {
          if (ts2.isBinaryExpression(current) && ts2.nodeIsMissing(current.operatorToken) && current.operatorToken.kind === 27) {
            children.push(current.left);
            if (ts2.isJsxChild(current.right)) {
              children.push(current.right);
              return children;
            } else if (ts2.isBinaryExpression(current.right)) {
              current = current.right;
              continue;
            } else
              return void 0;
          } else
            return void 0;
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixIdAddMissingTypeof = "fixConvertToMappedObjectType";
      var fixId = fixIdAddMissingTypeof;
      var errorCodes = [ts2.Diagnostics.An_index_signature_parameter_type_cannot_be_a_literal_type_or_generic_type_Consider_using_a_mapped_object_type_instead.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span;
          var info = getInfo(sourceFile, span.start);
          if (!info)
            return void 0;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, info);
          });
          var name = ts2.idText(info.container.name);
          return [codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Convert_0_to_mapped_object_type, name], fixId, [ts2.Diagnostics.Convert_0_to_mapped_object_type, name])];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, diag.start);
            if (info)
              doChange(changes, diag.file, info);
          });
        }
      });
      function getInfo(sourceFile, pos) {
        var token = ts2.getTokenAtPosition(sourceFile, pos);
        var indexSignature = ts2.cast(token.parent.parent, ts2.isIndexSignatureDeclaration);
        if (ts2.isClassDeclaration(indexSignature.parent))
          return void 0;
        var container = ts2.isInterfaceDeclaration(indexSignature.parent) ? indexSignature.parent : ts2.cast(indexSignature.parent.parent, ts2.isTypeAliasDeclaration);
        return { indexSignature, container };
      }
      function createTypeAliasFromInterface(declaration, type) {
        return ts2.factory.createTypeAliasDeclaration(declaration.decorators, declaration.modifiers, declaration.name, declaration.typeParameters, type);
      }
      function doChange(changes, sourceFile, _a) {
        var indexSignature = _a.indexSignature, container = _a.container;
        var members = ts2.isInterfaceDeclaration(container) ? container.members : container.type.members;
        var otherMembers = members.filter(function(member) {
          return !ts2.isIndexSignatureDeclaration(member);
        });
        var parameter = ts2.first(indexSignature.parameters);
        var mappedTypeParameter = ts2.factory.createTypeParameterDeclaration(ts2.cast(parameter.name, ts2.isIdentifier), parameter.type);
        var mappedIntersectionType = ts2.factory.createMappedTypeNode(ts2.hasEffectiveReadonlyModifier(indexSignature) ? ts2.factory.createModifier(144) : void 0, mappedTypeParameter, void 0, indexSignature.questionToken, indexSignature.type, void 0);
        var intersectionType = ts2.factory.createIntersectionTypeNode(__spreadArray(__spreadArray(__spreadArray([], ts2.getAllSuperTypeNodes(container), true), [
          mappedIntersectionType
        ], false), otherMembers.length ? [ts2.factory.createTypeLiteralNode(otherMembers)] : ts2.emptyArray, true));
        changes.replaceNode(sourceFile, container, createTypeAliasFromInterface(container, intersectionType));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "removeAccidentalCallParentheses";
      var errorCodes = [
        ts2.Diagnostics.This_expression_is_not_callable_because_it_is_a_get_accessor_Did_you_mean_to_use_it_without.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var callExpression = ts2.findAncestor(ts2.getTokenAtPosition(context.sourceFile, context.span.start), ts2.isCallExpression);
          if (!callExpression) {
            return void 0;
          }
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            t.deleteRange(context.sourceFile, { pos: callExpression.expression.end, end: callExpression.end });
          });
          return [codefix2.createCodeFixActionWithoutFixAll(fixId, changes, ts2.Diagnostics.Remove_parentheses)];
        },
        fixIds: [fixId]
      });
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "removeUnnecessaryAwait";
      var errorCodes = [
        ts2.Diagnostics.await_has_no_effect_on_the_type_of_this_expression.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span);
          });
          if (changes.length > 0) {
            return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Remove_unnecessary_await, fixId, ts2.Diagnostics.Remove_all_unnecessary_uses_of_await)];
          }
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag);
          });
        }
      });
      function makeChange(changeTracker, sourceFile, span) {
        var awaitKeyword = ts2.tryCast(ts2.getTokenAtPosition(sourceFile, span.start), function(node) {
          return node.kind === 132;
        });
        var awaitExpression = awaitKeyword && ts2.tryCast(awaitKeyword.parent, ts2.isAwaitExpression);
        if (!awaitExpression) {
          return;
        }
        var expressionToReplace = awaitExpression;
        var hasSurroundingParens = ts2.isParenthesizedExpression(awaitExpression.parent);
        if (hasSurroundingParens) {
          var leftMostExpression = ts2.getLeftmostExpression(awaitExpression.expression, false);
          if (ts2.isIdentifier(leftMostExpression)) {
            var precedingToken = ts2.findPrecedingToken(awaitExpression.parent.pos, sourceFile);
            if (precedingToken && precedingToken.kind !== 103) {
              expressionToReplace = awaitExpression.parent;
            }
          }
        }
        changeTracker.replaceNode(sourceFile, expressionToReplace, awaitExpression.expression);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var errorCodes = [ts2.Diagnostics.A_type_only_import_can_specify_a_default_import_or_named_bindings_but_not_both.code];
      var fixId = "splitTypeOnlyImport";
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixId],
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return splitTypeOnlyImport(t, getImportDeclaration(context.sourceFile, context.span), context);
          });
          if (changes.length) {
            return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Split_into_two_separate_import_declarations, fixId, ts2.Diagnostics.Split_all_invalid_type_only_imports)];
          }
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, error) {
            splitTypeOnlyImport(changes, getImportDeclaration(context.sourceFile, error), context);
          });
        }
      });
      function getImportDeclaration(sourceFile, span) {
        return ts2.findAncestor(ts2.getTokenAtPosition(sourceFile, span.start), ts2.isImportDeclaration);
      }
      function splitTypeOnlyImport(changes, importDeclaration, context) {
        if (!importDeclaration) {
          return;
        }
        var importClause = ts2.Debug.checkDefined(importDeclaration.importClause);
        changes.replaceNode(context.sourceFile, importDeclaration, ts2.factory.updateImportDeclaration(importDeclaration, importDeclaration.decorators, importDeclaration.modifiers, ts2.factory.updateImportClause(importClause, importClause.isTypeOnly, importClause.name, void 0), importDeclaration.moduleSpecifier, importDeclaration.assertClause));
        changes.insertNodeAfter(context.sourceFile, importDeclaration, ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.updateImportClause(importClause, importClause.isTypeOnly, void 0, importClause.namedBindings), importDeclaration.moduleSpecifier, importDeclaration.assertClause));
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixConvertConstToLet";
      var errorCodes = [ts2.Diagnostics.Cannot_assign_to_0_because_it_is_a_constant.code];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile, span = context.span, program = context.program;
          var range = getConstTokenRange(sourceFile, span.start, program);
          if (range === void 0)
            return;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, range);
          });
          return [codefix2.createCodeFixAction(fixId, changes, ts2.Diagnostics.Convert_const_to_let, fixId, ts2.Diagnostics.Convert_const_to_let)];
        },
        fixIds: [fixId]
      });
      function getConstTokenRange(sourceFile, pos, program) {
        var _a;
        var checker = program.getTypeChecker();
        var symbol = checker.getSymbolAtLocation(ts2.getTokenAtPosition(sourceFile, pos));
        var declaration = ts2.tryCast((_a = symbol === null || symbol === void 0 ? void 0 : symbol.valueDeclaration) === null || _a === void 0 ? void 0 : _a.parent, ts2.isVariableDeclarationList);
        if (declaration === void 0)
          return;
        var constToken = ts2.findChildOfKind(declaration, 85, sourceFile);
        if (constToken === void 0)
          return;
        return ts2.createRange(constToken.pos, constToken.end);
      }
      function doChange(changes, sourceFile, range) {
        changes.replaceRangeWithText(sourceFile, range, "let");
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixId = "fixExpectedComma";
      var expectedErrorCode = ts2.Diagnostics._0_expected.code;
      var errorCodes = [expectedErrorCode];
      codefix2.registerCodeFix({
        errorCodes,
        getCodeActions: function(context) {
          var sourceFile = context.sourceFile;
          var info = getInfo(sourceFile, context.span.start, context.errorCode);
          if (!info)
            return void 0;
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(t, sourceFile, info);
          });
          return [codefix2.createCodeFixAction(fixId, changes, [ts2.Diagnostics.Change_0_to_1, ";", ","], fixId, [ts2.Diagnostics.Change_0_to_1, ";", ","])];
        },
        fixIds: [fixId],
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            var info = getInfo(diag.file, diag.start, diag.code);
            if (info)
              doChange(changes, context.sourceFile, info);
          });
        }
      });
      function getInfo(sourceFile, pos, _) {
        var node = ts2.getTokenAtPosition(sourceFile, pos);
        return node.kind === 26 && node.parent && (ts2.isObjectLiteralExpression(node.parent) || ts2.isArrayLiteralExpression(node.parent)) ? { node } : void 0;
      }
      function doChange(changes, sourceFile, _a) {
        var node = _a.node;
        var newNode = ts2.factory.createToken(27);
        changes.replaceNode(sourceFile, node, newNode);
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var codefix;
    (function(codefix2) {
      var fixName = "addVoidToPromise";
      var fixId = "addVoidToPromise";
      var errorCodes = [
        ts2.Diagnostics.Expected_0_arguments_but_got_1_Did_you_forget_to_include_void_in_your_type_argument_to_Promise.code
      ];
      codefix2.registerCodeFix({
        errorCodes,
        fixIds: [fixId],
        getCodeActions: function(context) {
          var changes = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return makeChange(t, context.sourceFile, context.span, context.program);
          });
          if (changes.length > 0) {
            return [codefix2.createCodeFixAction(fixName, changes, ts2.Diagnostics.Add_void_to_Promise_resolved_without_a_value, fixId, ts2.Diagnostics.Add_void_to_all_Promises_resolved_without_a_value)];
          }
        },
        getAllCodeActions: function(context) {
          return codefix2.codeFixAll(context, errorCodes, function(changes, diag) {
            return makeChange(changes, diag.file, diag, context.program, new ts2.Set());
          });
        }
      });
      function makeChange(changes, sourceFile, span, program, seen) {
        var node = ts2.getTokenAtPosition(sourceFile, span.start);
        if (!ts2.isIdentifier(node) || !ts2.isCallExpression(node.parent) || node.parent.expression !== node || node.parent.arguments.length !== 0)
          return;
        var checker = program.getTypeChecker();
        var symbol = checker.getSymbolAtLocation(node);
        var decl = symbol === null || symbol === void 0 ? void 0 : symbol.valueDeclaration;
        if (!decl || !ts2.isParameter(decl) || !ts2.isNewExpression(decl.parent.parent))
          return;
        if (seen === null || seen === void 0 ? void 0 : seen.has(decl))
          return;
        seen === null || seen === void 0 ? void 0 : seen.add(decl);
        var typeArguments = getEffectiveTypeArguments(decl.parent.parent);
        if (ts2.some(typeArguments)) {
          var typeArgument = typeArguments[0];
          var needsParens = !ts2.isUnionTypeNode(typeArgument) && !ts2.isParenthesizedTypeNode(typeArgument) && ts2.isParenthesizedTypeNode(ts2.factory.createUnionTypeNode([typeArgument, ts2.factory.createKeywordTypeNode(114)]).types[0]);
          if (needsParens) {
            changes.insertText(sourceFile, typeArgument.pos, "(");
          }
          changes.insertText(sourceFile, typeArgument.end, needsParens ? ") | void" : " | void");
        } else {
          var signature = checker.getResolvedSignature(node.parent);
          var parameter = signature === null || signature === void 0 ? void 0 : signature.parameters[0];
          var parameterType = parameter && checker.getTypeOfSymbolAtLocation(parameter, decl.parent.parent);
          if (ts2.isInJSFile(decl)) {
            if (!parameterType || parameterType.flags & 3) {
              changes.insertText(sourceFile, decl.parent.parent.end, ")");
              changes.insertText(sourceFile, ts2.skipTrivia(sourceFile.text, decl.parent.parent.pos), "/** @type {Promise<void>} */(");
            }
          } else {
            if (!parameterType || parameterType.flags & 2) {
              changes.insertText(sourceFile, decl.parent.parent.expression.end, "<void>");
            }
          }
        }
      }
      function getEffectiveTypeArguments(node) {
        var _a;
        if (ts2.isInJSFile(node)) {
          if (ts2.isParenthesizedExpression(node.parent)) {
            var jsDocType = (_a = ts2.getJSDocTypeTag(node.parent)) === null || _a === void 0 ? void 0 : _a.typeExpression.type;
            if (jsDocType && ts2.isTypeReferenceNode(jsDocType) && ts2.isIdentifier(jsDocType.typeName) && ts2.idText(jsDocType.typeName) === "Promise") {
              return jsDocType.typeArguments;
            }
          }
        } else {
          return node.typeArguments;
        }
      }
    })(codefix = ts2.codefix || (ts2.codefix = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var refactorName = "Convert export";
      var defaultToNamedAction = {
        name: "Convert default export to named export",
        description: ts2.Diagnostics.Convert_default_export_to_named_export.message,
        kind: "refactor.rewrite.export.named"
      };
      var namedToDefaultAction = {
        name: "Convert named export to default export",
        description: ts2.Diagnostics.Convert_named_export_to_default_export.message,
        kind: "refactor.rewrite.export.default"
      };
      refactor2.registerRefactor(refactorName, {
        kinds: [
          defaultToNamedAction.kind,
          namedToDefaultAction.kind
        ],
        getAvailableActions: function(context) {
          var info = getInfo(context, context.triggerReason === "invoked");
          if (!info)
            return ts2.emptyArray;
          if (!refactor2.isRefactorErrorInfo(info)) {
            var action = info.wasDefault ? defaultToNamedAction : namedToDefaultAction;
            return [{ name: refactorName, description: action.description, actions: [action] }];
          }
          if (context.preferences.provideRefactorNotApplicableReason) {
            return [
              { name: refactorName, description: ts2.Diagnostics.Convert_default_export_to_named_export.message, actions: [
                __assign(__assign({}, defaultToNamedAction), { notApplicableReason: info.error }),
                __assign(__assign({}, namedToDefaultAction), { notApplicableReason: info.error })
              ] }
            ];
          }
          return ts2.emptyArray;
        },
        getEditsForAction: function(context, actionName) {
          ts2.Debug.assert(actionName === defaultToNamedAction.name || actionName === namedToDefaultAction.name, "Unexpected action name");
          var info = getInfo(context);
          ts2.Debug.assert(info && !refactor2.isRefactorErrorInfo(info), "Expected applicable refactor info");
          var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(context.file, context.program, info, t, context.cancellationToken);
          });
          return { edits, renameFilename: void 0, renameLocation: void 0 };
        }
      });
      ;
      function getInfo(context, considerPartialSpans) {
        if (considerPartialSpans === void 0) {
          considerPartialSpans = true;
        }
        var file = context.file, program = context.program;
        var span = ts2.getRefactorContextSpan(context);
        var token = ts2.getTokenAtPosition(file, span.start);
        var exportNode = !!(token.parent && ts2.getSyntacticModifierFlags(token.parent) & 1) && considerPartialSpans ? token.parent : ts2.getParentNodeInSpan(token, file, span);
        if (!exportNode || !ts2.isSourceFile(exportNode.parent) && !(ts2.isModuleBlock(exportNode.parent) && ts2.isAmbientModule(exportNode.parent.parent))) {
          return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_export_statement) };
        }
        var exportingModuleSymbol = ts2.isSourceFile(exportNode.parent) ? exportNode.parent.symbol : exportNode.parent.parent.symbol;
        var flags = ts2.getSyntacticModifierFlags(exportNode) || (ts2.isExportAssignment(exportNode) && !exportNode.isExportEquals ? 513 : 0);
        var wasDefault = !!(flags & 512);
        if (!(flags & 1) || !wasDefault && exportingModuleSymbol.exports.has("default")) {
          return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.This_file_already_has_a_default_export) };
        }
        var checker = program.getTypeChecker();
        var noSymbolError = function(id) {
          return ts2.isIdentifier(id) && checker.getSymbolAtLocation(id) ? void 0 : { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Can_only_convert_named_export) };
        };
        switch (exportNode.kind) {
          case 255:
          case 256:
          case 257:
          case 259:
          case 258:
          case 260: {
            var node = exportNode;
            if (!node.name)
              return void 0;
            return noSymbolError(node.name) || { exportNode: node, exportName: node.name, wasDefault, exportingModuleSymbol };
          }
          case 236: {
            var vs = exportNode;
            if (!(vs.declarationList.flags & 2) || vs.declarationList.declarations.length !== 1) {
              return void 0;
            }
            var decl = ts2.first(vs.declarationList.declarations);
            if (!decl.initializer)
              return void 0;
            ts2.Debug.assert(!wasDefault, "Can't have a default flag here");
            return noSymbolError(decl.name) || { exportNode: vs, exportName: decl.name, wasDefault, exportingModuleSymbol };
          }
          case 270: {
            var node = exportNode;
            if (node.isExportEquals)
              return void 0;
            return noSymbolError(node.expression) || { exportNode: node, exportName: node.expression, wasDefault, exportingModuleSymbol };
          }
          default:
            return void 0;
        }
      }
      function doChange(exportingSourceFile, program, info, changes, cancellationToken) {
        changeExport(exportingSourceFile, info, changes, program.getTypeChecker());
        changeImports(program, info, changes, cancellationToken);
      }
      function changeExport(exportingSourceFile, _a, changes, checker) {
        var wasDefault = _a.wasDefault, exportNode = _a.exportNode, exportName = _a.exportName;
        if (wasDefault) {
          if (ts2.isExportAssignment(exportNode) && !exportNode.isExportEquals) {
            var exp = exportNode.expression;
            var spec = makeExportSpecifier(exp.text, exp.text);
            changes.replaceNode(exportingSourceFile, exportNode, ts2.factory.createExportDeclaration(void 0, void 0, false, ts2.factory.createNamedExports([spec])));
          } else {
            changes.delete(exportingSourceFile, ts2.Debug.checkDefined(ts2.findModifier(exportNode, 88), "Should find a default keyword in modifier list"));
          }
        } else {
          var exportKeyword = ts2.Debug.checkDefined(ts2.findModifier(exportNode, 93), "Should find an export keyword in modifier list");
          switch (exportNode.kind) {
            case 255:
            case 256:
            case 257:
              changes.insertNodeAfter(exportingSourceFile, exportKeyword, ts2.factory.createToken(88));
              break;
            case 236:
              var decl = ts2.first(exportNode.declarationList.declarations);
              if (!ts2.FindAllReferences.Core.isSymbolReferencedInFile(exportName, checker, exportingSourceFile) && !decl.type) {
                changes.replaceNode(exportingSourceFile, exportNode, ts2.factory.createExportDefault(ts2.Debug.checkDefined(decl.initializer, "Initializer was previously known to be present")));
                break;
              }
            case 259:
            case 258:
            case 260:
              changes.deleteModifier(exportingSourceFile, exportKeyword);
              changes.insertNodeAfter(exportingSourceFile, exportNode, ts2.factory.createExportDefault(ts2.factory.createIdentifier(exportName.text)));
              break;
            default:
              ts2.Debug.fail("Unexpected exportNode kind ".concat(exportNode.kind));
          }
        }
      }
      function changeImports(program, _a, changes, cancellationToken) {
        var wasDefault = _a.wasDefault, exportName = _a.exportName, exportingModuleSymbol = _a.exportingModuleSymbol;
        var checker = program.getTypeChecker();
        var exportSymbol = ts2.Debug.checkDefined(checker.getSymbolAtLocation(exportName), "Export name should resolve to a symbol");
        ts2.FindAllReferences.Core.eachExportReference(program.getSourceFiles(), checker, cancellationToken, exportSymbol, exportingModuleSymbol, exportName.text, wasDefault, function(ref) {
          var importingSourceFile = ref.getSourceFile();
          if (wasDefault) {
            changeDefaultToNamedImport(importingSourceFile, ref, changes, exportName.text);
          } else {
            changeNamedToDefaultImport(importingSourceFile, ref, changes);
          }
        });
      }
      function changeDefaultToNamedImport(importingSourceFile, ref, changes, exportName) {
        var parent = ref.parent;
        switch (parent.kind) {
          case 205:
            changes.replaceNode(importingSourceFile, ref, ts2.factory.createIdentifier(exportName));
            break;
          case 269:
          case 274: {
            var spec = parent;
            changes.replaceNode(importingSourceFile, spec, makeImportSpecifier(exportName, spec.name.text));
            break;
          }
          case 266: {
            var clause = parent;
            ts2.Debug.assert(clause.name === ref, "Import clause name should match provided ref");
            var spec = makeImportSpecifier(exportName, ref.text);
            var namedBindings = clause.namedBindings;
            if (!namedBindings) {
              changes.replaceNode(importingSourceFile, ref, ts2.factory.createNamedImports([spec]));
            } else if (namedBindings.kind === 267) {
              changes.deleteRange(importingSourceFile, { pos: ref.getStart(importingSourceFile), end: namedBindings.getStart(importingSourceFile) });
              var quotePreference = ts2.isStringLiteral(clause.parent.moduleSpecifier) ? ts2.quotePreferenceFromString(clause.parent.moduleSpecifier, importingSourceFile) : 1;
              var newImport = ts2.makeImport(void 0, [makeImportSpecifier(exportName, ref.text)], clause.parent.moduleSpecifier, quotePreference);
              changes.insertNodeAfter(importingSourceFile, clause.parent, newImport);
            } else {
              changes.delete(importingSourceFile, ref);
              changes.insertNodeAtEndOfList(importingSourceFile, namedBindings.elements, spec);
            }
            break;
          }
          default:
            ts2.Debug.failBadSyntaxKind(parent);
        }
      }
      function changeNamedToDefaultImport(importingSourceFile, ref, changes) {
        var parent = ref.parent;
        switch (parent.kind) {
          case 205:
            changes.replaceNode(importingSourceFile, ref, ts2.factory.createIdentifier("default"));
            break;
          case 269: {
            var defaultImport = ts2.factory.createIdentifier(parent.name.text);
            if (parent.parent.elements.length === 1) {
              changes.replaceNode(importingSourceFile, parent.parent, defaultImport);
            } else {
              changes.delete(importingSourceFile, parent);
              changes.insertNodeBefore(importingSourceFile, parent.parent, defaultImport);
            }
            break;
          }
          case 274: {
            changes.replaceNode(importingSourceFile, parent, makeExportSpecifier("default", parent.name.text));
            break;
          }
          default:
            ts2.Debug.assertNever(parent, "Unexpected parent kind ".concat(parent.kind));
        }
      }
      function makeImportSpecifier(propertyName, name) {
        return ts2.factory.createImportSpecifier(false, propertyName === name ? void 0 : ts2.factory.createIdentifier(propertyName), ts2.factory.createIdentifier(name));
      }
      function makeExportSpecifier(propertyName, name) {
        return ts2.factory.createExportSpecifier(false, propertyName === name ? void 0 : ts2.factory.createIdentifier(propertyName), ts2.factory.createIdentifier(name));
      }
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var refactorName = "Convert import";
      var namespaceToNamedAction = {
        name: "Convert namespace import to named imports",
        description: ts2.Diagnostics.Convert_namespace_import_to_named_imports.message,
        kind: "refactor.rewrite.import.named"
      };
      var namedToNamespaceAction = {
        name: "Convert named imports to namespace import",
        description: ts2.Diagnostics.Convert_named_imports_to_namespace_import.message,
        kind: "refactor.rewrite.import.namespace"
      };
      refactor2.registerRefactor(refactorName, {
        kinds: [
          namespaceToNamedAction.kind,
          namedToNamespaceAction.kind
        ],
        getAvailableActions: function(context) {
          var info = getImportToConvert(context, context.triggerReason === "invoked");
          if (!info)
            return ts2.emptyArray;
          if (!refactor2.isRefactorErrorInfo(info)) {
            var namespaceImport = info.kind === 267;
            var action = namespaceImport ? namespaceToNamedAction : namedToNamespaceAction;
            return [{ name: refactorName, description: action.description, actions: [action] }];
          }
          if (context.preferences.provideRefactorNotApplicableReason) {
            return [
              {
                name: refactorName,
                description: namespaceToNamedAction.description,
                actions: [__assign(__assign({}, namespaceToNamedAction), { notApplicableReason: info.error })]
              },
              {
                name: refactorName,
                description: namedToNamespaceAction.description,
                actions: [__assign(__assign({}, namedToNamespaceAction), { notApplicableReason: info.error })]
              }
            ];
          }
          return ts2.emptyArray;
        },
        getEditsForAction: function(context, actionName) {
          ts2.Debug.assert(actionName === namespaceToNamedAction.name || actionName === namedToNamespaceAction.name, "Unexpected action name");
          var info = getImportToConvert(context);
          ts2.Debug.assert(info && !refactor2.isRefactorErrorInfo(info), "Expected applicable refactor info");
          var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(context.file, context.program, t, info);
          });
          return { edits, renameFilename: void 0, renameLocation: void 0 };
        }
      });
      function getImportToConvert(context, considerPartialSpans) {
        if (considerPartialSpans === void 0) {
          considerPartialSpans = true;
        }
        var file = context.file;
        var span = ts2.getRefactorContextSpan(context);
        var token = ts2.getTokenAtPosition(file, span.start);
        var importDecl = considerPartialSpans ? ts2.findAncestor(token, ts2.isImportDeclaration) : ts2.getParentNodeInSpan(token, file, span);
        if (!importDecl || !ts2.isImportDeclaration(importDecl))
          return { error: "Selection is not an import declaration." };
        var end = span.start + span.length;
        var nextToken = ts2.findNextToken(importDecl, importDecl.parent, file);
        if (nextToken && end > nextToken.getStart())
          return void 0;
        var importClause = importDecl.importClause;
        if (!importClause) {
          return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_import_clause) };
        }
        if (!importClause.namedBindings) {
          return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_namespace_import_or_named_imports) };
        }
        return importClause.namedBindings;
      }
      function doChange(sourceFile, program, changes, toConvert) {
        var checker = program.getTypeChecker();
        if (toConvert.kind === 267) {
          doChangeNamespaceToNamed(sourceFile, checker, changes, toConvert, ts2.getAllowSyntheticDefaultImports(program.getCompilerOptions()));
        } else {
          doChangeNamedToNamespace(sourceFile, checker, changes, toConvert);
        }
      }
      function doChangeNamespaceToNamed(sourceFile, checker, changes, toConvert, allowSyntheticDefaultImports) {
        var usedAsNamespaceOrDefault = false;
        var nodesToReplace = [];
        var conflictingNames = new ts2.Map();
        ts2.FindAllReferences.Core.eachSymbolReferenceInFile(toConvert.name, checker, sourceFile, function(id) {
          if (!ts2.isPropertyAccessOrQualifiedName(id.parent)) {
            usedAsNamespaceOrDefault = true;
          } else {
            var exportName2 = getRightOfPropertyAccessOrQualifiedName(id.parent).text;
            if (checker.resolveName(exportName2, id, 67108863, true)) {
              conflictingNames.set(exportName2, true);
            }
            ts2.Debug.assert(getLeftOfPropertyAccessOrQualifiedName(id.parent) === id, "Parent expression should match id");
            nodesToReplace.push(id.parent);
          }
        });
        var exportNameToImportName = new ts2.Map();
        for (var _i = 0, nodesToReplace_1 = nodesToReplace; _i < nodesToReplace_1.length; _i++) {
          var propertyAccessOrQualifiedName = nodesToReplace_1[_i];
          var exportName = getRightOfPropertyAccessOrQualifiedName(propertyAccessOrQualifiedName).text;
          var importName = exportNameToImportName.get(exportName);
          if (importName === void 0) {
            exportNameToImportName.set(exportName, importName = conflictingNames.has(exportName) ? ts2.getUniqueName(exportName, sourceFile) : exportName);
          }
          changes.replaceNode(sourceFile, propertyAccessOrQualifiedName, ts2.factory.createIdentifier(importName));
        }
        var importSpecifiers = [];
        exportNameToImportName.forEach(function(name, propertyName) {
          importSpecifiers.push(ts2.factory.createImportSpecifier(false, name === propertyName ? void 0 : ts2.factory.createIdentifier(propertyName), ts2.factory.createIdentifier(name)));
        });
        var importDecl = toConvert.parent.parent;
        if (usedAsNamespaceOrDefault && !allowSyntheticDefaultImports) {
          changes.insertNodeAfter(sourceFile, importDecl, updateImport(importDecl, void 0, importSpecifiers));
        } else {
          changes.replaceNode(sourceFile, importDecl, updateImport(importDecl, usedAsNamespaceOrDefault ? ts2.factory.createIdentifier(toConvert.name.text) : void 0, importSpecifiers));
        }
      }
      function getRightOfPropertyAccessOrQualifiedName(propertyAccessOrQualifiedName) {
        return ts2.isPropertyAccessExpression(propertyAccessOrQualifiedName) ? propertyAccessOrQualifiedName.name : propertyAccessOrQualifiedName.right;
      }
      function getLeftOfPropertyAccessOrQualifiedName(propertyAccessOrQualifiedName) {
        return ts2.isPropertyAccessExpression(propertyAccessOrQualifiedName) ? propertyAccessOrQualifiedName.expression : propertyAccessOrQualifiedName.left;
      }
      function doChangeNamedToNamespace(sourceFile, checker, changes, toConvert) {
        var importDecl = toConvert.parent.parent;
        var moduleSpecifier = importDecl.moduleSpecifier;
        var toConvertSymbols = new ts2.Set();
        toConvert.elements.forEach(function(namedImport) {
          var symbol = checker.getSymbolAtLocation(namedImport.name);
          if (symbol) {
            toConvertSymbols.add(symbol);
          }
        });
        var preferredName = moduleSpecifier && ts2.isStringLiteral(moduleSpecifier) ? ts2.codefix.moduleSpecifierToValidIdentifier(moduleSpecifier.text, 99) : "module";
        function hasNamespaceNameConflict(namedImport) {
          return !!ts2.FindAllReferences.Core.eachSymbolReferenceInFile(namedImport.name, checker, sourceFile, function(id) {
            var symbol = checker.resolveName(preferredName, id, 67108863, true);
            if (symbol) {
              if (toConvertSymbols.has(symbol)) {
                return ts2.isExportSpecifier(id.parent);
              }
              return true;
            }
            return false;
          });
        }
        var namespaceNameConflicts = toConvert.elements.some(hasNamespaceNameConflict);
        var namespaceImportName = namespaceNameConflicts ? ts2.getUniqueName(preferredName, sourceFile) : preferredName;
        var neededNamedImports = new ts2.Set();
        var _loop_17 = function(element2) {
          var propertyName = (element2.propertyName || element2.name).text;
          ts2.FindAllReferences.Core.eachSymbolReferenceInFile(element2.name, checker, sourceFile, function(id) {
            var access = ts2.factory.createPropertyAccessExpression(ts2.factory.createIdentifier(namespaceImportName), propertyName);
            if (ts2.isShorthandPropertyAssignment(id.parent)) {
              changes.replaceNode(sourceFile, id.parent, ts2.factory.createPropertyAssignment(id.text, access));
            } else if (ts2.isExportSpecifier(id.parent)) {
              neededNamedImports.add(element2);
            } else {
              changes.replaceNode(sourceFile, id, access);
            }
          });
        };
        for (var _i = 0, _a = toConvert.elements; _i < _a.length; _i++) {
          var element = _a[_i];
          _loop_17(element);
        }
        changes.replaceNode(sourceFile, toConvert, ts2.factory.createNamespaceImport(ts2.factory.createIdentifier(namespaceImportName)));
        if (neededNamedImports.size) {
          var newNamedImports = ts2.arrayFrom(neededNamedImports.values()).map(function(element2) {
            return ts2.factory.createImportSpecifier(element2.isTypeOnly, element2.propertyName && ts2.factory.createIdentifier(element2.propertyName.text), ts2.factory.createIdentifier(element2.name.text));
          });
          changes.insertNodeAfter(sourceFile, toConvert.parent.parent, updateImport(importDecl, void 0, newNamedImports));
        }
      }
      function updateImport(old, defaultImportName, elements) {
        return ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, defaultImportName, elements && elements.length ? ts2.factory.createNamedImports(elements) : void 0), old.moduleSpecifier, void 0);
      }
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var convertToOptionalChainExpression;
      (function(convertToOptionalChainExpression2) {
        var refactorName = "Convert to optional chain expression";
        var convertToOptionalChainExpressionMessage = ts2.getLocaleSpecificMessage(ts2.Diagnostics.Convert_to_optional_chain_expression);
        var toOptionalChainAction = {
          name: refactorName,
          description: convertToOptionalChainExpressionMessage,
          kind: "refactor.rewrite.expression.optionalChain"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [toOptionalChainAction.kind],
          getAvailableActions,
          getEditsForAction
        });
        function getAvailableActions(context) {
          var info = getInfo(context, context.triggerReason === "invoked");
          if (!info)
            return ts2.emptyArray;
          if (!refactor2.isRefactorErrorInfo(info)) {
            return [{
              name: refactorName,
              description: convertToOptionalChainExpressionMessage,
              actions: [toOptionalChainAction]
            }];
          }
          if (context.preferences.provideRefactorNotApplicableReason) {
            return [{
              name: refactorName,
              description: convertToOptionalChainExpressionMessage,
              actions: [__assign(__assign({}, toOptionalChainAction), { notApplicableReason: info.error })]
            }];
          }
          return ts2.emptyArray;
        }
        function getEditsForAction(context, actionName) {
          var info = getInfo(context);
          ts2.Debug.assert(info && !refactor2.isRefactorErrorInfo(info), "Expected applicable refactor info");
          var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(context.file, context.program.getTypeChecker(), t, info, actionName);
          });
          return { edits, renameFilename: void 0, renameLocation: void 0 };
        }
        ;
        function isValidExpression(node) {
          return ts2.isBinaryExpression(node) || ts2.isConditionalExpression(node);
        }
        function isValidStatement(node) {
          return ts2.isExpressionStatement(node) || ts2.isReturnStatement(node) || ts2.isVariableStatement(node);
        }
        function isValidExpressionOrStatement(node) {
          return isValidExpression(node) || isValidStatement(node);
        }
        function getInfo(context, considerEmptySpans) {
          if (considerEmptySpans === void 0) {
            considerEmptySpans = true;
          }
          var file = context.file, program = context.program;
          var span = ts2.getRefactorContextSpan(context);
          var forEmptySpan = span.length === 0;
          if (forEmptySpan && !considerEmptySpans)
            return void 0;
          var startToken = ts2.getTokenAtPosition(file, span.start);
          var endToken = ts2.findTokenOnLeftOfPosition(file, span.start + span.length);
          var adjustedSpan = ts2.createTextSpanFromBounds(startToken.pos, endToken && endToken.end >= startToken.pos ? endToken.getEnd() : startToken.getEnd());
          var parent = forEmptySpan ? getValidParentNodeOfEmptySpan(startToken) : getValidParentNodeContainingSpan(startToken, adjustedSpan);
          var expression = parent && isValidExpressionOrStatement(parent) ? getExpression(parent) : void 0;
          if (!expression)
            return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_convertible_access_expression) };
          var checker = program.getTypeChecker();
          return ts2.isConditionalExpression(expression) ? getConditionalInfo(expression, checker) : getBinaryInfo(expression);
        }
        function getConditionalInfo(expression, checker) {
          var condition = expression.condition;
          var finalExpression = getFinalExpressionInChain(expression.whenTrue);
          if (!finalExpression || checker.isNullableType(checker.getTypeAtLocation(finalExpression))) {
            return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_convertible_access_expression) };
          }
          if ((ts2.isPropertyAccessExpression(condition) || ts2.isIdentifier(condition)) && getMatchingStart(condition, finalExpression.expression)) {
            return { finalExpression, occurrences: [condition], expression };
          } else if (ts2.isBinaryExpression(condition)) {
            var occurrences = getOccurrencesInExpression(finalExpression.expression, condition);
            return occurrences ? { finalExpression, occurrences, expression } : { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_matching_access_expressions) };
          }
        }
        function getBinaryInfo(expression) {
          if (expression.operatorToken.kind !== 55) {
            return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Can_only_convert_logical_AND_access_chains) };
          }
          ;
          var finalExpression = getFinalExpressionInChain(expression.right);
          if (!finalExpression)
            return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_convertible_access_expression) };
          var occurrences = getOccurrencesInExpression(finalExpression.expression, expression.left);
          return occurrences ? { finalExpression, occurrences, expression } : { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_matching_access_expressions) };
        }
        function getOccurrencesInExpression(matchTo, expression) {
          var occurrences = [];
          while (ts2.isBinaryExpression(expression) && expression.operatorToken.kind === 55) {
            var match = getMatchingStart(ts2.skipParentheses(matchTo), ts2.skipParentheses(expression.right));
            if (!match) {
              break;
            }
            occurrences.push(match);
            matchTo = match;
            expression = expression.left;
          }
          var finalMatch = getMatchingStart(matchTo, expression);
          if (finalMatch) {
            occurrences.push(finalMatch);
          }
          return occurrences.length > 0 ? occurrences : void 0;
        }
        function getMatchingStart(chain, subchain) {
          if (!ts2.isIdentifier(subchain) && !ts2.isPropertyAccessExpression(subchain) && !ts2.isElementAccessExpression(subchain)) {
            return void 0;
          }
          return chainStartsWith(chain, subchain) ? subchain : void 0;
        }
        function chainStartsWith(chain, subchain) {
          while (ts2.isCallExpression(chain) || ts2.isPropertyAccessExpression(chain) || ts2.isElementAccessExpression(chain)) {
            if (getTextOfChainNode(chain) === getTextOfChainNode(subchain))
              break;
            chain = chain.expression;
          }
          while (ts2.isPropertyAccessExpression(chain) && ts2.isPropertyAccessExpression(subchain) || ts2.isElementAccessExpression(chain) && ts2.isElementAccessExpression(subchain)) {
            if (getTextOfChainNode(chain) !== getTextOfChainNode(subchain))
              return false;
            chain = chain.expression;
            subchain = subchain.expression;
          }
          return ts2.isIdentifier(chain) && ts2.isIdentifier(subchain) && chain.getText() === subchain.getText();
        }
        function getTextOfChainNode(node) {
          if (ts2.isIdentifier(node) || ts2.isStringOrNumericLiteralLike(node)) {
            return node.getText();
          }
          if (ts2.isPropertyAccessExpression(node)) {
            return getTextOfChainNode(node.name);
          }
          if (ts2.isElementAccessExpression(node)) {
            return getTextOfChainNode(node.argumentExpression);
          }
          return void 0;
        }
        function getValidParentNodeContainingSpan(node, span) {
          while (node.parent) {
            if (isValidExpressionOrStatement(node) && span.length !== 0 && node.end >= span.start + span.length) {
              return node;
            }
            node = node.parent;
          }
          return void 0;
        }
        function getValidParentNodeOfEmptySpan(node) {
          while (node.parent) {
            if (isValidExpressionOrStatement(node) && !isValidExpressionOrStatement(node.parent)) {
              return node;
            }
            node = node.parent;
          }
          return void 0;
        }
        function getExpression(node) {
          if (isValidExpression(node)) {
            return node;
          }
          if (ts2.isVariableStatement(node)) {
            var variable = ts2.getSingleVariableOfVariableStatement(node);
            var initializer = variable === null || variable === void 0 ? void 0 : variable.initializer;
            return initializer && isValidExpression(initializer) ? initializer : void 0;
          }
          return node.expression && isValidExpression(node.expression) ? node.expression : void 0;
        }
        function getFinalExpressionInChain(node) {
          node = ts2.skipParentheses(node);
          if (ts2.isBinaryExpression(node)) {
            return getFinalExpressionInChain(node.left);
          } else if ((ts2.isPropertyAccessExpression(node) || ts2.isElementAccessExpression(node) || ts2.isCallExpression(node)) && !ts2.isOptionalChain(node)) {
            return node;
          }
          return void 0;
        }
        function convertOccurrences(checker, toConvert, occurrences) {
          if (ts2.isPropertyAccessExpression(toConvert) || ts2.isElementAccessExpression(toConvert) || ts2.isCallExpression(toConvert)) {
            var chain = convertOccurrences(checker, toConvert.expression, occurrences);
            var lastOccurrence = occurrences.length > 0 ? occurrences[occurrences.length - 1] : void 0;
            var isOccurrence = (lastOccurrence === null || lastOccurrence === void 0 ? void 0 : lastOccurrence.getText()) === toConvert.expression.getText();
            if (isOccurrence)
              occurrences.pop();
            if (ts2.isCallExpression(toConvert)) {
              return isOccurrence ? ts2.factory.createCallChain(chain, ts2.factory.createToken(28), toConvert.typeArguments, toConvert.arguments) : ts2.factory.createCallChain(chain, toConvert.questionDotToken, toConvert.typeArguments, toConvert.arguments);
            } else if (ts2.isPropertyAccessExpression(toConvert)) {
              return isOccurrence ? ts2.factory.createPropertyAccessChain(chain, ts2.factory.createToken(28), toConvert.name) : ts2.factory.createPropertyAccessChain(chain, toConvert.questionDotToken, toConvert.name);
            } else if (ts2.isElementAccessExpression(toConvert)) {
              return isOccurrence ? ts2.factory.createElementAccessChain(chain, ts2.factory.createToken(28), toConvert.argumentExpression) : ts2.factory.createElementAccessChain(chain, toConvert.questionDotToken, toConvert.argumentExpression);
            }
          }
          return toConvert;
        }
        function doChange(sourceFile, checker, changes, info, _actionName) {
          var finalExpression = info.finalExpression, occurrences = info.occurrences, expression = info.expression;
          var firstOccurrence = occurrences[occurrences.length - 1];
          var convertedChain = convertOccurrences(checker, finalExpression, occurrences);
          if (convertedChain && (ts2.isPropertyAccessExpression(convertedChain) || ts2.isElementAccessExpression(convertedChain) || ts2.isCallExpression(convertedChain))) {
            if (ts2.isBinaryExpression(expression)) {
              changes.replaceNodeRange(sourceFile, firstOccurrence, finalExpression, convertedChain);
            } else if (ts2.isConditionalExpression(expression)) {
              changes.replaceNode(sourceFile, expression, ts2.factory.createBinaryExpression(convertedChain, ts2.factory.createToken(60), expression.whenFalse));
            }
          }
        }
      })(convertToOptionalChainExpression = refactor2.convertToOptionalChainExpression || (refactor2.convertToOptionalChainExpression = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var addOrRemoveBracesToArrowFunction;
      (function(addOrRemoveBracesToArrowFunction2) {
        var refactorName = "Convert overload list to single signature";
        var refactorDescription = ts2.Diagnostics.Convert_overload_list_to_single_signature.message;
        var functionOverloadAction = {
          name: refactorName,
          description: refactorDescription,
          kind: "refactor.rewrite.function.overloadList"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [functionOverloadAction.kind],
          getEditsForAction,
          getAvailableActions
        });
        function getAvailableActions(context) {
          var file = context.file, startPosition = context.startPosition, program = context.program;
          var info = getConvertableOverloadListAtPosition(file, startPosition, program);
          if (!info)
            return ts2.emptyArray;
          return [{
            name: refactorName,
            description: refactorDescription,
            actions: [functionOverloadAction]
          }];
        }
        function getEditsForAction(context) {
          var file = context.file, startPosition = context.startPosition, program = context.program;
          var signatureDecls = getConvertableOverloadListAtPosition(file, startPosition, program);
          if (!signatureDecls)
            return void 0;
          var checker = program.getTypeChecker();
          var lastDeclaration = signatureDecls[signatureDecls.length - 1];
          var updated = lastDeclaration;
          switch (lastDeclaration.kind) {
            case 167: {
              updated = ts2.factory.updateMethodSignature(lastDeclaration, lastDeclaration.modifiers, lastDeclaration.name, lastDeclaration.questionToken, lastDeclaration.typeParameters, getNewParametersForCombinedSignature(signatureDecls), lastDeclaration.type);
              break;
            }
            case 168: {
              updated = ts2.factory.updateMethodDeclaration(lastDeclaration, lastDeclaration.decorators, lastDeclaration.modifiers, lastDeclaration.asteriskToken, lastDeclaration.name, lastDeclaration.questionToken, lastDeclaration.typeParameters, getNewParametersForCombinedSignature(signatureDecls), lastDeclaration.type, lastDeclaration.body);
              break;
            }
            case 173: {
              updated = ts2.factory.updateCallSignature(lastDeclaration, lastDeclaration.typeParameters, getNewParametersForCombinedSignature(signatureDecls), lastDeclaration.type);
              break;
            }
            case 170: {
              updated = ts2.factory.updateConstructorDeclaration(lastDeclaration, lastDeclaration.decorators, lastDeclaration.modifiers, getNewParametersForCombinedSignature(signatureDecls), lastDeclaration.body);
              break;
            }
            case 174: {
              updated = ts2.factory.updateConstructSignature(lastDeclaration, lastDeclaration.typeParameters, getNewParametersForCombinedSignature(signatureDecls), lastDeclaration.type);
              break;
            }
            case 255: {
              updated = ts2.factory.updateFunctionDeclaration(lastDeclaration, lastDeclaration.decorators, lastDeclaration.modifiers, lastDeclaration.asteriskToken, lastDeclaration.name, lastDeclaration.typeParameters, getNewParametersForCombinedSignature(signatureDecls), lastDeclaration.type, lastDeclaration.body);
              break;
            }
            default:
              return ts2.Debug.failBadSyntaxKind(lastDeclaration, "Unhandled signature kind in overload list conversion refactoring");
          }
          if (updated === lastDeclaration) {
            return;
          }
          var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
            t.replaceNodeRange(file, signatureDecls[0], signatureDecls[signatureDecls.length - 1], updated);
          });
          return { renameFilename: void 0, renameLocation: void 0, edits };
          function getNewParametersForCombinedSignature(signatureDeclarations) {
            var lastSig = signatureDeclarations[signatureDeclarations.length - 1];
            if (ts2.isFunctionLikeDeclaration(lastSig) && lastSig.body) {
              signatureDeclarations = signatureDeclarations.slice(0, signatureDeclarations.length - 1);
            }
            return ts2.factory.createNodeArray([
              ts2.factory.createParameterDeclaration(void 0, void 0, ts2.factory.createToken(25), "args", void 0, ts2.factory.createUnionTypeNode(ts2.map(signatureDeclarations, convertSignatureParametersToTuple)))
            ]);
          }
          function convertSignatureParametersToTuple(decl) {
            var members = ts2.map(decl.parameters, convertParameterToNamedTupleMember);
            return ts2.setEmitFlags(ts2.factory.createTupleTypeNode(members), ts2.some(members, function(m) {
              return !!ts2.length(ts2.getSyntheticLeadingComments(m));
            }) ? 0 : 1);
          }
          function convertParameterToNamedTupleMember(p) {
            ts2.Debug.assert(ts2.isIdentifier(p.name));
            var result = ts2.setTextRange(ts2.factory.createNamedTupleMember(p.dotDotDotToken, p.name, p.questionToken, p.type || ts2.factory.createKeywordTypeNode(130)), p);
            var parameterDocComment = p.symbol && p.symbol.getDocumentationComment(checker);
            if (parameterDocComment) {
              var newComment = ts2.displayPartsToString(parameterDocComment);
              if (newComment.length) {
                ts2.setSyntheticLeadingComments(result, [{
                  text: "*\n".concat(newComment.split("\n").map(function(c) {
                    return " * ".concat(c);
                  }).join("\n"), "\n "),
                  kind: 3,
                  pos: -1,
                  end: -1,
                  hasTrailingNewLine: true,
                  hasLeadingNewline: true
                }]);
              }
            }
            return result;
          }
        }
        function isConvertableSignatureDeclaration(d) {
          switch (d.kind) {
            case 167:
            case 168:
            case 173:
            case 170:
            case 174:
            case 255:
              return true;
          }
          return false;
        }
        function getConvertableOverloadListAtPosition(file, startPosition, program) {
          var node = ts2.getTokenAtPosition(file, startPosition);
          var containingDecl = ts2.findAncestor(node, isConvertableSignatureDeclaration);
          if (!containingDecl) {
            return;
          }
          var checker = program.getTypeChecker();
          var signatureSymbol = containingDecl.symbol;
          if (!signatureSymbol) {
            return;
          }
          var decls = signatureSymbol.declarations;
          if (ts2.length(decls) <= 1) {
            return;
          }
          if (!ts2.every(decls, function(d) {
            return ts2.getSourceFileOfNode(d) === file;
          })) {
            return;
          }
          if (!isConvertableSignatureDeclaration(decls[0])) {
            return;
          }
          var kindOne = decls[0].kind;
          if (!ts2.every(decls, function(d) {
            return d.kind === kindOne;
          })) {
            return;
          }
          var signatureDecls = decls;
          if (ts2.some(signatureDecls, function(d) {
            return !!d.typeParameters || ts2.some(d.parameters, function(p) {
              return !!p.decorators || !!p.modifiers || !ts2.isIdentifier(p.name);
            });
          })) {
            return;
          }
          var signatures = ts2.mapDefined(signatureDecls, function(d) {
            return checker.getSignatureFromDeclaration(d);
          });
          if (ts2.length(signatures) !== ts2.length(decls)) {
            return;
          }
          var returnOne = checker.getReturnTypeOfSignature(signatures[0]);
          if (!ts2.every(signatures, function(s) {
            return checker.getReturnTypeOfSignature(s) === returnOne;
          })) {
            return;
          }
          return signatureDecls;
        }
      })(addOrRemoveBracesToArrowFunction = refactor2.addOrRemoveBracesToArrowFunction || (refactor2.addOrRemoveBracesToArrowFunction = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var extractSymbol;
      (function(extractSymbol2) {
        var refactorName = "Extract Symbol";
        var extractConstantAction = {
          name: "Extract Constant",
          description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_constant),
          kind: "refactor.extract.constant"
        };
        var extractFunctionAction = {
          name: "Extract Function",
          description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_function),
          kind: "refactor.extract.function"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [
            extractConstantAction.kind,
            extractFunctionAction.kind
          ],
          getAvailableActions,
          getEditsForAction
        });
        function getAvailableActions(context) {
          var requestedRefactor = context.kind;
          var rangeToExtract = getRangeToExtract(context.file, ts2.getRefactorContextSpan(context), context.triggerReason === "invoked");
          var targetRange = rangeToExtract.targetRange;
          if (targetRange === void 0) {
            if (!rangeToExtract.errors || rangeToExtract.errors.length === 0 || !context.preferences.provideRefactorNotApplicableReason) {
              return ts2.emptyArray;
            }
            var errors = [];
            if (refactor2.refactorKindBeginsWith(extractFunctionAction.kind, requestedRefactor)) {
              errors.push({
                name: refactorName,
                description: extractFunctionAction.description,
                actions: [__assign(__assign({}, extractFunctionAction), { notApplicableReason: getStringError(rangeToExtract.errors) })]
              });
            }
            if (refactor2.refactorKindBeginsWith(extractConstantAction.kind, requestedRefactor)) {
              errors.push({
                name: refactorName,
                description: extractConstantAction.description,
                actions: [__assign(__assign({}, extractConstantAction), { notApplicableReason: getStringError(rangeToExtract.errors) })]
              });
            }
            return errors;
          }
          var extractions = getPossibleExtractions(targetRange, context);
          if (extractions === void 0) {
            return ts2.emptyArray;
          }
          var functionActions = [];
          var usedFunctionNames = new ts2.Map();
          var innermostErrorFunctionAction;
          var constantActions = [];
          var usedConstantNames = new ts2.Map();
          var innermostErrorConstantAction;
          var i = 0;
          for (var _i = 0, extractions_1 = extractions; _i < extractions_1.length; _i++) {
            var _a = extractions_1[_i], functionExtraction = _a.functionExtraction, constantExtraction = _a.constantExtraction;
            var description = functionExtraction.description;
            if (refactor2.refactorKindBeginsWith(extractFunctionAction.kind, requestedRefactor)) {
              if (functionExtraction.errors.length === 0) {
                if (!usedFunctionNames.has(description)) {
                  usedFunctionNames.set(description, true);
                  functionActions.push({
                    description,
                    name: "function_scope_".concat(i),
                    kind: extractFunctionAction.kind
                  });
                }
              } else if (!innermostErrorFunctionAction) {
                innermostErrorFunctionAction = {
                  description,
                  name: "function_scope_".concat(i),
                  notApplicableReason: getStringError(functionExtraction.errors),
                  kind: extractFunctionAction.kind
                };
              }
            }
            if (refactor2.refactorKindBeginsWith(extractConstantAction.kind, requestedRefactor)) {
              if (constantExtraction.errors.length === 0) {
                var description_1 = constantExtraction.description;
                if (!usedConstantNames.has(description_1)) {
                  usedConstantNames.set(description_1, true);
                  constantActions.push({
                    description: description_1,
                    name: "constant_scope_".concat(i),
                    kind: extractConstantAction.kind
                  });
                }
              } else if (!innermostErrorConstantAction) {
                innermostErrorConstantAction = {
                  description,
                  name: "constant_scope_".concat(i),
                  notApplicableReason: getStringError(constantExtraction.errors),
                  kind: extractConstantAction.kind
                };
              }
            }
            i++;
          }
          var infos = [];
          if (functionActions.length) {
            infos.push({
              name: refactorName,
              description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_function),
              actions: functionActions
            });
          } else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorFunctionAction) {
            infos.push({
              name: refactorName,
              description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_function),
              actions: [innermostErrorFunctionAction]
            });
          }
          if (constantActions.length) {
            infos.push({
              name: refactorName,
              description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_constant),
              actions: constantActions
            });
          } else if (context.preferences.provideRefactorNotApplicableReason && innermostErrorConstantAction) {
            infos.push({
              name: refactorName,
              description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_constant),
              actions: [innermostErrorConstantAction]
            });
          }
          return infos.length ? infos : ts2.emptyArray;
          function getStringError(errors2) {
            var error = errors2[0].messageText;
            if (typeof error !== "string") {
              error = error.messageText;
            }
            return error;
          }
        }
        extractSymbol2.getAvailableActions = getAvailableActions;
        function getEditsForAction(context, actionName) {
          var rangeToExtract = getRangeToExtract(context.file, ts2.getRefactorContextSpan(context));
          var targetRange = rangeToExtract.targetRange;
          var parsedFunctionIndexMatch = /^function_scope_(\d+)$/.exec(actionName);
          if (parsedFunctionIndexMatch) {
            var index = +parsedFunctionIndexMatch[1];
            ts2.Debug.assert(isFinite(index), "Expected to parse a finite number from the function scope index");
            return getFunctionExtractionAtIndex(targetRange, context, index);
          }
          var parsedConstantIndexMatch = /^constant_scope_(\d+)$/.exec(actionName);
          if (parsedConstantIndexMatch) {
            var index = +parsedConstantIndexMatch[1];
            ts2.Debug.assert(isFinite(index), "Expected to parse a finite number from the constant scope index");
            return getConstantExtractionAtIndex(targetRange, context, index);
          }
          ts2.Debug.fail("Unrecognized action name");
        }
        extractSymbol2.getEditsForAction = getEditsForAction;
        var Messages;
        (function(Messages2) {
          function createMessage(message) {
            return { message, code: 0, category: ts2.DiagnosticCategory.Message, key: message };
          }
          Messages2.cannotExtractRange = createMessage("Cannot extract range.");
          Messages2.cannotExtractImport = createMessage("Cannot extract import statement.");
          Messages2.cannotExtractSuper = createMessage("Cannot extract super call.");
          Messages2.cannotExtractJSDoc = createMessage("Cannot extract JSDoc.");
          Messages2.cannotExtractEmpty = createMessage("Cannot extract empty range.");
          Messages2.expressionExpected = createMessage("expression expected.");
          Messages2.uselessConstantType = createMessage("No reason to extract constant of type.");
          Messages2.statementOrExpressionExpected = createMessage("Statement or expression expected.");
          Messages2.cannotExtractRangeContainingConditionalBreakOrContinueStatements = createMessage("Cannot extract range containing conditional break or continue statements.");
          Messages2.cannotExtractRangeContainingConditionalReturnStatement = createMessage("Cannot extract range containing conditional return statement.");
          Messages2.cannotExtractRangeContainingLabeledBreakOrContinueStatementWithTargetOutsideOfTheRange = createMessage("Cannot extract range containing labeled break or continue with target outside of the range.");
          Messages2.cannotExtractRangeThatContainsWritesToReferencesLocatedOutsideOfTheTargetRangeInGenerators = createMessage("Cannot extract range containing writes to references located outside of the target range in generators.");
          Messages2.typeWillNotBeVisibleInTheNewScope = createMessage("Type will not visible in the new scope.");
          Messages2.functionWillNotBeVisibleInTheNewScope = createMessage("Function will not visible in the new scope.");
          Messages2.cannotExtractIdentifier = createMessage("Select more than a single identifier.");
          Messages2.cannotExtractExportedEntity = createMessage("Cannot extract exported declaration");
          Messages2.cannotWriteInExpression = createMessage("Cannot write back side-effects when extracting an expression");
          Messages2.cannotExtractReadonlyPropertyInitializerOutsideConstructor = createMessage("Cannot move initialization of read-only class property outside of the constructor");
          Messages2.cannotExtractAmbientBlock = createMessage("Cannot extract code from ambient contexts");
          Messages2.cannotAccessVariablesFromNestedScopes = createMessage("Cannot access variables from nested scopes");
          Messages2.cannotExtractToJSClass = createMessage("Cannot extract constant to a class scope in JS");
          Messages2.cannotExtractToExpressionArrowFunction = createMessage("Cannot extract constant to an arrow function without a block");
        })(Messages = extractSymbol2.Messages || (extractSymbol2.Messages = {}));
        var RangeFacts;
        (function(RangeFacts2) {
          RangeFacts2[RangeFacts2["None"] = 0] = "None";
          RangeFacts2[RangeFacts2["HasReturn"] = 1] = "HasReturn";
          RangeFacts2[RangeFacts2["IsGenerator"] = 2] = "IsGenerator";
          RangeFacts2[RangeFacts2["IsAsyncFunction"] = 4] = "IsAsyncFunction";
          RangeFacts2[RangeFacts2["UsesThis"] = 8] = "UsesThis";
          RangeFacts2[RangeFacts2["InStaticRegion"] = 16] = "InStaticRegion";
        })(RangeFacts || (RangeFacts = {}));
        function getRangeToExtract(sourceFile, span, invoked) {
          if (invoked === void 0) {
            invoked = true;
          }
          var length = span.length;
          if (length === 0 && !invoked) {
            return { errors: [ts2.createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractEmpty)] };
          }
          var cursorRequest = length === 0 && invoked;
          var startToken = ts2.findFirstNonJsxWhitespaceToken(sourceFile, span.start);
          var endToken = ts2.findTokenOnLeftOfPosition(sourceFile, ts2.textSpanEnd(span));
          var adjustedSpan = startToken && endToken && invoked ? getAdjustedSpanFromNodes(startToken, endToken, sourceFile) : span;
          var start = cursorRequest ? getExtractableParent(startToken) : ts2.getParentNodeInSpan(startToken, sourceFile, adjustedSpan);
          var end = cursorRequest ? start : ts2.getParentNodeInSpan(endToken, sourceFile, adjustedSpan);
          var declarations = [];
          var rangeFacts = RangeFacts.None;
          if (!start || !end) {
            return { errors: [ts2.createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractRange)] };
          }
          if (ts2.isJSDoc(start)) {
            return { errors: [ts2.createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractJSDoc)] };
          }
          if (start.parent !== end.parent) {
            return { errors: [ts2.createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractRange)] };
          }
          if (start !== end) {
            if (!isBlockLike(start.parent)) {
              return { errors: [ts2.createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractRange)] };
            }
            var statements = [];
            var start2 = start;
            for (var _i = 0, _a = start2.parent.statements; _i < _a.length; _i++) {
              var statement = _a[_i];
              if (statement === start || statements.length) {
                var errors_1 = checkNode(statement);
                if (errors_1) {
                  return { errors: errors_1 };
                }
                statements.push(statement);
              }
              if (statement === end) {
                break;
              }
            }
            if (!statements.length) {
              return { errors: [ts2.createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractRange)] };
            }
            return { targetRange: { range: statements, facts: rangeFacts, declarations } };
          }
          if (ts2.isReturnStatement(start) && !start.expression) {
            return { errors: [ts2.createFileDiagnostic(sourceFile, span.start, length, Messages.cannotExtractRange)] };
          }
          var node = refineNode(start);
          var errors = checkRootNode(node) || checkNode(node);
          if (errors) {
            return { errors };
          }
          return { targetRange: { range: getStatementOrExpressionRange(node), facts: rangeFacts, declarations } };
          function refineNode(node2) {
            if (ts2.isReturnStatement(node2)) {
              if (node2.expression) {
                return node2.expression;
              }
            } else if (ts2.isVariableStatement(node2)) {
              var numInitializers = 0;
              var lastInitializer = void 0;
              for (var _i2 = 0, _a2 = node2.declarationList.declarations; _i2 < _a2.length; _i2++) {
                var declaration = _a2[_i2];
                if (declaration.initializer) {
                  numInitializers++;
                  lastInitializer = declaration.initializer;
                }
              }
              if (numInitializers === 1) {
                return lastInitializer;
              }
            } else if (ts2.isVariableDeclaration(node2)) {
              if (node2.initializer) {
                return node2.initializer;
              }
            }
            return node2;
          }
          function checkRootNode(node2) {
            if (ts2.isIdentifier(ts2.isExpressionStatement(node2) ? node2.expression : node2)) {
              return [ts2.createDiagnosticForNode(node2, Messages.cannotExtractIdentifier)];
            }
            return void 0;
          }
          function checkForStaticContext(nodeToCheck, containingClass) {
            var current = nodeToCheck;
            while (current !== containingClass) {
              if (current.kind === 166) {
                if (ts2.isStatic(current)) {
                  rangeFacts |= RangeFacts.InStaticRegion;
                }
                break;
              } else if (current.kind === 163) {
                var ctorOrMethod = ts2.getContainingFunction(current);
                if (ctorOrMethod.kind === 170) {
                  rangeFacts |= RangeFacts.InStaticRegion;
                }
                break;
              } else if (current.kind === 168) {
                if (ts2.isStatic(current)) {
                  rangeFacts |= RangeFacts.InStaticRegion;
                }
              }
              current = current.parent;
            }
          }
          function checkNode(nodeToCheck) {
            var PermittedJumps;
            (function(PermittedJumps2) {
              PermittedJumps2[PermittedJumps2["None"] = 0] = "None";
              PermittedJumps2[PermittedJumps2["Break"] = 1] = "Break";
              PermittedJumps2[PermittedJumps2["Continue"] = 2] = "Continue";
              PermittedJumps2[PermittedJumps2["Return"] = 4] = "Return";
            })(PermittedJumps || (PermittedJumps = {}));
            ts2.Debug.assert(nodeToCheck.pos <= nodeToCheck.end, "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809 (1)");
            ts2.Debug.assert(!ts2.positionIsSynthesized(nodeToCheck.pos), "This failure could trigger https://github.com/Microsoft/TypeScript/issues/20809 (2)");
            if (!ts2.isStatement(nodeToCheck) && !(ts2.isExpressionNode(nodeToCheck) && isExtractableExpression(nodeToCheck))) {
              return [ts2.createDiagnosticForNode(nodeToCheck, Messages.statementOrExpressionExpected)];
            }
            if (nodeToCheck.flags & 8388608) {
              return [ts2.createDiagnosticForNode(nodeToCheck, Messages.cannotExtractAmbientBlock)];
            }
            var containingClass = ts2.getContainingClass(nodeToCheck);
            if (containingClass) {
              checkForStaticContext(nodeToCheck, containingClass);
            }
            var errors2;
            var permittedJumps = 4;
            var seenLabels;
            visit(nodeToCheck);
            return errors2;
            function visit(node2) {
              if (errors2) {
                return true;
              }
              if (ts2.isDeclaration(node2)) {
                var declaringNode = node2.kind === 253 ? node2.parent.parent : node2;
                if (ts2.hasSyntacticModifier(declaringNode, 1)) {
                  (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.cannotExtractExportedEntity));
                  return true;
                }
                declarations.push(node2.symbol);
              }
              switch (node2.kind) {
                case 265:
                  (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.cannotExtractImport));
                  return true;
                case 270:
                  (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.cannotExtractExportedEntity));
                  return true;
                case 106:
                  if (node2.parent.kind === 207) {
                    var containingClass_1 = ts2.getContainingClass(node2);
                    if (containingClass_1.pos < span.start || containingClass_1.end >= span.start + span.length) {
                      (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.cannotExtractSuper));
                      return true;
                    }
                  } else {
                    rangeFacts |= RangeFacts.UsesThis;
                  }
                  break;
                case 213:
                  ts2.forEachChild(node2, function check(n) {
                    if (ts2.isThis(n)) {
                      rangeFacts |= RangeFacts.UsesThis;
                    } else if (ts2.isClassLike(n) || ts2.isFunctionLike(n) && !ts2.isArrowFunction(n)) {
                      return false;
                    } else {
                      ts2.forEachChild(n, check);
                    }
                  });
                case 256:
                case 255:
                  if (ts2.isSourceFile(node2.parent) && node2.parent.externalModuleIndicator === void 0) {
                    (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.functionWillNotBeVisibleInTheNewScope));
                  }
                case 225:
                case 212:
                case 168:
                case 170:
                case 171:
                case 172:
                  return false;
              }
              var savedPermittedJumps = permittedJumps;
              switch (node2.kind) {
                case 238:
                  permittedJumps = 0;
                  break;
                case 251:
                  permittedJumps = 0;
                  break;
                case 234:
                  if (node2.parent && node2.parent.kind === 251 && node2.parent.finallyBlock === node2) {
                    permittedJumps = 4;
                  }
                  break;
                case 289:
                case 288:
                  permittedJumps |= 1;
                  break;
                default:
                  if (ts2.isIterationStatement(node2, false)) {
                    permittedJumps |= 1 | 2;
                  }
                  break;
              }
              switch (node2.kind) {
                case 191:
                case 108:
                  rangeFacts |= RangeFacts.UsesThis;
                  break;
                case 249: {
                  var label = node2.label;
                  (seenLabels || (seenLabels = [])).push(label.escapedText);
                  ts2.forEachChild(node2, visit);
                  seenLabels.pop();
                  break;
                }
                case 245:
                case 244: {
                  var label = node2.label;
                  if (label) {
                    if (!ts2.contains(seenLabels, label.escapedText)) {
                      (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.cannotExtractRangeContainingLabeledBreakOrContinueStatementWithTargetOutsideOfTheRange));
                    }
                  } else {
                    if (!(permittedJumps & (node2.kind === 245 ? 1 : 2))) {
                      (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.cannotExtractRangeContainingConditionalBreakOrContinueStatements));
                    }
                  }
                  break;
                }
                case 217:
                  rangeFacts |= RangeFacts.IsAsyncFunction;
                  break;
                case 223:
                  rangeFacts |= RangeFacts.IsGenerator;
                  break;
                case 246:
                  if (permittedJumps & 4) {
                    rangeFacts |= RangeFacts.HasReturn;
                  } else {
                    (errors2 || (errors2 = [])).push(ts2.createDiagnosticForNode(node2, Messages.cannotExtractRangeContainingConditionalReturnStatement));
                  }
                  break;
                default:
                  ts2.forEachChild(node2, visit);
                  break;
              }
              permittedJumps = savedPermittedJumps;
            }
          }
        }
        extractSymbol2.getRangeToExtract = getRangeToExtract;
        function getAdjustedSpanFromNodes(startNode, endNode, sourceFile) {
          var start = startNode.getStart(sourceFile);
          var end = endNode.getEnd();
          if (sourceFile.text.charCodeAt(end) === 59) {
            end++;
          }
          return { start, length: end - start };
        }
        function getStatementOrExpressionRange(node) {
          if (ts2.isStatement(node)) {
            return [node];
          } else if (ts2.isExpressionNode(node)) {
            return ts2.isExpressionStatement(node.parent) ? [node.parent] : node;
          }
          return void 0;
        }
        function isScope(node) {
          return ts2.isFunctionLikeDeclaration(node) || ts2.isSourceFile(node) || ts2.isModuleBlock(node) || ts2.isClassLike(node);
        }
        function collectEnclosingScopes(range) {
          var current = isReadonlyArray(range.range) ? ts2.first(range.range) : range.range;
          if (range.facts & RangeFacts.UsesThis) {
            var containingClass = ts2.getContainingClass(current);
            if (containingClass) {
              var containingFunction = ts2.findAncestor(current, ts2.isFunctionLikeDeclaration);
              return containingFunction ? [containingFunction, containingClass] : [containingClass];
            }
          }
          var scopes = [];
          while (true) {
            current = current.parent;
            if (current.kind === 163) {
              current = ts2.findAncestor(current, function(parent) {
                return ts2.isFunctionLikeDeclaration(parent);
              }).parent;
            }
            if (isScope(current)) {
              scopes.push(current);
              if (current.kind === 303) {
                return scopes;
              }
            }
          }
        }
        function getFunctionExtractionAtIndex(targetRange, context, requestedChangesIndex) {
          var _a = getPossibleExtractionsWorker(targetRange, context), scopes = _a.scopes, _b = _a.readsAndWrites, target = _b.target, usagesPerScope = _b.usagesPerScope, functionErrorsPerScope = _b.functionErrorsPerScope, exposedVariableDeclarations = _b.exposedVariableDeclarations;
          ts2.Debug.assert(!functionErrorsPerScope[requestedChangesIndex].length, "The extraction went missing? How?");
          context.cancellationToken.throwIfCancellationRequested();
          return extractFunctionInScope(target, scopes[requestedChangesIndex], usagesPerScope[requestedChangesIndex], exposedVariableDeclarations, targetRange, context);
        }
        function getConstantExtractionAtIndex(targetRange, context, requestedChangesIndex) {
          var _a = getPossibleExtractionsWorker(targetRange, context), scopes = _a.scopes, _b = _a.readsAndWrites, target = _b.target, usagesPerScope = _b.usagesPerScope, constantErrorsPerScope = _b.constantErrorsPerScope, exposedVariableDeclarations = _b.exposedVariableDeclarations;
          ts2.Debug.assert(!constantErrorsPerScope[requestedChangesIndex].length, "The extraction went missing? How?");
          ts2.Debug.assert(exposedVariableDeclarations.length === 0, "Extract constant accepted a range containing a variable declaration?");
          context.cancellationToken.throwIfCancellationRequested();
          var expression = ts2.isExpression(target) ? target : target.statements[0].expression;
          return extractConstantInScope(expression, scopes[requestedChangesIndex], usagesPerScope[requestedChangesIndex], targetRange.facts, context);
        }
        function getPossibleExtractions(targetRange, context) {
          var _a = getPossibleExtractionsWorker(targetRange, context), scopes = _a.scopes, _b = _a.readsAndWrites, functionErrorsPerScope = _b.functionErrorsPerScope, constantErrorsPerScope = _b.constantErrorsPerScope;
          var extractions = scopes.map(function(scope, i) {
            var functionDescriptionPart = getDescriptionForFunctionInScope(scope);
            var constantDescriptionPart = getDescriptionForConstantInScope(scope);
            var scopeDescription = ts2.isFunctionLikeDeclaration(scope) ? getDescriptionForFunctionLikeDeclaration(scope) : ts2.isClassLike(scope) ? getDescriptionForClassLikeDeclaration(scope) : getDescriptionForModuleLikeDeclaration(scope);
            var functionDescription;
            var constantDescription;
            if (scopeDescription === 1) {
              functionDescription = ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_0_in_1_scope), [functionDescriptionPart, "global"]);
              constantDescription = ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_0_in_1_scope), [constantDescriptionPart, "global"]);
            } else if (scopeDescription === 0) {
              functionDescription = ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_0_in_1_scope), [functionDescriptionPart, "module"]);
              constantDescription = ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_0_in_1_scope), [constantDescriptionPart, "module"]);
            } else {
              functionDescription = ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_0_in_1), [functionDescriptionPart, scopeDescription]);
              constantDescription = ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_0_in_1), [constantDescriptionPart, scopeDescription]);
            }
            if (i === 0 && !ts2.isClassLike(scope)) {
              constantDescription = ts2.formatStringFromArgs(ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_0_in_enclosing_scope), [constantDescriptionPart]);
            }
            return {
              functionExtraction: {
                description: functionDescription,
                errors: functionErrorsPerScope[i]
              },
              constantExtraction: {
                description: constantDescription,
                errors: constantErrorsPerScope[i]
              }
            };
          });
          return extractions;
        }
        function getPossibleExtractionsWorker(targetRange, context) {
          var sourceFile = context.file;
          var scopes = collectEnclosingScopes(targetRange);
          var enclosingTextRange = getEnclosingTextRange(targetRange, sourceFile);
          var readsAndWrites = collectReadsAndWrites(targetRange, scopes, enclosingTextRange, sourceFile, context.program.getTypeChecker(), context.cancellationToken);
          return { scopes, readsAndWrites };
        }
        function getDescriptionForFunctionInScope(scope) {
          return ts2.isFunctionLikeDeclaration(scope) ? "inner function" : ts2.isClassLike(scope) ? "method" : "function";
        }
        function getDescriptionForConstantInScope(scope) {
          return ts2.isClassLike(scope) ? "readonly field" : "constant";
        }
        function getDescriptionForFunctionLikeDeclaration(scope) {
          switch (scope.kind) {
            case 170:
              return "constructor";
            case 212:
            case 255:
              return scope.name ? "function '".concat(scope.name.text, "'") : ts2.ANONYMOUS;
            case 213:
              return "arrow function";
            case 168:
              return "method '".concat(scope.name.getText(), "'");
            case 171:
              return "'get ".concat(scope.name.getText(), "'");
            case 172:
              return "'set ".concat(scope.name.getText(), "'");
            default:
              throw ts2.Debug.assertNever(scope, "Unexpected scope kind ".concat(scope.kind));
          }
        }
        function getDescriptionForClassLikeDeclaration(scope) {
          return scope.kind === 256 ? scope.name ? "class '".concat(scope.name.text, "'") : "anonymous class declaration" : scope.name ? "class expression '".concat(scope.name.text, "'") : "anonymous class expression";
        }
        function getDescriptionForModuleLikeDeclaration(scope) {
          return scope.kind === 261 ? "namespace '".concat(scope.parent.name.getText(), "'") : scope.externalModuleIndicator ? 0 : 1;
        }
        var SpecialScope;
        (function(SpecialScope2) {
          SpecialScope2[SpecialScope2["Module"] = 0] = "Module";
          SpecialScope2[SpecialScope2["Global"] = 1] = "Global";
        })(SpecialScope || (SpecialScope = {}));
        function extractFunctionInScope(node, scope, _a, exposedVariableDeclarations, range, context) {
          var usagesInScope = _a.usages, typeParameterUsages = _a.typeParameterUsages, substitutions = _a.substitutions;
          var checker = context.program.getTypeChecker();
          var scriptTarget = ts2.getEmitScriptTarget(context.program.getCompilerOptions());
          var importAdder = ts2.codefix.createImportAdder(context.file, context.program, context.preferences, context.host);
          var file = scope.getSourceFile();
          var functionNameText = ts2.getUniqueName(ts2.isClassLike(scope) ? "newMethod" : "newFunction", file);
          var isJS = ts2.isInJSFile(scope);
          var functionName = ts2.factory.createIdentifier(functionNameText);
          var returnType;
          var parameters = [];
          var callArguments = [];
          var writes;
          usagesInScope.forEach(function(usage, name) {
            var typeNode;
            if (!isJS) {
              var type = checker.getTypeOfSymbolAtLocation(usage.symbol, usage.node);
              type = checker.getBaseTypeOfLiteralType(type);
              typeNode = ts2.codefix.typeToAutoImportableTypeNode(checker, importAdder, type, scope, scriptTarget, 1);
            }
            var paramDecl = ts2.factory.createParameterDeclaration(void 0, void 0, void 0, name, void 0, typeNode);
            parameters.push(paramDecl);
            if (usage.usage === 2) {
              (writes || (writes = [])).push(usage);
            }
            callArguments.push(ts2.factory.createIdentifier(name));
          });
          var typeParametersAndDeclarations = ts2.arrayFrom(typeParameterUsages.values()).map(function(type) {
            return { type, declaration: getFirstDeclaration(type) };
          });
          var sortedTypeParametersAndDeclarations = typeParametersAndDeclarations.sort(compareTypesByDeclarationOrder);
          var typeParameters = sortedTypeParametersAndDeclarations.length === 0 ? void 0 : sortedTypeParametersAndDeclarations.map(function(t) {
            return t.declaration;
          });
          var callTypeArguments = typeParameters !== void 0 ? typeParameters.map(function(decl) {
            return ts2.factory.createTypeReferenceNode(decl.name, void 0);
          }) : void 0;
          if (ts2.isExpression(node) && !isJS) {
            var contextualType = checker.getContextualType(node);
            returnType = checker.typeToTypeNode(contextualType, scope, 1);
          }
          var _b = transformFunctionBody(node, exposedVariableDeclarations, writes, substitutions, !!(range.facts & RangeFacts.HasReturn)), body = _b.body, returnValueProperty = _b.returnValueProperty;
          ts2.suppressLeadingAndTrailingTrivia(body);
          var newFunction;
          if (ts2.isClassLike(scope)) {
            var modifiers = isJS ? [] : [ts2.factory.createModifier(121)];
            if (range.facts & RangeFacts.InStaticRegion) {
              modifiers.push(ts2.factory.createModifier(124));
            }
            if (range.facts & RangeFacts.IsAsyncFunction) {
              modifiers.push(ts2.factory.createModifier(131));
            }
            newFunction = ts2.factory.createMethodDeclaration(void 0, modifiers.length ? modifiers : void 0, range.facts & RangeFacts.IsGenerator ? ts2.factory.createToken(41) : void 0, functionName, void 0, typeParameters, parameters, returnType, body);
          } else {
            newFunction = ts2.factory.createFunctionDeclaration(void 0, range.facts & RangeFacts.IsAsyncFunction ? [ts2.factory.createToken(131)] : void 0, range.facts & RangeFacts.IsGenerator ? ts2.factory.createToken(41) : void 0, functionName, typeParameters, parameters, returnType, body);
          }
          var changeTracker = ts2.textChanges.ChangeTracker.fromContext(context);
          var minInsertionPos = (isReadonlyArray(range.range) ? ts2.last(range.range) : range.range).end;
          var nodeToInsertBefore = getNodeToInsertFunctionBefore(minInsertionPos, scope);
          if (nodeToInsertBefore) {
            changeTracker.insertNodeBefore(context.file, nodeToInsertBefore, newFunction, true);
          } else {
            changeTracker.insertNodeAtEndOfScope(context.file, scope, newFunction);
          }
          importAdder.writeFixes(changeTracker);
          var newNodes = [];
          var called = getCalledExpression(scope, range, functionNameText);
          var call = ts2.factory.createCallExpression(called, callTypeArguments, callArguments);
          if (range.facts & RangeFacts.IsGenerator) {
            call = ts2.factory.createYieldExpression(ts2.factory.createToken(41), call);
          }
          if (range.facts & RangeFacts.IsAsyncFunction) {
            call = ts2.factory.createAwaitExpression(call);
          }
          if (isInJSXContent(node)) {
            call = ts2.factory.createJsxExpression(void 0, call);
          }
          if (exposedVariableDeclarations.length && !writes) {
            ts2.Debug.assert(!returnValueProperty, "Expected no returnValueProperty");
            ts2.Debug.assert(!(range.facts & RangeFacts.HasReturn), "Expected RangeFacts.HasReturn flag to be unset");
            if (exposedVariableDeclarations.length === 1) {
              var variableDeclaration = exposedVariableDeclarations[0];
              newNodes.push(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(ts2.getSynthesizedDeepClone(variableDeclaration.name), void 0, ts2.getSynthesizedDeepClone(variableDeclaration.type), call)], variableDeclaration.parent.flags)));
            } else {
              var bindingElements = [];
              var typeElements = [];
              var commonNodeFlags = exposedVariableDeclarations[0].parent.flags;
              var sawExplicitType = false;
              for (var _i = 0, exposedVariableDeclarations_1 = exposedVariableDeclarations; _i < exposedVariableDeclarations_1.length; _i++) {
                var variableDeclaration = exposedVariableDeclarations_1[_i];
                bindingElements.push(ts2.factory.createBindingElement(void 0, void 0, ts2.getSynthesizedDeepClone(variableDeclaration.name)));
                var variableType = checker.typeToTypeNode(checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(variableDeclaration)), scope, 1);
                typeElements.push(ts2.factory.createPropertySignature(void 0, variableDeclaration.symbol.name, void 0, variableType));
                sawExplicitType = sawExplicitType || variableDeclaration.type !== void 0;
                commonNodeFlags = commonNodeFlags & variableDeclaration.parent.flags;
              }
              var typeLiteral = sawExplicitType ? ts2.factory.createTypeLiteralNode(typeElements) : void 0;
              if (typeLiteral) {
                ts2.setEmitFlags(typeLiteral, 1);
              }
              newNodes.push(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(ts2.factory.createObjectBindingPattern(bindingElements), void 0, typeLiteral, call)], commonNodeFlags)));
            }
          } else if (exposedVariableDeclarations.length || writes) {
            if (exposedVariableDeclarations.length) {
              for (var _c = 0, exposedVariableDeclarations_2 = exposedVariableDeclarations; _c < exposedVariableDeclarations_2.length; _c++) {
                var variableDeclaration = exposedVariableDeclarations_2[_c];
                var flags = variableDeclaration.parent.flags;
                if (flags & 2) {
                  flags = flags & ~2 | 1;
                }
                newNodes.push(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(variableDeclaration.symbol.name, void 0, getTypeDeepCloneUnionUndefined(variableDeclaration.type))], flags)));
              }
            }
            if (returnValueProperty) {
              newNodes.push(ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(returnValueProperty, void 0, getTypeDeepCloneUnionUndefined(returnType))], 1)));
            }
            var assignments = getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes);
            if (returnValueProperty) {
              assignments.unshift(ts2.factory.createShorthandPropertyAssignment(returnValueProperty));
            }
            if (assignments.length === 1) {
              ts2.Debug.assert(!returnValueProperty, "Shouldn't have returnValueProperty here");
              newNodes.push(ts2.factory.createExpressionStatement(ts2.factory.createAssignment(assignments[0].name, call)));
              if (range.facts & RangeFacts.HasReturn) {
                newNodes.push(ts2.factory.createReturnStatement());
              }
            } else {
              newNodes.push(ts2.factory.createExpressionStatement(ts2.factory.createAssignment(ts2.factory.createObjectLiteralExpression(assignments), call)));
              if (returnValueProperty) {
                newNodes.push(ts2.factory.createReturnStatement(ts2.factory.createIdentifier(returnValueProperty)));
              }
            }
          } else {
            if (range.facts & RangeFacts.HasReturn) {
              newNodes.push(ts2.factory.createReturnStatement(call));
            } else if (isReadonlyArray(range.range)) {
              newNodes.push(ts2.factory.createExpressionStatement(call));
            } else {
              newNodes.push(call);
            }
          }
          if (isReadonlyArray(range.range)) {
            changeTracker.replaceNodeRangeWithNodes(context.file, ts2.first(range.range), ts2.last(range.range), newNodes);
          } else {
            changeTracker.replaceNodeWithNodes(context.file, range.range, newNodes);
          }
          var edits = changeTracker.getChanges();
          var renameRange = isReadonlyArray(range.range) ? ts2.first(range.range) : range.range;
          var renameFilename = renameRange.getSourceFile().fileName;
          var renameLocation = ts2.getRenameLocation(edits, renameFilename, functionNameText, false);
          return { renameFilename, renameLocation, edits };
          function getTypeDeepCloneUnionUndefined(typeNode) {
            if (typeNode === void 0) {
              return void 0;
            }
            var clone = ts2.getSynthesizedDeepClone(typeNode);
            var withoutParens = clone;
            while (ts2.isParenthesizedTypeNode(withoutParens)) {
              withoutParens = withoutParens.type;
            }
            return ts2.isUnionTypeNode(withoutParens) && ts2.find(withoutParens.types, function(t) {
              return t.kind === 152;
            }) ? clone : ts2.factory.createUnionTypeNode([clone, ts2.factory.createKeywordTypeNode(152)]);
          }
        }
        function extractConstantInScope(node, scope, _a, rangeFacts, context) {
          var _b;
          var substitutions = _a.substitutions;
          var checker = context.program.getTypeChecker();
          var file = scope.getSourceFile();
          var localNameText = ts2.getUniqueName(ts2.isClassLike(scope) ? "newProperty" : "newLocal", file);
          var isJS = ts2.isInJSFile(scope);
          var variableType = isJS || !checker.isContextSensitive(node) ? void 0 : checker.typeToTypeNode(checker.getContextualType(node), scope, 1);
          var initializer = transformConstantInitializer(ts2.skipParentheses(node), substitutions);
          _b = transformFunctionInitializerAndType(variableType, initializer), variableType = _b.variableType, initializer = _b.initializer;
          ts2.suppressLeadingAndTrailingTrivia(initializer);
          var changeTracker = ts2.textChanges.ChangeTracker.fromContext(context);
          if (ts2.isClassLike(scope)) {
            ts2.Debug.assert(!isJS, "Cannot extract to a JS class");
            var modifiers = [];
            modifiers.push(ts2.factory.createModifier(121));
            if (rangeFacts & RangeFacts.InStaticRegion) {
              modifiers.push(ts2.factory.createModifier(124));
            }
            modifiers.push(ts2.factory.createModifier(144));
            var newVariable = ts2.factory.createPropertyDeclaration(void 0, modifiers, localNameText, void 0, variableType, initializer);
            var localReference = ts2.factory.createPropertyAccessExpression(rangeFacts & RangeFacts.InStaticRegion ? ts2.factory.createIdentifier(scope.name.getText()) : ts2.factory.createThis(), ts2.factory.createIdentifier(localNameText));
            if (isInJSXContent(node)) {
              localReference = ts2.factory.createJsxExpression(void 0, localReference);
            }
            var maxInsertionPos = node.pos;
            var nodeToInsertBefore = getNodeToInsertPropertyBefore(maxInsertionPos, scope);
            changeTracker.insertNodeBefore(context.file, nodeToInsertBefore, newVariable, true);
            changeTracker.replaceNode(context.file, node, localReference);
          } else {
            var newVariableDeclaration = ts2.factory.createVariableDeclaration(localNameText, void 0, variableType, initializer);
            var oldVariableDeclaration = getContainingVariableDeclarationIfInList(node, scope);
            if (oldVariableDeclaration) {
              changeTracker.insertNodeBefore(context.file, oldVariableDeclaration, newVariableDeclaration);
              var localReference = ts2.factory.createIdentifier(localNameText);
              changeTracker.replaceNode(context.file, node, localReference);
            } else if (node.parent.kind === 237 && scope === ts2.findAncestor(node, isScope)) {
              var newVariableStatement = ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([newVariableDeclaration], 2));
              changeTracker.replaceNode(context.file, node.parent, newVariableStatement);
            } else {
              var newVariableStatement = ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([newVariableDeclaration], 2));
              var nodeToInsertBefore = getNodeToInsertConstantBefore(node, scope);
              if (nodeToInsertBefore.pos === 0) {
                changeTracker.insertNodeAtTopOfFile(context.file, newVariableStatement, false);
              } else {
                changeTracker.insertNodeBefore(context.file, nodeToInsertBefore, newVariableStatement, false);
              }
              if (node.parent.kind === 237) {
                changeTracker.delete(context.file, node.parent);
              } else {
                var localReference = ts2.factory.createIdentifier(localNameText);
                if (isInJSXContent(node)) {
                  localReference = ts2.factory.createJsxExpression(void 0, localReference);
                }
                changeTracker.replaceNode(context.file, node, localReference);
              }
            }
          }
          var edits = changeTracker.getChanges();
          var renameFilename = node.getSourceFile().fileName;
          var renameLocation = ts2.getRenameLocation(edits, renameFilename, localNameText, true);
          return { renameFilename, renameLocation, edits };
          function transformFunctionInitializerAndType(variableType2, initializer2) {
            if (variableType2 === void 0)
              return { variableType: variableType2, initializer: initializer2 };
            if (!ts2.isFunctionExpression(initializer2) && !ts2.isArrowFunction(initializer2) || !!initializer2.typeParameters)
              return { variableType: variableType2, initializer: initializer2 };
            var functionType = checker.getTypeAtLocation(node);
            var functionSignature = ts2.singleOrUndefined(checker.getSignaturesOfType(functionType, 0));
            if (!functionSignature)
              return { variableType: variableType2, initializer: initializer2 };
            if (!!functionSignature.getTypeParameters())
              return { variableType: variableType2, initializer: initializer2 };
            var parameters = [];
            var hasAny = false;
            for (var _i = 0, _a2 = initializer2.parameters; _i < _a2.length; _i++) {
              var p = _a2[_i];
              if (p.type) {
                parameters.push(p);
              } else {
                var paramType = checker.getTypeAtLocation(p);
                if (paramType === checker.getAnyType())
                  hasAny = true;
                parameters.push(ts2.factory.updateParameterDeclaration(p, p.decorators, p.modifiers, p.dotDotDotToken, p.name, p.questionToken, p.type || checker.typeToTypeNode(paramType, scope, 1), p.initializer));
              }
            }
            if (hasAny)
              return { variableType: variableType2, initializer: initializer2 };
            variableType2 = void 0;
            if (ts2.isArrowFunction(initializer2)) {
              initializer2 = ts2.factory.updateArrowFunction(initializer2, node.modifiers, initializer2.typeParameters, parameters, initializer2.type || checker.typeToTypeNode(functionSignature.getReturnType(), scope, 1), initializer2.equalsGreaterThanToken, initializer2.body);
            } else {
              if (functionSignature && !!functionSignature.thisParameter) {
                var firstParameter = ts2.firstOrUndefined(parameters);
                if (!firstParameter || ts2.isIdentifier(firstParameter.name) && firstParameter.name.escapedText !== "this") {
                  var thisType = checker.getTypeOfSymbolAtLocation(functionSignature.thisParameter, node);
                  parameters.splice(0, 0, ts2.factory.createParameterDeclaration(void 0, void 0, void 0, "this", void 0, checker.typeToTypeNode(thisType, scope, 1)));
                }
              }
              initializer2 = ts2.factory.updateFunctionExpression(initializer2, node.modifiers, initializer2.asteriskToken, initializer2.name, initializer2.typeParameters, parameters, initializer2.type || checker.typeToTypeNode(functionSignature.getReturnType(), scope, 1), initializer2.body);
            }
            return { variableType: variableType2, initializer: initializer2 };
          }
        }
        function getContainingVariableDeclarationIfInList(node, scope) {
          var prevNode;
          while (node !== void 0 && node !== scope) {
            if (ts2.isVariableDeclaration(node) && node.initializer === prevNode && ts2.isVariableDeclarationList(node.parent) && node.parent.declarations.length > 1) {
              return node;
            }
            prevNode = node;
            node = node.parent;
          }
        }
        function getFirstDeclaration(type) {
          var firstDeclaration;
          var symbol = type.symbol;
          if (symbol && symbol.declarations) {
            for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
              var declaration = _a[_i];
              if (firstDeclaration === void 0 || declaration.pos < firstDeclaration.pos) {
                firstDeclaration = declaration;
              }
            }
          }
          return firstDeclaration;
        }
        function compareTypesByDeclarationOrder(_a, _b) {
          var type1 = _a.type, declaration1 = _a.declaration;
          var type2 = _b.type, declaration2 = _b.declaration;
          return ts2.compareProperties(declaration1, declaration2, "pos", ts2.compareValues) || ts2.compareStringsCaseSensitive(type1.symbol ? type1.symbol.getName() : "", type2.symbol ? type2.symbol.getName() : "") || ts2.compareValues(type1.id, type2.id);
        }
        function getCalledExpression(scope, range, functionNameText) {
          var functionReference = ts2.factory.createIdentifier(functionNameText);
          if (ts2.isClassLike(scope)) {
            var lhs = range.facts & RangeFacts.InStaticRegion ? ts2.factory.createIdentifier(scope.name.text) : ts2.factory.createThis();
            return ts2.factory.createPropertyAccessExpression(lhs, functionReference);
          } else {
            return functionReference;
          }
        }
        function transformFunctionBody(body, exposedVariableDeclarations, writes, substitutions, hasReturn) {
          var hasWritesOrVariableDeclarations = writes !== void 0 || exposedVariableDeclarations.length > 0;
          if (ts2.isBlock(body) && !hasWritesOrVariableDeclarations && substitutions.size === 0) {
            return { body: ts2.factory.createBlock(body.statements, true), returnValueProperty: void 0 };
          }
          var returnValueProperty;
          var ignoreReturns = false;
          var statements = ts2.factory.createNodeArray(ts2.isBlock(body) ? body.statements.slice(0) : [ts2.isStatement(body) ? body : ts2.factory.createReturnStatement(ts2.skipParentheses(body))]);
          if (hasWritesOrVariableDeclarations || substitutions.size) {
            var rewrittenStatements = ts2.visitNodes(statements, visitor).slice();
            if (hasWritesOrVariableDeclarations && !hasReturn && ts2.isStatement(body)) {
              var assignments = getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes);
              if (assignments.length === 1) {
                rewrittenStatements.push(ts2.factory.createReturnStatement(assignments[0].name));
              } else {
                rewrittenStatements.push(ts2.factory.createReturnStatement(ts2.factory.createObjectLiteralExpression(assignments)));
              }
            }
            return { body: ts2.factory.createBlock(rewrittenStatements, true), returnValueProperty };
          } else {
            return { body: ts2.factory.createBlock(statements, true), returnValueProperty: void 0 };
          }
          function visitor(node) {
            if (!ignoreReturns && ts2.isReturnStatement(node) && hasWritesOrVariableDeclarations) {
              var assignments2 = getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes);
              if (node.expression) {
                if (!returnValueProperty) {
                  returnValueProperty = "__return";
                }
                assignments2.unshift(ts2.factory.createPropertyAssignment(returnValueProperty, ts2.visitNode(node.expression, visitor)));
              }
              if (assignments2.length === 1) {
                return ts2.factory.createReturnStatement(assignments2[0].name);
              } else {
                return ts2.factory.createReturnStatement(ts2.factory.createObjectLiteralExpression(assignments2));
              }
            } else {
              var oldIgnoreReturns = ignoreReturns;
              ignoreReturns = ignoreReturns || ts2.isFunctionLikeDeclaration(node) || ts2.isClassLike(node);
              var substitution = substitutions.get(ts2.getNodeId(node).toString());
              var result = substitution ? ts2.getSynthesizedDeepClone(substitution) : ts2.visitEachChild(node, visitor, ts2.nullTransformationContext);
              ignoreReturns = oldIgnoreReturns;
              return result;
            }
          }
        }
        function transformConstantInitializer(initializer, substitutions) {
          return substitutions.size ? visitor(initializer) : initializer;
          function visitor(node) {
            var substitution = substitutions.get(ts2.getNodeId(node).toString());
            return substitution ? ts2.getSynthesizedDeepClone(substitution) : ts2.visitEachChild(node, visitor, ts2.nullTransformationContext);
          }
        }
        function getStatementsOrClassElements(scope) {
          if (ts2.isFunctionLikeDeclaration(scope)) {
            var body = scope.body;
            if (ts2.isBlock(body)) {
              return body.statements;
            }
          } else if (ts2.isModuleBlock(scope) || ts2.isSourceFile(scope)) {
            return scope.statements;
          } else if (ts2.isClassLike(scope)) {
            return scope.members;
          } else {
            ts2.assertType(scope);
          }
          return ts2.emptyArray;
        }
        function getNodeToInsertFunctionBefore(minPos, scope) {
          return ts2.find(getStatementsOrClassElements(scope), function(child) {
            return child.pos >= minPos && ts2.isFunctionLikeDeclaration(child) && !ts2.isConstructorDeclaration(child);
          });
        }
        function getNodeToInsertPropertyBefore(maxPos, scope) {
          var members = scope.members;
          ts2.Debug.assert(members.length > 0, "Found no members");
          var prevMember;
          var allProperties = true;
          for (var _i = 0, members_1 = members; _i < members_1.length; _i++) {
            var member = members_1[_i];
            if (member.pos > maxPos) {
              return prevMember || members[0];
            }
            if (allProperties && !ts2.isPropertyDeclaration(member)) {
              if (prevMember !== void 0) {
                return member;
              }
              allProperties = false;
            }
            prevMember = member;
          }
          if (prevMember === void 0)
            return ts2.Debug.fail();
          return prevMember;
        }
        function getNodeToInsertConstantBefore(node, scope) {
          ts2.Debug.assert(!ts2.isClassLike(scope));
          var prevScope;
          for (var curr = node; curr !== scope; curr = curr.parent) {
            if (isScope(curr)) {
              prevScope = curr;
            }
          }
          for (var curr = (prevScope || node).parent; ; curr = curr.parent) {
            if (isBlockLike(curr)) {
              var prevStatement = void 0;
              for (var _i = 0, _a = curr.statements; _i < _a.length; _i++) {
                var statement = _a[_i];
                if (statement.pos > node.pos) {
                  break;
                }
                prevStatement = statement;
              }
              if (!prevStatement && ts2.isCaseClause(curr)) {
                ts2.Debug.assert(ts2.isSwitchStatement(curr.parent.parent), "Grandparent isn't a switch statement");
                return curr.parent.parent;
              }
              return ts2.Debug.checkDefined(prevStatement, "prevStatement failed to get set");
            }
            ts2.Debug.assert(curr !== scope, "Didn't encounter a block-like before encountering scope");
          }
        }
        function getPropertyAssignmentsForWritesAndVariableDeclarations(exposedVariableDeclarations, writes) {
          var variableAssignments = ts2.map(exposedVariableDeclarations, function(v) {
            return ts2.factory.createShorthandPropertyAssignment(v.symbol.name);
          });
          var writeAssignments = ts2.map(writes, function(w) {
            return ts2.factory.createShorthandPropertyAssignment(w.symbol.name);
          });
          return variableAssignments === void 0 ? writeAssignments : writeAssignments === void 0 ? variableAssignments : variableAssignments.concat(writeAssignments);
        }
        function isReadonlyArray(v) {
          return ts2.isArray(v);
        }
        function getEnclosingTextRange(targetRange, sourceFile) {
          return isReadonlyArray(targetRange.range) ? { pos: ts2.first(targetRange.range).getStart(sourceFile), end: ts2.last(targetRange.range).getEnd() } : targetRange.range;
        }
        var Usage;
        (function(Usage2) {
          Usage2[Usage2["Read"] = 1] = "Read";
          Usage2[Usage2["Write"] = 2] = "Write";
        })(Usage || (Usage = {}));
        function collectReadsAndWrites(targetRange, scopes, enclosingTextRange, sourceFile, checker, cancellationToken) {
          var allTypeParameterUsages = new ts2.Map();
          var usagesPerScope = [];
          var substitutionsPerScope = [];
          var functionErrorsPerScope = [];
          var constantErrorsPerScope = [];
          var visibleDeclarationsInExtractedRange = [];
          var exposedVariableSymbolSet = new ts2.Map();
          var exposedVariableDeclarations = [];
          var firstExposedNonVariableDeclaration;
          var expression = !isReadonlyArray(targetRange.range) ? targetRange.range : targetRange.range.length === 1 && ts2.isExpressionStatement(targetRange.range[0]) ? targetRange.range[0].expression : void 0;
          var expressionDiagnostic;
          if (expression === void 0) {
            var statements = targetRange.range;
            var start = ts2.first(statements).getStart();
            var end = ts2.last(statements).end;
            expressionDiagnostic = ts2.createFileDiagnostic(sourceFile, start, end - start, Messages.expressionExpected);
          } else if (checker.getTypeAtLocation(expression).flags & (16384 | 131072)) {
            expressionDiagnostic = ts2.createDiagnosticForNode(expression, Messages.uselessConstantType);
          }
          for (var _i = 0, scopes_1 = scopes; _i < scopes_1.length; _i++) {
            var scope = scopes_1[_i];
            usagesPerScope.push({ usages: new ts2.Map(), typeParameterUsages: new ts2.Map(), substitutions: new ts2.Map() });
            substitutionsPerScope.push(new ts2.Map());
            functionErrorsPerScope.push([]);
            var constantErrors = [];
            if (expressionDiagnostic) {
              constantErrors.push(expressionDiagnostic);
            }
            if (ts2.isClassLike(scope) && ts2.isInJSFile(scope)) {
              constantErrors.push(ts2.createDiagnosticForNode(scope, Messages.cannotExtractToJSClass));
            }
            if (ts2.isArrowFunction(scope) && !ts2.isBlock(scope.body)) {
              constantErrors.push(ts2.createDiagnosticForNode(scope, Messages.cannotExtractToExpressionArrowFunction));
            }
            constantErrorsPerScope.push(constantErrors);
          }
          var seenUsages = new ts2.Map();
          var target = isReadonlyArray(targetRange.range) ? ts2.factory.createBlock(targetRange.range) : targetRange.range;
          var unmodifiedNode = isReadonlyArray(targetRange.range) ? ts2.first(targetRange.range) : targetRange.range;
          var inGenericContext = isInGenericContext(unmodifiedNode);
          collectUsages(target);
          if (inGenericContext && !isReadonlyArray(targetRange.range)) {
            var contextualType = checker.getContextualType(targetRange.range);
            recordTypeParameterUsages(contextualType);
          }
          if (allTypeParameterUsages.size > 0) {
            var seenTypeParameterUsages = new ts2.Map();
            var i_2 = 0;
            for (var curr = unmodifiedNode; curr !== void 0 && i_2 < scopes.length; curr = curr.parent) {
              if (curr === scopes[i_2]) {
                seenTypeParameterUsages.forEach(function(typeParameter2, id) {
                  usagesPerScope[i_2].typeParameterUsages.set(id, typeParameter2);
                });
                i_2++;
              }
              if (ts2.isDeclarationWithTypeParameters(curr)) {
                for (var _a = 0, _b = ts2.getEffectiveTypeParameterDeclarations(curr); _a < _b.length; _a++) {
                  var typeParameterDecl = _b[_a];
                  var typeParameter = checker.getTypeAtLocation(typeParameterDecl);
                  if (allTypeParameterUsages.has(typeParameter.id.toString())) {
                    seenTypeParameterUsages.set(typeParameter.id.toString(), typeParameter);
                  }
                }
              }
            }
            ts2.Debug.assert(i_2 === scopes.length, "Should have iterated all scopes");
          }
          if (visibleDeclarationsInExtractedRange.length) {
            var containingLexicalScopeOfExtraction = ts2.isBlockScope(scopes[0], scopes[0].parent) ? scopes[0] : ts2.getEnclosingBlockScopeContainer(scopes[0]);
            ts2.forEachChild(containingLexicalScopeOfExtraction, checkForUsedDeclarations);
          }
          var _loop_18 = function(i2) {
            var scopeUsages = usagesPerScope[i2];
            if (i2 > 0 && (scopeUsages.usages.size > 0 || scopeUsages.typeParameterUsages.size > 0)) {
              var errorNode = isReadonlyArray(targetRange.range) ? targetRange.range[0] : targetRange.range;
              constantErrorsPerScope[i2].push(ts2.createDiagnosticForNode(errorNode, Messages.cannotAccessVariablesFromNestedScopes));
            }
            var hasWrite = false;
            var readonlyClassPropertyWrite;
            usagesPerScope[i2].usages.forEach(function(value) {
              if (value.usage === 2) {
                hasWrite = true;
                if (value.symbol.flags & 106500 && value.symbol.valueDeclaration && ts2.hasEffectiveModifier(value.symbol.valueDeclaration, 64)) {
                  readonlyClassPropertyWrite = value.symbol.valueDeclaration;
                }
              }
            });
            ts2.Debug.assert(isReadonlyArray(targetRange.range) || exposedVariableDeclarations.length === 0, "No variable declarations expected if something was extracted");
            if (hasWrite && !isReadonlyArray(targetRange.range)) {
              var diag = ts2.createDiagnosticForNode(targetRange.range, Messages.cannotWriteInExpression);
              functionErrorsPerScope[i2].push(diag);
              constantErrorsPerScope[i2].push(diag);
            } else if (readonlyClassPropertyWrite && i2 > 0) {
              var diag = ts2.createDiagnosticForNode(readonlyClassPropertyWrite, Messages.cannotExtractReadonlyPropertyInitializerOutsideConstructor);
              functionErrorsPerScope[i2].push(diag);
              constantErrorsPerScope[i2].push(diag);
            } else if (firstExposedNonVariableDeclaration) {
              var diag = ts2.createDiagnosticForNode(firstExposedNonVariableDeclaration, Messages.cannotExtractExportedEntity);
              functionErrorsPerScope[i2].push(diag);
              constantErrorsPerScope[i2].push(diag);
            }
          };
          for (var i = 0; i < scopes.length; i++) {
            _loop_18(i);
          }
          return { target, usagesPerScope, functionErrorsPerScope, constantErrorsPerScope, exposedVariableDeclarations };
          function isInGenericContext(node) {
            return !!ts2.findAncestor(node, function(n) {
              return ts2.isDeclarationWithTypeParameters(n) && ts2.getEffectiveTypeParameterDeclarations(n).length !== 0;
            });
          }
          function recordTypeParameterUsages(type) {
            var symbolWalker = checker.getSymbolWalker(function() {
              return cancellationToken.throwIfCancellationRequested(), true;
            });
            var visitedTypes = symbolWalker.walkType(type).visitedTypes;
            for (var _i2 = 0, visitedTypes_1 = visitedTypes; _i2 < visitedTypes_1.length; _i2++) {
              var visitedType = visitedTypes_1[_i2];
              if (visitedType.isTypeParameter()) {
                allTypeParameterUsages.set(visitedType.id.toString(), visitedType);
              }
            }
          }
          function collectUsages(node, valueUsage) {
            if (valueUsage === void 0) {
              valueUsage = 1;
            }
            if (inGenericContext) {
              var type = checker.getTypeAtLocation(node);
              recordTypeParameterUsages(type);
            }
            if (ts2.isDeclaration(node) && node.symbol) {
              visibleDeclarationsInExtractedRange.push(node);
            }
            if (ts2.isAssignmentExpression(node)) {
              collectUsages(node.left, 2);
              collectUsages(node.right);
            } else if (ts2.isUnaryExpressionWithWrite(node)) {
              collectUsages(node.operand, 2);
            } else if (ts2.isPropertyAccessExpression(node) || ts2.isElementAccessExpression(node)) {
              ts2.forEachChild(node, collectUsages);
            } else if (ts2.isIdentifier(node)) {
              if (!node.parent) {
                return;
              }
              if (ts2.isQualifiedName(node.parent) && node !== node.parent.left) {
                return;
              }
              if (ts2.isPropertyAccessExpression(node.parent) && node !== node.parent.expression) {
                return;
              }
              recordUsage(node, valueUsage, ts2.isPartOfTypeNode(node));
            } else {
              ts2.forEachChild(node, collectUsages);
            }
          }
          function recordUsage(n, usage, isTypeNode) {
            var symbolId = recordUsagebySymbol(n, usage, isTypeNode);
            if (symbolId) {
              for (var i2 = 0; i2 < scopes.length; i2++) {
                var substitution = substitutionsPerScope[i2].get(symbolId);
                if (substitution) {
                  usagesPerScope[i2].substitutions.set(ts2.getNodeId(n).toString(), substitution);
                }
              }
            }
          }
          function recordUsagebySymbol(identifier, usage, isTypeName) {
            var symbol = getSymbolReferencedByIdentifier(identifier);
            if (!symbol) {
              return void 0;
            }
            var symbolId = ts2.getSymbolId(symbol).toString();
            var lastUsage = seenUsages.get(symbolId);
            if (lastUsage && lastUsage >= usage) {
              return symbolId;
            }
            seenUsages.set(symbolId, usage);
            if (lastUsage) {
              for (var _i2 = 0, usagesPerScope_1 = usagesPerScope; _i2 < usagesPerScope_1.length; _i2++) {
                var perScope = usagesPerScope_1[_i2];
                var prevEntry = perScope.usages.get(identifier.text);
                if (prevEntry) {
                  perScope.usages.set(identifier.text, { usage, symbol, node: identifier });
                }
              }
              return symbolId;
            }
            var decls = symbol.getDeclarations();
            var declInFile = decls && ts2.find(decls, function(d) {
              return d.getSourceFile() === sourceFile;
            });
            if (!declInFile) {
              return void 0;
            }
            if (ts2.rangeContainsStartEnd(enclosingTextRange, declInFile.getStart(), declInFile.end)) {
              return void 0;
            }
            if (targetRange.facts & RangeFacts.IsGenerator && usage === 2) {
              var diag = ts2.createDiagnosticForNode(identifier, Messages.cannotExtractRangeThatContainsWritesToReferencesLocatedOutsideOfTheTargetRangeInGenerators);
              for (var _a2 = 0, functionErrorsPerScope_1 = functionErrorsPerScope; _a2 < functionErrorsPerScope_1.length; _a2++) {
                var errors = functionErrorsPerScope_1[_a2];
                errors.push(diag);
              }
              for (var _b2 = 0, constantErrorsPerScope_1 = constantErrorsPerScope; _b2 < constantErrorsPerScope_1.length; _b2++) {
                var errors = constantErrorsPerScope_1[_b2];
                errors.push(diag);
              }
            }
            for (var i2 = 0; i2 < scopes.length; i2++) {
              var scope2 = scopes[i2];
              var resolvedSymbol = checker.resolveName(symbol.name, scope2, symbol.flags, false);
              if (resolvedSymbol === symbol) {
                continue;
              }
              if (!substitutionsPerScope[i2].has(symbolId)) {
                var substitution = tryReplaceWithQualifiedNameOrPropertyAccess(symbol.exportSymbol || symbol, scope2, isTypeName);
                if (substitution) {
                  substitutionsPerScope[i2].set(symbolId, substitution);
                } else if (isTypeName) {
                  if (!(symbol.flags & 262144)) {
                    var diag = ts2.createDiagnosticForNode(identifier, Messages.typeWillNotBeVisibleInTheNewScope);
                    functionErrorsPerScope[i2].push(diag);
                    constantErrorsPerScope[i2].push(diag);
                  }
                } else {
                  usagesPerScope[i2].usages.set(identifier.text, { usage, symbol, node: identifier });
                }
              }
            }
            return symbolId;
          }
          function checkForUsedDeclarations(node) {
            if (node === targetRange.range || isReadonlyArray(targetRange.range) && targetRange.range.indexOf(node) >= 0) {
              return;
            }
            var sym = ts2.isIdentifier(node) ? getSymbolReferencedByIdentifier(node) : checker.getSymbolAtLocation(node);
            if (sym) {
              var decl = ts2.find(visibleDeclarationsInExtractedRange, function(d) {
                return d.symbol === sym;
              });
              if (decl) {
                if (ts2.isVariableDeclaration(decl)) {
                  var idString = decl.symbol.id.toString();
                  if (!exposedVariableSymbolSet.has(idString)) {
                    exposedVariableDeclarations.push(decl);
                    exposedVariableSymbolSet.set(idString, true);
                  }
                } else {
                  firstExposedNonVariableDeclaration = firstExposedNonVariableDeclaration || decl;
                }
              }
            }
            ts2.forEachChild(node, checkForUsedDeclarations);
          }
          function getSymbolReferencedByIdentifier(identifier) {
            return identifier.parent && ts2.isShorthandPropertyAssignment(identifier.parent) && identifier.parent.name === identifier ? checker.getShorthandAssignmentValueSymbol(identifier.parent) : checker.getSymbolAtLocation(identifier);
          }
          function tryReplaceWithQualifiedNameOrPropertyAccess(symbol, scopeDecl, isTypeNode) {
            if (!symbol) {
              return void 0;
            }
            var decls = symbol.getDeclarations();
            if (decls && decls.some(function(d) {
              return d.parent === scopeDecl;
            })) {
              return ts2.factory.createIdentifier(symbol.name);
            }
            var prefix = tryReplaceWithQualifiedNameOrPropertyAccess(symbol.parent, scopeDecl, isTypeNode);
            if (prefix === void 0) {
              return void 0;
            }
            return isTypeNode ? ts2.factory.createQualifiedName(prefix, ts2.factory.createIdentifier(symbol.name)) : ts2.factory.createPropertyAccessExpression(prefix, symbol.name);
          }
        }
        function getExtractableParent(node) {
          return ts2.findAncestor(node, function(node2) {
            return node2.parent && isExtractableExpression(node2) && !ts2.isBinaryExpression(node2.parent);
          });
        }
        function isExtractableExpression(node) {
          var parent = node.parent;
          switch (parent.kind) {
            case 297:
              return false;
          }
          switch (node.kind) {
            case 10:
              return parent.kind !== 265 && parent.kind !== 269;
            case 224:
            case 200:
            case 202:
              return false;
            case 79:
              return parent.kind !== 202 && parent.kind !== 269 && parent.kind !== 274;
          }
          return true;
        }
        function isBlockLike(node) {
          switch (node.kind) {
            case 234:
            case 303:
            case 261:
            case 288:
              return true;
            default:
              return false;
          }
        }
        function isInJSXContent(node) {
          return (ts2.isJsxElement(node) || ts2.isJsxSelfClosingElement(node) || ts2.isJsxFragment(node)) && (ts2.isJsxElement(node.parent) || ts2.isJsxFragment(node.parent));
        }
      })(extractSymbol = refactor2.extractSymbol || (refactor2.extractSymbol = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var refactorName = "Extract type";
      var extractToTypeAliasAction = {
        name: "Extract to type alias",
        description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_type_alias),
        kind: "refactor.extract.type"
      };
      var extractToInterfaceAction = {
        name: "Extract to interface",
        description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_interface),
        kind: "refactor.extract.interface"
      };
      var extractToTypeDefAction = {
        name: "Extract to typedef",
        description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_to_typedef),
        kind: "refactor.extract.typedef"
      };
      refactor2.registerRefactor(refactorName, {
        kinds: [
          extractToTypeAliasAction.kind,
          extractToInterfaceAction.kind,
          extractToTypeDefAction.kind
        ],
        getAvailableActions: function(context) {
          var info = getRangeToExtract(context, context.triggerReason === "invoked");
          if (!info)
            return ts2.emptyArray;
          if (!refactor2.isRefactorErrorInfo(info)) {
            return [{
              name: refactorName,
              description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_type),
              actions: info.isJS ? [extractToTypeDefAction] : ts2.append([extractToTypeAliasAction], info.typeElements && extractToInterfaceAction)
            }];
          }
          if (context.preferences.provideRefactorNotApplicableReason) {
            return [{
              name: refactorName,
              description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Extract_type),
              actions: [
                __assign(__assign({}, extractToTypeDefAction), { notApplicableReason: info.error }),
                __assign(__assign({}, extractToTypeAliasAction), { notApplicableReason: info.error }),
                __assign(__assign({}, extractToInterfaceAction), { notApplicableReason: info.error })
              ]
            }];
          }
          return ts2.emptyArray;
        },
        getEditsForAction: function(context, actionName) {
          var file = context.file;
          var info = getRangeToExtract(context);
          ts2.Debug.assert(info && !refactor2.isRefactorErrorInfo(info), "Expected to find a range to extract");
          var name = ts2.getUniqueName("NewType", file);
          var edits = ts2.textChanges.ChangeTracker.with(context, function(changes) {
            switch (actionName) {
              case extractToTypeAliasAction.name:
                ts2.Debug.assert(!info.isJS, "Invalid actionName/JS combo");
                return doTypeAliasChange(changes, file, name, info);
              case extractToTypeDefAction.name:
                ts2.Debug.assert(info.isJS, "Invalid actionName/JS combo");
                return doTypedefChange(changes, file, name, info);
              case extractToInterfaceAction.name:
                ts2.Debug.assert(!info.isJS && !!info.typeElements, "Invalid actionName/JS combo");
                return doInterfaceChange(changes, file, name, info);
              default:
                ts2.Debug.fail("Unexpected action name");
            }
          });
          var renameFilename = file.fileName;
          var renameLocation = ts2.getRenameLocation(edits, renameFilename, name, false);
          return { edits, renameFilename, renameLocation };
        }
      });
      function getRangeToExtract(context, considerEmptySpans) {
        if (considerEmptySpans === void 0) {
          considerEmptySpans = true;
        }
        var file = context.file, startPosition = context.startPosition;
        var isJS = ts2.isSourceFileJS(file);
        var current = ts2.getTokenAtPosition(file, startPosition);
        var range = ts2.createTextRangeFromSpan(ts2.getRefactorContextSpan(context));
        var cursorRequest = range.pos === range.end && considerEmptySpans;
        var selection = ts2.findAncestor(current, function(node) {
          return node.parent && ts2.isTypeNode(node) && !rangeContainsSkipTrivia(range, node.parent, file) && (cursorRequest || ts2.nodeOverlapsWithStartEnd(current, file, range.pos, range.end));
        });
        if (!selection || !ts2.isTypeNode(selection))
          return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Selection_is_not_a_valid_type_node) };
        var checker = context.program.getTypeChecker();
        var firstStatement = ts2.Debug.checkDefined(ts2.findAncestor(selection, ts2.isStatement), "Should find a statement");
        var typeParameters = collectTypeParameters(checker, selection, firstStatement, file);
        if (!typeParameters)
          return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.No_type_could_be_extracted_from_this_type_node) };
        var typeElements = flattenTypeLiteralNodeReference(checker, selection);
        return { isJS, selection, firstStatement, typeParameters, typeElements };
      }
      function flattenTypeLiteralNodeReference(checker, node) {
        if (!node)
          return void 0;
        if (ts2.isIntersectionTypeNode(node)) {
          var result = [];
          var seen_1 = new ts2.Map();
          for (var _i = 0, _a = node.types; _i < _a.length; _i++) {
            var type = _a[_i];
            var flattenedTypeMembers = flattenTypeLiteralNodeReference(checker, type);
            if (!flattenedTypeMembers || !flattenedTypeMembers.every(function(type2) {
              return type2.name && ts2.addToSeen(seen_1, ts2.getNameFromPropertyName(type2.name));
            })) {
              return void 0;
            }
            ts2.addRange(result, flattenedTypeMembers);
          }
          return result;
        } else if (ts2.isParenthesizedTypeNode(node)) {
          return flattenTypeLiteralNodeReference(checker, node.type);
        } else if (ts2.isTypeLiteralNode(node)) {
          return node.members;
        }
        return void 0;
      }
      function rangeContainsSkipTrivia(r1, node, file) {
        return ts2.rangeContainsStartEnd(r1, ts2.skipTrivia(file.text, node.pos), node.end);
      }
      function collectTypeParameters(checker, selection, statement, file) {
        var result = [];
        return visitor(selection) ? void 0 : result;
        function visitor(node) {
          var _a;
          if (ts2.isTypeReferenceNode(node)) {
            if (ts2.isIdentifier(node.typeName)) {
              var symbol = checker.resolveName(node.typeName.text, node.typeName, 262144, true);
              var declaration = ts2.tryCast((_a = symbol === null || symbol === void 0 ? void 0 : symbol.declarations) === null || _a === void 0 ? void 0 : _a[0], ts2.isTypeParameterDeclaration);
              if (declaration) {
                if (rangeContainsSkipTrivia(statement, declaration, file) && !rangeContainsSkipTrivia(selection, declaration, file)) {
                  ts2.pushIfUnique(result, declaration);
                }
              }
            }
          } else if (ts2.isInferTypeNode(node)) {
            var conditionalTypeNode = ts2.findAncestor(node, function(n) {
              return ts2.isConditionalTypeNode(n) && rangeContainsSkipTrivia(n.extendsType, node, file);
            });
            if (!conditionalTypeNode || !rangeContainsSkipTrivia(selection, conditionalTypeNode, file)) {
              return true;
            }
          } else if (ts2.isTypePredicateNode(node) || ts2.isThisTypeNode(node)) {
            var functionLikeNode = ts2.findAncestor(node.parent, ts2.isFunctionLike);
            if (functionLikeNode && functionLikeNode.type && rangeContainsSkipTrivia(functionLikeNode.type, node, file) && !rangeContainsSkipTrivia(selection, functionLikeNode, file)) {
              return true;
            }
          } else if (ts2.isTypeQueryNode(node)) {
            if (ts2.isIdentifier(node.exprName)) {
              var symbol = checker.resolveName(node.exprName.text, node.exprName, 111551, false);
              if ((symbol === null || symbol === void 0 ? void 0 : symbol.valueDeclaration) && rangeContainsSkipTrivia(statement, symbol.valueDeclaration, file) && !rangeContainsSkipTrivia(selection, symbol.valueDeclaration, file)) {
                return true;
              }
            } else {
              if (ts2.isThisIdentifier(node.exprName.left) && !rangeContainsSkipTrivia(selection, node.parent, file)) {
                return true;
              }
            }
          }
          if (file && ts2.isTupleTypeNode(node) && ts2.getLineAndCharacterOfPosition(file, node.pos).line === ts2.getLineAndCharacterOfPosition(file, node.end).line) {
            ts2.setEmitFlags(node, 1);
          }
          return ts2.forEachChild(node, visitor);
        }
      }
      function doTypeAliasChange(changes, file, name, info) {
        var firstStatement = info.firstStatement, selection = info.selection, typeParameters = info.typeParameters;
        var newTypeNode = ts2.factory.createTypeAliasDeclaration(void 0, void 0, name, typeParameters.map(function(id) {
          return ts2.factory.updateTypeParameterDeclaration(id, id.name, id.constraint, void 0);
        }), selection);
        changes.insertNodeBefore(file, firstStatement, ts2.ignoreSourceNewlines(newTypeNode), true);
        changes.replaceNode(file, selection, ts2.factory.createTypeReferenceNode(name, typeParameters.map(function(id) {
          return ts2.factory.createTypeReferenceNode(id.name, void 0);
        })), { leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.Exclude, trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.ExcludeWhitespace });
      }
      function doInterfaceChange(changes, file, name, info) {
        var _a;
        var firstStatement = info.firstStatement, selection = info.selection, typeParameters = info.typeParameters, typeElements = info.typeElements;
        var newTypeNode = ts2.factory.createInterfaceDeclaration(void 0, void 0, name, typeParameters, void 0, typeElements);
        ts2.setTextRange(newTypeNode, (_a = typeElements[0]) === null || _a === void 0 ? void 0 : _a.parent);
        changes.insertNodeBefore(file, firstStatement, ts2.ignoreSourceNewlines(newTypeNode), true);
        changes.replaceNode(file, selection, ts2.factory.createTypeReferenceNode(name, typeParameters.map(function(id) {
          return ts2.factory.createTypeReferenceNode(id.name, void 0);
        })), { leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.Exclude, trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.ExcludeWhitespace });
      }
      function doTypedefChange(changes, file, name, info) {
        var firstStatement = info.firstStatement, selection = info.selection, typeParameters = info.typeParameters;
        var node = ts2.factory.createJSDocTypedefTag(ts2.factory.createIdentifier("typedef"), ts2.factory.createJSDocTypeExpression(selection), ts2.factory.createIdentifier(name));
        var templates = [];
        ts2.forEach(typeParameters, function(typeParameter) {
          var constraint = ts2.getEffectiveConstraintOfTypeParameter(typeParameter);
          var parameter = ts2.factory.createTypeParameterDeclaration(typeParameter.name);
          var template = ts2.factory.createJSDocTemplateTag(ts2.factory.createIdentifier("template"), constraint && ts2.cast(constraint, ts2.isJSDocTypeExpression), [parameter]);
          templates.push(template);
        });
        changes.insertNodeBefore(file, firstStatement, ts2.factory.createJSDocComment(void 0, ts2.factory.createNodeArray(ts2.concatenate(templates, [node]))), true);
        changes.replaceNode(file, selection, ts2.factory.createTypeReferenceNode(name, typeParameters.map(function(id) {
          return ts2.factory.createTypeReferenceNode(id.name, void 0);
        })));
      }
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var generateGetAccessorAndSetAccessor;
      (function(generateGetAccessorAndSetAccessor2) {
        var actionName = "Generate 'get' and 'set' accessors";
        var actionDescription = ts2.Diagnostics.Generate_get_and_set_accessors.message;
        var generateGetSetAction = {
          name: actionName,
          description: actionDescription,
          kind: "refactor.rewrite.property.generateAccessors"
        };
        refactor2.registerRefactor(actionName, {
          kinds: [generateGetSetAction.kind],
          getEditsForAction: function(context, actionName2) {
            if (!context.endPosition)
              return void 0;
            var info = ts2.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.program, context.startPosition, context.endPosition);
            ts2.Debug.assert(info && !refactor2.isRefactorErrorInfo(info), "Expected applicable refactor info");
            var edits = ts2.codefix.generateAccessorFromProperty(context.file, context.program, context.startPosition, context.endPosition, context, actionName2);
            if (!edits)
              return void 0;
            var renameFilename = context.file.fileName;
            var nameNeedRename = info.renameAccessor ? info.accessorName : info.fieldName;
            var renameLocationOffset = ts2.isIdentifier(nameNeedRename) ? 0 : -1;
            var renameLocation = renameLocationOffset + ts2.getRenameLocation(edits, renameFilename, nameNeedRename.text, ts2.isParameter(info.declaration));
            return { renameFilename, renameLocation, edits };
          },
          getAvailableActions: function(context) {
            if (!context.endPosition)
              return ts2.emptyArray;
            var info = ts2.codefix.getAccessorConvertiblePropertyAtPosition(context.file, context.program, context.startPosition, context.endPosition, context.triggerReason === "invoked");
            if (!info)
              return ts2.emptyArray;
            if (!refactor2.isRefactorErrorInfo(info)) {
              return [{
                name: actionName,
                description: actionDescription,
                actions: [generateGetSetAction]
              }];
            }
            if (context.preferences.provideRefactorNotApplicableReason) {
              return [{
                name: actionName,
                description: actionDescription,
                actions: [__assign(__assign({}, generateGetSetAction), { notApplicableReason: info.error })]
              }];
            }
            return ts2.emptyArray;
          }
        });
      })(generateGetAccessorAndSetAccessor = refactor2.generateGetAccessorAndSetAccessor || (refactor2.generateGetAccessorAndSetAccessor = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      ;
      function isRefactorErrorInfo(info) {
        return info.error !== void 0;
      }
      refactor2.isRefactorErrorInfo = isRefactorErrorInfo;
      function refactorKindBeginsWith(known, requested) {
        if (!requested)
          return true;
        return known.substr(0, requested.length) === requested;
      }
      refactor2.refactorKindBeginsWith = refactorKindBeginsWith;
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var refactorName = "Move to a new file";
      var description = ts2.getLocaleSpecificMessage(ts2.Diagnostics.Move_to_a_new_file);
      var moveToNewFileAction = {
        name: refactorName,
        description,
        kind: "refactor.move.newFile"
      };
      refactor2.registerRefactor(refactorName, {
        kinds: [moveToNewFileAction.kind],
        getAvailableActions: function(context) {
          var statements = getStatementsToMove(context);
          if (context.preferences.allowTextChangesInNewFiles && statements) {
            return [{ name: refactorName, description, actions: [moveToNewFileAction] }];
          }
          if (context.preferences.provideRefactorNotApplicableReason) {
            return [{
              name: refactorName,
              description,
              actions: [__assign(__assign({}, moveToNewFileAction), { notApplicableReason: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Selection_is_not_a_valid_statement_or_statements) })]
            }];
          }
          return ts2.emptyArray;
        },
        getEditsForAction: function(context, actionName) {
          ts2.Debug.assert(actionName === refactorName, "Wrong refactor invoked");
          var statements = ts2.Debug.checkDefined(getStatementsToMove(context));
          var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
            return doChange(context.file, context.program, statements, t, context.host, context.preferences);
          });
          return { edits, renameFilename: void 0, renameLocation: void 0 };
        }
      });
      function getRangeToMove(context) {
        var file = context.file;
        var range = ts2.createTextRangeFromSpan(ts2.getRefactorContextSpan(context));
        var statements = file.statements;
        var startNodeIndex = ts2.findIndex(statements, function(s) {
          return s.end > range.pos;
        });
        if (startNodeIndex === -1)
          return void 0;
        var startStatement = statements[startNodeIndex];
        if (ts2.isNamedDeclaration(startStatement) && startStatement.name && ts2.rangeContainsRange(startStatement.name, range)) {
          return { toMove: [statements[startNodeIndex]], afterLast: statements[startNodeIndex + 1] };
        }
        if (range.pos > startStatement.getStart(file))
          return void 0;
        var afterEndNodeIndex = ts2.findIndex(statements, function(s) {
          return s.end > range.end;
        }, startNodeIndex);
        if (afterEndNodeIndex !== -1 && (afterEndNodeIndex === 0 || statements[afterEndNodeIndex].getStart(file) < range.end))
          return void 0;
        return {
          toMove: statements.slice(startNodeIndex, afterEndNodeIndex === -1 ? statements.length : afterEndNodeIndex),
          afterLast: afterEndNodeIndex === -1 ? void 0 : statements[afterEndNodeIndex]
        };
      }
      function doChange(oldFile, program, toMove, changes, host, preferences) {
        var checker = program.getTypeChecker();
        var usage = getUsageInfo(oldFile, toMove.all, checker);
        var currentDirectory = ts2.getDirectoryPath(oldFile.fileName);
        var extension = ts2.extensionFromPath(oldFile.fileName);
        var newModuleName = makeUniqueModuleName(getNewModuleName(usage.movedSymbols), extension, currentDirectory, host);
        var newFileNameWithExtension = newModuleName + extension;
        changes.createNewFile(oldFile, ts2.combinePaths(currentDirectory, newFileNameWithExtension), getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, newModuleName, preferences));
        addNewFileToTsconfig(program, changes, oldFile.fileName, newFileNameWithExtension, ts2.hostGetCanonicalFileName(host));
      }
      function getStatementsToMove(context) {
        var rangeToMove = getRangeToMove(context);
        if (rangeToMove === void 0)
          return void 0;
        var all = [];
        var ranges = [];
        var toMove = rangeToMove.toMove, afterLast = rangeToMove.afterLast;
        ts2.getRangesWhere(toMove, isAllowedStatementToMove, function(start, afterEndIndex) {
          for (var i = start; i < afterEndIndex; i++)
            all.push(toMove[i]);
          ranges.push({ first: toMove[start], afterLast });
        });
        return all.length === 0 ? void 0 : { all, ranges };
      }
      function isAllowedStatementToMove(statement) {
        return !isPureImport(statement) && !ts2.isPrologueDirective(statement);
        ;
      }
      function isPureImport(node) {
        switch (node.kind) {
          case 265:
            return true;
          case 264:
            return !ts2.hasSyntacticModifier(node, 1);
          case 236:
            return node.declarationList.declarations.every(function(d) {
              return !!d.initializer && ts2.isRequireCall(d.initializer, true);
            });
          default:
            return false;
        }
      }
      function addNewFileToTsconfig(program, changes, oldFileName, newFileNameWithExtension, getCanonicalFileName) {
        var cfg = program.getCompilerOptions().configFile;
        if (!cfg)
          return;
        var newFileAbsolutePath = ts2.normalizePath(ts2.combinePaths(oldFileName, "..", newFileNameWithExtension));
        var newFilePath = ts2.getRelativePathFromFile(cfg.fileName, newFileAbsolutePath, getCanonicalFileName);
        var cfgObject = cfg.statements[0] && ts2.tryCast(cfg.statements[0].expression, ts2.isObjectLiteralExpression);
        var filesProp = cfgObject && ts2.find(cfgObject.properties, function(prop) {
          return ts2.isPropertyAssignment(prop) && ts2.isStringLiteral(prop.name) && prop.name.text === "files";
        });
        if (filesProp && ts2.isArrayLiteralExpression(filesProp.initializer)) {
          changes.insertNodeInListAfter(cfg, ts2.last(filesProp.initializer.elements), ts2.factory.createStringLiteral(newFilePath), filesProp.initializer.elements);
        }
      }
      function getNewStatementsAndRemoveFromOldFile(oldFile, usage, changes, toMove, program, newModuleName, preferences) {
        var checker = program.getTypeChecker();
        var prologueDirectives = ts2.takeWhile(oldFile.statements, ts2.isPrologueDirective);
        if (!oldFile.externalModuleIndicator && !oldFile.commonJsModuleIndicator) {
          deleteMovedStatements(oldFile, toMove.ranges, changes);
          return __spreadArray(__spreadArray([], prologueDirectives, true), toMove.all, true);
        }
        var useEsModuleSyntax = !!oldFile.externalModuleIndicator;
        var quotePreference = ts2.getQuotePreference(oldFile, preferences);
        var importsFromNewFile = createOldFileImportsFromNewFile(usage.oldFileImportsFromNewFile, newModuleName, useEsModuleSyntax, quotePreference);
        if (importsFromNewFile) {
          ts2.insertImports(changes, oldFile, importsFromNewFile, true);
        }
        deleteUnusedOldImports(oldFile, toMove.all, changes, usage.unusedImportsFromOldFile, checker);
        deleteMovedStatements(oldFile, toMove.ranges, changes);
        updateImportsInOtherFiles(changes, program, oldFile, usage.movedSymbols, newModuleName);
        var imports = getNewFileImportsAndAddExportInOldFile(oldFile, usage.oldImportsNeededByNewFile, usage.newFileImportsFromOldFile, changes, checker, useEsModuleSyntax, quotePreference);
        var body = addExports(oldFile, toMove.all, usage.oldFileImportsFromNewFile, useEsModuleSyntax);
        if (imports.length && body.length) {
          return __spreadArray(__spreadArray(__spreadArray(__spreadArray([], prologueDirectives, true), imports, true), [
            4
          ], false), body, true);
        }
        return __spreadArray(__spreadArray(__spreadArray([], prologueDirectives, true), imports, true), body, true);
      }
      function deleteMovedStatements(sourceFile, moved, changes) {
        for (var _i = 0, moved_1 = moved; _i < moved_1.length; _i++) {
          var _a = moved_1[_i], first_1 = _a.first, afterLast = _a.afterLast;
          changes.deleteNodeRangeExcludingEnd(sourceFile, first_1, afterLast);
        }
      }
      function deleteUnusedOldImports(oldFile, toMove, changes, toDelete, checker) {
        for (var _i = 0, _a = oldFile.statements; _i < _a.length; _i++) {
          var statement = _a[_i];
          if (ts2.contains(toMove, statement))
            continue;
          forEachImportInStatement(statement, function(i) {
            return deleteUnusedImports(oldFile, i, changes, function(name) {
              return toDelete.has(checker.getSymbolAtLocation(name));
            });
          });
        }
      }
      function updateImportsInOtherFiles(changes, program, oldFile, movedSymbols, newModuleName) {
        var checker = program.getTypeChecker();
        var _loop_19 = function(sourceFile2) {
          if (sourceFile2 === oldFile)
            return "continue";
          var _loop_20 = function(statement2) {
            forEachImportInStatement(statement2, function(importNode) {
              if (checker.getSymbolAtLocation(moduleSpecifierFromImport(importNode)) !== oldFile.symbol)
                return;
              var shouldMove = function(name) {
                var symbol = ts2.isBindingElement(name.parent) ? ts2.getPropertySymbolFromBindingElement(checker, name.parent) : ts2.skipAlias(checker.getSymbolAtLocation(name), checker);
                return !!symbol && movedSymbols.has(symbol);
              };
              deleteUnusedImports(sourceFile2, importNode, changes, shouldMove);
              var newModuleSpecifier = ts2.combinePaths(ts2.getDirectoryPath(moduleSpecifierFromImport(importNode).text), newModuleName);
              var newImportDeclaration = filterImport(importNode, ts2.factory.createStringLiteral(newModuleSpecifier), shouldMove);
              if (newImportDeclaration)
                changes.insertNodeAfter(sourceFile2, statement2, newImportDeclaration);
              var ns = getNamespaceLikeImport(importNode);
              if (ns)
                updateNamespaceLikeImport(changes, sourceFile2, checker, movedSymbols, newModuleName, newModuleSpecifier, ns, importNode);
            });
          };
          for (var _b = 0, _c = sourceFile2.statements; _b < _c.length; _b++) {
            var statement = _c[_b];
            _loop_20(statement);
          }
        };
        for (var _i = 0, _a = program.getSourceFiles(); _i < _a.length; _i++) {
          var sourceFile = _a[_i];
          _loop_19(sourceFile);
        }
      }
      function getNamespaceLikeImport(node) {
        switch (node.kind) {
          case 265:
            return node.importClause && node.importClause.namedBindings && node.importClause.namedBindings.kind === 267 ? node.importClause.namedBindings.name : void 0;
          case 264:
            return node.name;
          case 253:
            return ts2.tryCast(node.name, ts2.isIdentifier);
          default:
            return ts2.Debug.assertNever(node, "Unexpected node kind ".concat(node.kind));
        }
      }
      function updateNamespaceLikeImport(changes, sourceFile, checker, movedSymbols, newModuleName, newModuleSpecifier, oldImportId, oldImportNode) {
        var preferredNewNamespaceName = ts2.codefix.moduleSpecifierToValidIdentifier(newModuleName, 99);
        var needUniqueName = false;
        var toChange = [];
        ts2.FindAllReferences.Core.eachSymbolReferenceInFile(oldImportId, checker, sourceFile, function(ref2) {
          if (!ts2.isPropertyAccessExpression(ref2.parent))
            return;
          needUniqueName = needUniqueName || !!checker.resolveName(preferredNewNamespaceName, ref2, 67108863, true);
          if (movedSymbols.has(checker.getSymbolAtLocation(ref2.parent.name))) {
            toChange.push(ref2);
          }
        });
        if (toChange.length) {
          var newNamespaceName = needUniqueName ? ts2.getUniqueName(preferredNewNamespaceName, sourceFile) : preferredNewNamespaceName;
          for (var _i = 0, toChange_1 = toChange; _i < toChange_1.length; _i++) {
            var ref = toChange_1[_i];
            changes.replaceNode(sourceFile, ref, ts2.factory.createIdentifier(newNamespaceName));
          }
          changes.insertNodeAfter(sourceFile, oldImportNode, updateNamespaceLikeImportNode(oldImportNode, newModuleName, newModuleSpecifier));
        }
      }
      function updateNamespaceLikeImportNode(node, newNamespaceName, newModuleSpecifier) {
        var newNamespaceId = ts2.factory.createIdentifier(newNamespaceName);
        var newModuleString = ts2.factory.createStringLiteral(newModuleSpecifier);
        switch (node.kind) {
          case 265:
            return ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, void 0, ts2.factory.createNamespaceImport(newNamespaceId)), newModuleString, void 0);
          case 264:
            return ts2.factory.createImportEqualsDeclaration(void 0, void 0, false, newNamespaceId, ts2.factory.createExternalModuleReference(newModuleString));
          case 253:
            return ts2.factory.createVariableDeclaration(newNamespaceId, void 0, void 0, createRequireCall(newModuleString));
          default:
            return ts2.Debug.assertNever(node, "Unexpected node kind ".concat(node.kind));
        }
      }
      function moduleSpecifierFromImport(i) {
        return i.kind === 265 ? i.moduleSpecifier : i.kind === 264 ? i.moduleReference.expression : i.initializer.arguments[0];
      }
      function forEachImportInStatement(statement, cb) {
        if (ts2.isImportDeclaration(statement)) {
          if (ts2.isStringLiteral(statement.moduleSpecifier))
            cb(statement);
        } else if (ts2.isImportEqualsDeclaration(statement)) {
          if (ts2.isExternalModuleReference(statement.moduleReference) && ts2.isStringLiteralLike(statement.moduleReference.expression)) {
            cb(statement);
          }
        } else if (ts2.isVariableStatement(statement)) {
          for (var _i = 0, _a = statement.declarationList.declarations; _i < _a.length; _i++) {
            var decl = _a[_i];
            if (decl.initializer && ts2.isRequireCall(decl.initializer, true)) {
              cb(decl);
            }
          }
        }
      }
      function createOldFileImportsFromNewFile(newFileNeedExport, newFileNameWithExtension, useEs6Imports, quotePreference) {
        var defaultImport;
        var imports = [];
        newFileNeedExport.forEach(function(symbol) {
          if (symbol.escapedName === "default") {
            defaultImport = ts2.factory.createIdentifier(ts2.symbolNameNoDefault(symbol));
          } else {
            imports.push(symbol.name);
          }
        });
        return makeImportOrRequire(defaultImport, imports, newFileNameWithExtension, useEs6Imports, quotePreference);
      }
      function makeImportOrRequire(defaultImport, imports, path, useEs6Imports, quotePreference) {
        path = ts2.ensurePathIsNonModuleName(path);
        if (useEs6Imports) {
          var specifiers = imports.map(function(i) {
            return ts2.factory.createImportSpecifier(false, void 0, ts2.factory.createIdentifier(i));
          });
          return ts2.makeImportIfNecessary(defaultImport, specifiers, path, quotePreference);
        } else {
          ts2.Debug.assert(!defaultImport, "No default import should exist");
          var bindingElements = imports.map(function(i) {
            return ts2.factory.createBindingElement(void 0, void 0, i);
          });
          return bindingElements.length ? makeVariableStatement(ts2.factory.createObjectBindingPattern(bindingElements), void 0, createRequireCall(ts2.factory.createStringLiteral(path))) : void 0;
        }
      }
      function makeVariableStatement(name, type, initializer, flags) {
        if (flags === void 0) {
          flags = 2;
        }
        return ts2.factory.createVariableStatement(void 0, ts2.factory.createVariableDeclarationList([ts2.factory.createVariableDeclaration(name, void 0, type, initializer)], flags));
      }
      function createRequireCall(moduleSpecifier) {
        return ts2.factory.createCallExpression(ts2.factory.createIdentifier("require"), void 0, [moduleSpecifier]);
      }
      function addExports(sourceFile, toMove, needExport, useEs6Exports) {
        return ts2.flatMap(toMove, function(statement) {
          if (isTopLevelDeclarationStatement(statement) && !isExported(sourceFile, statement, useEs6Exports) && forEachTopLevelDeclaration(statement, function(d) {
            return needExport.has(ts2.Debug.checkDefined(d.symbol));
          })) {
            var exports = addExport(statement, useEs6Exports);
            if (exports)
              return exports;
          }
          return statement;
        });
      }
      function deleteUnusedImports(sourceFile, importDecl, changes, isUnused) {
        switch (importDecl.kind) {
          case 265:
            deleteUnusedImportsInDeclaration(sourceFile, importDecl, changes, isUnused);
            break;
          case 264:
            if (isUnused(importDecl.name)) {
              changes.delete(sourceFile, importDecl);
            }
            break;
          case 253:
            deleteUnusedImportsInVariableDeclaration(sourceFile, importDecl, changes, isUnused);
            break;
          default:
            ts2.Debug.assertNever(importDecl, "Unexpected import decl kind ".concat(importDecl.kind));
        }
      }
      function deleteUnusedImportsInDeclaration(sourceFile, importDecl, changes, isUnused) {
        if (!importDecl.importClause)
          return;
        var _a = importDecl.importClause, name = _a.name, namedBindings = _a.namedBindings;
        var defaultUnused = !name || isUnused(name);
        var namedBindingsUnused = !namedBindings || (namedBindings.kind === 267 ? isUnused(namedBindings.name) : namedBindings.elements.length !== 0 && namedBindings.elements.every(function(e) {
          return isUnused(e.name);
        }));
        if (defaultUnused && namedBindingsUnused) {
          changes.delete(sourceFile, importDecl);
        } else {
          if (name && defaultUnused) {
            changes.delete(sourceFile, name);
          }
          if (namedBindings) {
            if (namedBindingsUnused) {
              changes.replaceNode(sourceFile, importDecl.importClause, ts2.factory.updateImportClause(importDecl.importClause, importDecl.importClause.isTypeOnly, name, void 0));
            } else if (namedBindings.kind === 268) {
              for (var _i = 0, _b = namedBindings.elements; _i < _b.length; _i++) {
                var element = _b[_i];
                if (isUnused(element.name))
                  changes.delete(sourceFile, element);
              }
            }
          }
        }
      }
      function deleteUnusedImportsInVariableDeclaration(sourceFile, varDecl, changes, isUnused) {
        var name = varDecl.name;
        switch (name.kind) {
          case 79:
            if (isUnused(name)) {
              changes.delete(sourceFile, name);
            }
            break;
          case 201:
            break;
          case 200:
            if (name.elements.every(function(e) {
              return ts2.isIdentifier(e.name) && isUnused(e.name);
            })) {
              changes.delete(sourceFile, ts2.isVariableDeclarationList(varDecl.parent) && varDecl.parent.declarations.length === 1 ? varDecl.parent.parent : varDecl);
            } else {
              for (var _i = 0, _a = name.elements; _i < _a.length; _i++) {
                var element = _a[_i];
                if (ts2.isIdentifier(element.name) && isUnused(element.name)) {
                  changes.delete(sourceFile, element.name);
                }
              }
            }
            break;
        }
      }
      function getNewFileImportsAndAddExportInOldFile(oldFile, importsToCopy, newFileImportsFromOldFile, changes, checker, useEsModuleSyntax, quotePreference) {
        var copiedOldImports = [];
        for (var _i = 0, _a = oldFile.statements; _i < _a.length; _i++) {
          var oldStatement = _a[_i];
          forEachImportInStatement(oldStatement, function(i) {
            ts2.append(copiedOldImports, filterImport(i, moduleSpecifierFromImport(i), function(name) {
              return importsToCopy.has(checker.getSymbolAtLocation(name));
            }));
          });
        }
        var oldFileDefault;
        var oldFileNamedImports = [];
        var markSeenTop = ts2.nodeSeenTracker();
        newFileImportsFromOldFile.forEach(function(symbol) {
          if (!symbol.declarations) {
            return;
          }
          for (var _i2 = 0, _a2 = symbol.declarations; _i2 < _a2.length; _i2++) {
            var decl = _a2[_i2];
            if (!isTopLevelDeclaration(decl))
              continue;
            var name = nameOfTopLevelDeclaration(decl);
            if (!name)
              continue;
            var top = getTopLevelDeclarationStatement(decl);
            if (markSeenTop(top)) {
              addExportToChanges(oldFile, top, name, changes, useEsModuleSyntax);
            }
            if (ts2.hasSyntacticModifier(decl, 512)) {
              oldFileDefault = name;
            } else {
              oldFileNamedImports.push(name.text);
            }
          }
        });
        ts2.append(copiedOldImports, makeImportOrRequire(oldFileDefault, oldFileNamedImports, ts2.removeFileExtension(ts2.getBaseFileName(oldFile.fileName)), useEsModuleSyntax, quotePreference));
        return copiedOldImports;
      }
      function makeUniqueModuleName(moduleName, extension, inDirectory, host) {
        var newModuleName = moduleName;
        for (var i = 1; ; i++) {
          var name = ts2.combinePaths(inDirectory, newModuleName + extension);
          if (!host.fileExists(name))
            return newModuleName;
          newModuleName = "".concat(moduleName, ".").concat(i);
        }
      }
      function getNewModuleName(movedSymbols) {
        return movedSymbols.forEachEntry(ts2.symbolNameNoDefault) || "newFile";
      }
      function getUsageInfo(oldFile, toMove, checker) {
        var movedSymbols = new SymbolSet();
        var oldImportsNeededByNewFile = new SymbolSet();
        var newFileImportsFromOldFile = new SymbolSet();
        var containsJsx = ts2.find(toMove, function(statement2) {
          return !!(statement2.transformFlags & 2);
        });
        var jsxNamespaceSymbol = getJsxNamespaceSymbol(containsJsx);
        if (jsxNamespaceSymbol) {
          oldImportsNeededByNewFile.add(jsxNamespaceSymbol);
        }
        for (var _i = 0, toMove_1 = toMove; _i < toMove_1.length; _i++) {
          var statement = toMove_1[_i];
          forEachTopLevelDeclaration(statement, function(decl) {
            movedSymbols.add(ts2.Debug.checkDefined(ts2.isExpressionStatement(decl) ? checker.getSymbolAtLocation(decl.expression.left) : decl.symbol, "Need a symbol here"));
          });
        }
        for (var _a = 0, toMove_2 = toMove; _a < toMove_2.length; _a++) {
          var statement = toMove_2[_a];
          forEachReference(statement, checker, function(symbol) {
            if (!symbol.declarations)
              return;
            for (var _i2 = 0, _a2 = symbol.declarations; _i2 < _a2.length; _i2++) {
              var decl = _a2[_i2];
              if (isInImport(decl)) {
                oldImportsNeededByNewFile.add(symbol);
              } else if (isTopLevelDeclaration(decl) && sourceFileOfTopLevelDeclaration(decl) === oldFile && !movedSymbols.has(symbol)) {
                newFileImportsFromOldFile.add(symbol);
              }
            }
          });
        }
        var unusedImportsFromOldFile = oldImportsNeededByNewFile.clone();
        var oldFileImportsFromNewFile = new SymbolSet();
        for (var _b = 0, _c = oldFile.statements; _b < _c.length; _b++) {
          var statement = _c[_b];
          if (ts2.contains(toMove, statement))
            continue;
          if (jsxNamespaceSymbol && !!(statement.transformFlags & 2)) {
            unusedImportsFromOldFile.delete(jsxNamespaceSymbol);
          }
          forEachReference(statement, checker, function(symbol) {
            if (movedSymbols.has(symbol))
              oldFileImportsFromNewFile.add(symbol);
            unusedImportsFromOldFile.delete(symbol);
          });
        }
        return { movedSymbols, newFileImportsFromOldFile, oldFileImportsFromNewFile, oldImportsNeededByNewFile, unusedImportsFromOldFile };
        function getJsxNamespaceSymbol(containsJsx2) {
          if (containsJsx2 === void 0) {
            return void 0;
          }
          var jsxNamespace = checker.getJsxNamespace(containsJsx2);
          var jsxNamespaceSymbol2 = checker.resolveName(jsxNamespace, containsJsx2, 1920, true);
          return !!jsxNamespaceSymbol2 && ts2.some(jsxNamespaceSymbol2.declarations, isInImport) ? jsxNamespaceSymbol2 : void 0;
        }
      }
      function isInImport(decl) {
        switch (decl.kind) {
          case 264:
          case 269:
          case 266:
          case 267:
            return true;
          case 253:
            return isVariableDeclarationInImport(decl);
          case 202:
            return ts2.isVariableDeclaration(decl.parent.parent) && isVariableDeclarationInImport(decl.parent.parent);
          default:
            return false;
        }
      }
      function isVariableDeclarationInImport(decl) {
        return ts2.isSourceFile(decl.parent.parent.parent) && !!decl.initializer && ts2.isRequireCall(decl.initializer, true);
      }
      function filterImport(i, moduleSpecifier, keep) {
        switch (i.kind) {
          case 265: {
            var clause = i.importClause;
            if (!clause)
              return void 0;
            var defaultImport = clause.name && keep(clause.name) ? clause.name : void 0;
            var namedBindings = clause.namedBindings && filterNamedBindings(clause.namedBindings, keep);
            return defaultImport || namedBindings ? ts2.factory.createImportDeclaration(void 0, void 0, ts2.factory.createImportClause(false, defaultImport, namedBindings), moduleSpecifier, void 0) : void 0;
          }
          case 264:
            return keep(i.name) ? i : void 0;
          case 253: {
            var name = filterBindingName(i.name, keep);
            return name ? makeVariableStatement(name, i.type, createRequireCall(moduleSpecifier), i.parent.flags) : void 0;
          }
          default:
            return ts2.Debug.assertNever(i, "Unexpected import kind ".concat(i.kind));
        }
      }
      function filterNamedBindings(namedBindings, keep) {
        if (namedBindings.kind === 267) {
          return keep(namedBindings.name) ? namedBindings : void 0;
        } else {
          var newElements = namedBindings.elements.filter(function(e) {
            return keep(e.name);
          });
          return newElements.length ? ts2.factory.createNamedImports(newElements) : void 0;
        }
      }
      function filterBindingName(name, keep) {
        switch (name.kind) {
          case 79:
            return keep(name) ? name : void 0;
          case 201:
            return name;
          case 200: {
            var newElements = name.elements.filter(function(prop) {
              return prop.propertyName || !ts2.isIdentifier(prop.name) || keep(prop.name);
            });
            return newElements.length ? ts2.factory.createObjectBindingPattern(newElements) : void 0;
          }
        }
      }
      function forEachReference(node, checker, onReference) {
        node.forEachChild(function cb(node2) {
          if (ts2.isIdentifier(node2) && !ts2.isDeclarationName(node2)) {
            var sym = checker.getSymbolAtLocation(node2);
            if (sym)
              onReference(sym);
          } else {
            node2.forEachChild(cb);
          }
        });
      }
      var SymbolSet = function() {
        function SymbolSet2() {
          this.map = new ts2.Map();
        }
        SymbolSet2.prototype.add = function(symbol) {
          this.map.set(String(ts2.getSymbolId(symbol)), symbol);
        };
        SymbolSet2.prototype.has = function(symbol) {
          return this.map.has(String(ts2.getSymbolId(symbol)));
        };
        SymbolSet2.prototype.delete = function(symbol) {
          this.map.delete(String(ts2.getSymbolId(symbol)));
        };
        SymbolSet2.prototype.forEach = function(cb) {
          this.map.forEach(cb);
        };
        SymbolSet2.prototype.forEachEntry = function(cb) {
          return ts2.forEachEntry(this.map, cb);
        };
        SymbolSet2.prototype.clone = function() {
          var clone = new SymbolSet2();
          ts2.copyEntries(this.map, clone.map);
          return clone;
        };
        return SymbolSet2;
      }();
      function isTopLevelDeclaration(node) {
        return isNonVariableTopLevelDeclaration(node) && ts2.isSourceFile(node.parent) || ts2.isVariableDeclaration(node) && ts2.isSourceFile(node.parent.parent.parent);
      }
      function sourceFileOfTopLevelDeclaration(node) {
        return ts2.isVariableDeclaration(node) ? node.parent.parent.parent : node.parent;
      }
      function isTopLevelDeclarationStatement(node) {
        ts2.Debug.assert(ts2.isSourceFile(node.parent), "Node parent should be a SourceFile");
        return isNonVariableTopLevelDeclaration(node) || ts2.isVariableStatement(node);
      }
      function isNonVariableTopLevelDeclaration(node) {
        switch (node.kind) {
          case 255:
          case 256:
          case 260:
          case 259:
          case 258:
          case 257:
          case 264:
            return true;
          default:
            return false;
        }
      }
      function forEachTopLevelDeclaration(statement, cb) {
        switch (statement.kind) {
          case 255:
          case 256:
          case 260:
          case 259:
          case 258:
          case 257:
          case 264:
            return cb(statement);
          case 236:
            return ts2.firstDefined(statement.declarationList.declarations, function(decl) {
              return forEachTopLevelDeclarationInBindingName(decl.name, cb);
            });
          case 237: {
            var expression = statement.expression;
            return ts2.isBinaryExpression(expression) && ts2.getAssignmentDeclarationKind(expression) === 1 ? cb(statement) : void 0;
          }
        }
      }
      function forEachTopLevelDeclarationInBindingName(name, cb) {
        switch (name.kind) {
          case 79:
            return cb(ts2.cast(name.parent, function(x) {
              return ts2.isVariableDeclaration(x) || ts2.isBindingElement(x);
            }));
          case 201:
          case 200:
            return ts2.firstDefined(name.elements, function(em) {
              return ts2.isOmittedExpression(em) ? void 0 : forEachTopLevelDeclarationInBindingName(em.name, cb);
            });
          default:
            return ts2.Debug.assertNever(name, "Unexpected name kind ".concat(name.kind));
        }
      }
      function nameOfTopLevelDeclaration(d) {
        return ts2.isExpressionStatement(d) ? ts2.tryCast(d.expression.left.name, ts2.isIdentifier) : ts2.tryCast(d.name, ts2.isIdentifier);
      }
      function getTopLevelDeclarationStatement(d) {
        switch (d.kind) {
          case 253:
            return d.parent.parent;
          case 202:
            return getTopLevelDeclarationStatement(ts2.cast(d.parent.parent, function(p) {
              return ts2.isVariableDeclaration(p) || ts2.isBindingElement(p);
            }));
          default:
            return d;
        }
      }
      function addExportToChanges(sourceFile, decl, name, changes, useEs6Exports) {
        if (isExported(sourceFile, decl, useEs6Exports, name))
          return;
        if (useEs6Exports) {
          if (!ts2.isExpressionStatement(decl))
            changes.insertExportModifier(sourceFile, decl);
        } else {
          var names = getNamesToExportInCommonJS(decl);
          if (names.length !== 0)
            changes.insertNodesAfter(sourceFile, decl, names.map(createExportAssignment));
        }
      }
      function isExported(sourceFile, decl, useEs6Exports, name) {
        var _a;
        if (useEs6Exports) {
          return !ts2.isExpressionStatement(decl) && ts2.hasSyntacticModifier(decl, 1) || !!(name && ((_a = sourceFile.symbol.exports) === null || _a === void 0 ? void 0 : _a.has(name.escapedText)));
        }
        return getNamesToExportInCommonJS(decl).some(function(name2) {
          return sourceFile.symbol.exports.has(ts2.escapeLeadingUnderscores(name2));
        });
      }
      function addExport(decl, useEs6Exports) {
        return useEs6Exports ? [addEs6Export(decl)] : addCommonjsExport(decl);
      }
      function addEs6Export(d) {
        var modifiers = ts2.concatenate([ts2.factory.createModifier(93)], d.modifiers);
        switch (d.kind) {
          case 255:
            return ts2.factory.updateFunctionDeclaration(d, d.decorators, modifiers, d.asteriskToken, d.name, d.typeParameters, d.parameters, d.type, d.body);
          case 256:
            return ts2.factory.updateClassDeclaration(d, d.decorators, modifiers, d.name, d.typeParameters, d.heritageClauses, d.members);
          case 236:
            return ts2.factory.updateVariableStatement(d, modifiers, d.declarationList);
          case 260:
            return ts2.factory.updateModuleDeclaration(d, d.decorators, modifiers, d.name, d.body);
          case 259:
            return ts2.factory.updateEnumDeclaration(d, d.decorators, modifiers, d.name, d.members);
          case 258:
            return ts2.factory.updateTypeAliasDeclaration(d, d.decorators, modifiers, d.name, d.typeParameters, d.type);
          case 257:
            return ts2.factory.updateInterfaceDeclaration(d, d.decorators, modifiers, d.name, d.typeParameters, d.heritageClauses, d.members);
          case 264:
            return ts2.factory.updateImportEqualsDeclaration(d, d.decorators, modifiers, d.isTypeOnly, d.name, d.moduleReference);
          case 237:
            return ts2.Debug.fail();
          default:
            return ts2.Debug.assertNever(d, "Unexpected declaration kind ".concat(d.kind));
        }
      }
      function addCommonjsExport(decl) {
        return __spreadArray([decl], getNamesToExportInCommonJS(decl).map(createExportAssignment), true);
      }
      function getNamesToExportInCommonJS(decl) {
        switch (decl.kind) {
          case 255:
          case 256:
            return [decl.name.text];
          case 236:
            return ts2.mapDefined(decl.declarationList.declarations, function(d) {
              return ts2.isIdentifier(d.name) ? d.name.text : void 0;
            });
          case 260:
          case 259:
          case 258:
          case 257:
          case 264:
            return ts2.emptyArray;
          case 237:
            return ts2.Debug.fail("Can't export an ExpressionStatement");
          default:
            return ts2.Debug.assertNever(decl, "Unexpected decl kind ".concat(decl.kind));
        }
      }
      function createExportAssignment(name) {
        return ts2.factory.createExpressionStatement(ts2.factory.createBinaryExpression(ts2.factory.createPropertyAccessExpression(ts2.factory.createIdentifier("exports"), ts2.factory.createIdentifier(name)), 63, ts2.factory.createIdentifier(name)));
      }
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var addOrRemoveBracesToArrowFunction;
      (function(addOrRemoveBracesToArrowFunction2) {
        var refactorName = "Add or remove braces in an arrow function";
        var refactorDescription = ts2.Diagnostics.Add_or_remove_braces_in_an_arrow_function.message;
        var addBracesAction = {
          name: "Add braces to arrow function",
          description: ts2.Diagnostics.Add_braces_to_arrow_function.message,
          kind: "refactor.rewrite.arrow.braces.add"
        };
        var removeBracesAction = {
          name: "Remove braces from arrow function",
          description: ts2.Diagnostics.Remove_braces_from_arrow_function.message,
          kind: "refactor.rewrite.arrow.braces.remove"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [removeBracesAction.kind],
          getEditsForAction,
          getAvailableActions
        });
        function getAvailableActions(context) {
          var file = context.file, startPosition = context.startPosition, triggerReason = context.triggerReason;
          var info = getConvertibleArrowFunctionAtPosition(file, startPosition, triggerReason === "invoked");
          if (!info)
            return ts2.emptyArray;
          if (!refactor2.isRefactorErrorInfo(info)) {
            return [{
              name: refactorName,
              description: refactorDescription,
              actions: [
                info.addBraces ? addBracesAction : removeBracesAction
              ]
            }];
          }
          if (context.preferences.provideRefactorNotApplicableReason) {
            return [{
              name: refactorName,
              description: refactorDescription,
              actions: [
                __assign(__assign({}, addBracesAction), { notApplicableReason: info.error }),
                __assign(__assign({}, removeBracesAction), { notApplicableReason: info.error })
              ]
            }];
          }
          return ts2.emptyArray;
        }
        function getEditsForAction(context, actionName) {
          var file = context.file, startPosition = context.startPosition;
          var info = getConvertibleArrowFunctionAtPosition(file, startPosition);
          ts2.Debug.assert(info && !refactor2.isRefactorErrorInfo(info), "Expected applicable refactor info");
          var expression = info.expression, returnStatement = info.returnStatement, func = info.func;
          var body;
          if (actionName === addBracesAction.name) {
            var returnStatement_1 = ts2.factory.createReturnStatement(expression);
            body = ts2.factory.createBlock([returnStatement_1], true);
            ts2.copyLeadingComments(expression, returnStatement_1, file, 3, true);
          } else if (actionName === removeBracesAction.name && returnStatement) {
            var actualExpression = expression || ts2.factory.createVoidZero();
            body = ts2.needsParentheses(actualExpression) ? ts2.factory.createParenthesizedExpression(actualExpression) : actualExpression;
            ts2.copyTrailingAsLeadingComments(returnStatement, body, file, 3, false);
            ts2.copyLeadingComments(returnStatement, body, file, 3, false);
            ts2.copyTrailingComments(returnStatement, body, file, 3, false);
          } else {
            ts2.Debug.fail("invalid action");
          }
          var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
            t.replaceNode(file, func.body, body);
          });
          return { renameFilename: void 0, renameLocation: void 0, edits };
        }
        function getConvertibleArrowFunctionAtPosition(file, startPosition, considerFunctionBodies, kind) {
          if (considerFunctionBodies === void 0) {
            considerFunctionBodies = true;
          }
          var node = ts2.getTokenAtPosition(file, startPosition);
          var func = ts2.getContainingFunction(node);
          if (!func) {
            return {
              error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_find_a_containing_arrow_function)
            };
          }
          if (!ts2.isArrowFunction(func)) {
            return {
              error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Containing_function_is_not_an_arrow_function)
            };
          }
          if (!ts2.rangeContainsRange(func, node) || ts2.rangeContainsRange(func.body, node) && !considerFunctionBodies) {
            return void 0;
          }
          if (refactor2.refactorKindBeginsWith(addBracesAction.kind, kind) && ts2.isExpression(func.body)) {
            return { func, addBraces: true, expression: func.body };
          } else if (refactor2.refactorKindBeginsWith(removeBracesAction.kind, kind) && ts2.isBlock(func.body) && func.body.statements.length === 1) {
            var firstStatement = ts2.first(func.body.statements);
            if (ts2.isReturnStatement(firstStatement)) {
              return { func, addBraces: false, expression: firstStatement.expression, returnStatement: firstStatement };
            }
          }
          return void 0;
        }
      })(addOrRemoveBracesToArrowFunction = refactor2.addOrRemoveBracesToArrowFunction || (refactor2.addOrRemoveBracesToArrowFunction = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var convertParamsToDestructuredObject;
      (function(convertParamsToDestructuredObject2) {
        var refactorName = "Convert parameters to destructured object";
        var minimumParameterLength = 2;
        var refactorDescription = ts2.getLocaleSpecificMessage(ts2.Diagnostics.Convert_parameters_to_destructured_object);
        var toDestructuredAction = {
          name: refactorName,
          description: refactorDescription,
          kind: "refactor.rewrite.parameters.toDestructured"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [toDestructuredAction.kind],
          getEditsForAction,
          getAvailableActions
        });
        function getAvailableActions(context) {
          var file = context.file, startPosition = context.startPosition;
          var isJSFile = ts2.isSourceFileJS(file);
          if (isJSFile)
            return ts2.emptyArray;
          var functionDeclaration = getFunctionDeclarationAtPosition(file, startPosition, context.program.getTypeChecker());
          if (!functionDeclaration)
            return ts2.emptyArray;
          return [{
            name: refactorName,
            description: refactorDescription,
            actions: [toDestructuredAction]
          }];
        }
        function getEditsForAction(context, actionName) {
          ts2.Debug.assert(actionName === refactorName, "Unexpected action name");
          var file = context.file, startPosition = context.startPosition, program = context.program, cancellationToken = context.cancellationToken, host = context.host;
          var functionDeclaration = getFunctionDeclarationAtPosition(file, startPosition, program.getTypeChecker());
          if (!functionDeclaration || !cancellationToken)
            return void 0;
          var groupedReferences = getGroupedReferences(functionDeclaration, program, cancellationToken);
          if (groupedReferences.valid) {
            var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return doChange(file, program, host, t, functionDeclaration, groupedReferences);
            });
            return { renameFilename: void 0, renameLocation: void 0, edits };
          }
          return { edits: [] };
        }
        function doChange(sourceFile, program, host, changes, functionDeclaration, groupedReferences) {
          var signature = groupedReferences.signature;
          var newFunctionDeclarationParams = ts2.map(createNewParameters(functionDeclaration, program, host), function(param) {
            return ts2.getSynthesizedDeepClone(param);
          });
          if (signature) {
            var newSignatureParams = ts2.map(createNewParameters(signature, program, host), function(param) {
              return ts2.getSynthesizedDeepClone(param);
            });
            replaceParameters(signature, newSignatureParams);
          }
          replaceParameters(functionDeclaration, newFunctionDeclarationParams);
          var functionCalls = ts2.sortAndDeduplicate(groupedReferences.functionCalls, function(a, b) {
            return ts2.compareValues(a.pos, b.pos);
          });
          for (var _i = 0, functionCalls_1 = functionCalls; _i < functionCalls_1.length; _i++) {
            var call = functionCalls_1[_i];
            if (call.arguments && call.arguments.length) {
              var newArgument = ts2.getSynthesizedDeepClone(createNewArgument(functionDeclaration, call.arguments), true);
              changes.replaceNodeRange(ts2.getSourceFileOfNode(call), ts2.first(call.arguments), ts2.last(call.arguments), newArgument, { leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.IncludeAll, trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Include });
            }
          }
          function replaceParameters(declarationOrSignature, parameterDeclarations) {
            changes.replaceNodeRangeWithNodes(sourceFile, ts2.first(declarationOrSignature.parameters), ts2.last(declarationOrSignature.parameters), parameterDeclarations, {
              joiner: ", ",
              indentation: 0,
              leadingTriviaOption: ts2.textChanges.LeadingTriviaOption.IncludeAll,
              trailingTriviaOption: ts2.textChanges.TrailingTriviaOption.Include
            });
          }
        }
        function getGroupedReferences(functionDeclaration, program, cancellationToken) {
          var functionNames = getFunctionNames(functionDeclaration);
          var classNames = ts2.isConstructorDeclaration(functionDeclaration) ? getClassNames(functionDeclaration) : [];
          var names = ts2.deduplicate(__spreadArray(__spreadArray([], functionNames, true), classNames, true), ts2.equateValues);
          var checker = program.getTypeChecker();
          var references = ts2.flatMap(names, function(name) {
            return ts2.FindAllReferences.getReferenceEntriesForNode(-1, name, program, program.getSourceFiles(), cancellationToken);
          });
          var groupedReferences = groupReferences(references);
          if (!ts2.every(groupedReferences.declarations, function(decl) {
            return ts2.contains(names, decl);
          })) {
            groupedReferences.valid = false;
          }
          return groupedReferences;
          function groupReferences(referenceEntries) {
            var classReferences = { accessExpressions: [], typeUsages: [] };
            var groupedReferences2 = { functionCalls: [], declarations: [], classReferences, valid: true };
            var functionSymbols = ts2.map(functionNames, getSymbolTargetAtLocation);
            var classSymbols = ts2.map(classNames, getSymbolTargetAtLocation);
            var isConstructor = ts2.isConstructorDeclaration(functionDeclaration);
            var contextualSymbols = ts2.map(functionNames, function(name) {
              return getSymbolForContextualType(name, checker);
            });
            for (var _i = 0, referenceEntries_1 = referenceEntries; _i < referenceEntries_1.length; _i++) {
              var entry = referenceEntries_1[_i];
              if (entry.kind === 0) {
                groupedReferences2.valid = false;
                continue;
              }
              if (ts2.contains(contextualSymbols, getSymbolTargetAtLocation(entry.node))) {
                if (isValidMethodSignature(entry.node.parent)) {
                  groupedReferences2.signature = entry.node.parent;
                  continue;
                }
                var call = entryToFunctionCall(entry);
                if (call) {
                  groupedReferences2.functionCalls.push(call);
                  continue;
                }
              }
              var contextualSymbol = getSymbolForContextualType(entry.node, checker);
              if (contextualSymbol && ts2.contains(contextualSymbols, contextualSymbol)) {
                var decl = entryToDeclaration(entry);
                if (decl) {
                  groupedReferences2.declarations.push(decl);
                  continue;
                }
              }
              if (ts2.contains(functionSymbols, getSymbolTargetAtLocation(entry.node)) || ts2.isNewExpressionTarget(entry.node)) {
                var importOrExportReference = entryToImportOrExport(entry);
                if (importOrExportReference) {
                  continue;
                }
                var decl = entryToDeclaration(entry);
                if (decl) {
                  groupedReferences2.declarations.push(decl);
                  continue;
                }
                var call = entryToFunctionCall(entry);
                if (call) {
                  groupedReferences2.functionCalls.push(call);
                  continue;
                }
              }
              if (isConstructor && ts2.contains(classSymbols, getSymbolTargetAtLocation(entry.node))) {
                var importOrExportReference = entryToImportOrExport(entry);
                if (importOrExportReference) {
                  continue;
                }
                var decl = entryToDeclaration(entry);
                if (decl) {
                  groupedReferences2.declarations.push(decl);
                  continue;
                }
                var accessExpression = entryToAccessExpression(entry);
                if (accessExpression) {
                  classReferences.accessExpressions.push(accessExpression);
                  continue;
                }
                if (ts2.isClassDeclaration(functionDeclaration.parent)) {
                  var type = entryToType(entry);
                  if (type) {
                    classReferences.typeUsages.push(type);
                    continue;
                  }
                }
              }
              groupedReferences2.valid = false;
            }
            return groupedReferences2;
          }
          function getSymbolTargetAtLocation(node) {
            var symbol = checker.getSymbolAtLocation(node);
            return symbol && ts2.getSymbolTarget(symbol, checker);
          }
        }
        function getSymbolForContextualType(node, checker) {
          var element = ts2.getContainingObjectLiteralElement(node);
          if (element) {
            var contextualType = checker.getContextualTypeForObjectLiteralElement(element);
            var symbol = contextualType === null || contextualType === void 0 ? void 0 : contextualType.getSymbol();
            if (symbol && !(ts2.getCheckFlags(symbol) & 6)) {
              return symbol;
            }
          }
        }
        function entryToImportOrExport(entry) {
          var node = entry.node;
          if (ts2.isImportSpecifier(node.parent) || ts2.isImportClause(node.parent) || ts2.isImportEqualsDeclaration(node.parent) || ts2.isNamespaceImport(node.parent)) {
            return node;
          }
          if (ts2.isExportSpecifier(node.parent) || ts2.isExportAssignment(node.parent)) {
            return node;
          }
          return void 0;
        }
        function entryToDeclaration(entry) {
          if (ts2.isDeclaration(entry.node.parent)) {
            return entry.node;
          }
          return void 0;
        }
        function entryToFunctionCall(entry) {
          if (entry.node.parent) {
            var functionReference = entry.node;
            var parent = functionReference.parent;
            switch (parent.kind) {
              case 207:
              case 208:
                var callOrNewExpression = ts2.tryCast(parent, ts2.isCallOrNewExpression);
                if (callOrNewExpression && callOrNewExpression.expression === functionReference) {
                  return callOrNewExpression;
                }
                break;
              case 205:
                var propertyAccessExpression = ts2.tryCast(parent, ts2.isPropertyAccessExpression);
                if (propertyAccessExpression && propertyAccessExpression.parent && propertyAccessExpression.name === functionReference) {
                  var callOrNewExpression_1 = ts2.tryCast(propertyAccessExpression.parent, ts2.isCallOrNewExpression);
                  if (callOrNewExpression_1 && callOrNewExpression_1.expression === propertyAccessExpression) {
                    return callOrNewExpression_1;
                  }
                }
                break;
              case 206:
                var elementAccessExpression = ts2.tryCast(parent, ts2.isElementAccessExpression);
                if (elementAccessExpression && elementAccessExpression.parent && elementAccessExpression.argumentExpression === functionReference) {
                  var callOrNewExpression_2 = ts2.tryCast(elementAccessExpression.parent, ts2.isCallOrNewExpression);
                  if (callOrNewExpression_2 && callOrNewExpression_2.expression === elementAccessExpression) {
                    return callOrNewExpression_2;
                  }
                }
                break;
            }
          }
          return void 0;
        }
        function entryToAccessExpression(entry) {
          if (entry.node.parent) {
            var reference = entry.node;
            var parent = reference.parent;
            switch (parent.kind) {
              case 205:
                var propertyAccessExpression = ts2.tryCast(parent, ts2.isPropertyAccessExpression);
                if (propertyAccessExpression && propertyAccessExpression.expression === reference) {
                  return propertyAccessExpression;
                }
                break;
              case 206:
                var elementAccessExpression = ts2.tryCast(parent, ts2.isElementAccessExpression);
                if (elementAccessExpression && elementAccessExpression.expression === reference) {
                  return elementAccessExpression;
                }
                break;
            }
          }
          return void 0;
        }
        function entryToType(entry) {
          var reference = entry.node;
          if (ts2.getMeaningFromLocation(reference) === 2 || ts2.isExpressionWithTypeArgumentsInClassExtendsClause(reference.parent)) {
            return reference;
          }
          return void 0;
        }
        function getFunctionDeclarationAtPosition(file, startPosition, checker) {
          var node = ts2.getTouchingToken(file, startPosition);
          var functionDeclaration = ts2.getContainingFunctionDeclaration(node);
          if (isTopLevelJSDoc(node))
            return void 0;
          if (functionDeclaration && isValidFunctionDeclaration(functionDeclaration, checker) && ts2.rangeContainsRange(functionDeclaration, node) && !(functionDeclaration.body && ts2.rangeContainsRange(functionDeclaration.body, node)))
            return functionDeclaration;
          return void 0;
        }
        function isTopLevelJSDoc(node) {
          var containingJSDoc = ts2.findAncestor(node, ts2.isJSDocNode);
          if (containingJSDoc) {
            var containingNonJSDoc = ts2.findAncestor(containingJSDoc, function(n) {
              return !ts2.isJSDocNode(n);
            });
            return !!containingNonJSDoc && ts2.isFunctionLikeDeclaration(containingNonJSDoc);
          }
          return false;
        }
        function isValidMethodSignature(node) {
          return ts2.isMethodSignature(node) && (ts2.isInterfaceDeclaration(node.parent) || ts2.isTypeLiteralNode(node.parent));
        }
        function isValidFunctionDeclaration(functionDeclaration, checker) {
          var _a;
          if (!isValidParameterNodeArray(functionDeclaration.parameters, checker))
            return false;
          switch (functionDeclaration.kind) {
            case 255:
              return hasNameOrDefault(functionDeclaration) && isSingleImplementation(functionDeclaration, checker);
            case 168:
              if (ts2.isObjectLiteralExpression(functionDeclaration.parent)) {
                var contextualSymbol = getSymbolForContextualType(functionDeclaration.name, checker);
                return ((_a = contextualSymbol === null || contextualSymbol === void 0 ? void 0 : contextualSymbol.declarations) === null || _a === void 0 ? void 0 : _a.length) === 1 && isSingleImplementation(functionDeclaration, checker);
              }
              return isSingleImplementation(functionDeclaration, checker);
            case 170:
              if (ts2.isClassDeclaration(functionDeclaration.parent)) {
                return hasNameOrDefault(functionDeclaration.parent) && isSingleImplementation(functionDeclaration, checker);
              } else {
                return isValidVariableDeclaration(functionDeclaration.parent.parent) && isSingleImplementation(functionDeclaration, checker);
              }
            case 212:
            case 213:
              return isValidVariableDeclaration(functionDeclaration.parent);
          }
          return false;
        }
        function isSingleImplementation(functionDeclaration, checker) {
          return !!functionDeclaration.body && !checker.isImplementationOfOverload(functionDeclaration);
        }
        function hasNameOrDefault(functionOrClassDeclaration) {
          if (!functionOrClassDeclaration.name) {
            var defaultKeyword = ts2.findModifier(functionOrClassDeclaration, 88);
            return !!defaultKeyword;
          }
          return true;
        }
        function isValidParameterNodeArray(parameters, checker) {
          return getRefactorableParametersLength(parameters) >= minimumParameterLength && ts2.every(parameters, function(paramDecl) {
            return isValidParameterDeclaration(paramDecl, checker);
          });
        }
        function isValidParameterDeclaration(parameterDeclaration, checker) {
          if (ts2.isRestParameter(parameterDeclaration)) {
            var type = checker.getTypeAtLocation(parameterDeclaration);
            if (!checker.isArrayType(type) && !checker.isTupleType(type))
              return false;
          }
          return !parameterDeclaration.modifiers && !parameterDeclaration.decorators && ts2.isIdentifier(parameterDeclaration.name);
        }
        function isValidVariableDeclaration(node) {
          return ts2.isVariableDeclaration(node) && ts2.isVarConst(node) && ts2.isIdentifier(node.name) && !node.type;
        }
        function hasThisParameter(parameters) {
          return parameters.length > 0 && ts2.isThis(parameters[0].name);
        }
        function getRefactorableParametersLength(parameters) {
          if (hasThisParameter(parameters)) {
            return parameters.length - 1;
          }
          return parameters.length;
        }
        function getRefactorableParameters(parameters) {
          if (hasThisParameter(parameters)) {
            parameters = ts2.factory.createNodeArray(parameters.slice(1), parameters.hasTrailingComma);
          }
          return parameters;
        }
        function createPropertyOrShorthandAssignment(name, initializer) {
          if (ts2.isIdentifier(initializer) && ts2.getTextOfIdentifierOrLiteral(initializer) === name) {
            return ts2.factory.createShorthandPropertyAssignment(name);
          }
          return ts2.factory.createPropertyAssignment(name, initializer);
        }
        function createNewArgument(functionDeclaration, functionArguments) {
          var parameters = getRefactorableParameters(functionDeclaration.parameters);
          var hasRestParameter = ts2.isRestParameter(ts2.last(parameters));
          var nonRestArguments = hasRestParameter ? functionArguments.slice(0, parameters.length - 1) : functionArguments;
          var properties = ts2.map(nonRestArguments, function(arg, i) {
            var parameterName = getParameterName(parameters[i]);
            var property = createPropertyOrShorthandAssignment(parameterName, arg);
            ts2.suppressLeadingAndTrailingTrivia(property.name);
            if (ts2.isPropertyAssignment(property))
              ts2.suppressLeadingAndTrailingTrivia(property.initializer);
            ts2.copyComments(arg, property);
            return property;
          });
          if (hasRestParameter && functionArguments.length >= parameters.length) {
            var restArguments = functionArguments.slice(parameters.length - 1);
            var restProperty = ts2.factory.createPropertyAssignment(getParameterName(ts2.last(parameters)), ts2.factory.createArrayLiteralExpression(restArguments));
            properties.push(restProperty);
          }
          var objectLiteral = ts2.factory.createObjectLiteralExpression(properties, false);
          return objectLiteral;
        }
        function createNewParameters(functionDeclaration, program, host) {
          var checker = program.getTypeChecker();
          var refactorableParameters = getRefactorableParameters(functionDeclaration.parameters);
          var bindingElements = ts2.map(refactorableParameters, createBindingElementFromParameterDeclaration);
          var objectParameterName = ts2.factory.createObjectBindingPattern(bindingElements);
          var objectParameterType = createParameterTypeNode(refactorableParameters);
          var objectInitializer;
          if (ts2.every(refactorableParameters, isOptionalParameter)) {
            objectInitializer = ts2.factory.createObjectLiteralExpression();
          }
          var objectParameter = ts2.factory.createParameterDeclaration(void 0, void 0, void 0, objectParameterName, void 0, objectParameterType, objectInitializer);
          if (hasThisParameter(functionDeclaration.parameters)) {
            var thisParameter = functionDeclaration.parameters[0];
            var newThisParameter = ts2.factory.createParameterDeclaration(void 0, void 0, void 0, thisParameter.name, void 0, thisParameter.type);
            ts2.suppressLeadingAndTrailingTrivia(newThisParameter.name);
            ts2.copyComments(thisParameter.name, newThisParameter.name);
            if (thisParameter.type) {
              ts2.suppressLeadingAndTrailingTrivia(newThisParameter.type);
              ts2.copyComments(thisParameter.type, newThisParameter.type);
            }
            return ts2.factory.createNodeArray([newThisParameter, objectParameter]);
          }
          return ts2.factory.createNodeArray([objectParameter]);
          function createBindingElementFromParameterDeclaration(parameterDeclaration) {
            var element = ts2.factory.createBindingElement(void 0, void 0, getParameterName(parameterDeclaration), ts2.isRestParameter(parameterDeclaration) && isOptionalParameter(parameterDeclaration) ? ts2.factory.createArrayLiteralExpression() : parameterDeclaration.initializer);
            ts2.suppressLeadingAndTrailingTrivia(element);
            if (parameterDeclaration.initializer && element.initializer) {
              ts2.copyComments(parameterDeclaration.initializer, element.initializer);
            }
            return element;
          }
          function createParameterTypeNode(parameters) {
            var members = ts2.map(parameters, createPropertySignatureFromParameterDeclaration);
            var typeNode = ts2.addEmitFlags(ts2.factory.createTypeLiteralNode(members), 1);
            return typeNode;
          }
          function createPropertySignatureFromParameterDeclaration(parameterDeclaration) {
            var parameterType = parameterDeclaration.type;
            if (!parameterType && (parameterDeclaration.initializer || ts2.isRestParameter(parameterDeclaration))) {
              parameterType = getTypeNode(parameterDeclaration);
            }
            var propertySignature = ts2.factory.createPropertySignature(void 0, getParameterName(parameterDeclaration), isOptionalParameter(parameterDeclaration) ? ts2.factory.createToken(57) : parameterDeclaration.questionToken, parameterType);
            ts2.suppressLeadingAndTrailingTrivia(propertySignature);
            ts2.copyComments(parameterDeclaration.name, propertySignature.name);
            if (parameterDeclaration.type && propertySignature.type) {
              ts2.copyComments(parameterDeclaration.type, propertySignature.type);
            }
            return propertySignature;
          }
          function getTypeNode(node) {
            var type = checker.getTypeAtLocation(node);
            return ts2.getTypeNodeIfAccessible(type, node, program, host);
          }
          function isOptionalParameter(parameterDeclaration) {
            if (ts2.isRestParameter(parameterDeclaration)) {
              var type = checker.getTypeAtLocation(parameterDeclaration);
              return !checker.isTupleType(type);
            }
            return checker.isOptionalParameter(parameterDeclaration);
          }
        }
        function getParameterName(paramDeclaration) {
          return ts2.getTextOfIdentifierOrLiteral(paramDeclaration.name);
        }
        function getClassNames(constructorDeclaration) {
          switch (constructorDeclaration.parent.kind) {
            case 256:
              var classDeclaration = constructorDeclaration.parent;
              if (classDeclaration.name)
                return [classDeclaration.name];
              var defaultModifier = ts2.Debug.checkDefined(ts2.findModifier(classDeclaration, 88), "Nameless class declaration should be a default export");
              return [defaultModifier];
            case 225:
              var classExpression = constructorDeclaration.parent;
              var variableDeclaration = constructorDeclaration.parent.parent;
              var className = classExpression.name;
              if (className)
                return [className, variableDeclaration.name];
              return [variableDeclaration.name];
          }
        }
        function getFunctionNames(functionDeclaration) {
          switch (functionDeclaration.kind) {
            case 255:
              if (functionDeclaration.name)
                return [functionDeclaration.name];
              var defaultModifier = ts2.Debug.checkDefined(ts2.findModifier(functionDeclaration, 88), "Nameless function declaration should be a default export");
              return [defaultModifier];
            case 168:
              return [functionDeclaration.name];
            case 170:
              var ctrKeyword = ts2.Debug.checkDefined(ts2.findChildOfKind(functionDeclaration, 134, functionDeclaration.getSourceFile()), "Constructor declaration should have constructor keyword");
              if (functionDeclaration.parent.kind === 225) {
                var variableDeclaration = functionDeclaration.parent.parent;
                return [variableDeclaration.name, ctrKeyword];
              }
              return [ctrKeyword];
            case 213:
              return [functionDeclaration.parent.name];
            case 212:
              if (functionDeclaration.name)
                return [functionDeclaration.name, functionDeclaration.parent.name];
              return [functionDeclaration.parent.name];
            default:
              return ts2.Debug.assertNever(functionDeclaration, "Unexpected function declaration kind ".concat(functionDeclaration.kind));
          }
        }
      })(convertParamsToDestructuredObject = refactor2.convertParamsToDestructuredObject || (refactor2.convertParamsToDestructuredObject = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var convertStringOrTemplateLiteral;
      (function(convertStringOrTemplateLiteral2) {
        var refactorName = "Convert to template string";
        var refactorDescription = ts2.getLocaleSpecificMessage(ts2.Diagnostics.Convert_to_template_string);
        var convertStringAction = {
          name: refactorName,
          description: refactorDescription,
          kind: "refactor.rewrite.string"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [convertStringAction.kind],
          getEditsForAction,
          getAvailableActions
        });
        function getAvailableActions(context) {
          var file = context.file, startPosition = context.startPosition;
          var node = getNodeOrParentOfParentheses(file, startPosition);
          var maybeBinary = getParentBinaryExpression(node);
          var refactorInfo = { name: refactorName, description: refactorDescription, actions: [] };
          if (ts2.isBinaryExpression(maybeBinary) && treeToArray(maybeBinary).isValidConcatenation) {
            refactorInfo.actions.push(convertStringAction);
            return [refactorInfo];
          } else if (context.preferences.provideRefactorNotApplicableReason) {
            refactorInfo.actions.push(__assign(__assign({}, convertStringAction), { notApplicableReason: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Can_only_convert_string_concatenation) }));
            return [refactorInfo];
          }
          return ts2.emptyArray;
        }
        function getNodeOrParentOfParentheses(file, startPosition) {
          var node = ts2.getTokenAtPosition(file, startPosition);
          var nestedBinary = getParentBinaryExpression(node);
          var isNonStringBinary = !treeToArray(nestedBinary).isValidConcatenation;
          if (isNonStringBinary && ts2.isParenthesizedExpression(nestedBinary.parent) && ts2.isBinaryExpression(nestedBinary.parent.parent)) {
            return nestedBinary.parent.parent;
          }
          return node;
        }
        function getEditsForAction(context, actionName) {
          var file = context.file, startPosition = context.startPosition;
          var node = getNodeOrParentOfParentheses(file, startPosition);
          switch (actionName) {
            case refactorDescription:
              return { edits: getEditsForToTemplateLiteral(context, node) };
            default:
              return ts2.Debug.fail("invalid action");
          }
        }
        function getEditsForToTemplateLiteral(context, node) {
          var maybeBinary = getParentBinaryExpression(node);
          var file = context.file;
          var templateLiteral = nodesToTemplate(treeToArray(maybeBinary), file);
          var trailingCommentRanges = ts2.getTrailingCommentRanges(file.text, maybeBinary.end);
          if (trailingCommentRanges) {
            var lastComment = trailingCommentRanges[trailingCommentRanges.length - 1];
            var trailingRange_1 = { pos: trailingCommentRanges[0].pos, end: lastComment.end };
            return ts2.textChanges.ChangeTracker.with(context, function(t) {
              t.deleteRange(file, trailingRange_1);
              t.replaceNode(file, maybeBinary, templateLiteral);
            });
          } else {
            return ts2.textChanges.ChangeTracker.with(context, function(t) {
              return t.replaceNode(file, maybeBinary, templateLiteral);
            });
          }
        }
        function isNotEqualsOperator(node) {
          return node.operatorToken.kind !== 63;
        }
        function getParentBinaryExpression(expr) {
          var container = ts2.findAncestor(expr.parent, function(n) {
            switch (n.kind) {
              case 205:
              case 206:
                return false;
              case 222:
              case 220:
                return !(ts2.isBinaryExpression(n.parent) && isNotEqualsOperator(n.parent));
              default:
                return "quit";
            }
          });
          return container || expr;
        }
        function treeToArray(current) {
          var loop = function(current2) {
            if (!ts2.isBinaryExpression(current2)) {
              return {
                nodes: [current2],
                operators: [],
                validOperators: true,
                hasString: ts2.isStringLiteral(current2) || ts2.isNoSubstitutionTemplateLiteral(current2)
              };
            }
            var _a2 = loop(current2.left), nodes2 = _a2.nodes, operators2 = _a2.operators, leftHasString = _a2.hasString, leftOperatorValid = _a2.validOperators;
            if (!(leftHasString || ts2.isStringLiteral(current2.right) || ts2.isTemplateExpression(current2.right))) {
              return { nodes: [current2], operators: [], hasString: false, validOperators: true };
            }
            var currentOperatorValid = current2.operatorToken.kind === 39;
            var validOperators2 = leftOperatorValid && currentOperatorValid;
            nodes2.push(current2.right);
            operators2.push(current2.operatorToken);
            return { nodes: nodes2, operators: operators2, hasString: true, validOperators: validOperators2 };
          };
          var _a = loop(current), nodes = _a.nodes, operators = _a.operators, validOperators = _a.validOperators, hasString = _a.hasString;
          return { nodes, operators, isValidConcatenation: validOperators && hasString };
        }
        var copyTrailingOperatorComments = function(operators, file) {
          return function(index, targetNode) {
            if (index < operators.length) {
              ts2.copyTrailingComments(operators[index], targetNode, file, 3, false);
            }
          };
        };
        var copyCommentFromMultiNode = function(nodes, file, copyOperatorComments) {
          return function(indexes, targetNode) {
            while (indexes.length > 0) {
              var index = indexes.shift();
              ts2.copyTrailingComments(nodes[index], targetNode, file, 3, false);
              copyOperatorComments(index, targetNode);
            }
          };
        };
        function escapeRawStringForTemplate(s) {
          return s.replace(/\\.|[$`]/g, function(m) {
            return m[0] === "\\" ? m : "\\" + m;
          });
        }
        function getRawTextOfTemplate(node) {
          var rightShaving = ts2.isTemplateHead(node) || ts2.isTemplateMiddle(node) ? -2 : -1;
          return ts2.getTextOfNode(node).slice(1, rightShaving);
        }
        function concatConsecutiveString(index, nodes) {
          var indexes = [];
          var text = "", rawText = "";
          while (index < nodes.length) {
            var node = nodes[index];
            if (ts2.isStringLiteralLike(node)) {
              text += node.text;
              rawText += escapeRawStringForTemplate(ts2.getTextOfNode(node).slice(1, -1));
              indexes.push(index);
              index++;
            } else if (ts2.isTemplateExpression(node)) {
              text += node.head.text;
              rawText += getRawTextOfTemplate(node.head);
              break;
            } else {
              break;
            }
          }
          return [index, text, rawText, indexes];
        }
        function nodesToTemplate(_a, file) {
          var nodes = _a.nodes, operators = _a.operators;
          var copyOperatorComments = copyTrailingOperatorComments(operators, file);
          var copyCommentFromStringLiterals = copyCommentFromMultiNode(nodes, file, copyOperatorComments);
          var _b = concatConsecutiveString(0, nodes), begin = _b[0], headText = _b[1], rawHeadText = _b[2], headIndexes = _b[3];
          if (begin === nodes.length) {
            var noSubstitutionTemplateLiteral = ts2.factory.createNoSubstitutionTemplateLiteral(headText, rawHeadText);
            copyCommentFromStringLiterals(headIndexes, noSubstitutionTemplateLiteral);
            return noSubstitutionTemplateLiteral;
          }
          var templateSpans = [];
          var templateHead = ts2.factory.createTemplateHead(headText, rawHeadText);
          copyCommentFromStringLiterals(headIndexes, templateHead);
          var _loop_21 = function(i2) {
            var currentNode = getExpressionFromParenthesesOrExpression(nodes[i2]);
            copyOperatorComments(i2, currentNode);
            var _c = concatConsecutiveString(i2 + 1, nodes), newIndex = _c[0], subsequentText = _c[1], rawSubsequentText = _c[2], stringIndexes = _c[3];
            i2 = newIndex - 1;
            var isLast = i2 === nodes.length - 1;
            if (ts2.isTemplateExpression(currentNode)) {
              var spans = ts2.map(currentNode.templateSpans, function(span, index) {
                copyExpressionComments(span);
                var isLastSpan = index === currentNode.templateSpans.length - 1;
                var text = span.literal.text + (isLastSpan ? subsequentText : "");
                var rawText = getRawTextOfTemplate(span.literal) + (isLastSpan ? rawSubsequentText : "");
                return ts2.factory.createTemplateSpan(span.expression, isLast ? ts2.factory.createTemplateTail(text, rawText) : ts2.factory.createTemplateMiddle(text, rawText));
              });
              templateSpans.push.apply(templateSpans, spans);
            } else {
              var templatePart = isLast ? ts2.factory.createTemplateTail(subsequentText, rawSubsequentText) : ts2.factory.createTemplateMiddle(subsequentText, rawSubsequentText);
              copyCommentFromStringLiterals(stringIndexes, templatePart);
              templateSpans.push(ts2.factory.createTemplateSpan(currentNode, templatePart));
            }
            out_i_1 = i2;
          };
          var out_i_1;
          for (var i = begin; i < nodes.length; i++) {
            _loop_21(i);
            i = out_i_1;
          }
          return ts2.factory.createTemplateExpression(templateHead, templateSpans);
        }
        function copyExpressionComments(node) {
          var file = node.getSourceFile();
          ts2.copyTrailingComments(node, node.expression, file, 3, false);
          ts2.copyTrailingAsLeadingComments(node.expression, node.expression, file, 3, false);
        }
        function getExpressionFromParenthesesOrExpression(node) {
          if (ts2.isParenthesizedExpression(node)) {
            copyExpressionComments(node);
            node = node.expression;
          }
          return node;
        }
      })(convertStringOrTemplateLiteral = refactor2.convertStringOrTemplateLiteral || (refactor2.convertStringOrTemplateLiteral = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var convertArrowFunctionOrFunctionExpression;
      (function(convertArrowFunctionOrFunctionExpression2) {
        var refactorName = "Convert arrow function or function expression";
        var refactorDescription = ts2.getLocaleSpecificMessage(ts2.Diagnostics.Convert_arrow_function_or_function_expression);
        var toAnonymousFunctionAction = {
          name: "Convert to anonymous function",
          description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Convert_to_anonymous_function),
          kind: "refactor.rewrite.function.anonymous"
        };
        var toNamedFunctionAction = {
          name: "Convert to named function",
          description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Convert_to_named_function),
          kind: "refactor.rewrite.function.named"
        };
        var toArrowFunctionAction = {
          name: "Convert to arrow function",
          description: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Convert_to_arrow_function),
          kind: "refactor.rewrite.function.arrow"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [
            toAnonymousFunctionAction.kind,
            toNamedFunctionAction.kind,
            toArrowFunctionAction.kind
          ],
          getEditsForAction,
          getAvailableActions
        });
        function getAvailableActions(context) {
          var file = context.file, startPosition = context.startPosition, program = context.program, kind = context.kind;
          var info = getFunctionInfo(file, startPosition, program);
          if (!info)
            return ts2.emptyArray;
          var selectedVariableDeclaration = info.selectedVariableDeclaration, func = info.func;
          var possibleActions = [];
          var errors = [];
          if (refactor2.refactorKindBeginsWith(toNamedFunctionAction.kind, kind)) {
            var error = selectedVariableDeclaration || ts2.isArrowFunction(func) && ts2.isVariableDeclaration(func.parent) ? void 0 : ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_convert_to_named_function);
            if (error) {
              errors.push(__assign(__assign({}, toNamedFunctionAction), { notApplicableReason: error }));
            } else {
              possibleActions.push(toNamedFunctionAction);
            }
          }
          if (refactor2.refactorKindBeginsWith(toAnonymousFunctionAction.kind, kind)) {
            var error = !selectedVariableDeclaration && ts2.isArrowFunction(func) ? void 0 : ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_convert_to_anonymous_function);
            if (error) {
              errors.push(__assign(__assign({}, toAnonymousFunctionAction), { notApplicableReason: error }));
            } else {
              possibleActions.push(toAnonymousFunctionAction);
            }
          }
          if (refactor2.refactorKindBeginsWith(toArrowFunctionAction.kind, kind)) {
            var error = ts2.isFunctionExpression(func) ? void 0 : ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_convert_to_arrow_function);
            if (error) {
              errors.push(__assign(__assign({}, toArrowFunctionAction), { notApplicableReason: error }));
            } else {
              possibleActions.push(toArrowFunctionAction);
            }
          }
          return [{
            name: refactorName,
            description: refactorDescription,
            actions: possibleActions.length === 0 && context.preferences.provideRefactorNotApplicableReason ? errors : possibleActions
          }];
        }
        function getEditsForAction(context, actionName) {
          var file = context.file, startPosition = context.startPosition, program = context.program;
          var info = getFunctionInfo(file, startPosition, program);
          if (!info)
            return void 0;
          var func = info.func;
          var edits = [];
          switch (actionName) {
            case toAnonymousFunctionAction.name:
              edits.push.apply(edits, getEditInfoForConvertToAnonymousFunction(context, func));
              break;
            case toNamedFunctionAction.name:
              var variableInfo = getVariableInfo(func);
              if (!variableInfo)
                return void 0;
              edits.push.apply(edits, getEditInfoForConvertToNamedFunction(context, func, variableInfo));
              break;
            case toArrowFunctionAction.name:
              if (!ts2.isFunctionExpression(func))
                return void 0;
              edits.push.apply(edits, getEditInfoForConvertToArrowFunction(context, func));
              break;
            default:
              return ts2.Debug.fail("invalid action");
          }
          return { renameFilename: void 0, renameLocation: void 0, edits };
        }
        function containingThis(node) {
          var containsThis = false;
          node.forEachChild(function checkThis(child) {
            if (ts2.isThis(child)) {
              containsThis = true;
              return;
            }
            if (!ts2.isClassLike(child) && !ts2.isFunctionDeclaration(child) && !ts2.isFunctionExpression(child)) {
              ts2.forEachChild(child, checkThis);
            }
          });
          return containsThis;
        }
        function getFunctionInfo(file, startPosition, program) {
          var token = ts2.getTokenAtPosition(file, startPosition);
          var typeChecker = program.getTypeChecker();
          var func = tryGetFunctionFromVariableDeclaration(file, typeChecker, token.parent);
          if (func && !containingThis(func.body) && !typeChecker.containsArgumentsReference(func)) {
            return { selectedVariableDeclaration: true, func };
          }
          var maybeFunc = ts2.getContainingFunction(token);
          if (maybeFunc && (ts2.isFunctionExpression(maybeFunc) || ts2.isArrowFunction(maybeFunc)) && !ts2.rangeContainsRange(maybeFunc.body, token) && !containingThis(maybeFunc.body) && !typeChecker.containsArgumentsReference(maybeFunc)) {
            if (ts2.isFunctionExpression(maybeFunc) && isFunctionReferencedInFile(file, typeChecker, maybeFunc))
              return void 0;
            return { selectedVariableDeclaration: false, func: maybeFunc };
          }
          return void 0;
        }
        function isSingleVariableDeclaration(parent) {
          return ts2.isVariableDeclaration(parent) || ts2.isVariableDeclarationList(parent) && parent.declarations.length === 1;
        }
        function tryGetFunctionFromVariableDeclaration(sourceFile, typeChecker, parent) {
          if (!isSingleVariableDeclaration(parent)) {
            return void 0;
          }
          var variableDeclaration = ts2.isVariableDeclaration(parent) ? parent : ts2.first(parent.declarations);
          var initializer = variableDeclaration.initializer;
          if (initializer && (ts2.isArrowFunction(initializer) || ts2.isFunctionExpression(initializer) && !isFunctionReferencedInFile(sourceFile, typeChecker, initializer))) {
            return initializer;
          }
          return void 0;
        }
        function convertToBlock(body) {
          if (ts2.isExpression(body)) {
            var returnStatement = ts2.factory.createReturnStatement(body);
            var file = body.getSourceFile();
            ts2.suppressLeadingAndTrailingTrivia(returnStatement);
            ts2.copyTrailingAsLeadingComments(body, returnStatement, file, void 0, true);
            return ts2.factory.createBlock([returnStatement], true);
          } else {
            return body;
          }
        }
        function getVariableInfo(func) {
          var variableDeclaration = func.parent;
          if (!ts2.isVariableDeclaration(variableDeclaration) || !ts2.isVariableDeclarationInVariableStatement(variableDeclaration))
            return void 0;
          var variableDeclarationList = variableDeclaration.parent;
          var statement = variableDeclarationList.parent;
          if (!ts2.isVariableDeclarationList(variableDeclarationList) || !ts2.isVariableStatement(statement) || !ts2.isIdentifier(variableDeclaration.name))
            return void 0;
          return { variableDeclaration, variableDeclarationList, statement, name: variableDeclaration.name };
        }
        function getEditInfoForConvertToAnonymousFunction(context, func) {
          var file = context.file;
          var body = convertToBlock(func.body);
          var newNode = ts2.factory.createFunctionExpression(func.modifiers, func.asteriskToken, void 0, func.typeParameters, func.parameters, func.type, body);
          return ts2.textChanges.ChangeTracker.with(context, function(t) {
            return t.replaceNode(file, func, newNode);
          });
        }
        function getEditInfoForConvertToNamedFunction(context, func, variableInfo) {
          var file = context.file;
          var body = convertToBlock(func.body);
          var variableDeclaration = variableInfo.variableDeclaration, variableDeclarationList = variableInfo.variableDeclarationList, statement = variableInfo.statement, name = variableInfo.name;
          ts2.suppressLeadingTrivia(statement);
          var modifiersFlags = ts2.getCombinedModifierFlags(variableDeclaration) & 1 | ts2.getEffectiveModifierFlags(func);
          var modifiers = ts2.factory.createModifiersFromModifierFlags(modifiersFlags);
          var newNode = ts2.factory.createFunctionDeclaration(func.decorators, ts2.length(modifiers) ? modifiers : void 0, func.asteriskToken, name, func.typeParameters, func.parameters, func.type, body);
          if (variableDeclarationList.declarations.length === 1) {
            return ts2.textChanges.ChangeTracker.with(context, function(t) {
              return t.replaceNode(file, statement, newNode);
            });
          } else {
            return ts2.textChanges.ChangeTracker.with(context, function(t) {
              t.delete(file, variableDeclaration);
              t.insertNodeAfter(file, statement, newNode);
            });
          }
        }
        function getEditInfoForConvertToArrowFunction(context, func) {
          var file = context.file;
          var statements = func.body.statements;
          var head = statements[0];
          var body;
          if (canBeConvertedToExpression(func.body, head)) {
            body = head.expression;
            ts2.suppressLeadingAndTrailingTrivia(body);
            ts2.copyComments(head, body);
          } else {
            body = func.body;
          }
          var newNode = ts2.factory.createArrowFunction(func.modifiers, func.typeParameters, func.parameters, func.type, ts2.factory.createToken(38), body);
          return ts2.textChanges.ChangeTracker.with(context, function(t) {
            return t.replaceNode(file, func, newNode);
          });
        }
        function canBeConvertedToExpression(body, head) {
          return body.statements.length === 1 && (ts2.isReturnStatement(head) && !!head.expression);
        }
        function isFunctionReferencedInFile(sourceFile, typeChecker, node) {
          return !!node.name && ts2.FindAllReferences.Core.isSymbolReferencedInFile(node.name, typeChecker, sourceFile);
        }
      })(convertArrowFunctionOrFunctionExpression = refactor2.convertArrowFunctionOrFunctionExpression || (refactor2.convertArrowFunctionOrFunctionExpression = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    var refactor;
    (function(refactor2) {
      var inferFunctionReturnType;
      (function(inferFunctionReturnType2) {
        var refactorName = "Infer function return type";
        var refactorDescription = ts2.Diagnostics.Infer_function_return_type.message;
        var inferReturnTypeAction = {
          name: refactorName,
          description: refactorDescription,
          kind: "refactor.rewrite.function.returnType"
        };
        refactor2.registerRefactor(refactorName, {
          kinds: [inferReturnTypeAction.kind],
          getEditsForAction,
          getAvailableActions
        });
        function getEditsForAction(context) {
          var info = getInfo(context);
          if (info && !refactor2.isRefactorErrorInfo(info)) {
            var edits = ts2.textChanges.ChangeTracker.with(context, function(t) {
              return doChange(context.file, t, info.declaration, info.returnTypeNode);
            });
            return { renameFilename: void 0, renameLocation: void 0, edits };
          }
          return void 0;
        }
        function getAvailableActions(context) {
          var info = getInfo(context);
          if (!info)
            return ts2.emptyArray;
          if (!refactor2.isRefactorErrorInfo(info)) {
            return [{
              name: refactorName,
              description: refactorDescription,
              actions: [inferReturnTypeAction]
            }];
          }
          if (context.preferences.provideRefactorNotApplicableReason) {
            return [{
              name: refactorName,
              description: refactorDescription,
              actions: [__assign(__assign({}, inferReturnTypeAction), { notApplicableReason: info.error })]
            }];
          }
          return ts2.emptyArray;
        }
        function doChange(sourceFile, changes, declaration, typeNode) {
          var closeParen = ts2.findChildOfKind(declaration, 21, sourceFile);
          var needParens = ts2.isArrowFunction(declaration) && closeParen === void 0;
          var endNode = needParens ? ts2.first(declaration.parameters) : closeParen;
          if (endNode) {
            if (needParens) {
              changes.insertNodeBefore(sourceFile, endNode, ts2.factory.createToken(20));
              changes.insertNodeAfter(sourceFile, endNode, ts2.factory.createToken(21));
            }
            changes.insertNodeAt(sourceFile, endNode.end, typeNode, { prefix: ": " });
          }
        }
        function getInfo(context) {
          if (ts2.isInJSFile(context.file) || !refactor2.refactorKindBeginsWith(inferReturnTypeAction.kind, context.kind))
            return;
          var token = ts2.getTokenAtPosition(context.file, context.startPosition);
          var declaration = ts2.findAncestor(token, function(n) {
            return ts2.isBlock(n) || n.parent && ts2.isArrowFunction(n.parent) && (n.kind === 38 || n.parent.body === n) ? "quit" : isConvertibleDeclaration(n);
          });
          if (!declaration || !declaration.body || declaration.type) {
            return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Return_type_must_be_inferred_from_a_function) };
          }
          var typeChecker = context.program.getTypeChecker();
          var returnType = tryGetReturnType(typeChecker, declaration);
          if (!returnType) {
            return { error: ts2.getLocaleSpecificMessage(ts2.Diagnostics.Could_not_determine_function_return_type) };
          }
          var returnTypeNode = typeChecker.typeToTypeNode(returnType, declaration, 1);
          if (returnTypeNode) {
            return { declaration, returnTypeNode };
          }
        }
        function isConvertibleDeclaration(node) {
          switch (node.kind) {
            case 255:
            case 212:
            case 213:
            case 168:
              return true;
            default:
              return false;
          }
        }
        function tryGetReturnType(typeChecker, node) {
          if (typeChecker.isImplementationOfOverload(node)) {
            var signatures = typeChecker.getTypeAtLocation(node).getCallSignatures();
            if (signatures.length > 1) {
              return typeChecker.getUnionType(ts2.mapDefined(signatures, function(s) {
                return s.getReturnType();
              }));
            }
          }
          var signature = typeChecker.getSignatureFromDeclaration(node);
          if (signature) {
            return typeChecker.getReturnTypeOfSignature(signature);
          }
        }
      })(inferFunctionReturnType = refactor2.inferFunctionReturnType || (refactor2.inferFunctionReturnType = {}));
    })(refactor = ts2.refactor || (ts2.refactor = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    ts2.servicesVersion = "0.8";
    function createNode(kind, pos, end, parent) {
      var node = ts2.isNodeKind(kind) ? new NodeObject(kind, pos, end) : kind === 79 ? new IdentifierObject(79, pos, end) : kind === 80 ? new PrivateIdentifierObject(80, pos, end) : new TokenObject(kind, pos, end);
      node.parent = parent;
      node.flags = parent.flags & 25358336;
      return node;
    }
    var NodeObject = function() {
      function NodeObject2(kind, pos, end) {
        this.pos = pos;
        this.end = end;
        this.flags = 0;
        this.modifierFlagsCache = 0;
        this.transformFlags = 0;
        this.parent = void 0;
        this.kind = kind;
      }
      NodeObject2.prototype.assertHasRealPosition = function(message) {
        ts2.Debug.assert(!ts2.positionIsSynthesized(this.pos) && !ts2.positionIsSynthesized(this.end), message || "Node must have a real position for this operation");
      };
      NodeObject2.prototype.getSourceFile = function() {
        return ts2.getSourceFileOfNode(this);
      };
      NodeObject2.prototype.getStart = function(sourceFile, includeJsDocComment) {
        this.assertHasRealPosition();
        return ts2.getTokenPosOfNode(this, sourceFile, includeJsDocComment);
      };
      NodeObject2.prototype.getFullStart = function() {
        this.assertHasRealPosition();
        return this.pos;
      };
      NodeObject2.prototype.getEnd = function() {
        this.assertHasRealPosition();
        return this.end;
      };
      NodeObject2.prototype.getWidth = function(sourceFile) {
        this.assertHasRealPosition();
        return this.getEnd() - this.getStart(sourceFile);
      };
      NodeObject2.prototype.getFullWidth = function() {
        this.assertHasRealPosition();
        return this.end - this.pos;
      };
      NodeObject2.prototype.getLeadingTriviaWidth = function(sourceFile) {
        this.assertHasRealPosition();
        return this.getStart(sourceFile) - this.pos;
      };
      NodeObject2.prototype.getFullText = function(sourceFile) {
        this.assertHasRealPosition();
        return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end);
      };
      NodeObject2.prototype.getText = function(sourceFile) {
        this.assertHasRealPosition();
        if (!sourceFile) {
          sourceFile = this.getSourceFile();
        }
        return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd());
      };
      NodeObject2.prototype.getChildCount = function(sourceFile) {
        return this.getChildren(sourceFile).length;
      };
      NodeObject2.prototype.getChildAt = function(index, sourceFile) {
        return this.getChildren(sourceFile)[index];
      };
      NodeObject2.prototype.getChildren = function(sourceFile) {
        this.assertHasRealPosition("Node without a real position cannot be scanned and thus has no token nodes - use forEachChild and collect the result if that's fine");
        return this._children || (this._children = createChildren(this, sourceFile));
      };
      NodeObject2.prototype.getFirstToken = function(sourceFile) {
        this.assertHasRealPosition();
        var children = this.getChildren(sourceFile);
        if (!children.length) {
          return void 0;
        }
        var child = ts2.find(children, function(kid) {
          return kid.kind < 307 || kid.kind > 345;
        });
        return child.kind < 160 ? child : child.getFirstToken(sourceFile);
      };
      NodeObject2.prototype.getLastToken = function(sourceFile) {
        this.assertHasRealPosition();
        var children = this.getChildren(sourceFile);
        var child = ts2.lastOrUndefined(children);
        if (!child) {
          return void 0;
        }
        return child.kind < 160 ? child : child.getLastToken(sourceFile);
      };
      NodeObject2.prototype.forEachChild = function(cbNode, cbNodeArray) {
        return ts2.forEachChild(this, cbNode, cbNodeArray);
      };
      return NodeObject2;
    }();
    function createChildren(node, sourceFile) {
      if (!ts2.isNodeKind(node.kind)) {
        return ts2.emptyArray;
      }
      var children = [];
      if (ts2.isJSDocCommentContainingNode(node)) {
        node.forEachChild(function(child) {
          children.push(child);
        });
        return children;
      }
      ts2.scanner.setText((sourceFile || node.getSourceFile()).text);
      var pos = node.pos;
      var processNode = function(child) {
        addSyntheticNodes(children, pos, child.pos, node);
        children.push(child);
        pos = child.end;
      };
      var processNodes = function(nodes) {
        addSyntheticNodes(children, pos, nodes.pos, node);
        children.push(createSyntaxList(nodes, node));
        pos = nodes.end;
      };
      ts2.forEach(node.jsDoc, processNode);
      pos = node.pos;
      node.forEachChild(processNode, processNodes);
      addSyntheticNodes(children, pos, node.end, node);
      ts2.scanner.setText(void 0);
      return children;
    }
    function addSyntheticNodes(nodes, pos, end, parent) {
      ts2.scanner.setTextPos(pos);
      while (pos < end) {
        var token = ts2.scanner.scan();
        var textPos = ts2.scanner.getTextPos();
        if (textPos <= end) {
          if (token === 79) {
            ts2.Debug.fail("Did not expect ".concat(ts2.Debug.formatSyntaxKind(parent.kind), " to have an Identifier in its trivia"));
          }
          nodes.push(createNode(token, pos, textPos, parent));
        }
        pos = textPos;
        if (token === 1) {
          break;
        }
      }
    }
    function createSyntaxList(nodes, parent) {
      var list = createNode(346, nodes.pos, nodes.end, parent);
      list._children = [];
      var pos = nodes.pos;
      for (var _i = 0, nodes_2 = nodes; _i < nodes_2.length; _i++) {
        var node = nodes_2[_i];
        addSyntheticNodes(list._children, pos, node.pos, parent);
        list._children.push(node);
        pos = node.end;
      }
      addSyntheticNodes(list._children, pos, nodes.end, parent);
      return list;
    }
    var TokenOrIdentifierObject = function() {
      function TokenOrIdentifierObject2(pos, end) {
        this.pos = pos;
        this.end = end;
        this.flags = 0;
        this.modifierFlagsCache = 0;
        this.transformFlags = 0;
        this.parent = void 0;
      }
      TokenOrIdentifierObject2.prototype.getSourceFile = function() {
        return ts2.getSourceFileOfNode(this);
      };
      TokenOrIdentifierObject2.prototype.getStart = function(sourceFile, includeJsDocComment) {
        return ts2.getTokenPosOfNode(this, sourceFile, includeJsDocComment);
      };
      TokenOrIdentifierObject2.prototype.getFullStart = function() {
        return this.pos;
      };
      TokenOrIdentifierObject2.prototype.getEnd = function() {
        return this.end;
      };
      TokenOrIdentifierObject2.prototype.getWidth = function(sourceFile) {
        return this.getEnd() - this.getStart(sourceFile);
      };
      TokenOrIdentifierObject2.prototype.getFullWidth = function() {
        return this.end - this.pos;
      };
      TokenOrIdentifierObject2.prototype.getLeadingTriviaWidth = function(sourceFile) {
        return this.getStart(sourceFile) - this.pos;
      };
      TokenOrIdentifierObject2.prototype.getFullText = function(sourceFile) {
        return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end);
      };
      TokenOrIdentifierObject2.prototype.getText = function(sourceFile) {
        if (!sourceFile) {
          sourceFile = this.getSourceFile();
        }
        return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd());
      };
      TokenOrIdentifierObject2.prototype.getChildCount = function() {
        return this.getChildren().length;
      };
      TokenOrIdentifierObject2.prototype.getChildAt = function(index) {
        return this.getChildren()[index];
      };
      TokenOrIdentifierObject2.prototype.getChildren = function() {
        return this.kind === 1 ? this.jsDoc || ts2.emptyArray : ts2.emptyArray;
      };
      TokenOrIdentifierObject2.prototype.getFirstToken = function() {
        return void 0;
      };
      TokenOrIdentifierObject2.prototype.getLastToken = function() {
        return void 0;
      };
      TokenOrIdentifierObject2.prototype.forEachChild = function() {
        return void 0;
      };
      return TokenOrIdentifierObject2;
    }();
    var SymbolObject = function() {
      function SymbolObject2(flags, name) {
        this.flags = flags;
        this.escapedName = name;
      }
      SymbolObject2.prototype.getFlags = function() {
        return this.flags;
      };
      Object.defineProperty(SymbolObject2.prototype, "name", {
        get: function() {
          return ts2.symbolName(this);
        },
        enumerable: false,
        configurable: true
      });
      SymbolObject2.prototype.getEscapedName = function() {
        return this.escapedName;
      };
      SymbolObject2.prototype.getName = function() {
        return this.name;
      };
      SymbolObject2.prototype.getDeclarations = function() {
        return this.declarations;
      };
      SymbolObject2.prototype.getDocumentationComment = function(checker) {
        if (!this.documentationComment) {
          this.documentationComment = ts2.emptyArray;
          if (!this.declarations && this.target && this.target.tupleLabelDeclaration) {
            var labelDecl = this.target.tupleLabelDeclaration;
            this.documentationComment = getDocumentationComment([labelDecl], checker);
          } else {
            this.documentationComment = getDocumentationComment(this.declarations, checker);
          }
        }
        return this.documentationComment;
      };
      SymbolObject2.prototype.getContextualDocumentationComment = function(context, checker) {
        switch (context === null || context === void 0 ? void 0 : context.kind) {
          case 171:
            if (!this.contextualGetAccessorDocumentationComment) {
              this.contextualGetAccessorDocumentationComment = ts2.emptyArray;
              this.contextualGetAccessorDocumentationComment = getDocumentationComment(ts2.filter(this.declarations, ts2.isGetAccessor), checker);
            }
            return this.contextualGetAccessorDocumentationComment;
          case 172:
            if (!this.contextualSetAccessorDocumentationComment) {
              this.contextualSetAccessorDocumentationComment = ts2.emptyArray;
              this.contextualSetAccessorDocumentationComment = getDocumentationComment(ts2.filter(this.declarations, ts2.isSetAccessor), checker);
            }
            return this.contextualSetAccessorDocumentationComment;
          default:
            return this.getDocumentationComment(checker);
        }
      };
      SymbolObject2.prototype.getJsDocTags = function(checker) {
        if (this.tags === void 0) {
          this.tags = ts2.JsDoc.getJsDocTagsFromDeclarations(this.declarations, checker);
        }
        return this.tags;
      };
      return SymbolObject2;
    }();
    var TokenObject = function(_super) {
      __extends(TokenObject2, _super);
      function TokenObject2(kind, pos, end) {
        var _this = _super.call(this, pos, end) || this;
        _this.kind = kind;
        return _this;
      }
      return TokenObject2;
    }(TokenOrIdentifierObject);
    var IdentifierObject = function(_super) {
      __extends(IdentifierObject2, _super);
      function IdentifierObject2(_kind, pos, end) {
        var _this = _super.call(this, pos, end) || this;
        _this.kind = 79;
        return _this;
      }
      Object.defineProperty(IdentifierObject2.prototype, "text", {
        get: function() {
          return ts2.idText(this);
        },
        enumerable: false,
        configurable: true
      });
      return IdentifierObject2;
    }(TokenOrIdentifierObject);
    IdentifierObject.prototype.kind = 79;
    var PrivateIdentifierObject = function(_super) {
      __extends(PrivateIdentifierObject2, _super);
      function PrivateIdentifierObject2(_kind, pos, end) {
        return _super.call(this, pos, end) || this;
      }
      Object.defineProperty(PrivateIdentifierObject2.prototype, "text", {
        get: function() {
          return ts2.idText(this);
        },
        enumerable: false,
        configurable: true
      });
      return PrivateIdentifierObject2;
    }(TokenOrIdentifierObject);
    PrivateIdentifierObject.prototype.kind = 80;
    var TypeObject = function() {
      function TypeObject2(checker, flags) {
        this.checker = checker;
        this.flags = flags;
      }
      TypeObject2.prototype.getFlags = function() {
        return this.flags;
      };
      TypeObject2.prototype.getSymbol = function() {
        return this.symbol;
      };
      TypeObject2.prototype.getProperties = function() {
        return this.checker.getPropertiesOfType(this);
      };
      TypeObject2.prototype.getProperty = function(propertyName) {
        return this.checker.getPropertyOfType(this, propertyName);
      };
      TypeObject2.prototype.getApparentProperties = function() {
        return this.checker.getAugmentedPropertiesOfType(this);
      };
      TypeObject2.prototype.getCallSignatures = function() {
        return this.checker.getSignaturesOfType(this, 0);
      };
      TypeObject2.prototype.getConstructSignatures = function() {
        return this.checker.getSignaturesOfType(this, 1);
      };
      TypeObject2.prototype.getStringIndexType = function() {
        return this.checker.getIndexTypeOfType(this, 0);
      };
      TypeObject2.prototype.getNumberIndexType = function() {
        return this.checker.getIndexTypeOfType(this, 1);
      };
      TypeObject2.prototype.getBaseTypes = function() {
        return this.isClassOrInterface() ? this.checker.getBaseTypes(this) : void 0;
      };
      TypeObject2.prototype.isNullableType = function() {
        return this.checker.isNullableType(this);
      };
      TypeObject2.prototype.getNonNullableType = function() {
        return this.checker.getNonNullableType(this);
      };
      TypeObject2.prototype.getNonOptionalType = function() {
        return this.checker.getNonOptionalType(this);
      };
      TypeObject2.prototype.getConstraint = function() {
        return this.checker.getBaseConstraintOfType(this);
      };
      TypeObject2.prototype.getDefault = function() {
        return this.checker.getDefaultFromTypeParameter(this);
      };
      TypeObject2.prototype.isUnion = function() {
        return !!(this.flags & 1048576);
      };
      TypeObject2.prototype.isIntersection = function() {
        return !!(this.flags & 2097152);
      };
      TypeObject2.prototype.isUnionOrIntersection = function() {
        return !!(this.flags & 3145728);
      };
      TypeObject2.prototype.isLiteral = function() {
        return !!(this.flags & 384);
      };
      TypeObject2.prototype.isStringLiteral = function() {
        return !!(this.flags & 128);
      };
      TypeObject2.prototype.isNumberLiteral = function() {
        return !!(this.flags & 256);
      };
      TypeObject2.prototype.isTypeParameter = function() {
        return !!(this.flags & 262144);
      };
      TypeObject2.prototype.isClassOrInterface = function() {
        return !!(ts2.getObjectFlags(this) & 3);
      };
      TypeObject2.prototype.isClass = function() {
        return !!(ts2.getObjectFlags(this) & 1);
      };
      Object.defineProperty(TypeObject2.prototype, "typeArguments", {
        get: function() {
          if (ts2.getObjectFlags(this) & 4) {
            return this.checker.getTypeArguments(this);
          }
          return void 0;
        },
        enumerable: false,
        configurable: true
      });
      return TypeObject2;
    }();
    var SignatureObject = function() {
      function SignatureObject2(checker, flags) {
        this.checker = checker;
        this.flags = flags;
      }
      SignatureObject2.prototype.getDeclaration = function() {
        return this.declaration;
      };
      SignatureObject2.prototype.getTypeParameters = function() {
        return this.typeParameters;
      };
      SignatureObject2.prototype.getParameters = function() {
        return this.parameters;
      };
      SignatureObject2.prototype.getReturnType = function() {
        return this.checker.getReturnTypeOfSignature(this);
      };
      SignatureObject2.prototype.getDocumentationComment = function() {
        return this.documentationComment || (this.documentationComment = getDocumentationComment(ts2.singleElementArray(this.declaration), this.checker));
      };
      SignatureObject2.prototype.getJsDocTags = function() {
        if (this.jsDocTags === void 0) {
          this.jsDocTags = this.declaration ? getJsDocTagsOfSignature(this.declaration, this.checker) : [];
        }
        return this.jsDocTags;
      };
      return SignatureObject2;
    }();
    function hasJSDocInheritDocTag(node) {
      return ts2.getJSDocTags(node).some(function(tag) {
        return tag.tagName.text === "inheritDoc";
      });
    }
    function getJsDocTagsOfSignature(declaration, checker) {
      var tags = ts2.JsDoc.getJsDocTagsFromDeclarations([declaration], checker);
      if (tags.length === 0 || hasJSDocInheritDocTag(declaration)) {
        var inheritedTags = findBaseOfDeclaration(checker, declaration, function(symbol) {
          var _a;
          return ((_a = symbol.declarations) === null || _a === void 0 ? void 0 : _a.length) === 1 ? symbol.getJsDocTags() : void 0;
        });
        if (inheritedTags) {
          tags = __spreadArray(__spreadArray([], inheritedTags, true), tags, true);
        }
      }
      return tags;
    }
    function getDocumentationComment(declarations, checker) {
      if (!declarations)
        return ts2.emptyArray;
      var doc = ts2.JsDoc.getJsDocCommentsFromDeclarations(declarations, checker);
      if (checker && (doc.length === 0 || declarations.some(hasJSDocInheritDocTag))) {
        var seenSymbols_1 = new ts2.Set();
        for (var _i = 0, declarations_4 = declarations; _i < declarations_4.length; _i++) {
          var declaration = declarations_4[_i];
          var inheritedDocs = findBaseOfDeclaration(checker, declaration, function(symbol) {
            if (!seenSymbols_1.has(symbol)) {
              seenSymbols_1.add(symbol);
              return symbol.getDocumentationComment(checker);
            }
          });
          if (inheritedDocs)
            doc = doc.length === 0 ? inheritedDocs.slice() : inheritedDocs.concat(ts2.lineBreakPart(), doc);
        }
      }
      return doc;
    }
    function findBaseOfDeclaration(checker, declaration, cb) {
      var _a;
      var classOrInterfaceDeclaration = ((_a = declaration.parent) === null || _a === void 0 ? void 0 : _a.kind) === 170 ? declaration.parent.parent : declaration.parent;
      if (!classOrInterfaceDeclaration) {
        return;
      }
      return ts2.firstDefined(ts2.getAllSuperTypeNodes(classOrInterfaceDeclaration), function(superTypeNode) {
        var symbol = checker.getPropertyOfType(checker.getTypeAtLocation(superTypeNode), declaration.symbol.name);
        return symbol ? cb(symbol) : void 0;
      });
    }
    var SourceFileObject = function(_super) {
      __extends(SourceFileObject2, _super);
      function SourceFileObject2(kind, pos, end) {
        var _this = _super.call(this, kind, pos, end) || this;
        _this.kind = 303;
        return _this;
      }
      SourceFileObject2.prototype.update = function(newText, textChangeRange) {
        return ts2.updateSourceFile(this, newText, textChangeRange);
      };
      SourceFileObject2.prototype.getLineAndCharacterOfPosition = function(position) {
        return ts2.getLineAndCharacterOfPosition(this, position);
      };
      SourceFileObject2.prototype.getLineStarts = function() {
        return ts2.getLineStarts(this);
      };
      SourceFileObject2.prototype.getPositionOfLineAndCharacter = function(line, character, allowEdits) {
        return ts2.computePositionOfLineAndCharacter(ts2.getLineStarts(this), line, character, this.text, allowEdits);
      };
      SourceFileObject2.prototype.getLineEndOfPosition = function(pos) {
        var line = this.getLineAndCharacterOfPosition(pos).line;
        var lineStarts = this.getLineStarts();
        var lastCharPos;
        if (line + 1 >= lineStarts.length) {
          lastCharPos = this.getEnd();
        }
        if (!lastCharPos) {
          lastCharPos = lineStarts[line + 1] - 1;
        }
        var fullText = this.getFullText();
        return fullText[lastCharPos] === "\n" && fullText[lastCharPos - 1] === "\r" ? lastCharPos - 1 : lastCharPos;
      };
      SourceFileObject2.prototype.getNamedDeclarations = function() {
        if (!this.namedDeclarations) {
          this.namedDeclarations = this.computeNamedDeclarations();
        }
        return this.namedDeclarations;
      };
      SourceFileObject2.prototype.computeNamedDeclarations = function() {
        var result = ts2.createMultiMap();
        this.forEachChild(visit);
        return result;
        function addDeclaration(declaration) {
          var name = getDeclarationName(declaration);
          if (name) {
            result.add(name, declaration);
          }
        }
        function getDeclarations(name) {
          var declarations = result.get(name);
          if (!declarations) {
            result.set(name, declarations = []);
          }
          return declarations;
        }
        function getDeclarationName(declaration) {
          var name = ts2.getNonAssignedNameOfDeclaration(declaration);
          return name && (ts2.isComputedPropertyName(name) && ts2.isPropertyAccessExpression(name.expression) ? name.expression.name.text : ts2.isPropertyName(name) ? ts2.getNameFromPropertyName(name) : void 0);
        }
        function visit(node) {
          switch (node.kind) {
            case 255:
            case 212:
            case 168:
            case 167:
              var functionDeclaration = node;
              var declarationName = getDeclarationName(functionDeclaration);
              if (declarationName) {
                var declarations = getDeclarations(declarationName);
                var lastDeclaration = ts2.lastOrUndefined(declarations);
                if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) {
                  if (functionDeclaration.body && !lastDeclaration.body) {
                    declarations[declarations.length - 1] = functionDeclaration;
                  }
                } else {
                  declarations.push(functionDeclaration);
                }
              }
              ts2.forEachChild(node, visit);
              break;
            case 256:
            case 225:
            case 257:
            case 258:
            case 259:
            case 260:
            case 264:
            case 274:
            case 269:
            case 266:
            case 267:
            case 171:
            case 172:
            case 181:
              addDeclaration(node);
              ts2.forEachChild(node, visit);
              break;
            case 163:
              if (!ts2.hasSyntacticModifier(node, 16476)) {
                break;
              }
            case 253:
            case 202: {
              var decl = node;
              if (ts2.isBindingPattern(decl.name)) {
                ts2.forEachChild(decl.name, visit);
                break;
              }
              if (decl.initializer) {
                visit(decl.initializer);
              }
            }
            case 297:
            case 166:
            case 165:
              addDeclaration(node);
              break;
            case 271:
              var exportDeclaration = node;
              if (exportDeclaration.exportClause) {
                if (ts2.isNamedExports(exportDeclaration.exportClause)) {
                  ts2.forEach(exportDeclaration.exportClause.elements, visit);
                } else {
                  visit(exportDeclaration.exportClause.name);
                }
              }
              break;
            case 265:
              var importClause = node.importClause;
              if (importClause) {
                if (importClause.name) {
                  addDeclaration(importClause.name);
                }
                if (importClause.namedBindings) {
                  if (importClause.namedBindings.kind === 267) {
                    addDeclaration(importClause.namedBindings);
                  } else {
                    ts2.forEach(importClause.namedBindings.elements, visit);
                  }
                }
              }
              break;
            case 220:
              if (ts2.getAssignmentDeclarationKind(node) !== 0) {
                addDeclaration(node);
              }
            default:
              ts2.forEachChild(node, visit);
          }
        }
      };
      return SourceFileObject2;
    }(NodeObject);
    var SourceMapSourceObject = function() {
      function SourceMapSourceObject2(fileName, text, skipTrivia) {
        this.fileName = fileName;
        this.text = text;
        this.skipTrivia = skipTrivia;
      }
      SourceMapSourceObject2.prototype.getLineAndCharacterOfPosition = function(pos) {
        return ts2.getLineAndCharacterOfPosition(this, pos);
      };
      return SourceMapSourceObject2;
    }();
    function getServicesObjectAllocator() {
      return {
        getNodeConstructor: function() {
          return NodeObject;
        },
        getTokenConstructor: function() {
          return TokenObject;
        },
        getIdentifierConstructor: function() {
          return IdentifierObject;
        },
        getPrivateIdentifierConstructor: function() {
          return PrivateIdentifierObject;
        },
        getSourceFileConstructor: function() {
          return SourceFileObject;
        },
        getSymbolConstructor: function() {
          return SymbolObject;
        },
        getTypeConstructor: function() {
          return TypeObject;
        },
        getSignatureConstructor: function() {
          return SignatureObject;
        },
        getSourceMapSourceConstructor: function() {
          return SourceMapSourceObject;
        }
      };
    }
    function toEditorSettings(optionsAsMap) {
      var allPropertiesAreCamelCased = true;
      for (var key in optionsAsMap) {
        if (ts2.hasProperty(optionsAsMap, key) && !isCamelCase(key)) {
          allPropertiesAreCamelCased = false;
          break;
        }
      }
      if (allPropertiesAreCamelCased) {
        return optionsAsMap;
      }
      var settings = {};
      for (var key in optionsAsMap) {
        if (ts2.hasProperty(optionsAsMap, key)) {
          var newKey = isCamelCase(key) ? key : key.charAt(0).toLowerCase() + key.substr(1);
          settings[newKey] = optionsAsMap[key];
        }
      }
      return settings;
    }
    ts2.toEditorSettings = toEditorSettings;
    function isCamelCase(s) {
      return !s.length || s.charAt(0) === s.charAt(0).toLowerCase();
    }
    function displayPartsToString2(displayParts) {
      if (displayParts) {
        return ts2.map(displayParts, function(displayPart) {
          return displayPart.text;
        }).join("");
      }
      return "";
    }
    ts2.displayPartsToString = displayPartsToString2;
    function getDefaultCompilerOptions() {
      return {
        target: 1,
        jsx: 1
      };
    }
    ts2.getDefaultCompilerOptions = getDefaultCompilerOptions;
    function getSupportedCodeFixes() {
      return ts2.codefix.getSupportedErrorCodes();
    }
    ts2.getSupportedCodeFixes = getSupportedCodeFixes;
    var HostCache = function() {
      function HostCache2(host, getCanonicalFileName) {
        this.host = host;
        this.currentDirectory = host.getCurrentDirectory();
        this.fileNameToEntry = new ts2.Map();
        var rootFileNames = host.getScriptFileNames();
        for (var _i = 0, rootFileNames_1 = rootFileNames; _i < rootFileNames_1.length; _i++) {
          var fileName = rootFileNames_1[_i];
          this.createEntry(fileName, ts2.toPath(fileName, this.currentDirectory, getCanonicalFileName));
        }
      }
      HostCache2.prototype.createEntry = function(fileName, path) {
        var entry;
        var scriptSnapshot = this.host.getScriptSnapshot(fileName);
        if (scriptSnapshot) {
          entry = {
            hostFileName: fileName,
            version: this.host.getScriptVersion(fileName),
            scriptSnapshot,
            scriptKind: ts2.getScriptKind(fileName, this.host)
          };
        } else {
          entry = fileName;
        }
        this.fileNameToEntry.set(path, entry);
        return entry;
      };
      HostCache2.prototype.getEntryByPath = function(path) {
        return this.fileNameToEntry.get(path);
      };
      HostCache2.prototype.getHostFileInformation = function(path) {
        var entry = this.fileNameToEntry.get(path);
        return !ts2.isString(entry) ? entry : void 0;
      };
      HostCache2.prototype.getOrCreateEntryByPath = function(fileName, path) {
        var info = this.getEntryByPath(path) || this.createEntry(fileName, path);
        return ts2.isString(info) ? void 0 : info;
      };
      HostCache2.prototype.getRootFileNames = function() {
        var names = [];
        this.fileNameToEntry.forEach(function(entry) {
          if (ts2.isString(entry)) {
            names.push(entry);
          } else {
            names.push(entry.hostFileName);
          }
        });
        return names;
      };
      HostCache2.prototype.getScriptSnapshot = function(path) {
        var file = this.getHostFileInformation(path);
        return file && file.scriptSnapshot;
      };
      return HostCache2;
    }();
    var SyntaxTreeCache = function() {
      function SyntaxTreeCache2(host) {
        this.host = host;
      }
      SyntaxTreeCache2.prototype.getCurrentSourceFile = function(fileName) {
        var scriptSnapshot = this.host.getScriptSnapshot(fileName);
        if (!scriptSnapshot) {
          throw new Error("Could not find file: '" + fileName + "'.");
        }
        var scriptKind = ts2.getScriptKind(fileName, this.host);
        var version = this.host.getScriptVersion(fileName);
        var sourceFile;
        if (this.currentFileName !== fileName) {
          sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, 99, version, true, scriptKind);
        } else if (this.currentFileVersion !== version) {
          var editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot);
          sourceFile = updateLanguageServiceSourceFile(this.currentSourceFile, scriptSnapshot, version, editRange);
        }
        if (sourceFile) {
          this.currentFileVersion = version;
          this.currentFileName = fileName;
          this.currentFileScriptSnapshot = scriptSnapshot;
          this.currentSourceFile = sourceFile;
        }
        return this.currentSourceFile;
      };
      return SyntaxTreeCache2;
    }();
    function setSourceFileFields(sourceFile, scriptSnapshot, version) {
      sourceFile.version = version;
      sourceFile.scriptSnapshot = scriptSnapshot;
    }
    function createLanguageServiceSourceFile(fileName, scriptSnapshot, scriptTarget, version, setNodeParents, scriptKind) {
      var sourceFile = ts2.createSourceFile(fileName, ts2.getSnapshotText(scriptSnapshot), scriptTarget, setNodeParents, scriptKind);
      setSourceFileFields(sourceFile, scriptSnapshot, version);
      return sourceFile;
    }
    ts2.createLanguageServiceSourceFile = createLanguageServiceSourceFile;
    function updateLanguageServiceSourceFile(sourceFile, scriptSnapshot, version, textChangeRange, aggressiveChecks) {
      if (textChangeRange) {
        if (version !== sourceFile.version) {
          var newText = void 0;
          var prefix = textChangeRange.span.start !== 0 ? sourceFile.text.substr(0, textChangeRange.span.start) : "";
          var suffix = ts2.textSpanEnd(textChangeRange.span) !== sourceFile.text.length ? sourceFile.text.substr(ts2.textSpanEnd(textChangeRange.span)) : "";
          if (textChangeRange.newLength === 0) {
            newText = prefix && suffix ? prefix + suffix : prefix || suffix;
          } else {
            var changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength);
            newText = prefix && suffix ? prefix + changedText + suffix : prefix ? prefix + changedText : changedText + suffix;
          }
          var newSourceFile = ts2.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
          setSourceFileFields(newSourceFile, scriptSnapshot, version);
          newSourceFile.nameTable = void 0;
          if (sourceFile !== newSourceFile && sourceFile.scriptSnapshot) {
            if (sourceFile.scriptSnapshot.dispose) {
              sourceFile.scriptSnapshot.dispose();
            }
            sourceFile.scriptSnapshot = void 0;
          }
          return newSourceFile;
        }
      }
      return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, true, sourceFile.scriptKind);
    }
    ts2.updateLanguageServiceSourceFile = updateLanguageServiceSourceFile;
    var NoopCancellationToken = {
      isCancellationRequested: ts2.returnFalse,
      throwIfCancellationRequested: ts2.noop
    };
    var CancellationTokenObject = function() {
      function CancellationTokenObject2(cancellationToken) {
        this.cancellationToken = cancellationToken;
      }
      CancellationTokenObject2.prototype.isCancellationRequested = function() {
        return this.cancellationToken.isCancellationRequested();
      };
      CancellationTokenObject2.prototype.throwIfCancellationRequested = function() {
        if (this.isCancellationRequested()) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("session", "cancellationThrown", { kind: "CancellationTokenObject" });
          throw new ts2.OperationCanceledException();
        }
      };
      return CancellationTokenObject2;
    }();
    var ThrottledCancellationToken = function() {
      function ThrottledCancellationToken2(hostCancellationToken, throttleWaitMilliseconds) {
        if (throttleWaitMilliseconds === void 0) {
          throttleWaitMilliseconds = 20;
        }
        this.hostCancellationToken = hostCancellationToken;
        this.throttleWaitMilliseconds = throttleWaitMilliseconds;
        this.lastCancellationCheckTime = 0;
      }
      ThrottledCancellationToken2.prototype.isCancellationRequested = function() {
        var time = ts2.timestamp();
        var duration = Math.abs(time - this.lastCancellationCheckTime);
        if (duration >= this.throttleWaitMilliseconds) {
          this.lastCancellationCheckTime = time;
          return this.hostCancellationToken.isCancellationRequested();
        }
        return false;
      };
      ThrottledCancellationToken2.prototype.throwIfCancellationRequested = function() {
        if (this.isCancellationRequested()) {
          ts2.tracing === null || ts2.tracing === void 0 ? void 0 : ts2.tracing.instant("session", "cancellationThrown", { kind: "ThrottledCancellationToken" });
          throw new ts2.OperationCanceledException();
        }
      };
      return ThrottledCancellationToken2;
    }();
    ts2.ThrottledCancellationToken = ThrottledCancellationToken;
    var invalidOperationsInPartialSemanticMode = [
      "getSemanticDiagnostics",
      "getSuggestionDiagnostics",
      "getCompilerOptionsDiagnostics",
      "getSemanticClassifications",
      "getEncodedSemanticClassifications",
      "getCodeFixesAtPosition",
      "getCombinedCodeFix",
      "applyCodeActionCommand",
      "organizeImports",
      "getEditsForFileRename",
      "getEmitOutput",
      "getApplicableRefactors",
      "getEditsForRefactor",
      "prepareCallHierarchy",
      "provideCallHierarchyIncomingCalls",
      "provideCallHierarchyOutgoingCalls",
      "provideInlayHints"
    ];
    var invalidOperationsInSyntacticMode = __spreadArray(__spreadArray([], invalidOperationsInPartialSemanticMode, true), [
      "getCompletionsAtPosition",
      "getCompletionEntryDetails",
      "getCompletionEntrySymbol",
      "getSignatureHelpItems",
      "getQuickInfoAtPosition",
      "getDefinitionAtPosition",
      "getDefinitionAndBoundSpan",
      "getImplementationAtPosition",
      "getTypeDefinitionAtPosition",
      "getReferencesAtPosition",
      "findReferences",
      "getOccurrencesAtPosition",
      "getDocumentHighlights",
      "getNavigateToItems",
      "getRenameInfo",
      "findRenameLocations",
      "getApplicableRefactors"
    ], false);
    function createLanguageService2(host, documentRegistry, syntaxOnlyOrLanguageServiceMode) {
      var _a;
      if (documentRegistry === void 0) {
        documentRegistry = ts2.createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory());
      }
      var languageServiceMode;
      if (syntaxOnlyOrLanguageServiceMode === void 0) {
        languageServiceMode = ts2.LanguageServiceMode.Semantic;
      } else if (typeof syntaxOnlyOrLanguageServiceMode === "boolean") {
        languageServiceMode = syntaxOnlyOrLanguageServiceMode ? ts2.LanguageServiceMode.Syntactic : ts2.LanguageServiceMode.Semantic;
      } else {
        languageServiceMode = syntaxOnlyOrLanguageServiceMode;
      }
      var syntaxTreeCache = new SyntaxTreeCache(host);
      var program;
      var lastProjectVersion;
      var lastTypesRootVersion = 0;
      var cancellationToken = host.getCancellationToken ? new CancellationTokenObject(host.getCancellationToken()) : NoopCancellationToken;
      var currentDirectory = host.getCurrentDirectory();
      if (!ts2.localizedDiagnosticMessages && host.getLocalizedDiagnosticMessages) {
        ts2.setLocalizedDiagnosticMessages(host.getLocalizedDiagnosticMessages());
      }
      function log(message) {
        if (host.log) {
          host.log(message);
        }
      }
      var useCaseSensitiveFileNames = ts2.hostUsesCaseSensitiveFileNames(host);
      var getCanonicalFileName = ts2.createGetCanonicalFileName(useCaseSensitiveFileNames);
      var sourceMapper = ts2.getSourceMapper({
        useCaseSensitiveFileNames: function() {
          return useCaseSensitiveFileNames;
        },
        getCurrentDirectory: function() {
          return currentDirectory;
        },
        getProgram,
        fileExists: ts2.maybeBind(host, host.fileExists),
        readFile: ts2.maybeBind(host, host.readFile),
        getDocumentPositionMapper: ts2.maybeBind(host, host.getDocumentPositionMapper),
        getSourceFileLike: ts2.maybeBind(host, host.getSourceFileLike),
        log
      });
      function getValidSourceFile(fileName) {
        var sourceFile = program.getSourceFile(fileName);
        if (!sourceFile) {
          var error = new Error("Could not find source file: '".concat(fileName, "'."));
          error.ProgramFiles = program.getSourceFiles().map(function(f) {
            return f.fileName;
          });
          throw error;
        }
        return sourceFile;
      }
      function synchronizeHostData() {
        var _a2, _b, _c;
        ts2.Debug.assert(languageServiceMode !== ts2.LanguageServiceMode.Syntactic);
        if (host.getProjectVersion) {
          var hostProjectVersion = host.getProjectVersion();
          if (hostProjectVersion) {
            if (lastProjectVersion === hostProjectVersion && !((_a2 = host.hasChangedAutomaticTypeDirectiveNames) === null || _a2 === void 0 ? void 0 : _a2.call(host))) {
              return;
            }
            lastProjectVersion = hostProjectVersion;
          }
        }
        var typeRootsVersion = host.getTypeRootsVersion ? host.getTypeRootsVersion() : 0;
        if (lastTypesRootVersion !== typeRootsVersion) {
          log("TypeRoots version has changed; provide new program");
          program = void 0;
          lastTypesRootVersion = typeRootsVersion;
        }
        var hostCache = new HostCache(host, getCanonicalFileName);
        var rootFileNames = hostCache.getRootFileNames();
        var newSettings = host.getCompilationSettings() || getDefaultCompilerOptions();
        var hasInvalidatedResolution = host.hasInvalidatedResolution || ts2.returnFalse;
        var hasChangedAutomaticTypeDirectiveNames = ts2.maybeBind(host, host.hasChangedAutomaticTypeDirectiveNames);
        var projectReferences = (_b = host.getProjectReferences) === null || _b === void 0 ? void 0 : _b.call(host);
        var parsedCommandLines;
        var parseConfigHost = {
          useCaseSensitiveFileNames,
          fileExists,
          readFile,
          readDirectory,
          trace: ts2.maybeBind(host, host.trace),
          getCurrentDirectory: function() {
            return currentDirectory;
          },
          onUnRecoverableConfigFileDiagnostic: ts2.noop
        };
        if (ts2.isProgramUptoDate(program, rootFileNames, newSettings, function(_path, fileName) {
          return host.getScriptVersion(fileName);
        }, fileExists, hasInvalidatedResolution, hasChangedAutomaticTypeDirectiveNames, getParsedCommandLine, projectReferences)) {
          return;
        }
        var compilerHost = {
          getSourceFile: getOrCreateSourceFile,
          getSourceFileByPath: getOrCreateSourceFileByPath,
          getCancellationToken: function() {
            return cancellationToken;
          },
          getCanonicalFileName,
          useCaseSensitiveFileNames: function() {
            return useCaseSensitiveFileNames;
          },
          getNewLine: function() {
            return ts2.getNewLineCharacter(newSettings, function() {
              return ts2.getNewLineOrDefaultFromHost(host);
            });
          },
          getDefaultLibFileName: function(options2) {
            return host.getDefaultLibFileName(options2);
          },
          writeFile: ts2.noop,
          getCurrentDirectory: function() {
            return currentDirectory;
          },
          fileExists,
          readFile,
          getSymlinkCache: ts2.maybeBind(host, host.getSymlinkCache),
          realpath: ts2.maybeBind(host, host.realpath),
          directoryExists: function(directoryName) {
            return ts2.directoryProbablyExists(directoryName, host);
          },
          getDirectories: function(path) {
            return host.getDirectories ? host.getDirectories(path) : [];
          },
          readDirectory,
          onReleaseOldSourceFile,
          onReleaseParsedCommandLine,
          hasInvalidatedResolution,
          hasChangedAutomaticTypeDirectiveNames,
          trace: parseConfigHost.trace,
          resolveModuleNames: ts2.maybeBind(host, host.resolveModuleNames),
          resolveTypeReferenceDirectives: ts2.maybeBind(host, host.resolveTypeReferenceDirectives),
          useSourceOfProjectReferenceRedirect: ts2.maybeBind(host, host.useSourceOfProjectReferenceRedirect),
          getParsedCommandLine
        };
        (_c = host.setCompilerHost) === null || _c === void 0 ? void 0 : _c.call(host, compilerHost);
        var documentRegistryBucketKey = documentRegistry.getKeyForCompilationSettings(newSettings);
        var options = {
          rootNames: rootFileNames,
          options: newSettings,
          host: compilerHost,
          oldProgram: program,
          projectReferences
        };
        program = ts2.createProgram(options);
        hostCache = void 0;
        parsedCommandLines = void 0;
        sourceMapper.clearCache();
        program.getTypeChecker();
        return;
        function getParsedCommandLine(fileName) {
          var path = ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
          var existing = parsedCommandLines === null || parsedCommandLines === void 0 ? void 0 : parsedCommandLines.get(path);
          if (existing !== void 0)
            return existing || void 0;
          var result = host.getParsedCommandLine ? host.getParsedCommandLine(fileName) : getParsedCommandLineOfConfigFileUsingSourceFile(fileName);
          (parsedCommandLines || (parsedCommandLines = new ts2.Map())).set(path, result || false);
          return result;
        }
        function getParsedCommandLineOfConfigFileUsingSourceFile(configFileName) {
          var result = getOrCreateSourceFile(configFileName, 100);
          if (!result)
            return void 0;
          result.path = ts2.toPath(configFileName, currentDirectory, getCanonicalFileName);
          result.resolvedPath = result.path;
          result.originalFileName = result.fileName;
          return ts2.parseJsonSourceFileConfigFileContent(result, parseConfigHost, ts2.getNormalizedAbsolutePath(ts2.getDirectoryPath(configFileName), currentDirectory), void 0, ts2.getNormalizedAbsolutePath(configFileName, currentDirectory));
        }
        function onReleaseParsedCommandLine(configFileName, oldResolvedRef, oldOptions) {
          var _a3;
          if (host.getParsedCommandLine) {
            (_a3 = host.onReleaseParsedCommandLine) === null || _a3 === void 0 ? void 0 : _a3.call(host, configFileName, oldResolvedRef, oldOptions);
          } else if (oldResolvedRef) {
            onReleaseOldSourceFile(oldResolvedRef.sourceFile, oldOptions);
          }
        }
        function fileExists(fileName) {
          var path = ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
          var entry = hostCache && hostCache.getEntryByPath(path);
          return entry ? !ts2.isString(entry) : !!host.fileExists && host.fileExists(fileName);
        }
        function readFile(fileName) {
          var path = ts2.toPath(fileName, currentDirectory, getCanonicalFileName);
          var entry = hostCache && hostCache.getEntryByPath(path);
          if (entry) {
            return ts2.isString(entry) ? void 0 : ts2.getSnapshotText(entry.scriptSnapshot);
          }
          return host.readFile && host.readFile(fileName);
        }
        function readDirectory(path, extensions, exclude, include, depth) {
          ts2.Debug.checkDefined(host.readDirectory, "'LanguageServiceHost.readDirectory' must be implemented to correctly process 'projectReferences'");
          return host.readDirectory(path, extensions, exclude, include, depth);
        }
        function onReleaseOldSourceFile(oldSourceFile, oldOptions) {
          var oldSettingsKey = documentRegistry.getKeyForCompilationSettings(oldOptions);
          documentRegistry.releaseDocumentWithKey(oldSourceFile.resolvedPath, oldSettingsKey, oldSourceFile.scriptKind);
        }
        function getOrCreateSourceFile(fileName, languageVersion, onError, shouldCreateNewSourceFile) {
          return getOrCreateSourceFileByPath(fileName, ts2.toPath(fileName, currentDirectory, getCanonicalFileName), languageVersion, onError, shouldCreateNewSourceFile);
        }
        function getOrCreateSourceFileByPath(fileName, path, _languageVersion, _onError, shouldCreateNewSourceFile) {
          ts2.Debug.assert(hostCache !== void 0, "getOrCreateSourceFileByPath called after typical CompilerHost lifetime, check the callstack something with a reference to an old host.");
          var hostFileInformation = hostCache && hostCache.getOrCreateEntryByPath(fileName, path);
          if (!hostFileInformation) {
            return void 0;
          }
          if (!shouldCreateNewSourceFile) {
            var oldSourceFile = program && program.getSourceFileByPath(path);
            if (oldSourceFile) {
              if (hostFileInformation.scriptKind === oldSourceFile.scriptKind) {
                return documentRegistry.updateDocumentWithKey(fileName, path, newSettings, documentRegistryBucketKey, hostFileInformation.scriptSnapshot, hostFileInformation.version, hostFileInformation.scriptKind);
              } else {
                documentRegistry.releaseDocumentWithKey(oldSourceFile.resolvedPath, documentRegistry.getKeyForCompilationSettings(program.getCompilerOptions()), oldSourceFile.scriptKind);
              }
            }
          }
          return documentRegistry.acquireDocumentWithKey(fileName, path, newSettings, documentRegistryBucketKey, hostFileInformation.scriptSnapshot, hostFileInformation.version, hostFileInformation.scriptKind);
        }
      }
      function getProgram() {
        if (languageServiceMode === ts2.LanguageServiceMode.Syntactic) {
          ts2.Debug.assert(program === void 0);
          return void 0;
        }
        synchronizeHostData();
        return program;
      }
      function getAutoImportProvider() {
        var _a2;
        return (_a2 = host.getPackageJsonAutoImportProvider) === null || _a2 === void 0 ? void 0 : _a2.call(host);
      }
      function cleanupSemanticCache() {
        program = void 0;
      }
      function dispose() {
        if (program) {
          var key_1 = documentRegistry.getKeyForCompilationSettings(program.getCompilerOptions());
          ts2.forEach(program.getSourceFiles(), function(f) {
            return documentRegistry.releaseDocumentWithKey(f.resolvedPath, key_1, f.scriptKind);
          });
          program = void 0;
        }
        host = void 0;
      }
      function getSyntacticDiagnostics(fileName) {
        synchronizeHostData();
        return program.getSyntacticDiagnostics(getValidSourceFile(fileName), cancellationToken).slice();
      }
      function getSemanticDiagnostics(fileName) {
        synchronizeHostData();
        var targetSourceFile = getValidSourceFile(fileName);
        var semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken);
        if (!ts2.getEmitDeclarations(program.getCompilerOptions())) {
          return semanticDiagnostics.slice();
        }
        var declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken);
        return __spreadArray(__spreadArray([], semanticDiagnostics, true), declarationDiagnostics, true);
      }
      function getSuggestionDiagnostics(fileName) {
        synchronizeHostData();
        return ts2.computeSuggestionDiagnostics(getValidSourceFile(fileName), program, cancellationToken);
      }
      function getCompilerOptionsDiagnostics() {
        synchronizeHostData();
        return __spreadArray(__spreadArray([], program.getOptionsDiagnostics(cancellationToken), true), program.getGlobalDiagnostics(cancellationToken), true);
      }
      function getCompletionsAtPosition(fileName, position, options) {
        if (options === void 0) {
          options = ts2.emptyOptions;
        }
        var fullPreferences = __assign(__assign({}, ts2.identity(options)), { includeCompletionsForModuleExports: options.includeCompletionsForModuleExports || options.includeExternalModuleExports, includeCompletionsWithInsertText: options.includeCompletionsWithInsertText || options.includeInsertTextCompletions });
        synchronizeHostData();
        return ts2.Completions.getCompletionsAtPosition(host, program, log, getValidSourceFile(fileName), position, fullPreferences, options.triggerCharacter, options.triggerKind, cancellationToken);
      }
      function getCompletionEntryDetails(fileName, position, name, formattingOptions, source, preferences, data) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        return ts2.Completions.getCompletionEntryDetails(program, log, getValidSourceFile(fileName), position, { name, source, data }, host, formattingOptions && ts2.formatting.getFormatContext(formattingOptions, host), preferences, cancellationToken);
      }
      function getCompletionEntrySymbol(fileName, position, name, source, preferences) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        return ts2.Completions.getCompletionEntrySymbol(program, log, getValidSourceFile(fileName), position, { name, source }, host, preferences);
      }
      function getQuickInfoAtPosition(fileName, position) {
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        var node = ts2.getTouchingPropertyName(sourceFile, position);
        if (node === sourceFile) {
          return void 0;
        }
        var typeChecker = program.getTypeChecker();
        var nodeForQuickInfo = getNodeForQuickInfo(node);
        var symbol = getSymbolAtLocationForQuickInfo(nodeForQuickInfo, typeChecker);
        if (!symbol || typeChecker.isUnknownSymbol(symbol)) {
          var type_2 = shouldGetType(sourceFile, nodeForQuickInfo, position) ? typeChecker.getTypeAtLocation(nodeForQuickInfo) : void 0;
          return type_2 && {
            kind: "",
            kindModifiers: "",
            textSpan: ts2.createTextSpanFromNode(nodeForQuickInfo, sourceFile),
            displayParts: typeChecker.runWithCancellationToken(cancellationToken, function(typeChecker2) {
              return ts2.typeToDisplayParts(typeChecker2, type_2, ts2.getContainerNode(nodeForQuickInfo));
            }),
            documentation: type_2.symbol ? type_2.symbol.getDocumentationComment(typeChecker) : void 0,
            tags: type_2.symbol ? type_2.symbol.getJsDocTags(typeChecker) : void 0
          };
        }
        var _a2 = typeChecker.runWithCancellationToken(cancellationToken, function(typeChecker2) {
          return ts2.SymbolDisplay.getSymbolDisplayPartsDocumentationAndSymbolKind(typeChecker2, symbol, sourceFile, ts2.getContainerNode(nodeForQuickInfo), nodeForQuickInfo);
        }), symbolKind = _a2.symbolKind, displayParts = _a2.displayParts, documentation = _a2.documentation, tags = _a2.tags;
        return {
          kind: symbolKind,
          kindModifiers: ts2.SymbolDisplay.getSymbolModifiers(typeChecker, symbol),
          textSpan: ts2.createTextSpanFromNode(nodeForQuickInfo, sourceFile),
          displayParts,
          documentation,
          tags
        };
      }
      function getNodeForQuickInfo(node) {
        if (ts2.isNewExpression(node.parent) && node.pos === node.parent.pos) {
          return node.parent.expression;
        }
        if (ts2.isNamedTupleMember(node.parent) && node.pos === node.parent.pos) {
          return node.parent;
        }
        return node;
      }
      function shouldGetType(sourceFile, node, position) {
        switch (node.kind) {
          case 79:
            return !ts2.isLabelName(node) && !ts2.isTagName(node) && !ts2.isConstTypeReference(node.parent);
          case 205:
          case 160:
            return !ts2.isInComment(sourceFile, position);
          case 108:
          case 191:
          case 106:
          case 196:
            return true;
          default:
            return false;
        }
      }
      function getDefinitionAtPosition(fileName, position) {
        synchronizeHostData();
        return ts2.GoToDefinition.getDefinitionAtPosition(program, getValidSourceFile(fileName), position);
      }
      function getDefinitionAndBoundSpan(fileName, position) {
        synchronizeHostData();
        return ts2.GoToDefinition.getDefinitionAndBoundSpan(program, getValidSourceFile(fileName), position);
      }
      function getTypeDefinitionAtPosition(fileName, position) {
        synchronizeHostData();
        return ts2.GoToDefinition.getTypeDefinitionAtPosition(program.getTypeChecker(), getValidSourceFile(fileName), position);
      }
      function getImplementationAtPosition(fileName, position) {
        synchronizeHostData();
        return ts2.FindAllReferences.getImplementationsAtPosition(program, cancellationToken, program.getSourceFiles(), getValidSourceFile(fileName), position);
      }
      function getOccurrencesAtPosition(fileName, position) {
        return ts2.flatMap(getDocumentHighlights(fileName, position, [fileName]), function(entry) {
          return entry.highlightSpans.map(function(highlightSpan) {
            return __assign(__assign({ fileName: entry.fileName, textSpan: highlightSpan.textSpan, isWriteAccess: highlightSpan.kind === "writtenReference", isDefinition: false }, highlightSpan.isInString && { isInString: true }), highlightSpan.contextSpan && { contextSpan: highlightSpan.contextSpan });
          });
        });
      }
      function getDocumentHighlights(fileName, position, filesToSearch) {
        var normalizedFileName = ts2.normalizePath(fileName);
        ts2.Debug.assert(filesToSearch.some(function(f) {
          return ts2.normalizePath(f) === normalizedFileName;
        }));
        synchronizeHostData();
        var sourceFilesToSearch = ts2.mapDefined(filesToSearch, function(fileName2) {
          return program.getSourceFile(fileName2);
        });
        var sourceFile = getValidSourceFile(fileName);
        return ts2.DocumentHighlights.getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch);
      }
      function findRenameLocations(fileName, position, findInStrings, findInComments, providePrefixAndSuffixTextForRename) {
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        var node = ts2.getAdjustedRenameLocation(ts2.getTouchingPropertyName(sourceFile, position));
        if (!ts2.Rename.nodeIsEligibleForRename(node))
          return void 0;
        if (ts2.isIdentifier(node) && (ts2.isJsxOpeningElement(node.parent) || ts2.isJsxClosingElement(node.parent)) && ts2.isIntrinsicJsxName(node.escapedText)) {
          var _a2 = node.parent.parent, openingElement = _a2.openingElement, closingElement = _a2.closingElement;
          return [openingElement, closingElement].map(function(node2) {
            var textSpan = ts2.createTextSpanFromNode(node2.tagName, sourceFile);
            return __assign({ fileName: sourceFile.fileName, textSpan }, ts2.FindAllReferences.toContextSpan(textSpan, sourceFile, node2.parent));
          });
        } else {
          return getReferencesWorker(node, position, { findInStrings, findInComments, providePrefixAndSuffixTextForRename, use: 2 }, function(entry, originalNode, checker) {
            return ts2.FindAllReferences.toRenameLocation(entry, originalNode, checker, providePrefixAndSuffixTextForRename || false);
          });
        }
      }
      function getReferencesAtPosition(fileName, position) {
        synchronizeHostData();
        return getReferencesWorker(ts2.getTouchingPropertyName(getValidSourceFile(fileName), position), position, { use: 1 }, function(entry, node, checker) {
          return ts2.FindAllReferences.toReferenceEntry(entry, checker.getSymbolAtLocation(node));
        });
      }
      function getReferencesWorker(node, position, options, cb) {
        synchronizeHostData();
        var sourceFiles = options && options.use === 2 ? program.getSourceFiles().filter(function(sourceFile) {
          return !program.isSourceFileDefaultLibrary(sourceFile);
        }) : program.getSourceFiles();
        return ts2.FindAllReferences.findReferenceOrRenameEntries(program, cancellationToken, sourceFiles, node, position, options, cb);
      }
      function findReferences(fileName, position) {
        synchronizeHostData();
        return ts2.FindAllReferences.findReferencedSymbols(program, cancellationToken, program.getSourceFiles(), getValidSourceFile(fileName), position);
      }
      function getFileReferences(fileName) {
        var _a2;
        synchronizeHostData();
        var moduleSymbol = (_a2 = program.getSourceFile(fileName)) === null || _a2 === void 0 ? void 0 : _a2.symbol;
        return ts2.FindAllReferences.Core.getReferencesForFileName(fileName, program, program.getSourceFiles()).map(function(r) {
          return ts2.FindAllReferences.toReferenceEntry(r, moduleSymbol);
        });
      }
      function getNavigateToItems(searchValue, maxResultCount, fileName, excludeDtsFiles) {
        if (excludeDtsFiles === void 0) {
          excludeDtsFiles = false;
        }
        synchronizeHostData();
        var sourceFiles = fileName ? [getValidSourceFile(fileName)] : program.getSourceFiles();
        return ts2.NavigateTo.getNavigateToItems(sourceFiles, program.getTypeChecker(), cancellationToken, searchValue, maxResultCount, excludeDtsFiles);
      }
      function getEmitOutput(fileName, emitOnlyDtsFiles, forceDtsEmit) {
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        var customTransformers = host.getCustomTransformers && host.getCustomTransformers();
        return ts2.getFileEmitOutput(program, sourceFile, !!emitOnlyDtsFiles, cancellationToken, customTransformers, forceDtsEmit);
      }
      function getSignatureHelpItems(fileName, position, _a2) {
        var _b = _a2 === void 0 ? ts2.emptyOptions : _a2, triggerReason = _b.triggerReason;
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        return ts2.SignatureHelp.getSignatureHelpItems(program, sourceFile, position, triggerReason, cancellationToken);
      }
      function getNonBoundSourceFile(fileName) {
        return syntaxTreeCache.getCurrentSourceFile(fileName);
      }
      function getNameOrDottedNameSpan(fileName, startPos, _endPos) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var node = ts2.getTouchingPropertyName(sourceFile, startPos);
        if (node === sourceFile) {
          return void 0;
        }
        switch (node.kind) {
          case 205:
          case 160:
          case 10:
          case 95:
          case 110:
          case 104:
          case 106:
          case 108:
          case 191:
          case 79:
            break;
          default:
            return void 0;
        }
        var nodeForStartPos = node;
        while (true) {
          if (ts2.isRightSideOfPropertyAccess(nodeForStartPos) || ts2.isRightSideOfQualifiedName(nodeForStartPos)) {
            nodeForStartPos = nodeForStartPos.parent;
          } else if (ts2.isNameOfModuleDeclaration(nodeForStartPos)) {
            if (nodeForStartPos.parent.parent.kind === 260 && nodeForStartPos.parent.parent.body === nodeForStartPos.parent) {
              nodeForStartPos = nodeForStartPos.parent.parent.name;
            } else {
              break;
            }
          } else {
            break;
          }
        }
        return ts2.createTextSpanFromBounds(nodeForStartPos.getStart(), node.getEnd());
      }
      function getBreakpointStatementAtPosition(fileName, position) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        return ts2.BreakpointResolver.spanInSourceFileAtLocation(sourceFile, position);
      }
      function getNavigationBarItems(fileName) {
        return ts2.NavigationBar.getNavigationBarItems(syntaxTreeCache.getCurrentSourceFile(fileName), cancellationToken);
      }
      function getNavigationTree(fileName) {
        return ts2.NavigationBar.getNavigationTree(syntaxTreeCache.getCurrentSourceFile(fileName), cancellationToken);
      }
      function getSemanticClassifications(fileName, span, format) {
        synchronizeHostData();
        var responseFormat = format || "original";
        if (responseFormat === "2020") {
          return ts2.classifier.v2020.getSemanticClassifications(program, cancellationToken, getValidSourceFile(fileName), span);
        } else {
          return ts2.getSemanticClassifications(program.getTypeChecker(), cancellationToken, getValidSourceFile(fileName), program.getClassifiableNames(), span);
        }
      }
      function getEncodedSemanticClassifications(fileName, span, format) {
        synchronizeHostData();
        var responseFormat = format || "original";
        if (responseFormat === "original") {
          return ts2.getEncodedSemanticClassifications(program.getTypeChecker(), cancellationToken, getValidSourceFile(fileName), program.getClassifiableNames(), span);
        } else {
          return ts2.classifier.v2020.getEncodedSemanticClassifications(program, cancellationToken, getValidSourceFile(fileName), span);
        }
      }
      function getSyntacticClassifications(fileName, span) {
        return ts2.getSyntacticClassifications(cancellationToken, syntaxTreeCache.getCurrentSourceFile(fileName), span);
      }
      function getEncodedSyntacticClassifications(fileName, span) {
        return ts2.getEncodedSyntacticClassifications(cancellationToken, syntaxTreeCache.getCurrentSourceFile(fileName), span);
      }
      function getOutliningSpans(fileName) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        return ts2.OutliningElementsCollector.collectElements(sourceFile, cancellationToken);
      }
      var braceMatching = new ts2.Map(ts2.getEntries((_a = {}, _a[18] = 19, _a[20] = 21, _a[22] = 23, _a[31] = 29, _a)));
      braceMatching.forEach(function(value, key) {
        return braceMatching.set(value.toString(), Number(key));
      });
      function getBraceMatchingAtPosition(fileName, position) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var token = ts2.getTouchingToken(sourceFile, position);
        var matchKind = token.getStart(sourceFile) === position ? braceMatching.get(token.kind.toString()) : void 0;
        var match = matchKind && ts2.findChildOfKind(token.parent, matchKind, sourceFile);
        return match ? [ts2.createTextSpanFromNode(token, sourceFile), ts2.createTextSpanFromNode(match, sourceFile)].sort(function(a, b) {
          return a.start - b.start;
        }) : ts2.emptyArray;
      }
      function getIndentationAtPosition(fileName, position, editorOptions) {
        var start = ts2.timestamp();
        var settings = toEditorSettings(editorOptions);
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        log("getIndentationAtPosition: getCurrentSourceFile: " + (ts2.timestamp() - start));
        start = ts2.timestamp();
        var result = ts2.formatting.SmartIndenter.getIndentation(position, sourceFile, settings);
        log("getIndentationAtPosition: computeIndentation  : " + (ts2.timestamp() - start));
        return result;
      }
      function getFormattingEditsForRange(fileName, start, end, options) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        return ts2.formatting.formatSelection(start, end, sourceFile, ts2.formatting.getFormatContext(toEditorSettings(options), host));
      }
      function getFormattingEditsForDocument(fileName, options) {
        return ts2.formatting.formatDocument(syntaxTreeCache.getCurrentSourceFile(fileName), ts2.formatting.getFormatContext(toEditorSettings(options), host));
      }
      function getFormattingEditsAfterKeystroke(fileName, position, key, options) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var formatContext = ts2.formatting.getFormatContext(toEditorSettings(options), host);
        if (!ts2.isInComment(sourceFile, position)) {
          switch (key) {
            case "{":
              return ts2.formatting.formatOnOpeningCurly(position, sourceFile, formatContext);
            case "}":
              return ts2.formatting.formatOnClosingCurly(position, sourceFile, formatContext);
            case ";":
              return ts2.formatting.formatOnSemicolon(position, sourceFile, formatContext);
            case "\n":
              return ts2.formatting.formatOnEnter(position, sourceFile, formatContext);
          }
        }
        return [];
      }
      function getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        var span = ts2.createTextSpanFromBounds(start, end);
        var formatContext = ts2.formatting.getFormatContext(formatOptions, host);
        return ts2.flatMap(ts2.deduplicate(errorCodes, ts2.equateValues, ts2.compareValues), function(errorCode) {
          cancellationToken.throwIfCancellationRequested();
          return ts2.codefix.getFixes({ errorCode, sourceFile, span, program, host, cancellationToken, formatContext, preferences });
        });
      }
      function getCombinedCodeFix(scope, fixId, formatOptions, preferences) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        ts2.Debug.assert(scope.type === "file");
        var sourceFile = getValidSourceFile(scope.fileName);
        var formatContext = ts2.formatting.getFormatContext(formatOptions, host);
        return ts2.codefix.getAllFixes({ fixId, sourceFile, program, host, cancellationToken, formatContext, preferences });
      }
      function organizeImports(args, formatOptions, preferences) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        ts2.Debug.assert(args.type === "file");
        var sourceFile = getValidSourceFile(args.fileName);
        var formatContext = ts2.formatting.getFormatContext(formatOptions, host);
        return ts2.OrganizeImports.organizeImports(sourceFile, formatContext, host, program, preferences, args.skipDestructiveCodeActions);
      }
      function getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        return ts2.getEditsForFileRename(getProgram(), oldFilePath, newFilePath, host, ts2.formatting.getFormatContext(formatOptions, host), preferences, sourceMapper);
      }
      function applyCodeActionCommand(fileName, actionOrFormatSettingsOrUndefined) {
        var action = typeof fileName === "string" ? actionOrFormatSettingsOrUndefined : fileName;
        return ts2.isArray(action) ? Promise.all(action.map(function(a) {
          return applySingleCodeActionCommand(a);
        })) : applySingleCodeActionCommand(action);
      }
      function applySingleCodeActionCommand(action) {
        var getPath = function(path) {
          return ts2.toPath(path, currentDirectory, getCanonicalFileName);
        };
        ts2.Debug.assertEqual(action.type, "install package");
        return host.installPackage ? host.installPackage({ fileName: getPath(action.file), packageName: action.packageName }) : Promise.reject("Host does not implement `installPackage`");
      }
      function getDocCommentTemplateAtPosition(fileName, position, options) {
        return ts2.JsDoc.getDocCommentTemplateAtPosition(ts2.getNewLineOrDefaultFromHost(host), syntaxTreeCache.getCurrentSourceFile(fileName), position, options);
      }
      function isValidBraceCompletionAtPosition(fileName, position, openingBrace) {
        if (openingBrace === 60) {
          return false;
        }
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        if (ts2.isInString(sourceFile, position)) {
          return false;
        }
        if (ts2.isInsideJsxElementOrAttribute(sourceFile, position)) {
          return openingBrace === 123;
        }
        if (ts2.isInTemplateString(sourceFile, position)) {
          return false;
        }
        switch (openingBrace) {
          case 39:
          case 34:
          case 96:
            return !ts2.isInComment(sourceFile, position);
        }
        return true;
      }
      function getJsxClosingTagAtPosition(fileName, position) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var token = ts2.findPrecedingToken(position, sourceFile);
        if (!token)
          return void 0;
        var element = token.kind === 31 && ts2.isJsxOpeningElement(token.parent) ? token.parent.parent : ts2.isJsxText(token) && ts2.isJsxElement(token.parent) ? token.parent : void 0;
        if (element && isUnclosedTag(element)) {
          return { newText: "</".concat(element.openingElement.tagName.getText(sourceFile), ">") };
        }
        var fragment = token.kind === 31 && ts2.isJsxOpeningFragment(token.parent) ? token.parent.parent : ts2.isJsxText(token) && ts2.isJsxFragment(token.parent) ? token.parent : void 0;
        if (fragment && isUnclosedFragment(fragment)) {
          return { newText: "</>" };
        }
      }
      function getLinesForRange(sourceFile, textRange) {
        return {
          lineStarts: sourceFile.getLineStarts(),
          firstLine: sourceFile.getLineAndCharacterOfPosition(textRange.pos).line,
          lastLine: sourceFile.getLineAndCharacterOfPosition(textRange.end).line
        };
      }
      function toggleLineComment(fileName, textRange, insertComment) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var textChanges = [];
        var _a2 = getLinesForRange(sourceFile, textRange), lineStarts = _a2.lineStarts, firstLine = _a2.firstLine, lastLine = _a2.lastLine;
        var isCommenting = insertComment || false;
        var leftMostPosition = Number.MAX_VALUE;
        var lineTextStarts = new ts2.Map();
        var firstNonWhitespaceCharacterRegex = new RegExp(/\S/);
        var isJsx = ts2.isInsideJsxElement(sourceFile, lineStarts[firstLine]);
        var openComment = isJsx ? "{/*" : "//";
        for (var i = firstLine; i <= lastLine; i++) {
          var lineText = sourceFile.text.substring(lineStarts[i], sourceFile.getLineEndOfPosition(lineStarts[i]));
          var regExec = firstNonWhitespaceCharacterRegex.exec(lineText);
          if (regExec) {
            leftMostPosition = Math.min(leftMostPosition, regExec.index);
            lineTextStarts.set(i.toString(), regExec.index);
            if (lineText.substr(regExec.index, openComment.length) !== openComment) {
              isCommenting = insertComment === void 0 || insertComment;
            }
          }
        }
        for (var i = firstLine; i <= lastLine; i++) {
          if (firstLine !== lastLine && lineStarts[i] === textRange.end) {
            continue;
          }
          var lineTextStart = lineTextStarts.get(i.toString());
          if (lineTextStart !== void 0) {
            if (isJsx) {
              textChanges.push.apply(textChanges, toggleMultilineComment(fileName, { pos: lineStarts[i] + leftMostPosition, end: sourceFile.getLineEndOfPosition(lineStarts[i]) }, isCommenting, isJsx));
            } else if (isCommenting) {
              textChanges.push({
                newText: openComment,
                span: {
                  length: 0,
                  start: lineStarts[i] + leftMostPosition
                }
              });
            } else if (sourceFile.text.substr(lineStarts[i] + lineTextStart, openComment.length) === openComment) {
              textChanges.push({
                newText: "",
                span: {
                  length: openComment.length,
                  start: lineStarts[i] + lineTextStart
                }
              });
            }
          }
        }
        return textChanges;
      }
      function toggleMultilineComment(fileName, textRange, insertComment, isInsideJsx) {
        var _a2;
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var textChanges = [];
        var text = sourceFile.text;
        var hasComment = false;
        var isCommenting = insertComment || false;
        var positions = [];
        var pos = textRange.pos;
        var isJsx = isInsideJsx !== void 0 ? isInsideJsx : ts2.isInsideJsxElement(sourceFile, pos);
        var openMultiline = isJsx ? "{/*" : "/*";
        var closeMultiline = isJsx ? "*/}" : "*/";
        var openMultilineRegex = isJsx ? "\\{\\/\\*" : "\\/\\*";
        var closeMultilineRegex = isJsx ? "\\*\\/\\}" : "\\*\\/";
        while (pos <= textRange.end) {
          var offset = text.substr(pos, openMultiline.length) === openMultiline ? openMultiline.length : 0;
          var commentRange = ts2.isInComment(sourceFile, pos + offset);
          if (commentRange) {
            if (isJsx) {
              commentRange.pos--;
              commentRange.end++;
            }
            positions.push(commentRange.pos);
            if (commentRange.kind === 3) {
              positions.push(commentRange.end);
            }
            hasComment = true;
            pos = commentRange.end + 1;
          } else {
            var newPos = text.substring(pos, textRange.end).search("(".concat(openMultilineRegex, ")|(").concat(closeMultilineRegex, ")"));
            isCommenting = insertComment !== void 0 ? insertComment : isCommenting || !ts2.isTextWhiteSpaceLike(text, pos, newPos === -1 ? textRange.end : pos + newPos);
            pos = newPos === -1 ? textRange.end + 1 : pos + newPos + closeMultiline.length;
          }
        }
        if (isCommenting || !hasComment) {
          if (((_a2 = ts2.isInComment(sourceFile, textRange.pos)) === null || _a2 === void 0 ? void 0 : _a2.kind) !== 2) {
            ts2.insertSorted(positions, textRange.pos, ts2.compareValues);
          }
          ts2.insertSorted(positions, textRange.end, ts2.compareValues);
          var firstPos = positions[0];
          if (text.substr(firstPos, openMultiline.length) !== openMultiline) {
            textChanges.push({
              newText: openMultiline,
              span: {
                length: 0,
                start: firstPos
              }
            });
          }
          for (var i = 1; i < positions.length - 1; i++) {
            if (text.substr(positions[i] - closeMultiline.length, closeMultiline.length) !== closeMultiline) {
              textChanges.push({
                newText: closeMultiline,
                span: {
                  length: 0,
                  start: positions[i]
                }
              });
            }
            if (text.substr(positions[i], openMultiline.length) !== openMultiline) {
              textChanges.push({
                newText: openMultiline,
                span: {
                  length: 0,
                  start: positions[i]
                }
              });
            }
          }
          if (textChanges.length % 2 !== 0) {
            textChanges.push({
              newText: closeMultiline,
              span: {
                length: 0,
                start: positions[positions.length - 1]
              }
            });
          }
        } else {
          for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {
            var pos_2 = positions_1[_i];
            var from = pos_2 - closeMultiline.length > 0 ? pos_2 - closeMultiline.length : 0;
            var offset = text.substr(from, closeMultiline.length) === closeMultiline ? closeMultiline.length : 0;
            textChanges.push({
              newText: "",
              span: {
                length: openMultiline.length,
                start: pos_2 - offset
              }
            });
          }
        }
        return textChanges;
      }
      function commentSelection(fileName, textRange) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var _a2 = getLinesForRange(sourceFile, textRange), firstLine = _a2.firstLine, lastLine = _a2.lastLine;
        return firstLine === lastLine && textRange.pos !== textRange.end ? toggleMultilineComment(fileName, textRange, true) : toggleLineComment(fileName, textRange, true);
      }
      function uncommentSelection(fileName, textRange) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var textChanges = [];
        var pos = textRange.pos;
        var end = textRange.end;
        if (pos === end) {
          end += ts2.isInsideJsxElement(sourceFile, pos) ? 2 : 1;
        }
        for (var i = pos; i <= end; i++) {
          var commentRange = ts2.isInComment(sourceFile, i);
          if (commentRange) {
            switch (commentRange.kind) {
              case 2:
                textChanges.push.apply(textChanges, toggleLineComment(fileName, { end: commentRange.end, pos: commentRange.pos + 1 }, false));
                break;
              case 3:
                textChanges.push.apply(textChanges, toggleMultilineComment(fileName, { end: commentRange.end, pos: commentRange.pos + 1 }, false));
            }
            i = commentRange.end + 1;
          }
        }
        return textChanges;
      }
      function isUnclosedTag(_a2) {
        var openingElement = _a2.openingElement, closingElement = _a2.closingElement, parent = _a2.parent;
        return !ts2.tagNamesAreEquivalent(openingElement.tagName, closingElement.tagName) || ts2.isJsxElement(parent) && ts2.tagNamesAreEquivalent(openingElement.tagName, parent.openingElement.tagName) && isUnclosedTag(parent);
      }
      function isUnclosedFragment(_a2) {
        var closingFragment = _a2.closingFragment, parent = _a2.parent;
        return !!(closingFragment.flags & 65536) || ts2.isJsxFragment(parent) && isUnclosedFragment(parent);
      }
      function getSpanOfEnclosingComment(fileName, position, onlyMultiLine) {
        var sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName);
        var range = ts2.formatting.getRangeOfEnclosingComment(sourceFile, position);
        return range && (!onlyMultiLine || range.kind === 3) ? ts2.createTextSpanFromRange(range) : void 0;
      }
      function getTodoComments(fileName, descriptors) {
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        cancellationToken.throwIfCancellationRequested();
        var fileContents = sourceFile.text;
        var result = [];
        if (descriptors.length > 0 && !isNodeModulesFile(sourceFile.fileName)) {
          var regExp = getTodoCommentsRegExp();
          var matchArray = void 0;
          while (matchArray = regExp.exec(fileContents)) {
            cancellationToken.throwIfCancellationRequested();
            var firstDescriptorCaptureIndex = 3;
            ts2.Debug.assert(matchArray.length === descriptors.length + firstDescriptorCaptureIndex);
            var preamble = matchArray[1];
            var matchPosition = matchArray.index + preamble.length;
            if (!ts2.isInComment(sourceFile, matchPosition)) {
              continue;
            }
            var descriptor = void 0;
            for (var i = 0; i < descriptors.length; i++) {
              if (matchArray[i + firstDescriptorCaptureIndex]) {
                descriptor = descriptors[i];
              }
            }
            if (descriptor === void 0)
              return ts2.Debug.fail();
            if (isLetterOrDigit(fileContents.charCodeAt(matchPosition + descriptor.text.length))) {
              continue;
            }
            var message = matchArray[2];
            result.push({ descriptor, message, position: matchPosition });
          }
        }
        return result;
        function escapeRegExp(str) {
          return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
        }
        function getTodoCommentsRegExp() {
          var singleLineCommentStart = /(?:\/\/+\s*)/.source;
          var multiLineCommentStart = /(?:\/\*+\s*)/.source;
          var anyNumberOfSpacesAndAsterisksAtStartOfLine = /(?:^(?:\s|\*)*)/.source;
          var preamble2 = "(" + anyNumberOfSpacesAndAsterisksAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")";
          var literals = "(?:" + ts2.map(descriptors, function(d) {
            return "(" + escapeRegExp(d.text) + ")";
          }).join("|") + ")";
          var endOfLineOrEndOfComment = /(?:$|\*\/)/.source;
          var messageRemainder = /(?:.*?)/.source;
          var messagePortion = "(" + literals + messageRemainder + ")";
          var regExpString = preamble2 + messagePortion + endOfLineOrEndOfComment;
          return new RegExp(regExpString, "gim");
        }
        function isLetterOrDigit(char) {
          return char >= 97 && char <= 122 || char >= 65 && char <= 90 || char >= 48 && char <= 57;
        }
        function isNodeModulesFile(path) {
          return ts2.stringContains(path, "/node_modules/");
        }
      }
      function getRenameInfo(fileName, position, options) {
        synchronizeHostData();
        return ts2.Rename.getRenameInfo(program, getValidSourceFile(fileName), position, options);
      }
      function getRefactorContext(file, positionOrRange, preferences, formatOptions, triggerReason, kind) {
        var _a2 = typeof positionOrRange === "number" ? [positionOrRange, void 0] : [positionOrRange.pos, positionOrRange.end], startPosition = _a2[0], endPosition = _a2[1];
        return {
          file,
          startPosition,
          endPosition,
          program: getProgram(),
          host,
          formatContext: ts2.formatting.getFormatContext(formatOptions, host),
          cancellationToken,
          preferences,
          triggerReason,
          kind
        };
      }
      function getInlayHintsContext(file, span, preferences) {
        return {
          file,
          program: getProgram(),
          host,
          span,
          preferences,
          cancellationToken
        };
      }
      function getSmartSelectionRange(fileName, position) {
        return ts2.SmartSelectionRange.getSmartSelectionRange(position, syntaxTreeCache.getCurrentSourceFile(fileName));
      }
      function getApplicableRefactors(fileName, positionOrRange, preferences, triggerReason, kind) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        var file = getValidSourceFile(fileName);
        return ts2.refactor.getApplicableRefactors(getRefactorContext(file, positionOrRange, preferences, ts2.emptyOptions, triggerReason, kind));
      }
      function getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        var file = getValidSourceFile(fileName);
        return ts2.refactor.getEditsForRefactor(getRefactorContext(file, positionOrRange, preferences, formatOptions), refactorName, actionName);
      }
      function toLineColumnOffset(fileName, position) {
        if (position === 0) {
          return { line: 0, character: 0 };
        }
        return sourceMapper.toLineColumnOffset(fileName, position);
      }
      function prepareCallHierarchy(fileName, position) {
        synchronizeHostData();
        var declarations = ts2.CallHierarchy.resolveCallHierarchyDeclaration(program, ts2.getTouchingPropertyName(getValidSourceFile(fileName), position));
        return declarations && ts2.mapOneOrMany(declarations, function(declaration) {
          return ts2.CallHierarchy.createCallHierarchyItem(program, declaration);
        });
      }
      function provideCallHierarchyIncomingCalls(fileName, position) {
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        var declaration = ts2.firstOrOnly(ts2.CallHierarchy.resolveCallHierarchyDeclaration(program, position === 0 ? sourceFile : ts2.getTouchingPropertyName(sourceFile, position)));
        return declaration ? ts2.CallHierarchy.getIncomingCalls(program, declaration, cancellationToken) : [];
      }
      function provideCallHierarchyOutgoingCalls(fileName, position) {
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        var declaration = ts2.firstOrOnly(ts2.CallHierarchy.resolveCallHierarchyDeclaration(program, position === 0 ? sourceFile : ts2.getTouchingPropertyName(sourceFile, position)));
        return declaration ? ts2.CallHierarchy.getOutgoingCalls(program, declaration) : [];
      }
      function provideInlayHints(fileName, span, preferences) {
        if (preferences === void 0) {
          preferences = ts2.emptyOptions;
        }
        synchronizeHostData();
        var sourceFile = getValidSourceFile(fileName);
        return ts2.InlayHints.provideInlayHints(getInlayHintsContext(sourceFile, span, preferences));
      }
      var ls = {
        dispose,
        cleanupSemanticCache,
        getSyntacticDiagnostics,
        getSemanticDiagnostics,
        getSuggestionDiagnostics,
        getCompilerOptionsDiagnostics,
        getSyntacticClassifications,
        getSemanticClassifications,
        getEncodedSyntacticClassifications,
        getEncodedSemanticClassifications,
        getCompletionsAtPosition,
        getCompletionEntryDetails,
        getCompletionEntrySymbol,
        getSignatureHelpItems,
        getQuickInfoAtPosition,
        getDefinitionAtPosition,
        getDefinitionAndBoundSpan,
        getImplementationAtPosition,
        getTypeDefinitionAtPosition,
        getReferencesAtPosition,
        findReferences,
        getFileReferences,
        getOccurrencesAtPosition,
        getDocumentHighlights,
        getNameOrDottedNameSpan,
        getBreakpointStatementAtPosition,
        getNavigateToItems,
        getRenameInfo,
        getSmartSelectionRange,
        findRenameLocations,
        getNavigationBarItems,
        getNavigationTree,
        getOutliningSpans,
        getTodoComments,
        getBraceMatchingAtPosition,
        getIndentationAtPosition,
        getFormattingEditsForRange,
        getFormattingEditsForDocument,
        getFormattingEditsAfterKeystroke,
        getDocCommentTemplateAtPosition,
        isValidBraceCompletionAtPosition,
        getJsxClosingTagAtPosition,
        getSpanOfEnclosingComment,
        getCodeFixesAtPosition,
        getCombinedCodeFix,
        applyCodeActionCommand,
        organizeImports,
        getEditsForFileRename,
        getEmitOutput,
        getNonBoundSourceFile,
        getProgram,
        getAutoImportProvider,
        getApplicableRefactors,
        getEditsForRefactor,
        toLineColumnOffset,
        getSourceMapper: function() {
          return sourceMapper;
        },
        clearSourceMapperCache: function() {
          return sourceMapper.clearCache();
        },
        prepareCallHierarchy,
        provideCallHierarchyIncomingCalls,
        provideCallHierarchyOutgoingCalls,
        toggleLineComment,
        toggleMultilineComment,
        commentSelection,
        uncommentSelection,
        provideInlayHints
      };
      switch (languageServiceMode) {
        case ts2.LanguageServiceMode.Semantic:
          break;
        case ts2.LanguageServiceMode.PartialSemantic:
          invalidOperationsInPartialSemanticMode.forEach(function(key) {
            return ls[key] = function() {
              throw new Error("LanguageService Operation: ".concat(key, " not allowed in LanguageServiceMode.PartialSemantic"));
            };
          });
          break;
        case ts2.LanguageServiceMode.Syntactic:
          invalidOperationsInSyntacticMode.forEach(function(key) {
            return ls[key] = function() {
              throw new Error("LanguageService Operation: ".concat(key, " not allowed in LanguageServiceMode.Syntactic"));
            };
          });
          break;
        default:
          ts2.Debug.assertNever(languageServiceMode);
      }
      return ls;
    }
    ts2.createLanguageService = createLanguageService2;
    function getNameTable(sourceFile) {
      if (!sourceFile.nameTable) {
        initializeNameTable(sourceFile);
      }
      return sourceFile.nameTable;
    }
    ts2.getNameTable = getNameTable;
    function initializeNameTable(sourceFile) {
      var nameTable = sourceFile.nameTable = new ts2.Map();
      sourceFile.forEachChild(function walk(node) {
        if (ts2.isIdentifier(node) && !ts2.isTagName(node) && node.escapedText || ts2.isStringOrNumericLiteralLike(node) && literalIsName(node)) {
          var text = ts2.getEscapedTextOfIdentifierOrLiteral(node);
          nameTable.set(text, nameTable.get(text) === void 0 ? node.pos : -1);
        } else if (ts2.isPrivateIdentifier(node)) {
          var text = node.escapedText;
          nameTable.set(text, nameTable.get(text) === void 0 ? node.pos : -1);
        }
        ts2.forEachChild(node, walk);
        if (ts2.hasJSDocNodes(node)) {
          for (var _i = 0, _a = node.jsDoc; _i < _a.length; _i++) {
            var jsDoc = _a[_i];
            ts2.forEachChild(jsDoc, walk);
          }
        }
      });
    }
    function literalIsName(node) {
      return ts2.isDeclarationName(node) || node.parent.kind === 276 || isArgumentOfElementAccessExpression(node) || ts2.isLiteralComputedPropertyDeclarationName(node);
    }
    function getContainingObjectLiteralElement(node) {
      var element = getContainingObjectLiteralElementWorker(node);
      return element && (ts2.isObjectLiteralExpression(element.parent) || ts2.isJsxAttributes(element.parent)) ? element : void 0;
    }
    ts2.getContainingObjectLiteralElement = getContainingObjectLiteralElement;
    function getContainingObjectLiteralElementWorker(node) {
      switch (node.kind) {
        case 10:
        case 14:
        case 8:
          if (node.parent.kind === 161) {
            return ts2.isObjectLiteralElement(node.parent.parent) ? node.parent.parent : void 0;
          }
        case 79:
          return ts2.isObjectLiteralElement(node.parent) && (node.parent.parent.kind === 204 || node.parent.parent.kind === 285) && node.parent.name === node ? node.parent : void 0;
      }
      return void 0;
    }
    function getSymbolAtLocationForQuickInfo(node, checker) {
      var object = getContainingObjectLiteralElement(node);
      if (object) {
        var contextualType = checker.getContextualType(object.parent);
        var properties = contextualType && getPropertySymbolsFromContextualType(object, checker, contextualType, false);
        if (properties && properties.length === 1) {
          return ts2.first(properties);
        }
      }
      return checker.getSymbolAtLocation(node);
    }
    function getPropertySymbolsFromContextualType(node, checker, contextualType, unionSymbolOk) {
      var name = ts2.getNameFromPropertyName(node.name);
      if (!name)
        return ts2.emptyArray;
      if (!contextualType.isUnion()) {
        var symbol = contextualType.getProperty(name);
        return symbol ? [symbol] : ts2.emptyArray;
      }
      var discriminatedPropertySymbols = ts2.mapDefined(contextualType.types, function(t) {
        return (ts2.isObjectLiteralExpression(node.parent) || ts2.isJsxAttributes(node.parent)) && checker.isTypeInvalidDueToUnionDiscriminant(t, node.parent) ? void 0 : t.getProperty(name);
      });
      if (unionSymbolOk && (discriminatedPropertySymbols.length === 0 || discriminatedPropertySymbols.length === contextualType.types.length)) {
        var symbol = contextualType.getProperty(name);
        if (symbol)
          return [symbol];
      }
      if (discriminatedPropertySymbols.length === 0) {
        return ts2.mapDefined(contextualType.types, function(t) {
          return t.getProperty(name);
        });
      }
      return discriminatedPropertySymbols;
    }
    ts2.getPropertySymbolsFromContextualType = getPropertySymbolsFromContextualType;
    function isArgumentOfElementAccessExpression(node) {
      return node && node.parent && node.parent.kind === 206 && node.parent.argumentExpression === node;
    }
    function getDefaultLibFilePath(options) {
      if (typeof __dirname !== "undefined") {
        return __dirname + ts2.directorySeparator + ts2.getDefaultLibFileName(options);
      }
      throw new Error("getDefaultLibFilePath is only supported when consumed as a node module. ");
    }
    ts2.getDefaultLibFilePath = getDefaultLibFilePath;
    ts2.setObjectAllocator(getServicesObjectAllocator());
  })(ts || (ts = {}));
  (function(ts2) {
    var BreakpointResolver;
    (function(BreakpointResolver2) {
      function spanInSourceFileAtLocation(sourceFile, position) {
        if (sourceFile.isDeclarationFile) {
          return void 0;
        }
        var tokenAtLocation = ts2.getTokenAtPosition(sourceFile, position);
        var lineOfPosition = sourceFile.getLineAndCharacterOfPosition(position).line;
        if (sourceFile.getLineAndCharacterOfPosition(tokenAtLocation.getStart(sourceFile)).line > lineOfPosition) {
          var preceding = ts2.findPrecedingToken(tokenAtLocation.pos, sourceFile);
          if (!preceding || sourceFile.getLineAndCharacterOfPosition(preceding.getEnd()).line !== lineOfPosition) {
            return void 0;
          }
          tokenAtLocation = preceding;
        }
        if (tokenAtLocation.flags & 8388608) {
          return void 0;
        }
        return spanInNode(tokenAtLocation);
        function textSpan(startNode, endNode) {
          var start = startNode.decorators ? ts2.skipTrivia(sourceFile.text, startNode.decorators.end) : startNode.getStart(sourceFile);
          return ts2.createTextSpanFromBounds(start, (endNode || startNode).getEnd());
        }
        function textSpanEndingAtNextToken(startNode, previousTokenToFindNextEndToken) {
          return textSpan(startNode, ts2.findNextToken(previousTokenToFindNextEndToken, previousTokenToFindNextEndToken.parent, sourceFile));
        }
        function spanInNodeIfStartsOnSameLine(node, otherwiseOnNode) {
          if (node && lineOfPosition === sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line) {
            return spanInNode(node);
          }
          return spanInNode(otherwiseOnNode);
        }
        function spanInNodeArray(nodeArray) {
          return ts2.createTextSpanFromBounds(ts2.skipTrivia(sourceFile.text, nodeArray.pos), nodeArray.end);
        }
        function spanInPreviousNode(node) {
          return spanInNode(ts2.findPrecedingToken(node.pos, sourceFile));
        }
        function spanInNextNode(node) {
          return spanInNode(ts2.findNextToken(node, node.parent, sourceFile));
        }
        function spanInNode(node) {
          if (node) {
            var parent = node.parent;
            switch (node.kind) {
              case 236:
                return spanInVariableDeclaration(node.declarationList.declarations[0]);
              case 253:
              case 166:
              case 165:
                return spanInVariableDeclaration(node);
              case 163:
                return spanInParameterDeclaration(node);
              case 255:
              case 168:
              case 167:
              case 171:
              case 172:
              case 170:
              case 212:
              case 213:
                return spanInFunctionDeclaration(node);
              case 234:
                if (ts2.isFunctionBlock(node)) {
                  return spanInFunctionBlock(node);
                }
              case 261:
                return spanInBlock(node);
              case 291:
                return spanInBlock(node.block);
              case 237:
                return textSpan(node.expression);
              case 246:
                return textSpan(node.getChildAt(0), node.expression);
              case 240:
                return textSpanEndingAtNextToken(node, node.expression);
              case 239:
                return spanInNode(node.statement);
              case 252:
                return textSpan(node.getChildAt(0));
              case 238:
                return textSpanEndingAtNextToken(node, node.expression);
              case 249:
                return spanInNode(node.statement);
              case 245:
              case 244:
                return textSpan(node.getChildAt(0), node.label);
              case 241:
                return spanInForStatement(node);
              case 242:
                return textSpanEndingAtNextToken(node, node.expression);
              case 243:
                return spanInInitializerOfForLike(node);
              case 248:
                return textSpanEndingAtNextToken(node, node.expression);
              case 288:
              case 289:
                return spanInNode(node.statements[0]);
              case 251:
                return spanInBlock(node.tryBlock);
              case 250:
                return textSpan(node, node.expression);
              case 270:
                return textSpan(node, node.expression);
              case 264:
                return textSpan(node, node.moduleReference);
              case 265:
                return textSpan(node, node.moduleSpecifier);
              case 271:
                return textSpan(node, node.moduleSpecifier);
              case 260:
                if (ts2.getModuleInstanceState(node) !== 1) {
                  return void 0;
                }
              case 256:
              case 259:
              case 297:
              case 202:
                return textSpan(node);
              case 247:
                return spanInNode(node.statement);
              case 164:
                return spanInNodeArray(parent.decorators);
              case 200:
              case 201:
                return spanInBindingPattern(node);
              case 257:
              case 258:
                return void 0;
              case 26:
              case 1:
                return spanInNodeIfStartsOnSameLine(ts2.findPrecedingToken(node.pos, sourceFile));
              case 27:
                return spanInPreviousNode(node);
              case 18:
                return spanInOpenBraceToken(node);
              case 19:
                return spanInCloseBraceToken(node);
              case 23:
                return spanInCloseBracketToken(node);
              case 20:
                return spanInOpenParenToken(node);
              case 21:
                return spanInCloseParenToken(node);
              case 58:
                return spanInColonToken(node);
              case 31:
              case 29:
                return spanInGreaterThanOrLessThanToken(node);
              case 115:
                return spanInWhileKeyword(node);
              case 91:
              case 83:
              case 96:
                return spanInNextNode(node);
              case 159:
                return spanInOfKeyword(node);
              default:
                if (ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(node)) {
                  return spanInArrayLiteralOrObjectLiteralDestructuringPattern(node);
                }
                if ((node.kind === 79 || node.kind === 224 || node.kind === 294 || node.kind === 295) && ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(parent)) {
                  return textSpan(node);
                }
                if (node.kind === 220) {
                  var _a = node, left = _a.left, operatorToken = _a.operatorToken;
                  if (ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(left)) {
                    return spanInArrayLiteralOrObjectLiteralDestructuringPattern(left);
                  }
                  if (operatorToken.kind === 63 && ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent)) {
                    return textSpan(node);
                  }
                  if (operatorToken.kind === 27) {
                    return spanInNode(left);
                  }
                }
                if (ts2.isExpressionNode(node)) {
                  switch (parent.kind) {
                    case 239:
                      return spanInPreviousNode(node);
                    case 164:
                      return spanInNode(node.parent);
                    case 241:
                    case 243:
                      return textSpan(node);
                    case 220:
                      if (node.parent.operatorToken.kind === 27) {
                        return textSpan(node);
                      }
                      break;
                    case 213:
                      if (node.parent.body === node) {
                        return textSpan(node);
                      }
                      break;
                  }
                }
                switch (node.parent.kind) {
                  case 294:
                    if (node.parent.name === node && !ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(node.parent.parent)) {
                      return spanInNode(node.parent.initializer);
                    }
                    break;
                  case 210:
                    if (node.parent.type === node) {
                      return spanInNextNode(node.parent.type);
                    }
                    break;
                  case 253:
                  case 163: {
                    var _b = node.parent, initializer = _b.initializer, type = _b.type;
                    if (initializer === node || type === node || ts2.isAssignmentOperator(node.kind)) {
                      return spanInPreviousNode(node);
                    }
                    break;
                  }
                  case 220: {
                    var left = node.parent.left;
                    if (ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(left) && node !== left) {
                      return spanInPreviousNode(node);
                    }
                    break;
                  }
                  default:
                    if (ts2.isFunctionLike(node.parent) && node.parent.type === node) {
                      return spanInPreviousNode(node);
                    }
                }
                return spanInNode(node.parent);
            }
          }
          function textSpanFromVariableDeclaration(variableDeclaration) {
            if (ts2.isVariableDeclarationList(variableDeclaration.parent) && variableDeclaration.parent.declarations[0] === variableDeclaration) {
              return textSpan(ts2.findPrecedingToken(variableDeclaration.pos, sourceFile, variableDeclaration.parent), variableDeclaration);
            } else {
              return textSpan(variableDeclaration);
            }
          }
          function spanInVariableDeclaration(variableDeclaration) {
            if (variableDeclaration.parent.parent.kind === 242) {
              return spanInNode(variableDeclaration.parent.parent);
            }
            var parent2 = variableDeclaration.parent;
            if (ts2.isBindingPattern(variableDeclaration.name)) {
              return spanInBindingPattern(variableDeclaration.name);
            }
            if (variableDeclaration.initializer || ts2.hasSyntacticModifier(variableDeclaration, 1) || parent2.parent.kind === 243) {
              return textSpanFromVariableDeclaration(variableDeclaration);
            }
            if (ts2.isVariableDeclarationList(variableDeclaration.parent) && variableDeclaration.parent.declarations[0] !== variableDeclaration) {
              return spanInNode(ts2.findPrecedingToken(variableDeclaration.pos, sourceFile, variableDeclaration.parent));
            }
          }
          function canHaveSpanInParameterDeclaration(parameter) {
            return !!parameter.initializer || parameter.dotDotDotToken !== void 0 || ts2.hasSyntacticModifier(parameter, 4 | 8);
          }
          function spanInParameterDeclaration(parameter) {
            if (ts2.isBindingPattern(parameter.name)) {
              return spanInBindingPattern(parameter.name);
            } else if (canHaveSpanInParameterDeclaration(parameter)) {
              return textSpan(parameter);
            } else {
              var functionDeclaration = parameter.parent;
              var indexOfParameter = functionDeclaration.parameters.indexOf(parameter);
              ts2.Debug.assert(indexOfParameter !== -1);
              if (indexOfParameter !== 0) {
                return spanInParameterDeclaration(functionDeclaration.parameters[indexOfParameter - 1]);
              } else {
                return spanInNode(functionDeclaration.body);
              }
            }
          }
          function canFunctionHaveSpanInWholeDeclaration(functionDeclaration) {
            return ts2.hasSyntacticModifier(functionDeclaration, 1) || functionDeclaration.parent.kind === 256 && functionDeclaration.kind !== 170;
          }
          function spanInFunctionDeclaration(functionDeclaration) {
            if (!functionDeclaration.body) {
              return void 0;
            }
            if (canFunctionHaveSpanInWholeDeclaration(functionDeclaration)) {
              return textSpan(functionDeclaration);
            }
            return spanInNode(functionDeclaration.body);
          }
          function spanInFunctionBlock(block) {
            var nodeForSpanInBlock = block.statements.length ? block.statements[0] : block.getLastToken();
            if (canFunctionHaveSpanInWholeDeclaration(block.parent)) {
              return spanInNodeIfStartsOnSameLine(block.parent, nodeForSpanInBlock);
            }
            return spanInNode(nodeForSpanInBlock);
          }
          function spanInBlock(block) {
            switch (block.parent.kind) {
              case 260:
                if (ts2.getModuleInstanceState(block.parent) !== 1) {
                  return void 0;
                }
              case 240:
              case 238:
              case 242:
                return spanInNodeIfStartsOnSameLine(block.parent, block.statements[0]);
              case 241:
              case 243:
                return spanInNodeIfStartsOnSameLine(ts2.findPrecedingToken(block.pos, sourceFile, block.parent), block.statements[0]);
            }
            return spanInNode(block.statements[0]);
          }
          function spanInInitializerOfForLike(forLikeStatement) {
            if (forLikeStatement.initializer.kind === 254) {
              var variableDeclarationList = forLikeStatement.initializer;
              if (variableDeclarationList.declarations.length > 0) {
                return spanInNode(variableDeclarationList.declarations[0]);
              }
            } else {
              return spanInNode(forLikeStatement.initializer);
            }
          }
          function spanInForStatement(forStatement) {
            if (forStatement.initializer) {
              return spanInInitializerOfForLike(forStatement);
            }
            if (forStatement.condition) {
              return textSpan(forStatement.condition);
            }
            if (forStatement.incrementor) {
              return textSpan(forStatement.incrementor);
            }
          }
          function spanInBindingPattern(bindingPattern) {
            var firstBindingElement = ts2.forEach(bindingPattern.elements, function(element) {
              return element.kind !== 226 ? element : void 0;
            });
            if (firstBindingElement) {
              return spanInNode(firstBindingElement);
            }
            if (bindingPattern.parent.kind === 202) {
              return textSpan(bindingPattern.parent);
            }
            return textSpanFromVariableDeclaration(bindingPattern.parent);
          }
          function spanInArrayLiteralOrObjectLiteralDestructuringPattern(node2) {
            ts2.Debug.assert(node2.kind !== 201 && node2.kind !== 200);
            var elements = node2.kind === 203 ? node2.elements : node2.properties;
            var firstBindingElement = ts2.forEach(elements, function(element) {
              return element.kind !== 226 ? element : void 0;
            });
            if (firstBindingElement) {
              return spanInNode(firstBindingElement);
            }
            return textSpan(node2.parent.kind === 220 ? node2.parent : node2);
          }
          function spanInOpenBraceToken(node2) {
            switch (node2.parent.kind) {
              case 259:
                var enumDeclaration = node2.parent;
                return spanInNodeIfStartsOnSameLine(ts2.findPrecedingToken(node2.pos, sourceFile, node2.parent), enumDeclaration.members.length ? enumDeclaration.members[0] : enumDeclaration.getLastToken(sourceFile));
              case 256:
                var classDeclaration = node2.parent;
                return spanInNodeIfStartsOnSameLine(ts2.findPrecedingToken(node2.pos, sourceFile, node2.parent), classDeclaration.members.length ? classDeclaration.members[0] : classDeclaration.getLastToken(sourceFile));
              case 262:
                return spanInNodeIfStartsOnSameLine(node2.parent.parent, node2.parent.clauses[0]);
            }
            return spanInNode(node2.parent);
          }
          function spanInCloseBraceToken(node2) {
            switch (node2.parent.kind) {
              case 261:
                if (ts2.getModuleInstanceState(node2.parent.parent) !== 1) {
                  return void 0;
                }
              case 259:
              case 256:
                return textSpan(node2);
              case 234:
                if (ts2.isFunctionBlock(node2.parent)) {
                  return textSpan(node2);
                }
              case 291:
                return spanInNode(ts2.lastOrUndefined(node2.parent.statements));
              case 262:
                var caseBlock = node2.parent;
                var lastClause = ts2.lastOrUndefined(caseBlock.clauses);
                if (lastClause) {
                  return spanInNode(ts2.lastOrUndefined(lastClause.statements));
                }
                return void 0;
              case 200:
                var bindingPattern = node2.parent;
                return spanInNode(ts2.lastOrUndefined(bindingPattern.elements) || bindingPattern);
              default:
                if (ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(node2.parent)) {
                  var objectLiteral = node2.parent;
                  return textSpan(ts2.lastOrUndefined(objectLiteral.properties) || objectLiteral);
                }
                return spanInNode(node2.parent);
            }
          }
          function spanInCloseBracketToken(node2) {
            switch (node2.parent.kind) {
              case 201:
                var bindingPattern = node2.parent;
                return textSpan(ts2.lastOrUndefined(bindingPattern.elements) || bindingPattern);
              default:
                if (ts2.isArrayLiteralOrObjectLiteralDestructuringPattern(node2.parent)) {
                  var arrayLiteral = node2.parent;
                  return textSpan(ts2.lastOrUndefined(arrayLiteral.elements) || arrayLiteral);
                }
                return spanInNode(node2.parent);
            }
          }
          function spanInOpenParenToken(node2) {
            if (node2.parent.kind === 239 || node2.parent.kind === 207 || node2.parent.kind === 208) {
              return spanInPreviousNode(node2);
            }
            if (node2.parent.kind === 211) {
              return spanInNextNode(node2);
            }
            return spanInNode(node2.parent);
          }
          function spanInCloseParenToken(node2) {
            switch (node2.parent.kind) {
              case 212:
              case 255:
              case 213:
              case 168:
              case 167:
              case 171:
              case 172:
              case 170:
              case 240:
              case 239:
              case 241:
              case 243:
              case 207:
              case 208:
              case 211:
                return spanInPreviousNode(node2);
              default:
                return spanInNode(node2.parent);
            }
          }
          function spanInColonToken(node2) {
            if (ts2.isFunctionLike(node2.parent) || node2.parent.kind === 294 || node2.parent.kind === 163) {
              return spanInPreviousNode(node2);
            }
            return spanInNode(node2.parent);
          }
          function spanInGreaterThanOrLessThanToken(node2) {
            if (node2.parent.kind === 210) {
              return spanInNextNode(node2);
            }
            return spanInNode(node2.parent);
          }
          function spanInWhileKeyword(node2) {
            if (node2.parent.kind === 239) {
              return textSpanEndingAtNextToken(node2, node2.parent.expression);
            }
            return spanInNode(node2.parent);
          }
          function spanInOfKeyword(node2) {
            if (node2.parent.kind === 243) {
              return spanInNextNode(node2);
            }
            return spanInNode(node2.parent);
          }
        }
      }
      BreakpointResolver2.spanInSourceFileAtLocation = spanInSourceFileAtLocation;
    })(BreakpointResolver = ts2.BreakpointResolver || (ts2.BreakpointResolver = {}));
  })(ts || (ts = {}));
  (function(ts2) {
    function transform(source, transformers, compilerOptions) {
      var diagnostics = [];
      compilerOptions = ts2.fixupCompilerOptions(compilerOptions, diagnostics);
      var nodes = ts2.isArray(source) ? source : [source];
      var result = ts2.transformNodes(void 0, void 0, ts2.factory, compilerOptions, nodes, transformers, true);
      result.diagnostics = ts2.concatenate(result.diagnostics, diagnostics);
      return result;
    }
    ts2.transform = transform;
  })(ts || (ts = {}));
  var debugObjectHost = function() {
    return this;
  }();
  (function(ts2) {
    function logInternalError(logger, err) {
      if (logger) {
        logger.log("*INTERNAL ERROR* - Exception in typescript services: " + err.message);
      }
    }
    var ScriptSnapshotShimAdapter = function() {
      function ScriptSnapshotShimAdapter2(scriptSnapshotShim) {
        this.scriptSnapshotShim = scriptSnapshotShim;
      }
      ScriptSnapshotShimAdapter2.prototype.getText = function(start, end) {
        return this.scriptSnapshotShim.getText(start, end);
      };
      ScriptSnapshotShimAdapter2.prototype.getLength = function() {
        return this.scriptSnapshotShim.getLength();
      };
      ScriptSnapshotShimAdapter2.prototype.getChangeRange = function(oldSnapshot) {
        var oldSnapshotShim = oldSnapshot;
        var encoded = this.scriptSnapshotShim.getChangeRange(oldSnapshotShim.scriptSnapshotShim);
        if (encoded === null) {
          return null;
        }
        var decoded = JSON.parse(encoded);
        return ts2.createTextChangeRange(ts2.createTextSpan(decoded.span.start, decoded.span.length), decoded.newLength);
      };
      ScriptSnapshotShimAdapter2.prototype.dispose = function() {
        if ("dispose" in this.scriptSnapshotShim) {
          this.scriptSnapshotShim.dispose();
        }
      };
      return ScriptSnapshotShimAdapter2;
    }();
    var LanguageServiceShimHostAdapter = function() {
      function LanguageServiceShimHostAdapter2(shimHost) {
        var _this = this;
        this.shimHost = shimHost;
        this.loggingEnabled = false;
        this.tracingEnabled = false;
        if ("getModuleResolutionsForFile" in this.shimHost) {
          this.resolveModuleNames = function(moduleNames, containingFile) {
            var resolutionsInFile = JSON.parse(_this.shimHost.getModuleResolutionsForFile(containingFile));
            return ts2.map(moduleNames, function(name) {
              var result = ts2.getProperty(resolutionsInFile, name);
              return result ? { resolvedFileName: result, extension: ts2.extensionFromPath(result), isExternalLibraryImport: false } : void 0;
            });
          };
        }
        if ("directoryExists" in this.shimHost) {
          this.directoryExists = function(directoryName) {
            return _this.shimHost.directoryExists(directoryName);
          };
        }
        if ("getTypeReferenceDirectiveResolutionsForFile" in this.shimHost) {
          this.resolveTypeReferenceDirectives = function(typeDirectiveNames, containingFile) {
            var typeDirectivesForFile = JSON.parse(_this.shimHost.getTypeReferenceDirectiveResolutionsForFile(containingFile));
            return ts2.map(typeDirectiveNames, function(name) {
              return ts2.getProperty(typeDirectivesForFile, name);
            });
          };
        }
      }
      LanguageServiceShimHostAdapter2.prototype.log = function(s) {
        if (this.loggingEnabled) {
          this.shimHost.log(s);
        }
      };
      LanguageServiceShimHostAdapter2.prototype.trace = function(s) {
        if (this.tracingEnabled) {
          this.shimHost.trace(s);
        }
      };
      LanguageServiceShimHostAdapter2.prototype.error = function(s) {
        this.shimHost.error(s);
      };
      LanguageServiceShimHostAdapter2.prototype.getProjectVersion = function() {
        if (!this.shimHost.getProjectVersion) {
          return void 0;
        }
        return this.shimHost.getProjectVersion();
      };
      LanguageServiceShimHostAdapter2.prototype.getTypeRootsVersion = function() {
        if (!this.shimHost.getTypeRootsVersion) {
          return 0;
        }
        return this.shimHost.getTypeRootsVersion();
      };
      LanguageServiceShimHostAdapter2.prototype.useCaseSensitiveFileNames = function() {
        return this.shimHost.useCaseSensitiveFileNames ? this.shimHost.useCaseSensitiveFileNames() : false;
      };
      LanguageServiceShimHostAdapter2.prototype.getCompilationSettings = function() {
        var settingsJson = this.shimHost.getCompilationSettings();
        if (settingsJson === null || settingsJson === "") {
          throw Error("LanguageServiceShimHostAdapter.getCompilationSettings: empty compilationSettings");
        }
        var compilerOptions = JSON.parse(settingsJson);
        compilerOptions.allowNonTsExtensions = true;
        return compilerOptions;
      };
      LanguageServiceShimHostAdapter2.prototype.getScriptFileNames = function() {
        var encoded = this.shimHost.getScriptFileNames();
        return JSON.parse(encoded);
      };
      LanguageServiceShimHostAdapter2.prototype.getScriptSnapshot = function(fileName) {
        var scriptSnapshot = this.shimHost.getScriptSnapshot(fileName);
        return scriptSnapshot && new ScriptSnapshotShimAdapter(scriptSnapshot);
      };
      LanguageServiceShimHostAdapter2.prototype.getScriptKind = function(fileName) {
        if ("getScriptKind" in this.shimHost) {
          return this.shimHost.getScriptKind(fileName);
        } else {
          return 0;
        }
      };
      LanguageServiceShimHostAdapter2.prototype.getScriptVersion = function(fileName) {
        return this.shimHost.getScriptVersion(fileName);
      };
      LanguageServiceShimHostAdapter2.prototype.getLocalizedDiagnosticMessages = function() {
        var diagnosticMessagesJson = this.shimHost.getLocalizedDiagnosticMessages();
        if (diagnosticMessagesJson === null || diagnosticMessagesJson === "") {
          return null;
        }
        try {
          return JSON.parse(diagnosticMessagesJson);
        } catch (e) {
          this.log(e.description || "diagnosticMessages.generated.json has invalid JSON format");
          return null;
        }
      };
      LanguageServiceShimHostAdapter2.prototype.getCancellationToken = function() {
        var hostCancellationToken = this.shimHost.getCancellationToken();
        return new ts2.ThrottledCancellationToken(hostCancellationToken);
      };
      LanguageServiceShimHostAdapter2.prototype.getCurrentDirectory = function() {
        return this.shimHost.getCurrentDirectory();
      };
      LanguageServiceShimHostAdapter2.prototype.getDirectories = function(path) {
        return JSON.parse(this.shimHost.getDirectories(path));
      };
      LanguageServiceShimHostAdapter2.prototype.getDefaultLibFileName = function(options) {
        return this.shimHost.getDefaultLibFileName(JSON.stringify(options));
      };
      LanguageServiceShimHostAdapter2.prototype.readDirectory = function(path, extensions, exclude, include, depth) {
        var pattern = ts2.getFileMatcherPatterns(path, exclude, include, this.shimHost.useCaseSensitiveFileNames(), this.shimHost.getCurrentDirectory());
        return JSON.parse(this.shimHost.readDirectory(path, JSON.stringify(extensions), JSON.stringify(pattern.basePaths), pattern.excludePattern, pattern.includeFilePattern, pattern.includeDirectoryPattern, depth));
      };
      LanguageServiceShimHostAdapter2.prototype.readFile = function(path, encoding) {
        return this.shimHost.readFile(path, encoding);
      };
      LanguageServiceShimHostAdapter2.prototype.fileExists = function(path) {
        return this.shimHost.fileExists(path);
      };
      return LanguageServiceShimHostAdapter2;
    }();
    ts2.LanguageServiceShimHostAdapter = LanguageServiceShimHostAdapter;
    var CoreServicesShimHostAdapter = function() {
      function CoreServicesShimHostAdapter2(shimHost) {
        var _this = this;
        this.shimHost = shimHost;
        this.useCaseSensitiveFileNames = this.shimHost.useCaseSensitiveFileNames ? this.shimHost.useCaseSensitiveFileNames() : false;
        if ("directoryExists" in this.shimHost) {
          this.directoryExists = function(directoryName) {
            return _this.shimHost.directoryExists(directoryName);
          };
        } else {
          this.directoryExists = void 0;
        }
        if ("realpath" in this.shimHost) {
          this.realpath = function(path) {
            return _this.shimHost.realpath(path);
          };
        } else {
          this.realpath = void 0;
        }
      }
      CoreServicesShimHostAdapter2.prototype.readDirectory = function(rootDir, extensions, exclude, include, depth) {
        var pattern = ts2.getFileMatcherPatterns(rootDir, exclude, include, this.shimHost.useCaseSensitiveFileNames(), this.shimHost.getCurrentDirectory());
        return JSON.parse(this.shimHost.readDirectory(rootDir, JSON.stringify(extensions), JSON.stringify(pattern.basePaths), pattern.excludePattern, pattern.includeFilePattern, pattern.includeDirectoryPattern, depth));
      };
      CoreServicesShimHostAdapter2.prototype.fileExists = function(fileName) {
        return this.shimHost.fileExists(fileName);
      };
      CoreServicesShimHostAdapter2.prototype.readFile = function(fileName) {
        return this.shimHost.readFile(fileName);
      };
      CoreServicesShimHostAdapter2.prototype.getDirectories = function(path) {
        return JSON.parse(this.shimHost.getDirectories(path));
      };
      return CoreServicesShimHostAdapter2;
    }();
    ts2.CoreServicesShimHostAdapter = CoreServicesShimHostAdapter;
    function simpleForwardCall(logger, actionDescription, action, logPerformance) {
      var start;
      if (logPerformance) {
        logger.log(actionDescription);
        start = ts2.timestamp();
      }
      var result = action();
      if (logPerformance) {
        var end = ts2.timestamp();
        logger.log("".concat(actionDescription, " completed in ").concat(end - start, " msec"));
        if (ts2.isString(result)) {
          var str = result;
          if (str.length > 128) {
            str = str.substring(0, 128) + "...";
          }
          logger.log("  result.length=".concat(str.length, ", result='").concat(JSON.stringify(str), "'"));
        }
      }
      return result;
    }
    function forwardJSONCall(logger, actionDescription, action, logPerformance) {
      return forwardCall(logger, actionDescription, true, action, logPerformance);
    }
    function forwardCall(logger, actionDescription, returnJson, action, logPerformance) {
      try {
        var result = simpleForwardCall(logger, actionDescription, action, logPerformance);
        return returnJson ? JSON.stringify({ result }) : result;
      } catch (err) {
        if (err instanceof ts2.OperationCanceledException) {
          return JSON.stringify({ canceled: true });
        }
        logInternalError(logger, err);
        err.description = actionDescription;
        return JSON.stringify({ error: err });
      }
    }
    var ShimBase = function() {
      function ShimBase2(factory) {
        this.factory = factory;
        factory.registerShim(this);
      }
      ShimBase2.prototype.dispose = function(_dummy) {
        this.factory.unregisterShim(this);
      };
      return ShimBase2;
    }();
    function realizeDiagnostics(diagnostics, newLine) {
      return diagnostics.map(function(d) {
        return realizeDiagnostic(d, newLine);
      });
    }
    ts2.realizeDiagnostics = realizeDiagnostics;
    function realizeDiagnostic(diagnostic, newLine) {
      return {
        message: ts2.flattenDiagnosticMessageText(diagnostic.messageText, newLine),
        start: diagnostic.start,
        length: diagnostic.length,
        category: ts2.diagnosticCategoryName(diagnostic),
        code: diagnostic.code,
        reportsUnnecessary: diagnostic.reportsUnnecessary,
        reportsDeprecated: diagnostic.reportsDeprecated
      };
    }
    var LanguageServiceShimObject = function(_super) {
      __extends(LanguageServiceShimObject2, _super);
      function LanguageServiceShimObject2(factory, host, languageService) {
        var _this = _super.call(this, factory) || this;
        _this.host = host;
        _this.languageService = languageService;
        _this.logPerformance = false;
        _this.logger = _this.host;
        return _this;
      }
      LanguageServiceShimObject2.prototype.forwardJSONCall = function(actionDescription, action) {
        return forwardJSONCall(this.logger, actionDescription, action, this.logPerformance);
      };
      LanguageServiceShimObject2.prototype.dispose = function(dummy) {
        this.logger.log("dispose()");
        this.languageService.dispose();
        this.languageService = null;
        if (debugObjectHost && debugObjectHost.CollectGarbage) {
          debugObjectHost.CollectGarbage();
          this.logger.log("CollectGarbage()");
        }
        this.logger = null;
        _super.prototype.dispose.call(this, dummy);
      };
      LanguageServiceShimObject2.prototype.refresh = function(throwOnError) {
        this.forwardJSONCall("refresh(".concat(throwOnError, ")"), function() {
          return null;
        });
      };
      LanguageServiceShimObject2.prototype.cleanupSemanticCache = function() {
        var _this = this;
        this.forwardJSONCall("cleanupSemanticCache()", function() {
          _this.languageService.cleanupSemanticCache();
          return null;
        });
      };
      LanguageServiceShimObject2.prototype.realizeDiagnostics = function(diagnostics) {
        var newLine = ts2.getNewLineOrDefaultFromHost(this.host);
        return realizeDiagnostics(diagnostics, newLine);
      };
      LanguageServiceShimObject2.prototype.getSyntacticClassifications = function(fileName, start, length) {
        var _this = this;
        return this.forwardJSONCall("getSyntacticClassifications('".concat(fileName, "', ").concat(start, ", ").concat(length, ")"), function() {
          return _this.languageService.getSyntacticClassifications(fileName, ts2.createTextSpan(start, length));
        });
      };
      LanguageServiceShimObject2.prototype.getSemanticClassifications = function(fileName, start, length) {
        var _this = this;
        return this.forwardJSONCall("getSemanticClassifications('".concat(fileName, "', ").concat(start, ", ").concat(length, ")"), function() {
          return _this.languageService.getSemanticClassifications(fileName, ts2.createTextSpan(start, length));
        });
      };
      LanguageServiceShimObject2.prototype.getEncodedSyntacticClassifications = function(fileName, start, length) {
        var _this = this;
        return this.forwardJSONCall("getEncodedSyntacticClassifications('".concat(fileName, "', ").concat(start, ", ").concat(length, ")"), function() {
          return convertClassifications(_this.languageService.getEncodedSyntacticClassifications(fileName, ts2.createTextSpan(start, length)));
        });
      };
      LanguageServiceShimObject2.prototype.getEncodedSemanticClassifications = function(fileName, start, length) {
        var _this = this;
        return this.forwardJSONCall("getEncodedSemanticClassifications('".concat(fileName, "', ").concat(start, ", ").concat(length, ")"), function() {
          return convertClassifications(_this.languageService.getEncodedSemanticClassifications(fileName, ts2.createTextSpan(start, length)));
        });
      };
      LanguageServiceShimObject2.prototype.getSyntacticDiagnostics = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getSyntacticDiagnostics('".concat(fileName, "')"), function() {
          var diagnostics = _this.languageService.getSyntacticDiagnostics(fileName);
          return _this.realizeDiagnostics(diagnostics);
        });
      };
      LanguageServiceShimObject2.prototype.getSemanticDiagnostics = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getSemanticDiagnostics('".concat(fileName, "')"), function() {
          var diagnostics = _this.languageService.getSemanticDiagnostics(fileName);
          return _this.realizeDiagnostics(diagnostics);
        });
      };
      LanguageServiceShimObject2.prototype.getSuggestionDiagnostics = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getSuggestionDiagnostics('".concat(fileName, "')"), function() {
          return _this.realizeDiagnostics(_this.languageService.getSuggestionDiagnostics(fileName));
        });
      };
      LanguageServiceShimObject2.prototype.getCompilerOptionsDiagnostics = function() {
        var _this = this;
        return this.forwardJSONCall("getCompilerOptionsDiagnostics()", function() {
          var diagnostics = _this.languageService.getCompilerOptionsDiagnostics();
          return _this.realizeDiagnostics(diagnostics);
        });
      };
      LanguageServiceShimObject2.prototype.getQuickInfoAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getQuickInfoAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getQuickInfoAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getNameOrDottedNameSpan = function(fileName, startPos, endPos) {
        var _this = this;
        return this.forwardJSONCall("getNameOrDottedNameSpan('".concat(fileName, "', ").concat(startPos, ", ").concat(endPos, ")"), function() {
          return _this.languageService.getNameOrDottedNameSpan(fileName, startPos, endPos);
        });
      };
      LanguageServiceShimObject2.prototype.getBreakpointStatementAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getBreakpointStatementAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getBreakpointStatementAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getSignatureHelpItems = function(fileName, position, options) {
        var _this = this;
        return this.forwardJSONCall("getSignatureHelpItems('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getSignatureHelpItems(fileName, position, options);
        });
      };
      LanguageServiceShimObject2.prototype.getDefinitionAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getDefinitionAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getDefinitionAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getDefinitionAndBoundSpan = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getDefinitionAndBoundSpan('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getDefinitionAndBoundSpan(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getTypeDefinitionAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getTypeDefinitionAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getTypeDefinitionAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getImplementationAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getImplementationAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getImplementationAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getRenameInfo = function(fileName, position, options) {
        var _this = this;
        return this.forwardJSONCall("getRenameInfo('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getRenameInfo(fileName, position, options);
        });
      };
      LanguageServiceShimObject2.prototype.getSmartSelectionRange = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getSmartSelectionRange('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getSmartSelectionRange(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.findRenameLocations = function(fileName, position, findInStrings, findInComments, providePrefixAndSuffixTextForRename) {
        var _this = this;
        return this.forwardJSONCall("findRenameLocations('".concat(fileName, "', ").concat(position, ", ").concat(findInStrings, ", ").concat(findInComments, ", ").concat(providePrefixAndSuffixTextForRename, ")"), function() {
          return _this.languageService.findRenameLocations(fileName, position, findInStrings, findInComments, providePrefixAndSuffixTextForRename);
        });
      };
      LanguageServiceShimObject2.prototype.getBraceMatchingAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getBraceMatchingAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getBraceMatchingAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.isValidBraceCompletionAtPosition = function(fileName, position, openingBrace) {
        var _this = this;
        return this.forwardJSONCall("isValidBraceCompletionAtPosition('".concat(fileName, "', ").concat(position, ", ").concat(openingBrace, ")"), function() {
          return _this.languageService.isValidBraceCompletionAtPosition(fileName, position, openingBrace);
        });
      };
      LanguageServiceShimObject2.prototype.getSpanOfEnclosingComment = function(fileName, position, onlyMultiLine) {
        var _this = this;
        return this.forwardJSONCall("getSpanOfEnclosingComment('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getSpanOfEnclosingComment(fileName, position, onlyMultiLine);
        });
      };
      LanguageServiceShimObject2.prototype.getIndentationAtPosition = function(fileName, position, options) {
        var _this = this;
        return this.forwardJSONCall("getIndentationAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          var localOptions = JSON.parse(options);
          return _this.languageService.getIndentationAtPosition(fileName, position, localOptions);
        });
      };
      LanguageServiceShimObject2.prototype.getReferencesAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getReferencesAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getReferencesAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.findReferences = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("findReferences('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.findReferences(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getFileReferences = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getFileReferences('".concat(fileName, ")"), function() {
          return _this.languageService.getFileReferences(fileName);
        });
      };
      LanguageServiceShimObject2.prototype.getOccurrencesAtPosition = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("getOccurrencesAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getOccurrencesAtPosition(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.getDocumentHighlights = function(fileName, position, filesToSearch) {
        var _this = this;
        return this.forwardJSONCall("getDocumentHighlights('".concat(fileName, "', ").concat(position, ")"), function() {
          var results = _this.languageService.getDocumentHighlights(fileName, position, JSON.parse(filesToSearch));
          var normalizedName = ts2.toFileNameLowerCase(ts2.normalizeSlashes(fileName));
          return ts2.filter(results, function(r) {
            return ts2.toFileNameLowerCase(ts2.normalizeSlashes(r.fileName)) === normalizedName;
          });
        });
      };
      LanguageServiceShimObject2.prototype.getCompletionsAtPosition = function(fileName, position, preferences) {
        var _this = this;
        return this.forwardJSONCall("getCompletionsAtPosition('".concat(fileName, "', ").concat(position, ", ").concat(preferences, ")"), function() {
          return _this.languageService.getCompletionsAtPosition(fileName, position, preferences);
        });
      };
      LanguageServiceShimObject2.prototype.getCompletionEntryDetails = function(fileName, position, entryName, formatOptions, source, preferences, data) {
        var _this = this;
        return this.forwardJSONCall("getCompletionEntryDetails('".concat(fileName, "', ").concat(position, ", '").concat(entryName, "')"), function() {
          var localOptions = formatOptions === void 0 ? void 0 : JSON.parse(formatOptions);
          return _this.languageService.getCompletionEntryDetails(fileName, position, entryName, localOptions, source, preferences, data);
        });
      };
      LanguageServiceShimObject2.prototype.getFormattingEditsForRange = function(fileName, start, end, options) {
        var _this = this;
        return this.forwardJSONCall("getFormattingEditsForRange('".concat(fileName, "', ").concat(start, ", ").concat(end, ")"), function() {
          var localOptions = JSON.parse(options);
          return _this.languageService.getFormattingEditsForRange(fileName, start, end, localOptions);
        });
      };
      LanguageServiceShimObject2.prototype.getFormattingEditsForDocument = function(fileName, options) {
        var _this = this;
        return this.forwardJSONCall("getFormattingEditsForDocument('".concat(fileName, "')"), function() {
          var localOptions = JSON.parse(options);
          return _this.languageService.getFormattingEditsForDocument(fileName, localOptions);
        });
      };
      LanguageServiceShimObject2.prototype.getFormattingEditsAfterKeystroke = function(fileName, position, key, options) {
        var _this = this;
        return this.forwardJSONCall("getFormattingEditsAfterKeystroke('".concat(fileName, "', ").concat(position, ", '").concat(key, "')"), function() {
          var localOptions = JSON.parse(options);
          return _this.languageService.getFormattingEditsAfterKeystroke(fileName, position, key, localOptions);
        });
      };
      LanguageServiceShimObject2.prototype.getDocCommentTemplateAtPosition = function(fileName, position, options) {
        var _this = this;
        return this.forwardJSONCall("getDocCommentTemplateAtPosition('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.getDocCommentTemplateAtPosition(fileName, position, options);
        });
      };
      LanguageServiceShimObject2.prototype.getNavigateToItems = function(searchValue, maxResultCount, fileName) {
        var _this = this;
        return this.forwardJSONCall("getNavigateToItems('".concat(searchValue, "', ").concat(maxResultCount, ", ").concat(fileName, ")"), function() {
          return _this.languageService.getNavigateToItems(searchValue, maxResultCount, fileName);
        });
      };
      LanguageServiceShimObject2.prototype.getNavigationBarItems = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getNavigationBarItems('".concat(fileName, "')"), function() {
          return _this.languageService.getNavigationBarItems(fileName);
        });
      };
      LanguageServiceShimObject2.prototype.getNavigationTree = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getNavigationTree('".concat(fileName, "')"), function() {
          return _this.languageService.getNavigationTree(fileName);
        });
      };
      LanguageServiceShimObject2.prototype.getOutliningSpans = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getOutliningSpans('".concat(fileName, "')"), function() {
          return _this.languageService.getOutliningSpans(fileName);
        });
      };
      LanguageServiceShimObject2.prototype.getTodoComments = function(fileName, descriptors) {
        var _this = this;
        return this.forwardJSONCall("getTodoComments('".concat(fileName, "')"), function() {
          return _this.languageService.getTodoComments(fileName, JSON.parse(descriptors));
        });
      };
      LanguageServiceShimObject2.prototype.prepareCallHierarchy = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("prepareCallHierarchy('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.prepareCallHierarchy(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.provideCallHierarchyIncomingCalls = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("provideCallHierarchyIncomingCalls('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.provideCallHierarchyIncomingCalls(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.provideCallHierarchyOutgoingCalls = function(fileName, position) {
        var _this = this;
        return this.forwardJSONCall("provideCallHierarchyOutgoingCalls('".concat(fileName, "', ").concat(position, ")"), function() {
          return _this.languageService.provideCallHierarchyOutgoingCalls(fileName, position);
        });
      };
      LanguageServiceShimObject2.prototype.provideInlayHints = function(fileName, span, preference) {
        var _this = this;
        return this.forwardJSONCall("provideInlayHints('".concat(fileName, "', '").concat(JSON.stringify(span), "', ").concat(JSON.stringify(preference), ")"), function() {
          return _this.languageService.provideInlayHints(fileName, span, preference);
        });
      };
      LanguageServiceShimObject2.prototype.getEmitOutput = function(fileName) {
        var _this = this;
        return this.forwardJSONCall("getEmitOutput('".concat(fileName, "')"), function() {
          var _a = _this.languageService.getEmitOutput(fileName), diagnostics = _a.diagnostics, rest = __rest(_a, ["diagnostics"]);
          return __assign(__assign({}, rest), { diagnostics: _this.realizeDiagnostics(diagnostics) });
        });
      };
      LanguageServiceShimObject2.prototype.getEmitOutputObject = function(fileName) {
        var _this = this;
        return forwardCall(this.logger, "getEmitOutput('".concat(fileName, "')"), false, function() {
          return _this.languageService.getEmitOutput(fileName);
        }, this.logPerformance);
      };
      LanguageServiceShimObject2.prototype.toggleLineComment = function(fileName, textRange) {
        var _this = this;
        return this.forwardJSONCall("toggleLineComment('".concat(fileName, "', '").concat(JSON.stringify(textRange), "')"), function() {
          return _this.languageService.toggleLineComment(fileName, textRange);
        });
      };
      LanguageServiceShimObject2.prototype.toggleMultilineComment = function(fileName, textRange) {
        var _this = this;
        return this.forwardJSONCall("toggleMultilineComment('".concat(fileName, "', '").concat(JSON.stringify(textRange), "')"), function() {
          return _this.languageService.toggleMultilineComment(fileName, textRange);
        });
      };
      LanguageServiceShimObject2.prototype.commentSelection = function(fileName, textRange) {
        var _this = this;
        return this.forwardJSONCall("commentSelection('".concat(fileName, "', '").concat(JSON.stringify(textRange), "')"), function() {
          return _this.languageService.commentSelection(fileName, textRange);
        });
      };
      LanguageServiceShimObject2.prototype.uncommentSelection = function(fileName, textRange) {
        var _this = this;
        return this.forwardJSONCall("uncommentSelection('".concat(fileName, "', '").concat(JSON.stringify(textRange), "')"), function() {
          return _this.languageService.uncommentSelection(fileName, textRange);
        });
      };
      return LanguageServiceShimObject2;
    }(ShimBase);
    function convertClassifications(classifications) {
      return { spans: classifications.spans.join(","), endOfLineState: classifications.endOfLineState };
    }
    var ClassifierShimObject = function(_super) {
      __extends(ClassifierShimObject2, _super);
      function ClassifierShimObject2(factory, logger) {
        var _this = _super.call(this, factory) || this;
        _this.logger = logger;
        _this.logPerformance = false;
        _this.classifier = ts2.createClassifier();
        return _this;
      }
      ClassifierShimObject2.prototype.getEncodedLexicalClassifications = function(text, lexState, syntacticClassifierAbsent) {
        var _this = this;
        if (syntacticClassifierAbsent === void 0) {
          syntacticClassifierAbsent = false;
        }
        return forwardJSONCall(this.logger, "getEncodedLexicalClassifications", function() {
          return convertClassifications(_this.classifier.getEncodedLexicalClassifications(text, lexState, syntacticClassifierAbsent));
        }, this.logPerformance);
      };
      ClassifierShimObject2.prototype.getClassificationsForLine = function(text, lexState, classifyKeywordsInGenerics) {
        if (classifyKeywordsInGenerics === void 0) {
          classifyKeywordsInGenerics = false;
        }
        var classification = this.classifier.getClassificationsForLine(text, lexState, classifyKeywordsInGenerics);
        var result = "";
        for (var _i = 0, _a = classification.entries; _i < _a.length; _i++) {
          var item = _a[_i];
          result += item.length + "\n";
          result += item.classification + "\n";
        }
        result += classification.finalLexState;
        return result;
      };
      return ClassifierShimObject2;
    }(ShimBase);
    var CoreServicesShimObject = function(_super) {
      __extends(CoreServicesShimObject2, _super);
      function CoreServicesShimObject2(factory, logger, host) {
        var _this = _super.call(this, factory) || this;
        _this.logger = logger;
        _this.host = host;
        _this.logPerformance = false;
        return _this;
      }
      CoreServicesShimObject2.prototype.forwardJSONCall = function(actionDescription, action) {
        return forwardJSONCall(this.logger, actionDescription, action, this.logPerformance);
      };
      CoreServicesShimObject2.prototype.resolveModuleName = function(fileName, moduleName, compilerOptionsJson) {
        var _this = this;
        return this.forwardJSONCall("resolveModuleName('".concat(fileName, "')"), function() {
          var compilerOptions = JSON.parse(compilerOptionsJson);
          var result = ts2.resolveModuleName(moduleName, ts2.normalizeSlashes(fileName), compilerOptions, _this.host);
          var resolvedFileName = result.resolvedModule ? result.resolvedModule.resolvedFileName : void 0;
          if (result.resolvedModule && result.resolvedModule.extension !== ".ts" && result.resolvedModule.extension !== ".tsx" && result.resolvedModule.extension !== ".d.ts") {
            resolvedFileName = void 0;
          }
          return {
            resolvedFileName,
            failedLookupLocations: result.failedLookupLocations
          };
        });
      };
      CoreServicesShimObject2.prototype.resolveTypeReferenceDirective = function(fileName, typeReferenceDirective, compilerOptionsJson) {
        var _this = this;
        return this.forwardJSONCall("resolveTypeReferenceDirective(".concat(fileName, ")"), function() {
          var compilerOptions = JSON.parse(compilerOptionsJson);
          var result = ts2.resolveTypeReferenceDirective(typeReferenceDirective, ts2.normalizeSlashes(fileName), compilerOptions, _this.host);
          return {
            resolvedFileName: result.resolvedTypeReferenceDirective ? result.resolvedTypeReferenceDirective.resolvedFileName : void 0,
            primary: result.resolvedTypeReferenceDirective ? result.resolvedTypeReferenceDirective.primary : true,
            failedLookupLocations: result.failedLookupLocations
          };
        });
      };
      CoreServicesShimObject2.prototype.getPreProcessedFileInfo = function(fileName, sourceTextSnapshot) {
        var _this = this;
        return this.forwardJSONCall("getPreProcessedFileInfo('".concat(fileName, "')"), function() {
          var result = ts2.preProcessFile(ts2.getSnapshotText(sourceTextSnapshot), true, true);
          return {
            referencedFiles: _this.convertFileReferences(result.referencedFiles),
            importedFiles: _this.convertFileReferences(result.importedFiles),
            ambientExternalModules: result.ambientExternalModules,
            isLibFile: result.isLibFile,
            typeReferenceDirectives: _this.convertFileReferences(result.typeReferenceDirectives),
            libReferenceDirectives: _this.convertFileReferences(result.libReferenceDirectives)
          };
        });
      };
      CoreServicesShimObject2.prototype.getAutomaticTypeDirectiveNames = function(compilerOptionsJson) {
        var _this = this;
        return this.forwardJSONCall("getAutomaticTypeDirectiveNames('".concat(compilerOptionsJson, "')"), function() {
          var compilerOptions = JSON.parse(compilerOptionsJson);
          return ts2.getAutomaticTypeDirectiveNames(compilerOptions, _this.host);
        });
      };
      CoreServicesShimObject2.prototype.convertFileReferences = function(refs) {
        if (!refs) {
          return void 0;
        }
        var result = [];
        for (var _i = 0, refs_1 = refs; _i < refs_1.length; _i++) {
          var ref = refs_1[_i];
          result.push({
            path: ts2.normalizeSlashes(ref.fileName),
            position: ref.pos,
            length: ref.end - ref.pos
          });
        }
        return result;
      };
      CoreServicesShimObject2.prototype.getTSConfigFileInfo = function(fileName, sourceTextSnapshot) {
        var _this = this;
        return this.forwardJSONCall("getTSConfigFileInfo('".concat(fileName, "')"), function() {
          var result = ts2.parseJsonText(fileName, ts2.getSnapshotText(sourceTextSnapshot));
          var normalizedFileName = ts2.normalizeSlashes(fileName);
          var configFile = ts2.parseJsonSourceFileConfigFileContent(result, _this.host, ts2.getDirectoryPath(normalizedFileName), {}, normalizedFileName);
          return {
            options: configFile.options,
            typeAcquisition: configFile.typeAcquisition,
            files: configFile.fileNames,
            raw: configFile.raw,
            errors: realizeDiagnostics(__spreadArray(__spreadArray([], result.parseDiagnostics, true), configFile.errors, true), "\r\n")
          };
        });
      };
      CoreServicesShimObject2.prototype.getDefaultCompilationSettings = function() {
        return this.forwardJSONCall("getDefaultCompilationSettings()", function() {
          return ts2.getDefaultCompilerOptions();
        });
      };
      CoreServicesShimObject2.prototype.discoverTypings = function(discoverTypingsJson) {
        var _this = this;
        var getCanonicalFileName = ts2.createGetCanonicalFileName(false);
        return this.forwardJSONCall("discoverTypings()", function() {
          var info = JSON.parse(discoverTypingsJson);
          if (_this.safeList === void 0) {
            _this.safeList = ts2.JsTyping.loadSafeList(_this.host, ts2.toPath(info.safeListPath, info.safeListPath, getCanonicalFileName));
          }
          return ts2.JsTyping.discoverTypings(_this.host, function(msg) {
            return _this.logger.log(msg);
          }, info.fileNames, ts2.toPath(info.projectRootPath, info.projectRootPath, getCanonicalFileName), _this.safeList, info.packageNameToTypingLocation, info.typeAcquisition, info.unresolvedImports, info.typesRegistry);
        });
      };
      return CoreServicesShimObject2;
    }(ShimBase);
    var TypeScriptServicesFactory = function() {
      function TypeScriptServicesFactory2() {
        this._shims = [];
      }
      TypeScriptServicesFactory2.prototype.getServicesVersion = function() {
        return ts2.servicesVersion;
      };
      TypeScriptServicesFactory2.prototype.createLanguageServiceShim = function(host) {
        try {
          if (this.documentRegistry === void 0) {
            this.documentRegistry = ts2.createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory());
          }
          var hostAdapter = new LanguageServiceShimHostAdapter(host);
          var languageService = ts2.createLanguageService(hostAdapter, this.documentRegistry, false);
          return new LanguageServiceShimObject(this, host, languageService);
        } catch (err) {
          logInternalError(host, err);
          throw err;
        }
      };
      TypeScriptServicesFactory2.prototype.createClassifierShim = function(logger) {
        try {
          return new ClassifierShimObject(this, logger);
        } catch (err) {
          logInternalError(logger, err);
          throw err;
        }
      };
      TypeScriptServicesFactory2.prototype.createCoreServicesShim = function(host) {
        try {
          var adapter = new CoreServicesShimHostAdapter(host);
          return new CoreServicesShimObject(this, host, adapter);
        } catch (err) {
          logInternalError(host, err);
          throw err;
        }
      };
      TypeScriptServicesFactory2.prototype.close = function() {
        ts2.clear(this._shims);
        this.documentRegistry = void 0;
      };
      TypeScriptServicesFactory2.prototype.registerShim = function(shim) {
        this._shims.push(shim);
      };
      TypeScriptServicesFactory2.prototype.unregisterShim = function(shim) {
        for (var i = 0; i < this._shims.length; i++) {
          if (this._shims[i] === shim) {
            delete this._shims[i];
            return;
          }
        }
        throw new Error("Invalid operation");
      };
      return TypeScriptServicesFactory2;
    }();
    ts2.TypeScriptServicesFactory = TypeScriptServicesFactory;
  })(ts || (ts = {}));
  (function() {
    if (typeof globalThis === "object")
      return;
    try {
      Object.defineProperty(Object.prototype, "__magic__", {
        get: function() {
          return this;
        },
        configurable: true
      });
      __magic__.globalThis = __magic__;
      if (typeof globalThis === "undefined") {
        window.globalThis = window;
      }
      delete Object.prototype.__magic__;
    } catch (error) {
      window.globalThis = window;
    }
  })();
  if (typeof process === "undefined" || process.browser) {
    globalThis.TypeScript = globalThis.TypeScript || {};
    globalThis.TypeScript.Services = globalThis.TypeScript.Services || {};
    globalThis.TypeScript.Services.TypeScriptServicesFactory = ts.TypeScriptServicesFactory;
    globalThis.toolsVersion = ts.versionMajorMinor;
  }
  if (typeof module !== "undefined" && module.exports) {
  }
  var ts;
  (function(ts2) {
    var factoryDeprecation = { since: "4.0", warnAfter: "4.1", message: "Use the appropriate method on 'ts.factory' or the 'factory' supplied by your transformation context instead." };
    ts2.createNodeArray = ts2.Debug.deprecate(ts2.factory.createNodeArray, factoryDeprecation);
    ts2.createNumericLiteral = ts2.Debug.deprecate(ts2.factory.createNumericLiteral, factoryDeprecation);
    ts2.createBigIntLiteral = ts2.Debug.deprecate(ts2.factory.createBigIntLiteral, factoryDeprecation);
    ts2.createStringLiteral = ts2.Debug.deprecate(ts2.factory.createStringLiteral, factoryDeprecation);
    ts2.createStringLiteralFromNode = ts2.Debug.deprecate(ts2.factory.createStringLiteralFromNode, factoryDeprecation);
    ts2.createRegularExpressionLiteral = ts2.Debug.deprecate(ts2.factory.createRegularExpressionLiteral, factoryDeprecation);
    ts2.createLoopVariable = ts2.Debug.deprecate(ts2.factory.createLoopVariable, factoryDeprecation);
    ts2.createUniqueName = ts2.Debug.deprecate(ts2.factory.createUniqueName, factoryDeprecation);
    ts2.createPrivateIdentifier = ts2.Debug.deprecate(ts2.factory.createPrivateIdentifier, factoryDeprecation);
    ts2.createSuper = ts2.Debug.deprecate(ts2.factory.createSuper, factoryDeprecation);
    ts2.createThis = ts2.Debug.deprecate(ts2.factory.createThis, factoryDeprecation);
    ts2.createNull = ts2.Debug.deprecate(ts2.factory.createNull, factoryDeprecation);
    ts2.createTrue = ts2.Debug.deprecate(ts2.factory.createTrue, factoryDeprecation);
    ts2.createFalse = ts2.Debug.deprecate(ts2.factory.createFalse, factoryDeprecation);
    ts2.createModifier = ts2.Debug.deprecate(ts2.factory.createModifier, factoryDeprecation);
    ts2.createModifiersFromModifierFlags = ts2.Debug.deprecate(ts2.factory.createModifiersFromModifierFlags, factoryDeprecation);
    ts2.createQualifiedName = ts2.Debug.deprecate(ts2.factory.createQualifiedName, factoryDeprecation);
    ts2.updateQualifiedName = ts2.Debug.deprecate(ts2.factory.updateQualifiedName, factoryDeprecation);
    ts2.createComputedPropertyName = ts2.Debug.deprecate(ts2.factory.createComputedPropertyName, factoryDeprecation);
    ts2.updateComputedPropertyName = ts2.Debug.deprecate(ts2.factory.updateComputedPropertyName, factoryDeprecation);
    ts2.createTypeParameterDeclaration = ts2.Debug.deprecate(ts2.factory.createTypeParameterDeclaration, factoryDeprecation);
    ts2.updateTypeParameterDeclaration = ts2.Debug.deprecate(ts2.factory.updateTypeParameterDeclaration, factoryDeprecation);
    ts2.createParameter = ts2.Debug.deprecate(ts2.factory.createParameterDeclaration, factoryDeprecation);
    ts2.updateParameter = ts2.Debug.deprecate(ts2.factory.updateParameterDeclaration, factoryDeprecation);
    ts2.createDecorator = ts2.Debug.deprecate(ts2.factory.createDecorator, factoryDeprecation);
    ts2.updateDecorator = ts2.Debug.deprecate(ts2.factory.updateDecorator, factoryDeprecation);
    ts2.createProperty = ts2.Debug.deprecate(ts2.factory.createPropertyDeclaration, factoryDeprecation);
    ts2.updateProperty = ts2.Debug.deprecate(ts2.factory.updatePropertyDeclaration, factoryDeprecation);
    ts2.createMethod = ts2.Debug.deprecate(ts2.factory.createMethodDeclaration, factoryDeprecation);
    ts2.updateMethod = ts2.Debug.deprecate(ts2.factory.updateMethodDeclaration, factoryDeprecation);
    ts2.createConstructor = ts2.Debug.deprecate(ts2.factory.createConstructorDeclaration, factoryDeprecation);
    ts2.updateConstructor = ts2.Debug.deprecate(ts2.factory.updateConstructorDeclaration, factoryDeprecation);
    ts2.createGetAccessor = ts2.Debug.deprecate(ts2.factory.createGetAccessorDeclaration, factoryDeprecation);
    ts2.updateGetAccessor = ts2.Debug.deprecate(ts2.factory.updateGetAccessorDeclaration, factoryDeprecation);
    ts2.createSetAccessor = ts2.Debug.deprecate(ts2.factory.createSetAccessorDeclaration, factoryDeprecation);
    ts2.updateSetAccessor = ts2.Debug.deprecate(ts2.factory.updateSetAccessorDeclaration, factoryDeprecation);
    ts2.createCallSignature = ts2.Debug.deprecate(ts2.factory.createCallSignature, factoryDeprecation);
    ts2.updateCallSignature = ts2.Debug.deprecate(ts2.factory.updateCallSignature, factoryDeprecation);
    ts2.createConstructSignature = ts2.Debug.deprecate(ts2.factory.createConstructSignature, factoryDeprecation);
    ts2.updateConstructSignature = ts2.Debug.deprecate(ts2.factory.updateConstructSignature, factoryDeprecation);
    ts2.updateIndexSignature = ts2.Debug.deprecate(ts2.factory.updateIndexSignature, factoryDeprecation);
    ts2.createKeywordTypeNode = ts2.Debug.deprecate(ts2.factory.createKeywordTypeNode, factoryDeprecation);
    ts2.createTypePredicateNodeWithModifier = ts2.Debug.deprecate(ts2.factory.createTypePredicateNode, factoryDeprecation);
    ts2.updateTypePredicateNodeWithModifier = ts2.Debug.deprecate(ts2.factory.updateTypePredicateNode, factoryDeprecation);
    ts2.createTypeReferenceNode = ts2.Debug.deprecate(ts2.factory.createTypeReferenceNode, factoryDeprecation);
    ts2.updateTypeReferenceNode = ts2.Debug.deprecate(ts2.factory.updateTypeReferenceNode, factoryDeprecation);
    ts2.createFunctionTypeNode = ts2.Debug.deprecate(ts2.factory.createFunctionTypeNode, factoryDeprecation);
    ts2.updateFunctionTypeNode = ts2.Debug.deprecate(ts2.factory.updateFunctionTypeNode, factoryDeprecation);
    ts2.createConstructorTypeNode = ts2.Debug.deprecate(function(typeParameters, parameters, type) {
      return ts2.factory.createConstructorTypeNode(void 0, typeParameters, parameters, type);
    }, factoryDeprecation);
    ts2.updateConstructorTypeNode = ts2.Debug.deprecate(function(node, typeParameters, parameters, type) {
      return ts2.factory.updateConstructorTypeNode(node, node.modifiers, typeParameters, parameters, type);
    }, factoryDeprecation);
    ts2.createTypeQueryNode = ts2.Debug.deprecate(ts2.factory.createTypeQueryNode, factoryDeprecation);
    ts2.updateTypeQueryNode = ts2.Debug.deprecate(ts2.factory.updateTypeQueryNode, factoryDeprecation);
    ts2.createTypeLiteralNode = ts2.Debug.deprecate(ts2.factory.createTypeLiteralNode, factoryDeprecation);
    ts2.updateTypeLiteralNode = ts2.Debug.deprecate(ts2.factory.updateTypeLiteralNode, factoryDeprecation);
    ts2.createArrayTypeNode = ts2.Debug.deprecate(ts2.factory.createArrayTypeNode, factoryDeprecation);
    ts2.updateArrayTypeNode = ts2.Debug.deprecate(ts2.factory.updateArrayTypeNode, factoryDeprecation);
    ts2.createTupleTypeNode = ts2.Debug.deprecate(ts2.factory.createTupleTypeNode, factoryDeprecation);
    ts2.updateTupleTypeNode = ts2.Debug.deprecate(ts2.factory.updateTupleTypeNode, factoryDeprecation);
    ts2.createOptionalTypeNode = ts2.Debug.deprecate(ts2.factory.createOptionalTypeNode, factoryDeprecation);
    ts2.updateOptionalTypeNode = ts2.Debug.deprecate(ts2.factory.updateOptionalTypeNode, factoryDeprecation);
    ts2.createRestTypeNode = ts2.Debug.deprecate(ts2.factory.createRestTypeNode, factoryDeprecation);
    ts2.updateRestTypeNode = ts2.Debug.deprecate(ts2.factory.updateRestTypeNode, factoryDeprecation);
    ts2.createUnionTypeNode = ts2.Debug.deprecate(ts2.factory.createUnionTypeNode, factoryDeprecation);
    ts2.updateUnionTypeNode = ts2.Debug.deprecate(ts2.factory.updateUnionTypeNode, factoryDeprecation);
    ts2.createIntersectionTypeNode = ts2.Debug.deprecate(ts2.factory.createIntersectionTypeNode, factoryDeprecation);
    ts2.updateIntersectionTypeNode = ts2.Debug.deprecate(ts2.factory.updateIntersectionTypeNode, factoryDeprecation);
    ts2.createConditionalTypeNode = ts2.Debug.deprecate(ts2.factory.createConditionalTypeNode, factoryDeprecation);
    ts2.updateConditionalTypeNode = ts2.Debug.deprecate(ts2.factory.updateConditionalTypeNode, factoryDeprecation);
    ts2.createInferTypeNode = ts2.Debug.deprecate(ts2.factory.createInferTypeNode, factoryDeprecation);
    ts2.updateInferTypeNode = ts2.Debug.deprecate(ts2.factory.updateInferTypeNode, factoryDeprecation);
    ts2.createImportTypeNode = ts2.Debug.deprecate(ts2.factory.createImportTypeNode, factoryDeprecation);
    ts2.updateImportTypeNode = ts2.Debug.deprecate(ts2.factory.updateImportTypeNode, factoryDeprecation);
    ts2.createParenthesizedType = ts2.Debug.deprecate(ts2.factory.createParenthesizedType, factoryDeprecation);
    ts2.updateParenthesizedType = ts2.Debug.deprecate(ts2.factory.updateParenthesizedType, factoryDeprecation);
    ts2.createThisTypeNode = ts2.Debug.deprecate(ts2.factory.createThisTypeNode, factoryDeprecation);
    ts2.updateTypeOperatorNode = ts2.Debug.deprecate(ts2.factory.updateTypeOperatorNode, factoryDeprecation);
    ts2.createIndexedAccessTypeNode = ts2.Debug.deprecate(ts2.factory.createIndexedAccessTypeNode, factoryDeprecation);
    ts2.updateIndexedAccessTypeNode = ts2.Debug.deprecate(ts2.factory.updateIndexedAccessTypeNode, factoryDeprecation);
    ts2.createMappedTypeNode = ts2.Debug.deprecate(ts2.factory.createMappedTypeNode, factoryDeprecation);
    ts2.updateMappedTypeNode = ts2.Debug.deprecate(ts2.factory.updateMappedTypeNode, factoryDeprecation);
    ts2.createLiteralTypeNode = ts2.Debug.deprecate(ts2.factory.createLiteralTypeNode, factoryDeprecation);
    ts2.updateLiteralTypeNode = ts2.Debug.deprecate(ts2.factory.updateLiteralTypeNode, factoryDeprecation);
    ts2.createObjectBindingPattern = ts2.Debug.deprecate(ts2.factory.createObjectBindingPattern, factoryDeprecation);
    ts2.updateObjectBindingPattern = ts2.Debug.deprecate(ts2.factory.updateObjectBindingPattern, factoryDeprecation);
    ts2.createArrayBindingPattern = ts2.Debug.deprecate(ts2.factory.createArrayBindingPattern, factoryDeprecation);
    ts2.updateArrayBindingPattern = ts2.Debug.deprecate(ts2.factory.updateArrayBindingPattern, factoryDeprecation);
    ts2.createBindingElement = ts2.Debug.deprecate(ts2.factory.createBindingElement, factoryDeprecation);
    ts2.updateBindingElement = ts2.Debug.deprecate(ts2.factory.updateBindingElement, factoryDeprecation);
    ts2.createArrayLiteral = ts2.Debug.deprecate(ts2.factory.createArrayLiteralExpression, factoryDeprecation);
    ts2.updateArrayLiteral = ts2.Debug.deprecate(ts2.factory.updateArrayLiteralExpression, factoryDeprecation);
    ts2.createObjectLiteral = ts2.Debug.deprecate(ts2.factory.createObjectLiteralExpression, factoryDeprecation);
    ts2.updateObjectLiteral = ts2.Debug.deprecate(ts2.factory.updateObjectLiteralExpression, factoryDeprecation);
    ts2.createPropertyAccess = ts2.Debug.deprecate(ts2.factory.createPropertyAccessExpression, factoryDeprecation);
    ts2.updatePropertyAccess = ts2.Debug.deprecate(ts2.factory.updatePropertyAccessExpression, factoryDeprecation);
    ts2.createPropertyAccessChain = ts2.Debug.deprecate(ts2.factory.createPropertyAccessChain, factoryDeprecation);
    ts2.updatePropertyAccessChain = ts2.Debug.deprecate(ts2.factory.updatePropertyAccessChain, factoryDeprecation);
    ts2.createElementAccess = ts2.Debug.deprecate(ts2.factory.createElementAccessExpression, factoryDeprecation);
    ts2.updateElementAccess = ts2.Debug.deprecate(ts2.factory.updateElementAccessExpression, factoryDeprecation);
    ts2.createElementAccessChain = ts2.Debug.deprecate(ts2.factory.createElementAccessChain, factoryDeprecation);
    ts2.updateElementAccessChain = ts2.Debug.deprecate(ts2.factory.updateElementAccessChain, factoryDeprecation);
    ts2.createCall = ts2.Debug.deprecate(ts2.factory.createCallExpression, factoryDeprecation);
    ts2.updateCall = ts2.Debug.deprecate(ts2.factory.updateCallExpression, factoryDeprecation);
    ts2.createCallChain = ts2.Debug.deprecate(ts2.factory.createCallChain, factoryDeprecation);
    ts2.updateCallChain = ts2.Debug.deprecate(ts2.factory.updateCallChain, factoryDeprecation);
    ts2.createNew = ts2.Debug.deprecate(ts2.factory.createNewExpression, factoryDeprecation);
    ts2.updateNew = ts2.Debug.deprecate(ts2.factory.updateNewExpression, factoryDeprecation);
    ts2.createTypeAssertion = ts2.Debug.deprecate(ts2.factory.createTypeAssertion, factoryDeprecation);
    ts2.updateTypeAssertion = ts2.Debug.deprecate(ts2.factory.updateTypeAssertion, factoryDeprecation);
    ts2.createParen = ts2.Debug.deprecate(ts2.factory.createParenthesizedExpression, factoryDeprecation);
    ts2.updateParen = ts2.Debug.deprecate(ts2.factory.updateParenthesizedExpression, factoryDeprecation);
    ts2.createFunctionExpression = ts2.Debug.deprecate(ts2.factory.createFunctionExpression, factoryDeprecation);
    ts2.updateFunctionExpression = ts2.Debug.deprecate(ts2.factory.updateFunctionExpression, factoryDeprecation);
    ts2.createDelete = ts2.Debug.deprecate(ts2.factory.createDeleteExpression, factoryDeprecation);
    ts2.updateDelete = ts2.Debug.deprecate(ts2.factory.updateDeleteExpression, factoryDeprecation);
    ts2.createTypeOf = ts2.Debug.deprecate(ts2.factory.createTypeOfExpression, factoryDeprecation);
    ts2.updateTypeOf = ts2.Debug.deprecate(ts2.factory.updateTypeOfExpression, factoryDeprecation);
    ts2.createVoid = ts2.Debug.deprecate(ts2.factory.createVoidExpression, factoryDeprecation);
    ts2.updateVoid = ts2.Debug.deprecate(ts2.factory.updateVoidExpression, factoryDeprecation);
    ts2.createAwait = ts2.Debug.deprecate(ts2.factory.createAwaitExpression, factoryDeprecation);
    ts2.updateAwait = ts2.Debug.deprecate(ts2.factory.updateAwaitExpression, factoryDeprecation);
    ts2.createPrefix = ts2.Debug.deprecate(ts2.factory.createPrefixUnaryExpression, factoryDeprecation);
    ts2.updatePrefix = ts2.Debug.deprecate(ts2.factory.updatePrefixUnaryExpression, factoryDeprecation);
    ts2.createPostfix = ts2.Debug.deprecate(ts2.factory.createPostfixUnaryExpression, factoryDeprecation);
    ts2.updatePostfix = ts2.Debug.deprecate(ts2.factory.updatePostfixUnaryExpression, factoryDeprecation);
    ts2.createBinary = ts2.Debug.deprecate(ts2.factory.createBinaryExpression, factoryDeprecation);
    ts2.updateConditional = ts2.Debug.deprecate(ts2.factory.updateConditionalExpression, factoryDeprecation);
    ts2.createTemplateExpression = ts2.Debug.deprecate(ts2.factory.createTemplateExpression, factoryDeprecation);
    ts2.updateTemplateExpression = ts2.Debug.deprecate(ts2.factory.updateTemplateExpression, factoryDeprecation);
    ts2.createTemplateHead = ts2.Debug.deprecate(ts2.factory.createTemplateHead, factoryDeprecation);
    ts2.createTemplateMiddle = ts2.Debug.deprecate(ts2.factory.createTemplateMiddle, factoryDeprecation);
    ts2.createTemplateTail = ts2.Debug.deprecate(ts2.factory.createTemplateTail, factoryDeprecation);
    ts2.createNoSubstitutionTemplateLiteral = ts2.Debug.deprecate(ts2.factory.createNoSubstitutionTemplateLiteral, factoryDeprecation);
    ts2.updateYield = ts2.Debug.deprecate(ts2.factory.updateYieldExpression, factoryDeprecation);
    ts2.createSpread = ts2.Debug.deprecate(ts2.factory.createSpreadElement, factoryDeprecation);
    ts2.updateSpread = ts2.Debug.deprecate(ts2.factory.updateSpreadElement, factoryDeprecation);
    ts2.createOmittedExpression = ts2.Debug.deprecate(ts2.factory.createOmittedExpression, factoryDeprecation);
    ts2.createAsExpression = ts2.Debug.deprecate(ts2.factory.createAsExpression, factoryDeprecation);
    ts2.updateAsExpression = ts2.Debug.deprecate(ts2.factory.updateAsExpression, factoryDeprecation);
    ts2.createNonNullExpression = ts2.Debug.deprecate(ts2.factory.createNonNullExpression, factoryDeprecation);
    ts2.updateNonNullExpression = ts2.Debug.deprecate(ts2.factory.updateNonNullExpression, factoryDeprecation);
    ts2.createNonNullChain = ts2.Debug.deprecate(ts2.factory.createNonNullChain, factoryDeprecation);
    ts2.updateNonNullChain = ts2.Debug.deprecate(ts2.factory.updateNonNullChain, factoryDeprecation);
    ts2.createMetaProperty = ts2.Debug.deprecate(ts2.factory.createMetaProperty, factoryDeprecation);
    ts2.updateMetaProperty = ts2.Debug.deprecate(ts2.factory.updateMetaProperty, factoryDeprecation);
    ts2.createTemplateSpan = ts2.Debug.deprecate(ts2.factory.createTemplateSpan, factoryDeprecation);
    ts2.updateTemplateSpan = ts2.Debug.deprecate(ts2.factory.updateTemplateSpan, factoryDeprecation);
    ts2.createSemicolonClassElement = ts2.Debug.deprecate(ts2.factory.createSemicolonClassElement, factoryDeprecation);
    ts2.createBlock = ts2.Debug.deprecate(ts2.factory.createBlock, factoryDeprecation);
    ts2.updateBlock = ts2.Debug.deprecate(ts2.factory.updateBlock, factoryDeprecation);
    ts2.createVariableStatement = ts2.Debug.deprecate(ts2.factory.createVariableStatement, factoryDeprecation);
    ts2.updateVariableStatement = ts2.Debug.deprecate(ts2.factory.updateVariableStatement, factoryDeprecation);
    ts2.createEmptyStatement = ts2.Debug.deprecate(ts2.factory.createEmptyStatement, factoryDeprecation);
    ts2.createExpressionStatement = ts2.Debug.deprecate(ts2.factory.createExpressionStatement, factoryDeprecation);
    ts2.updateExpressionStatement = ts2.Debug.deprecate(ts2.factory.updateExpressionStatement, factoryDeprecation);
    ts2.createStatement = ts2.Debug.deprecate(ts2.factory.createExpressionStatement, factoryDeprecation);
    ts2.updateStatement = ts2.Debug.deprecate(ts2.factory.updateExpressionStatement, factoryDeprecation);
    ts2.createIf = ts2.Debug.deprecate(ts2.factory.createIfStatement, factoryDeprecation);
    ts2.updateIf = ts2.Debug.deprecate(ts2.factory.updateIfStatement, factoryDeprecation);
    ts2.createDo = ts2.Debug.deprecate(ts2.factory.createDoStatement, factoryDeprecation);
    ts2.updateDo = ts2.Debug.deprecate(ts2.factory.updateDoStatement, factoryDeprecation);
    ts2.createWhile = ts2.Debug.deprecate(ts2.factory.createWhileStatement, factoryDeprecation);
    ts2.updateWhile = ts2.Debug.deprecate(ts2.factory.updateWhileStatement, factoryDeprecation);
    ts2.createFor = ts2.Debug.deprecate(ts2.factory.createForStatement, factoryDeprecation);
    ts2.updateFor = ts2.Debug.deprecate(ts2.factory.updateForStatement, factoryDeprecation);
    ts2.createForIn = ts2.Debug.deprecate(ts2.factory.createForInStatement, factoryDeprecation);
    ts2.updateForIn = ts2.Debug.deprecate(ts2.factory.updateForInStatement, factoryDeprecation);
    ts2.createForOf = ts2.Debug.deprecate(ts2.factory.createForOfStatement, factoryDeprecation);
    ts2.updateForOf = ts2.Debug.deprecate(ts2.factory.updateForOfStatement, factoryDeprecation);
    ts2.createContinue = ts2.Debug.deprecate(ts2.factory.createContinueStatement, factoryDeprecation);
    ts2.updateContinue = ts2.Debug.deprecate(ts2.factory.updateContinueStatement, factoryDeprecation);
    ts2.createBreak = ts2.Debug.deprecate(ts2.factory.createBreakStatement, factoryDeprecation);
    ts2.updateBreak = ts2.Debug.deprecate(ts2.factory.updateBreakStatement, factoryDeprecation);
    ts2.createReturn = ts2.Debug.deprecate(ts2.factory.createReturnStatement, factoryDeprecation);
    ts2.updateReturn = ts2.Debug.deprecate(ts2.factory.updateReturnStatement, factoryDeprecation);
    ts2.createWith = ts2.Debug.deprecate(ts2.factory.createWithStatement, factoryDeprecation);
    ts2.updateWith = ts2.Debug.deprecate(ts2.factory.updateWithStatement, factoryDeprecation);
    ts2.createSwitch = ts2.Debug.deprecate(ts2.factory.createSwitchStatement, factoryDeprecation);
    ts2.updateSwitch = ts2.Debug.deprecate(ts2.factory.updateSwitchStatement, factoryDeprecation);
    ts2.createLabel = ts2.Debug.deprecate(ts2.factory.createLabeledStatement, factoryDeprecation);
    ts2.updateLabel = ts2.Debug.deprecate(ts2.factory.updateLabeledStatement, factoryDeprecation);
    ts2.createThrow = ts2.Debug.deprecate(ts2.factory.createThrowStatement, factoryDeprecation);
    ts2.updateThrow = ts2.Debug.deprecate(ts2.factory.updateThrowStatement, factoryDeprecation);
    ts2.createTry = ts2.Debug.deprecate(ts2.factory.createTryStatement, factoryDeprecation);
    ts2.updateTry = ts2.Debug.deprecate(ts2.factory.updateTryStatement, factoryDeprecation);
    ts2.createDebuggerStatement = ts2.Debug.deprecate(ts2.factory.createDebuggerStatement, factoryDeprecation);
    ts2.createVariableDeclarationList = ts2.Debug.deprecate(ts2.factory.createVariableDeclarationList, factoryDeprecation);
    ts2.updateVariableDeclarationList = ts2.Debug.deprecate(ts2.factory.updateVariableDeclarationList, factoryDeprecation);
    ts2.createFunctionDeclaration = ts2.Debug.deprecate(ts2.factory.createFunctionDeclaration, factoryDeprecation);
    ts2.updateFunctionDeclaration = ts2.Debug.deprecate(ts2.factory.updateFunctionDeclaration, factoryDeprecation);
    ts2.createClassDeclaration = ts2.Debug.deprecate(ts2.factory.createClassDeclaration, factoryDeprecation);
    ts2.updateClassDeclaration = ts2.Debug.deprecate(ts2.factory.updateClassDeclaration, factoryDeprecation);
    ts2.createInterfaceDeclaration = ts2.Debug.deprecate(ts2.factory.createInterfaceDeclaration, factoryDeprecation);
    ts2.updateInterfaceDeclaration = ts2.Debug.deprecate(ts2.factory.updateInterfaceDeclaration, factoryDeprecation);
    ts2.createTypeAliasDeclaration = ts2.Debug.deprecate(ts2.factory.createTypeAliasDeclaration, factoryDeprecation);
    ts2.updateTypeAliasDeclaration = ts2.Debug.deprecate(ts2.factory.updateTypeAliasDeclaration, factoryDeprecation);
    ts2.createEnumDeclaration = ts2.Debug.deprecate(ts2.factory.createEnumDeclaration, factoryDeprecation);
    ts2.updateEnumDeclaration = ts2.Debug.deprecate(ts2.factory.updateEnumDeclaration, factoryDeprecation);
    ts2.createModuleDeclaration = ts2.Debug.deprecate(ts2.factory.createModuleDeclaration, factoryDeprecation);
    ts2.updateModuleDeclaration = ts2.Debug.deprecate(ts2.factory.updateModuleDeclaration, factoryDeprecation);
    ts2.createModuleBlock = ts2.Debug.deprecate(ts2.factory.createModuleBlock, factoryDeprecation);
    ts2.updateModuleBlock = ts2.Debug.deprecate(ts2.factory.updateModuleBlock, factoryDeprecation);
    ts2.createCaseBlock = ts2.Debug.deprecate(ts2.factory.createCaseBlock, factoryDeprecation);
    ts2.updateCaseBlock = ts2.Debug.deprecate(ts2.factory.updateCaseBlock, factoryDeprecation);
    ts2.createNamespaceExportDeclaration = ts2.Debug.deprecate(ts2.factory.createNamespaceExportDeclaration, factoryDeprecation);
    ts2.updateNamespaceExportDeclaration = ts2.Debug.deprecate(ts2.factory.updateNamespaceExportDeclaration, factoryDeprecation);
    ts2.createImportEqualsDeclaration = ts2.Debug.deprecate(ts2.factory.createImportEqualsDeclaration, factoryDeprecation);
    ts2.updateImportEqualsDeclaration = ts2.Debug.deprecate(ts2.factory.updateImportEqualsDeclaration, factoryDeprecation);
    ts2.createImportDeclaration = ts2.Debug.deprecate(ts2.factory.createImportDeclaration, factoryDeprecation);
    ts2.updateImportDeclaration = ts2.Debug.deprecate(ts2.factory.updateImportDeclaration, factoryDeprecation);
    ts2.createNamespaceImport = ts2.Debug.deprecate(ts2.factory.createNamespaceImport, factoryDeprecation);
    ts2.updateNamespaceImport = ts2.Debug.deprecate(ts2.factory.updateNamespaceImport, factoryDeprecation);
    ts2.createNamedImports = ts2.Debug.deprecate(ts2.factory.createNamedImports, factoryDeprecation);
    ts2.updateNamedImports = ts2.Debug.deprecate(ts2.factory.updateNamedImports, factoryDeprecation);
    ts2.createImportSpecifier = ts2.Debug.deprecate(ts2.factory.createImportSpecifier, factoryDeprecation);
    ts2.updateImportSpecifier = ts2.Debug.deprecate(ts2.factory.updateImportSpecifier, factoryDeprecation);
    ts2.createExportAssignment = ts2.Debug.deprecate(ts2.factory.createExportAssignment, factoryDeprecation);
    ts2.updateExportAssignment = ts2.Debug.deprecate(ts2.factory.updateExportAssignment, factoryDeprecation);
    ts2.createNamedExports = ts2.Debug.deprecate(ts2.factory.createNamedExports, factoryDeprecation);
    ts2.updateNamedExports = ts2.Debug.deprecate(ts2.factory.updateNamedExports, factoryDeprecation);
    ts2.createExportSpecifier = ts2.Debug.deprecate(ts2.factory.createExportSpecifier, factoryDeprecation);
    ts2.updateExportSpecifier = ts2.Debug.deprecate(ts2.factory.updateExportSpecifier, factoryDeprecation);
    ts2.createExternalModuleReference = ts2.Debug.deprecate(ts2.factory.createExternalModuleReference, factoryDeprecation);
    ts2.updateExternalModuleReference = ts2.Debug.deprecate(ts2.factory.updateExternalModuleReference, factoryDeprecation);
    ts2.createJSDocTypeExpression = ts2.Debug.deprecate(ts2.factory.createJSDocTypeExpression, factoryDeprecation);
    ts2.createJSDocTypeTag = ts2.Debug.deprecate(ts2.factory.createJSDocTypeTag, factoryDeprecation);
    ts2.createJSDocReturnTag = ts2.Debug.deprecate(ts2.factory.createJSDocReturnTag, factoryDeprecation);
    ts2.createJSDocThisTag = ts2.Debug.deprecate(ts2.factory.createJSDocThisTag, factoryDeprecation);
    ts2.createJSDocComment = ts2.Debug.deprecate(ts2.factory.createJSDocComment, factoryDeprecation);
    ts2.createJSDocParameterTag = ts2.Debug.deprecate(ts2.factory.createJSDocParameterTag, factoryDeprecation);
    ts2.createJSDocClassTag = ts2.Debug.deprecate(ts2.factory.createJSDocClassTag, factoryDeprecation);
    ts2.createJSDocAugmentsTag = ts2.Debug.deprecate(ts2.factory.createJSDocAugmentsTag, factoryDeprecation);
    ts2.createJSDocEnumTag = ts2.Debug.deprecate(ts2.factory.createJSDocEnumTag, factoryDeprecation);
    ts2.createJSDocTemplateTag = ts2.Debug.deprecate(ts2.factory.createJSDocTemplateTag, factoryDeprecation);
    ts2.createJSDocTypedefTag = ts2.Debug.deprecate(ts2.factory.createJSDocTypedefTag, factoryDeprecation);
    ts2.createJSDocCallbackTag = ts2.Debug.deprecate(ts2.factory.createJSDocCallbackTag, factoryDeprecation);
    ts2.createJSDocSignature = ts2.Debug.deprecate(ts2.factory.createJSDocSignature, factoryDeprecation);
    ts2.createJSDocPropertyTag = ts2.Debug.deprecate(ts2.factory.createJSDocPropertyTag, factoryDeprecation);
    ts2.createJSDocTypeLiteral = ts2.Debug.deprecate(ts2.factory.createJSDocTypeLiteral, factoryDeprecation);
    ts2.createJSDocImplementsTag = ts2.Debug.deprecate(ts2.factory.createJSDocImplementsTag, factoryDeprecation);
    ts2.createJSDocAuthorTag = ts2.Debug.deprecate(ts2.factory.createJSDocAuthorTag, factoryDeprecation);
    ts2.createJSDocPublicTag = ts2.Debug.deprecate(ts2.factory.createJSDocPublicTag, factoryDeprecation);
    ts2.createJSDocPrivateTag = ts2.Debug.deprecate(ts2.factory.createJSDocPrivateTag, factoryDeprecation);
    ts2.createJSDocProtectedTag = ts2.Debug.deprecate(ts2.factory.createJSDocProtectedTag, factoryDeprecation);
    ts2.createJSDocReadonlyTag = ts2.Debug.deprecate(ts2.factory.createJSDocReadonlyTag, factoryDeprecation);
    ts2.createJSDocTag = ts2.Debug.deprecate(ts2.factory.createJSDocUnknownTag, factoryDeprecation);
    ts2.createJsxElement = ts2.Debug.deprecate(ts2.factory.createJsxElement, factoryDeprecation);
    ts2.updateJsxElement = ts2.Debug.deprecate(ts2.factory.updateJsxElement, factoryDeprecation);
    ts2.createJsxSelfClosingElement = ts2.Debug.deprecate(ts2.factory.createJsxSelfClosingElement, factoryDeprecation);
    ts2.updateJsxSelfClosingElement = ts2.Debug.deprecate(ts2.factory.updateJsxSelfClosingElement, factoryDeprecation);
    ts2.createJsxOpeningElement = ts2.Debug.deprecate(ts2.factory.createJsxOpeningElement, factoryDeprecation);
    ts2.updateJsxOpeningElement = ts2.Debug.deprecate(ts2.factory.updateJsxOpeningElement, factoryDeprecation);
    ts2.createJsxClosingElement = ts2.Debug.deprecate(ts2.factory.createJsxClosingElement, factoryDeprecation);
    ts2.updateJsxClosingElement = ts2.Debug.deprecate(ts2.factory.updateJsxClosingElement, factoryDeprecation);
    ts2.createJsxFragment = ts2.Debug.deprecate(ts2.factory.createJsxFragment, factoryDeprecation);
    ts2.createJsxText = ts2.Debug.deprecate(ts2.factory.createJsxText, factoryDeprecation);
    ts2.updateJsxText = ts2.Debug.deprecate(ts2.factory.updateJsxText, factoryDeprecation);
    ts2.createJsxOpeningFragment = ts2.Debug.deprecate(ts2.factory.createJsxOpeningFragment, factoryDeprecation);
    ts2.createJsxJsxClosingFragment = ts2.Debug.deprecate(ts2.factory.createJsxJsxClosingFragment, factoryDeprecation);
    ts2.updateJsxFragment = ts2.Debug.deprecate(ts2.factory.updateJsxFragment, factoryDeprecation);
    ts2.createJsxAttribute = ts2.Debug.deprecate(ts2.factory.createJsxAttribute, factoryDeprecation);
    ts2.updateJsxAttribute = ts2.Debug.deprecate(ts2.factory.updateJsxAttribute, factoryDeprecation);
    ts2.createJsxAttributes = ts2.Debug.deprecate(ts2.factory.createJsxAttributes, factoryDeprecation);
    ts2.updateJsxAttributes = ts2.Debug.deprecate(ts2.factory.updateJsxAttributes, factoryDeprecation);
    ts2.createJsxSpreadAttribute = ts2.Debug.deprecate(ts2.factory.createJsxSpreadAttribute, factoryDeprecation);
    ts2.updateJsxSpreadAttribute = ts2.Debug.deprecate(ts2.factory.updateJsxSpreadAttribute, factoryDeprecation);
    ts2.createJsxExpression = ts2.Debug.deprecate(ts2.factory.createJsxExpression, factoryDeprecation);
    ts2.updateJsxExpression = ts2.Debug.deprecate(ts2.factory.updateJsxExpression, factoryDeprecation);
    ts2.createCaseClause = ts2.Debug.deprecate(ts2.factory.createCaseClause, factoryDeprecation);
    ts2.updateCaseClause = ts2.Debug.deprecate(ts2.factory.updateCaseClause, factoryDeprecation);
    ts2.createDefaultClause = ts2.Debug.deprecate(ts2.factory.createDefaultClause, factoryDeprecation);
    ts2.updateDefaultClause = ts2.Debug.deprecate(ts2.factory.updateDefaultClause, factoryDeprecation);
    ts2.createHeritageClause = ts2.Debug.deprecate(ts2.factory.createHeritageClause, factoryDeprecation);
    ts2.updateHeritageClause = ts2.Debug.deprecate(ts2.factory.updateHeritageClause, factoryDeprecation);
    ts2.createCatchClause = ts2.Debug.deprecate(ts2.factory.createCatchClause, factoryDeprecation);
    ts2.updateCatchClause = ts2.Debug.deprecate(ts2.factory.updateCatchClause, factoryDeprecation);
    ts2.createPropertyAssignment = ts2.Debug.deprecate(ts2.factory.createPropertyAssignment, factoryDeprecation);
    ts2.updatePropertyAssignment = ts2.Debug.deprecate(ts2.factory.updatePropertyAssignment, factoryDeprecation);
    ts2.createShorthandPropertyAssignment = ts2.Debug.deprecate(ts2.factory.createShorthandPropertyAssignment, factoryDeprecation);
    ts2.updateShorthandPropertyAssignment = ts2.Debug.deprecate(ts2.factory.updateShorthandPropertyAssignment, factoryDeprecation);
    ts2.createSpreadAssignment = ts2.Debug.deprecate(ts2.factory.createSpreadAssignment, factoryDeprecation);
    ts2.updateSpreadAssignment = ts2.Debug.deprecate(ts2.factory.updateSpreadAssignment, factoryDeprecation);
    ts2.createEnumMember = ts2.Debug.deprecate(ts2.factory.createEnumMember, factoryDeprecation);
    ts2.updateEnumMember = ts2.Debug.deprecate(ts2.factory.updateEnumMember, factoryDeprecation);
    ts2.updateSourceFileNode = ts2.Debug.deprecate(ts2.factory.updateSourceFile, factoryDeprecation);
    ts2.createNotEmittedStatement = ts2.Debug.deprecate(ts2.factory.createNotEmittedStatement, factoryDeprecation);
    ts2.createPartiallyEmittedExpression = ts2.Debug.deprecate(ts2.factory.createPartiallyEmittedExpression, factoryDeprecation);
    ts2.updatePartiallyEmittedExpression = ts2.Debug.deprecate(ts2.factory.updatePartiallyEmittedExpression, factoryDeprecation);
    ts2.createCommaList = ts2.Debug.deprecate(ts2.factory.createCommaListExpression, factoryDeprecation);
    ts2.updateCommaList = ts2.Debug.deprecate(ts2.factory.updateCommaListExpression, factoryDeprecation);
    ts2.createBundle = ts2.Debug.deprecate(ts2.factory.createBundle, factoryDeprecation);
    ts2.updateBundle = ts2.Debug.deprecate(ts2.factory.updateBundle, factoryDeprecation);
    ts2.createImmediatelyInvokedFunctionExpression = ts2.Debug.deprecate(ts2.factory.createImmediatelyInvokedFunctionExpression, factoryDeprecation);
    ts2.createImmediatelyInvokedArrowFunction = ts2.Debug.deprecate(ts2.factory.createImmediatelyInvokedArrowFunction, factoryDeprecation);
    ts2.createVoidZero = ts2.Debug.deprecate(ts2.factory.createVoidZero, factoryDeprecation);
    ts2.createExportDefault = ts2.Debug.deprecate(ts2.factory.createExportDefault, factoryDeprecation);
    ts2.createExternalModuleExport = ts2.Debug.deprecate(ts2.factory.createExternalModuleExport, factoryDeprecation);
    ts2.createNamespaceExport = ts2.Debug.deprecate(ts2.factory.createNamespaceExport, factoryDeprecation);
    ts2.updateNamespaceExport = ts2.Debug.deprecate(ts2.factory.updateNamespaceExport, factoryDeprecation);
    ts2.createToken = ts2.Debug.deprecate(function createToken(kind) {
      return ts2.factory.createToken(kind);
    }, factoryDeprecation);
    ts2.createIdentifier = ts2.Debug.deprecate(function createIdentifier(text) {
      return ts2.factory.createIdentifier(text, void 0, void 0);
    }, factoryDeprecation);
    ts2.createTempVariable = ts2.Debug.deprecate(function createTempVariable(recordTempVariable) {
      return ts2.factory.createTempVariable(recordTempVariable, void 0);
    }, factoryDeprecation);
    ts2.getGeneratedNameForNode = ts2.Debug.deprecate(function getGeneratedNameForNode(node) {
      return ts2.factory.getGeneratedNameForNode(node, void 0);
    }, factoryDeprecation);
    ts2.createOptimisticUniqueName = ts2.Debug.deprecate(function createOptimisticUniqueName(text) {
      return ts2.factory.createUniqueName(text, 16);
    }, factoryDeprecation);
    ts2.createFileLevelUniqueName = ts2.Debug.deprecate(function createFileLevelUniqueName(text) {
      return ts2.factory.createUniqueName(text, 16 | 32);
    }, factoryDeprecation);
    ts2.createIndexSignature = ts2.Debug.deprecate(function createIndexSignature(decorators, modifiers, parameters, type) {
      return ts2.factory.createIndexSignature(decorators, modifiers, parameters, type);
    }, factoryDeprecation);
    ts2.createTypePredicateNode = ts2.Debug.deprecate(function createTypePredicateNode(parameterName, type) {
      return ts2.factory.createTypePredicateNode(void 0, parameterName, type);
    }, factoryDeprecation);
    ts2.updateTypePredicateNode = ts2.Debug.deprecate(function updateTypePredicateNode(node, parameterName, type) {
      return ts2.factory.updateTypePredicateNode(node, void 0, parameterName, type);
    }, factoryDeprecation);
    ts2.createLiteral = ts2.Debug.deprecate(function createLiteral(value) {
      if (typeof value === "number") {
        return ts2.factory.createNumericLiteral(value);
      }
      if (typeof value === "object" && "base10Value" in value) {
        return ts2.factory.createBigIntLiteral(value);
      }
      if (typeof value === "boolean") {
        return value ? ts2.factory.createTrue() : ts2.factory.createFalse();
      }
      if (typeof value === "string") {
        return ts2.factory.createStringLiteral(value, void 0);
      }
      return ts2.factory.createStringLiteralFromNode(value);
    }, { since: "4.0", warnAfter: "4.1", message: "Use `factory.createStringLiteral`, `factory.createStringLiteralFromNode`, `factory.createNumericLiteral`, `factory.createBigIntLiteral`, `factory.createTrue`, `factory.createFalse`, or the factory supplied by your transformation context instead." });
    ts2.createMethodSignature = ts2.Debug.deprecate(function createMethodSignature(typeParameters, parameters, type, name, questionToken) {
      return ts2.factory.createMethodSignature(void 0, name, questionToken, typeParameters, parameters, type);
    }, factoryDeprecation);
    ts2.updateMethodSignature = ts2.Debug.deprecate(function updateMethodSignature(node, typeParameters, parameters, type, name, questionToken) {
      return ts2.factory.updateMethodSignature(node, node.modifiers, name, questionToken, typeParameters, parameters, type);
    }, factoryDeprecation);
    ts2.createTypeOperatorNode = ts2.Debug.deprecate(function createTypeOperatorNode(operatorOrType, type) {
      var operator;
      if (type) {
        operator = operatorOrType;
      } else {
        type = operatorOrType;
        operator = 140;
      }
      return ts2.factory.createTypeOperatorNode(operator, type);
    }, factoryDeprecation);
    ts2.createTaggedTemplate = ts2.Debug.deprecate(function createTaggedTemplate(tag, typeArgumentsOrTemplate, template) {
      var typeArguments;
      if (template) {
        typeArguments = typeArgumentsOrTemplate;
      } else {
        template = typeArgumentsOrTemplate;
      }
      return ts2.factory.createTaggedTemplateExpression(tag, typeArguments, template);
    }, factoryDeprecation);
    ts2.updateTaggedTemplate = ts2.Debug.deprecate(function updateTaggedTemplate(node, tag, typeArgumentsOrTemplate, template) {
      var typeArguments;
      if (template) {
        typeArguments = typeArgumentsOrTemplate;
      } else {
        template = typeArgumentsOrTemplate;
      }
      return ts2.factory.updateTaggedTemplateExpression(node, tag, typeArguments, template);
    }, factoryDeprecation);
    ts2.updateBinary = ts2.Debug.deprecate(function updateBinary(node, left, right, operator) {
      if (operator === void 0) {
        operator = node.operatorToken;
      }
      if (typeof operator === "number") {
        operator = operator === node.operatorToken.kind ? node.operatorToken : ts2.factory.createToken(operator);
      }
      return ts2.factory.updateBinaryExpression(node, left, operator, right);
    }, factoryDeprecation);
    ts2.createConditional = ts2.Debug.deprecate(function createConditional(condition, questionTokenOrWhenTrue, whenTrueOrWhenFalse, colonToken, whenFalse) {
      return arguments.length === 5 ? ts2.factory.createConditionalExpression(condition, questionTokenOrWhenTrue, whenTrueOrWhenFalse, colonToken, whenFalse) : arguments.length === 3 ? ts2.factory.createConditionalExpression(condition, ts2.factory.createToken(57), questionTokenOrWhenTrue, ts2.factory.createToken(58), whenTrueOrWhenFalse) : ts2.Debug.fail("Argument count mismatch");
    }, factoryDeprecation);
    ts2.createYield = ts2.Debug.deprecate(function createYield(asteriskTokenOrExpression, expression) {
      var asteriskToken;
      if (expression) {
        asteriskToken = asteriskTokenOrExpression;
      } else {
        expression = asteriskTokenOrExpression;
      }
      return ts2.factory.createYieldExpression(asteriskToken, expression);
    }, factoryDeprecation);
    ts2.createClassExpression = ts2.Debug.deprecate(function createClassExpression(modifiers, name, typeParameters, heritageClauses, members) {
      return ts2.factory.createClassExpression(void 0, modifiers, name, typeParameters, heritageClauses, members);
    }, factoryDeprecation);
    ts2.updateClassExpression = ts2.Debug.deprecate(function updateClassExpression(node, modifiers, name, typeParameters, heritageClauses, members) {
      return ts2.factory.updateClassExpression(node, void 0, modifiers, name, typeParameters, heritageClauses, members);
    }, factoryDeprecation);
    ts2.createPropertySignature = ts2.Debug.deprecate(function createPropertySignature(modifiers, name, questionToken, type, initializer) {
      var node = ts2.factory.createPropertySignature(modifiers, name, questionToken, type);
      node.initializer = initializer;
      return node;
    }, factoryDeprecation);
    ts2.updatePropertySignature = ts2.Debug.deprecate(function updatePropertySignature(node, modifiers, name, questionToken, type, initializer) {
      var updated = ts2.factory.updatePropertySignature(node, modifiers, name, questionToken, type);
      if (node.initializer !== initializer) {
        if (updated === node) {
          updated = ts2.factory.cloneNode(node);
        }
        updated.initializer = initializer;
      }
      return updated;
    }, factoryDeprecation);
    ts2.createExpressionWithTypeArguments = ts2.Debug.deprecate(function createExpressionWithTypeArguments(typeArguments, expression) {
      return ts2.factory.createExpressionWithTypeArguments(expression, typeArguments);
    }, factoryDeprecation);
    ts2.updateExpressionWithTypeArguments = ts2.Debug.deprecate(function updateExpressionWithTypeArguments(node, typeArguments, expression) {
      return ts2.factory.updateExpressionWithTypeArguments(node, expression, typeArguments);
    }, factoryDeprecation);
    ts2.createArrowFunction = ts2.Debug.deprecate(function createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) {
      return arguments.length === 6 ? ts2.factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) : arguments.length === 5 ? ts2.factory.createArrowFunction(modifiers, typeParameters, parameters, type, void 0, equalsGreaterThanTokenOrBody) : ts2.Debug.fail("Argument count mismatch");
    }, factoryDeprecation);
    ts2.updateArrowFunction = ts2.Debug.deprecate(function updateArrowFunction(node, modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) {
      return arguments.length === 7 ? ts2.factory.updateArrowFunction(node, modifiers, typeParameters, parameters, type, equalsGreaterThanTokenOrBody, body) : arguments.length === 6 ? ts2.factory.updateArrowFunction(node, modifiers, typeParameters, parameters, type, node.equalsGreaterThanToken, equalsGreaterThanTokenOrBody) : ts2.Debug.fail("Argument count mismatch");
    }, factoryDeprecation);
    ts2.createVariableDeclaration = ts2.Debug.deprecate(function createVariableDeclaration(name, exclamationTokenOrType, typeOrInitializer, initializer) {
      return arguments.length === 4 ? ts2.factory.createVariableDeclaration(name, exclamationTokenOrType, typeOrInitializer, initializer) : arguments.length >= 1 && arguments.length <= 3 ? ts2.factory.createVariableDeclaration(name, void 0, exclamationTokenOrType, typeOrInitializer) : ts2.Debug.fail("Argument count mismatch");
    }, factoryDeprecation);
    ts2.updateVariableDeclaration = ts2.Debug.deprecate(function updateVariableDeclaration(node, name, exclamationTokenOrType, typeOrInitializer, initializer) {
      return arguments.length === 5 ? ts2.factory.updateVariableDeclaration(node, name, exclamationTokenOrType, typeOrInitializer, initializer) : arguments.length === 4 ? ts2.factory.updateVariableDeclaration(node, name, node.exclamationToken, exclamationTokenOrType, typeOrInitializer) : ts2.Debug.fail("Argument count mismatch");
    }, factoryDeprecation);
    ts2.createImportClause = ts2.Debug.deprecate(function createImportClause(name, namedBindings, isTypeOnly) {
      if (isTypeOnly === void 0) {
        isTypeOnly = false;
      }
      return ts2.factory.createImportClause(isTypeOnly, name, namedBindings);
    }, factoryDeprecation);
    ts2.updateImportClause = ts2.Debug.deprecate(function updateImportClause(node, name, namedBindings, isTypeOnly) {
      return ts2.factory.updateImportClause(node, isTypeOnly, name, namedBindings);
    }, factoryDeprecation);
    ts2.createExportDeclaration = ts2.Debug.deprecate(function createExportDeclaration(decorators, modifiers, exportClause, moduleSpecifier, isTypeOnly) {
      if (isTypeOnly === void 0) {
        isTypeOnly = false;
      }
      return ts2.factory.createExportDeclaration(decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier);
    }, factoryDeprecation);
    ts2.updateExportDeclaration = ts2.Debug.deprecate(function updateExportDeclaration(node, decorators, modifiers, exportClause, moduleSpecifier, isTypeOnly) {
      return ts2.factory.updateExportDeclaration(node, decorators, modifiers, isTypeOnly, exportClause, moduleSpecifier, node.assertClause);
    }, factoryDeprecation);
    ts2.createJSDocParamTag = ts2.Debug.deprecate(function createJSDocParamTag(name, isBracketed, typeExpression, comment) {
      return ts2.factory.createJSDocParameterTag(void 0, name, isBracketed, typeExpression, false, comment ? ts2.factory.createNodeArray([ts2.factory.createJSDocText(comment)]) : void 0);
    }, factoryDeprecation);
    ts2.createComma = ts2.Debug.deprecate(function createComma(left, right) {
      return ts2.factory.createComma(left, right);
    }, factoryDeprecation);
    ts2.createLessThan = ts2.Debug.deprecate(function createLessThan(left, right) {
      return ts2.factory.createLessThan(left, right);
    }, factoryDeprecation);
    ts2.createAssignment = ts2.Debug.deprecate(function createAssignment(left, right) {
      return ts2.factory.createAssignment(left, right);
    }, factoryDeprecation);
    ts2.createStrictEquality = ts2.Debug.deprecate(function createStrictEquality(left, right) {
      return ts2.factory.createStrictEquality(left, right);
    }, factoryDeprecation);
    ts2.createStrictInequality = ts2.Debug.deprecate(function createStrictInequality(left, right) {
      return ts2.factory.createStrictInequality(left, right);
    }, factoryDeprecation);
    ts2.createAdd = ts2.Debug.deprecate(function createAdd(left, right) {
      return ts2.factory.createAdd(left, right);
    }, factoryDeprecation);
    ts2.createSubtract = ts2.Debug.deprecate(function createSubtract(left, right) {
      return ts2.factory.createSubtract(left, right);
    }, factoryDeprecation);
    ts2.createLogicalAnd = ts2.Debug.deprecate(function createLogicalAnd(left, right) {
      return ts2.factory.createLogicalAnd(left, right);
    }, factoryDeprecation);
    ts2.createLogicalOr = ts2.Debug.deprecate(function createLogicalOr(left, right) {
      return ts2.factory.createLogicalOr(left, right);
    }, factoryDeprecation);
    ts2.createPostfixIncrement = ts2.Debug.deprecate(function createPostfixIncrement(operand) {
      return ts2.factory.createPostfixIncrement(operand);
    }, factoryDeprecation);
    ts2.createLogicalNot = ts2.Debug.deprecate(function createLogicalNot(operand) {
      return ts2.factory.createLogicalNot(operand);
    }, factoryDeprecation);
    ts2.createNode = ts2.Debug.deprecate(function createNode(kind, pos, end) {
      if (pos === void 0) {
        pos = 0;
      }
      if (end === void 0) {
        end = 0;
      }
      return ts2.setTextRangePosEnd(kind === 303 ? ts2.parseBaseNodeFactory.createBaseSourceFileNode(kind) : kind === 79 ? ts2.parseBaseNodeFactory.createBaseIdentifierNode(kind) : kind === 80 ? ts2.parseBaseNodeFactory.createBasePrivateIdentifierNode(kind) : !ts2.isNodeKind(kind) ? ts2.parseBaseNodeFactory.createBaseTokenNode(kind) : ts2.parseBaseNodeFactory.createBaseNode(kind), pos, end);
    }, { since: "4.0", warnAfter: "4.1", message: "Use an appropriate `factory` method instead." });
    ts2.getMutableClone = ts2.Debug.deprecate(function getMutableClone(node) {
      var clone = ts2.factory.cloneNode(node);
      ts2.setTextRange(clone, node);
      ts2.setParent(clone, node.parent);
      return clone;
    }, { since: "4.0", warnAfter: "4.1", message: "Use an appropriate `factory.update...` method instead, use `setCommentRange` or `setSourceMapRange`, and avoid setting `parent`." });
    ts2.isTypeAssertion = ts2.Debug.deprecate(function isTypeAssertion(node) {
      return node.kind === 210;
    }, {
      since: "4.0",
      warnAfter: "4.1",
      message: "Use `isTypeAssertionExpression` instead."
    });
    ts2.isIdentifierOrPrivateIdentifier = ts2.Debug.deprecate(function isIdentifierOrPrivateIdentifier(node) {
      return ts2.isMemberName(node);
    }, {
      since: "4.2",
      warnAfter: "4.3",
      message: "Use `isMemberName` instead."
    });
  })(ts || (ts = {}));
  var createClassifier = ts.createClassifier;
  var createLanguageService = ts.createLanguageService;
  var displayPartsToString = ts.displayPartsToString;
  var EndOfLineState = ts.EndOfLineState;
  var flattenDiagnosticMessageText = ts.flattenDiagnosticMessageText;
  var IndentStyle = ts.IndentStyle;
  var ScriptKind = ts.ScriptKind;
  var ScriptTarget = ts.ScriptTarget;
  var TokenClass = ts.TokenClass;
  var typescript = ts;

  // src/language/typescript/lib/lib.ts
  var libFileMap = {};
  libFileMap["lib.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es5" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n';
  libFileMap["lib.dom.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


/////////////////////////////
/// Window APIs
/////////////////////////////

interface AddEventListenerOptions extends EventListenerOptions {
    once?: boolean;
    passive?: boolean;
    signal?: AbortSignal;
}

interface AesCbcParams extends Algorithm {
    iv: BufferSource;
}

interface AesCtrParams extends Algorithm {
    counter: BufferSource;
    length: number;
}

interface AesDerivedKeyParams extends Algorithm {
    length: number;
}

interface AesGcmParams extends Algorithm {
    additionalData?: BufferSource;
    iv: BufferSource;
    tagLength?: number;
}

interface AesKeyAlgorithm extends KeyAlgorithm {
    length: number;
}

interface AesKeyGenParams extends Algorithm {
    length: number;
}

interface Algorithm {
    name: string;
}

interface AnalyserOptions extends AudioNodeOptions {
    fftSize?: number;
    maxDecibels?: number;
    minDecibels?: number;
    smoothingTimeConstant?: number;
}

interface AnimationEventInit extends EventInit {
    animationName?: string;
    elapsedTime?: number;
    pseudoElement?: string;
}

interface AnimationPlaybackEventInit extends EventInit {
    currentTime?: CSSNumberish | null;
    timelineTime?: CSSNumberish | null;
}

interface AssignedNodesOptions {
    flatten?: boolean;
}

interface AudioBufferOptions {
    length: number;
    numberOfChannels?: number;
    sampleRate: number;
}

interface AudioBufferSourceOptions {
    buffer?: AudioBuffer | null;
    detune?: number;
    loop?: boolean;
    loopEnd?: number;
    loopStart?: number;
    playbackRate?: number;
}

interface AudioConfiguration {
    bitrate?: number;
    channels?: string;
    contentType: string;
    samplerate?: number;
    spatialRendering?: boolean;
}

interface AudioContextOptions {
    latencyHint?: AudioContextLatencyCategory | number;
    sampleRate?: number;
}

interface AudioNodeOptions {
    channelCount?: number;
    channelCountMode?: ChannelCountMode;
    channelInterpretation?: ChannelInterpretation;
}

interface AudioProcessingEventInit extends EventInit {
    inputBuffer: AudioBuffer;
    outputBuffer: AudioBuffer;
    playbackTime: number;
}

interface AudioTimestamp {
    contextTime?: number;
    performanceTime?: DOMHighResTimeStamp;
}

interface AudioWorkletNodeOptions extends AudioNodeOptions {
    numberOfInputs?: number;
    numberOfOutputs?: number;
    outputChannelCount?: number[];
    parameterData?: Record<string, number>;
    processorOptions?: any;
}

interface AuthenticationExtensionsClientInputs {
    appid?: string;
    appidExclude?: string;
    credProps?: boolean;
    uvm?: boolean;
}

interface AuthenticationExtensionsClientOutputs {
    appid?: boolean;
    credProps?: CredentialPropertiesOutput;
    uvm?: UvmEntries;
}

interface AuthenticatorSelectionCriteria {
    authenticatorAttachment?: AuthenticatorAttachment;
    requireResidentKey?: boolean;
    residentKey?: ResidentKeyRequirement;
    userVerification?: UserVerificationRequirement;
}

interface BiquadFilterOptions extends AudioNodeOptions {
    Q?: number;
    detune?: number;
    frequency?: number;
    gain?: number;
    type?: BiquadFilterType;
}

interface BlobEventInit {
    data: Blob;
    timecode?: DOMHighResTimeStamp;
}

interface BlobPropertyBag {
    endings?: EndingType;
    type?: string;
}

interface CSSStyleSheetInit {
    baseURL?: string;
    disabled?: boolean;
    media?: MediaList | string;
}

interface CacheQueryOptions {
    ignoreMethod?: boolean;
    ignoreSearch?: boolean;
    ignoreVary?: boolean;
}

interface CanvasRenderingContext2DSettings {
    alpha?: boolean;
    colorSpace?: PredefinedColorSpace;
    desynchronized?: boolean;
    willReadFrequently?: boolean;
}

interface ChannelMergerOptions extends AudioNodeOptions {
    numberOfInputs?: number;
}

interface ChannelSplitterOptions extends AudioNodeOptions {
    numberOfOutputs?: number;
}

interface ClientQueryOptions {
    includeUncontrolled?: boolean;
    type?: ClientTypes;
}

interface ClipboardEventInit extends EventInit {
    clipboardData?: DataTransfer | null;
}

interface ClipboardItemOptions {
    presentationStyle?: PresentationStyle;
}

interface CloseEventInit extends EventInit {
    code?: number;
    reason?: string;
    wasClean?: boolean;
}

interface CompositionEventInit extends UIEventInit {
    data?: string;
}

interface ComputedEffectTiming extends EffectTiming {
    activeDuration?: CSSNumberish;
    currentIteration?: number | null;
    endTime?: CSSNumberish;
    localTime?: CSSNumberish | null;
    progress?: CSSNumberish | null;
    startTime?: CSSNumberish;
}

interface ComputedKeyframe {
    composite: CompositeOperationOrAuto;
    computedOffset: number;
    easing: string;
    offset: number | null;
    [property: string]: string | number | null | undefined;
}

interface ConstantSourceOptions {
    offset?: number;
}

interface ConstrainBooleanParameters {
    exact?: boolean;
    ideal?: boolean;
}

interface ConstrainDOMStringParameters {
    exact?: string | string[];
    ideal?: string | string[];
}

interface ConstrainDoubleRange extends DoubleRange {
    exact?: number;
    ideal?: number;
}

interface ConstrainULongRange extends ULongRange {
    exact?: number;
    ideal?: number;
}

interface ConvolverOptions extends AudioNodeOptions {
    buffer?: AudioBuffer | null;
    disableNormalization?: boolean;
}

interface CredentialCreationOptions {
    publicKey?: PublicKeyCredentialCreationOptions;
    signal?: AbortSignal;
}

interface CredentialPropertiesOutput {
    rk?: boolean;
}

interface CredentialRequestOptions {
    mediation?: CredentialMediationRequirement;
    publicKey?: PublicKeyCredentialRequestOptions;
    signal?: AbortSignal;
}

interface CryptoKeyPair {
    privateKey?: CryptoKey;
    publicKey?: CryptoKey;
}

interface CustomEventInit<T = any> extends EventInit {
    detail?: T;
}

interface DOMMatrix2DInit {
    a?: number;
    b?: number;
    c?: number;
    d?: number;
    e?: number;
    f?: number;
    m11?: number;
    m12?: number;
    m21?: number;
    m22?: number;
    m41?: number;
    m42?: number;
}

interface DOMMatrixInit extends DOMMatrix2DInit {
    is2D?: boolean;
    m13?: number;
    m14?: number;
    m23?: number;
    m24?: number;
    m31?: number;
    m32?: number;
    m33?: number;
    m34?: number;
    m43?: number;
    m44?: number;
}

interface DOMPointInit {
    w?: number;
    x?: number;
    y?: number;
    z?: number;
}

interface DOMQuadInit {
    p1?: DOMPointInit;
    p2?: DOMPointInit;
    p3?: DOMPointInit;
    p4?: DOMPointInit;
}

interface DOMRectInit {
    height?: number;
    width?: number;
    x?: number;
    y?: number;
}

interface DelayOptions extends AudioNodeOptions {
    delayTime?: number;
    maxDelayTime?: number;
}

interface DeviceMotionEventAccelerationInit {
    x?: number | null;
    y?: number | null;
    z?: number | null;
}

interface DeviceMotionEventInit extends EventInit {
    acceleration?: DeviceMotionEventAccelerationInit;
    accelerationIncludingGravity?: DeviceMotionEventAccelerationInit;
    interval?: number;
    rotationRate?: DeviceMotionEventRotationRateInit;
}

interface DeviceMotionEventRotationRateInit {
    alpha?: number | null;
    beta?: number | null;
    gamma?: number | null;
}

interface DeviceOrientationEventInit extends EventInit {
    absolute?: boolean;
    alpha?: number | null;
    beta?: number | null;
    gamma?: number | null;
}

interface DisplayMediaStreamConstraints {
    audio?: boolean | MediaTrackConstraints;
    video?: boolean | MediaTrackConstraints;
}

interface DocumentTimelineOptions {
    originTime?: DOMHighResTimeStamp;
}

interface DoubleRange {
    max?: number;
    min?: number;
}

interface DragEventInit extends MouseEventInit {
    dataTransfer?: DataTransfer | null;
}

interface DynamicsCompressorOptions extends AudioNodeOptions {
    attack?: number;
    knee?: number;
    ratio?: number;
    release?: number;
    threshold?: number;
}

interface EcKeyAlgorithm extends KeyAlgorithm {
    namedCurve: NamedCurve;
}

interface EcKeyGenParams extends Algorithm {
    namedCurve: NamedCurve;
}

interface EcKeyImportParams extends Algorithm {
    namedCurve: NamedCurve;
}

interface EcdhKeyDeriveParams extends Algorithm {
    public: CryptoKey;
}

interface EcdsaParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
}

interface EffectTiming {
    delay?: number;
    direction?: PlaybackDirection;
    duration?: number | string;
    easing?: string;
    endDelay?: number;
    fill?: FillMode;
    iterationStart?: number;
    iterations?: number;
    playbackRate?: number;
}

interface ElementCreationOptions {
    is?: string;
}

interface ElementDefinitionOptions {
    extends?: string;
}

interface ErrorEventInit extends EventInit {
    colno?: number;
    error?: any;
    filename?: string;
    lineno?: number;
    message?: string;
}

interface EventInit {
    bubbles?: boolean;
    cancelable?: boolean;
    composed?: boolean;
}

interface EventListenerOptions {
    capture?: boolean;
}

interface EventModifierInit extends UIEventInit {
    altKey?: boolean;
    ctrlKey?: boolean;
    metaKey?: boolean;
    modifierAltGraph?: boolean;
    modifierCapsLock?: boolean;
    modifierFn?: boolean;
    modifierFnLock?: boolean;
    modifierHyper?: boolean;
    modifierNumLock?: boolean;
    modifierScrollLock?: boolean;
    modifierSuper?: boolean;
    modifierSymbol?: boolean;
    modifierSymbolLock?: boolean;
    shiftKey?: boolean;
}

interface EventSourceInit {
    withCredentials?: boolean;
}

interface FilePropertyBag extends BlobPropertyBag {
    lastModified?: number;
}

interface FileSystemFlags {
    create?: boolean;
    exclusive?: boolean;
}

interface FocusEventInit extends UIEventInit {
    relatedTarget?: EventTarget | null;
}

interface FocusOptions {
    preventScroll?: boolean;
}

interface FontFaceDescriptors {
    display?: string;
    featureSettings?: string;
    stretch?: string;
    style?: string;
    unicodeRange?: string;
    variant?: string;
    weight?: string;
}

interface FontFaceSetLoadEventInit extends EventInit {
    fontfaces?: FontFace[];
}

interface FormDataEventInit extends EventInit {
    formData: FormData;
}

interface FullscreenOptions {
    navigationUI?: FullscreenNavigationUI;
}

interface GainOptions extends AudioNodeOptions {
    gain?: number;
}

interface GamepadEventInit extends EventInit {
    gamepad: Gamepad;
}

interface GetAnimationsOptions {
    subtree?: boolean;
}

interface GetNotificationOptions {
    tag?: string;
}

interface GetRootNodeOptions {
    composed?: boolean;
}

interface HashChangeEventInit extends EventInit {
    newURL?: string;
    oldURL?: string;
}

interface HkdfParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
    info: BufferSource;
    salt: BufferSource;
}

interface HmacImportParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
    length?: number;
}

interface HmacKeyAlgorithm extends KeyAlgorithm {
    hash: KeyAlgorithm;
    length: number;
}

interface HmacKeyGenParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
    length?: number;
}

interface IDBDatabaseInfo {
    name?: string;
    version?: number;
}

interface IDBIndexParameters {
    multiEntry?: boolean;
    unique?: boolean;
}

interface IDBObjectStoreParameters {
    autoIncrement?: boolean;
    keyPath?: string | string[] | null;
}

interface IDBVersionChangeEventInit extends EventInit {
    newVersion?: number | null;
    oldVersion?: number;
}

interface IIRFilterOptions extends AudioNodeOptions {
    feedback: number[];
    feedforward: number[];
}

interface IdleRequestOptions {
    timeout?: number;
}

interface ImageBitmapOptions {
    colorSpaceConversion?: ColorSpaceConversion;
    imageOrientation?: ImageOrientation;
    premultiplyAlpha?: PremultiplyAlpha;
    resizeHeight?: number;
    resizeQuality?: ResizeQuality;
    resizeWidth?: number;
}

interface ImageBitmapRenderingContextSettings {
    alpha?: boolean;
}

interface ImageDataSettings {
    colorSpace?: PredefinedColorSpace;
}

interface ImportMeta {
    url: string;
}

interface InputEventInit extends UIEventInit {
    data?: string | null;
    dataTransfer?: DataTransfer | null;
    inputType?: string;
    isComposing?: boolean;
    targetRanges?: StaticRange[];
}

interface IntersectionObserverEntryInit {
    boundingClientRect: DOMRectInit;
    intersectionRatio: number;
    intersectionRect: DOMRectInit;
    isIntersecting: boolean;
    rootBounds: DOMRectInit | null;
    target: Element;
    time: DOMHighResTimeStamp;
}

interface IntersectionObserverInit {
    root?: Element | Document | null;
    rootMargin?: string;
    threshold?: number | number[];
}

interface JsonWebKey {
    alg?: string;
    crv?: string;
    d?: string;
    dp?: string;
    dq?: string;
    e?: string;
    ext?: boolean;
    k?: string;
    key_ops?: string[];
    kty?: string;
    n?: string;
    oth?: RsaOtherPrimesInfo[];
    p?: string;
    q?: string;
    qi?: string;
    use?: string;
    x?: string;
    y?: string;
}

interface KeyAlgorithm {
    name: string;
}

interface KeyboardEventInit extends EventModifierInit {
    /** @deprecated */
    charCode?: number;
    code?: string;
    isComposing?: boolean;
    key?: string;
    /** @deprecated */
    keyCode?: number;
    location?: number;
    repeat?: boolean;
}

interface Keyframe {
    composite?: CompositeOperationOrAuto;
    easing?: string;
    offset?: number | null;
    [property: string]: string | number | null | undefined;
}

interface KeyframeAnimationOptions extends KeyframeEffectOptions {
    id?: string;
}

interface KeyframeEffectOptions extends EffectTiming {
    composite?: CompositeOperation;
    iterationComposite?: IterationCompositeOperation;
    pseudoElement?: string | null;
}

interface MediaCapabilitiesDecodingInfo extends MediaCapabilitiesInfo {
    configuration?: MediaDecodingConfiguration;
}

interface MediaCapabilitiesEncodingInfo extends MediaCapabilitiesInfo {
    configuration?: MediaEncodingConfiguration;
}

interface MediaCapabilitiesInfo {
    powerEfficient: boolean;
    smooth: boolean;
    supported: boolean;
}

interface MediaConfiguration {
    audio?: AudioConfiguration;
    video?: VideoConfiguration;
}

interface MediaDecodingConfiguration extends MediaConfiguration {
    type: MediaDecodingType;
}

interface MediaElementAudioSourceOptions {
    mediaElement: HTMLMediaElement;
}

interface MediaEncodingConfiguration extends MediaConfiguration {
    type: MediaEncodingType;
}

interface MediaEncryptedEventInit extends EventInit {
    initData?: ArrayBuffer | null;
    initDataType?: string;
}

interface MediaImage {
    sizes?: string;
    src: string;
    type?: string;
}

interface MediaKeyMessageEventInit extends EventInit {
    message: ArrayBuffer;
    messageType: MediaKeyMessageType;
}

interface MediaKeySystemConfiguration {
    audioCapabilities?: MediaKeySystemMediaCapability[];
    distinctiveIdentifier?: MediaKeysRequirement;
    initDataTypes?: string[];
    label?: string;
    persistentState?: MediaKeysRequirement;
    sessionTypes?: string[];
    videoCapabilities?: MediaKeySystemMediaCapability[];
}

interface MediaKeySystemMediaCapability {
    contentType?: string;
    encryptionScheme?: string | null;
    robustness?: string;
}

interface MediaMetadataInit {
    album?: string;
    artist?: string;
    artwork?: MediaImage[];
    title?: string;
}

interface MediaPositionState {
    duration?: number;
    playbackRate?: number;
    position?: number;
}

interface MediaQueryListEventInit extends EventInit {
    matches?: boolean;
    media?: string;
}

interface MediaRecorderErrorEventInit extends EventInit {
    error: DOMException;
}

interface MediaRecorderOptions {
    audioBitsPerSecond?: number;
    bitsPerSecond?: number;
    mimeType?: string;
    videoBitsPerSecond?: number;
}

interface MediaSessionActionDetails {
    action: MediaSessionAction;
    fastSeek?: boolean | null;
    seekOffset?: number | null;
    seekTime?: number | null;
}

interface MediaStreamAudioSourceOptions {
    mediaStream: MediaStream;
}

interface MediaStreamConstraints {
    audio?: boolean | MediaTrackConstraints;
    peerIdentity?: string;
    preferCurrentTab?: boolean;
    video?: boolean | MediaTrackConstraints;
}

interface MediaStreamTrackEventInit extends EventInit {
    track: MediaStreamTrack;
}

interface MediaTrackCapabilities {
    aspectRatio?: DoubleRange;
    autoGainControl?: boolean[];
    channelCount?: ULongRange;
    cursor?: string[];
    deviceId?: string;
    displaySurface?: string;
    echoCancellation?: boolean[];
    facingMode?: string[];
    frameRate?: DoubleRange;
    groupId?: string;
    height?: ULongRange;
    latency?: DoubleRange;
    logicalSurface?: boolean;
    noiseSuppression?: boolean[];
    resizeMode?: string[];
    sampleRate?: ULongRange;
    sampleSize?: ULongRange;
    width?: ULongRange;
}

interface MediaTrackConstraintSet {
    aspectRatio?: ConstrainDouble;
    autoGainControl?: ConstrainBoolean;
    channelCount?: ConstrainULong;
    deviceId?: ConstrainDOMString;
    echoCancellation?: ConstrainBoolean;
    facingMode?: ConstrainDOMString;
    frameRate?: ConstrainDouble;
    groupId?: ConstrainDOMString;
    height?: ConstrainULong;
    latency?: ConstrainDouble;
    noiseSuppression?: ConstrainBoolean;
    sampleRate?: ConstrainULong;
    sampleSize?: ConstrainULong;
    suppressLocalAudioPlayback?: ConstrainBoolean;
    width?: ConstrainULong;
}

interface MediaTrackConstraints extends MediaTrackConstraintSet {
    advanced?: MediaTrackConstraintSet[];
}

interface MediaTrackSettings {
    aspectRatio?: number;
    autoGainControl?: boolean;
    deviceId?: string;
    echoCancellation?: boolean;
    facingMode?: string;
    frameRate?: number;
    groupId?: string;
    height?: number;
    noiseSuppression?: boolean;
    restrictOwnAudio?: boolean;
    sampleRate?: number;
    sampleSize?: number;
    width?: number;
}

interface MediaTrackSupportedConstraints {
    aspectRatio?: boolean;
    autoGainControl?: boolean;
    deviceId?: boolean;
    echoCancellation?: boolean;
    facingMode?: boolean;
    frameRate?: boolean;
    groupId?: boolean;
    height?: boolean;
    noiseSuppression?: boolean;
    sampleRate?: boolean;
    sampleSize?: boolean;
    suppressLocalAudioPlayback?: boolean;
    width?: boolean;
}

interface MessageEventInit<T = any> extends EventInit {
    data?: T;
    lastEventId?: string;
    origin?: string;
    ports?: MessagePort[];
    source?: MessageEventSource | null;
}

interface MouseEventInit extends EventModifierInit {
    button?: number;
    buttons?: number;
    clientX?: number;
    clientY?: number;
    movementX?: number;
    movementY?: number;
    relatedTarget?: EventTarget | null;
    screenX?: number;
    screenY?: number;
}

interface MultiCacheQueryOptions extends CacheQueryOptions {
    cacheName?: string;
}

interface MutationObserverInit {
    /** Set to a list of attribute local names (without namespace) if not all attribute mutations need to be observed and attributes is true or omitted. */
    attributeFilter?: string[];
    /** Set to true if attributes is true or omitted and target's attribute value before the mutation needs to be recorded. */
    attributeOldValue?: boolean;
    /** Set to true if mutations to target's attributes are to be observed. Can be omitted if attributeOldValue or attributeFilter is specified. */
    attributes?: boolean;
    /** Set to true if mutations to target's data are to be observed. Can be omitted if characterDataOldValue is specified. */
    characterData?: boolean;
    /** Set to true if characterData is set to true or omitted and target's data before the mutation needs to be recorded. */
    characterDataOldValue?: boolean;
    /** Set to true if mutations to target's children are to be observed. */
    childList?: boolean;
    /** Set to true if mutations to not just target, but also target's descendants are to be observed. */
    subtree?: boolean;
}

interface NotificationAction {
    action: string;
    icon?: string;
    title: string;
}

interface NotificationOptions {
    actions?: NotificationAction[];
    badge?: string;
    body?: string;
    data?: any;
    dir?: NotificationDirection;
    icon?: string;
    image?: string;
    lang?: string;
    renotify?: boolean;
    requireInteraction?: boolean;
    silent?: boolean;
    tag?: string;
    timestamp?: DOMTimeStamp;
    vibrate?: VibratePattern;
}

interface OfflineAudioCompletionEventInit extends EventInit {
    renderedBuffer: AudioBuffer;
}

interface OfflineAudioContextOptions {
    length: number;
    numberOfChannels?: number;
    sampleRate: number;
}

interface OptionalEffectTiming {
    delay?: number;
    direction?: PlaybackDirection;
    duration?: number | string;
    easing?: string;
    endDelay?: number;
    fill?: FillMode;
    iterationStart?: number;
    iterations?: number;
    playbackRate?: number;
}

interface OscillatorOptions extends AudioNodeOptions {
    detune?: number;
    frequency?: number;
    periodicWave?: PeriodicWave;
    type?: OscillatorType;
}

interface PageTransitionEventInit extends EventInit {
    persisted?: boolean;
}

interface PannerOptions extends AudioNodeOptions {
    coneInnerAngle?: number;
    coneOuterAngle?: number;
    coneOuterGain?: number;
    distanceModel?: DistanceModelType;
    maxDistance?: number;
    orientationX?: number;
    orientationY?: number;
    orientationZ?: number;
    panningModel?: PanningModelType;
    positionX?: number;
    positionY?: number;
    positionZ?: number;
    refDistance?: number;
    rolloffFactor?: number;
}

interface PaymentCurrencyAmount {
    currency: string;
    value: string;
}

interface PaymentDetailsBase {
    displayItems?: PaymentItem[];
    modifiers?: PaymentDetailsModifier[];
}

interface PaymentDetailsInit extends PaymentDetailsBase {
    id?: string;
    total: PaymentItem;
}

interface PaymentDetailsModifier {
    additionalDisplayItems?: PaymentItem[];
    data?: any;
    supportedMethods: string;
    total?: PaymentItem;
}

interface PaymentDetailsUpdate extends PaymentDetailsBase {
    paymentMethodErrors?: any;
    total?: PaymentItem;
}

interface PaymentItem {
    amount: PaymentCurrencyAmount;
    label: string;
    pending?: boolean;
}

interface PaymentMethodChangeEventInit extends PaymentRequestUpdateEventInit {
    methodDetails?: any;
    methodName?: string;
}

interface PaymentMethodData {
    data?: any;
    supportedMethods: string;
}

interface PaymentRequestUpdateEventInit extends EventInit {
}

interface PaymentValidationErrors {
    error?: string;
    paymentMethod?: any;
}

interface Pbkdf2Params extends Algorithm {
    hash: HashAlgorithmIdentifier;
    iterations: number;
    salt: BufferSource;
}

interface PerformanceMarkOptions {
    detail?: any;
    startTime?: DOMHighResTimeStamp;
}

interface PerformanceMeasureOptions {
    detail?: any;
    duration?: DOMHighResTimeStamp;
    end?: string | DOMHighResTimeStamp;
    start?: string | DOMHighResTimeStamp;
}

interface PerformanceObserverInit {
    buffered?: boolean;
    entryTypes?: string[];
    type?: string;
}

interface PeriodicWaveConstraints {
    disableNormalization?: boolean;
}

interface PeriodicWaveOptions extends PeriodicWaveConstraints {
    imag?: number[] | Float32Array;
    real?: number[] | Float32Array;
}

interface PermissionDescriptor {
    name: PermissionName;
}

interface PointerEventInit extends MouseEventInit {
    coalescedEvents?: PointerEvent[];
    height?: number;
    isPrimary?: boolean;
    pointerId?: number;
    pointerType?: string;
    predictedEvents?: PointerEvent[];
    pressure?: number;
    tangentialPressure?: number;
    tiltX?: number;
    tiltY?: number;
    twist?: number;
    width?: number;
}

interface PopStateEventInit extends EventInit {
    state?: any;
}

interface PositionOptions {
    enableHighAccuracy?: boolean;
    maximumAge?: number;
    timeout?: number;
}

interface ProgressEventInit extends EventInit {
    lengthComputable?: boolean;
    loaded?: number;
    total?: number;
}

interface PromiseRejectionEventInit extends EventInit {
    promise: Promise<any>;
    reason?: any;
}

interface PropertyIndexedKeyframes {
    composite?: CompositeOperationOrAuto | CompositeOperationOrAuto[];
    easing?: string | string[];
    offset?: number | (number | null)[];
    [property: string]: string | string[] | number | null | (number | null)[] | undefined;
}

interface PublicKeyCredentialCreationOptions {
    attestation?: AttestationConveyancePreference;
    authenticatorSelection?: AuthenticatorSelectionCriteria;
    challenge: BufferSource;
    excludeCredentials?: PublicKeyCredentialDescriptor[];
    extensions?: AuthenticationExtensionsClientInputs;
    pubKeyCredParams: PublicKeyCredentialParameters[];
    rp: PublicKeyCredentialRpEntity;
    timeout?: number;
    user: PublicKeyCredentialUserEntity;
}

interface PublicKeyCredentialDescriptor {
    id: BufferSource;
    transports?: AuthenticatorTransport[];
    type: PublicKeyCredentialType;
}

interface PublicKeyCredentialEntity {
    name: string;
}

interface PublicKeyCredentialParameters {
    alg: COSEAlgorithmIdentifier;
    type: PublicKeyCredentialType;
}

interface PublicKeyCredentialRequestOptions {
    allowCredentials?: PublicKeyCredentialDescriptor[];
    challenge: BufferSource;
    extensions?: AuthenticationExtensionsClientInputs;
    rpId?: string;
    timeout?: number;
    userVerification?: UserVerificationRequirement;
}

interface PublicKeyCredentialRpEntity extends PublicKeyCredentialEntity {
    id?: string;
}

interface PublicKeyCredentialUserEntity extends PublicKeyCredentialEntity {
    displayName: string;
    id: BufferSource;
}

interface PushSubscriptionJSON {
    endpoint?: string;
    expirationTime?: DOMTimeStamp | null;
    keys?: Record<string, string>;
}

interface PushSubscriptionOptionsInit {
    applicationServerKey?: BufferSource | string | null;
    userVisibleOnly?: boolean;
}

interface QueuingStrategy<T = any> {
    highWaterMark?: number;
    size?: QueuingStrategySize<T>;
}

interface QueuingStrategyInit {
    /**
     * Creates a new ByteLengthQueuingStrategy with the provided high water mark.
     *
     * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw.
     */
    highWaterMark: number;
}

interface RTCAnswerOptions extends RTCOfferAnswerOptions {
}

interface RTCCertificateExpiration {
    expires?: DOMTimeStamp;
}

interface RTCConfiguration {
    bundlePolicy?: RTCBundlePolicy;
    certificates?: RTCCertificate[];
    iceCandidatePoolSize?: number;
    iceServers?: RTCIceServer[];
    iceTransportPolicy?: RTCIceTransportPolicy;
    rtcpMuxPolicy?: RTCRtcpMuxPolicy;
}

interface RTCDTMFToneChangeEventInit extends EventInit {
    tone?: string;
}

interface RTCDataChannelEventInit extends EventInit {
    channel: RTCDataChannel;
}

interface RTCDataChannelInit {
    id?: number;
    maxPacketLifeTime?: number;
    maxRetransmits?: number;
    negotiated?: boolean;
    ordered?: boolean;
    protocol?: string;
}

interface RTCDtlsFingerprint {
    algorithm?: string;
    value?: string;
}

interface RTCIceCandidateInit {
    candidate?: string;
    sdpMLineIndex?: number | null;
    sdpMid?: string | null;
    usernameFragment?: string | null;
}

interface RTCIceCandidatePairStats extends RTCStats {
    availableIncomingBitrate?: number;
    availableOutgoingBitrate?: number;
    bytesReceived?: number;
    bytesSent?: number;
    currentRoundTripTime?: number;
    localCandidateId: string;
    nominated?: boolean;
    remoteCandidateId: string;
    requestsReceived?: number;
    requestsSent?: number;
    responsesReceived?: number;
    responsesSent?: number;
    state: RTCStatsIceCandidatePairState;
    totalRoundTripTime?: number;
    transportId: string;
}

interface RTCIceServer {
    credential?: string;
    credentialType?: RTCIceCredentialType;
    urls: string | string[];
    username?: string;
}

interface RTCInboundRtpStreamStats extends RTCReceivedRtpStreamStats {
    firCount?: number;
    framesDecoded?: number;
    nackCount?: number;
    pliCount?: number;
    qpSum?: number;
    remoteId?: string;
}

interface RTCLocalSessionDescriptionInit {
    sdp?: string;
    type?: RTCSdpType;
}

interface RTCOfferAnswerOptions {
}

interface RTCOfferOptions extends RTCOfferAnswerOptions {
    iceRestart?: boolean;
    offerToReceiveAudio?: boolean;
    offerToReceiveVideo?: boolean;
}

interface RTCOutboundRtpStreamStats extends RTCSentRtpStreamStats {
    firCount?: number;
    framesEncoded?: number;
    nackCount?: number;
    pliCount?: number;
    qpSum?: number;
    remoteId?: string;
}

interface RTCPeerConnectionIceErrorEventInit extends EventInit {
    address?: string | null;
    errorCode: number;
    errorText?: string;
    port?: number | null;
    url?: string;
}

interface RTCPeerConnectionIceEventInit extends EventInit {
    candidate?: RTCIceCandidate | null;
    url?: string | null;
}

interface RTCReceivedRtpStreamStats extends RTCRtpStreamStats {
    jitter?: number;
    packetsDiscarded?: number;
    packetsLost?: number;
    packetsReceived?: number;
}

interface RTCRtcpParameters {
    cname?: string;
    reducedSize?: boolean;
}

interface RTCRtpCapabilities {
    codecs: RTCRtpCodecCapability[];
    headerExtensions: RTCRtpHeaderExtensionCapability[];
}

interface RTCRtpCodecCapability {
    channels?: number;
    clockRate: number;
    mimeType: string;
    sdpFmtpLine?: string;
}

interface RTCRtpCodecParameters {
    channels?: number;
    clockRate: number;
    mimeType: string;
    payloadType: number;
    sdpFmtpLine?: string;
}

interface RTCRtpCodingParameters {
    rid?: string;
}

interface RTCRtpContributingSource {
    audioLevel?: number;
    rtpTimestamp: number;
    source: number;
    timestamp: DOMHighResTimeStamp;
}

interface RTCRtpEncodingParameters extends RTCRtpCodingParameters {
    active?: boolean;
    maxBitrate?: number;
    priority?: RTCPriorityType;
    scaleResolutionDownBy?: number;
}

interface RTCRtpHeaderExtensionCapability {
    uri?: string;
}

interface RTCRtpHeaderExtensionParameters {
    encrypted?: boolean;
    id: number;
    uri: string;
}

interface RTCRtpParameters {
    codecs: RTCRtpCodecParameters[];
    headerExtensions: RTCRtpHeaderExtensionParameters[];
    rtcp: RTCRtcpParameters;
}

interface RTCRtpReceiveParameters extends RTCRtpParameters {
}

interface RTCRtpSendParameters extends RTCRtpParameters {
    degradationPreference?: RTCDegradationPreference;
    encodings: RTCRtpEncodingParameters[];
    transactionId: string;
}

interface RTCRtpStreamStats extends RTCStats {
    codecId?: string;
    kind: string;
    ssrc: number;
    transportId?: string;
}

interface RTCRtpSynchronizationSource extends RTCRtpContributingSource {
}

interface RTCRtpTransceiverInit {
    direction?: RTCRtpTransceiverDirection;
    sendEncodings?: RTCRtpEncodingParameters[];
    streams?: MediaStream[];
}

interface RTCSentRtpStreamStats extends RTCRtpStreamStats {
    bytesSent?: number;
    packetsSent?: number;
}

interface RTCSessionDescriptionInit {
    sdp?: string;
    type: RTCSdpType;
}

interface RTCStats {
    id: string;
    timestamp: DOMHighResTimeStamp;
    type: RTCStatsType;
}

interface RTCTrackEventInit extends EventInit {
    receiver: RTCRtpReceiver;
    streams?: MediaStream[];
    track: MediaStreamTrack;
    transceiver: RTCRtpTransceiver;
}

interface RTCTransportStats extends RTCStats {
    bytesReceived?: number;
    bytesSent?: number;
    dtlsCipher?: string;
    dtlsState: RTCDtlsTransportState;
    localCertificateId?: string;
    remoteCertificateId?: string;
    rtcpTransportStatsId?: string;
    selectedCandidatePairId?: string;
    srtpCipher?: string;
    tlsVersion?: string;
}

interface ReadableStreamDefaultReadDoneResult {
    done: true;
    value?: undefined;
}

interface ReadableStreamDefaultReadValueResult<T> {
    done: false;
    value: T;
}

interface ReadableWritablePair<R = any, W = any> {
    readable: ReadableStream<R>;
    /**
     * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use.
     *
     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
     */
    writable: WritableStream<W>;
}

interface RegistrationOptions {
    scope?: string;
    type?: WorkerType;
    updateViaCache?: ServiceWorkerUpdateViaCache;
}

interface RequestInit {
    /** A BodyInit object or null to set request's body. */
    body?: BodyInit | null;
    /** A string indicating how the request will interact with the browser's cache to set request's cache. */
    cache?: RequestCache;
    /** A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. */
    credentials?: RequestCredentials;
    /** A Headers object, an object literal, or an array of two-item arrays to set request's headers. */
    headers?: HeadersInit;
    /** A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */
    integrity?: string;
    /** A boolean to set request's keepalive. */
    keepalive?: boolean;
    /** A string to set request's method. */
    method?: string;
    /** A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. */
    mode?: RequestMode;
    /** A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */
    redirect?: RequestRedirect;
    /** A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. */
    referrer?: string;
    /** A referrer policy to set request's referrerPolicy. */
    referrerPolicy?: ReferrerPolicy;
    /** An AbortSignal to set request's signal. */
    signal?: AbortSignal | null;
    /** Can only be null. Used to disassociate request from any Window. */
    window?: null;
}

interface ResizeObserverOptions {
    box?: ResizeObserverBoxOptions;
}

interface ResponseInit {
    headers?: HeadersInit;
    status?: number;
    statusText?: string;
}

interface RsaHashedImportParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
}

interface RsaHashedKeyAlgorithm extends RsaKeyAlgorithm {
    hash: KeyAlgorithm;
}

interface RsaHashedKeyGenParams extends RsaKeyGenParams {
    hash: HashAlgorithmIdentifier;
}

interface RsaKeyAlgorithm extends KeyAlgorithm {
    modulusLength: number;
    publicExponent: BigInteger;
}

interface RsaKeyGenParams extends Algorithm {
    modulusLength: number;
    publicExponent: BigInteger;
}

interface RsaOaepParams extends Algorithm {
    label?: BufferSource;
}

interface RsaOtherPrimesInfo {
    d?: string;
    r?: string;
    t?: string;
}

interface RsaPssParams extends Algorithm {
    saltLength: number;
}

interface SVGBoundingBoxOptions {
    clipped?: boolean;
    fill?: boolean;
    markers?: boolean;
    stroke?: boolean;
}

interface ScrollIntoViewOptions extends ScrollOptions {
    block?: ScrollLogicalPosition;
    inline?: ScrollLogicalPosition;
}

interface ScrollOptions {
    behavior?: ScrollBehavior;
}

interface ScrollToOptions extends ScrollOptions {
    left?: number;
    top?: number;
}

interface SecurityPolicyViolationEventInit extends EventInit {
    blockedURI?: string;
    columnNumber?: number;
    disposition: SecurityPolicyViolationEventDisposition;
    documentURI: string;
    effectiveDirective: string;
    lineNumber?: number;
    originalPolicy: string;
    referrer?: string;
    sample?: string;
    sourceFile?: string;
    statusCode: number;
    violatedDirective: string;
}

interface ShadowRootInit {
    delegatesFocus?: boolean;
    mode: ShadowRootMode;
    slotAssignment?: SlotAssignmentMode;
}

interface ShareData {
    files?: File[];
    text?: string;
    title?: string;
    url?: string;
}

interface SpeechSynthesisErrorEventInit extends SpeechSynthesisEventInit {
    error: SpeechSynthesisErrorCode;
}

interface SpeechSynthesisEventInit extends EventInit {
    charIndex?: number;
    charLength?: number;
    elapsedTime?: number;
    name?: string;
    utterance: SpeechSynthesisUtterance;
}

interface StaticRangeInit {
    endContainer: Node;
    endOffset: number;
    startContainer: Node;
    startOffset: number;
}

interface StereoPannerOptions extends AudioNodeOptions {
    pan?: number;
}

interface StorageEstimate {
    quota?: number;
    usage?: number;
}

interface StorageEventInit extends EventInit {
    key?: string | null;
    newValue?: string | null;
    oldValue?: string | null;
    storageArea?: Storage | null;
    url?: string;
}

interface StreamPipeOptions {
    preventAbort?: boolean;
    preventCancel?: boolean;
    /**
     * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered.
     *
     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
     *
     * Errors and closures of the source and destination streams propagate as follows:
     *
     * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination.
     *
     * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source.
     *
     * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error.
     *
     * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source.
     *
     * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set.
     */
    preventClose?: boolean;
    signal?: AbortSignal;
}

interface StructuredSerializeOptions {
    transfer?: any[];
}

interface SubmitEventInit extends EventInit {
    submitter?: HTMLElement | null;
}

interface TextDecodeOptions {
    stream?: boolean;
}

interface TextDecoderOptions {
    fatal?: boolean;
    ignoreBOM?: boolean;
}

interface TextEncoderEncodeIntoResult {
    read?: number;
    written?: number;
}

interface TouchEventInit extends EventModifierInit {
    changedTouches?: Touch[];
    targetTouches?: Touch[];
    touches?: Touch[];
}

interface TouchInit {
    altitudeAngle?: number;
    azimuthAngle?: number;
    clientX?: number;
    clientY?: number;
    force?: number;
    identifier: number;
    pageX?: number;
    pageY?: number;
    radiusX?: number;
    radiusY?: number;
    rotationAngle?: number;
    screenX?: number;
    screenY?: number;
    target: EventTarget;
    touchType?: TouchType;
}

interface TrackEventInit extends EventInit {
    track?: TextTrack | null;
}

interface Transformer<I = any, O = any> {
    flush?: TransformerFlushCallback<O>;
    readableType?: undefined;
    start?: TransformerStartCallback<O>;
    transform?: TransformerTransformCallback<I, O>;
    writableType?: undefined;
}

interface TransitionEventInit extends EventInit {
    elapsedTime?: number;
    propertyName?: string;
    pseudoElement?: string;
}

interface UIEventInit extends EventInit {
    detail?: number;
    view?: Window | null;
    /** @deprecated */
    which?: number;
}

interface ULongRange {
    max?: number;
    min?: number;
}

interface UnderlyingSink<W = any> {
    abort?: UnderlyingSinkAbortCallback;
    close?: UnderlyingSinkCloseCallback;
    start?: UnderlyingSinkStartCallback;
    type?: undefined;
    write?: UnderlyingSinkWriteCallback<W>;
}

interface UnderlyingSource<R = any> {
    cancel?: UnderlyingSourceCancelCallback;
    pull?: UnderlyingSourcePullCallback<R>;
    start?: UnderlyingSourceStartCallback<R>;
    type?: undefined;
}

interface VideoConfiguration {
    bitrate: number;
    colorGamut?: ColorGamut;
    contentType: string;
    framerate: number;
    hdrMetadataType?: HdrMetadataType;
    height: number;
    scalabilityMode?: string;
    transferFunction?: TransferFunction;
    width: number;
}

interface WaveShaperOptions extends AudioNodeOptions {
    curve?: number[] | Float32Array;
    oversample?: OverSampleType;
}

interface WebGLContextAttributes {
    alpha?: boolean;
    antialias?: boolean;
    depth?: boolean;
    desynchronized?: boolean;
    failIfMajorPerformanceCaveat?: boolean;
    powerPreference?: WebGLPowerPreference;
    premultipliedAlpha?: boolean;
    preserveDrawingBuffer?: boolean;
    stencil?: boolean;
}

interface WebGLContextEventInit extends EventInit {
    statusMessage?: string;
}

interface WheelEventInit extends MouseEventInit {
    deltaMode?: number;
    deltaX?: number;
    deltaY?: number;
    deltaZ?: number;
}

interface WindowPostMessageOptions extends StructuredSerializeOptions {
    targetOrigin?: string;
}

interface WorkerOptions {
    credentials?: RequestCredentials;
    name?: string;
    type?: WorkerType;
}

interface WorkletOptions {
    credentials?: RequestCredentials;
}

type NodeFilter = ((node: Node) => number) | { acceptNode(node: Node): number; };

declare var NodeFilter: {
    readonly FILTER_ACCEPT: number;
    readonly FILTER_REJECT: number;
    readonly FILTER_SKIP: number;
    readonly SHOW_ALL: number;
    readonly SHOW_ATTRIBUTE: number;
    readonly SHOW_CDATA_SECTION: number;
    readonly SHOW_COMMENT: number;
    readonly SHOW_DOCUMENT: number;
    readonly SHOW_DOCUMENT_FRAGMENT: number;
    readonly SHOW_DOCUMENT_TYPE: number;
    readonly SHOW_ELEMENT: number;
    readonly SHOW_ENTITY: number;
    readonly SHOW_ENTITY_REFERENCE: number;
    readonly SHOW_NOTATION: number;
    readonly SHOW_PROCESSING_INSTRUCTION: number;
    readonly SHOW_TEXT: number;
};

type XPathNSResolver = ((prefix: string | null) => string | null) | { lookupNamespaceURI(prefix: string | null): string | null; };

/** The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type. */
interface ANGLE_instanced_arrays {
    drawArraysInstancedANGLE(mode: GLenum, first: GLint, count: GLsizei, primcount: GLsizei): void;
    drawElementsInstancedANGLE(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, primcount: GLsizei): void;
    vertexAttribDivisorANGLE(index: GLuint, divisor: GLuint): void;
    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: GLenum;
}

interface ARIAMixin {
    ariaAtomic: string;
    ariaAutoComplete: string;
    ariaBusy: string;
    ariaChecked: string;
    ariaColCount: string;
    ariaColIndex: string;
    ariaColSpan: string;
    ariaCurrent: string;
    ariaDisabled: string;
    ariaExpanded: string;
    ariaHasPopup: string;
    ariaHidden: string;
    ariaKeyShortcuts: string;
    ariaLabel: string;
    ariaLevel: string;
    ariaLive: string;
    ariaModal: string;
    ariaMultiLine: string;
    ariaMultiSelectable: string;
    ariaOrientation: string;
    ariaPlaceholder: string;
    ariaPosInSet: string;
    ariaPressed: string;
    ariaReadOnly: string;
    ariaRequired: string;
    ariaRoleDescription: string;
    ariaRowCount: string;
    ariaRowIndex: string;
    ariaRowSpan: string;
    ariaSelected: string;
    ariaSetSize: string;
    ariaSort: string;
    ariaValueMax: string;
    ariaValueMin: string;
    ariaValueNow: string;
    ariaValueText: string;
}

/** A controller object that allows you to abort one or more DOM requests as and when desired. */
interface AbortController {
    /** Returns the AbortSignal object associated with this object. */
    readonly signal: AbortSignal;
    /** Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. */
    abort(): void;
}

declare var AbortController: {
    prototype: AbortController;
    new(): AbortController;
};

interface AbortSignalEventMap {
    "abort": Event;
}

/** A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. */
interface AbortSignal extends EventTarget {
    /** Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. */
    readonly aborted: boolean;
    onabort: ((this: AbortSignal, ev: Event) => any) | null;
    addEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var AbortSignal: {
    prototype: AbortSignal;
    new(): AbortSignal;
    // abort(): AbortSignal; - To be re-added in the future
};

interface AbstractRange {
    /** Returns true if range is collapsed, and false otherwise. */
    readonly collapsed: boolean;
    /** Returns range's end node. */
    readonly endContainer: Node;
    /** Returns range's end offset. */
    readonly endOffset: number;
    /** Returns range's start node. */
    readonly startContainer: Node;
    /** Returns range's start offset. */
    readonly startOffset: number;
}

declare var AbstractRange: {
    prototype: AbstractRange;
    new(): AbstractRange;
};

interface AbstractWorkerEventMap {
    "error": ErrorEvent;
}

interface AbstractWorker {
    onerror: ((this: AbstractWorker, ev: ErrorEvent) => any) | null;
    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** A node able to provide real-time frequency and time-domain analysis information. It is an AudioNode that passes the audio stream unchanged from the input to the output, but allows you to take the generated data, process it, and create audio visualizations. */
interface AnalyserNode extends AudioNode {
    fftSize: number;
    readonly frequencyBinCount: number;
    maxDecibels: number;
    minDecibels: number;
    smoothingTimeConstant: number;
    getByteFrequencyData(array: Uint8Array): void;
    getByteTimeDomainData(array: Uint8Array): void;
    getFloatFrequencyData(array: Float32Array): void;
    getFloatTimeDomainData(array: Float32Array): void;
}

declare var AnalyserNode: {
    prototype: AnalyserNode;
    new(context: BaseAudioContext, options?: AnalyserOptions): AnalyserNode;
};

interface Animatable {
    animate(keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeAnimationOptions): Animation;
    getAnimations(options?: GetAnimationsOptions): Animation[];
}

interface AnimationEventMap {
    "cancel": AnimationPlaybackEvent;
    "finish": AnimationPlaybackEvent;
    "remove": Event;
}

interface Animation extends EventTarget {
    currentTime: CSSNumberish | null;
    effect: AnimationEffect | null;
    readonly finished: Promise<Animation>;
    id: string;
    oncancel: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null;
    onfinish: ((this: Animation, ev: AnimationPlaybackEvent) => any) | null;
    onremove: ((this: Animation, ev: Event) => any) | null;
    readonly pending: boolean;
    readonly playState: AnimationPlayState;
    playbackRate: number;
    readonly ready: Promise<Animation>;
    readonly replaceState: AnimationReplaceState;
    startTime: CSSNumberish | null;
    timeline: AnimationTimeline | null;
    cancel(): void;
    commitStyles(): void;
    finish(): void;
    pause(): void;
    persist(): void;
    play(): void;
    reverse(): void;
    updatePlaybackRate(playbackRate: number): void;
    addEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: Animation, ev: AnimationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: Animation, ev: AnimationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Animation: {
    prototype: Animation;
    new(effect?: AnimationEffect | null, timeline?: AnimationTimeline | null): Animation;
};

interface AnimationEffect {
    getComputedTiming(): ComputedEffectTiming;
    getTiming(): EffectTiming;
    updateTiming(timing?: OptionalEffectTiming): void;
}

declare var AnimationEffect: {
    prototype: AnimationEffect;
    new(): AnimationEffect;
};

/** Events providing information related to animations. */
interface AnimationEvent extends Event {
    readonly animationName: string;
    readonly elapsedTime: number;
    readonly pseudoElement: string;
}

declare var AnimationEvent: {
    prototype: AnimationEvent;
    new(type: string, animationEventInitDict?: AnimationEventInit): AnimationEvent;
};

interface AnimationFrameProvider {
    cancelAnimationFrame(handle: number): void;
    requestAnimationFrame(callback: FrameRequestCallback): number;
}

interface AnimationPlaybackEvent extends Event {
    readonly currentTime: CSSNumberish | null;
    readonly timelineTime: CSSNumberish | null;
}

declare var AnimationPlaybackEvent: {
    prototype: AnimationPlaybackEvent;
    new(type: string, eventInitDict?: AnimationPlaybackEventInit): AnimationPlaybackEvent;
};

interface AnimationTimeline {
    readonly currentTime: number | null;
}

declare var AnimationTimeline: {
    prototype: AnimationTimeline;
    new(): AnimationTimeline;
};

/** A DOM element's attribute as an object. In most DOM methods, you will probably directly retrieve the attribute as a string (e.g., Element.getAttribute(), but certain functions (e.g., Element.getAttributeNode()) or means of iterating give Attr types. */
interface Attr extends Node {
    readonly localName: string;
    readonly name: string;
    readonly namespaceURI: string | null;
    readonly ownerDocument: Document;
    readonly ownerElement: Element | null;
    readonly prefix: string | null;
    readonly specified: boolean;
    value: string;
}

declare var Attr: {
    prototype: Attr;
    new(): Attr;
};

/** A short audio asset residing in memory, created from an audio file using the AudioContext.decodeAudioData() method, or from raw data using AudioContext.createBuffer(). Once put into an AudioBuffer, the audio can then be played by being passed into an AudioBufferSourceNode. */
interface AudioBuffer {
    readonly duration: number;
    readonly length: number;
    readonly numberOfChannels: number;
    readonly sampleRate: number;
    copyFromChannel(destination: Float32Array, channelNumber: number, bufferOffset?: number): void;
    copyToChannel(source: Float32Array, channelNumber: number, bufferOffset?: number): void;
    getChannelData(channel: number): Float32Array;
}

declare var AudioBuffer: {
    prototype: AudioBuffer;
    new(options: AudioBufferOptions): AudioBuffer;
};

/** An AudioScheduledSourceNode which represents an audio source consisting of in-memory audio data, stored in an AudioBuffer. It's especially useful for playing back audio which has particularly stringent timing accuracy requirements, such as for sounds that must match a specific rhythm and can be kept in memory rather than being played from disk or the network. */
interface AudioBufferSourceNode extends AudioScheduledSourceNode {
    buffer: AudioBuffer | null;
    readonly detune: AudioParam;
    loop: boolean;
    loopEnd: number;
    loopStart: number;
    readonly playbackRate: AudioParam;
    start(when?: number, offset?: number, duration?: number): void;
    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioBufferSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioBufferSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var AudioBufferSourceNode: {
    prototype: AudioBufferSourceNode;
    new(context: BaseAudioContext, options?: AudioBufferSourceOptions): AudioBufferSourceNode;
};

/** An audio-processing graph built from audio modules linked together, each represented by an AudioNode. */
interface AudioContext extends BaseAudioContext {
    readonly baseLatency: number;
    close(): Promise<void>;
    createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
    createMediaStreamDestination(): MediaStreamAudioDestinationNode;
    createMediaStreamSource(mediaStream: MediaStream): MediaStreamAudioSourceNode;
    getOutputTimestamp(): AudioTimestamp;
    resume(): Promise<void>;
    suspend(): Promise<void>;
    addEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: AudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: AudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var AudioContext: {
    prototype: AudioContext;
    new(contextOptions?: AudioContextOptions): AudioContext;
};

/** AudioDestinationNode has no output (as it is the output, no more AudioNode can be linked after it in the audio graph) and one input. The number of channels in the input must be between 0 and the maxChannelCount value or an exception is raised. */
interface AudioDestinationNode extends AudioNode {
    readonly maxChannelCount: number;
}

declare var AudioDestinationNode: {
    prototype: AudioDestinationNode;
    new(): AudioDestinationNode;
};

/** The position and orientation of the unique person listening to the audio scene, and is used in audio spatialization. All PannerNodes spatialize in relation to the AudioListener stored in the BaseAudioContext.listener attribute. */
interface AudioListener {
    readonly forwardX: AudioParam;
    readonly forwardY: AudioParam;
    readonly forwardZ: AudioParam;
    readonly positionX: AudioParam;
    readonly positionY: AudioParam;
    readonly positionZ: AudioParam;
    readonly upX: AudioParam;
    readonly upY: AudioParam;
    readonly upZ: AudioParam;
    /** @deprecated */
    setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;
    /** @deprecated */
    setPosition(x: number, y: number, z: number): void;
}

declare var AudioListener: {
    prototype: AudioListener;
    new(): AudioListener;
};

/** A generic interface for representing an audio processing module. Examples include: */
interface AudioNode extends EventTarget {
    channelCount: number;
    channelCountMode: ChannelCountMode;
    channelInterpretation: ChannelInterpretation;
    readonly context: BaseAudioContext;
    readonly numberOfInputs: number;
    readonly numberOfOutputs: number;
    connect(destinationNode: AudioNode, output?: number, input?: number): AudioNode;
    connect(destinationParam: AudioParam, output?: number): void;
    disconnect(): void;
    disconnect(output: number): void;
    disconnect(destinationNode: AudioNode): void;
    disconnect(destinationNode: AudioNode, output: number): void;
    disconnect(destinationNode: AudioNode, output: number, input: number): void;
    disconnect(destinationParam: AudioParam): void;
    disconnect(destinationParam: AudioParam, output: number): void;
}

declare var AudioNode: {
    prototype: AudioNode;
    new(): AudioNode;
};

/** The Web Audio API's AudioParam interface represents an audio-related parameter, usually a parameter of an AudioNode (such as GainNode.gain). */
interface AudioParam {
    automationRate: AutomationRate;
    readonly defaultValue: number;
    readonly maxValue: number;
    readonly minValue: number;
    value: number;
    cancelAndHoldAtTime(cancelTime: number): AudioParam;
    cancelScheduledValues(cancelTime: number): AudioParam;
    exponentialRampToValueAtTime(value: number, endTime: number): AudioParam;
    linearRampToValueAtTime(value: number, endTime: number): AudioParam;
    setTargetAtTime(target: number, startTime: number, timeConstant: number): AudioParam;
    setValueAtTime(value: number, startTime: number): AudioParam;
    setValueCurveAtTime(values: number[] | Float32Array, startTime: number, duration: number): AudioParam;
}

declare var AudioParam: {
    prototype: AudioParam;
    new(): AudioParam;
};

interface AudioParamMap {
    forEach(callbackfn: (value: AudioParam, key: string, parent: AudioParamMap) => void, thisArg?: any): void;
}

declare var AudioParamMap: {
    prototype: AudioParamMap;
    new(): AudioParamMap;
};

/**
 * The Web Audio API events that occur when a ScriptProcessorNode input buffer is ready to be processed.
 * @deprecated As of the August 29 2014 Web Audio API spec publication, this feature has been marked as deprecated, and is soon to be replaced by AudioWorklet.
 */
interface AudioProcessingEvent extends Event {
    /** @deprecated */
    readonly inputBuffer: AudioBuffer;
    /** @deprecated */
    readonly outputBuffer: AudioBuffer;
    /** @deprecated */
    readonly playbackTime: number;
}

/** @deprecated */
declare var AudioProcessingEvent: {
    prototype: AudioProcessingEvent;
    new(type: string, eventInitDict: AudioProcessingEventInit): AudioProcessingEvent;
};

interface AudioScheduledSourceNodeEventMap {
    "ended": Event;
}

interface AudioScheduledSourceNode extends AudioNode {
    onended: ((this: AudioScheduledSourceNode, ev: Event) => any) | null;
    start(when?: number): void;
    stop(when?: number): void;
    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioScheduledSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: AudioScheduledSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var AudioScheduledSourceNode: {
    prototype: AudioScheduledSourceNode;
    new(): AudioScheduledSourceNode;
};

/** Available only in secure contexts. */
interface AudioWorklet extends Worklet {
}

declare var AudioWorklet: {
    prototype: AudioWorklet;
    new(): AudioWorklet;
};

interface AudioWorkletNodeEventMap {
    "processorerror": Event;
}

/** Available only in secure contexts. */
interface AudioWorkletNode extends AudioNode {
    onprocessorerror: ((this: AudioWorkletNode, ev: Event) => any) | null;
    readonly parameters: AudioParamMap;
    readonly port: MessagePort;
    addEventListener<K extends keyof AudioWorkletNodeEventMap>(type: K, listener: (this: AudioWorkletNode, ev: AudioWorkletNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AudioWorkletNodeEventMap>(type: K, listener: (this: AudioWorkletNode, ev: AudioWorkletNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var AudioWorkletNode: {
    prototype: AudioWorkletNode;
    new(context: BaseAudioContext, name: string, options?: AudioWorkletNodeOptions): AudioWorkletNode;
};

/** Available only in secure contexts. */
interface AuthenticatorAssertionResponse extends AuthenticatorResponse {
    readonly authenticatorData: ArrayBuffer;
    readonly signature: ArrayBuffer;
    readonly userHandle: ArrayBuffer | null;
}

declare var AuthenticatorAssertionResponse: {
    prototype: AuthenticatorAssertionResponse;
    new(): AuthenticatorAssertionResponse;
};

/** Available only in secure contexts. */
interface AuthenticatorAttestationResponse extends AuthenticatorResponse {
    readonly attestationObject: ArrayBuffer;
}

declare var AuthenticatorAttestationResponse: {
    prototype: AuthenticatorAttestationResponse;
    new(): AuthenticatorAttestationResponse;
};

/** Available only in secure contexts. */
interface AuthenticatorResponse {
    readonly clientDataJSON: ArrayBuffer;
}

declare var AuthenticatorResponse: {
    prototype: AuthenticatorResponse;
    new(): AuthenticatorResponse;
};

interface BarProp {
    readonly visible: boolean;
}

declare var BarProp: {
    prototype: BarProp;
    new(): BarProp;
};

interface BaseAudioContextEventMap {
    "statechange": Event;
}

interface BaseAudioContext extends EventTarget {
    /** Available only in secure contexts. */
    readonly audioWorklet: AudioWorklet;
    readonly currentTime: number;
    readonly destination: AudioDestinationNode;
    readonly listener: AudioListener;
    onstatechange: ((this: BaseAudioContext, ev: Event) => any) | null;
    readonly sampleRate: number;
    readonly state: AudioContextState;
    createAnalyser(): AnalyserNode;
    createBiquadFilter(): BiquadFilterNode;
    createBuffer(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;
    createBufferSource(): AudioBufferSourceNode;
    createChannelMerger(numberOfInputs?: number): ChannelMergerNode;
    createChannelSplitter(numberOfOutputs?: number): ChannelSplitterNode;
    createConstantSource(): ConstantSourceNode;
    createConvolver(): ConvolverNode;
    createDelay(maxDelayTime?: number): DelayNode;
    createDynamicsCompressor(): DynamicsCompressorNode;
    createGain(): GainNode;
    createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode;
    createOscillator(): OscillatorNode;
    createPanner(): PannerNode;
    createPeriodicWave(real: number[] | Float32Array, imag: number[] | Float32Array, constraints?: PeriodicWaveConstraints): PeriodicWave;
    /** @deprecated */
    createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
    createStereoPanner(): StereoPannerNode;
    createWaveShaper(): WaveShaperNode;
    decodeAudioData(audioData: ArrayBuffer, successCallback?: DecodeSuccessCallback | null, errorCallback?: DecodeErrorCallback | null): Promise<AudioBuffer>;
    addEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: BaseAudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof BaseAudioContextEventMap>(type: K, listener: (this: BaseAudioContext, ev: BaseAudioContextEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var BaseAudioContext: {
    prototype: BaseAudioContext;
    new(): BaseAudioContext;
};

/** The beforeunload event is fired when the window, the document and its resources are about to be unloaded. */
interface BeforeUnloadEvent extends Event {
    returnValue: any;
}

declare var BeforeUnloadEvent: {
    prototype: BeforeUnloadEvent;
    new(): BeforeUnloadEvent;
};

/** A simple low-order filter, and is created using the AudioContext.createBiquadFilter() method. It is an AudioNode that can represent different kinds of filters, tone control devices, and graphic equalizers. */
interface BiquadFilterNode extends AudioNode {
    readonly Q: AudioParam;
    readonly detune: AudioParam;
    readonly frequency: AudioParam;
    readonly gain: AudioParam;
    type: BiquadFilterType;
    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
}

declare var BiquadFilterNode: {
    prototype: BiquadFilterNode;
    new(context: BaseAudioContext, options?: BiquadFilterOptions): BiquadFilterNode;
};

/** A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. */
interface Blob {
    readonly size: number;
    readonly type: string;
    arrayBuffer(): Promise<ArrayBuffer>;
    slice(start?: number, end?: number, contentType?: string): Blob;
    stream(): ReadableStream;
    text(): Promise<string>;
}

declare var Blob: {
    prototype: Blob;
    new(blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
};

interface BlobEvent extends Event {
    readonly data: Blob;
    readonly timecode: DOMHighResTimeStamp;
}

declare var BlobEvent: {
    prototype: BlobEvent;
    new(type: string, eventInitDict: BlobEventInit): BlobEvent;
};

interface Body {
    readonly body: ReadableStream<Uint8Array> | null;
    readonly bodyUsed: boolean;
    arrayBuffer(): Promise<ArrayBuffer>;
    blob(): Promise<Blob>;
    formData(): Promise<FormData>;
    json(): Promise<any>;
    text(): Promise<string>;
}

interface BroadcastChannelEventMap {
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

interface BroadcastChannel extends EventTarget {
    /** Returns the channel name (as passed to the constructor). */
    readonly name: string;
    onmessage: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
    /** Closes the BroadcastChannel object, opening it up to garbage collection. */
    close(): void;
    /** Sends the given message to other BroadcastChannel objects set up for this channel. Messages can be structured objects, e.g. nested objects and arrays. */
    postMessage(message: any): void;
    addEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var BroadcastChannel: {
    prototype: BroadcastChannel;
    new(name: string): BroadcastChannel;
};

/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
interface ByteLengthQueuingStrategy extends QueuingStrategy<ArrayBufferView> {
    readonly highWaterMark: number;
    readonly size: QueuingStrategySize<ArrayBufferView>;
}

declare var ByteLengthQueuingStrategy: {
    prototype: ByteLengthQueuingStrategy;
    new(init: QueuingStrategyInit): ByteLengthQueuingStrategy;
};

/** A CDATA section that can be used within XML to include extended portions of unescaped text. The symbols < and & don\u2019t need escaping as they normally do when inside a CDATA section. */
interface CDATASection extends Text {
}

declare var CDATASection: {
    prototype: CDATASection;
    new(): CDATASection;
};

interface CSSAnimation extends Animation {
    readonly animationName: string;
    addEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSAnimation, ev: AnimationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSAnimation, ev: AnimationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var CSSAnimation: {
    prototype: CSSAnimation;
    new(): CSSAnimation;
};

/** A single condition CSS at-rule, which consists of a condition and a statement block. It is a child of CSSGroupingRule. */
interface CSSConditionRule extends CSSGroupingRule {
    conditionText: string;
}

declare var CSSConditionRule: {
    prototype: CSSConditionRule;
    new(): CSSConditionRule;
};

interface CSSCounterStyleRule extends CSSRule {
    additiveSymbols: string;
    fallback: string;
    name: string;
    negative: string;
    pad: string;
    prefix: string;
    range: string;
    speakAs: string;
    suffix: string;
    symbols: string;
    system: string;
}

declare var CSSCounterStyleRule: {
    prototype: CSSCounterStyleRule;
    new(): CSSCounterStyleRule;
};

interface CSSFontFaceRule extends CSSRule {
    readonly style: CSSStyleDeclaration;
}

declare var CSSFontFaceRule: {
    prototype: CSSFontFaceRule;
    new(): CSSFontFaceRule;
};

/** Any CSS at-rule that contains other rules nested within it. */
interface CSSGroupingRule extends CSSRule {
    readonly cssRules: CSSRuleList;
    deleteRule(index: number): void;
    insertRule(rule: string, index?: number): number;
}

declare var CSSGroupingRule: {
    prototype: CSSGroupingRule;
    new(): CSSGroupingRule;
};

interface CSSImportRule extends CSSRule {
    readonly href: string;
    readonly media: MediaList;
    readonly styleSheet: CSSStyleSheet;
}

declare var CSSImportRule: {
    prototype: CSSImportRule;
    new(): CSSImportRule;
};

/** An object representing a set of style for a given keyframe. It corresponds to the contains of a single keyframe of a @keyframes at-rule. It implements the CSSRule interface with a type value of 8 (CSSRule.KEYFRAME_RULE). */
interface CSSKeyframeRule extends CSSRule {
    keyText: string;
    readonly style: CSSStyleDeclaration;
}

declare var CSSKeyframeRule: {
    prototype: CSSKeyframeRule;
    new(): CSSKeyframeRule;
};

/** An object representing a complete set of keyframes for a CSS animation. It corresponds to the contains of a whole @keyframes at-rule. It implements the CSSRule interface with a type value of 7 (CSSRule.KEYFRAMES_RULE). */
interface CSSKeyframesRule extends CSSRule {
    readonly cssRules: CSSRuleList;
    name: string;
    appendRule(rule: string): void;
    deleteRule(select: string): void;
    findRule(select: string): CSSKeyframeRule | null;
}

declare var CSSKeyframesRule: {
    prototype: CSSKeyframesRule;
    new(): CSSKeyframesRule;
};

/** A single CSS @media rule. It implements the CSSConditionRule interface, and therefore the CSSGroupingRule and the CSSRule interface with a type value of 4 (CSSRule.MEDIA_RULE). */
interface CSSMediaRule extends CSSConditionRule {
    readonly media: MediaList;
}

declare var CSSMediaRule: {
    prototype: CSSMediaRule;
    new(): CSSMediaRule;
};

/** An object representing a single CSS @namespace at-rule. It implements the CSSRule interface, with a type value of 10 (CSSRule.NAMESPACE_RULE). */
interface CSSNamespaceRule extends CSSRule {
    readonly namespaceURI: string;
    readonly prefix: string;
}

declare var CSSNamespaceRule: {
    prototype: CSSNamespaceRule;
    new(): CSSNamespaceRule;
};

/** CSSPageRule is an interface representing a single CSS @page rule. It implements the CSSRule interface with a type value of 6 (CSSRule.PAGE_RULE). */
interface CSSPageRule extends CSSGroupingRule {
    selectorText: string;
    readonly style: CSSStyleDeclaration;
}

declare var CSSPageRule: {
    prototype: CSSPageRule;
    new(): CSSPageRule;
};

/** A single CSS rule. There are several types of rules, listed in the Type constants section below. */
interface CSSRule {
    cssText: string;
    readonly parentRule: CSSRule | null;
    readonly parentStyleSheet: CSSStyleSheet | null;
    /** @deprecated */
    readonly type: number;
    readonly CHARSET_RULE: number;
    readonly FONT_FACE_RULE: number;
    readonly IMPORT_RULE: number;
    readonly KEYFRAMES_RULE: number;
    readonly KEYFRAME_RULE: number;
    readonly MEDIA_RULE: number;
    readonly NAMESPACE_RULE: number;
    readonly PAGE_RULE: number;
    readonly STYLE_RULE: number;
    readonly SUPPORTS_RULE: number;
}

declare var CSSRule: {
    prototype: CSSRule;
    new(): CSSRule;
    readonly CHARSET_RULE: number;
    readonly FONT_FACE_RULE: number;
    readonly IMPORT_RULE: number;
    readonly KEYFRAMES_RULE: number;
    readonly KEYFRAME_RULE: number;
    readonly MEDIA_RULE: number;
    readonly NAMESPACE_RULE: number;
    readonly PAGE_RULE: number;
    readonly STYLE_RULE: number;
    readonly SUPPORTS_RULE: number;
};

/** A CSSRuleList is an (indirect-modify only) array-like object containing an ordered collection of CSSRule objects. */
interface CSSRuleList {
    readonly length: number;
    item(index: number): CSSRule | null;
    [index: number]: CSSRule;
}

declare var CSSRuleList: {
    prototype: CSSRuleList;
    new(): CSSRuleList;
};

/** An object that is a CSS declaration block, and exposes style information and various style-related methods and properties. */
interface CSSStyleDeclaration {
    accentColor: string;
    alignContent: string;
    alignItems: string;
    alignSelf: string;
    alignmentBaseline: string;
    all: string;
    animation: string;
    animationDelay: string;
    animationDirection: string;
    animationDuration: string;
    animationFillMode: string;
    animationIterationCount: string;
    animationName: string;
    animationPlayState: string;
    animationTimingFunction: string;
    appearance: string;
    aspectRatio: string;
    backfaceVisibility: string;
    background: string;
    backgroundAttachment: string;
    backgroundBlendMode: string;
    backgroundClip: string;
    backgroundColor: string;
    backgroundImage: string;
    backgroundOrigin: string;
    backgroundPosition: string;
    backgroundPositionX: string;
    backgroundPositionY: string;
    backgroundRepeat: string;
    backgroundSize: string;
    baselineShift: string;
    blockSize: string;
    border: string;
    borderBlock: string;
    borderBlockColor: string;
    borderBlockEnd: string;
    borderBlockEndColor: string;
    borderBlockEndStyle: string;
    borderBlockEndWidth: string;
    borderBlockStart: string;
    borderBlockStartColor: string;
    borderBlockStartStyle: string;
    borderBlockStartWidth: string;
    borderBlockStyle: string;
    borderBlockWidth: string;
    borderBottom: string;
    borderBottomColor: string;
    borderBottomLeftRadius: string;
    borderBottomRightRadius: string;
    borderBottomStyle: string;
    borderBottomWidth: string;
    borderCollapse: string;
    borderColor: string;
    borderEndEndRadius: string;
    borderEndStartRadius: string;
    borderImage: string;
    borderImageOutset: string;
    borderImageRepeat: string;
    borderImageSlice: string;
    borderImageSource: string;
    borderImageWidth: string;
    borderInline: string;
    borderInlineColor: string;
    borderInlineEnd: string;
    borderInlineEndColor: string;
    borderInlineEndStyle: string;
    borderInlineEndWidth: string;
    borderInlineStart: string;
    borderInlineStartColor: string;
    borderInlineStartStyle: string;
    borderInlineStartWidth: string;
    borderInlineStyle: string;
    borderInlineWidth: string;
    borderLeft: string;
    borderLeftColor: string;
    borderLeftStyle: string;
    borderLeftWidth: string;
    borderRadius: string;
    borderRight: string;
    borderRightColor: string;
    borderRightStyle: string;
    borderRightWidth: string;
    borderSpacing: string;
    borderStartEndRadius: string;
    borderStartStartRadius: string;
    borderStyle: string;
    borderTop: string;
    borderTopColor: string;
    borderTopLeftRadius: string;
    borderTopRightRadius: string;
    borderTopStyle: string;
    borderTopWidth: string;
    borderWidth: string;
    bottom: string;
    boxShadow: string;
    boxSizing: string;
    breakAfter: string;
    breakBefore: string;
    breakInside: string;
    captionSide: string;
    caretColor: string;
    clear: string;
    /** @deprecated */
    clip: string;
    clipPath: string;
    clipRule: string;
    color: string;
    colorInterpolation: string;
    colorInterpolationFilters: string;
    colorScheme: string;
    columnCount: string;
    columnFill: string;
    columnGap: string;
    columnRule: string;
    columnRuleColor: string;
    columnRuleStyle: string;
    columnRuleWidth: string;
    columnSpan: string;
    columnWidth: string;
    columns: string;
    contain: string;
    content: string;
    counterIncrement: string;
    counterReset: string;
    counterSet: string;
    cssFloat: string;
    cssText: string;
    cursor: string;
    direction: string;
    display: string;
    dominantBaseline: string;
    emptyCells: string;
    fill: string;
    fillOpacity: string;
    fillRule: string;
    filter: string;
    flex: string;
    flexBasis: string;
    flexDirection: string;
    flexFlow: string;
    flexGrow: string;
    flexShrink: string;
    flexWrap: string;
    float: string;
    floodColor: string;
    floodOpacity: string;
    font: string;
    fontFamily: string;
    fontFeatureSettings: string;
    fontKerning: string;
    fontOpticalSizing: string;
    fontSize: string;
    fontSizeAdjust: string;
    fontStretch: string;
    fontStyle: string;
    fontSynthesis: string;
    fontVariant: string;
    /** @deprecated */
    fontVariantAlternates: string;
    fontVariantCaps: string;
    fontVariantEastAsian: string;
    fontVariantLigatures: string;
    fontVariantNumeric: string;
    fontVariantPosition: string;
    fontVariationSettings: string;
    fontWeight: string;
    gap: string;
    grid: string;
    gridArea: string;
    gridAutoColumns: string;
    gridAutoFlow: string;
    gridAutoRows: string;
    gridColumn: string;
    gridColumnEnd: string;
    /** @deprecated This is a legacy alias of \`columnGap\`. */
    gridColumnGap: string;
    gridColumnStart: string;
    /** @deprecated This is a legacy alias of \`gap\`. */
    gridGap: string;
    gridRow: string;
    gridRowEnd: string;
    /** @deprecated This is a legacy alias of \`rowGap\`. */
    gridRowGap: string;
    gridRowStart: string;
    gridTemplate: string;
    gridTemplateAreas: string;
    gridTemplateColumns: string;
    gridTemplateRows: string;
    height: string;
    hyphens: string;
    /** @deprecated */
    imageOrientation: string;
    imageRendering: string;
    inlineSize: string;
    inset: string;
    insetBlock: string;
    insetBlockEnd: string;
    insetBlockStart: string;
    insetInline: string;
    insetInlineEnd: string;
    insetInlineStart: string;
    isolation: string;
    justifyContent: string;
    justifyItems: string;
    justifySelf: string;
    left: string;
    readonly length: number;
    letterSpacing: string;
    lightingColor: string;
    lineBreak: string;
    lineHeight: string;
    listStyle: string;
    listStyleImage: string;
    listStylePosition: string;
    listStyleType: string;
    margin: string;
    marginBlock: string;
    marginBlockEnd: string;
    marginBlockStart: string;
    marginBottom: string;
    marginInline: string;
    marginInlineEnd: string;
    marginInlineStart: string;
    marginLeft: string;
    marginRight: string;
    marginTop: string;
    marker: string;
    markerEnd: string;
    markerMid: string;
    markerStart: string;
    mask: string;
    maskType: string;
    maxBlockSize: string;
    maxHeight: string;
    maxInlineSize: string;
    maxWidth: string;
    minBlockSize: string;
    minHeight: string;
    minInlineSize: string;
    minWidth: string;
    mixBlendMode: string;
    objectFit: string;
    objectPosition: string;
    offset: string;
    offsetAnchor: string;
    offsetDistance: string;
    offsetPath: string;
    offsetRotate: string;
    opacity: string;
    order: string;
    orphans: string;
    outline: string;
    outlineColor: string;
    outlineOffset: string;
    outlineStyle: string;
    outlineWidth: string;
    overflow: string;
    overflowAnchor: string;
    overflowWrap: string;
    overflowX: string;
    overflowY: string;
    overscrollBehavior: string;
    overscrollBehaviorBlock: string;
    overscrollBehaviorInline: string;
    overscrollBehaviorX: string;
    overscrollBehaviorY: string;
    padding: string;
    paddingBlock: string;
    paddingBlockEnd: string;
    paddingBlockStart: string;
    paddingBottom: string;
    paddingInline: string;
    paddingInlineEnd: string;
    paddingInlineStart: string;
    paddingLeft: string;
    paddingRight: string;
    paddingTop: string;
    pageBreakAfter: string;
    pageBreakBefore: string;
    pageBreakInside: string;
    paintOrder: string;
    readonly parentRule: CSSRule | null;
    perspective: string;
    perspectiveOrigin: string;
    placeContent: string;
    placeItems: string;
    placeSelf: string;
    pointerEvents: string;
    position: string;
    quotes: string;
    resize: string;
    right: string;
    rotate: string;
    rowGap: string;
    rubyPosition: string;
    scale: string;
    scrollBehavior: string;
    scrollMargin: string;
    scrollMarginBlock: string;
    scrollMarginBlockEnd: string;
    scrollMarginBlockStart: string;
    scrollMarginBottom: string;
    scrollMarginInline: string;
    scrollMarginInlineEnd: string;
    scrollMarginInlineStart: string;
    scrollMarginLeft: string;
    scrollMarginRight: string;
    scrollMarginTop: string;
    scrollPadding: string;
    scrollPaddingBlock: string;
    scrollPaddingBlockEnd: string;
    scrollPaddingBlockStart: string;
    scrollPaddingBottom: string;
    scrollPaddingInline: string;
    scrollPaddingInlineEnd: string;
    scrollPaddingInlineStart: string;
    scrollPaddingLeft: string;
    scrollPaddingRight: string;
    scrollPaddingTop: string;
    scrollSnapAlign: string;
    scrollSnapStop: string;
    scrollSnapType: string;
    shapeImageThreshold: string;
    shapeMargin: string;
    shapeOutside: string;
    shapeRendering: string;
    stopColor: string;
    stopOpacity: string;
    stroke: string;
    strokeDasharray: string;
    strokeDashoffset: string;
    strokeLinecap: string;
    strokeLinejoin: string;
    strokeMiterlimit: string;
    strokeOpacity: string;
    strokeWidth: string;
    tabSize: string;
    tableLayout: string;
    textAlign: string;
    textAlignLast: string;
    textAnchor: string;
    textCombineUpright: string;
    textDecoration: string;
    textDecorationColor: string;
    textDecorationLine: string;
    textDecorationSkipInk: string;
    textDecorationStyle: string;
    textDecorationThickness: string;
    textEmphasis: string;
    textEmphasisColor: string;
    textEmphasisPosition: string;
    textEmphasisStyle: string;
    textIndent: string;
    textOrientation: string;
    textOverflow: string;
    textRendering: string;
    textShadow: string;
    textTransform: string;
    textUnderlineOffset: string;
    textUnderlinePosition: string;
    top: string;
    touchAction: string;
    transform: string;
    transformBox: string;
    transformOrigin: string;
    transformStyle: string;
    transition: string;
    transitionDelay: string;
    transitionDuration: string;
    transitionProperty: string;
    transitionTimingFunction: string;
    translate: string;
    unicodeBidi: string;
    userSelect: string;
    verticalAlign: string;
    visibility: string;
    /** @deprecated This is a legacy alias of \`alignContent\`. */
    webkitAlignContent: string;
    /** @deprecated This is a legacy alias of \`alignItems\`. */
    webkitAlignItems: string;
    /** @deprecated This is a legacy alias of \`alignSelf\`. */
    webkitAlignSelf: string;
    /** @deprecated This is a legacy alias of \`animation\`. */
    webkitAnimation: string;
    /** @deprecated This is a legacy alias of \`animationDelay\`. */
    webkitAnimationDelay: string;
    /** @deprecated This is a legacy alias of \`animationDirection\`. */
    webkitAnimationDirection: string;
    /** @deprecated This is a legacy alias of \`animationDuration\`. */
    webkitAnimationDuration: string;
    /** @deprecated This is a legacy alias of \`animationFillMode\`. */
    webkitAnimationFillMode: string;
    /** @deprecated This is a legacy alias of \`animationIterationCount\`. */
    webkitAnimationIterationCount: string;
    /** @deprecated This is a legacy alias of \`animationName\`. */
    webkitAnimationName: string;
    /** @deprecated This is a legacy alias of \`animationPlayState\`. */
    webkitAnimationPlayState: string;
    /** @deprecated This is a legacy alias of \`animationTimingFunction\`. */
    webkitAnimationTimingFunction: string;
    /** @deprecated This is a legacy alias of \`appearance\`. */
    webkitAppearance: string;
    /** @deprecated This is a legacy alias of \`backfaceVisibility\`. */
    webkitBackfaceVisibility: string;
    /** @deprecated This is a legacy alias of \`backgroundClip\`. */
    webkitBackgroundClip: string;
    /** @deprecated This is a legacy alias of \`backgroundOrigin\`. */
    webkitBackgroundOrigin: string;
    /** @deprecated This is a legacy alias of \`backgroundSize\`. */
    webkitBackgroundSize: string;
    /** @deprecated This is a legacy alias of \`borderBottomLeftRadius\`. */
    webkitBorderBottomLeftRadius: string;
    /** @deprecated This is a legacy alias of \`borderBottomRightRadius\`. */
    webkitBorderBottomRightRadius: string;
    /** @deprecated This is a legacy alias of \`borderRadius\`. */
    webkitBorderRadius: string;
    /** @deprecated This is a legacy alias of \`borderTopLeftRadius\`. */
    webkitBorderTopLeftRadius: string;
    /** @deprecated This is a legacy alias of \`borderTopRightRadius\`. */
    webkitBorderTopRightRadius: string;
    /** @deprecated This is a legacy alias of \`boxAlign\`. */
    webkitBoxAlign: string;
    /** @deprecated This is a legacy alias of \`boxFlex\`. */
    webkitBoxFlex: string;
    /** @deprecated This is a legacy alias of \`boxOrdinalGroup\`. */
    webkitBoxOrdinalGroup: string;
    /** @deprecated This is a legacy alias of \`boxOrient\`. */
    webkitBoxOrient: string;
    /** @deprecated This is a legacy alias of \`boxPack\`. */
    webkitBoxPack: string;
    /** @deprecated This is a legacy alias of \`boxShadow\`. */
    webkitBoxShadow: string;
    /** @deprecated This is a legacy alias of \`boxSizing\`. */
    webkitBoxSizing: string;
    /** @deprecated This is a legacy alias of \`filter\`. */
    webkitFilter: string;
    /** @deprecated This is a legacy alias of \`flex\`. */
    webkitFlex: string;
    /** @deprecated This is a legacy alias of \`flexBasis\`. */
    webkitFlexBasis: string;
    /** @deprecated This is a legacy alias of \`flexDirection\`. */
    webkitFlexDirection: string;
    /** @deprecated This is a legacy alias of \`flexFlow\`. */
    webkitFlexFlow: string;
    /** @deprecated This is a legacy alias of \`flexGrow\`. */
    webkitFlexGrow: string;
    /** @deprecated This is a legacy alias of \`flexShrink\`. */
    webkitFlexShrink: string;
    /** @deprecated This is a legacy alias of \`flexWrap\`. */
    webkitFlexWrap: string;
    /** @deprecated This is a legacy alias of \`justifyContent\`. */
    webkitJustifyContent: string;
    webkitLineClamp: string;
    /** @deprecated This is a legacy alias of \`mask\`. */
    webkitMask: string;
    /** @deprecated This is a legacy alias of \`maskBorder\`. */
    webkitMaskBoxImage: string;
    /** @deprecated This is a legacy alias of \`maskBorderOutset\`. */
    webkitMaskBoxImageOutset: string;
    /** @deprecated This is a legacy alias of \`maskBorderRepeat\`. */
    webkitMaskBoxImageRepeat: string;
    /** @deprecated This is a legacy alias of \`maskBorderSlice\`. */
    webkitMaskBoxImageSlice: string;
    /** @deprecated This is a legacy alias of \`maskBorderSource\`. */
    webkitMaskBoxImageSource: string;
    /** @deprecated This is a legacy alias of \`maskBorderWidth\`. */
    webkitMaskBoxImageWidth: string;
    /** @deprecated This is a legacy alias of \`maskClip\`. */
    webkitMaskClip: string;
    webkitMaskComposite: string;
    /** @deprecated This is a legacy alias of \`maskImage\`. */
    webkitMaskImage: string;
    /** @deprecated This is a legacy alias of \`maskOrigin\`. */
    webkitMaskOrigin: string;
    /** @deprecated This is a legacy alias of \`maskPosition\`. */
    webkitMaskPosition: string;
    /** @deprecated This is a legacy alias of \`maskRepeat\`. */
    webkitMaskRepeat: string;
    /** @deprecated This is a legacy alias of \`maskSize\`. */
    webkitMaskSize: string;
    /** @deprecated This is a legacy alias of \`order\`. */
    webkitOrder: string;
    /** @deprecated This is a legacy alias of \`perspective\`. */
    webkitPerspective: string;
    /** @deprecated This is a legacy alias of \`perspectiveOrigin\`. */
    webkitPerspectiveOrigin: string;
    webkitTextFillColor: string;
    webkitTextStroke: string;
    webkitTextStrokeColor: string;
    webkitTextStrokeWidth: string;
    /** @deprecated This is a legacy alias of \`transform\`. */
    webkitTransform: string;
    /** @deprecated This is a legacy alias of \`transformOrigin\`. */
    webkitTransformOrigin: string;
    /** @deprecated This is a legacy alias of \`transformStyle\`. */
    webkitTransformStyle: string;
    /** @deprecated This is a legacy alias of \`transition\`. */
    webkitTransition: string;
    /** @deprecated This is a legacy alias of \`transitionDelay\`. */
    webkitTransitionDelay: string;
    /** @deprecated This is a legacy alias of \`transitionDuration\`. */
    webkitTransitionDuration: string;
    /** @deprecated This is a legacy alias of \`transitionProperty\`. */
    webkitTransitionProperty: string;
    /** @deprecated This is a legacy alias of \`transitionTimingFunction\`. */
    webkitTransitionTimingFunction: string;
    /** @deprecated This is a legacy alias of \`userSelect\`. */
    webkitUserSelect: string;
    whiteSpace: string;
    widows: string;
    width: string;
    willChange: string;
    wordBreak: string;
    wordSpacing: string;
    /** @deprecated */
    wordWrap: string;
    writingMode: string;
    zIndex: string;
    getPropertyPriority(property: string): string;
    getPropertyValue(property: string): string;
    item(index: number): string;
    removeProperty(property: string): string;
    setProperty(property: string, value: string | null, priority?: string): void;
    [index: number]: string;
}

declare var CSSStyleDeclaration: {
    prototype: CSSStyleDeclaration;
    new(): CSSStyleDeclaration;
};

/** CSSStyleRule represents a single CSS style rule. It implements the CSSRule interface with a type value of 1 (CSSRule.STYLE_RULE). */
interface CSSStyleRule extends CSSRule {
    selectorText: string;
    readonly style: CSSStyleDeclaration;
}

declare var CSSStyleRule: {
    prototype: CSSStyleRule;
    new(): CSSStyleRule;
};

/** A single CSS style sheet. It inherits properties and methods from its parent, StyleSheet. */
interface CSSStyleSheet extends StyleSheet {
    readonly cssRules: CSSRuleList;
    readonly ownerRule: CSSRule | null;
    /** @deprecated */
    readonly rules: CSSRuleList;
    /** @deprecated */
    addRule(selector?: string, style?: string, index?: number): number;
    deleteRule(index: number): void;
    insertRule(rule: string, index?: number): number;
    /** @deprecated */
    removeRule(index?: number): void;
}

declare var CSSStyleSheet: {
    prototype: CSSStyleSheet;
    new(options?: CSSStyleSheetInit): CSSStyleSheet;
};

/** An object representing a single CSS @supports at-rule. It implements the CSSConditionRule interface, and therefore the CSSRule and CSSGroupingRule interfaces with a type value of 12 (CSSRule.SUPPORTS_RULE). */
interface CSSSupportsRule extends CSSConditionRule {
}

declare var CSSSupportsRule: {
    prototype: CSSSupportsRule;
    new(): CSSSupportsRule;
};

interface CSSTransition extends Animation {
    readonly transitionProperty: string;
    addEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSTransition, ev: AnimationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AnimationEventMap>(type: K, listener: (this: CSSTransition, ev: AnimationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var CSSTransition: {
    prototype: CSSTransition;
    new(): CSSTransition;
};

/**
 * Provides a storage mechanism for Request / Response object pairs that are cached, for example as part of the ServiceWorker life cycle. Note that the Cache interface is exposed to windowed scopes as well as workers. You don't have to use it in conjunction with service workers, even though it is defined in the service worker spec.
 * Available only in secure contexts.
 */
interface Cache {
    add(request: RequestInfo): Promise<void>;
    addAll(requests: RequestInfo[]): Promise<void>;
    delete(request: RequestInfo, options?: CacheQueryOptions): Promise<boolean>;
    keys(request?: RequestInfo, options?: CacheQueryOptions): Promise<ReadonlyArray<Request>>;
    match(request: RequestInfo, options?: CacheQueryOptions): Promise<Response | undefined>;
    matchAll(request?: RequestInfo, options?: CacheQueryOptions): Promise<ReadonlyArray<Response>>;
    put(request: RequestInfo, response: Response): Promise<void>;
}

declare var Cache: {
    prototype: Cache;
    new(): Cache;
};

/**
 * The storage for Cache objects.
 * Available only in secure contexts.
 */
interface CacheStorage {
    delete(cacheName: string): Promise<boolean>;
    has(cacheName: string): Promise<boolean>;
    keys(): Promise<string[]>;
    match(request: RequestInfo, options?: MultiCacheQueryOptions): Promise<Response | undefined>;
    open(cacheName: string): Promise<Cache>;
}

declare var CacheStorage: {
    prototype: CacheStorage;
    new(): CacheStorage;
};

interface CanvasCompositing {
    globalAlpha: number;
    globalCompositeOperation: string;
}

interface CanvasDrawImage {
    drawImage(image: CanvasImageSource, dx: number, dy: number): void;
    drawImage(image: CanvasImageSource, dx: number, dy: number, dw: number, dh: number): void;
    drawImage(image: CanvasImageSource, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
}

interface CanvasDrawPath {
    beginPath(): void;
    clip(fillRule?: CanvasFillRule): void;
    clip(path: Path2D, fillRule?: CanvasFillRule): void;
    fill(fillRule?: CanvasFillRule): void;
    fill(path: Path2D, fillRule?: CanvasFillRule): void;
    isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean;
    isPointInPath(path: Path2D, x: number, y: number, fillRule?: CanvasFillRule): boolean;
    isPointInStroke(x: number, y: number): boolean;
    isPointInStroke(path: Path2D, x: number, y: number): boolean;
    stroke(): void;
    stroke(path: Path2D): void;
}

interface CanvasFillStrokeStyles {
    fillStyle: string | CanvasGradient | CanvasPattern;
    strokeStyle: string | CanvasGradient | CanvasPattern;
    createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
    createPattern(image: CanvasImageSource, repetition: string | null): CanvasPattern | null;
    createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
}

interface CanvasFilters {
    filter: string;
}

/** An opaque object describing a gradient. It is returned by the methods CanvasRenderingContext2D.createLinearGradient() or CanvasRenderingContext2D.createRadialGradient(). */
interface CanvasGradient {
    /**
     * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end.
     *
     * Throws an "IndexSizeError" DOMException if the offset is out of range. Throws a "SyntaxError" DOMException if the color cannot be parsed.
     */
    addColorStop(offset: number, color: string): void;
}

declare var CanvasGradient: {
    prototype: CanvasGradient;
    new(): CanvasGradient;
};

interface CanvasImageData {
    createImageData(sw: number, sh: number, settings?: ImageDataSettings): ImageData;
    createImageData(imagedata: ImageData): ImageData;
    getImageData(sx: number, sy: number, sw: number, sh: number, settings?: ImageDataSettings): ImageData;
    putImageData(imagedata: ImageData, dx: number, dy: number): void;
    putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void;
}

interface CanvasImageSmoothing {
    imageSmoothingEnabled: boolean;
    imageSmoothingQuality: ImageSmoothingQuality;
}

interface CanvasPath {
    arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
    arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
    bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
    closePath(): void;
    ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
    lineTo(x: number, y: number): void;
    moveTo(x: number, y: number): void;
    quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
    rect(x: number, y: number, w: number, h: number): void;
}

interface CanvasPathDrawingStyles {
    lineCap: CanvasLineCap;
    lineDashOffset: number;
    lineJoin: CanvasLineJoin;
    lineWidth: number;
    miterLimit: number;
    getLineDash(): number[];
    setLineDash(segments: number[]): void;
}

/** An opaque object describing a pattern, based on an image, a canvas, or a video, created by the CanvasRenderingContext2D.createPattern() method. */
interface CanvasPattern {
    /** Sets the transformation matrix that will be used when rendering the pattern during a fill or stroke painting operation. */
    setTransform(transform?: DOMMatrix2DInit): void;
}

declare var CanvasPattern: {
    prototype: CanvasPattern;
    new(): CanvasPattern;
};

interface CanvasRect {
    clearRect(x: number, y: number, w: number, h: number): void;
    fillRect(x: number, y: number, w: number, h: number): void;
    strokeRect(x: number, y: number, w: number, h: number): void;
}

/** The CanvasRenderingContext2D interface, part of the Canvas API, provides the 2D rendering context for the drawing surface of a <canvas> element. It is used for drawing shapes, text, images, and other objects. */
interface CanvasRenderingContext2D extends CanvasCompositing, CanvasDrawImage, CanvasDrawPath, CanvasFillStrokeStyles, CanvasFilters, CanvasImageData, CanvasImageSmoothing, CanvasPath, CanvasPathDrawingStyles, CanvasRect, CanvasShadowStyles, CanvasState, CanvasText, CanvasTextDrawingStyles, CanvasTransform, CanvasUserInterface {
    readonly canvas: HTMLCanvasElement;
    getContextAttributes(): CanvasRenderingContext2DSettings;
}

declare var CanvasRenderingContext2D: {
    prototype: CanvasRenderingContext2D;
    new(): CanvasRenderingContext2D;
};

interface CanvasShadowStyles {
    shadowBlur: number;
    shadowColor: string;
    shadowOffsetX: number;
    shadowOffsetY: number;
}

interface CanvasState {
    restore(): void;
    save(): void;
}

interface CanvasText {
    fillText(text: string, x: number, y: number, maxWidth?: number): void;
    measureText(text: string): TextMetrics;
    strokeText(text: string, x: number, y: number, maxWidth?: number): void;
}

interface CanvasTextDrawingStyles {
    direction: CanvasDirection;
    font: string;
    textAlign: CanvasTextAlign;
    textBaseline: CanvasTextBaseline;
}

interface CanvasTransform {
    getTransform(): DOMMatrix;
    resetTransform(): void;
    rotate(angle: number): void;
    scale(x: number, y: number): void;
    setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void;
    setTransform(transform?: DOMMatrix2DInit): void;
    transform(a: number, b: number, c: number, d: number, e: number, f: number): void;
    translate(x: number, y: number): void;
}

interface CanvasUserInterface {
    drawFocusIfNeeded(element: Element): void;
    drawFocusIfNeeded(path: Path2D, element: Element): void;
}

/** The ChannelMergerNode interface, often used in conjunction with its opposite, ChannelSplitterNode, reunites different mono inputs into a single output. Each input is used to fill a channel of the output. This is useful for accessing each channels separately, e.g. for performing channel mixing where gain must be separately controlled on each channel. */
interface ChannelMergerNode extends AudioNode {
}

declare var ChannelMergerNode: {
    prototype: ChannelMergerNode;
    new(context: BaseAudioContext, options?: ChannelMergerOptions): ChannelMergerNode;
};

/** The ChannelSplitterNode interface, often used in conjunction with its opposite, ChannelMergerNode, separates the different channels of an audio source into a set of mono outputs. This is useful for accessing each channel separately, e.g. for performing channel mixing where gain must be separately controlled on each channel. */
interface ChannelSplitterNode extends AudioNode {
}

declare var ChannelSplitterNode: {
    prototype: ChannelSplitterNode;
    new(context: BaseAudioContext, options?: ChannelSplitterOptions): ChannelSplitterNode;
};

/** The CharacterData abstract interface represents a Node object that contains characters. This is an abstract interface, meaning there aren't any object of type CharacterData: it is implemented by other interfaces, like Text, Comment, or ProcessingInstruction which aren't abstract. */
interface CharacterData extends Node, ChildNode, NonDocumentTypeChildNode {
    data: string;
    readonly length: number;
    readonly ownerDocument: Document;
    appendData(data: string): void;
    deleteData(offset: number, count: number): void;
    insertData(offset: number, data: string): void;
    replaceData(offset: number, count: number, data: string): void;
    substringData(offset: number, count: number): string;
}

declare var CharacterData: {
    prototype: CharacterData;
    new(): CharacterData;
};

interface ChildNode extends Node {
    /**
     * Inserts nodes just after node, while replacing strings in nodes with equivalent Text nodes.
     *
     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
     */
    after(...nodes: (Node | string)[]): void;
    /**
     * Inserts nodes just before node, while replacing strings in nodes with equivalent Text nodes.
     *
     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
     */
    before(...nodes: (Node | string)[]): void;
    /** Removes node. */
    remove(): void;
    /**
     * Replaces node with nodes, while replacing strings in nodes with equivalent Text nodes.
     *
     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
     */
    replaceWith(...nodes: (Node | string)[]): void;
}

/** @deprecated */
interface ClientRect extends DOMRect {
}

/** Available only in secure contexts. */
interface Clipboard extends EventTarget {
    read(): Promise<ClipboardItems>;
    readText(): Promise<string>;
    write(data: ClipboardItems): Promise<void>;
    writeText(data: string): Promise<void>;
}

declare var Clipboard: {
    prototype: Clipboard;
    new(): Clipboard;
};

/** Events providing information related to modification of the clipboard, that is cut, copy, and paste events. */
interface ClipboardEvent extends Event {
    readonly clipboardData: DataTransfer | null;
}

declare var ClipboardEvent: {
    prototype: ClipboardEvent;
    new(type: string, eventInitDict?: ClipboardEventInit): ClipboardEvent;
};

interface ClipboardItem {
    readonly types: ReadonlyArray<string>;
    getType(type: string): Promise<Blob>;
}

declare var ClipboardItem: {
    prototype: ClipboardItem;
    new(items: Record<string, ClipboardItemDataType | PromiseLike<ClipboardItemDataType>>, options?: ClipboardItemOptions): ClipboardItem;
};

/** A CloseEvent is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the WebSocket object's onclose attribute. */
interface CloseEvent extends Event {
    /** Returns the WebSocket connection close code provided by the server. */
    readonly code: number;
    /** Returns the WebSocket connection close reason provided by the server. */
    readonly reason: string;
    /** Returns true if the connection closed cleanly; false otherwise. */
    readonly wasClean: boolean;
}

declare var CloseEvent: {
    prototype: CloseEvent;
    new(type: string, eventInitDict?: CloseEventInit): CloseEvent;
};

/** Textual notations within markup; although it is generally not visually shown, such comments are available to be read in the source view. */
interface Comment extends CharacterData {
}

declare var Comment: {
    prototype: Comment;
    new(data?: string): Comment;
};

/** The DOM CompositionEvent represents events that occur due to the user indirectly entering text. */
interface CompositionEvent extends UIEvent {
    readonly data: string;
    /** @deprecated */
    initCompositionEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: WindowProxy | null, dataArg?: string): void;
}

declare var CompositionEvent: {
    prototype: CompositionEvent;
    new(type: string, eventInitDict?: CompositionEventInit): CompositionEvent;
};

interface ConstantSourceNode extends AudioScheduledSourceNode {
    readonly offset: AudioParam;
    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: ConstantSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: ConstantSourceNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ConstantSourceNode: {
    prototype: ConstantSourceNode;
    new(context: BaseAudioContext, options?: ConstantSourceOptions): ConstantSourceNode;
};

/** An AudioNode that performs a Linear Convolution on a given AudioBuffer, often used to achieve a reverb effect. A ConvolverNode always has exactly one input and one output. */
interface ConvolverNode extends AudioNode {
    buffer: AudioBuffer | null;
    normalize: boolean;
}

declare var ConvolverNode: {
    prototype: ConvolverNode;
    new(context: BaseAudioContext, options?: ConvolverOptions): ConvolverNode;
};

/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
interface CountQueuingStrategy extends QueuingStrategy {
    readonly highWaterMark: number;
    readonly size: QueuingStrategySize;
}

declare var CountQueuingStrategy: {
    prototype: CountQueuingStrategy;
    new(init: QueuingStrategyInit): CountQueuingStrategy;
};

/** Available only in secure contexts. */
interface Credential {
    readonly id: string;
    readonly type: string;
}

declare var Credential: {
    prototype: Credential;
    new(): Credential;
};

/** Available only in secure contexts. */
interface CredentialsContainer {
    create(options?: CredentialCreationOptions): Promise<Credential | null>;
    get(options?: CredentialRequestOptions): Promise<Credential | null>;
    preventSilentAccess(): Promise<void>;
    store(credential: Credential): Promise<Credential>;
}

declare var CredentialsContainer: {
    prototype: CredentialsContainer;
    new(): CredentialsContainer;
};

/** Basic cryptography features available in the current context. It allows access to a cryptographically strong random number generator and to cryptographic primitives. */
interface Crypto {
    /** Available only in secure contexts. */
    readonly subtle: SubtleCrypto;
    getRandomValues<T extends ArrayBufferView | null>(array: T): T;
}

declare var Crypto: {
    prototype: Crypto;
    new(): Crypto;
};

/**
 * The CryptoKey dictionary of the Web Crypto API represents a cryptographic key.
 * Available only in secure contexts.
 */
interface CryptoKey {
    readonly algorithm: KeyAlgorithm;
    readonly extractable: boolean;
    readonly type: KeyType;
    readonly usages: KeyUsage[];
}

declare var CryptoKey: {
    prototype: CryptoKey;
    new(): CryptoKey;
};

interface CustomElementRegistry {
    define(name: string, constructor: CustomElementConstructor, options?: ElementDefinitionOptions): void;
    get(name: string): CustomElementConstructor | undefined;
    upgrade(root: Node): void;
    whenDefined(name: string): Promise<CustomElementConstructor>;
}

declare var CustomElementRegistry: {
    prototype: CustomElementRegistry;
    new(): CustomElementRegistry;
};

interface CustomEvent<T = any> extends Event {
    /** Returns any custom data event was created with. Typically used for synthetic events. */
    readonly detail: T;
    /** @deprecated */
    initCustomEvent(type: string, bubbles?: boolean, cancelable?: boolean, detail?: T): void;
}

declare var CustomEvent: {
    prototype: CustomEvent;
    new<T>(type: string, eventInitDict?: CustomEventInit<T>): CustomEvent<T>;
};

/** An abnormal event (called an exception) which occurs as a result of calling a method or accessing a property of a web API. */
interface DOMException extends Error {
    readonly code: number;
    readonly message: string;
    readonly name: string;
    readonly ABORT_ERR: number;
    readonly DATA_CLONE_ERR: number;
    readonly DOMSTRING_SIZE_ERR: number;
    readonly HIERARCHY_REQUEST_ERR: number;
    readonly INDEX_SIZE_ERR: number;
    readonly INUSE_ATTRIBUTE_ERR: number;
    readonly INVALID_ACCESS_ERR: number;
    readonly INVALID_CHARACTER_ERR: number;
    readonly INVALID_MODIFICATION_ERR: number;
    readonly INVALID_NODE_TYPE_ERR: number;
    readonly INVALID_STATE_ERR: number;
    readonly NAMESPACE_ERR: number;
    readonly NETWORK_ERR: number;
    readonly NOT_FOUND_ERR: number;
    readonly NOT_SUPPORTED_ERR: number;
    readonly NO_DATA_ALLOWED_ERR: number;
    readonly NO_MODIFICATION_ALLOWED_ERR: number;
    readonly QUOTA_EXCEEDED_ERR: number;
    readonly SECURITY_ERR: number;
    readonly SYNTAX_ERR: number;
    readonly TIMEOUT_ERR: number;
    readonly TYPE_MISMATCH_ERR: number;
    readonly URL_MISMATCH_ERR: number;
    readonly VALIDATION_ERR: number;
    readonly WRONG_DOCUMENT_ERR: number;
}

declare var DOMException: {
    prototype: DOMException;
    new(message?: string, name?: string): DOMException;
    readonly ABORT_ERR: number;
    readonly DATA_CLONE_ERR: number;
    readonly DOMSTRING_SIZE_ERR: number;
    readonly HIERARCHY_REQUEST_ERR: number;
    readonly INDEX_SIZE_ERR: number;
    readonly INUSE_ATTRIBUTE_ERR: number;
    readonly INVALID_ACCESS_ERR: number;
    readonly INVALID_CHARACTER_ERR: number;
    readonly INVALID_MODIFICATION_ERR: number;
    readonly INVALID_NODE_TYPE_ERR: number;
    readonly INVALID_STATE_ERR: number;
    readonly NAMESPACE_ERR: number;
    readonly NETWORK_ERR: number;
    readonly NOT_FOUND_ERR: number;
    readonly NOT_SUPPORTED_ERR: number;
    readonly NO_DATA_ALLOWED_ERR: number;
    readonly NO_MODIFICATION_ALLOWED_ERR: number;
    readonly QUOTA_EXCEEDED_ERR: number;
    readonly SECURITY_ERR: number;
    readonly SYNTAX_ERR: number;
    readonly TIMEOUT_ERR: number;
    readonly TYPE_MISMATCH_ERR: number;
    readonly URL_MISMATCH_ERR: number;
    readonly VALIDATION_ERR: number;
    readonly WRONG_DOCUMENT_ERR: number;
};

/** An object providing methods which are not dependent on any particular document. Such an object is returned by the Document.implementation property. */
interface DOMImplementation {
    createDocument(namespace: string | null, qualifiedName: string | null, doctype?: DocumentType | null): XMLDocument;
    createDocumentType(qualifiedName: string, publicId: string, systemId: string): DocumentType;
    createHTMLDocument(title?: string): Document;
    /** @deprecated */
    hasFeature(...args: any[]): true;
}

declare var DOMImplementation: {
    prototype: DOMImplementation;
    new(): DOMImplementation;
};

interface DOMMatrix extends DOMMatrixReadOnly {
    a: number;
    b: number;
    c: number;
    d: number;
    e: number;
    f: number;
    m11: number;
    m12: number;
    m13: number;
    m14: number;
    m21: number;
    m22: number;
    m23: number;
    m24: number;
    m31: number;
    m32: number;
    m33: number;
    m34: number;
    m41: number;
    m42: number;
    m43: number;
    m44: number;
    invertSelf(): DOMMatrix;
    multiplySelf(other?: DOMMatrixInit): DOMMatrix;
    preMultiplySelf(other?: DOMMatrixInit): DOMMatrix;
    rotateAxisAngleSelf(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
    rotateFromVectorSelf(x?: number, y?: number): DOMMatrix;
    rotateSelf(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
    scale3dSelf(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    scaleSelf(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    setMatrixValue(transformList: string): DOMMatrix;
    skewXSelf(sx?: number): DOMMatrix;
    skewYSelf(sy?: number): DOMMatrix;
    translateSelf(tx?: number, ty?: number, tz?: number): DOMMatrix;
}

declare var DOMMatrix: {
    prototype: DOMMatrix;
    new(init?: string | number[]): DOMMatrix;
    fromFloat32Array(array32: Float32Array): DOMMatrix;
    fromFloat64Array(array64: Float64Array): DOMMatrix;
    fromMatrix(other?: DOMMatrixInit): DOMMatrix;
};

type SVGMatrix = DOMMatrix;
declare var SVGMatrix: typeof DOMMatrix;

type WebKitCSSMatrix = DOMMatrix;
declare var WebKitCSSMatrix: typeof DOMMatrix;

interface DOMMatrixReadOnly {
    readonly a: number;
    readonly b: number;
    readonly c: number;
    readonly d: number;
    readonly e: number;
    readonly f: number;
    readonly is2D: boolean;
    readonly isIdentity: boolean;
    readonly m11: number;
    readonly m12: number;
    readonly m13: number;
    readonly m14: number;
    readonly m21: number;
    readonly m22: number;
    readonly m23: number;
    readonly m24: number;
    readonly m31: number;
    readonly m32: number;
    readonly m33: number;
    readonly m34: number;
    readonly m41: number;
    readonly m42: number;
    readonly m43: number;
    readonly m44: number;
    flipX(): DOMMatrix;
    flipY(): DOMMatrix;
    inverse(): DOMMatrix;
    multiply(other?: DOMMatrixInit): DOMMatrix;
    rotate(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
    rotateAxisAngle(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
    rotateFromVector(x?: number, y?: number): DOMMatrix;
    scale(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    scale3d(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    /** @deprecated */
    scaleNonUniform(scaleX?: number, scaleY?: number): DOMMatrix;
    skewX(sx?: number): DOMMatrix;
    skewY(sy?: number): DOMMatrix;
    toFloat32Array(): Float32Array;
    toFloat64Array(): Float64Array;
    toJSON(): any;
    transformPoint(point?: DOMPointInit): DOMPoint;
    translate(tx?: number, ty?: number, tz?: number): DOMMatrix;
    toString(): string;
}

declare var DOMMatrixReadOnly: {
    prototype: DOMMatrixReadOnly;
    new(init?: string | number[]): DOMMatrixReadOnly;
    fromFloat32Array(array32: Float32Array): DOMMatrixReadOnly;
    fromFloat64Array(array64: Float64Array): DOMMatrixReadOnly;
    fromMatrix(other?: DOMMatrixInit): DOMMatrixReadOnly;
    toString(): string;
};

/** Provides the ability to parse XML or HTML source code from a string into a DOM Document. */
interface DOMParser {
    /**
     * Parses string using either the HTML or XML parser, according to type, and returns the resulting Document. type can be "text/html" (which will invoke the HTML parser), or any of "text/xml", "application/xml", "application/xhtml+xml", or "image/svg+xml" (which will invoke the XML parser).
     *
     * For the XML parser, if string cannot be parsed, then the returned Document will contain elements describing the resulting error.
     *
     * Note that script elements are not evaluated during parsing, and the resulting document's encoding will always be UTF-8.
     *
     * Values other than the above for type will cause a TypeError exception to be thrown.
     */
    parseFromString(string: string, type: DOMParserSupportedType): Document;
}

declare var DOMParser: {
    prototype: DOMParser;
    new(): DOMParser;
};

interface DOMPoint extends DOMPointReadOnly {
    w: number;
    x: number;
    y: number;
    z: number;
}

declare var DOMPoint: {
    prototype: DOMPoint;
    new(x?: number, y?: number, z?: number, w?: number): DOMPoint;
    fromPoint(other?: DOMPointInit): DOMPoint;
};

type SVGPoint = DOMPoint;
declare var SVGPoint: typeof DOMPoint;

interface DOMPointReadOnly {
    readonly w: number;
    readonly x: number;
    readonly y: number;
    readonly z: number;
    matrixTransform(matrix?: DOMMatrixInit): DOMPoint;
    toJSON(): any;
}

declare var DOMPointReadOnly: {
    prototype: DOMPointReadOnly;
    new(x?: number, y?: number, z?: number, w?: number): DOMPointReadOnly;
    fromPoint(other?: DOMPointInit): DOMPointReadOnly;
};

interface DOMQuad {
    readonly p1: DOMPoint;
    readonly p2: DOMPoint;
    readonly p3: DOMPoint;
    readonly p4: DOMPoint;
    getBounds(): DOMRect;
    toJSON(): any;
}

declare var DOMQuad: {
    prototype: DOMQuad;
    new(p1?: DOMPointInit, p2?: DOMPointInit, p3?: DOMPointInit, p4?: DOMPointInit): DOMQuad;
    fromQuad(other?: DOMQuadInit): DOMQuad;
    fromRect(other?: DOMRectInit): DOMQuad;
};

interface DOMRect extends DOMRectReadOnly {
    height: number;
    width: number;
    x: number;
    y: number;
}

declare var DOMRect: {
    prototype: DOMRect;
    new(x?: number, y?: number, width?: number, height?: number): DOMRect;
    fromRect(other?: DOMRectInit): DOMRect;
};

type SVGRect = DOMRect;
declare var SVGRect: typeof DOMRect;

interface DOMRectList {
    readonly length: number;
    item(index: number): DOMRect | null;
    [index: number]: DOMRect;
}

declare var DOMRectList: {
    prototype: DOMRectList;
    new(): DOMRectList;
};

interface DOMRectReadOnly {
    readonly bottom: number;
    readonly height: number;
    readonly left: number;
    readonly right: number;
    readonly top: number;
    readonly width: number;
    readonly x: number;
    readonly y: number;
    toJSON(): any;
}

declare var DOMRectReadOnly: {
    prototype: DOMRectReadOnly;
    new(x?: number, y?: number, width?: number, height?: number): DOMRectReadOnly;
    fromRect(other?: DOMRectInit): DOMRectReadOnly;
};

/** A type returned by some APIs which contains a list of DOMString (strings). */
interface DOMStringList {
    /** Returns the number of strings in strings. */
    readonly length: number;
    /** Returns true if strings contains string, and false otherwise. */
    contains(string: string): boolean;
    /** Returns the string with index index from strings. */
    item(index: number): string | null;
    [index: number]: string;
}

declare var DOMStringList: {
    prototype: DOMStringList;
    new(): DOMStringList;
};

/** Used by the dataset\xA0HTML\xA0attribute to represent data for custom attributes added to elements. */
interface DOMStringMap {
    [name: string]: string | undefined;
}

declare var DOMStringMap: {
    prototype: DOMStringMap;
    new(): DOMStringMap;
};

/** A set of space-separated tokens. Such a set is returned by Element.classList, HTMLLinkElement.relList, HTMLAnchorElement.relList, HTMLAreaElement.relList, HTMLIframeElement.sandbox, or HTMLOutputElement.htmlFor. It is indexed beginning with 0 as with JavaScript Array objects. DOMTokenList is always case-sensitive. */
interface DOMTokenList {
    /** Returns the number of tokens. */
    readonly length: number;
    /**
     * Returns the associated set as string.
     *
     * Can be set, to change the associated attribute.
     */
    value: string;
    toString(): string;
    /**
     * Adds all arguments passed, except those already present.
     *
     * Throws a "SyntaxError" DOMException if one of the arguments is the empty string.
     *
     * Throws an "InvalidCharacterError" DOMException if one of the arguments contains any ASCII whitespace.
     */
    add(...tokens: string[]): void;
    /** Returns true if token is present, and false otherwise. */
    contains(token: string): boolean;
    /** Returns the token with index index. */
    item(index: number): string | null;
    /**
     * Removes arguments passed, if they are present.
     *
     * Throws a "SyntaxError" DOMException if one of the arguments is the empty string.
     *
     * Throws an "InvalidCharacterError" DOMException if one of the arguments contains any ASCII whitespace.
     */
    remove(...tokens: string[]): void;
    /**
     * Replaces token with newToken.
     *
     * Returns true if token was replaced with newToken, and false otherwise.
     *
     * Throws a "SyntaxError" DOMException if one of the arguments is the empty string.
     *
     * Throws an "InvalidCharacterError" DOMException if one of the arguments contains any ASCII whitespace.
     */
    replace(token: string, newToken: string): boolean;
    /**
     * Returns true if token is in the associated attribute's supported tokens. Returns false otherwise.
     *
     * Throws a TypeError if the associated attribute has no supported tokens defined.
     */
    supports(token: string): boolean;
    /**
     * If force is not given, "toggles" token, removing it if it's present and adding it if it's not present. If force is true, adds token (same as add()). If force is false, removes token (same as remove()).
     *
     * Returns true if token is now present, and false otherwise.
     *
     * Throws a "SyntaxError" DOMException if token is empty.
     *
     * Throws an "InvalidCharacterError" DOMException if token contains any spaces.
     */
    toggle(token: string, force?: boolean): boolean;
    forEach(callbackfn: (value: string, key: number, parent: DOMTokenList) => void, thisArg?: any): void;
    [index: number]: string;
}

declare var DOMTokenList: {
    prototype: DOMTokenList;
    new(): DOMTokenList;
};

/** Used to hold the data that is being dragged during a drag and drop operation. It may hold one or more data items, each of one or more data types. For more information about drag and drop, see HTML Drag and Drop API. */
interface DataTransfer {
    /**
     * Returns the kind of operation that is currently selected. If the kind of operation isn't one of those that is allowed by the effectAllowed attribute, then the operation will fail.
     *
     * Can be set, to change the selected operation.
     *
     * The possible values are "none", "copy", "link", and "move".
     */
    dropEffect: "none" | "copy" | "link" | "move";
    /**
     * Returns the kinds of operations that are to be allowed.
     *
     * Can be set (during the dragstart event), to change the allowed operations.
     *
     * The possible values are "none", "copy", "copyLink", "copyMove", "link", "linkMove", "move", "all", and "uninitialized",
     */
    effectAllowed: "none" | "copy" | "copyLink" | "copyMove" | "link" | "linkMove" | "move" | "all" | "uninitialized";
    /** Returns a FileList of the files being dragged, if any. */
    readonly files: FileList;
    /** Returns a DataTransferItemList object, with the drag data. */
    readonly items: DataTransferItemList;
    /** Returns a frozen array listing the formats that were set in the dragstart event. In addition, if any files are being dragged, then one of the types will be the string "Files". */
    readonly types: ReadonlyArray<string>;
    /** Removes the data of the specified formats. Removes all data if the argument is omitted. */
    clearData(format?: string): void;
    /** Returns the specified data. If there is no such data, returns the empty string. */
    getData(format: string): string;
    /** Adds the specified data. */
    setData(format: string, data: string): void;
    /** Uses the given element to update the drag feedback, replacing any previously specified feedback. */
    setDragImage(image: Element, x: number, y: number): void;
}

declare var DataTransfer: {
    prototype: DataTransfer;
    new(): DataTransfer;
};

/** One drag data item. During a drag operation, each drag event has a dataTransfer property which contains a list of drag data items. Each item in the list is a DataTransferItem object. */
interface DataTransferItem {
    /** Returns the drag data item kind, one of: "string", "file". */
    readonly kind: string;
    /** Returns the drag data item type string. */
    readonly type: string;
    /** Returns a File object, if the drag data item kind is File. */
    getAsFile(): File | null;
    /** Invokes the callback with the string data as the argument, if the drag data item kind is text. */
    getAsString(callback: FunctionStringCallback | null): void;
    webkitGetAsEntry(): FileSystemEntry | null;
}

declare var DataTransferItem: {
    prototype: DataTransferItem;
    new(): DataTransferItem;
};

/** A list of DataTransferItem objects representing items being dragged. During a drag operation, each DragEvent has a dataTransfer property and that property is a DataTransferItemList. */
interface DataTransferItemList {
    /** Returns the number of items in the drag data store. */
    readonly length: number;
    /** Adds a new entry for the given data to the drag data store. If the data is plain text then a type string has to be provided also. */
    add(data: string, type: string): DataTransferItem | null;
    add(data: File): DataTransferItem | null;
    /** Removes all the entries in the drag data store. */
    clear(): void;
    /** Removes the indexth entry in the drag data store. */
    remove(index: number): void;
    [index: number]: DataTransferItem;
}

declare var DataTransferItemList: {
    prototype: DataTransferItemList;
    new(): DataTransferItemList;
};

/** A delay-line; an AudioNode audio-processing module that causes a delay between the arrival of an input data and its propagation to the output. */
interface DelayNode extends AudioNode {
    readonly delayTime: AudioParam;
}

declare var DelayNode: {
    prototype: DelayNode;
    new(context: BaseAudioContext, options?: DelayOptions): DelayNode;
};

/**
 * The DeviceMotionEvent provides web developers with information about the speed of changes for the device's position and orientation.
 * Available only in secure contexts.
 */
interface DeviceMotionEvent extends Event {
    readonly acceleration: DeviceMotionEventAcceleration | null;
    readonly accelerationIncludingGravity: DeviceMotionEventAcceleration | null;
    readonly interval: number;
    readonly rotationRate: DeviceMotionEventRotationRate | null;
}

declare var DeviceMotionEvent: {
    prototype: DeviceMotionEvent;
    new(type: string, eventInitDict?: DeviceMotionEventInit): DeviceMotionEvent;
};

/** Available only in secure contexts. */
interface DeviceMotionEventAcceleration {
    readonly x: number | null;
    readonly y: number | null;
    readonly z: number | null;
}

/** Available only in secure contexts. */
interface DeviceMotionEventRotationRate {
    readonly alpha: number | null;
    readonly beta: number | null;
    readonly gamma: number | null;
}

/**
 * The DeviceOrientationEvent provides web developers with information from the physical orientation of the device running the web page.
 * Available only in secure contexts.
 */
interface DeviceOrientationEvent extends Event {
    readonly absolute: boolean;
    readonly alpha: number | null;
    readonly beta: number | null;
    readonly gamma: number | null;
}

declare var DeviceOrientationEvent: {
    prototype: DeviceOrientationEvent;
    new(type: string, eventInitDict?: DeviceOrientationEventInit): DeviceOrientationEvent;
};

interface DocumentEventMap extends DocumentAndElementEventHandlersEventMap, GlobalEventHandlersEventMap {
    "fullscreenchange": Event;
    "fullscreenerror": Event;
    "pointerlockchange": Event;
    "pointerlockerror": Event;
    "readystatechange": Event;
    "visibilitychange": Event;
}

/** Any web page loaded in the browser and serves as an entry point into the web page's content, which is the DOM tree. */
interface Document extends Node, DocumentAndElementEventHandlers, DocumentOrShadowRoot, FontFaceSource, GlobalEventHandlers, NonElementParentNode, ParentNode, XPathEvaluatorBase {
    /** Sets or gets the URL for the current document. */
    readonly URL: string;
    /**
     * Sets or gets the color of all active links in the document.
     * @deprecated
     */
    alinkColor: string;
    /**
     * Returns a reference to the collection of elements contained by the object.
     * @deprecated
     */
    readonly all: HTMLAllCollection;
    /**
     * Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.
     * @deprecated
     */
    readonly anchors: HTMLCollectionOf<HTMLAnchorElement>;
    /**
     * Retrieves a collection of all applet objects in the document.
     * @deprecated
     */
    readonly applets: HTMLCollection;
    /**
     * Deprecated. Sets or retrieves a value that indicates the background color behind the object.
     * @deprecated
     */
    bgColor: string;
    /** Specifies the beginning and end of the document body. */
    body: HTMLElement;
    /** Returns document's encoding. */
    readonly characterSet: string;
    /**
     * Gets or sets the character set used to encode the object.
     * @deprecated This is a legacy alias of \`characterSet\`.
     */
    readonly charset: string;
    /** Gets a value that indicates whether standards-compliant mode is switched on for the object. */
    readonly compatMode: string;
    /** Returns document's content type. */
    readonly contentType: string;
    /**
     * Returns the HTTP cookies that apply to the Document. If there are no cookies or cookies can't be applied to this resource, the empty string will be returned.
     *
     * Can be set, to add a new cookie to the element's set of HTTP cookies.
     *
     * If the contents are sandboxed into a unique origin (e.g. in an iframe with the sandbox attribute), a "SecurityError" DOMException will be thrown on getting and setting.
     */
    cookie: string;
    /**
     * Returns the script element, or the SVG script element, that is currently executing, as long as the element represents a classic script. In the case of reentrant script execution, returns the one that most recently started executing amongst those that have not yet finished executing.
     *
     * Returns null if the Document is not currently executing a script or SVG script element (e.g., because the running script is an event handler, or a timeout), or if the currently executing script or SVG script element represents a module script.
     */
    readonly currentScript: HTMLOrSVGScriptElement | null;
    /** Returns the Window object of the active document. */
    readonly defaultView: (WindowProxy & typeof globalThis) | null;
    /** Sets or gets a value that indicates whether the document can be edited. */
    designMode: string;
    /** Sets or retrieves a value that indicates the reading order of the object. */
    dir: string;
    /** Gets an object representing the document type declaration associated with the current document. */
    readonly doctype: DocumentType | null;
    /** Gets a reference to the root node of the document. */
    readonly documentElement: HTMLElement;
    /** Returns document's URL. */
    readonly documentURI: string;
    /** Sets or gets the security domain of the document. */
    domain: string;
    /** Retrieves a collection of all embed objects in the document. */
    readonly embeds: HTMLCollectionOf<HTMLEmbedElement>;
    /**
     * Sets or gets the foreground (text) color of the document.
     * @deprecated
     */
    fgColor: string;
    /** Retrieves a collection, in source order, of all form objects in the document. */
    readonly forms: HTMLCollectionOf<HTMLFormElement>;
    /** @deprecated */
    readonly fullscreen: boolean;
    /** Returns true if document has the ability to display elements fullscreen and fullscreen is supported, or false otherwise. */
    readonly fullscreenEnabled: boolean;
    /** Returns the head element. */
    readonly head: HTMLHeadElement;
    readonly hidden: boolean;
    /** Retrieves a collection, in source order, of img objects in the document. */
    readonly images: HTMLCollectionOf<HTMLImageElement>;
    /** Gets the implementation object of the current document. */
    readonly implementation: DOMImplementation;
    /**
     * Returns the character encoding used to create the webpage that is loaded into the document object.
     * @deprecated This is a legacy alias of \`characterSet\`.
     */
    readonly inputEncoding: string;
    /** Gets the date that the page was last modified, if the page supplies one. */
    readonly lastModified: string;
    /**
     * Sets or gets the color of the document links.
     * @deprecated
     */
    linkColor: string;
    /** Retrieves a collection of all a objects that specify the href property and all area objects in the document. */
    readonly links: HTMLCollectionOf<HTMLAnchorElement | HTMLAreaElement>;
    /** Contains information about the current URL. */
    get location(): Location;
    set location(href: string | Location);
    onfullscreenchange: ((this: Document, ev: Event) => any) | null;
    onfullscreenerror: ((this: Document, ev: Event) => any) | null;
    onpointerlockchange: ((this: Document, ev: Event) => any) | null;
    onpointerlockerror: ((this: Document, ev: Event) => any) | null;
    /**
     * Fires when the state of the object has changed.
     * @param ev The event
     */
    onreadystatechange: ((this: Document, ev: Event) => any) | null;
    onvisibilitychange: ((this: Document, ev: Event) => any) | null;
    readonly ownerDocument: null;
    readonly pictureInPictureEnabled: boolean;
    /** Return an HTMLCollection of the embed elements in the Document. */
    readonly plugins: HTMLCollectionOf<HTMLEmbedElement>;
    /** Retrieves a value that indicates the current state of the object. */
    readonly readyState: DocumentReadyState;
    /** Gets the URL of the location that referred the user to the current page. */
    readonly referrer: string;
    /** @deprecated */
    readonly rootElement: SVGSVGElement | null;
    /** Retrieves a collection of all script objects in the document. */
    readonly scripts: HTMLCollectionOf<HTMLScriptElement>;
    readonly scrollingElement: Element | null;
    readonly timeline: DocumentTimeline;
    /** Contains the title of the document. */
    title: string;
    readonly visibilityState: VisibilityState;
    /**
     * Sets or gets the color of the links that the user has visited.
     * @deprecated
     */
    vlinkColor: string;
    /**
     * Moves node from another document and returns it.
     *
     * If node is a document, throws a "NotSupportedError" DOMException or, if node is a shadow root, throws a "HierarchyRequestError" DOMException.
     */
    adoptNode<T extends Node>(node: T): T;
    /** @deprecated */
    captureEvents(): void;
    /** @deprecated */
    caretRangeFromPoint(x: number, y: number): Range | null;
    /** @deprecated */
    clear(): void;
    /** Closes an output stream and forces the sent data to display. */
    close(): void;
    /**
     * Creates an attribute object with a specified name.
     * @param name String that sets the attribute object's name.
     */
    createAttribute(localName: string): Attr;
    createAttributeNS(namespace: string | null, qualifiedName: string): Attr;
    /** Returns a CDATASection node whose data is data. */
    createCDATASection(data: string): CDATASection;
    /**
     * Creates a comment object with the specified data.
     * @param data Sets the comment object's data.
     */
    createComment(data: string): Comment;
    /** Creates a new document. */
    createDocumentFragment(): DocumentFragment;
    /**
     * Creates an instance of the element for the specified tag.
     * @param tagName The name of an element.
     */
    createElement<K extends keyof HTMLElementTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementTagNameMap[K];
    /** @deprecated */
    createElement<K extends keyof HTMLElementDeprecatedTagNameMap>(tagName: K, options?: ElementCreationOptions): HTMLElementDeprecatedTagNameMap[K];
    createElement(tagName: string, options?: ElementCreationOptions): HTMLElement;
    /**
     * Returns an element with namespace namespace. Its namespace prefix will be everything before ":" (U+003E) in qualifiedName or null. Its local name will be everything after ":" (U+003E) in qualifiedName or qualifiedName.
     *
     * If localName does not match the Name production an "InvalidCharacterError" DOMException will be thrown.
     *
     * If one of the following conditions is true a "NamespaceError" DOMException will be thrown:
     *
     * localName does not match the QName production.
     * Namespace prefix is not null and namespace is the empty string.
     * Namespace prefix is "xml" and namespace is not the XML namespace.
     * qualifiedName or namespace prefix is "xmlns" and namespace is not the XMLNS namespace.
     * namespace is the XMLNS namespace and neither qualifiedName nor namespace prefix is "xmlns".
     *
     * When supplied, options's is can be used to create a customized built-in element.
     */
    createElementNS(namespaceURI: "http://www.w3.org/1999/xhtml", qualifiedName: string): HTMLElement;
    createElementNS<K extends keyof SVGElementTagNameMap>(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: K): SVGElementTagNameMap[K];
    createElementNS(namespaceURI: "http://www.w3.org/2000/svg", qualifiedName: string): SVGElement;
    createElementNS(namespaceURI: string | null, qualifiedName: string, options?: ElementCreationOptions): Element;
    createElementNS(namespace: string | null, qualifiedName: string, options?: string | ElementCreationOptions): Element;
    createEvent(eventInterface: "AnimationEvent"): AnimationEvent;
    createEvent(eventInterface: "AnimationPlaybackEvent"): AnimationPlaybackEvent;
    createEvent(eventInterface: "AudioProcessingEvent"): AudioProcessingEvent;
    createEvent(eventInterface: "BeforeUnloadEvent"): BeforeUnloadEvent;
    createEvent(eventInterface: "BlobEvent"): BlobEvent;
    createEvent(eventInterface: "ClipboardEvent"): ClipboardEvent;
    createEvent(eventInterface: "CloseEvent"): CloseEvent;
    createEvent(eventInterface: "CompositionEvent"): CompositionEvent;
    createEvent(eventInterface: "CustomEvent"): CustomEvent;
    createEvent(eventInterface: "DeviceMotionEvent"): DeviceMotionEvent;
    createEvent(eventInterface: "DeviceOrientationEvent"): DeviceOrientationEvent;
    createEvent(eventInterface: "DragEvent"): DragEvent;
    createEvent(eventInterface: "ErrorEvent"): ErrorEvent;
    createEvent(eventInterface: "FocusEvent"): FocusEvent;
    createEvent(eventInterface: "FontFaceSetLoadEvent"): FontFaceSetLoadEvent;
    createEvent(eventInterface: "FormDataEvent"): FormDataEvent;
    createEvent(eventInterface: "GamepadEvent"): GamepadEvent;
    createEvent(eventInterface: "HashChangeEvent"): HashChangeEvent;
    createEvent(eventInterface: "IDBVersionChangeEvent"): IDBVersionChangeEvent;
    createEvent(eventInterface: "InputEvent"): InputEvent;
    createEvent(eventInterface: "KeyboardEvent"): KeyboardEvent;
    createEvent(eventInterface: "MediaEncryptedEvent"): MediaEncryptedEvent;
    createEvent(eventInterface: "MediaKeyMessageEvent"): MediaKeyMessageEvent;
    createEvent(eventInterface: "MediaQueryListEvent"): MediaQueryListEvent;
    createEvent(eventInterface: "MediaRecorderErrorEvent"): MediaRecorderErrorEvent;
    createEvent(eventInterface: "MediaStreamTrackEvent"): MediaStreamTrackEvent;
    createEvent(eventInterface: "MessageEvent"): MessageEvent;
    createEvent(eventInterface: "MouseEvent"): MouseEvent;
    createEvent(eventInterface: "MouseEvents"): MouseEvent;
    createEvent(eventInterface: "MutationEvent"): MutationEvent;
    createEvent(eventInterface: "MutationEvents"): MutationEvent;
    createEvent(eventInterface: "OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent;
    createEvent(eventInterface: "PageTransitionEvent"): PageTransitionEvent;
    createEvent(eventInterface: "PaymentMethodChangeEvent"): PaymentMethodChangeEvent;
    createEvent(eventInterface: "PaymentRequestUpdateEvent"): PaymentRequestUpdateEvent;
    createEvent(eventInterface: "PointerEvent"): PointerEvent;
    createEvent(eventInterface: "PopStateEvent"): PopStateEvent;
    createEvent(eventInterface: "ProgressEvent"): ProgressEvent;
    createEvent(eventInterface: "PromiseRejectionEvent"): PromiseRejectionEvent;
    createEvent(eventInterface: "RTCDTMFToneChangeEvent"): RTCDTMFToneChangeEvent;
    createEvent(eventInterface: "RTCDataChannelEvent"): RTCDataChannelEvent;
    createEvent(eventInterface: "RTCPeerConnectionIceErrorEvent"): RTCPeerConnectionIceErrorEvent;
    createEvent(eventInterface: "RTCPeerConnectionIceEvent"): RTCPeerConnectionIceEvent;
    createEvent(eventInterface: "RTCTrackEvent"): RTCTrackEvent;
    createEvent(eventInterface: "SecurityPolicyViolationEvent"): SecurityPolicyViolationEvent;
    createEvent(eventInterface: "SpeechSynthesisErrorEvent"): SpeechSynthesisErrorEvent;
    createEvent(eventInterface: "SpeechSynthesisEvent"): SpeechSynthesisEvent;
    createEvent(eventInterface: "StorageEvent"): StorageEvent;
    createEvent(eventInterface: "SubmitEvent"): SubmitEvent;
    createEvent(eventInterface: "TouchEvent"): TouchEvent;
    createEvent(eventInterface: "TrackEvent"): TrackEvent;
    createEvent(eventInterface: "TransitionEvent"): TransitionEvent;
    createEvent(eventInterface: "UIEvent"): UIEvent;
    createEvent(eventInterface: "UIEvents"): UIEvent;
    createEvent(eventInterface: "WebGLContextEvent"): WebGLContextEvent;
    createEvent(eventInterface: "WheelEvent"): WheelEvent;
    createEvent(eventInterface: string): Event;
    /**
     * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.
     * @param root The root element or node to start traversing on.
     * @param whatToShow The type of nodes or elements to appear in the node list
     * @param filter A custom NodeFilter function to use. For more information, see filter. Use null for no filter.
     */
    createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter | null): NodeIterator;
    /** Returns a ProcessingInstruction node whose target is target and data is data. If target does not match the Name production an "InvalidCharacterError" DOMException will be thrown. If data contains "?>" an "InvalidCharacterError" DOMException will be thrown. */
    createProcessingInstruction(target: string, data: string): ProcessingInstruction;
    /**  Returns an empty range object that has both of its boundary points positioned at the beginning of the document. */
    createRange(): Range;
    /**
     * Creates a text string from the specified value.
     * @param data String that specifies the nodeValue property of the text node.
     */
    createTextNode(data: string): Text;
    /**
     * Creates a TreeWalker object that you can use to traverse filtered lists of nodes or elements in a document.
     * @param root The root element or node to start traversing on.
     * @param whatToShow The type of nodes or elements to appear in the node list. For more information, see whatToShow.
     * @param filter A custom NodeFilter function to use.
     */
    createTreeWalker(root: Node, whatToShow?: number, filter?: NodeFilter | null): TreeWalker;
    /**
     * Executes a command on the current document, current selection, or the given range.
     * @param commandId String that specifies the command to execute. This command can be any of the command identifiers that can be executed in script.
     * @param showUI Display the user interface, defaults to false.
     * @param value Value to assign.
     * @deprecated
     */
    execCommand(commandId: string, showUI?: boolean, value?: string): boolean;
    /** Stops document's fullscreen element from being displayed fullscreen and resolves promise when done. */
    exitFullscreen(): Promise<void>;
    exitPictureInPicture(): Promise<void>;
    exitPointerLock(): void;
    /**
     * Returns a reference to the first object with the specified value of the ID attribute.
     * @param elementId String that specifies the ID value.
     */
    getElementById(elementId: string): HTMLElement | null;
    /** Returns a HTMLCollection of the elements in the object on which the method was invoked (a document or an element) that have all the classes given by classNames. The classNames argument is interpreted as a space-separated list of classes. */
    getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;
    /**
     * Gets a collection of objects based on the value of the NAME or ID attribute.
     * @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.
     */
    getElementsByName(elementName: string): NodeListOf<HTMLElement>;
    /**
     * Retrieves a collection of objects based on the specified element name.
     * @param name Specifies the name of an element.
     */
    getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;
    getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;
    getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;
    /**
     * If namespace and localName are "*" returns a HTMLCollection of all descendant elements.
     *
     * If only namespace is "*" returns a HTMLCollection of all descendant elements whose local name is localName.
     *
     * If only localName is "*" returns a HTMLCollection of all descendant elements whose namespace is namespace.
     *
     * Otherwise, returns a HTMLCollection of all descendant elements whose namespace is namespace and local name is localName.
     */
    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;
    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;
    getElementsByTagNameNS(namespace: string | null, localName: string): HTMLCollectionOf<Element>;
    /** Returns an object representing the current selection of the document that is loaded into the object displaying a webpage. */
    getSelection(): Selection | null;
    /** Gets a value indicating whether the object currently has focus. */
    hasFocus(): boolean;
    hasStorageAccess(): Promise<boolean>;
    /**
     * Returns a copy of node. If deep is true, the copy also includes the node's descendants.
     *
     * If node is a document or a shadow root, throws a "NotSupportedError" DOMException.
     */
    importNode<T extends Node>(node: T, deep?: boolean): T;
    /**
     * Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
     * @param url Specifies a MIME type for the document.
     * @param name Specifies the name of the window. This name is used as the value for the TARGET attribute on a form or an anchor element.
     * @param features Contains a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following values are supported.
     * @param replace Specifies whether the existing entry for the document is replaced in the history list.
     */
    open(unused1?: string, unused2?: string): Document;
    open(url: string | URL, name: string, features: string): WindowProxy | null;
    /**
     * Returns a Boolean value that indicates whether a specified command can be successfully executed using execCommand, given the current state of the document.
     * @param commandId Specifies a command identifier.
     * @deprecated
     */
    queryCommandEnabled(commandId: string): boolean;
    /**
     * Returns a Boolean value that indicates whether the specified command is in the indeterminate state.
     * @param commandId String that specifies a command identifier.
     */
    queryCommandIndeterm(commandId: string): boolean;
    /**
     * Returns a Boolean value that indicates the current state of the command.
     * @param commandId String that specifies a command identifier.
     * @deprecated
     */
    queryCommandState(commandId: string): boolean;
    /**
     * Returns a Boolean value that indicates whether the current command is supported on the current range.
     * @param commandId Specifies a command identifier.
     * @deprecated
     */
    queryCommandSupported(commandId: string): boolean;
    /**
     * Returns the current value of the document, range, or current selection for the given command.
     * @param commandId String that specifies a command identifier.
     */
    queryCommandValue(commandId: string): string;
    /** @deprecated */
    releaseEvents(): void;
    requestStorageAccess(): Promise<void>;
    /**
     * Writes one or more HTML expressions to a document in the specified window.
     * @param content Specifies the text and HTML tags to write.
     */
    write(...text: string[]): void;
    /**
     * Writes one or more HTML expressions, followed by a carriage return, to a document in the specified window.
     * @param content The text and HTML tags to write.
     */
    writeln(...text: string[]): void;
    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Document: {
    prototype: Document;
    new(): Document;
};

interface DocumentAndElementEventHandlersEventMap {
    "copy": ClipboardEvent;
    "cut": ClipboardEvent;
    "paste": ClipboardEvent;
}

interface DocumentAndElementEventHandlers {
    oncopy: ((this: DocumentAndElementEventHandlers, ev: ClipboardEvent) => any) | null;
    oncut: ((this: DocumentAndElementEventHandlers, ev: ClipboardEvent) => any) | null;
    onpaste: ((this: DocumentAndElementEventHandlers, ev: ClipboardEvent) => any) | null;
    addEventListener<K extends keyof DocumentAndElementEventHandlersEventMap>(type: K, listener: (this: DocumentAndElementEventHandlers, ev: DocumentAndElementEventHandlersEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof DocumentAndElementEventHandlersEventMap>(type: K, listener: (this: DocumentAndElementEventHandlers, ev: DocumentAndElementEventHandlersEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** A minimal document object that has no parent. It is used as a lightweight version of Document that stores a segment of a document structure comprised of nodes just like a standard document. The key difference is that because the document fragment isn't part of the active document tree structure, changes made to the fragment don't affect the document, cause reflow, or incur any performance impact that can occur when changes are made. */
interface DocumentFragment extends Node, NonElementParentNode, ParentNode {
    readonly ownerDocument: Document;
    getElementById(elementId: string): HTMLElement | null;
}

declare var DocumentFragment: {
    prototype: DocumentFragment;
    new(): DocumentFragment;
};

interface DocumentOrShadowRoot {
    /**
     * Returns the deepest element in the document through which or to which key events are being routed. This is, roughly speaking, the focused element in the document.
     *
     * For the purposes of this API, when a child browsing context is focused, its container is focused in the parent browsing context. For example, if the user moves the focus to a text control in an iframe, the iframe is the element returned by the activeElement API in the iframe's node document.
     *
     * Similarly, when the focused element is in a different node tree than documentOrShadowRoot, the element returned will be the host that's located in the same node tree as documentOrShadowRoot if documentOrShadowRoot is a shadow-including inclusive ancestor of the focused element, and null if not.
     */
    readonly activeElement: Element | null;
    /** Returns document's fullscreen element. */
    readonly fullscreenElement: Element | null;
    readonly pictureInPictureElement: Element | null;
    readonly pointerLockElement: Element | null;
    /** Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document. */
    readonly styleSheets: StyleSheetList;
    /**
     * Returns the element for the specified x coordinate and the specified y coordinate.
     * @param x The x-offset
     * @param y The y-offset
     */
    elementFromPoint(x: number, y: number): Element | null;
    elementsFromPoint(x: number, y: number): Element[];
    getAnimations(): Animation[];
}

interface DocumentTimeline extends AnimationTimeline {
}

declare var DocumentTimeline: {
    prototype: DocumentTimeline;
    new(options?: DocumentTimelineOptions): DocumentTimeline;
};

/** A Node containing a doctype. */
interface DocumentType extends Node, ChildNode {
    readonly name: string;
    readonly ownerDocument: Document;
    readonly publicId: string;
    readonly systemId: string;
}

declare var DocumentType: {
    prototype: DocumentType;
    new(): DocumentType;
};

/** A DOM event that represents a drag and drop interaction. The user initiates a drag by placing a pointer device (such as a mouse) on the touch surface and then dragging the pointer to a new location (such as another DOM element). Applications are free to interpret a drag and drop interaction in an application-specific way. */
interface DragEvent extends MouseEvent {
    /** Returns the DataTransfer object for the event. */
    readonly dataTransfer: DataTransfer | null;
}

declare var DragEvent: {
    prototype: DragEvent;
    new(type: string, eventInitDict?: DragEventInit): DragEvent;
};

/** Inherits properties from its parent, AudioNode. */
interface DynamicsCompressorNode extends AudioNode {
    readonly attack: AudioParam;
    readonly knee: AudioParam;
    readonly ratio: AudioParam;
    readonly reduction: number;
    readonly release: AudioParam;
    readonly threshold: AudioParam;
}

declare var DynamicsCompressorNode: {
    prototype: DynamicsCompressorNode;
    new(context: BaseAudioContext, options?: DynamicsCompressorOptions): DynamicsCompressorNode;
};

interface EXT_blend_minmax {
    readonly MAX_EXT: GLenum;
    readonly MIN_EXT: GLenum;
}

interface EXT_color_buffer_float {
}

interface EXT_color_buffer_half_float {
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: GLenum;
    readonly RGB16F_EXT: GLenum;
    readonly RGBA16F_EXT: GLenum;
    readonly UNSIGNED_NORMALIZED_EXT: GLenum;
}

interface EXT_float_blend {
}

/** The EXT_frag_depth extension is part of the WebGL API and enables to set a depth value of a fragment from within the fragment shader. */
interface EXT_frag_depth {
}

interface EXT_sRGB {
    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: GLenum;
    readonly SRGB8_ALPHA8_EXT: GLenum;
    readonly SRGB_ALPHA_EXT: GLenum;
    readonly SRGB_EXT: GLenum;
}

interface EXT_shader_texture_lod {
}

interface EXT_texture_compression_rgtc {
    readonly COMPRESSED_RED_GREEN_RGTC2_EXT: GLenum;
    readonly COMPRESSED_RED_RGTC1_EXT: GLenum;
    readonly COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: GLenum;
    readonly COMPRESSED_SIGNED_RED_RGTC1_EXT: GLenum;
}

/** The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF). */
interface EXT_texture_filter_anisotropic {
    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: GLenum;
    readonly TEXTURE_MAX_ANISOTROPY_EXT: GLenum;
}

interface ElementEventMap {
    "fullscreenchange": Event;
    "fullscreenerror": Event;
}

/** Element is the most general base class from which all objects in a Document inherit. It only has methods and properties common to all kinds of elements. More specific classes inherit from Element. */
interface Element extends Node, ARIAMixin, Animatable, ChildNode, InnerHTML, NonDocumentTypeChildNode, ParentNode, Slottable {
    readonly attributes: NamedNodeMap;
    /** Allows for manipulation of element's class content attribute as a set of whitespace-separated tokens through a DOMTokenList object. */
    readonly classList: DOMTokenList;
    /** Returns the value of element's class content attribute. Can be set to change it. */
    className: string;
    readonly clientHeight: number;
    readonly clientLeft: number;
    readonly clientTop: number;
    readonly clientWidth: number;
    /** Returns the value of element's id content attribute. Can be set to change it. */
    id: string;
    /** Returns the local name. */
    readonly localName: string;
    /** Returns the namespace. */
    readonly namespaceURI: string | null;
    onfullscreenchange: ((this: Element, ev: Event) => any) | null;
    onfullscreenerror: ((this: Element, ev: Event) => any) | null;
    outerHTML: string;
    readonly ownerDocument: Document;
    readonly part: DOMTokenList;
    /** Returns the namespace prefix. */
    readonly prefix: string | null;
    readonly scrollHeight: number;
    scrollLeft: number;
    scrollTop: number;
    readonly scrollWidth: number;
    /** Returns element's shadow root, if any, and if shadow root's mode is "open", and null otherwise. */
    readonly shadowRoot: ShadowRoot | null;
    /** Returns the value of element's slot content attribute. Can be set to change it. */
    slot: string;
    /** Returns the HTML-uppercased qualified name. */
    readonly tagName: string;
    /** Creates a shadow root for element and returns it. */
    attachShadow(init: ShadowRootInit): ShadowRoot;
    /** Returns the first (starting at element) inclusive ancestor that matches selectors, and null otherwise. */
    closest<K extends keyof HTMLElementTagNameMap>(selector: K): HTMLElementTagNameMap[K] | null;
    closest<K extends keyof SVGElementTagNameMap>(selector: K): SVGElementTagNameMap[K] | null;
    closest<E extends Element = Element>(selectors: string): E | null;
    /** Returns element's first attribute whose qualified name is qualifiedName, and null if there is no such attribute otherwise. */
    getAttribute(qualifiedName: string): string | null;
    /** Returns element's attribute whose namespace is namespace and local name is localName, and null if there is no such attribute otherwise. */
    getAttributeNS(namespace: string | null, localName: string): string | null;
    /** Returns the qualified names of all element's attributes. Can contain duplicates. */
    getAttributeNames(): string[];
    getAttributeNode(qualifiedName: string): Attr | null;
    getAttributeNodeNS(namespace: string | null, localName: string): Attr | null;
    getBoundingClientRect(): DOMRect;
    getClientRects(): DOMRectList;
    /** Returns a HTMLCollection of the elements in the object on which the method was invoked (a document or an element) that have all the classes given by classNames. The classNames argument is interpreted as a space-separated list of classes. */
    getElementsByClassName(classNames: string): HTMLCollectionOf<Element>;
    getElementsByTagName<K extends keyof HTMLElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<HTMLElementTagNameMap[K]>;
    getElementsByTagName<K extends keyof SVGElementTagNameMap>(qualifiedName: K): HTMLCollectionOf<SVGElementTagNameMap[K]>;
    getElementsByTagName(qualifiedName: string): HTMLCollectionOf<Element>;
    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/1999/xhtml", localName: string): HTMLCollectionOf<HTMLElement>;
    getElementsByTagNameNS(namespaceURI: "http://www.w3.org/2000/svg", localName: string): HTMLCollectionOf<SVGElement>;
    getElementsByTagNameNS(namespace: string | null, localName: string): HTMLCollectionOf<Element>;
    /** Returns true if element has an attribute whose qualified name is qualifiedName, and false otherwise. */
    hasAttribute(qualifiedName: string): boolean;
    /** Returns true if element has an attribute whose namespace is namespace and local name is localName. */
    hasAttributeNS(namespace: string | null, localName: string): boolean;
    /** Returns true if element has attributes, and false otherwise. */
    hasAttributes(): boolean;
    hasPointerCapture(pointerId: number): boolean;
    insertAdjacentElement(where: InsertPosition, element: Element): Element | null;
    insertAdjacentHTML(position: InsertPosition, text: string): void;
    insertAdjacentText(where: InsertPosition, data: string): void;
    /** Returns true if matching selectors against element's root yields element, and false otherwise. */
    matches(selectors: string): boolean;
    releasePointerCapture(pointerId: number): void;
    /** Removes element's first attribute whose qualified name is qualifiedName. */
    removeAttribute(qualifiedName: string): void;
    /** Removes element's attribute whose namespace is namespace and local name is localName. */
    removeAttributeNS(namespace: string | null, localName: string): void;
    removeAttributeNode(attr: Attr): Attr;
    /**
     * Displays element fullscreen and resolves promise when done.
     *
     * When supplied, options's navigationUI member indicates whether showing navigation UI while in fullscreen is preferred or not. If set to "show", navigation simplicity is preferred over screen space, and if set to "hide", more screen space is preferred. User agents are always free to honor user preference over the application's. The default value "auto" indicates no application preference.
     */
    requestFullscreen(options?: FullscreenOptions): Promise<void>;
    requestPointerLock(): void;
    scroll(options?: ScrollToOptions): void;
    scroll(x: number, y: number): void;
    scrollBy(options?: ScrollToOptions): void;
    scrollBy(x: number, y: number): void;
    scrollIntoView(arg?: boolean | ScrollIntoViewOptions): void;
    scrollTo(options?: ScrollToOptions): void;
    scrollTo(x: number, y: number): void;
    /** Sets the value of element's first attribute whose qualified name is qualifiedName to value. */
    setAttribute(qualifiedName: string, value: string): void;
    /** Sets the value of element's attribute whose namespace is namespace and local name is localName to value. */
    setAttributeNS(namespace: string | null, qualifiedName: string, value: string): void;
    setAttributeNode(attr: Attr): Attr | null;
    setAttributeNodeNS(attr: Attr): Attr | null;
    setPointerCapture(pointerId: number): void;
    /**
     * If force is not given, "toggles" qualifiedName, removing it if it is present and adding it if it is not present. If force is true, adds qualifiedName. If force is false, removes qualifiedName.
     *
     * Returns true if qualifiedName is now present, and false otherwise.
     */
    toggleAttribute(qualifiedName: string, force?: boolean): boolean;
    /** @deprecated This is a legacy alias of \`matches\`. */
    webkitMatchesSelector(selectors: string): boolean;
    addEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ElementEventMap>(type: K, listener: (this: Element, ev: ElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Element: {
    prototype: Element;
    new(): Element;
};

interface ElementCSSInlineStyle {
    readonly style: CSSStyleDeclaration;
}

interface ElementContentEditable {
    contentEditable: string;
    enterKeyHint: string;
    inputMode: string;
    readonly isContentEditable: boolean;
}

interface ElementInternals extends ARIAMixin {
    /** Returns the ShadowRoot for internals's target element, if the target element is a shadow host, or null otherwise. */
    readonly shadowRoot: ShadowRoot | null;
}

declare var ElementInternals: {
    prototype: ElementInternals;
    new(): ElementInternals;
};

/** Events providing information related to errors in scripts or in files. */
interface ErrorEvent extends Event {
    readonly colno: number;
    readonly error: any;
    readonly filename: string;
    readonly lineno: number;
    readonly message: string;
}

declare var ErrorEvent: {
    prototype: ErrorEvent;
    new(type: string, eventInitDict?: ErrorEventInit): ErrorEvent;
};

/** An event which takes place in the DOM. */
interface Event {
    /** Returns true or false depending on how event was initialized. True if event goes through its target's ancestors in reverse tree order, and false otherwise. */
    readonly bubbles: boolean;
    cancelBubble: boolean;
    /** Returns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the preventDefault() method. */
    readonly cancelable: boolean;
    /** Returns true or false depending on how event was initialized. True if event invokes listeners past a ShadowRoot node that is the root of its target, and false otherwise. */
    readonly composed: boolean;
    /** Returns the object whose event listener's callback is currently being invoked. */
    readonly currentTarget: EventTarget | null;
    /** Returns true if preventDefault() was invoked successfully to indicate cancelation, and false otherwise. */
    readonly defaultPrevented: boolean;
    /** Returns the event's phase, which is one of NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE. */
    readonly eventPhase: number;
    /** Returns true if event was dispatched by the user agent, and false otherwise. */
    readonly isTrusted: boolean;
    /** @deprecated */
    returnValue: boolean;
    /** @deprecated */
    readonly srcElement: EventTarget | null;
    /** Returns the object to which event is dispatched (its target). */
    readonly target: EventTarget | null;
    /** Returns the event's timestamp as the number of milliseconds measured relative to the time origin. */
    readonly timeStamp: DOMHighResTimeStamp;
    /** Returns the type of event, e.g. "click", "hashchange", or "submit". */
    readonly type: string;
    /** Returns the invocation target objects of event's path (objects on which listeners will be invoked), except for any nodes in shadow trees of which the shadow root's mode is "closed" that are not reachable from event's currentTarget. */
    composedPath(): EventTarget[];
    /** @deprecated */
    initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void;
    /** If invoked when the cancelable attribute value is true, and while executing a listener for the event with passive set to false, signals to the operation that caused event to be dispatched that it needs to be canceled. */
    preventDefault(): void;
    /** Invoking this method prevents event from reaching any registered event listeners after the current one finishes running and, when dispatched in a tree, also prevents event from reaching any other objects. */
    stopImmediatePropagation(): void;
    /** When dispatched in a tree, invoking this method prevents event from reaching any objects other than the current object. */
    stopPropagation(): void;
    readonly AT_TARGET: number;
    readonly BUBBLING_PHASE: number;
    readonly CAPTURING_PHASE: number;
    readonly NONE: number;
}

declare var Event: {
    prototype: Event;
    new(type: string, eventInitDict?: EventInit): Event;
    readonly AT_TARGET: number;
    readonly BUBBLING_PHASE: number;
    readonly CAPTURING_PHASE: number;
    readonly NONE: number;
};

interface EventListener {
    (evt: Event): void;
}

interface EventListenerObject {
    handleEvent(object: Event): void;
}

interface EventSourceEventMap {
    "error": Event;
    "message": MessageEvent;
    "open": Event;
}

interface EventSource extends EventTarget {
    onerror: ((this: EventSource, ev: Event) => any) | null;
    onmessage: ((this: EventSource, ev: MessageEvent) => any) | null;
    onopen: ((this: EventSource, ev: Event) => any) | null;
    /** Returns the state of this EventSource object's connection. It can have the values described below. */
    readonly readyState: number;
    /** Returns the URL providing the event stream. */
    readonly url: string;
    /** Returns true if the credentials mode for connection requests to the URL providing the event stream is set to "include", and false otherwise. */
    readonly withCredentials: boolean;
    /** Aborts any instances of the fetch algorithm started for this EventSource object, and sets the readyState attribute to CLOSED. */
    close(): void;
    readonly CLOSED: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
    addEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var EventSource: {
    prototype: EventSource;
    new(url: string | URL, eventSourceInitDict?: EventSourceInit): EventSource;
    readonly CLOSED: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
};

/** EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them. */
interface EventTarget {
    /**
     * Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.
     *
     * The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.
     *
     * When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.
     *
     * When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in \xA7 2.8 Observing event listeners.
     *
     * When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.
     *
     * If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.
     *
     * The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.
     */
    addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean): void;
    /** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
    dispatchEvent(event: Event): boolean;
    /** Removes the event listener in target's event listener list with the same type, callback, and options. */
    removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
}

declare var EventTarget: {
    prototype: EventTarget;
    new(): EventTarget;
};

/** @deprecated */
interface External {
    /** @deprecated */
    AddSearchProvider(): void;
    /** @deprecated */
    IsSearchProviderInstalled(): void;
}

/** @deprecated */
declare var External: {
    prototype: External;
    new(): External;
};

/** Provides information about files and allows JavaScript in a web page to access their content. */
interface File extends Blob {
    readonly lastModified: number;
    readonly name: string;
    readonly webkitRelativePath: string;
}

declare var File: {
    prototype: File;
    new(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag): File;
};

/** An object of this type is returned by the files property of the HTML <input> element; this lets you access the list of files selected with the <input type="file"> element. It's also used for a list of files dropped into web content when using the drag and drop API; see the DataTransfer object for details on this usage. */
interface FileList {
    readonly length: number;
    item(index: number): File | null;
    [index: number]: File;
}

declare var FileList: {
    prototype: FileList;
    new(): FileList;
};

interface FileReaderEventMap {
    "abort": ProgressEvent<FileReader>;
    "error": ProgressEvent<FileReader>;
    "load": ProgressEvent<FileReader>;
    "loadend": ProgressEvent<FileReader>;
    "loadstart": ProgressEvent<FileReader>;
    "progress": ProgressEvent<FileReader>;
}

/** Lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using File or Blob objects to specify the file or data to read. */
interface FileReader extends EventTarget {
    readonly error: DOMException | null;
    onabort: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onerror: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onload: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onloadend: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onloadstart: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onprogress: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    readonly readyState: number;
    readonly result: string | ArrayBuffer | null;
    abort(): void;
    readAsArrayBuffer(blob: Blob): void;
    readAsBinaryString(blob: Blob): void;
    readAsDataURL(blob: Blob): void;
    readAsText(blob: Blob, encoding?: string): void;
    readonly DONE: number;
    readonly EMPTY: number;
    readonly LOADING: number;
    addEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var FileReader: {
    prototype: FileReader;
    new(): FileReader;
    readonly DONE: number;
    readonly EMPTY: number;
    readonly LOADING: number;
};

interface FileSystem {
    readonly name: string;
    readonly root: FileSystemDirectoryEntry;
}

declare var FileSystem: {
    prototype: FileSystem;
    new(): FileSystem;
};

interface FileSystemDirectoryEntry extends FileSystemEntry {
    createReader(): FileSystemDirectoryReader;
    getDirectory(path?: string | null, options?: FileSystemFlags, successCallback?: FileSystemEntryCallback, errorCallback?: ErrorCallback): void;
    getFile(path?: string | null, options?: FileSystemFlags, successCallback?: FileSystemEntryCallback, errorCallback?: ErrorCallback): void;
}

declare var FileSystemDirectoryEntry: {
    prototype: FileSystemDirectoryEntry;
    new(): FileSystemDirectoryEntry;
};

interface FileSystemDirectoryReader {
    readEntries(successCallback: FileSystemEntriesCallback, errorCallback?: ErrorCallback): void;
}

declare var FileSystemDirectoryReader: {
    prototype: FileSystemDirectoryReader;
    new(): FileSystemDirectoryReader;
};

interface FileSystemEntry {
    readonly filesystem: FileSystem;
    readonly fullPath: string;
    readonly isDirectory: boolean;
    readonly isFile: boolean;
    readonly name: string;
    getParent(successCallback?: FileSystemEntryCallback, errorCallback?: ErrorCallback): void;
}

declare var FileSystemEntry: {
    prototype: FileSystemEntry;
    new(): FileSystemEntry;
};

interface FileSystemFileEntry extends FileSystemEntry {
    file(successCallback: FileCallback, errorCallback?: ErrorCallback): void;
}

declare var FileSystemFileEntry: {
    prototype: FileSystemFileEntry;
    new(): FileSystemFileEntry;
};

/** Focus-related events like focus, blur, focusin, or focusout. */
interface FocusEvent extends UIEvent {
    readonly relatedTarget: EventTarget | null;
}

declare var FocusEvent: {
    prototype: FocusEvent;
    new(type: string, eventInitDict?: FocusEventInit): FocusEvent;
};

interface FontFace {
    ascentOverride: string;
    descentOverride: string;
    display: string;
    family: string;
    featureSettings: string;
    lineGapOverride: string;
    readonly loaded: Promise<FontFace>;
    readonly status: FontFaceLoadStatus;
    stretch: string;
    style: string;
    unicodeRange: string;
    variant: string;
    variationSettings: string;
    weight: string;
    load(): Promise<FontFace>;
}

declare var FontFace: {
    prototype: FontFace;
    new(family: string, source: string | BinaryData, descriptors?: FontFaceDescriptors): FontFace;
};

interface FontFaceSetEventMap {
    "loading": Event;
    "loadingdone": Event;
    "loadingerror": Event;
}

interface FontFaceSet extends EventTarget {
    onloading: ((this: FontFaceSet, ev: Event) => any) | null;
    onloadingdone: ((this: FontFaceSet, ev: Event) => any) | null;
    onloadingerror: ((this: FontFaceSet, ev: Event) => any) | null;
    readonly ready: Promise<FontFaceSet>;
    readonly status: FontFaceSetLoadStatus;
    check(font: string, text?: string): boolean;
    load(font: string, text?: string): Promise<FontFace[]>;
    forEach(callbackfn: (value: FontFace, key: FontFace, parent: FontFaceSet) => void, thisArg?: any): void;
    addEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var FontFaceSet: {
    prototype: FontFaceSet;
    new(initialFaces: FontFace[]): FontFaceSet;
};

interface FontFaceSetLoadEvent extends Event {
    readonly fontfaces: ReadonlyArray<FontFace>;
}

declare var FontFaceSetLoadEvent: {
    prototype: FontFaceSetLoadEvent;
    new(type: string, eventInitDict?: FontFaceSetLoadEventInit): FontFaceSetLoadEvent;
};

interface FontFaceSource {
    readonly fonts: FontFaceSet;
}

/** Provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method. It uses the same format a form would use if the encoding type were set to "multipart/form-data". */
interface FormData {
    append(name: string, value: string | Blob, fileName?: string): void;
    delete(name: string): void;
    get(name: string): FormDataEntryValue | null;
    getAll(name: string): FormDataEntryValue[];
    has(name: string): boolean;
    set(name: string, value: string | Blob, fileName?: string): void;
    forEach(callbackfn: (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg?: any): void;
}

declare var FormData: {
    prototype: FormData;
    new(form?: HTMLFormElement): FormData;
};

interface FormDataEvent extends Event {
    /** Returns a FormData object representing names and values of elements associated to the target form. Operations on the FormData object will affect form data to be submitted. */
    readonly formData: FormData;
}

declare var FormDataEvent: {
    prototype: FormDataEvent;
    new(type: string, eventInitDict: FormDataEventInit): FormDataEvent;
};

/** A change in volume. It is an AudioNode audio-processing module that causes a given gain to be applied to the input data before its propagation to the output. A GainNode always has exactly one input and one output, both with the same number of channels. */
interface GainNode extends AudioNode {
    readonly gain: AudioParam;
}

declare var GainNode: {
    prototype: GainNode;
    new(context: BaseAudioContext, options?: GainOptions): GainNode;
};

/**
 * This Gamepad API interface defines an individual gamepad or other controller, allowing access to information such as button presses, axis positions, and id.
 * Available only in secure contexts.
 */
interface Gamepad {
    readonly axes: ReadonlyArray<number>;
    readonly buttons: ReadonlyArray<GamepadButton>;
    readonly connected: boolean;
    readonly hapticActuators: ReadonlyArray<GamepadHapticActuator>;
    readonly id: string;
    readonly index: number;
    readonly mapping: GamepadMappingType;
    readonly timestamp: DOMHighResTimeStamp;
}

declare var Gamepad: {
    prototype: Gamepad;
    new(): Gamepad;
};

/**
 * An individual button of a gamepad or other controller, allowing access to the current state of different types of buttons available on the control device.
 * Available only in secure contexts.
 */
interface GamepadButton {
    readonly pressed: boolean;
    readonly touched: boolean;
    readonly value: number;
}

declare var GamepadButton: {
    prototype: GamepadButton;
    new(): GamepadButton;
};

/**
 * This Gamepad API interface contains references to gamepads connected to the system, which is what the gamepad events Window.gamepadconnected and Window.gamepaddisconnected are fired in response to.
 * Available only in secure contexts.
 */
interface GamepadEvent extends Event {
    readonly gamepad: Gamepad;
}

declare var GamepadEvent: {
    prototype: GamepadEvent;
    new(type: string, eventInitDict: GamepadEventInit): GamepadEvent;
};

/** This Gamepad API interface represents hardware in the controller designed to provide haptic feedback to the user (if available), most commonly vibration hardware. */
interface GamepadHapticActuator {
    readonly type: GamepadHapticActuatorType;
}

declare var GamepadHapticActuator: {
    prototype: GamepadHapticActuator;
    new(): GamepadHapticActuator;
};

interface GenericTransformStream {
    readonly readable: ReadableStream;
    readonly writable: WritableStream;
}

/** An object able to programmatically obtain the position of the device. It gives Web content access to the location of the device. This allows a Web site or app to offer customized results based on the user's location. */
interface Geolocation {
    clearWatch(watchId: number): void;
    getCurrentPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback | null, options?: PositionOptions): void;
    watchPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback | null, options?: PositionOptions): number;
}

declare var Geolocation: {
    prototype: Geolocation;
    new(): Geolocation;
};

/** Available only in secure contexts. */
interface GeolocationCoordinates {
    readonly accuracy: number;
    readonly altitude: number | null;
    readonly altitudeAccuracy: number | null;
    readonly heading: number | null;
    readonly latitude: number;
    readonly longitude: number;
    readonly speed: number | null;
}

declare var GeolocationCoordinates: {
    prototype: GeolocationCoordinates;
    new(): GeolocationCoordinates;
};

/** Available only in secure contexts. */
interface GeolocationPosition {
    readonly coords: GeolocationCoordinates;
    readonly timestamp: DOMTimeStamp;
}

declare var GeolocationPosition: {
    prototype: GeolocationPosition;
    new(): GeolocationPosition;
};

interface GeolocationPositionError {
    readonly code: number;
    readonly message: string;
    readonly PERMISSION_DENIED: number;
    readonly POSITION_UNAVAILABLE: number;
    readonly TIMEOUT: number;
}

declare var GeolocationPositionError: {
    prototype: GeolocationPositionError;
    new(): GeolocationPositionError;
    readonly PERMISSION_DENIED: number;
    readonly POSITION_UNAVAILABLE: number;
    readonly TIMEOUT: number;
};

interface GlobalEventHandlersEventMap {
    "abort": UIEvent;
    "animationcancel": AnimationEvent;
    "animationend": AnimationEvent;
    "animationiteration": AnimationEvent;
    "animationstart": AnimationEvent;
    "auxclick": MouseEvent;
    "beforeinput": InputEvent;
    "blur": FocusEvent;
    "canplay": Event;
    "canplaythrough": Event;
    "change": Event;
    "click": MouseEvent;
    "close": Event;
    "compositionend": CompositionEvent;
    "compositionstart": CompositionEvent;
    "compositionupdate": CompositionEvent;
    "contextmenu": MouseEvent;
    "cuechange": Event;
    "dblclick": MouseEvent;
    "drag": DragEvent;
    "dragend": DragEvent;
    "dragenter": DragEvent;
    "dragleave": DragEvent;
    "dragover": DragEvent;
    "dragstart": DragEvent;
    "drop": DragEvent;
    "durationchange": Event;
    "emptied": Event;
    "ended": Event;
    "error": ErrorEvent;
    "focus": FocusEvent;
    "focusin": FocusEvent;
    "focusout": FocusEvent;
    "formdata": FormDataEvent;
    "gotpointercapture": PointerEvent;
    "input": Event;
    "invalid": Event;
    "keydown": KeyboardEvent;
    "keypress": KeyboardEvent;
    "keyup": KeyboardEvent;
    "load": Event;
    "loadeddata": Event;
    "loadedmetadata": Event;
    "loadstart": Event;
    "lostpointercapture": PointerEvent;
    "mousedown": MouseEvent;
    "mouseenter": MouseEvent;
    "mouseleave": MouseEvent;
    "mousemove": MouseEvent;
    "mouseout": MouseEvent;
    "mouseover": MouseEvent;
    "mouseup": MouseEvent;
    "pause": Event;
    "play": Event;
    "playing": Event;
    "pointercancel": PointerEvent;
    "pointerdown": PointerEvent;
    "pointerenter": PointerEvent;
    "pointerleave": PointerEvent;
    "pointermove": PointerEvent;
    "pointerout": PointerEvent;
    "pointerover": PointerEvent;
    "pointerup": PointerEvent;
    "progress": ProgressEvent;
    "ratechange": Event;
    "reset": Event;
    "resize": UIEvent;
    "scroll": Event;
    "securitypolicyviolation": SecurityPolicyViolationEvent;
    "seeked": Event;
    "seeking": Event;
    "select": Event;
    "selectionchange": Event;
    "selectstart": Event;
    "stalled": Event;
    "submit": SubmitEvent;
    "suspend": Event;
    "timeupdate": Event;
    "toggle": Event;
    "touchcancel": TouchEvent;
    "touchend": TouchEvent;
    "touchmove": TouchEvent;
    "touchstart": TouchEvent;
    "transitioncancel": TransitionEvent;
    "transitionend": TransitionEvent;
    "transitionrun": TransitionEvent;
    "transitionstart": TransitionEvent;
    "volumechange": Event;
    "waiting": Event;
    "webkitanimationend": Event;
    "webkitanimationiteration": Event;
    "webkitanimationstart": Event;
    "webkittransitionend": Event;
    "wheel": WheelEvent;
}

interface GlobalEventHandlers {
    /**
     * Fires when the user aborts the download.
     * @param ev The event.
     */
    onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null;
    onanimationcancel: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
    onanimationend: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
    onanimationiteration: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
    onanimationstart: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null;
    onauxclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    /**
     * Fires when the object loses the input focus.
     * @param ev The focus event.
     */
    onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
    /**
     * Occurs when playback is possible, but would require further buffering.
     * @param ev The event.
     */
    oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when the contents of the object or selection have changed.
     * @param ev The event.
     */
    onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when the user clicks the left mouse button on the object
     * @param ev The mouse event.
     */
    onclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when the user clicks the right mouse button in the client area, opening the context menu.
     * @param ev The mouse event.
     */
    oncontextmenu: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when the user double-clicks the object.
     * @param ev The mouse event.
     */
    ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    /**
     * Fires on the source object continuously during a drag operation.
     * @param ev The event.
     */
    ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
    /**
     * Fires on the source object when the user releases the mouse at the close of a drag operation.
     * @param ev The event.
     */
    ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
    /**
     * Fires on the target element when the user drags the object to a valid drop target.
     * @param ev The drag event.
     */
    ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
    /**
     * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.
     * @param ev The drag event.
     */
    ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
    /**
     * Fires on the target element continuously while the user drags the object over a valid drop target.
     * @param ev The event.
     */
    ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
    /**
     * Fires on the source object when the user starts to drag a text selection or selected object.
     * @param ev The event.
     */
    ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
    ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null;
    /**
     * Occurs when the duration attribute is updated.
     * @param ev The event.
     */
    ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the media element is reset to its initial state.
     * @param ev The event.
     */
    onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the end of playback is reached.
     * @param ev The event
     */
    onended: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when an error occurs during object loading.
     * @param ev The event.
     */
    onerror: OnErrorEventHandler;
    /**
     * Fires when the object receives focus.
     * @param ev The event.
     */
    onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null;
    onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null;
    ongotpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when the user presses a key.
     * @param ev The keyboard event
     */
    onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null;
    /**
     * Fires when the user presses an alphanumeric key.
     * @param ev The event.
     * @deprecated
     */
    onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null;
    /**
     * Fires when the user releases a key.
     * @param ev The keyboard event
     */
    onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null;
    /**
     * Fires immediately after the browser loads the object.
     * @param ev The event.
     */
    onload: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when media data is loaded at the current playback position.
     * @param ev The event.
     */
    onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the duration and dimensions of the media have been determined.
     * @param ev The event.
     */
    onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when Internet Explorer begins looking for media data.
     * @param ev The event.
     */
    onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    onlostpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    /**
     * Fires when the user clicks the object with either mouse button.
     * @param ev The mouse event.
     */
    onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    /**
     * Fires when the user moves the mouse over the object.
     * @param ev The mouse event.
     */
    onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    /**
     * Fires when the user moves the mouse pointer outside the boundaries of the object.
     * @param ev The mouse event.
     */
    onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    /**
     * Fires when the user moves the mouse pointer into the object.
     * @param ev The mouse event.
     */
    onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    /**
     * Fires when the user releases a mouse button while the mouse is over the object.
     * @param ev The mouse event.
     */
    onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null;
    /**
     * Occurs when playback is paused.
     * @param ev The event.
     */
    onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the play method is requested.
     * @param ev The event.
     */
    onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the audio or video has started playing.
     * @param ev The event.
     */
    onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    onpointercancel: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    onpointerdown: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    onpointerenter: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    onpointerleave: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    onpointermove: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    onpointerout: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    onpointerover: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null;
    /**
     * Occurs to indicate progress while downloading media data.
     * @param ev The event.
     */
    onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null;
    /**
     * Occurs when the playback rate is increased or decreased.
     * @param ev The event.
     */
    onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when the user resets a form.
     * @param ev The event.
     */
    onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null;
    /**
     * Fires when the user repositions the scroll box in the scroll bar on the object.
     * @param ev The event.
     */
    onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the seek operation ends.
     * @param ev The event.
     */
    onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the current playback position is moved.
     * @param ev The event.
     */
    onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Fires when the current selection changes.
     * @param ev The event.
     */
    onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when the download has stopped.
     * @param ev The event.
     */
    onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null;
    /**
     * Occurs if the load operation has been intentionally halted.
     * @param ev The event.
     */
    onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs to indicate the current playback position.
     * @param ev The event.
     */
    ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    ontoggle: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    ontouchcancel?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
    ontouchend?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
    ontouchmove?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
    ontouchstart?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null | undefined;
    ontransitioncancel: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
    ontransitionend: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
    ontransitionrun: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
    ontransitionstart: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null;
    /**
     * Occurs when the volume is changed, or playback is muted or unmuted.
     * @param ev The event.
     */
    onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /**
     * Occurs when playback stops because the next frame of a video resource is not available.
     * @param ev The event.
     */
    onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /** @deprecated This is a legacy alias of \`onanimationend\`. */
    onwebkitanimationend: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /** @deprecated This is a legacy alias of \`onanimationiteration\`. */
    onwebkitanimationiteration: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /** @deprecated This is a legacy alias of \`onanimationstart\`. */
    onwebkitanimationstart: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    /** @deprecated This is a legacy alias of \`ontransitionend\`. */
    onwebkittransitionend: ((this: GlobalEventHandlers, ev: Event) => any) | null;
    onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null;
    addEventListener<K extends keyof GlobalEventHandlersEventMap>(type: K, listener: (this: GlobalEventHandlers, ev: GlobalEventHandlersEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof GlobalEventHandlersEventMap>(type: K, listener: (this: GlobalEventHandlers, ev: GlobalEventHandlersEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

interface HTMLAllCollection {
    /** Returns the number of elements in the collection. */
    readonly length: number;
    /** Returns the item with index index from the collection (determined by tree order). */
    item(nameOrIndex?: string): HTMLCollection | Element | null;
    /**
     * Returns the item with ID or name name from the collection.
     *
     * If there are multiple matching items, then an HTMLCollection object containing all those elements is returned.
     *
     * Only button, form, iframe, input, map, meta, object, select, and textarea elements can have a name for the purpose of this method; their name is given by the value of their name attribute.
     */
    namedItem(name: string): HTMLCollection | Element | null;
    [index: number]: Element;
}

declare var HTMLAllCollection: {
    prototype: HTMLAllCollection;
    new(): HTMLAllCollection;
};

/** Hyperlink elements and provides special properties and methods (beyond those of the regular HTMLElement object interface that they inherit from) for manipulating the layout and presentation of such elements. */
interface HTMLAnchorElement extends HTMLElement, HTMLHyperlinkElementUtils {
    /**
     * Sets or retrieves the character set used to encode the object.
     * @deprecated
     */
    charset: string;
    /**
     * Sets or retrieves the coordinates of the object.
     * @deprecated
     */
    coords: string;
    download: string;
    /** Sets or retrieves the language code of the object. */
    hreflang: string;
    /**
     * Sets or retrieves the shape of the object.
     * @deprecated
     */
    name: string;
    ping: string;
    referrerPolicy: string;
    /** Sets or retrieves the relationship between the object and the destination of the link. */
    rel: string;
    readonly relList: DOMTokenList;
    /**
     * Sets or retrieves the relationship between the object and the destination of the link.
     * @deprecated
     */
    rev: string;
    /**
     * Sets or retrieves the shape of the object.
     * @deprecated
     */
    shape: string;
    /** Sets or retrieves the window or frame at which to target content. */
    target: string;
    /** Retrieves or sets the text of the object as a string. */
    text: string;
    type: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAnchorElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAnchorElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLAnchorElement: {
    prototype: HTMLAnchorElement;
    new(): HTMLAnchorElement;
};

/** Provides special properties and methods (beyond those of the regular object HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <area> elements. */
interface HTMLAreaElement extends HTMLElement, HTMLHyperlinkElementUtils {
    /** Sets or retrieves a text alternative to the graphic. */
    alt: string;
    /** Sets or retrieves the coordinates of the object. */
    coords: string;
    download: string;
    /**
     * Sets or gets whether clicks in this region cause action.
     * @deprecated
     */
    noHref: boolean;
    ping: string;
    referrerPolicy: string;
    rel: string;
    readonly relList: DOMTokenList;
    /** Sets or retrieves the shape of the object. */
    shape: string;
    /** Sets or retrieves the window or frame at which to target content. */
    target: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLAreaElement: {
    prototype: HTMLAreaElement;
    new(): HTMLAreaElement;
};

/** Provides access to the properties of <audio> elements, as well as methods to manipulate them. It derives from the HTMLMediaElement interface. */
interface HTMLAudioElement extends HTMLMediaElement {
    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLAudioElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLAudioElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLAudioElement: {
    prototype: HTMLAudioElement;
    new(): HTMLAudioElement;
};

/** A HTML line break element (<br>). It inherits from HTMLElement. */
interface HTMLBRElement extends HTMLElement {
    /**
     * Sets or retrieves the side on which floating objects are not to be positioned when any IHTMLBlockElement is inserted into the document.
     * @deprecated
     */
    clear: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLBRElement: {
    prototype: HTMLBRElement;
    new(): HTMLBRElement;
};

/** Contains the base URI\xA0for a document. This object inherits all of the properties and methods as described in the HTMLElement interface. */
interface HTMLBaseElement extends HTMLElement {
    /** Gets or sets the baseline URL on which relative links are based. */
    href: string;
    /** Sets or retrieves the window or frame at which to target content. */
    target: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLBaseElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLBaseElement: {
    prototype: HTMLBaseElement;
    new(): HTMLBaseElement;
};

interface HTMLBodyElementEventMap extends HTMLElementEventMap, WindowEventHandlersEventMap {
    "orientationchange": Event;
}

/** Provides special properties (beyond those inherited from the regular HTMLElement interface) for manipulating <body> elements. */
interface HTMLBodyElement extends HTMLElement, WindowEventHandlers {
    /** @deprecated */
    aLink: string;
    /** @deprecated */
    background: string;
    /** @deprecated */
    bgColor: string;
    /** @deprecated */
    link: string;
    /** @deprecated */
    onorientationchange: ((this: HTMLBodyElement, ev: Event) => any) | null;
    /** @deprecated */
    text: string;
    /** @deprecated */
    vLink: string;
    addEventListener<K extends keyof HTMLBodyElementEventMap>(type: K, listener: (this: HTMLBodyElement, ev: HTMLBodyElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLBodyElementEventMap>(type: K, listener: (this: HTMLBodyElement, ev: HTMLBodyElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLBodyElement: {
    prototype: HTMLBodyElement;
    new(): HTMLBodyElement;
};

/** Provides properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <button> elements. */
interface HTMLButtonElement extends HTMLElement {
    disabled: boolean;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    /** Overrides the action attribute (where the data on a form is sent) on the parent form element. */
    formAction: string;
    /** Used to override the encoding (formEnctype attribute) specified on the form element. */
    formEnctype: string;
    /** Overrides the submit method attribute previously specified on a form element. */
    formMethod: string;
    /** Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option. */
    formNoValidate: boolean;
    /** Overrides the target attribute on a form element. */
    formTarget: string;
    readonly labels: NodeListOf<HTMLLabelElement>;
    /** Sets or retrieves the name of the object. */
    name: string;
    /** Gets the classification and default behavior of the button. */
    type: string;
    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
    readonly validationMessage: string;
    /** Returns a  ValidityState object that represents the validity states of an element. */
    readonly validity: ValidityState;
    /** Sets or retrieves the default or selected value of the control. */
    value: string;
    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
    readonly willValidate: boolean;
    /** Returns whether a form will validate when it is submitted, without having to submit it. */
    checkValidity(): boolean;
    reportValidity(): boolean;
    /**
     * Sets a custom error message that is displayed when a form is submitted.
     * @param error Sets a custom error message that is displayed when a form is submitted.
     */
    setCustomValidity(error: string): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLButtonElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLButtonElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLButtonElement: {
    prototype: HTMLButtonElement;
    new(): HTMLButtonElement;
};

/** Provides properties and methods for manipulating the layout and presentation of <canvas> elements. The HTMLCanvasElement interface also inherits the properties and methods of the HTMLElement interface. */
interface HTMLCanvasElement extends HTMLElement {
    /** Gets or sets the height of a canvas element on a document. */
    height: number;
    /** Gets or sets the width of a canvas element on a document. */
    width: number;
    captureStream(frameRequestRate?: number): MediaStream;
    /**
     * Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.
     * @param contextId The identifier (ID) of the type of canvas to create. Internet Explorer 9 and Internet Explorer 10 support only a 2-D context using canvas.getContext("2d"); IE11 Preview also supports 3-D or WebGL context using canvas.getContext("experimental-webgl");
     */
    getContext(contextId: "2d", options?: CanvasRenderingContext2DSettings): CanvasRenderingContext2D | null;
    getContext(contextId: "bitmaprenderer", options?: ImageBitmapRenderingContextSettings): ImageBitmapRenderingContext | null;
    getContext(contextId: "webgl", options?: WebGLContextAttributes): WebGLRenderingContext | null;
    getContext(contextId: "webgl2", options?: WebGLContextAttributes): WebGL2RenderingContext | null;
    getContext(contextId: string, options?: any): RenderingContext | null;
    toBlob(callback: BlobCallback, type?: string, quality?: any): void;
    /**
     * Returns the content of the current canvas as an image that you can use as a source for another canvas or an HTML element.
     * @param type The standard MIME type for the image format to return. If you do not specify this parameter, the default value is a PNG format image.
     */
    toDataURL(type?: string, quality?: any): string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLCanvasElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLCanvasElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLCanvasElement: {
    prototype: HTMLCanvasElement;
    new(): HTMLCanvasElement;
};

/** A generic collection (array-like object similar to arguments) of elements (in document order) and offers methods and properties for selecting from the list. */
interface HTMLCollectionBase {
    /** Sets or retrieves the number of objects in a collection. */
    readonly length: number;
    /** Retrieves an object from various collections. */
    item(index: number): Element | null;
    [index: number]: Element;
}

interface HTMLCollection extends HTMLCollectionBase {
    /** Retrieves a select object or an object from an options collection. */
    namedItem(name: string): Element | null;
}

declare var HTMLCollection: {
    prototype: HTMLCollection;
    new(): HTMLCollection;
};

interface HTMLCollectionOf<T extends Element> extends HTMLCollectionBase {
    item(index: number): T | null;
    namedItem(name: string): T | null;
    [index: number]: T;
}

/** Provides special properties (beyond those of the regular HTMLElement interface it also has available to it by inheritance) for manipulating definition list (<dl>) elements. */
interface HTMLDListElement extends HTMLElement {
    /** @deprecated */
    compact: boolean;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLDListElement: {
    prototype: HTMLDListElement;
    new(): HTMLDListElement;
};

/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <data> elements. */
interface HTMLDataElement extends HTMLElement {
    value: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLDataElement: {
    prototype: HTMLDataElement;
    new(): HTMLDataElement;
};

/** Provides special properties (beyond the HTMLElement object interface it also has available to it by inheritance) to manipulate <datalist> elements and their content. */
interface HTMLDataListElement extends HTMLElement {
    /** Returns an HTMLCollection of the option elements of the datalist element. */
    readonly options: HTMLCollectionOf<HTMLOptionElement>;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDataListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLDataListElement: {
    prototype: HTMLDataListElement;
    new(): HTMLDataListElement;
};

interface HTMLDetailsElement extends HTMLElement {
    open: boolean;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDetailsElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDetailsElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLDetailsElement: {
    prototype: HTMLDetailsElement;
    new(): HTMLDetailsElement;
};

/** @deprecated this is not available in most browsers */
interface HTMLDialogElement extends HTMLElement {
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDialogElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDialogElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
interface HTMLDirectoryElement extends HTMLElement {
    /** @deprecated */
    compact: boolean;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDirectoryElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDirectoryElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
declare var HTMLDirectoryElement: {
    prototype: HTMLDirectoryElement;
    new(): HTMLDirectoryElement;
};

/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <div> elements. */
interface HTMLDivElement extends HTMLElement {
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLDivElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLDivElement: {
    prototype: HTMLDivElement;
    new(): HTMLDivElement;
};

/** @deprecated use Document */
interface HTMLDocument extends Document {
    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: HTMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: HTMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
declare var HTMLDocument: {
    prototype: HTMLDocument;
    new(): HTMLDocument;
};

interface HTMLElementEventMap extends ElementEventMap, DocumentAndElementEventHandlersEventMap, GlobalEventHandlersEventMap {
}

/** Any HTML element. Some elements directly implement this interface, while others implement it via an interface that inherits it. */
interface HTMLElement extends Element, DocumentAndElementEventHandlers, ElementCSSInlineStyle, ElementContentEditable, GlobalEventHandlers, HTMLOrSVGElement {
    accessKey: string;
    readonly accessKeyLabel: string;
    autocapitalize: string;
    dir: string;
    draggable: boolean;
    hidden: boolean;
    innerText: string;
    lang: string;
    readonly offsetHeight: number;
    readonly offsetLeft: number;
    readonly offsetParent: Element | null;
    readonly offsetTop: number;
    readonly offsetWidth: number;
    outerText: string;
    spellcheck: boolean;
    title: string;
    translate: boolean;
    attachInternals(): ElementInternals;
    click(): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLElement: {
    prototype: HTMLElement;
    new(): HTMLElement;
};

/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <embed> elements. */
interface HTMLEmbedElement extends HTMLElement {
    /** @deprecated */
    align: string;
    /** Sets or retrieves the height of the object. */
    height: string;
    /**
     * Sets or retrieves the name of the object.
     * @deprecated
     */
    name: string;
    /** Sets or retrieves a URL to be loaded by the object. */
    src: string;
    type: string;
    /** Sets or retrieves the width of the object. */
    width: string;
    getSVGDocument(): Document | null;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLEmbedElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLEmbedElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLEmbedElement: {
    prototype: HTMLEmbedElement;
    new(): HTMLEmbedElement;
};

/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <fieldset> elements. */
interface HTMLFieldSetElement extends HTMLElement {
    disabled: boolean;
    /** Returns an HTMLCollection of the form controls in the element. */
    readonly elements: HTMLCollection;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    name: string;
    /** Returns the string "fieldset". */
    readonly type: string;
    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
    readonly validationMessage: string;
    /** Returns a  ValidityState object that represents the validity states of an element. */
    readonly validity: ValidityState;
    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
    readonly willValidate: boolean;
    /** Returns whether a form will validate when it is submitted, without having to submit it. */
    checkValidity(): boolean;
    reportValidity(): boolean;
    /**
     * Sets a custom error message that is displayed when a form is submitted.
     * @param error Sets a custom error message that is displayed when a form is submitted.
     */
    setCustomValidity(error: string): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFieldSetElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFieldSetElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLFieldSetElement: {
    prototype: HTMLFieldSetElement;
    new(): HTMLFieldSetElement;
};

/**
 * Implements the document object model (DOM) representation of the font element. The HTML Font Element <font> defines the font size, font face and color of text.
 * @deprecated
 */
interface HTMLFontElement extends HTMLElement {
    /** @deprecated */
    color: string;
    /**
     * Sets or retrieves the current typeface family.
     * @deprecated
     */
    face: string;
    /** @deprecated */
    size: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFontElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFontElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
declare var HTMLFontElement: {
    prototype: HTMLFontElement;
    new(): HTMLFontElement;
};

/** A collection of HTML form control elements.  */
interface HTMLFormControlsCollection extends HTMLCollectionBase {
    /**
     * Returns the item with ID or name name from the collection.
     *
     * If there are multiple matching items, then a RadioNodeList object containing all those elements is returned.
     */
    namedItem(name: string): RadioNodeList | Element | null;
}

declare var HTMLFormControlsCollection: {
    prototype: HTMLFormControlsCollection;
    new(): HTMLFormControlsCollection;
};

/** A <form> element in the DOM; it allows access to and in some cases modification of aspects of the form, as well as access to its component elements. */
interface HTMLFormElement extends HTMLElement {
    /** Sets or retrieves a list of character encodings for input data that must be accepted by the server processing the form. */
    acceptCharset: string;
    /** Sets or retrieves the URL to which the form content is sent for processing. */
    action: string;
    /** Specifies whether autocomplete is applied to an editable text field. */
    autocomplete: string;
    /** Retrieves a collection, in source order, of all controls in a given form. */
    readonly elements: HTMLFormControlsCollection;
    /** Sets or retrieves the MIME encoding for the form. */
    encoding: string;
    /** Sets or retrieves the encoding type for the form. */
    enctype: string;
    /** Sets or retrieves the number of objects in a collection. */
    readonly length: number;
    /** Sets or retrieves how to send the form data to the server. */
    method: string;
    /** Sets or retrieves the name of the object. */
    name: string;
    /** Designates a form that is not validated when submitted. */
    noValidate: boolean;
    /** Sets or retrieves the window or frame at which to target content. */
    target: string;
    /** Returns whether a form will validate when it is submitted, without having to submit it. */
    checkValidity(): boolean;
    reportValidity(): boolean;
    requestSubmit(submitter?: HTMLElement | null): void;
    /** Fires when the user resets a form. */
    reset(): void;
    /** Fires when a FORM is about to be submitted. */
    submit(): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFormElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFormElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
    [index: number]: Element;
    [name: string]: any;
}

declare var HTMLFormElement: {
    prototype: HTMLFormElement;
    new(): HTMLFormElement;
};

/** @deprecated */
interface HTMLFrameElement extends HTMLElement {
    /**
     * Retrieves the document object of the page or frame.
     * @deprecated
     */
    readonly contentDocument: Document | null;
    /**
     * Retrieves the object of the specified.
     * @deprecated
     */
    readonly contentWindow: WindowProxy | null;
    /**
     * Sets or retrieves whether to display a border for the frame.
     * @deprecated
     */
    frameBorder: string;
    /**
     * Sets or retrieves a URI to a long description of the object.
     * @deprecated
     */
    longDesc: string;
    /**
     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
     * @deprecated
     */
    marginHeight: string;
    /**
     * Sets or retrieves the left and right margin widths before displaying the text in a frame.
     * @deprecated
     */
    marginWidth: string;
    /**
     * Sets or retrieves the frame name.
     * @deprecated
     */
    name: string;
    /**
     * Sets or retrieves whether the user can resize the frame.
     * @deprecated
     */
    noResize: boolean;
    /**
     * Sets or retrieves whether the frame can be scrolled.
     * @deprecated
     */
    scrolling: string;
    /**
     * Sets or retrieves a URL to be loaded by the object.
     * @deprecated
     */
    src: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
declare var HTMLFrameElement: {
    prototype: HTMLFrameElement;
    new(): HTMLFrameElement;
};

interface HTMLFrameSetElementEventMap extends HTMLElementEventMap, WindowEventHandlersEventMap {
}

/**
 * Provides special properties (beyond those of the regular HTMLElement interface they also inherit) for manipulating <frameset> elements.
 * @deprecated
 */
interface HTMLFrameSetElement extends HTMLElement, WindowEventHandlers {
    /**
     * Sets or retrieves the frame widths of the object.
     * @deprecated
     */
    cols: string;
    /**
     * Sets or retrieves the frame heights of the object.
     * @deprecated
     */
    rows: string;
    addEventListener<K extends keyof HTMLFrameSetElementEventMap>(type: K, listener: (this: HTMLFrameSetElement, ev: HTMLFrameSetElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLFrameSetElementEventMap>(type: K, listener: (this: HTMLFrameSetElement, ev: HTMLFrameSetElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
declare var HTMLFrameSetElement: {
    prototype: HTMLFrameSetElement;
    new(): HTMLFrameSetElement;
};

/** Provides special properties (beyond those of the HTMLElement interface it also has available to it by inheritance) for manipulating <hr> elements. */
interface HTMLHRElement extends HTMLElement {
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    /** @deprecated */
    color: string;
    /**
     * Sets or retrieves whether the horizontal rule is drawn with 3-D shading.
     * @deprecated
     */
    noShade: boolean;
    /** @deprecated */
    size: string;
    /**
     * Sets or retrieves the width of the object.
     * @deprecated
     */
    width: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHRElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLHRElement: {
    prototype: HTMLHRElement;
    new(): HTMLHRElement;
};

/** Contains the descriptive information, or metadata, for a document. This object inherits all of the properties and methods described in the HTMLElement interface. */
interface HTMLHeadElement extends HTMLElement {
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLHeadElement: {
    prototype: HTMLHeadElement;
    new(): HTMLHeadElement;
};

/** The different heading elements. It inherits methods and properties from the HTMLElement interface. */
interface HTMLHeadingElement extends HTMLElement {
    /**
     * Sets or retrieves a value that indicates the table alignment.
     * @deprecated
     */
    align: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadingElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHeadingElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLHeadingElement: {
    prototype: HTMLHeadingElement;
    new(): HTMLHeadingElement;
};

/** Serves as the root node for a given HTML document. This object inherits the properties and methods described in the HTMLElement interface. */
interface HTMLHtmlElement extends HTMLElement {
    /**
     * Sets or retrieves the DTD version that governs the current document.
     * @deprecated
     */
    version: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHtmlElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLHtmlElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLHtmlElement: {
    prototype: HTMLHtmlElement;
    new(): HTMLHtmlElement;
};

interface HTMLHyperlinkElementUtils {
    /**
     * Returns the hyperlink's URL's fragment (includes leading "#" if non-empty).
     *
     * Can be set, to change the URL's fragment (ignores leading "#").
     */
    hash: string;
    /**
     * Returns the hyperlink's URL's host and port (if different from the default port for the scheme).
     *
     * Can be set, to change the URL's host and port.
     */
    host: string;
    /**
     * Returns the hyperlink's URL's host.
     *
     * Can be set, to change the URL's host.
     */
    hostname: string;
    /**
     * Returns the hyperlink's URL.
     *
     * Can be set, to change the URL.
     */
    href: string;
    toString(): string;
    /** Returns the hyperlink's URL's origin. */
    readonly origin: string;
    /**
     * Returns the hyperlink's URL's password.
     *
     * Can be set, to change the URL's password.
     */
    password: string;
    /**
     * Returns the hyperlink's URL's path.
     *
     * Can be set, to change the URL's path.
     */
    pathname: string;
    /**
     * Returns the hyperlink's URL's port.
     *
     * Can be set, to change the URL's port.
     */
    port: string;
    /**
     * Returns the hyperlink's URL's scheme.
     *
     * Can be set, to change the URL's scheme.
     */
    protocol: string;
    /**
     * Returns the hyperlink's URL's query (includes leading "?" if non-empty).
     *
     * Can be set, to change the URL's query (ignores leading "?").
     */
    search: string;
    /**
     * Returns the hyperlink's URL's username.
     *
     * Can be set, to change the URL's username.
     */
    username: string;
}

/** Provides special properties and methods (beyond those of the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of inline frame elements. */
interface HTMLIFrameElement extends HTMLElement {
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    allow: string;
    allowFullscreen: boolean;
    /** Retrieves the document object of the page or frame. */
    readonly contentDocument: Document | null;
    /** Retrieves the object of the specified. */
    readonly contentWindow: WindowProxy | null;
    /**
     * Sets or retrieves whether to display a border for the frame.
     * @deprecated
     */
    frameBorder: string;
    /** Sets or retrieves the height of the object. */
    height: string;
    /**
     * Sets or retrieves a URI to a long description of the object.
     * @deprecated
     */
    longDesc: string;
    /**
     * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
     * @deprecated
     */
    marginHeight: string;
    /**
     * Sets or retrieves the left and right margin widths before displaying the text in a frame.
     * @deprecated
     */
    marginWidth: string;
    /** Sets or retrieves the frame name. */
    name: string;
    referrerPolicy: ReferrerPolicy;
    readonly sandbox: DOMTokenList;
    /**
     * Sets or retrieves whether the frame can be scrolled.
     * @deprecated
     */
    scrolling: string;
    /** Sets or retrieves a URL to be loaded by the object. */
    src: string;
    /** Sets or retrives the content of the page that is to contain. */
    srcdoc: string;
    /** Sets or retrieves the width of the object. */
    width: string;
    getSVGDocument(): Document | null;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLIFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLIFrameElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLIFrameElement: {
    prototype: HTMLIFrameElement;
    new(): HTMLIFrameElement;
};

/** Provides special properties and methods for manipulating <img> elements. */
interface HTMLImageElement extends HTMLElement {
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    /** Sets or retrieves a text alternative to the graphic. */
    alt: string;
    /**
     * Specifies the properties of a border drawn around an object.
     * @deprecated
     */
    border: string;
    /** Retrieves whether the object is fully loaded. */
    readonly complete: boolean;
    crossOrigin: string | null;
    readonly currentSrc: string;
    decoding: "async" | "sync" | "auto";
    /** Sets or retrieves the height of the object. */
    height: number;
    /**
     * Sets or retrieves the width of the border to draw around the object.
     * @deprecated
     */
    hspace: number;
    /** Sets or retrieves whether the image is a server-side image map. */
    isMap: boolean;
    loading: string;
    /**
     * Sets or retrieves a Uniform Resource Identifier (URI) to a long description of the object.
     * @deprecated
     */
    longDesc: string;
    /** @deprecated */
    lowsrc: string;
    /**
     * Sets or retrieves the name of the object.
     * @deprecated
     */
    name: string;
    /** The original height of the image resource before sizing. */
    readonly naturalHeight: number;
    /** The original width of the image resource before sizing. */
    readonly naturalWidth: number;
    referrerPolicy: string;
    sizes: string;
    /** The address or URL of the a media resource that is to be considered. */
    src: string;
    srcset: string;
    /** Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map. */
    useMap: string;
    /**
     * Sets or retrieves the vertical margin for the object.
     * @deprecated
     */
    vspace: number;
    /** Sets or retrieves the width of the object. */
    width: number;
    readonly x: number;
    readonly y: number;
    decode(): Promise<void>;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLImageElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLImageElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLImageElement: {
    prototype: HTMLImageElement;
    new(): HTMLImageElement;
};

/** Provides special properties and methods for manipulating the options, layout, and presentation of <input> elements. */
interface HTMLInputElement extends HTMLElement {
    /** Sets or retrieves a comma-separated list of content types. */
    accept: string;
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    /** Sets or retrieves a text alternative to the graphic. */
    alt: string;
    /** Specifies whether autocomplete is applied to an editable text field. */
    autocomplete: string;
    capture: string;
    /** Sets or retrieves the state of the check box or radio button. */
    checked: boolean;
    /** Sets or retrieves the state of the check box or radio button. */
    defaultChecked: boolean;
    /** Sets or retrieves the initial contents of the object. */
    defaultValue: string;
    dirName: string;
    disabled: boolean;
    /** Returns a FileList object on a file type input object. */
    files: FileList | null;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    /** Overrides the action attribute (where the data on a form is sent) on the parent form element. */
    formAction: string;
    /** Used to override the encoding (formEnctype attribute) specified on the form element. */
    formEnctype: string;
    /** Overrides the submit method attribute previously specified on a form element. */
    formMethod: string;
    /** Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option. */
    formNoValidate: boolean;
    /** Overrides the target attribute on a form element. */
    formTarget: string;
    /** Sets or retrieves the height of the object. */
    height: number;
    /** When set, overrides the rendering of checkbox controls so that the current value is not visible. */
    indeterminate: boolean;
    readonly labels: NodeListOf<HTMLLabelElement> | null;
    /** Specifies the ID of a pre-defined datalist of options for an input element. */
    readonly list: HTMLElement | null;
    /** Defines the maximum acceptable value for an input element with type="number".When used with the min and step attributes, lets you control the range and increment (such as only even numbers) that the user can enter into an input field. */
    max: string;
    /** Sets or retrieves the maximum number of characters that the user can enter in a text control. */
    maxLength: number;
    /** Defines the minimum acceptable value for an input element with type="number". When used with the max and step attributes, lets you control the range and increment (such as even numbers only) that the user can enter into an input field. */
    min: string;
    minLength: number;
    /** Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list. */
    multiple: boolean;
    /** Sets or retrieves the name of the object. */
    name: string;
    /** Gets or sets a string containing a regular expression that the user's input must match. */
    pattern: string;
    /** Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field. */
    placeholder: string;
    readOnly: boolean;
    /** When present, marks an element that can't be submitted without a value. */
    required: boolean;
    selectionDirection: "forward" | "backward" | "none" | null;
    /** Gets or sets the end position or offset of a text selection. */
    selectionEnd: number | null;
    /** Gets or sets the starting position or offset of a text selection. */
    selectionStart: number | null;
    size: number;
    /** The address or URL of the a media resource that is to be considered. */
    src: string;
    /** Defines an increment or jump between values that you want to allow the user to enter. When used with the max and min attributes, lets you control the range and increment (for example, allow only even numbers) that the user can enter into an input field. */
    step: string;
    /** Returns the content type of the object. */
    type: string;
    /**
     * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
     * @deprecated
     */
    useMap: string;
    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
    readonly validationMessage: string;
    /** Returns a  ValidityState object that represents the validity states of an element. */
    readonly validity: ValidityState;
    /** Returns the value of the data at the cursor's current position. */
    value: string;
    /** Returns a Date object representing the form control's value, if applicable; otherwise, returns null. Can be set, to change the value. Throws an "InvalidStateError" DOMException if the control isn't date- or time-based. */
    valueAsDate: Date | null;
    /** Returns the input field value as a number. */
    valueAsNumber: number;
    readonly webkitEntries: ReadonlyArray<FileSystemEntry>;
    webkitdirectory: boolean;
    /** Sets or retrieves the width of the object. */
    width: number;
    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
    readonly willValidate: boolean;
    /** Returns whether a form will validate when it is submitted, without having to submit it. */
    checkValidity(): boolean;
    reportValidity(): boolean;
    /** Makes the selection equal to the current object. */
    select(): void;
    /**
     * Sets a custom error message that is displayed when a form is submitted.
     * @param error Sets a custom error message that is displayed when a form is submitted.
     */
    setCustomValidity(error: string): void;
    setRangeText(replacement: string): void;
    setRangeText(replacement: string, start: number, end: number, selectionMode?: SelectionMode): void;
    /**
     * Sets the start and end positions of a selection in a text field.
     * @param start The offset into the text field for the start of the selection.
     * @param end The offset into the text field for the end of the selection.
     * @param direction The direction in which the selection is performed.
     */
    setSelectionRange(start: number | null, end: number | null, direction?: "forward" | "backward" | "none"): void;
    /**
     * Decrements a range input control's value by the value given by the Step attribute. If the optional parameter is used, it will decrement the input control's step value multiplied by the parameter's value.
     * @param n Value to decrement the value by.
     */
    stepDown(n?: number): void;
    /**
     * Increments a range input control's value by the value given by the Step attribute. If the optional parameter is used, will increment the input control's value by that value.
     * @param n Value to increment the value by.
     */
    stepUp(n?: number): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLInputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLInputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLInputElement: {
    prototype: HTMLInputElement;
    new(): HTMLInputElement;
};

/** Exposes specific properties and methods (beyond those defined by regular HTMLElement interface it also has available to it by inheritance) for manipulating list elements. */
interface HTMLLIElement extends HTMLElement {
    /** @deprecated */
    type: string;
    /** Sets or retrieves the value of a list item. */
    value: number;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLIElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLIElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLLIElement: {
    prototype: HTMLLIElement;
    new(): HTMLLIElement;
};

/** Gives access to properties specific to <label> elements. It inherits methods and properties from the base HTMLElement interface. */
interface HTMLLabelElement extends HTMLElement {
    /** Returns the form control that is associated with this element. */
    readonly control: HTMLElement | null;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    /** Sets or retrieves the object to which the given label object is assigned. */
    htmlFor: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLabelElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLabelElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLLabelElement: {
    prototype: HTMLLabelElement;
    new(): HTMLLabelElement;
};

/** The HTMLLegendElement is an interface allowing to access properties of the <legend> elements. It inherits properties and methods from the HTMLElement interface. */
interface HTMLLegendElement extends HTMLElement {
    /** @deprecated */
    align: string;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLegendElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLegendElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLLegendElement: {
    prototype: HTMLLegendElement;
    new(): HTMLLegendElement;
};

/** Reference information for external resources and the relationship of those resources to a document and vice-versa. This object inherits all of the properties and methods of the HTMLElement interface. */
interface HTMLLinkElement extends HTMLElement, LinkStyle {
    as: string;
    /**
     * Sets or retrieves the character set used to encode the object.
     * @deprecated
     */
    charset: string;
    crossOrigin: string | null;
    disabled: boolean;
    /** Sets or retrieves a destination URL or an anchor point. */
    href: string;
    /** Sets or retrieves the language code of the object. */
    hreflang: string;
    imageSizes: string;
    imageSrcset: string;
    integrity: string;
    /** Sets or retrieves the media type. */
    media: string;
    referrerPolicy: string;
    /** Sets or retrieves the relationship between the object and the destination of the link. */
    rel: string;
    readonly relList: DOMTokenList;
    /**
     * Sets or retrieves the relationship between the object and the destination of the link.
     * @deprecated
     */
    rev: string;
    readonly sizes: DOMTokenList;
    /**
     * Sets or retrieves the window or frame at which to target content.
     * @deprecated
     */
    target: string;
    /** Sets or retrieves the MIME type of the object. */
    type: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLinkElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLLinkElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLLinkElement: {
    prototype: HTMLLinkElement;
    new(): HTMLLinkElement;
};

/** Provides special properties and methods (beyond those of the regular object HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of map elements. */
interface HTMLMapElement extends HTMLElement {
    /** Retrieves a collection of the area objects defined for the given map object. */
    readonly areas: HTMLCollection;
    /** Sets or retrieves the name of the object. */
    name: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMapElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMapElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLMapElement: {
    prototype: HTMLMapElement;
    new(): HTMLMapElement;
};

/**
 * Provides methods to manipulate <marquee> elements.
 * @deprecated
 */
interface HTMLMarqueeElement extends HTMLElement {
    /** @deprecated */
    behavior: string;
    /** @deprecated */
    bgColor: string;
    /** @deprecated */
    direction: string;
    /** @deprecated */
    height: string;
    /** @deprecated */
    hspace: number;
    /** @deprecated */
    loop: number;
    /** @deprecated */
    scrollAmount: number;
    /** @deprecated */
    scrollDelay: number;
    /** @deprecated */
    trueSpeed: boolean;
    /** @deprecated */
    vspace: number;
    /** @deprecated */
    width: string;
    /** @deprecated */
    start(): void;
    /** @deprecated */
    stop(): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMarqueeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMarqueeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
declare var HTMLMarqueeElement: {
    prototype: HTMLMarqueeElement;
    new(): HTMLMarqueeElement;
};

interface HTMLMediaElementEventMap extends HTMLElementEventMap {
    "encrypted": MediaEncryptedEvent;
    "waitingforkey": Event;
}

/** Adds to HTMLElement the properties and methods needed to support basic media-related capabilities\xA0that are\xA0common to audio and video. */
interface HTMLMediaElement extends HTMLElement {
    /** Gets or sets a value that indicates whether to start playing the media automatically. */
    autoplay: boolean;
    /** Gets a collection of buffered time ranges. */
    readonly buffered: TimeRanges;
    /** Gets or sets a flag that indicates whether the client provides a set of controls for the media (in case the developer does not include controls for the player). */
    controls: boolean;
    crossOrigin: string | null;
    /** Gets the address or URL of the current media resource that is selected by IHTMLMediaElement. */
    readonly currentSrc: string;
    /** Gets or sets the current playback position, in seconds. */
    currentTime: number;
    defaultMuted: boolean;
    /** Gets or sets the default playback rate when the user is not using fast forward or reverse for a video or audio resource. */
    defaultPlaybackRate: number;
    disableRemotePlayback: boolean;
    /** Returns the duration in seconds of the current media resource. A NaN value is returned if duration is not available, or Infinity if the media resource is streaming. */
    readonly duration: number;
    /** Gets information about whether the playback has ended or not. */
    readonly ended: boolean;
    /** Returns an object representing the current error state of the audio or video element. */
    readonly error: MediaError | null;
    /** Gets or sets a flag to specify whether playback should restart after it completes. */
    loop: boolean;
    /** Available only in secure contexts. */
    readonly mediaKeys: MediaKeys | null;
    /** Gets or sets a flag that indicates whether the audio (either audio or the audio track on video media) is muted. */
    muted: boolean;
    /** Gets the current network activity for the element. */
    readonly networkState: number;
    onencrypted: ((this: HTMLMediaElement, ev: MediaEncryptedEvent) => any) | null;
    onwaitingforkey: ((this: HTMLMediaElement, ev: Event) => any) | null;
    /** Gets a flag that specifies whether playback is paused. */
    readonly paused: boolean;
    /** Gets or sets the current rate of speed for the media resource to play. This speed is expressed as a multiple of the normal speed of the media resource. */
    playbackRate: number;
    /** Gets TimeRanges for the current media resource that has been played. */
    readonly played: TimeRanges;
    /** Gets or sets a value indicating what data should be preloaded, if any. */
    preload: "none" | "metadata" | "auto" | "";
    readonly readyState: number;
    readonly remote: RemotePlayback;
    /** Returns a TimeRanges object that represents the ranges of the current media resource that can be seeked. */
    readonly seekable: TimeRanges;
    /** Gets a flag that indicates whether the client is currently moving to a new playback position in the media resource. */
    readonly seeking: boolean;
    /** The address or URL of the a media resource that is to be considered. */
    src: string;
    srcObject: MediaProvider | null;
    readonly textTracks: TextTrackList;
    /** Gets or sets the volume level for audio portions of the media element. */
    volume: number;
    addTextTrack(kind: TextTrackKind, label?: string, language?: string): TextTrack;
    /** Returns a string that specifies whether the client can play a given media resource type. */
    canPlayType(type: string): CanPlayTypeResult;
    fastSeek(time: number): void;
    /** Resets the audio or video object and loads a new media resource. */
    load(): void;
    /** Pauses the current playback and sets paused to TRUE. This can be used to test whether the media is playing or paused. You can also use the pause or play events to tell whether the media is playing or not. */
    pause(): void;
    /** Loads and starts playback of a media resource. */
    play(): Promise<void>;
    /** Available only in secure contexts. */
    setMediaKeys(mediaKeys: MediaKeys | null): Promise<void>;
    readonly HAVE_CURRENT_DATA: number;
    readonly HAVE_ENOUGH_DATA: number;
    readonly HAVE_FUTURE_DATA: number;
    readonly HAVE_METADATA: number;
    readonly HAVE_NOTHING: number;
    readonly NETWORK_EMPTY: number;
    readonly NETWORK_IDLE: number;
    readonly NETWORK_LOADING: number;
    readonly NETWORK_NO_SOURCE: number;
    addEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLMediaElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLMediaElementEventMap>(type: K, listener: (this: HTMLMediaElement, ev: HTMLMediaElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLMediaElement: {
    prototype: HTMLMediaElement;
    new(): HTMLMediaElement;
    readonly HAVE_CURRENT_DATA: number;
    readonly HAVE_ENOUGH_DATA: number;
    readonly HAVE_FUTURE_DATA: number;
    readonly HAVE_METADATA: number;
    readonly HAVE_NOTHING: number;
    readonly NETWORK_EMPTY: number;
    readonly NETWORK_IDLE: number;
    readonly NETWORK_LOADING: number;
    readonly NETWORK_NO_SOURCE: number;
};

interface HTMLMenuElement extends HTMLElement {
    /** @deprecated */
    compact: boolean;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMenuElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMenuElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLMenuElement: {
    prototype: HTMLMenuElement;
    new(): HTMLMenuElement;
};

/** Contains descriptive metadata about a document. It\xA0inherits all of the properties and methods described in the HTMLElement interface. */
interface HTMLMetaElement extends HTMLElement {
    /** Gets or sets meta-information to associate with httpEquiv or name. */
    content: string;
    /** Gets or sets information used to bind the value of a content attribute of a meta element to an HTTP response header. */
    httpEquiv: string;
    /** Sets or retrieves the value specified in the content attribute of the meta object. */
    name: string;
    /**
     * Sets or retrieves a scheme to be used in interpreting the value of a property specified for the object.
     * @deprecated
     */
    scheme: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMetaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMetaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLMetaElement: {
    prototype: HTMLMetaElement;
    new(): HTMLMetaElement;
};

/** The HTML <meter> elements expose the HTMLMeterElement interface, which provides special properties and methods (beyond the HTMLElement object interface they also have available to them by inheritance) for manipulating the layout and presentation of <meter> elements. */
interface HTMLMeterElement extends HTMLElement {
    high: number;
    readonly labels: NodeListOf<HTMLLabelElement>;
    low: number;
    max: number;
    min: number;
    optimum: number;
    value: number;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMeterElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLMeterElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLMeterElement: {
    prototype: HTMLMeterElement;
    new(): HTMLMeterElement;
};

/** Provides special properties (beyond the regular methods and properties available through the HTMLElement interface they also have available to them by inheritance) for manipulating modification elements, that is <del> and <ins>. */
interface HTMLModElement extends HTMLElement {
    /** Sets or retrieves reference information about the object. */
    cite: string;
    /** Sets or retrieves the date and time of a modification to the object. */
    dateTime: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLModElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLModElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLModElement: {
    prototype: HTMLModElement;
    new(): HTMLModElement;
};

/** Provides special properties (beyond those defined on the regular HTMLElement interface it also has available to it by inheritance) for manipulating ordered list elements. */
interface HTMLOListElement extends HTMLElement {
    /** @deprecated */
    compact: boolean;
    reversed: boolean;
    /** The starting number. */
    start: number;
    type: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLOListElement: {
    prototype: HTMLOListElement;
    new(): HTMLOListElement;
};

/** Provides special properties and methods (beyond those on the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <object> element, representing external resources. */
interface HTMLObjectElement extends HTMLElement {
    /** @deprecated */
    align: string;
    /**
     * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
     * @deprecated
     */
    archive: string;
    /** @deprecated */
    border: string;
    /**
     * Sets or retrieves the URL of the file containing the compiled Java class.
     * @deprecated
     */
    code: string;
    /**
     * Sets or retrieves the URL of the component.
     * @deprecated
     */
    codeBase: string;
    /**
     * Sets or retrieves the Internet media type for the code associated with the object.
     * @deprecated
     */
    codeType: string;
    /** Retrieves the document object of the page or frame. */
    readonly contentDocument: Document | null;
    readonly contentWindow: WindowProxy | null;
    /** Sets or retrieves the URL that references the data of the object. */
    data: string;
    /** @deprecated */
    declare: boolean;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    /** Sets or retrieves the height of the object. */
    height: string;
    /** @deprecated */
    hspace: number;
    /** Sets or retrieves the name of the object. */
    name: string;
    /**
     * Sets or retrieves a message to be displayed while an object is loading.
     * @deprecated
     */
    standby: string;
    /** Sets or retrieves the MIME type of the object. */
    type: string;
    /** Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map. */
    useMap: string;
    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
    readonly validationMessage: string;
    /** Returns a  ValidityState object that represents the validity states of an element. */
    readonly validity: ValidityState;
    /** @deprecated */
    vspace: number;
    /** Sets or retrieves the width of the object. */
    width: string;
    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
    readonly willValidate: boolean;
    /** Returns whether a form will validate when it is submitted, without having to submit it. */
    checkValidity(): boolean;
    getSVGDocument(): Document | null;
    reportValidity(): boolean;
    /**
     * Sets a custom error message that is displayed when a form is submitted.
     * @param error Sets a custom error message that is displayed when a form is submitted.
     */
    setCustomValidity(error: string): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLObjectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLObjectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLObjectElement: {
    prototype: HTMLObjectElement;
    new(): HTMLObjectElement;
};

/** Provides special properties and methods (beyond the regular HTMLElement object interface they also have available to them by inheritance) for manipulating the layout and presentation of <optgroup> elements. */
interface HTMLOptGroupElement extends HTMLElement {
    disabled: boolean;
    /** Sets or retrieves a value that you can use to implement your own label functionality for the object. */
    label: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptGroupElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptGroupElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLOptGroupElement: {
    prototype: HTMLOptGroupElement;
    new(): HTMLOptGroupElement;
};

/** <option> elements and inherits all classes and methods of the HTMLElement interface. */
interface HTMLOptionElement extends HTMLElement {
    /** Sets or retrieves the status of an option. */
    defaultSelected: boolean;
    disabled: boolean;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    /** Sets or retrieves the ordinal position of an option in a list box. */
    readonly index: number;
    /** Sets or retrieves a value that you can use to implement your own label functionality for the object. */
    label: string;
    /** Sets or retrieves whether the option in the list box is the default item. */
    selected: boolean;
    /** Sets or retrieves the text string specified by the option tag. */
    text: string;
    /** Sets or retrieves the value which is returned to the server when the form control is submitted. */
    value: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLOptionElement: {
    prototype: HTMLOptionElement;
    new(): HTMLOptionElement;
};

/** HTMLOptionsCollection is an interface representing a collection of HTML option elements (in document order) and offers methods and properties for traversing the list as well as optionally altering its items. This type is returned solely by the "options" property of select. */
interface HTMLOptionsCollection extends HTMLCollectionOf<HTMLOptionElement> {
    /**
     * Returns the number of elements in the collection.
     *
     * When set to a smaller number, truncates the number of option elements in the corresponding container.
     *
     * When set to a greater number, adds new blank option elements to that container.
     */
    length: number;
    /**
     * Returns the index of the first selected item, if any, or \u22121 if there is no selected item.
     *
     * Can be set, to change the selection.
     */
    selectedIndex: number;
    /**
     * Inserts element before the node given by before.
     *
     * The before argument can be a number, in which case element is inserted before the item with that number, or an element from the collection, in which case element is inserted before that element.
     *
     * If before is omitted, null, or a number out of range, then element will be added at the end of the list.
     *
     * This method will throw a "HierarchyRequestError" DOMException if element is an ancestor of the element into which it is to be inserted.
     */
    add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number | null): void;
    /** Removes the item with index index from the collection. */
    remove(index: number): void;
}

declare var HTMLOptionsCollection: {
    prototype: HTMLOptionsCollection;
    new(): HTMLOptionsCollection;
};

interface HTMLOrSVGElement {
    autofocus: boolean;
    readonly dataset: DOMStringMap;
    nonce?: string;
    tabIndex: number;
    blur(): void;
    focus(options?: FocusOptions): void;
}

/** Provides properties and methods (beyond those inherited from HTMLElement) for manipulating the layout and presentation of <output> elements. */
interface HTMLOutputElement extends HTMLElement {
    defaultValue: string;
    readonly form: HTMLFormElement | null;
    readonly htmlFor: DOMTokenList;
    readonly labels: NodeListOf<HTMLLabelElement>;
    name: string;
    /** Returns the string "output". */
    readonly type: string;
    readonly validationMessage: string;
    readonly validity: ValidityState;
    /**
     * Returns the element's current value.
     *
     * Can be set, to change the value.
     */
    value: string;
    readonly willValidate: boolean;
    checkValidity(): boolean;
    reportValidity(): boolean;
    setCustomValidity(error: string): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOutputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLOutputElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLOutputElement: {
    prototype: HTMLOutputElement;
    new(): HTMLOutputElement;
};

/** Provides special properties (beyond those of the regular HTMLElement object interface it inherits) for manipulating <p> elements. */
interface HTMLParagraphElement extends HTMLElement {
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParagraphElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParagraphElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLParagraphElement: {
    prototype: HTMLParagraphElement;
    new(): HTMLParagraphElement;
};

/** Provides special properties (beyond those of the regular HTMLElement object interface it inherits) for manipulating <param> elements, representing a pair of a key and a value that acts as a parameter for an <object> element. */
interface HTMLParamElement extends HTMLElement {
    /** Sets or retrieves the name of an input parameter for an element. */
    name: string;
    /**
     * Sets or retrieves the content type of the resource designated by the value attribute.
     * @deprecated
     */
    type: string;
    /** Sets or retrieves the value of an input parameter for an element. */
    value: string;
    /**
     * Sets or retrieves the data type of the value attribute.
     * @deprecated
     */
    valueType: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParamElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLParamElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLParamElement: {
    prototype: HTMLParamElement;
    new(): HTMLParamElement;
};

/** A <picture> HTML element. It doesn't implement specific properties or methods. */
interface HTMLPictureElement extends HTMLElement {
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPictureElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPictureElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLPictureElement: {
    prototype: HTMLPictureElement;
    new(): HTMLPictureElement;
};

/** Exposes specific properties and methods (beyond those of the HTMLElement interface it also has available to it by inheritance) for manipulating a block of preformatted text (<pre>). */
interface HTMLPreElement extends HTMLElement {
    /**
     * Sets or gets a value that you can use to implement your own width functionality for the object.
     * @deprecated
     */
    width: number;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPreElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLPreElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLPreElement: {
    prototype: HTMLPreElement;
    new(): HTMLPreElement;
};

/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of <progress> elements. */
interface HTMLProgressElement extends HTMLElement {
    readonly labels: NodeListOf<HTMLLabelElement>;
    /** Defines the maximum, or "done" value for a progress element. */
    max: number;
    /** Returns the quotient of value/max when the value attribute is set (determinate progress bar), or -1 when the value attribute is missing (indeterminate progress bar). */
    readonly position: number;
    /** Sets or gets the current value of a progress element. The value must be a non-negative number between 0 and the max value. */
    value: number;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLProgressElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLProgressElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLProgressElement: {
    prototype: HTMLProgressElement;
    new(): HTMLProgressElement;
};

/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating quoting elements, like <blockquote> and <q>, but not the <cite> element. */
interface HTMLQuoteElement extends HTMLElement {
    /** Sets or retrieves reference information about the object. */
    cite: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLQuoteElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLQuoteElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLQuoteElement: {
    prototype: HTMLQuoteElement;
    new(): HTMLQuoteElement;
};

/** HTML <script> elements expose the HTMLScriptElement interface, which provides special properties and methods for manipulating the behavior and execution of <script> elements (beyond the inherited HTMLElement interface). */
interface HTMLScriptElement extends HTMLElement {
    async: boolean;
    /**
     * Sets or retrieves the character set used to encode the object.
     * @deprecated
     */
    charset: string;
    crossOrigin: string | null;
    /** Sets or retrieves the status of the script. */
    defer: boolean;
    /**
     * Sets or retrieves the event for which the script is written.
     * @deprecated
     */
    event: string;
    /**
     * Sets or retrieves the object that is bound to the event script.
     * @deprecated
     */
    htmlFor: string;
    integrity: string;
    noModule: boolean;
    referrerPolicy: string;
    /** Retrieves the URL to an external file that contains the source code or data. */
    src: string;
    /** Retrieves or sets the text of the object as a string. */
    text: string;
    /** Sets or retrieves the MIME type for the associated scripting engine. */
    type: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLScriptElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLScriptElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLScriptElement: {
    prototype: HTMLScriptElement;
    new(): HTMLScriptElement;
};

/** A <select> HTML Element. These elements also share all of the properties and methods of other HTML elements via the HTMLElement interface. */
interface HTMLSelectElement extends HTMLElement {
    autocomplete: string;
    disabled: boolean;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    readonly labels: NodeListOf<HTMLLabelElement>;
    /** Sets or retrieves the number of objects in a collection. */
    length: number;
    /** Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list. */
    multiple: boolean;
    /** Sets or retrieves the name of the object. */
    name: string;
    /** Returns an HTMLOptionsCollection of the list of options. */
    readonly options: HTMLOptionsCollection;
    /** When present, marks an element that can't be submitted without a value. */
    required: boolean;
    /** Sets or retrieves the index of the selected option in a select object. */
    selectedIndex: number;
    readonly selectedOptions: HTMLCollectionOf<HTMLOptionElement>;
    /** Sets or retrieves the number of rows in the list box. */
    size: number;
    /** Retrieves the type of select control based on the value of the MULTIPLE attribute. */
    readonly type: string;
    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
    readonly validationMessage: string;
    /** Returns a  ValidityState object that represents the validity states of an element. */
    readonly validity: ValidityState;
    /** Sets or retrieves the value which is returned to the server when the form control is submitted. */
    value: string;
    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
    readonly willValidate: boolean;
    /**
     * Adds an element to the areas, controlRange, or options collection.
     * @param element Variant of type Number that specifies the index position in the collection where the element is placed. If no value is given, the method places the element at the end of the collection.
     * @param before Variant of type Object that specifies an element to insert before, or null to append the object to the collection.
     */
    add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number | null): void;
    /** Returns whether a form will validate when it is submitted, without having to submit it. */
    checkValidity(): boolean;
    /**
     * Retrieves a select object or an object from an options collection.
     * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is an integer, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
     * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
     */
    item(index: number): HTMLOptionElement | null;
    /**
     * Retrieves a select object or an object from an options collection.
     * @param namedItem A String that specifies the name or id property of the object to retrieve. A collection is returned if more than one match is made.
     */
    namedItem(name: string): HTMLOptionElement | null;
    /**
     * Removes an element from the collection.
     * @param index Number that specifies the zero-based index of the element to remove from the collection.
     */
    remove(): void;
    remove(index: number): void;
    reportValidity(): boolean;
    /**
     * Sets a custom error message that is displayed when a form is submitted.
     * @param error Sets a custom error message that is displayed when a form is submitted.
     */
    setCustomValidity(error: string): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSelectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSelectElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
    [name: number]: HTMLOptionElement | HTMLOptGroupElement;
}

declare var HTMLSelectElement: {
    prototype: HTMLSelectElement;
    new(): HTMLSelectElement;
};

interface HTMLSlotElement extends HTMLElement {
    name: string;
    assign(...nodes: (Element | Text)[]): void;
    assignedElements(options?: AssignedNodesOptions): Element[];
    assignedNodes(options?: AssignedNodesOptions): Node[];
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSlotElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSlotElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLSlotElement: {
    prototype: HTMLSlotElement;
    new(): HTMLSlotElement;
};

/** Provides special properties (beyond the regular HTMLElement object interface it also has available to it by inheritance) for manipulating <source> elements. */
interface HTMLSourceElement extends HTMLElement {
    /** Gets or sets the intended media type of the media source. */
    media: string;
    sizes: string;
    /** The address or URL of the a media resource that is to be considered. */
    src: string;
    srcset: string;
    /** Gets or sets the MIME type of a media resource. */
    type: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSourceElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSourceElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLSourceElement: {
    prototype: HTMLSourceElement;
    new(): HTMLSourceElement;
};

/** A <span> element and derives from the HTMLElement interface, but without implementing any additional properties or methods. */
interface HTMLSpanElement extends HTMLElement {
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSpanElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLSpanElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLSpanElement: {
    prototype: HTMLSpanElement;
    new(): HTMLSpanElement;
};

/** A <style> element. It inherits properties and methods from its parent, HTMLElement, and from LinkStyle. */
interface HTMLStyleElement extends HTMLElement, LinkStyle {
    /** Sets or retrieves the media type. */
    media: string;
    /**
     * Retrieves the CSS language in which the style sheet is written.
     * @deprecated
     */
    type: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLStyleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLStyleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLStyleElement: {
    prototype: HTMLStyleElement;
    new(): HTMLStyleElement;
};

/** Special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating table caption elements. */
interface HTMLTableCaptionElement extends HTMLElement {
    /**
     * Sets or retrieves the alignment of the caption or legend.
     * @deprecated
     */
    align: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCaptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCaptionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTableCaptionElement: {
    prototype: HTMLTableCaptionElement;
    new(): HTMLTableCaptionElement;
};

/** Provides special properties and methods (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of table cells, either header or data cells, in an HTML document. */
interface HTMLTableCellElement extends HTMLElement {
    /** Sets or retrieves abbreviated text for the object. */
    abbr: string;
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    /**
     * Sets or retrieves a comma-delimited list of conceptual categories associated with the object.
     * @deprecated
     */
    axis: string;
    /** @deprecated */
    bgColor: string;
    /** Retrieves the position of the object in the cells collection of a row. */
    readonly cellIndex: number;
    /** @deprecated */
    ch: string;
    /** @deprecated */
    chOff: string;
    /** Sets or retrieves the number columns in the table that the object should span. */
    colSpan: number;
    /** Sets or retrieves a list of header cells that provide information for the object. */
    headers: string;
    /**
     * Sets or retrieves the height of the object.
     * @deprecated
     */
    height: string;
    /**
     * Sets or retrieves whether the browser automatically performs wordwrap.
     * @deprecated
     */
    noWrap: boolean;
    /** Sets or retrieves how many rows in a table the cell should span. */
    rowSpan: number;
    /** Sets or retrieves the group of cells in a table to which the object's information applies. */
    scope: string;
    /** @deprecated */
    vAlign: string;
    /**
     * Sets or retrieves the width of the object.
     * @deprecated
     */
    width: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTableCellElement: {
    prototype: HTMLTableCellElement;
    new(): HTMLTableCellElement;
};

/** Provides special properties (beyond the HTMLElement interface it also has available to it inheritance) for manipulating single or grouped table column elements. */
interface HTMLTableColElement extends HTMLElement {
    /**
     * Sets or retrieves the alignment of the object relative to the display or table.
     * @deprecated
     */
    align: string;
    /** @deprecated */
    ch: string;
    /** @deprecated */
    chOff: string;
    /** Sets or retrieves the number of columns in the group. */
    span: number;
    /** @deprecated */
    vAlign: string;
    /**
     * Sets or retrieves the width of the object.
     * @deprecated
     */
    width: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableColElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableColElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTableColElement: {
    prototype: HTMLTableColElement;
    new(): HTMLTableColElement;
};

/** @deprecated prefer HTMLTableCellElement */
interface HTMLTableDataCellElement extends HTMLTableCellElement {
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableDataCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableDataCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** Provides special properties and methods (beyond the regular HTMLElement object interface it also has available to it by inheritance) for manipulating the layout and presentation of tables in an HTML document. */
interface HTMLTableElement extends HTMLElement {
    /**
     * Sets or retrieves a value that indicates the table alignment.
     * @deprecated
     */
    align: string;
    /** @deprecated */
    bgColor: string;
    /**
     * Sets or retrieves the width of the border to draw around the object.
     * @deprecated
     */
    border: string;
    /** Retrieves the caption object of a table. */
    caption: HTMLTableCaptionElement | null;
    /**
     * Sets or retrieves the amount of space between the border of the cell and the content of the cell.
     * @deprecated
     */
    cellPadding: string;
    /**
     * Sets or retrieves the amount of space between cells in a table.
     * @deprecated
     */
    cellSpacing: string;
    /**
     * Sets or retrieves the way the border frame around the table is displayed.
     * @deprecated
     */
    frame: string;
    /** Sets or retrieves the number of horizontal rows contained in the object. */
    readonly rows: HTMLCollectionOf<HTMLTableRowElement>;
    /**
     * Sets or retrieves which dividing lines (inner borders) are displayed.
     * @deprecated
     */
    rules: string;
    /**
     * Sets or retrieves a description and/or structure of the object.
     * @deprecated
     */
    summary: string;
    /** Retrieves a collection of all tBody objects in the table. Objects in this collection are in source order. */
    readonly tBodies: HTMLCollectionOf<HTMLTableSectionElement>;
    /** Retrieves the tFoot object of the table. */
    tFoot: HTMLTableSectionElement | null;
    /** Retrieves the tHead object of the table. */
    tHead: HTMLTableSectionElement | null;
    /**
     * Sets or retrieves the width of the object.
     * @deprecated
     */
    width: string;
    /** Creates an empty caption element in the table. */
    createCaption(): HTMLTableCaptionElement;
    /** Creates an empty tBody element in the table. */
    createTBody(): HTMLTableSectionElement;
    /** Creates an empty tFoot element in the table. */
    createTFoot(): HTMLTableSectionElement;
    /** Returns the tHead element object if successful, or null otherwise. */
    createTHead(): HTMLTableSectionElement;
    /** Deletes the caption element and its contents from the table. */
    deleteCaption(): void;
    /**
     * Removes the specified row (tr) from the element and from the rows collection.
     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
     */
    deleteRow(index: number): void;
    /** Deletes the tFoot element and its contents from the table. */
    deleteTFoot(): void;
    /** Deletes the tHead element and its contents from the table. */
    deleteTHead(): void;
    /**
     * Creates a new row (tr) in the table, and adds the row to the rows collection.
     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
     */
    insertRow(index?: number): HTMLTableRowElement;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTableElement: {
    prototype: HTMLTableElement;
    new(): HTMLTableElement;
};

/** @deprecated prefer HTMLTableCellElement */
interface HTMLTableHeaderCellElement extends HTMLTableCellElement {
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableHeaderCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableHeaderCellElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** Provides special properties and methods (beyond the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of rows in an HTML table. */
interface HTMLTableRowElement extends HTMLElement {
    /**
     * Sets or retrieves how the object is aligned with adjacent text.
     * @deprecated
     */
    align: string;
    /** @deprecated */
    bgColor: string;
    /** Retrieves a collection of all cells in the table row. */
    readonly cells: HTMLCollectionOf<HTMLTableCellElement>;
    /** @deprecated */
    ch: string;
    /** @deprecated */
    chOff: string;
    /** Retrieves the position of the object in the rows collection for the table. */
    readonly rowIndex: number;
    /** Retrieves the position of the object in the collection. */
    readonly sectionRowIndex: number;
    /** @deprecated */
    vAlign: string;
    /**
     * Removes the specified cell from the table row, as well as from the cells collection.
     * @param index Number that specifies the zero-based position of the cell to remove from the table row. If no value is provided, the last cell in the cells collection is deleted.
     */
    deleteCell(index: number): void;
    /**
     * Creates a new cell in the table row, and adds the cell to the cells collection.
     * @param index Number that specifies where to insert the cell in the tr. The default value is -1, which appends the new cell to the end of the cells collection.
     */
    insertCell(index?: number): HTMLTableCellElement;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableRowElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableRowElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTableRowElement: {
    prototype: HTMLTableRowElement;
    new(): HTMLTableRowElement;
};

/** Provides special properties and methods (beyond the HTMLElement interface it also has available to it by inheritance) for manipulating the layout and presentation of sections, that is headers, footers and bodies, in an HTML table. */
interface HTMLTableSectionElement extends HTMLElement {
    /**
     * Sets or retrieves a value that indicates the table alignment.
     * @deprecated
     */
    align: string;
    /** @deprecated */
    ch: string;
    /** @deprecated */
    chOff: string;
    /** Sets or retrieves the number of horizontal rows contained in the object. */
    readonly rows: HTMLCollectionOf<HTMLTableRowElement>;
    /** @deprecated */
    vAlign: string;
    /**
     * Removes the specified row (tr) from the element and from the rows collection.
     * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
     */
    deleteRow(index: number): void;
    /**
     * Creates a new row (tr) in the table, and adds the row to the rows collection.
     * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
     */
    insertRow(index?: number): HTMLTableRowElement;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableSectionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTableSectionElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTableSectionElement: {
    prototype: HTMLTableSectionElement;
    new(): HTMLTableSectionElement;
};

/** Enables access to the contents of an HTML <template> element. */
interface HTMLTemplateElement extends HTMLElement {
    /** Returns the template contents (a DocumentFragment). */
    readonly content: DocumentFragment;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTemplateElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTemplateElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTemplateElement: {
    prototype: HTMLTemplateElement;
    new(): HTMLTemplateElement;
};

/** Provides special properties and methods for manipulating the layout and presentation of <textarea> elements. */
interface HTMLTextAreaElement extends HTMLElement {
    autocomplete: string;
    /** Sets or retrieves the width of the object. */
    cols: number;
    /** Sets or retrieves the initial contents of the object. */
    defaultValue: string;
    dirName: string;
    disabled: boolean;
    /** Retrieves a reference to the form that the object is embedded in. */
    readonly form: HTMLFormElement | null;
    readonly labels: NodeListOf<HTMLLabelElement>;
    /** Sets or retrieves the maximum number of characters that the user can enter in a text control. */
    maxLength: number;
    minLength: number;
    /** Sets or retrieves the name of the object. */
    name: string;
    /** Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field. */
    placeholder: string;
    /** Sets or retrieves the value indicated whether the content of the object is read-only. */
    readOnly: boolean;
    /** When present, marks an element that can't be submitted without a value. */
    required: boolean;
    /** Sets or retrieves the number of horizontal rows contained in the object. */
    rows: number;
    selectionDirection: "forward" | "backward" | "none";
    /** Gets or sets the end position or offset of a text selection. */
    selectionEnd: number;
    /** Gets or sets the starting position or offset of a text selection. */
    selectionStart: number;
    readonly textLength: number;
    /** Retrieves the type of control. */
    readonly type: string;
    /** Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting. */
    readonly validationMessage: string;
    /** Returns a  ValidityState object that represents the validity states of an element. */
    readonly validity: ValidityState;
    /** Retrieves or sets the text in the entry field of the textArea element. */
    value: string;
    /** Returns whether an element will successfully validate based on forms validation rules and constraints. */
    readonly willValidate: boolean;
    /** Sets or retrieves how to handle wordwrapping in the object. */
    wrap: string;
    /** Returns whether a form will validate when it is submitted, without having to submit it. */
    checkValidity(): boolean;
    reportValidity(): boolean;
    /** Highlights the input area of a form element. */
    select(): void;
    /**
     * Sets a custom error message that is displayed when a form is submitted.
     * @param error Sets a custom error message that is displayed when a form is submitted.
     */
    setCustomValidity(error: string): void;
    setRangeText(replacement: string): void;
    setRangeText(replacement: string, start: number, end: number, selectionMode?: SelectionMode): void;
    /**
     * Sets the start and end positions of a selection in a text field.
     * @param start The offset into the text field for the start of the selection.
     * @param end The offset into the text field for the end of the selection.
     * @param direction The direction in which the selection is performed.
     */
    setSelectionRange(start: number | null, end: number | null, direction?: "forward" | "backward" | "none"): void;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTextAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTextAreaElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTextAreaElement: {
    prototype: HTMLTextAreaElement;
    new(): HTMLTextAreaElement;
};

/** Provides special properties (beyond the regular HTMLElement interface it also has available to it by inheritance) for manipulating <time> elements. */
interface HTMLTimeElement extends HTMLElement {
    dateTime: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTimeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTimeElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTimeElement: {
    prototype: HTMLTimeElement;
    new(): HTMLTimeElement;
};

/** Contains the title for a document. This element inherits all of the properties and methods of the HTMLElement interface. */
interface HTMLTitleElement extends HTMLElement {
    /** Retrieves or sets the text of the object as a string. */
    text: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTitleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTitleElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTitleElement: {
    prototype: HTMLTitleElement;
    new(): HTMLTitleElement;
};

/** The HTMLTrackElement */
interface HTMLTrackElement extends HTMLElement {
    default: boolean;
    kind: string;
    label: string;
    readonly readyState: number;
    src: string;
    srclang: string;
    /** Returns the TextTrack object corresponding to the text track of the track element. */
    readonly track: TextTrack;
    readonly ERROR: number;
    readonly LOADED: number;
    readonly LOADING: number;
    readonly NONE: number;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTrackElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLTrackElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLTrackElement: {
    prototype: HTMLTrackElement;
    new(): HTMLTrackElement;
    readonly ERROR: number;
    readonly LOADED: number;
    readonly LOADING: number;
    readonly NONE: number;
};

/** Provides special properties (beyond those defined on the regular HTMLElement interface it also has available to it by inheritance) for manipulating unordered list elements. */
interface HTMLUListElement extends HTMLElement {
    /** @deprecated */
    compact: boolean;
    /** @deprecated */
    type: string;
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUListElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLUListElement: {
    prototype: HTMLUListElement;
    new(): HTMLUListElement;
};

/** An invalid HTML element and derives from the HTMLElement interface, but without implementing any additional properties or methods. */
interface HTMLUnknownElement extends HTMLElement {
    addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUnknownElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLUnknownElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLUnknownElement: {
    prototype: HTMLUnknownElement;
    new(): HTMLUnknownElement;
};

interface HTMLVideoElementEventMap extends HTMLMediaElementEventMap {
    "enterpictureinpicture": Event;
    "leavepictureinpicture": Event;
}

/** Provides special properties and methods for manipulating video objects. It also inherits properties and methods of HTMLMediaElement and HTMLElement. */
interface HTMLVideoElement extends HTMLMediaElement {
    disablePictureInPicture: boolean;
    /** Gets or sets the height of the video element. */
    height: number;
    onenterpictureinpicture: ((this: HTMLVideoElement, ev: Event) => any) | null;
    onleavepictureinpicture: ((this: HTMLVideoElement, ev: Event) => any) | null;
    /** Gets or sets the playsinline of the video element. for example, On iPhone, video elements will now be allowed to play inline, and will not automatically enter fullscreen mode when playback begins. */
    playsInline: boolean;
    /** Gets or sets a URL of an image to display, for example, like a movie poster. This can be a still frame from the video, or another image if no video data is available. */
    poster: string;
    /** Gets the intrinsic height of a video in CSS pixels, or zero if the dimensions are not known. */
    readonly videoHeight: number;
    /** Gets the intrinsic width of a video in CSS pixels, or zero if the dimensions are not known. */
    readonly videoWidth: number;
    /** Gets or sets the width of the video element. */
    width: number;
    getVideoPlaybackQuality(): VideoPlaybackQuality;
    requestPictureInPicture(): Promise<PictureInPictureWindow>;
    addEventListener<K extends keyof HTMLVideoElementEventMap>(type: K, listener: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof HTMLVideoElementEventMap>(type: K, listener: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var HTMLVideoElement: {
    prototype: HTMLVideoElement;
    new(): HTMLVideoElement;
};

/** Events that fire when the fragment identifier of the URL has changed. */
interface HashChangeEvent extends Event {
    /** Returns the URL of the session history entry that is now current. */
    readonly newURL: string;
    /** Returns the URL of the session history entry that was previously current. */
    readonly oldURL: string;
}

declare var HashChangeEvent: {
    prototype: HashChangeEvent;
    new(type: string, eventInitDict?: HashChangeEventInit): HashChangeEvent;
};

/** This Fetch API interface allows you to perform various actions on HTTP request and response headers. These actions include retrieving, setting, adding to, and removing. A Headers object has an associated header list, which is initially empty and consists\xA0of zero or more name and value pairs. \xA0You can add to this using methods like append() (see Examples.)\xA0In all methods of this interface, header names are matched by case-insensitive byte sequence. */
interface Headers {
    append(name: string, value: string): void;
    delete(name: string): void;
    get(name: string): string | null;
    has(name: string): boolean;
    set(name: string, value: string): void;
    forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: any): void;
}

declare var Headers: {
    prototype: Headers;
    new(init?: HeadersInit): Headers;
};

/** Allows\xA0manipulation of\xA0the browser session history, that is the pages visited in the tab or frame that the current page is loaded in. */
interface History {
    readonly length: number;
    scrollRestoration: ScrollRestoration;
    readonly state: any;
    back(): void;
    forward(): void;
    go(delta?: number): void;
    pushState(data: any, unused: string, url?: string | URL | null): void;
    replaceState(data: any, unused: string, url?: string | URL | null): void;
}

declare var History: {
    prototype: History;
    new(): History;
};

/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. */
interface IDBCursor {
    /** Returns the direction ("next", "nextunique", "prev" or "prevunique") of the cursor. */
    readonly direction: IDBCursorDirection;
    /** Returns the key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
    readonly key: IDBValidKey;
    /** Returns the effective key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
    readonly primaryKey: IDBValidKey;
    readonly request: IDBRequest;
    /** Returns the IDBObjectStore or IDBIndex the cursor was opened from. */
    readonly source: IDBObjectStore | IDBIndex;
    /** Advances the cursor through the next count records in range. */
    advance(count: number): void;
    /** Advances the cursor to the next record in range. */
    continue(key?: IDBValidKey): void;
    /** Advances the cursor to the next record in range matching or after key and primaryKey. Throws an "InvalidAccessError" DOMException if the source is not an index. */
    continuePrimaryKey(key: IDBValidKey, primaryKey: IDBValidKey): void;
    /**
     * Delete the record pointed at by the cursor with a new value.
     *
     * If successful, request's result will be undefined.
     */
    delete(): IDBRequest<undefined>;
    /**
     * Updated the record pointed at by the cursor with a new value.
     *
     * Throws a "DataError" DOMException if the effective object store uses in-line keys and the key would have changed.
     *
     * If successful, request's result will be the record's key.
     */
    update(value: any): IDBRequest<IDBValidKey>;
}

declare var IDBCursor: {
    prototype: IDBCursor;
    new(): IDBCursor;
};

/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. It is the same as the IDBCursor, except that it includes the value property. */
interface IDBCursorWithValue extends IDBCursor {
    /** Returns the cursor's current value. */
    readonly value: any;
}

declare var IDBCursorWithValue: {
    prototype: IDBCursorWithValue;
    new(): IDBCursorWithValue;
};

interface IDBDatabaseEventMap {
    "abort": Event;
    "close": Event;
    "error": Event;
    "versionchange": IDBVersionChangeEvent;
}

/** This IndexedDB API interface provides a connection to a database; you can use an IDBDatabase object to open a transaction on your database then create, manipulate, and delete objects (data) in that database. The interface provides the only way to get and manage versions of the database. */
interface IDBDatabase extends EventTarget {
    /** Returns the name of the database. */
    readonly name: string;
    /** Returns a list of the names of object stores in the database. */
    readonly objectStoreNames: DOMStringList;
    onabort: ((this: IDBDatabase, ev: Event) => any) | null;
    onclose: ((this: IDBDatabase, ev: Event) => any) | null;
    onerror: ((this: IDBDatabase, ev: Event) => any) | null;
    onversionchange: ((this: IDBDatabase, ev: IDBVersionChangeEvent) => any) | null;
    /** Returns the version of the database. */
    readonly version: number;
    /** Closes the connection once all running transactions have finished. */
    close(): void;
    /**
     * Creates a new object store with the given name and options and returns a new IDBObjectStore.
     *
     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    createObjectStore(name: string, options?: IDBObjectStoreParameters): IDBObjectStore;
    /**
     * Deletes the object store with the given name.
     *
     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    deleteObjectStore(name: string): void;
    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */
    transaction(storeNames: string | string[], mode?: IDBTransactionMode): IDBTransaction;
    addEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBDatabase: {
    prototype: IDBDatabase;
    new(): IDBDatabase;
};

/** In the following code snippet, we make a request to open a database, and include handlers for the success and error cases. For a full working example, see our To-do Notifications app (view example live.) */
interface IDBFactory {
    /**
     * Compares two values as keys. Returns -1 if key1 precedes key2, 1 if key2 precedes key1, and 0 if the keys are equal.
     *
     * Throws a "DataError" DOMException if either input is not a valid key.
     */
    cmp(first: any, second: any): number;
    databases(): Promise<IDBDatabaseInfo[]>;
    /** Attempts to delete the named database. If the database already exists and there are open connections that don't close in response to a versionchange event, the request will be blocked until all they close. If the request is successful request's result will be null. */
    deleteDatabase(name: string): IDBOpenDBRequest;
    /** Attempts to open a connection to the named database with the current version, or 1 if it does not already exist. If the request is successful request's result will be the connection. */
    open(name: string, version?: number): IDBOpenDBRequest;
}

declare var IDBFactory: {
    prototype: IDBFactory;
    new(): IDBFactory;
};

/** IDBIndex interface of the IndexedDB API provides asynchronous access to an index in a database. An index is a kind of object store for looking up records in another object store, called the referenced object store. You use this interface to retrieve data. */
interface IDBIndex {
    readonly keyPath: string | string[];
    readonly multiEntry: boolean;
    /** Returns the name of the index. */
    name: string;
    /** Returns the IDBObjectStore the index belongs to. */
    readonly objectStore: IDBObjectStore;
    readonly unique: boolean;
    /**
     * Retrieves the number of records matching the given key or key range in query.
     *
     * If successful, request's result will be the count.
     */
    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
    /**
     * Retrieves the value of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the value, or undefined if there was no matching record.
     */
    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
    /**
     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the values.
     */
    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
    /**
     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the keys.
     */
    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
    /**
     * Retrieves the key of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the key, or undefined if there was no matching record.
     */
    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
    /**
     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in index are matched.
     *
     * If successful, request's result will be an IDBCursorWithValue, or null if there were no matching records.
     */
    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
    /**
     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in index are matched.
     *
     * If successful, request's result will be an IDBCursor, or null if there were no matching records.
     */
    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
}

declare var IDBIndex: {
    prototype: IDBIndex;
    new(): IDBIndex;
};

/** A key range can be a single value or a range with upper and lower bounds or endpoints. If the key range has both upper and lower bounds, then it is bounded; if it has no bounds, it is unbounded. A bounded key range can either be open (the endpoints are excluded) or closed (the endpoints are included). To retrieve all keys within a certain range, you can use the following code constructs: */
interface IDBKeyRange {
    /** Returns lower bound, or undefined if none. */
    readonly lower: any;
    /** Returns true if the lower open flag is set, and false otherwise. */
    readonly lowerOpen: boolean;
    /** Returns upper bound, or undefined if none. */
    readonly upper: any;
    /** Returns true if the upper open flag is set, and false otherwise. */
    readonly upperOpen: boolean;
    /** Returns true if key is included in the range, and false otherwise. */
    includes(key: any): boolean;
}

declare var IDBKeyRange: {
    prototype: IDBKeyRange;
    new(): IDBKeyRange;
    /** Returns a new IDBKeyRange spanning from lower to upper. If lowerOpen is true, lower is not included in the range. If upperOpen is true, upper is not included in the range. */
    bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;
    /** Returns a new IDBKeyRange starting at key with no upper bound. If open is true, key is not included in the range. */
    lowerBound(lower: any, open?: boolean): IDBKeyRange;
    /** Returns a new IDBKeyRange spanning only key. */
    only(value: any): IDBKeyRange;
    /** Returns a new IDBKeyRange with no lower bound and ending at key. If open is true, key is not included in the range. */
    upperBound(upper: any, open?: boolean): IDBKeyRange;
};

/** This example shows a variety of different uses of object stores, from updating the data structure with IDBObjectStore.createIndex\xA0inside an onupgradeneeded function, to adding a new item to our object store with IDBObjectStore.add. For a full working example, see our\xA0To-do Notifications\xA0app (view example live.) */
interface IDBObjectStore {
    /** Returns true if the store has a key generator, and false otherwise. */
    readonly autoIncrement: boolean;
    /** Returns a list of the names of indexes in the store. */
    readonly indexNames: DOMStringList;
    /** Returns the key path of the store, or null if none. */
    readonly keyPath: string | string[];
    /** Returns the name of the store. */
    name: string;
    /** Returns the associated transaction. */
    readonly transaction: IDBTransaction;
    /**
     * Adds or updates a record in store with the given value and key.
     *
     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
     *
     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
     *
     * If successful, request's result will be the record's key.
     */
    add(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
    /**
     * Deletes all records in store.
     *
     * If successful, request's result will be undefined.
     */
    clear(): IDBRequest<undefined>;
    /**
     * Retrieves the number of records matching the given key or key range in query.
     *
     * If successful, request's result will be the count.
     */
    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
    /**
     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.
     *
     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    createIndex(name: string, keyPath: string | string[], options?: IDBIndexParameters): IDBIndex;
    /**
     * Deletes records in store with the given key or in the given key range in query.
     *
     * If successful, request's result will be undefined.
     */
    delete(query: IDBValidKey | IDBKeyRange): IDBRequest<undefined>;
    /**
     * Deletes the index in store with the given name.
     *
     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    deleteIndex(name: string): void;
    /**
     * Retrieves the value of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the value, or undefined if there was no matching record.
     */
    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
    /**
     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the values.
     */
    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
    /**
     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the keys.
     */
    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
    /**
     * Retrieves the key of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the key, or undefined if there was no matching record.
     */
    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
    index(name: string): IDBIndex;
    /**
     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in store are matched.
     *
     * If successful, request's result will be an IDBCursorWithValue pointing at the first matching record, or null if there were no matching records.
     */
    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
    /**
     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in store are matched.
     *
     * If successful, request's result will be an IDBCursor pointing at the first matching record, or null if there were no matching records.
     */
    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
    /**
     * Adds or updates a record in store with the given value and key.
     *
     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
     *
     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
     *
     * If successful, request's result will be the record's key.
     */
    put(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
}

declare var IDBObjectStore: {
    prototype: IDBObjectStore;
    new(): IDBObjectStore;
};

interface IDBOpenDBRequestEventMap extends IDBRequestEventMap {
    "blocked": Event;
    "upgradeneeded": IDBVersionChangeEvent;
}

/** Also inherits methods from its parents IDBRequest and EventTarget. */
interface IDBOpenDBRequest extends IDBRequest<IDBDatabase> {
    onblocked: ((this: IDBOpenDBRequest, ev: Event) => any) | null;
    onupgradeneeded: ((this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any) | null;
    addEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBOpenDBRequest: {
    prototype: IDBOpenDBRequest;
    new(): IDBOpenDBRequest;
};

interface IDBRequestEventMap {
    "error": Event;
    "success": Event;
}

/** The request object does not initially contain any information about the result of the operation, but once information becomes available, an event is fired on the request, and the information becomes available through the properties of the IDBRequest instance. */
interface IDBRequest<T = any> extends EventTarget {
    /** When a request is completed, returns the error (a DOMException), or null if the request succeeded. Throws a "InvalidStateError" DOMException if the request is still pending. */
    readonly error: DOMException | null;
    onerror: ((this: IDBRequest<T>, ev: Event) => any) | null;
    onsuccess: ((this: IDBRequest<T>, ev: Event) => any) | null;
    /** Returns "pending" until a request is complete, then returns "done". */
    readonly readyState: IDBRequestReadyState;
    /** When a request is completed, returns the result, or undefined if the request failed. Throws a "InvalidStateError" DOMException if the request is still pending. */
    readonly result: T;
    /** Returns the IDBObjectStore, IDBIndex, or IDBCursor the request was made against, or null if is was an open request. */
    readonly source: IDBObjectStore | IDBIndex | IDBCursor;
    /** Returns the IDBTransaction the request was made within. If this as an open request, then it returns an upgrade transaction while it is running, or null otherwise. */
    readonly transaction: IDBTransaction | null;
    addEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBRequest: {
    prototype: IDBRequest;
    new(): IDBRequest;
};

interface IDBTransactionEventMap {
    "abort": Event;
    "complete": Event;
    "error": Event;
}

interface IDBTransaction extends EventTarget {
    /** Returns the transaction's connection. */
    readonly db: IDBDatabase;
    /** If the transaction was aborted, returns the error (a DOMException) providing the reason. */
    readonly error: DOMException | null;
    /** Returns the mode the transaction was created with ("readonly" or "readwrite"), or "versionchange" for an upgrade transaction. */
    readonly mode: IDBTransactionMode;
    /** Returns a list of the names of object stores in the transaction's scope. For an upgrade transaction this is all object stores in the database. */
    readonly objectStoreNames: DOMStringList;
    onabort: ((this: IDBTransaction, ev: Event) => any) | null;
    oncomplete: ((this: IDBTransaction, ev: Event) => any) | null;
    onerror: ((this: IDBTransaction, ev: Event) => any) | null;
    /** Aborts the transaction. All pending requests will fail with a "AbortError" DOMException and all changes made to the database will be reverted. */
    abort(): void;
    commit(): void;
    /** Returns an IDBObjectStore in the transaction's scope. */
    objectStore(name: string): IDBObjectStore;
    addEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBTransaction: {
    prototype: IDBTransaction;
    new(): IDBTransaction;
};

/** This IndexedDB API interface indicates that the version of the database has changed, as the result of an IDBOpenDBRequest.onupgradeneeded event handler function. */
interface IDBVersionChangeEvent extends Event {
    readonly newVersion: number | null;
    readonly oldVersion: number;
}

declare var IDBVersionChangeEvent: {
    prototype: IDBVersionChangeEvent;
    new(type: string, eventInitDict?: IDBVersionChangeEventInit): IDBVersionChangeEvent;
};

/** The\xA0IIRFilterNode\xA0interface of the\xA0Web Audio API\xA0is a AudioNode processor which implements a general infinite impulse response (IIR)\xA0 filter; this type of filter can be used to implement tone control devices and graphic equalizers as well. It lets the parameters of the filter response be specified, so that it can be tuned as needed. */
interface IIRFilterNode extends AudioNode {
    getFrequencyResponse(frequencyHz: Float32Array, magResponse: Float32Array, phaseResponse: Float32Array): void;
}

declare var IIRFilterNode: {
    prototype: IIRFilterNode;
    new(context: BaseAudioContext, options: IIRFilterOptions): IIRFilterNode;
};

interface IdleDeadline {
    readonly didTimeout: boolean;
    timeRemaining(): DOMHighResTimeStamp;
}

declare var IdleDeadline: {
    prototype: IdleDeadline;
    new(): IdleDeadline;
};

interface ImageBitmap {
    /** Returns the intrinsic height of the image, in CSS pixels. */
    readonly height: number;
    /** Returns the intrinsic width of the image, in CSS pixels. */
    readonly width: number;
    /** Releases imageBitmap's underlying bitmap data. */
    close(): void;
}

declare var ImageBitmap: {
    prototype: ImageBitmap;
    new(): ImageBitmap;
};

interface ImageBitmapRenderingContext {
    /** Returns the canvas element that the context is bound to. */
    readonly canvas: HTMLCanvasElement;
    /** Transfers the underlying bitmap data from imageBitmap to context, and the bitmap becomes the contents of the canvas element to which context is bound. */
    transferFromImageBitmap(bitmap: ImageBitmap | null): void;
}

declare var ImageBitmapRenderingContext: {
    prototype: ImageBitmapRenderingContext;
    new(): ImageBitmapRenderingContext;
};

/** The underlying pixel data of an area of a <canvas> element. It is created using the ImageData() constructor or creator methods on the CanvasRenderingContext2D object associated with a canvas: createImageData() and getImageData(). It can also be used to set a part of the canvas by using putImageData(). */
interface ImageData {
    /** Returns the one-dimensional array containing the data in RGBA order, as integers in the range 0 to 255. */
    readonly data: Uint8ClampedArray;
    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
    readonly height: number;
    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
    readonly width: number;
}

declare var ImageData: {
    prototype: ImageData;
    new(sw: number, sh: number, settings?: ImageDataSettings): ImageData;
    new(data: Uint8ClampedArray, sw: number, sh?: number, settings?: ImageDataSettings): ImageData;
};

interface InnerHTML {
    innerHTML: string;
}

interface InputEvent extends UIEvent {
    readonly data: string | null;
    readonly dataTransfer: DataTransfer | null;
    readonly inputType: string;
    readonly isComposing: boolean;
    getTargetRanges(): StaticRange[];
}

declare var InputEvent: {
    prototype: InputEvent;
    new(type: string, eventInitDict?: InputEventInit): InputEvent;
};

/** provides a way to asynchronously observe changes in the intersection of a target element with an ancestor element or with a top-level document's viewport. */
interface IntersectionObserver {
    readonly root: Element | Document | null;
    readonly rootMargin: string;
    readonly thresholds: ReadonlyArray<number>;
    disconnect(): void;
    observe(target: Element): void;
    takeRecords(): IntersectionObserverEntry[];
    unobserve(target: Element): void;
}

declare var IntersectionObserver: {
    prototype: IntersectionObserver;
    new(callback: IntersectionObserverCallback, options?: IntersectionObserverInit): IntersectionObserver;
};

/** This Intersection Observer API interface describes the intersection between the target element and its root container at a specific moment of transition. */
interface IntersectionObserverEntry {
    readonly boundingClientRect: DOMRectReadOnly;
    readonly intersectionRatio: number;
    readonly intersectionRect: DOMRectReadOnly;
    readonly isIntersecting: boolean;
    readonly rootBounds: DOMRectReadOnly | null;
    readonly target: Element;
    readonly time: DOMHighResTimeStamp;
}

declare var IntersectionObserverEntry: {
    prototype: IntersectionObserverEntry;
    new(intersectionObserverEntryInit: IntersectionObserverEntryInit): IntersectionObserverEntry;
};

interface KHR_parallel_shader_compile {
    readonly COMPLETION_STATUS_KHR: GLenum;
}

/** KeyboardEvent objects describe a user interaction with the keyboard; each event describes a single interaction between the user and a key (or combination of a key with modifier keys) on the keyboard. */
interface KeyboardEvent extends UIEvent {
    readonly altKey: boolean;
    /** @deprecated */
    readonly charCode: number;
    readonly code: string;
    readonly ctrlKey: boolean;
    readonly isComposing: boolean;
    readonly key: string;
    /** @deprecated */
    readonly keyCode: number;
    readonly location: number;
    readonly metaKey: boolean;
    readonly repeat: boolean;
    readonly shiftKey: boolean;
    getModifierState(keyArg: string): boolean;
    /** @deprecated */
    initKeyboardEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, keyArg?: string, locationArg?: number, ctrlKey?: boolean, altKey?: boolean, shiftKey?: boolean, metaKey?: boolean): void;
    readonly DOM_KEY_LOCATION_LEFT: number;
    readonly DOM_KEY_LOCATION_NUMPAD: number;
    readonly DOM_KEY_LOCATION_RIGHT: number;
    readonly DOM_KEY_LOCATION_STANDARD: number;
}

declare var KeyboardEvent: {
    prototype: KeyboardEvent;
    new(type: string, eventInitDict?: KeyboardEventInit): KeyboardEvent;
    readonly DOM_KEY_LOCATION_LEFT: number;
    readonly DOM_KEY_LOCATION_NUMPAD: number;
    readonly DOM_KEY_LOCATION_RIGHT: number;
    readonly DOM_KEY_LOCATION_STANDARD: number;
};

interface KeyframeEffect extends AnimationEffect {
    composite: CompositeOperation;
    iterationComposite: IterationCompositeOperation;
    pseudoElement: string | null;
    target: Element | null;
    getKeyframes(): ComputedKeyframe[];
    setKeyframes(keyframes: Keyframe[] | PropertyIndexedKeyframes | null): void;
}

declare var KeyframeEffect: {
    prototype: KeyframeEffect;
    new(target: Element | null, keyframes: Keyframe[] | PropertyIndexedKeyframes | null, options?: number | KeyframeEffectOptions): KeyframeEffect;
    new(source: KeyframeEffect): KeyframeEffect;
};

interface LinkStyle {
    readonly sheet: CSSStyleSheet | null;
}

/** The location (URL) of the object it is linked to. Changes done on it are reflected on the object it relates to. Both the Document and Window interface have such a linked Location, accessible via Document.location and Window.location respectively. */
interface Location {
    /** Returns a DOMStringList object listing the origins of the ancestor browsing contexts, from the parent browsing context to the top-level browsing context. */
    readonly ancestorOrigins: DOMStringList;
    /**
     * Returns the Location object's URL's fragment (includes leading "#" if non-empty).
     *
     * Can be set, to navigate to the same URL with a changed fragment (ignores leading "#").
     */
    hash: string;
    /**
     * Returns the Location object's URL's host and port (if different from the default port for the scheme).
     *
     * Can be set, to navigate to the same URL with a changed host and port.
     */
    host: string;
    /**
     * Returns the Location object's URL's host.
     *
     * Can be set, to navigate to the same URL with a changed host.
     */
    hostname: string;
    /**
     * Returns the Location object's URL.
     *
     * Can be set, to navigate to the given URL.
     */
    href: string;
    toString(): string;
    /** Returns the Location object's URL's origin. */
    readonly origin: string;
    /**
     * Returns the Location object's URL's path.
     *
     * Can be set, to navigate to the same URL with a changed path.
     */
    pathname: string;
    /**
     * Returns the Location object's URL's port.
     *
     * Can be set, to navigate to the same URL with a changed port.
     */
    port: string;
    /**
     * Returns the Location object's URL's scheme.
     *
     * Can be set, to navigate to the same URL with a changed scheme.
     */
    protocol: string;
    /**
     * Returns the Location object's URL's query (includes leading "?" if non-empty).
     *
     * Can be set, to navigate to the same URL with a changed query (ignores leading "?").
     */
    search: string;
    /** Navigates to the given URL. */
    assign(url: string | URL): void;
    /** Reloads the current page. */
    reload(): void;
    /** Removes the current page from the session history and navigates to the given URL. */
    replace(url: string | URL): void;
}

declare var Location: {
    prototype: Location;
    new(): Location;
};

interface MathMLElementEventMap extends ElementEventMap, DocumentAndElementEventHandlersEventMap, GlobalEventHandlersEventMap {
}

interface MathMLElement extends Element, DocumentAndElementEventHandlers, ElementCSSInlineStyle, GlobalEventHandlers, HTMLOrSVGElement {
    addEventListener<K extends keyof MathMLElementEventMap>(type: K, listener: (this: MathMLElement, ev: MathMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MathMLElementEventMap>(type: K, listener: (this: MathMLElement, ev: MathMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MathMLElement: {
    prototype: MathMLElement;
    new(): MathMLElement;
};

interface MediaCapabilities {
    decodingInfo(configuration: MediaDecodingConfiguration): Promise<MediaCapabilitiesDecodingInfo>;
    encodingInfo(configuration: MediaEncodingConfiguration): Promise<MediaCapabilitiesEncodingInfo>;
}

declare var MediaCapabilities: {
    prototype: MediaCapabilities;
    new(): MediaCapabilities;
};

/**
 * The MediaDevicesInfo interface contains information that describes a single media input or output device.
 * Available only in secure contexts.
 */
interface MediaDeviceInfo {
    readonly deviceId: string;
    readonly groupId: string;
    readonly kind: MediaDeviceKind;
    readonly label: string;
    toJSON(): any;
}

declare var MediaDeviceInfo: {
    prototype: MediaDeviceInfo;
    new(): MediaDeviceInfo;
};

interface MediaDevicesEventMap {
    "devicechange": Event;
}

/**
 * Provides access to connected media input devices like cameras and microphones, as well as screen sharing. In essence, it lets you obtain access to any hardware source of media data.
 * Available only in secure contexts.
 */
interface MediaDevices extends EventTarget {
    ondevicechange: ((this: MediaDevices, ev: Event) => any) | null;
    enumerateDevices(): Promise<MediaDeviceInfo[]>;
    getDisplayMedia(constraints?: DisplayMediaStreamConstraints): Promise<MediaStream>;
    getSupportedConstraints(): MediaTrackSupportedConstraints;
    getUserMedia(constraints?: MediaStreamConstraints): Promise<MediaStream>;
    addEventListener<K extends keyof MediaDevicesEventMap>(type: K, listener: (this: MediaDevices, ev: MediaDevicesEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MediaDevicesEventMap>(type: K, listener: (this: MediaDevices, ev: MediaDevicesEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MediaDevices: {
    prototype: MediaDevices;
    new(): MediaDevices;
};

/** A MediaElementSourceNode has no inputs and exactly one output, and is created using the AudioContext.createMediaElementSource method. The amount of channels in the output equals the number of channels of the audio referenced by the HTMLMediaElement used in the creation of the node, or is 1 if the HTMLMediaElement has no audio. */
interface MediaElementAudioSourceNode extends AudioNode {
    readonly mediaElement: HTMLMediaElement;
}

declare var MediaElementAudioSourceNode: {
    prototype: MediaElementAudioSourceNode;
    new(context: AudioContext, options: MediaElementAudioSourceOptions): MediaElementAudioSourceNode;
};

interface MediaEncryptedEvent extends Event {
    readonly initData: ArrayBuffer | null;
    readonly initDataType: string;
}

declare var MediaEncryptedEvent: {
    prototype: MediaEncryptedEvent;
    new(type: string, eventInitDict?: MediaEncryptedEventInit): MediaEncryptedEvent;
};

/** An error which occurred while handling media in an HTML media element based on HTMLMediaElement, such as <audio> or <video>. */
interface MediaError {
    readonly code: number;
    readonly message: string;
    readonly MEDIA_ERR_ABORTED: number;
    readonly MEDIA_ERR_DECODE: number;
    readonly MEDIA_ERR_NETWORK: number;
    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: number;
}

declare var MediaError: {
    prototype: MediaError;
    new(): MediaError;
    readonly MEDIA_ERR_ABORTED: number;
    readonly MEDIA_ERR_DECODE: number;
    readonly MEDIA_ERR_NETWORK: number;
    readonly MEDIA_ERR_SRC_NOT_SUPPORTED: number;
};

/**
 * This EncryptedMediaExtensions API interface contains the content and related data when the content decryption module generates a message for the session.
 * Available only in secure contexts.
 */
interface MediaKeyMessageEvent extends Event {
    readonly message: ArrayBuffer;
    readonly messageType: MediaKeyMessageType;
}

declare var MediaKeyMessageEvent: {
    prototype: MediaKeyMessageEvent;
    new(type: string, eventInitDict: MediaKeyMessageEventInit): MediaKeyMessageEvent;
};

interface MediaKeySessionEventMap {
    "keystatuseschange": Event;
    "message": MediaKeyMessageEvent;
}

/**
 * This EncryptedMediaExtensions API interface represents a\xA0context for message exchange with a content decryption module (CDM).
 * Available only in secure contexts.
 */
interface MediaKeySession extends EventTarget {
    readonly closed: Promise<MediaKeySessionClosedReason>;
    readonly expiration: number;
    readonly keyStatuses: MediaKeyStatusMap;
    onkeystatuseschange: ((this: MediaKeySession, ev: Event) => any) | null;
    onmessage: ((this: MediaKeySession, ev: MediaKeyMessageEvent) => any) | null;
    readonly sessionId: string;
    close(): Promise<void>;
    generateRequest(initDataType: string, initData: BufferSource): Promise<void>;
    load(sessionId: string): Promise<boolean>;
    remove(): Promise<void>;
    update(response: BufferSource): Promise<void>;
    addEventListener<K extends keyof MediaKeySessionEventMap>(type: K, listener: (this: MediaKeySession, ev: MediaKeySessionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MediaKeySessionEventMap>(type: K, listener: (this: MediaKeySession, ev: MediaKeySessionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MediaKeySession: {
    prototype: MediaKeySession;
    new(): MediaKeySession;
};

/**
 * This EncryptedMediaExtensions API interface is a read-only map of media key statuses by key IDs.
 * Available only in secure contexts.
 */
interface MediaKeyStatusMap {
    readonly size: number;
    get(keyId: BufferSource): MediaKeyStatus | undefined;
    has(keyId: BufferSource): boolean;
    forEach(callbackfn: (value: MediaKeyStatus, key: BufferSource, parent: MediaKeyStatusMap) => void, thisArg?: any): void;
}

declare var MediaKeyStatusMap: {
    prototype: MediaKeyStatusMap;
    new(): MediaKeyStatusMap;
};

/**
 * This EncryptedMediaExtensions API interface provides access to a Key System for decryption and/or a content protection provider. You can request an instance of this object using the Navigator.requestMediaKeySystemAccess method.
 * Available only in secure contexts.
 */
interface MediaKeySystemAccess {
    readonly keySystem: string;
    createMediaKeys(): Promise<MediaKeys>;
    getConfiguration(): MediaKeySystemConfiguration;
}

declare var MediaKeySystemAccess: {
    prototype: MediaKeySystemAccess;
    new(): MediaKeySystemAccess;
};

/**
 * This EncryptedMediaExtensions API interface the represents a set of keys that an associated HTMLMediaElement can use for decryption of media data during playback.
 * Available only in secure contexts.
 */
interface MediaKeys {
    createSession(sessionType?: MediaKeySessionType): MediaKeySession;
    setServerCertificate(serverCertificate: BufferSource): Promise<boolean>;
}

declare var MediaKeys: {
    prototype: MediaKeys;
    new(): MediaKeys;
};

interface MediaList {
    readonly length: number;
    mediaText: string;
    toString(): string;
    appendMedium(medium: string): void;
    deleteMedium(medium: string): void;
    item(index: number): string | null;
    [index: number]: string;
}

declare var MediaList: {
    prototype: MediaList;
    new(): MediaList;
};

interface MediaMetadata {
    album: string;
    artist: string;
    artwork: ReadonlyArray<MediaImage>;
    title: string;
}

declare var MediaMetadata: {
    prototype: MediaMetadata;
    new(init?: MediaMetadataInit): MediaMetadata;
};

interface MediaQueryListEventMap {
    "change": MediaQueryListEvent;
}

/** Stores information on a media query applied to a document, and handles sending notifications to listeners when the media query state change (i.e. when the media query test starts or stops evaluating to true). */
interface MediaQueryList extends EventTarget {
    readonly matches: boolean;
    readonly media: string;
    onchange: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null;
    /** @deprecated */
    addListener(callback: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null): void;
    /** @deprecated */
    removeListener(callback: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null): void;
    addEventListener<K extends keyof MediaQueryListEventMap>(type: K, listener: (this: MediaQueryList, ev: MediaQueryListEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MediaQueryListEventMap>(type: K, listener: (this: MediaQueryList, ev: MediaQueryListEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MediaQueryList: {
    prototype: MediaQueryList;
    new(): MediaQueryList;
};

interface MediaQueryListEvent extends Event {
    readonly matches: boolean;
    readonly media: string;
}

declare var MediaQueryListEvent: {
    prototype: MediaQueryListEvent;
    new(type: string, eventInitDict?: MediaQueryListEventInit): MediaQueryListEvent;
};

interface MediaRecorderEventMap {
    "dataavailable": BlobEvent;
    "error": MediaRecorderErrorEvent;
    "pause": Event;
    "resume": Event;
    "start": Event;
    "stop": Event;
}

interface MediaRecorder extends EventTarget {
    readonly audioBitsPerSecond: number;
    readonly mimeType: string;
    ondataavailable: ((this: MediaRecorder, ev: BlobEvent) => any) | null;
    onerror: ((this: MediaRecorder, ev: MediaRecorderErrorEvent) => any) | null;
    onpause: ((this: MediaRecorder, ev: Event) => any) | null;
    onresume: ((this: MediaRecorder, ev: Event) => any) | null;
    onstart: ((this: MediaRecorder, ev: Event) => any) | null;
    onstop: ((this: MediaRecorder, ev: Event) => any) | null;
    readonly state: RecordingState;
    readonly stream: MediaStream;
    readonly videoBitsPerSecond: number;
    pause(): void;
    requestData(): void;
    resume(): void;
    start(timeslice?: number): void;
    stop(): void;
    addEventListener<K extends keyof MediaRecorderEventMap>(type: K, listener: (this: MediaRecorder, ev: MediaRecorderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MediaRecorderEventMap>(type: K, listener: (this: MediaRecorder, ev: MediaRecorderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MediaRecorder: {
    prototype: MediaRecorder;
    new(stream: MediaStream, options?: MediaRecorderOptions): MediaRecorder;
    isTypeSupported(type: string): boolean;
};

interface MediaRecorderErrorEvent extends Event {
    readonly error: DOMException;
}

declare var MediaRecorderErrorEvent: {
    prototype: MediaRecorderErrorEvent;
    new(type: string, eventInitDict: MediaRecorderErrorEventInit): MediaRecorderErrorEvent;
};

interface MediaSession {
    metadata: MediaMetadata | null;
    playbackState: MediaSessionPlaybackState;
    setActionHandler(action: MediaSessionAction, handler: MediaSessionActionHandler | null): void;
    setPositionState(state?: MediaPositionState): void;
}

declare var MediaSession: {
    prototype: MediaSession;
    new(): MediaSession;
};

interface MediaSourceEventMap {
    "sourceclose": Event;
    "sourceended": Event;
    "sourceopen": Event;
}

/** This Media Source Extensions API interface represents a source of media data for an HTMLMediaElement object. A MediaSource object can be attached to a HTMLMediaElement to be played in the user agent. */
interface MediaSource extends EventTarget {
    readonly activeSourceBuffers: SourceBufferList;
    duration: number;
    onsourceclose: ((this: MediaSource, ev: Event) => any) | null;
    onsourceended: ((this: MediaSource, ev: Event) => any) | null;
    onsourceopen: ((this: MediaSource, ev: Event) => any) | null;
    readonly readyState: ReadyState;
    readonly sourceBuffers: SourceBufferList;
    addSourceBuffer(type: string): SourceBuffer;
    clearLiveSeekableRange(): void;
    endOfStream(error?: EndOfStreamError): void;
    removeSourceBuffer(sourceBuffer: SourceBuffer): void;
    setLiveSeekableRange(start: number, end: number): void;
    addEventListener<K extends keyof MediaSourceEventMap>(type: K, listener: (this: MediaSource, ev: MediaSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MediaSourceEventMap>(type: K, listener: (this: MediaSource, ev: MediaSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MediaSource: {
    prototype: MediaSource;
    new(): MediaSource;
    isTypeSupported(type: string): boolean;
};

interface MediaStreamEventMap {
    "addtrack": MediaStreamTrackEvent;
    "removetrack": MediaStreamTrackEvent;
}

/** A stream of media content. A stream consists of several tracks such as\xA0video or audio tracks. Each track is specified as an instance of MediaStreamTrack. */
interface MediaStream extends EventTarget {
    readonly active: boolean;
    readonly id: string;
    onaddtrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null;
    onremovetrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null;
    addTrack(track: MediaStreamTrack): void;
    clone(): MediaStream;
    getAudioTracks(): MediaStreamTrack[];
    getTrackById(trackId: string): MediaStreamTrack | null;
    getTracks(): MediaStreamTrack[];
    getVideoTracks(): MediaStreamTrack[];
    removeTrack(track: MediaStreamTrack): void;
    addEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MediaStreamEventMap>(type: K, listener: (this: MediaStream, ev: MediaStreamEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MediaStream: {
    prototype: MediaStream;
    new(): MediaStream;
    new(stream: MediaStream): MediaStream;
    new(tracks: MediaStreamTrack[]): MediaStream;
};

interface MediaStreamAudioDestinationNode extends AudioNode {
    readonly stream: MediaStream;
}

declare var MediaStreamAudioDestinationNode: {
    prototype: MediaStreamAudioDestinationNode;
    new(context: AudioContext, options?: AudioNodeOptions): MediaStreamAudioDestinationNode;
};

/** A type of AudioNode which operates as an audio source whose media is received from a MediaStream obtained using the WebRTC or Media Capture and Streams APIs. */
interface MediaStreamAudioSourceNode extends AudioNode {
    readonly mediaStream: MediaStream;
}

declare var MediaStreamAudioSourceNode: {
    prototype: MediaStreamAudioSourceNode;
    new(context: AudioContext, options: MediaStreamAudioSourceOptions): MediaStreamAudioSourceNode;
};

interface MediaStreamTrackEventMap {
    "ended": Event;
    "mute": Event;
    "unmute": Event;
}

/** A single media track within a stream; typically, these are audio or video tracks, but other track types may exist as well. */
interface MediaStreamTrack extends EventTarget {
    contentHint: string;
    enabled: boolean;
    readonly id: string;
    readonly kind: string;
    readonly label: string;
    readonly muted: boolean;
    onended: ((this: MediaStreamTrack, ev: Event) => any) | null;
    onmute: ((this: MediaStreamTrack, ev: Event) => any) | null;
    onunmute: ((this: MediaStreamTrack, ev: Event) => any) | null;
    readonly readyState: MediaStreamTrackState;
    applyConstraints(constraints?: MediaTrackConstraints): Promise<void>;
    clone(): MediaStreamTrack;
    getCapabilities(): MediaTrackCapabilities;
    getConstraints(): MediaTrackConstraints;
    getSettings(): MediaTrackSettings;
    stop(): void;
    addEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MediaStreamTrackEventMap>(type: K, listener: (this: MediaStreamTrack, ev: MediaStreamTrackEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MediaStreamTrack: {
    prototype: MediaStreamTrack;
    new(): MediaStreamTrack;
};

/** Events which indicate that a MediaStream has had tracks added to or removed from the stream through calls to Media Stream API methods. These events are sent to the stream when these changes occur. */
interface MediaStreamTrackEvent extends Event {
    readonly track: MediaStreamTrack;
}

declare var MediaStreamTrackEvent: {
    prototype: MediaStreamTrackEvent;
    new(type: string, eventInitDict: MediaStreamTrackEventInit): MediaStreamTrackEvent;
};

/** This Channel Messaging API interface allows us to create a new message channel and send data through it via its two MessagePort properties. */
interface MessageChannel {
    /** Returns the first MessagePort object. */
    readonly port1: MessagePort;
    /** Returns the second MessagePort object. */
    readonly port2: MessagePort;
}

declare var MessageChannel: {
    prototype: MessageChannel;
    new(): MessageChannel;
};

/** A message received by a target object. */
interface MessageEvent<T = any> extends Event {
    /** Returns the data of the message. */
    readonly data: T;
    /** Returns the last event ID string, for server-sent events. */
    readonly lastEventId: string;
    /** Returns the origin of the message, for server-sent events and cross-document messaging. */
    readonly origin: string;
    /** Returns the MessagePort array sent with the message, for cross-document messaging and channel messaging. */
    readonly ports: ReadonlyArray<MessagePort>;
    /** Returns the WindowProxy of the source window, for cross-document messaging, and the MessagePort being attached, in the connect event fired at SharedWorkerGlobalScope objects. */
    readonly source: MessageEventSource | null;
    /** @deprecated */
    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: MessagePort[]): void;
}

declare var MessageEvent: {
    prototype: MessageEvent;
    new<T>(type: string, eventInitDict?: MessageEventInit<T>): MessageEvent<T>;
};

interface MessagePortEventMap {
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

/** This Channel Messaging API interface represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other. */
interface MessagePort extends EventTarget {
    onmessage: ((this: MessagePort, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: MessagePort, ev: MessageEvent) => any) | null;
    /** Disconnects the port, so that it is no longer active. */
    close(): void;
    /**
     * Posts a message through the channel. Objects listed in transfer are transferred, not just cloned, meaning that they are no longer usable on the sending side.
     *
     * Throws a "DataCloneError" DOMException if transfer contains duplicate objects or port, or if message could not be cloned.
     */
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
    /** Begins dispatching messages received on the port. */
    start(): void;
    addEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MessagePort: {
    prototype: MessagePort;
    new(): MessagePort;
};

/**
 * Provides contains information about a MIME type associated with a particular plugin. NavigatorPlugins.mimeTypes returns an array of this object.
 * @deprecated
 */
interface MimeType {
    /**
     * Returns the MIME type's description.
     * @deprecated
     */
    readonly description: string;
    /**
     * Returns the Plugin object that implements this MIME type.
     * @deprecated
     */
    readonly enabledPlugin: Plugin;
    /**
     * Returns the MIME type's typical file extensions, in a comma-separated list.
     * @deprecated
     */
    readonly suffixes: string;
    /**
     * Returns the MIME type.
     * @deprecated
     */
    readonly type: string;
}

/** @deprecated */
declare var MimeType: {
    prototype: MimeType;
    new(): MimeType;
};

/**
 * Returns an array of MimeType instances, each of which contains information\xA0about a supported browser plugins. This object is returned by NavigatorPlugins.mimeTypes.
 * @deprecated
 */
interface MimeTypeArray {
    /** @deprecated */
    readonly length: number;
    /** @deprecated */
    item(index: number): MimeType | null;
    /** @deprecated */
    namedItem(name: string): MimeType | null;
    [index: number]: MimeType;
}

/** @deprecated */
declare var MimeTypeArray: {
    prototype: MimeTypeArray;
    new(): MimeTypeArray;
};

/** Events that occur due to the user interacting with a pointing device (such as a mouse). Common events using this interface include click, dblclick, mouseup, mousedown. */
interface MouseEvent extends UIEvent {
    readonly altKey: boolean;
    readonly button: number;
    readonly buttons: number;
    readonly clientX: number;
    readonly clientY: number;
    readonly ctrlKey: boolean;
    readonly metaKey: boolean;
    readonly movementX: number;
    readonly movementY: number;
    readonly offsetX: number;
    readonly offsetY: number;
    readonly pageX: number;
    readonly pageY: number;
    readonly relatedTarget: EventTarget | null;
    readonly screenX: number;
    readonly screenY: number;
    readonly shiftKey: boolean;
    readonly x: number;
    readonly y: number;
    getModifierState(keyArg: string): boolean;
    /** @deprecated */
    initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget | null): void;
}

declare var MouseEvent: {
    prototype: MouseEvent;
    new(type: string, eventInitDict?: MouseEventInit): MouseEvent;
};

/**
 * Provides event properties that are specific to modifications to the Document Object Model (DOM) hierarchy and nodes.
 * @deprecated DOM4 [DOM] provides a new mechanism using a MutationObserver interface which addresses the use cases that mutation events solve, but in a more performant manner. Thus, this specification describes mutation events for reference and completeness of legacy behavior, but deprecates the use of the MutationEvent interface.
 */
interface MutationEvent extends Event {
    /** @deprecated */
    readonly attrChange: number;
    /** @deprecated */
    readonly attrName: string;
    /** @deprecated */
    readonly newValue: string;
    /** @deprecated */
    readonly prevValue: string;
    /** @deprecated */
    readonly relatedNode: Node | null;
    /** @deprecated */
    initMutationEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, relatedNodeArg?: Node | null, prevValueArg?: string, newValueArg?: string, attrNameArg?: string, attrChangeArg?: number): void;
    readonly ADDITION: number;
    readonly MODIFICATION: number;
    readonly REMOVAL: number;
}

/** @deprecated */
declare var MutationEvent: {
    prototype: MutationEvent;
    new(): MutationEvent;
    readonly ADDITION: number;
    readonly MODIFICATION: number;
    readonly REMOVAL: number;
};

/** Provides the ability to watch for changes being made to the DOM tree. It is designed as a replacement for the older Mutation Events feature which was part of the DOM3 Events specification. */
interface MutationObserver {
    /** Stops observer from observing any mutations. Until the observe() method is used again, observer's callback will not be invoked. */
    disconnect(): void;
    /**
     * Instructs the user agent to observe a given target (a node) and report any mutations based on the criteria given by options (an object).
     *
     * The options argument allows for setting mutation observation options via object members.
     */
    observe(target: Node, options?: MutationObserverInit): void;
    /** Empties the record queue and returns what was in there. */
    takeRecords(): MutationRecord[];
}

declare var MutationObserver: {
    prototype: MutationObserver;
    new(callback: MutationCallback): MutationObserver;
};

/** A MutationRecord represents an individual DOM mutation. It is the object that is passed to MutationObserver's callback. */
interface MutationRecord {
    /** Return the nodes added and removed respectively. */
    readonly addedNodes: NodeList;
    /** Returns the local name of the changed attribute, and null otherwise. */
    readonly attributeName: string | null;
    /** Returns the namespace of the changed attribute, and null otherwise. */
    readonly attributeNamespace: string | null;
    /** Return the previous and next sibling respectively of the added or removed nodes, and null otherwise. */
    readonly nextSibling: Node | null;
    /** The return value depends on type. For "attributes", it is the value of the changed attribute before the change. For "characterData", it is the data of the changed node before the change. For "childList", it is null. */
    readonly oldValue: string | null;
    /** Return the previous and next sibling respectively of the added or removed nodes, and null otherwise. */
    readonly previousSibling: Node | null;
    /** Return the nodes added and removed respectively. */
    readonly removedNodes: NodeList;
    /** Returns the node the mutation affected, depending on the type. For "attributes", it is the element whose attribute changed. For "characterData", it is the CharacterData node. For "childList", it is the node whose children changed. */
    readonly target: Node;
    /** Returns "attributes" if it was an attribute mutation. "characterData" if it was a mutation to a CharacterData node. And "childList" if it was a mutation to the tree of nodes. */
    readonly type: MutationRecordType;
}

declare var MutationRecord: {
    prototype: MutationRecord;
    new(): MutationRecord;
};

/** A collection of Attr objects. Objects inside a NamedNodeMap are not in any particular order, unlike NodeList, although they may be accessed by an index as in an array. */
interface NamedNodeMap {
    readonly length: number;
    getNamedItem(qualifiedName: string): Attr | null;
    getNamedItemNS(namespace: string | null, localName: string): Attr | null;
    item(index: number): Attr | null;
    removeNamedItem(qualifiedName: string): Attr;
    removeNamedItemNS(namespace: string | null, localName: string): Attr;
    setNamedItem(attr: Attr): Attr | null;
    setNamedItemNS(attr: Attr): Attr | null;
    [index: number]: Attr;
}

declare var NamedNodeMap: {
    prototype: NamedNodeMap;
    new(): NamedNodeMap;
};

/** The state and the identity of the user agent. It allows scripts to query it and to register themselves to carry on some activities. */
interface Navigator extends NavigatorAutomationInformation, NavigatorConcurrentHardware, NavigatorContentUtils, NavigatorCookies, NavigatorID, NavigatorLanguage, NavigatorNetworkInformation, NavigatorOnLine, NavigatorPlugins, NavigatorStorage {
    /** Available only in secure contexts. */
    readonly clipboard: Clipboard;
    /** Available only in secure contexts. */
    readonly credentials: CredentialsContainer;
    readonly doNotTrack: string | null;
    readonly geolocation: Geolocation;
    readonly maxTouchPoints: number;
    readonly mediaCapabilities: MediaCapabilities;
    /** Available only in secure contexts. */
    readonly mediaDevices: MediaDevices;
    readonly mediaSession: MediaSession;
    readonly permissions: Permissions;
    /** Available only in secure contexts. */
    readonly serviceWorker: ServiceWorkerContainer;
    /** Available only in secure contexts. */
    canShare(data?: ShareData): boolean;
    getGamepads(): (Gamepad | null)[];
    /** Available only in secure contexts. */
    requestMediaKeySystemAccess(keySystem: string, supportedConfigurations: MediaKeySystemConfiguration[]): Promise<MediaKeySystemAccess>;
    sendBeacon(url: string | URL, data?: BodyInit | null): boolean;
    /** Available only in secure contexts. */
    share(data?: ShareData): Promise<void>;
    vibrate(pattern: VibratePattern): boolean;
}

declare var Navigator: {
    prototype: Navigator;
    new(): Navigator;
};

interface NavigatorAutomationInformation {
    readonly webdriver: boolean;
}

interface NavigatorConcurrentHardware {
    readonly hardwareConcurrency: number;
}

interface NavigatorContentUtils {
    /** Available only in secure contexts. */
    registerProtocolHandler(scheme: string, url: string | URL): void;
}

interface NavigatorCookies {
    readonly cookieEnabled: boolean;
}

interface NavigatorID {
    /** @deprecated */
    readonly appCodeName: string;
    /** @deprecated */
    readonly appName: string;
    /** @deprecated */
    readonly appVersion: string;
    /** @deprecated */
    readonly platform: string;
    /** @deprecated */
    readonly product: string;
    /** @deprecated */
    readonly productSub: string;
    readonly userAgent: string;
    readonly vendor: string;
    /** @deprecated */
    readonly vendorSub: string;
}

interface NavigatorLanguage {
    readonly language: string;
    readonly languages: ReadonlyArray<string>;
}

interface NavigatorNetworkInformation {
    readonly connection: NetworkInformation;
}

interface NavigatorOnLine {
    readonly onLine: boolean;
}

interface NavigatorPlugins {
    /** @deprecated */
    readonly mimeTypes: MimeTypeArray;
    /** @deprecated */
    readonly plugins: PluginArray;
    /** @deprecated */
    javaEnabled(): boolean;
}

/** Available only in secure contexts. */
interface NavigatorStorage {
    readonly storage: StorageManager;
}

interface NetworkInformation extends EventTarget {
    readonly type: ConnectionType;
}

declare var NetworkInformation: {
    prototype: NetworkInformation;
    new(): NetworkInformation;
};

/** Node is an interface from which a number of DOM API object types inherit. It allows those types to be treated similarly; for example, inheriting the same set of methods, or being tested in the same way. */
interface Node extends EventTarget {
    /** Returns node's node document's document base URL. */
    readonly baseURI: string;
    /** Returns the children. */
    readonly childNodes: NodeListOf<ChildNode>;
    /** Returns the first child. */
    readonly firstChild: ChildNode | null;
    /** Returns true if node is connected and false otherwise. */
    readonly isConnected: boolean;
    /** Returns the last child. */
    readonly lastChild: ChildNode | null;
    /** Returns the next sibling. */
    readonly nextSibling: ChildNode | null;
    /** Returns a string appropriate for the type of node. */
    readonly nodeName: string;
    /** Returns the type of node. */
    readonly nodeType: number;
    nodeValue: string | null;
    /** Returns the node document. Returns null for documents. */
    readonly ownerDocument: Document | null;
    /** Returns the parent element. */
    readonly parentElement: HTMLElement | null;
    /** Returns the parent. */
    readonly parentNode: ParentNode | null;
    /** Returns the previous sibling. */
    readonly previousSibling: ChildNode | null;
    textContent: string | null;
    appendChild<T extends Node>(node: T): T;
    /** Returns a copy of node. If deep is true, the copy also includes the node's descendants. */
    cloneNode(deep?: boolean): Node;
    /** Returns a bitmask indicating the position of other relative to node. */
    compareDocumentPosition(other: Node): number;
    /** Returns true if other is an inclusive descendant of node, and false otherwise. */
    contains(other: Node | null): boolean;
    /** Returns node's root. */
    getRootNode(options?: GetRootNodeOptions): Node;
    /** Returns whether node has children. */
    hasChildNodes(): boolean;
    insertBefore<T extends Node>(node: T, child: Node | null): T;
    isDefaultNamespace(namespace: string | null): boolean;
    /** Returns whether node and otherNode have the same properties. */
    isEqualNode(otherNode: Node | null): boolean;
    isSameNode(otherNode: Node | null): boolean;
    lookupNamespaceURI(prefix: string | null): string | null;
    lookupPrefix(namespace: string | null): string | null;
    /** Removes empty exclusive Text nodes and concatenates the data of remaining contiguous exclusive Text nodes into the first of their nodes. */
    normalize(): void;
    removeChild<T extends Node>(child: T): T;
    replaceChild<T extends Node>(node: Node, child: T): T;
    readonly ATTRIBUTE_NODE: number;
    /** node is a CDATASection node. */
    readonly CDATA_SECTION_NODE: number;
    /** node is a Comment node. */
    readonly COMMENT_NODE: number;
    /** node is a DocumentFragment node. */
    readonly DOCUMENT_FRAGMENT_NODE: number;
    /** node is a document. */
    readonly DOCUMENT_NODE: number;
    /** Set when other is a descendant of node. */
    readonly DOCUMENT_POSITION_CONTAINED_BY: number;
    /** Set when other is an ancestor of node. */
    readonly DOCUMENT_POSITION_CONTAINS: number;
    /** Set when node and other are not in the same tree. */
    readonly DOCUMENT_POSITION_DISCONNECTED: number;
    /** Set when other is following node. */
    readonly DOCUMENT_POSITION_FOLLOWING: number;
    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
    /** Set when other is preceding node. */
    readonly DOCUMENT_POSITION_PRECEDING: number;
    /** node is a doctype. */
    readonly DOCUMENT_TYPE_NODE: number;
    /** node is an element. */
    readonly ELEMENT_NODE: number;
    readonly ENTITY_NODE: number;
    readonly ENTITY_REFERENCE_NODE: number;
    readonly NOTATION_NODE: number;
    /** node is a ProcessingInstruction node. */
    readonly PROCESSING_INSTRUCTION_NODE: number;
    /** node is a Text node. */
    readonly TEXT_NODE: number;
}

declare var Node: {
    prototype: Node;
    new(): Node;
    readonly ATTRIBUTE_NODE: number;
    /** node is a CDATASection node. */
    readonly CDATA_SECTION_NODE: number;
    /** node is a Comment node. */
    readonly COMMENT_NODE: number;
    /** node is a DocumentFragment node. */
    readonly DOCUMENT_FRAGMENT_NODE: number;
    /** node is a document. */
    readonly DOCUMENT_NODE: number;
    /** Set when other is a descendant of node. */
    readonly DOCUMENT_POSITION_CONTAINED_BY: number;
    /** Set when other is an ancestor of node. */
    readonly DOCUMENT_POSITION_CONTAINS: number;
    /** Set when node and other are not in the same tree. */
    readonly DOCUMENT_POSITION_DISCONNECTED: number;
    /** Set when other is following node. */
    readonly DOCUMENT_POSITION_FOLLOWING: number;
    readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
    /** Set when other is preceding node. */
    readonly DOCUMENT_POSITION_PRECEDING: number;
    /** node is a doctype. */
    readonly DOCUMENT_TYPE_NODE: number;
    /** node is an element. */
    readonly ELEMENT_NODE: number;
    readonly ENTITY_NODE: number;
    readonly ENTITY_REFERENCE_NODE: number;
    readonly NOTATION_NODE: number;
    /** node is a ProcessingInstruction node. */
    readonly PROCESSING_INSTRUCTION_NODE: number;
    /** node is a Text node. */
    readonly TEXT_NODE: number;
};

/** An iterator over the members of a list of the nodes in a subtree of the DOM. The nodes will be returned in document order. */
interface NodeIterator {
    readonly filter: NodeFilter | null;
    readonly pointerBeforeReferenceNode: boolean;
    readonly referenceNode: Node;
    readonly root: Node;
    readonly whatToShow: number;
    /** @deprecated */
    detach(): void;
    nextNode(): Node | null;
    previousNode(): Node | null;
}

declare var NodeIterator: {
    prototype: NodeIterator;
    new(): NodeIterator;
};

/** NodeList objects are collections of nodes, usually returned by properties such as Node.childNodes and methods such as document.querySelectorAll(). */
interface NodeList {
    /** Returns the number of nodes in the collection. */
    readonly length: number;
    /** Returns the node with index index from the collection. The nodes are sorted in tree order. */
    item(index: number): Node | null;
    /**
     * Performs the specified action for each node in an list.
     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the list.
     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
     */
    forEach(callbackfn: (value: Node, key: number, parent: NodeList) => void, thisArg?: any): void;
    [index: number]: Node;
}

declare var NodeList: {
    prototype: NodeList;
    new(): NodeList;
};

interface NodeListOf<TNode extends Node> extends NodeList {
    item(index: number): TNode;
    /**
     * Performs the specified action for each node in an list.
     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the list.
     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
     */
    forEach(callbackfn: (value: TNode, key: number, parent: NodeListOf<TNode>) => void, thisArg?: any): void;
    [index: number]: TNode;
}

interface NonDocumentTypeChildNode {
    /** Returns the first following sibling that is an element, and null otherwise. */
    readonly nextElementSibling: Element | null;
    /** Returns the first preceding sibling that is an element, and null otherwise. */
    readonly previousElementSibling: Element | null;
}

interface NonElementParentNode {
    /** Returns the first element within node's descendants whose ID is elementId. */
    getElementById(elementId: string): Element | null;
}

interface NotificationEventMap {
    "click": Event;
    "close": Event;
    "error": Event;
    "show": Event;
}

/** This Notifications API interface is used to configure and display desktop notifications to the user. */
interface Notification extends EventTarget {
    readonly body: string;
    readonly data: any;
    readonly dir: NotificationDirection;
    readonly icon: string;
    readonly lang: string;
    onclick: ((this: Notification, ev: Event) => any) | null;
    onclose: ((this: Notification, ev: Event) => any) | null;
    onerror: ((this: Notification, ev: Event) => any) | null;
    onshow: ((this: Notification, ev: Event) => any) | null;
    readonly tag: string;
    readonly title: string;
    close(): void;
    addEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Notification: {
    prototype: Notification;
    new(title: string, options?: NotificationOptions): Notification;
    readonly permission: NotificationPermission;
    requestPermission(deprecatedCallback?: NotificationPermissionCallback): Promise<NotificationPermission>;
};

/** The OES_element_index_uint extension is part of the WebGL API and adds support for gl.UNSIGNED_INT types to WebGLRenderingContext.drawElements(). */
interface OES_element_index_uint {
}

interface OES_fbo_render_mipmap {
}

/** The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth. */
interface OES_standard_derivatives {
    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: GLenum;
}

/** The OES_texture_float extension is part of the WebGL API and exposes floating-point pixel types for textures. */
interface OES_texture_float {
}

/** The OES_texture_float_linear extension is part of the WebGL API and allows linear filtering with floating-point pixel types for textures. */
interface OES_texture_float_linear {
}

/** The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components. */
interface OES_texture_half_float {
    readonly HALF_FLOAT_OES: GLenum;
}

/** The OES_texture_half_float_linear extension is part of the WebGL API and allows linear filtering with half floating-point pixel types for textures. */
interface OES_texture_half_float_linear {
}

interface OES_vertex_array_object {
    bindVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
    createVertexArrayOES(): WebGLVertexArrayObjectOES | null;
    deleteVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
    isVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): GLboolean;
    readonly VERTEX_ARRAY_BINDING_OES: GLenum;
}

interface OVR_multiview2 {
    framebufferTextureMultiviewOVR(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, baseViewIndex: GLint, numViews: GLsizei): void;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: GLenum;
    readonly MAX_VIEWS_OVR: GLenum;
}

/** The Web Audio API OfflineAudioCompletionEvent interface represents events that occur when the processing of an OfflineAudioContext is terminated. The complete event implements this interface. */
interface OfflineAudioCompletionEvent extends Event {
    readonly renderedBuffer: AudioBuffer;
}

declare var OfflineAudioCompletionEvent: {
    prototype: OfflineAudioCompletionEvent;
    new(type: string, eventInitDict: OfflineAudioCompletionEventInit): OfflineAudioCompletionEvent;
};

interface OfflineAudioContextEventMap extends BaseAudioContextEventMap {
    "complete": OfflineAudioCompletionEvent;
}

/** An AudioContext interface representing an audio-processing graph built from linked together AudioNodes. In contrast with a standard AudioContext, an OfflineAudioContext doesn't render the audio to the device hardware; instead, it generates it, as fast as it can, and outputs the result to an AudioBuffer. */
interface OfflineAudioContext extends BaseAudioContext {
    readonly length: number;
    oncomplete: ((this: OfflineAudioContext, ev: OfflineAudioCompletionEvent) => any) | null;
    resume(): Promise<void>;
    startRendering(): Promise<AudioBuffer>;
    suspend(suspendTime: number): Promise<void>;
    addEventListener<K extends keyof OfflineAudioContextEventMap>(type: K, listener: (this: OfflineAudioContext, ev: OfflineAudioContextEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof OfflineAudioContextEventMap>(type: K, listener: (this: OfflineAudioContext, ev: OfflineAudioContextEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var OfflineAudioContext: {
    prototype: OfflineAudioContext;
    new(contextOptions: OfflineAudioContextOptions): OfflineAudioContext;
    new(numberOfChannels: number, length: number, sampleRate: number): OfflineAudioContext;
};

/** The OscillatorNode\xA0interface represents a periodic waveform, such as a sine wave. It is an AudioScheduledSourceNode audio-processing module that causes a specified frequency\xA0of a given wave to be created\u2014in effect, a constant tone. */
interface OscillatorNode extends AudioScheduledSourceNode {
    readonly detune: AudioParam;
    readonly frequency: AudioParam;
    type: OscillatorType;
    setPeriodicWave(periodicWave: PeriodicWave): void;
    addEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: OscillatorNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AudioScheduledSourceNodeEventMap>(type: K, listener: (this: OscillatorNode, ev: AudioScheduledSourceNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var OscillatorNode: {
    prototype: OscillatorNode;
    new(context: BaseAudioContext, options?: OscillatorOptions): OscillatorNode;
};

interface OverconstrainedError extends Error {
    readonly constraint: string;
}

declare var OverconstrainedError: {
    prototype: OverconstrainedError;
    new(constraint: string, message?: string): OverconstrainedError;
};

/** The PageTransitionEvent is fired when a document is being loaded or unloaded. */
interface PageTransitionEvent extends Event {
    /**
     * For the pageshow event, returns false if the page is newly being loaded (and the load event will fire). Otherwise, returns true.
     *
     * For the pagehide event, returns false if the page is going away for the last time. Otherwise, returns true, meaning that (if nothing conspires to make the page unsalvageable) the page might be reused if the user navigates back to this page.
     *
     * Things that can cause the page to be unsalvageable include:
     *
     * The user agent decided to not keep the Document alive in a session history entry after unload
     * Having iframes that are not salvageable
     * Active WebSocket objects
     * Aborting a Document
     */
    readonly persisted: boolean;
}

declare var PageTransitionEvent: {
    prototype: PageTransitionEvent;
    new(type: string, eventInitDict?: PageTransitionEventInit): PageTransitionEvent;
};

/** A PannerNode always has exactly one input and one output: the input can be mono or stereo but the output is always stereo (2 channels); you can't have panning effects without at least two audio channels! */
interface PannerNode extends AudioNode {
    coneInnerAngle: number;
    coneOuterAngle: number;
    coneOuterGain: number;
    distanceModel: DistanceModelType;
    maxDistance: number;
    readonly orientationX: AudioParam;
    readonly orientationY: AudioParam;
    readonly orientationZ: AudioParam;
    panningModel: PanningModelType;
    readonly positionX: AudioParam;
    readonly positionY: AudioParam;
    readonly positionZ: AudioParam;
    refDistance: number;
    rolloffFactor: number;
    /** @deprecated */
    setOrientation(x: number, y: number, z: number): void;
    /** @deprecated */
    setPosition(x: number, y: number, z: number): void;
}

declare var PannerNode: {
    prototype: PannerNode;
    new(context: BaseAudioContext, options?: PannerOptions): PannerNode;
};

interface ParentNode extends Node {
    readonly childElementCount: number;
    /** Returns the child elements. */
    readonly children: HTMLCollection;
    /** Returns the first child that is an element, and null otherwise. */
    readonly firstElementChild: Element | null;
    /** Returns the last child that is an element, and null otherwise. */
    readonly lastElementChild: Element | null;
    /**
     * Inserts nodes after the last child of node, while replacing strings in nodes with equivalent Text nodes.
     *
     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
     */
    append(...nodes: (Node | string)[]): void;
    /**
     * Inserts nodes before the first child of node, while replacing strings in nodes with equivalent Text nodes.
     *
     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
     */
    prepend(...nodes: (Node | string)[]): void;
    /** Returns the first element that is a descendant of node that matches selectors. */
    querySelector<K extends keyof HTMLElementTagNameMap>(selectors: K): HTMLElementTagNameMap[K] | null;
    querySelector<K extends keyof SVGElementTagNameMap>(selectors: K): SVGElementTagNameMap[K] | null;
    querySelector<E extends Element = Element>(selectors: string): E | null;
    /** Returns all element descendants of node that match selectors. */
    querySelectorAll<K extends keyof HTMLElementTagNameMap>(selectors: K): NodeListOf<HTMLElementTagNameMap[K]>;
    querySelectorAll<K extends keyof SVGElementTagNameMap>(selectors: K): NodeListOf<SVGElementTagNameMap[K]>;
    querySelectorAll<E extends Element = Element>(selectors: string): NodeListOf<E>;
    /**
     * Replace all children of node with nodes, while replacing strings in nodes with equivalent Text nodes.
     *
     * Throws a "HierarchyRequestError" DOMException if the constraints of the node tree are violated.
     */
    replaceChildren(...nodes: (Node | string)[]): void;
}

/** This Canvas 2D API interface is used to declare a path that can then be used on a CanvasRenderingContext2D object. The path methods of the CanvasRenderingContext2D interface are also present on this interface, which gives you the convenience of being able to retain and replay your path whenever desired. */
interface Path2D extends CanvasPath {
    /** Adds to the path the path given by the argument. */
    addPath(path: Path2D, transform?: DOMMatrix2DInit): void;
}

declare var Path2D: {
    prototype: Path2D;
    new(path?: Path2D | string): Path2D;
};

/** Available only in secure contexts. */
interface PaymentMethodChangeEvent extends PaymentRequestUpdateEvent {
    readonly methodDetails: any;
    readonly methodName: string;
}

declare var PaymentMethodChangeEvent: {
    prototype: PaymentMethodChangeEvent;
    new(type: string, eventInitDict?: PaymentMethodChangeEventInit): PaymentMethodChangeEvent;
};

interface PaymentRequestEventMap {
    "paymentmethodchange": Event;
}

/**
 * This Payment Request API interface is the primary access point into the API, and lets web content and apps accept payments from the end user.
 * Available only in secure contexts.
 */
interface PaymentRequest extends EventTarget {
    readonly id: string;
    onpaymentmethodchange: ((this: PaymentRequest, ev: Event) => any) | null;
    abort(): Promise<void>;
    canMakePayment(): Promise<boolean>;
    show(detailsPromise?: PaymentDetailsUpdate | PromiseLike<PaymentDetailsUpdate>): Promise<PaymentResponse>;
    addEventListener<K extends keyof PaymentRequestEventMap>(type: K, listener: (this: PaymentRequest, ev: PaymentRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof PaymentRequestEventMap>(type: K, listener: (this: PaymentRequest, ev: PaymentRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var PaymentRequest: {
    prototype: PaymentRequest;
    new(methodData: PaymentMethodData[], details: PaymentDetailsInit): PaymentRequest;
};

/**
 * This Payment Request API interface enables a web page to update the details of a PaymentRequest in response to a user action.
 * Available only in secure contexts.
 */
interface PaymentRequestUpdateEvent extends Event {
    updateWith(detailsPromise: PaymentDetailsUpdate | PromiseLike<PaymentDetailsUpdate>): void;
}

declare var PaymentRequestUpdateEvent: {
    prototype: PaymentRequestUpdateEvent;
    new(type: string, eventInitDict?: PaymentRequestUpdateEventInit): PaymentRequestUpdateEvent;
};

/**
 * This Payment Request API interface is returned after a user selects a payment method and approves a payment request.
 * Available only in secure contexts.
 */
interface PaymentResponse extends EventTarget {
    readonly details: any;
    readonly methodName: string;
    readonly requestId: string;
    complete(result?: PaymentComplete): Promise<void>;
    retry(errorFields?: PaymentValidationErrors): Promise<void>;
    toJSON(): any;
}

declare var PaymentResponse: {
    prototype: PaymentResponse;
    new(): PaymentResponse;
};

interface PerformanceEventMap {
    "resourcetimingbufferfull": Event;
}

/** Provides access to performance-related information for the current page. It's part of the High Resolution Time API, but is enhanced by the Performance Timeline API, the Navigation Timing API, the User Timing API, and the Resource Timing API. */
interface Performance extends EventTarget {
    /** @deprecated */
    readonly navigation: PerformanceNavigation;
    onresourcetimingbufferfull: ((this: Performance, ev: Event) => any) | null;
    readonly timeOrigin: DOMHighResTimeStamp;
    /** @deprecated */
    readonly timing: PerformanceTiming;
    clearMarks(markName?: string): void;
    clearMeasures(measureName?: string): void;
    clearResourceTimings(): void;
    getEntries(): PerformanceEntryList;
    getEntriesByName(name: string, type?: string): PerformanceEntryList;
    getEntriesByType(type: string): PerformanceEntryList;
    mark(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
    measure(measureName: string, startOrMeasureOptions?: string | PerformanceMeasureOptions, endMark?: string): PerformanceMeasure;
    now(): DOMHighResTimeStamp;
    setResourceTimingBufferSize(maxSize: number): void;
    toJSON(): any;
    addEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Performance: {
    prototype: Performance;
    new(): Performance;
};

/** Encapsulates a single performance metric that is part of the performance timeline. A performance entry can be directly created by making a performance mark or measure (for example by calling the mark() method) at an explicit point in an application. Performance entries are also created in indirect ways such as loading a resource (such as an image). */
interface PerformanceEntry {
    readonly duration: DOMHighResTimeStamp;
    readonly entryType: string;
    readonly name: string;
    readonly startTime: DOMHighResTimeStamp;
    toJSON(): any;
}

declare var PerformanceEntry: {
    prototype: PerformanceEntry;
    new(): PerformanceEntry;
};

interface PerformanceEventTiming extends PerformanceEntry {
    readonly cancelable: boolean;
    readonly processingEnd: DOMHighResTimeStamp;
    readonly processingStart: DOMHighResTimeStamp;
    readonly target: Node | null;
}

declare var PerformanceEventTiming: {
    prototype: PerformanceEventTiming;
    new(): PerformanceEventTiming;
};

/** PerformanceMark\xA0is an abstract interface for PerformanceEntry objects with an entryType of "mark". Entries of this type are created by calling performance.mark() to add a named DOMHighResTimeStamp (the mark) to the browser's performance timeline. */
interface PerformanceMark extends PerformanceEntry {
    readonly detail: any;
}

declare var PerformanceMark: {
    prototype: PerformanceMark;
    new(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
};

/** PerformanceMeasure is an abstract interface for PerformanceEntry objects with an entryType of "measure". Entries of this type are created by calling performance.measure() to add a named DOMHighResTimeStamp (the measure) between two marks to the browser's performance timeline. */
interface PerformanceMeasure extends PerformanceEntry {
    readonly detail: any;
}

declare var PerformanceMeasure: {
    prototype: PerformanceMeasure;
    new(): PerformanceMeasure;
};

/**
 * The legacy PerformanceNavigation interface represents information about how the navigation to the current document was done.
 * @deprecated This interface is deprecated in the Navigation Timing Level 2 specification. Please use the PerformanceNavigationTiming interface instead.
 */
interface PerformanceNavigation {
    /** @deprecated */
    readonly redirectCount: number;
    /** @deprecated */
    readonly type: number;
    /** @deprecated */
    toJSON(): any;
    readonly TYPE_BACK_FORWARD: number;
    readonly TYPE_NAVIGATE: number;
    readonly TYPE_RELOAD: number;
    readonly TYPE_RESERVED: number;
}

/** @deprecated */
declare var PerformanceNavigation: {
    prototype: PerformanceNavigation;
    new(): PerformanceNavigation;
    readonly TYPE_BACK_FORWARD: number;
    readonly TYPE_NAVIGATE: number;
    readonly TYPE_RELOAD: number;
    readonly TYPE_RESERVED: number;
};

/** Provides methods and properties to store and retrieve metrics regarding the browser's document navigation events. For example, this interface can be used to determine how much time it takes to load or unload a document. */
interface PerformanceNavigationTiming extends PerformanceResourceTiming {
    readonly domComplete: DOMHighResTimeStamp;
    readonly domContentLoadedEventEnd: DOMHighResTimeStamp;
    readonly domContentLoadedEventStart: DOMHighResTimeStamp;
    readonly domInteractive: DOMHighResTimeStamp;
    readonly loadEventEnd: DOMHighResTimeStamp;
    readonly loadEventStart: DOMHighResTimeStamp;
    readonly redirectCount: number;
    readonly type: NavigationType;
    readonly unloadEventEnd: DOMHighResTimeStamp;
    readonly unloadEventStart: DOMHighResTimeStamp;
    toJSON(): any;
}

declare var PerformanceNavigationTiming: {
    prototype: PerformanceNavigationTiming;
    new(): PerformanceNavigationTiming;
};

interface PerformanceObserver {
    disconnect(): void;
    observe(options?: PerformanceObserverInit): void;
    takeRecords(): PerformanceEntryList;
}

declare var PerformanceObserver: {
    prototype: PerformanceObserver;
    new(callback: PerformanceObserverCallback): PerformanceObserver;
    readonly supportedEntryTypes: ReadonlyArray<string>;
};

interface PerformanceObserverEntryList {
    getEntries(): PerformanceEntryList;
    getEntriesByName(name: string, type?: string): PerformanceEntryList;
    getEntriesByType(type: string): PerformanceEntryList;
}

declare var PerformanceObserverEntryList: {
    prototype: PerformanceObserverEntryList;
    new(): PerformanceObserverEntryList;
};

interface PerformancePaintTiming extends PerformanceEntry {
}

declare var PerformancePaintTiming: {
    prototype: PerformancePaintTiming;
    new(): PerformancePaintTiming;
};

/** Enables retrieval and analysis of detailed network timing data regarding the loading of an application's resources. An application can use the timing metrics to determine, for example, the length of time it takes to fetch a specific resource, such as an XMLHttpRequest, <SVG>, image, or script. */
interface PerformanceResourceTiming extends PerformanceEntry {
    readonly connectEnd: DOMHighResTimeStamp;
    readonly connectStart: DOMHighResTimeStamp;
    readonly decodedBodySize: number;
    readonly domainLookupEnd: DOMHighResTimeStamp;
    readonly domainLookupStart: DOMHighResTimeStamp;
    readonly encodedBodySize: number;
    readonly fetchStart: DOMHighResTimeStamp;
    readonly initiatorType: string;
    readonly nextHopProtocol: string;
    readonly redirectEnd: DOMHighResTimeStamp;
    readonly redirectStart: DOMHighResTimeStamp;
    readonly requestStart: DOMHighResTimeStamp;
    readonly responseEnd: DOMHighResTimeStamp;
    readonly responseStart: DOMHighResTimeStamp;
    readonly secureConnectionStart: DOMHighResTimeStamp;
    readonly serverTiming: ReadonlyArray<PerformanceServerTiming>;
    readonly transferSize: number;
    readonly workerStart: DOMHighResTimeStamp;
    toJSON(): any;
}

declare var PerformanceResourceTiming: {
    prototype: PerformanceResourceTiming;
    new(): PerformanceResourceTiming;
};

interface PerformanceServerTiming {
    readonly description: string;
    readonly duration: DOMHighResTimeStamp;
    readonly name: string;
    toJSON(): any;
}

declare var PerformanceServerTiming: {
    prototype: PerformanceServerTiming;
    new(): PerformanceServerTiming;
};

/**
 * A legacy interface kept for backwards compatibility and contains properties that offer performance timing information for various events which occur during the loading and use of the current page. You get a PerformanceTiming object describing your page using the window.performance.timing property.
 * @deprecated This interface is deprecated in the Navigation Timing Level 2 specification. Please use the PerformanceNavigationTiming interface instead.
 */
interface PerformanceTiming {
    /** @deprecated */
    readonly connectEnd: number;
    /** @deprecated */
    readonly connectStart: number;
    /** @deprecated */
    readonly domComplete: number;
    /** @deprecated */
    readonly domContentLoadedEventEnd: number;
    /** @deprecated */
    readonly domContentLoadedEventStart: number;
    /** @deprecated */
    readonly domInteractive: number;
    /** @deprecated */
    readonly domLoading: number;
    /** @deprecated */
    readonly domainLookupEnd: number;
    /** @deprecated */
    readonly domainLookupStart: number;
    /** @deprecated */
    readonly fetchStart: number;
    /** @deprecated */
    readonly loadEventEnd: number;
    /** @deprecated */
    readonly loadEventStart: number;
    /** @deprecated */
    readonly navigationStart: number;
    /** @deprecated */
    readonly redirectEnd: number;
    /** @deprecated */
    readonly redirectStart: number;
    /** @deprecated */
    readonly requestStart: number;
    /** @deprecated */
    readonly responseEnd: number;
    /** @deprecated */
    readonly responseStart: number;
    /** @deprecated */
    readonly secureConnectionStart: number;
    /** @deprecated */
    readonly unloadEventEnd: number;
    /** @deprecated */
    readonly unloadEventStart: number;
    /** @deprecated */
    toJSON(): any;
}

/** @deprecated */
declare var PerformanceTiming: {
    prototype: PerformanceTiming;
    new(): PerformanceTiming;
};

/** PeriodicWave has no inputs or outputs; it is used to define custom oscillators when calling OscillatorNode.setPeriodicWave(). The PeriodicWave itself is created/returned by AudioContext.createPeriodicWave(). */
interface PeriodicWave {
}

declare var PeriodicWave: {
    prototype: PeriodicWave;
    new(context: BaseAudioContext, options?: PeriodicWaveOptions): PeriodicWave;
};

interface PermissionStatusEventMap {
    "change": Event;
}

interface PermissionStatus extends EventTarget {
    onchange: ((this: PermissionStatus, ev: Event) => any) | null;
    readonly state: PermissionState;
    addEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var PermissionStatus: {
    prototype: PermissionStatus;
    new(): PermissionStatus;
};

interface Permissions {
    query(permissionDesc: PermissionDescriptor): Promise<PermissionStatus>;
}

declare var Permissions: {
    prototype: Permissions;
    new(): Permissions;
};

interface PictureInPictureWindowEventMap {
    "resize": Event;
}

interface PictureInPictureWindow extends EventTarget {
    readonly height: number;
    onresize: ((this: PictureInPictureWindow, ev: Event) => any) | null;
    readonly width: number;
    addEventListener<K extends keyof PictureInPictureWindowEventMap>(type: K, listener: (this: PictureInPictureWindow, ev: PictureInPictureWindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof PictureInPictureWindowEventMap>(type: K, listener: (this: PictureInPictureWindow, ev: PictureInPictureWindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var PictureInPictureWindow: {
    prototype: PictureInPictureWindow;
    new(): PictureInPictureWindow;
};

/**
 * Provides information about a browser plugin.
 * @deprecated
 */
interface Plugin {
    /**
     * Returns the plugin's description.
     * @deprecated
     */
    readonly description: string;
    /**
     * Returns the plugin library's filename, if applicable on the current platform.
     * @deprecated
     */
    readonly filename: string;
    /**
     * Returns the number of MIME types, represented by MimeType objects, supported by the plugin.
     * @deprecated
     */
    readonly length: number;
    /**
     * Returns the plugin's name.
     * @deprecated
     */
    readonly name: string;
    /**
     * Returns the specified MimeType object.
     * @deprecated
     */
    item(index: number): MimeType | null;
    /** @deprecated */
    namedItem(name: string): MimeType | null;
    [index: number]: MimeType;
}

/** @deprecated */
declare var Plugin: {
    prototype: Plugin;
    new(): Plugin;
};

/**
 * Used to store a list of Plugin objects describing the available plugins; it's returned by the window.navigator.plugins\xA0property. The PluginArray is not a JavaScript array, but has the length property and supports accessing individual items using bracket notation (plugins[2]), as well as via item(index) and namedItem("name") methods.
 * @deprecated
 */
interface PluginArray {
    /** @deprecated */
    readonly length: number;
    /** @deprecated */
    item(index: number): Plugin | null;
    /** @deprecated */
    namedItem(name: string): Plugin | null;
    /** @deprecated */
    refresh(): void;
    [index: number]: Plugin;
}

/** @deprecated */
declare var PluginArray: {
    prototype: PluginArray;
    new(): PluginArray;
};

/** The state of a DOM event produced by a pointer such as the geometry of the contact point, the device type that generated the event, the amount of pressure that was applied on the contact surface, etc. */
interface PointerEvent extends MouseEvent {
    readonly height: number;
    readonly isPrimary: boolean;
    readonly pointerId: number;
    readonly pointerType: string;
    readonly pressure: number;
    readonly tangentialPressure: number;
    readonly tiltX: number;
    readonly tiltY: number;
    readonly twist: number;
    readonly width: number;
    /** Available only in secure contexts. */
    getCoalescedEvents(): PointerEvent[];
    getPredictedEvents(): PointerEvent[];
}

declare var PointerEvent: {
    prototype: PointerEvent;
    new(type: string, eventInitDict?: PointerEventInit): PointerEvent;
};

/** PopStateEvent is an event handler for the popstate event on the window. */
interface PopStateEvent extends Event {
    /** Returns a copy of the information that was provided to pushState() or replaceState(). */
    readonly state: any;
}

declare var PopStateEvent: {
    prototype: PopStateEvent;
    new(type: string, eventInitDict?: PopStateEventInit): PopStateEvent;
};

/** A processing instruction embeds application-specific instructions in XML which can be ignored by other applications that don't recognize them. */
interface ProcessingInstruction extends CharacterData, LinkStyle {
    readonly ownerDocument: Document;
    readonly target: string;
}

declare var ProcessingInstruction: {
    prototype: ProcessingInstruction;
    new(): ProcessingInstruction;
};

/** Events measuring progress of an underlying process, like an HTTP request (for an XMLHttpRequest, or the loading of the underlying resource of an <img>, <audio>, <video>, <style> or <link>). */
interface ProgressEvent<T extends EventTarget = EventTarget> extends Event {
    readonly lengthComputable: boolean;
    readonly loaded: number;
    readonly target: T | null;
    readonly total: number;
}

declare var ProgressEvent: {
    prototype: ProgressEvent;
    new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent;
};

interface PromiseRejectionEvent extends Event {
    readonly promise: Promise<any>;
    readonly reason: any;
}

declare var PromiseRejectionEvent: {
    prototype: PromiseRejectionEvent;
    new(type: string, eventInitDict: PromiseRejectionEventInit): PromiseRejectionEvent;
};

/** Available only in secure contexts. */
interface PublicKeyCredential extends Credential {
    readonly rawId: ArrayBuffer;
    readonly response: AuthenticatorResponse;
    getClientExtensionResults(): AuthenticationExtensionsClientOutputs;
}

declare var PublicKeyCredential: {
    prototype: PublicKeyCredential;
    new(): PublicKeyCredential;
    isUserVerifyingPlatformAuthenticatorAvailable(): Promise<boolean>;
};

/**
 * This Push API interface provides a way to receive notifications from third-party servers as well as request URLs for push notifications.
 * Available only in secure contexts.
 */
interface PushManager {
    getSubscription(): Promise<PushSubscription | null>;
    permissionState(options?: PushSubscriptionOptionsInit): Promise<PushPermissionState>;
    subscribe(options?: PushSubscriptionOptionsInit): Promise<PushSubscription>;
}

declare var PushManager: {
    prototype: PushManager;
    new(): PushManager;
    readonly supportedContentEncodings: ReadonlyArray<string>;
};

/**
 * This Push API interface provides a subcription's URL endpoint and allows unsubscription from a push service.
 * Available only in secure contexts.
 */
interface PushSubscription {
    readonly endpoint: string;
    readonly options: PushSubscriptionOptions;
    getKey(name: PushEncryptionKeyName): ArrayBuffer | null;
    toJSON(): PushSubscriptionJSON;
    unsubscribe(): Promise<boolean>;
}

declare var PushSubscription: {
    prototype: PushSubscription;
    new(): PushSubscription;
};

/** Available only in secure contexts. */
interface PushSubscriptionOptions {
    readonly applicationServerKey: ArrayBuffer | null;
}

declare var PushSubscriptionOptions: {
    prototype: PushSubscriptionOptions;
    new(): PushSubscriptionOptions;
};

interface RTCCertificate {
    readonly expires: DOMTimeStamp;
    getFingerprints(): RTCDtlsFingerprint[];
}

declare var RTCCertificate: {
    prototype: RTCCertificate;
    new(): RTCCertificate;
};

interface RTCDTMFSenderEventMap {
    "tonechange": RTCDTMFToneChangeEvent;
}

interface RTCDTMFSender extends EventTarget {
    readonly canInsertDTMF: boolean;
    ontonechange: ((this: RTCDTMFSender, ev: RTCDTMFToneChangeEvent) => any) | null;
    readonly toneBuffer: string;
    insertDTMF(tones: string, duration?: number, interToneGap?: number): void;
    addEventListener<K extends keyof RTCDTMFSenderEventMap>(type: K, listener: (this: RTCDTMFSender, ev: RTCDTMFSenderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof RTCDTMFSenderEventMap>(type: K, listener: (this: RTCDTMFSender, ev: RTCDTMFSenderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var RTCDTMFSender: {
    prototype: RTCDTMFSender;
    new(): RTCDTMFSender;
};

/** Events sent to indicate that DTMF tones have started or finished playing. This interface is used by the tonechange event. */
interface RTCDTMFToneChangeEvent extends Event {
    readonly tone: string;
}

declare var RTCDTMFToneChangeEvent: {
    prototype: RTCDTMFToneChangeEvent;
    new(type: string, eventInitDict?: RTCDTMFToneChangeEventInit): RTCDTMFToneChangeEvent;
};

interface RTCDataChannelEventMap {
    "bufferedamountlow": Event;
    "close": Event;
    "error": Event;
    "message": MessageEvent;
    "open": Event;
}

interface RTCDataChannel extends EventTarget {
    binaryType: BinaryType;
    readonly bufferedAmount: number;
    bufferedAmountLowThreshold: number;
    readonly id: number | null;
    readonly label: string;
    readonly maxPacketLifeTime: number | null;
    readonly maxRetransmits: number | null;
    readonly negotiated: boolean;
    onbufferedamountlow: ((this: RTCDataChannel, ev: Event) => any) | null;
    onclose: ((this: RTCDataChannel, ev: Event) => any) | null;
    onerror: ((this: RTCDataChannel, ev: Event) => any) | null;
    onmessage: ((this: RTCDataChannel, ev: MessageEvent) => any) | null;
    onopen: ((this: RTCDataChannel, ev: Event) => any) | null;
    readonly ordered: boolean;
    readonly protocol: string;
    readonly readyState: RTCDataChannelState;
    close(): void;
    send(data: string): void;
    send(data: Blob): void;
    send(data: ArrayBuffer): void;
    send(data: ArrayBufferView): void;
    addEventListener<K extends keyof RTCDataChannelEventMap>(type: K, listener: (this: RTCDataChannel, ev: RTCDataChannelEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof RTCDataChannelEventMap>(type: K, listener: (this: RTCDataChannel, ev: RTCDataChannelEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var RTCDataChannel: {
    prototype: RTCDataChannel;
    new(): RTCDataChannel;
};

interface RTCDataChannelEvent extends Event {
    readonly channel: RTCDataChannel;
}

declare var RTCDataChannelEvent: {
    prototype: RTCDataChannelEvent;
    new(type: string, eventInitDict: RTCDataChannelEventInit): RTCDataChannelEvent;
};

interface RTCDtlsTransportEventMap {
    "statechange": Event;
}

interface RTCDtlsTransport extends EventTarget {
    onstatechange: ((this: RTCDtlsTransport, ev: Event) => any) | null;
    readonly state: RTCDtlsTransportState;
    addEventListener<K extends keyof RTCDtlsTransportEventMap>(type: K, listener: (this: RTCDtlsTransport, ev: RTCDtlsTransportEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof RTCDtlsTransportEventMap>(type: K, listener: (this: RTCDtlsTransport, ev: RTCDtlsTransportEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var RTCDtlsTransport: {
    prototype: RTCDtlsTransport;
    new(): RTCDtlsTransport;
};

/** The RTCIceCandidate interface\u2014part of the WebRTC API\u2014represents a candidate Internet Connectivity Establishment (ICE) configuration which may be used to establish an RTCPeerConnection. */
interface RTCIceCandidate {
    readonly address: string | null;
    readonly candidate: string;
    readonly component: RTCIceComponent | null;
    readonly foundation: string | null;
    readonly port: number | null;
    readonly priority: number | null;
    readonly protocol: RTCIceProtocol | null;
    readonly relatedAddress: string | null;
    readonly relatedPort: number | null;
    readonly sdpMLineIndex: number | null;
    readonly sdpMid: string | null;
    readonly tcpType: RTCIceTcpCandidateType | null;
    readonly type: RTCIceCandidateType | null;
    readonly usernameFragment: string | null;
    toJSON(): RTCIceCandidateInit;
}

declare var RTCIceCandidate: {
    prototype: RTCIceCandidate;
    new(candidateInitDict?: RTCIceCandidateInit): RTCIceCandidate;
};

/** Provides access to information about the ICE transport layer over which the data is being sent and received. */
interface RTCIceTransport extends EventTarget {
    readonly gatheringState: RTCIceGathererState;
    readonly state: RTCIceTransportState;
}

declare var RTCIceTransport: {
    prototype: RTCIceTransport;
    new(): RTCIceTransport;
};

interface RTCPeerConnectionEventMap {
    "connectionstatechange": Event;
    "datachannel": RTCDataChannelEvent;
    "icecandidate": RTCPeerConnectionIceEvent;
    "icecandidateerror": Event;
    "iceconnectionstatechange": Event;
    "icegatheringstatechange": Event;
    "negotiationneeded": Event;
    "signalingstatechange": Event;
    "track": RTCTrackEvent;
}

/** A WebRTC connection between the local computer and a remote peer. It provides methods to connect to a remote peer, maintain and monitor the connection, and close the connection once it's no longer needed. */
interface RTCPeerConnection extends EventTarget {
    readonly canTrickleIceCandidates: boolean | null;
    readonly connectionState: RTCPeerConnectionState;
    readonly currentLocalDescription: RTCSessionDescription | null;
    readonly currentRemoteDescription: RTCSessionDescription | null;
    readonly iceConnectionState: RTCIceConnectionState;
    readonly iceGatheringState: RTCIceGatheringState;
    readonly localDescription: RTCSessionDescription | null;
    onconnectionstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
    ondatachannel: ((this: RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;
    onicecandidate: ((this: RTCPeerConnection, ev: RTCPeerConnectionIceEvent) => any) | null;
    onicecandidateerror: ((this: RTCPeerConnection, ev: Event) => any) | null;
    oniceconnectionstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
    onicegatheringstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
    onnegotiationneeded: ((this: RTCPeerConnection, ev: Event) => any) | null;
    onsignalingstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;
    ontrack: ((this: RTCPeerConnection, ev: RTCTrackEvent) => any) | null;
    readonly pendingLocalDescription: RTCSessionDescription | null;
    readonly pendingRemoteDescription: RTCSessionDescription | null;
    readonly remoteDescription: RTCSessionDescription | null;
    readonly signalingState: RTCSignalingState;
    addIceCandidate(candidate?: RTCIceCandidateInit): Promise<void>;
    /** @deprecated */
    addIceCandidate(candidate: RTCIceCandidateInit, successCallback: VoidFunction, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
    addTrack(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender;
    addTransceiver(trackOrKind: MediaStreamTrack | string, init?: RTCRtpTransceiverInit): RTCRtpTransceiver;
    close(): void;
    createAnswer(options?: RTCAnswerOptions): Promise<RTCSessionDescriptionInit>;
    /** @deprecated */
    createAnswer(successCallback: RTCSessionDescriptionCallback, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
    createDataChannel(label: string, dataChannelDict?: RTCDataChannelInit): RTCDataChannel;
    createOffer(options?: RTCOfferOptions): Promise<RTCSessionDescriptionInit>;
    /** @deprecated */
    createOffer(successCallback: RTCSessionDescriptionCallback, failureCallback: RTCPeerConnectionErrorCallback, options?: RTCOfferOptions): Promise<void>;
    getConfiguration(): RTCConfiguration;
    getReceivers(): RTCRtpReceiver[];
    getSenders(): RTCRtpSender[];
    getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport>;
    getTransceivers(): RTCRtpTransceiver[];
    removeTrack(sender: RTCRtpSender): void;
    restartIce(): void;
    setConfiguration(configuration?: RTCConfiguration): void;
    setLocalDescription(description?: RTCLocalSessionDescriptionInit): Promise<void>;
    /** @deprecated */
    setLocalDescription(description: RTCLocalSessionDescriptionInit, successCallback: VoidFunction, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
    setRemoteDescription(description: RTCSessionDescriptionInit): Promise<void>;
    /** @deprecated */
    setRemoteDescription(description: RTCSessionDescriptionInit, successCallback: VoidFunction, failureCallback: RTCPeerConnectionErrorCallback): Promise<void>;
    addEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: RTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof RTCPeerConnectionEventMap>(type: K, listener: (this: RTCPeerConnection, ev: RTCPeerConnectionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var RTCPeerConnection: {
    prototype: RTCPeerConnection;
    new(configuration?: RTCConfiguration): RTCPeerConnection;
    generateCertificate(keygenAlgorithm: AlgorithmIdentifier): Promise<RTCCertificate>;
};

interface RTCPeerConnectionIceErrorEvent extends Event {
    readonly address: string | null;
    readonly errorCode: number;
    readonly errorText: string;
    readonly port: number | null;
    readonly url: string;
}

declare var RTCPeerConnectionIceErrorEvent: {
    prototype: RTCPeerConnectionIceErrorEvent;
    new(type: string, eventInitDict: RTCPeerConnectionIceErrorEventInit): RTCPeerConnectionIceErrorEvent;
};

/** Events that occurs in relation to ICE candidates with the target, usually an RTCPeerConnection. Only one event is of this type: icecandidate. */
interface RTCPeerConnectionIceEvent extends Event {
    readonly candidate: RTCIceCandidate | null;
}

declare var RTCPeerConnectionIceEvent: {
    prototype: RTCPeerConnectionIceEvent;
    new(type: string, eventInitDict?: RTCPeerConnectionIceEventInit): RTCPeerConnectionIceEvent;
};

/** This WebRTC API interface manages the reception and decoding of data for a\xA0MediaStreamTrack on an\xA0RTCPeerConnection. */
interface RTCRtpReceiver {
    readonly track: MediaStreamTrack;
    readonly transport: RTCDtlsTransport | null;
    getContributingSources(): RTCRtpContributingSource[];
    getParameters(): RTCRtpReceiveParameters;
    getStats(): Promise<RTCStatsReport>;
    getSynchronizationSources(): RTCRtpSynchronizationSource[];
}

declare var RTCRtpReceiver: {
    prototype: RTCRtpReceiver;
    new(): RTCRtpReceiver;
    getCapabilities(kind: string): RTCRtpCapabilities | null;
};

/** Provides the ability to control and obtain details about how a particular MediaStreamTrack is encoded and sent to a remote peer. */
interface RTCRtpSender {
    readonly dtmf: RTCDTMFSender | null;
    readonly track: MediaStreamTrack | null;
    readonly transport: RTCDtlsTransport | null;
    getParameters(): RTCRtpSendParameters;
    getStats(): Promise<RTCStatsReport>;
    replaceTrack(withTrack: MediaStreamTrack | null): Promise<void>;
    setParameters(parameters: RTCRtpSendParameters): Promise<void>;
    setStreams(...streams: MediaStream[]): void;
}

declare var RTCRtpSender: {
    prototype: RTCRtpSender;
    new(): RTCRtpSender;
    getCapabilities(kind: string): RTCRtpCapabilities | null;
};

interface RTCRtpTransceiver {
    readonly currentDirection: RTCRtpTransceiverDirection | null;
    direction: RTCRtpTransceiverDirection;
    readonly mid: string | null;
    readonly receiver: RTCRtpReceiver;
    readonly sender: RTCRtpSender;
    stop(): void;
}

declare var RTCRtpTransceiver: {
    prototype: RTCRtpTransceiver;
    new(): RTCRtpTransceiver;
};

/** One end of a connection\u2014or potential connection\u2014and how it's configured. Each RTCSessionDescription consists of a description type indicating which part of the offer/answer negotiation process it describes and of the SDP descriptor of the session. */
interface RTCSessionDescription {
    readonly sdp: string;
    readonly type: RTCSdpType;
    toJSON(): any;
}

declare var RTCSessionDescription: {
    prototype: RTCSessionDescription;
    new(descriptionInitDict: RTCSessionDescriptionInit): RTCSessionDescription;
};

interface RTCStatsReport {
    forEach(callbackfn: (value: any, key: string, parent: RTCStatsReport) => void, thisArg?: any): void;
}

declare var RTCStatsReport: {
    prototype: RTCStatsReport;
    new(): RTCStatsReport;
};

interface RTCTrackEvent extends Event {
    readonly receiver: RTCRtpReceiver;
    readonly streams: ReadonlyArray<MediaStream>;
    readonly track: MediaStreamTrack;
    readonly transceiver: RTCRtpTransceiver;
}

declare var RTCTrackEvent: {
    prototype: RTCTrackEvent;
    new(type: string, eventInitDict: RTCTrackEventInit): RTCTrackEvent;
};

interface RadioNodeList extends NodeList {
    value: string;
}

declare var RadioNodeList: {
    prototype: RadioNodeList;
    new(): RadioNodeList;
};

/** A fragment of a document that can contain nodes and parts of text nodes. */
interface Range extends AbstractRange {
    /** Returns the node, furthest away from the document, that is an ancestor of both range's start node and end node. */
    readonly commonAncestorContainer: Node;
    cloneContents(): DocumentFragment;
    cloneRange(): Range;
    collapse(toStart?: boolean): void;
    compareBoundaryPoints(how: number, sourceRange: Range): number;
    /** Returns \u22121 if the point is before the range, 0 if the point is in the range, and 1 if the point is after the range. */
    comparePoint(node: Node, offset: number): number;
    createContextualFragment(fragment: string): DocumentFragment;
    deleteContents(): void;
    detach(): void;
    extractContents(): DocumentFragment;
    getBoundingClientRect(): DOMRect;
    getClientRects(): DOMRectList;
    insertNode(node: Node): void;
    /** Returns whether range intersects node. */
    intersectsNode(node: Node): boolean;
    isPointInRange(node: Node, offset: number): boolean;
    selectNode(node: Node): void;
    selectNodeContents(node: Node): void;
    setEnd(node: Node, offset: number): void;
    setEndAfter(node: Node): void;
    setEndBefore(node: Node): void;
    setStart(node: Node, offset: number): void;
    setStartAfter(node: Node): void;
    setStartBefore(node: Node): void;
    surroundContents(newParent: Node): void;
    toString(): string;
    readonly END_TO_END: number;
    readonly END_TO_START: number;
    readonly START_TO_END: number;
    readonly START_TO_START: number;
}

declare var Range: {
    prototype: Range;
    new(): Range;
    readonly END_TO_END: number;
    readonly END_TO_START: number;
    readonly START_TO_END: number;
    readonly START_TO_START: number;
    toString(): string;
};

/** This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. */
interface ReadableStream<R = any> {
    readonly locked: boolean;
    cancel(reason?: any): Promise<void>;
    getReader(): ReadableStreamDefaultReader<R>;
    pipeThrough<T>(transform: ReadableWritablePair<T, R>, options?: StreamPipeOptions): ReadableStream<T>;
    pipeTo(destination: WritableStream<R>, options?: StreamPipeOptions): Promise<void>;
    tee(): [ReadableStream<R>, ReadableStream<R>];
}

declare var ReadableStream: {
    prototype: ReadableStream;
    new<R = any>(underlyingSource?: UnderlyingSource<R>, strategy?: QueuingStrategy<R>): ReadableStream<R>;
};

interface ReadableStreamDefaultController<R = any> {
    readonly desiredSize: number | null;
    close(): void;
    enqueue(chunk?: R): void;
    error(e?: any): void;
}

declare var ReadableStreamDefaultController: {
    prototype: ReadableStreamDefaultController;
    new(): ReadableStreamDefaultController;
};

interface ReadableStreamDefaultReader<R = any> extends ReadableStreamGenericReader {
    read(): Promise<ReadableStreamDefaultReadResult<R>>;
    releaseLock(): void;
}

declare var ReadableStreamDefaultReader: {
    prototype: ReadableStreamDefaultReader;
    new<R = any>(stream: ReadableStream<R>): ReadableStreamDefaultReader<R>;
};

interface ReadableStreamGenericReader {
    readonly closed: Promise<undefined>;
    cancel(reason?: any): Promise<void>;
}

interface RemotePlaybackEventMap {
    "connect": Event;
    "connecting": Event;
    "disconnect": Event;
}

interface RemotePlayback extends EventTarget {
    onconnect: ((this: RemotePlayback, ev: Event) => any) | null;
    onconnecting: ((this: RemotePlayback, ev: Event) => any) | null;
    ondisconnect: ((this: RemotePlayback, ev: Event) => any) | null;
    readonly state: RemotePlaybackState;
    cancelWatchAvailability(id?: number): Promise<void>;
    prompt(): Promise<void>;
    watchAvailability(callback: RemotePlaybackAvailabilityCallback): Promise<number>;
    addEventListener<K extends keyof RemotePlaybackEventMap>(type: K, listener: (this: RemotePlayback, ev: RemotePlaybackEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof RemotePlaybackEventMap>(type: K, listener: (this: RemotePlayback, ev: RemotePlaybackEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var RemotePlayback: {
    prototype: RemotePlayback;
    new(): RemotePlayback;
};

/** This Fetch API interface represents a resource request. */
interface Request extends Body {
    /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */
    readonly cache: RequestCache;
    /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */
    readonly credentials: RequestCredentials;
    /** Returns the kind of resource requested by request, e.g., "document" or "script". */
    readonly destination: RequestDestination;
    /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. */
    readonly headers: Headers;
    /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */
    readonly integrity: string;
    /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */
    readonly keepalive: boolean;
    /** Returns request's HTTP method, which is "GET" by default. */
    readonly method: string;
    /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */
    readonly mode: RequestMode;
    /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */
    readonly redirect: RequestRedirect;
    /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and "about:client" when defaulting to the global's default. This is used during fetching to determine the value of the \`Referer\` header of the request being made. */
    readonly referrer: string;
    /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */
    readonly referrerPolicy: ReferrerPolicy;
    /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */
    readonly signal: AbortSignal;
    /** Returns the URL of request as a string. */
    readonly url: string;
    clone(): Request;
}

declare var Request: {
    prototype: Request;
    new(input: RequestInfo, init?: RequestInit): Request;
};

interface ResizeObserver {
    disconnect(): void;
    observe(target: Element, options?: ResizeObserverOptions): void;
    unobserve(target: Element): void;
}

declare var ResizeObserver: {
    prototype: ResizeObserver;
    new(callback: ResizeObserverCallback): ResizeObserver;
};

interface ResizeObserverEntry {
    readonly borderBoxSize: ReadonlyArray<ResizeObserverSize>;
    readonly contentBoxSize: ReadonlyArray<ResizeObserverSize>;
    readonly contentRect: DOMRectReadOnly;
    readonly target: Element;
}

declare var ResizeObserverEntry: {
    prototype: ResizeObserverEntry;
    new(): ResizeObserverEntry;
};

interface ResizeObserverSize {
    readonly blockSize: number;
    readonly inlineSize: number;
}

declare var ResizeObserverSize: {
    prototype: ResizeObserverSize;
    new(): ResizeObserverSize;
};

/** This Fetch API interface represents the response to a request. */
interface Response extends Body {
    readonly headers: Headers;
    readonly ok: boolean;
    readonly redirected: boolean;
    readonly status: number;
    readonly statusText: string;
    readonly type: ResponseType;
    readonly url: string;
    clone(): Response;
}

declare var Response: {
    prototype: Response;
    new(body?: BodyInit | null, init?: ResponseInit): Response;
    error(): Response;
    redirect(url: string | URL, status?: number): Response;
};

/** Provides access to the properties of <a> element, as well as methods to manipulate them. */
interface SVGAElement extends SVGGraphicsElement, SVGURIReference {
    rel: string;
    readonly relList: DOMTokenList;
    readonly target: SVGAnimatedString;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGAElement: {
    prototype: SVGAElement;
    new(): SVGAElement;
};

/** Used to represent a value that can be an <angle> or <number> value. An SVGAngle reflected through the animVal attribute is always read only. */
interface SVGAngle {
    readonly unitType: number;
    value: number;
    valueAsString: string;
    valueInSpecifiedUnits: number;
    convertToSpecifiedUnits(unitType: number): void;
    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
    readonly SVG_ANGLETYPE_DEG: number;
    readonly SVG_ANGLETYPE_GRAD: number;
    readonly SVG_ANGLETYPE_RAD: number;
    readonly SVG_ANGLETYPE_UNKNOWN: number;
    readonly SVG_ANGLETYPE_UNSPECIFIED: number;
}

declare var SVGAngle: {
    prototype: SVGAngle;
    new(): SVGAngle;
    readonly SVG_ANGLETYPE_DEG: number;
    readonly SVG_ANGLETYPE_GRAD: number;
    readonly SVG_ANGLETYPE_RAD: number;
    readonly SVG_ANGLETYPE_UNKNOWN: number;
    readonly SVG_ANGLETYPE_UNSPECIFIED: number;
};

interface SVGAnimateElement extends SVGAnimationElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGAnimateElement: {
    prototype: SVGAnimateElement;
    new(): SVGAnimateElement;
};

interface SVGAnimateMotionElement extends SVGAnimationElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateMotionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateMotionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGAnimateMotionElement: {
    prototype: SVGAnimateMotionElement;
    new(): SVGAnimateMotionElement;
};

interface SVGAnimateTransformElement extends SVGAnimationElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateTransformElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimateTransformElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGAnimateTransformElement: {
    prototype: SVGAnimateTransformElement;
    new(): SVGAnimateTransformElement;
};

/** Used for attributes of basic type <angle> which can be animated. */
interface SVGAnimatedAngle {
    readonly animVal: SVGAngle;
    readonly baseVal: SVGAngle;
}

declare var SVGAnimatedAngle: {
    prototype: SVGAnimatedAngle;
    new(): SVGAnimatedAngle;
};

/** Used for attributes of type boolean which can be animated. */
interface SVGAnimatedBoolean {
    readonly animVal: boolean;
    baseVal: boolean;
}

declare var SVGAnimatedBoolean: {
    prototype: SVGAnimatedBoolean;
    new(): SVGAnimatedBoolean;
};

/** Used for attributes whose value must be a constant from a particular enumeration and which can be animated. */
interface SVGAnimatedEnumeration {
    readonly animVal: number;
    baseVal: number;
}

declare var SVGAnimatedEnumeration: {
    prototype: SVGAnimatedEnumeration;
    new(): SVGAnimatedEnumeration;
};

/** Used for attributes of basic type <integer> which can be animated. */
interface SVGAnimatedInteger {
    readonly animVal: number;
    baseVal: number;
}

declare var SVGAnimatedInteger: {
    prototype: SVGAnimatedInteger;
    new(): SVGAnimatedInteger;
};

/** Used for attributes of basic type <length> which can be animated. */
interface SVGAnimatedLength {
    readonly animVal: SVGLength;
    readonly baseVal: SVGLength;
}

declare var SVGAnimatedLength: {
    prototype: SVGAnimatedLength;
    new(): SVGAnimatedLength;
};

/** Used for attributes of type SVGLengthList which can be animated. */
interface SVGAnimatedLengthList {
    readonly animVal: SVGLengthList;
    readonly baseVal: SVGLengthList;
}

declare var SVGAnimatedLengthList: {
    prototype: SVGAnimatedLengthList;
    new(): SVGAnimatedLengthList;
};

/** Used for attributes of basic type <Number> which can be animated. */
interface SVGAnimatedNumber {
    readonly animVal: number;
    baseVal: number;
}

declare var SVGAnimatedNumber: {
    prototype: SVGAnimatedNumber;
    new(): SVGAnimatedNumber;
};

/** The SVGAnimatedNumber interface is used for attributes which take a list of numbers and which can be animated. */
interface SVGAnimatedNumberList {
    readonly animVal: SVGNumberList;
    readonly baseVal: SVGNumberList;
}

declare var SVGAnimatedNumberList: {
    prototype: SVGAnimatedNumberList;
    new(): SVGAnimatedNumberList;
};

interface SVGAnimatedPoints {
    readonly animatedPoints: SVGPointList;
    readonly points: SVGPointList;
}

/** Used for attributes of type SVGPreserveAspectRatio which can be animated. */
interface SVGAnimatedPreserveAspectRatio {
    readonly animVal: SVGPreserveAspectRatio;
    readonly baseVal: SVGPreserveAspectRatio;
}

declare var SVGAnimatedPreserveAspectRatio: {
    prototype: SVGAnimatedPreserveAspectRatio;
    new(): SVGAnimatedPreserveAspectRatio;
};

/** Used for attributes of basic SVGRect which can be animated. */
interface SVGAnimatedRect {
    readonly animVal: DOMRectReadOnly;
    readonly baseVal: DOMRect;
}

declare var SVGAnimatedRect: {
    prototype: SVGAnimatedRect;
    new(): SVGAnimatedRect;
};

/** The SVGAnimatedString\xA0interface represents string attributes which can be animated from each SVG declaration. You need to create SVG attribute before doing anything else, everything should be declared\xA0inside this. */
interface SVGAnimatedString {
    readonly animVal: string;
    baseVal: string;
}

declare var SVGAnimatedString: {
    prototype: SVGAnimatedString;
    new(): SVGAnimatedString;
};

/** Used for attributes which take a list of numbers and which can be animated. */
interface SVGAnimatedTransformList {
    readonly animVal: SVGTransformList;
    readonly baseVal: SVGTransformList;
}

declare var SVGAnimatedTransformList: {
    prototype: SVGAnimatedTransformList;
    new(): SVGAnimatedTransformList;
};

interface SVGAnimationElement extends SVGElement, SVGTests {
    readonly targetElement: SVGElement | null;
    beginElement(): void;
    beginElementAt(offset: number): void;
    endElement(): void;
    endElementAt(offset: number): void;
    getCurrentTime(): number;
    getSimpleDuration(): number;
    getStartTime(): number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimationElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGAnimationElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGAnimationElement: {
    prototype: SVGAnimationElement;
    new(): SVGAnimationElement;
};

/** An interface for the <circle> element. The circle element is defined by the cx and cy attributes that denote the coordinates of the centre of the circle. */
interface SVGCircleElement extends SVGGeometryElement {
    readonly cx: SVGAnimatedLength;
    readonly cy: SVGAnimatedLength;
    readonly r: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGCircleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGCircleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGCircleElement: {
    prototype: SVGCircleElement;
    new(): SVGCircleElement;
};

/** Provides access to the properties of <clipPath> elements, as well as methods to manipulate them. */
interface SVGClipPathElement extends SVGElement {
    readonly clipPathUnits: SVGAnimatedEnumeration;
    readonly transform: SVGAnimatedTransformList;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGClipPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGClipPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGClipPathElement: {
    prototype: SVGClipPathElement;
    new(): SVGClipPathElement;
};

/** A base interface used by the component transfer function interfaces. */
interface SVGComponentTransferFunctionElement extends SVGElement {
    readonly amplitude: SVGAnimatedNumber;
    readonly exponent: SVGAnimatedNumber;
    readonly intercept: SVGAnimatedNumber;
    readonly offset: SVGAnimatedNumber;
    readonly slope: SVGAnimatedNumber;
    readonly tableValues: SVGAnimatedNumberList;
    readonly type: SVGAnimatedEnumeration;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGComponentTransferFunctionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGComponentTransferFunctionElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGComponentTransferFunctionElement: {
    prototype: SVGComponentTransferFunctionElement;
    new(): SVGComponentTransferFunctionElement;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
    readonly SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
};

/** Corresponds to the <defs> element. */
interface SVGDefsElement extends SVGGraphicsElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDefsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDefsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGDefsElement: {
    prototype: SVGDefsElement;
    new(): SVGDefsElement;
};

/** Corresponds to the <desc> element. */
interface SVGDescElement extends SVGElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDescElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGDescElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGDescElement: {
    prototype: SVGDescElement;
    new(): SVGDescElement;
};

interface SVGElementEventMap extends ElementEventMap, DocumentAndElementEventHandlersEventMap, GlobalEventHandlersEventMap {
}

/** All of the SVG DOM interfaces that correspond directly to elements in the SVG language derive from the SVGElement interface. */
interface SVGElement extends Element, DocumentAndElementEventHandlers, ElementCSSInlineStyle, GlobalEventHandlers, HTMLOrSVGElement {
    /** @deprecated */
    readonly className: any;
    readonly ownerSVGElement: SVGSVGElement | null;
    readonly viewportElement: SVGElement | null;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGElement: {
    prototype: SVGElement;
    new(): SVGElement;
};

/** Provides access to the properties of <ellipse> elements. */
interface SVGEllipseElement extends SVGGeometryElement {
    readonly cx: SVGAnimatedLength;
    readonly cy: SVGAnimatedLength;
    readonly rx: SVGAnimatedLength;
    readonly ry: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGEllipseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGEllipseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGEllipseElement: {
    prototype: SVGEllipseElement;
    new(): SVGEllipseElement;
};

/** Corresponds to the <feBlend> element. */
interface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    readonly in2: SVGAnimatedString;
    readonly mode: SVGAnimatedEnumeration;
    readonly SVG_FEBLEND_MODE_COLOR: number;
    readonly SVG_FEBLEND_MODE_COLOR_BURN: number;
    readonly SVG_FEBLEND_MODE_COLOR_DODGE: number;
    readonly SVG_FEBLEND_MODE_DARKEN: number;
    readonly SVG_FEBLEND_MODE_DIFFERENCE: number;
    readonly SVG_FEBLEND_MODE_EXCLUSION: number;
    readonly SVG_FEBLEND_MODE_HARD_LIGHT: number;
    readonly SVG_FEBLEND_MODE_HUE: number;
    readonly SVG_FEBLEND_MODE_LIGHTEN: number;
    readonly SVG_FEBLEND_MODE_LUMINOSITY: number;
    readonly SVG_FEBLEND_MODE_MULTIPLY: number;
    readonly SVG_FEBLEND_MODE_NORMAL: number;
    readonly SVG_FEBLEND_MODE_OVERLAY: number;
    readonly SVG_FEBLEND_MODE_SATURATION: number;
    readonly SVG_FEBLEND_MODE_SCREEN: number;
    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: number;
    readonly SVG_FEBLEND_MODE_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEBlendElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEBlendElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEBlendElement: {
    prototype: SVGFEBlendElement;
    new(): SVGFEBlendElement;
    readonly SVG_FEBLEND_MODE_COLOR: number;
    readonly SVG_FEBLEND_MODE_COLOR_BURN: number;
    readonly SVG_FEBLEND_MODE_COLOR_DODGE: number;
    readonly SVG_FEBLEND_MODE_DARKEN: number;
    readonly SVG_FEBLEND_MODE_DIFFERENCE: number;
    readonly SVG_FEBLEND_MODE_EXCLUSION: number;
    readonly SVG_FEBLEND_MODE_HARD_LIGHT: number;
    readonly SVG_FEBLEND_MODE_HUE: number;
    readonly SVG_FEBLEND_MODE_LIGHTEN: number;
    readonly SVG_FEBLEND_MODE_LUMINOSITY: number;
    readonly SVG_FEBLEND_MODE_MULTIPLY: number;
    readonly SVG_FEBLEND_MODE_NORMAL: number;
    readonly SVG_FEBLEND_MODE_OVERLAY: number;
    readonly SVG_FEBLEND_MODE_SATURATION: number;
    readonly SVG_FEBLEND_MODE_SCREEN: number;
    readonly SVG_FEBLEND_MODE_SOFT_LIGHT: number;
    readonly SVG_FEBLEND_MODE_UNKNOWN: number;
};

/** Corresponds to the <feColorMatrix> element. */
interface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    readonly type: SVGAnimatedEnumeration;
    readonly values: SVGAnimatedNumberList;
    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: number;
    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: number;
    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEColorMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEColorMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEColorMatrixElement: {
    prototype: SVGFEColorMatrixElement;
    new(): SVGFEColorMatrixElement;
    readonly SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
    readonly SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
    readonly SVG_FECOLORMATRIX_TYPE_MATRIX: number;
    readonly SVG_FECOLORMATRIX_TYPE_SATURATE: number;
    readonly SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
};

/** Corresponds to the <feComponentTransfer> element. */
interface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEComponentTransferElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEComponentTransferElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEComponentTransferElement: {
    prototype: SVGFEComponentTransferElement;
    new(): SVGFEComponentTransferElement;
};

/** Corresponds to the <feComposite> element. */
interface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    readonly in2: SVGAnimatedString;
    readonly k1: SVGAnimatedNumber;
    readonly k2: SVGAnimatedNumber;
    readonly k3: SVGAnimatedNumber;
    readonly k4: SVGAnimatedNumber;
    readonly operator: SVGAnimatedEnumeration;
    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: number;
    readonly SVG_FECOMPOSITE_OPERATOR_IN: number;
    readonly SVG_FECOMPOSITE_OPERATOR_OUT: number;
    readonly SVG_FECOMPOSITE_OPERATOR_OVER: number;
    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
    readonly SVG_FECOMPOSITE_OPERATOR_XOR: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFECompositeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFECompositeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFECompositeElement: {
    prototype: SVGFECompositeElement;
    new(): SVGFECompositeElement;
    readonly SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
    readonly SVG_FECOMPOSITE_OPERATOR_ATOP: number;
    readonly SVG_FECOMPOSITE_OPERATOR_IN: number;
    readonly SVG_FECOMPOSITE_OPERATOR_OUT: number;
    readonly SVG_FECOMPOSITE_OPERATOR_OVER: number;
    readonly SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
    readonly SVG_FECOMPOSITE_OPERATOR_XOR: number;
};

/** Corresponds to the <feConvolveMatrix> element. */
interface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly bias: SVGAnimatedNumber;
    readonly divisor: SVGAnimatedNumber;
    readonly edgeMode: SVGAnimatedEnumeration;
    readonly in1: SVGAnimatedString;
    readonly kernelMatrix: SVGAnimatedNumberList;
    readonly kernelUnitLengthX: SVGAnimatedNumber;
    readonly kernelUnitLengthY: SVGAnimatedNumber;
    readonly orderX: SVGAnimatedInteger;
    readonly orderY: SVGAnimatedInteger;
    readonly preserveAlpha: SVGAnimatedBoolean;
    readonly targetX: SVGAnimatedInteger;
    readonly targetY: SVGAnimatedInteger;
    readonly SVG_EDGEMODE_DUPLICATE: number;
    readonly SVG_EDGEMODE_NONE: number;
    readonly SVG_EDGEMODE_UNKNOWN: number;
    readonly SVG_EDGEMODE_WRAP: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEConvolveMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEConvolveMatrixElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEConvolveMatrixElement: {
    prototype: SVGFEConvolveMatrixElement;
    new(): SVGFEConvolveMatrixElement;
    readonly SVG_EDGEMODE_DUPLICATE: number;
    readonly SVG_EDGEMODE_NONE: number;
    readonly SVG_EDGEMODE_UNKNOWN: number;
    readonly SVG_EDGEMODE_WRAP: number;
};

/** Corresponds to the <feDiffuseLighting> element. */
interface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly diffuseConstant: SVGAnimatedNumber;
    readonly in1: SVGAnimatedString;
    readonly kernelUnitLengthX: SVGAnimatedNumber;
    readonly kernelUnitLengthY: SVGAnimatedNumber;
    readonly surfaceScale: SVGAnimatedNumber;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDiffuseLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDiffuseLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEDiffuseLightingElement: {
    prototype: SVGFEDiffuseLightingElement;
    new(): SVGFEDiffuseLightingElement;
};

/** Corresponds to the <feDisplacementMap> element. */
interface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    readonly in2: SVGAnimatedString;
    readonly scale: SVGAnimatedNumber;
    readonly xChannelSelector: SVGAnimatedEnumeration;
    readonly yChannelSelector: SVGAnimatedEnumeration;
    readonly SVG_CHANNEL_A: number;
    readonly SVG_CHANNEL_B: number;
    readonly SVG_CHANNEL_G: number;
    readonly SVG_CHANNEL_R: number;
    readonly SVG_CHANNEL_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDisplacementMapElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDisplacementMapElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEDisplacementMapElement: {
    prototype: SVGFEDisplacementMapElement;
    new(): SVGFEDisplacementMapElement;
    readonly SVG_CHANNEL_A: number;
    readonly SVG_CHANNEL_B: number;
    readonly SVG_CHANNEL_G: number;
    readonly SVG_CHANNEL_R: number;
    readonly SVG_CHANNEL_UNKNOWN: number;
};

/** Corresponds to the <feDistantLight> element. */
interface SVGFEDistantLightElement extends SVGElement {
    readonly azimuth: SVGAnimatedNumber;
    readonly elevation: SVGAnimatedNumber;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDistantLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDistantLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEDistantLightElement: {
    prototype: SVGFEDistantLightElement;
    new(): SVGFEDistantLightElement;
};

interface SVGFEDropShadowElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly dx: SVGAnimatedNumber;
    readonly dy: SVGAnimatedNumber;
    readonly in1: SVGAnimatedString;
    readonly stdDeviationX: SVGAnimatedNumber;
    readonly stdDeviationY: SVGAnimatedNumber;
    setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDropShadowElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEDropShadowElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEDropShadowElement: {
    prototype: SVGFEDropShadowElement;
    new(): SVGFEDropShadowElement;
};

/** Corresponds to the <feFlood> element. */
interface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFloodElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFloodElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEFloodElement: {
    prototype: SVGFEFloodElement;
    new(): SVGFEFloodElement;
};

/** Corresponds to the <feFuncA> element. */
interface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncAElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEFuncAElement: {
    prototype: SVGFEFuncAElement;
    new(): SVGFEFuncAElement;
};

/** Corresponds to the <feFuncB> element. */
interface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncBElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncBElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEFuncBElement: {
    prototype: SVGFEFuncBElement;
    new(): SVGFEFuncBElement;
};

/** Corresponds to the <feFuncG> element. */
interface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEFuncGElement: {
    prototype: SVGFEFuncGElement;
    new(): SVGFEFuncGElement;
};

/** Corresponds to the <feFuncR> element. */
interface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncRElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEFuncRElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEFuncRElement: {
    prototype: SVGFEFuncRElement;
    new(): SVGFEFuncRElement;
};

/** Corresponds to the <feGaussianBlur> element. */
interface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    readonly stdDeviationX: SVGAnimatedNumber;
    readonly stdDeviationY: SVGAnimatedNumber;
    setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEGaussianBlurElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEGaussianBlurElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEGaussianBlurElement: {
    prototype: SVGFEGaussianBlurElement;
    new(): SVGFEGaussianBlurElement;
};

/** Corresponds to the <feImage> element. */
interface SVGFEImageElement extends SVGElement, SVGFilterPrimitiveStandardAttributes, SVGURIReference {
    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEImageElement: {
    prototype: SVGFEImageElement;
    new(): SVGFEImageElement;
};

/** Corresponds to the <feMerge> element. */
interface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEMergeElement: {
    prototype: SVGFEMergeElement;
    new(): SVGFEMergeElement;
};

/** Corresponds to the <feMergeNode> element. */
interface SVGFEMergeNodeElement extends SVGElement {
    readonly in1: SVGAnimatedString;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeNodeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMergeNodeElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEMergeNodeElement: {
    prototype: SVGFEMergeNodeElement;
    new(): SVGFEMergeNodeElement;
};

/** Corresponds to the <feMorphology> element. */
interface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    readonly operator: SVGAnimatedEnumeration;
    readonly radiusX: SVGAnimatedNumber;
    readonly radiusY: SVGAnimatedNumber;
    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: number;
    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: number;
    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMorphologyElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEMorphologyElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEMorphologyElement: {
    prototype: SVGFEMorphologyElement;
    new(): SVGFEMorphologyElement;
    readonly SVG_MORPHOLOGY_OPERATOR_DILATE: number;
    readonly SVG_MORPHOLOGY_OPERATOR_ERODE: number;
    readonly SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
};

/** Corresponds to the <feOffset> element. */
interface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly dx: SVGAnimatedNumber;
    readonly dy: SVGAnimatedNumber;
    readonly in1: SVGAnimatedString;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEOffsetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEOffsetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEOffsetElement: {
    prototype: SVGFEOffsetElement;
    new(): SVGFEOffsetElement;
};

/** Corresponds to the <fePointLight> element. */
interface SVGFEPointLightElement extends SVGElement {
    readonly x: SVGAnimatedNumber;
    readonly y: SVGAnimatedNumber;
    readonly z: SVGAnimatedNumber;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEPointLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFEPointLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFEPointLightElement: {
    prototype: SVGFEPointLightElement;
    new(): SVGFEPointLightElement;
};

/** Corresponds to the <feSpecularLighting> element. */
interface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    readonly kernelUnitLengthX: SVGAnimatedNumber;
    readonly kernelUnitLengthY: SVGAnimatedNumber;
    readonly specularConstant: SVGAnimatedNumber;
    readonly specularExponent: SVGAnimatedNumber;
    readonly surfaceScale: SVGAnimatedNumber;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpecularLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpecularLightingElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFESpecularLightingElement: {
    prototype: SVGFESpecularLightingElement;
    new(): SVGFESpecularLightingElement;
};

/** Corresponds to the <feSpotLight> element. */
interface SVGFESpotLightElement extends SVGElement {
    readonly limitingConeAngle: SVGAnimatedNumber;
    readonly pointsAtX: SVGAnimatedNumber;
    readonly pointsAtY: SVGAnimatedNumber;
    readonly pointsAtZ: SVGAnimatedNumber;
    readonly specularExponent: SVGAnimatedNumber;
    readonly x: SVGAnimatedNumber;
    readonly y: SVGAnimatedNumber;
    readonly z: SVGAnimatedNumber;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpotLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFESpotLightElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFESpotLightElement: {
    prototype: SVGFESpotLightElement;
    new(): SVGFESpotLightElement;
};

/** Corresponds to the <feTile> element. */
interface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly in1: SVGAnimatedString;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETileElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETileElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFETileElement: {
    prototype: SVGFETileElement;
    new(): SVGFETileElement;
};

/** Corresponds to the <feTurbulence> element. */
interface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
    readonly baseFrequencyX: SVGAnimatedNumber;
    readonly baseFrequencyY: SVGAnimatedNumber;
    readonly numOctaves: SVGAnimatedInteger;
    readonly seed: SVGAnimatedNumber;
    readonly stitchTiles: SVGAnimatedEnumeration;
    readonly type: SVGAnimatedEnumeration;
    readonly SVG_STITCHTYPE_NOSTITCH: number;
    readonly SVG_STITCHTYPE_STITCH: number;
    readonly SVG_STITCHTYPE_UNKNOWN: number;
    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
    readonly SVG_TURBULENCE_TYPE_TURBULENCE: number;
    readonly SVG_TURBULENCE_TYPE_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETurbulenceElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFETurbulenceElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFETurbulenceElement: {
    prototype: SVGFETurbulenceElement;
    new(): SVGFETurbulenceElement;
    readonly SVG_STITCHTYPE_NOSTITCH: number;
    readonly SVG_STITCHTYPE_STITCH: number;
    readonly SVG_STITCHTYPE_UNKNOWN: number;
    readonly SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
    readonly SVG_TURBULENCE_TYPE_TURBULENCE: number;
    readonly SVG_TURBULENCE_TYPE_UNKNOWN: number;
};

/** Provides access to the properties of <filter> elements, as well as methods to manipulate them. */
interface SVGFilterElement extends SVGElement, SVGURIReference {
    readonly filterUnits: SVGAnimatedEnumeration;
    readonly height: SVGAnimatedLength;
    readonly primitiveUnits: SVGAnimatedEnumeration;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFilterElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGFilterElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGFilterElement: {
    prototype: SVGFilterElement;
    new(): SVGFilterElement;
};

interface SVGFilterPrimitiveStandardAttributes {
    readonly height: SVGAnimatedLength;
    readonly result: SVGAnimatedString;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
}

interface SVGFitToViewBox {
    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
    readonly viewBox: SVGAnimatedRect;
}

/** Provides access to the properties of <foreignObject> elements, as well as methods to manipulate them. */
interface SVGForeignObjectElement extends SVGGraphicsElement {
    readonly height: SVGAnimatedLength;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGForeignObjectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGForeignObjectElement: {
    prototype: SVGForeignObjectElement;
    new(): SVGForeignObjectElement;
};

/** Corresponds to the <g> element. */
interface SVGGElement extends SVGGraphicsElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGGElement: {
    prototype: SVGGElement;
    new(): SVGGElement;
};

interface SVGGeometryElement extends SVGGraphicsElement {
    readonly pathLength: SVGAnimatedNumber;
    getPointAtLength(distance: number): DOMPoint;
    getTotalLength(): number;
    isPointInFill(point?: DOMPointInit): boolean;
    isPointInStroke(point?: DOMPointInit): boolean;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGeometryElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGeometryElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGGeometryElement: {
    prototype: SVGGeometryElement;
    new(): SVGGeometryElement;
};

/** The SVGGradient interface is a base interface used by SVGLinearGradientElement and SVGRadialGradientElement. */
interface SVGGradientElement extends SVGElement, SVGURIReference {
    readonly gradientTransform: SVGAnimatedTransformList;
    readonly gradientUnits: SVGAnimatedEnumeration;
    readonly spreadMethod: SVGAnimatedEnumeration;
    readonly SVG_SPREADMETHOD_PAD: number;
    readonly SVG_SPREADMETHOD_REFLECT: number;
    readonly SVG_SPREADMETHOD_REPEAT: number;
    readonly SVG_SPREADMETHOD_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGGradientElement: {
    prototype: SVGGradientElement;
    new(): SVGGradientElement;
    readonly SVG_SPREADMETHOD_PAD: number;
    readonly SVG_SPREADMETHOD_REFLECT: number;
    readonly SVG_SPREADMETHOD_REPEAT: number;
    readonly SVG_SPREADMETHOD_UNKNOWN: number;
};

/** SVG elements whose primary purpose is to directly render graphics into a group. */
interface SVGGraphicsElement extends SVGElement, SVGTests {
    readonly transform: SVGAnimatedTransformList;
    getBBox(options?: SVGBoundingBoxOptions): DOMRect;
    getCTM(): DOMMatrix | null;
    getScreenCTM(): DOMMatrix | null;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGraphicsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGGraphicsElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGGraphicsElement: {
    prototype: SVGGraphicsElement;
    new(): SVGGraphicsElement;
};

/** Corresponds to the <image> element. */
interface SVGImageElement extends SVGGraphicsElement, SVGURIReference {
    readonly height: SVGAnimatedLength;
    readonly preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGImageElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGImageElement: {
    prototype: SVGImageElement;
    new(): SVGImageElement;
};

/** Correspond to the <length> basic data type. */
interface SVGLength {
    readonly unitType: number;
    value: number;
    valueAsString: string;
    valueInSpecifiedUnits: number;
    convertToSpecifiedUnits(unitType: number): void;
    newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
    readonly SVG_LENGTHTYPE_CM: number;
    readonly SVG_LENGTHTYPE_EMS: number;
    readonly SVG_LENGTHTYPE_EXS: number;
    readonly SVG_LENGTHTYPE_IN: number;
    readonly SVG_LENGTHTYPE_MM: number;
    readonly SVG_LENGTHTYPE_NUMBER: number;
    readonly SVG_LENGTHTYPE_PC: number;
    readonly SVG_LENGTHTYPE_PERCENTAGE: number;
    readonly SVG_LENGTHTYPE_PT: number;
    readonly SVG_LENGTHTYPE_PX: number;
    readonly SVG_LENGTHTYPE_UNKNOWN: number;
}

declare var SVGLength: {
    prototype: SVGLength;
    new(): SVGLength;
    readonly SVG_LENGTHTYPE_CM: number;
    readonly SVG_LENGTHTYPE_EMS: number;
    readonly SVG_LENGTHTYPE_EXS: number;
    readonly SVG_LENGTHTYPE_IN: number;
    readonly SVG_LENGTHTYPE_MM: number;
    readonly SVG_LENGTHTYPE_NUMBER: number;
    readonly SVG_LENGTHTYPE_PC: number;
    readonly SVG_LENGTHTYPE_PERCENTAGE: number;
    readonly SVG_LENGTHTYPE_PT: number;
    readonly SVG_LENGTHTYPE_PX: number;
    readonly SVG_LENGTHTYPE_UNKNOWN: number;
};

/** The SVGLengthList defines a list of SVGLength objects. */
interface SVGLengthList {
    readonly length: number;
    readonly numberOfItems: number;
    appendItem(newItem: SVGLength): SVGLength;
    clear(): void;
    getItem(index: number): SVGLength;
    initialize(newItem: SVGLength): SVGLength;
    insertItemBefore(newItem: SVGLength, index: number): SVGLength;
    removeItem(index: number): SVGLength;
    replaceItem(newItem: SVGLength, index: number): SVGLength;
    [index: number]: SVGLength;
}

declare var SVGLengthList: {
    prototype: SVGLengthList;
    new(): SVGLengthList;
};

/** Provides access to the properties of <line> elements, as well as methods to manipulate them. */
interface SVGLineElement extends SVGGeometryElement {
    readonly x1: SVGAnimatedLength;
    readonly x2: SVGAnimatedLength;
    readonly y1: SVGAnimatedLength;
    readonly y2: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGLineElement: {
    prototype: SVGLineElement;
    new(): SVGLineElement;
};

/** Corresponds to the <linearGradient> element. */
interface SVGLinearGradientElement extends SVGGradientElement {
    readonly x1: SVGAnimatedLength;
    readonly x2: SVGAnimatedLength;
    readonly y1: SVGAnimatedLength;
    readonly y2: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLinearGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGLinearGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGLinearGradientElement: {
    prototype: SVGLinearGradientElement;
    new(): SVGLinearGradientElement;
};

interface SVGMPathElement extends SVGElement, SVGURIReference {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGMPathElement: {
    prototype: SVGMPathElement;
    new(): SVGMPathElement;
};

interface SVGMarkerElement extends SVGElement, SVGFitToViewBox {
    readonly markerHeight: SVGAnimatedLength;
    readonly markerUnits: SVGAnimatedEnumeration;
    readonly markerWidth: SVGAnimatedLength;
    readonly orientAngle: SVGAnimatedAngle;
    readonly orientType: SVGAnimatedEnumeration;
    readonly refX: SVGAnimatedLength;
    readonly refY: SVGAnimatedLength;
    setOrientToAngle(angle: SVGAngle): void;
    setOrientToAuto(): void;
    readonly SVG_MARKERUNITS_STROKEWIDTH: number;
    readonly SVG_MARKERUNITS_UNKNOWN: number;
    readonly SVG_MARKERUNITS_USERSPACEONUSE: number;
    readonly SVG_MARKER_ORIENT_ANGLE: number;
    readonly SVG_MARKER_ORIENT_AUTO: number;
    readonly SVG_MARKER_ORIENT_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMarkerElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMarkerElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGMarkerElement: {
    prototype: SVGMarkerElement;
    new(): SVGMarkerElement;
    readonly SVG_MARKERUNITS_STROKEWIDTH: number;
    readonly SVG_MARKERUNITS_UNKNOWN: number;
    readonly SVG_MARKERUNITS_USERSPACEONUSE: number;
    readonly SVG_MARKER_ORIENT_ANGLE: number;
    readonly SVG_MARKER_ORIENT_AUTO: number;
    readonly SVG_MARKER_ORIENT_UNKNOWN: number;
};

/** Provides access to the properties of <mask> elements, as well as methods to manipulate them. */
interface SVGMaskElement extends SVGElement {
    readonly height: SVGAnimatedLength;
    readonly maskContentUnits: SVGAnimatedEnumeration;
    readonly maskUnits: SVGAnimatedEnumeration;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMaskElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMaskElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGMaskElement: {
    prototype: SVGMaskElement;
    new(): SVGMaskElement;
};

/** Corresponds to the <metadata> element. */
interface SVGMetadataElement extends SVGElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMetadataElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGMetadataElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGMetadataElement: {
    prototype: SVGMetadataElement;
    new(): SVGMetadataElement;
};

/** Corresponds to the <number> basic data type. */
interface SVGNumber {
    value: number;
}

declare var SVGNumber: {
    prototype: SVGNumber;
    new(): SVGNumber;
};

/** The SVGNumberList defines a list of SVGNumber objects. */
interface SVGNumberList {
    readonly length: number;
    readonly numberOfItems: number;
    appendItem(newItem: SVGNumber): SVGNumber;
    clear(): void;
    getItem(index: number): SVGNumber;
    initialize(newItem: SVGNumber): SVGNumber;
    insertItemBefore(newItem: SVGNumber, index: number): SVGNumber;
    removeItem(index: number): SVGNumber;
    replaceItem(newItem: SVGNumber, index: number): SVGNumber;
    [index: number]: SVGNumber;
}

declare var SVGNumberList: {
    prototype: SVGNumberList;
    new(): SVGNumberList;
};

/** Corresponds to the <path> element. */
interface SVGPathElement extends SVGGeometryElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGPathElement: {
    prototype: SVGPathElement;
    new(): SVGPathElement;
};

/** Corresponds to the <pattern> element. */
interface SVGPatternElement extends SVGElement, SVGFitToViewBox, SVGURIReference {
    readonly height: SVGAnimatedLength;
    readonly patternContentUnits: SVGAnimatedEnumeration;
    readonly patternTransform: SVGAnimatedTransformList;
    readonly patternUnits: SVGAnimatedEnumeration;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPatternElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPatternElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGPatternElement: {
    prototype: SVGPatternElement;
    new(): SVGPatternElement;
};

interface SVGPointList {
    readonly length: number;
    readonly numberOfItems: number;
    appendItem(newItem: DOMPoint): DOMPoint;
    clear(): void;
    getItem(index: number): DOMPoint;
    initialize(newItem: DOMPoint): DOMPoint;
    insertItemBefore(newItem: DOMPoint, index: number): DOMPoint;
    removeItem(index: number): DOMPoint;
    replaceItem(newItem: DOMPoint, index: number): DOMPoint;
    [index: number]: DOMPoint;
}

declare var SVGPointList: {
    prototype: SVGPointList;
    new(): SVGPointList;
};

/** Provides access to the properties of <polygon> elements, as well as methods to manipulate them. */
interface SVGPolygonElement extends SVGGeometryElement, SVGAnimatedPoints {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolygonElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolygonElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGPolygonElement: {
    prototype: SVGPolygonElement;
    new(): SVGPolygonElement;
};

/** Provides access to the properties of <polyline> elements, as well as methods to manipulate them. */
interface SVGPolylineElement extends SVGGeometryElement, SVGAnimatedPoints {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolylineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGPolylineElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGPolylineElement: {
    prototype: SVGPolylineElement;
    new(): SVGPolylineElement;
};

/** Corresponds to the preserveAspectRatio attribute, which is available for some of SVG's elements. */
interface SVGPreserveAspectRatio {
    align: number;
    meetOrSlice: number;
    readonly SVG_MEETORSLICE_MEET: number;
    readonly SVG_MEETORSLICE_SLICE: number;
    readonly SVG_MEETORSLICE_UNKNOWN: number;
    readonly SVG_PRESERVEASPECTRATIO_NONE: number;
    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: number;
    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
}

declare var SVGPreserveAspectRatio: {
    prototype: SVGPreserveAspectRatio;
    new(): SVGPreserveAspectRatio;
    readonly SVG_MEETORSLICE_MEET: number;
    readonly SVG_MEETORSLICE_SLICE: number;
    readonly SVG_MEETORSLICE_UNKNOWN: number;
    readonly SVG_PRESERVEASPECTRATIO_NONE: number;
    readonly SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
    readonly SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
    readonly SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
    readonly SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
    readonly SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
    readonly SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
    readonly SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
    readonly SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
    readonly SVG_PRESERVEASPECTRATIO_XMINYMID: number;
    readonly SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
};

/** Corresponds to the <RadialGradient> element. */
interface SVGRadialGradientElement extends SVGGradientElement {
    readonly cx: SVGAnimatedLength;
    readonly cy: SVGAnimatedLength;
    readonly fr: SVGAnimatedLength;
    readonly fx: SVGAnimatedLength;
    readonly fy: SVGAnimatedLength;
    readonly r: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRadialGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRadialGradientElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGRadialGradientElement: {
    prototype: SVGRadialGradientElement;
    new(): SVGRadialGradientElement;
};

/** Provides access to the properties of <rect> elements, as well as methods to manipulate them. */
interface SVGRectElement extends SVGGeometryElement {
    readonly height: SVGAnimatedLength;
    readonly rx: SVGAnimatedLength;
    readonly ry: SVGAnimatedLength;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGRectElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGRectElement: {
    prototype: SVGRectElement;
    new(): SVGRectElement;
};

interface SVGSVGElementEventMap extends SVGElementEventMap, WindowEventHandlersEventMap {
}

/** Provides access to the properties of <svg> elements, as well as methods to manipulate them. This interface contains also various miscellaneous commonly-used utility methods, such as matrix operations and the ability to control the time of redraw on visual rendering devices. */
interface SVGSVGElement extends SVGGraphicsElement, SVGFitToViewBox, WindowEventHandlers {
    currentScale: number;
    readonly currentTranslate: DOMPointReadOnly;
    readonly height: SVGAnimatedLength;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    animationsPaused(): boolean;
    checkEnclosure(element: SVGElement, rect: DOMRectReadOnly): boolean;
    checkIntersection(element: SVGElement, rect: DOMRectReadOnly): boolean;
    createSVGAngle(): SVGAngle;
    createSVGLength(): SVGLength;
    createSVGMatrix(): DOMMatrix;
    createSVGNumber(): SVGNumber;
    createSVGPoint(): DOMPoint;
    createSVGRect(): DOMRect;
    createSVGTransform(): SVGTransform;
    createSVGTransformFromMatrix(matrix?: DOMMatrix2DInit): SVGTransform;
    deselectAll(): void;
    /** @deprecated */
    forceRedraw(): void;
    getCurrentTime(): number;
    getElementById(elementId: string): Element;
    getEnclosureList(rect: DOMRectReadOnly, referenceElement: SVGElement | null): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;
    getIntersectionList(rect: DOMRectReadOnly, referenceElement: SVGElement | null): NodeListOf<SVGCircleElement | SVGEllipseElement | SVGImageElement | SVGLineElement | SVGPathElement | SVGPolygonElement | SVGPolylineElement | SVGRectElement | SVGTextElement | SVGUseElement>;
    pauseAnimations(): void;
    setCurrentTime(seconds: number): void;
    /** @deprecated */
    suspendRedraw(maxWaitMilliseconds: number): number;
    unpauseAnimations(): void;
    /** @deprecated */
    unsuspendRedraw(suspendHandleID: number): void;
    /** @deprecated */
    unsuspendRedrawAll(): void;
    addEventListener<K extends keyof SVGSVGElementEventMap>(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGSVGElementEventMap>(type: K, listener: (this: SVGSVGElement, ev: SVGSVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGSVGElement: {
    prototype: SVGSVGElement;
    new(): SVGSVGElement;
};

/** Corresponds to the SVG <script> element. */
interface SVGScriptElement extends SVGElement, SVGURIReference {
    type: string;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGScriptElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGScriptElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGScriptElement: {
    prototype: SVGScriptElement;
    new(): SVGScriptElement;
};

interface SVGSetElement extends SVGAnimationElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSetElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGSetElement: {
    prototype: SVGSetElement;
    new(): SVGSetElement;
};

/** Corresponds to the <stop> element. */
interface SVGStopElement extends SVGElement {
    readonly offset: SVGAnimatedNumber;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStopElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStopElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGStopElement: {
    prototype: SVGStopElement;
    new(): SVGStopElement;
};

/** The SVGStringList defines a list of DOMString objects. */
interface SVGStringList {
    readonly length: number;
    readonly numberOfItems: number;
    appendItem(newItem: string): string;
    clear(): void;
    getItem(index: number): string;
    initialize(newItem: string): string;
    insertItemBefore(newItem: string, index: number): string;
    removeItem(index: number): string;
    replaceItem(newItem: string, index: number): string;
    [index: number]: string;
}

declare var SVGStringList: {
    prototype: SVGStringList;
    new(): SVGStringList;
};

/** Corresponds to the SVG <style> element. */
interface SVGStyleElement extends SVGElement, LinkStyle {
    disabled: boolean;
    media: string;
    title: string;
    type: string;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStyleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGStyleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGStyleElement: {
    prototype: SVGStyleElement;
    new(): SVGStyleElement;
};

/** Corresponds to the <switch> element. */
interface SVGSwitchElement extends SVGGraphicsElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSwitchElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSwitchElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGSwitchElement: {
    prototype: SVGSwitchElement;
    new(): SVGSwitchElement;
};

/** Corresponds to the <symbol> element. */
interface SVGSymbolElement extends SVGElement, SVGFitToViewBox {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSymbolElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGSymbolElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGSymbolElement: {
    prototype: SVGSymbolElement;
    new(): SVGSymbolElement;
};

/** A <tspan> element. */
interface SVGTSpanElement extends SVGTextPositioningElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTSpanElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTSpanElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGTSpanElement: {
    prototype: SVGTSpanElement;
    new(): SVGTSpanElement;
};

interface SVGTests {
    readonly requiredExtensions: SVGStringList;
    readonly systemLanguage: SVGStringList;
}

/** Implemented by elements that support rendering child text content. It is inherited by various text-related interfaces, such as SVGTextElement, SVGTSpanElement, SVGTRefElement, SVGAltGlyphElement and SVGTextPathElement. */
interface SVGTextContentElement extends SVGGraphicsElement {
    readonly lengthAdjust: SVGAnimatedEnumeration;
    readonly textLength: SVGAnimatedLength;
    getCharNumAtPosition(point?: DOMPointInit): number;
    getComputedTextLength(): number;
    getEndPositionOfChar(charnum: number): DOMPoint;
    getExtentOfChar(charnum: number): DOMRect;
    getNumberOfChars(): number;
    getRotationOfChar(charnum: number): number;
    getStartPositionOfChar(charnum: number): DOMPoint;
    getSubStringLength(charnum: number, nchars: number): number;
    /** @deprecated */
    selectSubString(charnum: number, nchars: number): void;
    readonly LENGTHADJUST_SPACING: number;
    readonly LENGTHADJUST_SPACINGANDGLYPHS: number;
    readonly LENGTHADJUST_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextContentElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextContentElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGTextContentElement: {
    prototype: SVGTextContentElement;
    new(): SVGTextContentElement;
    readonly LENGTHADJUST_SPACING: number;
    readonly LENGTHADJUST_SPACINGANDGLYPHS: number;
    readonly LENGTHADJUST_UNKNOWN: number;
};

/** Corresponds to the <text> elements. */
interface SVGTextElement extends SVGTextPositioningElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGTextElement: {
    prototype: SVGTextElement;
    new(): SVGTextElement;
};

/** Corresponds to the <textPath> element. */
interface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {
    readonly method: SVGAnimatedEnumeration;
    readonly spacing: SVGAnimatedEnumeration;
    readonly startOffset: SVGAnimatedLength;
    readonly TEXTPATH_METHODTYPE_ALIGN: number;
    readonly TEXTPATH_METHODTYPE_STRETCH: number;
    readonly TEXTPATH_METHODTYPE_UNKNOWN: number;
    readonly TEXTPATH_SPACINGTYPE_AUTO: number;
    readonly TEXTPATH_SPACINGTYPE_EXACT: number;
    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: number;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPathElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGTextPathElement: {
    prototype: SVGTextPathElement;
    new(): SVGTextPathElement;
    readonly TEXTPATH_METHODTYPE_ALIGN: number;
    readonly TEXTPATH_METHODTYPE_STRETCH: number;
    readonly TEXTPATH_METHODTYPE_UNKNOWN: number;
    readonly TEXTPATH_SPACINGTYPE_AUTO: number;
    readonly TEXTPATH_SPACINGTYPE_EXACT: number;
    readonly TEXTPATH_SPACINGTYPE_UNKNOWN: number;
};

/** Implemented by elements that support attributes that position individual text glyphs. It is inherited by SVGTextElement, SVGTSpanElement, SVGTRefElement and SVGAltGlyphElement. */
interface SVGTextPositioningElement extends SVGTextContentElement {
    readonly dx: SVGAnimatedLengthList;
    readonly dy: SVGAnimatedLengthList;
    readonly rotate: SVGAnimatedNumberList;
    readonly x: SVGAnimatedLengthList;
    readonly y: SVGAnimatedLengthList;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPositioningElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTextPositioningElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGTextPositioningElement: {
    prototype: SVGTextPositioningElement;
    new(): SVGTextPositioningElement;
};

/** Corresponds to the <title> element. */
interface SVGTitleElement extends SVGElement {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTitleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGTitleElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGTitleElement: {
    prototype: SVGTitleElement;
    new(): SVGTitleElement;
};

/** SVGTransform is the interface for one of the component transformations within an SVGTransformList; thus, an SVGTransform object corresponds to a single component (e.g., scale(\u2026) or matrix(\u2026)) within a transform attribute. */
interface SVGTransform {
    readonly angle: number;
    readonly matrix: DOMMatrix;
    readonly type: number;
    setMatrix(matrix?: DOMMatrix2DInit): void;
    setRotate(angle: number, cx: number, cy: number): void;
    setScale(sx: number, sy: number): void;
    setSkewX(angle: number): void;
    setSkewY(angle: number): void;
    setTranslate(tx: number, ty: number): void;
    readonly SVG_TRANSFORM_MATRIX: number;
    readonly SVG_TRANSFORM_ROTATE: number;
    readonly SVG_TRANSFORM_SCALE: number;
    readonly SVG_TRANSFORM_SKEWX: number;
    readonly SVG_TRANSFORM_SKEWY: number;
    readonly SVG_TRANSFORM_TRANSLATE: number;
    readonly SVG_TRANSFORM_UNKNOWN: number;
}

declare var SVGTransform: {
    prototype: SVGTransform;
    new(): SVGTransform;
    readonly SVG_TRANSFORM_MATRIX: number;
    readonly SVG_TRANSFORM_ROTATE: number;
    readonly SVG_TRANSFORM_SCALE: number;
    readonly SVG_TRANSFORM_SKEWX: number;
    readonly SVG_TRANSFORM_SKEWY: number;
    readonly SVG_TRANSFORM_TRANSLATE: number;
    readonly SVG_TRANSFORM_UNKNOWN: number;
};

/** The SVGTransformList defines a list of SVGTransform objects. */
interface SVGTransformList {
    readonly length: number;
    readonly numberOfItems: number;
    appendItem(newItem: SVGTransform): SVGTransform;
    clear(): void;
    consolidate(): SVGTransform | null;
    createSVGTransformFromMatrix(matrix?: DOMMatrix2DInit): SVGTransform;
    getItem(index: number): SVGTransform;
    initialize(newItem: SVGTransform): SVGTransform;
    insertItemBefore(newItem: SVGTransform, index: number): SVGTransform;
    removeItem(index: number): SVGTransform;
    replaceItem(newItem: SVGTransform, index: number): SVGTransform;
    [index: number]: SVGTransform;
}

declare var SVGTransformList: {
    prototype: SVGTransformList;
    new(): SVGTransformList;
};

interface SVGURIReference {
    readonly href: SVGAnimatedString;
}

/** A commonly used set of constants used for reflecting gradientUnits, patternContentUnits and other similar attributes. */
interface SVGUnitTypes {
    readonly SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: number;
    readonly SVG_UNIT_TYPE_UNKNOWN: number;
    readonly SVG_UNIT_TYPE_USERSPACEONUSE: number;
}

declare var SVGUnitTypes: {
    prototype: SVGUnitTypes;
    new(): SVGUnitTypes;
    readonly SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: number;
    readonly SVG_UNIT_TYPE_UNKNOWN: number;
    readonly SVG_UNIT_TYPE_USERSPACEONUSE: number;
};

/** Corresponds to the <use> element. */
interface SVGUseElement extends SVGGraphicsElement, SVGURIReference {
    readonly height: SVGAnimatedLength;
    readonly width: SVGAnimatedLength;
    readonly x: SVGAnimatedLength;
    readonly y: SVGAnimatedLength;
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGUseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGUseElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGUseElement: {
    prototype: SVGUseElement;
    new(): SVGUseElement;
};

/** Provides access to the properties of <view> elements, as well as methods to manipulate them. */
interface SVGViewElement extends SVGElement, SVGFitToViewBox {
    addEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGViewElement, ev: SVGElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SVGElementEventMap>(type: K, listener: (this: SVGViewElement, ev: SVGElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SVGViewElement: {
    prototype: SVGViewElement;
    new(): SVGViewElement;
};

/** A screen, usually the one on which the current window is being rendered, and is obtained using window.screen. */
interface Screen {
    readonly availHeight: number;
    readonly availWidth: number;
    readonly colorDepth: number;
    readonly height: number;
    readonly orientation: ScreenOrientation;
    readonly pixelDepth: number;
    readonly width: number;
}

declare var Screen: {
    prototype: Screen;
    new(): Screen;
};

interface ScreenOrientationEventMap {
    "change": Event;
}

interface ScreenOrientation extends EventTarget {
    readonly angle: number;
    onchange: ((this: ScreenOrientation, ev: Event) => any) | null;
    readonly type: OrientationType;
    lock(orientation: OrientationLockType): Promise<void>;
    unlock(): void;
    addEventListener<K extends keyof ScreenOrientationEventMap>(type: K, listener: (this: ScreenOrientation, ev: ScreenOrientationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ScreenOrientationEventMap>(type: K, listener: (this: ScreenOrientation, ev: ScreenOrientationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ScreenOrientation: {
    prototype: ScreenOrientation;
    new(): ScreenOrientation;
};

interface ScriptProcessorNodeEventMap {
    "audioprocess": AudioProcessingEvent;
}

/**
 * Allows the generation, processing, or analyzing of audio using JavaScript.
 * @deprecated As of the August 29 2014 Web Audio API spec publication, this feature has been marked as deprecated, and was replaced by AudioWorklet (see AudioWorkletNode).
 */
interface ScriptProcessorNode extends AudioNode {
    /** @deprecated */
    readonly bufferSize: number;
    /** @deprecated */
    onaudioprocess: ((this: ScriptProcessorNode, ev: AudioProcessingEvent) => any) | null;
    addEventListener<K extends keyof ScriptProcessorNodeEventMap>(type: K, listener: (this: ScriptProcessorNode, ev: ScriptProcessorNodeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ScriptProcessorNodeEventMap>(type: K, listener: (this: ScriptProcessorNode, ev: ScriptProcessorNodeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

/** @deprecated */
declare var ScriptProcessorNode: {
    prototype: ScriptProcessorNode;
    new(): ScriptProcessorNode;
};

/** Inherits from Event, and represents the event object of an event sent on a document or worker when its content security policy is violated. */
interface SecurityPolicyViolationEvent extends Event {
    readonly blockedURI: string;
    readonly columnNumber: number;
    readonly disposition: SecurityPolicyViolationEventDisposition;
    readonly documentURI: string;
    readonly effectiveDirective: string;
    readonly lineNumber: number;
    readonly originalPolicy: string;
    readonly referrer: string;
    readonly sample: string;
    readonly sourceFile: string;
    readonly statusCode: number;
    readonly violatedDirective: string;
}

declare var SecurityPolicyViolationEvent: {
    prototype: SecurityPolicyViolationEvent;
    new(type: string, eventInitDict?: SecurityPolicyViolationEventInit): SecurityPolicyViolationEvent;
};

/** A Selection object\xA0represents the range of text selected by the user or the current position of the caret. To obtain a Selection object for examination or\xA0modification, call Window.getSelection(). */
interface Selection {
    readonly anchorNode: Node | null;
    readonly anchorOffset: number;
    readonly focusNode: Node | null;
    readonly focusOffset: number;
    readonly isCollapsed: boolean;
    readonly rangeCount: number;
    readonly type: string;
    addRange(range: Range): void;
    collapse(node: Node | null, offset?: number): void;
    collapseToEnd(): void;
    collapseToStart(): void;
    containsNode(node: Node, allowPartialContainment?: boolean): boolean;
    deleteFromDocument(): void;
    empty(): void;
    extend(node: Node, offset?: number): void;
    getRangeAt(index: number): Range;
    removeAllRanges(): void;
    removeRange(range: Range): void;
    selectAllChildren(node: Node): void;
    setBaseAndExtent(anchorNode: Node, anchorOffset: number, focusNode: Node, focusOffset: number): void;
    setPosition(node: Node | null, offset?: number): void;
    toString(): string;
}

declare var Selection: {
    prototype: Selection;
    new(): Selection;
    toString(): string;
};

interface ServiceWorkerEventMap extends AbstractWorkerEventMap {
    "statechange": Event;
}

/**
 * This ServiceWorker API interface provides a reference to a service worker. Multiple browsing contexts (e.g. pages, workers, etc.) can be associated with the same service worker, each through a unique ServiceWorker object.
 * Available only in secure contexts.
 */
interface ServiceWorker extends EventTarget, AbstractWorker {
    onstatechange: ((this: ServiceWorker, ev: Event) => any) | null;
    readonly scriptURL: string;
    readonly state: ServiceWorkerState;
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
    addEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ServiceWorker: {
    prototype: ServiceWorker;
    new(): ServiceWorker;
};

interface ServiceWorkerContainerEventMap {
    "controllerchange": Event;
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

/**
 * The\xA0ServiceWorkerContainer\xA0interface of the\xA0ServiceWorker API\xA0provides an object representing the service worker as an overall unit in the network ecosystem, including facilities to register, unregister and update service workers, and access the state of service workers and their registrations.
 * Available only in secure contexts.
 */
interface ServiceWorkerContainer extends EventTarget {
    readonly controller: ServiceWorker | null;
    oncontrollerchange: ((this: ServiceWorkerContainer, ev: Event) => any) | null;
    onmessage: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
    readonly ready: Promise<ServiceWorkerRegistration>;
    getRegistration(clientURL?: string | URL): Promise<ServiceWorkerRegistration | undefined>;
    getRegistrations(): Promise<ReadonlyArray<ServiceWorkerRegistration>>;
    register(scriptURL: string | URL, options?: RegistrationOptions): Promise<ServiceWorkerRegistration>;
    startMessages(): void;
    addEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ServiceWorkerContainer: {
    prototype: ServiceWorkerContainer;
    new(): ServiceWorkerContainer;
};

interface ServiceWorkerRegistrationEventMap {
    "updatefound": Event;
}

/**
 * This ServiceWorker API interface represents the service worker registration. You register a service worker to control one or more pages that share the same origin.
 * Available only in secure contexts.
 */
interface ServiceWorkerRegistration extends EventTarget {
    readonly active: ServiceWorker | null;
    readonly installing: ServiceWorker | null;
    onupdatefound: ((this: ServiceWorkerRegistration, ev: Event) => any) | null;
    readonly pushManager: PushManager;
    readonly scope: string;
    readonly updateViaCache: ServiceWorkerUpdateViaCache;
    readonly waiting: ServiceWorker | null;
    getNotifications(filter?: GetNotificationOptions): Promise<Notification[]>;
    showNotification(title: string, options?: NotificationOptions): Promise<void>;
    unregister(): Promise<boolean>;
    update(): Promise<void>;
    addEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ServiceWorkerRegistration: {
    prototype: ServiceWorkerRegistration;
    new(): ServiceWorkerRegistration;
};

interface ShadowRoot extends DocumentFragment, DocumentOrShadowRoot, InnerHTML {
    readonly delegatesFocus: boolean;
    readonly host: Element;
    readonly mode: ShadowRootMode;
    /** Throws a "NotSupportedError" DOMException if context object is a shadow root. */
}

declare var ShadowRoot: {
    prototype: ShadowRoot;
    new(): ShadowRoot;
};

interface SharedWorker extends EventTarget, AbstractWorker {
    /** Returns sharedWorker's MessagePort object which can be used to communicate with the global environment. */
    readonly port: MessagePort;
    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: SharedWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: SharedWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SharedWorker: {
    prototype: SharedWorker;
    new(scriptURL: string | URL, options?: string | WorkerOptions): SharedWorker;
};

interface Slottable {
    readonly assignedSlot: HTMLSlotElement | null;
}

interface SourceBufferEventMap {
    "abort": Event;
    "error": Event;
    "update": Event;
    "updateend": Event;
    "updatestart": Event;
}

/** A chunk of media to be passed into an HTMLMediaElement and played, via a MediaSource\xA0object. This can be made up of one or several media segments. */
interface SourceBuffer extends EventTarget {
    appendWindowEnd: number;
    appendWindowStart: number;
    readonly buffered: TimeRanges;
    mode: AppendMode;
    onabort: ((this: SourceBuffer, ev: Event) => any) | null;
    onerror: ((this: SourceBuffer, ev: Event) => any) | null;
    onupdate: ((this: SourceBuffer, ev: Event) => any) | null;
    onupdateend: ((this: SourceBuffer, ev: Event) => any) | null;
    onupdatestart: ((this: SourceBuffer, ev: Event) => any) | null;
    timestampOffset: number;
    readonly updating: boolean;
    abort(): void;
    appendBuffer(data: BufferSource): void;
    changeType(type: string): void;
    remove(start: number, end: number): void;
    addEventListener<K extends keyof SourceBufferEventMap>(type: K, listener: (this: SourceBuffer, ev: SourceBufferEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SourceBufferEventMap>(type: K, listener: (this: SourceBuffer, ev: SourceBufferEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SourceBuffer: {
    prototype: SourceBuffer;
    new(): SourceBuffer;
};

interface SourceBufferListEventMap {
    "addsourcebuffer": Event;
    "removesourcebuffer": Event;
}

/** A simple container list for multiple SourceBuffer objects. */
interface SourceBufferList extends EventTarget {
    readonly length: number;
    onaddsourcebuffer: ((this: SourceBufferList, ev: Event) => any) | null;
    onremovesourcebuffer: ((this: SourceBufferList, ev: Event) => any) | null;
    addEventListener<K extends keyof SourceBufferListEventMap>(type: K, listener: (this: SourceBufferList, ev: SourceBufferListEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SourceBufferListEventMap>(type: K, listener: (this: SourceBufferList, ev: SourceBufferListEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
    [index: number]: SourceBuffer;
}

declare var SourceBufferList: {
    prototype: SourceBufferList;
    new(): SourceBufferList;
};

interface SpeechRecognitionAlternative {
    readonly confidence: number;
    readonly transcript: string;
}

declare var SpeechRecognitionAlternative: {
    prototype: SpeechRecognitionAlternative;
    new(): SpeechRecognitionAlternative;
};

interface SpeechRecognitionResult {
    readonly isFinal: boolean;
    readonly length: number;
    item(index: number): SpeechRecognitionAlternative;
    [index: number]: SpeechRecognitionAlternative;
}

declare var SpeechRecognitionResult: {
    prototype: SpeechRecognitionResult;
    new(): SpeechRecognitionResult;
};

interface SpeechRecognitionResultList {
    readonly length: number;
    item(index: number): SpeechRecognitionResult;
    [index: number]: SpeechRecognitionResult;
}

declare var SpeechRecognitionResultList: {
    prototype: SpeechRecognitionResultList;
    new(): SpeechRecognitionResultList;
};

interface SpeechSynthesisEventMap {
    "voiceschanged": Event;
}

/** This Web Speech API interface is the controller interface for the speech service; this can be used to retrieve information about the synthesis voices available on the device, start and pause speech, and other commands besides. */
interface SpeechSynthesis extends EventTarget {
    onvoiceschanged: ((this: SpeechSynthesis, ev: Event) => any) | null;
    readonly paused: boolean;
    readonly pending: boolean;
    readonly speaking: boolean;
    cancel(): void;
    getVoices(): SpeechSynthesisVoice[];
    pause(): void;
    resume(): void;
    speak(utterance: SpeechSynthesisUtterance): void;
    addEventListener<K extends keyof SpeechSynthesisEventMap>(type: K, listener: (this: SpeechSynthesis, ev: SpeechSynthesisEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SpeechSynthesisEventMap>(type: K, listener: (this: SpeechSynthesis, ev: SpeechSynthesisEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SpeechSynthesis: {
    prototype: SpeechSynthesis;
    new(): SpeechSynthesis;
};

interface SpeechSynthesisErrorEvent extends SpeechSynthesisEvent {
    readonly error: SpeechSynthesisErrorCode;
}

declare var SpeechSynthesisErrorEvent: {
    prototype: SpeechSynthesisErrorEvent;
    new(type: string, eventInitDict: SpeechSynthesisErrorEventInit): SpeechSynthesisErrorEvent;
};

/** This Web Speech API interface contains information about the current state of SpeechSynthesisUtterance objects that have been processed in the speech service. */
interface SpeechSynthesisEvent extends Event {
    readonly charIndex: number;
    readonly charLength: number;
    readonly elapsedTime: number;
    readonly name: string;
    readonly utterance: SpeechSynthesisUtterance;
}

declare var SpeechSynthesisEvent: {
    prototype: SpeechSynthesisEvent;
    new(type: string, eventInitDict: SpeechSynthesisEventInit): SpeechSynthesisEvent;
};

interface SpeechSynthesisUtteranceEventMap {
    "boundary": SpeechSynthesisEvent;
    "end": SpeechSynthesisEvent;
    "error": SpeechSynthesisErrorEvent;
    "mark": SpeechSynthesisEvent;
    "pause": SpeechSynthesisEvent;
    "resume": SpeechSynthesisEvent;
    "start": SpeechSynthesisEvent;
}

/** This Web Speech API interface represents a speech request. It contains the content the speech service should read and information about how to read it (e.g. language, pitch and volume.) */
interface SpeechSynthesisUtterance extends EventTarget {
    lang: string;
    onboundary: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
    onend: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
    onerror: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisErrorEvent) => any) | null;
    onmark: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
    onpause: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
    onresume: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
    onstart: ((this: SpeechSynthesisUtterance, ev: SpeechSynthesisEvent) => any) | null;
    pitch: number;
    rate: number;
    text: string;
    voice: SpeechSynthesisVoice | null;
    volume: number;
    addEventListener<K extends keyof SpeechSynthesisUtteranceEventMap>(type: K, listener: (this: SpeechSynthesisUtterance, ev: SpeechSynthesisUtteranceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SpeechSynthesisUtteranceEventMap>(type: K, listener: (this: SpeechSynthesisUtterance, ev: SpeechSynthesisUtteranceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SpeechSynthesisUtterance: {
    prototype: SpeechSynthesisUtterance;
    new(text?: string): SpeechSynthesisUtterance;
};

/** This Web Speech API interface represents a voice that the system supports. Every SpeechSynthesisVoice has its own relative speech service including information about language, name and URI. */
interface SpeechSynthesisVoice {
    readonly default: boolean;
    readonly lang: string;
    readonly localService: boolean;
    readonly name: string;
    readonly voiceURI: string;
}

declare var SpeechSynthesisVoice: {
    prototype: SpeechSynthesisVoice;
    new(): SpeechSynthesisVoice;
};

interface StaticRange extends AbstractRange {
}

declare var StaticRange: {
    prototype: StaticRange;
    new(init: StaticRangeInit): StaticRange;
};

/** The pan property takes a unitless value between -1 (full left pan) and 1 (full right pan). This interface was introduced as a much simpler way to apply a simple panning effect than having to use a full PannerNode. */
interface StereoPannerNode extends AudioNode {
    readonly pan: AudioParam;
}

declare var StereoPannerNode: {
    prototype: StereoPannerNode;
    new(context: BaseAudioContext, options?: StereoPannerOptions): StereoPannerNode;
};

/** This Web Storage API interface provides access to a particular domain's session or local storage. It allows, for example, the addition, modification, or deletion of stored data items. */
interface Storage {
    /** Returns the number of key/value pairs. */
    readonly length: number;
    /**
     * Removes all key/value pairs, if there are any.
     *
     * Dispatches a storage event on Window objects holding an equivalent Storage object.
     */
    clear(): void;
    /** Returns the current value associated with the given key, or null if the given key does not exist. */
    getItem(key: string): string | null;
    /** Returns the name of the nth key, or null if n is greater than or equal to the number of key/value pairs. */
    key(index: number): string | null;
    /**
     * Removes the key/value pair with the given key, if a key/value pair with the given key exists.
     *
     * Dispatches a storage event on Window objects holding an equivalent Storage object.
     */
    removeItem(key: string): void;
    /**
     * Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.
     *
     * Throws a "QuotaExceededError" DOMException exception if the new value couldn't be set. (Setting could fail if, e.g., the user has disabled storage for the site, or if the quota has been exceeded.)
     *
     * Dispatches a storage event on Window objects holding an equivalent Storage object.
     */
    setItem(key: string, value: string): void;
    [name: string]: any;
}

declare var Storage: {
    prototype: Storage;
    new(): Storage;
};

/** A StorageEvent is sent to a window when a storage area it has access to is changed within the context of another document. */
interface StorageEvent extends Event {
    /** Returns the key of the storage item being changed. */
    readonly key: string | null;
    /** Returns the new value of the key of the storage item whose value is being changed. */
    readonly newValue: string | null;
    /** Returns the old value of the key of the storage item whose value is being changed. */
    readonly oldValue: string | null;
    /** Returns the Storage object that was affected. */
    readonly storageArea: Storage | null;
    /** Returns the URL of the document whose storage item changed. */
    readonly url: string;
    initStorageEvent(type: string, bubbles?: boolean, cancelable?: boolean, key?: string | null, oldValue?: string | null, newValue?: string | null, url?: string | URL, storageArea?: Storage | null): void;
}

declare var StorageEvent: {
    prototype: StorageEvent;
    new(type: string, eventInitDict?: StorageEventInit): StorageEvent;
};

/** Available only in secure contexts. */
interface StorageManager {
    estimate(): Promise<StorageEstimate>;
    persist(): Promise<boolean>;
    persisted(): Promise<boolean>;
}

declare var StorageManager: {
    prototype: StorageManager;
    new(): StorageManager;
};

/** @deprecated */
interface StyleMedia {
    type: string;
    matchMedium(mediaquery: string): boolean;
}

/** A single style sheet. CSS style sheets will further implement the more specialized CSSStyleSheet interface. */
interface StyleSheet {
    disabled: boolean;
    readonly href: string | null;
    readonly media: MediaList;
    readonly ownerNode: Element | ProcessingInstruction | null;
    readonly parentStyleSheet: CSSStyleSheet | null;
    readonly title: string | null;
    readonly type: string;
}

declare var StyleSheet: {
    prototype: StyleSheet;
    new(): StyleSheet;
};

/** A list of StyleSheet. */
interface StyleSheetList {
    readonly length: number;
    item(index: number): CSSStyleSheet | null;
    [index: number]: CSSStyleSheet;
}

declare var StyleSheetList: {
    prototype: StyleSheetList;
    new(): StyleSheetList;
};

interface SubmitEvent extends Event {
    /** Returns the element representing the submit button that triggered the form submission, or null if the submission was not triggered by a button. */
    readonly submitter: HTMLElement | null;
}

declare var SubmitEvent: {
    prototype: SubmitEvent;
    new(type: string, eventInitDict?: SubmitEventInit): SubmitEvent;
};

/**
 * This Web Crypto API interface provides a number of low-level cryptographic functions. It is accessed via the Crypto.subtle properties available in a window context (via Window.crypto).
 * Available only in secure contexts.
 */
interface SubtleCrypto {
    decrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<any>;
    deriveBits(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, length: number): Promise<ArrayBuffer>;
    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer>;
    encrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<any>;
    exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
    exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair>;
    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair | CryptoKey>;
    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    verify(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, signature: BufferSource, data: BufferSource): Promise<boolean>;
    wrapKey(format: KeyFormat, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams): Promise<ArrayBuffer>;
}

declare var SubtleCrypto: {
    prototype: SubtleCrypto;
    new(): SubtleCrypto;
};

/** The textual content of Element or Attr. If an element has no markup within its content, it has a single child implementing Text that contains the element's text. However, if the element contains markup, it is parsed into information items and Text nodes that form its children. */
interface Text extends CharacterData, Slottable {
    /** Returns the combined data of all direct Text node siblings. */
    readonly wholeText: string;
    /** Splits data at the given offset and returns the remainder as Text node. */
    splitText(offset: number): Text;
}

declare var Text: {
    prototype: Text;
    new(data?: string): Text;
};

/** A decoder for a specific method, that is a specific character encoding, like utf-8, iso-8859-2, koi8, cp1261, gbk, etc.\xA0A decoder takes a stream of bytes as input and emits a stream of code points. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
interface TextDecoder extends TextDecoderCommon {
    /**
     * Returns the result of running encoding's decoder. The method can be invoked zero or more times with options's stream set to true, and then once without options's stream (or set to false), to process a fragmented input. If the invocation without options's stream (or set to false) has no input, it's clearest to omit both arguments.
     *
     * \`\`\`
     * var string = "", decoder = new TextDecoder(encoding), buffer;
     * while(buffer = next_chunk()) {
     *   string += decoder.decode(buffer, {stream:true});
     * }
     * string += decoder.decode(); // end-of-queue
     * \`\`\`
     *
     * If the error mode is "fatal" and encoding's decoder returns error, throws a TypeError.
     */
    decode(input?: BufferSource, options?: TextDecodeOptions): string;
}

declare var TextDecoder: {
    prototype: TextDecoder;
    new(label?: string, options?: TextDecoderOptions): TextDecoder;
};

interface TextDecoderCommon {
    /** Returns encoding's name, lowercased. */
    readonly encoding: string;
    /** Returns true if error mode is "fatal", otherwise false. */
    readonly fatal: boolean;
    /** Returns the value of ignore BOM. */
    readonly ignoreBOM: boolean;
}

interface TextDecoderStream extends GenericTransformStream, TextDecoderCommon {
    readonly readable: ReadableStream<string>;
    readonly writable: WritableStream<BufferSource>;
}

declare var TextDecoderStream: {
    prototype: TextDecoderStream;
    new(label?: string, options?: TextDecoderOptions): TextDecoderStream;
};

/** TextEncoder takes a stream of code points as input and emits a stream of bytes. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
interface TextEncoder extends TextEncoderCommon {
    /** Returns the result of running UTF-8's encoder. */
    encode(input?: string): Uint8Array;
    /** Runs the UTF-8 encoder on source, stores the result of that operation into destination, and returns the progress made as an object wherein read is the number of converted code units of source and written is the number of bytes modified in destination. */
    encodeInto(source: string, destination: Uint8Array): TextEncoderEncodeIntoResult;
}

declare var TextEncoder: {
    prototype: TextEncoder;
    new(): TextEncoder;
};

interface TextEncoderCommon {
    /** Returns "utf-8". */
    readonly encoding: string;
}

interface TextEncoderStream extends GenericTransformStream, TextEncoderCommon {
    readonly readable: ReadableStream<Uint8Array>;
    readonly writable: WritableStream<string>;
}

declare var TextEncoderStream: {
    prototype: TextEncoderStream;
    new(): TextEncoderStream;
};

/** The dimensions of a piece of text in the canvas, as created by the CanvasRenderingContext2D.measureText() method. */
interface TextMetrics {
    /** Returns the measurement described below. */
    readonly actualBoundingBoxAscent: number;
    /** Returns the measurement described below. */
    readonly actualBoundingBoxDescent: number;
    /** Returns the measurement described below. */
    readonly actualBoundingBoxLeft: number;
    /** Returns the measurement described below. */
    readonly actualBoundingBoxRight: number;
    /** Returns the measurement described below. */
    readonly fontBoundingBoxAscent: number;
    /** Returns the measurement described below. */
    readonly fontBoundingBoxDescent: number;
    /** Returns the measurement described below. */
    readonly width: number;
}

declare var TextMetrics: {
    prototype: TextMetrics;
    new(): TextMetrics;
};

interface TextTrackEventMap {
    "cuechange": Event;
}

/** This interface also inherits properties from EventTarget. */
interface TextTrack extends EventTarget {
    /** Returns the text track cues from the text track list of cues that are currently active (i.e. that start before the current playback position and end after it), as a TextTrackCueList object. */
    readonly activeCues: TextTrackCueList | null;
    /** Returns the text track list of cues, as a TextTrackCueList object. */
    readonly cues: TextTrackCueList | null;
    /**
     * Returns the ID of the given track.
     *
     * For in-band tracks, this is the ID that can be used with a fragment if the format supports media fragment syntax, and that can be used with the getTrackById() method.
     *
     * For TextTrack objects corresponding to track elements, this is the ID of the track element.
     */
    readonly id: string;
    /** Returns the text track in-band metadata track dispatch type string. */
    readonly inBandMetadataTrackDispatchType: string;
    /** Returns the text track kind string. */
    readonly kind: TextTrackKind;
    /** Returns the text track label, if there is one, or the empty string otherwise (indicating that a custom label probably needs to be generated from the other attributes of the object if the object is exposed to the user). */
    readonly label: string;
    /** Returns the text track language string. */
    readonly language: string;
    /**
     * Returns the text track mode, represented by a string from the following list:
     *
     * Can be set, to change the mode.
     */
    mode: TextTrackMode;
    oncuechange: ((this: TextTrack, ev: Event) => any) | null;
    /** Adds the given cue to textTrack's text track list of cues. */
    addCue(cue: TextTrackCue): void;
    /** Removes the given cue from textTrack's text track list of cues. */
    removeCue(cue: TextTrackCue): void;
    addEventListener<K extends keyof TextTrackEventMap>(type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof TextTrackEventMap>(type: K, listener: (this: TextTrack, ev: TextTrackEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var TextTrack: {
    prototype: TextTrack;
    new(): TextTrack;
};

interface TextTrackCueEventMap {
    "enter": Event;
    "exit": Event;
}

/** TextTrackCues represent a string of text that will be displayed for some duration of time on a TextTrack. This includes the start and end times that the cue will be displayed. A TextTrackCue cannot be used directly, instead one of the derived types (e.g. VTTCue) must be used. */
interface TextTrackCue extends EventTarget {
    /**
     * Returns the text track cue end time, in seconds.
     *
     * Can be set.
     */
    endTime: number;
    /**
     * Returns the text track cue identifier.
     *
     * Can be set.
     */
    id: string;
    onenter: ((this: TextTrackCue, ev: Event) => any) | null;
    onexit: ((this: TextTrackCue, ev: Event) => any) | null;
    /**
     * Returns true if the text track cue pause-on-exit flag is set, false otherwise.
     *
     * Can be set.
     */
    pauseOnExit: boolean;
    /**
     * Returns the text track cue start time, in seconds.
     *
     * Can be set.
     */
    startTime: number;
    /** Returns the TextTrack object to which this text track cue belongs, if any, or null otherwise. */
    readonly track: TextTrack | null;
    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: TextTrackCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: TextTrackCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var TextTrackCue: {
    prototype: TextTrackCue;
    new(): TextTrackCue;
};

interface TextTrackCueList {
    /** Returns the number of cues in the list. */
    readonly length: number;
    /**
     * Returns the first text track cue (in text track cue order) with text track cue identifier id.
     *
     * Returns null if none of the cues have the given identifier or if the argument is the empty string.
     */
    getCueById(id: string): TextTrackCue | null;
    [index: number]: TextTrackCue;
}

declare var TextTrackCueList: {
    prototype: TextTrackCueList;
    new(): TextTrackCueList;
};

interface TextTrackListEventMap {
    "addtrack": TrackEvent;
    "change": Event;
    "removetrack": TrackEvent;
}

interface TextTrackList extends EventTarget {
    readonly length: number;
    onaddtrack: ((this: TextTrackList, ev: TrackEvent) => any) | null;
    onchange: ((this: TextTrackList, ev: Event) => any) | null;
    onremovetrack: ((this: TextTrackList, ev: TrackEvent) => any) | null;
    getTrackById(id: string): TextTrack | null;
    addEventListener<K extends keyof TextTrackListEventMap>(type: K, listener: (this: TextTrackList, ev: TextTrackListEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof TextTrackListEventMap>(type: K, listener: (this: TextTrackList, ev: TextTrackListEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
    [index: number]: TextTrack;
}

declare var TextTrackList: {
    prototype: TextTrackList;
    new(): TextTrackList;
};

/** Used to represent a set of time ranges, primarily for the purpose of tracking which portions of media have been buffered when loading it for use by the <audio> and <video>\xA0elements. */
interface TimeRanges {
    /** Returns the number of ranges in the object. */
    readonly length: number;
    /**
     * Returns the time for the end of the range with the given index.
     *
     * Throws an "IndexSizeError" DOMException if the index is out of range.
     */
    end(index: number): number;
    /**
     * Returns the time for the start of the range with the given index.
     *
     * Throws an "IndexSizeError" DOMException if the index is out of range.
     */
    start(index: number): number;
}

declare var TimeRanges: {
    prototype: TimeRanges;
    new(): TimeRanges;
};

/** A single contact point on a touch-sensitive device. The contact point is commonly a finger or stylus and the device may be a touchscreen or trackpad. */
interface Touch {
    readonly clientX: number;
    readonly clientY: number;
    readonly force: number;
    readonly identifier: number;
    readonly pageX: number;
    readonly pageY: number;
    readonly radiusX: number;
    readonly radiusY: number;
    readonly rotationAngle: number;
    readonly screenX: number;
    readonly screenY: number;
    readonly target: EventTarget;
}

declare var Touch: {
    prototype: Touch;
    new(touchInitDict: TouchInit): Touch;
};

/** An event sent when the state of contacts with a touch-sensitive surface changes. This surface can be a touch screen or trackpad, for example. The event can describe one or more points of contact with the screen and includes support for detecting movement, addition and removal of contact points, and so forth. */
interface TouchEvent extends UIEvent {
    readonly altKey: boolean;
    readonly changedTouches: TouchList;
    readonly ctrlKey: boolean;
    readonly metaKey: boolean;
    readonly shiftKey: boolean;
    readonly targetTouches: TouchList;
    readonly touches: TouchList;
}

declare var TouchEvent: {
    prototype: TouchEvent;
    new(type: string, eventInitDict?: TouchEventInit): TouchEvent;
};

/** A list of contact points on a touch surface. For example, if the user has three fingers on the touch surface (such as a screen or trackpad), the corresponding TouchList object would have one Touch object for each finger, for a total of three entries. */
interface TouchList {
    readonly length: number;
    item(index: number): Touch | null;
    [index: number]: Touch;
}

declare var TouchList: {
    prototype: TouchList;
    new(): TouchList;
};

/** The TrackEvent interface, part of the HTML DOM specification, is used for events which represent changes to the set of available tracks on an HTML media element; these events are addtrack and removetrack. */
interface TrackEvent extends Event {
    /** Returns the track object (TextTrack, AudioTrack, or VideoTrack) to which the event relates. */
    readonly track: TextTrack | null;
}

declare var TrackEvent: {
    prototype: TrackEvent;
    new(type: string, eventInitDict?: TrackEventInit): TrackEvent;
};

interface TransformStream<I = any, O = any> {
    readonly readable: ReadableStream<O>;
    readonly writable: WritableStream<I>;
}

declare var TransformStream: {
    prototype: TransformStream;
    new<I = any, O = any>(transformer?: Transformer<I, O>, writableStrategy?: QueuingStrategy<I>, readableStrategy?: QueuingStrategy<O>): TransformStream<I, O>;
};

interface TransformStreamDefaultController<O = any> {
    readonly desiredSize: number | null;
    enqueue(chunk?: O): void;
    error(reason?: any): void;
    terminate(): void;
}

declare var TransformStreamDefaultController: {
    prototype: TransformStreamDefaultController;
    new(): TransformStreamDefaultController;
};

/** Events providing information related to transitions. */
interface TransitionEvent extends Event {
    readonly elapsedTime: number;
    readonly propertyName: string;
    readonly pseudoElement: string;
}

declare var TransitionEvent: {
    prototype: TransitionEvent;
    new(type: string, transitionEventInitDict?: TransitionEventInit): TransitionEvent;
};

/** The nodes of a document subtree and a position within them. */
interface TreeWalker {
    currentNode: Node;
    readonly filter: NodeFilter | null;
    readonly root: Node;
    readonly whatToShow: number;
    firstChild(): Node | null;
    lastChild(): Node | null;
    nextNode(): Node | null;
    nextSibling(): Node | null;
    parentNode(): Node | null;
    previousNode(): Node | null;
    previousSibling(): Node | null;
}

declare var TreeWalker: {
    prototype: TreeWalker;
    new(): TreeWalker;
};

/** Simple user interface events. */
interface UIEvent extends Event {
    readonly detail: number;
    readonly view: Window | null;
    /** @deprecated */
    readonly which: number;
    /** @deprecated */
    initUIEvent(typeArg: string, bubblesArg?: boolean, cancelableArg?: boolean, viewArg?: Window | null, detailArg?: number): void;
}

declare var UIEvent: {
    prototype: UIEvent;
    new(type: string, eventInitDict?: UIEventInit): UIEvent;
};

/** The URL\xA0interface represents an object providing static methods used for creating object URLs. */
interface URL {
    hash: string;
    host: string;
    hostname: string;
    href: string;
    toString(): string;
    readonly origin: string;
    password: string;
    pathname: string;
    port: string;
    protocol: string;
    search: string;
    readonly searchParams: URLSearchParams;
    username: string;
    toJSON(): string;
}

declare var URL: {
    prototype: URL;
    new(url: string | URL, base?: string | URL): URL;
    createObjectURL(obj: Blob | MediaSource): string;
    revokeObjectURL(url: string): void;
};

type webkitURL = URL;
declare var webkitURL: typeof URL;

interface URLSearchParams {
    /** Appends a specified key/value pair as a new search parameter. */
    append(name: string, value: string): void;
    /** Deletes the given search parameter, and its associated value, from the list of all search parameters. */
    delete(name: string): void;
    /** Returns the first value associated to the given search parameter. */
    get(name: string): string | null;
    /** Returns all the values association with a given search parameter. */
    getAll(name: string): string[];
    /** Returns a Boolean indicating if such a search parameter exists. */
    has(name: string): boolean;
    /** Sets the value associated to a given search parameter to the given value. If there were several values, delete the others. */
    set(name: string, value: string): void;
    sort(): void;
    /** Returns a string containing a query string suitable for use in a URL. Does not include the question mark. */
    toString(): string;
    forEach(callbackfn: (value: string, key: string, parent: URLSearchParams) => void, thisArg?: any): void;
}

declare var URLSearchParams: {
    prototype: URLSearchParams;
    new(init?: string[][] | Record<string, string> | string | URLSearchParams): URLSearchParams;
    toString(): string;
};

interface VTTCue extends TextTrackCue {
    align: AlignSetting;
    line: LineAndPositionSetting;
    lineAlign: LineAlignSetting;
    position: LineAndPositionSetting;
    positionAlign: PositionAlignSetting;
    region: VTTRegion | null;
    size: number;
    snapToLines: boolean;
    text: string;
    vertical: DirectionSetting;
    getCueAsHTML(): DocumentFragment;
    addEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: VTTCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof TextTrackCueEventMap>(type: K, listener: (this: VTTCue, ev: TextTrackCueEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var VTTCue: {
    prototype: VTTCue;
    new(startTime: number, endTime: number, text: string): VTTCue;
};

interface VTTRegion {
    id: string;
    lines: number;
    regionAnchorX: number;
    regionAnchorY: number;
    scroll: ScrollSetting;
    viewportAnchorX: number;
    viewportAnchorY: number;
    width: number;
}

declare var VTTRegion: {
    prototype: VTTRegion;
    new(): VTTRegion;
};

/** The validity states that an element can be in, with respect to constraint validation. Together, they help explain why an element's value fails to validate, if it's not valid. */
interface ValidityState {
    readonly badInput: boolean;
    readonly customError: boolean;
    readonly patternMismatch: boolean;
    readonly rangeOverflow: boolean;
    readonly rangeUnderflow: boolean;
    readonly stepMismatch: boolean;
    readonly tooLong: boolean;
    readonly tooShort: boolean;
    readonly typeMismatch: boolean;
    readonly valid: boolean;
    readonly valueMissing: boolean;
}

declare var ValidityState: {
    prototype: ValidityState;
    new(): ValidityState;
};

/** Returned by the HTMLVideoElement.getVideoPlaybackQuality() method and contains metrics that can be used to determine the playback quality of a video. */
interface VideoPlaybackQuality {
    /** @deprecated */
    readonly corruptedVideoFrames: number;
    readonly creationTime: DOMHighResTimeStamp;
    readonly droppedVideoFrames: number;
    readonly totalVideoFrames: number;
}

declare var VideoPlaybackQuality: {
    prototype: VideoPlaybackQuality;
    new(): VideoPlaybackQuality;
};

interface VisualViewportEventMap {
    "resize": Event;
    "scroll": Event;
}

interface VisualViewport extends EventTarget {
    readonly height: number;
    readonly offsetLeft: number;
    readonly offsetTop: number;
    onresize: ((this: VisualViewport, ev: Event) => any) | null;
    onscroll: ((this: VisualViewport, ev: Event) => any) | null;
    readonly pageLeft: number;
    readonly pageTop: number;
    readonly scale: number;
    readonly width: number;
    addEventListener<K extends keyof VisualViewportEventMap>(type: K, listener: (this: VisualViewport, ev: VisualViewportEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof VisualViewportEventMap>(type: K, listener: (this: VisualViewport, ev: VisualViewportEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var VisualViewport: {
    prototype: VisualViewport;
    new(): VisualViewport;
};

interface WEBGL_color_buffer_float {
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: GLenum;
    readonly RGBA32F_EXT: GLenum;
    readonly UNSIGNED_NORMALIZED_EXT: GLenum;
}

interface WEBGL_compressed_texture_astc {
    getSupportedProfiles(): string[];
    readonly COMPRESSED_RGBA_ASTC_10x10_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_10x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_10x6_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_10x8_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_12x10_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_12x12_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_4x4_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_5x4_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_5x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_6x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_6x6_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_8x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_8x6_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_8x8_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: GLenum;
}

interface WEBGL_compressed_texture_etc {
    readonly COMPRESSED_R11_EAC: GLenum;
    readonly COMPRESSED_RG11_EAC: GLenum;
    readonly COMPRESSED_RGB8_ETC2: GLenum;
    readonly COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum;
    readonly COMPRESSED_RGBA8_ETC2_EAC: GLenum;
    readonly COMPRESSED_SIGNED_R11_EAC: GLenum;
    readonly COMPRESSED_SIGNED_RG11_EAC: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: GLenum;
    readonly COMPRESSED_SRGB8_ETC2: GLenum;
    readonly COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum;
}

interface WEBGL_compressed_texture_etc1 {
    readonly COMPRESSED_RGB_ETC1_WEBGL: GLenum;
}

interface WEBGL_compressed_texture_pvrtc {
    readonly COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: GLenum;
    readonly COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: GLenum;
    readonly COMPRESSED_RGB_PVRTC_2BPPV1_IMG: GLenum;
    readonly COMPRESSED_RGB_PVRTC_4BPPV1_IMG: GLenum;
}

/** The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats. */
interface WEBGL_compressed_texture_s3tc {
    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: GLenum;
    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: GLenum;
    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: GLenum;
    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: GLenum;
}

interface WEBGL_compressed_texture_s3tc_srgb {
    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: GLenum;
    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: GLenum;
    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: GLenum;
    readonly COMPRESSED_SRGB_S3TC_DXT1_EXT: GLenum;
}

/** The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes. */
interface WEBGL_debug_renderer_info {
    readonly UNMASKED_RENDERER_WEBGL: GLenum;
    readonly UNMASKED_VENDOR_WEBGL: GLenum;
}

interface WEBGL_debug_shaders {
    getTranslatedShaderSource(shader: WebGLShader): string;
}

/** The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures. */
interface WEBGL_depth_texture {
    readonly UNSIGNED_INT_24_8_WEBGL: GLenum;
}

interface WEBGL_draw_buffers {
    drawBuffersWEBGL(buffers: GLenum[]): void;
    readonly COLOR_ATTACHMENT0_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT10_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT11_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT12_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT13_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT14_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT15_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT1_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT2_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT3_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT4_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT5_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT6_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT7_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT8_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT9_WEBGL: GLenum;
    readonly DRAW_BUFFER0_WEBGL: GLenum;
    readonly DRAW_BUFFER10_WEBGL: GLenum;
    readonly DRAW_BUFFER11_WEBGL: GLenum;
    readonly DRAW_BUFFER12_WEBGL: GLenum;
    readonly DRAW_BUFFER13_WEBGL: GLenum;
    readonly DRAW_BUFFER14_WEBGL: GLenum;
    readonly DRAW_BUFFER15_WEBGL: GLenum;
    readonly DRAW_BUFFER1_WEBGL: GLenum;
    readonly DRAW_BUFFER2_WEBGL: GLenum;
    readonly DRAW_BUFFER3_WEBGL: GLenum;
    readonly DRAW_BUFFER4_WEBGL: GLenum;
    readonly DRAW_BUFFER5_WEBGL: GLenum;
    readonly DRAW_BUFFER6_WEBGL: GLenum;
    readonly DRAW_BUFFER7_WEBGL: GLenum;
    readonly DRAW_BUFFER8_WEBGL: GLenum;
    readonly DRAW_BUFFER9_WEBGL: GLenum;
    readonly MAX_COLOR_ATTACHMENTS_WEBGL: GLenum;
    readonly MAX_DRAW_BUFFERS_WEBGL: GLenum;
}

interface WEBGL_lose_context {
    loseContext(): void;
    restoreContext(): void;
}

/** A WaveShaperNode always has exactly one input and one output. */
interface WaveShaperNode extends AudioNode {
    curve: Float32Array | null;
    oversample: OverSampleType;
}

declare var WaveShaperNode: {
    prototype: WaveShaperNode;
    new(context: BaseAudioContext, options?: WaveShaperOptions): WaveShaperNode;
};

interface WebGL2RenderingContext extends WebGL2RenderingContextBase, WebGL2RenderingContextOverloads, WebGLRenderingContextBase {
}

declare var WebGL2RenderingContext: {
    prototype: WebGL2RenderingContext;
    new(): WebGL2RenderingContext;
    readonly ACTIVE_UNIFORM_BLOCKS: GLenum;
    readonly ALREADY_SIGNALED: GLenum;
    readonly ANY_SAMPLES_PASSED: GLenum;
    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: GLenum;
    readonly COLOR: GLenum;
    readonly COLOR_ATTACHMENT1: GLenum;
    readonly COLOR_ATTACHMENT10: GLenum;
    readonly COLOR_ATTACHMENT11: GLenum;
    readonly COLOR_ATTACHMENT12: GLenum;
    readonly COLOR_ATTACHMENT13: GLenum;
    readonly COLOR_ATTACHMENT14: GLenum;
    readonly COLOR_ATTACHMENT15: GLenum;
    readonly COLOR_ATTACHMENT2: GLenum;
    readonly COLOR_ATTACHMENT3: GLenum;
    readonly COLOR_ATTACHMENT4: GLenum;
    readonly COLOR_ATTACHMENT5: GLenum;
    readonly COLOR_ATTACHMENT6: GLenum;
    readonly COLOR_ATTACHMENT7: GLenum;
    readonly COLOR_ATTACHMENT8: GLenum;
    readonly COLOR_ATTACHMENT9: GLenum;
    readonly COMPARE_REF_TO_TEXTURE: GLenum;
    readonly CONDITION_SATISFIED: GLenum;
    readonly COPY_READ_BUFFER: GLenum;
    readonly COPY_READ_BUFFER_BINDING: GLenum;
    readonly COPY_WRITE_BUFFER: GLenum;
    readonly COPY_WRITE_BUFFER_BINDING: GLenum;
    readonly CURRENT_QUERY: GLenum;
    readonly DEPTH: GLenum;
    readonly DEPTH24_STENCIL8: GLenum;
    readonly DEPTH32F_STENCIL8: GLenum;
    readonly DEPTH_COMPONENT24: GLenum;
    readonly DEPTH_COMPONENT32F: GLenum;
    readonly DRAW_BUFFER0: GLenum;
    readonly DRAW_BUFFER1: GLenum;
    readonly DRAW_BUFFER10: GLenum;
    readonly DRAW_BUFFER11: GLenum;
    readonly DRAW_BUFFER12: GLenum;
    readonly DRAW_BUFFER13: GLenum;
    readonly DRAW_BUFFER14: GLenum;
    readonly DRAW_BUFFER15: GLenum;
    readonly DRAW_BUFFER2: GLenum;
    readonly DRAW_BUFFER3: GLenum;
    readonly DRAW_BUFFER4: GLenum;
    readonly DRAW_BUFFER5: GLenum;
    readonly DRAW_BUFFER6: GLenum;
    readonly DRAW_BUFFER7: GLenum;
    readonly DRAW_BUFFER8: GLenum;
    readonly DRAW_BUFFER9: GLenum;
    readonly DRAW_FRAMEBUFFER: GLenum;
    readonly DRAW_FRAMEBUFFER_BINDING: GLenum;
    readonly DYNAMIC_COPY: GLenum;
    readonly DYNAMIC_READ: GLenum;
    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: GLenum;
    readonly FLOAT_MAT2x3: GLenum;
    readonly FLOAT_MAT2x4: GLenum;
    readonly FLOAT_MAT3x2: GLenum;
    readonly FLOAT_MAT3x4: GLenum;
    readonly FLOAT_MAT4x2: GLenum;
    readonly FLOAT_MAT4x3: GLenum;
    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: GLenum;
    readonly FRAMEBUFFER_DEFAULT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: GLenum;
    readonly HALF_FLOAT: GLenum;
    readonly INTERLEAVED_ATTRIBS: GLenum;
    readonly INT_2_10_10_10_REV: GLenum;
    readonly INT_SAMPLER_2D: GLenum;
    readonly INT_SAMPLER_2D_ARRAY: GLenum;
    readonly INT_SAMPLER_3D: GLenum;
    readonly INT_SAMPLER_CUBE: GLenum;
    readonly INVALID_INDEX: GLenum;
    readonly MAX: GLenum;
    readonly MAX_3D_TEXTURE_SIZE: GLenum;
    readonly MAX_ARRAY_TEXTURE_LAYERS: GLenum;
    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: GLenum;
    readonly MAX_COLOR_ATTACHMENTS: GLenum;
    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_COMBINED_UNIFORM_BLOCKS: GLenum;
    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_DRAW_BUFFERS: GLenum;
    readonly MAX_ELEMENTS_INDICES: GLenum;
    readonly MAX_ELEMENTS_VERTICES: GLenum;
    readonly MAX_ELEMENT_INDEX: GLenum;
    readonly MAX_FRAGMENT_INPUT_COMPONENTS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly MAX_SAMPLES: GLenum;
    readonly MAX_SERVER_WAIT_TIMEOUT: GLenum;
    readonly MAX_TEXTURE_LOD_BIAS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: GLenum;
    readonly MAX_UNIFORM_BLOCK_SIZE: GLenum;
    readonly MAX_UNIFORM_BUFFER_BINDINGS: GLenum;
    readonly MAX_VARYING_COMPONENTS: GLenum;
    readonly MAX_VERTEX_OUTPUT_COMPONENTS: GLenum;
    readonly MAX_VERTEX_UNIFORM_BLOCKS: GLenum;
    readonly MAX_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MIN: GLenum;
    readonly MIN_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly OBJECT_TYPE: GLenum;
    readonly PACK_ROW_LENGTH: GLenum;
    readonly PACK_SKIP_PIXELS: GLenum;
    readonly PACK_SKIP_ROWS: GLenum;
    readonly PIXEL_PACK_BUFFER: GLenum;
    readonly PIXEL_PACK_BUFFER_BINDING: GLenum;
    readonly PIXEL_UNPACK_BUFFER: GLenum;
    readonly PIXEL_UNPACK_BUFFER_BINDING: GLenum;
    readonly QUERY_RESULT: GLenum;
    readonly QUERY_RESULT_AVAILABLE: GLenum;
    readonly R11F_G11F_B10F: GLenum;
    readonly R16F: GLenum;
    readonly R16I: GLenum;
    readonly R16UI: GLenum;
    readonly R32F: GLenum;
    readonly R32I: GLenum;
    readonly R32UI: GLenum;
    readonly R8: GLenum;
    readonly R8I: GLenum;
    readonly R8UI: GLenum;
    readonly R8_SNORM: GLenum;
    readonly RASTERIZER_DISCARD: GLenum;
    readonly READ_BUFFER: GLenum;
    readonly READ_FRAMEBUFFER: GLenum;
    readonly READ_FRAMEBUFFER_BINDING: GLenum;
    readonly RED: GLenum;
    readonly RED_INTEGER: GLenum;
    readonly RENDERBUFFER_SAMPLES: GLenum;
    readonly RG: GLenum;
    readonly RG16F: GLenum;
    readonly RG16I: GLenum;
    readonly RG16UI: GLenum;
    readonly RG32F: GLenum;
    readonly RG32I: GLenum;
    readonly RG32UI: GLenum;
    readonly RG8: GLenum;
    readonly RG8I: GLenum;
    readonly RG8UI: GLenum;
    readonly RG8_SNORM: GLenum;
    readonly RGB10_A2: GLenum;
    readonly RGB10_A2UI: GLenum;
    readonly RGB16F: GLenum;
    readonly RGB16I: GLenum;
    readonly RGB16UI: GLenum;
    readonly RGB32F: GLenum;
    readonly RGB32I: GLenum;
    readonly RGB32UI: GLenum;
    readonly RGB8: GLenum;
    readonly RGB8I: GLenum;
    readonly RGB8UI: GLenum;
    readonly RGB8_SNORM: GLenum;
    readonly RGB9_E5: GLenum;
    readonly RGBA16F: GLenum;
    readonly RGBA16I: GLenum;
    readonly RGBA16UI: GLenum;
    readonly RGBA32F: GLenum;
    readonly RGBA32I: GLenum;
    readonly RGBA32UI: GLenum;
    readonly RGBA8: GLenum;
    readonly RGBA8I: GLenum;
    readonly RGBA8UI: GLenum;
    readonly RGBA8_SNORM: GLenum;
    readonly RGBA_INTEGER: GLenum;
    readonly RGB_INTEGER: GLenum;
    readonly RG_INTEGER: GLenum;
    readonly SAMPLER_2D_ARRAY: GLenum;
    readonly SAMPLER_2D_ARRAY_SHADOW: GLenum;
    readonly SAMPLER_2D_SHADOW: GLenum;
    readonly SAMPLER_3D: GLenum;
    readonly SAMPLER_BINDING: GLenum;
    readonly SAMPLER_CUBE_SHADOW: GLenum;
    readonly SEPARATE_ATTRIBS: GLenum;
    readonly SIGNALED: GLenum;
    readonly SIGNED_NORMALIZED: GLenum;
    readonly SRGB: GLenum;
    readonly SRGB8: GLenum;
    readonly SRGB8_ALPHA8: GLenum;
    readonly STATIC_COPY: GLenum;
    readonly STATIC_READ: GLenum;
    readonly STENCIL: GLenum;
    readonly STREAM_COPY: GLenum;
    readonly STREAM_READ: GLenum;
    readonly SYNC_CONDITION: GLenum;
    readonly SYNC_FENCE: GLenum;
    readonly SYNC_FLAGS: GLenum;
    readonly SYNC_FLUSH_COMMANDS_BIT: GLenum;
    readonly SYNC_GPU_COMMANDS_COMPLETE: GLenum;
    readonly SYNC_STATUS: GLenum;
    readonly TEXTURE_2D_ARRAY: GLenum;
    readonly TEXTURE_3D: GLenum;
    readonly TEXTURE_BASE_LEVEL: GLenum;
    readonly TEXTURE_BINDING_2D_ARRAY: GLenum;
    readonly TEXTURE_BINDING_3D: GLenum;
    readonly TEXTURE_COMPARE_FUNC: GLenum;
    readonly TEXTURE_COMPARE_MODE: GLenum;
    readonly TEXTURE_IMMUTABLE_FORMAT: GLenum;
    readonly TEXTURE_IMMUTABLE_LEVELS: GLenum;
    readonly TEXTURE_MAX_LEVEL: GLenum;
    readonly TEXTURE_MAX_LOD: GLenum;
    readonly TEXTURE_MIN_LOD: GLenum;
    readonly TEXTURE_WRAP_R: GLenum;
    readonly TIMEOUT_EXPIRED: GLenum;
    readonly TIMEOUT_IGNORED: GLint64;
    readonly TRANSFORM_FEEDBACK: GLenum;
    readonly TRANSFORM_FEEDBACK_ACTIVE: GLenum;
    readonly TRANSFORM_FEEDBACK_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_START: GLenum;
    readonly TRANSFORM_FEEDBACK_PAUSED: GLenum;
    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: GLenum;
    readonly TRANSFORM_FEEDBACK_VARYINGS: GLenum;
    readonly UNIFORM_ARRAY_STRIDE: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: GLenum;
    readonly UNIFORM_BLOCK_BINDING: GLenum;
    readonly UNIFORM_BLOCK_DATA_SIZE: GLenum;
    readonly UNIFORM_BLOCK_INDEX: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: GLenum;
    readonly UNIFORM_BUFFER: GLenum;
    readonly UNIFORM_BUFFER_BINDING: GLenum;
    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: GLenum;
    readonly UNIFORM_BUFFER_SIZE: GLenum;
    readonly UNIFORM_BUFFER_START: GLenum;
    readonly UNIFORM_IS_ROW_MAJOR: GLenum;
    readonly UNIFORM_MATRIX_STRIDE: GLenum;
    readonly UNIFORM_OFFSET: GLenum;
    readonly UNIFORM_SIZE: GLenum;
    readonly UNIFORM_TYPE: GLenum;
    readonly UNPACK_IMAGE_HEIGHT: GLenum;
    readonly UNPACK_ROW_LENGTH: GLenum;
    readonly UNPACK_SKIP_IMAGES: GLenum;
    readonly UNPACK_SKIP_PIXELS: GLenum;
    readonly UNPACK_SKIP_ROWS: GLenum;
    readonly UNSIGNALED: GLenum;
    readonly UNSIGNED_INT_10F_11F_11F_REV: GLenum;
    readonly UNSIGNED_INT_24_8: GLenum;
    readonly UNSIGNED_INT_2_10_10_10_REV: GLenum;
    readonly UNSIGNED_INT_5_9_9_9_REV: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: GLenum;
    readonly UNSIGNED_INT_SAMPLER_3D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_CUBE: GLenum;
    readonly UNSIGNED_INT_VEC2: GLenum;
    readonly UNSIGNED_INT_VEC3: GLenum;
    readonly UNSIGNED_INT_VEC4: GLenum;
    readonly UNSIGNED_NORMALIZED: GLenum;
    readonly VERTEX_ARRAY_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_INTEGER: GLenum;
    readonly WAIT_FAILED: GLenum;
    readonly ACTIVE_ATTRIBUTES: GLenum;
    readonly ACTIVE_TEXTURE: GLenum;
    readonly ACTIVE_UNIFORMS: GLenum;
    readonly ALIASED_LINE_WIDTH_RANGE: GLenum;
    readonly ALIASED_POINT_SIZE_RANGE: GLenum;
    readonly ALPHA: GLenum;
    readonly ALPHA_BITS: GLenum;
    readonly ALWAYS: GLenum;
    readonly ARRAY_BUFFER: GLenum;
    readonly ARRAY_BUFFER_BINDING: GLenum;
    readonly ATTACHED_SHADERS: GLenum;
    readonly BACK: GLenum;
    readonly BLEND: GLenum;
    readonly BLEND_COLOR: GLenum;
    readonly BLEND_DST_ALPHA: GLenum;
    readonly BLEND_DST_RGB: GLenum;
    readonly BLEND_EQUATION: GLenum;
    readonly BLEND_EQUATION_ALPHA: GLenum;
    readonly BLEND_EQUATION_RGB: GLenum;
    readonly BLEND_SRC_ALPHA: GLenum;
    readonly BLEND_SRC_RGB: GLenum;
    readonly BLUE_BITS: GLenum;
    readonly BOOL: GLenum;
    readonly BOOL_VEC2: GLenum;
    readonly BOOL_VEC3: GLenum;
    readonly BOOL_VEC4: GLenum;
    readonly BROWSER_DEFAULT_WEBGL: GLenum;
    readonly BUFFER_SIZE: GLenum;
    readonly BUFFER_USAGE: GLenum;
    readonly BYTE: GLenum;
    readonly CCW: GLenum;
    readonly CLAMP_TO_EDGE: GLenum;
    readonly COLOR_ATTACHMENT0: GLenum;
    readonly COLOR_BUFFER_BIT: GLenum;
    readonly COLOR_CLEAR_VALUE: GLenum;
    readonly COLOR_WRITEMASK: GLenum;
    readonly COMPILE_STATUS: GLenum;
    readonly COMPRESSED_TEXTURE_FORMATS: GLenum;
    readonly CONSTANT_ALPHA: GLenum;
    readonly CONSTANT_COLOR: GLenum;
    readonly CONTEXT_LOST_WEBGL: GLenum;
    readonly CULL_FACE: GLenum;
    readonly CULL_FACE_MODE: GLenum;
    readonly CURRENT_PROGRAM: GLenum;
    readonly CURRENT_VERTEX_ATTRIB: GLenum;
    readonly CW: GLenum;
    readonly DECR: GLenum;
    readonly DECR_WRAP: GLenum;
    readonly DELETE_STATUS: GLenum;
    readonly DEPTH_ATTACHMENT: GLenum;
    readonly DEPTH_BITS: GLenum;
    readonly DEPTH_BUFFER_BIT: GLenum;
    readonly DEPTH_CLEAR_VALUE: GLenum;
    readonly DEPTH_COMPONENT: GLenum;
    readonly DEPTH_COMPONENT16: GLenum;
    readonly DEPTH_FUNC: GLenum;
    readonly DEPTH_RANGE: GLenum;
    readonly DEPTH_STENCIL: GLenum;
    readonly DEPTH_STENCIL_ATTACHMENT: GLenum;
    readonly DEPTH_TEST: GLenum;
    readonly DEPTH_WRITEMASK: GLenum;
    readonly DITHER: GLenum;
    readonly DONT_CARE: GLenum;
    readonly DST_ALPHA: GLenum;
    readonly DST_COLOR: GLenum;
    readonly DYNAMIC_DRAW: GLenum;
    readonly ELEMENT_ARRAY_BUFFER: GLenum;
    readonly ELEMENT_ARRAY_BUFFER_BINDING: GLenum;
    readonly EQUAL: GLenum;
    readonly FASTEST: GLenum;
    readonly FLOAT: GLenum;
    readonly FLOAT_MAT2: GLenum;
    readonly FLOAT_MAT3: GLenum;
    readonly FLOAT_MAT4: GLenum;
    readonly FLOAT_VEC2: GLenum;
    readonly FLOAT_VEC3: GLenum;
    readonly FLOAT_VEC4: GLenum;
    readonly FRAGMENT_SHADER: GLenum;
    readonly FRAMEBUFFER: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum;
    readonly FRAMEBUFFER_BINDING: GLenum;
    readonly FRAMEBUFFER_COMPLETE: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_UNSUPPORTED: GLenum;
    readonly FRONT: GLenum;
    readonly FRONT_AND_BACK: GLenum;
    readonly FRONT_FACE: GLenum;
    readonly FUNC_ADD: GLenum;
    readonly FUNC_REVERSE_SUBTRACT: GLenum;
    readonly FUNC_SUBTRACT: GLenum;
    readonly GENERATE_MIPMAP_HINT: GLenum;
    readonly GEQUAL: GLenum;
    readonly GREATER: GLenum;
    readonly GREEN_BITS: GLenum;
    readonly HIGH_FLOAT: GLenum;
    readonly HIGH_INT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_FORMAT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_TYPE: GLenum;
    readonly INCR: GLenum;
    readonly INCR_WRAP: GLenum;
    readonly INT: GLenum;
    readonly INT_VEC2: GLenum;
    readonly INT_VEC3: GLenum;
    readonly INT_VEC4: GLenum;
    readonly INVALID_ENUM: GLenum;
    readonly INVALID_FRAMEBUFFER_OPERATION: GLenum;
    readonly INVALID_OPERATION: GLenum;
    readonly INVALID_VALUE: GLenum;
    readonly INVERT: GLenum;
    readonly KEEP: GLenum;
    readonly LEQUAL: GLenum;
    readonly LESS: GLenum;
    readonly LINEAR: GLenum;
    readonly LINEAR_MIPMAP_LINEAR: GLenum;
    readonly LINEAR_MIPMAP_NEAREST: GLenum;
    readonly LINES: GLenum;
    readonly LINE_LOOP: GLenum;
    readonly LINE_STRIP: GLenum;
    readonly LINE_WIDTH: GLenum;
    readonly LINK_STATUS: GLenum;
    readonly LOW_FLOAT: GLenum;
    readonly LOW_INT: GLenum;
    readonly LUMINANCE: GLenum;
    readonly LUMINANCE_ALPHA: GLenum;
    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_CUBE_MAP_TEXTURE_SIZE: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_VECTORS: GLenum;
    readonly MAX_RENDERBUFFER_SIZE: GLenum;
    readonly MAX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_TEXTURE_SIZE: GLenum;
    readonly MAX_VARYING_VECTORS: GLenum;
    readonly MAX_VERTEX_ATTRIBS: GLenum;
    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_VERTEX_UNIFORM_VECTORS: GLenum;
    readonly MAX_VIEWPORT_DIMS: GLenum;
    readonly MEDIUM_FLOAT: GLenum;
    readonly MEDIUM_INT: GLenum;
    readonly MIRRORED_REPEAT: GLenum;
    readonly NEAREST: GLenum;
    readonly NEAREST_MIPMAP_LINEAR: GLenum;
    readonly NEAREST_MIPMAP_NEAREST: GLenum;
    readonly NEVER: GLenum;
    readonly NICEST: GLenum;
    readonly NONE: GLenum;
    readonly NOTEQUAL: GLenum;
    readonly NO_ERROR: GLenum;
    readonly ONE: GLenum;
    readonly ONE_MINUS_CONSTANT_ALPHA: GLenum;
    readonly ONE_MINUS_CONSTANT_COLOR: GLenum;
    readonly ONE_MINUS_DST_ALPHA: GLenum;
    readonly ONE_MINUS_DST_COLOR: GLenum;
    readonly ONE_MINUS_SRC_ALPHA: GLenum;
    readonly ONE_MINUS_SRC_COLOR: GLenum;
    readonly OUT_OF_MEMORY: GLenum;
    readonly PACK_ALIGNMENT: GLenum;
    readonly POINTS: GLenum;
    readonly POLYGON_OFFSET_FACTOR: GLenum;
    readonly POLYGON_OFFSET_FILL: GLenum;
    readonly POLYGON_OFFSET_UNITS: GLenum;
    readonly RED_BITS: GLenum;
    readonly RENDERBUFFER: GLenum;
    readonly RENDERBUFFER_ALPHA_SIZE: GLenum;
    readonly RENDERBUFFER_BINDING: GLenum;
    readonly RENDERBUFFER_BLUE_SIZE: GLenum;
    readonly RENDERBUFFER_DEPTH_SIZE: GLenum;
    readonly RENDERBUFFER_GREEN_SIZE: GLenum;
    readonly RENDERBUFFER_HEIGHT: GLenum;
    readonly RENDERBUFFER_INTERNAL_FORMAT: GLenum;
    readonly RENDERBUFFER_RED_SIZE: GLenum;
    readonly RENDERBUFFER_STENCIL_SIZE: GLenum;
    readonly RENDERBUFFER_WIDTH: GLenum;
    readonly RENDERER: GLenum;
    readonly REPEAT: GLenum;
    readonly REPLACE: GLenum;
    readonly RGB: GLenum;
    readonly RGB565: GLenum;
    readonly RGB5_A1: GLenum;
    readonly RGBA: GLenum;
    readonly RGBA4: GLenum;
    readonly SAMPLER_2D: GLenum;
    readonly SAMPLER_CUBE: GLenum;
    readonly SAMPLES: GLenum;
    readonly SAMPLE_ALPHA_TO_COVERAGE: GLenum;
    readonly SAMPLE_BUFFERS: GLenum;
    readonly SAMPLE_COVERAGE: GLenum;
    readonly SAMPLE_COVERAGE_INVERT: GLenum;
    readonly SAMPLE_COVERAGE_VALUE: GLenum;
    readonly SCISSOR_BOX: GLenum;
    readonly SCISSOR_TEST: GLenum;
    readonly SHADER_TYPE: GLenum;
    readonly SHADING_LANGUAGE_VERSION: GLenum;
    readonly SHORT: GLenum;
    readonly SRC_ALPHA: GLenum;
    readonly SRC_ALPHA_SATURATE: GLenum;
    readonly SRC_COLOR: GLenum;
    readonly STATIC_DRAW: GLenum;
    readonly STENCIL_ATTACHMENT: GLenum;
    readonly STENCIL_BACK_FAIL: GLenum;
    readonly STENCIL_BACK_FUNC: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_BACK_REF: GLenum;
    readonly STENCIL_BACK_VALUE_MASK: GLenum;
    readonly STENCIL_BACK_WRITEMASK: GLenum;
    readonly STENCIL_BITS: GLenum;
    readonly STENCIL_BUFFER_BIT: GLenum;
    readonly STENCIL_CLEAR_VALUE: GLenum;
    readonly STENCIL_FAIL: GLenum;
    readonly STENCIL_FUNC: GLenum;
    readonly STENCIL_INDEX8: GLenum;
    readonly STENCIL_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_REF: GLenum;
    readonly STENCIL_TEST: GLenum;
    readonly STENCIL_VALUE_MASK: GLenum;
    readonly STENCIL_WRITEMASK: GLenum;
    readonly STREAM_DRAW: GLenum;
    readonly SUBPIXEL_BITS: GLenum;
    readonly TEXTURE: GLenum;
    readonly TEXTURE0: GLenum;
    readonly TEXTURE1: GLenum;
    readonly TEXTURE10: GLenum;
    readonly TEXTURE11: GLenum;
    readonly TEXTURE12: GLenum;
    readonly TEXTURE13: GLenum;
    readonly TEXTURE14: GLenum;
    readonly TEXTURE15: GLenum;
    readonly TEXTURE16: GLenum;
    readonly TEXTURE17: GLenum;
    readonly TEXTURE18: GLenum;
    readonly TEXTURE19: GLenum;
    readonly TEXTURE2: GLenum;
    readonly TEXTURE20: GLenum;
    readonly TEXTURE21: GLenum;
    readonly TEXTURE22: GLenum;
    readonly TEXTURE23: GLenum;
    readonly TEXTURE24: GLenum;
    readonly TEXTURE25: GLenum;
    readonly TEXTURE26: GLenum;
    readonly TEXTURE27: GLenum;
    readonly TEXTURE28: GLenum;
    readonly TEXTURE29: GLenum;
    readonly TEXTURE3: GLenum;
    readonly TEXTURE30: GLenum;
    readonly TEXTURE31: GLenum;
    readonly TEXTURE4: GLenum;
    readonly TEXTURE5: GLenum;
    readonly TEXTURE6: GLenum;
    readonly TEXTURE7: GLenum;
    readonly TEXTURE8: GLenum;
    readonly TEXTURE9: GLenum;
    readonly TEXTURE_2D: GLenum;
    readonly TEXTURE_BINDING_2D: GLenum;
    readonly TEXTURE_BINDING_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum;
    readonly TEXTURE_MAG_FILTER: GLenum;
    readonly TEXTURE_MIN_FILTER: GLenum;
    readonly TEXTURE_WRAP_S: GLenum;
    readonly TEXTURE_WRAP_T: GLenum;
    readonly TRIANGLES: GLenum;
    readonly TRIANGLE_FAN: GLenum;
    readonly TRIANGLE_STRIP: GLenum;
    readonly UNPACK_ALIGNMENT: GLenum;
    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: GLenum;
    readonly UNPACK_FLIP_Y_WEBGL: GLenum;
    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: GLenum;
    readonly UNSIGNED_BYTE: GLenum;
    readonly UNSIGNED_INT: GLenum;
    readonly UNSIGNED_SHORT: GLenum;
    readonly UNSIGNED_SHORT_4_4_4_4: GLenum;
    readonly UNSIGNED_SHORT_5_5_5_1: GLenum;
    readonly UNSIGNED_SHORT_5_6_5: GLenum;
    readonly VALIDATE_STATUS: GLenum;
    readonly VENDOR: GLenum;
    readonly VERSION: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_ENABLED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_POINTER: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_SIZE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_STRIDE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_TYPE: GLenum;
    readonly VERTEX_SHADER: GLenum;
    readonly VIEWPORT: GLenum;
    readonly ZERO: GLenum;
};

interface WebGL2RenderingContextBase {
    beginQuery(target: GLenum, query: WebGLQuery): void;
    beginTransformFeedback(primitiveMode: GLenum): void;
    bindBufferBase(target: GLenum, index: GLuint, buffer: WebGLBuffer | null): void;
    bindBufferRange(target: GLenum, index: GLuint, buffer: WebGLBuffer | null, offset: GLintptr, size: GLsizeiptr): void;
    bindSampler(unit: GLuint, sampler: WebGLSampler | null): void;
    bindTransformFeedback(target: GLenum, tf: WebGLTransformFeedback | null): void;
    bindVertexArray(array: WebGLVertexArrayObject | null): void;
    blitFramebuffer(srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum): void;
    clearBufferfi(buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint): void;
    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Float32List, srcOffset?: GLuint): void;
    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Int32List, srcOffset?: GLuint): void;
    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Uint32List, srcOffset?: GLuint): void;
    clientWaitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLuint64): GLenum;
    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    copyBufferSubData(readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr): void;
    copyTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    createQuery(): WebGLQuery | null;
    createSampler(): WebGLSampler | null;
    createTransformFeedback(): WebGLTransformFeedback | null;
    createVertexArray(): WebGLVertexArrayObject | null;
    deleteQuery(query: WebGLQuery | null): void;
    deleteSampler(sampler: WebGLSampler | null): void;
    deleteSync(sync: WebGLSync | null): void;
    deleteTransformFeedback(tf: WebGLTransformFeedback | null): void;
    deleteVertexArray(vertexArray: WebGLVertexArrayObject | null): void;
    drawArraysInstanced(mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei): void;
    drawBuffers(buffers: GLenum[]): void;
    drawElementsInstanced(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, instanceCount: GLsizei): void;
    drawRangeElements(mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, offset: GLintptr): void;
    endQuery(target: GLenum): void;
    endTransformFeedback(): void;
    fenceSync(condition: GLenum, flags: GLbitfield): WebGLSync | null;
    framebufferTextureLayer(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, layer: GLint): void;
    getActiveUniformBlockName(program: WebGLProgram, uniformBlockIndex: GLuint): string | null;
    getActiveUniformBlockParameter(program: WebGLProgram, uniformBlockIndex: GLuint, pname: GLenum): any;
    getActiveUniforms(program: WebGLProgram, uniformIndices: GLuint[], pname: GLenum): any;
    getBufferSubData(target: GLenum, srcByteOffset: GLintptr, dstBuffer: ArrayBufferView, dstOffset?: GLuint, length?: GLuint): void;
    getFragDataLocation(program: WebGLProgram, name: string): GLint;
    getIndexedParameter(target: GLenum, index: GLuint): any;
    getInternalformatParameter(target: GLenum, internalformat: GLenum, pname: GLenum): any;
    getQuery(target: GLenum, pname: GLenum): WebGLQuery | null;
    getQueryParameter(query: WebGLQuery, pname: GLenum): any;
    getSamplerParameter(sampler: WebGLSampler, pname: GLenum): any;
    getSyncParameter(sync: WebGLSync, pname: GLenum): any;
    getTransformFeedbackVarying(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
    getUniformBlockIndex(program: WebGLProgram, uniformBlockName: string): GLuint;
    getUniformIndices(program: WebGLProgram, uniformNames: string[]): GLuint[] | null;
    invalidateFramebuffer(target: GLenum, attachments: GLenum[]): void;
    invalidateSubFramebuffer(target: GLenum, attachments: GLenum[], x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    isQuery(query: WebGLQuery | null): GLboolean;
    isSampler(sampler: WebGLSampler | null): GLboolean;
    isSync(sync: WebGLSync | null): GLboolean;
    isTransformFeedback(tf: WebGLTransformFeedback | null): GLboolean;
    isVertexArray(vertexArray: WebGLVertexArrayObject | null): GLboolean;
    pauseTransformFeedback(): void;
    readBuffer(src: GLenum): void;
    renderbufferStorageMultisample(target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
    resumeTransformFeedback(): void;
    samplerParameterf(sampler: WebGLSampler, pname: GLenum, param: GLfloat): void;
    samplerParameteri(sampler: WebGLSampler, pname: GLenum, param: GLint): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView | null): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
    texStorage2D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
    texStorage3D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei): void;
    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView | null, srcOffset?: GLuint): void;
    transformFeedbackVaryings(program: WebGLProgram, varyings: string[], bufferMode: GLenum): void;
    uniform1ui(location: WebGLUniformLocation | null, v0: GLuint): void;
    uniform1uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform2ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint): void;
    uniform2uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform3ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint): void;
    uniform3uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform4ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint): void;
    uniform4uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformBlockBinding(program: WebGLProgram, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint): void;
    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    vertexAttribDivisor(index: GLuint, divisor: GLuint): void;
    vertexAttribI4i(index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint): void;
    vertexAttribI4iv(index: GLuint, values: Int32List): void;
    vertexAttribI4ui(index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint): void;
    vertexAttribI4uiv(index: GLuint, values: Uint32List): void;
    vertexAttribIPointer(index: GLuint, size: GLint, type: GLenum, stride: GLsizei, offset: GLintptr): void;
    waitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLint64): void;
    readonly ACTIVE_UNIFORM_BLOCKS: GLenum;
    readonly ALREADY_SIGNALED: GLenum;
    readonly ANY_SAMPLES_PASSED: GLenum;
    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: GLenum;
    readonly COLOR: GLenum;
    readonly COLOR_ATTACHMENT1: GLenum;
    readonly COLOR_ATTACHMENT10: GLenum;
    readonly COLOR_ATTACHMENT11: GLenum;
    readonly COLOR_ATTACHMENT12: GLenum;
    readonly COLOR_ATTACHMENT13: GLenum;
    readonly COLOR_ATTACHMENT14: GLenum;
    readonly COLOR_ATTACHMENT15: GLenum;
    readonly COLOR_ATTACHMENT2: GLenum;
    readonly COLOR_ATTACHMENT3: GLenum;
    readonly COLOR_ATTACHMENT4: GLenum;
    readonly COLOR_ATTACHMENT5: GLenum;
    readonly COLOR_ATTACHMENT6: GLenum;
    readonly COLOR_ATTACHMENT7: GLenum;
    readonly COLOR_ATTACHMENT8: GLenum;
    readonly COLOR_ATTACHMENT9: GLenum;
    readonly COMPARE_REF_TO_TEXTURE: GLenum;
    readonly CONDITION_SATISFIED: GLenum;
    readonly COPY_READ_BUFFER: GLenum;
    readonly COPY_READ_BUFFER_BINDING: GLenum;
    readonly COPY_WRITE_BUFFER: GLenum;
    readonly COPY_WRITE_BUFFER_BINDING: GLenum;
    readonly CURRENT_QUERY: GLenum;
    readonly DEPTH: GLenum;
    readonly DEPTH24_STENCIL8: GLenum;
    readonly DEPTH32F_STENCIL8: GLenum;
    readonly DEPTH_COMPONENT24: GLenum;
    readonly DEPTH_COMPONENT32F: GLenum;
    readonly DRAW_BUFFER0: GLenum;
    readonly DRAW_BUFFER1: GLenum;
    readonly DRAW_BUFFER10: GLenum;
    readonly DRAW_BUFFER11: GLenum;
    readonly DRAW_BUFFER12: GLenum;
    readonly DRAW_BUFFER13: GLenum;
    readonly DRAW_BUFFER14: GLenum;
    readonly DRAW_BUFFER15: GLenum;
    readonly DRAW_BUFFER2: GLenum;
    readonly DRAW_BUFFER3: GLenum;
    readonly DRAW_BUFFER4: GLenum;
    readonly DRAW_BUFFER5: GLenum;
    readonly DRAW_BUFFER6: GLenum;
    readonly DRAW_BUFFER7: GLenum;
    readonly DRAW_BUFFER8: GLenum;
    readonly DRAW_BUFFER9: GLenum;
    readonly DRAW_FRAMEBUFFER: GLenum;
    readonly DRAW_FRAMEBUFFER_BINDING: GLenum;
    readonly DYNAMIC_COPY: GLenum;
    readonly DYNAMIC_READ: GLenum;
    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: GLenum;
    readonly FLOAT_MAT2x3: GLenum;
    readonly FLOAT_MAT2x4: GLenum;
    readonly FLOAT_MAT3x2: GLenum;
    readonly FLOAT_MAT3x4: GLenum;
    readonly FLOAT_MAT4x2: GLenum;
    readonly FLOAT_MAT4x3: GLenum;
    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: GLenum;
    readonly FRAMEBUFFER_DEFAULT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: GLenum;
    readonly HALF_FLOAT: GLenum;
    readonly INTERLEAVED_ATTRIBS: GLenum;
    readonly INT_2_10_10_10_REV: GLenum;
    readonly INT_SAMPLER_2D: GLenum;
    readonly INT_SAMPLER_2D_ARRAY: GLenum;
    readonly INT_SAMPLER_3D: GLenum;
    readonly INT_SAMPLER_CUBE: GLenum;
    readonly INVALID_INDEX: GLenum;
    readonly MAX: GLenum;
    readonly MAX_3D_TEXTURE_SIZE: GLenum;
    readonly MAX_ARRAY_TEXTURE_LAYERS: GLenum;
    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: GLenum;
    readonly MAX_COLOR_ATTACHMENTS: GLenum;
    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_COMBINED_UNIFORM_BLOCKS: GLenum;
    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_DRAW_BUFFERS: GLenum;
    readonly MAX_ELEMENTS_INDICES: GLenum;
    readonly MAX_ELEMENTS_VERTICES: GLenum;
    readonly MAX_ELEMENT_INDEX: GLenum;
    readonly MAX_FRAGMENT_INPUT_COMPONENTS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly MAX_SAMPLES: GLenum;
    readonly MAX_SERVER_WAIT_TIMEOUT: GLenum;
    readonly MAX_TEXTURE_LOD_BIAS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: GLenum;
    readonly MAX_UNIFORM_BLOCK_SIZE: GLenum;
    readonly MAX_UNIFORM_BUFFER_BINDINGS: GLenum;
    readonly MAX_VARYING_COMPONENTS: GLenum;
    readonly MAX_VERTEX_OUTPUT_COMPONENTS: GLenum;
    readonly MAX_VERTEX_UNIFORM_BLOCKS: GLenum;
    readonly MAX_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MIN: GLenum;
    readonly MIN_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly OBJECT_TYPE: GLenum;
    readonly PACK_ROW_LENGTH: GLenum;
    readonly PACK_SKIP_PIXELS: GLenum;
    readonly PACK_SKIP_ROWS: GLenum;
    readonly PIXEL_PACK_BUFFER: GLenum;
    readonly PIXEL_PACK_BUFFER_BINDING: GLenum;
    readonly PIXEL_UNPACK_BUFFER: GLenum;
    readonly PIXEL_UNPACK_BUFFER_BINDING: GLenum;
    readonly QUERY_RESULT: GLenum;
    readonly QUERY_RESULT_AVAILABLE: GLenum;
    readonly R11F_G11F_B10F: GLenum;
    readonly R16F: GLenum;
    readonly R16I: GLenum;
    readonly R16UI: GLenum;
    readonly R32F: GLenum;
    readonly R32I: GLenum;
    readonly R32UI: GLenum;
    readonly R8: GLenum;
    readonly R8I: GLenum;
    readonly R8UI: GLenum;
    readonly R8_SNORM: GLenum;
    readonly RASTERIZER_DISCARD: GLenum;
    readonly READ_BUFFER: GLenum;
    readonly READ_FRAMEBUFFER: GLenum;
    readonly READ_FRAMEBUFFER_BINDING: GLenum;
    readonly RED: GLenum;
    readonly RED_INTEGER: GLenum;
    readonly RENDERBUFFER_SAMPLES: GLenum;
    readonly RG: GLenum;
    readonly RG16F: GLenum;
    readonly RG16I: GLenum;
    readonly RG16UI: GLenum;
    readonly RG32F: GLenum;
    readonly RG32I: GLenum;
    readonly RG32UI: GLenum;
    readonly RG8: GLenum;
    readonly RG8I: GLenum;
    readonly RG8UI: GLenum;
    readonly RG8_SNORM: GLenum;
    readonly RGB10_A2: GLenum;
    readonly RGB10_A2UI: GLenum;
    readonly RGB16F: GLenum;
    readonly RGB16I: GLenum;
    readonly RGB16UI: GLenum;
    readonly RGB32F: GLenum;
    readonly RGB32I: GLenum;
    readonly RGB32UI: GLenum;
    readonly RGB8: GLenum;
    readonly RGB8I: GLenum;
    readonly RGB8UI: GLenum;
    readonly RGB8_SNORM: GLenum;
    readonly RGB9_E5: GLenum;
    readonly RGBA16F: GLenum;
    readonly RGBA16I: GLenum;
    readonly RGBA16UI: GLenum;
    readonly RGBA32F: GLenum;
    readonly RGBA32I: GLenum;
    readonly RGBA32UI: GLenum;
    readonly RGBA8: GLenum;
    readonly RGBA8I: GLenum;
    readonly RGBA8UI: GLenum;
    readonly RGBA8_SNORM: GLenum;
    readonly RGBA_INTEGER: GLenum;
    readonly RGB_INTEGER: GLenum;
    readonly RG_INTEGER: GLenum;
    readonly SAMPLER_2D_ARRAY: GLenum;
    readonly SAMPLER_2D_ARRAY_SHADOW: GLenum;
    readonly SAMPLER_2D_SHADOW: GLenum;
    readonly SAMPLER_3D: GLenum;
    readonly SAMPLER_BINDING: GLenum;
    readonly SAMPLER_CUBE_SHADOW: GLenum;
    readonly SEPARATE_ATTRIBS: GLenum;
    readonly SIGNALED: GLenum;
    readonly SIGNED_NORMALIZED: GLenum;
    readonly SRGB: GLenum;
    readonly SRGB8: GLenum;
    readonly SRGB8_ALPHA8: GLenum;
    readonly STATIC_COPY: GLenum;
    readonly STATIC_READ: GLenum;
    readonly STENCIL: GLenum;
    readonly STREAM_COPY: GLenum;
    readonly STREAM_READ: GLenum;
    readonly SYNC_CONDITION: GLenum;
    readonly SYNC_FENCE: GLenum;
    readonly SYNC_FLAGS: GLenum;
    readonly SYNC_FLUSH_COMMANDS_BIT: GLenum;
    readonly SYNC_GPU_COMMANDS_COMPLETE: GLenum;
    readonly SYNC_STATUS: GLenum;
    readonly TEXTURE_2D_ARRAY: GLenum;
    readonly TEXTURE_3D: GLenum;
    readonly TEXTURE_BASE_LEVEL: GLenum;
    readonly TEXTURE_BINDING_2D_ARRAY: GLenum;
    readonly TEXTURE_BINDING_3D: GLenum;
    readonly TEXTURE_COMPARE_FUNC: GLenum;
    readonly TEXTURE_COMPARE_MODE: GLenum;
    readonly TEXTURE_IMMUTABLE_FORMAT: GLenum;
    readonly TEXTURE_IMMUTABLE_LEVELS: GLenum;
    readonly TEXTURE_MAX_LEVEL: GLenum;
    readonly TEXTURE_MAX_LOD: GLenum;
    readonly TEXTURE_MIN_LOD: GLenum;
    readonly TEXTURE_WRAP_R: GLenum;
    readonly TIMEOUT_EXPIRED: GLenum;
    readonly TIMEOUT_IGNORED: GLint64;
    readonly TRANSFORM_FEEDBACK: GLenum;
    readonly TRANSFORM_FEEDBACK_ACTIVE: GLenum;
    readonly TRANSFORM_FEEDBACK_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_START: GLenum;
    readonly TRANSFORM_FEEDBACK_PAUSED: GLenum;
    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: GLenum;
    readonly TRANSFORM_FEEDBACK_VARYINGS: GLenum;
    readonly UNIFORM_ARRAY_STRIDE: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: GLenum;
    readonly UNIFORM_BLOCK_BINDING: GLenum;
    readonly UNIFORM_BLOCK_DATA_SIZE: GLenum;
    readonly UNIFORM_BLOCK_INDEX: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: GLenum;
    readonly UNIFORM_BUFFER: GLenum;
    readonly UNIFORM_BUFFER_BINDING: GLenum;
    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: GLenum;
    readonly UNIFORM_BUFFER_SIZE: GLenum;
    readonly UNIFORM_BUFFER_START: GLenum;
    readonly UNIFORM_IS_ROW_MAJOR: GLenum;
    readonly UNIFORM_MATRIX_STRIDE: GLenum;
    readonly UNIFORM_OFFSET: GLenum;
    readonly UNIFORM_SIZE: GLenum;
    readonly UNIFORM_TYPE: GLenum;
    readonly UNPACK_IMAGE_HEIGHT: GLenum;
    readonly UNPACK_ROW_LENGTH: GLenum;
    readonly UNPACK_SKIP_IMAGES: GLenum;
    readonly UNPACK_SKIP_PIXELS: GLenum;
    readonly UNPACK_SKIP_ROWS: GLenum;
    readonly UNSIGNALED: GLenum;
    readonly UNSIGNED_INT_10F_11F_11F_REV: GLenum;
    readonly UNSIGNED_INT_24_8: GLenum;
    readonly UNSIGNED_INT_2_10_10_10_REV: GLenum;
    readonly UNSIGNED_INT_5_9_9_9_REV: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: GLenum;
    readonly UNSIGNED_INT_SAMPLER_3D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_CUBE: GLenum;
    readonly UNSIGNED_INT_VEC2: GLenum;
    readonly UNSIGNED_INT_VEC3: GLenum;
    readonly UNSIGNED_INT_VEC4: GLenum;
    readonly UNSIGNED_NORMALIZED: GLenum;
    readonly VERTEX_ARRAY_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_INTEGER: GLenum;
    readonly WAIT_FAILED: GLenum;
}

interface WebGL2RenderingContextOverloads {
    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
    bufferData(target: GLenum, srcData: BufferSource | null, usage: GLenum): void;
    bufferData(target: GLenum, srcData: ArrayBufferView, usage: GLenum, srcOffset: GLuint, length?: GLuint): void;
    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: BufferSource): void;
    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: ArrayBufferView, srcOffset: GLuint, length?: GLuint): void;
    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView | null): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, offset: GLintptr): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView, dstOffset: GLuint): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
    uniform1fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform1iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform2fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform2iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform3fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform3iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform4fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform4iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
}

/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getActiveAttrib() and WebGLRenderingContext.getActiveUniform() methods. */
interface WebGLActiveInfo {
    readonly name: string;
    readonly size: GLint;
    readonly type: GLenum;
}

declare var WebGLActiveInfo: {
    prototype: WebGLActiveInfo;
    new(): WebGLActiveInfo;
};

/** Part of the WebGL API and represents an opaque buffer object storing data such as vertices or colors. */
interface WebGLBuffer {
}

declare var WebGLBuffer: {
    prototype: WebGLBuffer;
    new(): WebGLBuffer;
};

/** The WebContextEvent interface is part of the WebGL API and is an interface for an event that is generated in response to a status change to the WebGL rendering context. */
interface WebGLContextEvent extends Event {
    readonly statusMessage: string;
}

declare var WebGLContextEvent: {
    prototype: WebGLContextEvent;
    new(type: string, eventInit?: WebGLContextEventInit): WebGLContextEvent;
};

/** Part of the WebGL API and represents a collection of buffers that serve as a rendering destination. */
interface WebGLFramebuffer {
}

declare var WebGLFramebuffer: {
    prototype: WebGLFramebuffer;
    new(): WebGLFramebuffer;
};

/** The WebGLProgram is part of the WebGL API and is a combination of two compiled WebGLShaders consisting of a vertex shader and a fragment shader (both written in GLSL). */
interface WebGLProgram {
}

declare var WebGLProgram: {
    prototype: WebGLProgram;
    new(): WebGLProgram;
};

interface WebGLQuery {
}

declare var WebGLQuery: {
    prototype: WebGLQuery;
    new(): WebGLQuery;
};

/** Part of the WebGL API and represents a buffer that can contain an image, or can be source or target of an rendering operation. */
interface WebGLRenderbuffer {
}

declare var WebGLRenderbuffer: {
    prototype: WebGLRenderbuffer;
    new(): WebGLRenderbuffer;
};

/** Provides an interface to the OpenGL ES 2.0 graphics rendering context for the drawing surface of an HTML <canvas> element. */
interface WebGLRenderingContext extends WebGLRenderingContextBase, WebGLRenderingContextOverloads {
}

declare var WebGLRenderingContext: {
    prototype: WebGLRenderingContext;
    new(): WebGLRenderingContext;
    readonly ACTIVE_ATTRIBUTES: GLenum;
    readonly ACTIVE_TEXTURE: GLenum;
    readonly ACTIVE_UNIFORMS: GLenum;
    readonly ALIASED_LINE_WIDTH_RANGE: GLenum;
    readonly ALIASED_POINT_SIZE_RANGE: GLenum;
    readonly ALPHA: GLenum;
    readonly ALPHA_BITS: GLenum;
    readonly ALWAYS: GLenum;
    readonly ARRAY_BUFFER: GLenum;
    readonly ARRAY_BUFFER_BINDING: GLenum;
    readonly ATTACHED_SHADERS: GLenum;
    readonly BACK: GLenum;
    readonly BLEND: GLenum;
    readonly BLEND_COLOR: GLenum;
    readonly BLEND_DST_ALPHA: GLenum;
    readonly BLEND_DST_RGB: GLenum;
    readonly BLEND_EQUATION: GLenum;
    readonly BLEND_EQUATION_ALPHA: GLenum;
    readonly BLEND_EQUATION_RGB: GLenum;
    readonly BLEND_SRC_ALPHA: GLenum;
    readonly BLEND_SRC_RGB: GLenum;
    readonly BLUE_BITS: GLenum;
    readonly BOOL: GLenum;
    readonly BOOL_VEC2: GLenum;
    readonly BOOL_VEC3: GLenum;
    readonly BOOL_VEC4: GLenum;
    readonly BROWSER_DEFAULT_WEBGL: GLenum;
    readonly BUFFER_SIZE: GLenum;
    readonly BUFFER_USAGE: GLenum;
    readonly BYTE: GLenum;
    readonly CCW: GLenum;
    readonly CLAMP_TO_EDGE: GLenum;
    readonly COLOR_ATTACHMENT0: GLenum;
    readonly COLOR_BUFFER_BIT: GLenum;
    readonly COLOR_CLEAR_VALUE: GLenum;
    readonly COLOR_WRITEMASK: GLenum;
    readonly COMPILE_STATUS: GLenum;
    readonly COMPRESSED_TEXTURE_FORMATS: GLenum;
    readonly CONSTANT_ALPHA: GLenum;
    readonly CONSTANT_COLOR: GLenum;
    readonly CONTEXT_LOST_WEBGL: GLenum;
    readonly CULL_FACE: GLenum;
    readonly CULL_FACE_MODE: GLenum;
    readonly CURRENT_PROGRAM: GLenum;
    readonly CURRENT_VERTEX_ATTRIB: GLenum;
    readonly CW: GLenum;
    readonly DECR: GLenum;
    readonly DECR_WRAP: GLenum;
    readonly DELETE_STATUS: GLenum;
    readonly DEPTH_ATTACHMENT: GLenum;
    readonly DEPTH_BITS: GLenum;
    readonly DEPTH_BUFFER_BIT: GLenum;
    readonly DEPTH_CLEAR_VALUE: GLenum;
    readonly DEPTH_COMPONENT: GLenum;
    readonly DEPTH_COMPONENT16: GLenum;
    readonly DEPTH_FUNC: GLenum;
    readonly DEPTH_RANGE: GLenum;
    readonly DEPTH_STENCIL: GLenum;
    readonly DEPTH_STENCIL_ATTACHMENT: GLenum;
    readonly DEPTH_TEST: GLenum;
    readonly DEPTH_WRITEMASK: GLenum;
    readonly DITHER: GLenum;
    readonly DONT_CARE: GLenum;
    readonly DST_ALPHA: GLenum;
    readonly DST_COLOR: GLenum;
    readonly DYNAMIC_DRAW: GLenum;
    readonly ELEMENT_ARRAY_BUFFER: GLenum;
    readonly ELEMENT_ARRAY_BUFFER_BINDING: GLenum;
    readonly EQUAL: GLenum;
    readonly FASTEST: GLenum;
    readonly FLOAT: GLenum;
    readonly FLOAT_MAT2: GLenum;
    readonly FLOAT_MAT3: GLenum;
    readonly FLOAT_MAT4: GLenum;
    readonly FLOAT_VEC2: GLenum;
    readonly FLOAT_VEC3: GLenum;
    readonly FLOAT_VEC4: GLenum;
    readonly FRAGMENT_SHADER: GLenum;
    readonly FRAMEBUFFER: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum;
    readonly FRAMEBUFFER_BINDING: GLenum;
    readonly FRAMEBUFFER_COMPLETE: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_UNSUPPORTED: GLenum;
    readonly FRONT: GLenum;
    readonly FRONT_AND_BACK: GLenum;
    readonly FRONT_FACE: GLenum;
    readonly FUNC_ADD: GLenum;
    readonly FUNC_REVERSE_SUBTRACT: GLenum;
    readonly FUNC_SUBTRACT: GLenum;
    readonly GENERATE_MIPMAP_HINT: GLenum;
    readonly GEQUAL: GLenum;
    readonly GREATER: GLenum;
    readonly GREEN_BITS: GLenum;
    readonly HIGH_FLOAT: GLenum;
    readonly HIGH_INT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_FORMAT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_TYPE: GLenum;
    readonly INCR: GLenum;
    readonly INCR_WRAP: GLenum;
    readonly INT: GLenum;
    readonly INT_VEC2: GLenum;
    readonly INT_VEC3: GLenum;
    readonly INT_VEC4: GLenum;
    readonly INVALID_ENUM: GLenum;
    readonly INVALID_FRAMEBUFFER_OPERATION: GLenum;
    readonly INVALID_OPERATION: GLenum;
    readonly INVALID_VALUE: GLenum;
    readonly INVERT: GLenum;
    readonly KEEP: GLenum;
    readonly LEQUAL: GLenum;
    readonly LESS: GLenum;
    readonly LINEAR: GLenum;
    readonly LINEAR_MIPMAP_LINEAR: GLenum;
    readonly LINEAR_MIPMAP_NEAREST: GLenum;
    readonly LINES: GLenum;
    readonly LINE_LOOP: GLenum;
    readonly LINE_STRIP: GLenum;
    readonly LINE_WIDTH: GLenum;
    readonly LINK_STATUS: GLenum;
    readonly LOW_FLOAT: GLenum;
    readonly LOW_INT: GLenum;
    readonly LUMINANCE: GLenum;
    readonly LUMINANCE_ALPHA: GLenum;
    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_CUBE_MAP_TEXTURE_SIZE: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_VECTORS: GLenum;
    readonly MAX_RENDERBUFFER_SIZE: GLenum;
    readonly MAX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_TEXTURE_SIZE: GLenum;
    readonly MAX_VARYING_VECTORS: GLenum;
    readonly MAX_VERTEX_ATTRIBS: GLenum;
    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_VERTEX_UNIFORM_VECTORS: GLenum;
    readonly MAX_VIEWPORT_DIMS: GLenum;
    readonly MEDIUM_FLOAT: GLenum;
    readonly MEDIUM_INT: GLenum;
    readonly MIRRORED_REPEAT: GLenum;
    readonly NEAREST: GLenum;
    readonly NEAREST_MIPMAP_LINEAR: GLenum;
    readonly NEAREST_MIPMAP_NEAREST: GLenum;
    readonly NEVER: GLenum;
    readonly NICEST: GLenum;
    readonly NONE: GLenum;
    readonly NOTEQUAL: GLenum;
    readonly NO_ERROR: GLenum;
    readonly ONE: GLenum;
    readonly ONE_MINUS_CONSTANT_ALPHA: GLenum;
    readonly ONE_MINUS_CONSTANT_COLOR: GLenum;
    readonly ONE_MINUS_DST_ALPHA: GLenum;
    readonly ONE_MINUS_DST_COLOR: GLenum;
    readonly ONE_MINUS_SRC_ALPHA: GLenum;
    readonly ONE_MINUS_SRC_COLOR: GLenum;
    readonly OUT_OF_MEMORY: GLenum;
    readonly PACK_ALIGNMENT: GLenum;
    readonly POINTS: GLenum;
    readonly POLYGON_OFFSET_FACTOR: GLenum;
    readonly POLYGON_OFFSET_FILL: GLenum;
    readonly POLYGON_OFFSET_UNITS: GLenum;
    readonly RED_BITS: GLenum;
    readonly RENDERBUFFER: GLenum;
    readonly RENDERBUFFER_ALPHA_SIZE: GLenum;
    readonly RENDERBUFFER_BINDING: GLenum;
    readonly RENDERBUFFER_BLUE_SIZE: GLenum;
    readonly RENDERBUFFER_DEPTH_SIZE: GLenum;
    readonly RENDERBUFFER_GREEN_SIZE: GLenum;
    readonly RENDERBUFFER_HEIGHT: GLenum;
    readonly RENDERBUFFER_INTERNAL_FORMAT: GLenum;
    readonly RENDERBUFFER_RED_SIZE: GLenum;
    readonly RENDERBUFFER_STENCIL_SIZE: GLenum;
    readonly RENDERBUFFER_WIDTH: GLenum;
    readonly RENDERER: GLenum;
    readonly REPEAT: GLenum;
    readonly REPLACE: GLenum;
    readonly RGB: GLenum;
    readonly RGB565: GLenum;
    readonly RGB5_A1: GLenum;
    readonly RGBA: GLenum;
    readonly RGBA4: GLenum;
    readonly SAMPLER_2D: GLenum;
    readonly SAMPLER_CUBE: GLenum;
    readonly SAMPLES: GLenum;
    readonly SAMPLE_ALPHA_TO_COVERAGE: GLenum;
    readonly SAMPLE_BUFFERS: GLenum;
    readonly SAMPLE_COVERAGE: GLenum;
    readonly SAMPLE_COVERAGE_INVERT: GLenum;
    readonly SAMPLE_COVERAGE_VALUE: GLenum;
    readonly SCISSOR_BOX: GLenum;
    readonly SCISSOR_TEST: GLenum;
    readonly SHADER_TYPE: GLenum;
    readonly SHADING_LANGUAGE_VERSION: GLenum;
    readonly SHORT: GLenum;
    readonly SRC_ALPHA: GLenum;
    readonly SRC_ALPHA_SATURATE: GLenum;
    readonly SRC_COLOR: GLenum;
    readonly STATIC_DRAW: GLenum;
    readonly STENCIL_ATTACHMENT: GLenum;
    readonly STENCIL_BACK_FAIL: GLenum;
    readonly STENCIL_BACK_FUNC: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_BACK_REF: GLenum;
    readonly STENCIL_BACK_VALUE_MASK: GLenum;
    readonly STENCIL_BACK_WRITEMASK: GLenum;
    readonly STENCIL_BITS: GLenum;
    readonly STENCIL_BUFFER_BIT: GLenum;
    readonly STENCIL_CLEAR_VALUE: GLenum;
    readonly STENCIL_FAIL: GLenum;
    readonly STENCIL_FUNC: GLenum;
    readonly STENCIL_INDEX8: GLenum;
    readonly STENCIL_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_REF: GLenum;
    readonly STENCIL_TEST: GLenum;
    readonly STENCIL_VALUE_MASK: GLenum;
    readonly STENCIL_WRITEMASK: GLenum;
    readonly STREAM_DRAW: GLenum;
    readonly SUBPIXEL_BITS: GLenum;
    readonly TEXTURE: GLenum;
    readonly TEXTURE0: GLenum;
    readonly TEXTURE1: GLenum;
    readonly TEXTURE10: GLenum;
    readonly TEXTURE11: GLenum;
    readonly TEXTURE12: GLenum;
    readonly TEXTURE13: GLenum;
    readonly TEXTURE14: GLenum;
    readonly TEXTURE15: GLenum;
    readonly TEXTURE16: GLenum;
    readonly TEXTURE17: GLenum;
    readonly TEXTURE18: GLenum;
    readonly TEXTURE19: GLenum;
    readonly TEXTURE2: GLenum;
    readonly TEXTURE20: GLenum;
    readonly TEXTURE21: GLenum;
    readonly TEXTURE22: GLenum;
    readonly TEXTURE23: GLenum;
    readonly TEXTURE24: GLenum;
    readonly TEXTURE25: GLenum;
    readonly TEXTURE26: GLenum;
    readonly TEXTURE27: GLenum;
    readonly TEXTURE28: GLenum;
    readonly TEXTURE29: GLenum;
    readonly TEXTURE3: GLenum;
    readonly TEXTURE30: GLenum;
    readonly TEXTURE31: GLenum;
    readonly TEXTURE4: GLenum;
    readonly TEXTURE5: GLenum;
    readonly TEXTURE6: GLenum;
    readonly TEXTURE7: GLenum;
    readonly TEXTURE8: GLenum;
    readonly TEXTURE9: GLenum;
    readonly TEXTURE_2D: GLenum;
    readonly TEXTURE_BINDING_2D: GLenum;
    readonly TEXTURE_BINDING_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum;
    readonly TEXTURE_MAG_FILTER: GLenum;
    readonly TEXTURE_MIN_FILTER: GLenum;
    readonly TEXTURE_WRAP_S: GLenum;
    readonly TEXTURE_WRAP_T: GLenum;
    readonly TRIANGLES: GLenum;
    readonly TRIANGLE_FAN: GLenum;
    readonly TRIANGLE_STRIP: GLenum;
    readonly UNPACK_ALIGNMENT: GLenum;
    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: GLenum;
    readonly UNPACK_FLIP_Y_WEBGL: GLenum;
    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: GLenum;
    readonly UNSIGNED_BYTE: GLenum;
    readonly UNSIGNED_INT: GLenum;
    readonly UNSIGNED_SHORT: GLenum;
    readonly UNSIGNED_SHORT_4_4_4_4: GLenum;
    readonly UNSIGNED_SHORT_5_5_5_1: GLenum;
    readonly UNSIGNED_SHORT_5_6_5: GLenum;
    readonly VALIDATE_STATUS: GLenum;
    readonly VENDOR: GLenum;
    readonly VERSION: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_ENABLED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_POINTER: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_SIZE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_STRIDE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_TYPE: GLenum;
    readonly VERTEX_SHADER: GLenum;
    readonly VIEWPORT: GLenum;
    readonly ZERO: GLenum;
};

interface WebGLRenderingContextBase {
    readonly canvas: HTMLCanvasElement;
    readonly drawingBufferHeight: GLsizei;
    readonly drawingBufferWidth: GLsizei;
    activeTexture(texture: GLenum): void;
    attachShader(program: WebGLProgram, shader: WebGLShader): void;
    bindAttribLocation(program: WebGLProgram, index: GLuint, name: string): void;
    bindBuffer(target: GLenum, buffer: WebGLBuffer | null): void;
    bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer | null): void;
    bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
    bindTexture(target: GLenum, texture: WebGLTexture | null): void;
    blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
    blendEquation(mode: GLenum): void;
    blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum): void;
    blendFunc(sfactor: GLenum, dfactor: GLenum): void;
    blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum): void;
    checkFramebufferStatus(target: GLenum): GLenum;
    clear(mask: GLbitfield): void;
    clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
    clearDepth(depth: GLclampf): void;
    clearStencil(s: GLint): void;
    colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean): void;
    compileShader(shader: WebGLShader): void;
    copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint): void;
    copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    createBuffer(): WebGLBuffer | null;
    createFramebuffer(): WebGLFramebuffer | null;
    createProgram(): WebGLProgram | null;
    createRenderbuffer(): WebGLRenderbuffer | null;
    createShader(type: GLenum): WebGLShader | null;
    createTexture(): WebGLTexture | null;
    cullFace(mode: GLenum): void;
    deleteBuffer(buffer: WebGLBuffer | null): void;
    deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void;
    deleteProgram(program: WebGLProgram | null): void;
    deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void;
    deleteShader(shader: WebGLShader | null): void;
    deleteTexture(texture: WebGLTexture | null): void;
    depthFunc(func: GLenum): void;
    depthMask(flag: GLboolean): void;
    depthRange(zNear: GLclampf, zFar: GLclampf): void;
    detachShader(program: WebGLProgram, shader: WebGLShader): void;
    disable(cap: GLenum): void;
    disableVertexAttribArray(index: GLuint): void;
    drawArrays(mode: GLenum, first: GLint, count: GLsizei): void;
    drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr): void;
    enable(cap: GLenum): void;
    enableVertexAttribArray(index: GLuint): void;
    finish(): void;
    flush(): void;
    framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
    framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture | null, level: GLint): void;
    frontFace(mode: GLenum): void;
    generateMipmap(target: GLenum): void;
    getActiveAttrib(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
    getActiveUniform(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
    getAttachedShaders(program: WebGLProgram): WebGLShader[] | null;
    getAttribLocation(program: WebGLProgram, name: string): GLint;
    getBufferParameter(target: GLenum, pname: GLenum): any;
    getContextAttributes(): WebGLContextAttributes | null;
    getError(): GLenum;
    getExtension(extensionName: "EXT_blend_minmax"): EXT_blend_minmax | null;
    getExtension(extensionName: "EXT_color_buffer_float"): EXT_color_buffer_float | null;
    getExtension(extensionName: "EXT_color_buffer_half_float"): EXT_color_buffer_half_float | null;
    getExtension(extensionName: "EXT_float_blend"): EXT_float_blend | null;
    getExtension(extensionName: "EXT_texture_filter_anisotropic"): EXT_texture_filter_anisotropic | null;
    getExtension(extensionName: "EXT_frag_depth"): EXT_frag_depth | null;
    getExtension(extensionName: "EXT_shader_texture_lod"): EXT_shader_texture_lod | null;
    getExtension(extensionName: "EXT_sRGB"): EXT_sRGB | null;
    getExtension(extensionName: "KHR_parallel_shader_compile"): KHR_parallel_shader_compile | null;
    getExtension(extensionName: "OES_vertex_array_object"): OES_vertex_array_object | null;
    getExtension(extensionName: "OVR_multiview2"): OVR_multiview2 | null;
    getExtension(extensionName: "WEBGL_color_buffer_float"): WEBGL_color_buffer_float | null;
    getExtension(extensionName: "WEBGL_compressed_texture_astc"): WEBGL_compressed_texture_astc | null;
    getExtension(extensionName: "WEBGL_compressed_texture_etc"): WEBGL_compressed_texture_etc | null;
    getExtension(extensionName: "WEBGL_compressed_texture_etc1"): WEBGL_compressed_texture_etc1 | null;
    getExtension(extensionName: "WEBGL_compressed_texture_pvrtc"): WEBGL_compressed_texture_pvrtc | null;
    getExtension(extensionName: "WEBGL_compressed_texture_s3tc_srgb"): WEBGL_compressed_texture_s3tc_srgb | null;
    getExtension(extensionName: "WEBGL_debug_shaders"): WEBGL_debug_shaders | null;
    getExtension(extensionName: "WEBGL_draw_buffers"): WEBGL_draw_buffers | null;
    getExtension(extensionName: "WEBGL_lose_context"): WEBGL_lose_context | null;
    getExtension(extensionName: "WEBGL_depth_texture"): WEBGL_depth_texture | null;
    getExtension(extensionName: "WEBGL_debug_renderer_info"): WEBGL_debug_renderer_info | null;
    getExtension(extensionName: "WEBGL_compressed_texture_s3tc"): WEBGL_compressed_texture_s3tc | null;
    getExtension(extensionName: "OES_texture_half_float_linear"): OES_texture_half_float_linear | null;
    getExtension(extensionName: "OES_texture_half_float"): OES_texture_half_float | null;
    getExtension(extensionName: "OES_texture_float_linear"): OES_texture_float_linear | null;
    getExtension(extensionName: "OES_texture_float"): OES_texture_float | null;
    getExtension(extensionName: "OES_standard_derivatives"): OES_standard_derivatives | null;
    getExtension(extensionName: "OES_element_index_uint"): OES_element_index_uint | null;
    getExtension(extensionName: "ANGLE_instanced_arrays"): ANGLE_instanced_arrays | null;
    getExtension(name: string): any;
    getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum): any;
    getParameter(pname: GLenum): any;
    getProgramInfoLog(program: WebGLProgram): string | null;
    getProgramParameter(program: WebGLProgram, pname: GLenum): any;
    getRenderbufferParameter(target: GLenum, pname: GLenum): any;
    getShaderInfoLog(shader: WebGLShader): string | null;
    getShaderParameter(shader: WebGLShader, pname: GLenum): any;
    getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum): WebGLShaderPrecisionFormat | null;
    getShaderSource(shader: WebGLShader): string | null;
    getSupportedExtensions(): string[] | null;
    getTexParameter(target: GLenum, pname: GLenum): any;
    getUniform(program: WebGLProgram, location: WebGLUniformLocation): any;
    getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation | null;
    getVertexAttrib(index: GLuint, pname: GLenum): any;
    getVertexAttribOffset(index: GLuint, pname: GLenum): GLintptr;
    hint(target: GLenum, mode: GLenum): void;
    isBuffer(buffer: WebGLBuffer | null): GLboolean;
    isContextLost(): boolean;
    isEnabled(cap: GLenum): GLboolean;
    isFramebuffer(framebuffer: WebGLFramebuffer | null): GLboolean;
    isProgram(program: WebGLProgram | null): GLboolean;
    isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): GLboolean;
    isShader(shader: WebGLShader | null): GLboolean;
    isTexture(texture: WebGLTexture | null): GLboolean;
    lineWidth(width: GLfloat): void;
    linkProgram(program: WebGLProgram): void;
    pixelStorei(pname: GLenum, param: GLint | GLboolean): void;
    polygonOffset(factor: GLfloat, units: GLfloat): void;
    renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
    sampleCoverage(value: GLclampf, invert: GLboolean): void;
    scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    shaderSource(shader: WebGLShader, source: string): void;
    stencilFunc(func: GLenum, ref: GLint, mask: GLuint): void;
    stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint): void;
    stencilMask(mask: GLuint): void;
    stencilMaskSeparate(face: GLenum, mask: GLuint): void;
    stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum): void;
    stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum): void;
    texParameterf(target: GLenum, pname: GLenum, param: GLfloat): void;
    texParameteri(target: GLenum, pname: GLenum, param: GLint): void;
    uniform1f(location: WebGLUniformLocation | null, x: GLfloat): void;
    uniform1i(location: WebGLUniformLocation | null, x: GLint): void;
    uniform2f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat): void;
    uniform2i(location: WebGLUniformLocation | null, x: GLint, y: GLint): void;
    uniform3f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat): void;
    uniform3i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint): void;
    uniform4f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
    uniform4i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint, w: GLint): void;
    useProgram(program: WebGLProgram | null): void;
    validateProgram(program: WebGLProgram): void;
    vertexAttrib1f(index: GLuint, x: GLfloat): void;
    vertexAttrib1fv(index: GLuint, values: Float32List): void;
    vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat): void;
    vertexAttrib2fv(index: GLuint, values: Float32List): void;
    vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat): void;
    vertexAttrib3fv(index: GLuint, values: Float32List): void;
    vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
    vertexAttrib4fv(index: GLuint, values: Float32List): void;
    vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr): void;
    viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    readonly ACTIVE_ATTRIBUTES: GLenum;
    readonly ACTIVE_TEXTURE: GLenum;
    readonly ACTIVE_UNIFORMS: GLenum;
    readonly ALIASED_LINE_WIDTH_RANGE: GLenum;
    readonly ALIASED_POINT_SIZE_RANGE: GLenum;
    readonly ALPHA: GLenum;
    readonly ALPHA_BITS: GLenum;
    readonly ALWAYS: GLenum;
    readonly ARRAY_BUFFER: GLenum;
    readonly ARRAY_BUFFER_BINDING: GLenum;
    readonly ATTACHED_SHADERS: GLenum;
    readonly BACK: GLenum;
    readonly BLEND: GLenum;
    readonly BLEND_COLOR: GLenum;
    readonly BLEND_DST_ALPHA: GLenum;
    readonly BLEND_DST_RGB: GLenum;
    readonly BLEND_EQUATION: GLenum;
    readonly BLEND_EQUATION_ALPHA: GLenum;
    readonly BLEND_EQUATION_RGB: GLenum;
    readonly BLEND_SRC_ALPHA: GLenum;
    readonly BLEND_SRC_RGB: GLenum;
    readonly BLUE_BITS: GLenum;
    readonly BOOL: GLenum;
    readonly BOOL_VEC2: GLenum;
    readonly BOOL_VEC3: GLenum;
    readonly BOOL_VEC4: GLenum;
    readonly BROWSER_DEFAULT_WEBGL: GLenum;
    readonly BUFFER_SIZE: GLenum;
    readonly BUFFER_USAGE: GLenum;
    readonly BYTE: GLenum;
    readonly CCW: GLenum;
    readonly CLAMP_TO_EDGE: GLenum;
    readonly COLOR_ATTACHMENT0: GLenum;
    readonly COLOR_BUFFER_BIT: GLenum;
    readonly COLOR_CLEAR_VALUE: GLenum;
    readonly COLOR_WRITEMASK: GLenum;
    readonly COMPILE_STATUS: GLenum;
    readonly COMPRESSED_TEXTURE_FORMATS: GLenum;
    readonly CONSTANT_ALPHA: GLenum;
    readonly CONSTANT_COLOR: GLenum;
    readonly CONTEXT_LOST_WEBGL: GLenum;
    readonly CULL_FACE: GLenum;
    readonly CULL_FACE_MODE: GLenum;
    readonly CURRENT_PROGRAM: GLenum;
    readonly CURRENT_VERTEX_ATTRIB: GLenum;
    readonly CW: GLenum;
    readonly DECR: GLenum;
    readonly DECR_WRAP: GLenum;
    readonly DELETE_STATUS: GLenum;
    readonly DEPTH_ATTACHMENT: GLenum;
    readonly DEPTH_BITS: GLenum;
    readonly DEPTH_BUFFER_BIT: GLenum;
    readonly DEPTH_CLEAR_VALUE: GLenum;
    readonly DEPTH_COMPONENT: GLenum;
    readonly DEPTH_COMPONENT16: GLenum;
    readonly DEPTH_FUNC: GLenum;
    readonly DEPTH_RANGE: GLenum;
    readonly DEPTH_STENCIL: GLenum;
    readonly DEPTH_STENCIL_ATTACHMENT: GLenum;
    readonly DEPTH_TEST: GLenum;
    readonly DEPTH_WRITEMASK: GLenum;
    readonly DITHER: GLenum;
    readonly DONT_CARE: GLenum;
    readonly DST_ALPHA: GLenum;
    readonly DST_COLOR: GLenum;
    readonly DYNAMIC_DRAW: GLenum;
    readonly ELEMENT_ARRAY_BUFFER: GLenum;
    readonly ELEMENT_ARRAY_BUFFER_BINDING: GLenum;
    readonly EQUAL: GLenum;
    readonly FASTEST: GLenum;
    readonly FLOAT: GLenum;
    readonly FLOAT_MAT2: GLenum;
    readonly FLOAT_MAT3: GLenum;
    readonly FLOAT_MAT4: GLenum;
    readonly FLOAT_VEC2: GLenum;
    readonly FLOAT_VEC3: GLenum;
    readonly FLOAT_VEC4: GLenum;
    readonly FRAGMENT_SHADER: GLenum;
    readonly FRAMEBUFFER: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum;
    readonly FRAMEBUFFER_BINDING: GLenum;
    readonly FRAMEBUFFER_COMPLETE: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_UNSUPPORTED: GLenum;
    readonly FRONT: GLenum;
    readonly FRONT_AND_BACK: GLenum;
    readonly FRONT_FACE: GLenum;
    readonly FUNC_ADD: GLenum;
    readonly FUNC_REVERSE_SUBTRACT: GLenum;
    readonly FUNC_SUBTRACT: GLenum;
    readonly GENERATE_MIPMAP_HINT: GLenum;
    readonly GEQUAL: GLenum;
    readonly GREATER: GLenum;
    readonly GREEN_BITS: GLenum;
    readonly HIGH_FLOAT: GLenum;
    readonly HIGH_INT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_FORMAT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_TYPE: GLenum;
    readonly INCR: GLenum;
    readonly INCR_WRAP: GLenum;
    readonly INT: GLenum;
    readonly INT_VEC2: GLenum;
    readonly INT_VEC3: GLenum;
    readonly INT_VEC4: GLenum;
    readonly INVALID_ENUM: GLenum;
    readonly INVALID_FRAMEBUFFER_OPERATION: GLenum;
    readonly INVALID_OPERATION: GLenum;
    readonly INVALID_VALUE: GLenum;
    readonly INVERT: GLenum;
    readonly KEEP: GLenum;
    readonly LEQUAL: GLenum;
    readonly LESS: GLenum;
    readonly LINEAR: GLenum;
    readonly LINEAR_MIPMAP_LINEAR: GLenum;
    readonly LINEAR_MIPMAP_NEAREST: GLenum;
    readonly LINES: GLenum;
    readonly LINE_LOOP: GLenum;
    readonly LINE_STRIP: GLenum;
    readonly LINE_WIDTH: GLenum;
    readonly LINK_STATUS: GLenum;
    readonly LOW_FLOAT: GLenum;
    readonly LOW_INT: GLenum;
    readonly LUMINANCE: GLenum;
    readonly LUMINANCE_ALPHA: GLenum;
    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_CUBE_MAP_TEXTURE_SIZE: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_VECTORS: GLenum;
    readonly MAX_RENDERBUFFER_SIZE: GLenum;
    readonly MAX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_TEXTURE_SIZE: GLenum;
    readonly MAX_VARYING_VECTORS: GLenum;
    readonly MAX_VERTEX_ATTRIBS: GLenum;
    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_VERTEX_UNIFORM_VECTORS: GLenum;
    readonly MAX_VIEWPORT_DIMS: GLenum;
    readonly MEDIUM_FLOAT: GLenum;
    readonly MEDIUM_INT: GLenum;
    readonly MIRRORED_REPEAT: GLenum;
    readonly NEAREST: GLenum;
    readonly NEAREST_MIPMAP_LINEAR: GLenum;
    readonly NEAREST_MIPMAP_NEAREST: GLenum;
    readonly NEVER: GLenum;
    readonly NICEST: GLenum;
    readonly NONE: GLenum;
    readonly NOTEQUAL: GLenum;
    readonly NO_ERROR: GLenum;
    readonly ONE: GLenum;
    readonly ONE_MINUS_CONSTANT_ALPHA: GLenum;
    readonly ONE_MINUS_CONSTANT_COLOR: GLenum;
    readonly ONE_MINUS_DST_ALPHA: GLenum;
    readonly ONE_MINUS_DST_COLOR: GLenum;
    readonly ONE_MINUS_SRC_ALPHA: GLenum;
    readonly ONE_MINUS_SRC_COLOR: GLenum;
    readonly OUT_OF_MEMORY: GLenum;
    readonly PACK_ALIGNMENT: GLenum;
    readonly POINTS: GLenum;
    readonly POLYGON_OFFSET_FACTOR: GLenum;
    readonly POLYGON_OFFSET_FILL: GLenum;
    readonly POLYGON_OFFSET_UNITS: GLenum;
    readonly RED_BITS: GLenum;
    readonly RENDERBUFFER: GLenum;
    readonly RENDERBUFFER_ALPHA_SIZE: GLenum;
    readonly RENDERBUFFER_BINDING: GLenum;
    readonly RENDERBUFFER_BLUE_SIZE: GLenum;
    readonly RENDERBUFFER_DEPTH_SIZE: GLenum;
    readonly RENDERBUFFER_GREEN_SIZE: GLenum;
    readonly RENDERBUFFER_HEIGHT: GLenum;
    readonly RENDERBUFFER_INTERNAL_FORMAT: GLenum;
    readonly RENDERBUFFER_RED_SIZE: GLenum;
    readonly RENDERBUFFER_STENCIL_SIZE: GLenum;
    readonly RENDERBUFFER_WIDTH: GLenum;
    readonly RENDERER: GLenum;
    readonly REPEAT: GLenum;
    readonly REPLACE: GLenum;
    readonly RGB: GLenum;
    readonly RGB565: GLenum;
    readonly RGB5_A1: GLenum;
    readonly RGBA: GLenum;
    readonly RGBA4: GLenum;
    readonly SAMPLER_2D: GLenum;
    readonly SAMPLER_CUBE: GLenum;
    readonly SAMPLES: GLenum;
    readonly SAMPLE_ALPHA_TO_COVERAGE: GLenum;
    readonly SAMPLE_BUFFERS: GLenum;
    readonly SAMPLE_COVERAGE: GLenum;
    readonly SAMPLE_COVERAGE_INVERT: GLenum;
    readonly SAMPLE_COVERAGE_VALUE: GLenum;
    readonly SCISSOR_BOX: GLenum;
    readonly SCISSOR_TEST: GLenum;
    readonly SHADER_TYPE: GLenum;
    readonly SHADING_LANGUAGE_VERSION: GLenum;
    readonly SHORT: GLenum;
    readonly SRC_ALPHA: GLenum;
    readonly SRC_ALPHA_SATURATE: GLenum;
    readonly SRC_COLOR: GLenum;
    readonly STATIC_DRAW: GLenum;
    readonly STENCIL_ATTACHMENT: GLenum;
    readonly STENCIL_BACK_FAIL: GLenum;
    readonly STENCIL_BACK_FUNC: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_BACK_REF: GLenum;
    readonly STENCIL_BACK_VALUE_MASK: GLenum;
    readonly STENCIL_BACK_WRITEMASK: GLenum;
    readonly STENCIL_BITS: GLenum;
    readonly STENCIL_BUFFER_BIT: GLenum;
    readonly STENCIL_CLEAR_VALUE: GLenum;
    readonly STENCIL_FAIL: GLenum;
    readonly STENCIL_FUNC: GLenum;
    readonly STENCIL_INDEX8: GLenum;
    readonly STENCIL_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_REF: GLenum;
    readonly STENCIL_TEST: GLenum;
    readonly STENCIL_VALUE_MASK: GLenum;
    readonly STENCIL_WRITEMASK: GLenum;
    readonly STREAM_DRAW: GLenum;
    readonly SUBPIXEL_BITS: GLenum;
    readonly TEXTURE: GLenum;
    readonly TEXTURE0: GLenum;
    readonly TEXTURE1: GLenum;
    readonly TEXTURE10: GLenum;
    readonly TEXTURE11: GLenum;
    readonly TEXTURE12: GLenum;
    readonly TEXTURE13: GLenum;
    readonly TEXTURE14: GLenum;
    readonly TEXTURE15: GLenum;
    readonly TEXTURE16: GLenum;
    readonly TEXTURE17: GLenum;
    readonly TEXTURE18: GLenum;
    readonly TEXTURE19: GLenum;
    readonly TEXTURE2: GLenum;
    readonly TEXTURE20: GLenum;
    readonly TEXTURE21: GLenum;
    readonly TEXTURE22: GLenum;
    readonly TEXTURE23: GLenum;
    readonly TEXTURE24: GLenum;
    readonly TEXTURE25: GLenum;
    readonly TEXTURE26: GLenum;
    readonly TEXTURE27: GLenum;
    readonly TEXTURE28: GLenum;
    readonly TEXTURE29: GLenum;
    readonly TEXTURE3: GLenum;
    readonly TEXTURE30: GLenum;
    readonly TEXTURE31: GLenum;
    readonly TEXTURE4: GLenum;
    readonly TEXTURE5: GLenum;
    readonly TEXTURE6: GLenum;
    readonly TEXTURE7: GLenum;
    readonly TEXTURE8: GLenum;
    readonly TEXTURE9: GLenum;
    readonly TEXTURE_2D: GLenum;
    readonly TEXTURE_BINDING_2D: GLenum;
    readonly TEXTURE_BINDING_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum;
    readonly TEXTURE_MAG_FILTER: GLenum;
    readonly TEXTURE_MIN_FILTER: GLenum;
    readonly TEXTURE_WRAP_S: GLenum;
    readonly TEXTURE_WRAP_T: GLenum;
    readonly TRIANGLES: GLenum;
    readonly TRIANGLE_FAN: GLenum;
    readonly TRIANGLE_STRIP: GLenum;
    readonly UNPACK_ALIGNMENT: GLenum;
    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: GLenum;
    readonly UNPACK_FLIP_Y_WEBGL: GLenum;
    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: GLenum;
    readonly UNSIGNED_BYTE: GLenum;
    readonly UNSIGNED_INT: GLenum;
    readonly UNSIGNED_SHORT: GLenum;
    readonly UNSIGNED_SHORT_4_4_4_4: GLenum;
    readonly UNSIGNED_SHORT_5_5_5_1: GLenum;
    readonly UNSIGNED_SHORT_5_6_5: GLenum;
    readonly VALIDATE_STATUS: GLenum;
    readonly VENDOR: GLenum;
    readonly VERSION: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_ENABLED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_POINTER: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_SIZE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_STRIDE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_TYPE: GLenum;
    readonly VERTEX_SHADER: GLenum;
    readonly VIEWPORT: GLenum;
    readonly ZERO: GLenum;
}

interface WebGLRenderingContextOverloads {
    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
    bufferData(target: GLenum, data: BufferSource | null, usage: GLenum): void;
    bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource): void;
    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView): void;
    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    uniform1fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform1iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniform2fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform2iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniform3fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform3iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniform4fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform4iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
}

interface WebGLSampler {
}

declare var WebGLSampler: {
    prototype: WebGLSampler;
    new(): WebGLSampler;
};

/** The WebGLShader is part of the WebGL API and can either be a vertex or a fragment shader. A WebGLProgram requires both types of shaders. */
interface WebGLShader {
}

declare var WebGLShader: {
    prototype: WebGLShader;
    new(): WebGLShader;
};

/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getShaderPrecisionFormat() method. */
interface WebGLShaderPrecisionFormat {
    readonly precision: GLint;
    readonly rangeMax: GLint;
    readonly rangeMin: GLint;
}

declare var WebGLShaderPrecisionFormat: {
    prototype: WebGLShaderPrecisionFormat;
    new(): WebGLShaderPrecisionFormat;
};

interface WebGLSync {
}

declare var WebGLSync: {
    prototype: WebGLSync;
    new(): WebGLSync;
};

/** Part of the WebGL API and represents an opaque texture object providing storage and state for texturing operations. */
interface WebGLTexture {
}

declare var WebGLTexture: {
    prototype: WebGLTexture;
    new(): WebGLTexture;
};

interface WebGLTransformFeedback {
}

declare var WebGLTransformFeedback: {
    prototype: WebGLTransformFeedback;
    new(): WebGLTransformFeedback;
};

/** Part of the WebGL API and represents the location of a uniform variable in a shader program. */
interface WebGLUniformLocation {
}

declare var WebGLUniformLocation: {
    prototype: WebGLUniformLocation;
    new(): WebGLUniformLocation;
};

interface WebGLVertexArrayObject {
}

declare var WebGLVertexArrayObject: {
    prototype: WebGLVertexArrayObject;
    new(): WebGLVertexArrayObject;
};

interface WebGLVertexArrayObjectOES {
}

interface WebSocketEventMap {
    "close": CloseEvent;
    "error": Event;
    "message": MessageEvent;
    "open": Event;
}

/** Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. */
interface WebSocket extends EventTarget {
    /**
     * Returns a string that indicates how binary data from the WebSocket object is exposed to scripts:
     *
     * Can be set, to change how binary data is returned. The default is "blob".
     */
    binaryType: BinaryType;
    /**
     * Returns the number of bytes of application data (UTF-8 text and binary data) that have been queued using send() but not yet been transmitted to the network.
     *
     * If the WebSocket connection is closed, this attribute's value will only increase with each call to the send() method. (The number does not reset to zero once the connection closes.)
     */
    readonly bufferedAmount: number;
    /** Returns the extensions selected by the server, if any. */
    readonly extensions: string;
    onclose: ((this: WebSocket, ev: CloseEvent) => any) | null;
    onerror: ((this: WebSocket, ev: Event) => any) | null;
    onmessage: ((this: WebSocket, ev: MessageEvent) => any) | null;
    onopen: ((this: WebSocket, ev: Event) => any) | null;
    /** Returns the subprotocol selected by the server, if any. It can be used in conjunction with the array form of the constructor's second argument to perform subprotocol negotiation. */
    readonly protocol: string;
    /** Returns the state of the WebSocket object's connection. It can have the values described below. */
    readonly readyState: number;
    /** Returns the URL that was used to establish the WebSocket connection. */
    readonly url: string;
    /** Closes the WebSocket connection, optionally using code as the the WebSocket connection close code and reason as the the WebSocket connection close reason. */
    close(code?: number, reason?: string): void;
    /** Transmits data using the WebSocket connection. data can be a string, a Blob, an ArrayBuffer, or an ArrayBufferView. */
    send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
    readonly CLOSED: number;
    readonly CLOSING: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
    addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var WebSocket: {
    prototype: WebSocket;
    new(url: string | URL, protocols?: string | string[]): WebSocket;
    readonly CLOSED: number;
    readonly CLOSING: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
};

/** Events that occur due to the user moving a mouse wheel or similar input device. */
interface WheelEvent extends MouseEvent {
    readonly deltaMode: number;
    readonly deltaX: number;
    readonly deltaY: number;
    readonly deltaZ: number;
    readonly DOM_DELTA_LINE: number;
    readonly DOM_DELTA_PAGE: number;
    readonly DOM_DELTA_PIXEL: number;
}

declare var WheelEvent: {
    prototype: WheelEvent;
    new(type: string, eventInitDict?: WheelEventInit): WheelEvent;
    readonly DOM_DELTA_LINE: number;
    readonly DOM_DELTA_PAGE: number;
    readonly DOM_DELTA_PIXEL: number;
};

interface WindowEventMap extends GlobalEventHandlersEventMap, WindowEventHandlersEventMap {
    "devicemotion": DeviceMotionEvent;
    "deviceorientation": DeviceOrientationEvent;
    "gamepadconnected": GamepadEvent;
    "gamepaddisconnected": GamepadEvent;
    "orientationchange": Event;
}

/** A window containing a DOM document; the document property points to the DOM document loaded in that window. */
interface Window extends EventTarget, AnimationFrameProvider, GlobalEventHandlers, WindowEventHandlers, WindowLocalStorage, WindowOrWorkerGlobalScope, WindowSessionStorage {
    /** @deprecated This is a legacy alias of \`navigator\`. */
    readonly clientInformation: Navigator;
    /** Returns true if the window has been closed, false otherwise. */
    readonly closed: boolean;
    /** Defines a new custom element, mapping the given name to the given constructor as an autonomous custom element. */
    readonly customElements: CustomElementRegistry;
    readonly devicePixelRatio: number;
    readonly document: Document;
    /** @deprecated */
    readonly event: Event | undefined;
    /** @deprecated */
    readonly external: External;
    readonly frameElement: Element | null;
    readonly frames: WindowProxy;
    readonly history: History;
    readonly innerHeight: number;
    readonly innerWidth: number;
    readonly length: number;
    get location(): Location;
    set location(href: string | Location);
    /** Returns true if the location bar is visible; otherwise, returns false. */
    readonly locationbar: BarProp;
    /** Returns true if the menu bar is visible; otherwise, returns false. */
    readonly menubar: BarProp;
    name: string;
    readonly navigator: Navigator;
    /** Available only in secure contexts. */
    ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null;
    /** Available only in secure contexts. */
    ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
    /** @deprecated */
    onorientationchange: ((this: Window, ev: Event) => any) | null;
    opener: any;
    /** @deprecated */
    readonly orientation: number;
    readonly outerHeight: number;
    readonly outerWidth: number;
    /** @deprecated This is a legacy alias of \`scrollX\`. */
    readonly pageXOffset: number;
    /** @deprecated This is a legacy alias of \`scrollY\`. */
    readonly pageYOffset: number;
    /**
     * Refers to either the parent WindowProxy, or itself.
     *
     * It can rarely be null e.g. for contentWindow of an iframe that is already removed from the parent.
     */
    readonly parent: WindowProxy;
    /** Returns true if the personal bar is visible; otherwise, returns false. */
    readonly personalbar: BarProp;
    readonly screen: Screen;
    readonly screenLeft: number;
    readonly screenTop: number;
    readonly screenX: number;
    readonly screenY: number;
    readonly scrollX: number;
    readonly scrollY: number;
    /** Returns true if the scrollbars are visible; otherwise, returns false. */
    readonly scrollbars: BarProp;
    readonly self: Window & typeof globalThis;
    readonly speechSynthesis: SpeechSynthesis;
    /** @deprecated */
    status: string;
    /** Returns true if the status bar is visible; otherwise, returns false. */
    readonly statusbar: BarProp;
    /** Returns true if the toolbar is visible; otherwise, returns false. */
    readonly toolbar: BarProp;
    readonly top: WindowProxy | null;
    readonly visualViewport: VisualViewport;
    readonly window: Window & typeof globalThis;
    alert(message?: any): void;
    blur(): void;
    cancelIdleCallback(handle: number): void;
    /** @deprecated */
    captureEvents(): void;
    /** Closes the window. */
    close(): void;
    confirm(message?: string): boolean;
    /** Moves the focus to the window's browsing context, if any. */
    focus(): void;
    getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration;
    getSelection(): Selection | null;
    matchMedia(query: string): MediaQueryList;
    moveBy(x: number, y: number): void;
    moveTo(x: number, y: number): void;
    open(url?: string | URL, target?: string, features?: string): WindowProxy | null;
    /**
     * Posts a message to the given window. Messages can be structured objects, e.g. nested objects and arrays, can contain JavaScript values (strings, numbers, Date objects, etc), and can contain certain data objects such as File Blob, FileList, and ArrayBuffer objects.
     *
     * Objects listed in the transfer member of options are transferred, not just cloned, meaning that they are no longer usable on the sending side.
     *
     * A target origin can be specified using the targetOrigin member of options. If not provided, it defaults to "/". This default restricts the message to same-origin targets only.
     *
     * If the origin of the target window doesn't match the given target origin, the message is discarded, to avoid information leakage. To send the message to the target regardless of origin, set the target origin to "*".
     *
     * Throws a "DataCloneError" DOMException if transfer array contains duplicate objects or if message could not be cloned.
     */
    postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;
    postMessage(message: any, options?: WindowPostMessageOptions): void;
    print(): void;
    prompt(message?: string, _default?: string): string | null;
    /** @deprecated */
    releaseEvents(): void;
    requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number;
    resizeBy(x: number, y: number): void;
    resizeTo(width: number, height: number): void;
    scroll(options?: ScrollToOptions): void;
    scroll(x: number, y: number): void;
    scrollBy(options?: ScrollToOptions): void;
    scrollBy(x: number, y: number): void;
    scrollTo(options?: ScrollToOptions): void;
    scrollTo(x: number, y: number): void;
    /** Cancels the document load. */
    stop(): void;
    addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
    [index: number]: Window;
}

declare var Window: {
    prototype: Window;
    new(): Window;
};

interface WindowEventHandlersEventMap {
    "afterprint": Event;
    "beforeprint": Event;
    "beforeunload": BeforeUnloadEvent;
    "gamepadconnected": GamepadEvent;
    "gamepaddisconnected": GamepadEvent;
    "hashchange": HashChangeEvent;
    "languagechange": Event;
    "message": MessageEvent;
    "messageerror": MessageEvent;
    "offline": Event;
    "online": Event;
    "pagehide": PageTransitionEvent;
    "pageshow": PageTransitionEvent;
    "popstate": PopStateEvent;
    "rejectionhandled": PromiseRejectionEvent;
    "storage": StorageEvent;
    "unhandledrejection": PromiseRejectionEvent;
    "unload": Event;
}

interface WindowEventHandlers {
    onafterprint: ((this: WindowEventHandlers, ev: Event) => any) | null;
    onbeforeprint: ((this: WindowEventHandlers, ev: Event) => any) | null;
    onbeforeunload: ((this: WindowEventHandlers, ev: BeforeUnloadEvent) => any) | null;
    ongamepadconnected: ((this: WindowEventHandlers, ev: GamepadEvent) => any) | null;
    ongamepaddisconnected: ((this: WindowEventHandlers, ev: GamepadEvent) => any) | null;
    onhashchange: ((this: WindowEventHandlers, ev: HashChangeEvent) => any) | null;
    onlanguagechange: ((this: WindowEventHandlers, ev: Event) => any) | null;
    onmessage: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null;
    onoffline: ((this: WindowEventHandlers, ev: Event) => any) | null;
    ononline: ((this: WindowEventHandlers, ev: Event) => any) | null;
    onpagehide: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null;
    onpageshow: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null;
    onpopstate: ((this: WindowEventHandlers, ev: PopStateEvent) => any) | null;
    onrejectionhandled: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null;
    onstorage: ((this: WindowEventHandlers, ev: StorageEvent) => any) | null;
    onunhandledrejection: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null;
    onunload: ((this: WindowEventHandlers, ev: Event) => any) | null;
    addEventListener<K extends keyof WindowEventHandlersEventMap>(type: K, listener: (this: WindowEventHandlers, ev: WindowEventHandlersEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof WindowEventHandlersEventMap>(type: K, listener: (this: WindowEventHandlers, ev: WindowEventHandlersEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

interface WindowLocalStorage {
    readonly localStorage: Storage;
}

interface WindowOrWorkerGlobalScope {
    /** Available only in secure contexts. */
    readonly caches: CacheStorage;
    readonly crossOriginIsolated: boolean;
    readonly crypto: Crypto;
    readonly indexedDB: IDBFactory;
    readonly isSecureContext: boolean;
    readonly origin: string;
    readonly performance: Performance;
    atob(data: string): string;
    btoa(data: string): string;
    clearInterval(handle?: number): void;
    clearTimeout(handle?: number): void;
    createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
    createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
    fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
    queueMicrotask(callback: VoidFunction): void;
    setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
    setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
}

interface WindowSessionStorage {
    readonly sessionStorage: Storage;
}

interface WorkerEventMap extends AbstractWorkerEventMap {
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

/** This Web Workers API interface represents a background task that can be easily created and can send messages back to its creator. Creating a worker is as simple as calling the Worker() constructor and specifying a script to be run in the worker thread. */
interface Worker extends EventTarget, AbstractWorker {
    onmessage: ((this: Worker, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: Worker, ev: MessageEvent) => any) | null;
    /** Clones message and transmits it to worker's global environment. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
    /** Aborts worker's associated global environment. */
    terminate(): void;
    addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Worker: {
    prototype: Worker;
    new(scriptURL: string | URL, options?: WorkerOptions): Worker;
};

/** Available only in secure contexts. */
interface Worklet {
    /**
     * Loads and executes the module script given by moduleURL into all of worklet's global scopes. It can also create additional global scopes as part of this process, depending on the worklet type. The returned promise will fulfill once the script has been successfully loaded and run in all global scopes.
     *
     * The credentials option can be set to a credentials mode to modify the script-fetching process. It defaults to "same-origin".
     *
     * Any failures in fetching the script or its dependencies will cause the returned promise to be rejected with an "AbortError" DOMException. Any errors in parsing the script or its dependencies will cause the returned promise to be rejected with the exception generated during parsing.
     */
    addModule(moduleURL: string | URL, options?: WorkletOptions): Promise<void>;
}

declare var Worklet: {
    prototype: Worklet;
    new(): Worklet;
};

/** This Streams API interface provides\xA0a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing. */
interface WritableStream<W = any> {
    readonly locked: boolean;
    abort(reason?: any): Promise<void>;
    close(): Promise<void>;
    getWriter(): WritableStreamDefaultWriter<W>;
}

declare var WritableStream: {
    prototype: WritableStream;
    new<W = any>(underlyingSink?: UnderlyingSink<W>, strategy?: QueuingStrategy<W>): WritableStream<W>;
};

/** This Streams API interface represents a controller allowing control of a\xA0WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate. */
interface WritableStreamDefaultController {
    error(e?: any): void;
}

declare var WritableStreamDefaultController: {
    prototype: WritableStreamDefaultController;
    new(): WritableStreamDefaultController;
};

/** This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink. */
interface WritableStreamDefaultWriter<W = any> {
    readonly closed: Promise<undefined>;
    readonly desiredSize: number | null;
    readonly ready: Promise<undefined>;
    abort(reason?: any): Promise<void>;
    close(): Promise<void>;
    releaseLock(): void;
    write(chunk?: W): Promise<void>;
}

declare var WritableStreamDefaultWriter: {
    prototype: WritableStreamDefaultWriter;
    new<W = any>(stream: WritableStream<W>): WritableStreamDefaultWriter<W>;
};

/** An XML document. It inherits from the generic Document and does not add any specific methods or properties to it: nevertheless, several algorithms behave differently with the two types of documents. */
interface XMLDocument extends Document {
    addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: XMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: XMLDocument, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var XMLDocument: {
    prototype: XMLDocument;
    new(): XMLDocument;
};

interface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap {
    "readystatechange": Event;
}

/** Use XMLHttpRequest (XHR) objects to interact with servers. You can retrieve data from a URL without having to do a full page refresh. This enables a Web page to update just part of a page without disrupting what the user is doing. */
interface XMLHttpRequest extends XMLHttpRequestEventTarget {
    onreadystatechange: ((this: XMLHttpRequest, ev: Event) => any) | null;
    /** Returns client's state. */
    readonly readyState: number;
    /** Returns the response body. */
    readonly response: any;
    /**
     * Returns response as text.
     *
     * Throws an "InvalidStateError" DOMException if responseType is not the empty string or "text".
     */
    readonly responseText: string;
    /**
     * Returns the response type.
     *
     * Can be set to change the response type. Values are: the empty string (default), "arraybuffer", "blob", "document", "json", and "text".
     *
     * When set: setting to "document" is ignored if current global object is not a Window object.
     *
     * When set: throws an "InvalidStateError" DOMException if state is loading or done.
     *
     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
     */
    responseType: XMLHttpRequestResponseType;
    readonly responseURL: string;
    /**
     * Returns the response as document.
     *
     * Throws an "InvalidStateError" DOMException if responseType is not the empty string or "document".
     */
    readonly responseXML: Document | null;
    readonly status: number;
    readonly statusText: string;
    /**
     * Can be set to a time in milliseconds. When set to a non-zero value will cause fetching to terminate after the given time has passed. When the time has passed, the request has not yet completed, and this's synchronous flag is unset, a timeout event will then be dispatched, or a "TimeoutError" DOMException will be thrown otherwise (for the send() method).
     *
     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
     */
    timeout: number;
    /** Returns the associated XMLHttpRequestUpload object. It can be used to gather transmission information when data is transferred to a server. */
    readonly upload: XMLHttpRequestUpload;
    /**
     * True when credentials are to be included in a cross-origin request. False when they are to be excluded in a cross-origin request and when cookies are to be ignored in its response. Initially false.
     *
     * When set: throws an "InvalidStateError" DOMException if state is not unsent or opened, or if the send() flag is set.
     */
    withCredentials: boolean;
    /** Cancels any network activity. */
    abort(): void;
    getAllResponseHeaders(): string;
    getResponseHeader(name: string): string | null;
    /**
     * Sets the request method, request URL, and synchronous flag.
     *
     * Throws a "SyntaxError" DOMException if either method is not a valid method or url cannot be parsed.
     *
     * Throws a "SecurityError" DOMException if method is a case-insensitive match for \`CONNECT\`, \`TRACE\`, or \`TRACK\`.
     *
     * Throws an "InvalidAccessError" DOMException if async is false, current global object is a Window object, and the timeout attribute is not zero or the responseType attribute is not the empty string.
     */
    open(method: string, url: string | URL): void;
    open(method: string, url: string | URL, async: boolean, username?: string | null, password?: string | null): void;
    /**
     * Acts as if the \`Content-Type\` header value for a response is mime. (It does not change the header.)
     *
     * Throws an "InvalidStateError" DOMException if state is loading or done.
     */
    overrideMimeType(mime: string): void;
    /**
     * Initiates the request. The body argument provides the request body, if any, and is ignored if the request method is GET or HEAD.
     *
     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
     */
    send(body?: Document | XMLHttpRequestBodyInit | null): void;
    /**
     * Combines a header in author request headers.
     *
     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
     *
     * Throws a "SyntaxError" DOMException if name is not a header name or if value is not a header value.
     */
    setRequestHeader(name: string, value: string): void;
    readonly DONE: number;
    readonly HEADERS_RECEIVED: number;
    readonly LOADING: number;
    readonly OPENED: number;
    readonly UNSENT: number;
    addEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var XMLHttpRequest: {
    prototype: XMLHttpRequest;
    new(): XMLHttpRequest;
    readonly DONE: number;
    readonly HEADERS_RECEIVED: number;
    readonly LOADING: number;
    readonly OPENED: number;
    readonly UNSENT: number;
};

interface XMLHttpRequestEventTargetEventMap {
    "abort": ProgressEvent<XMLHttpRequestEventTarget>;
    "error": ProgressEvent<XMLHttpRequestEventTarget>;
    "load": ProgressEvent<XMLHttpRequestEventTarget>;
    "loadend": ProgressEvent<XMLHttpRequestEventTarget>;
    "loadstart": ProgressEvent<XMLHttpRequestEventTarget>;
    "progress": ProgressEvent<XMLHttpRequestEventTarget>;
    "timeout": ProgressEvent<XMLHttpRequestEventTarget>;
}

interface XMLHttpRequestEventTarget extends EventTarget {
    onabort: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onerror: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onload: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onloadend: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onloadstart: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onprogress: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    ontimeout: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var XMLHttpRequestEventTarget: {
    prototype: XMLHttpRequestEventTarget;
    new(): XMLHttpRequestEventTarget;
};

interface XMLHttpRequestUpload extends XMLHttpRequestEventTarget {
    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var XMLHttpRequestUpload: {
    prototype: XMLHttpRequestUpload;
    new(): XMLHttpRequestUpload;
};

/** Provides the serializeToString() method to construct an XML string representing a DOM tree. */
interface XMLSerializer {
    serializeToString(root: Node): string;
}

declare var XMLSerializer: {
    prototype: XMLSerializer;
    new(): XMLSerializer;
};

/** The\xA0XPathEvaluator interface allows to compile and evaluate XPath expressions. */
interface XPathEvaluator extends XPathEvaluatorBase {
}

declare var XPathEvaluator: {
    prototype: XPathEvaluator;
    new(): XPathEvaluator;
};

interface XPathEvaluatorBase {
    createExpression(expression: string, resolver?: XPathNSResolver | null): XPathExpression;
    createNSResolver(nodeResolver: Node): XPathNSResolver;
    evaluate(expression: string, contextNode: Node, resolver?: XPathNSResolver | null, type?: number, result?: XPathResult | null): XPathResult;
}

/** This interface is a compiled XPath expression that can be evaluated on a document or specific node to return information its DOM tree. */
interface XPathExpression {
    evaluate(contextNode: Node, type?: number, result?: XPathResult | null): XPathResult;
}

declare var XPathExpression: {
    prototype: XPathExpression;
    new(): XPathExpression;
};

/** The results generated by evaluating an XPath expression within the context of a given node. */
interface XPathResult {
    readonly booleanValue: boolean;
    readonly invalidIteratorState: boolean;
    readonly numberValue: number;
    readonly resultType: number;
    readonly singleNodeValue: Node | null;
    readonly snapshotLength: number;
    readonly stringValue: string;
    iterateNext(): Node | null;
    snapshotItem(index: number): Node | null;
    readonly ANY_TYPE: number;
    readonly ANY_UNORDERED_NODE_TYPE: number;
    readonly BOOLEAN_TYPE: number;
    readonly FIRST_ORDERED_NODE_TYPE: number;
    readonly NUMBER_TYPE: number;
    readonly ORDERED_NODE_ITERATOR_TYPE: number;
    readonly ORDERED_NODE_SNAPSHOT_TYPE: number;
    readonly STRING_TYPE: number;
    readonly UNORDERED_NODE_ITERATOR_TYPE: number;
    readonly UNORDERED_NODE_SNAPSHOT_TYPE: number;
}

declare var XPathResult: {
    prototype: XPathResult;
    new(): XPathResult;
    readonly ANY_TYPE: number;
    readonly ANY_UNORDERED_NODE_TYPE: number;
    readonly BOOLEAN_TYPE: number;
    readonly FIRST_ORDERED_NODE_TYPE: number;
    readonly NUMBER_TYPE: number;
    readonly ORDERED_NODE_ITERATOR_TYPE: number;
    readonly ORDERED_NODE_SNAPSHOT_TYPE: number;
    readonly STRING_TYPE: number;
    readonly UNORDERED_NODE_ITERATOR_TYPE: number;
    readonly UNORDERED_NODE_SNAPSHOT_TYPE: number;
};

/** An XSLTProcessor applies an XSLT stylesheet transformation to an XML document to produce a new XML document as output. It has methods to load the XSLT stylesheet, to manipulate <xsl:param> parameter values, and to apply the transformation to documents. */
interface XSLTProcessor {
    clearParameters(): void;
    getParameter(namespaceURI: string | null, localName: string): any;
    importStylesheet(style: Node): void;
    removeParameter(namespaceURI: string | null, localName: string): void;
    reset(): void;
    setParameter(namespaceURI: string | null, localName: string, value: any): void;
    transformToDocument(source: Node): Document;
    transformToFragment(source: Node, output: Document): DocumentFragment;
}

declare var XSLTProcessor: {
    prototype: XSLTProcessor;
    new(): XSLTProcessor;
};

interface Console {
    assert(condition?: boolean, ...data: any[]): void;
    clear(): void;
    count(label?: string): void;
    countReset(label?: string): void;
    debug(...data: any[]): void;
    dir(item?: any, options?: any): void;
    dirxml(...data: any[]): void;
    error(...data: any[]): void;
    group(...data: any[]): void;
    groupCollapsed(...data: any[]): void;
    groupEnd(): void;
    info(...data: any[]): void;
    log(...data: any[]): void;
    table(tabularData?: any, properties?: string[]): void;
    time(label?: string): void;
    timeEnd(label?: string): void;
    timeLog(label?: string, ...data: any[]): void;
    timeStamp(label?: string): void;
    trace(...data: any[]): void;
    warn(...data: any[]): void;
}

declare var console: Console;

/** Holds useful CSS-related methods. No object with this interface are implemented: it contains only static methods and therefore is a utilitarian interface. */
declare namespace CSS {
    function escape(ident: string): string;
    function supports(property: string, value: string): boolean;
    function supports(conditionText: string): boolean;
}

declare namespace WebAssembly {
    interface CompileError extends Error {
    }

    var CompileError: {
        prototype: CompileError;
        new(message?: string): CompileError;
        (message?: string): CompileError;
    };

    interface Global {
        value: any;
        valueOf(): any;
    }

    var Global: {
        prototype: Global;
        new(descriptor: GlobalDescriptor, v?: any): Global;
    };

    interface Instance {
        readonly exports: Exports;
    }

    var Instance: {
        prototype: Instance;
        new(module: Module, importObject?: Imports): Instance;
    };

    interface LinkError extends Error {
    }

    var LinkError: {
        prototype: LinkError;
        new(message?: string): LinkError;
        (message?: string): LinkError;
    };

    interface Memory {
        readonly buffer: ArrayBuffer;
        grow(delta: number): number;
    }

    var Memory: {
        prototype: Memory;
        new(descriptor: MemoryDescriptor): Memory;
    };

    interface Module {
    }

    var Module: {
        prototype: Module;
        new(bytes: BufferSource): Module;
        customSections(moduleObject: Module, sectionName: string): ArrayBuffer[];
        exports(moduleObject: Module): ModuleExportDescriptor[];
        imports(moduleObject: Module): ModuleImportDescriptor[];
    };

    interface RuntimeError extends Error {
    }

    var RuntimeError: {
        prototype: RuntimeError;
        new(message?: string): RuntimeError;
        (message?: string): RuntimeError;
    };

    interface Table {
        readonly length: number;
        get(index: number): any;
        grow(delta: number, value?: any): number;
        set(index: number, value?: any): void;
    }

    var Table: {
        prototype: Table;
        new(descriptor: TableDescriptor, value?: any): Table;
    };

    interface GlobalDescriptor {
        mutable?: boolean;
        value: ValueType;
    }

    interface MemoryDescriptor {
        initial: number;
        maximum?: number;
        shared?: boolean;
    }

    interface ModuleExportDescriptor {
        kind: ImportExportKind;
        name: string;
    }

    interface ModuleImportDescriptor {
        kind: ImportExportKind;
        module: string;
        name: string;
    }

    interface TableDescriptor {
        element: TableKind;
        initial: number;
        maximum?: number;
    }

    interface WebAssemblyInstantiatedSource {
        instance: Instance;
        module: Module;
    }

    type ImportExportKind = "function" | "global" | "memory" | "table";
    type TableKind = "anyfunc" | "externref";
    type ValueType = "anyfunc" | "externref" | "f32" | "f64" | "i32" | "i64";
    type ExportValue = Function | Global | Memory | Table;
    type Exports = Record<string, ExportValue>;
    type ImportValue = ExportValue | number;
    type Imports = Record<string, ModuleImports>;
    type ModuleImports = Record<string, ImportValue>;
    function compile(bytes: BufferSource): Promise<Module>;
    function compileStreaming(source: Response | PromiseLike<Response>): Promise<Module>;
    function instantiate(bytes: BufferSource, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
    function instantiate(moduleObject: Module, importObject?: Imports): Promise<Instance>;
    function instantiateStreaming(source: Response | PromiseLike<Response>, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
    function validate(bytes: BufferSource): boolean;
}

interface BlobCallback {
    (blob: Blob | null): void;
}

interface CustomElementConstructor {
    new (...params: any[]): HTMLElement;
}

interface DecodeErrorCallback {
    (error: DOMException): void;
}

interface DecodeSuccessCallback {
    (decodedData: AudioBuffer): void;
}

interface ErrorCallback {
    (err: DOMException): void;
}

interface FileCallback {
    (file: File): void;
}

interface FileSystemEntriesCallback {
    (entries: FileSystemEntry[]): void;
}

interface FileSystemEntryCallback {
    (entry: FileSystemEntry): void;
}

interface FrameRequestCallback {
    (time: DOMHighResTimeStamp): void;
}

interface FunctionStringCallback {
    (data: string): void;
}

interface IdleRequestCallback {
    (deadline: IdleDeadline): void;
}

interface IntersectionObserverCallback {
    (entries: IntersectionObserverEntry[], observer: IntersectionObserver): void;
}

interface MediaSessionActionHandler {
    (details: MediaSessionActionDetails): void;
}

interface MutationCallback {
    (mutations: MutationRecord[], observer: MutationObserver): void;
}

interface NotificationPermissionCallback {
    (permission: NotificationPermission): void;
}

interface OnBeforeUnloadEventHandlerNonNull {
    (event: Event): string | null;
}

interface OnErrorEventHandlerNonNull {
    (event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error): any;
}

interface PerformanceObserverCallback {
    (entries: PerformanceObserverEntryList, observer: PerformanceObserver): void;
}

interface PositionCallback {
    (position: GeolocationPosition): void;
}

interface PositionErrorCallback {
    (positionError: GeolocationPositionError): void;
}

interface QueuingStrategySize<T = any> {
    (chunk: T): number;
}

interface RTCPeerConnectionErrorCallback {
    (error: DOMException): void;
}

interface RTCSessionDescriptionCallback {
    (description: RTCSessionDescriptionInit): void;
}

interface RemotePlaybackAvailabilityCallback {
    (available: boolean): void;
}

interface ResizeObserverCallback {
    (entries: ResizeObserverEntry[], observer: ResizeObserver): void;
}

interface TransformerFlushCallback<O> {
    (controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
}

interface TransformerStartCallback<O> {
    (controller: TransformStreamDefaultController<O>): any;
}

interface TransformerTransformCallback<I, O> {
    (chunk: I, controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
}

interface UnderlyingSinkAbortCallback {
    (reason?: any): void | PromiseLike<void>;
}

interface UnderlyingSinkCloseCallback {
    (): void | PromiseLike<void>;
}

interface UnderlyingSinkStartCallback {
    (controller: WritableStreamDefaultController): any;
}

interface UnderlyingSinkWriteCallback<W> {
    (chunk: W, controller: WritableStreamDefaultController): void | PromiseLike<void>;
}

interface UnderlyingSourceCancelCallback {
    (reason?: any): void | PromiseLike<void>;
}

interface UnderlyingSourcePullCallback<R> {
    (controller: ReadableStreamController<R>): void | PromiseLike<void>;
}

interface UnderlyingSourceStartCallback<R> {
    (controller: ReadableStreamController<R>): any;
}

interface VoidFunction {
    (): void;
}

interface HTMLElementTagNameMap {
    "a": HTMLAnchorElement;
    "abbr": HTMLElement;
    "address": HTMLElement;
    "area": HTMLAreaElement;
    "article": HTMLElement;
    "aside": HTMLElement;
    "audio": HTMLAudioElement;
    "b": HTMLElement;
    "base": HTMLBaseElement;
    "bdi": HTMLElement;
    "bdo": HTMLElement;
    "blockquote": HTMLQuoteElement;
    "body": HTMLBodyElement;
    "br": HTMLBRElement;
    "button": HTMLButtonElement;
    "canvas": HTMLCanvasElement;
    "caption": HTMLTableCaptionElement;
    "cite": HTMLElement;
    "code": HTMLElement;
    "col": HTMLTableColElement;
    "colgroup": HTMLTableColElement;
    "data": HTMLDataElement;
    "datalist": HTMLDataListElement;
    "dd": HTMLElement;
    "del": HTMLModElement;
    "details": HTMLDetailsElement;
    "dfn": HTMLElement;
    "dialog": HTMLDialogElement;
    "dir": HTMLDirectoryElement;
    "div": HTMLDivElement;
    "dl": HTMLDListElement;
    "dt": HTMLElement;
    "em": HTMLElement;
    "embed": HTMLEmbedElement;
    "fieldset": HTMLFieldSetElement;
    "figcaption": HTMLElement;
    "figure": HTMLElement;
    "font": HTMLFontElement;
    "footer": HTMLElement;
    "form": HTMLFormElement;
    "frame": HTMLFrameElement;
    "frameset": HTMLFrameSetElement;
    "h1": HTMLHeadingElement;
    "h2": HTMLHeadingElement;
    "h3": HTMLHeadingElement;
    "h4": HTMLHeadingElement;
    "h5": HTMLHeadingElement;
    "h6": HTMLHeadingElement;
    "head": HTMLHeadElement;
    "header": HTMLElement;
    "hgroup": HTMLElement;
    "hr": HTMLHRElement;
    "html": HTMLHtmlElement;
    "i": HTMLElement;
    "iframe": HTMLIFrameElement;
    "img": HTMLImageElement;
    "input": HTMLInputElement;
    "ins": HTMLModElement;
    "kbd": HTMLElement;
    "label": HTMLLabelElement;
    "legend": HTMLLegendElement;
    "li": HTMLLIElement;
    "link": HTMLLinkElement;
    "main": HTMLElement;
    "map": HTMLMapElement;
    "mark": HTMLElement;
    "marquee": HTMLMarqueeElement;
    "menu": HTMLMenuElement;
    "meta": HTMLMetaElement;
    "meter": HTMLMeterElement;
    "nav": HTMLElement;
    "noscript": HTMLElement;
    "object": HTMLObjectElement;
    "ol": HTMLOListElement;
    "optgroup": HTMLOptGroupElement;
    "option": HTMLOptionElement;
    "output": HTMLOutputElement;
    "p": HTMLParagraphElement;
    "param": HTMLParamElement;
    "picture": HTMLPictureElement;
    "pre": HTMLPreElement;
    "progress": HTMLProgressElement;
    "q": HTMLQuoteElement;
    "rp": HTMLElement;
    "rt": HTMLElement;
    "ruby": HTMLElement;
    "s": HTMLElement;
    "samp": HTMLElement;
    "script": HTMLScriptElement;
    "section": HTMLElement;
    "select": HTMLSelectElement;
    "slot": HTMLSlotElement;
    "small": HTMLElement;
    "source": HTMLSourceElement;
    "span": HTMLSpanElement;
    "strong": HTMLElement;
    "style": HTMLStyleElement;
    "sub": HTMLElement;
    "summary": HTMLElement;
    "sup": HTMLElement;
    "table": HTMLTableElement;
    "tbody": HTMLTableSectionElement;
    "td": HTMLTableCellElement;
    "template": HTMLTemplateElement;
    "textarea": HTMLTextAreaElement;
    "tfoot": HTMLTableSectionElement;
    "th": HTMLTableCellElement;
    "thead": HTMLTableSectionElement;
    "time": HTMLTimeElement;
    "title": HTMLTitleElement;
    "tr": HTMLTableRowElement;
    "track": HTMLTrackElement;
    "u": HTMLElement;
    "ul": HTMLUListElement;
    "var": HTMLElement;
    "video": HTMLVideoElement;
    "wbr": HTMLElement;
}

interface HTMLElementDeprecatedTagNameMap {
    "listing": HTMLPreElement;
    "xmp": HTMLPreElement;
}

interface SVGElementTagNameMap {
    "a": SVGAElement;
    "animate": SVGAnimateElement;
    "animateMotion": SVGAnimateMotionElement;
    "animateTransform": SVGAnimateTransformElement;
    "circle": SVGCircleElement;
    "clipPath": SVGClipPathElement;
    "defs": SVGDefsElement;
    "desc": SVGDescElement;
    "ellipse": SVGEllipseElement;
    "feBlend": SVGFEBlendElement;
    "feColorMatrix": SVGFEColorMatrixElement;
    "feComponentTransfer": SVGFEComponentTransferElement;
    "feComposite": SVGFECompositeElement;
    "feConvolveMatrix": SVGFEConvolveMatrixElement;
    "feDiffuseLighting": SVGFEDiffuseLightingElement;
    "feDisplacementMap": SVGFEDisplacementMapElement;
    "feDistantLight": SVGFEDistantLightElement;
    "feDropShadow": SVGFEDropShadowElement;
    "feFlood": SVGFEFloodElement;
    "feFuncA": SVGFEFuncAElement;
    "feFuncB": SVGFEFuncBElement;
    "feFuncG": SVGFEFuncGElement;
    "feFuncR": SVGFEFuncRElement;
    "feGaussianBlur": SVGFEGaussianBlurElement;
    "feImage": SVGFEImageElement;
    "feMerge": SVGFEMergeElement;
    "feMergeNode": SVGFEMergeNodeElement;
    "feMorphology": SVGFEMorphologyElement;
    "feOffset": SVGFEOffsetElement;
    "fePointLight": SVGFEPointLightElement;
    "feSpecularLighting": SVGFESpecularLightingElement;
    "feSpotLight": SVGFESpotLightElement;
    "feTile": SVGFETileElement;
    "feTurbulence": SVGFETurbulenceElement;
    "filter": SVGFilterElement;
    "foreignObject": SVGForeignObjectElement;
    "g": SVGGElement;
    "image": SVGImageElement;
    "line": SVGLineElement;
    "linearGradient": SVGLinearGradientElement;
    "marker": SVGMarkerElement;
    "mask": SVGMaskElement;
    "metadata": SVGMetadataElement;
    "mpath": SVGMPathElement;
    "path": SVGPathElement;
    "pattern": SVGPatternElement;
    "polygon": SVGPolygonElement;
    "polyline": SVGPolylineElement;
    "radialGradient": SVGRadialGradientElement;
    "rect": SVGRectElement;
    "script": SVGScriptElement;
    "set": SVGSetElement;
    "stop": SVGStopElement;
    "style": SVGStyleElement;
    "svg": SVGSVGElement;
    "switch": SVGSwitchElement;
    "symbol": SVGSymbolElement;
    "text": SVGTextElement;
    "textPath": SVGTextPathElement;
    "title": SVGTitleElement;
    "tspan": SVGTSpanElement;
    "use": SVGUseElement;
    "view": SVGViewElement;
}

/** @deprecated Directly use HTMLElementTagNameMap or SVGElementTagNameMap as appropriate, instead. */
type ElementTagNameMap = HTMLElementTagNameMap & Pick<SVGElementTagNameMap, Exclude<keyof SVGElementTagNameMap, keyof HTMLElementTagNameMap>>;

declare var Audio: {
    new(src?: string): HTMLAudioElement;
};
declare var Image: {
    new(width?: number, height?: number): HTMLImageElement;
};
declare var Option: {
    new(text?: string, value?: string, defaultSelected?: boolean, selected?: boolean): HTMLOptionElement;
};
/** @deprecated This is a legacy alias of \`navigator\`. */
declare var clientInformation: Navigator;
/** Returns true if the window has been closed, false otherwise. */
declare var closed: boolean;
/** Defines a new custom element, mapping the given name to the given constructor as an autonomous custom element. */
declare var customElements: CustomElementRegistry;
declare var devicePixelRatio: number;
declare var document: Document;
/** @deprecated */
declare var event: Event | undefined;
/** @deprecated */
declare var external: External;
declare var frameElement: Element | null;
declare var frames: WindowProxy;
declare var history: History;
declare var innerHeight: number;
declare var innerWidth: number;
declare var length: number;
declare var location: Location;
/** Returns true if the location bar is visible; otherwise, returns false. */
declare var locationbar: BarProp;
/** Returns true if the menu bar is visible; otherwise, returns false. */
declare var menubar: BarProp;
/** @deprecated */
declare const name: void;
declare var navigator: Navigator;
/** Available only in secure contexts. */
declare var ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null;
/** Available only in secure contexts. */
declare var ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null;
/** @deprecated */
declare var onorientationchange: ((this: Window, ev: Event) => any) | null;
declare var opener: any;
/** @deprecated */
declare var orientation: number;
declare var outerHeight: number;
declare var outerWidth: number;
/** @deprecated This is a legacy alias of \`scrollX\`. */
declare var pageXOffset: number;
/** @deprecated This is a legacy alias of \`scrollY\`. */
declare var pageYOffset: number;
/**
 * Refers to either the parent WindowProxy, or itself.
 *
 * It can rarely be null e.g. for contentWindow of an iframe that is already removed from the parent.
 */
declare var parent: WindowProxy;
/** Returns true if the personal bar is visible; otherwise, returns false. */
declare var personalbar: BarProp;
declare var screen: Screen;
declare var screenLeft: number;
declare var screenTop: number;
declare var screenX: number;
declare var screenY: number;
declare var scrollX: number;
declare var scrollY: number;
/** Returns true if the scrollbars are visible; otherwise, returns false. */
declare var scrollbars: BarProp;
declare var self: Window & typeof globalThis;
declare var speechSynthesis: SpeechSynthesis;
/** @deprecated */
declare var status: string;
/** Returns true if the status bar is visible; otherwise, returns false. */
declare var statusbar: BarProp;
/** Returns true if the toolbar is visible; otherwise, returns false. */
declare var toolbar: BarProp;
declare var top: WindowProxy | null;
declare var visualViewport: VisualViewport;
declare var window: Window & typeof globalThis;
declare function alert(message?: any): void;
declare function blur(): void;
declare function cancelIdleCallback(handle: number): void;
/** @deprecated */
declare function captureEvents(): void;
/** Closes the window. */
declare function close(): void;
declare function confirm(message?: string): boolean;
/** Moves the focus to the window's browsing context, if any. */
declare function focus(): void;
declare function getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration;
declare function getSelection(): Selection | null;
declare function matchMedia(query: string): MediaQueryList;
declare function moveBy(x: number, y: number): void;
declare function moveTo(x: number, y: number): void;
declare function open(url?: string | URL, target?: string, features?: string): WindowProxy | null;
/**
 * Posts a message to the given window. Messages can be structured objects, e.g. nested objects and arrays, can contain JavaScript values (strings, numbers, Date objects, etc), and can contain certain data objects such as File Blob, FileList, and ArrayBuffer objects.
 *
 * Objects listed in the transfer member of options are transferred, not just cloned, meaning that they are no longer usable on the sending side.
 *
 * A target origin can be specified using the targetOrigin member of options. If not provided, it defaults to "/". This default restricts the message to same-origin targets only.
 *
 * If the origin of the target window doesn't match the given target origin, the message is discarded, to avoid information leakage. To send the message to the target regardless of origin, set the target origin to "*".
 *
 * Throws a "DataCloneError" DOMException if transfer array contains duplicate objects or if message could not be cloned.
 */
declare function postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;
declare function postMessage(message: any, options?: WindowPostMessageOptions): void;
declare function print(): void;
declare function prompt(message?: string, _default?: string): string | null;
/** @deprecated */
declare function releaseEvents(): void;
declare function requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number;
declare function resizeBy(x: number, y: number): void;
declare function resizeTo(width: number, height: number): void;
declare function scroll(options?: ScrollToOptions): void;
declare function scroll(x: number, y: number): void;
declare function scrollBy(options?: ScrollToOptions): void;
declare function scrollBy(x: number, y: number): void;
declare function scrollTo(options?: ScrollToOptions): void;
declare function scrollTo(x: number, y: number): void;
/** Cancels the document load. */
declare function stop(): void;
declare function toString(): string;
/** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
declare function dispatchEvent(event: Event): boolean;
declare function cancelAnimationFrame(handle: number): void;
declare function requestAnimationFrame(callback: FrameRequestCallback): number;
/**
 * Fires when the user aborts the download.
 * @param ev The event.
 */
declare var onabort: ((this: Window, ev: UIEvent) => any) | null;
declare var onanimationcancel: ((this: Window, ev: AnimationEvent) => any) | null;
declare var onanimationend: ((this: Window, ev: AnimationEvent) => any) | null;
declare var onanimationiteration: ((this: Window, ev: AnimationEvent) => any) | null;
declare var onanimationstart: ((this: Window, ev: AnimationEvent) => any) | null;
declare var onauxclick: ((this: Window, ev: MouseEvent) => any) | null;
/**
 * Fires when the object loses the input focus.
 * @param ev The focus event.
 */
declare var onblur: ((this: Window, ev: FocusEvent) => any) | null;
/**
 * Occurs when playback is possible, but would require further buffering.
 * @param ev The event.
 */
declare var oncanplay: ((this: Window, ev: Event) => any) | null;
declare var oncanplaythrough: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when the contents of the object or selection have changed.
 * @param ev The event.
 */
declare var onchange: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when the user clicks the left mouse button on the object
 * @param ev The mouse event.
 */
declare var onclick: ((this: Window, ev: MouseEvent) => any) | null;
declare var onclose: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when the user clicks the right mouse button in the client area, opening the context menu.
 * @param ev The mouse event.
 */
declare var oncontextmenu: ((this: Window, ev: MouseEvent) => any) | null;
declare var oncuechange: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when the user double-clicks the object.
 * @param ev The mouse event.
 */
declare var ondblclick: ((this: Window, ev: MouseEvent) => any) | null;
/**
 * Fires on the source object continuously during a drag operation.
 * @param ev The event.
 */
declare var ondrag: ((this: Window, ev: DragEvent) => any) | null;
/**
 * Fires on the source object when the user releases the mouse at the close of a drag operation.
 * @param ev The event.
 */
declare var ondragend: ((this: Window, ev: DragEvent) => any) | null;
/**
 * Fires on the target element when the user drags the object to a valid drop target.
 * @param ev The drag event.
 */
declare var ondragenter: ((this: Window, ev: DragEvent) => any) | null;
/**
 * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.
 * @param ev The drag event.
 */
declare var ondragleave: ((this: Window, ev: DragEvent) => any) | null;
/**
 * Fires on the target element continuously while the user drags the object over a valid drop target.
 * @param ev The event.
 */
declare var ondragover: ((this: Window, ev: DragEvent) => any) | null;
/**
 * Fires on the source object when the user starts to drag a text selection or selected object.
 * @param ev The event.
 */
declare var ondragstart: ((this: Window, ev: DragEvent) => any) | null;
declare var ondrop: ((this: Window, ev: DragEvent) => any) | null;
/**
 * Occurs when the duration attribute is updated.
 * @param ev The event.
 */
declare var ondurationchange: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the media element is reset to its initial state.
 * @param ev The event.
 */
declare var onemptied: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the end of playback is reached.
 * @param ev The event
 */
declare var onended: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when an error occurs during object loading.
 * @param ev The event.
 */
declare var onerror: OnErrorEventHandler;
/**
 * Fires when the object receives focus.
 * @param ev The event.
 */
declare var onfocus: ((this: Window, ev: FocusEvent) => any) | null;
declare var onformdata: ((this: Window, ev: FormDataEvent) => any) | null;
declare var ongotpointercapture: ((this: Window, ev: PointerEvent) => any) | null;
declare var oninput: ((this: Window, ev: Event) => any) | null;
declare var oninvalid: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when the user presses a key.
 * @param ev The keyboard event
 */
declare var onkeydown: ((this: Window, ev: KeyboardEvent) => any) | null;
/**
 * Fires when the user presses an alphanumeric key.
 * @param ev The event.
 * @deprecated
 */
declare var onkeypress: ((this: Window, ev: KeyboardEvent) => any) | null;
/**
 * Fires when the user releases a key.
 * @param ev The keyboard event
 */
declare var onkeyup: ((this: Window, ev: KeyboardEvent) => any) | null;
/**
 * Fires immediately after the browser loads the object.
 * @param ev The event.
 */
declare var onload: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when media data is loaded at the current playback position.
 * @param ev The event.
 */
declare var onloadeddata: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the duration and dimensions of the media have been determined.
 * @param ev The event.
 */
declare var onloadedmetadata: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when Internet Explorer begins looking for media data.
 * @param ev The event.
 */
declare var onloadstart: ((this: Window, ev: Event) => any) | null;
declare var onlostpointercapture: ((this: Window, ev: PointerEvent) => any) | null;
/**
 * Fires when the user clicks the object with either mouse button.
 * @param ev The mouse event.
 */
declare var onmousedown: ((this: Window, ev: MouseEvent) => any) | null;
declare var onmouseenter: ((this: Window, ev: MouseEvent) => any) | null;
declare var onmouseleave: ((this: Window, ev: MouseEvent) => any) | null;
/**
 * Fires when the user moves the mouse over the object.
 * @param ev The mouse event.
 */
declare var onmousemove: ((this: Window, ev: MouseEvent) => any) | null;
/**
 * Fires when the user moves the mouse pointer outside the boundaries of the object.
 * @param ev The mouse event.
 */
declare var onmouseout: ((this: Window, ev: MouseEvent) => any) | null;
/**
 * Fires when the user moves the mouse pointer into the object.
 * @param ev The mouse event.
 */
declare var onmouseover: ((this: Window, ev: MouseEvent) => any) | null;
/**
 * Fires when the user releases a mouse button while the mouse is over the object.
 * @param ev The mouse event.
 */
declare var onmouseup: ((this: Window, ev: MouseEvent) => any) | null;
/**
 * Occurs when playback is paused.
 * @param ev The event.
 */
declare var onpause: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the play method is requested.
 * @param ev The event.
 */
declare var onplay: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the audio or video has started playing.
 * @param ev The event.
 */
declare var onplaying: ((this: Window, ev: Event) => any) | null;
declare var onpointercancel: ((this: Window, ev: PointerEvent) => any) | null;
declare var onpointerdown: ((this: Window, ev: PointerEvent) => any) | null;
declare var onpointerenter: ((this: Window, ev: PointerEvent) => any) | null;
declare var onpointerleave: ((this: Window, ev: PointerEvent) => any) | null;
declare var onpointermove: ((this: Window, ev: PointerEvent) => any) | null;
declare var onpointerout: ((this: Window, ev: PointerEvent) => any) | null;
declare var onpointerover: ((this: Window, ev: PointerEvent) => any) | null;
declare var onpointerup: ((this: Window, ev: PointerEvent) => any) | null;
/**
 * Occurs to indicate progress while downloading media data.
 * @param ev The event.
 */
declare var onprogress: ((this: Window, ev: ProgressEvent) => any) | null;
/**
 * Occurs when the playback rate is increased or decreased.
 * @param ev The event.
 */
declare var onratechange: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when the user resets a form.
 * @param ev The event.
 */
declare var onreset: ((this: Window, ev: Event) => any) | null;
declare var onresize: ((this: Window, ev: UIEvent) => any) | null;
/**
 * Fires when the user repositions the scroll box in the scroll bar on the object.
 * @param ev The event.
 */
declare var onscroll: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the seek operation ends.
 * @param ev The event.
 */
declare var onseeked: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the current playback position is moved.
 * @param ev The event.
 */
declare var onseeking: ((this: Window, ev: Event) => any) | null;
/**
 * Fires when the current selection changes.
 * @param ev The event.
 */
declare var onselect: ((this: Window, ev: Event) => any) | null;
declare var onselectionchange: ((this: Window, ev: Event) => any) | null;
declare var onselectstart: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when the download has stopped.
 * @param ev The event.
 */
declare var onstalled: ((this: Window, ev: Event) => any) | null;
declare var onsubmit: ((this: Window, ev: SubmitEvent) => any) | null;
/**
 * Occurs if the load operation has been intentionally halted.
 * @param ev The event.
 */
declare var onsuspend: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs to indicate the current playback position.
 * @param ev The event.
 */
declare var ontimeupdate: ((this: Window, ev: Event) => any) | null;
declare var ontoggle: ((this: Window, ev: Event) => any) | null;
declare var ontouchcancel: ((this: Window, ev: TouchEvent) => any) | null | undefined;
declare var ontouchend: ((this: Window, ev: TouchEvent) => any) | null | undefined;
declare var ontouchmove: ((this: Window, ev: TouchEvent) => any) | null | undefined;
declare var ontouchstart: ((this: Window, ev: TouchEvent) => any) | null | undefined;
declare var ontransitioncancel: ((this: Window, ev: TransitionEvent) => any) | null;
declare var ontransitionend: ((this: Window, ev: TransitionEvent) => any) | null;
declare var ontransitionrun: ((this: Window, ev: TransitionEvent) => any) | null;
declare var ontransitionstart: ((this: Window, ev: TransitionEvent) => any) | null;
/**
 * Occurs when the volume is changed, or playback is muted or unmuted.
 * @param ev The event.
 */
declare var onvolumechange: ((this: Window, ev: Event) => any) | null;
/**
 * Occurs when playback stops because the next frame of a video resource is not available.
 * @param ev The event.
 */
declare var onwaiting: ((this: Window, ev: Event) => any) | null;
/** @deprecated This is a legacy alias of \`onanimationend\`. */
declare var onwebkitanimationend: ((this: Window, ev: Event) => any) | null;
/** @deprecated This is a legacy alias of \`onanimationiteration\`. */
declare var onwebkitanimationiteration: ((this: Window, ev: Event) => any) | null;
/** @deprecated This is a legacy alias of \`onanimationstart\`. */
declare var onwebkitanimationstart: ((this: Window, ev: Event) => any) | null;
/** @deprecated This is a legacy alias of \`ontransitionend\`. */
declare var onwebkittransitionend: ((this: Window, ev: Event) => any) | null;
declare var onwheel: ((this: Window, ev: WheelEvent) => any) | null;
declare var onafterprint: ((this: Window, ev: Event) => any) | null;
declare var onbeforeprint: ((this: Window, ev: Event) => any) | null;
declare var onbeforeunload: ((this: Window, ev: BeforeUnloadEvent) => any) | null;
declare var ongamepadconnected: ((this: Window, ev: GamepadEvent) => any) | null;
declare var ongamepaddisconnected: ((this: Window, ev: GamepadEvent) => any) | null;
declare var onhashchange: ((this: Window, ev: HashChangeEvent) => any) | null;
declare var onlanguagechange: ((this: Window, ev: Event) => any) | null;
declare var onmessage: ((this: Window, ev: MessageEvent) => any) | null;
declare var onmessageerror: ((this: Window, ev: MessageEvent) => any) | null;
declare var onoffline: ((this: Window, ev: Event) => any) | null;
declare var ononline: ((this: Window, ev: Event) => any) | null;
declare var onpagehide: ((this: Window, ev: PageTransitionEvent) => any) | null;
declare var onpageshow: ((this: Window, ev: PageTransitionEvent) => any) | null;
declare var onpopstate: ((this: Window, ev: PopStateEvent) => any) | null;
declare var onrejectionhandled: ((this: Window, ev: PromiseRejectionEvent) => any) | null;
declare var onstorage: ((this: Window, ev: StorageEvent) => any) | null;
declare var onunhandledrejection: ((this: Window, ev: PromiseRejectionEvent) => any) | null;
declare var onunload: ((this: Window, ev: Event) => any) | null;
declare var localStorage: Storage;
/** Available only in secure contexts. */
declare var caches: CacheStorage;
declare var crossOriginIsolated: boolean;
declare var crypto: Crypto;
declare var indexedDB: IDBFactory;
declare var isSecureContext: boolean;
declare var origin: string;
declare var performance: Performance;
declare function atob(data: string): string;
declare function btoa(data: string): string;
declare function clearInterval(handle?: number): void;
declare function clearTimeout(handle?: number): void;
declare function createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
declare function createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
declare function fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
declare function queueMicrotask(callback: VoidFunction): void;
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare var sessionStorage: Storage;
declare function addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
declare function removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
declare function removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
type AlgorithmIdentifier = Algorithm | string;
type BigInteger = Uint8Array;
type BinaryData = ArrayBuffer | ArrayBufferView;
type BlobPart = BufferSource | Blob | string;
type BodyInit = ReadableStream | XMLHttpRequestBodyInit;
type BufferSource = ArrayBufferView | ArrayBuffer;
type COSEAlgorithmIdentifier = number;
type CSSNumberish = number;
type CanvasImageSource = HTMLOrSVGImageElement | HTMLVideoElement | HTMLCanvasElement | ImageBitmap;
type ClipboardItemData = Promise<ClipboardItemDataType>;
type ClipboardItemDataType = string | Blob;
type ClipboardItems = ClipboardItem[];
type ConstrainBoolean = boolean | ConstrainBooleanParameters;
type ConstrainDOMString = string | string[] | ConstrainDOMStringParameters;
type ConstrainDouble = number | ConstrainDoubleRange;
type ConstrainULong = number | ConstrainULongRange;
type DOMHighResTimeStamp = number;
type DOMTimeStamp = number;
type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
type Float32List = Float32Array | GLfloat[];
type FormDataEntryValue = File | string;
type GLbitfield = number;
type GLboolean = boolean;
type GLclampf = number;
type GLenum = number;
type GLfloat = number;
type GLint = number;
type GLint64 = number;
type GLintptr = number;
type GLsizei = number;
type GLsizeiptr = number;
type GLuint = number;
type GLuint64 = number;
type HTMLOrSVGImageElement = HTMLImageElement | SVGImageElement;
type HTMLOrSVGScriptElement = HTMLScriptElement | SVGScriptElement;
type HashAlgorithmIdentifier = AlgorithmIdentifier;
type HeadersInit = string[][] | Record<string, string> | Headers;
type IDBValidKey = number | string | Date | BufferSource | IDBValidKey[];
type ImageBitmapSource = CanvasImageSource | Blob | ImageData;
type InsertPosition = "beforebegin" | "afterbegin" | "beforeend" | "afterend";
type Int32List = Int32Array | GLint[];
type LineAndPositionSetting = number | AutoKeyword;
type MediaProvider = MediaStream | MediaSource | Blob;
type MessageEventSource = WindowProxy | MessagePort | ServiceWorker;
type MutationRecordType = "attributes" | "characterData" | "childList";
type NamedCurve = string;
type OnBeforeUnloadEventHandler = OnBeforeUnloadEventHandlerNonNull | null;
type OnErrorEventHandler = OnErrorEventHandlerNonNull | null;
type PerformanceEntryList = PerformanceEntry[];
type ReadableStreamController<T> = ReadableStreamDefaultController<T>;
type ReadableStreamDefaultReadResult<T> = ReadableStreamDefaultReadValueResult<T> | ReadableStreamDefaultReadDoneResult;
type ReadableStreamReader<T> = ReadableStreamDefaultReader<T>;
type RenderingContext = CanvasRenderingContext2D | ImageBitmapRenderingContext | WebGLRenderingContext | WebGL2RenderingContext;
type RequestInfo = Request | string;
type TexImageSource = ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;
type TimerHandler = string | Function;
type Transferable = ArrayBuffer | MessagePort | ImageBitmap;
type Uint32List = Uint32Array | GLuint[];
type UvmEntries = UvmEntry[];
type UvmEntry = number[];
type VibratePattern = number | number[];
type WindowProxy = Window;
type XMLHttpRequestBodyInit = Blob | BufferSource | FormData | URLSearchParams | string;
type AlignSetting = "center" | "end" | "left" | "right" | "start";
type AnimationPlayState = "finished" | "idle" | "paused" | "running";
type AnimationReplaceState = "active" | "persisted" | "removed";
type AppendMode = "segments" | "sequence";
type AttestationConveyancePreference = "direct" | "enterprise" | "indirect" | "none";
type AudioContextLatencyCategory = "balanced" | "interactive" | "playback";
type AudioContextState = "closed" | "running" | "suspended";
type AuthenticatorAttachment = "cross-platform" | "platform";
type AuthenticatorTransport = "ble" | "internal" | "nfc" | "usb";
type AutoKeyword = "auto";
type AutomationRate = "a-rate" | "k-rate";
type BinaryType = "arraybuffer" | "blob";
type BiquadFilterType = "allpass" | "bandpass" | "highpass" | "highshelf" | "lowpass" | "lowshelf" | "notch" | "peaking";
type CanPlayTypeResult = "" | "maybe" | "probably";
type CanvasDirection = "inherit" | "ltr" | "rtl";
type CanvasFillRule = "evenodd" | "nonzero";
type CanvasFontKerning = "auto" | "none" | "normal";
type CanvasFontStretch = "condensed" | "expanded" | "extra-condensed" | "extra-expanded" | "normal" | "semi-condensed" | "semi-expanded" | "ultra-condensed" | "ultra-expanded";
type CanvasFontVariantCaps = "all-petite-caps" | "all-small-caps" | "normal" | "petite-caps" | "small-caps" | "titling-caps" | "unicase";
type CanvasLineCap = "butt" | "round" | "square";
type CanvasLineJoin = "bevel" | "miter" | "round";
type CanvasTextAlign = "center" | "end" | "left" | "right" | "start";
type CanvasTextBaseline = "alphabetic" | "bottom" | "hanging" | "ideographic" | "middle" | "top";
type CanvasTextRendering = "auto" | "geometricPrecision" | "optimizeLegibility" | "optimizeSpeed";
type ChannelCountMode = "clamped-max" | "explicit" | "max";
type ChannelInterpretation = "discrete" | "speakers";
type ClientTypes = "all" | "sharedworker" | "window" | "worker";
type ColorGamut = "p3" | "rec2020" | "srgb";
type ColorSpaceConversion = "default" | "none";
type CompositeOperation = "accumulate" | "add" | "replace";
type CompositeOperationOrAuto = "accumulate" | "add" | "auto" | "replace";
type ConnectionType = "bluetooth" | "cellular" | "ethernet" | "mixed" | "none" | "other" | "unknown" | "wifi";
type CredentialMediationRequirement = "optional" | "required" | "silent";
type DOMParserSupportedType = "application/xhtml+xml" | "application/xml" | "image/svg+xml" | "text/html" | "text/xml";
type DirectionSetting = "" | "lr" | "rl";
type DisplayCaptureSurfaceType = "application" | "browser" | "monitor" | "window";
type DistanceModelType = "exponential" | "inverse" | "linear";
type DocumentReadyState = "complete" | "interactive" | "loading";
type EndOfStreamError = "decode" | "network";
type EndingType = "native" | "transparent";
type FillMode = "auto" | "backwards" | "both" | "forwards" | "none";
type FontFaceLoadStatus = "error" | "loaded" | "loading" | "unloaded";
type FontFaceSetLoadStatus = "loaded" | "loading";
type FullscreenNavigationUI = "auto" | "hide" | "show";
type GamepadHapticActuatorType = "vibration";
type GamepadMappingType = "" | "standard" | "xr-standard";
type HdrMetadataType = "smpteSt2086" | "smpteSt2094-10" | "smpteSt2094-40";
type IDBCursorDirection = "next" | "nextunique" | "prev" | "prevunique";
type IDBRequestReadyState = "done" | "pending";
type IDBTransactionMode = "readonly" | "readwrite" | "versionchange";
type ImageOrientation = "flipY" | "none";
type ImageSmoothingQuality = "high" | "low" | "medium";
type IterationCompositeOperation = "accumulate" | "replace";
type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki";
type KeyType = "private" | "public" | "secret";
type KeyUsage = "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey";
type LineAlignSetting = "center" | "end" | "start";
type MediaDecodingType = "file" | "media-source" | "webrtc";
type MediaDeviceKind = "audioinput" | "audiooutput" | "videoinput";
type MediaEncodingType = "record" | "webrtc";
type MediaKeyMessageType = "individualization-request" | "license-release" | "license-renewal" | "license-request";
type MediaKeySessionClosedReason = "closed-by-application" | "hardware-context-reset" | "internal-error" | "release-acknowledged" | "resource-evicted";
type MediaKeySessionType = "persistent-license" | "temporary";
type MediaKeyStatus = "expired" | "internal-error" | "output-downscaled" | "output-restricted" | "released" | "status-pending" | "usable" | "usable-in-future";
type MediaKeysRequirement = "not-allowed" | "optional" | "required";
type MediaSessionAction = "hangup" | "nexttrack" | "pause" | "play" | "previoustrack" | "seekbackward" | "seekforward" | "seekto" | "skipad" | "stop" | "togglecamera" | "togglemicrophone";
type MediaSessionPlaybackState = "none" | "paused" | "playing";
type MediaStreamTrackState = "ended" | "live";
type NavigationType = "back_forward" | "navigate" | "prerender" | "reload";
type NotificationDirection = "auto" | "ltr" | "rtl";
type NotificationPermission = "default" | "denied" | "granted";
type OrientationLockType = "any" | "landscape" | "landscape-primary" | "landscape-secondary" | "natural" | "portrait" | "portrait-primary" | "portrait-secondary";
type OrientationType = "landscape-primary" | "landscape-secondary" | "portrait-primary" | "portrait-secondary";
type OscillatorType = "custom" | "sawtooth" | "sine" | "square" | "triangle";
type OverSampleType = "2x" | "4x" | "none";
type PanningModelType = "HRTF" | "equalpower";
type PaymentComplete = "fail" | "success" | "unknown";
type PermissionName = "geolocation" | "notifications" | "persistent-storage" | "push" | "screen-wake-lock" | "xr-spatial-tracking";
type PermissionState = "denied" | "granted" | "prompt";
type PlaybackDirection = "alternate" | "alternate-reverse" | "normal" | "reverse";
type PositionAlignSetting = "auto" | "center" | "line-left" | "line-right";
type PredefinedColorSpace = "display-p3" | "srgb";
type PremultiplyAlpha = "default" | "none" | "premultiply";
type PresentationStyle = "attachment" | "inline" | "unspecified";
type PublicKeyCredentialType = "public-key";
type PushEncryptionKeyName = "auth" | "p256dh";
type PushPermissionState = "denied" | "granted" | "prompt";
type RTCBundlePolicy = "balanced" | "max-bundle" | "max-compat";
type RTCDataChannelState = "closed" | "closing" | "connecting" | "open";
type RTCDegradationPreference = "balanced" | "maintain-framerate" | "maintain-resolution";
type RTCDtlsTransportState = "closed" | "connected" | "connecting" | "failed" | "new";
type RTCIceCandidateType = "host" | "prflx" | "relay" | "srflx";
type RTCIceComponent = "rtcp" | "rtp";
type RTCIceConnectionState = "checking" | "closed" | "completed" | "connected" | "disconnected" | "failed" | "new";
type RTCIceCredentialType = "password";
type RTCIceGathererState = "complete" | "gathering" | "new";
type RTCIceGatheringState = "complete" | "gathering" | "new";
type RTCIceProtocol = "tcp" | "udp";
type RTCIceTcpCandidateType = "active" | "passive" | "so";
type RTCIceTransportPolicy = "all" | "relay";
type RTCIceTransportState = "checking" | "closed" | "completed" | "connected" | "disconnected" | "failed" | "new";
type RTCPeerConnectionState = "closed" | "connected" | "connecting" | "disconnected" | "failed" | "new";
type RTCPriorityType = "high" | "low" | "medium" | "very-low";
type RTCRtcpMuxPolicy = "require";
type RTCRtpTransceiverDirection = "inactive" | "recvonly" | "sendonly" | "sendrecv" | "stopped";
type RTCSdpType = "answer" | "offer" | "pranswer" | "rollback";
type RTCSignalingState = "closed" | "have-local-offer" | "have-local-pranswer" | "have-remote-offer" | "have-remote-pranswer" | "stable";
type RTCStatsIceCandidatePairState = "failed" | "frozen" | "in-progress" | "inprogress" | "succeeded" | "waiting";
type RTCStatsType = "candidate-pair" | "certificate" | "codec" | "csrc" | "data-channel" | "inbound-rtp" | "local-candidate" | "media-source" | "outbound-rtp" | "peer-connection" | "remote-candidate" | "remote-inbound-rtp" | "remote-outbound-rtp" | "track" | "transport";
type ReadyState = "closed" | "ended" | "open";
type RecordingState = "inactive" | "paused" | "recording";
type ReferrerPolicy = "" | "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
type RemotePlaybackState = "connected" | "connecting" | "disconnected";
type RequestCache = "default" | "force-cache" | "no-cache" | "no-store" | "only-if-cached" | "reload";
type RequestCredentials = "include" | "omit" | "same-origin";
type RequestDestination = "" | "audio" | "audioworklet" | "document" | "embed" | "font" | "frame" | "iframe" | "image" | "manifest" | "object" | "paintworklet" | "report" | "script" | "sharedworker" | "style" | "track" | "video" | "worker" | "xslt";
type RequestMode = "cors" | "navigate" | "no-cors" | "same-origin";
type RequestRedirect = "error" | "follow" | "manual";
type ResidentKeyRequirement = "discouraged" | "preferred" | "required";
type ResizeObserverBoxOptions = "border-box" | "content-box" | "device-pixel-content-box";
type ResizeQuality = "high" | "low" | "medium" | "pixelated";
type ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect";
type ScrollBehavior = "auto" | "smooth";
type ScrollLogicalPosition = "center" | "end" | "nearest" | "start";
type ScrollRestoration = "auto" | "manual";
type ScrollSetting = "" | "up";
type SecurityPolicyViolationEventDisposition = "enforce" | "report";
type SelectionMode = "end" | "preserve" | "select" | "start";
type ServiceWorkerState = "activated" | "activating" | "installed" | "installing" | "parsed" | "redundant";
type ServiceWorkerUpdateViaCache = "all" | "imports" | "none";
type ShadowRootMode = "closed" | "open";
type SlotAssignmentMode = "manual" | "named";
type SpeechSynthesisErrorCode = "audio-busy" | "audio-hardware" | "canceled" | "interrupted" | "invalid-argument" | "language-unavailable" | "network" | "not-allowed" | "synthesis-failed" | "synthesis-unavailable" | "text-too-long" | "voice-unavailable";
type TextTrackKind = "captions" | "chapters" | "descriptions" | "metadata" | "subtitles";
type TextTrackMode = "disabled" | "hidden" | "showing";
type TouchType = "direct" | "stylus";
type TransferFunction = "hlg" | "pq" | "srgb";
type UserVerificationRequirement = "discouraged" | "preferred" | "required";
type VideoFacingModeEnum = "environment" | "left" | "right" | "user";
type VisibilityState = "hidden" | "visible";
type WebGLPowerPreference = "default" | "high-performance" | "low-power";
type WorkerType = "classic" | "module";
type XMLHttpRequestResponseType = "" | "arraybuffer" | "blob" | "document" | "json" | "text";
`;
  libFileMap["lib.dom.iterable.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/////////////////////////////\n/// Window Iterable APIs\n/////////////////////////////\n\ninterface AudioParam {\n    setValueCurveAtTime(values: Iterable<number>, startTime: number, duration: number): AudioParam;\n}\n\ninterface AudioParamMap extends ReadonlyMap<string, AudioParam> {\n}\n\ninterface BaseAudioContext {\n    createIIRFilter(feedforward: Iterable<number>, feedback: Iterable<number>): IIRFilterNode;\n    createPeriodicWave(real: Iterable<number>, imag: Iterable<number>, constraints?: PeriodicWaveConstraints): PeriodicWave;\n}\n\ninterface CSSRuleList {\n    [Symbol.iterator](): IterableIterator<CSSRule>;\n}\n\ninterface CSSStyleDeclaration {\n    [Symbol.iterator](): IterableIterator<string>;\n}\n\ninterface Cache {\n    addAll(requests: Iterable<RequestInfo>): Promise<void>;\n}\n\ninterface CanvasPathDrawingStyles {\n    setLineDash(segments: Iterable<number>): void;\n}\n\ninterface DOMRectList {\n    [Symbol.iterator](): IterableIterator<DOMRect>;\n}\n\ninterface DOMStringList {\n    [Symbol.iterator](): IterableIterator<string>;\n}\n\ninterface DOMTokenList {\n    [Symbol.iterator](): IterableIterator<string>;\n    entries(): IterableIterator<[number, string]>;\n    keys(): IterableIterator<number>;\n    values(): IterableIterator<string>;\n}\n\ninterface DataTransferItemList {\n    [Symbol.iterator](): IterableIterator<DataTransferItem>;\n}\n\ninterface FileList {\n    [Symbol.iterator](): IterableIterator<File>;\n}\n\ninterface FontFaceSet extends Set<FontFace> {\n}\n\ninterface FormData {\n    [Symbol.iterator](): IterableIterator<[string, FormDataEntryValue]>;\n    /** Returns an array of key, value pairs for every entry in the list. */\n    entries(): IterableIterator<[string, FormDataEntryValue]>;\n    /** Returns a list of keys in the list. */\n    keys(): IterableIterator<string>;\n    /** Returns a list of values in the list. */\n    values(): IterableIterator<FormDataEntryValue>;\n}\n\ninterface HTMLAllCollection {\n    [Symbol.iterator](): IterableIterator<Element>;\n}\n\ninterface HTMLCollectionBase {\n    [Symbol.iterator](): IterableIterator<Element>;\n}\n\ninterface HTMLCollectionOf<T extends Element> {\n    [Symbol.iterator](): IterableIterator<T>;\n}\n\ninterface HTMLFormElement {\n    [Symbol.iterator](): IterableIterator<Element>;\n}\n\ninterface HTMLSelectElement {\n    [Symbol.iterator](): IterableIterator<HTMLOptionElement>;\n}\n\ninterface Headers {\n    [Symbol.iterator](): IterableIterator<[string, string]>;\n    /** Returns an iterator allowing to go through all key/value pairs contained in this object. */\n    entries(): IterableIterator<[string, string]>;\n    /** Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */\n    keys(): IterableIterator<string>;\n    /** Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */\n    values(): IterableIterator<string>;\n}\n\ninterface IDBDatabase {\n    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */\n    transaction(storeNames: string | Iterable<string>, mode?: IDBTransactionMode): IDBTransaction;\n}\n\ninterface IDBObjectStore {\n    /**\n     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.\n     *\n     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.\n     */\n    createIndex(name: string, keyPath: string | Iterable<string>, options?: IDBIndexParameters): IDBIndex;\n}\n\ninterface MediaKeyStatusMap {\n    [Symbol.iterator](): IterableIterator<[BufferSource, MediaKeyStatus]>;\n    entries(): IterableIterator<[BufferSource, MediaKeyStatus]>;\n    keys(): IterableIterator<BufferSource>;\n    values(): IterableIterator<MediaKeyStatus>;\n}\n\ninterface MediaList {\n    [Symbol.iterator](): IterableIterator<string>;\n}\n\ninterface MessageEvent<T = any> {\n    /** @deprecated */\n    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: Iterable<MessagePort>): void;\n}\n\ninterface MimeTypeArray {\n    [Symbol.iterator](): IterableIterator<MimeType>;\n}\n\ninterface NamedNodeMap {\n    [Symbol.iterator](): IterableIterator<Attr>;\n}\n\ninterface Navigator {\n    /** Available only in secure contexts. */\n    requestMediaKeySystemAccess(keySystem: string, supportedConfigurations: Iterable<MediaKeySystemConfiguration>): Promise<MediaKeySystemAccess>;\n    vibrate(pattern: Iterable<number>): boolean;\n}\n\ninterface NodeList {\n    [Symbol.iterator](): IterableIterator<Node>;\n    /** Returns an array of key, value pairs for every entry in the list. */\n    entries(): IterableIterator<[number, Node]>;\n    /** Returns an list of keys in the list. */\n    keys(): IterableIterator<number>;\n    /** Returns an list of values in the list. */\n    values(): IterableIterator<Node>;\n}\n\ninterface NodeListOf<TNode extends Node> {\n    [Symbol.iterator](): IterableIterator<TNode>;\n    /** Returns an array of key, value pairs for every entry in the list. */\n    entries(): IterableIterator<[number, TNode]>;\n    /** Returns an list of keys in the list. */\n    keys(): IterableIterator<number>;\n    /** Returns an list of values in the list. */\n    values(): IterableIterator<TNode>;\n}\n\ninterface Plugin {\n    [Symbol.iterator](): IterableIterator<MimeType>;\n}\n\ninterface PluginArray {\n    [Symbol.iterator](): IterableIterator<Plugin>;\n}\n\ninterface RTCStatsReport extends ReadonlyMap<string, any> {\n}\n\ninterface SVGLengthList {\n    [Symbol.iterator](): IterableIterator<SVGLength>;\n}\n\ninterface SVGNumberList {\n    [Symbol.iterator](): IterableIterator<SVGNumber>;\n}\n\ninterface SVGPointList {\n    [Symbol.iterator](): IterableIterator<DOMPoint>;\n}\n\ninterface SVGStringList {\n    [Symbol.iterator](): IterableIterator<string>;\n}\n\ninterface SVGTransformList {\n    [Symbol.iterator](): IterableIterator<SVGTransform>;\n}\n\ninterface SourceBufferList {\n    [Symbol.iterator](): IterableIterator<SourceBuffer>;\n}\n\ninterface SpeechRecognitionResult {\n    [Symbol.iterator](): IterableIterator<SpeechRecognitionAlternative>;\n}\n\ninterface SpeechRecognitionResultList {\n    [Symbol.iterator](): IterableIterator<SpeechRecognitionResult>;\n}\n\ninterface StyleSheetList {\n    [Symbol.iterator](): IterableIterator<CSSStyleSheet>;\n}\n\ninterface SubtleCrypto {\n    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;\n    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair>;\n    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;\n    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKeyPair | CryptoKey>;\n    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;\n    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;\n    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;\n}\n\ninterface TextTrackCueList {\n    [Symbol.iterator](): IterableIterator<TextTrackCue>;\n}\n\ninterface TextTrackList {\n    [Symbol.iterator](): IterableIterator<TextTrack>;\n}\n\ninterface TouchList {\n    [Symbol.iterator](): IterableIterator<Touch>;\n}\n\ninterface URLSearchParams {\n    [Symbol.iterator](): IterableIterator<[string, string]>;\n    /** Returns an array of key, value pairs for every entry in the search params. */\n    entries(): IterableIterator<[string, string]>;\n    /** Returns a list of keys in the search params. */\n    keys(): IterableIterator<string>;\n    /** Returns a list of values in the search params. */\n    values(): IterableIterator<string>;\n}\n\ninterface WEBGL_draw_buffers {\n    drawBuffersWEBGL(buffers: Iterable<GLenum>): void;\n}\n\ninterface WebGL2RenderingContextBase {\n    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLfloat>, srcOffset?: GLuint): void;\n    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLint>, srcOffset?: GLuint): void;\n    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLuint>, srcOffset?: GLuint): void;\n    drawBuffers(buffers: Iterable<GLenum>): void;\n    getActiveUniforms(program: WebGLProgram, uniformIndices: Iterable<GLuint>, pname: GLenum): any;\n    getUniformIndices(program: WebGLProgram, uniformNames: Iterable<string>): Iterable<GLuint> | null;\n    invalidateFramebuffer(target: GLenum, attachments: Iterable<GLenum>): void;\n    invalidateSubFramebuffer(target: GLenum, attachments: Iterable<GLenum>, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;\n    transformFeedbackVaryings(program: WebGLProgram, varyings: Iterable<string>, bufferMode: GLenum): void;\n    uniform1uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform2uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform3uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform4uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    vertexAttribI4iv(index: GLuint, values: Iterable<GLint>): void;\n    vertexAttribI4uiv(index: GLuint, values: Iterable<GLuint>): void;\n}\n\ninterface WebGL2RenderingContextOverloads {\n    uniform1fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform1iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform2fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform2iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform3fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform3iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform4fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform4iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n}\n\ninterface WebGLRenderingContextBase {\n    vertexAttrib1fv(index: GLuint, values: Iterable<GLfloat>): void;\n    vertexAttrib2fv(index: GLuint, values: Iterable<GLfloat>): void;\n    vertexAttrib3fv(index: GLuint, values: Iterable<GLfloat>): void;\n    vertexAttrib4fv(index: GLuint, values: Iterable<GLfloat>): void;\n}\n\ninterface WebGLRenderingContextOverloads {\n    uniform1fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform1iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniform2fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform2iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniform3fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform3iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniform4fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform4iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;\n    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;\n    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;\n}\n';
  libFileMap["lib.es2015.collection.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface Map<K, V> {\n    clear(): void;\n    delete(key: K): boolean;\n    forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    set(key: K, value: V): this;\n    readonly size: number;\n}\n\ninterface MapConstructor {\n    new(): Map<any, any>;\n    new<K, V>(entries?: readonly (readonly [K, V])[] | null): Map<K, V>;\n    readonly prototype: Map<any, any>;\n}\ndeclare var Map: MapConstructor;\n\ninterface ReadonlyMap<K, V> {\n    forEach(callbackfn: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: any): void;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    readonly size: number;\n}\n\ninterface WeakMap<K extends object, V> {\n    delete(key: K): boolean;\n    get(key: K): V | undefined;\n    has(key: K): boolean;\n    set(key: K, value: V): this;\n}\n\ninterface WeakMapConstructor {\n    new <K extends object = object, V = any>(entries?: readonly [K, V][] | null): WeakMap<K, V>;\n    readonly prototype: WeakMap<object, any>;\n}\ndeclare var WeakMap: WeakMapConstructor;\n\ninterface Set<T> {\n    add(value: T): this;\n    clear(): void;\n    delete(value: T): boolean;\n    forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    readonly size: number;\n}\n\ninterface SetConstructor {\n    new <T = any>(values?: readonly T[] | null): Set<T>;\n    readonly prototype: Set<any>;\n}\ndeclare var Set: SetConstructor;\n\ninterface ReadonlySet<T> {\n    forEach(callbackfn: (value: T, value2: T, set: ReadonlySet<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    readonly size: number;\n}\n\ninterface WeakSet<T extends object> {\n    add(value: T): this;\n    delete(value: T): boolean;\n    has(value: T): boolean;\n}\n\ninterface WeakSetConstructor {\n    new <T extends object = object>(values?: readonly T[] | null): WeakSet<T>;\n    readonly prototype: WeakSet<object>;\n}\ndeclare var WeakSet: WeakSetConstructor;\n';
  libFileMap["lib.es2015.core.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface Array<T> {\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find<S extends T>(predicate: (this: void, value: T, index: number, obj: T[]) => value is S, thisArg?: any): S | undefined;\n    find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): number;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: T, start?: number, end?: number): this;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n}\n\ninterface ArrayConstructor {\n    /**\n     * Creates an array from an array-like object.\n     * @param arrayLike An array-like object to convert to an array.\n     */\n    from<T>(arrayLike: ArrayLike<T>): T[];\n\n    /**\n     * Creates an array from an iterable object.\n     * @param arrayLike An array-like object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of<T>(...items: T[]): T[];\n}\n\ninterface DateConstructor {\n    new (value: number | string | Date): Date;\n}\n\ninterface Function {\n    /**\n     * Returns the name of the function. Function names are read-only and can not be changed.\n     */\n    readonly name: string;\n}\n\ninterface Math {\n    /**\n     * Returns the number of leading zero bits in the 32-bit binary representation of a number.\n     * @param x A numeric expression.\n     */\n    clz32(x: number): number;\n\n    /**\n     * Returns the result of 32-bit multiplication of two numbers.\n     * @param x First number\n     * @param y Second number\n     */\n    imul(x: number, y: number): number;\n\n    /**\n     * Returns the sign of the x, indicating whether x is positive, negative or zero.\n     * @param x The numeric expression to test\n     */\n    sign(x: number): number;\n\n    /**\n     * Returns the base 10 logarithm of a number.\n     * @param x A numeric expression.\n     */\n    log10(x: number): number;\n\n    /**\n     * Returns the base 2 logarithm of a number.\n     * @param x A numeric expression.\n     */\n    log2(x: number): number;\n\n    /**\n     * Returns the natural logarithm of 1 + x.\n     * @param x A numeric expression.\n     */\n    log1p(x: number): number;\n\n    /**\n     * Returns the result of (e^x - 1), which is an implementation-dependent approximation to\n     * subtracting 1 from the exponential function of x (e raised to the power of x, where e\n     * is the base of the natural logarithms).\n     * @param x A numeric expression.\n     */\n    expm1(x: number): number;\n\n    /**\n     * Returns the hyperbolic cosine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    cosh(x: number): number;\n\n    /**\n     * Returns the hyperbolic sine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    sinh(x: number): number;\n\n    /**\n     * Returns the hyperbolic tangent of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    tanh(x: number): number;\n\n    /**\n     * Returns the inverse hyperbolic cosine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    acosh(x: number): number;\n\n    /**\n     * Returns the inverse hyperbolic sine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    asinh(x: number): number;\n\n    /**\n     * Returns the inverse hyperbolic tangent of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    atanh(x: number): number;\n\n    /**\n     * Returns the square root of the sum of squares of its arguments.\n     * @param values Values to compute the square root for.\n     *     If no arguments are passed, the result is +0.\n     *     If there is only one argument, the result is the absolute value.\n     *     If any argument is +Infinity or -Infinity, the result is +Infinity.\n     *     If any argument is NaN, the result is NaN.\n     *     If all arguments are either +0 or \u22120, the result is +0.\n     */\n    hypot(...values: number[]): number;\n\n    /**\n     * Returns the integral part of the a numeric expression, x, removing any fractional digits.\n     * If x is already an integer, the result is x.\n     * @param x A numeric expression.\n     */\n    trunc(x: number): number;\n\n    /**\n     * Returns the nearest single precision float representation of a number.\n     * @param x A numeric expression.\n     */\n    fround(x: number): number;\n\n    /**\n     * Returns an implementation-dependent approximation to the cube root of number.\n     * @param x A numeric expression.\n     */\n    cbrt(x: number): number;\n}\n\ninterface NumberConstructor {\n    /**\n     * The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1\n     * that is representable as a Number value, which is approximately:\n     * 2.2204460492503130808472633361816 x 10\u200D\u2212\u200D16.\n     */\n    readonly EPSILON: number;\n\n    /**\n     * Returns true if passed value is finite.\n     * Unlike the global isFinite, Number.isFinite doesn\'t forcibly convert the parameter to a\n     * number. Only finite values of the type number, result in true.\n     * @param number A numeric value.\n     */\n    isFinite(number: unknown): boolean;\n\n    /**\n     * Returns true if the value passed is an integer, false otherwise.\n     * @param number A numeric value.\n     */\n    isInteger(number: unknown): boolean;\n\n    /**\n     * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a\n     * number). Unlike the global isNaN(), Number.isNaN() doesn\'t forcefully convert the parameter\n     * to a number. Only values of the type number, that are also NaN, result in true.\n     * @param number A numeric value.\n     */\n    isNaN(number: unknown): boolean;\n\n    /**\n     * Returns true if the value passed is a safe integer.\n     * @param number A numeric value.\n     */\n    isSafeInteger(number: unknown): boolean;\n\n    /**\n     * The value of the largest integer n such that n and n + 1 are both exactly representable as\n     * a Number value.\n     * The value of Number.MAX_SAFE_INTEGER is 9007199254740991 2^53 \u2212 1.\n     */\n    readonly MAX_SAFE_INTEGER: number;\n\n    /**\n     * The value of the smallest integer n such that n and n \u2212 1 are both exactly representable as\n     * a Number value.\n     * The value of Number.MIN_SAFE_INTEGER is \u22129007199254740991 (\u2212(2^53 \u2212 1)).\n     */\n    readonly MIN_SAFE_INTEGER: number;\n\n    /**\n     * Converts a string to a floating-point number.\n     * @param string A string that contains a floating-point number.\n     */\n    parseFloat(string: string): number;\n\n    /**\n     * Converts A string to an integer.\n     * @param string A string to convert into a number.\n     * @param radix A value between 2 and 36 that specifies the base of the number in `string`.\n     * If this argument is not supplied, strings with a prefix of \'0x\' are considered hexadecimal.\n     * All other strings are considered decimal.\n     */\n    parseInt(string: string, radix?: number): number;\n}\n\ninterface ObjectConstructor {\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param source The source object from which to copy properties.\n     */\n    assign<T, U>(target: T, source: U): T & U;\n\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param source1 The first source object from which to copy properties.\n     * @param source2 The second source object from which to copy properties.\n     */\n    assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;\n\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param source1 The first source object from which to copy properties.\n     * @param source2 The second source object from which to copy properties.\n     * @param source3 The third source object from which to copy properties.\n     */\n    assign<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;\n\n    /**\n     * Copy the values of all of the enumerable own properties from one or more source objects to a\n     * target object. Returns the target object.\n     * @param target The target object to copy to.\n     * @param sources One or more source objects from which to copy properties\n     */\n    assign(target: object, ...sources: any[]): any;\n\n    /**\n     * Returns an array of all symbol properties found directly on object o.\n     * @param o Object to retrieve the symbols from.\n     */\n    getOwnPropertySymbols(o: any): symbol[];\n\n    /**\n     * Returns the names of the enumerable string properties and methods of an object.\n     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n     */\n    keys(o: {}): string[];\n\n    /**\n     * Returns true if the values are the same value, false otherwise.\n     * @param value1 The first value.\n     * @param value2 The second value.\n     */\n    is(value1: any, value2: any): boolean;\n\n    /**\n     * Sets the prototype of a specified object o to object proto or null. Returns the object o.\n     * @param o The object to change its prototype.\n     * @param proto The value of the new prototype or null.\n     */\n    setPrototypeOf(o: any, proto: object | null): any;\n}\n\ninterface ReadonlyArray<T> {\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find<S extends T>(predicate: (this: void, value: T, index: number, obj: readonly T[]) => value is S, thisArg?: any): S | undefined;\n    find(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): T | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: T, index: number, obj: readonly T[]) => unknown, thisArg?: any): number;\n}\n\ninterface RegExp {\n    /**\n     * Returns a string indicating the flags of the regular expression in question. This field is read-only.\n     * The characters in this string are sequenced and concatenated in the following order:\n     *\n     *    - "g" for global\n     *    - "i" for ignoreCase\n     *    - "m" for multiline\n     *    - "u" for unicode\n     *    - "y" for sticky\n     *\n     * If no flags are set, the value is the empty string.\n     */\n    readonly flags: string;\n\n    /**\n     * Returns a Boolean value indicating the state of the sticky flag (y) used with a regular\n     * expression. Default is false. Read-only.\n     */\n    readonly sticky: boolean;\n\n    /**\n     * Returns a Boolean value indicating the state of the Unicode flag (u) used with a regular\n     * expression. Default is false. Read-only.\n     */\n    readonly unicode: boolean;\n}\n\ninterface RegExpConstructor {\n    new (pattern: RegExp | string, flags?: string): RegExp;\n    (pattern: RegExp | string, flags?: string): RegExp;\n}\n\ninterface String {\n    /**\n     * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point\n     * value of the UTF-16 encoded code point starting at the string element at position pos in\n     * the String resulting from converting this object to a String.\n     * If there is no element at that position, the result is undefined.\n     * If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.\n     */\n    codePointAt(pos: number): number | undefined;\n\n    /**\n     * Returns true if searchString appears as a substring of the result of converting this\n     * object to a String, at one or more positions that are\n     * greater than or equal to position; otherwise, returns false.\n     * @param searchString search string\n     * @param position If position is undefined, 0 is assumed, so as to search all of the String.\n     */\n    includes(searchString: string, position?: number): boolean;\n\n    /**\n     * Returns true if the sequence of elements of searchString converted to a String is the\n     * same as the corresponding elements of this object (converted to a String) starting at\n     * endPosition \u2013 length(this). Otherwise returns false.\n     */\n    endsWith(searchString: string, endPosition?: number): boolean;\n\n    /**\n     * Returns the String value result of normalizing the string into the normalization form\n     * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n     * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default\n     * is "NFC"\n     */\n    normalize(form: "NFC" | "NFD" | "NFKC" | "NFKD"): string;\n\n    /**\n     * Returns the String value result of normalizing the string into the normalization form\n     * named by form as specified in Unicode Standard Annex #15, Unicode Normalization Forms.\n     * @param form Applicable values: "NFC", "NFD", "NFKC", or "NFKD", If not specified default\n     * is "NFC"\n     */\n    normalize(form?: string): string;\n\n    /**\n     * Returns a String value that is made from count copies appended together. If count is 0,\n     * the empty string is returned.\n     * @param count number of copies to append\n     */\n    repeat(count: number): string;\n\n    /**\n     * Returns true if the sequence of elements of searchString converted to a String is the\n     * same as the corresponding elements of this object (converted to a String) starting at\n     * position. Otherwise returns false.\n     */\n    startsWith(searchString: string, position?: number): boolean;\n\n    /**\n     * Returns an `<a>` HTML anchor element and sets the name attribute to the text value\n     * @deprecated A legacy feature for browser compatibility\n     * @param name\n     */\n    anchor(name: string): string;\n\n    /**\n     * Returns a `<big>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    big(): string;\n\n    /**\n     * Returns a `<blink>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    blink(): string;\n\n    /**\n     * Returns a `<b>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    bold(): string;\n\n    /**\n     * Returns a `<tt>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    fixed(): string;\n\n    /**\n     * Returns a `<font>` HTML element and sets the color attribute value\n     * @deprecated A legacy feature for browser compatibility\n     */\n    fontcolor(color: string): string;\n\n    /**\n     * Returns a `<font>` HTML element and sets the size attribute value\n     * @deprecated A legacy feature for browser compatibility\n     */\n    fontsize(size: number): string;\n\n    /**\n     * Returns a `<font>` HTML element and sets the size attribute value\n     * @deprecated A legacy feature for browser compatibility\n     */\n    fontsize(size: string): string;\n\n    /**\n     * Returns an `<i>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    italics(): string;\n\n    /**\n     * Returns an `<a>` HTML element and sets the href attribute value\n     * @deprecated A legacy feature for browser compatibility\n     */\n    link(url: string): string;\n\n    /**\n     * Returns a `<small>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    small(): string;\n\n    /**\n     * Returns a `<strike>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    strike(): string;\n\n    /**\n     * Returns a `<sub>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    sub(): string;\n\n    /**\n     * Returns a `<sup>` HTML element\n     * @deprecated A legacy feature for browser compatibility\n     */\n    sup(): string;\n}\n\ninterface StringConstructor {\n    /**\n     * Return the String value whose elements are, in order, the elements in the List elements.\n     * If length is 0, the empty string is returned.\n     */\n    fromCodePoint(...codePoints: number[]): string;\n\n    /**\n     * String.raw is usually used as a tag function of a Tagged Template String. When called as\n     * such, the first argument will be a well formed template call site object and the rest\n     * parameter will contain the substitution values. It can also be called directly, for example,\n     * to interleave strings and values from your own tag function, and in this case the only thing\n     * it needs from the first argument is the raw property.\n     * @param template A well-formed template string call site representation.\n     * @param substitutions A set of substitution values.\n     */\n    raw(template: { raw: readonly string[] | ArrayLike<string>}, ...substitutions: any[]): string;\n}\n';
  libFileMap["lib.es2015.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es5" />\n/// <reference lib="es2015.core" />\n/// <reference lib="es2015.collection" />\n/// <reference lib="es2015.iterable" />\n/// <reference lib="es2015.generator" />\n/// <reference lib="es2015.promise" />\n/// <reference lib="es2015.proxy" />\n/// <reference lib="es2015.reflect" />\n/// <reference lib="es2015.symbol" />\n/// <reference lib="es2015.symbol.wellknown" />\n';
  libFileMap["lib.es2015.generator.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


/// <reference lib="es2015.iterable" />

interface Generator<T = unknown, TReturn = any, TNext = unknown> extends Iterator<T, TReturn, TNext> {
    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
    next(...args: [] | [TNext]): IteratorResult<T, TReturn>;
    return(value: TReturn): IteratorResult<T, TReturn>;
    throw(e: any): IteratorResult<T, TReturn>;
    [Symbol.iterator](): Generator<T, TReturn, TNext>;
}

interface GeneratorFunction {
    /**
     * Creates a new Generator object.
     * @param args A list of arguments the function accepts.
     */
    new (...args: any[]): Generator;
    /**
     * Creates a new Generator object.
     * @param args A list of arguments the function accepts.
     */
    (...args: any[]): Generator;
    /**
     * The length of the arguments.
     */
    readonly length: number;
    /**
     * Returns the name of the function.
     */
    readonly name: string;
    /**
     * A reference to the prototype.
     */
    readonly prototype: Generator;
}

interface GeneratorFunctionConstructor {
    /**
     * Creates a new Generator function.
     * @param args A list of arguments the function accepts.
     */
    new (...args: string[]): GeneratorFunction;
    /**
     * Creates a new Generator function.
     * @param args A list of arguments the function accepts.
     */
    (...args: string[]): GeneratorFunction;
    /**
     * The length of the arguments.
     */
    readonly length: number;
    /**
     * Returns the name of the function.
     */
    readonly name: string;
    /**
     * A reference to the prototype.
     */
    readonly prototype: GeneratorFunction;
}
`;
  libFileMap["lib.es2015.iterable.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


/// <reference lib="es2015.symbol" />

interface SymbolConstructor {
    /**
     * A method that returns the default iterator for an object. Called by the semantics of the
     * for-of statement.
     */
    readonly iterator: unique symbol;
}

interface IteratorYieldResult<TYield> {
    done?: false;
    value: TYield;
}

interface IteratorReturnResult<TReturn> {
    done: true;
    value: TReturn;
}

type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;

interface Iterator<T, TReturn = any, TNext = undefined> {
    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
    next(...args: [] | [TNext]): IteratorResult<T, TReturn>;
    return?(value?: TReturn): IteratorResult<T, TReturn>;
    throw?(e?: any): IteratorResult<T, TReturn>;
}

interface Iterable<T> {
    [Symbol.iterator](): Iterator<T>;
}

interface IterableIterator<T> extends Iterator<T> {
    [Symbol.iterator](): IterableIterator<T>;
}

interface Array<T> {
    /** Iterator */
    [Symbol.iterator](): IterableIterator<T>;

    /**
     * Returns an iterable of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, T]>;

    /**
     * Returns an iterable of keys in the array
     */
    keys(): IterableIterator<number>;

    /**
     * Returns an iterable of values in the array
     */
    values(): IterableIterator<T>;
}

interface ArrayConstructor {
    /**
     * Creates an array from an iterable object.
     * @param iterable An iterable object to convert to an array.
     */
    from<T>(iterable: Iterable<T> | ArrayLike<T>): T[];

    /**
     * Creates an array from an iterable object.
     * @param iterable An iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from<T, U>(iterable: Iterable<T> | ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): U[];
}

interface ReadonlyArray<T> {
    /** Iterator of values in the array. */
    [Symbol.iterator](): IterableIterator<T>;

    /**
     * Returns an iterable of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, T]>;

    /**
     * Returns an iterable of keys in the array
     */
    keys(): IterableIterator<number>;

    /**
     * Returns an iterable of values in the array
     */
    values(): IterableIterator<T>;
}

interface IArguments {
    /** Iterator */
    [Symbol.iterator](): IterableIterator<any>;
}

interface Map<K, V> {
    /** Returns an iterable of entries in the map. */
    [Symbol.iterator](): IterableIterator<[K, V]>;

    /**
     * Returns an iterable of key, value pairs for every entry in the map.
     */
    entries(): IterableIterator<[K, V]>;

    /**
     * Returns an iterable of keys in the map
     */
    keys(): IterableIterator<K>;

    /**
     * Returns an iterable of values in the map
     */
    values(): IterableIterator<V>;
}

interface ReadonlyMap<K, V> {
    /** Returns an iterable of entries in the map. */
    [Symbol.iterator](): IterableIterator<[K, V]>;

    /**
     * Returns an iterable of key, value pairs for every entry in the map.
     */
    entries(): IterableIterator<[K, V]>;

    /**
     * Returns an iterable of keys in the map
     */
    keys(): IterableIterator<K>;

    /**
     * Returns an iterable of values in the map
     */
    values(): IterableIterator<V>;
}

interface MapConstructor {
    new <K, V>(iterable: Iterable<readonly [K, V]>): Map<K, V>;
}

interface WeakMap<K extends object, V> { }

interface WeakMapConstructor {
    new <K extends object, V>(iterable: Iterable<readonly [K, V]>): WeakMap<K, V>;
}

interface Set<T> {
    /** Iterates over values in the set. */
    [Symbol.iterator](): IterableIterator<T>;
    /**
     * Returns an iterable of [v,v] pairs for every value \`v\` in the set.
     */
    entries(): IterableIterator<[T, T]>;
    /**
     * Despite its name, returns an iterable of the values in the set.
     */
    keys(): IterableIterator<T>;

    /**
     * Returns an iterable of values in the set.
     */
    values(): IterableIterator<T>;
}

interface ReadonlySet<T> {
    /** Iterates over values in the set. */
    [Symbol.iterator](): IterableIterator<T>;

    /**
     * Returns an iterable of [v,v] pairs for every value \`v\` in the set.
     */
    entries(): IterableIterator<[T, T]>;

    /**
     * Despite its name, returns an iterable of the values in the set.
     */
    keys(): IterableIterator<T>;

    /**
     * Returns an iterable of values in the set.
     */
    values(): IterableIterator<T>;
}

interface SetConstructor {
    new <T>(iterable?: Iterable<T> | null): Set<T>;
}

interface WeakSet<T extends object> { }

interface WeakSetConstructor {
    new <T extends object = object>(iterable: Iterable<T>): WeakSet<T>;
}

interface Promise<T> { }

interface PromiseConstructor {
    /**
     * Creates a Promise that is resolved with an array of results when all of the provided Promises
     * resolve, or rejected when any Promise is rejected.
     * @param values An iterable of Promises.
     * @returns A new Promise.
     */
    all<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>;

    /**
     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved
     * or rejected.
     * @param values An iterable of Promises.
     * @returns A new Promise.
     */
    race<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>>;
}

interface String {
    /** Iterator */
    [Symbol.iterator](): IterableIterator<string>;
}

interface Int8Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Int8ArrayConstructor {
    new (elements: Iterable<number>): Int8Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Array;
}

interface Uint8Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Uint8ArrayConstructor {
    new (elements: Iterable<number>): Uint8Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8Array;
}

interface Uint8ClampedArray {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;

    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;

    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Uint8ClampedArrayConstructor {
    new (elements: Iterable<number>): Uint8ClampedArray;


    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint8ClampedArray;
}

interface Int16Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;

    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;

    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Int16ArrayConstructor {
    new (elements: Iterable<number>): Int16Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int16Array;
}

interface Uint16Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Uint16ArrayConstructor {
    new (elements: Iterable<number>): Uint16Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint16Array;
}

interface Int32Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Int32ArrayConstructor {
    new (elements: Iterable<number>): Int32Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int32Array;
}

interface Uint32Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Uint32ArrayConstructor {
    new (elements: Iterable<number>): Uint32Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Uint32Array;
}

interface Float32Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Float32ArrayConstructor {
    new (elements: Iterable<number>): Float32Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float32Array;
}

interface Float64Array {
    [Symbol.iterator](): IterableIterator<number>;
    /**
     * Returns an array of key, value pairs for every entry in the array
     */
    entries(): IterableIterator<[number, number]>;
    /**
     * Returns an list of keys in the array
     */
    keys(): IterableIterator<number>;
    /**
     * Returns an list of values in the array
     */
    values(): IterableIterator<number>;
}

interface Float64ArrayConstructor {
    new (elements: Iterable<number>): Float64Array;

    /**
     * Creates an array from an array-like or iterable object.
     * @param arrayLike An array-like or iterable object to convert to an array.
     * @param mapfn A mapping function to call on every element of the array.
     * @param thisArg Value of 'this' used to invoke the mapfn.
     */
    from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Float64Array;
}
`;
  libFileMap["lib.es2015.promise.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface PromiseConstructor {\n    /**\n     * A reference to the prototype.\n     */\n    readonly prototype: Promise<any>;\n\n    /**\n     * Creates a new Promise.\n     * @param executor A callback used to initialize the promise. This callback is passed two arguments:\n     * a resolve callback used to resolve the promise with a value or the result of another promise,\n     * and a reject callback used to reject the promise with a provided reason or error.\n     */\n    new <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T extends readonly unknown[] | []>(values: T): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>;\n\n    // see: lib.es2015.iterable.d.ts\n    // all<T>(values: Iterable<T | PromiseLike<T>>): Promise<T[]>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T extends readonly unknown[] | []>(values: T): Promise<Awaited<T[number]>>;\n\n    // see: lib.es2015.iterable.d.ts\n    // race<T>(values: Iterable<T>): Promise<T extends PromiseLike<infer U> ? U : T>;\n\n    /**\n     * Creates a new rejected promise for the provided reason.\n     * @param reason The reason the promise was rejected.\n     * @returns A new rejected Promise.\n     */\n    reject<T = never>(reason?: any): Promise<T>;\n\n    /**\n     * Creates a new resolved promise.\n     * @returns A resolved promise.\n     */\n    resolve(): Promise<void>;\n\n    /**\n     * Creates a new resolved promise for the provided value.\n     * @param value A promise.\n     * @returns A promise whose internal state matches the provided promise.\n     */\n    resolve<T>(value: T | PromiseLike<T>): Promise<T>;\n}\n\ndeclare var Promise: PromiseConstructor;\n';
  libFileMap["lib.es2015.proxy.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface ProxyHandler<T extends object> {\n    apply?(target: T, thisArg: any, argArray: any[]): any;\n    construct?(target: T, argArray: any[], newTarget: Function): object;\n    defineProperty?(target: T, p: string | symbol, attributes: PropertyDescriptor): boolean;\n    deleteProperty?(target: T, p: string | symbol): boolean;\n    get?(target: T, p: string | symbol, receiver: any): any;\n    getOwnPropertyDescriptor?(target: T, p: string | symbol): PropertyDescriptor | undefined;\n    getPrototypeOf?(target: T): object | null;\n    has?(target: T, p: string | symbol): boolean;\n    isExtensible?(target: T): boolean;\n    ownKeys?(target: T): ArrayLike<string | symbol>;\n    preventExtensions?(target: T): boolean;\n    set?(target: T, p: string | symbol, value: any, receiver: any): boolean;\n    setPrototypeOf?(target: T, v: object | null): boolean;\n}\n\ninterface ProxyConstructor {\n    revocable<T extends object>(target: T, handler: ProxyHandler<T>): { proxy: T; revoke: () => void; };\n    new <T extends object>(target: T, handler: ProxyHandler<T>): T;\n}\ndeclare var Proxy: ProxyConstructor;\n';
  libFileMap["lib.es2015.reflect.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ndeclare namespace Reflect {\n    /**\n     * Calls the function with the specified object as the this value\n     * and the elements of specified array as the arguments.\n     * @param target The function to call.\n     * @param thisArgument The object to be used as the this object.\n     * @param argumentsList An array of argument values to be passed to the function.\n     */\n    function apply(target: Function, thisArgument: any, argumentsList: ArrayLike<any>): any;\n\n    /**\n     * Constructs the target with the elements of specified array as the arguments\n     * and the specified constructor as the `new.target` value.\n     * @param target The constructor to invoke.\n     * @param argumentsList An array of argument values to be passed to the constructor.\n     * @param newTarget The constructor to be used as the `new.target` object.\n     */\n    function construct(target: Function, argumentsList: ArrayLike<any>, newTarget?: Function): any;\n\n    /**\n     * Adds a property to an object, or modifies attributes of an existing property.\n     * @param target Object on which to add or modify the property. This can be a native JavaScript object\n     *        (that is, a user-defined object or a built in object) or a DOM object.\n     * @param propertyKey The property name.\n     * @param attributes Descriptor for the property. It can be for a data property or an accessor property.\n     */\n    function defineProperty(target: object, propertyKey: PropertyKey, attributes: PropertyDescriptor): boolean;\n\n    /**\n     * Removes a property from an object, equivalent to `delete target[propertyKey]`,\n     * except it won\'t throw if `target[propertyKey]` is non-configurable.\n     * @param target Object from which to remove the own property.\n     * @param propertyKey The property name.\n     */\n    function deleteProperty(target: object, propertyKey: PropertyKey): boolean;\n\n    /**\n     * Gets the property of target, equivalent to `target[propertyKey]` when `receiver === target`.\n     * @param target Object that contains the property on itself or in its prototype chain.\n     * @param propertyKey The property name.\n     * @param receiver The reference to use as the `this` value in the getter function,\n     *        if `target[propertyKey]` is an accessor property.\n     */\n    function get(target: object, propertyKey: PropertyKey, receiver?: any): any;\n\n    /**\n     * Gets the own property descriptor of the specified object.\n     * An own property descriptor is one that is defined directly on the object and is not inherited from the object\'s prototype.\n     * @param target Object that contains the property.\n     * @param propertyKey The property name.\n     */\n    function getOwnPropertyDescriptor(target: object, propertyKey: PropertyKey): PropertyDescriptor | undefined;\n\n    /**\n     * Returns the prototype of an object.\n     * @param target The object that references the prototype.\n     */\n    function getPrototypeOf(target: object): object | null;\n\n    /**\n     * Equivalent to `propertyKey in target`.\n     * @param target Object that contains the property on itself or in its prototype chain.\n     * @param propertyKey Name of the property.\n     */\n    function has(target: object, propertyKey: PropertyKey): boolean;\n\n    /**\n     * Returns a value that indicates whether new properties can be added to an object.\n     * @param target Object to test.\n     */\n    function isExtensible(target: object): boolean;\n\n    /**\n     * Returns the string and symbol keys of the own properties of an object. The own properties of an object\n     * are those that are defined directly on that object, and are not inherited from the object\'s prototype.\n     * @param target Object that contains the own properties.\n     */\n    function ownKeys(target: object): (string | symbol)[];\n\n    /**\n     * Prevents the addition of new properties to an object.\n     * @param target Object to make non-extensible.\n     * @return Whether the object has been made non-extensible.\n     */\n    function preventExtensions(target: object): boolean;\n\n    /**\n     * Sets the property of target, equivalent to `target[propertyKey] = value` when `receiver === target`.\n     * @param target Object that contains the property on itself or in its prototype chain.\n     * @param propertyKey Name of the property.\n     * @param receiver The reference to use as the `this` value in the setter function,\n     *        if `target[propertyKey]` is an accessor property.\n     */\n    function set(target: object, propertyKey: PropertyKey, value: any, receiver?: any): boolean;\n\n    /**\n     * Sets the prototype of a specified object o to object proto or null.\n     * @param target The object to change its prototype.\n     * @param proto The value of the new prototype or null.\n     * @return Whether setting the prototype was successful.\n     */\n    function setPrototypeOf(target: object, proto: object | null): boolean;\n}\n';
  libFileMap["lib.es2015.symbol.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface SymbolConstructor {\n    /**\n     * A reference to the prototype.\n     */\n    readonly prototype: Symbol;\n\n    /**\n     * Returns a new unique Symbol value.\n     * @param  description Description of the new Symbol object.\n     */\n    (description?: string | number): symbol;\n\n    /**\n     * Returns a Symbol object from the global symbol registry matching the given key if found.\n     * Otherwise, returns a new symbol with this key.\n     * @param key key to search for.\n     */\n    for(key: string): symbol;\n\n    /**\n     * Returns a key from the global symbol registry matching the given Symbol if found.\n     * Otherwise, returns a undefined.\n     * @param sym Symbol to find the key for.\n     */\n    keyFor(sym: symbol): string | undefined;\n}\n\ndeclare var Symbol: SymbolConstructor;';
  libFileMap["lib.es2015.symbol.wellknown.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


/// <reference lib="es2015.symbol" />

interface SymbolConstructor {
    /**
     * A method that determines if a constructor object recognizes an object as one of the
     * constructor\u2019s instances. Called by the semantics of the instanceof operator.
     */
    readonly hasInstance: unique symbol;

    /**
     * A Boolean value that if true indicates that an object should flatten to its array elements
     * by Array.prototype.concat.
     */
    readonly isConcatSpreadable: unique symbol;

    /**
     * A regular expression method that matches the regular expression against a string. Called
     * by the String.prototype.match method.
     */
    readonly match: unique symbol;

    /**
     * A regular expression method that replaces matched substrings of a string. Called by the
     * String.prototype.replace method.
     */
    readonly replace: unique symbol;

    /**
     * A regular expression method that returns the index within a string that matches the
     * regular expression. Called by the String.prototype.search method.
     */
    readonly search: unique symbol;

    /**
     * A function valued property that is the constructor function that is used to create
     * derived objects.
     */
    readonly species: unique symbol;

    /**
     * A regular expression method that splits a string at the indices that match the regular
     * expression. Called by the String.prototype.split method.
     */
    readonly split: unique symbol;

    /**
     * A method that converts an object to a corresponding primitive value.
     * Called by the ToPrimitive abstract operation.
     */
    readonly toPrimitive: unique symbol;

    /**
     * A String value that is used in the creation of the default string description of an object.
     * Called by the built-in method Object.prototype.toString.
     */
    readonly toStringTag: unique symbol;

    /**
     * An Object whose own property names are property names that are excluded from the 'with'
     * environment bindings of the associated objects.
     */
    readonly unscopables: unique symbol;
}

interface Symbol {
    /**
     * Converts a Symbol object to a symbol.
     */
    [Symbol.toPrimitive](hint: string): symbol;

    readonly [Symbol.toStringTag]: string;
}

interface Array<T> {
    /**
     * Returns an object whose properties have the value 'true'
     * when they will be absent when used in a 'with' statement.
     */
    [Symbol.unscopables](): {
        copyWithin: boolean;
        entries: boolean;
        fill: boolean;
        find: boolean;
        findIndex: boolean;
        keys: boolean;
        values: boolean;
    };
}

interface Date {
    /**
     * Converts a Date object to a string.
     */
    [Symbol.toPrimitive](hint: "default"): string;
    /**
     * Converts a Date object to a string.
     */
    [Symbol.toPrimitive](hint: "string"): string;
    /**
     * Converts a Date object to a number.
     */
    [Symbol.toPrimitive](hint: "number"): number;
    /**
     * Converts a Date object to a string or number.
     *
     * @param hint The strings "number", "string", or "default" to specify what primitive to return.
     *
     * @throws {TypeError} If 'hint' was given something other than "number", "string", or "default".
     * @returns A number if 'hint' was "number", a string if 'hint' was "string" or "default".
     */
    [Symbol.toPrimitive](hint: string): string | number;
}

interface Map<K, V> {
    readonly [Symbol.toStringTag]: string;
}

interface WeakMap<K extends object, V> {
    readonly [Symbol.toStringTag]: string;
}

interface Set<T> {
    readonly [Symbol.toStringTag]: string;
}

interface WeakSet<T extends object> {
    readonly [Symbol.toStringTag]: string;
}

interface JSON {
    readonly [Symbol.toStringTag]: string;
}

interface Function {
    /**
     * Determines whether the given value inherits from this function if this function was used
     * as a constructor function.
     *
     * A constructor function can control which objects are recognized as its instances by
     * 'instanceof' by overriding this method.
     */
    [Symbol.hasInstance](value: any): boolean;
}

interface GeneratorFunction {
    readonly [Symbol.toStringTag]: string;
}

interface Math {
    readonly [Symbol.toStringTag]: string;
}

interface Promise<T> {
    readonly [Symbol.toStringTag]: string;
}

interface PromiseConstructor {
    readonly [Symbol.species]: PromiseConstructor;
}

interface RegExp {
    /**
     * Matches a string with this regular expression, and returns an array containing the results of
     * that search.
     * @param string A string to search within.
     */
    [Symbol.match](string: string): RegExpMatchArray | null;

    /**
     * Replaces text in a string, using this regular expression.
     * @param string A String object or string literal whose contents matching against
     *               this regular expression will be replaced
     * @param replaceValue A String object or string literal containing the text to replace for every
     *                     successful match of this regular expression.
     */
    [Symbol.replace](string: string, replaceValue: string): string;

    /**
     * Replaces text in a string, using this regular expression.
     * @param string A String object or string literal whose contents matching against
     *               this regular expression will be replaced
     * @param replacer A function that returns the replacement text.
     */
    [Symbol.replace](string: string, replacer: (substring: string, ...args: any[]) => string): string;

    /**
     * Finds the position beginning first substring match in a regular expression search
     * using this regular expression.
     *
     * @param string The string to search within.
     */
    [Symbol.search](string: string): number;

    /**
     * Returns an array of substrings that were delimited by strings in the original input that
     * match against this regular expression.
     *
     * If the regular expression contains capturing parentheses, then each time this
     * regular expression matches, the results (including any undefined results) of the
     * capturing parentheses are spliced.
     *
     * @param string string value to split
     * @param limit if not undefined, the output array is truncated so that it contains no more
     * than 'limit' elements.
     */
    [Symbol.split](string: string, limit?: number): string[];
}

interface RegExpConstructor {
    readonly [Symbol.species]: RegExpConstructor;
}

interface String {
    /**
     * Matches a string or an object that supports being matched against, and returns an array
     * containing the results of that search, or null if no matches are found.
     * @param matcher An object that supports being matched against.
     */
    match(matcher: { [Symbol.match](string: string): RegExpMatchArray | null; }): RegExpMatchArray | null;

    /**
     * Replaces first match with string or all matches with RegExp.
     * @param searchValue A string or RegExp search value.
     * @param replaceValue A string containing the text to replace for match.
     */
    replace(searchValue: { [Symbol.replace](string: string, replaceValue: string): string; }, replaceValue: string): string;

    /**
     * Replaces text in a string, using an object that supports replacement within a string.
     * @param searchValue A object can search for and replace matches within a string.
     * @param replacer A function that returns the replacement text.
     */
    replace(searchValue: { [Symbol.replace](string: string, replacer: (substring: string, ...args: any[]) => string): string; }, replacer: (substring: string, ...args: any[]) => string): string;

    /**
     * Finds the first substring match in a regular expression search.
     * @param searcher An object which supports searching within a string.
     */
    search(searcher: { [Symbol.search](string: string): number; }): number;

    /**
     * Split a string into substrings using the specified separator and return them as an array.
     * @param splitter An object that can split a string.
     * @param limit A value used to limit the number of elements returned in the array.
     */
    split(splitter: { [Symbol.split](string: string, limit?: number): string[]; }, limit?: number): string[];
}

interface ArrayBuffer {
    readonly [Symbol.toStringTag]: string;
}

interface DataView {
    readonly [Symbol.toStringTag]: string;
}

interface Int8Array {
    readonly [Symbol.toStringTag]: "Int8Array";
}

interface Uint8Array {
    readonly [Symbol.toStringTag]: "Uint8Array";
}

interface Uint8ClampedArray {
    readonly [Symbol.toStringTag]: "Uint8ClampedArray";
}

interface Int16Array {
    readonly [Symbol.toStringTag]: "Int16Array";
}

interface Uint16Array {
    readonly [Symbol.toStringTag]: "Uint16Array";
}

interface Int32Array {
    readonly [Symbol.toStringTag]: "Int32Array";
}

interface Uint32Array {
    readonly [Symbol.toStringTag]: "Uint32Array";
}

interface Float32Array {
    readonly [Symbol.toStringTag]: "Float32Array";
}

interface Float64Array {
    readonly [Symbol.toStringTag]: "Float64Array";
}

interface ArrayConstructor {
    readonly [Symbol.species]: ArrayConstructor;
}
interface MapConstructor {
    readonly [Symbol.species]: MapConstructor;
}
interface SetConstructor {
    readonly [Symbol.species]: SetConstructor;
}
interface ArrayBufferConstructor {
    readonly [Symbol.species]: ArrayBufferConstructor;
}
`;
  libFileMap["lib.es2016.array.include.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface Array<T> {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: T, fromIndex?: number): boolean;\n}\n\ninterface ReadonlyArray<T> {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: T, fromIndex?: number): boolean;\n}\n\ninterface Int8Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Uint8Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Uint8ClampedArray {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Int16Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Uint16Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Int32Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Uint32Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Float32Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}\n\ninterface Float64Array {\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: number, fromIndex?: number): boolean;\n}';
  libFileMap["lib.es2016.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2015" />\n/// <reference lib="es2016.array.include" />';
  libFileMap["lib.es2016.full.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2016" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n/// <reference lib="dom.iterable" />';
  libFileMap["lib.es2017.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2016" />\n/// <reference lib="es2017.object" />\n/// <reference lib="es2017.sharedmemory" />\n/// <reference lib="es2017.string" />\n/// <reference lib="es2017.intl" />\n/// <reference lib="es2017.typedarrays" />\n';
  libFileMap["lib.es2017.full.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2017" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n/// <reference lib="dom.iterable" />';
  libFileMap["lib.es2017.intl.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ndeclare namespace Intl {\n    type DateTimeFormatPartTypes = "day" | "dayPeriod" | "era" | "hour" | "literal" | "minute" | "month" | "second" | "timeZoneName" | "weekday" | "year";\n\n    interface DateTimeFormatPart {\n        type: DateTimeFormatPartTypes;\n        value: string;\n    }\n\n    interface DateTimeFormat {\n        formatToParts(date?: Date | number): DateTimeFormatPart[];\n    }\n}\n';
  libFileMap["lib.es2017.object.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface ObjectConstructor {\n    /**\n     * Returns an array of values of the enumerable properties of an object\n     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n     */\n    values<T>(o: { [s: string]: T } | ArrayLike<T>): T[];\n\n    /**\n     * Returns an array of values of the enumerable properties of an object\n     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n     */\n    values(o: {}): any[];\n\n    /**\n     * Returns an array of key/values of the enumerable properties of an object\n     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n     */\n    entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];\n\n    /**\n     * Returns an array of key/values of the enumerable properties of an object\n     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n     */\n    entries(o: {}): [string, any][];\n\n    /**\n     * Returns an object containing all own property descriptors of an object\n     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n     */\n    getOwnPropertyDescriptors<T>(o: T): {[P in keyof T]: TypedPropertyDescriptor<T[P]>} & { [x: string]: PropertyDescriptor };\n}\n';
  libFileMap["lib.es2017.sharedmemory.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2015.symbol" />\n/// <reference lib="es2015.symbol.wellknown" />\n\ninterface SharedArrayBuffer {\n    /**\n     * Read-only. The length of the ArrayBuffer (in bytes).\n     */\n    readonly byteLength: number;\n\n    /**\n     * Returns a section of an SharedArrayBuffer.\n     */\n    slice(begin: number, end?: number): SharedArrayBuffer;\n    readonly [Symbol.species]: SharedArrayBuffer;\n    readonly [Symbol.toStringTag]: "SharedArrayBuffer";\n}\n\ninterface SharedArrayBufferConstructor {\n    readonly prototype: SharedArrayBuffer;\n    new (byteLength: number): SharedArrayBuffer;\n}\ndeclare var SharedArrayBuffer: SharedArrayBufferConstructor;\n\ninterface ArrayBufferTypes {\n    SharedArrayBuffer: SharedArrayBuffer;\n}\n\ninterface Atomics {\n    /**\n     * Adds a value to the value at the given position in the array, returning the original value.\n     * Until this atomic operation completes, any other read or write operation against the array\n     * will block.\n     */\n    add(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;\n\n    /**\n     * Stores the bitwise AND of a value with the value at the given position in the array,\n     * returning the original value. Until this atomic operation completes, any other read or\n     * write operation against the array will block.\n     */\n    and(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;\n\n    /**\n     * Replaces the value at the given position in the array if the original value equals the given\n     * expected value, returning the original value. Until this atomic operation completes, any\n     * other read or write operation against the array will block.\n     */\n    compareExchange(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, expectedValue: number, replacementValue: number): number;\n\n    /**\n     * Replaces the value at the given position in the array, returning the original value. Until\n     * this atomic operation completes, any other read or write operation against the array will\n     * block.\n     */\n    exchange(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;\n\n    /**\n     * Returns a value indicating whether high-performance algorithms can use atomic operations\n     * (`true`) or must use locks (`false`) for the given number of bytes-per-element of a typed\n     * array.\n     */\n    isLockFree(size: number): boolean;\n\n    /**\n     * Returns the value at the given position in the array. Until this atomic operation completes,\n     * any other read or write operation against the array will block.\n     */\n    load(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number): number;\n\n    /**\n     * Stores the bitwise OR of a value with the value at the given position in the array,\n     * returning the original value. Until this atomic operation completes, any other read or write\n     * operation against the array will block.\n     */\n    or(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;\n\n    /**\n     * Stores a value at the given position in the array, returning the new value. Until this\n     * atomic operation completes, any other read or write operation against the array will block.\n     */\n    store(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;\n\n    /**\n     * Subtracts a value from the value at the given position in the array, returning the original\n     * value. Until this atomic operation completes, any other read or write operation against the\n     * array will block.\n     */\n    sub(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;\n\n    /**\n     * If the value at the given position in the array is equal to the provided value, the current\n     * agent is put to sleep causing execution to suspend until the timeout expires (returning\n     * `"timed-out"`) or until the agent is awoken (returning `"ok"`); otherwise, returns\n     * `"not-equal"`.\n     */\n    wait(typedArray: Int32Array, index: number, value: number, timeout?: number): "ok" | "not-equal" | "timed-out";\n\n    /**\n     * Wakes up sleeping agents that are waiting on the given index of the array, returning the\n     * number of agents that were awoken.\n     * @param typedArray A shared Int32Array.\n     * @param index The position in the typedArray to wake up on.\n     * @param count The number of sleeping agents to notify. Defaults to +Infinity.\n     */\n    notify(typedArray: Int32Array, index: number, count?: number): number;\n\n    /**\n     * Stores the bitwise XOR of a value with the value at the given position in the array,\n     * returning the original value. Until this atomic operation completes, any other read or write\n     * operation against the array will block.\n     */\n    xor(typedArray: Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array, index: number, value: number): number;\n\n    readonly [Symbol.toStringTag]: "Atomics";\n}\n\ndeclare var Atomics: Atomics;\n';
  libFileMap["lib.es2017.string.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


interface String {
    /**
     * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.
     * The padding is applied from the start (left) of the current string.
     *
     * @param maxLength The length of the resulting string once the current string has been padded.
     *        If this parameter is smaller than the current string's length, the current string will be returned as it is.
     *
     * @param fillString The string to pad the current string with.
     *        If this string is too long, it will be truncated and the left-most part will be applied.
     *        The default value for this parameter is " " (U+0020).
     */
    padStart(maxLength: number, fillString?: string): string;

    /**
     * Pads the current string with a given string (possibly repeated) so that the resulting string reaches a given length.
     * The padding is applied from the end (right) of the current string.
     *
     * @param maxLength The length of the resulting string once the current string has been padded.
     *        If this parameter is smaller than the current string's length, the current string will be returned as it is.
     *
     * @param fillString The string to pad the current string with.
     *        If this string is too long, it will be truncated and the left-most part will be applied.
     *        The default value for this parameter is " " (U+0020).
     */
    padEnd(maxLength: number, fillString?: string): string;
}
`;
  libFileMap["lib.es2017.typedarrays.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface Int8ArrayConstructor {\n    new (): Int8Array;\n}\n\ninterface Uint8ArrayConstructor {\n    new (): Uint8Array;\n}\n\ninterface Uint8ClampedArrayConstructor {\n    new (): Uint8ClampedArray;\n}\n\ninterface Int16ArrayConstructor {\n    new (): Int16Array;\n}\n\ninterface Uint16ArrayConstructor {\n    new (): Uint16Array;\n}\n\ninterface Int32ArrayConstructor {\n    new (): Int32Array;\n}\n\ninterface Uint32ArrayConstructor {\n    new (): Uint32Array;\n}\n\ninterface Float32ArrayConstructor {\n    new (): Float32Array;\n}\n\ninterface Float64ArrayConstructor {\n    new (): Float64Array;\n}\n';
  libFileMap["lib.es2018.asyncgenerator.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


/// <reference lib="es2018.asynciterable" />

interface AsyncGenerator<T = unknown, TReturn = any, TNext = unknown> extends AsyncIterator<T, TReturn, TNext> {
    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
    next(...args: [] | [TNext]): Promise<IteratorResult<T, TReturn>>;
    return(value: TReturn | PromiseLike<TReturn>): Promise<IteratorResult<T, TReturn>>;
    throw(e: any): Promise<IteratorResult<T, TReturn>>;
    [Symbol.asyncIterator](): AsyncGenerator<T, TReturn, TNext>;
}

interface AsyncGeneratorFunction {
    /**
     * Creates a new AsyncGenerator object.
     * @param args A list of arguments the function accepts.
     */
    new (...args: any[]): AsyncGenerator;
    /**
     * Creates a new AsyncGenerator object.
     * @param args A list of arguments the function accepts.
     */
    (...args: any[]): AsyncGenerator;
    /**
     * The length of the arguments.
     */
    readonly length: number;
    /**
     * Returns the name of the function.
     */
    readonly name: string;
    /**
     * A reference to the prototype.
     */
    readonly prototype: AsyncGenerator;
}

interface AsyncGeneratorFunctionConstructor {
    /**
     * Creates a new AsyncGenerator function.
     * @param args A list of arguments the function accepts.
     */
    new (...args: string[]): AsyncGeneratorFunction;
    /**
     * Creates a new AsyncGenerator function.
     * @param args A list of arguments the function accepts.
     */
    (...args: string[]): AsyncGeneratorFunction;
    /**
     * The length of the arguments.
     */
    readonly length: number;
    /**
     * Returns the name of the function.
     */
    readonly name: string;
    /**
     * A reference to the prototype.
     */
    readonly prototype: AsyncGeneratorFunction;
}
`;
  libFileMap["lib.es2018.asynciterable.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


/// <reference lib="es2015.symbol" />
/// <reference lib="es2015.iterable" />

interface SymbolConstructor {
    /**
     * A method that returns the default async iterator for an object. Called by the semantics of
     * the for-await-of statement.
     */
    readonly asyncIterator: unique symbol;
}

interface AsyncIterator<T, TReturn = any, TNext = undefined> {
    // NOTE: 'next' is defined using a tuple to ensure we report the correct assignability errors in all places.
    next(...args: [] | [TNext]): Promise<IteratorResult<T, TReturn>>;
    return?(value?: TReturn | PromiseLike<TReturn>): Promise<IteratorResult<T, TReturn>>;
    throw?(e?: any): Promise<IteratorResult<T, TReturn>>;
}

interface AsyncIterable<T> {
    [Symbol.asyncIterator](): AsyncIterator<T>;
}

interface AsyncIterableIterator<T> extends AsyncIterator<T> {
    [Symbol.asyncIterator](): AsyncIterableIterator<T>;
}`;
  libFileMap["lib.es2018.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2017" />\n/// <reference lib="es2018.asynciterable" />\n/// <reference lib="es2018.asyncgenerator" />\n/// <reference lib="es2018.promise" />\n/// <reference lib="es2018.regexp" />\n/// <reference lib="es2018.intl" />\n';
  libFileMap["lib.es2018.full.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2018" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n/// <reference lib="dom.iterable" />';
  libFileMap["lib.es2018.intl.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


declare namespace Intl {

    // http://cldr.unicode.org/index/cldr-spec/plural-rules#TOC-Determining-Plural-Categories
    type LDMLPluralRule = "zero" | "one" | "two" | "few" | "many" | "other";
    type PluralRuleType = "cardinal" | "ordinal";

    interface PluralRulesOptions {
        localeMatcher?: "lookup" | "best fit" | undefined;
        type?: PluralRuleType | undefined;
        minimumIntegerDigits?: number | undefined;
        minimumFractionDigits?: number | undefined;
        maximumFractionDigits?: number | undefined;
        minimumSignificantDigits?: number | undefined;
        maximumSignificantDigits?: number | undefined;
    }

    interface ResolvedPluralRulesOptions {
        locale: string;
        pluralCategories: LDMLPluralRule[];
        type: PluralRuleType;
        minimumIntegerDigits: number;
        minimumFractionDigits: number;
        maximumFractionDigits: number;
        minimumSignificantDigits?: number;
        maximumSignificantDigits?: number;
    }

    interface PluralRules {
        resolvedOptions(): ResolvedPluralRulesOptions;
        select(n: number): LDMLPluralRule;
    }

    const PluralRules: {
        new (locales?: string | string[], options?: PluralRulesOptions): PluralRules;
        (locales?: string | string[], options?: PluralRulesOptions): PluralRules;

        supportedLocalesOf(locales: string | string[], options?: { localeMatcher?: "lookup" | "best fit" }): string[];
    };

    // We can only have one definition for 'type' in TypeScript, and so you can learn where the keys come from here:
    type ES2018NumberFormatPartType = "literal" | "nan" | "infinity" | "percent" | "integer" | "group" | "decimal" | "fraction" | "plusSign" | "minusSign" | "percentSign" | "currency" | "code" | "symbol" | "name";
    type ES2020NumberFormatPartType = "compact" | "exponentInteger" | "exponentMinusSign" | "exponentSeparator" | "unit" | "unknown";
    type NumberFormatPartTypes = ES2018NumberFormatPartType | ES2020NumberFormatPartType;

    interface NumberFormatPart {
        type: NumberFormatPartTypes;
        value: string;
    }

    interface NumberFormat {
        formatToParts(number?: number | bigint): NumberFormatPart[];
    }
}
`;
  libFileMap["lib.es2018.promise.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface Promise<T> {\n    /**\n     * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The\n     * resolved value cannot be modified from the callback.\n     * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected).\n     * @returns A Promise for the completion of the callback.\n     */\n    finally(onfinally?: (() => void) | undefined | null): Promise<T>\n}\n';
  libFileMap["lib.es2018.regexp.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface RegExpMatchArray {\n    groups?: {\n        [key: string]: string\n    }\n}\n\ninterface RegExpExecArray {\n    groups?: {\n        [key: string]: string\n    }\n}\n\ninterface RegExp {\n    /**\n     * Returns a Boolean value indicating the state of the dotAll flag (s) used with a regular expression.\n     * Default is false. Read-only.\n     */\n    readonly dotAll: boolean;\n}';
  libFileMap["lib.es2019.array.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ntype FlatArray<Arr, Depth extends number> = {\n    "done": Arr,\n    "recur": Arr extends ReadonlyArray<infer InnerArr>\n        ? FlatArray<InnerArr, [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]>\n        : Arr\n}[Depth extends -1 ? "done" : "recur"];\n\ninterface ReadonlyArray<T> {\n\n    /**\n     * Calls a defined callback function on each element of an array. Then, flattens the result into\n     * a new array.\n     * This is identical to a map followed by flat with depth 1.\n     *\n     * @param callback A function that accepts up to three arguments. The flatMap method calls the\n     * callback function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callback function. If\n     * thisArg is omitted, undefined is used as the this value.\n     */\n    flatMap<U, This = undefined> (\n        callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>,\n        thisArg?: This\n    ): U[]\n\n\n    /**\n     * Returns a new array with all sub-array elements concatenated into it recursively up to the\n     * specified depth.\n     *\n     * @param depth The maximum recursion depth\n     */\n    flat<A, D extends number = 1>(\n        this: A,\n        depth?: D\n    ): FlatArray<A, D>[]\n  }\n\ninterface Array<T> {\n\n    /**\n     * Calls a defined callback function on each element of an array. Then, flattens the result into\n     * a new array.\n     * This is identical to a map followed by flat with depth 1.\n     *\n     * @param callback A function that accepts up to three arguments. The flatMap method calls the\n     * callback function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callback function. If\n     * thisArg is omitted, undefined is used as the this value.\n     */\n    flatMap<U, This = undefined> (\n        callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>,\n        thisArg?: This\n    ): U[]\n\n    /**\n     * Returns a new array with all sub-array elements concatenated into it recursively up to the\n     * specified depth.\n     *\n     * @param depth The maximum recursion depth\n     */\n    flat<A, D extends number = 1>(\n        this: A,\n        depth?: D\n    ): FlatArray<A, D>[]\n}\n';
  libFileMap["lib.es2019.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2018" />\n/// <reference lib="es2019.array" />\n/// <reference lib="es2019.object" />\n/// <reference lib="es2019.string" />\n/// <reference lib="es2019.symbol" />\n';
  libFileMap["lib.es2019.full.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2019" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n/// <reference lib="dom.iterable" />\n';
  libFileMap["lib.es2019.object.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2015.iterable" />\n\ninterface ObjectConstructor {\n    /**\n     * Returns an object created by key-value entries for properties and methods\n     * @param entries An iterable object that contains key-value entries for properties and methods.\n     */\n    fromEntries<T = any>(entries: Iterable<readonly [PropertyKey, T]>): { [k: string]: T };\n\n    /**\n     * Returns an object created by key-value entries for properties and methods\n     * @param entries An iterable object that contains key-value entries for properties and methods.\n     */\n    fromEntries(entries: Iterable<readonly any[]>): any;\n}\n';
  libFileMap["lib.es2019.string.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface String {\n    /** Removes the trailing white space and line terminator characters from a string. */\n    trimEnd(): string;\n\n    /** Removes the leading white space and line terminator characters from a string. */\n    trimStart(): string;\n\n    /**\n     * Removes the leading white space and line terminator characters from a string.\n     * @deprecated A legacy feature for browser compatibility. Use `trimStart` instead\n     */\n    trimLeft(): string;\n\n    /**\n     * Removes the trailing white space and line terminator characters from a string.\n     * @deprecated A legacy feature for browser compatibility. Use `trimEnd` instead\n     */\n    trimRight(): string;\n}\n';
  libFileMap["lib.es2019.symbol.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface Symbol {\n    /**\n     * Expose the [[Description]] internal slot of a symbol directly.\n     */\n    readonly description: string | undefined;\n}\n';
  libFileMap["lib.es2020.bigint.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface BigIntToLocaleStringOptions {\n    /**\n     * The locale matching algorithm to use.The default is "best fit". For information about this option, see the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation Intl page}.\n     */\n    localeMatcher?: string;\n    /**\n     * The formatting style to use , the default is "decimal".\n     */\n    style?: string;\n\n    numberingSystem?: string;\n    /**\n     * The unit to use in unit formatting, Possible values are core unit identifiers, defined in UTS #35, Part 2, Section 6. A subset of units from the full list was selected for use in ECMAScript. Pairs of simple units can be concatenated with "-per-" to make a compound unit. There is no default value; if the style is "unit", the unit property must be provided.\n     */\n    unit?: string;\n\n    /**\n     * The unit formatting style to use in unit formatting, the defaults is "short".\n     */\n    unitDisplay?: string;\n\n    /**\n     * The currency to use in currency formatting. Possible values are the ISO 4217 currency codes, such as "USD" for the US dollar, "EUR" for the euro, or "CNY" for the Chinese RMB \u2014 see the Current currency & funds code list. There is no default value; if the style is "currency", the currency property must be provided. It is only used when [[Style]] has the value "currency".\n     */\n    currency?: string;\n\n    /**\n     * How to display the currency in currency formatting. It is only used when [[Style]] has the value "currency". The default is "symbol".\n     *\n     * "symbol" to use a localized currency symbol such as \u20AC,\n     *\n     * "code" to use the ISO currency code,\n     *\n     * "name" to use a localized currency name such as "dollar"\n     */\n    currencyDisplay?: string;\n\n    /**\n     * Whether to use grouping separators, such as thousands separators or thousand/lakh/crore separators. The default is true.\n     */\n    useGrouping?: boolean;\n\n    /**\n     * The minimum number of integer digits to use. Possible values are from 1 to 21; the default is 1.\n     */\n    minimumIntegerDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21;\n\n    /**\n     * The minimum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number and percent formatting is 0; the default for currency formatting is the number of minor unit digits provided by the {@link http://www.currency-iso.org/en/home/tables/table-a1.html ISO 4217 currency codes list} (2 if the list doesn\'t provide that information).\n     */\n    minimumFractionDigits?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20;\n\n    /**\n     * The maximum number of fraction digits to use. Possible values are from 0 to 20; the default for plain number formatting is the larger of minimumFractionDigits and 3; the default for currency formatting is the larger of minimumFractionDigits and the number of minor unit digits provided by the {@link http://www.currency-iso.org/en/home/tables/table-a1.html ISO 4217 currency codes list} (2 if the list doesn\'t provide that information); the default for percent formatting is the larger of minimumFractionDigits and 0.\n     */\n    maximumFractionDigits?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20;\n\n    /**\n     * The minimum number of significant digits to use. Possible values are from 1 to 21; the default is 1.\n     */\n    minimumSignificantDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21;\n\n    /**\n     * The maximum number of significant digits to use. Possible values are from 1 to 21; the default is 21.\n     */\n    maximumSignificantDigits?: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21;\n\n    /**\n     * The formatting that should be displayed for the number, the defaults is "standard"\n     *\n     *     "standard" plain number formatting\n     *\n     *     "scientific" return the order-of-magnitude for formatted number.\n     *\n     *     "engineering" return the exponent of ten when divisible by three\n     *\n     *     "compact" string representing exponent, defaults is using the "short" form\n     */\n    notation?: string;\n\n    /**\n     * used only when notation is "compact"\n     */\n    compactDisplay?: string;\n}\n\ninterface BigInt {\n    /**\n     * Returns a string representation of an object.\n     * @param radix Specifies a radix for converting numeric values to strings.\n     */\n    toString(radix?: number): string;\n\n    /** Returns a string representation appropriate to the host environment\'s current locale. */\n    toLocaleString(locales?: string, options?: BigIntToLocaleStringOptions): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): bigint;\n\n    readonly [Symbol.toStringTag]: "BigInt";\n}\n\ninterface BigIntConstructor {\n    (value: bigint | boolean | number | string): bigint;\n    readonly prototype: BigInt;\n\n    /**\n     * Interprets the low bits of a BigInt as a 2\'s-complement signed integer.\n     * All higher bits are discarded.\n     * @param bits The number of low bits to use\n     * @param int The BigInt whose bits to extract\n     */\n    asIntN(bits: number, int: bigint): bigint;\n    /**\n     * Interprets the low bits of a BigInt as an unsigned integer.\n     * All higher bits are discarded.\n     * @param bits The number of low bits to use\n     * @param int The BigInt whose bits to extract\n     */\n    asUintN(bits: number, int: bigint): bigint;\n}\n\ndeclare var BigInt: BigIntConstructor;\n\n/**\n * A typed array of 64-bit signed integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated, an exception is raised.\n */\ninterface BigInt64Array {\n    /** The size in bytes of each element in the array. */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /** The ArrayBuffer instance referenced by the array. */\n    readonly buffer: ArrayBufferLike;\n\n    /** The length in bytes of the array. */\n    readonly byteLength: number;\n\n    /** The offset in bytes of the array. */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /** Yields index, value pairs for every entry in the array. */\n    entries(): IterableIterator<[number, bigint]>;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns false,\n     * or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: bigint, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: bigint, index: number, array: BigInt64Array) => any, thisArg?: any): BigInt64Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): bigint | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: bigint, index: number, array: BigInt64Array) => void, thisArg?: any): void;\n\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: bigint, fromIndex?: number): boolean;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    indexOf(searchElement: bigint, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /** Yields each index in the array. */\n    keys(): IterableIterator<number>;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: bigint, fromIndex?: number): number;\n\n    /** The length of the array. */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: bigint, index: number, array: BigInt64Array) => bigint, thisArg?: any): BigInt64Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigInt64Array) => bigint): bigint;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigInt64Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigInt64Array) => bigint): bigint;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigInt64Array) => U, initialValue: U): U;\n\n    /** Reverses the elements in the array. */\n    reverse(): this;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<bigint>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array.\n     */\n    slice(start?: number, end?: number): BigInt64Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls the\n     * predicate function for each element in the array until the predicate returns true, or until\n     * the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: bigint, index: number, array: BigInt64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n     * Sorts the array.\n     * @param compareFn The function used to determine the order of the elements. If omitted, the elements are sorted in ascending order.\n     */\n    sort(compareFn?: (a: bigint, b: bigint) => number | bigint): this;\n\n    /**\n     * Gets a new BigInt64Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): BigInt64Array;\n\n    /** Converts the array to a string by using the current locale. */\n    toLocaleString(): string;\n\n    /** Returns a string representation of the array. */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): BigInt64Array;\n\n    /** Yields each value in the array. */\n    values(): IterableIterator<bigint>;\n\n    [Symbol.iterator](): IterableIterator<bigint>;\n\n    readonly [Symbol.toStringTag]: "BigInt64Array";\n\n    [index: number]: bigint;\n}\n\ninterface BigInt64ArrayConstructor {\n    readonly prototype: BigInt64Array;\n    new(length?: number): BigInt64Array;\n    new(array: Iterable<bigint>): BigInt64Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): BigInt64Array;\n\n    /** The size in bytes of each element in the array. */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: bigint[]): BigInt64Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: ArrayLike<bigint>): BigInt64Array;\n    from<U>(arrayLike: ArrayLike<U>, mapfn: (v: U, k: number) => bigint, thisArg?: any): BigInt64Array;\n}\n\ndeclare var BigInt64Array: BigInt64ArrayConstructor;\n\n/**\n * A typed array of 64-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated, an exception is raised.\n */\ninterface BigUint64Array {\n    /** The size in bytes of each element in the array. */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /** The ArrayBuffer instance referenced by the array. */\n    readonly buffer: ArrayBufferLike;\n\n    /** The length in bytes of the array. */\n    readonly byteLength: number;\n\n    /** The offset in bytes of the array. */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /** Yields index, value pairs for every entry in the array. */\n    entries(): IterableIterator<[number, bigint]>;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns false,\n     * or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: bigint, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: bigint, index: number, array: BigUint64Array) => any, thisArg?: any): BigUint64Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): bigint | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: bigint, index: number, array: BigUint64Array) => void, thisArg?: any): void;\n\n    /**\n     * Determines whether an array includes a certain element, returning true or false as appropriate.\n     * @param searchElement The element to search for.\n     * @param fromIndex The position in this array at which to begin searching for searchElement.\n     */\n    includes(searchElement: bigint, fromIndex?: number): boolean;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    indexOf(searchElement: bigint, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /** Yields each index in the array. */\n    keys(): IterableIterator<number>;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: bigint, fromIndex?: number): number;\n\n    /** The length of the array. */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: bigint, index: number, array: BigUint64Array) => bigint, thisArg?: any): BigUint64Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigUint64Array) => bigint): bigint;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigUint64Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: bigint, currentValue: bigint, currentIndex: number, array: BigUint64Array) => bigint): bigint;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: bigint, currentIndex: number, array: BigUint64Array) => U, initialValue: U): U;\n\n    /** Reverses the elements in the array. */\n    reverse(): this;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<bigint>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array.\n     */\n    slice(start?: number, end?: number): BigUint64Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls the\n     * predicate function for each element in the array until the predicate returns true, or until\n     * the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: bigint, index: number, array: BigUint64Array) => boolean, thisArg?: any): boolean;\n\n    /**\n     * Sorts the array.\n     * @param compareFn The function used to determine the order of the elements. If omitted, the elements are sorted in ascending order.\n     */\n    sort(compareFn?: (a: bigint, b: bigint) => number | bigint): this;\n\n    /**\n     * Gets a new BigUint64Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): BigUint64Array;\n\n    /** Converts the array to a string by using the current locale. */\n    toLocaleString(): string;\n\n    /** Returns a string representation of the array. */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): BigUint64Array;\n\n    /** Yields each value in the array. */\n    values(): IterableIterator<bigint>;\n\n    [Symbol.iterator](): IterableIterator<bigint>;\n\n    readonly [Symbol.toStringTag]: "BigUint64Array";\n\n    [index: number]: bigint;\n}\n\ninterface BigUint64ArrayConstructor {\n    readonly prototype: BigUint64Array;\n    new(length?: number): BigUint64Array;\n    new(array: Iterable<bigint>): BigUint64Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): BigUint64Array;\n\n    /** The size in bytes of each element in the array. */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: bigint[]): BigUint64Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of \'this\' used to invoke the mapfn.\n     */\n    from(arrayLike: ArrayLike<bigint>): BigUint64Array;\n    from<U>(arrayLike: ArrayLike<U>, mapfn: (v: U, k: number) => bigint, thisArg?: any): BigUint64Array;\n}\n\ndeclare var BigUint64Array: BigUint64ArrayConstructor;\n\ninterface DataView {\n    /**\n     * Gets the BigInt64 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getBigInt64(byteOffset: number, littleEndian?: boolean): bigint;\n\n    /**\n     * Gets the BigUint64 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getBigUint64(byteOffset: number, littleEndian?: boolean): bigint;\n\n    /**\n     * Stores a BigInt64 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setBigInt64(byteOffset: number, value: bigint, littleEndian?: boolean): void;\n\n    /**\n     * Stores a BigUint64 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setBigUint64(byteOffset: number, value: bigint, littleEndian?: boolean): void;\n}\n\ndeclare namespace Intl{\n    interface NumberFormat {\n        format(value: number | bigint): string;\n        resolvedOptions(): ResolvedNumberFormatOptions;\n    }\n}\n';
  libFileMap["lib.es2020.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2019" />\n/// <reference lib="es2020.bigint" />\n/// <reference lib="es2020.promise" />\n/// <reference lib="es2020.sharedmemory" />\n/// <reference lib="es2020.string" />\n/// <reference lib="es2020.symbol.wellknown" />\n/// <reference lib="es2020.intl" />\n';
  libFileMap["lib.es2020.full.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2020" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n/// <reference lib="dom.iterable" />\n';
  libFileMap["lib.es2020.intl.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ndeclare namespace Intl {\n\n    /**\n     * [Unicode BCP 47 Locale Identifiers](https://unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers) definition.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument).\n     */\n    type UnicodeBCP47LocaleIdentifier = string;\n\n    /**\n     * Unit to use in the relative time internationalized message.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/format#Parameters).\n     */\n    type RelativeTimeFormatUnit =\n        | "year"\n        | "years"\n        | "quarter"\n        | "quarters"\n        | "month"\n        | "months"\n        | "week"\n        | "weeks"\n        | "day"\n        | "days"\n        | "hour"\n        | "hours"\n        | "minute"\n        | "minutes"\n        | "second"\n        | "seconds";\n\n    /**\n     * The locale matching algorithm to use.\n     *\n     * [MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation).\n     */\n    type RelativeTimeFormatLocaleMatcher = "lookup" | "best fit";\n\n    /**\n     * The format of output message.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters).\n     */\n    type RelativeTimeFormatNumeric = "always" | "auto";\n\n    /**\n     * The length of the internationalized message.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters).\n     */\n    type RelativeTimeFormatStyle = "long" | "short" | "narrow";\n\n    /**\n     * [BCP 47 language tag](http://tools.ietf.org/html/rfc5646) definition.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument).\n     */\n    type BCP47LanguageTag = string;\n\n    /**\n     * An object with some or all of properties of `options` parameter\n     * of `Intl.RelativeTimeFormat` constructor.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters).\n     */\n    interface RelativeTimeFormatOptions {\n        /** The locale matching algorithm to use. For information about this option, see [Intl page](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation). */\n        localeMatcher?: RelativeTimeFormatLocaleMatcher;\n        /** The format of output message. */\n        numeric?: RelativeTimeFormatNumeric;\n        /** The length of the internationalized message. */\n        style?: RelativeTimeFormatStyle;\n    }\n\n    /**\n     * An object with properties reflecting the locale\n     * and formatting options computed during initialization\n     * of the `Intl.RelativeTimeFormat` object\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/resolvedOptions#Description).\n     */\n    interface ResolvedRelativeTimeFormatOptions {\n        locale: UnicodeBCP47LocaleIdentifier;\n        style: RelativeTimeFormatStyle;\n        numeric: RelativeTimeFormatNumeric;\n        numberingSystem: string;\n    }\n\n    /**\n     * An object representing the relative time format in parts\n     * that can be used for custom locale-aware formatting.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/formatToParts#Using_formatToParts).\n     */\n    interface RelativeTimeFormatPart {\n        type: string;\n        value: string;\n        unit?: RelativeTimeFormatUnit;\n    }\n\n    interface RelativeTimeFormat {\n        /**\n         * Formats a value and a unit according to the locale\n         * and formatting options of the given\n         * [`Intl.RelativeTimeFormat`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat)\n         * object.\n         *\n         * While this method automatically provides the correct plural forms,\n         * the grammatical form is otherwise as neutral as possible.\n         *\n         * It is the caller\'s responsibility to handle cut-off logic\n         * such as deciding between displaying "in 7 days" or "in 1 week".\n         * This API does not support relative dates involving compound units.\n         * e.g "in 5 days and 4 hours".\n         *\n         * @param value -  Numeric value to use in the internationalized relative time message\n         *\n         * @param unit - [Unit](https://tc39.es/ecma402/#sec-singularrelativetimeunit) to use in the relative time internationalized message.\n         *\n         * @throws `RangeError` if `unit` was given something other than `unit` possible values\n         *\n         * @returns {string} Internationalized relative time message as string\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/format).\n         */\n        format(value: number, unit: RelativeTimeFormatUnit): string;\n\n        /**\n         *  Returns an array of objects representing the relative time format in parts that can be used for custom locale-aware formatting.\n         *\n         *  @param value - Numeric value to use in the internationalized relative time message\n         *\n         *  @param unit - [Unit](https://tc39.es/ecma402/#sec-singularrelativetimeunit) to use in the relative time internationalized message.\n         *\n         *  @throws `RangeError` if `unit` was given something other than `unit` possible values\n         *\n         *  [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/formatToParts).\n         */\n        formatToParts(value: number, unit: RelativeTimeFormatUnit): RelativeTimeFormatPart[];\n\n        /**\n         * Provides access to the locale and options computed during initialization of this `Intl.RelativeTimeFormat` object.\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/resolvedOptions).\n         */\n        resolvedOptions(): ResolvedRelativeTimeFormatOptions;\n    }\n\n    /**\n     * The [`Intl.RelativeTimeFormat`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat)\n     * object is a constructor for objects that enable language-sensitive relative time formatting.\n     *\n     * [Compatibility](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat#Browser_compatibility).\n     */\n    const RelativeTimeFormat: {\n        /**\n         * Creates [Intl.RelativeTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat) objects\n         *\n         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.\n         *  For the general form and interpretation of the locales argument,\n         *  see the [`Intl` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).\n         *\n         * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters)\n         *  with some or all of options of `RelativeTimeFormatOptions`.\n         *\n         * @returns [Intl.RelativeTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RelativeTimeFormat) object.\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat).\n         */\n        new(\n            locales?: UnicodeBCP47LocaleIdentifier | UnicodeBCP47LocaleIdentifier[],\n            options?: RelativeTimeFormatOptions,\n        ): RelativeTimeFormat;\n\n        /**\n         * Returns an array containing those of the provided locales\n         * that are supported in date and time formatting\n         * without having to fall back to the runtime\'s default locale.\n         *\n         * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.\n         *  For the general form and interpretation of the locales argument,\n         *  see the [`Intl` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).\n         *\n         * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/RelativeTimeFormat#Parameters)\n         *  with some or all of options of the formatting.\n         *\n         * @returns An array containing those of the provided locales\n         *  that are supported in date and time formatting\n         *  without having to fall back to the runtime\'s default locale.\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat/supportedLocalesOf).\n         */\n        supportedLocalesOf(\n            locales?: UnicodeBCP47LocaleIdentifier | UnicodeBCP47LocaleIdentifier[],\n            options?: RelativeTimeFormatOptions,\n        ): UnicodeBCP47LocaleIdentifier[];\n    };\n\n    interface NumberFormatOptions {\n        compactDisplay?: "short" | "long" | undefined;\n        notation?: "standard" | "scientific" | "engineering" | "compact" | undefined;\n        signDisplay?: "auto" | "never" | "always" | undefined;\n        unit?: string | undefined;\n        unitDisplay?: "short" | "long" | "narrow" | undefined;\n    }\n\n    interface ResolvedNumberFormatOptions {\n        compactDisplay?: "short" | "long";\n        notation?: "standard" | "scientific" | "engineering" | "compact";\n        signDisplay?: "auto" | "never" | "always";\n        unit?: string;\n        unitDisplay?: "short" | "long" | "narrow";\n    }\n\n    interface DateTimeFormatOptions {\n        calendar?: string | undefined;\n        dayPeriod?: "narrow" | "short" | "long" | undefined;\n        numberingSystem?: string | undefined;\n\n        dateStyle?: "full" | "long" | "medium" | "short" | undefined;\n        timeStyle?: "full" | "long" | "medium" | "short" | undefined;\n        hourCycle?: "h11" | "h12" | "h23" | "h24" | undefined;\n    }\n\n    type LocaleHourCycleKey = "h12" | "h23" | "h11" | "h24";\n    type LocaleCollationCaseFirst = "upper" | "lower" | "false";\n\n    interface LocaleOptions {\n        /** A string containing the language, and the script and region if available. */\n        baseName?: string;\n        /** The part of the Locale that indicates the locale\'s calendar era. */\n        calendar?: string;\n        /** Flag that defines whether case is taken into account for the locale\'s collation rules. */\n        caseFirst?: LocaleCollationCaseFirst;\n        /** The collation type used for sorting */\n        collation?: string;\n        /** The time keeping format convention used by the locale. */\n        hourCycle?: LocaleHourCycleKey;\n        /** The primary language subtag associated with the locale. */\n        language?: string;\n        /** The numeral system used by the locale. */\n        numberingSystem?: string;\n        /** Flag that defines whether the locale has special collation handling for numeric characters. */\n        numeric?: boolean;\n        /** The region of the world (usually a country) associated with the locale. Possible values are region codes as defined by ISO 3166-1. */\n        region?: string;\n        /** The script used for writing the particular language used in the locale. Possible values are script codes as defined by ISO 15924. */\n        script?: string;\n    }\n\n    interface Locale extends LocaleOptions {\n        /** Gets the most likely values for the language, script, and region of the locale based on existing values. */\n        maximize(): Locale;\n        /** Attempts to remove information about the locale that would be added by calling `Locale.maximize()`. */\n        minimize(): Locale;\n        /** Returns the locale\'s full locale identifier string. */\n        toString(): BCP47LanguageTag;\n    }\n\n    /**\n     * Constructor creates [Intl.Locale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale)\n     * objects\n     *\n     * @param tag - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646).\n     *  For the general form and interpretation of the locales argument,\n     *  see the [`Intl` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).\n     *\n     * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/Locale#Parameters) with some or all of options of the locale.\n     *\n     * @returns [Intl.Locale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) object.\n     *\n     * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale).\n     */\n    const Locale: {\n        new (tag?: BCP47LanguageTag, options?: LocaleOptions): Locale;\n    };\n\n     interface DisplayNamesOptions {\n        localeMatcher: RelativeTimeFormatLocaleMatcher;\n        style: RelativeTimeFormatStyle;\n        type: "language" | "region" | "script" | "currency";\n        fallback: "code" | "none";\n    }\n\n    interface DisplayNames {\n        /**\n         * Receives a code and returns a string based on the locale and options provided when instantiating\n         * [`Intl.DisplayNames()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames)\n         *\n         * @param code The `code` to provide depends on the `type` passed to display name during creation:\n         *  - If the type is `"region"`, code should be either an [ISO-3166 two letters region code](https://www.iso.org/iso-3166-country-codes.html),\n         *    or a [three digits UN M49 Geographic Regions](https://unstats.un.org/unsd/methodology/m49/).\n         *  - If the type is `"script"`, code should be an [ISO-15924 four letters script code](https://unicode.org/iso15924/iso15924-codes.html).\n         *  - If the type is `"language"`, code should be a `languageCode` ["-" `scriptCode`] ["-" `regionCode` ] *("-" `variant` )\n         *    subsequence of the unicode_language_id grammar in [UTS 35\'s Unicode Language and Locale Identifiers grammar](https://unicode.org/reports/tr35/#Unicode_language_identifier).\n         *    `languageCode` is either a two letters ISO 639-1 language code or a three letters ISO 639-2 language code.\n         *  - If the type is `"currency"`, code should be a [3-letter ISO 4217 currency code](https://www.iso.org/iso-4217-currency-codes.html).\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/of).\n         */\n        of(code: string): string;\n        /**\n         * Returns a new object with properties reflecting the locale and style formatting options computed during the construction of the current\n         * [`Intl/DisplayNames`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames) object.\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/resolvedOptions).\n         */\n        resolvedOptions(): DisplayNamesOptions;\n    }\n\n    /**\n     * The [`Intl.DisplayNames()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames)\n     * object enables the consistent translation of language, region and script display names.\n     *\n     * [Compatibility](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames#browser_compatibility).\n     */\n    const DisplayNames: {\n        prototype: DisplayNames;\n\n        /**\n         * @param locales A string with a BCP 47 language tag, or an array of such strings.\n         *   For the general form and interpretation of the `locales` argument, see the [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locale_identification_and_negotiation)\n         *   page.\n         *\n         * @param options An object for setting up a display name.\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/DisplayNames).\n         */\n        new(locales?: BCP47LanguageTag | BCP47LanguageTag[], options?: Partial<DisplayNamesOptions>): DisplayNames;\n\n        /**\n         * Returns an array containing those of the provided locales that are supported in display names without having to fall back to the runtime\'s default locale.\n         *\n         * @param locales A string with a BCP 47 language tag, or an array of such strings.\n         *   For the general form and interpretation of the `locales` argument, see the [Intl](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locale_identification_and_negotiation)\n         *   page.\n         *\n         * @param options An object with a locale matcher.\n         *\n         * @returns An array of strings representing a subset of the given locale tags that are supported in display names without having to fall back to the runtime\'s default locale.\n         *\n         * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames/supportedLocalesOf).\n         */\n        supportedLocalesOf(locales: BCP47LanguageTag | BCP47LanguageTag[], options?: {localeMatcher: RelativeTimeFormatLocaleMatcher}): BCP47LanguageTag[];\n    };\n\n}\n';
  libFileMap["lib.es2020.promise.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface PromiseFulfilledResult<T> {\n    status: "fulfilled";\n    value: T;\n}\n\ninterface PromiseRejectedResult {\n    status: "rejected";\n    reason: any;\n}\n\ntype PromiseSettledResult<T> = PromiseFulfilledResult<T> | PromiseRejectedResult;\n\ninterface PromiseConstructor {\n    /**\n     * Creates a Promise that is resolved with an array of results when all\n     * of the provided Promises resolve or reject.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    allSettled<T extends readonly unknown[] | []>(values: T): Promise<{ -readonly [P in keyof T]: PromiseSettledResult<Awaited<T[P]>> }>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all\n     * of the provided Promises resolve or reject.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    allSettled<T>(values: Iterable<T | PromiseLike<T>>): Promise<PromiseSettledResult<Awaited<T>>[]>;\n}\n';
  libFileMap["lib.es2020.sharedmemory.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface Atomics {\n    /**\n     * Adds a value to the value at the given position in the array, returning the original value.\n     * Until this atomic operation completes, any other read or write operation against the array\n     * will block.\n     */\n    add(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;\n\n    /**\n     * Stores the bitwise AND of a value with the value at the given position in the array,\n     * returning the original value. Until this atomic operation completes, any other read or\n     * write operation against the array will block.\n     */\n    and(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;\n\n    /**\n     * Replaces the value at the given position in the array if the original value equals the given\n     * expected value, returning the original value. Until this atomic operation completes, any\n     * other read or write operation against the array will block.\n     */\n    compareExchange(typedArray: BigInt64Array | BigUint64Array, index: number, expectedValue: bigint, replacementValue: bigint): bigint;\n\n    /**\n     * Replaces the value at the given position in the array, returning the original value. Until\n     * this atomic operation completes, any other read or write operation against the array will\n     * block.\n     */\n    exchange(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;\n\n    /**\n     * Returns the value at the given position in the array. Until this atomic operation completes,\n     * any other read or write operation against the array will block.\n     */\n    load(typedArray: BigInt64Array | BigUint64Array, index: number): bigint;\n\n    /**\n     * Stores the bitwise OR of a value with the value at the given position in the array,\n     * returning the original value. Until this atomic operation completes, any other read or write\n     * operation against the array will block.\n     */\n    or(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;\n\n    /**\n     * Stores a value at the given position in the array, returning the new value. Until this\n     * atomic operation completes, any other read or write operation against the array will block.\n     */\n    store(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;\n\n    /**\n     * Subtracts a value from the value at the given position in the array, returning the original\n     * value. Until this atomic operation completes, any other read or write operation against the\n     * array will block.\n     */\n    sub(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;\n\n    /**\n     * If the value at the given position in the array is equal to the provided value, the current\n     * agent is put to sleep causing execution to suspend until the timeout expires (returning\n     * `"timed-out"`) or until the agent is awoken (returning `"ok"`); otherwise, returns\n     * `"not-equal"`.\n     */\n    wait(typedArray: BigInt64Array, index: number, value: bigint, timeout?: number): "ok" | "not-equal" | "timed-out";\n\n    /**\n     * Wakes up sleeping agents that are waiting on the given index of the array, returning the\n     * number of agents that were awoken.\n     * @param typedArray A shared BigInt64Array.\n     * @param index The position in the typedArray to wake up on.\n     * @param count The number of sleeping agents to notify. Defaults to +Infinity.\n     */\n    notify(typedArray: BigInt64Array, index: number, count?: number): number;\n\n    /**\n     * Stores the bitwise XOR of a value with the value at the given position in the array,\n     * returning the original value. Until this atomic operation completes, any other read or write\n     * operation against the array will block.\n     */\n    xor(typedArray: BigInt64Array | BigUint64Array, index: number, value: bigint): bigint;\n}\n';
  libFileMap["lib.es2020.string.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2015.iterable" />\n\ninterface String {\n    /**\n     * Matches a string with a regular expression, and returns an iterable of matches\n     * containing the results of that search.\n     * @param regexp A variable name or string literal containing the regular expression pattern and flags.\n     */\n    matchAll(regexp: RegExp): IterableIterator<RegExpMatchArray>;\n}\n';
  libFileMap["lib.es2020.symbol.wellknown.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2015.iterable" />\n/// <reference lib="es2015.symbol" />\n\ninterface SymbolConstructor {\n    /**\n     * A regular expression method that matches the regular expression against a string. Called\n     * by the String.prototype.matchAll method.\n     */\n    readonly matchAll: unique symbol;\n}\n\ninterface RegExp {\n    /**\n     * Matches a string with this regular expression, and returns an iterable of matches\n     * containing the results of that search.\n     * @param string A string to search within.\n     */\n    [Symbol.matchAll](str: string): IterableIterator<RegExpMatchArray>;\n}\n';
  libFileMap["lib.es2021.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2020" />\n/// <reference lib="es2021.promise" />\n/// <reference lib="es2021.string" />\n/// <reference lib="es2021.weakref" />\n/// <reference lib="es2021.intl" />\n';
  libFileMap["lib.es2021.full.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2021" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n/// <reference lib="dom.iterable" />\n';
  libFileMap["lib.es2021.intl.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ndeclare namespace Intl {\n\n    interface DateTimeFormatOptions {\n        formatMatcher?: "basic" | "best fit" | "best fit" | undefined;\n        dateStyle?: "full" | "long" | "medium" | "short" | undefined;\n        timeStyle?: "full" | "long" | "medium" | "short" | undefined;\n        dayPeriod?: "narrow" | "short" | "long" | undefined;\n        fractionalSecondDigits?: 0 | 1 | 2 | 3 | undefined;\n    }\n\n    interface ResolvedDateTimeFormatOptions {\n        formatMatcher?: "basic" | "best fit" | "best fit";\n        dateStyle?: "full" | "long" | "medium" | "short";\n        timeStyle?: "full" | "long" | "medium" | "short";\n        hourCycle?: "h11" | "h12" | "h23" | "h24";\n        dayPeriod?: "narrow" | "short" | "long";\n        fractionalSecondDigits?: 0 | 1 | 2 | 3;\n    }\n\n    interface NumberFormat {\n        formatRange(startDate: number | bigint, endDate: number | bigint): string;\n        formatRangeToParts(startDate: number | bigint, endDate: number | bigint): NumberFormatPart[];\n    }\n}';
  libFileMap["lib.es2021.promise.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface AggregateError extends Error {\n    errors: any[]\n}\n\ninterface AggregateErrorConstructor {\n    new(errors: Iterable<any>, message?: string): AggregateError;\n    (errors: Iterable<any>, message?: string): AggregateError;\n    readonly prototype: AggregateError;\n}\n\ndeclare var AggregateError: AggregateErrorConstructor;\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface PromiseConstructor {\n    /**\n     * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.\n     * @param values An array or iterable of Promises.\n     * @returns A new Promise.\n     */\n    any<T extends readonly unknown[] | []>(values: T): Promise<Awaited<T[number]>>;\n\n    /**\n     * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.\n     * @param values An array or iterable of Promises.\n     * @returns A new Promise.\n     */\n    any<T>(values: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>>\n}\n';
  libFileMap["lib.es2021.string.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface String {\n    /**\n     * Replace all instances of a substring in a string, using a regular expression or search string.\n     * @param searchValue A string to search for.\n     * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.\n     */\n    replaceAll(searchValue: string | RegExp, replaceValue: string): string;\n\n    /**\n     * Replace all instances of a substring in a string, using a regular expression or search string.\n     * @param searchValue A string to search for.\n     * @param replacer A function that returns the replacement text.\n     */\n    replaceAll(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;\n}\n';
  libFileMap["lib.es2021.weakref.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


interface WeakRef<T extends object> {
    readonly [Symbol.toStringTag]: "WeakRef";

    /**
     * Returns the WeakRef instance's target object, or undefined if the target object has been
     * reclaimed.
     */
    deref(): T | undefined;
}

interface WeakRefConstructor {
    readonly prototype: WeakRef<any>;

    /**
     * Creates a WeakRef instance for the given target object.
     * @param target The target object for the WeakRef instance.
     */
    new<T extends object>(target: T): WeakRef<T>;
}

declare var WeakRef: WeakRefConstructor;

interface FinalizationRegistry<T> {
    readonly [Symbol.toStringTag]: "FinalizationRegistry";

    /**
     * Registers an object with the registry.
     * @param target The target object to register.
     * @param heldValue The value to pass to the finalizer for this object. This cannot be the
     * target object.
     * @param unregisterToken The token to pass to the unregister method to unregister the target
     * object. If provided (and not undefined), this must be an object. If not provided, the target
     * cannot be unregistered.
     */
    register(target: object, heldValue: T, unregisterToken?: object): void;

    /**
     * Unregisters an object from the registry.
     * @param unregisterToken The token that was used as the unregisterToken argument when calling
     * register to register the target object.
     */
    unregister(unregisterToken: object): void;
}

interface FinalizationRegistryConstructor {
    readonly prototype: FinalizationRegistry<any>;

    /**
     * Creates a finalization registry with an associated cleanup callback
     * @param cleanupCallback The callback to call after an object in the registry has been reclaimed.
     */
    new<T>(cleanupCallback: (heldValue: T) => void): FinalizationRegistry<T>;
}

declare var FinalizationRegistry: FinalizationRegistryConstructor;
`;
  libFileMap["lib.es5.d.ts"] = "/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib=\"true\"/>\n\n\n/////////////////////////////\n/// ECMAScript APIs\n/////////////////////////////\n\ndeclare var NaN: number;\ndeclare var Infinity: number;\n\n/**\n * Evaluates JavaScript code and executes it.\n * @param x A String value that contains valid JavaScript code.\n */\ndeclare function eval(x: string): any;\n\n/**\n * Converts a string to an integer.\n * @param string A string to convert into a number.\n * @param radix A value between 2 and 36 that specifies the base of the number in `string`.\n * If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal.\n * All other strings are considered decimal.\n */\ndeclare function parseInt(string: string, radix?: number): number;\n\n/**\n * Converts a string to a floating-point number.\n * @param string A string that contains a floating-point number.\n */\ndeclare function parseFloat(string: string): number;\n\n/**\n * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a number).\n * @param number A numeric value.\n */\ndeclare function isNaN(number: number): boolean;\n\n/**\n * Determines whether a supplied number is finite.\n * @param number Any numeric value.\n */\ndeclare function isFinite(number: number): boolean;\n\n/**\n * Gets the unencoded version of an encoded Uniform Resource Identifier (URI).\n * @param encodedURI A value representing an encoded URI.\n */\ndeclare function decodeURI(encodedURI: string): string;\n\n/**\n * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).\n * @param encodedURIComponent A value representing an encoded URI component.\n */\ndeclare function decodeURIComponent(encodedURIComponent: string): string;\n\n/**\n * Encodes a text string as a valid Uniform Resource Identifier (URI)\n * @param uri A value representing an encoded URI.\n */\ndeclare function encodeURI(uri: string): string;\n\n/**\n * Encodes a text string as a valid component of a Uniform Resource Identifier (URI).\n * @param uriComponent A value representing an encoded URI component.\n */\ndeclare function encodeURIComponent(uriComponent: string | number | boolean): string;\n\n/**\n * Computes a new string in which certain characters have been replaced by a hexadecimal escape sequence.\n * @deprecated A legacy feature for browser compatibility\n * @param string A string value\n */\ndeclare function escape(string: string): string;\n\n/**\n * Computes a new string in which hexadecimal escape sequences are replaced with the character that it represents.\n * @deprecated A legacy feature for browser compatibility\n * @param string A string value\n */\ndeclare function unescape(string: string): string;\n\ninterface Symbol {\n    /** Returns a string representation of an object. */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): symbol;\n}\n\ndeclare type PropertyKey = string | number | symbol;\n\ninterface PropertyDescriptor {\n    configurable?: boolean;\n    enumerable?: boolean;\n    value?: any;\n    writable?: boolean;\n    get?(): any;\n    set?(v: any): void;\n}\n\ninterface PropertyDescriptorMap {\n    [s: string]: PropertyDescriptor;\n}\n\ninterface Object {\n    /** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */\n    constructor: Function;\n\n    /** Returns a string representation of an object. */\n    toString(): string;\n\n    /** Returns a date converted to a string using the current locale. */\n    toLocaleString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Object;\n\n    /**\n     * Determines whether an object has a property with the specified name.\n     * @param v A property name.\n     */\n    hasOwnProperty(v: PropertyKey): boolean;\n\n    /**\n     * Determines whether an object exists in another object's prototype chain.\n     * @param v Another object whose prototype chain is to be checked.\n     */\n    isPrototypeOf(v: Object): boolean;\n\n    /**\n     * Determines whether a specified property is enumerable.\n     * @param v A property name.\n     */\n    propertyIsEnumerable(v: PropertyKey): boolean;\n}\n\ninterface ObjectConstructor {\n    new(value?: any): Object;\n    (): any;\n    (value: any): any;\n\n    /** A reference to the prototype for a class of objects. */\n    readonly prototype: Object;\n\n    /**\n     * Returns the prototype of an object.\n     * @param o The object that references the prototype.\n     */\n    getPrototypeOf(o: any): any;\n\n    /**\n     * Gets the own property descriptor of the specified object.\n     * An own property descriptor is one that is defined directly on the object and is not inherited from the object's prototype.\n     * @param o Object that contains the property.\n     * @param p Name of the property.\n     */\n    getOwnPropertyDescriptor(o: any, p: PropertyKey): PropertyDescriptor | undefined;\n\n    /**\n     * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly\n     * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.\n     * @param o Object that contains the own properties.\n     */\n    getOwnPropertyNames(o: any): string[];\n\n    /**\n     * Creates an object that has the specified prototype or that has null prototype.\n     * @param o Object to use as a prototype. May be null.\n     */\n    create(o: object | null): any;\n\n    /**\n     * Creates an object that has the specified prototype, and that optionally contains specified properties.\n     * @param o Object to use as a prototype. May be null\n     * @param properties JavaScript object that contains one or more property descriptors.\n     */\n    create(o: object | null, properties: PropertyDescriptorMap & ThisType<any>): any;\n\n    /**\n     * Adds a property to an object, or modifies attributes of an existing property.\n     * @param o Object on which to add or modify the property. This can be a native JavaScript object (that is, a user-defined object or a built in object) or a DOM object.\n     * @param p The property name.\n     * @param attributes Descriptor for the property. It can be for a data property or an accessor property.\n     */\n    defineProperty<T>(o: T, p: PropertyKey, attributes: PropertyDescriptor & ThisType<any>): T;\n\n    /**\n     * Adds one or more properties to an object, and/or modifies attributes of existing properties.\n     * @param o Object on which to add or modify the properties. This can be a native JavaScript object or a DOM object.\n     * @param properties JavaScript object that contains one or more descriptor objects. Each descriptor object describes a data property or an accessor property.\n     */\n    defineProperties<T>(o: T, properties: PropertyDescriptorMap & ThisType<any>): T;\n\n    /**\n     * Prevents the modification of attributes of existing properties, and prevents the addition of new properties.\n     * @param o Object on which to lock the attributes.\n     */\n    seal<T>(o: T): T;\n\n    /**\n     * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n     * @param a Object on which to lock the attributes.\n     */\n    freeze<T>(a: T[]): readonly T[];\n\n    /**\n     * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n     * @param f Object on which to lock the attributes.\n     */\n    freeze<T extends Function>(f: T): T;\n\n    /**\n     * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.\n     * @param o Object on which to lock the attributes.\n     */\n    freeze<T>(o: T): Readonly<T>;\n\n    /**\n     * Prevents the addition of new properties to an object.\n     * @param o Object to make non-extensible.\n     */\n    preventExtensions<T>(o: T): T;\n\n    /**\n     * Returns true if existing property attributes cannot be modified in an object and new properties cannot be added to the object.\n     * @param o Object to test.\n     */\n    isSealed(o: any): boolean;\n\n    /**\n     * Returns true if existing property attributes and values cannot be modified in an object, and new properties cannot be added to the object.\n     * @param o Object to test.\n     */\n    isFrozen(o: any): boolean;\n\n    /**\n     * Returns a value that indicates whether new properties can be added to an object.\n     * @param o Object to test.\n     */\n    isExtensible(o: any): boolean;\n\n    /**\n     * Returns the names of the enumerable string properties and methods of an object.\n     * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.\n     */\n    keys(o: object): string[];\n}\n\n/**\n * Provides functionality common to all JavaScript objects.\n */\ndeclare var Object: ObjectConstructor;\n\n/**\n * Creates a new function.\n */\ninterface Function {\n    /**\n     * Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.\n     * @param thisArg The object to be used as the this object.\n     * @param argArray A set of arguments to be passed to the function.\n     */\n    apply(this: Function, thisArg: any, argArray?: any): any;\n\n    /**\n     * Calls a method of an object, substituting another object for the current object.\n     * @param thisArg The object to be used as the current object.\n     * @param argArray A list of arguments to be passed to the method.\n     */\n    call(this: Function, thisArg: any, ...argArray: any[]): any;\n\n    /**\n     * For a given function, creates a bound function that has the same body as the original function.\n     * The this object of the bound function is associated with the specified object, and has the specified initial parameters.\n     * @param thisArg An object to which the this keyword can refer inside the new function.\n     * @param argArray A list of arguments to be passed to the new function.\n     */\n    bind(this: Function, thisArg: any, ...argArray: any[]): any;\n\n    /** Returns a string representation of a function. */\n    toString(): string;\n\n    prototype: any;\n    readonly length: number;\n\n    // Non-standard extensions\n    arguments: any;\n    caller: Function;\n}\n\ninterface FunctionConstructor {\n    /**\n     * Creates a new function.\n     * @param args A list of arguments the function accepts.\n     */\n    new(...args: string[]): Function;\n    (...args: string[]): Function;\n    readonly prototype: Function;\n}\n\ndeclare var Function: FunctionConstructor;\n\n/**\n * Extracts the type of the 'this' parameter of a function type, or 'unknown' if the function type has no 'this' parameter.\n */\ntype ThisParameterType<T> = T extends (this: infer U, ...args: any[]) => any ? U : unknown;\n\n/**\n * Removes the 'this' parameter from a function type.\n */\ntype OmitThisParameter<T> = unknown extends ThisParameterType<T> ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T;\n\ninterface CallableFunction extends Function {\n    /**\n     * Calls the function with the specified object as the this value and the elements of specified array as the arguments.\n     * @param thisArg The object to be used as the this object.\n     * @param args An array of argument values to be passed to the function.\n     */\n    apply<T, R>(this: (this: T) => R, thisArg: T): R;\n    apply<T, A extends any[], R>(this: (this: T, ...args: A) => R, thisArg: T, args: A): R;\n\n    /**\n     * Calls the function with the specified object as the this value and the specified rest arguments as the arguments.\n     * @param thisArg The object to be used as the this object.\n     * @param args Argument values to be passed to the function.\n     */\n    call<T, A extends any[], R>(this: (this: T, ...args: A) => R, thisArg: T, ...args: A): R;\n\n    /**\n     * For a given function, creates a bound function that has the same body as the original function.\n     * The this object of the bound function is associated with the specified object, and has the specified initial parameters.\n     * @param thisArg The object to be used as the this object.\n     * @param args Arguments to bind to the parameters of the function.\n     */\n    bind<T>(this: T, thisArg: ThisParameterType<T>): OmitThisParameter<T>;\n    bind<T, A0, A extends any[], R>(this: (this: T, arg0: A0, ...args: A) => R, thisArg: T, arg0: A0): (...args: A) => R;\n    bind<T, A0, A1, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1): (...args: A) => R;\n    bind<T, A0, A1, A2, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, arg2: A2, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2): (...args: A) => R;\n    bind<T, A0, A1, A2, A3, A extends any[], R>(this: (this: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: T, arg0: A0, arg1: A1, arg2: A2, arg3: A3): (...args: A) => R;\n    bind<T, AX, R>(this: (this: T, ...args: AX[]) => R, thisArg: T, ...args: AX[]): (...args: AX[]) => R;\n}\n\ninterface NewableFunction extends Function {\n    /**\n     * Calls the function with the specified object as the this value and the elements of specified array as the arguments.\n     * @param thisArg The object to be used as the this object.\n     * @param args An array of argument values to be passed to the function.\n     */\n    apply<T>(this: new () => T, thisArg: T): void;\n    apply<T, A extends any[]>(this: new (...args: A) => T, thisArg: T, args: A): void;\n\n    /**\n     * Calls the function with the specified object as the this value and the specified rest arguments as the arguments.\n     * @param thisArg The object to be used as the this object.\n     * @param args Argument values to be passed to the function.\n     */\n    call<T, A extends any[]>(this: new (...args: A) => T, thisArg: T, ...args: A): void;\n\n    /**\n     * For a given function, creates a bound function that has the same body as the original function.\n     * The this object of the bound function is associated with the specified object, and has the specified initial parameters.\n     * @param thisArg The object to be used as the this object.\n     * @param args Arguments to bind to the parameters of the function.\n     */\n    bind<T>(this: T, thisArg: any): T;\n    bind<A0, A extends any[], R>(this: new (arg0: A0, ...args: A) => R, thisArg: any, arg0: A0): new (...args: A) => R;\n    bind<A0, A1, A extends any[], R>(this: new (arg0: A0, arg1: A1, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1): new (...args: A) => R;\n    bind<A0, A1, A2, A extends any[], R>(this: new (arg0: A0, arg1: A1, arg2: A2, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1, arg2: A2): new (...args: A) => R;\n    bind<A0, A1, A2, A3, A extends any[], R>(this: new (arg0: A0, arg1: A1, arg2: A2, arg3: A3, ...args: A) => R, thisArg: any, arg0: A0, arg1: A1, arg2: A2, arg3: A3): new (...args: A) => R;\n    bind<AX, R>(this: new (...args: AX[]) => R, thisArg: any, ...args: AX[]): new (...args: AX[]) => R;\n}\n\ninterface IArguments {\n    [index: number]: any;\n    length: number;\n    callee: Function;\n}\n\ninterface String {\n    /** Returns a string representation of a string. */\n    toString(): string;\n\n    /**\n     * Returns the character at the specified index.\n     * @param pos The zero-based index of the desired character.\n     */\n    charAt(pos: number): string;\n\n    /**\n     * Returns the Unicode value of the character at the specified location.\n     * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.\n     */\n    charCodeAt(index: number): number;\n\n    /**\n     * Returns a string that contains the concatenation of two or more strings.\n     * @param strings The strings to append to the end of the string.\n     */\n    concat(...strings: string[]): string;\n\n    /**\n     * Returns the position of the first occurrence of a substring.\n     * @param searchString The substring to search for in the string\n     * @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.\n     */\n    indexOf(searchString: string, position?: number): number;\n\n    /**\n     * Returns the last occurrence of a substring in the string.\n     * @param searchString The substring to search for.\n     * @param position The index at which to begin searching. If omitted, the search begins at the end of the string.\n     */\n    lastIndexOf(searchString: string, position?: number): number;\n\n    /**\n     * Determines whether two strings are equivalent in the current locale.\n     * @param that String to compare to target string\n     */\n    localeCompare(that: string): number;\n\n    /**\n     * Matches a string with a regular expression, and returns an array containing the results of that search.\n     * @param regexp A variable name or string literal containing the regular expression pattern and flags.\n     */\n    match(regexp: string | RegExp): RegExpMatchArray | null;\n\n    /**\n     * Replaces text in a string, using a regular expression or search string.\n     * @param searchValue A string to search for.\n     * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.\n     */\n    replace(searchValue: string | RegExp, replaceValue: string): string;\n\n    /**\n     * Replaces text in a string, using a regular expression or search string.\n     * @param searchValue A string to search for.\n     * @param replacer A function that returns the replacement text.\n     */\n    replace(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;\n\n    /**\n     * Finds the first substring match in a regular expression search.\n     * @param regexp The regular expression pattern and applicable flags.\n     */\n    search(regexp: string | RegExp): number;\n\n    /**\n     * Returns a section of a string.\n     * @param start The index to the beginning of the specified portion of stringObj.\n     * @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end.\n     * If this value is not specified, the substring continues to the end of stringObj.\n     */\n    slice(start?: number, end?: number): string;\n\n    /**\n     * Split a string into substrings using the specified separator and return them as an array.\n     * @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned.\n     * @param limit A value used to limit the number of elements returned in the array.\n     */\n    split(separator: string | RegExp, limit?: number): string[];\n\n    /**\n     * Returns the substring at the specified location within a String object.\n     * @param start The zero-based index number indicating the beginning of the substring.\n     * @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.\n     * If end is omitted, the characters from start through the end of the original string are returned.\n     */\n    substring(start: number, end?: number): string;\n\n    /** Converts all the alphabetic characters in a string to lowercase. */\n    toLowerCase(): string;\n\n    /** Converts all alphabetic characters to lowercase, taking into account the host environment's current locale. */\n    toLocaleLowerCase(locales?: string | string[]): string;\n\n    /** Converts all the alphabetic characters in a string to uppercase. */\n    toUpperCase(): string;\n\n    /** Returns a string where all alphabetic characters have been converted to uppercase, taking into account the host environment's current locale. */\n    toLocaleUpperCase(locales?: string | string[]): string;\n\n    /** Removes the leading and trailing white space and line terminator characters from a string. */\n    trim(): string;\n\n    /** Returns the length of a String object. */\n    readonly length: number;\n\n    // IE extensions\n    /**\n     * Gets a substring beginning at the specified location and having the specified length.\n     * @deprecated A legacy feature for browser compatibility\n     * @param from The starting position of the desired substring. The index of the first character in the string is zero.\n     * @param length The number of characters to include in the returned substring.\n     */\n    substr(from: number, length?: number): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): string;\n\n    readonly [index: number]: string;\n}\n\ninterface StringConstructor {\n    new(value?: any): String;\n    (value?: any): string;\n    readonly prototype: String;\n    fromCharCode(...codes: number[]): string;\n}\n\n/**\n * Allows manipulation and formatting of text strings and determination and location of substrings within strings.\n */\ndeclare var String: StringConstructor;\n\ninterface Boolean {\n    /** Returns the primitive value of the specified object. */\n    valueOf(): boolean;\n}\n\ninterface BooleanConstructor {\n    new(value?: any): Boolean;\n    <T>(value?: T): boolean;\n    readonly prototype: Boolean;\n}\n\ndeclare var Boolean: BooleanConstructor;\n\ninterface Number {\n    /**\n     * Returns a string representation of an object.\n     * @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.\n     */\n    toString(radix?: number): string;\n\n    /**\n     * Returns a string representing a number in fixed-point notation.\n     * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.\n     */\n    toFixed(fractionDigits?: number): string;\n\n    /**\n     * Returns a string containing a number represented in exponential notation.\n     * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.\n     */\n    toExponential(fractionDigits?: number): string;\n\n    /**\n     * Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.\n     * @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.\n     */\n    toPrecision(precision?: number): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): number;\n}\n\ninterface NumberConstructor {\n    new(value?: any): Number;\n    (value?: any): number;\n    readonly prototype: Number;\n\n    /** The largest number that can be represented in JavaScript. Equal to approximately 1.79E+308. */\n    readonly MAX_VALUE: number;\n\n    /** The closest number to zero that can be represented in JavaScript. Equal to approximately 5.00E-324. */\n    readonly MIN_VALUE: number;\n\n    /**\n     * A value that is not a number.\n     * In equality comparisons, NaN does not equal any value, including itself. To test whether a value is equivalent to NaN, use the isNaN function.\n     */\n    readonly NaN: number;\n\n    /**\n     * A value that is less than the largest negative number that can be represented in JavaScript.\n     * JavaScript displays NEGATIVE_INFINITY values as -infinity.\n     */\n    readonly NEGATIVE_INFINITY: number;\n\n    /**\n     * A value greater than the largest number that can be represented in JavaScript.\n     * JavaScript displays POSITIVE_INFINITY values as infinity.\n     */\n    readonly POSITIVE_INFINITY: number;\n}\n\n/** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */\ndeclare var Number: NumberConstructor;\n\ninterface TemplateStringsArray extends ReadonlyArray<string> {\n    readonly raw: readonly string[];\n}\n\n/**\n * The type of `import.meta`.\n *\n * If you need to declare that a given property exists on `import.meta`,\n * this type may be augmented via interface merging.\n */\ninterface ImportMeta {\n}\n\n/**\n * The type for the optional second argument to `import()`.\n *\n * If your host environment supports additional options, this type may be\n * augmented via interface merging.\n */\ninterface ImportCallOptions {\n    assert?: ImportAssertions;\n}\n\n/**\n * The type for the `assert` property of the optional second argument to `import()`.\n */\ninterface ImportAssertions {\n    [key: string]: string;\n}\n\ninterface Math {\n    /** The mathematical constant e. This is Euler's number, the base of natural logarithms. */\n    readonly E: number;\n    /** The natural logarithm of 10. */\n    readonly LN10: number;\n    /** The natural logarithm of 2. */\n    readonly LN2: number;\n    /** The base-2 logarithm of e. */\n    readonly LOG2E: number;\n    /** The base-10 logarithm of e. */\n    readonly LOG10E: number;\n    /** Pi. This is the ratio of the circumference of a circle to its diameter. */\n    readonly PI: number;\n    /** The square root of 0.5, or, equivalently, one divided by the square root of 2. */\n    readonly SQRT1_2: number;\n    /** The square root of 2. */\n    readonly SQRT2: number;\n    /**\n     * Returns the absolute value of a number (the value without regard to whether it is positive or negative).\n     * For example, the absolute value of -5 is the same as the absolute value of 5.\n     * @param x A numeric expression for which the absolute value is needed.\n     */\n    abs(x: number): number;\n    /**\n     * Returns the arc cosine (or inverse cosine) of a number.\n     * @param x A numeric expression.\n     */\n    acos(x: number): number;\n    /**\n     * Returns the arcsine of a number.\n     * @param x A numeric expression.\n     */\n    asin(x: number): number;\n    /**\n     * Returns the arctangent of a number.\n     * @param x A numeric expression for which the arctangent is needed.\n     */\n    atan(x: number): number;\n    /**\n     * Returns the angle (in radians) from the X axis to a point.\n     * @param y A numeric expression representing the cartesian y-coordinate.\n     * @param x A numeric expression representing the cartesian x-coordinate.\n     */\n    atan2(y: number, x: number): number;\n    /**\n     * Returns the smallest integer greater than or equal to its numeric argument.\n     * @param x A numeric expression.\n     */\n    ceil(x: number): number;\n    /**\n     * Returns the cosine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    cos(x: number): number;\n    /**\n     * Returns e (the base of natural logarithms) raised to a power.\n     * @param x A numeric expression representing the power of e.\n     */\n    exp(x: number): number;\n    /**\n     * Returns the greatest integer less than or equal to its numeric argument.\n     * @param x A numeric expression.\n     */\n    floor(x: number): number;\n    /**\n     * Returns the natural logarithm (base e) of a number.\n     * @param x A numeric expression.\n     */\n    log(x: number): number;\n    /**\n     * Returns the larger of a set of supplied numeric expressions.\n     * @param values Numeric expressions to be evaluated.\n     */\n    max(...values: number[]): number;\n    /**\n     * Returns the smaller of a set of supplied numeric expressions.\n     * @param values Numeric expressions to be evaluated.\n     */\n    min(...values: number[]): number;\n    /**\n     * Returns the value of a base expression taken to a specified power.\n     * @param x The base value of the expression.\n     * @param y The exponent value of the expression.\n     */\n    pow(x: number, y: number): number;\n    /** Returns a pseudorandom number between 0 and 1. */\n    random(): number;\n    /**\n     * Returns a supplied numeric expression rounded to the nearest integer.\n     * @param x The value to be rounded to the nearest integer.\n     */\n    round(x: number): number;\n    /**\n     * Returns the sine of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    sin(x: number): number;\n    /**\n     * Returns the square root of a number.\n     * @param x A numeric expression.\n     */\n    sqrt(x: number): number;\n    /**\n     * Returns the tangent of a number.\n     * @param x A numeric expression that contains an angle measured in radians.\n     */\n    tan(x: number): number;\n}\n/** An intrinsic object that provides basic mathematics functionality and constants. */\ndeclare var Math: Math;\n\n/** Enables basic storage and retrieval of dates and times. */\ninterface Date {\n    /** Returns a string representation of a date. The format of the string depends on the locale. */\n    toString(): string;\n    /** Returns a date as a string value. */\n    toDateString(): string;\n    /** Returns a time as a string value. */\n    toTimeString(): string;\n    /** Returns a value as a string value appropriate to the host environment's current locale. */\n    toLocaleString(): string;\n    /** Returns a date as a string value appropriate to the host environment's current locale. */\n    toLocaleDateString(): string;\n    /** Returns a time as a string value appropriate to the host environment's current locale. */\n    toLocaleTimeString(): string;\n    /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */\n    valueOf(): number;\n    /** Gets the time value in milliseconds. */\n    getTime(): number;\n    /** Gets the year, using local time. */\n    getFullYear(): number;\n    /** Gets the year using Universal Coordinated Time (UTC). */\n    getUTCFullYear(): number;\n    /** Gets the month, using local time. */\n    getMonth(): number;\n    /** Gets the month of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMonth(): number;\n    /** Gets the day-of-the-month, using local time. */\n    getDate(): number;\n    /** Gets the day-of-the-month, using Universal Coordinated Time (UTC). */\n    getUTCDate(): number;\n    /** Gets the day of the week, using local time. */\n    getDay(): number;\n    /** Gets the day of the week using Universal Coordinated Time (UTC). */\n    getUTCDay(): number;\n    /** Gets the hours in a date, using local time. */\n    getHours(): number;\n    /** Gets the hours value in a Date object using Universal Coordinated Time (UTC). */\n    getUTCHours(): number;\n    /** Gets the minutes of a Date object, using local time. */\n    getMinutes(): number;\n    /** Gets the minutes of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMinutes(): number;\n    /** Gets the seconds of a Date object, using local time. */\n    getSeconds(): number;\n    /** Gets the seconds of a Date object using Universal Coordinated Time (UTC). */\n    getUTCSeconds(): number;\n    /** Gets the milliseconds of a Date, using local time. */\n    getMilliseconds(): number;\n    /** Gets the milliseconds of a Date object using Universal Coordinated Time (UTC). */\n    getUTCMilliseconds(): number;\n    /** Gets the difference in minutes between the time on the local computer and Universal Coordinated Time (UTC). */\n    getTimezoneOffset(): number;\n    /**\n     * Sets the date and time value in the Date object.\n     * @param time A numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT.\n     */\n    setTime(time: number): number;\n    /**\n     * Sets the milliseconds value in the Date object using local time.\n     * @param ms A numeric value equal to the millisecond value.\n     */\n    setMilliseconds(ms: number): number;\n    /**\n     * Sets the milliseconds value in the Date object using Universal Coordinated Time (UTC).\n     * @param ms A numeric value equal to the millisecond value.\n     */\n    setUTCMilliseconds(ms: number): number;\n\n    /**\n     * Sets the seconds value in the Date object using local time.\n     * @param sec A numeric value equal to the seconds value.\n     * @param ms A numeric value equal to the milliseconds value.\n     */\n    setSeconds(sec: number, ms?: number): number;\n    /**\n     * Sets the seconds value in the Date object using Universal Coordinated Time (UTC).\n     * @param sec A numeric value equal to the seconds value.\n     * @param ms A numeric value equal to the milliseconds value.\n     */\n    setUTCSeconds(sec: number, ms?: number): number;\n    /**\n     * Sets the minutes value in the Date object using local time.\n     * @param min A numeric value equal to the minutes value.\n     * @param sec A numeric value equal to the seconds value.\n     * @param ms A numeric value equal to the milliseconds value.\n     */\n    setMinutes(min: number, sec?: number, ms?: number): number;\n    /**\n     * Sets the minutes value in the Date object using Universal Coordinated Time (UTC).\n     * @param min A numeric value equal to the minutes value.\n     * @param sec A numeric value equal to the seconds value.\n     * @param ms A numeric value equal to the milliseconds value.\n     */\n    setUTCMinutes(min: number, sec?: number, ms?: number): number;\n    /**\n     * Sets the hour value in the Date object using local time.\n     * @param hours A numeric value equal to the hours value.\n     * @param min A numeric value equal to the minutes value.\n     * @param sec A numeric value equal to the seconds value.\n     * @param ms A numeric value equal to the milliseconds value.\n     */\n    setHours(hours: number, min?: number, sec?: number, ms?: number): number;\n    /**\n     * Sets the hours value in the Date object using Universal Coordinated Time (UTC).\n     * @param hours A numeric value equal to the hours value.\n     * @param min A numeric value equal to the minutes value.\n     * @param sec A numeric value equal to the seconds value.\n     * @param ms A numeric value equal to the milliseconds value.\n     */\n    setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;\n    /**\n     * Sets the numeric day-of-the-month value of the Date object using local time.\n     * @param date A numeric value equal to the day of the month.\n     */\n    setDate(date: number): number;\n    /**\n     * Sets the numeric day of the month in the Date object using Universal Coordinated Time (UTC).\n     * @param date A numeric value equal to the day of the month.\n     */\n    setUTCDate(date: number): number;\n    /**\n     * Sets the month value in the Date object using local time.\n     * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.\n     * @param date A numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.\n     */\n    setMonth(month: number, date?: number): number;\n    /**\n     * Sets the month value in the Date object using Universal Coordinated Time (UTC).\n     * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.\n     * @param date A numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.\n     */\n    setUTCMonth(month: number, date?: number): number;\n    /**\n     * Sets the year of the Date object using local time.\n     * @param year A numeric value for the year.\n     * @param month A zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.\n     * @param date A numeric value equal for the day of the month.\n     */\n    setFullYear(year: number, month?: number, date?: number): number;\n    /**\n     * Sets the year value in the Date object using Universal Coordinated Time (UTC).\n     * @param year A numeric value equal to the year.\n     * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.\n     * @param date A numeric value equal to the day of the month.\n     */\n    setUTCFullYear(year: number, month?: number, date?: number): number;\n    /** Returns a date converted to a string using Universal Coordinated Time (UTC). */\n    toUTCString(): string;\n    /** Returns a date as a string value in ISO format. */\n    toISOString(): string;\n    /** Used by the JSON.stringify method to enable the transformation of an object's data for JavaScript Object Notation (JSON) serialization. */\n    toJSON(key?: any): string;\n}\n\ninterface DateConstructor {\n    new(): Date;\n    new(value: number | string): Date;\n    new(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;\n    (): string;\n    readonly prototype: Date;\n    /**\n     * Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970.\n     * @param s A date string\n     */\n    parse(s: string): number;\n    /**\n     * Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date.\n     * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.\n     * @param month The month as a number between 0 and 11 (January to December).\n     * @param date The date as a number between 1 and 31.\n     * @param hours Must be supplied if minutes is supplied. A number from 0 to 23 (midnight to 11pm) that specifies the hour.\n     * @param minutes Must be supplied if seconds is supplied. A number from 0 to 59 that specifies the minutes.\n     * @param seconds Must be supplied if milliseconds is supplied. A number from 0 to 59 that specifies the seconds.\n     * @param ms A number from 0 to 999 that specifies the milliseconds.\n     */\n    UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;\n    now(): number;\n}\n\ndeclare var Date: DateConstructor;\n\ninterface RegExpMatchArray extends Array<string> {\n    index?: number;\n    input?: string;\n}\n\ninterface RegExpExecArray extends Array<string> {\n    index: number;\n    input: string;\n}\n\ninterface RegExp {\n    /**\n     * Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.\n     * @param string The String object or string literal on which to perform the search.\n     */\n    exec(string: string): RegExpExecArray | null;\n\n    /**\n     * Returns a Boolean value that indicates whether or not a pattern exists in a searched string.\n     * @param string String on which to perform the search.\n     */\n    test(string: string): boolean;\n\n    /** Returns a copy of the text of the regular expression pattern. Read-only. The regExp argument is a Regular expression object. It can be a variable name or a literal. */\n    readonly source: string;\n\n    /** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */\n    readonly global: boolean;\n\n    /** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */\n    readonly ignoreCase: boolean;\n\n    /** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */\n    readonly multiline: boolean;\n\n    lastIndex: number;\n\n    // Non-standard extensions\n    /** @deprecated A legacy feature for browser compatibility */\n    compile(pattern: string, flags?: string): this;\n}\n\ninterface RegExpConstructor {\n    new(pattern: RegExp | string): RegExp;\n    new(pattern: string, flags?: string): RegExp;\n    (pattern: RegExp | string): RegExp;\n    (pattern: string, flags?: string): RegExp;\n    readonly prototype: RegExp;\n\n    // Non-standard extensions\n    /** @deprecated A legacy feature for browser compatibility */\n    $1: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $2: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $3: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $4: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $5: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $6: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $7: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $8: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $9: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    input: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    $_: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    lastMatch: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    \"$&\": string;\n    /** @deprecated A legacy feature for browser compatibility */\n    lastParen: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    \"$+\": string;\n    /** @deprecated A legacy feature for browser compatibility */\n    leftContext: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    \"$`\": string;\n    /** @deprecated A legacy feature for browser compatibility */\n    rightContext: string;\n    /** @deprecated A legacy feature for browser compatibility */\n    \"$'\": string;\n}\n\ndeclare var RegExp: RegExpConstructor;\n\ninterface Error {\n    name: string;\n    message: string;\n    stack?: string;\n}\n\ninterface ErrorConstructor {\n    new(message?: string): Error;\n    (message?: string): Error;\n    readonly prototype: Error;\n}\n\ndeclare var Error: ErrorConstructor;\n\ninterface EvalError extends Error {\n}\n\ninterface EvalErrorConstructor extends ErrorConstructor {\n    new(message?: string): EvalError;\n    (message?: string): EvalError;\n    readonly prototype: EvalError;\n}\n\ndeclare var EvalError: EvalErrorConstructor;\n\ninterface RangeError extends Error {\n}\n\ninterface RangeErrorConstructor extends ErrorConstructor {\n    new(message?: string): RangeError;\n    (message?: string): RangeError;\n    readonly prototype: RangeError;\n}\n\ndeclare var RangeError: RangeErrorConstructor;\n\ninterface ReferenceError extends Error {\n}\n\ninterface ReferenceErrorConstructor extends ErrorConstructor {\n    new(message?: string): ReferenceError;\n    (message?: string): ReferenceError;\n    readonly prototype: ReferenceError;\n}\n\ndeclare var ReferenceError: ReferenceErrorConstructor;\n\ninterface SyntaxError extends Error {\n}\n\ninterface SyntaxErrorConstructor extends ErrorConstructor {\n    new(message?: string): SyntaxError;\n    (message?: string): SyntaxError;\n    readonly prototype: SyntaxError;\n}\n\ndeclare var SyntaxError: SyntaxErrorConstructor;\n\ninterface TypeError extends Error {\n}\n\ninterface TypeErrorConstructor extends ErrorConstructor {\n    new(message?: string): TypeError;\n    (message?: string): TypeError;\n    readonly prototype: TypeError;\n}\n\ndeclare var TypeError: TypeErrorConstructor;\n\ninterface URIError extends Error {\n}\n\ninterface URIErrorConstructor extends ErrorConstructor {\n    new(message?: string): URIError;\n    (message?: string): URIError;\n    readonly prototype: URIError;\n}\n\ndeclare var URIError: URIErrorConstructor;\n\ninterface JSON {\n    /**\n     * Converts a JavaScript Object Notation (JSON) string into an object.\n     * @param text A valid JSON string.\n     * @param reviver A function that transforms the results. This function is called for each member of the object.\n     * If a member contains nested objects, the nested objects are transformed before the parent object is.\n     */\n    parse(text: string, reviver?: (this: any, key: string, value: any) => any): any;\n    /**\n     * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n     * @param value A JavaScript value, usually an object or array, to be converted.\n     * @param replacer A function that transforms the results.\n     * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n     */\n    stringify(value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string;\n    /**\n     * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.\n     * @param value A JavaScript value, usually an object or array, to be converted.\n     * @param replacer An array of strings and numbers that acts as an approved list for selecting the object properties that will be stringified.\n     * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n     */\n    stringify(value: any, replacer?: (number | string)[] | null, space?: string | number): string;\n}\n\n/**\n * An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.\n */\ndeclare var JSON: JSON;\n\n\n/////////////////////////////\n/// ECMAScript Array API (specially handled by compiler)\n/////////////////////////////\n\ninterface ReadonlyArray<T> {\n    /**\n     * Gets the length of the array. This is a number one higher than the highest element defined in an array.\n     */\n    readonly length: number;\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n    /**\n     * Returns a string representation of an array. The elements are converted to string using their toLocaleString methods.\n     */\n    toLocaleString(): string;\n    /**\n     * Combines two or more arrays.\n     * @param items Additional items to add to the end of array1.\n     */\n    concat(...items: ConcatArray<T>[]): T[];\n    /**\n     * Combines two or more arrays.\n     * @param items Additional items to add to the end of array1.\n     */\n    concat(...items: (T | ConcatArray<T>)[]): T[];\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): T[];\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n     */\n    indexOf(searchElement: T, fromIndex?: number): number;\n    /**\n     * Returns the index of the last occurrence of a specified value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.\n     */\n    lastIndexOf(searchElement: T, fromIndex?: number): number;\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): this is readonly S[];\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): boolean;\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): boolean;\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: T, index: number, array: readonly T[]) => void, thisArg?: any): void;\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    map<U>(callbackfn: (value: T, index: number, array: readonly T[]) => U, thisArg?: any): U[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter<S extends T>(predicate: (value: T, index: number, array: readonly T[]) => value is S, thisArg?: any): S[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: T, index: number, array: readonly T[]) => unknown, thisArg?: any): T[];\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T): T;\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T, initialValue: T): T;\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U, initialValue: U): U;\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T): T;\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: readonly T[]) => T, initialValue: T): T;\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: readonly T[]) => U, initialValue: U): U;\n\n    readonly [n: number]: T;\n}\n\ninterface ConcatArray<T> {\n    readonly length: number;\n    readonly [n: number]: T;\n    join(separator?: string): string;\n    slice(start?: number, end?: number): T[];\n}\n\ninterface Array<T> {\n    /**\n     * Gets or sets the length of the array. This is a number one higher than the highest index in the array.\n     */\n    length: number;\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n    /**\n     * Returns a string representation of an array. The elements are converted to string using their toLocaleString methods.\n     */\n    toLocaleString(): string;\n    /**\n     * Removes the last element from an array and returns it.\n     * If the array is empty, undefined is returned and the array is not modified.\n     */\n    pop(): T | undefined;\n    /**\n     * Appends new elements to the end of an array, and returns the new length of the array.\n     * @param items New elements to add to the array.\n     */\n    push(...items: T[]): number;\n    /**\n     * Combines two or more arrays.\n     * This method returns a new array without modifying any existing arrays.\n     * @param items Additional arrays and/or items to add to the end of the array.\n     */\n    concat(...items: ConcatArray<T>[]): T[];\n    /**\n     * Combines two or more arrays.\n     * This method returns a new array without modifying any existing arrays.\n     * @param items Additional arrays and/or items to add to the end of the array.\n     */\n    concat(...items: (T | ConcatArray<T>)[]): T[];\n    /**\n     * Adds all the elements of an array into a string, separated by the specified separator string.\n     * @param separator A string used to separate one element of the array from the next in the resulting string. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n    /**\n     * Reverses the elements in an array in place.\n     * This method mutates the array and returns a reference to the same array.\n     */\n    reverse(): T[];\n    /**\n     * Removes the first element from an array and returns it.\n     * If the array is empty, undefined is returned and the array is not modified.\n     */\n    shift(): T | undefined;\n    /**\n     * Returns a copy of a section of an array.\n     * For both start and end, a negative index can be used to indicate an offset from the end of the array.\n     * For example, -2 refers to the second to last element of the array.\n     * @param start The beginning index of the specified portion of the array.\n     * If start is undefined, then the slice begins at index 0.\n     * @param end The end index of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     * If end is undefined, then the slice extends to the end of the array.\n     */\n    slice(start?: number, end?: number): T[];\n    /**\n     * Sorts an array in place.\n     * This method mutates the array and returns a reference to the same array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if the first argument is less than the second argument, zero if they're equal, and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: T, b: T) => number): this;\n    /**\n     * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n     * @param start The zero-based location in the array from which to start removing elements.\n     * @param deleteCount The number of elements to remove.\n     * @returns An array containing the elements that were deleted.\n     */\n    splice(start: number, deleteCount?: number): T[];\n    /**\n     * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.\n     * @param start The zero-based location in the array from which to start removing elements.\n     * @param deleteCount The number of elements to remove.\n     * @param items Elements to insert into the array in place of the deleted elements.\n     * @returns An array containing the elements that were deleted.\n     */\n    splice(start: number, deleteCount: number, ...items: T[]): T[];\n    /**\n     * Inserts new elements at the start of an array, and returns the new length of the array.\n     * @param items Elements to insert at the start of the array.\n     */\n    unshift(...items: T[]): number;\n    /**\n     * Returns the index of the first occurrence of a value in an array, or -1 if it is not present.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n     */\n    indexOf(searchElement: T, fromIndex?: number): number;\n    /**\n     * Returns the index of the last occurrence of a specified value in an array, or -1 if it is not present.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin searching backward. If fromIndex is omitted, the search starts at the last index in the array.\n     */\n    lastIndexOf(searchElement: T, fromIndex?: number): number;\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[];\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.\n     */\n    map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): S[];\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function. If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;\n    reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T): T;\n    reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue: T): T;\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;\n\n    [n: number]: T;\n}\n\ninterface ArrayConstructor {\n    new(arrayLength?: number): any[];\n    new <T>(arrayLength: number): T[];\n    new <T>(...items: T[]): T[];\n    (arrayLength?: number): any[];\n    <T>(arrayLength: number): T[];\n    <T>(...items: T[]): T[];\n    isArray(arg: any): arg is any[];\n    readonly prototype: any[];\n}\n\ndeclare var Array: ArrayConstructor;\n\ninterface TypedPropertyDescriptor<T> {\n    enumerable?: boolean;\n    configurable?: boolean;\n    writable?: boolean;\n    value?: T;\n    get?: () => T;\n    set?: (value: T) => void;\n}\n\ndeclare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;\ndeclare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;\ndeclare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;\ndeclare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;\n\ndeclare type PromiseConstructorLike = new <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void) => PromiseLike<T>;\n\ninterface PromiseLike<T> {\n    /**\n     * Attaches callbacks for the resolution and/or rejection of the Promise.\n     * @param onfulfilled The callback to execute when the Promise is resolved.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of which ever callback is executed.\n     */\n    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): PromiseLike<TResult1 | TResult2>;\n}\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface Promise<T> {\n    /**\n     * Attaches callbacks for the resolution and/or rejection of the Promise.\n     * @param onfulfilled The callback to execute when the Promise is resolved.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of which ever callback is executed.\n     */\n    then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;\n\n    /**\n     * Attaches a callback for only the rejection of the Promise.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of the callback.\n     */\n    catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;\n}\n\n/**\n * Recursively unwraps the \"awaited type\" of a type. Non-promise \"thenables\" should resolve to `never`. This emulates the behavior of `await`.\n */\ntype Awaited<T> =\n    T extends null | undefined ? T : // special case for `null | undefined` when not in `--strictNullChecks` mode\n        T extends object & { then(onfulfilled: infer F): any } ? // `await` only unwraps object types with a callable `then`. Non-object types are not unwrapped\n            F extends ((value: infer V, ...args: any) => any) ? // if the argument to `then` is callable, extracts the first argument\n                Awaited<V> : // recursively unwrap the value\n                never : // the argument to `then` was not callable\n        T; // non-object or non-thenable\n\ninterface ArrayLike<T> {\n    readonly length: number;\n    readonly [n: number]: T;\n}\n\n/**\n * Make all properties in T optional\n */\ntype Partial<T> = {\n    [P in keyof T]?: T[P];\n};\n\n/**\n * Make all properties in T required\n */\ntype Required<T> = {\n    [P in keyof T]-?: T[P];\n};\n\n/**\n * Make all properties in T readonly\n */\ntype Readonly<T> = {\n    readonly [P in keyof T]: T[P];\n};\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Pick<T, K extends keyof T> = {\n    [P in K]: T[P];\n};\n\n/**\n * Construct a type with a set of properties K of type T\n */\ntype Record<K extends keyof any, T> = {\n    [P in K]: T;\n};\n\n/**\n * Exclude from T those types that are assignable to U\n */\ntype Exclude<T, U> = T extends U ? never : T;\n\n/**\n * Extract from T those types that are assignable to U\n */\ntype Extract<T, U> = T extends U ? T : never;\n\n/**\n * Construct a type with the properties of T except for those in type K.\n */\ntype Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;\n\n/**\n * Exclude null and undefined from T\n */\ntype NonNullable<T> = T extends null | undefined ? never : T;\n\n/**\n * Obtain the parameters of a function type in a tuple\n */\ntype Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;\n\n/**\n * Obtain the parameters of a constructor function type in a tuple\n */\ntype ConstructorParameters<T extends abstract new (...args: any) => any> = T extends abstract new (...args: infer P) => any ? P : never;\n\n/**\n * Obtain the return type of a function type\n */\ntype ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;\n\n/**\n * Obtain the return type of a constructor function type\n */\ntype InstanceType<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;\n\n/**\n * Convert string literal type to uppercase\n */\ntype Uppercase<S extends string> = intrinsic;\n\n/**\n * Convert string literal type to lowercase\n */\ntype Lowercase<S extends string> = intrinsic;\n\n/**\n * Convert first character of string literal type to uppercase\n */\ntype Capitalize<S extends string> = intrinsic;\n\n/**\n * Convert first character of string literal type to lowercase\n */\ntype Uncapitalize<S extends string> = intrinsic;\n\n/**\n * Marker for contextual 'this' type\n */\ninterface ThisType<T> { }\n\n/**\n * Represents a raw buffer of binary data, which is used to store data for the\n * different typed arrays. ArrayBuffers cannot be read from or written to directly,\n * but can be passed to a typed array or DataView Object to interpret the raw\n * buffer as needed.\n */\ninterface ArrayBuffer {\n    /**\n     * Read-only. The length of the ArrayBuffer (in bytes).\n     */\n    readonly byteLength: number;\n\n    /**\n     * Returns a section of an ArrayBuffer.\n     */\n    slice(begin: number, end?: number): ArrayBuffer;\n}\n\n/**\n * Allowed ArrayBuffer types for the buffer of an ArrayBufferView and related Typed Arrays.\n */\ninterface ArrayBufferTypes {\n    ArrayBuffer: ArrayBuffer;\n}\ntype ArrayBufferLike = ArrayBufferTypes[keyof ArrayBufferTypes];\n\ninterface ArrayBufferConstructor {\n    readonly prototype: ArrayBuffer;\n    new(byteLength: number): ArrayBuffer;\n    isView(arg: any): arg is ArrayBufferView;\n}\ndeclare var ArrayBuffer: ArrayBufferConstructor;\n\ninterface ArrayBufferView {\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    byteOffset: number;\n}\n\ninterface DataView {\n    readonly buffer: ArrayBuffer;\n    readonly byteLength: number;\n    readonly byteOffset: number;\n    /**\n     * Gets the Float32 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getFloat32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n     * Gets the Float64 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getFloat64(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n     * Gets the Int8 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getInt8(byteOffset: number): number;\n\n    /**\n     * Gets the Int16 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getInt16(byteOffset: number, littleEndian?: boolean): number;\n    /**\n     * Gets the Int32 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getInt32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n     * Gets the Uint8 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getUint8(byteOffset: number): number;\n\n    /**\n     * Gets the Uint16 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getUint16(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n     * Gets the Uint32 value at the specified byte offset from the start of the view. There is\n     * no alignment constraint; multi-byte values may be fetched from any offset.\n     * @param byteOffset The place in the buffer at which the value should be retrieved.\n     */\n    getUint32(byteOffset: number, littleEndian?: boolean): number;\n\n    /**\n     * Stores an Float32 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setFloat32(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n     * Stores an Float64 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setFloat64(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n     * Stores an Int8 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     */\n    setInt8(byteOffset: number, value: number): void;\n\n    /**\n     * Stores an Int16 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setInt16(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n     * Stores an Int32 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setInt32(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n     * Stores an Uint8 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     */\n    setUint8(byteOffset: number, value: number): void;\n\n    /**\n     * Stores an Uint16 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setUint16(byteOffset: number, value: number, littleEndian?: boolean): void;\n\n    /**\n     * Stores an Uint32 value at the specified byte offset from the start of the view.\n     * @param byteOffset The place in the buffer at which the value should be set.\n     * @param value The value to set.\n     * @param littleEndian If false or undefined, a big-endian value should be written,\n     * otherwise a little-endian value should be written.\n     */\n    setUint32(byteOffset: number, value: number, littleEndian?: boolean): void;\n}\n\ninterface DataViewConstructor {\n    readonly prototype: DataView;\n    new(buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number): DataView;\n}\ndeclare var DataView: DataViewConstructor;\n\n/**\n * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested\n * number of bytes could not be allocated an exception is raised.\n */\ninterface Int8Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Int8Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Int8Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Int8Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Int8Array;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Int8Array;\n\n    [index: number]: number;\n}\ninterface Int8ArrayConstructor {\n    readonly prototype: Int8Array;\n    new(length: number): Int8Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Int8Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Int8Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Int8Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int8Array;\n\n\n}\ndeclare var Int8Array: Int8ArrayConstructor;\n\n/**\n * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint8Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Uint8Array) => any, thisArg?: any): Uint8Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Uint8Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Uint8Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Uint8Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Uint8Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Uint8Array;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Uint8Array;\n\n    [index: number]: number;\n}\n\ninterface Uint8ArrayConstructor {\n    readonly prototype: Uint8Array;\n    new(length: number): Uint8Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Uint8Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Uint8Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Uint8Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint8Array;\n\n}\ndeclare var Uint8Array: Uint8ArrayConstructor;\n\n/**\n * A typed array of 8-bit unsigned integer (clamped) values. The contents are initialized to 0.\n * If the requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint8ClampedArray {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Uint8ClampedArray) => any, thisArg?: any): Uint8ClampedArray;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Uint8ClampedArray) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => void, thisArg?: any): void;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Uint8ClampedArray) => number, thisArg?: any): Uint8ClampedArray;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8ClampedArray) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Uint8ClampedArray;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Uint8ClampedArray;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Uint8ClampedArray) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Uint8ClampedArray view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Uint8ClampedArray;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Uint8ClampedArray;\n\n    [index: number]: number;\n}\n\ninterface Uint8ClampedArrayConstructor {\n    readonly prototype: Uint8ClampedArray;\n    new(length: number): Uint8ClampedArray;\n    new(array: ArrayLike<number> | ArrayBufferLike): Uint8ClampedArray;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint8ClampedArray;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Uint8ClampedArray;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Uint8ClampedArray;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint8ClampedArray;\n}\ndeclare var Uint8ClampedArray: Uint8ClampedArrayConstructor;\n\n/**\n * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Int16Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Int16Array) => any, thisArg?: any): Int16Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Int16Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Int16Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Int16Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Int16Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Int16Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Int16Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Int16Array;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Int16Array;\n\n    [index: number]: number;\n}\n\ninterface Int16ArrayConstructor {\n    readonly prototype: Int16Array;\n    new(length: number): Int16Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Int16Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int16Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Int16Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Int16Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int16Array;\n\n\n}\ndeclare var Int16Array: Int16ArrayConstructor;\n\n/**\n * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint16Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Uint16Array) => any, thisArg?: any): Uint16Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Uint16Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Uint16Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Uint16Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Uint16Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Uint16Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Uint16Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Uint16Array;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Uint16Array;\n\n    [index: number]: number;\n}\n\ninterface Uint16ArrayConstructor {\n    readonly prototype: Uint16Array;\n    new(length: number): Uint16Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Uint16Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint16Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Uint16Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Uint16Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint16Array;\n\n\n}\ndeclare var Uint16Array: Uint16ArrayConstructor;\n/**\n * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Int32Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Int32Array) => any, thisArg?: any): Int32Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Int32Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Int32Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Int32Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Int32Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Int32Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Int32Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Int32Array;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Int32Array;\n\n    [index: number]: number;\n}\n\ninterface Int32ArrayConstructor {\n    readonly prototype: Int32Array;\n    new(length: number): Int32Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Int32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int32Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Int32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Int32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int32Array;\n\n}\ndeclare var Int32Array: Int32ArrayConstructor;\n\n/**\n * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the\n * requested number of bytes could not be allocated an exception is raised.\n */\ninterface Uint32Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Uint32Array) => any, thisArg?: any): Uint32Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Uint32Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Uint32Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Uint32Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Uint32Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Uint32Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Uint32Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Uint32Array;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Uint32Array;\n\n    [index: number]: number;\n}\n\ninterface Uint32ArrayConstructor {\n    readonly prototype: Uint32Array;\n    new(length: number): Uint32Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Uint32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Uint32Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Uint32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Uint32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Uint32Array;\n\n}\ndeclare var Uint32Array: Uint32ArrayConstructor;\n\n/**\n * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number\n * of bytes could not be allocated an exception is raised.\n */\ninterface Float32Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Float32Array) => any, thisArg?: any): Float32Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Float32Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Float32Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Float32Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Float32Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Float32Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * Gets a new Float32Array view of the ArrayBuffer store for this array, referencing the elements\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Float32Array;\n\n    /**\n     * Converts a number to a string by using the current locale.\n     */\n    toLocaleString(): string;\n\n    /**\n     * Returns a string representation of an array.\n     */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Float32Array;\n\n    [index: number]: number;\n}\n\ninterface Float32ArrayConstructor {\n    readonly prototype: Float32Array;\n    new(length: number): Float32Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Float32Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float32Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Float32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Float32Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Float32Array;\n\n\n}\ndeclare var Float32Array: Float32ArrayConstructor;\n\n/**\n * A typed array of 64-bit float values. The contents are initialized to 0. If the requested\n * number of bytes could not be allocated an exception is raised.\n */\ninterface Float64Array {\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * The ArrayBuffer instance referenced by the array.\n     */\n    readonly buffer: ArrayBufferLike;\n\n    /**\n     * The length in bytes of the array.\n     */\n    readonly byteLength: number;\n\n    /**\n     * The offset in bytes of the array.\n     */\n    readonly byteOffset: number;\n\n    /**\n     * Returns the this object after copying a section of the array identified by start and end\n     * to the same array starting at position target\n     * @param target If target is negative, it is treated as length+target where length is the\n     * length of the array.\n     * @param start If start is negative, it is treated as length+start. If end is negative, it\n     * is treated as length+end.\n     * @param end If not specified, length of the this object is used as its default value.\n     */\n    copyWithin(target: number, start: number, end?: number): this;\n\n    /**\n     * Determines whether all the members of an array satisfy the specified test.\n     * @param predicate A function that accepts up to three arguments. The every method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value false, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    every(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Changes all array elements from `start` to `end` index to a static `value` and returns the modified array\n     * @param value value to fill array section with\n     * @param start index to start filling the array at. If start is negative, it is treated as\n     * length+start where length is the length of the array.\n     * @param end index to stop filling the array at. If end is negative, it is treated as\n     * length+end.\n     */\n    fill(value: number, start?: number, end?: number): this;\n\n    /**\n     * Returns the elements of an array that meet the condition specified in a callback function.\n     * @param predicate A function that accepts up to three arguments. The filter method calls\n     * the predicate function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    filter(predicate: (value: number, index: number, array: Float64Array) => any, thisArg?: any): Float64Array;\n\n    /**\n     * Returns the value of the first element in the array where predicate is true, and undefined\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found, find\n     * immediately returns that element value. Otherwise, find returns undefined.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    find(predicate: (value: number, index: number, obj: Float64Array) => boolean, thisArg?: any): number | undefined;\n\n    /**\n     * Returns the index of the first element in the array where predicate is true, and -1\n     * otherwise.\n     * @param predicate find calls predicate once for each element of the array, in ascending\n     * order, until it finds one where predicate returns true. If such an element is found,\n     * findIndex immediately returns that element index. Otherwise, findIndex returns -1.\n     * @param thisArg If provided, it will be used as the this value for each invocation of\n     * predicate. If it is not provided, undefined is used instead.\n     */\n    findIndex(predicate: (value: number, index: number, obj: Float64Array) => boolean, thisArg?: any): number;\n\n    /**\n     * Performs the specified action for each element in an array.\n     * @param callbackfn  A function that accepts up to three arguments. forEach calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg  An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;\n\n    /**\n     * Returns the index of the first occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     *  search starts at index 0.\n     */\n    indexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * Adds all the elements of an array separated by the specified separator string.\n     * @param separator A string used to separate one element of an array from the next in the\n     * resulting String. If omitted, the array elements are separated with a comma.\n     */\n    join(separator?: string): string;\n\n    /**\n     * Returns the index of the last occurrence of a value in an array.\n     * @param searchElement The value to locate in the array.\n     * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the\n     * search starts at index 0.\n     */\n    lastIndexOf(searchElement: number, fromIndex?: number): number;\n\n    /**\n     * The length of the array.\n     */\n    readonly length: number;\n\n    /**\n     * Calls a defined callback function on each element of an array, and returns an array that\n     * contains the results.\n     * @param callbackfn A function that accepts up to three arguments. The map method calls the\n     * callbackfn function one time for each element in the array.\n     * @param thisArg An object to which the this keyword can refer in the callbackfn function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    map(callbackfn: (value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number): number;\n    reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array. The return value of\n     * the callback function is the accumulated result, and is provided as an argument in the next\n     * call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduce method calls the\n     * callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an\n     * argument instead of an array value.\n     */\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number): number;\n    reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue: number): number;\n\n    /**\n     * Calls the specified callback function for all the elements in an array, in descending order.\n     * The return value of the callback function is the accumulated result, and is provided as an\n     * argument in the next call to the callback function.\n     * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls\n     * the callbackfn function one time for each element in the array.\n     * @param initialValue If initialValue is specified, it is used as the initial value to start\n     * the accumulation. The first call to the callbackfn function provides this value as an argument\n     * instead of an array value.\n     */\n    reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;\n\n    /**\n     * Reverses the elements in an Array.\n     */\n    reverse(): Float64Array;\n\n    /**\n     * Sets a value or an array of values.\n     * @param array A typed or untyped array of values to set.\n     * @param offset The index in the current array at which the values are to be written.\n     */\n    set(array: ArrayLike<number>, offset?: number): void;\n\n    /**\n     * Returns a section of an array.\n     * @param start The beginning of the specified portion of the array.\n     * @param end The end of the specified portion of the array. This is exclusive of the element at the index 'end'.\n     */\n    slice(start?: number, end?: number): Float64Array;\n\n    /**\n     * Determines whether the specified callback function returns true for any element of an array.\n     * @param predicate A function that accepts up to three arguments. The some method calls\n     * the predicate function for each element in the array until the predicate returns a value\n     * which is coercible to the Boolean value true, or until the end of the array.\n     * @param thisArg An object to which the this keyword can refer in the predicate function.\n     * If thisArg is omitted, undefined is used as the this value.\n     */\n    some(predicate: (value: number, index: number, array: Float64Array) => unknown, thisArg?: any): boolean;\n\n    /**\n     * Sorts an array.\n     * @param compareFn Function used to determine the order of the elements. It is expected to return\n     * a negative value if first argument is less than second argument, zero if they're equal and a positive\n     * value otherwise. If omitted, the elements are sorted in ascending order.\n     * ```ts\n     * [11,2,22,1].sort((a, b) => a - b)\n     * ```\n     */\n    sort(compareFn?: (a: number, b: number) => number): this;\n\n    /**\n     * at begin, inclusive, up to end, exclusive.\n     * @param begin The index of the beginning of the array.\n     * @param end The index of the end of the array.\n     */\n    subarray(begin?: number, end?: number): Float64Array;\n\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Float64Array;\n\n    [index: number]: number;\n}\n\ninterface Float64ArrayConstructor {\n    readonly prototype: Float64Array;\n    new(length: number): Float64Array;\n    new(array: ArrayLike<number> | ArrayBufferLike): Float64Array;\n    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Float64Array;\n\n    /**\n     * The size in bytes of each element in the array.\n     */\n    readonly BYTES_PER_ELEMENT: number;\n\n    /**\n     * Returns a new array from a set of elements.\n     * @param items A set of elements to include in the new array object.\n     */\n    of(...items: number[]): Float64Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     */\n    from(arrayLike: ArrayLike<number>): Float64Array;\n\n    /**\n     * Creates an array from an array-like or iterable object.\n     * @param arrayLike An array-like or iterable object to convert to an array.\n     * @param mapfn A mapping function to call on every element of the array.\n     * @param thisArg Value of 'this' used to invoke the mapfn.\n     */\n    from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Float64Array;\n\n}\ndeclare var Float64Array: Float64ArrayConstructor;\n\n/////////////////////////////\n/// ECMAScript Internationalization API\n/////////////////////////////\n\ndeclare namespace Intl {\n    interface CollatorOptions {\n        usage?: string | undefined;\n        localeMatcher?: string | undefined;\n        numeric?: boolean | undefined;\n        caseFirst?: string | undefined;\n        sensitivity?: string | undefined;\n        ignorePunctuation?: boolean | undefined;\n    }\n\n    interface ResolvedCollatorOptions {\n        locale: string;\n        usage: string;\n        sensitivity: string;\n        ignorePunctuation: boolean;\n        collation: string;\n        caseFirst: string;\n        numeric: boolean;\n    }\n\n    interface Collator {\n        compare(x: string, y: string): number;\n        resolvedOptions(): ResolvedCollatorOptions;\n    }\n    var Collator: {\n        new(locales?: string | string[], options?: CollatorOptions): Collator;\n        (locales?: string | string[], options?: CollatorOptions): Collator;\n        supportedLocalesOf(locales: string | string[], options?: CollatorOptions): string[];\n    };\n\n    interface NumberFormatOptions {\n        localeMatcher?: string | undefined;\n        style?: string | undefined;\n        currency?: string | undefined;\n        currencyDisplay?: string | undefined;\n        currencySign?: string | undefined;\n        useGrouping?: boolean | undefined;\n        minimumIntegerDigits?: number | undefined;\n        minimumFractionDigits?: number | undefined;\n        maximumFractionDigits?: number | undefined;\n        minimumSignificantDigits?: number | undefined;\n        maximumSignificantDigits?: number | undefined;\n    }\n\n    interface ResolvedNumberFormatOptions {\n        locale: string;\n        numberingSystem: string;\n        style: string;\n        currency?: string;\n        currencyDisplay?: string;\n        minimumIntegerDigits: number;\n        minimumFractionDigits: number;\n        maximumFractionDigits: number;\n        minimumSignificantDigits?: number;\n        maximumSignificantDigits?: number;\n        useGrouping: boolean;\n    }\n\n    interface NumberFormat {\n        format(value: number): string;\n        resolvedOptions(): ResolvedNumberFormatOptions;\n    }\n    var NumberFormat: {\n        new(locales?: string | string[], options?: NumberFormatOptions): NumberFormat;\n        (locales?: string | string[], options?: NumberFormatOptions): NumberFormat;\n        supportedLocalesOf(locales: string | string[], options?: NumberFormatOptions): string[];\n    };\n\n    interface DateTimeFormatOptions {\n        localeMatcher?: \"best fit\" | \"lookup\" | undefined;\n        weekday?: \"long\" | \"short\" | \"narrow\" | undefined;\n        era?: \"long\" | \"short\" | \"narrow\" | undefined;\n        year?: \"numeric\" | \"2-digit\" | undefined;\n        month?: \"numeric\" | \"2-digit\" | \"long\" | \"short\" | \"narrow\" | undefined;\n        day?: \"numeric\" | \"2-digit\" | undefined;\n        hour?: \"numeric\" | \"2-digit\" | undefined;\n        minute?: \"numeric\" | \"2-digit\" | undefined;\n        second?: \"numeric\" | \"2-digit\" | undefined;\n        timeZoneName?: \"long\" | \"short\" | undefined;\n        formatMatcher?: \"best fit\" | \"basic\" | undefined;\n        hour12?: boolean | undefined;\n        timeZone?: string | undefined;\n    }\n\n    interface ResolvedDateTimeFormatOptions {\n        locale: string;\n        calendar: string;\n        numberingSystem: string;\n        timeZone: string;\n        hour12?: boolean;\n        weekday?: string;\n        era?: string;\n        year?: string;\n        month?: string;\n        day?: string;\n        hour?: string;\n        minute?: string;\n        second?: string;\n        timeZoneName?: string;\n    }\n\n    interface DateTimeFormat {\n        format(date?: Date | number): string;\n        resolvedOptions(): ResolvedDateTimeFormatOptions;\n    }\n    var DateTimeFormat: {\n        new(locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;\n        (locales?: string | string[], options?: DateTimeFormatOptions): DateTimeFormat;\n        supportedLocalesOf(locales: string | string[], options?: DateTimeFormatOptions): string[];\n    };\n}\n\ninterface String {\n    /**\n     * Determines whether two strings are equivalent in the current or specified locale.\n     * @param that String to compare to target string\n     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.\n     * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.\n     */\n    localeCompare(that: string, locales?: string | string[], options?: Intl.CollatorOptions): number;\n}\n\ninterface Number {\n    /**\n     * Converts a number to a string by using the current or specified locale.\n     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n     * @param options An object that contains one or more properties that specify comparison options.\n     */\n    toLocaleString(locales?: string | string[], options?: Intl.NumberFormatOptions): string;\n}\n\ninterface Date {\n    /**\n     * Converts a date and time to a string by using the current or specified locale.\n     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n     * @param options An object that contains one or more properties that specify comparison options.\n     */\n    toLocaleString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n    /**\n     * Converts a date to a string by using the current or specified locale.\n     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n     * @param options An object that contains one or more properties that specify comparison options.\n     */\n    toLocaleDateString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n\n    /**\n     * Converts a time to a string by using the current or specified locale.\n     * @param locales A locale string or array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.\n     * @param options An object that contains one or more properties that specify comparison options.\n     */\n    toLocaleTimeString(locales?: string | string[], options?: Intl.DateTimeFormatOptions): string;\n}\n";
  libFileMap["lib.es6.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2015" />\n/// <reference lib="dom" />\n/// <reference lib="dom.iterable" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n';
  libFileMap["lib.esnext.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="es2021" />\n/// <reference lib="esnext.intl" />\n';
  libFileMap["lib.esnext.full.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/// <reference lib="esnext" />\n/// <reference lib="dom" />\n/// <reference lib="webworker.importscripts" />\n/// <reference lib="scripthost" />\n/// <reference lib="dom.iterable" />';
  libFileMap["lib.esnext.intl.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ndeclare namespace Intl {\n   // Empty for now\n}\n';
  libFileMap["lib.esnext.promise.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface AggregateError extends Error {\n    errors: any[]\n}\n\ninterface AggregateErrorConstructor {\n    new(errors: Iterable<any>, message?: string): AggregateError;\n    (errors: Iterable<any>, message?: string): AggregateError;\n    readonly prototype: AggregateError;\n}\n\ndeclare var AggregateError: AggregateErrorConstructor;\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface PromiseConstructor {\n    /**\n     * The any function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an AggregateError containing an array of rejection reasons if all of the given promises are rejected. It resolves all elements of the passed iterable to promises as it runs this algorithm.\n     * @param values An array or iterable of Promises.\n     * @returns A new Promise.\n     */\n    any<T>(values: (T | PromiseLike<T>)[] | Iterable<T | PromiseLike<T>>): Promise<T>\n}\n';
  libFileMap["lib.esnext.string.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\ninterface String {\n    /**\n     * Replace all instances of a substring in a string, using a regular expression or search string.\n     * @param searchValue A string to search for.\n     * @param replaceValue A string containing the text to replace for every successful match of searchValue in this string.\n     */\n    replaceAll(searchValue: string | RegExp, replaceValue: string): string;\n\n    /**\n     * Replace all instances of a substring in a string, using a regular expression or search string.\n     * @param searchValue A string to search for.\n     * @param replacer A function that returns the replacement text.\n     */\n    replaceAll(searchValue: string | RegExp, replacer: (substring: string, ...args: any[]) => string): string;\n}\n';
  libFileMap["lib.esnext.weakref.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


interface WeakRef<T extends object> {
    readonly [Symbol.toStringTag]: "WeakRef";

    /**
     * Returns the WeakRef instance's target object, or undefined if the target object has been
     * reclaimed.
     */
    deref(): T | undefined;
}

interface WeakRefConstructor {
    readonly prototype: WeakRef<any>;

    /**
     * Creates a WeakRef instance for the given target object.
     * @param target The target object for the WeakRef instance.
     */
    new<T extends object>(target?: T): WeakRef<T>;
}

declare var WeakRef: WeakRefConstructor;

interface FinalizationRegistry {
    readonly [Symbol.toStringTag]: "FinalizationRegistry";

    /**
     * Registers an object with the registry.
     * @param target The target object to register.
     * @param heldValue The value to pass to the finalizer for this object. This cannot be the
     * target object.
     * @param unregisterToken The token to pass to the unregister method to unregister the target
     * object. If provided (and not undefined), this must be an object. If not provided, the target
     * cannot be unregistered.
     */
    register(target: object, heldValue: any, unregisterToken?: object): void;

    /**
     * Unregisters an object from the registry.
     * @param unregisterToken The token that was used as the unregisterToken argument when calling
     * register to register the target object.
     */
    unregister(unregisterToken: object): void;
}

interface FinalizationRegistryConstructor {
    readonly prototype: FinalizationRegistry;

    /**
     * Creates a finalization registry with an associated cleanup callback
     * @param cleanupCallback The callback to call after an object in the registry has been reclaimed.
     */
    new(cleanupCallback: (heldValue: any) => void): FinalizationRegistry;
}

declare var FinalizationRegistry: FinalizationRegistryConstructor;
`;
  libFileMap["lib.scripthost.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>




/////////////////////////////
/// Windows Script Host APIS
/////////////////////////////


interface ActiveXObject {
    new (s: string): any;
}
declare var ActiveXObject: ActiveXObject;

interface ITextWriter {
    Write(s: string): void;
    WriteLine(s: string): void;
    Close(): void;
}

interface TextStreamBase {
    /**
     * The column number of the current character position in an input stream.
     */
    Column: number;

    /**
     * The current line number in an input stream.
     */
    Line: number;

    /**
     * Closes a text stream.
     * It is not necessary to close standard streams; they close automatically when the process ends. If
     * you close a standard stream, be aware that any other pointers to that standard stream become invalid.
     */
    Close(): void;
}

interface TextStreamWriter extends TextStreamBase {
    /**
     * Sends a string to an output stream.
     */
    Write(s: string): void;

    /**
     * Sends a specified number of blank lines (newline characters) to an output stream.
     */
    WriteBlankLines(intLines: number): void;

    /**
     * Sends a string followed by a newline character to an output stream.
     */
    WriteLine(s: string): void;
}

interface TextStreamReader extends TextStreamBase {
    /**
     * Returns a specified number of characters from an input stream, starting at the current pointer position.
     * Does not return until the ENTER key is pressed.
     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
     */
    Read(characters: number): string;

    /**
     * Returns all characters from an input stream.
     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
     */
    ReadAll(): string;

    /**
     * Returns an entire line from an input stream.
     * Although this method extracts the newline character, it does not add it to the returned string.
     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
     */
    ReadLine(): string;

    /**
     * Skips a specified number of characters when reading from an input text stream.
     * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
     * @param characters Positive number of characters to skip forward. (Backward skipping is not supported.)
     */
    Skip(characters: number): void;

    /**
     * Skips the next line when reading from an input text stream.
     * Can only be used on a stream in reading mode, not writing or appending mode.
     */
    SkipLine(): void;

    /**
     * Indicates whether the stream pointer position is at the end of a line.
     */
    AtEndOfLine: boolean;

    /**
     * Indicates whether the stream pointer position is at the end of a stream.
     */
    AtEndOfStream: boolean;
}

declare var WScript: {
    /**
     * Outputs text to either a message box (under WScript.exe) or the command console window followed by
     * a newline (under CScript.exe).
     */
    Echo(s: any): void;

    /**
     * Exposes the write-only error output stream for the current script.
     * Can be accessed only while using CScript.exe.
     */
    StdErr: TextStreamWriter;

    /**
     * Exposes the write-only output stream for the current script.
     * Can be accessed only while using CScript.exe.
     */
    StdOut: TextStreamWriter;
    Arguments: { length: number; Item(n: number): string; };

    /**
     *  The full path of the currently running script.
     */
    ScriptFullName: string;

    /**
     * Forces the script to stop immediately, with an optional exit code.
     */
    Quit(exitCode?: number): number;

    /**
     * The Windows Script Host build version number.
     */
    BuildVersion: number;

    /**
     * Fully qualified path of the host executable.
     */
    FullName: string;

    /**
     * Gets/sets the script mode - interactive(true) or batch(false).
     */
    Interactive: boolean;

    /**
     * The name of the host executable (WScript.exe or CScript.exe).
     */
    Name: string;

    /**
     * Path of the directory containing the host executable.
     */
    Path: string;

    /**
     * The filename of the currently running script.
     */
    ScriptName: string;

    /**
     * Exposes the read-only input stream for the current script.
     * Can be accessed only while using CScript.exe.
     */
    StdIn: TextStreamReader;

    /**
     * Windows Script Host version
     */
    Version: string;

    /**
     * Connects a COM object's event sources to functions named with a given prefix, in the form prefix_event.
     */
    ConnectObject(objEventSource: any, strPrefix: string): void;

    /**
     * Creates a COM object.
     * @param strProgiID
     * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
     */
    CreateObject(strProgID: string, strPrefix?: string): any;

    /**
     * Disconnects a COM object from its event sources.
     */
    DisconnectObject(obj: any): void;

    /**
     * Retrieves an existing object with the specified ProgID from memory, or creates a new one from a file.
     * @param strPathname Fully qualified path to the file containing the object persisted to disk.
     *                       For objects in memory, pass a zero-length string.
     * @param strProgID
     * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
     */
    GetObject(strPathname: string, strProgID?: string, strPrefix?: string): any;

    /**
     * Suspends script execution for a specified length of time, then continues execution.
     * @param intTime Interval (in milliseconds) to suspend script execution.
     */
    Sleep(intTime: number): void;
};

/**
 * WSH is an alias for WScript under Windows Script Host
 */
declare var WSH: typeof WScript;

/**
 * Represents an Automation SAFEARRAY
 */
declare class SafeArray<T = any> {
    private constructor();
    private SafeArray_typekey: SafeArray<T>;
}

/**
 * Allows enumerating over a COM collection, which may not have indexed item access.
 */
interface Enumerator<T = any> {
    /**
     * Returns true if the current item is the last one in the collection, or the collection is empty,
     * or the current item is undefined.
     */
    atEnd(): boolean;

    /**
     * Returns the current item in the collection
     */
    item(): T;

    /**
     * Resets the current item in the collection to the first item. If there are no items in the collection,
     * the current item is set to undefined.
     */
    moveFirst(): void;

    /**
     * Moves the current item to the next item in the collection. If the enumerator is at the end of
     * the collection or the collection is empty, the current item is set to undefined.
     */
    moveNext(): void;
}

interface EnumeratorConstructor {
    new <T = any>(safearray: SafeArray<T>): Enumerator<T>;
    new <T = any>(collection: { Item(index: any): T }): Enumerator<T>;
    new <T = any>(collection: any): Enumerator<T>;
}

declare var Enumerator: EnumeratorConstructor;

/**
 * Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.
 */
interface VBArray<T = any> {
    /**
     * Returns the number of dimensions (1-based).
     */
    dimensions(): number;

    /**
     * Takes an index for each dimension in the array, and returns the item at the corresponding location.
     */
    getItem(dimension1Index: number, ...dimensionNIndexes: number[]): T;

    /**
     * Returns the smallest available index for a given dimension.
     * @param dimension 1-based dimension (defaults to 1)
     */
    lbound(dimension?: number): number;

    /**
     * Returns the largest available index for a given dimension.
     * @param dimension 1-based dimension (defaults to 1)
     */
    ubound(dimension?: number): number;

    /**
     * Returns a Javascript array with all the elements in the VBArray. If there are multiple dimensions,
     * each successive dimension is appended to the end of the array.
     * Example: [[1,2,3],[4,5,6]] becomes [1,2,3,4,5,6]
     */
    toArray(): T[];
}

interface VBArrayConstructor {
    new <T = any>(safeArray: SafeArray<T>): VBArray<T>;
}

declare var VBArray: VBArrayConstructor;

/**
 * Automation date (VT_DATE)
 */
declare class VarDate {
    private constructor();
    private VarDate_typekey: VarDate;
}

interface DateConstructor {
    new (vd: VarDate): Date;
}

interface Date {
    getVarDate: () => VarDate;
}
`;
  libFileMap["lib.webworker.d.ts"] = `/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */



/// <reference no-default-lib="true"/>


/////////////////////////////
/// Worker APIs
/////////////////////////////

interface AddEventListenerOptions extends EventListenerOptions {
    once?: boolean;
    passive?: boolean;
    signal?: AbortSignal;
}

interface AesCbcParams extends Algorithm {
    iv: BufferSource;
}

interface AesCtrParams extends Algorithm {
    counter: BufferSource;
    length: number;
}

interface AesDerivedKeyParams extends Algorithm {
    length: number;
}

interface AesGcmParams extends Algorithm {
    additionalData?: BufferSource;
    iv: BufferSource;
    tagLength?: number;
}

interface AesKeyAlgorithm extends KeyAlgorithm {
    length: number;
}

interface AesKeyGenParams extends Algorithm {
    length: number;
}

interface Algorithm {
    name: string;
}

interface AudioConfiguration {
    bitrate?: number;
    channels?: string;
    contentType: string;
    samplerate?: number;
    spatialRendering?: boolean;
}

interface BlobPropertyBag {
    endings?: EndingType;
    type?: string;
}

interface CacheQueryOptions {
    ignoreMethod?: boolean;
    ignoreSearch?: boolean;
    ignoreVary?: boolean;
}

interface ClientQueryOptions {
    includeUncontrolled?: boolean;
    type?: ClientTypes;
}

interface CloseEventInit extends EventInit {
    code?: number;
    reason?: string;
    wasClean?: boolean;
}

interface CryptoKeyPair {
    privateKey?: CryptoKey;
    publicKey?: CryptoKey;
}

interface CustomEventInit<T = any> extends EventInit {
    detail?: T;
}

interface DOMMatrix2DInit {
    a?: number;
    b?: number;
    c?: number;
    d?: number;
    e?: number;
    f?: number;
    m11?: number;
    m12?: number;
    m21?: number;
    m22?: number;
    m41?: number;
    m42?: number;
}

interface DOMMatrixInit extends DOMMatrix2DInit {
    is2D?: boolean;
    m13?: number;
    m14?: number;
    m23?: number;
    m24?: number;
    m31?: number;
    m32?: number;
    m33?: number;
    m34?: number;
    m43?: number;
    m44?: number;
}

interface DOMPointInit {
    w?: number;
    x?: number;
    y?: number;
    z?: number;
}

interface DOMQuadInit {
    p1?: DOMPointInit;
    p2?: DOMPointInit;
    p3?: DOMPointInit;
    p4?: DOMPointInit;
}

interface DOMRectInit {
    height?: number;
    width?: number;
    x?: number;
    y?: number;
}

interface EcKeyGenParams extends Algorithm {
    namedCurve: NamedCurve;
}

interface EcKeyImportParams extends Algorithm {
    namedCurve: NamedCurve;
}

interface EcdhKeyDeriveParams extends Algorithm {
    public: CryptoKey;
}

interface EcdsaParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
}

interface ErrorEventInit extends EventInit {
    colno?: number;
    error?: any;
    filename?: string;
    lineno?: number;
    message?: string;
}

interface EventInit {
    bubbles?: boolean;
    cancelable?: boolean;
    composed?: boolean;
}

interface EventListenerOptions {
    capture?: boolean;
}

interface EventSourceInit {
    withCredentials?: boolean;
}

interface ExtendableEventInit extends EventInit {
}

interface ExtendableMessageEventInit extends ExtendableEventInit {
    data?: any;
    lastEventId?: string;
    origin?: string;
    ports?: MessagePort[];
    source?: Client | ServiceWorker | MessagePort | null;
}

interface FetchEventInit extends ExtendableEventInit {
    clientId?: string;
    handled?: Promise<undefined>;
    preloadResponse?: Promise<any>;
    replacesClientId?: string;
    request: Request;
    resultingClientId?: string;
}

interface FilePropertyBag extends BlobPropertyBag {
    lastModified?: number;
}

interface FontFaceDescriptors {
    display?: string;
    featureSettings?: string;
    stretch?: string;
    style?: string;
    unicodeRange?: string;
    variant?: string;
    weight?: string;
}

interface FontFaceSetLoadEventInit extends EventInit {
    fontfaces?: FontFace[];
}

interface GetNotificationOptions {
    tag?: string;
}

interface HkdfParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
    info: BufferSource;
    salt: BufferSource;
}

interface HmacImportParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
    length?: number;
}

interface HmacKeyGenParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
    length?: number;
}

interface IDBDatabaseInfo {
    name?: string;
    version?: number;
}

interface IDBIndexParameters {
    multiEntry?: boolean;
    unique?: boolean;
}

interface IDBObjectStoreParameters {
    autoIncrement?: boolean;
    keyPath?: string | string[] | null;
}

interface IDBVersionChangeEventInit extends EventInit {
    newVersion?: number | null;
    oldVersion?: number;
}

interface ImageBitmapOptions {
    colorSpaceConversion?: ColorSpaceConversion;
    imageOrientation?: ImageOrientation;
    premultiplyAlpha?: PremultiplyAlpha;
    resizeHeight?: number;
    resizeQuality?: ResizeQuality;
    resizeWidth?: number;
}

interface ImageBitmapRenderingContextSettings {
    alpha?: boolean;
}

interface ImageDataSettings {
    colorSpace?: PredefinedColorSpace;
}

interface ImportMeta {
    url: string;
}

interface JsonWebKey {
    alg?: string;
    crv?: string;
    d?: string;
    dp?: string;
    dq?: string;
    e?: string;
    ext?: boolean;
    k?: string;
    key_ops?: string[];
    kty?: string;
    n?: string;
    oth?: RsaOtherPrimesInfo[];
    p?: string;
    q?: string;
    qi?: string;
    use?: string;
    x?: string;
    y?: string;
}

interface KeyAlgorithm {
    name: string;
}

interface MediaCapabilitiesDecodingInfo extends MediaCapabilitiesInfo {
    configuration?: MediaDecodingConfiguration;
}

interface MediaCapabilitiesEncodingInfo extends MediaCapabilitiesInfo {
    configuration?: MediaEncodingConfiguration;
}

interface MediaCapabilitiesInfo {
    powerEfficient: boolean;
    smooth: boolean;
    supported: boolean;
}

interface MediaConfiguration {
    audio?: AudioConfiguration;
    video?: VideoConfiguration;
}

interface MediaDecodingConfiguration extends MediaConfiguration {
    type: MediaDecodingType;
}

interface MediaEncodingConfiguration extends MediaConfiguration {
    type: MediaEncodingType;
}

interface MessageEventInit<T = any> extends EventInit {
    data?: T;
    lastEventId?: string;
    origin?: string;
    ports?: MessagePort[];
    source?: MessageEventSource | null;
}

interface MultiCacheQueryOptions extends CacheQueryOptions {
    cacheName?: string;
}

interface NotificationAction {
    action: string;
    icon?: string;
    title: string;
}

interface NotificationEventInit extends ExtendableEventInit {
    action?: string;
    notification: Notification;
}

interface NotificationOptions {
    actions?: NotificationAction[];
    badge?: string;
    body?: string;
    data?: any;
    dir?: NotificationDirection;
    icon?: string;
    image?: string;
    lang?: string;
    renotify?: boolean;
    requireInteraction?: boolean;
    silent?: boolean;
    tag?: string;
    timestamp?: DOMTimeStamp;
    vibrate?: VibratePattern;
}

interface Pbkdf2Params extends Algorithm {
    hash: HashAlgorithmIdentifier;
    iterations: number;
    salt: BufferSource;
}

interface PerformanceMarkOptions {
    detail?: any;
    startTime?: DOMHighResTimeStamp;
}

interface PerformanceMeasureOptions {
    detail?: any;
    duration?: DOMHighResTimeStamp;
    end?: string | DOMHighResTimeStamp;
    start?: string | DOMHighResTimeStamp;
}

interface PerformanceObserverInit {
    buffered?: boolean;
    entryTypes?: string[];
    type?: string;
}

interface PermissionDescriptor {
    name: PermissionName;
}

interface ProgressEventInit extends EventInit {
    lengthComputable?: boolean;
    loaded?: number;
    total?: number;
}

interface PromiseRejectionEventInit extends EventInit {
    promise: Promise<any>;
    reason?: any;
}

interface PushEventInit extends ExtendableEventInit {
    data?: PushMessageDataInit;
}

interface PushSubscriptionJSON {
    endpoint?: string;
    expirationTime?: DOMTimeStamp | null;
    keys?: Record<string, string>;
}

interface PushSubscriptionOptionsInit {
    applicationServerKey?: BufferSource | string | null;
    userVisibleOnly?: boolean;
}

interface QueuingStrategy<T = any> {
    highWaterMark?: number;
    size?: QueuingStrategySize<T>;
}

interface QueuingStrategyInit {
    /**
     * Creates a new ByteLengthQueuingStrategy with the provided high water mark.
     *
     * Note that the provided high water mark will not be validated ahead of time. Instead, if it is negative, NaN, or not a number, the resulting ByteLengthQueuingStrategy will cause the corresponding stream constructor to throw.
     */
    highWaterMark: number;
}

interface ReadableStreamDefaultReadDoneResult {
    done: true;
    value?: undefined;
}

interface ReadableStreamDefaultReadValueResult<T> {
    done: false;
    value: T;
}

interface ReadableWritablePair<R = any, W = any> {
    readable: ReadableStream<R>;
    /**
     * Provides a convenient, chainable way of piping this readable stream through a transform stream (or any other { writable, readable } pair). It simply pipes the stream into the writable side of the supplied pair, and returns the readable side for further use.
     *
     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
     */
    writable: WritableStream<W>;
}

interface RegistrationOptions {
    scope?: string;
    type?: WorkerType;
    updateViaCache?: ServiceWorkerUpdateViaCache;
}

interface RequestInit {
    /** A BodyInit object or null to set request's body. */
    body?: BodyInit | null;
    /** A string indicating how the request will interact with the browser's cache to set request's cache. */
    cache?: RequestCache;
    /** A string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. Sets request's credentials. */
    credentials?: RequestCredentials;
    /** A Headers object, an object literal, or an array of two-item arrays to set request's headers. */
    headers?: HeadersInit;
    /** A cryptographic hash of the resource to be fetched by request. Sets request's integrity. */
    integrity?: string;
    /** A boolean to set request's keepalive. */
    keepalive?: boolean;
    /** A string to set request's method. */
    method?: string;
    /** A string to indicate whether the request will use CORS, or will be restricted to same-origin URLs. Sets request's mode. */
    mode?: RequestMode;
    /** A string indicating whether request follows redirects, results in an error upon encountering a redirect, or returns the redirect (in an opaque fashion). Sets request's redirect. */
    redirect?: RequestRedirect;
    /** A string whose value is a same-origin URL, "about:client", or the empty string, to set request's referrer. */
    referrer?: string;
    /** A referrer policy to set request's referrerPolicy. */
    referrerPolicy?: ReferrerPolicy;
    /** An AbortSignal to set request's signal. */
    signal?: AbortSignal | null;
    /** Can only be null. Used to disassociate request from any Window. */
    window?: null;
}

interface ResponseInit {
    headers?: HeadersInit;
    status?: number;
    statusText?: string;
}

interface RsaHashedImportParams extends Algorithm {
    hash: HashAlgorithmIdentifier;
}

interface RsaHashedKeyGenParams extends RsaKeyGenParams {
    hash: HashAlgorithmIdentifier;
}

interface RsaKeyGenParams extends Algorithm {
    modulusLength: number;
    publicExponent: BigInteger;
}

interface RsaOaepParams extends Algorithm {
    label?: BufferSource;
}

interface RsaOtherPrimesInfo {
    d?: string;
    r?: string;
    t?: string;
}

interface RsaPssParams extends Algorithm {
    saltLength: number;
}

interface SecurityPolicyViolationEventInit extends EventInit {
    blockedURI?: string;
    columnNumber?: number;
    disposition: SecurityPolicyViolationEventDisposition;
    documentURI: string;
    effectiveDirective: string;
    lineNumber?: number;
    originalPolicy: string;
    referrer?: string;
    sample?: string;
    sourceFile?: string;
    statusCode: number;
    violatedDirective: string;
}

interface StorageEstimate {
    quota?: number;
    usage?: number;
}

interface StreamPipeOptions {
    preventAbort?: boolean;
    preventCancel?: boolean;
    /**
     * Pipes this readable stream to a given writable stream destination. The way in which the piping process behaves under various error conditions can be customized with a number of passed options. It returns a promise that fulfills when the piping process completes successfully, or rejects if any errors were encountered.
     *
     * Piping a stream will lock it for the duration of the pipe, preventing any other consumer from acquiring a reader.
     *
     * Errors and closures of the source and destination streams propagate as follows:
     *
     * An error in this source readable stream will abort destination, unless preventAbort is truthy. The returned promise will be rejected with the source's error, or with any error that occurs during aborting the destination.
     *
     * An error in destination will cancel this source readable stream, unless preventCancel is truthy. The returned promise will be rejected with the destination's error, or with any error that occurs during canceling the source.
     *
     * When this source readable stream closes, destination will be closed, unless preventClose is truthy. The returned promise will be fulfilled once this process completes, unless an error is encountered while closing the destination, in which case it will be rejected with that error.
     *
     * If destination starts out closed or closing, this source readable stream will be canceled, unless preventCancel is true. The returned promise will be rejected with an error indicating piping to a closed stream failed, or with any error that occurs during canceling the source.
     *
     * The signal option can be set to an AbortSignal to allow aborting an ongoing pipe operation via the corresponding AbortController. In this case, this source readable stream will be canceled, and destination aborted, unless the respective options preventCancel or preventAbort are set.
     */
    preventClose?: boolean;
    signal?: AbortSignal;
}

interface StructuredSerializeOptions {
    transfer?: any[];
}

interface TextDecodeOptions {
    stream?: boolean;
}

interface TextDecoderOptions {
    fatal?: boolean;
    ignoreBOM?: boolean;
}

interface TextEncoderEncodeIntoResult {
    read?: number;
    written?: number;
}

interface Transformer<I = any, O = any> {
    flush?: TransformerFlushCallback<O>;
    readableType?: undefined;
    start?: TransformerStartCallback<O>;
    transform?: TransformerTransformCallback<I, O>;
    writableType?: undefined;
}

interface UnderlyingSink<W = any> {
    abort?: UnderlyingSinkAbortCallback;
    close?: UnderlyingSinkCloseCallback;
    start?: UnderlyingSinkStartCallback;
    type?: undefined;
    write?: UnderlyingSinkWriteCallback<W>;
}

interface UnderlyingSource<R = any> {
    cancel?: UnderlyingSourceCancelCallback;
    pull?: UnderlyingSourcePullCallback<R>;
    start?: UnderlyingSourceStartCallback<R>;
    type?: undefined;
}

interface VideoConfiguration {
    bitrate: number;
    colorGamut?: ColorGamut;
    contentType: string;
    framerate: number;
    hdrMetadataType?: HdrMetadataType;
    height: number;
    scalabilityMode?: string;
    transferFunction?: TransferFunction;
    width: number;
}

interface WebGLContextAttributes {
    alpha?: boolean;
    antialias?: boolean;
    depth?: boolean;
    desynchronized?: boolean;
    failIfMajorPerformanceCaveat?: boolean;
    powerPreference?: WebGLPowerPreference;
    premultipliedAlpha?: boolean;
    preserveDrawingBuffer?: boolean;
    stencil?: boolean;
}

interface WebGLContextEventInit extends EventInit {
    statusMessage?: string;
}

interface WorkerOptions {
    credentials?: RequestCredentials;
    name?: string;
    type?: WorkerType;
}

/** The ANGLE_instanced_arrays extension is part of the WebGL API and allows to draw the same object, or groups of similar objects multiple times, if they share the same vertex data, primitive count and type. */
interface ANGLE_instanced_arrays {
    drawArraysInstancedANGLE(mode: GLenum, first: GLint, count: GLsizei, primcount: GLsizei): void;
    drawElementsInstancedANGLE(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, primcount: GLsizei): void;
    vertexAttribDivisorANGLE(index: GLuint, divisor: GLuint): void;
    readonly VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: GLenum;
}

/** A controller object that allows you to abort one or more DOM requests as and when desired. */
interface AbortController {
    /** Returns the AbortSignal object associated with this object. */
    readonly signal: AbortSignal;
    /** Invoking this method will set this object's AbortSignal's aborted flag and signal to any observers that the associated activity is to be aborted. */
    abort(): void;
}

declare var AbortController: {
    prototype: AbortController;
    new(): AbortController;
};

interface AbortSignalEventMap {
    "abort": Event;
}

/** A signal object that allows you to communicate with a DOM request (such as a Fetch) and abort it if required via an AbortController object. */
interface AbortSignal extends EventTarget {
    /** Returns true if this AbortSignal's AbortController has signaled to abort, and false otherwise. */
    readonly aborted: boolean;
    onabort: ((this: AbortSignal, ev: Event) => any) | null;
    addEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AbortSignalEventMap>(type: K, listener: (this: AbortSignal, ev: AbortSignalEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var AbortSignal: {
    prototype: AbortSignal;
    new(): AbortSignal;
    // abort(): AbortSignal; - To be re-added in the future
};

interface AbstractWorkerEventMap {
    "error": ErrorEvent;
}

interface AbstractWorker {
    onerror: ((this: AbstractWorker, ev: ErrorEvent) => any) | null;
    addEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof AbstractWorkerEventMap>(type: K, listener: (this: AbstractWorker, ev: AbstractWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

interface AnimationFrameProvider {
    cancelAnimationFrame(handle: number): void;
    requestAnimationFrame(callback: FrameRequestCallback): number;
}

/** A file-like object of immutable, raw data. Blobs represent data that isn't necessarily in a JavaScript-native format. The File interface is based on Blob, inheriting blob functionality and expanding it to support files on the user's system. */
interface Blob {
    readonly size: number;
    readonly type: string;
    arrayBuffer(): Promise<ArrayBuffer>;
    slice(start?: number, end?: number, contentType?: string): Blob;
    stream(): ReadableStream;
    text(): Promise<string>;
}

declare var Blob: {
    prototype: Blob;
    new(blobParts?: BlobPart[], options?: BlobPropertyBag): Blob;
};

interface Body {
    readonly body: ReadableStream<Uint8Array> | null;
    readonly bodyUsed: boolean;
    arrayBuffer(): Promise<ArrayBuffer>;
    blob(): Promise<Blob>;
    formData(): Promise<FormData>;
    json(): Promise<any>;
    text(): Promise<string>;
}

interface BroadcastChannelEventMap {
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

interface BroadcastChannel extends EventTarget {
    /** Returns the channel name (as passed to the constructor). */
    readonly name: string;
    onmessage: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: BroadcastChannel, ev: MessageEvent) => any) | null;
    /** Closes the BroadcastChannel object, opening it up to garbage collection. */
    close(): void;
    /** Sends the given message to other BroadcastChannel objects set up for this channel. Messages can be structured objects, e.g. nested objects and arrays. */
    postMessage(message: any): void;
    addEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof BroadcastChannelEventMap>(type: K, listener: (this: BroadcastChannel, ev: BroadcastChannelEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var BroadcastChannel: {
    prototype: BroadcastChannel;
    new(name: string): BroadcastChannel;
};

/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
interface ByteLengthQueuingStrategy extends QueuingStrategy<ArrayBufferView> {
    readonly highWaterMark: number;
    readonly size: QueuingStrategySize<ArrayBufferView>;
}

declare var ByteLengthQueuingStrategy: {
    prototype: ByteLengthQueuingStrategy;
    new(init: QueuingStrategyInit): ByteLengthQueuingStrategy;
};

/**
 * Provides a storage mechanism for Request / Response object pairs that are cached, for example as part of the ServiceWorker life cycle. Note that the Cache interface is exposed to windowed scopes as well as workers. You don't have to use it in conjunction with service workers, even though it is defined in the service worker spec.
 * Available only in secure contexts.
 */
interface Cache {
    add(request: RequestInfo): Promise<void>;
    addAll(requests: RequestInfo[]): Promise<void>;
    delete(request: RequestInfo, options?: CacheQueryOptions): Promise<boolean>;
    keys(request?: RequestInfo, options?: CacheQueryOptions): Promise<ReadonlyArray<Request>>;
    match(request: RequestInfo, options?: CacheQueryOptions): Promise<Response | undefined>;
    matchAll(request?: RequestInfo, options?: CacheQueryOptions): Promise<ReadonlyArray<Response>>;
    put(request: RequestInfo, response: Response): Promise<void>;
}

declare var Cache: {
    prototype: Cache;
    new(): Cache;
};

/**
 * The storage for Cache objects.
 * Available only in secure contexts.
 */
interface CacheStorage {
    delete(cacheName: string): Promise<boolean>;
    has(cacheName: string): Promise<boolean>;
    keys(): Promise<string[]>;
    match(request: RequestInfo, options?: MultiCacheQueryOptions): Promise<Response | undefined>;
    open(cacheName: string): Promise<Cache>;
}

declare var CacheStorage: {
    prototype: CacheStorage;
    new(): CacheStorage;
};

/** An opaque object describing a gradient. It is returned by the methods CanvasRenderingContext2D.createLinearGradient() or CanvasRenderingContext2D.createRadialGradient(). */
interface CanvasGradient {
    /**
     * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end.
     *
     * Throws an "IndexSizeError" DOMException if the offset is out of range. Throws a "SyntaxError" DOMException if the color cannot be parsed.
     */
    addColorStop(offset: number, color: string): void;
}

declare var CanvasGradient: {
    prototype: CanvasGradient;
    new(): CanvasGradient;
};

interface CanvasPath {
    arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
    arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
    bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
    closePath(): void;
    ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
    lineTo(x: number, y: number): void;
    moveTo(x: number, y: number): void;
    quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
    rect(x: number, y: number, w: number, h: number): void;
}

/** An opaque object describing a pattern, based on an image, a canvas, or a video, created by the CanvasRenderingContext2D.createPattern() method. */
interface CanvasPattern {
    /** Sets the transformation matrix that will be used when rendering the pattern during a fill or stroke painting operation. */
    setTransform(transform?: DOMMatrix2DInit): void;
}

declare var CanvasPattern: {
    prototype: CanvasPattern;
    new(): CanvasPattern;
};

/** The Client\xA0interface represents an executable context such as a Worker, or a SharedWorker. Window clients are represented by the more-specific\xA0WindowClient. You can get\xA0Client/WindowClient\xA0objects from methods such as Clients.matchAll() and\xA0Clients.get(). */
interface Client {
    readonly frameType: FrameType;
    readonly id: string;
    readonly type: ClientTypes;
    readonly url: string;
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
}

declare var Client: {
    prototype: Client;
    new(): Client;
};

/** Provides access to\xA0Client\xA0objects. Access it\xA0via self.clients\xA0within a\xA0service worker. */
interface Clients {
    claim(): Promise<void>;
    get(id: string): Promise<Client | undefined>;
    matchAll<T extends ClientQueryOptions>(options?: T): Promise<ReadonlyArray<T["type"] extends "window" ? WindowClient : Client>>;
    openWindow(url: string | URL): Promise<WindowClient | null>;
}

declare var Clients: {
    prototype: Clients;
    new(): Clients;
};

/** A CloseEvent is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the WebSocket object's onclose attribute. */
interface CloseEvent extends Event {
    /** Returns the WebSocket connection close code provided by the server. */
    readonly code: number;
    /** Returns the WebSocket connection close reason provided by the server. */
    readonly reason: string;
    /** Returns true if the connection closed cleanly; false otherwise. */
    readonly wasClean: boolean;
}

declare var CloseEvent: {
    prototype: CloseEvent;
    new(type: string, eventInitDict?: CloseEventInit): CloseEvent;
};

/** This Streams API interface provides\xA0a built-in byte length queuing strategy that can be used when constructing streams. */
interface CountQueuingStrategy extends QueuingStrategy {
    readonly highWaterMark: number;
    readonly size: QueuingStrategySize;
}

declare var CountQueuingStrategy: {
    prototype: CountQueuingStrategy;
    new(init: QueuingStrategyInit): CountQueuingStrategy;
};

/** Basic cryptography features available in the current context. It allows access to a cryptographically strong random number generator and to cryptographic primitives. */
interface Crypto {
    /** Available only in secure contexts. */
    readonly subtle: SubtleCrypto;
    getRandomValues<T extends ArrayBufferView | null>(array: T): T;
}

declare var Crypto: {
    prototype: Crypto;
    new(): Crypto;
};

/**
 * The CryptoKey dictionary of the Web Crypto API represents a cryptographic key.
 * Available only in secure contexts.
 */
interface CryptoKey {
    readonly algorithm: KeyAlgorithm;
    readonly extractable: boolean;
    readonly type: KeyType;
    readonly usages: KeyUsage[];
}

declare var CryptoKey: {
    prototype: CryptoKey;
    new(): CryptoKey;
};

interface CustomEvent<T = any> extends Event {
    /** Returns any custom data event was created with. Typically used for synthetic events. */
    readonly detail: T;
    /** @deprecated */
    initCustomEvent(type: string, bubbles?: boolean, cancelable?: boolean, detail?: T): void;
}

declare var CustomEvent: {
    prototype: CustomEvent;
    new<T>(type: string, eventInitDict?: CustomEventInit<T>): CustomEvent<T>;
};

/** An abnormal event (called an exception) which occurs as a result of calling a method or accessing a property of a web API. */
interface DOMException extends Error {
    readonly code: number;
    readonly message: string;
    readonly name: string;
    readonly ABORT_ERR: number;
    readonly DATA_CLONE_ERR: number;
    readonly DOMSTRING_SIZE_ERR: number;
    readonly HIERARCHY_REQUEST_ERR: number;
    readonly INDEX_SIZE_ERR: number;
    readonly INUSE_ATTRIBUTE_ERR: number;
    readonly INVALID_ACCESS_ERR: number;
    readonly INVALID_CHARACTER_ERR: number;
    readonly INVALID_MODIFICATION_ERR: number;
    readonly INVALID_NODE_TYPE_ERR: number;
    readonly INVALID_STATE_ERR: number;
    readonly NAMESPACE_ERR: number;
    readonly NETWORK_ERR: number;
    readonly NOT_FOUND_ERR: number;
    readonly NOT_SUPPORTED_ERR: number;
    readonly NO_DATA_ALLOWED_ERR: number;
    readonly NO_MODIFICATION_ALLOWED_ERR: number;
    readonly QUOTA_EXCEEDED_ERR: number;
    readonly SECURITY_ERR: number;
    readonly SYNTAX_ERR: number;
    readonly TIMEOUT_ERR: number;
    readonly TYPE_MISMATCH_ERR: number;
    readonly URL_MISMATCH_ERR: number;
    readonly VALIDATION_ERR: number;
    readonly WRONG_DOCUMENT_ERR: number;
}

declare var DOMException: {
    prototype: DOMException;
    new(message?: string, name?: string): DOMException;
    readonly ABORT_ERR: number;
    readonly DATA_CLONE_ERR: number;
    readonly DOMSTRING_SIZE_ERR: number;
    readonly HIERARCHY_REQUEST_ERR: number;
    readonly INDEX_SIZE_ERR: number;
    readonly INUSE_ATTRIBUTE_ERR: number;
    readonly INVALID_ACCESS_ERR: number;
    readonly INVALID_CHARACTER_ERR: number;
    readonly INVALID_MODIFICATION_ERR: number;
    readonly INVALID_NODE_TYPE_ERR: number;
    readonly INVALID_STATE_ERR: number;
    readonly NAMESPACE_ERR: number;
    readonly NETWORK_ERR: number;
    readonly NOT_FOUND_ERR: number;
    readonly NOT_SUPPORTED_ERR: number;
    readonly NO_DATA_ALLOWED_ERR: number;
    readonly NO_MODIFICATION_ALLOWED_ERR: number;
    readonly QUOTA_EXCEEDED_ERR: number;
    readonly SECURITY_ERR: number;
    readonly SYNTAX_ERR: number;
    readonly TIMEOUT_ERR: number;
    readonly TYPE_MISMATCH_ERR: number;
    readonly URL_MISMATCH_ERR: number;
    readonly VALIDATION_ERR: number;
    readonly WRONG_DOCUMENT_ERR: number;
};

interface DOMMatrix extends DOMMatrixReadOnly {
    a: number;
    b: number;
    c: number;
    d: number;
    e: number;
    f: number;
    m11: number;
    m12: number;
    m13: number;
    m14: number;
    m21: number;
    m22: number;
    m23: number;
    m24: number;
    m31: number;
    m32: number;
    m33: number;
    m34: number;
    m41: number;
    m42: number;
    m43: number;
    m44: number;
    invertSelf(): DOMMatrix;
    multiplySelf(other?: DOMMatrixInit): DOMMatrix;
    preMultiplySelf(other?: DOMMatrixInit): DOMMatrix;
    rotateAxisAngleSelf(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
    rotateFromVectorSelf(x?: number, y?: number): DOMMatrix;
    rotateSelf(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
    scale3dSelf(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    scaleSelf(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    skewXSelf(sx?: number): DOMMatrix;
    skewYSelf(sy?: number): DOMMatrix;
    translateSelf(tx?: number, ty?: number, tz?: number): DOMMatrix;
}

declare var DOMMatrix: {
    prototype: DOMMatrix;
    new(init?: string | number[]): DOMMatrix;
    fromFloat32Array(array32: Float32Array): DOMMatrix;
    fromFloat64Array(array64: Float64Array): DOMMatrix;
    fromMatrix(other?: DOMMatrixInit): DOMMatrix;
};

interface DOMMatrixReadOnly {
    readonly a: number;
    readonly b: number;
    readonly c: number;
    readonly d: number;
    readonly e: number;
    readonly f: number;
    readonly is2D: boolean;
    readonly isIdentity: boolean;
    readonly m11: number;
    readonly m12: number;
    readonly m13: number;
    readonly m14: number;
    readonly m21: number;
    readonly m22: number;
    readonly m23: number;
    readonly m24: number;
    readonly m31: number;
    readonly m32: number;
    readonly m33: number;
    readonly m34: number;
    readonly m41: number;
    readonly m42: number;
    readonly m43: number;
    readonly m44: number;
    flipX(): DOMMatrix;
    flipY(): DOMMatrix;
    inverse(): DOMMatrix;
    multiply(other?: DOMMatrixInit): DOMMatrix;
    rotate(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
    rotateAxisAngle(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
    rotateFromVector(x?: number, y?: number): DOMMatrix;
    scale(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    scale3d(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
    /** @deprecated */
    scaleNonUniform(scaleX?: number, scaleY?: number): DOMMatrix;
    skewX(sx?: number): DOMMatrix;
    skewY(sy?: number): DOMMatrix;
    toFloat32Array(): Float32Array;
    toFloat64Array(): Float64Array;
    toJSON(): any;
    transformPoint(point?: DOMPointInit): DOMPoint;
    translate(tx?: number, ty?: number, tz?: number): DOMMatrix;
}

declare var DOMMatrixReadOnly: {
    prototype: DOMMatrixReadOnly;
    new(init?: string | number[]): DOMMatrixReadOnly;
    fromFloat32Array(array32: Float32Array): DOMMatrixReadOnly;
    fromFloat64Array(array64: Float64Array): DOMMatrixReadOnly;
    fromMatrix(other?: DOMMatrixInit): DOMMatrixReadOnly;
};

interface DOMPoint extends DOMPointReadOnly {
    w: number;
    x: number;
    y: number;
    z: number;
}

declare var DOMPoint: {
    prototype: DOMPoint;
    new(x?: number, y?: number, z?: number, w?: number): DOMPoint;
    fromPoint(other?: DOMPointInit): DOMPoint;
};

interface DOMPointReadOnly {
    readonly w: number;
    readonly x: number;
    readonly y: number;
    readonly z: number;
    matrixTransform(matrix?: DOMMatrixInit): DOMPoint;
    toJSON(): any;
}

declare var DOMPointReadOnly: {
    prototype: DOMPointReadOnly;
    new(x?: number, y?: number, z?: number, w?: number): DOMPointReadOnly;
    fromPoint(other?: DOMPointInit): DOMPointReadOnly;
};

interface DOMQuad {
    readonly p1: DOMPoint;
    readonly p2: DOMPoint;
    readonly p3: DOMPoint;
    readonly p4: DOMPoint;
    getBounds(): DOMRect;
    toJSON(): any;
}

declare var DOMQuad: {
    prototype: DOMQuad;
    new(p1?: DOMPointInit, p2?: DOMPointInit, p3?: DOMPointInit, p4?: DOMPointInit): DOMQuad;
    fromQuad(other?: DOMQuadInit): DOMQuad;
    fromRect(other?: DOMRectInit): DOMQuad;
};

interface DOMRect extends DOMRectReadOnly {
    height: number;
    width: number;
    x: number;
    y: number;
}

declare var DOMRect: {
    prototype: DOMRect;
    new(x?: number, y?: number, width?: number, height?: number): DOMRect;
    fromRect(other?: DOMRectInit): DOMRect;
};

interface DOMRectReadOnly {
    readonly bottom: number;
    readonly height: number;
    readonly left: number;
    readonly right: number;
    readonly top: number;
    readonly width: number;
    readonly x: number;
    readonly y: number;
    toJSON(): any;
}

declare var DOMRectReadOnly: {
    prototype: DOMRectReadOnly;
    new(x?: number, y?: number, width?: number, height?: number): DOMRectReadOnly;
    fromRect(other?: DOMRectInit): DOMRectReadOnly;
};

/** A type returned by some APIs which contains a list of DOMString (strings). */
interface DOMStringList {
    /** Returns the number of strings in strings. */
    readonly length: number;
    /** Returns true if strings contains string, and false otherwise. */
    contains(string: string): boolean;
    /** Returns the string with index index from strings. */
    item(index: number): string | null;
    [index: number]: string;
}

declare var DOMStringList: {
    prototype: DOMStringList;
    new(): DOMStringList;
};

interface DedicatedWorkerGlobalScopeEventMap extends WorkerGlobalScopeEventMap {
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

/** (the Worker global scope) is accessible through the self keyword. Some additional global functions, namespaces objects, and constructors, not typically associated with the worker global scope, but available on it, are listed in the JavaScript Reference. See also: Functions available to workers. */
interface DedicatedWorkerGlobalScope extends WorkerGlobalScope, AnimationFrameProvider {
    /** Returns dedicatedWorkerGlobal's name, i.e. the value given to the Worker constructor. Primarily useful for debugging. */
    readonly name: string;
    onmessage: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
    /** Aborts dedicatedWorkerGlobal. */
    close(): void;
    /** Clones message and transmits it to the Worker object associated with dedicatedWorkerGlobal. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
    addEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var DedicatedWorkerGlobalScope: {
    prototype: DedicatedWorkerGlobalScope;
    new(): DedicatedWorkerGlobalScope;
};

interface EXT_blend_minmax {
    readonly MAX_EXT: GLenum;
    readonly MIN_EXT: GLenum;
}

interface EXT_color_buffer_float {
}

interface EXT_color_buffer_half_float {
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: GLenum;
    readonly RGB16F_EXT: GLenum;
    readonly RGBA16F_EXT: GLenum;
    readonly UNSIGNED_NORMALIZED_EXT: GLenum;
}

interface EXT_float_blend {
}

/** The EXT_frag_depth extension is part of the WebGL API and enables to set a depth value of a fragment from within the fragment shader. */
interface EXT_frag_depth {
}

interface EXT_sRGB {
    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: GLenum;
    readonly SRGB8_ALPHA8_EXT: GLenum;
    readonly SRGB_ALPHA_EXT: GLenum;
    readonly SRGB_EXT: GLenum;
}

interface EXT_shader_texture_lod {
}

interface EXT_texture_compression_rgtc {
    readonly COMPRESSED_RED_GREEN_RGTC2_EXT: GLenum;
    readonly COMPRESSED_RED_RGTC1_EXT: GLenum;
    readonly COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: GLenum;
    readonly COMPRESSED_SIGNED_RED_RGTC1_EXT: GLenum;
}

/** The EXT_texture_filter_anisotropic extension is part of the WebGL API and exposes two constants for anisotropic filtering (AF). */
interface EXT_texture_filter_anisotropic {
    readonly MAX_TEXTURE_MAX_ANISOTROPY_EXT: GLenum;
    readonly TEXTURE_MAX_ANISOTROPY_EXT: GLenum;
}

/** Events providing information related to errors in scripts or in files. */
interface ErrorEvent extends Event {
    readonly colno: number;
    readonly error: any;
    readonly filename: string;
    readonly lineno: number;
    readonly message: string;
}

declare var ErrorEvent: {
    prototype: ErrorEvent;
    new(type: string, eventInitDict?: ErrorEventInit): ErrorEvent;
};

/** An event which takes place in the DOM. */
interface Event {
    /** Returns true or false depending on how event was initialized. True if event goes through its target's ancestors in reverse tree order, and false otherwise. */
    readonly bubbles: boolean;
    cancelBubble: boolean;
    /** Returns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the preventDefault() method. */
    readonly cancelable: boolean;
    /** Returns true or false depending on how event was initialized. True if event invokes listeners past a ShadowRoot node that is the root of its target, and false otherwise. */
    readonly composed: boolean;
    /** Returns the object whose event listener's callback is currently being invoked. */
    readonly currentTarget: EventTarget | null;
    /** Returns true if preventDefault() was invoked successfully to indicate cancelation, and false otherwise. */
    readonly defaultPrevented: boolean;
    /** Returns the event's phase, which is one of NONE, CAPTURING_PHASE, AT_TARGET, and BUBBLING_PHASE. */
    readonly eventPhase: number;
    /** Returns true if event was dispatched by the user agent, and false otherwise. */
    readonly isTrusted: boolean;
    /** @deprecated */
    returnValue: boolean;
    /** @deprecated */
    readonly srcElement: EventTarget | null;
    /** Returns the object to which event is dispatched (its target). */
    readonly target: EventTarget | null;
    /** Returns the event's timestamp as the number of milliseconds measured relative to the time origin. */
    readonly timeStamp: DOMHighResTimeStamp;
    /** Returns the type of event, e.g. "click", "hashchange", or "submit". */
    readonly type: string;
    /** Returns the invocation target objects of event's path (objects on which listeners will be invoked), except for any nodes in shadow trees of which the shadow root's mode is "closed" that are not reachable from event's currentTarget. */
    composedPath(): EventTarget[];
    /** @deprecated */
    initEvent(type: string, bubbles?: boolean, cancelable?: boolean): void;
    /** If invoked when the cancelable attribute value is true, and while executing a listener for the event with passive set to false, signals to the operation that caused event to be dispatched that it needs to be canceled. */
    preventDefault(): void;
    /** Invoking this method prevents event from reaching any registered event listeners after the current one finishes running and, when dispatched in a tree, also prevents event from reaching any other objects. */
    stopImmediatePropagation(): void;
    /** When dispatched in a tree, invoking this method prevents event from reaching any objects other than the current object. */
    stopPropagation(): void;
    readonly AT_TARGET: number;
    readonly BUBBLING_PHASE: number;
    readonly CAPTURING_PHASE: number;
    readonly NONE: number;
}

declare var Event: {
    prototype: Event;
    new(type: string, eventInitDict?: EventInit): Event;
    readonly AT_TARGET: number;
    readonly BUBBLING_PHASE: number;
    readonly CAPTURING_PHASE: number;
    readonly NONE: number;
};

interface EventListener {
    (evt: Event): void;
}

interface EventListenerObject {
    handleEvent(object: Event): void;
}

interface EventSourceEventMap {
    "error": Event;
    "message": MessageEvent;
    "open": Event;
}

interface EventSource extends EventTarget {
    onerror: ((this: EventSource, ev: Event) => any) | null;
    onmessage: ((this: EventSource, ev: MessageEvent) => any) | null;
    onopen: ((this: EventSource, ev: Event) => any) | null;
    /** Returns the state of this EventSource object's connection. It can have the values described below. */
    readonly readyState: number;
    /** Returns the URL providing the event stream. */
    readonly url: string;
    /** Returns true if the credentials mode for connection requests to the URL providing the event stream is set to "include", and false otherwise. */
    readonly withCredentials: boolean;
    /** Aborts any instances of the fetch algorithm started for this EventSource object, and sets the readyState attribute to CLOSED. */
    close(): void;
    readonly CLOSED: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
    addEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof EventSourceEventMap>(type: K, listener: (this: EventSource, ev: EventSourceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var EventSource: {
    prototype: EventSource;
    new(url: string | URL, eventSourceInitDict?: EventSourceInit): EventSource;
    readonly CLOSED: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
};

/** EventTarget is a DOM interface implemented by objects that can receive events and may have listeners for them. */
interface EventTarget {
    /**
     * Appends an event listener for events whose type attribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched.
     *
     * The options argument sets listener-specific options. For compatibility this can be a boolean, in which case the method behaves exactly as if the value was specified as options's capture.
     *
     * When set to true, options's capture prevents callback from being invoked when the event's eventPhase attribute value is BUBBLING_PHASE. When false (or not present), callback will not be invoked when event's eventPhase attribute value is CAPTURING_PHASE. Either way, callback will be invoked if event's eventPhase attribute value is AT_TARGET.
     *
     * When set to true, options's passive indicates that the callback will not cancel the event by invoking preventDefault(). This is used to enable performance optimizations described in \xA7 2.8 Observing event listeners.
     *
     * When set to true, options's once indicates that the callback will only be invoked once after which the event listener will be removed.
     *
     * If an AbortSignal is passed for options's signal, then the event listener will be removed when signal is aborted.
     *
     * The event listener is appended to target's event listener list and is not appended if it has the same type, callback, and capture.
     */
    addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean): void;
    /** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
    dispatchEvent(event: Event): boolean;
    /** Removes the event listener in target's event listener list with the same type, callback, and options. */
    removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
}

declare var EventTarget: {
    prototype: EventTarget;
    new(): EventTarget;
};

/** Extends the lifetime of the install and activate events dispatched on the global scope as part of the service worker lifecycle. This ensures that any functional events (like FetchEvent) are not dispatched until it upgrades database schemas and deletes the outdated cache entries. */
interface ExtendableEvent extends Event {
    waitUntil(f: any): void;
}

declare var ExtendableEvent: {
    prototype: ExtendableEvent;
    new(type: string, eventInitDict?: ExtendableEventInit): ExtendableEvent;
};

/** This ServiceWorker API interface represents the event object of a message event fired on a service worker (when a channel message is received on the ServiceWorkerGlobalScope from another context) \u2014 extends the lifetime of such events. */
interface ExtendableMessageEvent extends ExtendableEvent {
    readonly data: any;
    readonly lastEventId: string;
    readonly origin: string;
    readonly ports: ReadonlyArray<MessagePort>;
    readonly source: Client | ServiceWorker | MessagePort | null;
}

declare var ExtendableMessageEvent: {
    prototype: ExtendableMessageEvent;
    new(type: string, eventInitDict?: ExtendableMessageEventInit): ExtendableMessageEvent;
};

/** This is the event type for fetch\xA0events dispatched on the\xA0service worker global scope. It contains information about the fetch, including the\xA0request and how the receiver will treat the response. It provides the event.respondWith() method, which allows us to provide a response to this fetch. */
interface FetchEvent extends ExtendableEvent {
    readonly clientId: string;
    readonly handled: Promise<undefined>;
    readonly request: Request;
    readonly resultingClientId: string;
    respondWith(r: Response | PromiseLike<Response>): void;
}

declare var FetchEvent: {
    prototype: FetchEvent;
    new(type: string, eventInitDict: FetchEventInit): FetchEvent;
};

/** Provides information about files and allows JavaScript in a web page to access their content. */
interface File extends Blob {
    readonly lastModified: number;
    readonly name: string;
    readonly webkitRelativePath: string;
}

declare var File: {
    prototype: File;
    new(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag): File;
};

/** An object of this type is returned by the files property of the HTML <input> element; this lets you access the list of files selected with the <input type="file"> element. It's also used for a list of files dropped into web content when using the drag and drop API; see the DataTransfer object for details on this usage. */
interface FileList {
    readonly length: number;
    item(index: number): File | null;
    [index: number]: File;
}

declare var FileList: {
    prototype: FileList;
    new(): FileList;
};

interface FileReaderEventMap {
    "abort": ProgressEvent<FileReader>;
    "error": ProgressEvent<FileReader>;
    "load": ProgressEvent<FileReader>;
    "loadend": ProgressEvent<FileReader>;
    "loadstart": ProgressEvent<FileReader>;
    "progress": ProgressEvent<FileReader>;
}

/** Lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using File or Blob objects to specify the file or data to read. */
interface FileReader extends EventTarget {
    readonly error: DOMException | null;
    onabort: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onerror: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onload: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onloadend: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onloadstart: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    onprogress: ((this: FileReader, ev: ProgressEvent<FileReader>) => any) | null;
    readonly readyState: number;
    readonly result: string | ArrayBuffer | null;
    abort(): void;
    readAsArrayBuffer(blob: Blob): void;
    readAsBinaryString(blob: Blob): void;
    readAsDataURL(blob: Blob): void;
    readAsText(blob: Blob, encoding?: string): void;
    readonly DONE: number;
    readonly EMPTY: number;
    readonly LOADING: number;
    addEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof FileReaderEventMap>(type: K, listener: (this: FileReader, ev: FileReaderEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var FileReader: {
    prototype: FileReader;
    new(): FileReader;
    readonly DONE: number;
    readonly EMPTY: number;
    readonly LOADING: number;
};

/** Allows to read File or Blob objects in a synchronous way. */
interface FileReaderSync {
    readAsArrayBuffer(blob: Blob): ArrayBuffer;
    /** @deprecated */
    readAsBinaryString(blob: Blob): string;
    readAsDataURL(blob: Blob): string;
    readAsText(blob: Blob, encoding?: string): string;
}

declare var FileReaderSync: {
    prototype: FileReaderSync;
    new(): FileReaderSync;
};

interface FontFace {
    ascentOverride: string;
    descentOverride: string;
    display: string;
    family: string;
    featureSettings: string;
    lineGapOverride: string;
    readonly loaded: Promise<FontFace>;
    readonly status: FontFaceLoadStatus;
    stretch: string;
    style: string;
    unicodeRange: string;
    variant: string;
    variationSettings: string;
    weight: string;
    load(): Promise<FontFace>;
}

declare var FontFace: {
    prototype: FontFace;
    new(family: string, source: string | BinaryData, descriptors?: FontFaceDescriptors): FontFace;
};

interface FontFaceSetEventMap {
    "loading": Event;
    "loadingdone": Event;
    "loadingerror": Event;
}

interface FontFaceSet extends EventTarget {
    onloading: ((this: FontFaceSet, ev: Event) => any) | null;
    onloadingdone: ((this: FontFaceSet, ev: Event) => any) | null;
    onloadingerror: ((this: FontFaceSet, ev: Event) => any) | null;
    readonly ready: Promise<FontFaceSet>;
    readonly status: FontFaceSetLoadStatus;
    check(font: string, text?: string): boolean;
    load(font: string, text?: string): Promise<FontFace[]>;
    forEach(callbackfn: (value: FontFace, key: FontFace, parent: FontFaceSet) => void, thisArg?: any): void;
    addEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof FontFaceSetEventMap>(type: K, listener: (this: FontFaceSet, ev: FontFaceSetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var FontFaceSet: {
    prototype: FontFaceSet;
    new(initialFaces: FontFace[]): FontFaceSet;
};

interface FontFaceSetLoadEvent extends Event {
    readonly fontfaces: ReadonlyArray<FontFace>;
}

declare var FontFaceSetLoadEvent: {
    prototype: FontFaceSetLoadEvent;
    new(type: string, eventInitDict?: FontFaceSetLoadEventInit): FontFaceSetLoadEvent;
};

interface FontFaceSource {
    readonly fonts: FontFaceSet;
}

/** Provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() method. It uses the same format a form would use if the encoding type were set to "multipart/form-data". */
interface FormData {
    append(name: string, value: string | Blob, fileName?: string): void;
    delete(name: string): void;
    get(name: string): FormDataEntryValue | null;
    getAll(name: string): FormDataEntryValue[];
    has(name: string): boolean;
    set(name: string, value: string | Blob, fileName?: string): void;
    forEach(callbackfn: (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg?: any): void;
}

declare var FormData: {
    prototype: FormData;
    new(): FormData;
};

interface GenericTransformStream {
    readonly readable: ReadableStream;
    readonly writable: WritableStream;
}

/** This Fetch API interface allows you to perform various actions on HTTP request and response headers. These actions include retrieving, setting, adding to, and removing. A Headers object has an associated header list, which is initially empty and consists\xA0of zero or more name and value pairs. \xA0You can add to this using methods like append() (see Examples.)\xA0In all methods of this interface, header names are matched by case-insensitive byte sequence. */
interface Headers {
    append(name: string, value: string): void;
    delete(name: string): void;
    get(name: string): string | null;
    has(name: string): boolean;
    set(name: string, value: string): void;
    forEach(callbackfn: (value: string, key: string, parent: Headers) => void, thisArg?: any): void;
}

declare var Headers: {
    prototype: Headers;
    new(init?: HeadersInit): Headers;
};

/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. */
interface IDBCursor {
    /** Returns the direction ("next", "nextunique", "prev" or "prevunique") of the cursor. */
    readonly direction: IDBCursorDirection;
    /** Returns the key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
    readonly key: IDBValidKey;
    /** Returns the effective key of the cursor. Throws a "InvalidStateError" DOMException if the cursor is advancing or is finished. */
    readonly primaryKey: IDBValidKey;
    readonly request: IDBRequest;
    /** Returns the IDBObjectStore or IDBIndex the cursor was opened from. */
    readonly source: IDBObjectStore | IDBIndex;
    /** Advances the cursor through the next count records in range. */
    advance(count: number): void;
    /** Advances the cursor to the next record in range. */
    continue(key?: IDBValidKey): void;
    /** Advances the cursor to the next record in range matching or after key and primaryKey. Throws an "InvalidAccessError" DOMException if the source is not an index. */
    continuePrimaryKey(key: IDBValidKey, primaryKey: IDBValidKey): void;
    /**
     * Delete the record pointed at by the cursor with a new value.
     *
     * If successful, request's result will be undefined.
     */
    delete(): IDBRequest<undefined>;
    /**
     * Updated the record pointed at by the cursor with a new value.
     *
     * Throws a "DataError" DOMException if the effective object store uses in-line keys and the key would have changed.
     *
     * If successful, request's result will be the record's key.
     */
    update(value: any): IDBRequest<IDBValidKey>;
}

declare var IDBCursor: {
    prototype: IDBCursor;
    new(): IDBCursor;
};

/** This IndexedDB API interface represents a cursor for traversing or iterating over multiple records in a database. It is the same as the IDBCursor, except that it includes the value property. */
interface IDBCursorWithValue extends IDBCursor {
    /** Returns the cursor's current value. */
    readonly value: any;
}

declare var IDBCursorWithValue: {
    prototype: IDBCursorWithValue;
    new(): IDBCursorWithValue;
};

interface IDBDatabaseEventMap {
    "abort": Event;
    "close": Event;
    "error": Event;
    "versionchange": IDBVersionChangeEvent;
}

/** This IndexedDB API interface provides a connection to a database; you can use an IDBDatabase object to open a transaction on your database then create, manipulate, and delete objects (data) in that database. The interface provides the only way to get and manage versions of the database. */
interface IDBDatabase extends EventTarget {
    /** Returns the name of the database. */
    readonly name: string;
    /** Returns a list of the names of object stores in the database. */
    readonly objectStoreNames: DOMStringList;
    onabort: ((this: IDBDatabase, ev: Event) => any) | null;
    onclose: ((this: IDBDatabase, ev: Event) => any) | null;
    onerror: ((this: IDBDatabase, ev: Event) => any) | null;
    onversionchange: ((this: IDBDatabase, ev: IDBVersionChangeEvent) => any) | null;
    /** Returns the version of the database. */
    readonly version: number;
    /** Closes the connection once all running transactions have finished. */
    close(): void;
    /**
     * Creates a new object store with the given name and options and returns a new IDBObjectStore.
     *
     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    createObjectStore(name: string, options?: IDBObjectStoreParameters): IDBObjectStore;
    /**
     * Deletes the object store with the given name.
     *
     * Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    deleteObjectStore(name: string): void;
    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */
    transaction(storeNames: string | string[], mode?: IDBTransactionMode): IDBTransaction;
    addEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBDatabaseEventMap>(type: K, listener: (this: IDBDatabase, ev: IDBDatabaseEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBDatabase: {
    prototype: IDBDatabase;
    new(): IDBDatabase;
};

/** In the following code snippet, we make a request to open a database, and include handlers for the success and error cases. For a full working example, see our To-do Notifications app (view example live.) */
interface IDBFactory {
    /**
     * Compares two values as keys. Returns -1 if key1 precedes key2, 1 if key2 precedes key1, and 0 if the keys are equal.
     *
     * Throws a "DataError" DOMException if either input is not a valid key.
     */
    cmp(first: any, second: any): number;
    databases(): Promise<IDBDatabaseInfo[]>;
    /** Attempts to delete the named database. If the database already exists and there are open connections that don't close in response to a versionchange event, the request will be blocked until all they close. If the request is successful request's result will be null. */
    deleteDatabase(name: string): IDBOpenDBRequest;
    /** Attempts to open a connection to the named database with the current version, or 1 if it does not already exist. If the request is successful request's result will be the connection. */
    open(name: string, version?: number): IDBOpenDBRequest;
}

declare var IDBFactory: {
    prototype: IDBFactory;
    new(): IDBFactory;
};

/** IDBIndex interface of the IndexedDB API provides asynchronous access to an index in a database. An index is a kind of object store for looking up records in another object store, called the referenced object store. You use this interface to retrieve data. */
interface IDBIndex {
    readonly keyPath: string | string[];
    readonly multiEntry: boolean;
    /** Returns the name of the index. */
    name: string;
    /** Returns the IDBObjectStore the index belongs to. */
    readonly objectStore: IDBObjectStore;
    readonly unique: boolean;
    /**
     * Retrieves the number of records matching the given key or key range in query.
     *
     * If successful, request's result will be the count.
     */
    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
    /**
     * Retrieves the value of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the value, or undefined if there was no matching record.
     */
    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
    /**
     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the values.
     */
    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
    /**
     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the keys.
     */
    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
    /**
     * Retrieves the key of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the key, or undefined if there was no matching record.
     */
    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
    /**
     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in index are matched.
     *
     * If successful, request's result will be an IDBCursorWithValue, or null if there were no matching records.
     */
    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
    /**
     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in index are matched.
     *
     * If successful, request's result will be an IDBCursor, or null if there were no matching records.
     */
    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
}

declare var IDBIndex: {
    prototype: IDBIndex;
    new(): IDBIndex;
};

/** A key range can be a single value or a range with upper and lower bounds or endpoints. If the key range has both upper and lower bounds, then it is bounded; if it has no bounds, it is unbounded. A bounded key range can either be open (the endpoints are excluded) or closed (the endpoints are included). To retrieve all keys within a certain range, you can use the following code constructs: */
interface IDBKeyRange {
    /** Returns lower bound, or undefined if none. */
    readonly lower: any;
    /** Returns true if the lower open flag is set, and false otherwise. */
    readonly lowerOpen: boolean;
    /** Returns upper bound, or undefined if none. */
    readonly upper: any;
    /** Returns true if the upper open flag is set, and false otherwise. */
    readonly upperOpen: boolean;
    /** Returns true if key is included in the range, and false otherwise. */
    includes(key: any): boolean;
}

declare var IDBKeyRange: {
    prototype: IDBKeyRange;
    new(): IDBKeyRange;
    /** Returns a new IDBKeyRange spanning from lower to upper. If lowerOpen is true, lower is not included in the range. If upperOpen is true, upper is not included in the range. */
    bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;
    /** Returns a new IDBKeyRange starting at key with no upper bound. If open is true, key is not included in the range. */
    lowerBound(lower: any, open?: boolean): IDBKeyRange;
    /** Returns a new IDBKeyRange spanning only key. */
    only(value: any): IDBKeyRange;
    /** Returns a new IDBKeyRange with no lower bound and ending at key. If open is true, key is not included in the range. */
    upperBound(upper: any, open?: boolean): IDBKeyRange;
};

/** This example shows a variety of different uses of object stores, from updating the data structure with IDBObjectStore.createIndex\xA0inside an onupgradeneeded function, to adding a new item to our object store with IDBObjectStore.add. For a full working example, see our\xA0To-do Notifications\xA0app (view example live.) */
interface IDBObjectStore {
    /** Returns true if the store has a key generator, and false otherwise. */
    readonly autoIncrement: boolean;
    /** Returns a list of the names of indexes in the store. */
    readonly indexNames: DOMStringList;
    /** Returns the key path of the store, or null if none. */
    readonly keyPath: string | string[];
    /** Returns the name of the store. */
    name: string;
    /** Returns the associated transaction. */
    readonly transaction: IDBTransaction;
    /**
     * Adds or updates a record in store with the given value and key.
     *
     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
     *
     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
     *
     * If successful, request's result will be the record's key.
     */
    add(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
    /**
     * Deletes all records in store.
     *
     * If successful, request's result will be undefined.
     */
    clear(): IDBRequest<undefined>;
    /**
     * Retrieves the number of records matching the given key or key range in query.
     *
     * If successful, request's result will be the count.
     */
    count(query?: IDBValidKey | IDBKeyRange): IDBRequest<number>;
    /**
     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.
     *
     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    createIndex(name: string, keyPath: string | string[], options?: IDBIndexParameters): IDBIndex;
    /**
     * Deletes records in store with the given key or in the given key range in query.
     *
     * If successful, request's result will be undefined.
     */
    delete(query: IDBValidKey | IDBKeyRange): IDBRequest<undefined>;
    /**
     * Deletes the index in store with the given name.
     *
     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.
     */
    deleteIndex(name: string): void;
    /**
     * Retrieves the value of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the value, or undefined if there was no matching record.
     */
    get(query: IDBValidKey | IDBKeyRange): IDBRequest<any>;
    /**
     * Retrieves the values of the records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the values.
     */
    getAll(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<any[]>;
    /**
     * Retrieves the keys of records matching the given key or key range in query (up to count if given).
     *
     * If successful, request's result will be an Array of the keys.
     */
    getAllKeys(query?: IDBValidKey | IDBKeyRange | null, count?: number): IDBRequest<IDBValidKey[]>;
    /**
     * Retrieves the key of the first record matching the given key or key range in query.
     *
     * If successful, request's result will be the key, or undefined if there was no matching record.
     */
    getKey(query: IDBValidKey | IDBKeyRange): IDBRequest<IDBValidKey | undefined>;
    index(name: string): IDBIndex;
    /**
     * Opens a cursor over the records matching query, ordered by direction. If query is null, all records in store are matched.
     *
     * If successful, request's result will be an IDBCursorWithValue pointing at the first matching record, or null if there were no matching records.
     */
    openCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursorWithValue | null>;
    /**
     * Opens a cursor with key only flag set over the records matching query, ordered by direction. If query is null, all records in store are matched.
     *
     * If successful, request's result will be an IDBCursor pointing at the first matching record, or null if there were no matching records.
     */
    openKeyCursor(query?: IDBValidKey | IDBKeyRange | null, direction?: IDBCursorDirection): IDBRequest<IDBCursor | null>;
    /**
     * Adds or updates a record in store with the given value and key.
     *
     * If the store uses in-line keys and key is specified a "DataError" DOMException will be thrown.
     *
     * If put() is used, any existing record with the key will be replaced. If add() is used, and if a record with the key already exists the request will fail, with request's error set to a "ConstraintError" DOMException.
     *
     * If successful, request's result will be the record's key.
     */
    put(value: any, key?: IDBValidKey): IDBRequest<IDBValidKey>;
}

declare var IDBObjectStore: {
    prototype: IDBObjectStore;
    new(): IDBObjectStore;
};

interface IDBOpenDBRequestEventMap extends IDBRequestEventMap {
    "blocked": Event;
    "upgradeneeded": IDBVersionChangeEvent;
}

/** Also inherits methods from its parents IDBRequest and EventTarget. */
interface IDBOpenDBRequest extends IDBRequest<IDBDatabase> {
    onblocked: ((this: IDBOpenDBRequest, ev: Event) => any) | null;
    onupgradeneeded: ((this: IDBOpenDBRequest, ev: IDBVersionChangeEvent) => any) | null;
    addEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBOpenDBRequestEventMap>(type: K, listener: (this: IDBOpenDBRequest, ev: IDBOpenDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBOpenDBRequest: {
    prototype: IDBOpenDBRequest;
    new(): IDBOpenDBRequest;
};

interface IDBRequestEventMap {
    "error": Event;
    "success": Event;
}

/** The request object does not initially contain any information about the result of the operation, but once information becomes available, an event is fired on the request, and the information becomes available through the properties of the IDBRequest instance. */
interface IDBRequest<T = any> extends EventTarget {
    /** When a request is completed, returns the error (a DOMException), or null if the request succeeded. Throws a "InvalidStateError" DOMException if the request is still pending. */
    readonly error: DOMException | null;
    onerror: ((this: IDBRequest<T>, ev: Event) => any) | null;
    onsuccess: ((this: IDBRequest<T>, ev: Event) => any) | null;
    /** Returns "pending" until a request is complete, then returns "done". */
    readonly readyState: IDBRequestReadyState;
    /** When a request is completed, returns the result, or undefined if the request failed. Throws a "InvalidStateError" DOMException if the request is still pending. */
    readonly result: T;
    /** Returns the IDBObjectStore, IDBIndex, or IDBCursor the request was made against, or null if is was an open request. */
    readonly source: IDBObjectStore | IDBIndex | IDBCursor;
    /** Returns the IDBTransaction the request was made within. If this as an open request, then it returns an upgrade transaction while it is running, or null otherwise. */
    readonly transaction: IDBTransaction | null;
    addEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBRequestEventMap>(type: K, listener: (this: IDBRequest<T>, ev: IDBRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBRequest: {
    prototype: IDBRequest;
    new(): IDBRequest;
};

interface IDBTransactionEventMap {
    "abort": Event;
    "complete": Event;
    "error": Event;
}

interface IDBTransaction extends EventTarget {
    /** Returns the transaction's connection. */
    readonly db: IDBDatabase;
    /** If the transaction was aborted, returns the error (a DOMException) providing the reason. */
    readonly error: DOMException | null;
    /** Returns the mode the transaction was created with ("readonly" or "readwrite"), or "versionchange" for an upgrade transaction. */
    readonly mode: IDBTransactionMode;
    /** Returns a list of the names of object stores in the transaction's scope. For an upgrade transaction this is all object stores in the database. */
    readonly objectStoreNames: DOMStringList;
    onabort: ((this: IDBTransaction, ev: Event) => any) | null;
    oncomplete: ((this: IDBTransaction, ev: Event) => any) | null;
    onerror: ((this: IDBTransaction, ev: Event) => any) | null;
    /** Aborts the transaction. All pending requests will fail with a "AbortError" DOMException and all changes made to the database will be reverted. */
    abort(): void;
    commit(): void;
    /** Returns an IDBObjectStore in the transaction's scope. */
    objectStore(name: string): IDBObjectStore;
    addEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof IDBTransactionEventMap>(type: K, listener: (this: IDBTransaction, ev: IDBTransactionEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var IDBTransaction: {
    prototype: IDBTransaction;
    new(): IDBTransaction;
};

/** This IndexedDB API interface indicates that the version of the database has changed, as the result of an IDBOpenDBRequest.onupgradeneeded event handler function. */
interface IDBVersionChangeEvent extends Event {
    readonly newVersion: number | null;
    readonly oldVersion: number;
}

declare var IDBVersionChangeEvent: {
    prototype: IDBVersionChangeEvent;
    new(type: string, eventInitDict?: IDBVersionChangeEventInit): IDBVersionChangeEvent;
};

interface ImageBitmap {
    /** Returns the intrinsic height of the image, in CSS pixels. */
    readonly height: number;
    /** Returns the intrinsic width of the image, in CSS pixels. */
    readonly width: number;
    /** Releases imageBitmap's underlying bitmap data. */
    close(): void;
}

declare var ImageBitmap: {
    prototype: ImageBitmap;
    new(): ImageBitmap;
};

interface ImageBitmapRenderingContext {
    /** Transfers the underlying bitmap data from imageBitmap to context, and the bitmap becomes the contents of the canvas element to which context is bound. */
    transferFromImageBitmap(bitmap: ImageBitmap | null): void;
}

declare var ImageBitmapRenderingContext: {
    prototype: ImageBitmapRenderingContext;
    new(): ImageBitmapRenderingContext;
};

/** The underlying pixel data of an area of a <canvas> element. It is created using the ImageData() constructor or creator methods on the CanvasRenderingContext2D object associated with a canvas: createImageData() and getImageData(). It can also be used to set a part of the canvas by using putImageData(). */
interface ImageData {
    /** Returns the one-dimensional array containing the data in RGBA order, as integers in the range 0 to 255. */
    readonly data: Uint8ClampedArray;
    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
    readonly height: number;
    /** Returns the actual dimensions of the data in the ImageData object, in pixels. */
    readonly width: number;
}

declare var ImageData: {
    prototype: ImageData;
    new(sw: number, sh: number, settings?: ImageDataSettings): ImageData;
    new(data: Uint8ClampedArray, sw: number, sh?: number, settings?: ImageDataSettings): ImageData;
};

interface KHR_parallel_shader_compile {
    readonly COMPLETION_STATUS_KHR: GLenum;
}

interface MediaCapabilities {
    decodingInfo(configuration: MediaDecodingConfiguration): Promise<MediaCapabilitiesDecodingInfo>;
    encodingInfo(configuration: MediaEncodingConfiguration): Promise<MediaCapabilitiesEncodingInfo>;
}

declare var MediaCapabilities: {
    prototype: MediaCapabilities;
    new(): MediaCapabilities;
};

/** This Channel Messaging API interface allows us to create a new message channel and send data through it via its two MessagePort properties. */
interface MessageChannel {
    /** Returns the first MessagePort object. */
    readonly port1: MessagePort;
    /** Returns the second MessagePort object. */
    readonly port2: MessagePort;
}

declare var MessageChannel: {
    prototype: MessageChannel;
    new(): MessageChannel;
};

/** A message received by a target object. */
interface MessageEvent<T = any> extends Event {
    /** Returns the data of the message. */
    readonly data: T;
    /** Returns the last event ID string, for server-sent events. */
    readonly lastEventId: string;
    /** Returns the origin of the message, for server-sent events and cross-document messaging. */
    readonly origin: string;
    /** Returns the MessagePort array sent with the message, for cross-document messaging and channel messaging. */
    readonly ports: ReadonlyArray<MessagePort>;
    /** Returns the WindowProxy of the source window, for cross-document messaging, and the MessagePort being attached, in the connect event fired at SharedWorkerGlobalScope objects. */
    readonly source: MessageEventSource | null;
    /** @deprecated */
    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: MessagePort[]): void;
}

declare var MessageEvent: {
    prototype: MessageEvent;
    new<T>(type: string, eventInitDict?: MessageEventInit<T>): MessageEvent<T>;
};

interface MessagePortEventMap {
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

/** This Channel Messaging API interface represents one of the two ports of a MessageChannel, allowing messages to be sent from one port and listening out for them arriving at the other. */
interface MessagePort extends EventTarget {
    onmessage: ((this: MessagePort, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: MessagePort, ev: MessageEvent) => any) | null;
    /** Disconnects the port, so that it is no longer active. */
    close(): void;
    /**
     * Posts a message through the channel. Objects listed in transfer are transferred, not just cloned, meaning that they are no longer usable on the sending side.
     *
     * Throws a "DataCloneError" DOMException if transfer contains duplicate objects or port, or if message could not be cloned.
     */
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
    /** Begins dispatching messages received on the port. */
    start(): void;
    addEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof MessagePortEventMap>(type: K, listener: (this: MessagePort, ev: MessagePortEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var MessagePort: {
    prototype: MessagePort;
    new(): MessagePort;
};

interface NavigatorConcurrentHardware {
    readonly hardwareConcurrency: number;
}

interface NavigatorID {
    /** @deprecated */
    readonly appCodeName: string;
    /** @deprecated */
    readonly appName: string;
    /** @deprecated */
    readonly appVersion: string;
    /** @deprecated */
    readonly platform: string;
    /** @deprecated */
    readonly product: string;
    readonly userAgent: string;
}

interface NavigatorLanguage {
    readonly language: string;
    readonly languages: ReadonlyArray<string>;
}

interface NavigatorNetworkInformation {
    readonly connection: NetworkInformation;
}

interface NavigatorOnLine {
    readonly onLine: boolean;
}

/** Available only in secure contexts. */
interface NavigatorStorage {
    readonly storage: StorageManager;
}

interface NetworkInformation extends EventTarget {
    readonly type: ConnectionType;
}

declare var NetworkInformation: {
    prototype: NetworkInformation;
    new(): NetworkInformation;
};

interface NotificationEventMap {
    "click": Event;
    "close": Event;
    "error": Event;
    "show": Event;
}

/** This Notifications API interface is used to configure and display desktop notifications to the user. */
interface Notification extends EventTarget {
    readonly body: string;
    readonly data: any;
    readonly dir: NotificationDirection;
    readonly icon: string;
    readonly lang: string;
    onclick: ((this: Notification, ev: Event) => any) | null;
    onclose: ((this: Notification, ev: Event) => any) | null;
    onerror: ((this: Notification, ev: Event) => any) | null;
    onshow: ((this: Notification, ev: Event) => any) | null;
    readonly tag: string;
    readonly title: string;
    close(): void;
    addEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof NotificationEventMap>(type: K, listener: (this: Notification, ev: NotificationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Notification: {
    prototype: Notification;
    new(title: string, options?: NotificationOptions): Notification;
    readonly permission: NotificationPermission;
};

/** The parameter passed into the onnotificationclick handler, the NotificationEvent interface represents a notification click event that is dispatched on the ServiceWorkerGlobalScope of a ServiceWorker. */
interface NotificationEvent extends ExtendableEvent {
    readonly action: string;
    readonly notification: Notification;
}

declare var NotificationEvent: {
    prototype: NotificationEvent;
    new(type: string, eventInitDict: NotificationEventInit): NotificationEvent;
};

/** The OES_element_index_uint extension is part of the WebGL API and adds support for gl.UNSIGNED_INT types to WebGLRenderingContext.drawElements(). */
interface OES_element_index_uint {
}

interface OES_fbo_render_mipmap {
}

/** The OES_standard_derivatives extension is part of the WebGL API and adds the GLSL derivative functions dFdx, dFdy, and fwidth. */
interface OES_standard_derivatives {
    readonly FRAGMENT_SHADER_DERIVATIVE_HINT_OES: GLenum;
}

/** The OES_texture_float extension is part of the WebGL API and exposes floating-point pixel types for textures. */
interface OES_texture_float {
}

/** The OES_texture_float_linear extension is part of the WebGL API and allows linear filtering with floating-point pixel types for textures. */
interface OES_texture_float_linear {
}

/** The OES_texture_half_float extension is part of the WebGL API and adds texture formats with 16- (aka half float) and 32-bit floating-point components. */
interface OES_texture_half_float {
    readonly HALF_FLOAT_OES: GLenum;
}

/** The OES_texture_half_float_linear extension is part of the WebGL API and allows linear filtering with half floating-point pixel types for textures. */
interface OES_texture_half_float_linear {
}

interface OES_vertex_array_object {
    bindVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
    createVertexArrayOES(): WebGLVertexArrayObjectOES | null;
    deleteVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): void;
    isVertexArrayOES(arrayObject: WebGLVertexArrayObjectOES | null): GLboolean;
    readonly VERTEX_ARRAY_BINDING_OES: GLenum;
}

interface OVR_multiview2 {
    framebufferTextureMultiviewOVR(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, baseViewIndex: GLint, numViews: GLsizei): void;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: GLenum;
    readonly MAX_VIEWS_OVR: GLenum;
}

/** @deprecated this is not available in most browsers */
interface OffscreenCanvas extends EventTarget {
}

/** This Canvas 2D API interface is used to declare a path that can then be used on a CanvasRenderingContext2D object. The path methods of the CanvasRenderingContext2D interface are also present on this interface, which gives you the convenience of being able to retain and replay your path whenever desired. */
interface Path2D extends CanvasPath {
    /** Adds to the path the path given by the argument. */
    addPath(path: Path2D, transform?: DOMMatrix2DInit): void;
}

declare var Path2D: {
    prototype: Path2D;
    new(path?: Path2D | string): Path2D;
};

interface PerformanceEventMap {
    "resourcetimingbufferfull": Event;
}

/** Provides access to performance-related information for the current page. It's part of the High Resolution Time API, but is enhanced by the Performance Timeline API, the Navigation Timing API, the User Timing API, and the Resource Timing API. */
interface Performance extends EventTarget {
    onresourcetimingbufferfull: ((this: Performance, ev: Event) => any) | null;
    readonly timeOrigin: DOMHighResTimeStamp;
    clearMarks(markName?: string): void;
    clearMeasures(measureName?: string): void;
    clearResourceTimings(): void;
    getEntries(): PerformanceEntryList;
    getEntriesByName(name: string, type?: string): PerformanceEntryList;
    getEntriesByType(type: string): PerformanceEntryList;
    mark(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
    measure(measureName: string, startOrMeasureOptions?: string | PerformanceMeasureOptions, endMark?: string): PerformanceMeasure;
    now(): DOMHighResTimeStamp;
    setResourceTimingBufferSize(maxSize: number): void;
    toJSON(): any;
    addEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof PerformanceEventMap>(type: K, listener: (this: Performance, ev: PerformanceEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Performance: {
    prototype: Performance;
    new(): Performance;
};

/** Encapsulates a single performance metric that is part of the performance timeline. A performance entry can be directly created by making a performance mark or measure (for example by calling the mark() method) at an explicit point in an application. Performance entries are also created in indirect ways such as loading a resource (such as an image). */
interface PerformanceEntry {
    readonly duration: DOMHighResTimeStamp;
    readonly entryType: string;
    readonly name: string;
    readonly startTime: DOMHighResTimeStamp;
    toJSON(): any;
}

declare var PerformanceEntry: {
    prototype: PerformanceEntry;
    new(): PerformanceEntry;
};

/** PerformanceMark\xA0is an abstract interface for PerformanceEntry objects with an entryType of "mark". Entries of this type are created by calling performance.mark() to add a named DOMHighResTimeStamp (the mark) to the browser's performance timeline. */
interface PerformanceMark extends PerformanceEntry {
    readonly detail: any;
}

declare var PerformanceMark: {
    prototype: PerformanceMark;
    new(markName: string, markOptions?: PerformanceMarkOptions): PerformanceMark;
};

/** PerformanceMeasure is an abstract interface for PerformanceEntry objects with an entryType of "measure". Entries of this type are created by calling performance.measure() to add a named DOMHighResTimeStamp (the measure) between two marks to the browser's performance timeline. */
interface PerformanceMeasure extends PerformanceEntry {
    readonly detail: any;
}

declare var PerformanceMeasure: {
    prototype: PerformanceMeasure;
    new(): PerformanceMeasure;
};

interface PerformanceObserver {
    disconnect(): void;
    observe(options?: PerformanceObserverInit): void;
    takeRecords(): PerformanceEntryList;
}

declare var PerformanceObserver: {
    prototype: PerformanceObserver;
    new(callback: PerformanceObserverCallback): PerformanceObserver;
    readonly supportedEntryTypes: ReadonlyArray<string>;
};

interface PerformanceObserverEntryList {
    getEntries(): PerformanceEntryList;
    getEntriesByName(name: string, type?: string): PerformanceEntryList;
    getEntriesByType(type: string): PerformanceEntryList;
}

declare var PerformanceObserverEntryList: {
    prototype: PerformanceObserverEntryList;
    new(): PerformanceObserverEntryList;
};

/** Enables retrieval and analysis of detailed network timing data regarding the loading of an application's resources. An application can use the timing metrics to determine, for example, the length of time it takes to fetch a specific resource, such as an XMLHttpRequest, <SVG>, image, or script. */
interface PerformanceResourceTiming extends PerformanceEntry {
    readonly connectEnd: DOMHighResTimeStamp;
    readonly connectStart: DOMHighResTimeStamp;
    readonly decodedBodySize: number;
    readonly domainLookupEnd: DOMHighResTimeStamp;
    readonly domainLookupStart: DOMHighResTimeStamp;
    readonly encodedBodySize: number;
    readonly fetchStart: DOMHighResTimeStamp;
    readonly initiatorType: string;
    readonly nextHopProtocol: string;
    readonly redirectEnd: DOMHighResTimeStamp;
    readonly redirectStart: DOMHighResTimeStamp;
    readonly requestStart: DOMHighResTimeStamp;
    readonly responseEnd: DOMHighResTimeStamp;
    readonly responseStart: DOMHighResTimeStamp;
    readonly secureConnectionStart: DOMHighResTimeStamp;
    readonly serverTiming: ReadonlyArray<PerformanceServerTiming>;
    readonly transferSize: number;
    readonly workerStart: DOMHighResTimeStamp;
    toJSON(): any;
}

declare var PerformanceResourceTiming: {
    prototype: PerformanceResourceTiming;
    new(): PerformanceResourceTiming;
};

interface PerformanceServerTiming {
    readonly description: string;
    readonly duration: DOMHighResTimeStamp;
    readonly name: string;
    toJSON(): any;
}

declare var PerformanceServerTiming: {
    prototype: PerformanceServerTiming;
    new(): PerformanceServerTiming;
};

interface PermissionStatusEventMap {
    "change": Event;
}

interface PermissionStatus extends EventTarget {
    onchange: ((this: PermissionStatus, ev: Event) => any) | null;
    readonly state: PermissionState;
    addEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof PermissionStatusEventMap>(type: K, listener: (this: PermissionStatus, ev: PermissionStatusEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var PermissionStatus: {
    prototype: PermissionStatus;
    new(): PermissionStatus;
};

interface Permissions {
    query(permissionDesc: PermissionDescriptor): Promise<PermissionStatus>;
}

declare var Permissions: {
    prototype: Permissions;
    new(): Permissions;
};

/** Events measuring progress of an underlying process, like an HTTP request (for an XMLHttpRequest, or the loading of the underlying resource of an <img>, <audio>, <video>, <style> or <link>). */
interface ProgressEvent<T extends EventTarget = EventTarget> extends Event {
    readonly lengthComputable: boolean;
    readonly loaded: number;
    readonly target: T | null;
    readonly total: number;
}

declare var ProgressEvent: {
    prototype: ProgressEvent;
    new(type: string, eventInitDict?: ProgressEventInit): ProgressEvent;
};

interface PromiseRejectionEvent extends Event {
    readonly promise: Promise<any>;
    readonly reason: any;
}

declare var PromiseRejectionEvent: {
    prototype: PromiseRejectionEvent;
    new(type: string, eventInitDict: PromiseRejectionEventInit): PromiseRejectionEvent;
};

/**
 * This Push API interface represents a push message that has been received. This event is sent to the global scope of a ServiceWorker. It contains the information sent from an application server to a PushSubscription.
 * Available only in secure contexts.
 */
interface PushEvent extends ExtendableEvent {
    readonly data: PushMessageData | null;
}

declare var PushEvent: {
    prototype: PushEvent;
    new(type: string, eventInitDict?: PushEventInit): PushEvent;
};

/**
 * This Push API interface provides a way to receive notifications from third-party servers as well as request URLs for push notifications.
 * Available only in secure contexts.
 */
interface PushManager {
    getSubscription(): Promise<PushSubscription | null>;
    permissionState(options?: PushSubscriptionOptionsInit): Promise<PushPermissionState>;
    subscribe(options?: PushSubscriptionOptionsInit): Promise<PushSubscription>;
}

declare var PushManager: {
    prototype: PushManager;
    new(): PushManager;
    readonly supportedContentEncodings: ReadonlyArray<string>;
};

/**
 * This Push API interface provides methods which let you retrieve the push data sent by a server in various formats.
 * Available only in secure contexts.
 */
interface PushMessageData {
    arrayBuffer(): ArrayBuffer;
    blob(): Blob;
    json(): any;
    text(): string;
}

declare var PushMessageData: {
    prototype: PushMessageData;
    new(): PushMessageData;
};

/**
 * This Push API interface provides a subcription's URL endpoint and allows unsubscription from a push service.
 * Available only in secure contexts.
 */
interface PushSubscription {
    readonly endpoint: string;
    readonly options: PushSubscriptionOptions;
    getKey(name: PushEncryptionKeyName): ArrayBuffer | null;
    toJSON(): PushSubscriptionJSON;
    unsubscribe(): Promise<boolean>;
}

declare var PushSubscription: {
    prototype: PushSubscription;
    new(): PushSubscription;
};

/** Available only in secure contexts. */
interface PushSubscriptionOptions {
    readonly applicationServerKey: ArrayBuffer | null;
}

declare var PushSubscriptionOptions: {
    prototype: PushSubscriptionOptions;
    new(): PushSubscriptionOptions;
};

/** This Streams API interface represents a readable stream of byte data. The Fetch API offers a concrete instance of a ReadableStream through the body property of a Response object. */
interface ReadableStream<R = any> {
    readonly locked: boolean;
    cancel(reason?: any): Promise<void>;
    getReader(): ReadableStreamDefaultReader<R>;
    pipeThrough<T>(transform: ReadableWritablePair<T, R>, options?: StreamPipeOptions): ReadableStream<T>;
    pipeTo(destination: WritableStream<R>, options?: StreamPipeOptions): Promise<void>;
    tee(): [ReadableStream<R>, ReadableStream<R>];
}

declare var ReadableStream: {
    prototype: ReadableStream;
    new<R = any>(underlyingSource?: UnderlyingSource<R>, strategy?: QueuingStrategy<R>): ReadableStream<R>;
};

interface ReadableStreamDefaultController<R = any> {
    readonly desiredSize: number | null;
    close(): void;
    enqueue(chunk?: R): void;
    error(e?: any): void;
}

declare var ReadableStreamDefaultController: {
    prototype: ReadableStreamDefaultController;
    new(): ReadableStreamDefaultController;
};

interface ReadableStreamDefaultReader<R = any> extends ReadableStreamGenericReader {
    read(): Promise<ReadableStreamDefaultReadResult<R>>;
    releaseLock(): void;
}

declare var ReadableStreamDefaultReader: {
    prototype: ReadableStreamDefaultReader;
    new<R = any>(stream: ReadableStream<R>): ReadableStreamDefaultReader<R>;
};

interface ReadableStreamGenericReader {
    readonly closed: Promise<undefined>;
    cancel(reason?: any): Promise<void>;
}

/** This Fetch API interface represents a resource request. */
interface Request extends Body {
    /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */
    readonly cache: RequestCache;
    /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */
    readonly credentials: RequestCredentials;
    /** Returns the kind of resource requested by request, e.g., "document" or "script". */
    readonly destination: RequestDestination;
    /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the "Host" header. */
    readonly headers: Headers;
    /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */
    readonly integrity: string;
    /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */
    readonly keepalive: boolean;
    /** Returns request's HTTP method, which is "GET" by default. */
    readonly method: string;
    /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */
    readonly mode: RequestMode;
    /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */
    readonly redirect: RequestRedirect;
    /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and "about:client" when defaulting to the global's default. This is used during fetching to determine the value of the \`Referer\` header of the request being made. */
    readonly referrer: string;
    /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */
    readonly referrerPolicy: ReferrerPolicy;
    /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */
    readonly signal: AbortSignal;
    /** Returns the URL of request as a string. */
    readonly url: string;
    clone(): Request;
}

declare var Request: {
    prototype: Request;
    new(input: RequestInfo, init?: RequestInit): Request;
};

/** This Fetch API interface represents the response to a request. */
interface Response extends Body {
    readonly headers: Headers;
    readonly ok: boolean;
    readonly redirected: boolean;
    readonly status: number;
    readonly statusText: string;
    readonly type: ResponseType;
    readonly url: string;
    clone(): Response;
}

declare var Response: {
    prototype: Response;
    new(body?: BodyInit | null, init?: ResponseInit): Response;
    error(): Response;
    redirect(url: string | URL, status?: number): Response;
};

/** Inherits from Event, and represents the event object of an event sent on a document or worker when its content security policy is violated. */
interface SecurityPolicyViolationEvent extends Event {
    readonly blockedURI: string;
    readonly columnNumber: number;
    readonly disposition: SecurityPolicyViolationEventDisposition;
    readonly documentURI: string;
    readonly effectiveDirective: string;
    readonly lineNumber: number;
    readonly originalPolicy: string;
    readonly referrer: string;
    readonly sample: string;
    readonly sourceFile: string;
    readonly statusCode: number;
    readonly violatedDirective: string;
}

declare var SecurityPolicyViolationEvent: {
    prototype: SecurityPolicyViolationEvent;
    new(type: string, eventInitDict?: SecurityPolicyViolationEventInit): SecurityPolicyViolationEvent;
};

interface ServiceWorkerEventMap extends AbstractWorkerEventMap {
    "statechange": Event;
}

/**
 * This ServiceWorker API interface provides a reference to a service worker. Multiple browsing contexts (e.g. pages, workers, etc.) can be associated with the same service worker, each through a unique ServiceWorker object.
 * Available only in secure contexts.
 */
interface ServiceWorker extends EventTarget, AbstractWorker {
    onstatechange: ((this: ServiceWorker, ev: Event) => any) | null;
    readonly scriptURL: string;
    readonly state: ServiceWorkerState;
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
    addEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ServiceWorkerEventMap>(type: K, listener: (this: ServiceWorker, ev: ServiceWorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ServiceWorker: {
    prototype: ServiceWorker;
    new(): ServiceWorker;
};

interface ServiceWorkerContainerEventMap {
    "controllerchange": Event;
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

/**
 * The\xA0ServiceWorkerContainer\xA0interface of the\xA0ServiceWorker API\xA0provides an object representing the service worker as an overall unit in the network ecosystem, including facilities to register, unregister and update service workers, and access the state of service workers and their registrations.
 * Available only in secure contexts.
 */
interface ServiceWorkerContainer extends EventTarget {
    readonly controller: ServiceWorker | null;
    oncontrollerchange: ((this: ServiceWorkerContainer, ev: Event) => any) | null;
    onmessage: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: ServiceWorkerContainer, ev: MessageEvent) => any) | null;
    readonly ready: Promise<ServiceWorkerRegistration>;
    getRegistration(clientURL?: string | URL): Promise<ServiceWorkerRegistration | undefined>;
    getRegistrations(): Promise<ReadonlyArray<ServiceWorkerRegistration>>;
    register(scriptURL: string | URL, options?: RegistrationOptions): Promise<ServiceWorkerRegistration>;
    startMessages(): void;
    addEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ServiceWorkerContainerEventMap>(type: K, listener: (this: ServiceWorkerContainer, ev: ServiceWorkerContainerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ServiceWorkerContainer: {
    prototype: ServiceWorkerContainer;
    new(): ServiceWorkerContainer;
};

interface ServiceWorkerGlobalScopeEventMap extends WorkerGlobalScopeEventMap {
    "activate": ExtendableEvent;
    "fetch": FetchEvent;
    "install": ExtendableEvent;
    "message": ExtendableMessageEvent;
    "messageerror": MessageEvent;
    "notificationclick": NotificationEvent;
    "notificationclose": NotificationEvent;
    "push": PushEvent;
}

/** This ServiceWorker API interface represents the global execution context of a service worker. */
interface ServiceWorkerGlobalScope extends WorkerGlobalScope {
    readonly clients: Clients;
    onactivate: ((this: ServiceWorkerGlobalScope, ev: ExtendableEvent) => any) | null;
    onfetch: ((this: ServiceWorkerGlobalScope, ev: FetchEvent) => any) | null;
    oninstall: ((this: ServiceWorkerGlobalScope, ev: ExtendableEvent) => any) | null;
    onmessage: ((this: ServiceWorkerGlobalScope, ev: ExtendableMessageEvent) => any) | null;
    onmessageerror: ((this: ServiceWorkerGlobalScope, ev: MessageEvent) => any) | null;
    onnotificationclick: ((this: ServiceWorkerGlobalScope, ev: NotificationEvent) => any) | null;
    onnotificationclose: ((this: ServiceWorkerGlobalScope, ev: NotificationEvent) => any) | null;
    onpush: ((this: ServiceWorkerGlobalScope, ev: PushEvent) => any) | null;
    readonly registration: ServiceWorkerRegistration;
    skipWaiting(): Promise<void>;
    addEventListener<K extends keyof ServiceWorkerGlobalScopeEventMap>(type: K, listener: (this: ServiceWorkerGlobalScope, ev: ServiceWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ServiceWorkerGlobalScopeEventMap>(type: K, listener: (this: ServiceWorkerGlobalScope, ev: ServiceWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ServiceWorkerGlobalScope: {
    prototype: ServiceWorkerGlobalScope;
    new(): ServiceWorkerGlobalScope;
};

interface ServiceWorkerRegistrationEventMap {
    "updatefound": Event;
}

/**
 * This ServiceWorker API interface represents the service worker registration. You register a service worker to control one or more pages that share the same origin.
 * Available only in secure contexts.
 */
interface ServiceWorkerRegistration extends EventTarget {
    readonly active: ServiceWorker | null;
    readonly installing: ServiceWorker | null;
    onupdatefound: ((this: ServiceWorkerRegistration, ev: Event) => any) | null;
    readonly pushManager: PushManager;
    readonly scope: string;
    readonly updateViaCache: ServiceWorkerUpdateViaCache;
    readonly waiting: ServiceWorker | null;
    getNotifications(filter?: GetNotificationOptions): Promise<Notification[]>;
    showNotification(title: string, options?: NotificationOptions): Promise<void>;
    unregister(): Promise<boolean>;
    update(): Promise<void>;
    addEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof ServiceWorkerRegistrationEventMap>(type: K, listener: (this: ServiceWorkerRegistration, ev: ServiceWorkerRegistrationEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var ServiceWorkerRegistration: {
    prototype: ServiceWorkerRegistration;
    new(): ServiceWorkerRegistration;
};

interface SharedWorkerGlobalScopeEventMap extends WorkerGlobalScopeEventMap {
    "connect": MessageEvent;
}

interface SharedWorkerGlobalScope extends WorkerGlobalScope {
    /** Returns sharedWorkerGlobal's name, i.e. the value given to the SharedWorker constructor. Multiple SharedWorker objects can correspond to the same shared worker (and SharedWorkerGlobalScope), by reusing the same name. */
    readonly name: string;
    onconnect: ((this: SharedWorkerGlobalScope, ev: MessageEvent) => any) | null;
    /** Aborts sharedWorkerGlobal. */
    close(): void;
    addEventListener<K extends keyof SharedWorkerGlobalScopeEventMap>(type: K, listener: (this: SharedWorkerGlobalScope, ev: SharedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof SharedWorkerGlobalScopeEventMap>(type: K, listener: (this: SharedWorkerGlobalScope, ev: SharedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var SharedWorkerGlobalScope: {
    prototype: SharedWorkerGlobalScope;
    new(): SharedWorkerGlobalScope;
};

/** Available only in secure contexts. */
interface StorageManager {
    estimate(): Promise<StorageEstimate>;
    persisted(): Promise<boolean>;
}

declare var StorageManager: {
    prototype: StorageManager;
    new(): StorageManager;
};

/**
 * This Web Crypto API interface provides a number of low-level cryptographic functions. It is accessed via the Crypto.subtle properties available in a window context (via Window.crypto).
 * Available only in secure contexts.
 */
interface SubtleCrypto {
    decrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<any>;
    deriveBits(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, length: number): Promise<ArrayBuffer>;
    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer>;
    encrypt(algorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, key: CryptoKey, data: BufferSource): Promise<any>;
    exportKey(format: "jwk", key: CryptoKey): Promise<JsonWebKey>;
    exportKey(format: Exclude<KeyFormat, "jwk">, key: CryptoKey): Promise<ArrayBuffer>;
    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair>;
    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair | CryptoKey>;
    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: BufferSource): Promise<ArrayBuffer>;
    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;
    verify(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, signature: BufferSource, data: BufferSource): Promise<boolean>;
    wrapKey(format: KeyFormat, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams): Promise<ArrayBuffer>;
}

declare var SubtleCrypto: {
    prototype: SubtleCrypto;
    new(): SubtleCrypto;
};

/** A decoder for a specific method, that is a specific character encoding, like utf-8, iso-8859-2, koi8, cp1261, gbk, etc.\xA0A decoder takes a stream of bytes as input and emits a stream of code points. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
interface TextDecoder extends TextDecoderCommon {
    /**
     * Returns the result of running encoding's decoder. The method can be invoked zero or more times with options's stream set to true, and then once without options's stream (or set to false), to process a fragmented input. If the invocation without options's stream (or set to false) has no input, it's clearest to omit both arguments.
     *
     * \`\`\`
     * var string = "", decoder = new TextDecoder(encoding), buffer;
     * while(buffer = next_chunk()) {
     *   string += decoder.decode(buffer, {stream:true});
     * }
     * string += decoder.decode(); // end-of-queue
     * \`\`\`
     *
     * If the error mode is "fatal" and encoding's decoder returns error, throws a TypeError.
     */
    decode(input?: BufferSource, options?: TextDecodeOptions): string;
}

declare var TextDecoder: {
    prototype: TextDecoder;
    new(label?: string, options?: TextDecoderOptions): TextDecoder;
};

interface TextDecoderCommon {
    /** Returns encoding's name, lowercased. */
    readonly encoding: string;
    /** Returns true if error mode is "fatal", otherwise false. */
    readonly fatal: boolean;
    /** Returns the value of ignore BOM. */
    readonly ignoreBOM: boolean;
}

interface TextDecoderStream extends GenericTransformStream, TextDecoderCommon {
    readonly readable: ReadableStream<string>;
    readonly writable: WritableStream<BufferSource>;
}

declare var TextDecoderStream: {
    prototype: TextDecoderStream;
    new(label?: string, options?: TextDecoderOptions): TextDecoderStream;
};

/** TextEncoder takes a stream of code points as input and emits a stream of bytes. For a more scalable, non-native library, see StringView \u2013 a C-like representation of strings based on typed arrays. */
interface TextEncoder extends TextEncoderCommon {
    /** Returns the result of running UTF-8's encoder. */
    encode(input?: string): Uint8Array;
    /** Runs the UTF-8 encoder on source, stores the result of that operation into destination, and returns the progress made as an object wherein read is the number of converted code units of source and written is the number of bytes modified in destination. */
    encodeInto(source: string, destination: Uint8Array): TextEncoderEncodeIntoResult;
}

declare var TextEncoder: {
    prototype: TextEncoder;
    new(): TextEncoder;
};

interface TextEncoderCommon {
    /** Returns "utf-8". */
    readonly encoding: string;
}

interface TextEncoderStream extends GenericTransformStream, TextEncoderCommon {
    readonly readable: ReadableStream<Uint8Array>;
    readonly writable: WritableStream<string>;
}

declare var TextEncoderStream: {
    prototype: TextEncoderStream;
    new(): TextEncoderStream;
};

/** The dimensions of a piece of text in the canvas, as created by the CanvasRenderingContext2D.measureText() method. */
interface TextMetrics {
    /** Returns the measurement described below. */
    readonly actualBoundingBoxAscent: number;
    /** Returns the measurement described below. */
    readonly actualBoundingBoxDescent: number;
    /** Returns the measurement described below. */
    readonly actualBoundingBoxLeft: number;
    /** Returns the measurement described below. */
    readonly actualBoundingBoxRight: number;
    /** Returns the measurement described below. */
    readonly fontBoundingBoxAscent: number;
    /** Returns the measurement described below. */
    readonly fontBoundingBoxDescent: number;
    /** Returns the measurement described below. */
    readonly width: number;
}

declare var TextMetrics: {
    prototype: TextMetrics;
    new(): TextMetrics;
};

interface TransformStream<I = any, O = any> {
    readonly readable: ReadableStream<O>;
    readonly writable: WritableStream<I>;
}

declare var TransformStream: {
    prototype: TransformStream;
    new<I = any, O = any>(transformer?: Transformer<I, O>, writableStrategy?: QueuingStrategy<I>, readableStrategy?: QueuingStrategy<O>): TransformStream<I, O>;
};

interface TransformStreamDefaultController<O = any> {
    readonly desiredSize: number | null;
    enqueue(chunk?: O): void;
    error(reason?: any): void;
    terminate(): void;
}

declare var TransformStreamDefaultController: {
    prototype: TransformStreamDefaultController;
    new(): TransformStreamDefaultController;
};

/** The URL\xA0interface represents an object providing static methods used for creating object URLs. */
interface URL {
    hash: string;
    host: string;
    hostname: string;
    href: string;
    toString(): string;
    readonly origin: string;
    password: string;
    pathname: string;
    port: string;
    protocol: string;
    search: string;
    readonly searchParams: URLSearchParams;
    username: string;
    toJSON(): string;
}

declare var URL: {
    prototype: URL;
    new(url: string | URL, base?: string | URL): URL;
    createObjectURL(obj: Blob): string;
    revokeObjectURL(url: string): void;
};

interface URLSearchParams {
    /** Appends a specified key/value pair as a new search parameter. */
    append(name: string, value: string): void;
    /** Deletes the given search parameter, and its associated value, from the list of all search parameters. */
    delete(name: string): void;
    /** Returns the first value associated to the given search parameter. */
    get(name: string): string | null;
    /** Returns all the values association with a given search parameter. */
    getAll(name: string): string[];
    /** Returns a Boolean indicating if such a search parameter exists. */
    has(name: string): boolean;
    /** Sets the value associated to a given search parameter to the given value. If there were several values, delete the others. */
    set(name: string, value: string): void;
    sort(): void;
    /** Returns a string containing a query string suitable for use in a URL. Does not include the question mark. */
    toString(): string;
    forEach(callbackfn: (value: string, key: string, parent: URLSearchParams) => void, thisArg?: any): void;
}

declare var URLSearchParams: {
    prototype: URLSearchParams;
    new(init?: string[][] | Record<string, string> | string | URLSearchParams): URLSearchParams;
    toString(): string;
};

interface WEBGL_color_buffer_float {
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: GLenum;
    readonly RGBA32F_EXT: GLenum;
    readonly UNSIGNED_NORMALIZED_EXT: GLenum;
}

interface WEBGL_compressed_texture_astc {
    getSupportedProfiles(): string[];
    readonly COMPRESSED_RGBA_ASTC_10x10_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_10x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_10x6_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_10x8_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_12x10_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_12x12_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_4x4_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_5x4_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_5x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_6x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_6x6_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_8x5_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_8x6_KHR: GLenum;
    readonly COMPRESSED_RGBA_ASTC_8x8_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: GLenum;
}

interface WEBGL_compressed_texture_etc {
    readonly COMPRESSED_R11_EAC: GLenum;
    readonly COMPRESSED_RG11_EAC: GLenum;
    readonly COMPRESSED_RGB8_ETC2: GLenum;
    readonly COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum;
    readonly COMPRESSED_RGBA8_ETC2_EAC: GLenum;
    readonly COMPRESSED_SIGNED_R11_EAC: GLenum;
    readonly COMPRESSED_SIGNED_RG11_EAC: GLenum;
    readonly COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: GLenum;
    readonly COMPRESSED_SRGB8_ETC2: GLenum;
    readonly COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum;
}

interface WEBGL_compressed_texture_etc1 {
    readonly COMPRESSED_RGB_ETC1_WEBGL: GLenum;
}

interface WEBGL_compressed_texture_pvrtc {
    readonly COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: GLenum;
    readonly COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: GLenum;
    readonly COMPRESSED_RGB_PVRTC_2BPPV1_IMG: GLenum;
    readonly COMPRESSED_RGB_PVRTC_4BPPV1_IMG: GLenum;
}

/** The WEBGL_compressed_texture_s3tc extension is part of the WebGL API and exposes four S3TC compressed texture formats. */
interface WEBGL_compressed_texture_s3tc {
    readonly COMPRESSED_RGBA_S3TC_DXT1_EXT: GLenum;
    readonly COMPRESSED_RGBA_S3TC_DXT3_EXT: GLenum;
    readonly COMPRESSED_RGBA_S3TC_DXT5_EXT: GLenum;
    readonly COMPRESSED_RGB_S3TC_DXT1_EXT: GLenum;
}

interface WEBGL_compressed_texture_s3tc_srgb {
    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: GLenum;
    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: GLenum;
    readonly COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: GLenum;
    readonly COMPRESSED_SRGB_S3TC_DXT1_EXT: GLenum;
}

/** The WEBGL_debug_renderer_info extension is part of the WebGL API and exposes two constants with information about the graphics driver for debugging purposes. */
interface WEBGL_debug_renderer_info {
    readonly UNMASKED_RENDERER_WEBGL: GLenum;
    readonly UNMASKED_VENDOR_WEBGL: GLenum;
}

interface WEBGL_debug_shaders {
    getTranslatedShaderSource(shader: WebGLShader): string;
}

/** The WEBGL_depth_texture extension is part of the WebGL API and defines 2D depth and depth-stencil textures. */
interface WEBGL_depth_texture {
    readonly UNSIGNED_INT_24_8_WEBGL: GLenum;
}

interface WEBGL_draw_buffers {
    drawBuffersWEBGL(buffers: GLenum[]): void;
    readonly COLOR_ATTACHMENT0_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT10_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT11_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT12_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT13_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT14_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT15_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT1_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT2_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT3_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT4_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT5_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT6_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT7_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT8_WEBGL: GLenum;
    readonly COLOR_ATTACHMENT9_WEBGL: GLenum;
    readonly DRAW_BUFFER0_WEBGL: GLenum;
    readonly DRAW_BUFFER10_WEBGL: GLenum;
    readonly DRAW_BUFFER11_WEBGL: GLenum;
    readonly DRAW_BUFFER12_WEBGL: GLenum;
    readonly DRAW_BUFFER13_WEBGL: GLenum;
    readonly DRAW_BUFFER14_WEBGL: GLenum;
    readonly DRAW_BUFFER15_WEBGL: GLenum;
    readonly DRAW_BUFFER1_WEBGL: GLenum;
    readonly DRAW_BUFFER2_WEBGL: GLenum;
    readonly DRAW_BUFFER3_WEBGL: GLenum;
    readonly DRAW_BUFFER4_WEBGL: GLenum;
    readonly DRAW_BUFFER5_WEBGL: GLenum;
    readonly DRAW_BUFFER6_WEBGL: GLenum;
    readonly DRAW_BUFFER7_WEBGL: GLenum;
    readonly DRAW_BUFFER8_WEBGL: GLenum;
    readonly DRAW_BUFFER9_WEBGL: GLenum;
    readonly MAX_COLOR_ATTACHMENTS_WEBGL: GLenum;
    readonly MAX_DRAW_BUFFERS_WEBGL: GLenum;
}

interface WEBGL_lose_context {
    loseContext(): void;
    restoreContext(): void;
}

interface WebGL2RenderingContext extends WebGL2RenderingContextBase, WebGL2RenderingContextOverloads, WebGLRenderingContextBase {
}

declare var WebGL2RenderingContext: {
    prototype: WebGL2RenderingContext;
    new(): WebGL2RenderingContext;
    readonly ACTIVE_UNIFORM_BLOCKS: GLenum;
    readonly ALREADY_SIGNALED: GLenum;
    readonly ANY_SAMPLES_PASSED: GLenum;
    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: GLenum;
    readonly COLOR: GLenum;
    readonly COLOR_ATTACHMENT1: GLenum;
    readonly COLOR_ATTACHMENT10: GLenum;
    readonly COLOR_ATTACHMENT11: GLenum;
    readonly COLOR_ATTACHMENT12: GLenum;
    readonly COLOR_ATTACHMENT13: GLenum;
    readonly COLOR_ATTACHMENT14: GLenum;
    readonly COLOR_ATTACHMENT15: GLenum;
    readonly COLOR_ATTACHMENT2: GLenum;
    readonly COLOR_ATTACHMENT3: GLenum;
    readonly COLOR_ATTACHMENT4: GLenum;
    readonly COLOR_ATTACHMENT5: GLenum;
    readonly COLOR_ATTACHMENT6: GLenum;
    readonly COLOR_ATTACHMENT7: GLenum;
    readonly COLOR_ATTACHMENT8: GLenum;
    readonly COLOR_ATTACHMENT9: GLenum;
    readonly COMPARE_REF_TO_TEXTURE: GLenum;
    readonly CONDITION_SATISFIED: GLenum;
    readonly COPY_READ_BUFFER: GLenum;
    readonly COPY_READ_BUFFER_BINDING: GLenum;
    readonly COPY_WRITE_BUFFER: GLenum;
    readonly COPY_WRITE_BUFFER_BINDING: GLenum;
    readonly CURRENT_QUERY: GLenum;
    readonly DEPTH: GLenum;
    readonly DEPTH24_STENCIL8: GLenum;
    readonly DEPTH32F_STENCIL8: GLenum;
    readonly DEPTH_COMPONENT24: GLenum;
    readonly DEPTH_COMPONENT32F: GLenum;
    readonly DRAW_BUFFER0: GLenum;
    readonly DRAW_BUFFER1: GLenum;
    readonly DRAW_BUFFER10: GLenum;
    readonly DRAW_BUFFER11: GLenum;
    readonly DRAW_BUFFER12: GLenum;
    readonly DRAW_BUFFER13: GLenum;
    readonly DRAW_BUFFER14: GLenum;
    readonly DRAW_BUFFER15: GLenum;
    readonly DRAW_BUFFER2: GLenum;
    readonly DRAW_BUFFER3: GLenum;
    readonly DRAW_BUFFER4: GLenum;
    readonly DRAW_BUFFER5: GLenum;
    readonly DRAW_BUFFER6: GLenum;
    readonly DRAW_BUFFER7: GLenum;
    readonly DRAW_BUFFER8: GLenum;
    readonly DRAW_BUFFER9: GLenum;
    readonly DRAW_FRAMEBUFFER: GLenum;
    readonly DRAW_FRAMEBUFFER_BINDING: GLenum;
    readonly DYNAMIC_COPY: GLenum;
    readonly DYNAMIC_READ: GLenum;
    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: GLenum;
    readonly FLOAT_MAT2x3: GLenum;
    readonly FLOAT_MAT2x4: GLenum;
    readonly FLOAT_MAT3x2: GLenum;
    readonly FLOAT_MAT3x4: GLenum;
    readonly FLOAT_MAT4x2: GLenum;
    readonly FLOAT_MAT4x3: GLenum;
    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: GLenum;
    readonly FRAMEBUFFER_DEFAULT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: GLenum;
    readonly HALF_FLOAT: GLenum;
    readonly INTERLEAVED_ATTRIBS: GLenum;
    readonly INT_2_10_10_10_REV: GLenum;
    readonly INT_SAMPLER_2D: GLenum;
    readonly INT_SAMPLER_2D_ARRAY: GLenum;
    readonly INT_SAMPLER_3D: GLenum;
    readonly INT_SAMPLER_CUBE: GLenum;
    readonly INVALID_INDEX: GLenum;
    readonly MAX: GLenum;
    readonly MAX_3D_TEXTURE_SIZE: GLenum;
    readonly MAX_ARRAY_TEXTURE_LAYERS: GLenum;
    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: GLenum;
    readonly MAX_COLOR_ATTACHMENTS: GLenum;
    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_COMBINED_UNIFORM_BLOCKS: GLenum;
    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_DRAW_BUFFERS: GLenum;
    readonly MAX_ELEMENTS_INDICES: GLenum;
    readonly MAX_ELEMENTS_VERTICES: GLenum;
    readonly MAX_ELEMENT_INDEX: GLenum;
    readonly MAX_FRAGMENT_INPUT_COMPONENTS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly MAX_SAMPLES: GLenum;
    readonly MAX_SERVER_WAIT_TIMEOUT: GLenum;
    readonly MAX_TEXTURE_LOD_BIAS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: GLenum;
    readonly MAX_UNIFORM_BLOCK_SIZE: GLenum;
    readonly MAX_UNIFORM_BUFFER_BINDINGS: GLenum;
    readonly MAX_VARYING_COMPONENTS: GLenum;
    readonly MAX_VERTEX_OUTPUT_COMPONENTS: GLenum;
    readonly MAX_VERTEX_UNIFORM_BLOCKS: GLenum;
    readonly MAX_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MIN: GLenum;
    readonly MIN_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly OBJECT_TYPE: GLenum;
    readonly PACK_ROW_LENGTH: GLenum;
    readonly PACK_SKIP_PIXELS: GLenum;
    readonly PACK_SKIP_ROWS: GLenum;
    readonly PIXEL_PACK_BUFFER: GLenum;
    readonly PIXEL_PACK_BUFFER_BINDING: GLenum;
    readonly PIXEL_UNPACK_BUFFER: GLenum;
    readonly PIXEL_UNPACK_BUFFER_BINDING: GLenum;
    readonly QUERY_RESULT: GLenum;
    readonly QUERY_RESULT_AVAILABLE: GLenum;
    readonly R11F_G11F_B10F: GLenum;
    readonly R16F: GLenum;
    readonly R16I: GLenum;
    readonly R16UI: GLenum;
    readonly R32F: GLenum;
    readonly R32I: GLenum;
    readonly R32UI: GLenum;
    readonly R8: GLenum;
    readonly R8I: GLenum;
    readonly R8UI: GLenum;
    readonly R8_SNORM: GLenum;
    readonly RASTERIZER_DISCARD: GLenum;
    readonly READ_BUFFER: GLenum;
    readonly READ_FRAMEBUFFER: GLenum;
    readonly READ_FRAMEBUFFER_BINDING: GLenum;
    readonly RED: GLenum;
    readonly RED_INTEGER: GLenum;
    readonly RENDERBUFFER_SAMPLES: GLenum;
    readonly RG: GLenum;
    readonly RG16F: GLenum;
    readonly RG16I: GLenum;
    readonly RG16UI: GLenum;
    readonly RG32F: GLenum;
    readonly RG32I: GLenum;
    readonly RG32UI: GLenum;
    readonly RG8: GLenum;
    readonly RG8I: GLenum;
    readonly RG8UI: GLenum;
    readonly RG8_SNORM: GLenum;
    readonly RGB10_A2: GLenum;
    readonly RGB10_A2UI: GLenum;
    readonly RGB16F: GLenum;
    readonly RGB16I: GLenum;
    readonly RGB16UI: GLenum;
    readonly RGB32F: GLenum;
    readonly RGB32I: GLenum;
    readonly RGB32UI: GLenum;
    readonly RGB8: GLenum;
    readonly RGB8I: GLenum;
    readonly RGB8UI: GLenum;
    readonly RGB8_SNORM: GLenum;
    readonly RGB9_E5: GLenum;
    readonly RGBA16F: GLenum;
    readonly RGBA16I: GLenum;
    readonly RGBA16UI: GLenum;
    readonly RGBA32F: GLenum;
    readonly RGBA32I: GLenum;
    readonly RGBA32UI: GLenum;
    readonly RGBA8: GLenum;
    readonly RGBA8I: GLenum;
    readonly RGBA8UI: GLenum;
    readonly RGBA8_SNORM: GLenum;
    readonly RGBA_INTEGER: GLenum;
    readonly RGB_INTEGER: GLenum;
    readonly RG_INTEGER: GLenum;
    readonly SAMPLER_2D_ARRAY: GLenum;
    readonly SAMPLER_2D_ARRAY_SHADOW: GLenum;
    readonly SAMPLER_2D_SHADOW: GLenum;
    readonly SAMPLER_3D: GLenum;
    readonly SAMPLER_BINDING: GLenum;
    readonly SAMPLER_CUBE_SHADOW: GLenum;
    readonly SEPARATE_ATTRIBS: GLenum;
    readonly SIGNALED: GLenum;
    readonly SIGNED_NORMALIZED: GLenum;
    readonly SRGB: GLenum;
    readonly SRGB8: GLenum;
    readonly SRGB8_ALPHA8: GLenum;
    readonly STATIC_COPY: GLenum;
    readonly STATIC_READ: GLenum;
    readonly STENCIL: GLenum;
    readonly STREAM_COPY: GLenum;
    readonly STREAM_READ: GLenum;
    readonly SYNC_CONDITION: GLenum;
    readonly SYNC_FENCE: GLenum;
    readonly SYNC_FLAGS: GLenum;
    readonly SYNC_FLUSH_COMMANDS_BIT: GLenum;
    readonly SYNC_GPU_COMMANDS_COMPLETE: GLenum;
    readonly SYNC_STATUS: GLenum;
    readonly TEXTURE_2D_ARRAY: GLenum;
    readonly TEXTURE_3D: GLenum;
    readonly TEXTURE_BASE_LEVEL: GLenum;
    readonly TEXTURE_BINDING_2D_ARRAY: GLenum;
    readonly TEXTURE_BINDING_3D: GLenum;
    readonly TEXTURE_COMPARE_FUNC: GLenum;
    readonly TEXTURE_COMPARE_MODE: GLenum;
    readonly TEXTURE_IMMUTABLE_FORMAT: GLenum;
    readonly TEXTURE_IMMUTABLE_LEVELS: GLenum;
    readonly TEXTURE_MAX_LEVEL: GLenum;
    readonly TEXTURE_MAX_LOD: GLenum;
    readonly TEXTURE_MIN_LOD: GLenum;
    readonly TEXTURE_WRAP_R: GLenum;
    readonly TIMEOUT_EXPIRED: GLenum;
    readonly TIMEOUT_IGNORED: GLint64;
    readonly TRANSFORM_FEEDBACK: GLenum;
    readonly TRANSFORM_FEEDBACK_ACTIVE: GLenum;
    readonly TRANSFORM_FEEDBACK_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_START: GLenum;
    readonly TRANSFORM_FEEDBACK_PAUSED: GLenum;
    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: GLenum;
    readonly TRANSFORM_FEEDBACK_VARYINGS: GLenum;
    readonly UNIFORM_ARRAY_STRIDE: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: GLenum;
    readonly UNIFORM_BLOCK_BINDING: GLenum;
    readonly UNIFORM_BLOCK_DATA_SIZE: GLenum;
    readonly UNIFORM_BLOCK_INDEX: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: GLenum;
    readonly UNIFORM_BUFFER: GLenum;
    readonly UNIFORM_BUFFER_BINDING: GLenum;
    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: GLenum;
    readonly UNIFORM_BUFFER_SIZE: GLenum;
    readonly UNIFORM_BUFFER_START: GLenum;
    readonly UNIFORM_IS_ROW_MAJOR: GLenum;
    readonly UNIFORM_MATRIX_STRIDE: GLenum;
    readonly UNIFORM_OFFSET: GLenum;
    readonly UNIFORM_SIZE: GLenum;
    readonly UNIFORM_TYPE: GLenum;
    readonly UNPACK_IMAGE_HEIGHT: GLenum;
    readonly UNPACK_ROW_LENGTH: GLenum;
    readonly UNPACK_SKIP_IMAGES: GLenum;
    readonly UNPACK_SKIP_PIXELS: GLenum;
    readonly UNPACK_SKIP_ROWS: GLenum;
    readonly UNSIGNALED: GLenum;
    readonly UNSIGNED_INT_10F_11F_11F_REV: GLenum;
    readonly UNSIGNED_INT_24_8: GLenum;
    readonly UNSIGNED_INT_2_10_10_10_REV: GLenum;
    readonly UNSIGNED_INT_5_9_9_9_REV: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: GLenum;
    readonly UNSIGNED_INT_SAMPLER_3D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_CUBE: GLenum;
    readonly UNSIGNED_INT_VEC2: GLenum;
    readonly UNSIGNED_INT_VEC3: GLenum;
    readonly UNSIGNED_INT_VEC4: GLenum;
    readonly UNSIGNED_NORMALIZED: GLenum;
    readonly VERTEX_ARRAY_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_INTEGER: GLenum;
    readonly WAIT_FAILED: GLenum;
    readonly ACTIVE_ATTRIBUTES: GLenum;
    readonly ACTIVE_TEXTURE: GLenum;
    readonly ACTIVE_UNIFORMS: GLenum;
    readonly ALIASED_LINE_WIDTH_RANGE: GLenum;
    readonly ALIASED_POINT_SIZE_RANGE: GLenum;
    readonly ALPHA: GLenum;
    readonly ALPHA_BITS: GLenum;
    readonly ALWAYS: GLenum;
    readonly ARRAY_BUFFER: GLenum;
    readonly ARRAY_BUFFER_BINDING: GLenum;
    readonly ATTACHED_SHADERS: GLenum;
    readonly BACK: GLenum;
    readonly BLEND: GLenum;
    readonly BLEND_COLOR: GLenum;
    readonly BLEND_DST_ALPHA: GLenum;
    readonly BLEND_DST_RGB: GLenum;
    readonly BLEND_EQUATION: GLenum;
    readonly BLEND_EQUATION_ALPHA: GLenum;
    readonly BLEND_EQUATION_RGB: GLenum;
    readonly BLEND_SRC_ALPHA: GLenum;
    readonly BLEND_SRC_RGB: GLenum;
    readonly BLUE_BITS: GLenum;
    readonly BOOL: GLenum;
    readonly BOOL_VEC2: GLenum;
    readonly BOOL_VEC3: GLenum;
    readonly BOOL_VEC4: GLenum;
    readonly BROWSER_DEFAULT_WEBGL: GLenum;
    readonly BUFFER_SIZE: GLenum;
    readonly BUFFER_USAGE: GLenum;
    readonly BYTE: GLenum;
    readonly CCW: GLenum;
    readonly CLAMP_TO_EDGE: GLenum;
    readonly COLOR_ATTACHMENT0: GLenum;
    readonly COLOR_BUFFER_BIT: GLenum;
    readonly COLOR_CLEAR_VALUE: GLenum;
    readonly COLOR_WRITEMASK: GLenum;
    readonly COMPILE_STATUS: GLenum;
    readonly COMPRESSED_TEXTURE_FORMATS: GLenum;
    readonly CONSTANT_ALPHA: GLenum;
    readonly CONSTANT_COLOR: GLenum;
    readonly CONTEXT_LOST_WEBGL: GLenum;
    readonly CULL_FACE: GLenum;
    readonly CULL_FACE_MODE: GLenum;
    readonly CURRENT_PROGRAM: GLenum;
    readonly CURRENT_VERTEX_ATTRIB: GLenum;
    readonly CW: GLenum;
    readonly DECR: GLenum;
    readonly DECR_WRAP: GLenum;
    readonly DELETE_STATUS: GLenum;
    readonly DEPTH_ATTACHMENT: GLenum;
    readonly DEPTH_BITS: GLenum;
    readonly DEPTH_BUFFER_BIT: GLenum;
    readonly DEPTH_CLEAR_VALUE: GLenum;
    readonly DEPTH_COMPONENT: GLenum;
    readonly DEPTH_COMPONENT16: GLenum;
    readonly DEPTH_FUNC: GLenum;
    readonly DEPTH_RANGE: GLenum;
    readonly DEPTH_STENCIL: GLenum;
    readonly DEPTH_STENCIL_ATTACHMENT: GLenum;
    readonly DEPTH_TEST: GLenum;
    readonly DEPTH_WRITEMASK: GLenum;
    readonly DITHER: GLenum;
    readonly DONT_CARE: GLenum;
    readonly DST_ALPHA: GLenum;
    readonly DST_COLOR: GLenum;
    readonly DYNAMIC_DRAW: GLenum;
    readonly ELEMENT_ARRAY_BUFFER: GLenum;
    readonly ELEMENT_ARRAY_BUFFER_BINDING: GLenum;
    readonly EQUAL: GLenum;
    readonly FASTEST: GLenum;
    readonly FLOAT: GLenum;
    readonly FLOAT_MAT2: GLenum;
    readonly FLOAT_MAT3: GLenum;
    readonly FLOAT_MAT4: GLenum;
    readonly FLOAT_VEC2: GLenum;
    readonly FLOAT_VEC3: GLenum;
    readonly FLOAT_VEC4: GLenum;
    readonly FRAGMENT_SHADER: GLenum;
    readonly FRAMEBUFFER: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum;
    readonly FRAMEBUFFER_BINDING: GLenum;
    readonly FRAMEBUFFER_COMPLETE: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_UNSUPPORTED: GLenum;
    readonly FRONT: GLenum;
    readonly FRONT_AND_BACK: GLenum;
    readonly FRONT_FACE: GLenum;
    readonly FUNC_ADD: GLenum;
    readonly FUNC_REVERSE_SUBTRACT: GLenum;
    readonly FUNC_SUBTRACT: GLenum;
    readonly GENERATE_MIPMAP_HINT: GLenum;
    readonly GEQUAL: GLenum;
    readonly GREATER: GLenum;
    readonly GREEN_BITS: GLenum;
    readonly HIGH_FLOAT: GLenum;
    readonly HIGH_INT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_FORMAT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_TYPE: GLenum;
    readonly INCR: GLenum;
    readonly INCR_WRAP: GLenum;
    readonly INT: GLenum;
    readonly INT_VEC2: GLenum;
    readonly INT_VEC3: GLenum;
    readonly INT_VEC4: GLenum;
    readonly INVALID_ENUM: GLenum;
    readonly INVALID_FRAMEBUFFER_OPERATION: GLenum;
    readonly INVALID_OPERATION: GLenum;
    readonly INVALID_VALUE: GLenum;
    readonly INVERT: GLenum;
    readonly KEEP: GLenum;
    readonly LEQUAL: GLenum;
    readonly LESS: GLenum;
    readonly LINEAR: GLenum;
    readonly LINEAR_MIPMAP_LINEAR: GLenum;
    readonly LINEAR_MIPMAP_NEAREST: GLenum;
    readonly LINES: GLenum;
    readonly LINE_LOOP: GLenum;
    readonly LINE_STRIP: GLenum;
    readonly LINE_WIDTH: GLenum;
    readonly LINK_STATUS: GLenum;
    readonly LOW_FLOAT: GLenum;
    readonly LOW_INT: GLenum;
    readonly LUMINANCE: GLenum;
    readonly LUMINANCE_ALPHA: GLenum;
    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_CUBE_MAP_TEXTURE_SIZE: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_VECTORS: GLenum;
    readonly MAX_RENDERBUFFER_SIZE: GLenum;
    readonly MAX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_TEXTURE_SIZE: GLenum;
    readonly MAX_VARYING_VECTORS: GLenum;
    readonly MAX_VERTEX_ATTRIBS: GLenum;
    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_VERTEX_UNIFORM_VECTORS: GLenum;
    readonly MAX_VIEWPORT_DIMS: GLenum;
    readonly MEDIUM_FLOAT: GLenum;
    readonly MEDIUM_INT: GLenum;
    readonly MIRRORED_REPEAT: GLenum;
    readonly NEAREST: GLenum;
    readonly NEAREST_MIPMAP_LINEAR: GLenum;
    readonly NEAREST_MIPMAP_NEAREST: GLenum;
    readonly NEVER: GLenum;
    readonly NICEST: GLenum;
    readonly NONE: GLenum;
    readonly NOTEQUAL: GLenum;
    readonly NO_ERROR: GLenum;
    readonly ONE: GLenum;
    readonly ONE_MINUS_CONSTANT_ALPHA: GLenum;
    readonly ONE_MINUS_CONSTANT_COLOR: GLenum;
    readonly ONE_MINUS_DST_ALPHA: GLenum;
    readonly ONE_MINUS_DST_COLOR: GLenum;
    readonly ONE_MINUS_SRC_ALPHA: GLenum;
    readonly ONE_MINUS_SRC_COLOR: GLenum;
    readonly OUT_OF_MEMORY: GLenum;
    readonly PACK_ALIGNMENT: GLenum;
    readonly POINTS: GLenum;
    readonly POLYGON_OFFSET_FACTOR: GLenum;
    readonly POLYGON_OFFSET_FILL: GLenum;
    readonly POLYGON_OFFSET_UNITS: GLenum;
    readonly RED_BITS: GLenum;
    readonly RENDERBUFFER: GLenum;
    readonly RENDERBUFFER_ALPHA_SIZE: GLenum;
    readonly RENDERBUFFER_BINDING: GLenum;
    readonly RENDERBUFFER_BLUE_SIZE: GLenum;
    readonly RENDERBUFFER_DEPTH_SIZE: GLenum;
    readonly RENDERBUFFER_GREEN_SIZE: GLenum;
    readonly RENDERBUFFER_HEIGHT: GLenum;
    readonly RENDERBUFFER_INTERNAL_FORMAT: GLenum;
    readonly RENDERBUFFER_RED_SIZE: GLenum;
    readonly RENDERBUFFER_STENCIL_SIZE: GLenum;
    readonly RENDERBUFFER_WIDTH: GLenum;
    readonly RENDERER: GLenum;
    readonly REPEAT: GLenum;
    readonly REPLACE: GLenum;
    readonly RGB: GLenum;
    readonly RGB565: GLenum;
    readonly RGB5_A1: GLenum;
    readonly RGBA: GLenum;
    readonly RGBA4: GLenum;
    readonly SAMPLER_2D: GLenum;
    readonly SAMPLER_CUBE: GLenum;
    readonly SAMPLES: GLenum;
    readonly SAMPLE_ALPHA_TO_COVERAGE: GLenum;
    readonly SAMPLE_BUFFERS: GLenum;
    readonly SAMPLE_COVERAGE: GLenum;
    readonly SAMPLE_COVERAGE_INVERT: GLenum;
    readonly SAMPLE_COVERAGE_VALUE: GLenum;
    readonly SCISSOR_BOX: GLenum;
    readonly SCISSOR_TEST: GLenum;
    readonly SHADER_TYPE: GLenum;
    readonly SHADING_LANGUAGE_VERSION: GLenum;
    readonly SHORT: GLenum;
    readonly SRC_ALPHA: GLenum;
    readonly SRC_ALPHA_SATURATE: GLenum;
    readonly SRC_COLOR: GLenum;
    readonly STATIC_DRAW: GLenum;
    readonly STENCIL_ATTACHMENT: GLenum;
    readonly STENCIL_BACK_FAIL: GLenum;
    readonly STENCIL_BACK_FUNC: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_BACK_REF: GLenum;
    readonly STENCIL_BACK_VALUE_MASK: GLenum;
    readonly STENCIL_BACK_WRITEMASK: GLenum;
    readonly STENCIL_BITS: GLenum;
    readonly STENCIL_BUFFER_BIT: GLenum;
    readonly STENCIL_CLEAR_VALUE: GLenum;
    readonly STENCIL_FAIL: GLenum;
    readonly STENCIL_FUNC: GLenum;
    readonly STENCIL_INDEX8: GLenum;
    readonly STENCIL_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_REF: GLenum;
    readonly STENCIL_TEST: GLenum;
    readonly STENCIL_VALUE_MASK: GLenum;
    readonly STENCIL_WRITEMASK: GLenum;
    readonly STREAM_DRAW: GLenum;
    readonly SUBPIXEL_BITS: GLenum;
    readonly TEXTURE: GLenum;
    readonly TEXTURE0: GLenum;
    readonly TEXTURE1: GLenum;
    readonly TEXTURE10: GLenum;
    readonly TEXTURE11: GLenum;
    readonly TEXTURE12: GLenum;
    readonly TEXTURE13: GLenum;
    readonly TEXTURE14: GLenum;
    readonly TEXTURE15: GLenum;
    readonly TEXTURE16: GLenum;
    readonly TEXTURE17: GLenum;
    readonly TEXTURE18: GLenum;
    readonly TEXTURE19: GLenum;
    readonly TEXTURE2: GLenum;
    readonly TEXTURE20: GLenum;
    readonly TEXTURE21: GLenum;
    readonly TEXTURE22: GLenum;
    readonly TEXTURE23: GLenum;
    readonly TEXTURE24: GLenum;
    readonly TEXTURE25: GLenum;
    readonly TEXTURE26: GLenum;
    readonly TEXTURE27: GLenum;
    readonly TEXTURE28: GLenum;
    readonly TEXTURE29: GLenum;
    readonly TEXTURE3: GLenum;
    readonly TEXTURE30: GLenum;
    readonly TEXTURE31: GLenum;
    readonly TEXTURE4: GLenum;
    readonly TEXTURE5: GLenum;
    readonly TEXTURE6: GLenum;
    readonly TEXTURE7: GLenum;
    readonly TEXTURE8: GLenum;
    readonly TEXTURE9: GLenum;
    readonly TEXTURE_2D: GLenum;
    readonly TEXTURE_BINDING_2D: GLenum;
    readonly TEXTURE_BINDING_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum;
    readonly TEXTURE_MAG_FILTER: GLenum;
    readonly TEXTURE_MIN_FILTER: GLenum;
    readonly TEXTURE_WRAP_S: GLenum;
    readonly TEXTURE_WRAP_T: GLenum;
    readonly TRIANGLES: GLenum;
    readonly TRIANGLE_FAN: GLenum;
    readonly TRIANGLE_STRIP: GLenum;
    readonly UNPACK_ALIGNMENT: GLenum;
    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: GLenum;
    readonly UNPACK_FLIP_Y_WEBGL: GLenum;
    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: GLenum;
    readonly UNSIGNED_BYTE: GLenum;
    readonly UNSIGNED_INT: GLenum;
    readonly UNSIGNED_SHORT: GLenum;
    readonly UNSIGNED_SHORT_4_4_4_4: GLenum;
    readonly UNSIGNED_SHORT_5_5_5_1: GLenum;
    readonly UNSIGNED_SHORT_5_6_5: GLenum;
    readonly VALIDATE_STATUS: GLenum;
    readonly VENDOR: GLenum;
    readonly VERSION: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_ENABLED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_POINTER: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_SIZE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_STRIDE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_TYPE: GLenum;
    readonly VERTEX_SHADER: GLenum;
    readonly VIEWPORT: GLenum;
    readonly ZERO: GLenum;
};

interface WebGL2RenderingContextBase {
    beginQuery(target: GLenum, query: WebGLQuery): void;
    beginTransformFeedback(primitiveMode: GLenum): void;
    bindBufferBase(target: GLenum, index: GLuint, buffer: WebGLBuffer | null): void;
    bindBufferRange(target: GLenum, index: GLuint, buffer: WebGLBuffer | null, offset: GLintptr, size: GLsizeiptr): void;
    bindSampler(unit: GLuint, sampler: WebGLSampler | null): void;
    bindTransformFeedback(target: GLenum, tf: WebGLTransformFeedback | null): void;
    bindVertexArray(array: WebGLVertexArrayObject | null): void;
    blitFramebuffer(srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum): void;
    clearBufferfi(buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint): void;
    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Float32List, srcOffset?: GLuint): void;
    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Int32List, srcOffset?: GLuint): void;
    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Uint32List, srcOffset?: GLuint): void;
    clientWaitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLuint64): GLenum;
    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexImage3D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    copyBufferSubData(readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr): void;
    copyTexSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    createQuery(): WebGLQuery | null;
    createSampler(): WebGLSampler | null;
    createTransformFeedback(): WebGLTransformFeedback | null;
    createVertexArray(): WebGLVertexArrayObject | null;
    deleteQuery(query: WebGLQuery | null): void;
    deleteSampler(sampler: WebGLSampler | null): void;
    deleteSync(sync: WebGLSync | null): void;
    deleteTransformFeedback(tf: WebGLTransformFeedback | null): void;
    deleteVertexArray(vertexArray: WebGLVertexArrayObject | null): void;
    drawArraysInstanced(mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei): void;
    drawBuffers(buffers: GLenum[]): void;
    drawElementsInstanced(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr, instanceCount: GLsizei): void;
    drawRangeElements(mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, offset: GLintptr): void;
    endQuery(target: GLenum): void;
    endTransformFeedback(): void;
    fenceSync(condition: GLenum, flags: GLbitfield): WebGLSync | null;
    framebufferTextureLayer(target: GLenum, attachment: GLenum, texture: WebGLTexture | null, level: GLint, layer: GLint): void;
    getActiveUniformBlockName(program: WebGLProgram, uniformBlockIndex: GLuint): string | null;
    getActiveUniformBlockParameter(program: WebGLProgram, uniformBlockIndex: GLuint, pname: GLenum): any;
    getActiveUniforms(program: WebGLProgram, uniformIndices: GLuint[], pname: GLenum): any;
    getBufferSubData(target: GLenum, srcByteOffset: GLintptr, dstBuffer: ArrayBufferView, dstOffset?: GLuint, length?: GLuint): void;
    getFragDataLocation(program: WebGLProgram, name: string): GLint;
    getIndexedParameter(target: GLenum, index: GLuint): any;
    getInternalformatParameter(target: GLenum, internalformat: GLenum, pname: GLenum): any;
    getQuery(target: GLenum, pname: GLenum): WebGLQuery | null;
    getQueryParameter(query: WebGLQuery, pname: GLenum): any;
    getSamplerParameter(sampler: WebGLSampler, pname: GLenum): any;
    getSyncParameter(sync: WebGLSync, pname: GLenum): any;
    getTransformFeedbackVarying(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
    getUniformBlockIndex(program: WebGLProgram, uniformBlockName: string): GLuint;
    getUniformIndices(program: WebGLProgram, uniformNames: string[]): GLuint[] | null;
    invalidateFramebuffer(target: GLenum, attachments: GLenum[]): void;
    invalidateSubFramebuffer(target: GLenum, attachments: GLenum[], x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    isQuery(query: WebGLQuery | null): GLboolean;
    isSampler(sampler: WebGLSampler | null): GLboolean;
    isSync(sync: WebGLSync | null): GLboolean;
    isTransformFeedback(tf: WebGLTransformFeedback | null): GLboolean;
    isVertexArray(vertexArray: WebGLVertexArrayObject | null): GLboolean;
    pauseTransformFeedback(): void;
    readBuffer(src: GLenum): void;
    renderbufferStorageMultisample(target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
    resumeTransformFeedback(): void;
    samplerParameterf(sampler: WebGLSampler, pname: GLenum, param: GLfloat): void;
    samplerParameteri(sampler: WebGLSampler, pname: GLenum, param: GLint): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView | null): void;
    texImage3D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
    texStorage2D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
    texStorage3D(target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei): void;
    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage3D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView | null, srcOffset?: GLuint): void;
    transformFeedbackVaryings(program: WebGLProgram, varyings: string[], bufferMode: GLenum): void;
    uniform1ui(location: WebGLUniformLocation | null, v0: GLuint): void;
    uniform1uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform2ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint): void;
    uniform2uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform3ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint): void;
    uniform3uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform4ui(location: WebGLUniformLocation | null, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint): void;
    uniform4uiv(location: WebGLUniformLocation | null, data: Uint32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformBlockBinding(program: WebGLProgram, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint): void;
    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    vertexAttribDivisor(index: GLuint, divisor: GLuint): void;
    vertexAttribI4i(index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint): void;
    vertexAttribI4iv(index: GLuint, values: Int32List): void;
    vertexAttribI4ui(index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint): void;
    vertexAttribI4uiv(index: GLuint, values: Uint32List): void;
    vertexAttribIPointer(index: GLuint, size: GLint, type: GLenum, stride: GLsizei, offset: GLintptr): void;
    waitSync(sync: WebGLSync, flags: GLbitfield, timeout: GLint64): void;
    readonly ACTIVE_UNIFORM_BLOCKS: GLenum;
    readonly ALREADY_SIGNALED: GLenum;
    readonly ANY_SAMPLES_PASSED: GLenum;
    readonly ANY_SAMPLES_PASSED_CONSERVATIVE: GLenum;
    readonly COLOR: GLenum;
    readonly COLOR_ATTACHMENT1: GLenum;
    readonly COLOR_ATTACHMENT10: GLenum;
    readonly COLOR_ATTACHMENT11: GLenum;
    readonly COLOR_ATTACHMENT12: GLenum;
    readonly COLOR_ATTACHMENT13: GLenum;
    readonly COLOR_ATTACHMENT14: GLenum;
    readonly COLOR_ATTACHMENT15: GLenum;
    readonly COLOR_ATTACHMENT2: GLenum;
    readonly COLOR_ATTACHMENT3: GLenum;
    readonly COLOR_ATTACHMENT4: GLenum;
    readonly COLOR_ATTACHMENT5: GLenum;
    readonly COLOR_ATTACHMENT6: GLenum;
    readonly COLOR_ATTACHMENT7: GLenum;
    readonly COLOR_ATTACHMENT8: GLenum;
    readonly COLOR_ATTACHMENT9: GLenum;
    readonly COMPARE_REF_TO_TEXTURE: GLenum;
    readonly CONDITION_SATISFIED: GLenum;
    readonly COPY_READ_BUFFER: GLenum;
    readonly COPY_READ_BUFFER_BINDING: GLenum;
    readonly COPY_WRITE_BUFFER: GLenum;
    readonly COPY_WRITE_BUFFER_BINDING: GLenum;
    readonly CURRENT_QUERY: GLenum;
    readonly DEPTH: GLenum;
    readonly DEPTH24_STENCIL8: GLenum;
    readonly DEPTH32F_STENCIL8: GLenum;
    readonly DEPTH_COMPONENT24: GLenum;
    readonly DEPTH_COMPONENT32F: GLenum;
    readonly DRAW_BUFFER0: GLenum;
    readonly DRAW_BUFFER1: GLenum;
    readonly DRAW_BUFFER10: GLenum;
    readonly DRAW_BUFFER11: GLenum;
    readonly DRAW_BUFFER12: GLenum;
    readonly DRAW_BUFFER13: GLenum;
    readonly DRAW_BUFFER14: GLenum;
    readonly DRAW_BUFFER15: GLenum;
    readonly DRAW_BUFFER2: GLenum;
    readonly DRAW_BUFFER3: GLenum;
    readonly DRAW_BUFFER4: GLenum;
    readonly DRAW_BUFFER5: GLenum;
    readonly DRAW_BUFFER6: GLenum;
    readonly DRAW_BUFFER7: GLenum;
    readonly DRAW_BUFFER8: GLenum;
    readonly DRAW_BUFFER9: GLenum;
    readonly DRAW_FRAMEBUFFER: GLenum;
    readonly DRAW_FRAMEBUFFER_BINDING: GLenum;
    readonly DYNAMIC_COPY: GLenum;
    readonly DYNAMIC_READ: GLenum;
    readonly FLOAT_32_UNSIGNED_INT_24_8_REV: GLenum;
    readonly FLOAT_MAT2x3: GLenum;
    readonly FLOAT_MAT2x4: GLenum;
    readonly FLOAT_MAT3x2: GLenum;
    readonly FLOAT_MAT3x4: GLenum;
    readonly FLOAT_MAT4x2: GLenum;
    readonly FLOAT_MAT4x3: GLenum;
    readonly FRAGMENT_SHADER_DERIVATIVE_HINT: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_RED_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: GLenum;
    readonly FRAMEBUFFER_DEFAULT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: GLenum;
    readonly HALF_FLOAT: GLenum;
    readonly INTERLEAVED_ATTRIBS: GLenum;
    readonly INT_2_10_10_10_REV: GLenum;
    readonly INT_SAMPLER_2D: GLenum;
    readonly INT_SAMPLER_2D_ARRAY: GLenum;
    readonly INT_SAMPLER_3D: GLenum;
    readonly INT_SAMPLER_CUBE: GLenum;
    readonly INVALID_INDEX: GLenum;
    readonly MAX: GLenum;
    readonly MAX_3D_TEXTURE_SIZE: GLenum;
    readonly MAX_ARRAY_TEXTURE_LAYERS: GLenum;
    readonly MAX_CLIENT_WAIT_TIMEOUT_WEBGL: GLenum;
    readonly MAX_COLOR_ATTACHMENTS: GLenum;
    readonly MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_COMBINED_UNIFORM_BLOCKS: GLenum;
    readonly MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_DRAW_BUFFERS: GLenum;
    readonly MAX_ELEMENTS_INDICES: GLenum;
    readonly MAX_ELEMENTS_VERTICES: GLenum;
    readonly MAX_ELEMENT_INDEX: GLenum;
    readonly MAX_FRAGMENT_INPUT_COMPONENTS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_BLOCKS: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_COMPONENTS: GLenum;
    readonly MAX_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly MAX_SAMPLES: GLenum;
    readonly MAX_SERVER_WAIT_TIMEOUT: GLenum;
    readonly MAX_TEXTURE_LOD_BIAS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: GLenum;
    readonly MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: GLenum;
    readonly MAX_UNIFORM_BLOCK_SIZE: GLenum;
    readonly MAX_UNIFORM_BUFFER_BINDINGS: GLenum;
    readonly MAX_VARYING_COMPONENTS: GLenum;
    readonly MAX_VERTEX_OUTPUT_COMPONENTS: GLenum;
    readonly MAX_VERTEX_UNIFORM_BLOCKS: GLenum;
    readonly MAX_VERTEX_UNIFORM_COMPONENTS: GLenum;
    readonly MIN: GLenum;
    readonly MIN_PROGRAM_TEXEL_OFFSET: GLenum;
    readonly OBJECT_TYPE: GLenum;
    readonly PACK_ROW_LENGTH: GLenum;
    readonly PACK_SKIP_PIXELS: GLenum;
    readonly PACK_SKIP_ROWS: GLenum;
    readonly PIXEL_PACK_BUFFER: GLenum;
    readonly PIXEL_PACK_BUFFER_BINDING: GLenum;
    readonly PIXEL_UNPACK_BUFFER: GLenum;
    readonly PIXEL_UNPACK_BUFFER_BINDING: GLenum;
    readonly QUERY_RESULT: GLenum;
    readonly QUERY_RESULT_AVAILABLE: GLenum;
    readonly R11F_G11F_B10F: GLenum;
    readonly R16F: GLenum;
    readonly R16I: GLenum;
    readonly R16UI: GLenum;
    readonly R32F: GLenum;
    readonly R32I: GLenum;
    readonly R32UI: GLenum;
    readonly R8: GLenum;
    readonly R8I: GLenum;
    readonly R8UI: GLenum;
    readonly R8_SNORM: GLenum;
    readonly RASTERIZER_DISCARD: GLenum;
    readonly READ_BUFFER: GLenum;
    readonly READ_FRAMEBUFFER: GLenum;
    readonly READ_FRAMEBUFFER_BINDING: GLenum;
    readonly RED: GLenum;
    readonly RED_INTEGER: GLenum;
    readonly RENDERBUFFER_SAMPLES: GLenum;
    readonly RG: GLenum;
    readonly RG16F: GLenum;
    readonly RG16I: GLenum;
    readonly RG16UI: GLenum;
    readonly RG32F: GLenum;
    readonly RG32I: GLenum;
    readonly RG32UI: GLenum;
    readonly RG8: GLenum;
    readonly RG8I: GLenum;
    readonly RG8UI: GLenum;
    readonly RG8_SNORM: GLenum;
    readonly RGB10_A2: GLenum;
    readonly RGB10_A2UI: GLenum;
    readonly RGB16F: GLenum;
    readonly RGB16I: GLenum;
    readonly RGB16UI: GLenum;
    readonly RGB32F: GLenum;
    readonly RGB32I: GLenum;
    readonly RGB32UI: GLenum;
    readonly RGB8: GLenum;
    readonly RGB8I: GLenum;
    readonly RGB8UI: GLenum;
    readonly RGB8_SNORM: GLenum;
    readonly RGB9_E5: GLenum;
    readonly RGBA16F: GLenum;
    readonly RGBA16I: GLenum;
    readonly RGBA16UI: GLenum;
    readonly RGBA32F: GLenum;
    readonly RGBA32I: GLenum;
    readonly RGBA32UI: GLenum;
    readonly RGBA8: GLenum;
    readonly RGBA8I: GLenum;
    readonly RGBA8UI: GLenum;
    readonly RGBA8_SNORM: GLenum;
    readonly RGBA_INTEGER: GLenum;
    readonly RGB_INTEGER: GLenum;
    readonly RG_INTEGER: GLenum;
    readonly SAMPLER_2D_ARRAY: GLenum;
    readonly SAMPLER_2D_ARRAY_SHADOW: GLenum;
    readonly SAMPLER_2D_SHADOW: GLenum;
    readonly SAMPLER_3D: GLenum;
    readonly SAMPLER_BINDING: GLenum;
    readonly SAMPLER_CUBE_SHADOW: GLenum;
    readonly SEPARATE_ATTRIBS: GLenum;
    readonly SIGNALED: GLenum;
    readonly SIGNED_NORMALIZED: GLenum;
    readonly SRGB: GLenum;
    readonly SRGB8: GLenum;
    readonly SRGB8_ALPHA8: GLenum;
    readonly STATIC_COPY: GLenum;
    readonly STATIC_READ: GLenum;
    readonly STENCIL: GLenum;
    readonly STREAM_COPY: GLenum;
    readonly STREAM_READ: GLenum;
    readonly SYNC_CONDITION: GLenum;
    readonly SYNC_FENCE: GLenum;
    readonly SYNC_FLAGS: GLenum;
    readonly SYNC_FLUSH_COMMANDS_BIT: GLenum;
    readonly SYNC_GPU_COMMANDS_COMPLETE: GLenum;
    readonly SYNC_STATUS: GLenum;
    readonly TEXTURE_2D_ARRAY: GLenum;
    readonly TEXTURE_3D: GLenum;
    readonly TEXTURE_BASE_LEVEL: GLenum;
    readonly TEXTURE_BINDING_2D_ARRAY: GLenum;
    readonly TEXTURE_BINDING_3D: GLenum;
    readonly TEXTURE_COMPARE_FUNC: GLenum;
    readonly TEXTURE_COMPARE_MODE: GLenum;
    readonly TEXTURE_IMMUTABLE_FORMAT: GLenum;
    readonly TEXTURE_IMMUTABLE_LEVELS: GLenum;
    readonly TEXTURE_MAX_LEVEL: GLenum;
    readonly TEXTURE_MAX_LOD: GLenum;
    readonly TEXTURE_MIN_LOD: GLenum;
    readonly TEXTURE_WRAP_R: GLenum;
    readonly TIMEOUT_EXPIRED: GLenum;
    readonly TIMEOUT_IGNORED: GLint64;
    readonly TRANSFORM_FEEDBACK: GLenum;
    readonly TRANSFORM_FEEDBACK_ACTIVE: GLenum;
    readonly TRANSFORM_FEEDBACK_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_BINDING: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_MODE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_SIZE: GLenum;
    readonly TRANSFORM_FEEDBACK_BUFFER_START: GLenum;
    readonly TRANSFORM_FEEDBACK_PAUSED: GLenum;
    readonly TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: GLenum;
    readonly TRANSFORM_FEEDBACK_VARYINGS: GLenum;
    readonly UNIFORM_ARRAY_STRIDE: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORMS: GLenum;
    readonly UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: GLenum;
    readonly UNIFORM_BLOCK_BINDING: GLenum;
    readonly UNIFORM_BLOCK_DATA_SIZE: GLenum;
    readonly UNIFORM_BLOCK_INDEX: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: GLenum;
    readonly UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: GLenum;
    readonly UNIFORM_BUFFER: GLenum;
    readonly UNIFORM_BUFFER_BINDING: GLenum;
    readonly UNIFORM_BUFFER_OFFSET_ALIGNMENT: GLenum;
    readonly UNIFORM_BUFFER_SIZE: GLenum;
    readonly UNIFORM_BUFFER_START: GLenum;
    readonly UNIFORM_IS_ROW_MAJOR: GLenum;
    readonly UNIFORM_MATRIX_STRIDE: GLenum;
    readonly UNIFORM_OFFSET: GLenum;
    readonly UNIFORM_SIZE: GLenum;
    readonly UNIFORM_TYPE: GLenum;
    readonly UNPACK_IMAGE_HEIGHT: GLenum;
    readonly UNPACK_ROW_LENGTH: GLenum;
    readonly UNPACK_SKIP_IMAGES: GLenum;
    readonly UNPACK_SKIP_PIXELS: GLenum;
    readonly UNPACK_SKIP_ROWS: GLenum;
    readonly UNSIGNALED: GLenum;
    readonly UNSIGNED_INT_10F_11F_11F_REV: GLenum;
    readonly UNSIGNED_INT_24_8: GLenum;
    readonly UNSIGNED_INT_2_10_10_10_REV: GLenum;
    readonly UNSIGNED_INT_5_9_9_9_REV: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_2D_ARRAY: GLenum;
    readonly UNSIGNED_INT_SAMPLER_3D: GLenum;
    readonly UNSIGNED_INT_SAMPLER_CUBE: GLenum;
    readonly UNSIGNED_INT_VEC2: GLenum;
    readonly UNSIGNED_INT_VEC3: GLenum;
    readonly UNSIGNED_INT_VEC4: GLenum;
    readonly UNSIGNED_NORMALIZED: GLenum;
    readonly VERTEX_ARRAY_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_DIVISOR: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_INTEGER: GLenum;
    readonly WAIT_FAILED: GLenum;
}

interface WebGL2RenderingContextOverloads {
    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
    bufferData(target: GLenum, srcData: BufferSource | null, usage: GLenum): void;
    bufferData(target: GLenum, srcData: ArrayBufferView, usage: GLenum, srcOffset: GLuint, length?: GLuint): void;
    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: BufferSource): void;
    bufferSubData(target: GLenum, dstByteOffset: GLintptr, srcData: ArrayBufferView, srcOffset: GLuint, length?: GLuint): void;
    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, offset: GLintptr): void;
    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, srcData: ArrayBufferView, srcOffset?: GLuint, srcLengthOverride?: GLuint): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView | null): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, offset: GLintptr): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, dstData: ArrayBufferView, dstOffset: GLuint): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pboOffset: GLintptr): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, srcData: ArrayBufferView, srcOffset: GLuint): void;
    uniform1fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform1iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform2fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform2iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform3fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform3iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform4fv(location: WebGLUniformLocation | null, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniform4iv(location: WebGLUniformLocation | null, data: Int32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Float32List, srcOffset?: GLuint, srcLength?: GLuint): void;
}

/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getActiveAttrib() and WebGLRenderingContext.getActiveUniform() methods. */
interface WebGLActiveInfo {
    readonly name: string;
    readonly size: GLint;
    readonly type: GLenum;
}

declare var WebGLActiveInfo: {
    prototype: WebGLActiveInfo;
    new(): WebGLActiveInfo;
};

/** Part of the WebGL API and represents an opaque buffer object storing data such as vertices or colors. */
interface WebGLBuffer {
}

declare var WebGLBuffer: {
    prototype: WebGLBuffer;
    new(): WebGLBuffer;
};

/** The WebContextEvent interface is part of the WebGL API and is an interface for an event that is generated in response to a status change to the WebGL rendering context. */
interface WebGLContextEvent extends Event {
    readonly statusMessage: string;
}

declare var WebGLContextEvent: {
    prototype: WebGLContextEvent;
    new(type: string, eventInit?: WebGLContextEventInit): WebGLContextEvent;
};

/** Part of the WebGL API and represents a collection of buffers that serve as a rendering destination. */
interface WebGLFramebuffer {
}

declare var WebGLFramebuffer: {
    prototype: WebGLFramebuffer;
    new(): WebGLFramebuffer;
};

/** The WebGLProgram is part of the WebGL API and is a combination of two compiled WebGLShaders consisting of a vertex shader and a fragment shader (both written in GLSL). */
interface WebGLProgram {
}

declare var WebGLProgram: {
    prototype: WebGLProgram;
    new(): WebGLProgram;
};

interface WebGLQuery {
}

declare var WebGLQuery: {
    prototype: WebGLQuery;
    new(): WebGLQuery;
};

/** Part of the WebGL API and represents a buffer that can contain an image, or can be source or target of an rendering operation. */
interface WebGLRenderbuffer {
}

declare var WebGLRenderbuffer: {
    prototype: WebGLRenderbuffer;
    new(): WebGLRenderbuffer;
};

/** Provides an interface to the OpenGL ES 2.0 graphics rendering context for the drawing surface of an HTML <canvas> element. */
interface WebGLRenderingContext extends WebGLRenderingContextBase, WebGLRenderingContextOverloads {
}

declare var WebGLRenderingContext: {
    prototype: WebGLRenderingContext;
    new(): WebGLRenderingContext;
    readonly ACTIVE_ATTRIBUTES: GLenum;
    readonly ACTIVE_TEXTURE: GLenum;
    readonly ACTIVE_UNIFORMS: GLenum;
    readonly ALIASED_LINE_WIDTH_RANGE: GLenum;
    readonly ALIASED_POINT_SIZE_RANGE: GLenum;
    readonly ALPHA: GLenum;
    readonly ALPHA_BITS: GLenum;
    readonly ALWAYS: GLenum;
    readonly ARRAY_BUFFER: GLenum;
    readonly ARRAY_BUFFER_BINDING: GLenum;
    readonly ATTACHED_SHADERS: GLenum;
    readonly BACK: GLenum;
    readonly BLEND: GLenum;
    readonly BLEND_COLOR: GLenum;
    readonly BLEND_DST_ALPHA: GLenum;
    readonly BLEND_DST_RGB: GLenum;
    readonly BLEND_EQUATION: GLenum;
    readonly BLEND_EQUATION_ALPHA: GLenum;
    readonly BLEND_EQUATION_RGB: GLenum;
    readonly BLEND_SRC_ALPHA: GLenum;
    readonly BLEND_SRC_RGB: GLenum;
    readonly BLUE_BITS: GLenum;
    readonly BOOL: GLenum;
    readonly BOOL_VEC2: GLenum;
    readonly BOOL_VEC3: GLenum;
    readonly BOOL_VEC4: GLenum;
    readonly BROWSER_DEFAULT_WEBGL: GLenum;
    readonly BUFFER_SIZE: GLenum;
    readonly BUFFER_USAGE: GLenum;
    readonly BYTE: GLenum;
    readonly CCW: GLenum;
    readonly CLAMP_TO_EDGE: GLenum;
    readonly COLOR_ATTACHMENT0: GLenum;
    readonly COLOR_BUFFER_BIT: GLenum;
    readonly COLOR_CLEAR_VALUE: GLenum;
    readonly COLOR_WRITEMASK: GLenum;
    readonly COMPILE_STATUS: GLenum;
    readonly COMPRESSED_TEXTURE_FORMATS: GLenum;
    readonly CONSTANT_ALPHA: GLenum;
    readonly CONSTANT_COLOR: GLenum;
    readonly CONTEXT_LOST_WEBGL: GLenum;
    readonly CULL_FACE: GLenum;
    readonly CULL_FACE_MODE: GLenum;
    readonly CURRENT_PROGRAM: GLenum;
    readonly CURRENT_VERTEX_ATTRIB: GLenum;
    readonly CW: GLenum;
    readonly DECR: GLenum;
    readonly DECR_WRAP: GLenum;
    readonly DELETE_STATUS: GLenum;
    readonly DEPTH_ATTACHMENT: GLenum;
    readonly DEPTH_BITS: GLenum;
    readonly DEPTH_BUFFER_BIT: GLenum;
    readonly DEPTH_CLEAR_VALUE: GLenum;
    readonly DEPTH_COMPONENT: GLenum;
    readonly DEPTH_COMPONENT16: GLenum;
    readonly DEPTH_FUNC: GLenum;
    readonly DEPTH_RANGE: GLenum;
    readonly DEPTH_STENCIL: GLenum;
    readonly DEPTH_STENCIL_ATTACHMENT: GLenum;
    readonly DEPTH_TEST: GLenum;
    readonly DEPTH_WRITEMASK: GLenum;
    readonly DITHER: GLenum;
    readonly DONT_CARE: GLenum;
    readonly DST_ALPHA: GLenum;
    readonly DST_COLOR: GLenum;
    readonly DYNAMIC_DRAW: GLenum;
    readonly ELEMENT_ARRAY_BUFFER: GLenum;
    readonly ELEMENT_ARRAY_BUFFER_BINDING: GLenum;
    readonly EQUAL: GLenum;
    readonly FASTEST: GLenum;
    readonly FLOAT: GLenum;
    readonly FLOAT_MAT2: GLenum;
    readonly FLOAT_MAT3: GLenum;
    readonly FLOAT_MAT4: GLenum;
    readonly FLOAT_VEC2: GLenum;
    readonly FLOAT_VEC3: GLenum;
    readonly FLOAT_VEC4: GLenum;
    readonly FRAGMENT_SHADER: GLenum;
    readonly FRAMEBUFFER: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum;
    readonly FRAMEBUFFER_BINDING: GLenum;
    readonly FRAMEBUFFER_COMPLETE: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_UNSUPPORTED: GLenum;
    readonly FRONT: GLenum;
    readonly FRONT_AND_BACK: GLenum;
    readonly FRONT_FACE: GLenum;
    readonly FUNC_ADD: GLenum;
    readonly FUNC_REVERSE_SUBTRACT: GLenum;
    readonly FUNC_SUBTRACT: GLenum;
    readonly GENERATE_MIPMAP_HINT: GLenum;
    readonly GEQUAL: GLenum;
    readonly GREATER: GLenum;
    readonly GREEN_BITS: GLenum;
    readonly HIGH_FLOAT: GLenum;
    readonly HIGH_INT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_FORMAT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_TYPE: GLenum;
    readonly INCR: GLenum;
    readonly INCR_WRAP: GLenum;
    readonly INT: GLenum;
    readonly INT_VEC2: GLenum;
    readonly INT_VEC3: GLenum;
    readonly INT_VEC4: GLenum;
    readonly INVALID_ENUM: GLenum;
    readonly INVALID_FRAMEBUFFER_OPERATION: GLenum;
    readonly INVALID_OPERATION: GLenum;
    readonly INVALID_VALUE: GLenum;
    readonly INVERT: GLenum;
    readonly KEEP: GLenum;
    readonly LEQUAL: GLenum;
    readonly LESS: GLenum;
    readonly LINEAR: GLenum;
    readonly LINEAR_MIPMAP_LINEAR: GLenum;
    readonly LINEAR_MIPMAP_NEAREST: GLenum;
    readonly LINES: GLenum;
    readonly LINE_LOOP: GLenum;
    readonly LINE_STRIP: GLenum;
    readonly LINE_WIDTH: GLenum;
    readonly LINK_STATUS: GLenum;
    readonly LOW_FLOAT: GLenum;
    readonly LOW_INT: GLenum;
    readonly LUMINANCE: GLenum;
    readonly LUMINANCE_ALPHA: GLenum;
    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_CUBE_MAP_TEXTURE_SIZE: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_VECTORS: GLenum;
    readonly MAX_RENDERBUFFER_SIZE: GLenum;
    readonly MAX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_TEXTURE_SIZE: GLenum;
    readonly MAX_VARYING_VECTORS: GLenum;
    readonly MAX_VERTEX_ATTRIBS: GLenum;
    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_VERTEX_UNIFORM_VECTORS: GLenum;
    readonly MAX_VIEWPORT_DIMS: GLenum;
    readonly MEDIUM_FLOAT: GLenum;
    readonly MEDIUM_INT: GLenum;
    readonly MIRRORED_REPEAT: GLenum;
    readonly NEAREST: GLenum;
    readonly NEAREST_MIPMAP_LINEAR: GLenum;
    readonly NEAREST_MIPMAP_NEAREST: GLenum;
    readonly NEVER: GLenum;
    readonly NICEST: GLenum;
    readonly NONE: GLenum;
    readonly NOTEQUAL: GLenum;
    readonly NO_ERROR: GLenum;
    readonly ONE: GLenum;
    readonly ONE_MINUS_CONSTANT_ALPHA: GLenum;
    readonly ONE_MINUS_CONSTANT_COLOR: GLenum;
    readonly ONE_MINUS_DST_ALPHA: GLenum;
    readonly ONE_MINUS_DST_COLOR: GLenum;
    readonly ONE_MINUS_SRC_ALPHA: GLenum;
    readonly ONE_MINUS_SRC_COLOR: GLenum;
    readonly OUT_OF_MEMORY: GLenum;
    readonly PACK_ALIGNMENT: GLenum;
    readonly POINTS: GLenum;
    readonly POLYGON_OFFSET_FACTOR: GLenum;
    readonly POLYGON_OFFSET_FILL: GLenum;
    readonly POLYGON_OFFSET_UNITS: GLenum;
    readonly RED_BITS: GLenum;
    readonly RENDERBUFFER: GLenum;
    readonly RENDERBUFFER_ALPHA_SIZE: GLenum;
    readonly RENDERBUFFER_BINDING: GLenum;
    readonly RENDERBUFFER_BLUE_SIZE: GLenum;
    readonly RENDERBUFFER_DEPTH_SIZE: GLenum;
    readonly RENDERBUFFER_GREEN_SIZE: GLenum;
    readonly RENDERBUFFER_HEIGHT: GLenum;
    readonly RENDERBUFFER_INTERNAL_FORMAT: GLenum;
    readonly RENDERBUFFER_RED_SIZE: GLenum;
    readonly RENDERBUFFER_STENCIL_SIZE: GLenum;
    readonly RENDERBUFFER_WIDTH: GLenum;
    readonly RENDERER: GLenum;
    readonly REPEAT: GLenum;
    readonly REPLACE: GLenum;
    readonly RGB: GLenum;
    readonly RGB565: GLenum;
    readonly RGB5_A1: GLenum;
    readonly RGBA: GLenum;
    readonly RGBA4: GLenum;
    readonly SAMPLER_2D: GLenum;
    readonly SAMPLER_CUBE: GLenum;
    readonly SAMPLES: GLenum;
    readonly SAMPLE_ALPHA_TO_COVERAGE: GLenum;
    readonly SAMPLE_BUFFERS: GLenum;
    readonly SAMPLE_COVERAGE: GLenum;
    readonly SAMPLE_COVERAGE_INVERT: GLenum;
    readonly SAMPLE_COVERAGE_VALUE: GLenum;
    readonly SCISSOR_BOX: GLenum;
    readonly SCISSOR_TEST: GLenum;
    readonly SHADER_TYPE: GLenum;
    readonly SHADING_LANGUAGE_VERSION: GLenum;
    readonly SHORT: GLenum;
    readonly SRC_ALPHA: GLenum;
    readonly SRC_ALPHA_SATURATE: GLenum;
    readonly SRC_COLOR: GLenum;
    readonly STATIC_DRAW: GLenum;
    readonly STENCIL_ATTACHMENT: GLenum;
    readonly STENCIL_BACK_FAIL: GLenum;
    readonly STENCIL_BACK_FUNC: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_BACK_REF: GLenum;
    readonly STENCIL_BACK_VALUE_MASK: GLenum;
    readonly STENCIL_BACK_WRITEMASK: GLenum;
    readonly STENCIL_BITS: GLenum;
    readonly STENCIL_BUFFER_BIT: GLenum;
    readonly STENCIL_CLEAR_VALUE: GLenum;
    readonly STENCIL_FAIL: GLenum;
    readonly STENCIL_FUNC: GLenum;
    readonly STENCIL_INDEX8: GLenum;
    readonly STENCIL_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_REF: GLenum;
    readonly STENCIL_TEST: GLenum;
    readonly STENCIL_VALUE_MASK: GLenum;
    readonly STENCIL_WRITEMASK: GLenum;
    readonly STREAM_DRAW: GLenum;
    readonly SUBPIXEL_BITS: GLenum;
    readonly TEXTURE: GLenum;
    readonly TEXTURE0: GLenum;
    readonly TEXTURE1: GLenum;
    readonly TEXTURE10: GLenum;
    readonly TEXTURE11: GLenum;
    readonly TEXTURE12: GLenum;
    readonly TEXTURE13: GLenum;
    readonly TEXTURE14: GLenum;
    readonly TEXTURE15: GLenum;
    readonly TEXTURE16: GLenum;
    readonly TEXTURE17: GLenum;
    readonly TEXTURE18: GLenum;
    readonly TEXTURE19: GLenum;
    readonly TEXTURE2: GLenum;
    readonly TEXTURE20: GLenum;
    readonly TEXTURE21: GLenum;
    readonly TEXTURE22: GLenum;
    readonly TEXTURE23: GLenum;
    readonly TEXTURE24: GLenum;
    readonly TEXTURE25: GLenum;
    readonly TEXTURE26: GLenum;
    readonly TEXTURE27: GLenum;
    readonly TEXTURE28: GLenum;
    readonly TEXTURE29: GLenum;
    readonly TEXTURE3: GLenum;
    readonly TEXTURE30: GLenum;
    readonly TEXTURE31: GLenum;
    readonly TEXTURE4: GLenum;
    readonly TEXTURE5: GLenum;
    readonly TEXTURE6: GLenum;
    readonly TEXTURE7: GLenum;
    readonly TEXTURE8: GLenum;
    readonly TEXTURE9: GLenum;
    readonly TEXTURE_2D: GLenum;
    readonly TEXTURE_BINDING_2D: GLenum;
    readonly TEXTURE_BINDING_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum;
    readonly TEXTURE_MAG_FILTER: GLenum;
    readonly TEXTURE_MIN_FILTER: GLenum;
    readonly TEXTURE_WRAP_S: GLenum;
    readonly TEXTURE_WRAP_T: GLenum;
    readonly TRIANGLES: GLenum;
    readonly TRIANGLE_FAN: GLenum;
    readonly TRIANGLE_STRIP: GLenum;
    readonly UNPACK_ALIGNMENT: GLenum;
    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: GLenum;
    readonly UNPACK_FLIP_Y_WEBGL: GLenum;
    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: GLenum;
    readonly UNSIGNED_BYTE: GLenum;
    readonly UNSIGNED_INT: GLenum;
    readonly UNSIGNED_SHORT: GLenum;
    readonly UNSIGNED_SHORT_4_4_4_4: GLenum;
    readonly UNSIGNED_SHORT_5_5_5_1: GLenum;
    readonly UNSIGNED_SHORT_5_6_5: GLenum;
    readonly VALIDATE_STATUS: GLenum;
    readonly VENDOR: GLenum;
    readonly VERSION: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_ENABLED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_POINTER: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_SIZE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_STRIDE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_TYPE: GLenum;
    readonly VERTEX_SHADER: GLenum;
    readonly VIEWPORT: GLenum;
    readonly ZERO: GLenum;
};

interface WebGLRenderingContextBase {
    readonly drawingBufferHeight: GLsizei;
    readonly drawingBufferWidth: GLsizei;
    activeTexture(texture: GLenum): void;
    attachShader(program: WebGLProgram, shader: WebGLShader): void;
    bindAttribLocation(program: WebGLProgram, index: GLuint, name: string): void;
    bindBuffer(target: GLenum, buffer: WebGLBuffer | null): void;
    bindFramebuffer(target: GLenum, framebuffer: WebGLFramebuffer | null): void;
    bindRenderbuffer(target: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
    bindTexture(target: GLenum, texture: WebGLTexture | null): void;
    blendColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
    blendEquation(mode: GLenum): void;
    blendEquationSeparate(modeRGB: GLenum, modeAlpha: GLenum): void;
    blendFunc(sfactor: GLenum, dfactor: GLenum): void;
    blendFuncSeparate(srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum): void;
    checkFramebufferStatus(target: GLenum): GLenum;
    clear(mask: GLbitfield): void;
    clearColor(red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf): void;
    clearDepth(depth: GLclampf): void;
    clearStencil(s: GLint): void;
    colorMask(red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean): void;
    compileShader(shader: WebGLShader): void;
    copyTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint): void;
    copyTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    createBuffer(): WebGLBuffer | null;
    createFramebuffer(): WebGLFramebuffer | null;
    createProgram(): WebGLProgram | null;
    createRenderbuffer(): WebGLRenderbuffer | null;
    createShader(type: GLenum): WebGLShader | null;
    createTexture(): WebGLTexture | null;
    cullFace(mode: GLenum): void;
    deleteBuffer(buffer: WebGLBuffer | null): void;
    deleteFramebuffer(framebuffer: WebGLFramebuffer | null): void;
    deleteProgram(program: WebGLProgram | null): void;
    deleteRenderbuffer(renderbuffer: WebGLRenderbuffer | null): void;
    deleteShader(shader: WebGLShader | null): void;
    deleteTexture(texture: WebGLTexture | null): void;
    depthFunc(func: GLenum): void;
    depthMask(flag: GLboolean): void;
    depthRange(zNear: GLclampf, zFar: GLclampf): void;
    detachShader(program: WebGLProgram, shader: WebGLShader): void;
    disable(cap: GLenum): void;
    disableVertexAttribArray(index: GLuint): void;
    drawArrays(mode: GLenum, first: GLint, count: GLsizei): void;
    drawElements(mode: GLenum, count: GLsizei, type: GLenum, offset: GLintptr): void;
    enable(cap: GLenum): void;
    enableVertexAttribArray(index: GLuint): void;
    finish(): void;
    flush(): void;
    framebufferRenderbuffer(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: WebGLRenderbuffer | null): void;
    framebufferTexture2D(target: GLenum, attachment: GLenum, textarget: GLenum, texture: WebGLTexture | null, level: GLint): void;
    frontFace(mode: GLenum): void;
    generateMipmap(target: GLenum): void;
    getActiveAttrib(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
    getActiveUniform(program: WebGLProgram, index: GLuint): WebGLActiveInfo | null;
    getAttachedShaders(program: WebGLProgram): WebGLShader[] | null;
    getAttribLocation(program: WebGLProgram, name: string): GLint;
    getBufferParameter(target: GLenum, pname: GLenum): any;
    getContextAttributes(): WebGLContextAttributes | null;
    getError(): GLenum;
    getExtension(extensionName: "EXT_blend_minmax"): EXT_blend_minmax | null;
    getExtension(extensionName: "EXT_color_buffer_float"): EXT_color_buffer_float | null;
    getExtension(extensionName: "EXT_color_buffer_half_float"): EXT_color_buffer_half_float | null;
    getExtension(extensionName: "EXT_float_blend"): EXT_float_blend | null;
    getExtension(extensionName: "EXT_texture_filter_anisotropic"): EXT_texture_filter_anisotropic | null;
    getExtension(extensionName: "EXT_frag_depth"): EXT_frag_depth | null;
    getExtension(extensionName: "EXT_shader_texture_lod"): EXT_shader_texture_lod | null;
    getExtension(extensionName: "EXT_sRGB"): EXT_sRGB | null;
    getExtension(extensionName: "KHR_parallel_shader_compile"): KHR_parallel_shader_compile | null;
    getExtension(extensionName: "OES_vertex_array_object"): OES_vertex_array_object | null;
    getExtension(extensionName: "OVR_multiview2"): OVR_multiview2 | null;
    getExtension(extensionName: "WEBGL_color_buffer_float"): WEBGL_color_buffer_float | null;
    getExtension(extensionName: "WEBGL_compressed_texture_astc"): WEBGL_compressed_texture_astc | null;
    getExtension(extensionName: "WEBGL_compressed_texture_etc"): WEBGL_compressed_texture_etc | null;
    getExtension(extensionName: "WEBGL_compressed_texture_etc1"): WEBGL_compressed_texture_etc1 | null;
    getExtension(extensionName: "WEBGL_compressed_texture_pvrtc"): WEBGL_compressed_texture_pvrtc | null;
    getExtension(extensionName: "WEBGL_compressed_texture_s3tc_srgb"): WEBGL_compressed_texture_s3tc_srgb | null;
    getExtension(extensionName: "WEBGL_debug_shaders"): WEBGL_debug_shaders | null;
    getExtension(extensionName: "WEBGL_draw_buffers"): WEBGL_draw_buffers | null;
    getExtension(extensionName: "WEBGL_lose_context"): WEBGL_lose_context | null;
    getExtension(extensionName: "WEBGL_depth_texture"): WEBGL_depth_texture | null;
    getExtension(extensionName: "WEBGL_debug_renderer_info"): WEBGL_debug_renderer_info | null;
    getExtension(extensionName: "WEBGL_compressed_texture_s3tc"): WEBGL_compressed_texture_s3tc | null;
    getExtension(extensionName: "OES_texture_half_float_linear"): OES_texture_half_float_linear | null;
    getExtension(extensionName: "OES_texture_half_float"): OES_texture_half_float | null;
    getExtension(extensionName: "OES_texture_float_linear"): OES_texture_float_linear | null;
    getExtension(extensionName: "OES_texture_float"): OES_texture_float | null;
    getExtension(extensionName: "OES_standard_derivatives"): OES_standard_derivatives | null;
    getExtension(extensionName: "OES_element_index_uint"): OES_element_index_uint | null;
    getExtension(extensionName: "ANGLE_instanced_arrays"): ANGLE_instanced_arrays | null;
    getExtension(name: string): any;
    getFramebufferAttachmentParameter(target: GLenum, attachment: GLenum, pname: GLenum): any;
    getParameter(pname: GLenum): any;
    getProgramInfoLog(program: WebGLProgram): string | null;
    getProgramParameter(program: WebGLProgram, pname: GLenum): any;
    getRenderbufferParameter(target: GLenum, pname: GLenum): any;
    getShaderInfoLog(shader: WebGLShader): string | null;
    getShaderParameter(shader: WebGLShader, pname: GLenum): any;
    getShaderPrecisionFormat(shadertype: GLenum, precisiontype: GLenum): WebGLShaderPrecisionFormat | null;
    getShaderSource(shader: WebGLShader): string | null;
    getSupportedExtensions(): string[] | null;
    getTexParameter(target: GLenum, pname: GLenum): any;
    getUniform(program: WebGLProgram, location: WebGLUniformLocation): any;
    getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation | null;
    getVertexAttrib(index: GLuint, pname: GLenum): any;
    getVertexAttribOffset(index: GLuint, pname: GLenum): GLintptr;
    hint(target: GLenum, mode: GLenum): void;
    isBuffer(buffer: WebGLBuffer | null): GLboolean;
    isContextLost(): boolean;
    isEnabled(cap: GLenum): GLboolean;
    isFramebuffer(framebuffer: WebGLFramebuffer | null): GLboolean;
    isProgram(program: WebGLProgram | null): GLboolean;
    isRenderbuffer(renderbuffer: WebGLRenderbuffer | null): GLboolean;
    isShader(shader: WebGLShader | null): GLboolean;
    isTexture(texture: WebGLTexture | null): GLboolean;
    lineWidth(width: GLfloat): void;
    linkProgram(program: WebGLProgram): void;
    pixelStorei(pname: GLenum, param: GLint | GLboolean): void;
    polygonOffset(factor: GLfloat, units: GLfloat): void;
    renderbufferStorage(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei): void;
    sampleCoverage(value: GLclampf, invert: GLboolean): void;
    scissor(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    shaderSource(shader: WebGLShader, source: string): void;
    stencilFunc(func: GLenum, ref: GLint, mask: GLuint): void;
    stencilFuncSeparate(face: GLenum, func: GLenum, ref: GLint, mask: GLuint): void;
    stencilMask(mask: GLuint): void;
    stencilMaskSeparate(face: GLenum, mask: GLuint): void;
    stencilOp(fail: GLenum, zfail: GLenum, zpass: GLenum): void;
    stencilOpSeparate(face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum): void;
    texParameterf(target: GLenum, pname: GLenum, param: GLfloat): void;
    texParameteri(target: GLenum, pname: GLenum, param: GLint): void;
    uniform1f(location: WebGLUniformLocation | null, x: GLfloat): void;
    uniform1i(location: WebGLUniformLocation | null, x: GLint): void;
    uniform2f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat): void;
    uniform2i(location: WebGLUniformLocation | null, x: GLint, y: GLint): void;
    uniform3f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat): void;
    uniform3i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint): void;
    uniform4f(location: WebGLUniformLocation | null, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
    uniform4i(location: WebGLUniformLocation | null, x: GLint, y: GLint, z: GLint, w: GLint): void;
    useProgram(program: WebGLProgram | null): void;
    validateProgram(program: WebGLProgram): void;
    vertexAttrib1f(index: GLuint, x: GLfloat): void;
    vertexAttrib1fv(index: GLuint, values: Float32List): void;
    vertexAttrib2f(index: GLuint, x: GLfloat, y: GLfloat): void;
    vertexAttrib2fv(index: GLuint, values: Float32List): void;
    vertexAttrib3f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat): void;
    vertexAttrib3fv(index: GLuint, values: Float32List): void;
    vertexAttrib4f(index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat): void;
    vertexAttrib4fv(index: GLuint, values: Float32List): void;
    vertexAttribPointer(index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLintptr): void;
    viewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;
    readonly ACTIVE_ATTRIBUTES: GLenum;
    readonly ACTIVE_TEXTURE: GLenum;
    readonly ACTIVE_UNIFORMS: GLenum;
    readonly ALIASED_LINE_WIDTH_RANGE: GLenum;
    readonly ALIASED_POINT_SIZE_RANGE: GLenum;
    readonly ALPHA: GLenum;
    readonly ALPHA_BITS: GLenum;
    readonly ALWAYS: GLenum;
    readonly ARRAY_BUFFER: GLenum;
    readonly ARRAY_BUFFER_BINDING: GLenum;
    readonly ATTACHED_SHADERS: GLenum;
    readonly BACK: GLenum;
    readonly BLEND: GLenum;
    readonly BLEND_COLOR: GLenum;
    readonly BLEND_DST_ALPHA: GLenum;
    readonly BLEND_DST_RGB: GLenum;
    readonly BLEND_EQUATION: GLenum;
    readonly BLEND_EQUATION_ALPHA: GLenum;
    readonly BLEND_EQUATION_RGB: GLenum;
    readonly BLEND_SRC_ALPHA: GLenum;
    readonly BLEND_SRC_RGB: GLenum;
    readonly BLUE_BITS: GLenum;
    readonly BOOL: GLenum;
    readonly BOOL_VEC2: GLenum;
    readonly BOOL_VEC3: GLenum;
    readonly BOOL_VEC4: GLenum;
    readonly BROWSER_DEFAULT_WEBGL: GLenum;
    readonly BUFFER_SIZE: GLenum;
    readonly BUFFER_USAGE: GLenum;
    readonly BYTE: GLenum;
    readonly CCW: GLenum;
    readonly CLAMP_TO_EDGE: GLenum;
    readonly COLOR_ATTACHMENT0: GLenum;
    readonly COLOR_BUFFER_BIT: GLenum;
    readonly COLOR_CLEAR_VALUE: GLenum;
    readonly COLOR_WRITEMASK: GLenum;
    readonly COMPILE_STATUS: GLenum;
    readonly COMPRESSED_TEXTURE_FORMATS: GLenum;
    readonly CONSTANT_ALPHA: GLenum;
    readonly CONSTANT_COLOR: GLenum;
    readonly CONTEXT_LOST_WEBGL: GLenum;
    readonly CULL_FACE: GLenum;
    readonly CULL_FACE_MODE: GLenum;
    readonly CURRENT_PROGRAM: GLenum;
    readonly CURRENT_VERTEX_ATTRIB: GLenum;
    readonly CW: GLenum;
    readonly DECR: GLenum;
    readonly DECR_WRAP: GLenum;
    readonly DELETE_STATUS: GLenum;
    readonly DEPTH_ATTACHMENT: GLenum;
    readonly DEPTH_BITS: GLenum;
    readonly DEPTH_BUFFER_BIT: GLenum;
    readonly DEPTH_CLEAR_VALUE: GLenum;
    readonly DEPTH_COMPONENT: GLenum;
    readonly DEPTH_COMPONENT16: GLenum;
    readonly DEPTH_FUNC: GLenum;
    readonly DEPTH_RANGE: GLenum;
    readonly DEPTH_STENCIL: GLenum;
    readonly DEPTH_STENCIL_ATTACHMENT: GLenum;
    readonly DEPTH_TEST: GLenum;
    readonly DEPTH_WRITEMASK: GLenum;
    readonly DITHER: GLenum;
    readonly DONT_CARE: GLenum;
    readonly DST_ALPHA: GLenum;
    readonly DST_COLOR: GLenum;
    readonly DYNAMIC_DRAW: GLenum;
    readonly ELEMENT_ARRAY_BUFFER: GLenum;
    readonly ELEMENT_ARRAY_BUFFER_BINDING: GLenum;
    readonly EQUAL: GLenum;
    readonly FASTEST: GLenum;
    readonly FLOAT: GLenum;
    readonly FLOAT_MAT2: GLenum;
    readonly FLOAT_MAT3: GLenum;
    readonly FLOAT_MAT4: GLenum;
    readonly FLOAT_VEC2: GLenum;
    readonly FLOAT_VEC3: GLenum;
    readonly FLOAT_VEC4: GLenum;
    readonly FRAGMENT_SHADER: GLenum;
    readonly FRAMEBUFFER: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum;
    readonly FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum;
    readonly FRAMEBUFFER_BINDING: GLenum;
    readonly FRAMEBUFFER_COMPLETE: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum;
    readonly FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum;
    readonly FRAMEBUFFER_UNSUPPORTED: GLenum;
    readonly FRONT: GLenum;
    readonly FRONT_AND_BACK: GLenum;
    readonly FRONT_FACE: GLenum;
    readonly FUNC_ADD: GLenum;
    readonly FUNC_REVERSE_SUBTRACT: GLenum;
    readonly FUNC_SUBTRACT: GLenum;
    readonly GENERATE_MIPMAP_HINT: GLenum;
    readonly GEQUAL: GLenum;
    readonly GREATER: GLenum;
    readonly GREEN_BITS: GLenum;
    readonly HIGH_FLOAT: GLenum;
    readonly HIGH_INT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_FORMAT: GLenum;
    readonly IMPLEMENTATION_COLOR_READ_TYPE: GLenum;
    readonly INCR: GLenum;
    readonly INCR_WRAP: GLenum;
    readonly INT: GLenum;
    readonly INT_VEC2: GLenum;
    readonly INT_VEC3: GLenum;
    readonly INT_VEC4: GLenum;
    readonly INVALID_ENUM: GLenum;
    readonly INVALID_FRAMEBUFFER_OPERATION: GLenum;
    readonly INVALID_OPERATION: GLenum;
    readonly INVALID_VALUE: GLenum;
    readonly INVERT: GLenum;
    readonly KEEP: GLenum;
    readonly LEQUAL: GLenum;
    readonly LESS: GLenum;
    readonly LINEAR: GLenum;
    readonly LINEAR_MIPMAP_LINEAR: GLenum;
    readonly LINEAR_MIPMAP_NEAREST: GLenum;
    readonly LINES: GLenum;
    readonly LINE_LOOP: GLenum;
    readonly LINE_STRIP: GLenum;
    readonly LINE_WIDTH: GLenum;
    readonly LINK_STATUS: GLenum;
    readonly LOW_FLOAT: GLenum;
    readonly LOW_INT: GLenum;
    readonly LUMINANCE: GLenum;
    readonly LUMINANCE_ALPHA: GLenum;
    readonly MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_CUBE_MAP_TEXTURE_SIZE: GLenum;
    readonly MAX_FRAGMENT_UNIFORM_VECTORS: GLenum;
    readonly MAX_RENDERBUFFER_SIZE: GLenum;
    readonly MAX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_TEXTURE_SIZE: GLenum;
    readonly MAX_VARYING_VECTORS: GLenum;
    readonly MAX_VERTEX_ATTRIBS: GLenum;
    readonly MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum;
    readonly MAX_VERTEX_UNIFORM_VECTORS: GLenum;
    readonly MAX_VIEWPORT_DIMS: GLenum;
    readonly MEDIUM_FLOAT: GLenum;
    readonly MEDIUM_INT: GLenum;
    readonly MIRRORED_REPEAT: GLenum;
    readonly NEAREST: GLenum;
    readonly NEAREST_MIPMAP_LINEAR: GLenum;
    readonly NEAREST_MIPMAP_NEAREST: GLenum;
    readonly NEVER: GLenum;
    readonly NICEST: GLenum;
    readonly NONE: GLenum;
    readonly NOTEQUAL: GLenum;
    readonly NO_ERROR: GLenum;
    readonly ONE: GLenum;
    readonly ONE_MINUS_CONSTANT_ALPHA: GLenum;
    readonly ONE_MINUS_CONSTANT_COLOR: GLenum;
    readonly ONE_MINUS_DST_ALPHA: GLenum;
    readonly ONE_MINUS_DST_COLOR: GLenum;
    readonly ONE_MINUS_SRC_ALPHA: GLenum;
    readonly ONE_MINUS_SRC_COLOR: GLenum;
    readonly OUT_OF_MEMORY: GLenum;
    readonly PACK_ALIGNMENT: GLenum;
    readonly POINTS: GLenum;
    readonly POLYGON_OFFSET_FACTOR: GLenum;
    readonly POLYGON_OFFSET_FILL: GLenum;
    readonly POLYGON_OFFSET_UNITS: GLenum;
    readonly RED_BITS: GLenum;
    readonly RENDERBUFFER: GLenum;
    readonly RENDERBUFFER_ALPHA_SIZE: GLenum;
    readonly RENDERBUFFER_BINDING: GLenum;
    readonly RENDERBUFFER_BLUE_SIZE: GLenum;
    readonly RENDERBUFFER_DEPTH_SIZE: GLenum;
    readonly RENDERBUFFER_GREEN_SIZE: GLenum;
    readonly RENDERBUFFER_HEIGHT: GLenum;
    readonly RENDERBUFFER_INTERNAL_FORMAT: GLenum;
    readonly RENDERBUFFER_RED_SIZE: GLenum;
    readonly RENDERBUFFER_STENCIL_SIZE: GLenum;
    readonly RENDERBUFFER_WIDTH: GLenum;
    readonly RENDERER: GLenum;
    readonly REPEAT: GLenum;
    readonly REPLACE: GLenum;
    readonly RGB: GLenum;
    readonly RGB565: GLenum;
    readonly RGB5_A1: GLenum;
    readonly RGBA: GLenum;
    readonly RGBA4: GLenum;
    readonly SAMPLER_2D: GLenum;
    readonly SAMPLER_CUBE: GLenum;
    readonly SAMPLES: GLenum;
    readonly SAMPLE_ALPHA_TO_COVERAGE: GLenum;
    readonly SAMPLE_BUFFERS: GLenum;
    readonly SAMPLE_COVERAGE: GLenum;
    readonly SAMPLE_COVERAGE_INVERT: GLenum;
    readonly SAMPLE_COVERAGE_VALUE: GLenum;
    readonly SCISSOR_BOX: GLenum;
    readonly SCISSOR_TEST: GLenum;
    readonly SHADER_TYPE: GLenum;
    readonly SHADING_LANGUAGE_VERSION: GLenum;
    readonly SHORT: GLenum;
    readonly SRC_ALPHA: GLenum;
    readonly SRC_ALPHA_SATURATE: GLenum;
    readonly SRC_COLOR: GLenum;
    readonly STATIC_DRAW: GLenum;
    readonly STENCIL_ATTACHMENT: GLenum;
    readonly STENCIL_BACK_FAIL: GLenum;
    readonly STENCIL_BACK_FUNC: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_BACK_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_BACK_REF: GLenum;
    readonly STENCIL_BACK_VALUE_MASK: GLenum;
    readonly STENCIL_BACK_WRITEMASK: GLenum;
    readonly STENCIL_BITS: GLenum;
    readonly STENCIL_BUFFER_BIT: GLenum;
    readonly STENCIL_CLEAR_VALUE: GLenum;
    readonly STENCIL_FAIL: GLenum;
    readonly STENCIL_FUNC: GLenum;
    readonly STENCIL_INDEX8: GLenum;
    readonly STENCIL_PASS_DEPTH_FAIL: GLenum;
    readonly STENCIL_PASS_DEPTH_PASS: GLenum;
    readonly STENCIL_REF: GLenum;
    readonly STENCIL_TEST: GLenum;
    readonly STENCIL_VALUE_MASK: GLenum;
    readonly STENCIL_WRITEMASK: GLenum;
    readonly STREAM_DRAW: GLenum;
    readonly SUBPIXEL_BITS: GLenum;
    readonly TEXTURE: GLenum;
    readonly TEXTURE0: GLenum;
    readonly TEXTURE1: GLenum;
    readonly TEXTURE10: GLenum;
    readonly TEXTURE11: GLenum;
    readonly TEXTURE12: GLenum;
    readonly TEXTURE13: GLenum;
    readonly TEXTURE14: GLenum;
    readonly TEXTURE15: GLenum;
    readonly TEXTURE16: GLenum;
    readonly TEXTURE17: GLenum;
    readonly TEXTURE18: GLenum;
    readonly TEXTURE19: GLenum;
    readonly TEXTURE2: GLenum;
    readonly TEXTURE20: GLenum;
    readonly TEXTURE21: GLenum;
    readonly TEXTURE22: GLenum;
    readonly TEXTURE23: GLenum;
    readonly TEXTURE24: GLenum;
    readonly TEXTURE25: GLenum;
    readonly TEXTURE26: GLenum;
    readonly TEXTURE27: GLenum;
    readonly TEXTURE28: GLenum;
    readonly TEXTURE29: GLenum;
    readonly TEXTURE3: GLenum;
    readonly TEXTURE30: GLenum;
    readonly TEXTURE31: GLenum;
    readonly TEXTURE4: GLenum;
    readonly TEXTURE5: GLenum;
    readonly TEXTURE6: GLenum;
    readonly TEXTURE7: GLenum;
    readonly TEXTURE8: GLenum;
    readonly TEXTURE9: GLenum;
    readonly TEXTURE_2D: GLenum;
    readonly TEXTURE_BINDING_2D: GLenum;
    readonly TEXTURE_BINDING_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_X: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum;
    readonly TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum;
    readonly TEXTURE_MAG_FILTER: GLenum;
    readonly TEXTURE_MIN_FILTER: GLenum;
    readonly TEXTURE_WRAP_S: GLenum;
    readonly TEXTURE_WRAP_T: GLenum;
    readonly TRIANGLES: GLenum;
    readonly TRIANGLE_FAN: GLenum;
    readonly TRIANGLE_STRIP: GLenum;
    readonly UNPACK_ALIGNMENT: GLenum;
    readonly UNPACK_COLORSPACE_CONVERSION_WEBGL: GLenum;
    readonly UNPACK_FLIP_Y_WEBGL: GLenum;
    readonly UNPACK_PREMULTIPLY_ALPHA_WEBGL: GLenum;
    readonly UNSIGNED_BYTE: GLenum;
    readonly UNSIGNED_INT: GLenum;
    readonly UNSIGNED_SHORT: GLenum;
    readonly UNSIGNED_SHORT_4_4_4_4: GLenum;
    readonly UNSIGNED_SHORT_5_5_5_1: GLenum;
    readonly UNSIGNED_SHORT_5_6_5: GLenum;
    readonly VALIDATE_STATUS: GLenum;
    readonly VENDOR: GLenum;
    readonly VERSION: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_ENABLED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_POINTER: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_SIZE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_STRIDE: GLenum;
    readonly VERTEX_ATTRIB_ARRAY_TYPE: GLenum;
    readonly VERTEX_SHADER: GLenum;
    readonly VIEWPORT: GLenum;
    readonly ZERO: GLenum;
}

interface WebGLRenderingContextOverloads {
    bufferData(target: GLenum, size: GLsizeiptr, usage: GLenum): void;
    bufferData(target: GLenum, data: BufferSource | null, usage: GLenum): void;
    bufferSubData(target: GLenum, offset: GLintptr, data: BufferSource): void;
    compressedTexImage2D(target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: ArrayBufferView): void;
    compressedTexSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: ArrayBufferView): void;
    readPixels(x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texImage2D(target: GLenum, level: GLint, internalformat: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: ArrayBufferView | null): void;
    texSubImage2D(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, format: GLenum, type: GLenum, source: TexImageSource): void;
    uniform1fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform1iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniform2fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform2iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniform3fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform3iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniform4fv(location: WebGLUniformLocation | null, v: Float32List): void;
    uniform4iv(location: WebGLUniformLocation | null, v: Int32List): void;
    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Float32List): void;
}

interface WebGLSampler {
}

declare var WebGLSampler: {
    prototype: WebGLSampler;
    new(): WebGLSampler;
};

/** The WebGLShader is part of the WebGL API and can either be a vertex or a fragment shader. A WebGLProgram requires both types of shaders. */
interface WebGLShader {
}

declare var WebGLShader: {
    prototype: WebGLShader;
    new(): WebGLShader;
};

/** Part of the WebGL API and represents the information returned by calling the WebGLRenderingContext.getShaderPrecisionFormat() method. */
interface WebGLShaderPrecisionFormat {
    readonly precision: GLint;
    readonly rangeMax: GLint;
    readonly rangeMin: GLint;
}

declare var WebGLShaderPrecisionFormat: {
    prototype: WebGLShaderPrecisionFormat;
    new(): WebGLShaderPrecisionFormat;
};

interface WebGLSync {
}

declare var WebGLSync: {
    prototype: WebGLSync;
    new(): WebGLSync;
};

/** Part of the WebGL API and represents an opaque texture object providing storage and state for texturing operations. */
interface WebGLTexture {
}

declare var WebGLTexture: {
    prototype: WebGLTexture;
    new(): WebGLTexture;
};

interface WebGLTransformFeedback {
}

declare var WebGLTransformFeedback: {
    prototype: WebGLTransformFeedback;
    new(): WebGLTransformFeedback;
};

/** Part of the WebGL API and represents the location of a uniform variable in a shader program. */
interface WebGLUniformLocation {
}

declare var WebGLUniformLocation: {
    prototype: WebGLUniformLocation;
    new(): WebGLUniformLocation;
};

interface WebGLVertexArrayObject {
}

declare var WebGLVertexArrayObject: {
    prototype: WebGLVertexArrayObject;
    new(): WebGLVertexArrayObject;
};

interface WebGLVertexArrayObjectOES {
}

interface WebSocketEventMap {
    "close": CloseEvent;
    "error": Event;
    "message": MessageEvent;
    "open": Event;
}

/** Provides the API for creating and managing a WebSocket connection to a server, as well as for sending and receiving data on the connection. */
interface WebSocket extends EventTarget {
    /**
     * Returns a string that indicates how binary data from the WebSocket object is exposed to scripts:
     *
     * Can be set, to change how binary data is returned. The default is "blob".
     */
    binaryType: BinaryType;
    /**
     * Returns the number of bytes of application data (UTF-8 text and binary data) that have been queued using send() but not yet been transmitted to the network.
     *
     * If the WebSocket connection is closed, this attribute's value will only increase with each call to the send() method. (The number does not reset to zero once the connection closes.)
     */
    readonly bufferedAmount: number;
    /** Returns the extensions selected by the server, if any. */
    readonly extensions: string;
    onclose: ((this: WebSocket, ev: CloseEvent) => any) | null;
    onerror: ((this: WebSocket, ev: Event) => any) | null;
    onmessage: ((this: WebSocket, ev: MessageEvent) => any) | null;
    onopen: ((this: WebSocket, ev: Event) => any) | null;
    /** Returns the subprotocol selected by the server, if any. It can be used in conjunction with the array form of the constructor's second argument to perform subprotocol negotiation. */
    readonly protocol: string;
    /** Returns the state of the WebSocket object's connection. It can have the values described below. */
    readonly readyState: number;
    /** Returns the URL that was used to establish the WebSocket connection. */
    readonly url: string;
    /** Closes the WebSocket connection, optionally using code as the the WebSocket connection close code and reason as the the WebSocket connection close reason. */
    close(code?: number, reason?: string): void;
    /** Transmits data using the WebSocket connection. data can be a string, a Blob, an ArrayBuffer, or an ArrayBufferView. */
    send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
    readonly CLOSED: number;
    readonly CLOSING: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
    addEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof WebSocketEventMap>(type: K, listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var WebSocket: {
    prototype: WebSocket;
    new(url: string | URL, protocols?: string | string[]): WebSocket;
    readonly CLOSED: number;
    readonly CLOSING: number;
    readonly CONNECTING: number;
    readonly OPEN: number;
};

/** This ServiceWorker API interface represents the scope of a service worker client that is a document in a browser context, controlled by an active worker. The service worker client independently selects and uses a service worker for its own loading and sub-resources. */
interface WindowClient extends Client {
    readonly focused: boolean;
    readonly visibilityState: VisibilityState;
    focus(): Promise<WindowClient>;
    navigate(url: string | URL): Promise<WindowClient | null>;
}

declare var WindowClient: {
    prototype: WindowClient;
    new(): WindowClient;
};

interface WindowOrWorkerGlobalScope {
    /** Available only in secure contexts. */
    readonly caches: CacheStorage;
    readonly crossOriginIsolated: boolean;
    readonly crypto: Crypto;
    readonly indexedDB: IDBFactory;
    readonly isSecureContext: boolean;
    readonly origin: string;
    readonly performance: Performance;
    atob(data: string): string;
    btoa(data: string): string;
    clearInterval(handle?: number): void;
    clearTimeout(handle?: number): void;
    createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
    createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
    fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
    queueMicrotask(callback: VoidFunction): void;
    setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
    setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
}

interface WorkerEventMap extends AbstractWorkerEventMap {
    "message": MessageEvent;
    "messageerror": MessageEvent;
}

/** This Web Workers API interface represents a background task that can be easily created and can send messages back to its creator. Creating a worker is as simple as calling the Worker() constructor and specifying a script to be run in the worker thread. */
interface Worker extends EventTarget, AbstractWorker {
    onmessage: ((this: Worker, ev: MessageEvent) => any) | null;
    onmessageerror: ((this: Worker, ev: MessageEvent) => any) | null;
    /** Clones message and transmits it to worker's global environment. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
    postMessage(message: any, transfer: Transferable[]): void;
    postMessage(message: any, options?: StructuredSerializeOptions): void;
    /** Aborts worker's associated global environment. */
    terminate(): void;
    addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: Worker, ev: WorkerEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var Worker: {
    prototype: Worker;
    new(scriptURL: string | URL, options?: WorkerOptions): Worker;
};

interface WorkerGlobalScopeEventMap {
    "error": ErrorEvent;
    "languagechange": Event;
    "offline": Event;
    "online": Event;
    "rejectionhandled": PromiseRejectionEvent;
    "unhandledrejection": PromiseRejectionEvent;
}

/** This Web Workers API interface is an interface representing the scope of any worker. Workers have no browsing context; this scope contains the information usually conveyed by Window objects \u2014 in this case event handlers, the console or the associated WorkerNavigator object. Each WorkerGlobalScope has its own event loop. */
interface WorkerGlobalScope extends EventTarget, FontFaceSource, WindowOrWorkerGlobalScope {
    /** Returns workerGlobal's WorkerLocation object. */
    readonly location: WorkerLocation;
    /** Returns workerGlobal's WorkerNavigator object. */
    readonly navigator: WorkerNavigator;
    onerror: ((this: WorkerGlobalScope, ev: ErrorEvent) => any) | null;
    onlanguagechange: ((this: WorkerGlobalScope, ev: Event) => any) | null;
    onoffline: ((this: WorkerGlobalScope, ev: Event) => any) | null;
    ononline: ((this: WorkerGlobalScope, ev: Event) => any) | null;
    onrejectionhandled: ((this: WorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
    onunhandledrejection: ((this: WorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
    /** Returns workerGlobal. */
    readonly self: WorkerGlobalScope & typeof globalThis;
    /** Fetches each URL in urls, executes them one-by-one in the order they are passed, and then returns (or throws if something went amiss). */
    importScripts(...urls: (string | URL)[]): void;
    addEventListener<K extends keyof WorkerGlobalScopeEventMap>(type: K, listener: (this: WorkerGlobalScope, ev: WorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof WorkerGlobalScopeEventMap>(type: K, listener: (this: WorkerGlobalScope, ev: WorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var WorkerGlobalScope: {
    prototype: WorkerGlobalScope;
    new(): WorkerGlobalScope;
};

/** The absolute location of the script executed by the Worker. Such an object is initialized for each worker and is available via the WorkerGlobalScope.location property obtained by calling self.location. */
interface WorkerLocation {
    readonly hash: string;
    readonly host: string;
    readonly hostname: string;
    readonly href: string;
    toString(): string;
    readonly origin: string;
    readonly pathname: string;
    readonly port: string;
    readonly protocol: string;
    readonly search: string;
}

declare var WorkerLocation: {
    prototype: WorkerLocation;
    new(): WorkerLocation;
};

/** A subset of the Navigator interface allowed to be accessed from a Worker. Such an object is initialized for each worker and is available via the WorkerGlobalScope.navigator property obtained by calling window.self.navigator. */
interface WorkerNavigator extends NavigatorConcurrentHardware, NavigatorID, NavigatorLanguage, NavigatorNetworkInformation, NavigatorOnLine, NavigatorStorage {
    readonly mediaCapabilities: MediaCapabilities;
}

declare var WorkerNavigator: {
    prototype: WorkerNavigator;
    new(): WorkerNavigator;
};

/** This Streams API interface provides\xA0a standard abstraction for writing streaming data to a destination, known as a sink. This object comes with built-in backpressure and queuing. */
interface WritableStream<W = any> {
    readonly locked: boolean;
    abort(reason?: any): Promise<void>;
    close(): Promise<void>;
    getWriter(): WritableStreamDefaultWriter<W>;
}

declare var WritableStream: {
    prototype: WritableStream;
    new<W = any>(underlyingSink?: UnderlyingSink<W>, strategy?: QueuingStrategy<W>): WritableStream<W>;
};

/** This Streams API interface represents a controller allowing control of a\xA0WritableStream's state. When constructing a WritableStream, the underlying sink is given a corresponding WritableStreamDefaultController instance to manipulate. */
interface WritableStreamDefaultController {
    error(e?: any): void;
}

declare var WritableStreamDefaultController: {
    prototype: WritableStreamDefaultController;
    new(): WritableStreamDefaultController;
};

/** This Streams API interface is the object returned by WritableStream.getWriter() and once created locks the < writer to the WritableStream ensuring that no other streams can write to the underlying sink. */
interface WritableStreamDefaultWriter<W = any> {
    readonly closed: Promise<undefined>;
    readonly desiredSize: number | null;
    readonly ready: Promise<undefined>;
    abort(reason?: any): Promise<void>;
    close(): Promise<void>;
    releaseLock(): void;
    write(chunk?: W): Promise<void>;
}

declare var WritableStreamDefaultWriter: {
    prototype: WritableStreamDefaultWriter;
    new<W = any>(stream: WritableStream<W>): WritableStreamDefaultWriter<W>;
};

interface XMLHttpRequestEventMap extends XMLHttpRequestEventTargetEventMap {
    "readystatechange": Event;
}

/** Use XMLHttpRequest (XHR) objects to interact with servers. You can retrieve data from a URL without having to do a full page refresh. This enables a Web page to update just part of a page without disrupting what the user is doing. */
interface XMLHttpRequest extends XMLHttpRequestEventTarget {
    onreadystatechange: ((this: XMLHttpRequest, ev: Event) => any) | null;
    /** Returns client's state. */
    readonly readyState: number;
    /** Returns the response body. */
    readonly response: any;
    /**
     * Returns response as text.
     *
     * Throws an "InvalidStateError" DOMException if responseType is not the empty string or "text".
     */
    readonly responseText: string;
    /**
     * Returns the response type.
     *
     * Can be set to change the response type. Values are: the empty string (default), "arraybuffer", "blob", "document", "json", and "text".
     *
     * When set: setting to "document" is ignored if current global object is not a Window object.
     *
     * When set: throws an "InvalidStateError" DOMException if state is loading or done.
     *
     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
     */
    responseType: XMLHttpRequestResponseType;
    readonly responseURL: string;
    readonly status: number;
    readonly statusText: string;
    /**
     * Can be set to a time in milliseconds. When set to a non-zero value will cause fetching to terminate after the given time has passed. When the time has passed, the request has not yet completed, and this's synchronous flag is unset, a timeout event will then be dispatched, or a "TimeoutError" DOMException will be thrown otherwise (for the send() method).
     *
     * When set: throws an "InvalidAccessError" DOMException if the synchronous flag is set and current global object is a Window object.
     */
    timeout: number;
    /** Returns the associated XMLHttpRequestUpload object. It can be used to gather transmission information when data is transferred to a server. */
    readonly upload: XMLHttpRequestUpload;
    /**
     * True when credentials are to be included in a cross-origin request. False when they are to be excluded in a cross-origin request and when cookies are to be ignored in its response. Initially false.
     *
     * When set: throws an "InvalidStateError" DOMException if state is not unsent or opened, or if the send() flag is set.
     */
    withCredentials: boolean;
    /** Cancels any network activity. */
    abort(): void;
    getAllResponseHeaders(): string;
    getResponseHeader(name: string): string | null;
    /**
     * Sets the request method, request URL, and synchronous flag.
     *
     * Throws a "SyntaxError" DOMException if either method is not a valid method or url cannot be parsed.
     *
     * Throws a "SecurityError" DOMException if method is a case-insensitive match for \`CONNECT\`, \`TRACE\`, or \`TRACK\`.
     *
     * Throws an "InvalidAccessError" DOMException if async is false, current global object is a Window object, and the timeout attribute is not zero or the responseType attribute is not the empty string.
     */
    open(method: string, url: string | URL): void;
    open(method: string, url: string | URL, async: boolean, username?: string | null, password?: string | null): void;
    /**
     * Acts as if the \`Content-Type\` header value for a response is mime. (It does not change the header.)
     *
     * Throws an "InvalidStateError" DOMException if state is loading or done.
     */
    overrideMimeType(mime: string): void;
    /**
     * Initiates the request. The body argument provides the request body, if any, and is ignored if the request method is GET or HEAD.
     *
     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
     */
    send(body?: XMLHttpRequestBodyInit | null): void;
    /**
     * Combines a header in author request headers.
     *
     * Throws an "InvalidStateError" DOMException if either state is not opened or the send() flag is set.
     *
     * Throws a "SyntaxError" DOMException if name is not a header name or if value is not a header value.
     */
    setRequestHeader(name: string, value: string): void;
    readonly DONE: number;
    readonly HEADERS_RECEIVED: number;
    readonly LOADING: number;
    readonly OPENED: number;
    readonly UNSENT: number;
    addEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var XMLHttpRequest: {
    prototype: XMLHttpRequest;
    new(): XMLHttpRequest;
    readonly DONE: number;
    readonly HEADERS_RECEIVED: number;
    readonly LOADING: number;
    readonly OPENED: number;
    readonly UNSENT: number;
};

interface XMLHttpRequestEventTargetEventMap {
    "abort": ProgressEvent<XMLHttpRequestEventTarget>;
    "error": ProgressEvent<XMLHttpRequestEventTarget>;
    "load": ProgressEvent<XMLHttpRequestEventTarget>;
    "loadend": ProgressEvent<XMLHttpRequestEventTarget>;
    "loadstart": ProgressEvent<XMLHttpRequestEventTarget>;
    "progress": ProgressEvent<XMLHttpRequestEventTarget>;
    "timeout": ProgressEvent<XMLHttpRequestEventTarget>;
}

interface XMLHttpRequestEventTarget extends EventTarget {
    onabort: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onerror: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onload: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onloadend: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onloadstart: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    onprogress: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    ontimeout: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestEventTarget, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var XMLHttpRequestEventTarget: {
    prototype: XMLHttpRequestEventTarget;
    new(): XMLHttpRequestEventTarget;
};

interface XMLHttpRequestUpload extends XMLHttpRequestEventTarget {
    addEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
    addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
    removeEventListener<K extends keyof XMLHttpRequestEventTargetEventMap>(type: K, listener: (this: XMLHttpRequestUpload, ev: XMLHttpRequestEventTargetEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
    removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
}

declare var XMLHttpRequestUpload: {
    prototype: XMLHttpRequestUpload;
    new(): XMLHttpRequestUpload;
};

interface Console {
    assert(condition?: boolean, ...data: any[]): void;
    clear(): void;
    count(label?: string): void;
    countReset(label?: string): void;
    debug(...data: any[]): void;
    dir(item?: any, options?: any): void;
    dirxml(...data: any[]): void;
    error(...data: any[]): void;
    group(...data: any[]): void;
    groupCollapsed(...data: any[]): void;
    groupEnd(): void;
    info(...data: any[]): void;
    log(...data: any[]): void;
    table(tabularData?: any, properties?: string[]): void;
    time(label?: string): void;
    timeEnd(label?: string): void;
    timeLog(label?: string, ...data: any[]): void;
    timeStamp(label?: string): void;
    trace(...data: any[]): void;
    warn(...data: any[]): void;
}

declare var console: Console;

declare namespace WebAssembly {
    interface CompileError extends Error {
    }

    var CompileError: {
        prototype: CompileError;
        new(message?: string): CompileError;
        (message?: string): CompileError;
    };

    interface Global {
        value: any;
        valueOf(): any;
    }

    var Global: {
        prototype: Global;
        new(descriptor: GlobalDescriptor, v?: any): Global;
    };

    interface Instance {
        readonly exports: Exports;
    }

    var Instance: {
        prototype: Instance;
        new(module: Module, importObject?: Imports): Instance;
    };

    interface LinkError extends Error {
    }

    var LinkError: {
        prototype: LinkError;
        new(message?: string): LinkError;
        (message?: string): LinkError;
    };

    interface Memory {
        readonly buffer: ArrayBuffer;
        grow(delta: number): number;
    }

    var Memory: {
        prototype: Memory;
        new(descriptor: MemoryDescriptor): Memory;
    };

    interface Module {
    }

    var Module: {
        prototype: Module;
        new(bytes: BufferSource): Module;
        customSections(moduleObject: Module, sectionName: string): ArrayBuffer[];
        exports(moduleObject: Module): ModuleExportDescriptor[];
        imports(moduleObject: Module): ModuleImportDescriptor[];
    };

    interface RuntimeError extends Error {
    }

    var RuntimeError: {
        prototype: RuntimeError;
        new(message?: string): RuntimeError;
        (message?: string): RuntimeError;
    };

    interface Table {
        readonly length: number;
        get(index: number): any;
        grow(delta: number, value?: any): number;
        set(index: number, value?: any): void;
    }

    var Table: {
        prototype: Table;
        new(descriptor: TableDescriptor, value?: any): Table;
    };

    interface GlobalDescriptor {
        mutable?: boolean;
        value: ValueType;
    }

    interface MemoryDescriptor {
        initial: number;
        maximum?: number;
        shared?: boolean;
    }

    interface ModuleExportDescriptor {
        kind: ImportExportKind;
        name: string;
    }

    interface ModuleImportDescriptor {
        kind: ImportExportKind;
        module: string;
        name: string;
    }

    interface TableDescriptor {
        element: TableKind;
        initial: number;
        maximum?: number;
    }

    interface WebAssemblyInstantiatedSource {
        instance: Instance;
        module: Module;
    }

    type ImportExportKind = "function" | "global" | "memory" | "table";
    type TableKind = "anyfunc" | "externref";
    type ValueType = "anyfunc" | "externref" | "f32" | "f64" | "i32" | "i64";
    type ExportValue = Function | Global | Memory | Table;
    type Exports = Record<string, ExportValue>;
    type ImportValue = ExportValue | number;
    type Imports = Record<string, ModuleImports>;
    type ModuleImports = Record<string, ImportValue>;
    function compile(bytes: BufferSource): Promise<Module>;
    function compileStreaming(source: Response | PromiseLike<Response>): Promise<Module>;
    function instantiate(bytes: BufferSource, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
    function instantiate(moduleObject: Module, importObject?: Imports): Promise<Instance>;
    function instantiateStreaming(source: Response | PromiseLike<Response>, importObject?: Imports): Promise<WebAssemblyInstantiatedSource>;
    function validate(bytes: BufferSource): boolean;
}

interface FrameRequestCallback {
    (time: DOMHighResTimeStamp): void;
}

interface OnErrorEventHandlerNonNull {
    (event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error): any;
}

interface PerformanceObserverCallback {
    (entries: PerformanceObserverEntryList, observer: PerformanceObserver): void;
}

interface QueuingStrategySize<T = any> {
    (chunk: T): number;
}

interface TransformerFlushCallback<O> {
    (controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
}

interface TransformerStartCallback<O> {
    (controller: TransformStreamDefaultController<O>): any;
}

interface TransformerTransformCallback<I, O> {
    (chunk: I, controller: TransformStreamDefaultController<O>): void | PromiseLike<void>;
}

interface UnderlyingSinkAbortCallback {
    (reason?: any): void | PromiseLike<void>;
}

interface UnderlyingSinkCloseCallback {
    (): void | PromiseLike<void>;
}

interface UnderlyingSinkStartCallback {
    (controller: WritableStreamDefaultController): any;
}

interface UnderlyingSinkWriteCallback<W> {
    (chunk: W, controller: WritableStreamDefaultController): void | PromiseLike<void>;
}

interface UnderlyingSourceCancelCallback {
    (reason?: any): void | PromiseLike<void>;
}

interface UnderlyingSourcePullCallback<R> {
    (controller: ReadableStreamController<R>): void | PromiseLike<void>;
}

interface UnderlyingSourceStartCallback<R> {
    (controller: ReadableStreamController<R>): any;
}

interface VoidFunction {
    (): void;
}

/** Returns dedicatedWorkerGlobal's name, i.e. the value given to the Worker constructor. Primarily useful for debugging. */
declare var name: string;
declare var onmessage: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
declare var onmessageerror: ((this: DedicatedWorkerGlobalScope, ev: MessageEvent) => any) | null;
/** Aborts dedicatedWorkerGlobal. */
declare function close(): void;
/** Clones message and transmits it to the Worker object associated with dedicatedWorkerGlobal. transfer can be passed as a list of objects that are to be transferred rather than cloned. */
declare function postMessage(message: any, transfer: Transferable[]): void;
declare function postMessage(message: any, options?: StructuredSerializeOptions): void;
/** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
declare function dispatchEvent(event: Event): boolean;
/** Returns workerGlobal's WorkerLocation object. */
declare var location: WorkerLocation;
/** Returns workerGlobal's WorkerNavigator object. */
declare var navigator: WorkerNavigator;
declare var onerror: ((this: DedicatedWorkerGlobalScope, ev: ErrorEvent) => any) | null;
declare var onlanguagechange: ((this: DedicatedWorkerGlobalScope, ev: Event) => any) | null;
declare var onoffline: ((this: DedicatedWorkerGlobalScope, ev: Event) => any) | null;
declare var ononline: ((this: DedicatedWorkerGlobalScope, ev: Event) => any) | null;
declare var onrejectionhandled: ((this: DedicatedWorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
declare var onunhandledrejection: ((this: DedicatedWorkerGlobalScope, ev: PromiseRejectionEvent) => any) | null;
/** Returns workerGlobal. */
declare var self: WorkerGlobalScope & typeof globalThis;
/** Fetches each URL in urls, executes them one-by-one in the order they are passed, and then returns (or throws if something went amiss). */
declare function importScripts(...urls: (string | URL)[]): void;
/** Dispatches a synthetic event event to target and returns true if either event's cancelable attribute value is false or its preventDefault() method was not invoked, and false otherwise. */
declare function dispatchEvent(event: Event): boolean;
declare var fonts: FontFaceSet;
/** Available only in secure contexts. */
declare var caches: CacheStorage;
declare var crossOriginIsolated: boolean;
declare var crypto: Crypto;
declare var indexedDB: IDBFactory;
declare var isSecureContext: boolean;
declare var origin: string;
declare var performance: Performance;
declare function atob(data: string): string;
declare function btoa(data: string): string;
declare function clearInterval(handle?: number): void;
declare function clearTimeout(handle?: number): void;
declare function createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
declare function createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
declare function fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
declare function queueMicrotask(callback: VoidFunction): void;
declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;
declare function cancelAnimationFrame(handle: number): void;
declare function requestAnimationFrame(callback: FrameRequestCallback): number;
declare function addEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
declare function removeEventListener<K extends keyof DedicatedWorkerGlobalScopeEventMap>(type: K, listener: (this: DedicatedWorkerGlobalScope, ev: DedicatedWorkerGlobalScopeEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
declare function removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
type AlgorithmIdentifier = Algorithm | string;
type BigInteger = Uint8Array;
type BinaryData = ArrayBuffer | ArrayBufferView;
type BlobPart = BufferSource | Blob | string;
type BodyInit = ReadableStream | XMLHttpRequestBodyInit;
type BufferSource = ArrayBufferView | ArrayBuffer;
type CanvasImageSource = ImageBitmap | OffscreenCanvas;
type DOMHighResTimeStamp = number;
type DOMTimeStamp = number;
type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
type Float32List = Float32Array | GLfloat[];
type FormDataEntryValue = File | string;
type GLbitfield = number;
type GLboolean = boolean;
type GLclampf = number;
type GLenum = number;
type GLfloat = number;
type GLint = number;
type GLint64 = number;
type GLintptr = number;
type GLsizei = number;
type GLsizeiptr = number;
type GLuint = number;
type GLuint64 = number;
type HashAlgorithmIdentifier = AlgorithmIdentifier;
type HeadersInit = string[][] | Record<string, string> | Headers;
type IDBValidKey = number | string | Date | BufferSource | IDBValidKey[];
type ImageBitmapSource = CanvasImageSource | Blob | ImageData;
type Int32List = Int32Array | GLint[];
type MessageEventSource = MessagePort | ServiceWorker;
type NamedCurve = string;
type OnErrorEventHandler = OnErrorEventHandlerNonNull | null;
type PerformanceEntryList = PerformanceEntry[];
type PushMessageDataInit = BufferSource | string;
type ReadableStreamController<T> = ReadableStreamDefaultController<T>;
type ReadableStreamDefaultReadResult<T> = ReadableStreamDefaultReadValueResult<T> | ReadableStreamDefaultReadDoneResult;
type ReadableStreamReader<T> = ReadableStreamDefaultReader<T>;
type RequestInfo = Request | string;
type TexImageSource = ImageBitmap | ImageData | OffscreenCanvas;
type TimerHandler = string | Function;
type Transferable = ArrayBuffer | MessagePort | ImageBitmap;
type Uint32List = Uint32Array | GLuint[];
type VibratePattern = number | number[];
type XMLHttpRequestBodyInit = Blob | BufferSource | FormData | URLSearchParams | string;
type BinaryType = "arraybuffer" | "blob";
type ClientTypes = "all" | "sharedworker" | "window" | "worker";
type ColorGamut = "p3" | "rec2020" | "srgb";
type ColorSpaceConversion = "default" | "none";
type ConnectionType = "bluetooth" | "cellular" | "ethernet" | "mixed" | "none" | "other" | "unknown" | "wifi";
type EndingType = "native" | "transparent";
type FontFaceLoadStatus = "error" | "loaded" | "loading" | "unloaded";
type FontFaceSetLoadStatus = "loaded" | "loading";
type FrameType = "auxiliary" | "nested" | "none" | "top-level";
type HdrMetadataType = "smpteSt2086" | "smpteSt2094-10" | "smpteSt2094-40";
type IDBCursorDirection = "next" | "nextunique" | "prev" | "prevunique";
type IDBRequestReadyState = "done" | "pending";
type IDBTransactionMode = "readonly" | "readwrite" | "versionchange";
type ImageOrientation = "flipY" | "none";
type KeyFormat = "jwk" | "pkcs8" | "raw" | "spki";
type KeyType = "private" | "public" | "secret";
type KeyUsage = "decrypt" | "deriveBits" | "deriveKey" | "encrypt" | "sign" | "unwrapKey" | "verify" | "wrapKey";
type MediaDecodingType = "file" | "media-source" | "webrtc";
type MediaEncodingType = "record" | "webrtc";
type NotificationDirection = "auto" | "ltr" | "rtl";
type NotificationPermission = "default" | "denied" | "granted";
type PermissionName = "geolocation" | "notifications" | "persistent-storage" | "push" | "screen-wake-lock" | "xr-spatial-tracking";
type PermissionState = "denied" | "granted" | "prompt";
type PredefinedColorSpace = "display-p3" | "srgb";
type PremultiplyAlpha = "default" | "none" | "premultiply";
type PushEncryptionKeyName = "auth" | "p256dh";
type PushPermissionState = "denied" | "granted" | "prompt";
type ReferrerPolicy = "" | "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
type RequestCache = "default" | "force-cache" | "no-cache" | "no-store" | "only-if-cached" | "reload";
type RequestCredentials = "include" | "omit" | "same-origin";
type RequestDestination = "" | "audio" | "audioworklet" | "document" | "embed" | "font" | "frame" | "iframe" | "image" | "manifest" | "object" | "paintworklet" | "report" | "script" | "sharedworker" | "style" | "track" | "video" | "worker" | "xslt";
type RequestMode = "cors" | "navigate" | "no-cors" | "same-origin";
type RequestRedirect = "error" | "follow" | "manual";
type ResizeQuality = "high" | "low" | "medium" | "pixelated";
type ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect";
type SecurityPolicyViolationEventDisposition = "enforce" | "report";
type ServiceWorkerState = "activated" | "activating" | "installed" | "installing" | "parsed" | "redundant";
type ServiceWorkerUpdateViaCache = "all" | "imports" | "none";
type TransferFunction = "hlg" | "pq" | "srgb";
type VisibilityState = "hidden" | "visible";
type WebGLPowerPreference = "default" | "high-performance" | "low-power";
type WorkerType = "classic" | "module";
type XMLHttpRequestResponseType = "" | "arraybuffer" | "blob" | "document" | "json" | "text";
`;
  libFileMap["lib.webworker.importscripts.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n\n/////////////////////////////\n/// WorkerGlobalScope APIs\n/////////////////////////////\n// These are only available in a Web Worker\ndeclare function importScripts(...urls: string[]): void;\n';
  libFileMap["lib.webworker.iterable.d.ts"] = '/*! *****************************************************************************\nCopyright (c) Microsoft Corporation. All rights reserved.\nLicensed under the Apache License, Version 2.0 (the "License"); you may not use\nthis file except in compliance with the License. You may obtain a copy of the\nLicense at http://www.apache.org/licenses/LICENSE-2.0\n\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\nMERCHANTABLITY OR NON-INFRINGEMENT.\n\nSee the Apache Version 2.0 License for specific language governing permissions\nand limitations under the License.\n***************************************************************************** */\n\n\n\n/// <reference no-default-lib="true"/>\n\n\n/////////////////////////////\n/// Worker Iterable APIs\n/////////////////////////////\n\ninterface Cache {\n    addAll(requests: Iterable<RequestInfo>): Promise<void>;\n}\n\ninterface DOMStringList {\n    [Symbol.iterator](): IterableIterator<string>;\n}\n\ninterface FileList {\n    [Symbol.iterator](): IterableIterator<File>;\n}\n\ninterface FontFaceSet extends Set<FontFace> {\n}\n\ninterface FormData {\n    [Symbol.iterator](): IterableIterator<[string, FormDataEntryValue]>;\n    /** Returns an array of key, value pairs for every entry in the list. */\n    entries(): IterableIterator<[string, FormDataEntryValue]>;\n    /** Returns a list of keys in the list. */\n    keys(): IterableIterator<string>;\n    /** Returns a list of values in the list. */\n    values(): IterableIterator<FormDataEntryValue>;\n}\n\ninterface Headers {\n    [Symbol.iterator](): IterableIterator<[string, string]>;\n    /** Returns an iterator allowing to go through all key/value pairs contained in this object. */\n    entries(): IterableIterator<[string, string]>;\n    /** Returns an iterator allowing to go through all keys of the key/value pairs contained in this object. */\n    keys(): IterableIterator<string>;\n    /** Returns an iterator allowing to go through all values of the key/value pairs contained in this object. */\n    values(): IterableIterator<string>;\n}\n\ninterface IDBDatabase {\n    /** Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names. */\n    transaction(storeNames: string | Iterable<string>, mode?: IDBTransactionMode): IDBTransaction;\n}\n\ninterface IDBObjectStore {\n    /**\n     * Creates a new index in store with the given name, keyPath and options and returns a new IDBIndex. If the keyPath and options define constraints that cannot be satisfied with the data already in store the upgrade transaction will abort with a "ConstraintError" DOMException.\n     *\n     * Throws an "InvalidStateError" DOMException if not called within an upgrade transaction.\n     */\n    createIndex(name: string, keyPath: string | Iterable<string>, options?: IDBIndexParameters): IDBIndex;\n}\n\ninterface MessageEvent<T = any> {\n    /** @deprecated */\n    initMessageEvent(type: string, bubbles?: boolean, cancelable?: boolean, data?: any, origin?: string, lastEventId?: string, source?: MessageEventSource | null, ports?: Iterable<MessagePort>): void;\n}\n\ninterface SubtleCrypto {\n    deriveKey(algorithm: AlgorithmIdentifier | EcdhKeyDeriveParams | HkdfParams | Pbkdf2Params, baseKey: CryptoKey, derivedKeyType: AlgorithmIdentifier | AesDerivedKeyParams | HmacImportParams | HkdfParams | Pbkdf2Params, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;\n    generateKey(algorithm: RsaHashedKeyGenParams | EcKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair>;\n    generateKey(algorithm: AesKeyGenParams | HmacKeyGenParams | Pbkdf2Params, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;\n    generateKey(algorithm: AlgorithmIdentifier, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKeyPair | CryptoKey>;\n    importKey(format: "jwk", keyData: JsonWebKey, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey>;\n    importKey(format: Exclude<KeyFormat, "jwk">, keyData: BufferSource, algorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;\n    unwrapKey(format: KeyFormat, wrappedKey: BufferSource, unwrappingKey: CryptoKey, unwrapAlgorithm: AlgorithmIdentifier | RsaOaepParams | AesCtrParams | AesCbcParams | AesGcmParams, unwrappedKeyAlgorithm: AlgorithmIdentifier | RsaHashedImportParams | EcKeyImportParams | HmacImportParams | AesKeyAlgorithm, extractable: boolean, keyUsages: Iterable<KeyUsage>): Promise<CryptoKey>;\n}\n\ninterface URLSearchParams {\n    [Symbol.iterator](): IterableIterator<[string, string]>;\n    /** Returns an array of key, value pairs for every entry in the search params. */\n    entries(): IterableIterator<[string, string]>;\n    /** Returns a list of keys in the search params. */\n    keys(): IterableIterator<string>;\n    /** Returns a list of values in the search params. */\n    values(): IterableIterator<string>;\n}\n\ninterface WEBGL_draw_buffers {\n    drawBuffersWEBGL(buffers: Iterable<GLenum>): void;\n}\n\ninterface WebGL2RenderingContextBase {\n    clearBufferfv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLfloat>, srcOffset?: GLuint): void;\n    clearBufferiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLint>, srcOffset?: GLuint): void;\n    clearBufferuiv(buffer: GLenum, drawbuffer: GLint, values: Iterable<GLuint>, srcOffset?: GLuint): void;\n    drawBuffers(buffers: Iterable<GLenum>): void;\n    getActiveUniforms(program: WebGLProgram, uniformIndices: Iterable<GLuint>, pname: GLenum): any;\n    getUniformIndices(program: WebGLProgram, uniformNames: Iterable<string>): Iterable<GLuint> | null;\n    invalidateFramebuffer(target: GLenum, attachments: Iterable<GLenum>): void;\n    invalidateSubFramebuffer(target: GLenum, attachments: Iterable<GLenum>, x: GLint, y: GLint, width: GLsizei, height: GLsizei): void;\n    transformFeedbackVaryings(program: WebGLProgram, varyings: Iterable<string>, bufferMode: GLenum): void;\n    uniform1uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform2uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform3uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform4uiv(location: WebGLUniformLocation | null, data: Iterable<GLuint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix2x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix2x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix3x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix3x4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix4x2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix4x3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    vertexAttribI4iv(index: GLuint, values: Iterable<GLint>): void;\n    vertexAttribI4uiv(index: GLuint, values: Iterable<GLuint>): void;\n}\n\ninterface WebGL2RenderingContextOverloads {\n    uniform1fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform1iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform2fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform2iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform3fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform3iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform4fv(location: WebGLUniformLocation | null, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniform4iv(location: WebGLUniformLocation | null, data: Iterable<GLint>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, data: Iterable<GLfloat>, srcOffset?: GLuint, srcLength?: GLuint): void;\n}\n\ninterface WebGLRenderingContextBase {\n    vertexAttrib1fv(index: GLuint, values: Iterable<GLfloat>): void;\n    vertexAttrib2fv(index: GLuint, values: Iterable<GLfloat>): void;\n    vertexAttrib3fv(index: GLuint, values: Iterable<GLfloat>): void;\n    vertexAttrib4fv(index: GLuint, values: Iterable<GLfloat>): void;\n}\n\ninterface WebGLRenderingContextOverloads {\n    uniform1fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform1iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniform2fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform2iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniform3fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform3iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniform4fv(location: WebGLUniformLocation | null, v: Iterable<GLfloat>): void;\n    uniform4iv(location: WebGLUniformLocation | null, v: Iterable<GLint>): void;\n    uniformMatrix2fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;\n    uniformMatrix3fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;\n    uniformMatrix4fv(location: WebGLUniformLocation | null, transpose: GLboolean, value: Iterable<GLfloat>): void;\n}\n';

  // src/language/typescript/tsWorker.ts
  function fileNameIsLib(resource) {
    if (typeof resource === "string") {
      if (/^file:\/\/\//.test(resource)) {
        return !!libFileMap[resource.substr(8)];
      }
      return false;
    }
    if (resource.path.indexOf("/lib.") === 0) {
      return !!libFileMap[resource.path.slice(1)];
    }
    return false;
  }
  var TypeScriptWorker = class {
    _ctx;
    _extraLibs = /* @__PURE__ */ Object.create(null);
    _languageService = createLanguageService(this);
    _compilerOptions;
    _inlayHintsOptions;
    constructor(ctx, createData) {
      this._ctx = ctx;
      this._compilerOptions = createData.compilerOptions;
      this._extraLibs = createData.extraLibs;
      this._inlayHintsOptions = createData.inlayHintsOptions;
    }
    getCompilationSettings() {
      return this._compilerOptions;
    }
    getLanguageService() {
      return this._languageService;
    }
    getExtraLibs() {
      return this._extraLibs;
    }
    getScriptFileNames() {
      const allModels = this._ctx.getMirrorModels().map((model) => model.uri);
      const models = allModels.filter((uri) => !fileNameIsLib(uri)).map((uri) => uri.toString());
      return models.concat(Object.keys(this._extraLibs));
    }
    _getModel(fileName) {
      let models = this._ctx.getMirrorModels();
      for (let i = 0; i < models.length; i++) {
        if (models[i].uri.toString() === fileName) {
          return models[i];
        }
      }
      return null;
    }
    getScriptVersion(fileName) {
      let model = this._getModel(fileName);
      if (model) {
        return model.version.toString();
      } else if (this.isDefaultLibFileName(fileName)) {
        return "1";
      } else if (fileName in this._extraLibs) {
        return String(this._extraLibs[fileName].version);
      }
      return "";
    }
    async getScriptText(fileName) {
      return this._getScriptText(fileName);
    }
    _getScriptText(fileName) {
      let text;
      let model = this._getModel(fileName);
      const libizedFileName = "lib." + fileName + ".d.ts";
      if (model) {
        text = model.getValue();
      } else if (fileName in libFileMap) {
        text = libFileMap[fileName];
      } else if (libizedFileName in libFileMap) {
        text = libFileMap[libizedFileName];
      } else if (fileName in this._extraLibs) {
        text = this._extraLibs[fileName].content;
      } else {
        return;
      }
      return text;
    }
    getScriptSnapshot(fileName) {
      const text = this._getScriptText(fileName);
      if (text === void 0) {
        return;
      }
      return {
        getText: (start, end) => text.substring(start, end),
        getLength: () => text.length,
        getChangeRange: () => void 0
      };
    }
    getScriptKind(fileName) {
      const suffix = fileName.substr(fileName.lastIndexOf(".") + 1);
      switch (suffix) {
        case "ts":
          return ScriptKind.TS;
        case "tsx":
          return ScriptKind.TSX;
        case "js":
          return ScriptKind.JS;
        case "jsx":
          return ScriptKind.JSX;
        default:
          return this.getCompilationSettings().allowJs ? ScriptKind.JS : ScriptKind.TS;
      }
    }
    getCurrentDirectory() {
      return "";
    }
    getDefaultLibFileName(options) {
      switch (options.target) {
        case 99:
          const esnext = "lib.esnext.full.d.ts";
          if (esnext in libFileMap || esnext in this._extraLibs)
            return esnext;
        case 7:
        case 6:
        case 5:
        case 4:
        case 3:
        case 2:
        default:
          const eslib = `lib.es${2013 + (options.target || 99)}.full.d.ts`;
          if (eslib in libFileMap || eslib in this._extraLibs) {
            return eslib;
          }
          return "lib.es6.d.ts";
        case 1:
        case 0:
          return "lib.d.ts";
      }
    }
    isDefaultLibFileName(fileName) {
      return fileName === this.getDefaultLibFileName(this._compilerOptions);
    }
    async getLibFiles() {
      return libFileMap;
    }
    static clearFiles(tsDiagnostics) {
      const diagnostics = [];
      for (const tsDiagnostic of tsDiagnostics) {
        const diagnostic = { ...tsDiagnostic };
        diagnostic.file = diagnostic.file ? { fileName: diagnostic.file.fileName } : void 0;
        if (tsDiagnostic.relatedInformation) {
          diagnostic.relatedInformation = [];
          for (const tsRelatedDiagnostic of tsDiagnostic.relatedInformation) {
            const relatedDiagnostic = { ...tsRelatedDiagnostic };
            relatedDiagnostic.file = relatedDiagnostic.file ? { fileName: relatedDiagnostic.file.fileName } : void 0;
            diagnostic.relatedInformation.push(relatedDiagnostic);
          }
        }
        diagnostics.push(diagnostic);
      }
      return diagnostics;
    }
    async getSyntacticDiagnostics(fileName) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      const diagnostics = this._languageService.getSyntacticDiagnostics(fileName);
      return TypeScriptWorker.clearFiles(diagnostics);
    }
    async getSemanticDiagnostics(fileName) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      const diagnostics = this._languageService.getSemanticDiagnostics(fileName);
      return TypeScriptWorker.clearFiles(diagnostics);
    }
    async getSuggestionDiagnostics(fileName) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      const diagnostics = this._languageService.getSuggestionDiagnostics(fileName);
      return TypeScriptWorker.clearFiles(diagnostics);
    }
    async getCompilerOptionsDiagnostics(fileName) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      const diagnostics = this._languageService.getCompilerOptionsDiagnostics();
      return TypeScriptWorker.clearFiles(diagnostics);
    }
    async getCompletionsAtPosition(fileName, position) {
      if (fileNameIsLib(fileName)) {
        return void 0;
      }
      return this._languageService.getCompletionsAtPosition(fileName, position, void 0);
    }
    async getCompletionEntryDetails(fileName, position, entry) {
      return this._languageService.getCompletionEntryDetails(fileName, position, entry, void 0, void 0, void 0, void 0);
    }
    async getSignatureHelpItems(fileName, position, options) {
      if (fileNameIsLib(fileName)) {
        return void 0;
      }
      return this._languageService.getSignatureHelpItems(fileName, position, options);
    }
    async getQuickInfoAtPosition(fileName, position) {
      if (fileNameIsLib(fileName)) {
        return void 0;
      }
      return this._languageService.getQuickInfoAtPosition(fileName, position);
    }
    async getOccurrencesAtPosition(fileName, position) {
      if (fileNameIsLib(fileName)) {
        return void 0;
      }
      return this._languageService.getOccurrencesAtPosition(fileName, position);
    }
    async getDefinitionAtPosition(fileName, position) {
      if (fileNameIsLib(fileName)) {
        return void 0;
      }
      return this._languageService.getDefinitionAtPosition(fileName, position);
    }
    async getReferencesAtPosition(fileName, position) {
      if (fileNameIsLib(fileName)) {
        return void 0;
      }
      return this._languageService.getReferencesAtPosition(fileName, position);
    }
    async getNavigationBarItems(fileName) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      return this._languageService.getNavigationBarItems(fileName);
    }
    async getFormattingEditsForDocument(fileName, options) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      return this._languageService.getFormattingEditsForDocument(fileName, options);
    }
    async getFormattingEditsForRange(fileName, start, end, options) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      return this._languageService.getFormattingEditsForRange(fileName, start, end, options);
    }
    async getFormattingEditsAfterKeystroke(fileName, postion, ch, options) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      return this._languageService.getFormattingEditsAfterKeystroke(fileName, postion, ch, options);
    }
    async findRenameLocations(fileName, position, findInStrings, findInComments, providePrefixAndSuffixTextForRename) {
      if (fileNameIsLib(fileName)) {
        return void 0;
      }
      return this._languageService.findRenameLocations(fileName, position, findInStrings, findInComments, providePrefixAndSuffixTextForRename);
    }
    async getRenameInfo(fileName, position, options) {
      if (fileNameIsLib(fileName)) {
        return { canRename: false, localizedErrorMessage: "Cannot rename in lib file" };
      }
      return this._languageService.getRenameInfo(fileName, position, options);
    }
    async getEmitOutput(fileName) {
      if (fileNameIsLib(fileName)) {
        return { outputFiles: [], emitSkipped: true };
      }
      return this._languageService.getEmitOutput(fileName);
    }
    async getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      const preferences = {};
      try {
        return this._languageService.getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
      } catch {
        return [];
      }
    }
    async updateExtraLibs(extraLibs) {
      this._extraLibs = extraLibs;
    }
    async provideInlayHints(fileName, start, end) {
      if (fileNameIsLib(fileName)) {
        return [];
      }
      const preferences = this._inlayHintsOptions ?? {};
      const span = {
        start,
        length: end - start
      };
      try {
        return this._languageService.provideInlayHints(fileName, span, preferences);
      } catch {
        return [];
      }
    }
  };
  function create(ctx, createData) {
    let TSWorkerClass = TypeScriptWorker;
    if (createData.customWorkerPath) {
      if (typeof importScripts === "undefined") {
        console.warn("Monaco is not using webworkers for background tasks, and that is needed to support the customWorkerPath flag");
      } else {
        importScripts(createData.customWorkerPath);
        const workerFactoryFunc = self.customTSWorkerFactory;
        if (!workerFactoryFunc) {
          throw new Error(`The script at ${createData.customWorkerPath} does not add customTSWorkerFactory to self`);
        }
        TSWorkerClass = workerFactoryFunc(TypeScriptWorker, typescriptServices_exports, libFileMap);
      }
    }
    return new TSWorkerClass(ctx, createData);
  }
  globalThis.ts = typescript;
  return __toCommonJS(tsWorker_exports);
})();
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0

THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.

See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
return moduleExports;
});
