+/**
+ * @param {string} text
+ * @param {number} index
+ * @returns {boolean}
+ */
+
+
+function isNextLineEmptyAfterIndex(text, index) {
+ /** @type {number | false} */
+ let oldIdx = null;
+ /** @type {number | false} */
+
+ let idx = index;
+
+ while (idx !== oldIdx) {
+ // We need to skip all the potential trailing inline comments
+ oldIdx = idx;
+ idx = skipToLineEnd(text, idx);
+ idx = skipInlineComment(text, idx);
+ idx = skipSpaces(text, idx);
+ }
+
+ idx = skipTrailingComment(text, idx);
+ idx = skipNewline(text, idx);
+ return idx !== false && hasNewline(text, idx);
+}
+/**
+ * @template N
+ * @param {string} text
+ * @param {N} node
+ * @param {(node: N) => number} locEnd
+ * @returns {boolean}
+ */
+
+
+function isNextLineEmpty(text, node, locEnd) {
+ return isNextLineEmptyAfterIndex(text, locEnd(node));
+}
+/**
+ * @param {string} text
+ * @param {number} idx
+ * @returns {number | false}
+ */
+
+
+function getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, idx) {
+ /** @type {number | false} */
+ let oldIdx = null;
+ /** @type {number | false} */
+
+ let nextIdx = idx;
+
+ while (nextIdx !== oldIdx) {
+ oldIdx = nextIdx;
+ nextIdx = skipSpaces(text, nextIdx);
+ nextIdx = skipInlineComment(text, nextIdx);
+ nextIdx = skipTrailingComment(text, nextIdx);
+ nextIdx = skipNewline(text, nextIdx);
+ }
+
+ return nextIdx;
+}
+/**
+ * @template N
+ * @param {string} text
+ * @param {N} node
+ * @param {(node: N) => number} locEnd
+ * @returns {number | false}
+ */
+
+
+function getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd) {
+ return getNextNonSpaceNonCommentCharacterIndexWithStartIndex(text, locEnd(node));
+}
+/**
+ * @template N
+ * @param {string} text
+ * @param {N} node
+ * @param {(node: N) => number} locEnd
+ * @returns {string}
+ */
+
+
+function getNextNonSpaceNonCommentCharacter(text, node, locEnd) {
+ return text.charAt( // @ts-ignore => TBD: can return false, should we define a fallback?
+ getNextNonSpaceNonCommentCharacterIndex(text, node, locEnd));
+} // Not using, but it's public utils
+
+/* istanbul ignore next */
+
+/**
+ * @param {string} text
+ * @param {number} index
+ * @param {SkipOptions=} opts
+ * @returns {boolean}
+ */
+
+
+function hasSpaces(text, index, opts) {
+ opts = opts || {};
+ const idx = skipSpaces(text, opts.backwards ? index - 1 : index, opts);
+ return idx !== index;
+}
+/**
+ * @param {string} value
+ * @param {number} tabWidth
+ * @param {number=} startIndex
+ * @returns {number}
+ */
+
+
+function getAlignmentSize(value, tabWidth, startIndex) {
+ startIndex = startIndex || 0;
+ let size = 0;
+
+ for (let i = startIndex; i < value.length; ++i) {
+ if (value[i] === "\t") {
+ // Tabs behave in a way that they are aligned to the nearest
+ // multiple of tabWidth:
+ // 0 -> 4, 1 -> 4, 2 -> 4, 3 -> 4
+ // 4 -> 8, 5 -> 8, 6 -> 8, 7 -> 8 ...
+ size = size + tabWidth - size % tabWidth;
+ } else {
+ size++;
+ }
+ }
+
+ return size;
+}
+/**
+ * @param {string} value
+ * @param {number} tabWidth
+ * @returns {number}
+ */
+
+
+function getIndentSize(value, tabWidth) {
+ const lastNewlineIndex = value.lastIndexOf("\n");
+
+ if (lastNewlineIndex === -1) {
+ return 0;
+ }
+
+ return getAlignmentSize( // All the leading whitespaces
+ value.slice(lastNewlineIndex + 1).match(/^[\t ]*/)[0], tabWidth);
+}
+/**
+ * @typedef {'"' | "'"} Quote
+ */
+
+/**
+ *
+ * @param {string} raw
+ * @param {Quote} preferredQuote
+ * @returns {Quote}
+ */
+
+
+function getPreferredQuote(raw, preferredQuote) {
+ // `rawContent` is the string exactly like it appeared in the input source
+ // code, without its enclosing quotes.
+ const rawContent = raw.slice(1, -1);
+ /** @type {{ quote: '"', regex: RegExp }} */
+
+ const double = {
+ quote: '"',
+ regex: /"/g
+ };
+ /** @type {{ quote: "'", regex: RegExp }} */
+
+ const single = {
+ quote: "'",
+ regex: /'/g
+ };
+ const preferred = preferredQuote === "'" ? single : double;
+ const alternate = preferred === single ? double : single;
+ let result = preferred.quote; // If `rawContent` contains at least one of the quote preferred for enclosing
+ // the string, we might want to enclose with the alternate quote instead, to
+ // minimize the number of escaped quotes.
+
+ if (rawContent.includes(preferred.quote) || rawContent.includes(alternate.quote)) {
+ const numPreferredQuotes = (rawContent.match(preferred.regex) || []).length;
+ const numAlternateQuotes = (rawContent.match(alternate.regex) || []).length;
+ result = numPreferredQuotes > numAlternateQuotes ? alternate.quote : preferred.quote;
+ }
+
+ return result;
+}
+
+function printString(raw, options, isDirectiveLiteral) {
+ // `rawContent` is the string exactly like it appeared in the input source
+ // code, without its enclosing quotes.
+ const rawContent = raw.slice(1, -1); // Check for the alternate quote, to determine if we're allowed to swap
+ // the quotes on a DirectiveLiteral.
+
+ const canChangeDirectiveQuotes = !rawContent.includes('"') && !rawContent.includes("'");
+ /** @type {Quote} */
+
+ const enclosingQuote = options.parser === "json" ? '"' : options.__isInHtmlAttribute ? "'" : getPreferredQuote(raw, options.singleQuote ? "'" : '"'); // Directives are exact code unit sequences, which means that you can't
+ // change the escape sequences they use.
+ // See https://github.com/prettier/prettier/issues/1555
+ // and https://tc39.github.io/ecma262/#directive-prologue
+
+ if (isDirectiveLiteral) {
+ if (canChangeDirectiveQuotes) {
+ return enclosingQuote + rawContent + enclosingQuote;
+ }
+
+ return raw;
+ } // It might sound unnecessary to use `makeString` even if the string already
+ // is enclosed with `enclosingQuote`, but it isn't. The string could contain
+ // unnecessary escapes (such as in `"\'"`). Always using `makeString` makes
+ // sure that we consistently output the minimum amount of escaped quotes.
+
+
+ return makeString(rawContent, enclosingQuote, !(options.parser === "css" || options.parser === "less" || options.parser === "scss" || options.embeddedInHtml));
+}
+/**
+ * @param {string} rawContent
+ * @param {Quote} enclosingQuote
+ * @param {boolean=} unescapeUnnecessaryEscapes
+ * @returns {string}
+ */
+
+
+function makeString(rawContent, enclosingQuote, unescapeUnnecessaryEscapes) {
+ const otherQuote = enclosingQuote === '"' ? "'" : '"'; // Matches _any_ escape and unescaped quotes (both single and double).
+
+ const regex = /\\([\S\s])|(["'])/g; // Escape and unescape single and double quotes as needed to be able to
+ // enclose `rawContent` with `enclosingQuote`.
+
+ const newContent = rawContent.replace(regex, (match, escaped, quote) => {
+ // If we matched an escape, and the escaped character is a quote of the
+ // other type than we intend to enclose the string with, there's no need for
+ // it to be escaped, so return it _without_ the backslash.
+ if (escaped === otherQuote) {
+ return escaped;
+ } // If we matched an unescaped quote and it is of the _same_ type as we
+ // intend to enclose the string with, it must be escaped, so return it with
+ // a backslash.
+
+
+ if (quote === enclosingQuote) {
+ return "\\" + quote;
+ }
+
+ if (quote) {
+ return quote;
+ } // Unescape any unnecessarily escaped character.
+ // Adapted from https://github.com/eslint/eslint/blob/de0b4ad7bd820ade41b1f606008bea68683dc11a/lib/rules/no-useless-escape.js#L27
+
+
+ return unescapeUnnecessaryEscapes && /^[^\n\r"'0-7\\bfnrt-vx\u2028\u2029]$/.test(escaped) ? escaped : "\\" + escaped;
+ });
+ return enclosingQuote + newContent + enclosingQuote;
+}
+
+function printNumber(rawNumber) {
+ return rawNumber.toLowerCase() // Remove unnecessary plus and zeroes from scientific notation.
+ .replace(/^([+-]?[\d.]+e)(?:\+|(-))?0*(\d)/, "$1$2$3") // Remove unnecessary scientific notation (1e0).
+ .replace(/^([+-]?[\d.]+)e[+-]?0+$/, "$1") // Make sure numbers always start with a digit.
+ .replace(/^([+-])?\./, "$10.") // Remove extraneous trailing decimal zeroes.
+ .replace(/(\.\d+?)0+(?=e|$)/, "$1") // Remove trailing dot.
+ .replace(/\.(?=e|$)/, "");
+}
+/**
+ * @param {string} str
+ * @param {string} target
+ * @returns {number}
+ */
+
+
+function getMaxContinuousCount(str, target) {
+ const results = str.match(new RegExp(`(${escapeStringRegexp(target)})+`, "g"));
+
+ if (results === null) {
+ return 0;
+ }
+
+ return results.reduce((maxCount, result) => Math.max(maxCount, result.length / target.length), 0);
+}
+
+function getMinNotPresentContinuousCount(str, target) {
+ const matches = str.match(new RegExp(`(${escapeStringRegexp(target)})+`, "g"));
+
+ if (matches === null) {
+ return 0;
+ }
+
+ const countPresent = new Map();
+ let max = 0;
+
+ for (const match of matches) {
+ const count = match.length / target.length;
+ countPresent.set(count, true);
+
+ if (count > max) {
+ max = count;
+ }
+ }
+
+ for (let i = 1; i < max; i++) {
+ if (!countPresent.get(i)) {
+ return i;
+ }
+ }
+
+ return max + 1;
+}
+/**
+ * @param {string} text
+ * @returns {number}
+ */
+
+
+function getStringWidth(text) {
+ if (!text) {
+ return 0;
+ } // shortcut to avoid needless string `RegExp`s, replacements, and allocations within `string-width`
+
+
+ if (!notAsciiRegex.test(text)) {
+ return text.length;
+ }
+
+ return stringWidth_1(text);
+}
+
+function isNodeIgnoreComment(comment) {
+ return comment.value.trim() === "prettier-ignore";
+}
+
+function addCommentHelper(node, comment) {
+ const comments = node.comments || (node.comments = []);
+ comments.push(comment);
+ comment.printed = false; // For some reason, TypeScript parses `// x` inside of JSXText as a comment
+ // We already "print" it via the raw text, we don't need to re-print it as a
+ // comment
+
+ /* istanbul ignore next */
+
+ if (node.type === "JSXText") {
+ comment.printed = true;
+ }
+}
+
+function addLeadingComment(node, comment) {
+ comment.leading = true;
+ comment.trailing = false;
+ addCommentHelper(node, comment);
+}
+
+function addDanglingComment(node, comment, marker) {
+ comment.leading = false;
+ comment.trailing = false;
+
+ if (marker) {
+ comment.marker = marker;
+ }
+
+ addCommentHelper(node, comment);
+}
+
+function addTrailingComment(node, comment) {
+ comment.leading = false;
+ comment.trailing = true;
+ addCommentHelper(node, comment);
+}
+
+function replaceEndOfLineWith(text, replacement) {
+ const parts = [];
+
+ for (const part of text.split("\n")) {
+ if (parts.length !== 0) {
+ parts.push(replacement);
+ }
+
+ parts.push(part);
+ }
+
+ return parts;
+}
+
+function inferParserByLanguage(language, options) {
+ const {
+ languages
+ } = getSupportInfo$1({
+ plugins: options.plugins
+ });
+ const matched = languages.find(({
+ name
+ }) => name.toLowerCase() === language) || languages.find(({
+ aliases
+ }) => Array.isArray(aliases) && aliases.includes(language)) || languages.find(({
+ extensions
+ }) => Array.isArray(extensions) && extensions.includes(`.${language}`));
+ return matched && matched.parsers[0];
+}
+
+function isFrontMatterNode(node) {
+ return node && node.type === "front-matter";
+}
+
+function getShebang(text) {
+ if (!text.startsWith("#!")) {
+ return "";
+ }
+
+ const index = text.indexOf("\n");
+
+ if (index === -1) {
+ return text;
+ }
+
+ return text.slice(0, index);
+}
+
+var util = {
+ inferParserByLanguage,
+ replaceEndOfLineWith,
+ getStringWidth,
+ getMaxContinuousCount,
+ getMinNotPresentContinuousCount,
+ getPenultimate,
+ getLast,
+ getNextNonSpaceNonCommentCharacterIndexWithStartIndex,
+ getNextNonSpaceNonCommentCharacterIndex,
+ getNextNonSpaceNonCommentCharacter,
+ skip,
+ skipWhitespace,
+ skipSpaces,
+ skipToLineEnd,
+ skipEverythingButNewLine,
+ skipInlineComment,
+ skipTrailingComment,
+ skipNewline,
+ isNextLineEmptyAfterIndex,
+ isNextLineEmpty,
+ isPreviousLineEmpty,
+ hasNewline,
+ hasNewlineInRange,
+ hasSpaces,
+ getAlignmentSize,
+ getIndentSize,
+ getPreferredQuote,
+ printString,
+ printNumber,
+ isNodeIgnoreComment,
+ makeString,
+ addLeadingComment,
+ addDanglingComment,
+ addTrailingComment,
+ isFrontMatterNode,
+ getShebang
+};
+
+function guessEndOfLine(text) {
+ const index = text.indexOf("\r");
+
+ if (index >= 0) {
+ return text.charAt(index + 1) === "\n" ? "crlf" : "cr";
+ }
+
+ return "lf";
+}
+
+function convertEndOfLineToChars(value) {
+ switch (value) {
+ case "cr":
+ return "\r";
+
+ case "crlf":
+ return "\r\n";
+
+ default:
+ return "\n";
+ }
+}
+
+function countEndOfLineChars(text, eol) {
+ let regex;
+ /* istanbul ignore else */
+
+ if (eol === "\n") {
+ regex = /\n/g;
+ } else if (eol === "\r") {
+ regex = /\r/g;
+ } else if (eol === "\r\n") {
+ regex = /\r\n/g;
+ } else {
+ throw new Error(`Unexpected "eol" ${JSON.stringify(eol)}.`);
+ }
+
+ const endOfLines = text.match(regex);
+ return endOfLines ? endOfLines.length : 0;
+}
+
+function normalizeEndOfLine(text) {
+ return text.replace(/\r\n?/g, "\n");
+}
+
+var endOfLine = {
+ guessEndOfLine,
+ convertEndOfLineToChars,
+ countEndOfLineChars,
+ normalizeEndOfLine
+};
+
+const {
+ getStringWidth: getStringWidth$1
+} = util;
+const {
+ convertEndOfLineToChars: convertEndOfLineToChars$1
+} = endOfLine;
+const {
+ concat: concat$1,
+ fill: fill$1,
+ cursor: cursor$1
+} = docBuilders;
+/** @type {Record<symbol, typeof MODE_BREAK | typeof MODE_FLAT>} */
+
+let groupModeMap;
+const MODE_BREAK = 1;
+const MODE_FLAT = 2;
+
+function rootIndent() {
+ return {
+ value: "",
+ length: 0,
+ queue: []
+ };
+}
+
+function makeIndent(ind, options) {
+ return generateInd(ind, {
+ type: "indent"
+ }, options);
+}
+
+function makeAlign(indent, n, options) {
+ if (n === -Infinity) {
+ return indent.root || rootIndent();
+ }
+
+ if (n < 0) {
+ return generateInd(indent, {
+ type: "dedent"
+ }, options);
+ }
+
+ if (!n) {
+ return indent;
+ }
+
+ if (n.type === "root") {
+ return Object.assign({}, indent, {
+ root: indent
+ });
+ }
+
+ const alignType = typeof n === "string" ? "stringAlign" : "numberAlign";
+ return generateInd(indent, {
+ type: alignType,
+ n
+ }, options);
+}
+
+function generateInd(ind, newPart, options) {
+ const queue = newPart.type === "dedent" ? ind.queue.slice(0, -1) : ind.queue.concat(newPart);
+ let value = "";
+ let length = 0;
+ let lastTabs = 0;
+ let lastSpaces = 0;
+
+ for (const part of queue) {
+ switch (part.type) {
+ case "indent":
+ flush();
+
+ if (options.useTabs) {
+ addTabs(1);
+ } else {
+ addSpaces(options.tabWidth);
+ }
+
+ break;
+
+ case "stringAlign":
+ flush();
+ value += part.n;
+ length += part.n.length;
+ break;
+
+ case "numberAlign":
+ lastTabs += 1;
+ lastSpaces += part.n;
+ break;
+
+ /* istanbul ignore next */
+
+ default:
+ throw new Error(`Unexpected type '${part.type}'`);
+ }
+ }
+
+ flushSpaces();
+ return Object.assign({}, ind, {
+ value,
+ length,
+ queue
+ });
+
+ function addTabs(count) {
+ value += "\t".repeat(count);
+ length += options.tabWidth * count;
+ }
+
+ function addSpaces(count) {
+ value += " ".repeat(count);
+ length += count;
+ }
+
+ function flush() {
+ if (options.useTabs) {
+ flushTabs();
+ } else {
+ flushSpaces();
+ }
+ }
+
+ function flushTabs() {
+ if (lastTabs > 0) {
+ addTabs(lastTabs);
+ }
+
+ resetLast();
+ }
+
+ function flushSpaces() {
+ if (lastSpaces > 0) {
+ addSpaces(lastSpaces);
+ }
+
+ resetLast();
+ }
+
+ function resetLast() {
+ lastTabs = 0;
+ lastSpaces = 0;
+ }
+}
+
+function trim$1(out) {
+ if (out.length === 0) {
+ return 0;
+ }
+
+ let trimCount = 0; // Trim whitespace at the end of line
+
+ while (out.length > 0 && typeof out[out.length - 1] === "string" && out[out.length - 1].match(/^[\t ]*$/)) {
+ trimCount += out.pop().length;
+ }
+
+ if (out.length && typeof out[out.length - 1] === "string") {
+ const trimmed = out[out.length - 1].replace(/[\t ]*$/, "");
+ trimCount += out[out.length - 1].length - trimmed.length;
+ out[out.length - 1] = trimmed;
+ }
+
+ return trimCount;
+}
+
+function fits(next, restCommands, width, options, mustBeFlat) {
+ let restIdx = restCommands.length;
+ const cmds = [next]; // `out` is only used for width counting because `trim` requires to look
+ // backwards for space characters.
+
+ const out = [];
+
+ while (width >= 0) {
+ if (cmds.length === 0) {
+ if (restIdx === 0) {
+ return true;
+ }
+
+ cmds.push(restCommands[restIdx - 1]);
+ restIdx--;
+ continue;
+ }
+
+ const [ind, mode, doc] = cmds.pop();
+
+ if (typeof doc === "string") {
+ out.push(doc);
+ width -= getStringWidth$1(doc);
+ } else {
+ switch (doc.type) {
+ case "concat":
+ for (let i = doc.parts.length - 1; i >= 0; i--) {
+ cmds.push([ind, mode, doc.parts[i]]);
+ }
+
+ break;
+
+ case "indent":
+ cmds.push([makeIndent(ind, options), mode, doc.contents]);
+ break;
+
+ case "align":
+ cmds.push([makeAlign(ind, doc.n, options), mode, doc.contents]);
+ break;
+
+ case "trim":
+ width += trim$1(out);
+ break;
+
+ case "group":
+ if (mustBeFlat && doc.break) {
+ return false;
+ }
+
+ cmds.push([ind, doc.break ? MODE_BREAK : mode, doc.contents]);
+
+ if (doc.id) {
+ groupModeMap[doc.id] = cmds[cmds.length - 1][1];
+ }
+
+ break;
+
+ case "fill":
+ for (let i = doc.parts.length - 1; i >= 0; i--) {
+ cmds.push([ind, mode, doc.parts[i]]);
+ }
+
+ break;
+
+ case "if-break":
+ {
+ const groupMode = doc.groupId ? groupModeMap[doc.groupId] : mode;
+
+ if (groupMode === MODE_BREAK) {
+ if (doc.breakContents) {
+ cmds.push([ind, mode, doc.breakContents]);
+ }
+ }
+
+ if (groupMode === MODE_FLAT) {
+ if (doc.flatContents) {
+ cmds.push([ind, mode, doc.flatContents]);
+ }
+ }
+
+ break;
+ }
+
+ case "line":
+ switch (mode) {
+ // fallthrough
+ case MODE_FLAT:
+ if (!doc.hard) {
+ if (!doc.soft) {
+ out.push(" ");
+ width -= 1;
+ }
+
+ break;
+ }
+
+ return true;
+
+ case MODE_BREAK:
+ return true;
+ }
+
+ break;
+ }
+ }
+ }
+
+ return false;
+}
+
+function printDocToString(doc, options) {
+ groupModeMap = {};
+ const width = options.printWidth;
+ const newLine = convertEndOfLineToChars$1(options.endOfLine);
+ let pos = 0; // cmds is basically a stack. We've turned a recursive call into a
+ // while loop which is much faster. The while loop below adds new
+ // cmds to the array instead of recursively calling `print`.
+
+ const cmds = [[rootIndent(), MODE_BREAK, doc]];
+ const out = [];
+ let shouldRemeasure = false;
+ let lineSuffix = [];
+
+ while (cmds.length !== 0) {
+ const [ind, mode, doc] = cmds.pop();
+
+ if (typeof doc === "string") {
+ const formatted = newLine !== "\n" && doc.includes("\n") ? doc.replace(/\n/g, newLine) : doc;
+ out.push(formatted);
+ pos += getStringWidth$1(formatted);
+ } else {
+ switch (doc.type) {
+ case "cursor":
+ out.push(cursor$1.placeholder);
+ break;
+
+ case "concat":
+ for (let i = doc.parts.length - 1; i >= 0; i--) {
+ cmds.push([ind, mode, doc.parts[i]]);
+ }
+
+ break;
+
+ case "indent":
+ cmds.push([makeIndent(ind, options), mode, doc.contents]);
+ break;
+
+ case "align":
+ cmds.push([makeAlign(ind, doc.n, options), mode, doc.contents]);
+ break;
+
+ case "trim":
+ pos -= trim$1(out);
+ break;
+
+ case "group":
+ switch (mode) {
+ case MODE_FLAT:
+ if (!shouldRemeasure) {
+ cmds.push([ind, doc.break ? MODE_BREAK : MODE_FLAT, doc.contents]);
+ break;
+ }
+
+ // fallthrough
+
+ case MODE_BREAK:
+ {
+ shouldRemeasure = false;
+ const next = [ind, MODE_FLAT, doc.contents];
+ const rem = width - pos;
+
+ if (!doc.break && fits(next, cmds, rem, options)) {
+ cmds.push(next);
+ } else {
+ // Expanded states are a rare case where a document
+ // can manually provide multiple representations of
+ // itself. It provides an array of documents
+ // going from the least expanded (most flattened)
+ // representation first to the most expanded. If a
+ // group has these, we need to manually go through
+ // these states and find the first one that fits.
+ if (doc.expandedStates) {
+ const mostExpanded = doc.expandedStates[doc.expandedStates.length - 1];
+
+ if (doc.break) {
+ cmds.push([ind, MODE_BREAK, mostExpanded]);
+ break;
+ } else {
+ for (let i = 1; i < doc.expandedStates.length + 1; i++) {
+ if (i >= doc.expandedStates.length) {
+ cmds.push([ind, MODE_BREAK, mostExpanded]);
+ break;
+ } else {
+ const state = doc.expandedStates[i];
+ const cmd = [ind, MODE_FLAT, state];
+
+ if (fits(cmd, cmds, rem, options)) {
+ cmds.push(cmd);
+ break;
+ }
+ }
+ }
+ }
+ } else {
+ cmds.push([ind, MODE_BREAK, doc.contents]);
+ }
+ }
+
+ break;
+ }
+ }
+
+ if (doc.id) {
+ groupModeMap[doc.id] = cmds[cmds.length - 1][1];
+ }
+
+ break;
+ // Fills each line with as much code as possible before moving to a new
+ // line with the same indentation.
+ //
+ // Expects doc.parts to be an array of alternating content and
+ // whitespace. The whitespace contains the linebreaks.
+ //
+ // For example:
+ // ["I", line, "love", line, "monkeys"]
+ // or
+ // [{ type: group, ... }, softline, { type: group, ... }]
+ //
+ // It uses this parts structure to handle three main layout cases:
+ // * The first two content items fit on the same line without
+ // breaking
+ // -> output the first content item and the whitespace "flat".
+ // * Only the first content item fits on the line without breaking
+ // -> output the first content item "flat" and the whitespace with
+ // "break".
+ // * Neither content item fits on the line without breaking
+ // -> output the first content item and the whitespace with "break".
+
+ case "fill":
+ {
+ const rem = width - pos;
+ const {
+ parts
+ } = doc;
+
+ if (parts.length === 0) {
+ break;
+ }
+
+ const [content, whitespace] = parts;
+ const contentFlatCmd = [ind, MODE_FLAT, content];
+ const contentBreakCmd = [ind, MODE_BREAK, content];
+ const contentFits = fits(contentFlatCmd, [], rem, options, true);
+
+ if (parts.length === 1) {
+ if (contentFits) {
+ cmds.push(contentFlatCmd);
+ } else {
+ cmds.push(contentBreakCmd);
+ }
+
+ break;
+ }
+
+ const whitespaceFlatCmd = [ind, MODE_FLAT, whitespace];
+ const whitespaceBreakCmd = [ind, MODE_BREAK, whitespace];
+
+ if (parts.length === 2) {
+ if (contentFits) {
+ cmds.push(whitespaceFlatCmd);
+ cmds.push(contentFlatCmd);
+ } else {
+ cmds.push(whitespaceBreakCmd);
+ cmds.push(contentBreakCmd);
+ }
+
+ break;
+ } // At this point we've handled the first pair (context, separator)
+ // and will create a new fill doc for the rest of the content.
+ // Ideally we wouldn't mutate the array here but copying all the
+ // elements to a new array would make this algorithm quadratic,
+ // which is unusable for large arrays (e.g. large texts in JSX).
+
+
+ parts.splice(0, 2);
+ const remainingCmd = [ind, mode, fill$1(parts)];
+ const secondContent = parts[0];
+ const firstAndSecondContentFlatCmd = [ind, MODE_FLAT, concat$1([content, whitespace, secondContent])];
+ const firstAndSecondContentFits = fits(firstAndSecondContentFlatCmd, [], rem, options, true);
+
+ if (firstAndSecondContentFits) {
+ cmds.push(remainingCmd);
+ cmds.push(whitespaceFlatCmd);
+ cmds.push(contentFlatCmd);
+ } else if (contentFits) {
+ cmds.push(remainingCmd);
+ cmds.push(whitespaceBreakCmd);
+ cmds.push(contentFlatCmd);
+ } else {
+ cmds.push(remainingCmd);
+ cmds.push(whitespaceBreakCmd);
+ cmds.push(contentBreakCmd);
+ }
+
+ break;
+ }
+
+ case "if-break":
+ {
+ const groupMode = doc.groupId ? groupModeMap[doc.groupId] : mode;
+
+ if (groupMode === MODE_BREAK) {
+ if (doc.breakContents) {
+ cmds.push([ind, mode, doc.breakContents]);
+ }
+ }
+
+ if (groupMode === MODE_FLAT) {
+ if (doc.flatContents) {
+ cmds.push([ind, mode, doc.flatContents]);
+ }
+ }
+
+ break;
+ }
+
+ case "line-suffix":
+ lineSuffix.push([ind, mode, doc.contents]);
+ break;
+
+ case "line-suffix-boundary":
+ if (lineSuffix.length > 0) {
+ cmds.push([ind, mode, {
+ type: "line",
+ hard: true
+ }]);
+ }
+
+ break;
+
+ case "line":
+ switch (mode) {
+ case MODE_FLAT:
+ if (!doc.hard) {
+ if (!doc.soft) {
+ out.push(" ");
+ pos += 1;
+ }
+
+ break;
+ } else {
+ // This line was forced into the output even if we
+ // were in flattened mode, so we need to tell the next
+ // group that no matter what, it needs to remeasure
+ // because the previous measurement didn't accurately
+ // capture the entire expression (this is necessary
+ // for nested groups)
+ shouldRemeasure = true;
+ }
+
+ // fallthrough
+
+ case MODE_BREAK:
+ if (lineSuffix.length) {
+ cmds.push([ind, mode, doc]);
+ cmds.push(...lineSuffix.reverse());
+ lineSuffix = [];
+ break;
+ }
+
+ if (doc.literal) {
+ if (ind.root) {
+ out.push(newLine, ind.root.value);
+ pos = ind.root.length;
+ } else {
+ out.push(newLine);
+ pos = 0;
+ }
+ } else {
+ pos -= trim$1(out);
+ out.push(newLine + ind.value);
+ pos = ind.length;
+ }
+
+ break;
+ }
+
+ break;
+ }
+ } // Flush remaining line-suffix contents at the end of the document, in case
+ // there is no new line after the line-suffix.
+
+
+ if (cmds.length === 0 && lineSuffix.length) {
+ cmds.push(...lineSuffix.reverse());
+ lineSuffix = [];
+ }
+ }
+
+ const cursorPlaceholderIndex = out.indexOf(cursor$1.placeholder);
+
+ if (cursorPlaceholderIndex !== -1) {
+ const otherCursorPlaceholderIndex = out.indexOf(cursor$1.placeholder, cursorPlaceholderIndex + 1);
+ const beforeCursor = out.slice(0, cursorPlaceholderIndex).join("");
+ const aroundCursor = out.slice(cursorPlaceholderIndex + 1, otherCursorPlaceholderIndex).join("");
+ const afterCursor = out.slice(otherCursorPlaceholderIndex + 1).join("");
+ return {
+ formatted: beforeCursor + aroundCursor + afterCursor,
+ cursorNodeStart: beforeCursor.length,
+ cursorNodeText: aroundCursor
+ };
+ }
+
+ return {
+ formatted: out.join("")
+ };
+}
+
+var docPrinter = {
+ printDocToString
+};
+
+const {
+ literalline: literalline$1,
+ concat: concat$2
+} = docBuilders; // Using a unique object to compare by reference.
+
+const traverseDocOnExitStackMarker = {};
+
+function traverseDoc(doc, onEnter, onExit, shouldTraverseConditionalGroups) {
+ const docsStack = [doc];
+
+ while (docsStack.length !== 0) {
+ const doc = docsStack.pop();
+
+ if (doc === traverseDocOnExitStackMarker) {
+ onExit(docsStack.pop());
+ continue;
+ }
+
+ if (onExit) {
+ docsStack.push(doc, traverseDocOnExitStackMarker);
+ }
+
+ if ( // Should Recurse
+ !onEnter || onEnter(doc) !== false) {
+ // When there are multiple parts to process,
+ // the parts need to be pushed onto the stack in reverse order,
+ // so that they are processed in the original order
+ // when the stack is popped.
+ if (doc.type === "concat" || doc.type === "fill") {
+ for (let ic = doc.parts.length, i = ic - 1; i >= 0; --i) {
+ docsStack.push(doc.parts[i]);
+ }
+ } else if (doc.type === "if-break") {
+ if (doc.flatContents) {
+ docsStack.push(doc.flatContents);
+ }
+
+ if (doc.breakContents) {
+ docsStack.push(doc.breakContents);
+ }
+ } else if (doc.type === "group" && doc.expandedStates) {
+ if (shouldTraverseConditionalGroups) {
+ for (let ic = doc.expandedStates.length, i = ic - 1; i >= 0; --i) {
+ docsStack.push(doc.expandedStates[i]);
+ }
+ } else {
+ docsStack.push(doc.contents);
+ }
+ } else if (doc.contents) {
+ docsStack.push(doc.contents);
+ }
+ }
+ }
+}
+
+function mapDoc(doc, cb) {
+ if (doc.type === "concat" || doc.type === "fill") {
+ const parts = doc.parts.map(part => mapDoc(part, cb));
+ return cb(Object.assign({}, doc, {
+ parts
+ }));
+ } else if (doc.type === "if-break") {
+ const breakContents = doc.breakContents && mapDoc(doc.breakContents, cb);
+ const flatContents = doc.flatContents && mapDoc(doc.flatContents, cb);
+ return cb(Object.assign({}, doc, {
+ breakContents,
+ flatContents
+ }));
+ } else if (doc.contents) {
+ const contents = mapDoc(doc.contents, cb);
+ return cb(Object.assign({}, doc, {
+ contents
+ }));
+ }
+
+ return cb(doc);
+}
+
+function findInDoc(doc, fn, defaultValue) {
+ let result = defaultValue;
+ let hasStopped = false;
+
+ function findInDocOnEnterFn(doc) {
+ const maybeResult = fn(doc);
+
+ if (maybeResult !== undefined) {
+ hasStopped = true;
+ result = maybeResult;
+ }
+
+ if (hasStopped) {
+ return false;
+ }
+ }
+
+ traverseDoc(doc, findInDocOnEnterFn);
+ return result;
+}
+
+function isEmpty(n) {
+ return typeof n === "string" && n.length === 0;
+}
+
+function isLineNextFn(doc) {
+ if (typeof doc === "string") {
+ return false;
+ }
+
+ if (doc.type === "line") {
+ return true;
+ }
+}
+
+function isLineNext(doc) {
+ return findInDoc(doc, isLineNextFn, false);
+}
+
+function willBreakFn(doc) {
+ if (doc.type === "group" && doc.break) {
+ return true;
+ }
+
+ if (doc.type === "line" && doc.hard) {
+ return true;
+ }
+
+ if (doc.type === "break-parent") {
+ return true;
+ }
+}
+
+function willBreak(doc) {
+ return findInDoc(doc, willBreakFn, false);
+}
+
+function breakParentGroup(groupStack) {
+ if (groupStack.length > 0) {
+ const parentGroup = groupStack[groupStack.length - 1]; // Breaks are not propagated through conditional groups because
+ // the user is expected to manually handle what breaks.
+
+ if (!parentGroup.expandedStates) {
+ parentGroup.break = true;
+ }
+ }
+
+ return null;
+}
+
+function propagateBreaks(doc) {
+ const alreadyVisitedSet = new Set();
+ const groupStack = [];
+
+ function propagateBreaksOnEnterFn(doc) {
+ if (doc.type === "break-parent") {
+ breakParentGroup(groupStack);
+ }
+
+ if (doc.type === "group") {
+ groupStack.push(doc);
+
+ if (alreadyVisitedSet.has(doc)) {
+ return false;
+ }
+
+ alreadyVisitedSet.add(doc);
+ }
+ }
+
+ function propagateBreaksOnExitFn(doc) {
+ if (doc.type === "group") {
+ const group = groupStack.pop();
+
+ if (group.break) {
+ breakParentGroup(groupStack);
+ }
+ }
+ }
+
+ traverseDoc(doc, propagateBreaksOnEnterFn, propagateBreaksOnExitFn,
+ /* shouldTraverseConditionalGroups */
+ true);
+}
+
+function removeLinesFn(doc) {
+ // Force this doc into flat mode by statically converting all
+ // lines into spaces (or soft lines into nothing). Hard lines
+ // should still output because there's too great of a chance
+ // of breaking existing assumptions otherwise.
+ if (doc.type === "line" && !doc.hard) {
+ return doc.soft ? "" : " ";
+ } else if (doc.type === "if-break") {
+ return doc.flatContents || "";
+ }
+
+ return doc;
+}
+
+function removeLines(doc) {
+ return mapDoc(doc, removeLinesFn);
+}
+
+function getInnerParts(doc) {
+ let {
+ parts
+ } = doc;
+ let lastPart; // Avoid a falsy element like ""
+
+ for (let i = doc.parts.length; i > 0 && !lastPart; i--) {
+ lastPart = parts[i - 1];
+ }
+
+ if (lastPart.type === "group") {
+ parts = lastPart.contents.parts;
+ }
+
+ return parts;
+}
+
+function stripTrailingHardline(doc, withInnerParts = false) {
+ // HACK remove ending hardline, original PR: #1984
+ if (doc.type === "concat" && doc.parts.length !== 0) {
+ const parts = withInnerParts ? getInnerParts(doc) : doc.parts;
+ const lastPart = parts[parts.length - 1];
+
+ if (lastPart.type === "concat") {
+ if (lastPart.parts.length === 2 && lastPart.parts[0].hard && lastPart.parts[1].type === "break-parent") {
+ return {
+ type: "concat",
+ parts: parts.slice(0, -1)
+ };
+ }
+
+ return {
+ type: "concat",
+ parts: doc.parts.slice(0, -1).concat(stripTrailingHardline(lastPart))
+ };
+ }
+ }
+
+ return doc;
+}
+
+function normalizeParts(parts) {
+ const newParts = [];
+ const restParts = parts.filter(Boolean);
+
+ while (restParts.length !== 0) {
+ const part = restParts.shift();
+
+ if (!part) {
+ continue;
+ }
+
+ if (part.type === "concat") {
+ restParts.unshift(...part.parts);
+ continue;
+ }
+
+ if (newParts.length !== 0 && typeof newParts[newParts.length - 1] === "string" && typeof part === "string") {
+ newParts[newParts.length - 1] += part;
+ continue;
+ }
+
+ newParts.push(part);
+ }
+
+ return newParts;
+}
+
+function normalizeDoc(doc) {
+ return mapDoc(doc, currentDoc => {
+ if (!currentDoc.parts) {
+ return currentDoc;
+ }
+
+ return Object.assign({}, currentDoc, {
+ parts: normalizeParts(currentDoc.parts)
+ });
+ });
+}
+
+function replaceNewlinesWithLiterallines(doc) {
+ return mapDoc(doc, currentDoc => typeof currentDoc === "string" && currentDoc.includes("\n") ? concat$2(currentDoc.split(/(\n)/g).map((v, i) => i % 2 === 0 ? v : literalline$1)) : currentDoc);
+}
+
+var docUtils = {
+ isEmpty,
+ willBreak,
+ isLineNext,
+ traverseDoc,
+ findInDoc,
+ mapDoc,
+ propagateBreaks,
+ removeLines,
+ stripTrailingHardline,
+ normalizeParts,
+ normalizeDoc,
+ replaceNewlinesWithLiterallines
+};
+
+function flattenDoc(doc) {
+ if (doc.type === "concat") {
+ const res = [];
+
+ for (let i = 0; i < doc.parts.length; ++i) {
+ const doc2 = doc.parts[i];
+
+ if (typeof doc2 !== "string" && doc2.type === "concat") {
+ res.push(...flattenDoc(doc2).parts);
+ } else {
+ const flattened = flattenDoc(doc2);
+
+ if (flattened !== "") {
+ res.push(flattened);
+ }
+ }
+ }
+
+ return Object.assign({}, doc, {
+ parts: res
+ });
+ } else if (doc.type === "if-break") {
+ return Object.assign({}, doc, {
+ breakContents: doc.breakContents != null ? flattenDoc(doc.breakContents) : null,
+ flatContents: doc.flatContents != null ? flattenDoc(doc.flatContents) : null
+ });
+ } else if (doc.type === "group") {
+ return Object.assign({}, doc, {
+ contents: flattenDoc(doc.contents),
+ expandedStates: doc.expandedStates ? doc.expandedStates.map(flattenDoc) : doc.expandedStates
+ });
+ } else if (doc.contents) {
+ return Object.assign({}, doc, {
+ contents: flattenDoc(doc.contents)
+ });
+ }
+
+ return doc;
+}
+
+function printDoc(doc) {
+ if (typeof doc === "string") {
+ return JSON.stringify(doc);
+ }
+
+ if (doc.type === "line") {
+ if (doc.literal) {
+ return "literalline";
+ }
+
+ if (doc.hard) {
+ return "hardline";
+ }
+
+ if (doc.soft) {
+ return "softline";
+ }
+
+ return "line";
+ }
+
+ if (doc.type === "break-parent") {
+ return "breakParent";
+ }
+
+ if (doc.type === "trim") {
+ return "trim";
+ }
+
+ if (doc.type === "concat") {
+ return "[" + doc.parts.map(printDoc).join(", ") + "]";
+ }
+
+ if (doc.type === "indent") {
+ return "indent(" + printDoc(doc.contents) + ")";
+ }
+
+ if (doc.type === "align") {
+ return doc.n === -Infinity ? "dedentToRoot(" + printDoc(doc.contents) + ")" : doc.n < 0 ? "dedent(" + printDoc(doc.contents) + ")" : doc.n.type === "root" ? "markAsRoot(" + printDoc(doc.contents) + ")" : "align(" + JSON.stringify(doc.n) + ", " + printDoc(doc.contents) + ")";
+ }
+
+ if (doc.type === "if-break") {
+ return "ifBreak(" + printDoc(doc.breakContents) + (doc.flatContents ? ", " + printDoc(doc.flatContents) : "") + ")";
+ }
+
+ if (doc.type === "group") {
+ if (doc.expandedStates) {
+ return "conditionalGroup(" + "[" + doc.expandedStates.map(printDoc).join(",") + "])";
+ }
+
+ return (doc.break ? "wrappedGroup" : "group") + "(" + printDoc(doc.contents) + ")";
+ }
+
+ if (doc.type === "fill") {
+ return "fill" + "(" + doc.parts.map(printDoc).join(", ") + ")";
+ }
+
+ if (doc.type === "line-suffix") {
+ return "lineSuffix(" + printDoc(doc.contents) + ")";
+ }
+
+ if (doc.type === "line-suffix-boundary") {
+ return "lineSuffixBoundary";
+ }
+
+ throw new Error("Unknown doc type " + doc.type);
+}
+
+var docDebug = {
+ printDocToDebug(doc) {
+ return printDoc(flattenDoc(doc));
+ }
+
+};
+
+/**
+ * @typedef {import("./doc-builders").Doc} Doc
+ */
+
+
+var document = {
+ builders: docBuilders,
+ printer: docPrinter,
+ utils: docUtils,
+ debug: docDebug
+};
+
+/**
+ * @class
+ */
+
+
+class LineByLine {
+ constructor(file, options) {
+ options = options || {};
+ if (!options.readChunk) options.readChunk = 1024;
+
+ if (!options.newLineCharacter) {
+ options.newLineCharacter = 0x0a; //linux line ending
+ } else {
+ options.newLineCharacter = options.newLineCharacter.charCodeAt(0);
+ }
+
+ if (typeof file === 'number') {
+ this.fd = file;
+ } else {
+ this.fd = fs__default['default'].openSync(file, 'r');
+ }
+
+ this.options = options;
+ this.newLineCharacter = options.newLineCharacter;
+ this.reset();
+ }
+
+ _searchInBuffer(buffer, hexNeedle) {
+ let found = -1;
+
+ for (let i = 0; i <= buffer.length; i++) {
+ let b_byte = buffer[i];
+
+ if (b_byte === hexNeedle) {
+ found = i;
+ break;
+ }
+ }
+
+ return found;
+ }
+
+ reset() {
+ this.eofReached = false;
+ this.linesCache = [];
+ this.fdPosition = 0;
+ }
+
+ close() {
+ fs__default['default'].closeSync(this.fd);
+ this.fd = null;
+ }
+
+ _extractLines(buffer) {
+ let line;
+ const lines = [];
+ let bufferPosition = 0;
+ let lastNewLineBufferPosition = 0;
+
+ while (true) {
+ let bufferPositionValue = buffer[bufferPosition++];
+
+ if (bufferPositionValue === this.newLineCharacter) {
+ line = buffer.slice(lastNewLineBufferPosition, bufferPosition);
+ lines.push(line);
+ lastNewLineBufferPosition = bufferPosition;
+ } else if (bufferPositionValue === undefined) {
+ break;
+ }
+ }
+
+ let leftovers = buffer.slice(lastNewLineBufferPosition, bufferPosition);
+
+ if (leftovers.length) {
+ lines.push(leftovers);
+ }
+
+ return lines;
+ }
+
+ _readChunk(lineLeftovers) {
+ let totalBytesRead = 0;
+ let bytesRead;
+ const buffers = [];
+
+ do {
+ const readBuffer = new Buffer(this.options.readChunk);
+ bytesRead = fs__default['default'].readSync(this.fd, readBuffer, 0, this.options.readChunk, this.fdPosition);
+ totalBytesRead = totalBytesRead + bytesRead;
+ this.fdPosition = this.fdPosition + bytesRead;
+ buffers.push(readBuffer);
+ } while (bytesRead && this._searchInBuffer(buffers[buffers.length - 1], this.options.newLineCharacter) === -1);
+
+ let bufferData = Buffer.concat(buffers);
+
+ if (bytesRead < this.options.readChunk) {
+ this.eofReached = true;
+ bufferData = bufferData.slice(0, totalBytesRead);
+ }
+
+ if (totalBytesRead) {
+ this.linesCache = this._extractLines(bufferData);
+
+ if (lineLeftovers) {
+ this.linesCache[0] = Buffer.concat([lineLeftovers, this.linesCache[0]]);
+ }
+ }
+
+ return totalBytesRead;
+ }
+
+ next() {
+ if (!this.fd) return false;
+ let line = false;
+
+ if (this.eofReached && this.linesCache.length === 0) {
+ return line;
+ }
+
+ let bytesRead;
+
+ if (!this.linesCache.length) {
+ bytesRead = this._readChunk();
+ }
+
+ if (this.linesCache.length) {
+ line = this.linesCache.shift();
+ const lastLineCharacter = line[line.length - 1];
+
+ if (lastLineCharacter !== this.newLineCharacter) {
+ bytesRead = this._readChunk(line);
+
+ if (bytesRead) {
+ line = this.linesCache.shift();
+ }
+ }
+ }
+
+ if (this.eofReached && this.linesCache.length === 0) {
+ this.close();
+ }
+
+ if (line && line[line.length - 1] === this.newLineCharacter) {
+ line = line.slice(0, line.length - 1);
+ }
+
+ return line;
+ }
+
+}
+
+var readlines = LineByLine;
+
+/**
+ * The inverse of `_.toPairs`; this method returns an object composed
+ * from key-value `pairs`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Array
+ * @param {Array} pairs The key-value pairs.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.fromPairs([['a', 1], ['b', 2]]);
+ * // => { 'a': 1, 'b': 2 }
+ */
+function fromPairs(pairs) {
+ var index = -1,
+ length = pairs == null ? 0 : pairs.length,
+ result = {};
+
+ while (++index < length) {
+ var pair = pairs[index];
+ result[pair[0]] = pair[1];
+ }
+
+ return result;
+}
+
+var fromPairs_1 = fromPairs;
+
+class ConfigError extends Error {}
+
+class DebugError extends Error {}
+
+class UndefinedParserError extends Error {}
+
+var errors = {
+ ConfigError,
+ DebugError,
+ UndefinedParserError
+};
+
+/*! *****************************************************************************\r
+Copyright (c) Microsoft Corporation.\r
+\r
+Permission to use, copy, modify, and/or distribute this software for any\r
+purpose with or without fee is hereby granted.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r
+PERFORMANCE OF THIS SOFTWARE.\r
+***************************************************************************** */
+
+/* global Reflect, Promise */
+var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf || {
+ __proto__: []
+ } instanceof Array && function (d, b) {
+ d.__proto__ = b;
+ } || function (d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ };
+
+ return extendStatics(d, b);
+};
+
+function __extends(d, b) {
+ extendStatics(d, b);
+
+ function __() {
+ this.constructor = d;
+ }
+
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+}
+var __assign = function () {
+ __assign = Object.assign || function __assign(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);
+};
+function __rest(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;
+}
+function __decorate(decorators, target, key, desc) {
+ var c = arguments.length,
+ r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
+ d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);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;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+}
+function __param(paramIndex, decorator) {
+ return function (target, key) {
+ decorator(target, key, paramIndex);
+ };
+}
+function __metadata(metadataKey, metadataValue) {
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
+}
+function __awaiter(thisArg, _arguments, P, generator) {
+ function adopt(value) {
+ return value instanceof P ? value : new P(function (resolve) {
+ resolve(value);
+ });
+ }
+
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) {
+ try {
+ step(generator.next(value));
+ } catch (e) {
+ reject(e);
+ }
+ }
+
+ function rejected(value) {
+ try {
+ step(generator["throw"](value));
+ } catch (e) {
+ reject(e);
+ }
+ }
+
+ function step(result) {
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
+ }
+
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+}
+function __generator(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
+ };
+ }
+}
+function __createBinding(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ o[k2] = m[k];
+}
+function __exportStar(m, exports) {
+ for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+function __values(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator,
+ m = s && o[s],
+ i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return {
+ value: o && o[i++],
+ done: !o
+ };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+}
+function __read(o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o),
+ r,
+ ar = [],
+ e;
+
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ } catch (error) {
+ e = {
+ error: error
+ };
+ } finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ } finally {
+ if (e) throw e.error;
+ }
+ }
+
+ return ar;
+}
+function __spread() {
+ for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
+
+ return ar;
+}
+function __spreadArrays() {
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+
+ for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j];
+
+ return r;
+}
+function __await(v) {
+ return this instanceof __await ? (this.v = v, this) : new __await(v);
+}
+function __asyncGenerator(thisArg, _arguments, generator) {
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+ var g = generator.apply(thisArg, _arguments || []),
+ i,
+ q = [];
+ return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () {
+ return this;
+ }, i;
+
+ 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);
+ });
+ };
+ }
+
+ function resume(n, v) {
+ try {
+ step(g[n](v));
+ } catch (e) {
+ settle(q[0][3], e);
+ }
+ }
+
+ function step(r) {
+ r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
+ }
+
+ function fulfill(value) {
+ resume("next", value);
+ }
+
+ function reject(value) {
+ resume("throw", value);
+ }
+
+ function settle(f, v) {
+ if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);
+ }
+}
+function __asyncDelegator(o) {
+ var i, p;
+ return i = {}, verb("next"), verb("throw", function (e) {
+ throw e;
+ }), verb("return"), i[Symbol.iterator] = function () {
+ return this;