{"version":3,"sources":["../node_modules/ms/index.js","../node_modules/debug/src/common.js","../node_modules/debug/src/browser.js","../node_modules/has-flag/index.js","../node_modules/supports-color/index.js","../node_modules/debug/src/node.js","../node_modules/debug/src/index.js","../node_modules/@kwsites/file-exists/src/index.ts","../node_modules/@kwsites/file-exists/index.ts","../node_modules/@kwsites/promise-deferred/src/index.ts","../node_modules/simple-git/src/lib/args/pathspec.ts","../node_modules/simple-git/src/lib/errors/git-error.ts","../node_modules/simple-git/src/lib/errors/git-response-error.ts","../node_modules/simple-git/src/lib/errors/task-configuration-error.ts","../node_modules/simple-git/src/lib/utils/util.ts","../node_modules/simple-git/src/lib/utils/argument-filters.ts","../node_modules/simple-git/src/lib/utils/exit-codes.ts","../node_modules/simple-git/src/lib/utils/git-output-streams.ts","../node_modules/simple-git/src/lib/utils/line-parser.ts","../node_modules/simple-git/src/lib/utils/simple-git-options.ts","../node_modules/simple-git/src/lib/utils/task-options.ts","../node_modules/simple-git/src/lib/utils/task-parser.ts","../node_modules/simple-git/src/lib/utils/index.ts","../node_modules/simple-git/src/lib/tasks/check-is-repo.ts","../node_modules/simple-git/src/lib/responses/CleanSummary.ts","../node_modules/simple-git/src/lib/tasks/task.ts","../node_modules/simple-git/src/lib/tasks/clean.ts","../node_modules/simple-git/src/lib/responses/ConfigList.ts","../node_modules/simple-git/src/lib/tasks/config.ts","../node_modules/simple-git/src/lib/tasks/diff-name-status.ts","../node_modules/simple-git/src/lib/tasks/grep.ts","../node_modules/simple-git/src/lib/tasks/reset.ts","../node_modules/simple-git/src/lib/git-logger.ts","../node_modules/simple-git/src/lib/runners/tasks-pending-queue.ts","../node_modules/simple-git/src/lib/runners/git-executor-chain.ts","../node_modules/simple-git/src/lib/runners/git-executor.ts","../node_modules/simple-git/src/lib/task-callback.ts","../node_modules/simple-git/src/lib/tasks/change-working-directory.ts","../node_modules/simple-git/src/lib/tasks/checkout.ts","../node_modules/simple-git/src/lib/tasks/count-objects.ts","../node_modules/simple-git/src/lib/parsers/parse-commit.ts","../node_modules/simple-git/src/lib/tasks/commit.ts","../node_modules/simple-git/src/lib/tasks/first-commit.ts","../node_modules/simple-git/src/lib/tasks/hash-object.ts","../node_modules/simple-git/src/lib/responses/InitSummary.ts","../node_modules/simple-git/src/lib/tasks/init.ts","../node_modules/simple-git/src/lib/args/log-format.ts","../node_modules/simple-git/src/lib/responses/DiffSummary.ts","../node_modules/simple-git/src/lib/parsers/parse-diff-summary.ts","../node_modules/simple-git/src/lib/parsers/parse-list-log-summary.ts","../node_modules/simple-git/src/lib/tasks/diff.ts","../node_modules/simple-git/src/lib/tasks/log.ts","../node_modules/simple-git/src/lib/responses/MergeSummary.ts","../node_modules/simple-git/src/lib/responses/PullSummary.ts","../node_modules/simple-git/src/lib/parsers/parse-remote-objects.ts","../node_modules/simple-git/src/lib/parsers/parse-remote-messages.ts","../node_modules/simple-git/src/lib/parsers/parse-pull.ts","../node_modules/simple-git/src/lib/parsers/parse-merge.ts","../node_modules/simple-git/src/lib/tasks/merge.ts","../node_modules/simple-git/src/lib/parsers/parse-push.ts","../node_modules/simple-git/src/lib/tasks/push.ts","../node_modules/simple-git/src/lib/tasks/show.ts","../node_modules/simple-git/src/lib/responses/FileStatusSummary.ts","../node_modules/simple-git/src/lib/responses/StatusSummary.ts","../node_modules/simple-git/src/lib/tasks/status.ts","../node_modules/simple-git/src/lib/tasks/version.ts","../node_modules/simple-git/src/lib/simple-git-api.ts","../node_modules/simple-git/src/lib/runners/scheduler.ts","../node_modules/simple-git/src/lib/tasks/apply-patch.ts","../node_modules/simple-git/src/lib/responses/BranchDeleteSummary.ts","../node_modules/simple-git/src/lib/parsers/parse-branch-delete.ts","../node_modules/simple-git/src/lib/responses/BranchSummary.ts","../node_modules/simple-git/src/lib/parsers/parse-branch.ts","../node_modules/simple-git/src/lib/tasks/branch.ts","../node_modules/simple-git/src/lib/responses/CheckIgnore.ts","../node_modules/simple-git/src/lib/tasks/check-ignore.ts","../node_modules/simple-git/src/lib/tasks/clone.ts","../node_modules/simple-git/src/lib/parsers/parse-fetch.ts","../node_modules/simple-git/src/lib/tasks/fetch.ts","../node_modules/simple-git/src/lib/parsers/parse-move.ts","../node_modules/simple-git/src/lib/tasks/move.ts","../node_modules/simple-git/src/lib/tasks/pull.ts","../node_modules/simple-git/src/lib/responses/GetRemoteSummary.ts","../node_modules/simple-git/src/lib/tasks/remote.ts","../node_modules/simple-git/src/lib/tasks/stash-list.ts","../node_modules/simple-git/src/lib/tasks/sub-module.ts","../node_modules/simple-git/src/lib/responses/TagList.ts","../node_modules/simple-git/src/lib/tasks/tag.ts","../node_modules/simple-git/src/git.js","../node_modules/simple-git/src/lib/api.ts","../node_modules/simple-git/src/lib/errors/git-construct-error.ts","../node_modules/simple-git/src/lib/errors/git-plugin-error.ts","../node_modules/simple-git/src/lib/plugins/abort-plugin.ts","../node_modules/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts","../node_modules/simple-git/src/lib/plugins/command-config-prefixing-plugin.ts","../node_modules/simple-git/src/lib/plugins/completion-detection.plugin.ts","../node_modules/simple-git/src/lib/plugins/custom-binary.plugin.ts","../node_modules/simple-git/src/lib/plugins/error-detection.plugin.ts","../node_modules/simple-git/src/lib/plugins/plugin-store.ts","../node_modules/simple-git/src/lib/plugins/progress-monitor-plugin.ts","../node_modules/simple-git/src/lib/plugins/spawn-options-plugin.ts","../node_modules/simple-git/src/lib/plugins/timout-plugin.ts","../node_modules/simple-git/src/lib/plugins/suffix-paths.plugin.ts","../node_modules/simple-git/src/lib/git-factory.ts","../node_modules/simple-git/src/lib/runners/promise-wrapped.ts","../node_modules/simple-git/src/esm.mjs","../src/git/GitClient.ts","../node_modules/balanced-match/index.js","../node_modules/brace-expansion/index.js","../node_modules/yaml/dist/nodes/identity.js","../node_modules/yaml/dist/visit.js","../node_modules/yaml/dist/doc/directives.js","../node_modules/yaml/dist/doc/anchors.js","../node_modules/yaml/dist/doc/applyReviver.js","../node_modules/yaml/dist/nodes/toJS.js","../node_modules/yaml/dist/nodes/Node.js","../node_modules/yaml/dist/nodes/Alias.js","../node_modules/yaml/dist/nodes/Scalar.js","../node_modules/yaml/dist/doc/createNode.js","../node_modules/yaml/dist/nodes/Collection.js","../node_modules/yaml/dist/stringify/stringifyComment.js","../node_modules/yaml/dist/stringify/foldFlowLines.js","../node_modules/yaml/dist/stringify/stringifyString.js","../node_modules/yaml/dist/stringify/stringify.js","../node_modules/yaml/dist/stringify/stringifyPair.js","../node_modules/yaml/dist/log.js","../node_modules/yaml/dist/schema/yaml-1.1/merge.js","../node_modules/yaml/dist/nodes/addPairToJSMap.js","../node_modules/yaml/dist/nodes/Pair.js","../node_modules/yaml/dist/stringify/stringifyCollection.js","../node_modules/yaml/dist/nodes/YAMLMap.js","../node_modules/yaml/dist/schema/common/map.js","../node_modules/yaml/dist/nodes/YAMLSeq.js","../node_modules/yaml/dist/schema/common/seq.js","../node_modules/yaml/dist/schema/common/string.js","../node_modules/yaml/dist/schema/common/null.js","../node_modules/yaml/dist/schema/core/bool.js","../node_modules/yaml/dist/stringify/stringifyNumber.js","../node_modules/yaml/dist/schema/core/float.js","../node_modules/yaml/dist/schema/core/int.js","../node_modules/yaml/dist/schema/core/schema.js","../node_modules/yaml/dist/schema/json/schema.js","../node_modules/yaml/dist/schema/yaml-1.1/binary.js","../node_modules/yaml/dist/schema/yaml-1.1/pairs.js","../node_modules/yaml/dist/schema/yaml-1.1/omap.js","../node_modules/yaml/dist/schema/yaml-1.1/bool.js","../node_modules/yaml/dist/schema/yaml-1.1/float.js","../node_modules/yaml/dist/schema/yaml-1.1/int.js","../node_modules/yaml/dist/schema/yaml-1.1/set.js","../node_modules/yaml/dist/schema/yaml-1.1/timestamp.js","../node_modules/yaml/dist/schema/yaml-1.1/schema.js","../node_modules/yaml/dist/schema/tags.js","../node_modules/yaml/dist/schema/Schema.js","../node_modules/yaml/dist/stringify/stringifyDocument.js","../node_modules/yaml/dist/doc/Document.js","../node_modules/yaml/dist/errors.js","../node_modules/yaml/dist/compose/resolve-props.js","../node_modules/yaml/dist/compose/util-contains-newline.js","../node_modules/yaml/dist/compose/util-flow-indent-check.js","../node_modules/yaml/dist/compose/util-map-includes.js","../node_modules/yaml/dist/compose/resolve-block-map.js","../node_modules/yaml/dist/compose/resolve-block-seq.js","../node_modules/yaml/dist/compose/resolve-end.js","../node_modules/yaml/dist/compose/resolve-flow-collection.js","../node_modules/yaml/dist/compose/compose-collection.js","../node_modules/yaml/dist/compose/resolve-block-scalar.js","../node_modules/yaml/dist/compose/resolve-flow-scalar.js","../node_modules/yaml/dist/compose/compose-scalar.js","../node_modules/yaml/dist/compose/util-empty-scalar-position.js","../node_modules/yaml/dist/compose/compose-node.js","../node_modules/yaml/dist/compose/compose-doc.js","../node_modules/yaml/dist/compose/composer.js","../node_modules/yaml/dist/parse/cst-scalar.js","../node_modules/yaml/dist/parse/cst-stringify.js","../node_modules/yaml/dist/parse/cst-visit.js","../node_modules/yaml/dist/parse/cst.js","../node_modules/yaml/dist/parse/lexer.js","../node_modules/yaml/dist/parse/line-counter.js","../node_modules/yaml/dist/parse/parser.js","../node_modules/yaml/dist/public-api.js","../node_modules/yaml/dist/index.js","../src/HybridReconstruction.ts","../src/PatchApplyTheirs.ts","../src/cli.ts","../src/LockfileManager.ts","../node_modules/minimatch/src/index.ts","../node_modules/minimatch/src/assert-valid-pattern.ts","../node_modules/minimatch/src/brace-expressions.ts","../node_modules/minimatch/src/unescape.ts","../node_modules/minimatch/src/ast.ts","../node_modules/minimatch/src/escape.ts","../src/credentials.ts","../src/ReplayDetector.ts","../src/shared/binary.ts","../src/git/CommitDetection.ts","../src/ReplayService.ts","../src/ReplayApplicator.ts","../src/accumulator/MergeAccumulator.ts","../src/applicator/resolveInputs.ts","../src/conflict-utils.ts","../node_modules/node-diff3/src/diff3.mjs","../src/ThreeWayMerge.ts","../src/applicator/buildMergePlan.ts","../src/applicator/runMergeAndRecord.ts","../src/autoversion.ts","../src/shared/fernignore.ts","../src/ReplayCommitter.ts","../src/PatchRegionDiff.ts","../src/classifier/FileOwnership.ts","../src/flows/FirstGenerationFlow.ts","../src/flows/SkipApplicationFlow.ts","../src/flows/NoPatchesFlow.ts","../src/flows/NormalRegenerationFlow.ts","../src/FernignoreMigrator.ts","../src/commands/bootstrap.ts","../src/commands/forget.ts","../src/commands/reset.ts","../src/commands/resolve.ts","../src/commands/status.ts"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = `  ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n",null,null,null,"const cache = new WeakMap<String, string[]>();\n\nexport function pathspec(...paths: string[]) {\n   const key = new String(paths);\n   cache.set(key, paths);\n\n   return key as string;\n}\n\nexport function isPathSpec(path: string | unknown): path is string {\n   return path instanceof String && cache.has(path);\n}\n\nexport function toPaths(pathSpec: string): string[] {\n   return cache.get(pathSpec) || [];\n}\n","import type { SimpleGitTask } from '../types';\n\n/**\n * The `GitError` is thrown when the underlying `git` process throws a\n * fatal exception (eg an `ENOENT` exception when attempting to use a\n * non-writable directory as the root for your repo), and acts as the\n * base class for more specific errors thrown by the parsing of the\n * git response or errors in the configuration of the task about to\n * be run.\n *\n * When an exception is thrown, pending tasks in the same instance will\n * not be executed. The recommended way to run a series of tasks that\n * can independently fail without needing to prevent future tasks from\n * running is to catch them individually:\n *\n * ```typescript\n import { gitP, SimpleGit, GitError, PullResult } from 'simple-git';\n\n function catchTask (e: GitError) {\n   return e.\n }\n\n const git = gitP(repoWorkingDir);\n const pulled: PullResult | GitError = await git.pull().catch(catchTask);\n const pushed: string | GitError = await git.pushTags().catch(catchTask);\n ```\n */\nexport class GitError extends Error {\n   constructor(\n      public task?: SimpleGitTask<any>,\n      message?: string\n   ) {\n      super(message);\n      Object.setPrototypeOf(this, new.target.prototype);\n   }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `GitResponseError` is the wrapper for a parsed response that is treated as\n * a fatal error, for example attempting a `merge` can leave the repo in a corrupted\n * state when there are conflicts so the task will reject rather than resolve.\n *\n * For example, catching the merge conflict exception:\n *\n * ```typescript\n import { gitP, SimpleGit, GitResponseError, MergeSummary } from 'simple-git';\n\n const git = gitP(repoRoot);\n const mergeOptions: string[] = ['--no-ff', 'other-branch'];\n const mergeSummary: MergeSummary = await git.merge(mergeOptions)\n      .catch((e: GitResponseError<MergeSummary>) => e.git);\n\n if (mergeSummary.failed) {\n   // deal with the error\n }\n ```\n */\nexport class GitResponseError<T = any> extends GitError {\n   constructor(\n      /**\n       * `.git` access the parsed response that is treated as being an error\n       */\n      public readonly git: T,\n      message?: string\n   ) {\n      super(undefined, message || String(git));\n   }\n}\n","import { GitError } from './git-error';\n\n/**\n * The `TaskConfigurationError` is thrown when a command was incorrectly\n * configured. An error of this kind means that no attempt was made to\n * run your command through the underlying `git` binary.\n *\n * Check the `.message` property for more detail on why your configuration\n * resulted in an error.\n */\nexport class TaskConfigurationError extends GitError {\n   constructor(message?: string) {\n      super(undefined, message);\n   }\n}\n","import { Buffer } from 'node:buffer';\nimport { exists, FOLDER } from '@kwsites/file-exists';\nimport type { Maybe } from '../types';\nimport { filterHasLength } from './argument-filters';\n\ntype Callable = (...args: unknown[]) => unknown;\n\nexport const NULL = '\\0';\n\nexport const NOOP: Callable = () => {};\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function asFunction<T>(source: T | unknown): Callable {\n   if (typeof source !== 'function') {\n      return NOOP;\n   }\n   return source as Callable;\n}\n\n/**\n * Determines whether the supplied argument is both a function, and is not\n * the `NOOP` function.\n */\nexport function isUserFunction<T extends Function>(source: T | unknown): source is T {\n   return typeof source === 'function' && source !== NOOP;\n}\n\nexport function splitOn(input: string, char: string): [string, string] {\n   const index = input.indexOf(char);\n   if (index <= 0) {\n      return [input, ''];\n   }\n\n   return [input.substr(0, index), input.substr(index + 1)];\n}\n\nexport function first<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function first<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function first(input: unknown[] | IArguments, offset = 0): Maybe<unknown> {\n   return isArrayLike(input) && input.length > offset ? input[offset] : undefined;\n}\n\nexport function last<T extends unknown[]>(input: T, offset?: number): Maybe<T[number]>;\nexport function last<T extends IArguments>(input: T, offset?: number): Maybe<unknown>;\nexport function last<T>(input: T, offset?: number): Maybe<unknown>;\nexport function last(input: unknown, offset = 0) {\n   if (isArrayLike(input) && input.length > offset) {\n      return input[input.length - 1 - offset];\n   }\n}\n\ntype ArrayLike<T> = T[] | IArguments | { [index: number]: T; length: number };\n\nfunction isArrayLike(input: unknown): input is ArrayLike<unknown> {\n   return filterHasLength(input);\n}\n\nexport function toLinesWithContent(input = '', trimmed = true, separator = '\\n'): string[] {\n   return input.split(separator).reduce((output, line) => {\n      const lineContent = trimmed ? line.trim() : line;\n      if (lineContent) {\n         output.push(lineContent);\n      }\n      return output;\n   }, [] as string[]);\n}\n\ntype LineWithContentCallback<T = void> = (line: string) => T;\n\nexport function forEachLineWithContent<T>(\n   input: string,\n   callback: LineWithContentCallback<T>\n): T[] {\n   return toLinesWithContent(input, true).map((line) => callback(line));\n}\n\nexport function folderExists(path: string): boolean {\n   return exists(path, FOLDER);\n}\n\n/**\n * Adds `item` into the `target` `Array` or `Set` when it is not already present and returns the `item`.\n */\nexport function append<T>(target: T[] | Set<T>, item: T): typeof item {\n   if (Array.isArray(target)) {\n      if (!target.includes(item)) {\n         target.push(item);\n      }\n   } else {\n      target.add(item);\n   }\n   return item;\n}\n\n/**\n * Adds `item` into the `target` `Array` when it is not already present and returns the `target`.\n */\nexport function including<T>(target: T[], item: T): typeof target {\n   if (Array.isArray(target) && !target.includes(item)) {\n      target.push(item);\n   }\n\n   return target;\n}\n\nexport function remove<T>(target: Set<T> | T[], item: T): T {\n   if (Array.isArray(target)) {\n      const index = target.indexOf(item);\n      if (index >= 0) {\n         target.splice(index, 1);\n      }\n   } else {\n      target.delete(item);\n   }\n   return item;\n}\n\nexport const objectToString = Object.prototype.toString.call.bind(Object.prototype.toString) as (\n   input: unknown\n) => string;\n\nexport function asArray<T>(source: T | T[]): T[] {\n   return Array.isArray(source) ? source : [source];\n}\n\nexport function asCamelCase(str: string) {\n   return str.replace(/[\\s-]+(.)/g, (_all, chr) => {\n      return chr.toUpperCase();\n   });\n}\n\nexport function asStringArray<T>(source: T | T[]): string[] {\n   return asArray(source).map((item) => {\n      return item instanceof String ? (item as string) : String(item);\n   });\n}\n\nexport function asNumber(source: string | null | undefined, onNaN = 0) {\n   if (source == null) {\n      return onNaN;\n   }\n\n   const num = parseInt(source, 10);\n   return Number.isNaN(num) ? onNaN : num;\n}\n\nexport function prefixedArray<T>(input: T[], prefix: T): T[] {\n   const output: T[] = [];\n   for (let i = 0, max = input.length; i < max; i++) {\n      output.push(prefix, input[i]);\n   }\n   return output;\n}\n\nexport function bufferToString(input: Buffer | Buffer[]): string {\n   return (Array.isArray(input) ? Buffer.concat(input) : input).toString('utf-8');\n}\n\n/**\n * Get a new object from a source object with only the listed properties.\n */\nexport function pick<T, K extends keyof T>(source: T, properties: readonly K[]) {\n   const out: Partial<Pick<T, K>> = {};\n\n   properties.forEach((key) => {\n      if (source[key] !== undefined) {\n         out[key] = source[key];\n      }\n   });\n\n   return out;\n}\n\nexport function delay(duration = 0): Promise<void> {\n   return new Promise((done) => setTimeout(done, duration));\n}\n\nexport function orVoid<T>(input: T | false) {\n   if (input === false) {\n      return undefined;\n   }\n   return input;\n}\n","import { isPathSpec } from '../args/pathspec';\nimport type { Maybe, Options, Primitives } from '../types';\nimport { objectToString } from './util';\n\nexport type ArgumentFilterPredicate<T> = (input: T | unknown) => input is T;\n\nexport function filterType<T, K>(\n   input: K,\n   filter: ArgumentFilterPredicate<T>\n): K extends T ? T : undefined;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def: T): T;\nexport function filterType<T, K>(input: K, filter: ArgumentFilterPredicate<T>, def?: T): Maybe<T> {\n   if (filter(input)) {\n      return input;\n   }\n   return arguments.length > 2 ? def : undefined;\n}\n\nexport const filterArray: ArgumentFilterPredicate<Array<unknown>> = (\n   input\n): input is Array<unknown> => {\n   return Array.isArray(input);\n};\n\nexport function filterPrimitives(\n   input: unknown,\n   omit?: Array<'boolean' | 'string' | 'number'>\n): input is Primitives {\n   const type = isPathSpec(input) ? 'string' : typeof input;\n\n   return (\n      /number|string|boolean/.test(type) &&\n      (!omit || !omit.includes(type as 'boolean' | 'string' | 'number'))\n   );\n}\n\nexport const filterNumber: ArgumentFilterPredicate<number> = (input: unknown): input is number => {\n   return typeof input === 'number';\n};\n\nexport const filterString: ArgumentFilterPredicate<string> = (input: unknown): input is string => {\n   return typeof input === 'string';\n};\n\nexport const filterStringOrStringArray: ArgumentFilterPredicate<string | string[]> = (\n   input\n): input is string | string[] => {\n   return filterString(input) || (Array.isArray(input) && input.every(filterString));\n};\n\nexport function filterPlainObject<T extends Options>(input: T | unknown): input is T;\nexport function filterPlainObject<T extends Record<string, unknown>>(\n   input: T | unknown\n): input is T {\n   return !!input && objectToString(input) === '[object Object]';\n}\n\nexport function filterFunction(input: unknown): input is (...args: unknown[]) => unknown {\n   return typeof input === 'function';\n}\n\nexport const filterHasLength: ArgumentFilterPredicate<{ length: number }> = (\n   input\n): input is { length: number } => {\n   if (input == null || 'number|boolean|function'.includes(typeof input)) {\n      return false;\n   }\n\n   return typeof (input as { length?: number }).length === 'number';\n};\n","/**\n * Known process exit codes used by the task parsers to determine whether an error\n * was one they can automatically handle\n */\nexport enum ExitCodes {\n   SUCCESS,\n   ERROR,\n   NOT_FOUND = -2,\n   UNCLEAN = 128,\n}\n","import { TaskResponseFormat } from '../types';\n\nexport class GitOutputStreams<T extends TaskResponseFormat = Buffer> {\n   constructor(\n      public readonly stdOut: T,\n      public readonly stdErr: T\n   ) {}\n\n   asStrings(): GitOutputStreams<string> {\n      return new GitOutputStreams(this.stdOut.toString('utf8'), this.stdErr.toString('utf8'));\n   }\n}\n","function useMatchesDefault() {\n   throw new Error(`LineParser:useMatches not implemented`);\n}\n\nexport class LineParser<T> {\n   protected matches: string[] = [];\n   protected useMatches: (target: T, match: string[]) => boolean | void = useMatchesDefault;\n\n   private _regExp: RegExp[];\n\n   constructor(\n      regExp: RegExp | RegExp[],\n      useMatches?: (target: T, match: string[]) => boolean | void\n   ) {\n      this._regExp = Array.isArray(regExp) ? regExp : [regExp];\n      if (useMatches) {\n         this.useMatches = useMatches;\n      }\n   }\n\n   parse = (line: (offset: number) => string | undefined, target: T): boolean => {\n      this.resetMatches();\n\n      if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) {\n         return false;\n      }\n\n      return this.useMatches(target, this.prepareMatches()) !== false;\n   };\n\n   protected resetMatches() {\n      this.matches.length = 0;\n   }\n\n   protected prepareMatches() {\n      return this.matches;\n   }\n\n   protected addMatch(reg: RegExp, index: number, line?: string) {\n      const matched = line && reg.exec(line);\n      if (matched) {\n         this.pushMatch(index, matched);\n      }\n\n      return !!matched;\n   }\n\n   protected pushMatch(_index: number, matched: string[]) {\n      this.matches.push(...matched.slice(1));\n   }\n}\n\nexport class RemoteLineParser<T> extends LineParser<T> {\n   protected addMatch(reg: RegExp, index: number, line?: string): boolean {\n      return /^remote:\\s/.test(String(line)) && super.addMatch(reg, index, line);\n   }\n\n   protected pushMatch(index: number, matched: string[]) {\n      if (index > 0 || matched.length > 1) {\n         super.pushMatch(index, matched);\n      }\n   }\n}\n","import { SimpleGitOptions } from '../types';\n\nconst defaultOptions: Omit<SimpleGitOptions, 'baseDir'> = {\n   binary: 'git',\n   maxConcurrentProcesses: 5,\n   config: [],\n   trimmed: false,\n};\n\nexport function createInstanceConfig(\n   ...options: Array<Partial<SimpleGitOptions> | undefined>\n): SimpleGitOptions {\n   const baseDir = process.cwd();\n   const config: SimpleGitOptions = Object.assign(\n      { baseDir, ...defaultOptions },\n      ...options.filter((o) => typeof o === 'object' && o)\n   );\n\n   config.baseDir = config.baseDir || baseDir;\n   config.trimmed = config.trimmed === true;\n\n   return config;\n}\n","import {\n   filterArray,\n   filterFunction,\n   filterPlainObject,\n   filterPrimitives,\n   filterType,\n} from './argument-filters';\nimport { asFunction, asStringArray, isUserFunction, last } from './util';\nimport { Maybe, Options } from '../types';\nimport { isPathSpec } from '../args/pathspec';\n\nexport function appendTaskOptions<T extends Options = Options>(\n   options: Maybe<T>,\n   commands: string[] = []\n): string[] {\n   if (!filterPlainObject<Options>(options)) {\n      return commands;\n   }\n\n   return Object.keys(options).reduce((commands: string[], key: string) => {\n      const value = options[key];\n\n      if (isPathSpec(value)) {\n         commands.push(value);\n      } else if (filterPrimitives(value, ['boolean'])) {\n         commands.push(key + '=' + value);\n      } else if (Array.isArray(value)) {\n         for (const v of value) {\n            if (!filterPrimitives(v, ['string', 'number'])) {\n               commands.push(key + '=' + v);\n            }\n         }\n      } else {\n         commands.push(key);\n      }\n\n      return commands;\n   }, commands);\n}\n\nexport function getTrailingOptions(\n   args: IArguments,\n   initialPrimitive = 0,\n   objectOnly = false\n): string[] {\n   const command: string[] = [];\n\n   for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) {\n      if ('string|number'.includes(typeof args[i])) {\n         command.push(String(args[i]));\n      }\n   }\n\n   appendTaskOptions(trailingOptionsArgument(args), command);\n   if (!objectOnly) {\n      command.push(...trailingArrayArgument(args));\n   }\n\n   return command;\n}\n\nfunction trailingArrayArgument(args: IArguments) {\n   const hasTrailingCallback = typeof last(args) === 'function';\n   return asStringArray(filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []));\n}\n\n/**\n * Given any number of arguments, returns the trailing options argument, ignoring a trailing function argument\n * if there is one. When not found, the return value is null.\n */\nexport function trailingOptionsArgument(args: IArguments): Maybe<Options> {\n   const hasTrailingCallback = filterFunction(last(args));\n   return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject);\n}\n\n/**\n * Returns either the source argument when it is a `Function`, or the default\n * `NOOP` function constant\n */\nexport function trailingFunctionArgument(\n   args: unknown[] | IArguments | unknown,\n   includeNoop = true\n): Maybe<(...args: unknown[]) => unknown> {\n   const callback = asFunction(last(args));\n   return includeNoop || isUserFunction(callback) ? callback : undefined;\n}\n","import type { MaybeArray, TaskParser, TaskResponseFormat } from '../types';\nimport { GitOutputStreams } from './git-output-streams';\nimport { LineParser } from './line-parser';\nimport { asArray, toLinesWithContent } from './util';\n\nexport function callTaskParser<INPUT extends TaskResponseFormat, RESPONSE>(\n   parser: TaskParser<INPUT, RESPONSE>,\n   streams: GitOutputStreams<INPUT>\n) {\n   return parser(streams.stdOut, streams.stdErr);\n}\n\nexport function parseStringResponse<T>(\n   result: T,\n   parsers: LineParser<T>[],\n   texts: MaybeArray<string>,\n   trim = true\n): T {\n   asArray(texts).forEach((text) => {\n      for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) {\n         const line = (offset = 0) => {\n            if (i + offset >= max) {\n               return;\n            }\n            return lines[i + offset];\n         };\n\n         parsers.some(({ parse }) => parse(line, result));\n      }\n   });\n\n   return result;\n}\n","export * from './argument-filters';\nexport * from './exit-codes';\nexport * from './git-output-streams';\nexport * from './line-parser';\nexport * from './simple-git-options';\nexport * from './task-options';\nexport * from './task-parser';\nexport * from './util';\n","import { ExitCodes } from '../utils';\nimport { Maybe, StringTask } from '../types';\n\nexport enum CheckRepoActions {\n   BARE = 'bare',\n   IN_TREE = 'tree',\n   IS_REPO_ROOT = 'root',\n}\n\nconst onError: StringTask<boolean>['onError'] = ({ exitCode }, error, done, fail) => {\n   if (exitCode === ExitCodes.UNCLEAN && isNotRepoMessage(error)) {\n      return done(Buffer.from('false'));\n   }\n\n   fail(error);\n};\n\nconst parser: StringTask<boolean>['parser'] = (text) => {\n   return text.trim() === 'true';\n};\n\nexport function checkIsRepoTask(action: Maybe<CheckRepoActions>): StringTask<boolean> {\n   switch (action) {\n      case CheckRepoActions.BARE:\n         return checkIsBareRepoTask();\n      case CheckRepoActions.IS_REPO_ROOT:\n         return checkIsRepoRootTask();\n   }\n\n   const commands = ['rev-parse', '--is-inside-work-tree'];\n\n   return {\n      commands,\n      format: 'utf-8',\n      onError,\n      parser,\n   };\n}\n\nexport function checkIsRepoRootTask(): StringTask<boolean> {\n   const commands = ['rev-parse', '--git-dir'];\n\n   return {\n      commands,\n      format: 'utf-8',\n      onError,\n      parser(path) {\n         return /^\\.(git)?$/.test(path.trim());\n      },\n   };\n}\n\nexport function checkIsBareRepoTask(): StringTask<boolean> {\n   const commands = ['rev-parse', '--is-bare-repository'];\n\n   return {\n      commands,\n      format: 'utf-8',\n      onError,\n      parser,\n   };\n}\n\nfunction isNotRepoMessage(error: Error): boolean {\n   return /(Not a git repository|Kein Git-Repository)/i.test(String(error));\n}\n","import { CleanSummary } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\n\nexport class CleanResponse implements CleanSummary {\n   public paths: string[] = [];\n   public files: string[] = [];\n   public folders: string[] = [];\n\n   constructor(public readonly dryRun: boolean) {}\n}\n\nconst removalRegexp = /^[a-z]+\\s*/i;\nconst dryRunRemovalRegexp = /^[a-z]+\\s+[a-z]+\\s*/i;\nconst isFolderRegexp = /\\/$/;\n\nexport function cleanSummaryParser(dryRun: boolean, text: string): CleanSummary {\n   const summary = new CleanResponse(dryRun);\n   const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp;\n\n   toLinesWithContent(text).forEach((line) => {\n      const removed = line.replace(regexp, '');\n\n      summary.paths.push(removed);\n      (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed);\n   });\n\n   return summary;\n}\n","import { TaskConfigurationError } from '../errors/task-configuration-error';\nimport type { BufferTask, EmptyTaskParser, SimpleGitTask, StringTask } from '../types';\n\nexport const EMPTY_COMMANDS: [] = [];\n\nexport type EmptyTask = {\n   commands: typeof EMPTY_COMMANDS;\n   format: 'empty';\n   parser: EmptyTaskParser;\n   onError?: undefined;\n};\n\nexport function adhocExecTask(parser: EmptyTaskParser): EmptyTask {\n   return {\n      commands: EMPTY_COMMANDS,\n      format: 'empty',\n      parser,\n   };\n}\n\nexport function configurationErrorTask(error: Error | string): EmptyTask {\n   return {\n      commands: EMPTY_COMMANDS,\n      format: 'empty',\n      parser() {\n         throw typeof error === 'string' ? new TaskConfigurationError(error) : error;\n      },\n   };\n}\n\nexport function straightThroughStringTask(commands: string[], trimmed = false): StringTask<string> {\n   return {\n      commands,\n      format: 'utf-8',\n      parser(text) {\n         return trimmed ? String(text).trim() : text;\n      },\n   };\n}\n\nexport function straightThroughBufferTask(commands: string[]): BufferTask<Buffer> {\n   return {\n      commands,\n      format: 'buffer',\n      parser(buffer) {\n         return buffer;\n      },\n   };\n}\n\nexport function isBufferTask<R>(task: SimpleGitTask<R>): task is BufferTask<R> {\n   return task.format === 'buffer';\n}\n\nexport function isEmptyTask<R>(task: SimpleGitTask<R>): task is EmptyTask {\n   return task.format === 'empty' || !task.commands.length;\n}\n","import { CleanSummary } from '../../../typings';\nimport { cleanSummaryParser } from '../responses/CleanSummary';\nimport { Maybe, StringTask } from '../types';\nimport { asStringArray } from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport const CONFIG_ERROR_INTERACTIVE_MODE = 'Git clean interactive mode is not supported';\nexport const CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter (\"n\" or \"f\") is required';\nexport const CONFIG_ERROR_UNKNOWN_OPTION = 'Git clean unknown option found in: ';\n\n/**\n * All supported option switches available for use in a `git.clean` operation\n */\nexport enum CleanOptions {\n   DRY_RUN = 'n',\n   FORCE = 'f',\n   IGNORED_INCLUDED = 'x',\n   IGNORED_ONLY = 'X',\n   EXCLUDING = 'e',\n   QUIET = 'q',\n   RECURSIVE = 'd',\n}\n\n/**\n * The two modes `git.clean` can run in - one of these must be supplied in order\n * for the command to not throw a `TaskConfigurationError`\n */\nexport type CleanMode = CleanOptions.FORCE | CleanOptions.DRY_RUN;\n\nconst CleanOptionValues: Set<string> = new Set([\n   'i',\n   ...asStringArray(Object.values(CleanOptions as any)),\n]);\n\nexport function cleanWithOptionsTask(mode: CleanMode | string, customArgs: string[]) {\n   const { cleanMode, options, valid } = getCleanOptions(mode);\n\n   if (!cleanMode) {\n      return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED);\n   }\n\n   if (!valid.options) {\n      return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode));\n   }\n\n   options.push(...customArgs);\n\n   if (options.some(isInteractiveMode)) {\n      return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE);\n   }\n\n   return cleanTask(cleanMode, options);\n}\n\nexport function cleanTask(mode: CleanMode, customArgs: string[]): StringTask<CleanSummary> {\n   const commands: string[] = ['clean', `-${mode}`, ...customArgs];\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser(text: string): CleanSummary {\n         return cleanSummaryParser(mode === CleanOptions.DRY_RUN, text);\n      },\n   };\n}\n\nexport function isCleanOptionsArray(input: string[]): input is CleanOptions[] {\n   return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test));\n}\n\nfunction getCleanOptions(input: string) {\n   let cleanMode: Maybe<CleanMode>;\n   let options: string[] = [];\n   let valid = { cleanMode: false, options: true };\n\n   input\n      .replace(/[^a-z]i/g, '')\n      .split('')\n      .forEach((char) => {\n         if (isCleanMode(char)) {\n            cleanMode = char;\n            valid.cleanMode = true;\n         } else {\n            valid.options = valid.options && isKnownOption((options[options.length] = `-${char}`));\n         }\n      });\n\n   return {\n      cleanMode,\n      options,\n      valid,\n   };\n}\n\nfunction isCleanMode(cleanMode?: string): cleanMode is CleanMode {\n   return cleanMode === CleanOptions.FORCE || cleanMode === CleanOptions.DRY_RUN;\n}\n\nfunction isKnownOption(option: string): boolean {\n   return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1));\n}\n\nfunction isInteractiveMode(option: string): boolean {\n   if (/^-[^\\-]/.test(option)) {\n      return option.indexOf('i') > 0;\n   }\n\n   return option === '--interactive';\n}\n","import { ConfigGetResult, ConfigListSummary, ConfigValues } from '../../../typings';\nimport { last, splitOn } from '../utils';\n\nexport class ConfigList implements ConfigListSummary {\n   public files: string[] = [];\n   public values: { [fileName: string]: ConfigValues } = Object.create(null);\n\n   private _all: ConfigValues | undefined;\n\n   public get all(): ConfigValues {\n      if (!this._all) {\n         this._all = this.files.reduce((all: ConfigValues, file: string) => {\n            return Object.assign(all, this.values[file]);\n         }, {});\n      }\n\n      return this._all;\n   }\n\n   public addFile(file: string): ConfigValues {\n      if (!(file in this.values)) {\n         const latest = last(this.files);\n         this.values[file] = latest ? Object.create(this.values[latest]) : {};\n\n         this.files.push(file);\n      }\n\n      return this.values[file];\n   }\n\n   public addValue(file: string, key: string, value: string) {\n      const values = this.addFile(file);\n\n      if (!Object.hasOwn(values, key)) {\n         values[key] = value;\n      } else if (Array.isArray(values[key])) {\n         (values[key] as string[]).push(value);\n      } else {\n         values[key] = [values[key] as string, value];\n      }\n\n      this._all = undefined;\n   }\n}\n\nexport function configListParser(text: string): ConfigList {\n   const config = new ConfigList();\n\n   for (const item of configParser(text)) {\n      config.addValue(item.file, String(item.key), item.value);\n   }\n\n   return config;\n}\n\nexport function configGetParser(text: string, key: string): ConfigGetResult {\n   let value: string | null = null;\n   const values: string[] = [];\n   const scopes: Map<string, string[]> = new Map();\n\n   for (const item of configParser(text, key)) {\n      if (item.key !== key) {\n         continue;\n      }\n\n      values.push((value = item.value));\n\n      if (!scopes.has(item.file)) {\n         scopes.set(item.file, []);\n      }\n\n      scopes.get(item.file)!.push(value);\n   }\n\n   return {\n      key,\n      paths: Array.from(scopes.keys()),\n      scopes,\n      value,\n      values,\n   };\n}\n\nfunction configFilePath(filePath: string): string {\n   return filePath.replace(/^(file):/, '');\n}\n\nfunction* configParser(text: string, requestedKey: string | null = null) {\n   const lines = text.split('\\0');\n\n   for (let i = 0, max = lines.length - 1; i < max; ) {\n      const file = configFilePath(lines[i++]);\n\n      let value = lines[i++];\n      let key = requestedKey;\n\n      if (value.includes('\\n')) {\n         const line = splitOn(value, '\\n');\n         key = line[0];\n         value = line[1];\n      }\n\n      yield { file, key, value };\n   }\n}\n","import type { ConfigGetResult, ConfigListSummary, SimpleGit } from '../../../typings';\nimport { configGetParser, configListParser } from '../responses/ConfigList';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { trailingFunctionArgument } from '../utils';\n\nexport enum GitConfigScope {\n   system = 'system',\n   global = 'global',\n   local = 'local',\n   worktree = 'worktree',\n}\n\nfunction asConfigScope<T extends GitConfigScope | undefined>(\n   scope: GitConfigScope | unknown,\n   fallback: T\n): GitConfigScope | T {\n   if (typeof scope === 'string' && Object.hasOwn(GitConfigScope, scope)) {\n      return scope as GitConfigScope;\n   }\n   return fallback;\n}\n\nfunction addConfigTask(\n   key: string,\n   value: string,\n   append: boolean,\n   scope: GitConfigScope\n): StringTask<string> {\n   const commands: string[] = ['config', `--${scope}`];\n\n   if (append) {\n      commands.push('--add');\n   }\n\n   commands.push(key, value);\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser(text: string): string {\n         return text;\n      },\n   };\n}\n\nfunction getConfigTask(key: string, scope?: GitConfigScope): StringTask<ConfigGetResult> {\n   const commands: string[] = ['config', '--null', '--show-origin', '--get-all', key];\n\n   if (scope) {\n      commands.splice(1, 0, `--${scope}`);\n   }\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser(text) {\n         return configGetParser(text, key);\n      },\n   };\n}\n\nfunction listConfigTask(scope?: GitConfigScope): StringTask<ConfigListSummary> {\n   const commands = ['config', '--list', '--show-origin', '--null'];\n\n   if (scope) {\n      commands.push(`--${scope}`);\n   }\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser(text: string) {\n         return configListParser(text);\n      },\n   };\n}\n\nexport default function (): Pick<SimpleGit, 'addConfig' | 'getConfig' | 'listConfig'> {\n   return {\n      addConfig(this: SimpleGitApi, key: string, value: string, ...rest: unknown[]) {\n         return this._runTask(\n            addConfigTask(\n               key,\n               value,\n               rest[0] === true,\n               asConfigScope(rest[1], GitConfigScope.local)\n            ),\n            trailingFunctionArgument(arguments)\n         );\n      },\n\n      getConfig(this: SimpleGitApi, key: string, scope?: GitConfigScope) {\n         return this._runTask(\n            getConfigTask(key, asConfigScope(scope, undefined)),\n            trailingFunctionArgument(arguments)\n         );\n      },\n\n      listConfig(this: SimpleGitApi, ...rest: unknown[]) {\n         return this._runTask(\n            listConfigTask(asConfigScope(rest[0], undefined)),\n            trailingFunctionArgument(arguments)\n         );\n      },\n   };\n}\n","export enum DiffNameStatus {\n   ADDED = 'A',\n   COPIED = 'C',\n   DELETED = 'D',\n   MODIFIED = 'M',\n   RENAMED = 'R',\n   CHANGED = 'T',\n   UNMERGED = 'U',\n   UNKNOWN = 'X',\n   BROKEN = 'B',\n}\n\nconst diffNameStatus = new Set(Object.values(DiffNameStatus));\n\nexport function isDiffNameStatus(input: string): input is DiffNameStatus {\n   return diffNameStatus.has(input as DiffNameStatus);\n}\n","import { GrepResult, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport {\n   asNumber,\n   forEachLineWithContent,\n   getTrailingOptions,\n   NULL,\n   prefixedArray,\n   trailingFunctionArgument,\n} from '../utils';\n\nimport { configurationErrorTask } from './task';\n\nconst disallowedOptions = ['-h'];\n\nconst Query = Symbol('grepQuery');\n\nexport interface GitGrepQuery extends Iterable<string> {\n   /** Adds one or more terms to be grouped as an \"and\" to any other terms */\n   and(...and: string[]): this;\n\n   /** Adds one or more search terms - git.grep will \"or\" this to other terms */\n   param(...param: string[]): this;\n}\n\nclass GrepQuery implements GitGrepQuery {\n   private [Query]: string[] = [];\n\n   *[Symbol.iterator]() {\n      for (const query of this[Query]) {\n         yield query;\n      }\n   }\n\n   and(...and: string[]) {\n      and.length && this[Query].push('--and', '(', ...prefixedArray(and, '-e'), ')');\n      return this;\n   }\n\n   param(...param: string[]) {\n      this[Query].push(...prefixedArray(param, '-e'));\n      return this;\n   }\n}\n\n/**\n * Creates a new builder for a `git.grep` query with optional params\n */\nexport function grepQueryBuilder(...params: string[]): GitGrepQuery {\n   return new GrepQuery().param(...params);\n}\n\nfunction parseGrep(grep: string): GrepResult {\n   const paths: GrepResult['paths'] = new Set<string>();\n   const results: GrepResult['results'] = {};\n\n   forEachLineWithContent(grep, (input) => {\n      const [path, line, preview] = input.split(NULL);\n      paths.add(path);\n      (results[path] = results[path] || []).push({\n         line: asNumber(line),\n         path,\n         preview,\n      });\n   });\n\n   return {\n      paths,\n      results,\n   };\n}\n\nexport default function (): Pick<SimpleGit, 'grep'> {\n   return {\n      grep(this: SimpleGitApi, searchTerm: string | GitGrepQuery) {\n         const then = trailingFunctionArgument(arguments);\n         const options = getTrailingOptions(arguments);\n\n         for (const option of disallowedOptions) {\n            if (options.includes(option)) {\n               return this._runTask(\n                  configurationErrorTask(`git.grep: use of \"${option}\" is not supported.`),\n                  then\n               );\n            }\n         }\n\n         if (typeof searchTerm === 'string') {\n            searchTerm = grepQueryBuilder().param(searchTerm);\n         }\n\n         const commands = ['grep', '--null', '-n', '--full-name', ...options, ...searchTerm];\n\n         return this._runTask(\n            {\n               commands,\n               format: 'utf-8',\n               parser(stdOut) {\n                  return parseGrep(stdOut);\n               },\n            },\n            then\n         );\n      },\n   };\n}\n","import type { Maybe, OptionFlags, Options } from '../types';\nimport { asStringArray } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport enum ResetMode {\n   MIXED = 'mixed',\n   SOFT = 'soft',\n   HARD = 'hard',\n   MERGE = 'merge',\n   KEEP = 'keep',\n}\n\nconst validResetModes = asStringArray(Object.values(ResetMode));\n\nexport type ResetOptions = Options &\n   OptionFlags<'-q' | '--quiet' | '--no-quiet' | '--pathspec-from-nul'> &\n   OptionFlags<'--pathspec-from-file', string>;\n\nexport function resetTask(mode: Maybe<ResetMode>, customArgs: string[]) {\n   const commands: string[] = ['reset'];\n   if (isValidResetMode(mode)) {\n      commands.push(`--${mode}`);\n   }\n   commands.push(...customArgs);\n\n   return straightThroughStringTask(commands);\n}\n\nexport function getResetMode(mode: ResetMode | unknown): Maybe<ResetMode> {\n   if (isValidResetMode(mode)) {\n      return mode;\n   }\n\n   switch (typeof mode) {\n      case 'string':\n      case 'undefined':\n         return ResetMode.SOFT;\n   }\n\n   return;\n}\n\nfunction isValidResetMode(mode: ResetMode | unknown): mode is ResetMode {\n   return typeof mode === 'string' && validResetModes.includes(mode);\n}\n","import debug, { Debugger } from 'debug';\nimport {\n   append,\n   filterHasLength,\n   filterString,\n   filterType,\n   NOOP,\n   objectToString,\n   remove,\n} from './utils';\nimport { Maybe } from './types';\n\ndebug.formatters.L = (value: any) => String(filterHasLength(value) ? value.length : '-');\ndebug.formatters.B = (value: Buffer) => {\n   if (Buffer.isBuffer(value)) {\n      return value.toString('utf8');\n   }\n   return objectToString(value);\n};\n\ntype OutputLoggingHandler = (message: string, ...args: any[]) => void;\n\nfunction createLog() {\n   return debug('simple-git');\n}\n\nexport interface OutputLogger extends OutputLoggingHandler {\n   readonly label: string;\n\n   info: OutputLoggingHandler;\n   step(nextStep?: string): OutputLogger;\n   sibling(name: string): OutputLogger;\n}\n\nfunction prefixedLogger(\n   to: Debugger,\n   prefix: string,\n   forward?: OutputLoggingHandler\n): OutputLoggingHandler {\n   if (!prefix || !String(prefix).replace(/\\s*/, '')) {\n      return !forward\n         ? to\n         : (message, ...args) => {\n              to(message, ...args);\n              forward(message, ...args);\n           };\n   }\n\n   return (message, ...args) => {\n      to(`%s ${message}`, prefix, ...args);\n      if (forward) {\n         forward(message, ...args);\n      }\n   };\n}\n\nfunction childLoggerName(\n   name: Maybe<string>,\n   childDebugger: Maybe<Debugger>,\n   { namespace: parentNamespace }: Debugger\n): string {\n   if (typeof name === 'string') {\n      return name;\n   }\n   const childNamespace = (childDebugger && childDebugger.namespace) || '';\n\n   if (childNamespace.startsWith(parentNamespace)) {\n      return childNamespace.substr(parentNamespace.length + 1);\n   }\n\n   return childNamespace || parentNamespace;\n}\n\nexport function createLogger(\n   label: string,\n   verbose?: string | Debugger,\n   initialStep?: string,\n   infoDebugger = createLog()\n): OutputLogger {\n   const labelPrefix = (label && `[${label}]`) || '';\n\n   const spawned: OutputLogger[] = [];\n   const debugDebugger: Maybe<Debugger> =\n      typeof verbose === 'string' ? infoDebugger.extend(verbose) : verbose;\n   const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger);\n\n   return step(initialStep);\n\n   function sibling(name: string, initial?: string) {\n      return append(\n         spawned,\n         createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)\n      );\n   }\n\n   function step(phase?: string) {\n      const stepPrefix = (phase && `[${phase}]`) || '';\n      const debug = (debugDebugger && prefixedLogger(debugDebugger, stepPrefix)) || NOOP;\n      const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug);\n\n      return Object.assign(debugDebugger ? debug : info, {\n         label,\n         sibling,\n         info,\n         step,\n      });\n   }\n}\n\n/**\n * The `GitLogger` is used by the main `SimpleGit` runner to handle logging\n * any warnings or errors.\n */\nexport class GitLogger {\n   public error: OutputLoggingHandler;\n\n   public warn: OutputLoggingHandler;\n\n   constructor(private _out: Debugger = createLog()) {\n      this.error = prefixedLogger(_out, '[ERROR]');\n      this.warn = prefixedLogger(_out, '[WARN]');\n   }\n\n   silent(silence = false) {\n      if (silence !== this._out.enabled) {\n         return;\n      }\n\n      const { namespace } = this._out;\n      const env = (process.env.DEBUG || '').split(',').filter((s) => !!s);\n      const hasOn = env.includes(namespace);\n      const hasOff = env.includes(`-${namespace}`);\n\n      // enabling the log\n      if (!silence) {\n         if (hasOff) {\n            remove(env, `-${namespace}`);\n         } else {\n            env.push(namespace);\n         }\n      } else {\n         if (hasOn) {\n            remove(env, namespace);\n         } else {\n            env.push(`-${namespace}`);\n         }\n      }\n\n      debug.enable(env.join(','));\n   }\n}\n","import { SimpleGitTask } from '../types';\nimport { GitError } from '../errors/git-error';\nimport { createLogger, OutputLogger } from '../git-logger';\n\ntype AnySimpleGitTask = SimpleGitTask<any>;\n\ntype TaskInProgress = {\n   name: string;\n   logger: OutputLogger;\n   task: AnySimpleGitTask;\n};\n\nexport class TasksPendingQueue {\n   private _queue: Map<AnySimpleGitTask, TaskInProgress> = new Map();\n\n   constructor(private logLabel = 'GitExecutor') {}\n\n   private withProgress(task: AnySimpleGitTask) {\n      return this._queue.get(task);\n   }\n\n   private createProgress(task: AnySimpleGitTask): TaskInProgress {\n      const name = TasksPendingQueue.getName(task.commands[0]);\n      const logger = createLogger(this.logLabel, name);\n\n      return {\n         task,\n         logger,\n         name,\n      };\n   }\n\n   push(task: AnySimpleGitTask): TaskInProgress {\n      const progress = this.createProgress(task);\n      progress.logger('Adding task to the queue, commands = %o', task.commands);\n\n      this._queue.set(task, progress);\n\n      return progress;\n   }\n\n   fatal(err: GitError) {\n      for (const [task, { logger }] of Array.from(this._queue.entries())) {\n         if (task === err.task) {\n            logger.info(`Failed %o`, err);\n            logger(\n               `Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`\n            );\n         } else {\n            logger.info(\n               `A fatal exception occurred in a previous task, the queue has been purged: %o`,\n               err.message\n            );\n         }\n\n         this.complete(task);\n      }\n\n      if (this._queue.size !== 0) {\n         throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`);\n      }\n   }\n\n   complete(task: AnySimpleGitTask) {\n      const progress = this.withProgress(task);\n      if (progress) {\n         this._queue.delete(task);\n      }\n   }\n\n   attempt(task: AnySimpleGitTask): TaskInProgress {\n      const progress = this.withProgress(task);\n      if (!progress) {\n         throw new GitError(undefined, 'TasksPendingQueue: attempt called for an unknown task');\n      }\n      progress.logger('Starting task');\n\n      return progress;\n   }\n\n   static getName(name = 'empty') {\n      return `task:${name}:${++TasksPendingQueue.counter}`;\n   }\n\n   private static counter = 0;\n}\n","import { spawn, SpawnOptions } from 'child_process';\nimport { GitError } from '../errors/git-error';\nimport { OutputLogger } from '../git-logger';\nimport { PluginStore } from '../plugins';\nimport { EmptyTask, isBufferTask, isEmptyTask } from '../tasks/task';\nimport {\n   GitExecutorResult,\n   Maybe,\n   outputHandler,\n   RunnableTask,\n   SimpleGitExecutor,\n   SimpleGitTask,\n} from '../types';\nimport { callTaskParser, first, GitOutputStreams, objectToString } from '../utils';\nimport { Scheduler } from './scheduler';\nimport { TasksPendingQueue } from './tasks-pending-queue';\n\nexport class GitExecutorChain implements SimpleGitExecutor {\n   private _chain: Promise<any> = Promise.resolve();\n   private _queue = new TasksPendingQueue();\n   private _cwd: string | undefined;\n\n   public get cwd() {\n      return this._cwd || this._executor.cwd;\n   }\n\n   public set cwd(cwd: string) {\n      this._cwd = cwd;\n   }\n\n   public get env() {\n      return this._executor.env;\n   }\n\n   public get outputHandler() {\n      return this._executor.outputHandler;\n   }\n\n   constructor(\n      private _executor: SimpleGitExecutor,\n      private _scheduler: Scheduler,\n      private _plugins: PluginStore\n   ) {}\n\n   public chain() {\n      return this;\n   }\n\n   public push<R>(task: SimpleGitTask<R>): Promise<R> {\n      this._queue.push(task);\n\n      return (this._chain = this._chain.then(() => this.attemptTask(task)));\n   }\n\n   private async attemptTask<R>(task: SimpleGitTask<R>): Promise<void | R> {\n      const onScheduleComplete = await this._scheduler.next();\n      const onQueueComplete = () => this._queue.complete(task);\n\n      try {\n         const { logger } = this._queue.attempt(task);\n         return (await (isEmptyTask(task)\n            ? this.attemptEmptyTask(task, logger)\n            : this.attemptRemoteTask(task, logger))) as R;\n      } catch (e) {\n         throw this.onFatalException(task, e as Error);\n      } finally {\n         onQueueComplete();\n         onScheduleComplete();\n      }\n   }\n\n   private onFatalException<R>(task: SimpleGitTask<R>, e: Error) {\n      const gitError =\n         e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e));\n\n      this._chain = Promise.resolve();\n      this._queue.fatal(gitError);\n\n      return gitError;\n   }\n\n   private async attemptRemoteTask<R>(task: RunnableTask<R>, logger: OutputLogger) {\n      const binary = this._plugins.exec('spawn.binary', '', pluginContext(task, task.commands));\n      const args = this._plugins.exec(\n         'spawn.args',\n         [...task.commands],\n         pluginContext(task, task.commands)\n      );\n\n      const raw = await this.gitResponse(\n         task,\n         binary,\n         args,\n         this.outputHandler,\n         logger.step('SPAWN')\n      );\n      const outputStreams = await this.handleTaskData(task, args, raw, logger.step('HANDLE'));\n\n      logger(`passing response to task's parser as a %s`, task.format);\n\n      if (isBufferTask(task)) {\n         return callTaskParser(task.parser, outputStreams);\n      }\n\n      return callTaskParser(task.parser, outputStreams.asStrings());\n   }\n\n   private async attemptEmptyTask(task: EmptyTask, logger: OutputLogger) {\n      logger(`empty task bypassing child process to call to task's parser`);\n      return task.parser(this);\n   }\n\n   private handleTaskData<R>(\n      task: SimpleGitTask<R>,\n      args: string[],\n      result: GitExecutorResult,\n      logger: OutputLogger\n   ): Promise<GitOutputStreams> {\n      const { exitCode, rejection, stdOut, stdErr } = result;\n\n      return new Promise((done, fail) => {\n         logger(`Preparing to handle process response exitCode=%d stdOut=`, exitCode);\n\n         const { error } = this._plugins.exec(\n            'task.error',\n            { error: rejection },\n            {\n               ...pluginContext(task, args),\n               ...result,\n            }\n         );\n\n         if (error && task.onError) {\n            logger.info(`exitCode=%s handling with custom error handler`);\n\n            return task.onError(\n               result,\n               error,\n               (newStdOut) => {\n                  logger.info(`custom error handler treated as success`);\n                  logger(`custom error returned a %s`, objectToString(newStdOut));\n\n                  done(\n                     new GitOutputStreams(\n                        Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut,\n                        Buffer.concat(stdErr)\n                     )\n                  );\n               },\n               fail\n            );\n         }\n\n         if (error) {\n            logger.info(\n               `handling as error: exitCode=%s stdErr=%s rejection=%o`,\n               exitCode,\n               stdErr.length,\n               rejection\n            );\n            return fail(error);\n         }\n\n         logger.info(`retrieving task output complete`);\n         done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr)));\n      });\n   }\n\n   private async gitResponse<R>(\n      task: SimpleGitTask<R>,\n      command: string,\n      args: string[],\n      outputHandler: Maybe<outputHandler>,\n      logger: OutputLogger\n   ): Promise<GitExecutorResult> {\n      const outputLogger = logger.sibling('output');\n      const spawnOptions: SpawnOptions = this._plugins.exec(\n         'spawn.options',\n         {\n            cwd: this.cwd,\n            env: this.env,\n            windowsHide: true,\n         },\n         pluginContext(task, task.commands)\n      );\n\n      return new Promise((done) => {\n         const stdOut: Buffer[] = [];\n         const stdErr: Buffer[] = [];\n\n         logger.info(`%s %o`, command, args);\n         logger('%O', spawnOptions);\n\n         let rejection = this._beforeSpawn(task, args);\n         if (rejection) {\n            return done({\n               stdOut,\n               stdErr,\n               exitCode: 9901,\n               rejection,\n            });\n         }\n\n         this._plugins.exec('spawn.before', undefined, {\n            ...pluginContext(task, args),\n            kill(reason) {\n               rejection = reason || rejection;\n            },\n         });\n\n         const spawned = spawn(command, args, spawnOptions);\n\n         spawned.stdout!.on(\n            'data',\n            onDataReceived(stdOut, 'stdOut', logger, outputLogger.step('stdOut'))\n         );\n         spawned.stderr!.on(\n            'data',\n            onDataReceived(stdErr, 'stdErr', logger, outputLogger.step('stdErr'))\n         );\n\n         spawned.on('error', onErrorReceived(stdErr, logger));\n\n         if (outputHandler) {\n            logger(`Passing child process stdOut/stdErr to custom outputHandler`);\n            outputHandler(command, spawned.stdout!, spawned.stderr!, [...args]);\n         }\n\n         this._plugins.exec('spawn.after', undefined, {\n            ...pluginContext(task, args),\n            spawned,\n            close(exitCode: number, reason?: Error) {\n               done({\n                  stdOut,\n                  stdErr,\n                  exitCode,\n                  rejection: rejection || reason,\n               });\n            },\n            kill(reason: Error) {\n               if (spawned.killed) {\n                  return;\n               }\n\n               rejection = reason;\n               spawned.kill('SIGINT');\n            },\n         });\n      });\n   }\n\n   private _beforeSpawn<R>(task: SimpleGitTask<R>, args: string[]) {\n      let rejection: Maybe<Error>;\n      this._plugins.exec('spawn.before', undefined, {\n         ...pluginContext(task, args),\n         kill(reason) {\n            rejection = reason || rejection;\n         },\n      });\n\n      return rejection;\n   }\n}\n\nfunction pluginContext<R>(task: SimpleGitTask<R>, commands: string[]) {\n   return {\n      method: first(task.commands) || '',\n      commands,\n   };\n}\n\nfunction onErrorReceived(target: Buffer[], logger: OutputLogger) {\n   return (err: Error) => {\n      logger(`[ERROR] child process exception %o`, err);\n      target.push(Buffer.from(String(err.stack), 'ascii'));\n   };\n}\n\nfunction onDataReceived(\n   target: Buffer[],\n   name: string,\n   logger: OutputLogger,\n   output: OutputLogger\n) {\n   return (buffer: Buffer) => {\n      logger(`%s received %L bytes`, name, buffer);\n      output(`%B`, buffer);\n      target.push(buffer);\n   };\n}\n","import type { PluginStore } from '../plugins';\nimport type { GitExecutorEnv, outputHandler, SimpleGitExecutor, SimpleGitTask } from '../types';\n\nimport { GitExecutorChain } from './git-executor-chain';\nimport { Scheduler } from './scheduler';\n\nexport class GitExecutor implements SimpleGitExecutor {\n   private _chain = new GitExecutorChain(this, this._scheduler, this._plugins);\n\n   public env: GitExecutorEnv;\n   public outputHandler?: outputHandler;\n\n   constructor(\n      public cwd: string,\n      private _scheduler: Scheduler,\n      private _plugins: PluginStore\n   ) {}\n\n   chain(): SimpleGitExecutor {\n      return new GitExecutorChain(this, this._scheduler, this._plugins);\n   }\n\n   push<R>(task: SimpleGitTask<R>): Promise<R> {\n      return this._chain.push(task);\n   }\n}\n","import { GitError } from './errors/git-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport { NOOP } from './utils';\n\nexport function taskCallback<R>(\n   task: SimpleGitTask<R>,\n   response: Promise<R>,\n   callback: SimpleGitTaskCallback<R> = NOOP\n) {\n   const onSuccess = (data: R) => {\n      callback(null, data);\n   };\n\n   const onError = (err: GitError | GitResponseError) => {\n      if (err?.task === task) {\n         callback(\n            err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err,\n            undefined as any\n         );\n      }\n   };\n\n   response.then(onSuccess, onError);\n}\n\nfunction addDeprecationNoticeToError(err: GitResponseError) {\n   let log = (name: string) => {\n      console.warn(\n         `simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`\n      );\n      log = NOOP;\n   };\n\n   return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {}));\n\n   function descriptorReducer(all: PropertyDescriptorMap, name: string): typeof all {\n      if (name in err) {\n         return all;\n      }\n\n      all[name] = {\n         enumerable: false,\n         configurable: false,\n         get() {\n            log(name);\n            return err.git[name];\n         },\n      };\n\n      return all;\n   }\n}\n","import { folderExists } from '../utils';\nimport { SimpleGitExecutor } from '../types';\nimport { adhocExecTask } from './task';\n\nexport function changeWorkingDirectoryTask(directory: string, root?: SimpleGitExecutor) {\n   return adhocExecTask((instance: SimpleGitExecutor) => {\n      if (!folderExists(directory)) {\n         throw new Error(`Git.cwd: cannot change to non-directory \"${directory}\"`);\n      }\n\n      return ((root || instance).cwd = directory);\n   });\n}\n","import type { SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, remove, trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nfunction checkoutTask(args: string[]) {\n   const commands = ['checkout', ...args];\n   if (commands[1] === '-b' && commands.includes('-B')) {\n      commands[1] = remove(commands, '-B');\n   }\n\n   return straightThroughStringTask(commands);\n}\n\nexport default function (): Pick<SimpleGit, 'checkout' | 'checkoutBranch' | 'checkoutLocalBranch'> {\n   return {\n      checkout(this: SimpleGitApi) {\n         return this._runTask(\n            checkoutTask(getTrailingOptions(arguments, 1)),\n            trailingFunctionArgument(arguments)\n         );\n      },\n\n      checkoutBranch(this: SimpleGitApi, branchName, startPoint) {\n         return this._runTask(\n            checkoutTask(['-b', branchName, startPoint, ...getTrailingOptions(arguments)]),\n            trailingFunctionArgument(arguments)\n         );\n      },\n\n      checkoutLocalBranch(this: SimpleGitApi, branchName) {\n         return this._runTask(\n            checkoutTask(['-b', branchName, ...getTrailingOptions(arguments)]),\n            trailingFunctionArgument(arguments)\n         );\n      },\n   };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asCamelCase, asNumber, LineParser, parseStringResponse } from '../utils';\n\nexport interface CountObjectsResult {\n   count: number;\n   size: number;\n   inPack: number;\n   packs: number;\n   sizePack: number;\n   prunePackable: number;\n   garbage: number;\n   sizeGarbage: number;\n}\n\nfunction countObjectsResponse(): CountObjectsResult {\n   return {\n      count: 0,\n      garbage: 0,\n      inPack: 0,\n      packs: 0,\n      prunePackable: 0,\n      size: 0,\n      sizeGarbage: 0,\n      sizePack: 0,\n   };\n}\n\nconst parser: LineParser<CountObjectsResult> = new LineParser(\n   /([a-z-]+): (\\d+)$/,\n   (result, [key, value]) => {\n      const property = asCamelCase(key);\n      if (Object.hasOwn(result, property)) {\n         result[property as keyof typeof result] = asNumber(value);\n      }\n   }\n);\n\nexport default function (): Pick<SimpleGit, 'countObjects'> {\n   return {\n      countObjects(this: SimpleGitApi) {\n         return this._runTask({\n            commands: ['count-objects', '--verbose'],\n            format: 'utf-8',\n            parser(stdOut: string) {\n               return parseStringResponse(countObjectsResponse(), [parser], stdOut);\n            },\n         });\n      },\n   };\n}\n","import { CommitResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<CommitResult>[] = [\n   new LineParser(/^\\[([^\\s]+)( \\([^)]+\\))? ([^\\]]+)/, (result, [branch, root, commit]) => {\n      result.branch = branch;\n      result.commit = commit;\n      result.root = !!root;\n   }),\n   new LineParser(/\\s*Author:\\s(.+)/i, (result, [author]) => {\n      const parts = author.split('<');\n      const email = parts.pop();\n\n      if (!email || !email.includes('@')) {\n         return;\n      }\n\n      result.author = {\n         email: email.substr(0, email.length - 1),\n         name: parts.join('<').trim(),\n      };\n   }),\n   new LineParser(\n      /(\\d+)[^,]*(?:,\\s*(\\d+)[^,]*)(?:,\\s*(\\d+))/g,\n      (result, [changes, insertions, deletions]) => {\n         result.summary.changes = parseInt(changes, 10) || 0;\n         result.summary.insertions = parseInt(insertions, 10) || 0;\n         result.summary.deletions = parseInt(deletions, 10) || 0;\n      }\n   ),\n   new LineParser(\n      /^(\\d+)[^,]*(?:,\\s*(\\d+)[^(]+\\(([+-]))?/,\n      (result, [changes, lines, direction]) => {\n         result.summary.changes = parseInt(changes, 10) || 0;\n         const count = parseInt(lines, 10) || 0;\n         if (direction === '-') {\n            result.summary.deletions = count;\n         } else if (direction === '+') {\n            result.summary.insertions = count;\n         }\n      }\n   ),\n];\n\nexport function parseCommitResult(stdOut: string): CommitResult {\n   const result: CommitResult = {\n      author: null,\n      branch: '',\n      commit: '',\n      root: false,\n      summary: {\n         changes: 0,\n         insertions: 0,\n         deletions: 0,\n      },\n   };\n   return parseStringResponse(result, parsers, stdOut);\n}\n","import type { CommitResult, SimpleGit } from '../../../typings';\nimport type { SimpleGitApi } from '../simple-git-api';\nimport type { StringTask } from '../types';\nimport { parseCommitResult } from '../parsers/parse-commit';\nimport {\n   asArray,\n   asStringArray,\n   filterArray,\n   filterStringOrStringArray,\n   filterType,\n   getTrailingOptions,\n   prefixedArray,\n   trailingFunctionArgument,\n} from '../utils';\nimport { configurationErrorTask } from './task';\n\nexport function commitTask(\n   message: string[],\n   files: string[],\n   customArgs: string[]\n): StringTask<CommitResult> {\n   const commands: string[] = [\n      '-c',\n      'core.abbrev=40',\n      'commit',\n      ...prefixedArray(message, '-m'),\n      ...files,\n      ...customArgs,\n   ];\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser: parseCommitResult,\n   };\n}\n\nexport default function (): Pick<SimpleGit, 'commit'> {\n   return {\n      commit(this: SimpleGitApi, message: string | string[], ...rest: unknown[]) {\n         const next = trailingFunctionArgument(arguments);\n         const task =\n            rejectDeprecatedSignatures(message) ||\n            commitTask(\n               asArray(message),\n               asArray(filterType(rest[0], filterStringOrStringArray, [])),\n               [\n                  ...asStringArray(filterType(rest[1], filterArray, [])),\n                  ...getTrailingOptions(arguments, 0, true),\n               ]\n            );\n\n         return this._runTask(task, next);\n      },\n   };\n\n   function rejectDeprecatedSignatures(message?: unknown) {\n      return (\n         !filterStringOrStringArray(message) &&\n         configurationErrorTask(\n            `git.commit: requires the commit message to be supplied as a string/string[]`\n         )\n      );\n   }\n}\n","import { Response, SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { trailingFunctionArgument } from '../utils';\nimport { straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'firstCommit'> {\n   return {\n      firstCommit(this: SimpleGitApi): Response<string> {\n         return this._runTask(\n            straightThroughStringTask(['rev-list', '--max-parents=0', 'HEAD'], true),\n            trailingFunctionArgument(arguments)\n         );\n      },\n   };\n}\n","import { straightThroughStringTask } from './task';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.hashObject`\n */\nexport function hashObjectTask(filePath: string, write: boolean): StringTask<string> {\n   const commands = ['hash-object', filePath];\n   if (write) {\n      commands.push('-w');\n   }\n\n   return straightThroughStringTask(commands, true);\n}\n","import { InitResult } from '../../../typings';\n\nexport class InitSummary implements InitResult {\n   constructor(\n      public readonly bare: boolean,\n      public readonly path: string,\n      public readonly existing: boolean,\n      public readonly gitDir: string\n   ) {}\n}\n\nconst initResponseRegex = /^Init.+ repository in (.+)$/;\nconst reInitResponseRegex = /^Rein.+ in (.+)$/;\n\nexport function parseInit(bare: boolean, path: string, text: string) {\n   const response = String(text).trim();\n   let result;\n\n   if ((result = initResponseRegex.exec(response))) {\n      return new InitSummary(bare, path, false, result[1]);\n   }\n\n   if ((result = reInitResponseRegex.exec(response))) {\n      return new InitSummary(bare, path, true, result[1]);\n   }\n\n   let gitDir = '';\n   const tokens = response.split(' ');\n   while (tokens.length) {\n      const token = tokens.shift();\n      if (token === 'in') {\n         gitDir = tokens.join(' ');\n         break;\n      }\n   }\n\n   return new InitSummary(bare, path, /^re/i.test(response), gitDir);\n}\n","import { InitResult } from '../../../typings';\nimport { parseInit } from '../responses/InitSummary';\nimport { StringTask } from '../types';\n\nconst bareCommand = '--bare';\n\nfunction hasBareCommand(command: string[]) {\n   return command.includes(bareCommand);\n}\n\nexport function initTask(bare = false, path: string, customArgs: string[]): StringTask<InitResult> {\n   const commands = ['init', ...customArgs];\n   if (bare && !hasBareCommand(commands)) {\n      commands.splice(1, 0, bareCommand);\n   }\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser(text: string): InitResult {\n         return parseInit(commands.includes('--bare'), path, text);\n      },\n   };\n}\n","export enum LogFormat {\n   NONE = '',\n   STAT = '--stat',\n   NUM_STAT = '--numstat',\n   NAME_ONLY = '--name-only',\n   NAME_STATUS = '--name-status',\n}\n\nconst logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/;\n\nexport function logFormatFromCommand(customArgs: string[]) {\n   for (let i = 0; i < customArgs.length; i++) {\n      const format = logFormatRegex.exec(customArgs[i]);\n      if (format) {\n         return `--${format[1]}` as LogFormat;\n      }\n   }\n\n   return LogFormat.NONE;\n}\n\nexport function isLogFormat(customArg: string | unknown) {\n   return logFormatRegex.test(customArg as string);\n}\n","import { DiffResult, DiffResultBinaryFile, DiffResultTextFile } from '../../../typings';\n\n/***\n * The DiffSummary is returned as a response to getting `git().status()`\n */\nexport class DiffSummary implements DiffResult {\n   changed = 0;\n   deletions = 0;\n   insertions = 0;\n\n   files: Array<DiffResultTextFile | DiffResultBinaryFile> = [];\n}\n","import { DiffResult } from '../../../typings';\nimport { LogFormat } from '../args/log-format';\nimport { DiffSummary } from '../responses/DiffSummary';\nimport { isDiffNameStatus } from '../tasks/diff-name-status';\nimport { asNumber, LineParser, orVoid, parseStringResponse } from '../utils';\n\nconst statParser = [\n   new LineParser<DiffResult>(\n      /^(.+)\\s+\\|\\s+(\\d+)(\\s+[+\\-]+)?$/,\n      (result, [file, changes, alterations = '']) => {\n         result.files.push({\n            file: file.trim(),\n            changes: asNumber(changes),\n            insertions: alterations.replace(/[^+]/g, '').length,\n            deletions: alterations.replace(/[^-]/g, '').length,\n            binary: false,\n         });\n      }\n   ),\n   new LineParser<DiffResult>(\n      /^(.+) \\|\\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/,\n      (result, [file, before, after]) => {\n         result.files.push({\n            file: file.trim(),\n            before: asNumber(before),\n            after: asNumber(after),\n            binary: true,\n         });\n      }\n   ),\n   new LineParser<DiffResult>(\n      /(\\d+) files? changed\\s*((?:, \\d+ [^,]+){0,2})/,\n      (result, [changed, summary]) => {\n         const inserted = /(\\d+) i/.exec(summary);\n         const deleted = /(\\d+) d/.exec(summary);\n\n         result.changed = asNumber(changed);\n         result.insertions = asNumber(inserted?.[1]);\n         result.deletions = asNumber(deleted?.[1]);\n      }\n   ),\n];\n\nconst numStatParser = [\n   new LineParser<DiffResult>(\n      /(\\d+)\\t(\\d+)\\t(.+)$/,\n      (result, [changesInsert, changesDelete, file]) => {\n         const insertions = asNumber(changesInsert);\n         const deletions = asNumber(changesDelete);\n\n         result.changed++;\n         result.insertions += insertions;\n         result.deletions += deletions;\n\n         result.files.push({\n            file,\n            changes: insertions + deletions,\n            insertions,\n            deletions,\n            binary: false,\n         });\n      }\n   ),\n   new LineParser<DiffResult>(/-\\t-\\t(.+)$/, (result, [file]) => {\n      result.changed++;\n\n      result.files.push({\n         file,\n         after: 0,\n         before: 0,\n         binary: true,\n      });\n   }),\n];\n\nconst nameOnlyParser = [\n   new LineParser<DiffResult>(/(.+)$/, (result, [file]) => {\n      result.changed++;\n      result.files.push({\n         file,\n         changes: 0,\n         insertions: 0,\n         deletions: 0,\n         binary: false,\n      });\n   }),\n];\n\nconst nameStatusParser = [\n   new LineParser<DiffResult>(\n      /([ACDMRTUXB])([0-9]{0,3})\\t(.[^\\t]*)(\\t(.[^\\t]*))?$/,\n      (result, [status, similarity, from, _to, to]) => {\n         result.changed++;\n         result.files.push({\n            file: to ?? from,\n            changes: 0,\n            insertions: 0,\n            deletions: 0,\n            binary: false,\n            status: orVoid(isDiffNameStatus(status) && status),\n            from: orVoid(!!to && from !== to && from),\n            similarity: asNumber(similarity),\n         });\n      }\n   ),\n];\n\nconst diffSummaryParsers: Record<LogFormat, LineParser<DiffResult>[]> = {\n   [LogFormat.NONE]: statParser,\n   [LogFormat.STAT]: statParser,\n   [LogFormat.NUM_STAT]: numStatParser,\n   [LogFormat.NAME_STATUS]: nameStatusParser,\n   [LogFormat.NAME_ONLY]: nameOnlyParser,\n};\n\nexport function getDiffParser(format = LogFormat.NONE) {\n   const parser = diffSummaryParsers[format];\n\n   return (stdOut: string) => parseStringResponse(new DiffSummary(), parser, stdOut, false);\n}\n","import { ListLogLine, LogResult } from '../../../typings';\nimport { toLinesWithContent } from '../utils';\nimport { getDiffParser } from './parse-diff-summary';\nimport { LogFormat } from '../args/log-format';\n\nexport const START_BOUNDARY = 'òòòòòò ';\n\nexport const COMMIT_BOUNDARY = ' òò';\n\nexport const SPLITTER = ' ò ';\n\nconst defaultFieldNames = ['hash', 'date', 'message', 'refs', 'author_name', 'author_email'];\n\nfunction lineBuilder(tokens: string[], fields: string[]): any {\n   return fields.reduce(\n      (line, field, index) => {\n         line[field] = tokens[index] || '';\n         return line;\n      },\n      Object.create({ diff: null }) as any\n   );\n}\n\nexport function createListLogSummaryParser<T = any>(\n   splitter = SPLITTER,\n   fields = defaultFieldNames,\n   logFormat = LogFormat.NONE\n) {\n   const parseDiffResult = getDiffParser(logFormat);\n\n   return function (stdOut: string): LogResult<T> {\n      const all: ReadonlyArray<T & ListLogLine> = toLinesWithContent(\n         stdOut.trim(),\n         false,\n         START_BOUNDARY\n      ).map(function (item) {\n         const lineDetail = item.split(COMMIT_BOUNDARY);\n         const listLogLine: T & ListLogLine = lineBuilder(lineDetail[0].split(splitter), fields);\n\n         if (lineDetail.length > 1 && !!lineDetail[1].trim()) {\n            listLogLine.diff = parseDiffResult(lineDetail[1]);\n         }\n\n         return listLogLine;\n      });\n\n      return {\n         all,\n         latest: (all.length && all[0]) || null,\n         total: all.length,\n      };\n   };\n}\n","import { StringTask } from '../types';\nimport { DiffResult } from '../../../typings';\nimport { isLogFormat, LogFormat, logFormatFromCommand } from '../args/log-format';\nimport { getDiffParser } from '../parsers/parse-diff-summary';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function diffSummaryTask(customArgs: string[]): StringTask<DiffResult> | EmptyTask {\n   let logFormat = logFormatFromCommand(customArgs);\n\n   const commands = ['diff'];\n\n   if (logFormat === LogFormat.NONE) {\n      logFormat = LogFormat.STAT;\n      commands.push('--stat=4096');\n   }\n\n   commands.push(...customArgs);\n\n   return (\n      validateLogFormatConfig(commands) || {\n         commands,\n         format: 'utf-8',\n         parser: getDiffParser(logFormat),\n      }\n   );\n}\n\nexport function validateLogFormatConfig(customArgs: unknown[]): EmptyTask | void {\n   const flags = customArgs.filter(isLogFormat);\n\n   if (flags.length > 1) {\n      return configurationErrorTask(\n         `Summary flags are mutually exclusive - pick one of ${flags.join(',')}`\n      );\n   }\n\n   if (flags.length && customArgs.includes('-z')) {\n      return configurationErrorTask(\n         `Summary flag ${flags} parsing is not compatible with null termination option '-z'`\n      );\n   }\n}\n","import type { LogResult, Options, SimpleGit } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { pathspec } from '../args/pathspec';\nimport {\n   COMMIT_BOUNDARY,\n   createListLogSummaryParser,\n   SPLITTER,\n   START_BOUNDARY,\n} from '../parsers/parse-list-log-summary';\nimport {\n   appendTaskOptions,\n   asStringArray,\n   filterArray,\n   filterPlainObject,\n   filterString,\n   filterType,\n   trailingFunctionArgument,\n   trailingOptionsArgument,\n} from '../utils';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { configurationErrorTask } from './task';\nimport { validateLogFormatConfig } from './diff';\nimport { StringTask } from '../types';\n\nenum excludeOptions {\n   '--pretty',\n   'max-count',\n   'maxCount',\n   'n',\n   'file',\n   'format',\n   'from',\n   'to',\n   'splitter',\n   'symmetric',\n   'mailMap',\n   'multiLine',\n   'strictDate',\n}\n\nexport interface DefaultLogFields {\n   hash: string;\n   date: string;\n   message: string;\n   refs: string;\n   body: string;\n   author_name: string;\n   author_email: string;\n}\n\nexport type LogOptions<T = DefaultLogFields> = {\n   file?: string;\n   format?: T;\n   from?: string;\n   mailMap?: boolean;\n   maxCount?: number;\n   multiLine?: boolean;\n   splitter?: string;\n   strictDate?: boolean;\n   symmetric?: boolean;\n   to?: string;\n};\n\ninterface ParsedLogOptions {\n   fields: string[];\n   splitter: string;\n   commands: string[];\n}\n\nfunction prettyFormat(\n   format: Record<string, string | unknown>,\n   splitter: string\n): [string[], string] {\n   const fields: string[] = [];\n   const formatStr: string[] = [];\n\n   Object.keys(format).forEach((field) => {\n      fields.push(field);\n      formatStr.push(String(format[field]));\n   });\n\n   return [fields, formatStr.join(splitter)];\n}\n\nfunction userOptions<T extends Options>(input: T): Options {\n   return Object.keys(input).reduce((out, key) => {\n      if (!(key in excludeOptions)) {\n         out[key] = input[key];\n      }\n      return out;\n   }, {} as Options);\n}\n\nexport function parseLogOptions<T extends Options>(\n   opt: Options | LogOptions<T> = {},\n   customArgs: string[] = []\n): ParsedLogOptions {\n   const splitter = filterType(opt.splitter, filterString, SPLITTER);\n   const format = filterPlainObject(opt.format)\n      ? opt.format\n      : {\n           hash: '%H',\n           date: opt.strictDate === false ? '%ai' : '%aI',\n           message: '%s',\n           refs: '%D',\n           body: opt.multiLine ? '%B' : '%b',\n           author_name: opt.mailMap !== false ? '%aN' : '%an',\n           author_email: opt.mailMap !== false ? '%aE' : '%ae',\n        };\n\n   const [fields, formatStr] = prettyFormat(format, splitter);\n\n   const suffix: string[] = [];\n   const command: string[] = [\n      `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`,\n      ...customArgs,\n   ];\n\n   const maxCount: number | undefined = (opt as any).n || (opt as any)['max-count'] || opt.maxCount;\n   if (maxCount) {\n      command.push(`--max-count=${maxCount}`);\n   }\n\n   if (opt.from || opt.to) {\n      const rangeOperator = opt.symmetric !== false ? '...' : '..';\n      suffix.push(`${opt.from || ''}${rangeOperator}${opt.to || ''}`);\n   }\n\n   if (filterString(opt.file)) {\n      command.push('--follow', pathspec(opt.file));\n   }\n\n   appendTaskOptions(userOptions(opt as Options), command);\n\n   return {\n      fields,\n      splitter,\n      commands: [...command, ...suffix],\n   };\n}\n\nexport function logTask<T>(\n   splitter: string,\n   fields: string[],\n   customArgs: string[]\n): StringTask<LogResult<T>> {\n   const parser = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs));\n\n   return {\n      commands: ['log', ...customArgs],\n      format: 'utf-8',\n      parser,\n   };\n}\n\nexport default function (): Pick<SimpleGit, 'log'> {\n   return {\n      log<T extends Options>(this: SimpleGitApi, ...rest: unknown[]) {\n         const next = trailingFunctionArgument(arguments);\n         const options = parseLogOptions<T>(\n            trailingOptionsArgument(arguments),\n            asStringArray(filterType(arguments[0], filterArray, []))\n         );\n         const task =\n            rejectDeprecatedSignatures(...rest) ||\n            validateLogFormatConfig(options.commands) ||\n            createLogTask(options);\n\n         return this._runTask(task, next);\n      },\n   };\n\n   function createLogTask(options: ParsedLogOptions) {\n      return logTask(options.splitter, options.fields, options.commands);\n   }\n\n   function rejectDeprecatedSignatures(from?: unknown, to?: unknown) {\n      return (\n         filterString(from) &&\n         filterString(to) &&\n         configurationErrorTask(\n            `git.log(string, string) should be replaced with git.log({ from: string, to: string })`\n         )\n      );\n   }\n}\n","import {\n   MergeConflict,\n   MergeConflictDeletion,\n   MergeDetail,\n   MergeResultStatus,\n} from '../../../typings';\n\nexport class MergeSummaryConflict implements MergeConflict {\n   constructor(\n      public readonly reason: string,\n      public readonly file: string | null = null,\n      public readonly meta?: MergeConflictDeletion\n   ) {}\n\n   toString() {\n      return `${this.file}:${this.reason}`;\n   }\n}\n\nexport class MergeSummaryDetail implements MergeDetail {\n   public conflicts: MergeConflict[] = [];\n   public merges: string[] = [];\n   public result: MergeResultStatus = 'success';\n\n   get failed() {\n      return this.conflicts.length > 0;\n   }\n\n   get reason() {\n      return this.result;\n   }\n\n   toString() {\n      if (this.conflicts.length) {\n         return `CONFLICTS: ${this.conflicts.join(', ')}`;\n      }\n\n      return 'OK';\n   }\n}\n","import {\n   PullDetailFileChanges,\n   PullDetailSummary,\n   PullFailedResult,\n   PullResult,\n} from '../../../typings';\n\nexport class PullSummary implements PullResult {\n   public remoteMessages = {\n      all: [],\n   };\n   public created = [];\n   public deleted: string[] = [];\n   public files: string[] = [];\n   public deletions: PullDetailFileChanges = {};\n   public insertions: PullDetailFileChanges = {};\n   public summary: PullDetailSummary = {\n      changes: 0,\n      deletions: 0,\n      insertions: 0,\n   };\n}\n\nexport class PullFailedSummary implements PullFailedResult {\n   remote = '';\n   hash = {\n      local: '',\n      remote: '',\n   };\n   branch = {\n      local: '',\n      remote: '',\n   };\n   message = '';\n\n   toString() {\n      return this.message;\n   }\n}\n","import {\n   RemoteMessageResult,\n   RemoteMessages,\n   RemoteMessagesObjectEnumeration,\n} from '../../../typings';\nimport { asNumber, RemoteLineParser } from '../utils';\n\nfunction objectEnumerationResult<T extends RemoteMessages = RemoteMessages>(\n   remoteMessages: T\n): RemoteMessagesObjectEnumeration {\n   return (remoteMessages.objects = remoteMessages.objects || {\n      compressing: 0,\n      counting: 0,\n      enumerating: 0,\n      packReused: 0,\n      reused: { count: 0, delta: 0 },\n      total: { count: 0, delta: 0 },\n   });\n}\n\nfunction asObjectCount(source: string) {\n   const count = /^\\s*(\\d+)/.exec(source);\n   const delta = /delta (\\d+)/i.exec(source);\n\n   return {\n      count: asNumber((count && count[1]) || '0'),\n      delta: asNumber((delta && delta[1]) || '0'),\n   };\n}\n\nexport const remoteMessagesObjectParsers: RemoteLineParser<RemoteMessageResult<RemoteMessages>>[] =\n   [\n      new RemoteLineParser(\n         /^remote:\\s*(enumerating|counting|compressing) objects: (\\d+),/i,\n         (result, [action, count]) => {\n            const key = action.toLowerCase();\n            const enumeration = objectEnumerationResult(result.remoteMessages);\n\n            Object.assign(enumeration, { [key]: asNumber(count) });\n         }\n      ),\n      new RemoteLineParser(\n         /^remote:\\s*(enumerating|counting|compressing) objects: \\d+% \\(\\d+\\/(\\d+)\\),/i,\n         (result, [action, count]) => {\n            const key = action.toLowerCase();\n            const enumeration = objectEnumerationResult(result.remoteMessages);\n\n            Object.assign(enumeration, { [key]: asNumber(count) });\n         }\n      ),\n      new RemoteLineParser(\n         /total ([^,]+), reused ([^,]+), pack-reused (\\d+)/i,\n         (result, [total, reused, packReused]) => {\n            const objects = objectEnumerationResult(result.remoteMessages);\n            objects.total = asObjectCount(total);\n            objects.reused = asObjectCount(reused);\n            objects.packReused = asNumber(packReused);\n         }\n      ),\n   ];\n","import { PushResultRemoteMessages, RemoteMessageResult, RemoteMessages } from '../../../typings';\nimport { asNumber, parseStringResponse, RemoteLineParser } from '../utils';\nimport { remoteMessagesObjectParsers } from './parse-remote-objects';\n\nconst parsers: RemoteLineParser<RemoteMessageResult<PushResultRemoteMessages | RemoteMessages>>[] =\n   [\n      new RemoteLineParser(/^remote:\\s*(.+)$/, (result, [text]) => {\n         result.remoteMessages.all.push(text.trim());\n         return false;\n      }),\n      ...remoteMessagesObjectParsers,\n      new RemoteLineParser(\n         [/create a (?:pull|merge) request/i, /\\s(https?:\\/\\/\\S+)$/],\n         (result, [pullRequestUrl]) => {\n            (result.remoteMessages as PushResultRemoteMessages).pullRequestUrl = pullRequestUrl;\n         }\n      ),\n      new RemoteLineParser(\n         [/found (\\d+) vulnerabilities.+\\(([^)]+)\\)/i, /\\s(https?:\\/\\/\\S+)$/],\n         (result, [count, summary, url]) => {\n            (result.remoteMessages as PushResultRemoteMessages).vulnerabilities = {\n               count: asNumber(count),\n               summary,\n               url,\n            };\n         }\n      ),\n   ];\n\nexport function parseRemoteMessages<T extends RemoteMessages = RemoteMessages>(\n   _stdOut: string,\n   stdErr: string\n): RemoteMessageResult {\n   return parseStringResponse({ remoteMessages: new RemoteMessageSummary() as T }, parsers, stdErr);\n}\n\nexport class RemoteMessageSummary implements RemoteMessages {\n   public readonly all: string[] = [];\n}\n","import { PullDetail, PullFailedResult, PullResult, RemoteMessages } from '../../../typings';\nimport { PullFailedSummary, PullSummary } from '../responses/PullSummary';\nimport { TaskParser } from '../types';\nimport { append, LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nconst FILE_UPDATE_REGEX = /^\\s*(.+?)\\s+\\|\\s+\\d+\\s*(\\+*)(-*)/;\nconst SUMMARY_REGEX = /(\\d+)\\D+((\\d+)\\D+\\(\\+\\))?(\\D+(\\d+)\\D+\\(-\\))?/;\nconst ACTION_REGEX = /^(create|delete) mode \\d+ (.+)/;\n\nconst parsers: LineParser<PullResult>[] = [\n   new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => {\n      result.files.push(file);\n\n      if (insertions) {\n         result.insertions[file] = insertions.length;\n      }\n\n      if (deletions) {\n         result.deletions[file] = deletions.length;\n      }\n   }),\n   new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => {\n      if (insertions !== undefined || deletions !== undefined) {\n         result.summary.changes = +changes || 0;\n         result.summary.insertions = +insertions || 0;\n         result.summary.deletions = +deletions || 0;\n         return true;\n      }\n      return false;\n   }),\n   new LineParser(ACTION_REGEX, (result, [action, file]) => {\n      append(result.files, file);\n      append(action === 'create' ? result.created : result.deleted, file);\n   }),\n];\n\nconst errorParsers: LineParser<PullFailedResult>[] = [\n   new LineParser(/^from\\s(.+)$/i, (result, [remote]) => void (result.remote = remote)),\n   new LineParser(/^fatal:\\s(.+)$/, (result, [message]) => void (result.message = message)),\n   new LineParser(\n      /([a-z0-9]+)\\.\\.([a-z0-9]+)\\s+(\\S+)\\s+->\\s+(\\S+)$/,\n      (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => {\n         result.branch.local = branchLocal;\n         result.hash.local = hashLocal;\n         result.branch.remote = branchRemote;\n         result.hash.remote = hashRemote;\n      }\n   ),\n];\n\nexport const parsePullDetail: TaskParser<string, PullDetail> = (stdOut, stdErr) => {\n   return parseStringResponse(new PullSummary(), parsers, [stdOut, stdErr]);\n};\n\nexport const parsePullResult: TaskParser<string, PullResult> = (stdOut, stdErr) => {\n   return Object.assign(\n      new PullSummary(),\n      parsePullDetail(stdOut, stdErr),\n      parseRemoteMessages<RemoteMessages>(stdOut, stdErr)\n   );\n};\n\nexport function parsePullErrorResult(stdOut: string, stdErr: string) {\n   const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]);\n\n   return pullError.message && pullError;\n}\n","import { MergeDetail, MergeResult } from '../../../typings';\nimport { MergeSummaryConflict, MergeSummaryDetail } from '../responses/MergeSummary';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parsePullResult } from './parse-pull';\n\nconst parsers: LineParser<MergeDetail>[] = [\n   new LineParser(/^Auto-merging\\s+(.+)$/, (summary, [autoMerge]) => {\n      summary.merges.push(autoMerge);\n   }),\n   new LineParser(/^CONFLICT\\s+\\((.+)\\): Merge conflict in (.+)$/, (summary, [reason, file]) => {\n      summary.conflicts.push(new MergeSummaryConflict(reason, file));\n   }),\n   new LineParser(\n      /^CONFLICT\\s+\\((.+\\/delete)\\): (.+) deleted in (.+) and/,\n      (summary, [reason, file, deleteRef]) => {\n         summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef }));\n      }\n   ),\n   new LineParser(/^CONFLICT\\s+\\((.+)\\):/, (summary, [reason]) => {\n      summary.conflicts.push(new MergeSummaryConflict(reason, null));\n   }),\n   new LineParser(/^Automatic merge failed;\\s+(.+)$/, (summary, [result]) => {\n      summary.result = result;\n   }),\n];\n\n/**\n * Parse the complete response from `git.merge`\n */\nexport const parseMergeResult: TaskParser<string, MergeResult> = (stdOut, stdErr) => {\n   return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr));\n};\n\n/**\n * Parse the merge specific detail (ie: not the content also available in the pull detail) from `git.mnerge`\n * @param stdOut\n */\nexport const parseMergeDetail: TaskParser<string, MergeDetail> = (stdOut) => {\n   return parseStringResponse(new MergeSummaryDetail(), parsers, stdOut);\n};\n","import { MergeResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parseMergeResult } from '../parsers/parse-merge';\nimport { StringTask } from '../types';\nimport { configurationErrorTask, EmptyTask } from './task';\n\nexport function mergeTask(customArgs: string[]): EmptyTask | StringTask<MergeResult> {\n   if (!customArgs.length) {\n      return configurationErrorTask('Git.merge requires at least one option');\n   }\n\n   return {\n      commands: ['merge', ...customArgs],\n      format: 'utf-8',\n      parser(stdOut, stdErr): MergeResult {\n         const merge = parseMergeResult(stdOut, stdErr);\n         if (merge.failed) {\n            throw new GitResponseError(merge);\n         }\n\n         return merge;\n      },\n   };\n}\n","import {\n   PushDetail,\n   PushResult,\n   PushResultPushedItem,\n   PushResultRemoteMessages,\n} from '../../../typings';\nimport { TaskParser } from '../types';\nimport { LineParser, parseStringResponse } from '../utils';\nimport { parseRemoteMessages } from './parse-remote-messages';\n\nfunction pushResultPushedItem(local: string, remote: string, status: string): PushResultPushedItem {\n   const deleted = status.includes('deleted');\n   const tag = status.includes('tag') || /^refs\\/tags/.test(local);\n   const alreadyUpdated = !status.includes('new');\n\n   return {\n      deleted,\n      tag,\n      branch: !tag,\n      new: !alreadyUpdated,\n      alreadyUpdated,\n      local,\n      remote,\n   };\n}\n\nconst parsers: LineParser<PushDetail>[] = [\n   new LineParser(/^Pushing to (.+)$/, (result, [repo]) => {\n      result.repo = repo;\n   }),\n   new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => {\n      result.ref = {\n         ...(result.ref || {}),\n         local,\n      };\n   }),\n   new LineParser(/^[=*-]\\s+([^:]+):(\\S+)\\s+\\[(.+)]$/, (result, [local, remote, type]) => {\n      result.pushed.push(pushResultPushedItem(local, remote, type));\n   }),\n   new LineParser(\n      /^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/,\n      (result, [local, remote, remoteName]) => {\n         result.branch = {\n            ...(result.branch || {}),\n            local,\n            remote,\n            remoteName,\n         };\n      }\n   ),\n   new LineParser(\n      /^([^:]+):(\\S+)\\s+([a-z0-9]+)\\.\\.([a-z0-9]+)$/,\n      (result, [local, remote, from, to]) => {\n         result.update = {\n            head: {\n               local,\n               remote,\n            },\n            hash: {\n               from,\n               to,\n            },\n         };\n      }\n   ),\n];\n\nexport const parsePushResult: TaskParser<string, PushResult> = (stdOut, stdErr) => {\n   const pushDetail = parsePushDetail(stdOut, stdErr);\n   const responseDetail = parseRemoteMessages<PushResultRemoteMessages>(stdOut, stdErr);\n\n   return {\n      ...pushDetail,\n      ...responseDetail,\n   };\n};\n\nexport const parsePushDetail: TaskParser<string, PushDetail> = (stdOut, stdErr) => {\n   return parseStringResponse({ pushed: [] }, parsers, [stdOut, stdErr]);\n};\n","import { PushResult } from '../../../typings';\nimport { parsePushResult as parser } from '../parsers/parse-push';\nimport { StringTask } from '../types';\nimport { append, remove } from '../utils';\n\ntype PushRef = { remote?: string; branch?: string };\n\nexport function pushTagsTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n   append(customArgs, '--tags');\n   return pushTask(ref, customArgs);\n}\n\nexport function pushTask(ref: PushRef = {}, customArgs: string[]): StringTask<PushResult> {\n   const commands = ['push', ...customArgs];\n   if (ref.branch) {\n      commands.splice(1, 0, ref.branch);\n   }\n   if (ref.remote) {\n      commands.splice(1, 0, ref.remote);\n   }\n\n   remove(commands, '-v');\n   append(commands, '--verbose');\n   append(commands, '--porcelain');\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser,\n   };\n}\n","import { SimpleGit } from '../../../typings';\nimport { SimpleGitApi } from '../simple-git-api';\nimport { getTrailingOptions, trailingFunctionArgument } from '../utils';\nimport { straightThroughBufferTask, straightThroughStringTask } from './task';\n\nexport default function (): Pick<SimpleGit, 'showBuffer' | 'show'> {\n   return {\n      showBuffer(this: SimpleGitApi) {\n         const commands = ['show', ...getTrailingOptions(arguments, 1)];\n         if (!commands.includes('--binary')) {\n            commands.splice(1, 0, '--binary');\n         }\n\n         return this._runTask(\n            straightThroughBufferTask(commands),\n            trailingFunctionArgument(arguments)\n         );\n      },\n\n      show(this: SimpleGitApi) {\n         const commands = ['show', ...getTrailingOptions(arguments, 1)];\n         return this._runTask(\n            straightThroughStringTask(commands),\n            trailingFunctionArgument(arguments)\n         );\n      },\n   };\n}\n","import { FileStatusResult } from '../../../typings';\n\nexport const fromPathRegex = /^(.+)\\0(.+)$/;\n\nexport class FileStatusSummary implements FileStatusResult {\n   public readonly from: string | undefined;\n\n   constructor(\n      public path: string,\n      public index: string,\n      public working_dir: string\n   ) {\n      if (index === 'R' || working_dir === 'R') {\n         const detail = fromPathRegex.exec(path) || [null, path, path];\n         this.from = detail[2] || '';\n         this.path = detail[1] || '';\n      }\n   }\n}\n","import { StatusResult } from '../../../typings';\nimport { append, filterString, filterType, NULL } from '../utils';\nimport { FileStatusSummary } from './FileStatusSummary';\n\ntype StatusLineParser = (result: StatusResult, file: string) => void;\n\nexport class StatusSummary implements StatusResult {\n   public not_added = [];\n   public conflicted = [];\n   public created = [];\n   public deleted = [];\n   public ignored = undefined;\n   public modified = [];\n   public renamed = [];\n   public files = [];\n   public staged = [];\n   public ahead = 0;\n   public behind = 0;\n   public current = null;\n   public tracking = null;\n   public detached = false;\n\n   public isClean = () => {\n      return !this.files.length;\n   };\n}\n\nenum PorcelainFileStatus {\n   ADDED = 'A',\n   DELETED = 'D',\n   MODIFIED = 'M',\n   RENAMED = 'R',\n   COPIED = 'C',\n   UNMERGED = 'U',\n   UNTRACKED = '?',\n   IGNORED = '!',\n   NONE = ' ',\n}\n\nfunction renamedFile(line: string) {\n   const [to, from] = line.split(NULL);\n\n   return {\n      from: from || to,\n      to,\n   };\n}\n\nfunction parser(\n   indexX: PorcelainFileStatus,\n   indexY: PorcelainFileStatus,\n   handler: StatusLineParser\n): [string, StatusLineParser] {\n   return [`${indexX}${indexY}`, handler];\n}\n\nfunction conflicts(indexX: PorcelainFileStatus, ...indexY: PorcelainFileStatus[]) {\n   return indexY.map((y) => parser(indexX, y, (result, file) => append(result.conflicted, file)));\n}\n\nconst parsers: Map<string, StatusLineParser> = new Map([\n   parser(PorcelainFileStatus.NONE, PorcelainFileStatus.ADDED, (result, file) =>\n      append(result.created, file)\n   ),\n   parser(PorcelainFileStatus.NONE, PorcelainFileStatus.DELETED, (result, file) =>\n      append(result.deleted, file)\n   ),\n   parser(PorcelainFileStatus.NONE, PorcelainFileStatus.MODIFIED, (result, file) =>\n      append(result.modified, file)\n   ),\n\n   parser(\n      PorcelainFileStatus.ADDED,\n      PorcelainFileStatus.NONE,\n      (result, file) => append(result.created, file) && append(result.staged, file)\n   ),\n   parser(\n      PorcelainFileStatus.ADDED,\n      PorcelainFileStatus.MODIFIED,\n      (result, file) =>\n         append(result.created, file) &&\n         append(result.staged, file) &&\n         append(result.modified, file)\n   ),\n\n   parser(\n      PorcelainFileStatus.DELETED,\n      PorcelainFileStatus.NONE,\n      (result, file) => append(result.deleted, file) && append(result.staged, file)\n   ),\n\n   parser(\n      PorcelainFileStatus.MODIFIED,\n      PorcelainFileStatus.NONE,\n      (result, file) => append(result.modified, file) && append(result.staged, file)\n   ),\n   parser(\n      PorcelainFileStatus.MODIFIED,\n      PorcelainFileStatus.MODIFIED,\n      (result, file) => append(result.modified, file) && append(result.staged, file)\n   ),\n\n   parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.NONE, (result, file) => {\n      append(result.renamed, renamedFile(file));\n   }),\n   parser(PorcelainFileStatus.RENAMED, PorcelainFileStatus.MODIFIED, (result, file) => {\n      const renamed = renamedFile(file);\n      append(result.renamed, renamed);\n      append(result.modified, renamed.to);\n   }),\n   parser(PorcelainFileStatus.IGNORED, PorcelainFileStatus.IGNORED, (_result, _file) => {\n      append((_result.ignored = _result.ignored || []), _file);\n   }),\n\n   parser(PorcelainFileStatus.UNTRACKED, PorcelainFileStatus.UNTRACKED, (result, file) =>\n      append(result.not_added, file)\n   ),\n\n   ...conflicts(PorcelainFileStatus.ADDED, PorcelainFileStatus.ADDED, PorcelainFileStatus.UNMERGED),\n   ...conflicts(\n      PorcelainFileStatus.DELETED,\n      PorcelainFileStatus.DELETED,\n      PorcelainFileStatus.UNMERGED\n   ),\n   ...conflicts(\n      PorcelainFileStatus.UNMERGED,\n      PorcelainFileStatus.ADDED,\n      PorcelainFileStatus.DELETED,\n      PorcelainFileStatus.UNMERGED\n   ),\n\n   [\n      '##',\n      (result, line) => {\n         const aheadReg = /ahead (\\d+)/;\n         const behindReg = /behind (\\d+)/;\n         const currentReg = /^(.+?(?=(?:\\.{3}|\\s|$)))/;\n         const trackingReg = /\\.{3}(\\S*)/;\n         const onEmptyBranchReg = /\\son\\s(\\S+?)(?=\\.{3}|$)/;\n\n         let regexResult = aheadReg.exec(line);\n         result.ahead = (regexResult && +regexResult[1]) || 0;\n\n         regexResult = behindReg.exec(line);\n         result.behind = (regexResult && +regexResult[1]) || 0;\n\n         regexResult = currentReg.exec(line);\n         result.current = filterType(regexResult?.[1], filterString, null);\n\n         regexResult = trackingReg.exec(line);\n         result.tracking = filterType(regexResult?.[1], filterString, null);\n\n         regexResult = onEmptyBranchReg.exec(line);\n         if (regexResult) {\n            result.current = filterType(regexResult?.[1], filterString, result.current);\n         }\n\n         result.detached = /\\(no branch\\)/.test(line);\n      },\n   ],\n]);\n\nexport const parseStatusSummary = function (text: string): StatusResult {\n   const lines = text.split(NULL);\n   const status = new StatusSummary();\n\n   for (let i = 0, l = lines.length; i < l; ) {\n      let line = lines[i++].trim();\n\n      if (!line) {\n         continue;\n      }\n\n      if (line.charAt(0) === PorcelainFileStatus.RENAMED) {\n         line += NULL + (lines[i++] || '');\n      }\n\n      splitLine(status, line);\n   }\n\n   return status;\n};\n\nfunction splitLine(result: StatusResult, lineStr: string) {\n   const trimmed = lineStr.trim();\n   switch (' ') {\n      case trimmed.charAt(2):\n         return data(trimmed.charAt(0), trimmed.charAt(1), trimmed.substr(3));\n      case trimmed.charAt(1):\n         return data(PorcelainFileStatus.NONE, trimmed.charAt(0), trimmed.substr(2));\n      default:\n         return;\n   }\n\n   function data(index: string, workingDir: string, path: string) {\n      const raw = `${index}${workingDir}`;\n      const handler = parsers.get(raw);\n\n      if (handler) {\n         handler(result, path);\n      }\n\n      if (raw !== '##' && raw !== '!!') {\n         result.files.push(new FileStatusSummary(path, index, workingDir));\n      }\n   }\n}\n","import { StatusResult } from '../../../typings';\nimport { parseStatusSummary } from '../responses/StatusSummary';\nimport { StringTask } from '../types';\n\nconst ignoredOptions = ['--null', '-z'];\n\nexport function statusTask(customArgs: string[]): StringTask<StatusResult> {\n   const commands = [\n      'status',\n      '--porcelain',\n      '-b',\n      '-u',\n      '--null',\n      ...customArgs.filter((arg) => !ignoredOptions.includes(arg)),\n   ];\n\n   return {\n      format: 'utf-8',\n      commands,\n      parser(text: string) {\n         return parseStatusSummary(text);\n      },\n   };\n}\n","import type { SimpleGitApi } from '../simple-git-api';\nimport type { SimpleGit } from '../../../typings';\nimport { asNumber, ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nexport interface VersionResult {\n   major: number;\n   minor: number;\n   patch: number | string;\n   agent: string;\n   installed: boolean;\n}\n\nconst NOT_INSTALLED = 'installed=false';\n\nfunction versionResponse(\n   major = 0,\n   minor = 0,\n   patch: string | number = 0,\n   agent = '',\n   installed = true\n): VersionResult {\n   return Object.defineProperty(\n      {\n         major,\n         minor,\n         patch,\n         agent,\n         installed,\n      },\n      'toString',\n      {\n         value() {\n            return `${this.major}.${this.minor}.${this.patch}`;\n         },\n         configurable: false,\n         enumerable: false,\n      }\n   );\n}\n\nfunction notInstalledResponse() {\n   return versionResponse(0, 0, 0, '', false);\n}\n\nexport default function (): Pick<SimpleGit, 'version'> {\n   return {\n      version(this: SimpleGitApi) {\n         return this._runTask({\n            commands: ['--version'],\n            format: 'utf-8',\n            parser: versionParser,\n            onError(result, error, done, fail) {\n               if (result.exitCode === ExitCodes.NOT_FOUND) {\n                  return done(Buffer.from(NOT_INSTALLED));\n               }\n\n               fail(error);\n            },\n         });\n      },\n   };\n}\n\nconst parsers: LineParser<VersionResult>[] = [\n   new LineParser(\n      /version (\\d+)\\.(\\d+)\\.(\\d+)(?:\\s*\\((.+)\\))?/,\n      (result, [major, minor, patch, agent = '']) => {\n         Object.assign(\n            result,\n            versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)\n         );\n      }\n   ),\n   new LineParser(\n      /version (\\d+)\\.(\\d+)\\.(\\D+)(.+)?$/,\n      (result, [major, minor, patch, agent = '']) => {\n         Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent));\n      }\n   ),\n];\n\nfunction versionParser(stdOut: string) {\n   if (stdOut === NOT_INSTALLED) {\n      return notInstalledResponse();\n   }\n\n   return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers, stdOut);\n}\n","import { SimpleGitBase } from '../../typings';\nimport { taskCallback } from './task-callback';\nimport { changeWorkingDirectoryTask } from './tasks/change-working-directory';\nimport checkout from './tasks/checkout';\nimport countObjects from './tasks/count-objects';\nimport commit from './tasks/commit';\nimport config from './tasks/config';\nimport firstCommit from './tasks/first-commit';\nimport grep from './tasks/grep';\nimport { hashObjectTask } from './tasks/hash-object';\nimport { initTask } from './tasks/init';\nimport log from './tasks/log';\nimport { mergeTask } from './tasks/merge';\nimport { pushTask } from './tasks/push';\nimport show from './tasks/show';\nimport { statusTask } from './tasks/status';\nimport { configurationErrorTask, straightThroughStringTask } from './tasks/task';\nimport version from './tasks/version';\nimport { outputHandler, SimpleGitExecutor, SimpleGitTask, SimpleGitTaskCallback } from './types';\nimport {\n   asArray,\n   filterString,\n   filterType,\n   getTrailingOptions,\n   trailingFunctionArgument,\n} from './utils';\n\nexport class SimpleGitApi implements SimpleGitBase {\n   constructor(private _executor: SimpleGitExecutor) {}\n\n   protected _runTask<T>(task: SimpleGitTask<T>, then?: SimpleGitTaskCallback<T>) {\n      const chain = this._executor.chain();\n      const promise = chain.push(task);\n\n      if (then) {\n         taskCallback(task, promise, then);\n      }\n\n      return Object.create(this, {\n         then: { value: promise.then.bind(promise) },\n         catch: { value: promise.catch.bind(promise) },\n         _executor: { value: chain },\n      });\n   }\n\n   add(files: string | string[]) {\n      return this._runTask(\n         straightThroughStringTask(['add', ...asArray(files)]),\n         trailingFunctionArgument(arguments)\n      );\n   }\n\n   cwd(directory: string | { path: string; root?: boolean }) {\n      const next = trailingFunctionArgument(arguments);\n\n      if (typeof directory === 'string') {\n         return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next);\n      }\n\n      if (typeof directory?.path === 'string') {\n         return this._runTask(\n            changeWorkingDirectoryTask(\n               directory.path,\n               (directory.root && this._executor) || undefined\n            ),\n            next\n         );\n      }\n\n      return this._runTask(\n         configurationErrorTask('Git.cwd: workingDirectory must be supplied as a string'),\n         next\n      );\n   }\n\n   hashObject(path: string, write: boolean | unknown) {\n      return this._runTask(\n         hashObjectTask(path, write === true),\n         trailingFunctionArgument(arguments)\n      );\n   }\n\n   init(bare?: boolean | unknown) {\n      return this._runTask(\n         initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)),\n         trailingFunctionArgument(arguments)\n      );\n   }\n\n   merge() {\n      return this._runTask(\n         mergeTask(getTrailingOptions(arguments)),\n         trailingFunctionArgument(arguments)\n      );\n   }\n\n   mergeFromTo(remote: string, branch: string) {\n      if (!(filterString(remote) && filterString(branch))) {\n         return this._runTask(\n            configurationErrorTask(\n               `Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`\n            )\n         );\n      }\n\n      return this._runTask(\n         mergeTask([remote, branch, ...getTrailingOptions(arguments)]),\n         trailingFunctionArgument(arguments, false)\n      );\n   }\n\n   outputHandler(handler: outputHandler) {\n      this._executor.outputHandler = handler;\n      return this;\n   }\n\n   push() {\n      const task = pushTask(\n         {\n            remote: filterType(arguments[0], filterString),\n            branch: filterType(arguments[1], filterString),\n         },\n         getTrailingOptions(arguments)\n      );\n\n      return this._runTask(task, trailingFunctionArgument(arguments));\n   }\n\n   stash() {\n      return this._runTask(\n         straightThroughStringTask(['stash', ...getTrailingOptions(arguments)]),\n         trailingFunctionArgument(arguments)\n      );\n   }\n\n   status() {\n      return this._runTask(\n         statusTask(getTrailingOptions(arguments)),\n         trailingFunctionArgument(arguments)\n      );\n   }\n}\n\nObject.assign(\n   SimpleGitApi.prototype,\n   checkout(),\n   commit(),\n   config(),\n   countObjects(),\n   firstCommit(),\n   grep(),\n   log(),\n   show(),\n   version()\n);\n","import { append, remove } from '../utils';\nimport { createDeferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { createLogger } from '../git-logger';\n\ntype ScheduleCompleteCallback = () => void;\ntype ScheduledTask = Pick<DeferredPromise<ScheduleCompleteCallback>, 'promise' | 'done'> & {\n   id: number;\n};\n\nconst createScheduledTask: () => ScheduledTask = (() => {\n   let id = 0;\n   return () => {\n      id++;\n      const { promise, done } = createDeferred<ScheduleCompleteCallback>();\n\n      return {\n         promise,\n         done,\n         id,\n      };\n   };\n})();\n\nexport class Scheduler {\n   private logger = createLogger('', 'scheduler');\n   private pending: ScheduledTask[] = [];\n   private running: ScheduledTask[] = [];\n\n   constructor(private concurrency = 2) {\n      this.logger(`Constructed, concurrency=%s`, concurrency);\n   }\n\n   private schedule() {\n      if (!this.pending.length || this.running.length >= this.concurrency) {\n         this.logger(\n            `Schedule attempt ignored, pending=%s running=%s concurrency=%s`,\n            this.pending.length,\n            this.running.length,\n            this.concurrency\n         );\n         return;\n      }\n\n      const task = append(this.running, this.pending.shift()!);\n      this.logger(`Attempting id=%s`, task.id);\n      task.done(() => {\n         this.logger(`Completing id=`, task.id);\n         remove(this.running, task);\n         this.schedule();\n      });\n   }\n\n   next(): Promise<ScheduleCompleteCallback> {\n      const { promise, id } = append(this.pending, createScheduledTask());\n      this.logger(`Scheduling id=%s`, id);\n\n      this.schedule();\n\n      return promise;\n   }\n}\n","import { straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\n\nexport type ApplyOptions = Options &\n   OptionFlags<\n      | '--stat'\n      | '--numstat'\n      | '--summary'\n      | '--check'\n      | '--index'\n      | '--intent-to-add'\n      | '--3way'\n      | '--apply'\n      | '--no-add'\n      | '-R'\n      | '--reverse'\n      | '--allow-binary-replacement'\n      | '--binary'\n      | '--reject'\n      | '-z'\n      | '--inaccurate-eof'\n      | '--recount'\n      | '--cached'\n      | '--ignore-space-change'\n      | '--ignore-whitespace'\n      | '--verbose'\n      | '--unsafe-paths'\n   > &\n   OptionFlags<'--whitespace', 'nowarn' | 'warn' | 'fix' | 'error' | 'error-all'> &\n   OptionFlags<'--build-fake-ancestor' | '--exclude' | '--include' | '--directory', string> &\n   OptionFlags<'-p' | '-C', number>;\n\nexport function applyPatchTask(patches: string[], customArgs: string[]): StringTask<string> {\n   return straightThroughStringTask(['apply', ...customArgs, ...patches]);\n}\n","import {\n   BranchMultiDeleteResult,\n   BranchSingleDeleteFailure,\n   BranchSingleDeleteResult,\n   BranchSingleDeleteSuccess,\n} from '../../../typings';\n\nexport class BranchDeletionBatch implements BranchMultiDeleteResult {\n   all: BranchSingleDeleteResult[] = [];\n   branches: { [branchName: string]: BranchSingleDeleteResult } = {};\n   errors: BranchSingleDeleteResult[] = [];\n\n   get success(): boolean {\n      return !this.errors.length;\n   }\n}\n\nexport function branchDeletionSuccess(branch: string, hash: string): BranchSingleDeleteSuccess {\n   return {\n      branch,\n      hash,\n      success: true,\n   };\n}\n\nexport function branchDeletionFailure(branch: string): BranchSingleDeleteFailure {\n   return {\n      branch,\n      hash: null,\n      success: false,\n   };\n}\n\nexport function isSingleBranchDeleteFailure(\n   test: BranchSingleDeleteResult\n): test is BranchSingleDeleteSuccess {\n   return test.success;\n}\n","import { BranchMultiDeleteResult } from '../../../typings';\nimport {\n   BranchDeletionBatch,\n   branchDeletionFailure,\n   branchDeletionSuccess,\n} from '../responses/BranchDeleteSummary';\nimport { TaskParser } from '../types';\nimport { ExitCodes, LineParser, parseStringResponse } from '../utils';\n\nconst deleteSuccessRegex = /(\\S+)\\s+\\(\\S+\\s([^)]+)\\)/;\nconst deleteErrorRegex = /^error[^']+'([^']+)'/m;\n\nconst parsers: LineParser<BranchMultiDeleteResult>[] = [\n   new LineParser(deleteSuccessRegex, (result, [branch, hash]) => {\n      const deletion = branchDeletionSuccess(branch, hash);\n\n      result.all.push(deletion);\n      result.branches[branch] = deletion;\n   }),\n   new LineParser(deleteErrorRegex, (result, [branch]) => {\n      const deletion = branchDeletionFailure(branch);\n\n      result.errors.push(deletion);\n      result.all.push(deletion);\n      result.branches[branch] = deletion;\n   }),\n];\n\nexport const parseBranchDeletions: TaskParser<string, BranchMultiDeleteResult> = (\n   stdOut,\n   stdErr\n) => {\n   return parseStringResponse(new BranchDeletionBatch(), parsers, [stdOut, stdErr]);\n};\n\nexport function hasBranchDeletionError(data: string, processExitCode: ExitCodes): boolean {\n   return processExitCode === ExitCodes.ERROR && deleteErrorRegex.test(data);\n}\n","import type { BranchSummary, BranchSummaryBranch } from '../../../typings';\n\nexport enum BranchStatusIdentifier {\n   CURRENT = '*',\n   LINKED = '+',\n}\n\nexport class BranchSummaryResult implements BranchSummary {\n   public all: string[] = [];\n   public branches: { [p: string]: BranchSummaryBranch } = {};\n   public current: string = '';\n   public detached: boolean = false;\n\n   push(\n      status: BranchStatusIdentifier | unknown,\n      detached: boolean,\n      name: string,\n      commit: string,\n      label: string\n   ) {\n      if (status === BranchStatusIdentifier.CURRENT) {\n         this.detached = detached;\n         this.current = name;\n      }\n\n      this.all.push(name);\n      this.branches[name] = {\n         current: status === BranchStatusIdentifier.CURRENT,\n         linkedWorkTree: status === BranchStatusIdentifier.LINKED,\n         name,\n         commit,\n         label,\n      };\n   }\n}\n","import type { BranchSummary } from '../../../typings';\nimport { BranchStatusIdentifier, BranchSummaryResult } from '../responses/BranchSummary';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<BranchSummaryResult>[] = [\n   new LineParser(\n      /^([*+]\\s)?\\((?:HEAD )?detached (?:from|at) (\\S+)\\)\\s+([a-z0-9]+)\\s(.*)$/,\n      (result, [current, name, commit, label]) => {\n         result.push(branchStatus(current), true, name, commit, label);\n      }\n   ),\n   new LineParser(\n      /^([*+]\\s)?(\\S+)\\s+([a-z0-9]+)\\s?(.*)$/s,\n      (result, [current, name, commit, label]) => {\n         result.push(branchStatus(current), false, name, commit, label);\n      }\n   ),\n];\n\nconst currentBranchParser = new LineParser<BranchSummaryResult>(/^(\\S+)$/s, (result, [name]) => {\n   result.push(BranchStatusIdentifier.CURRENT, false, name, '', '');\n});\n\nfunction branchStatus(input?: string) {\n   return input ? input.charAt(0) : '';\n}\n\nexport function parseBranchSummary(stdOut: string, currentOnly = false): BranchSummary {\n   return parseStringResponse(\n      new BranchSummaryResult(),\n      currentOnly ? [currentBranchParser] : parsers,\n      stdOut\n   );\n}\n","import { BranchMultiDeleteResult, BranchSingleDeleteResult, BranchSummary } from '../../../typings';\nimport { StringTask } from '../types';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { hasBranchDeletionError, parseBranchDeletions } from '../parsers/parse-branch-delete';\nimport { parseBranchSummary } from '../parsers/parse-branch';\nimport { bufferToString } from '../utils';\n\nexport function containsDeleteBranchCommand(commands: string[]) {\n   const deleteCommands = ['-d', '-D', '--delete'];\n   return commands.some((command) => deleteCommands.includes(command));\n}\n\nexport function branchTask(\n   customArgs: string[]\n): StringTask<BranchSummary | BranchSingleDeleteResult> {\n   const isDelete = containsDeleteBranchCommand(customArgs);\n   const isCurrentOnly = customArgs.includes('--show-current');\n\n   const commands = ['branch', ...customArgs];\n\n   if (commands.length === 1) {\n      commands.push('-a');\n   }\n\n   if (!commands.includes('-v')) {\n      commands.splice(1, 0, '-v');\n   }\n\n   return {\n      format: 'utf-8',\n      commands,\n      parser(stdOut, stdErr) {\n         if (isDelete) {\n            return parseBranchDeletions(stdOut, stdErr).all[0];\n         }\n\n         return parseBranchSummary(stdOut, isCurrentOnly);\n      },\n   };\n}\n\nexport function branchLocalTask(): StringTask<BranchSummary> {\n   return {\n      format: 'utf-8',\n      commands: ['branch', '-v'],\n      parser(stdOut) {\n         return parseBranchSummary(stdOut);\n      },\n   };\n}\n\nexport function deleteBranchesTask(\n   branches: string[],\n   forceDelete = false\n): StringTask<BranchMultiDeleteResult> {\n   return {\n      format: 'utf-8',\n      commands: ['branch', '-v', forceDelete ? '-D' : '-d', ...branches],\n      parser(stdOut, stdErr) {\n         return parseBranchDeletions(stdOut, stdErr);\n      },\n      onError({ exitCode, stdOut }, error, done, fail) {\n         if (!hasBranchDeletionError(String(error), exitCode)) {\n            return fail(error);\n         }\n\n         done(stdOut);\n      },\n   };\n}\n\nexport function deleteBranchTask(\n   branch: string,\n   forceDelete = false\n): StringTask<BranchSingleDeleteResult> {\n   const task: StringTask<BranchSingleDeleteResult> = {\n      format: 'utf-8',\n      commands: ['branch', '-v', forceDelete ? '-D' : '-d', branch],\n      parser(stdOut, stdErr) {\n         return parseBranchDeletions(stdOut, stdErr).branches[branch]!;\n      },\n      onError({ exitCode, stdErr, stdOut }, error, _, fail) {\n         if (!hasBranchDeletionError(String(error), exitCode)) {\n            return fail(error);\n         }\n\n         throw new GitResponseError(\n            task.parser(bufferToString(stdOut), bufferToString(stdErr)),\n            String(error)\n         );\n      },\n   };\n\n   return task;\n}\n","import { normalize } from 'node:path';\n\n/**\n * Parser for the `check-ignore` command - returns each file as a string array\n */\nexport const parseCheckIgnore = (text: string): string[] => {\n   return text.split(/\\n/g).map(toPath).filter(Boolean);\n};\n\nfunction toPath(input: string) {\n   const path = input.trim().replace(/^[\"']|[\"']$/g, '');\n   return path && normalize(path);\n}\n","import { StringTask } from '../types';\nimport { parseCheckIgnore } from '../responses/CheckIgnore';\n\nexport function checkIgnoreTask(paths: string[]): StringTask<string[]> {\n   return {\n      commands: ['check-ignore', ...paths],\n      format: 'utf-8',\n      parser: parseCheckIgnore,\n   };\n}\n","import { configurationErrorTask, EmptyTask, straightThroughStringTask } from './task';\nimport { OptionFlags, Options, StringTask } from '../types';\nimport { append, filterString } from '../utils';\n\nexport type CloneOptions = Options &\n   OptionFlags<\n      | '--bare'\n      | '--dissociate'\n      | '--mirror'\n      | '--no-checkout'\n      | '--no-remote-submodules'\n      | '--no-shallow-submodules'\n      | '--no-single-branch'\n      | '--no-tags'\n      | '--remote-submodules'\n      | '--single-branch'\n      | '--shallow-submodules'\n      | '--verbose'\n   > &\n   OptionFlags<'--depth' | '-j' | '--jobs', number> &\n   OptionFlags<\n      | '--branch'\n      | '--origin'\n      | '--recurse-submodules'\n      | '--separate-git-dir'\n      | '--shallow-exclude'\n      | '--shallow-since'\n      | '--template',\n      string\n   >;\n\nfunction disallowedCommand(command: string) {\n   return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function cloneTask(\n   repo: string | undefined,\n   directory: string | undefined,\n   customArgs: string[]\n): StringTask<string> | EmptyTask {\n   const commands = ['clone', ...customArgs];\n\n   filterString(repo) && commands.push(repo);\n   filterString(directory) && commands.push(directory);\n\n   const banned = commands.find(disallowedCommand);\n   if (banned) {\n      return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n   }\n\n   return straightThroughStringTask(commands);\n}\n\nexport function cloneMirrorTask(\n   repo: string | undefined,\n   directory: string | undefined,\n   customArgs: string[]\n) {\n   append(customArgs, '--mirror');\n\n   return cloneTask(repo, directory, customArgs);\n}\n","import { FetchResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<FetchResult>[] = [\n   new LineParser(/From (.+)$/, (result, [remote]) => {\n      result.remote = remote;\n   }),\n   new LineParser(/\\* \\[new branch]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n      result.branches.push({\n         name,\n         tracking,\n      });\n   }),\n   new LineParser(/\\* \\[new tag]\\s+(\\S+)\\s*-> (.+)$/, (result, [name, tracking]) => {\n      result.tags.push({\n         name,\n         tracking,\n      });\n   }),\n   new LineParser(/- \\[deleted]\\s+\\S+\\s*-> (.+)$/, (result, [tracking]) => {\n      result.deleted.push({\n         tracking,\n      });\n   }),\n   new LineParser(\n      /\\s*([^.]+)\\.\\.(\\S+)\\s+(\\S+)\\s*-> (.+)$/,\n      (result, [from, to, name, tracking]) => {\n         result.updated.push({\n            name,\n            tracking,\n            to,\n            from,\n         });\n      }\n   ),\n];\n\nexport function parseFetchResult(stdOut: string, stdErr: string): FetchResult {\n   const result: FetchResult = {\n      raw: stdOut,\n      remote: null,\n      branches: [],\n      tags: [],\n      updated: [],\n      deleted: [],\n   };\n   return parseStringResponse(result, parsers, [stdOut, stdErr]);\n}\n","import { FetchResult } from '../../../typings';\nimport { parseFetchResult } from '../parsers/parse-fetch';\nimport { StringTask } from '../types';\n\nimport { configurationErrorTask, EmptyTask } from './task';\n\nfunction disallowedCommand(command: string) {\n   return /^--upload-pack(=|$)/.test(command);\n}\n\nexport function fetchTask(\n   remote: string,\n   branch: string,\n   customArgs: string[]\n): StringTask<FetchResult> | EmptyTask {\n   const commands = ['fetch', ...customArgs];\n   if (remote && branch) {\n      commands.push(remote, branch);\n   }\n\n   const banned = commands.find(disallowedCommand);\n   if (banned) {\n      return configurationErrorTask(`git.fetch: potential exploit argument blocked.`);\n   }\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser: parseFetchResult,\n   };\n}\n","import { MoveResult } from '../../../typings';\nimport { LineParser, parseStringResponse } from '../utils';\n\nconst parsers: LineParser<MoveResult>[] = [\n   new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => {\n      result.moves.push({ from, to });\n   }),\n];\n\nexport function parseMoveResult(stdOut: string): MoveResult {\n   return parseStringResponse({ moves: [] }, parsers, stdOut);\n}\n","import { MoveResult } from '../../../typings';\nimport { parseMoveResult } from '../parsers/parse-move';\nimport { StringTask } from '../types';\nimport { asArray } from '../utils';\n\nexport function moveTask(from: string | string[], to: string): StringTask<MoveResult> {\n   return {\n      commands: ['mv', '-v', ...asArray(from), to],\n      format: 'utf-8',\n      parser: parseMoveResult,\n   };\n}\n","import { PullResult } from '../../../typings';\nimport { GitResponseError } from '../errors/git-response-error';\nimport { parsePullErrorResult, parsePullResult } from '../parsers/parse-pull';\nimport { Maybe, StringTask } from '../types';\nimport { bufferToString } from '../utils';\n\nexport function pullTask(\n   remote: Maybe<string>,\n   branch: Maybe<string>,\n   customArgs: string[]\n): StringTask<PullResult> {\n   const commands: string[] = ['pull', ...customArgs];\n   if (remote && branch) {\n      commands.splice(1, 0, remote, branch);\n   }\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser(stdOut, stdErr): PullResult {\n         return parsePullResult(stdOut, stdErr);\n      },\n      onError(result, _error, _done, fail) {\n         const pullError = parsePullErrorResult(\n            bufferToString(result.stdOut),\n            bufferToString(result.stdErr)\n         );\n         if (pullError) {\n            return fail(new GitResponseError(pullError));\n         }\n\n         fail(_error);\n      },\n   };\n}\n","import { forEachLineWithContent } from '../utils';\n\nexport interface RemoteWithoutRefs {\n   name: string;\n}\n\nexport interface RemoteWithRefs extends RemoteWithoutRefs {\n   refs: {\n      fetch: string;\n      push: string;\n   };\n}\n\nexport function parseGetRemotes(text: string): RemoteWithoutRefs[] {\n   const remotes: { [name: string]: RemoteWithoutRefs } = {};\n\n   forEach(text, ([name]) => (remotes[name] = { name }));\n\n   return Object.values(remotes);\n}\n\nexport function parseGetRemotesVerbose(text: string): RemoteWithRefs[] {\n   const remotes: { [name: string]: RemoteWithRefs } = {};\n\n   forEach(text, ([name, url, purpose]) => {\n      if (!Object.hasOwn(remotes, name)) {\n         remotes[name] = {\n            name: name,\n            refs: { fetch: '', push: '' },\n         };\n      }\n\n      if (purpose && url) {\n         remotes[name].refs[purpose.replace(/[^a-z]/g, '') as keyof RemoteWithRefs['refs']] = url;\n      }\n   });\n\n   return Object.values(remotes);\n}\n\nfunction forEach(text: string, handler: (line: string[]) => void) {\n   forEachLineWithContent(text, (line) => handler(line.split(/\\s+/)));\n}\n","import {\n   parseGetRemotes,\n   parseGetRemotesVerbose,\n   type RemoteWithoutRefs,\n   type RemoteWithRefs,\n} from '../responses/GetRemoteSummary';\nimport type { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addRemoteTask(\n   remoteName: string,\n   remoteRepo: string,\n   customArgs: string[]\n): StringTask<string> {\n   return straightThroughStringTask(['remote', 'add', ...customArgs, remoteName, remoteRepo]);\n}\n\nexport function getRemotesTask(verbose: true): StringTask<RemoteWithRefs[]>;\nexport function getRemotesTask(verbose: false): StringTask<RemoteWithoutRefs[]>;\nexport function getRemotesTask(\n   verbose: boolean\n): StringTask<RemoteWithRefs[] | RemoteWithoutRefs[]> {\n   const commands = ['remote'];\n   if (verbose) {\n      commands.push('-v');\n   }\n\n   return {\n      commands,\n      format: 'utf-8',\n      parser: verbose ? parseGetRemotesVerbose : parseGetRemotes,\n   };\n}\n\nexport function listRemotesTask(customArgs: string[]): StringTask<string> {\n   const commands = [...customArgs];\n   if (commands[0] !== 'ls-remote') {\n      commands.unshift('ls-remote');\n   }\n\n   return straightThroughStringTask(commands);\n}\n\nexport function remoteTask(customArgs: string[]): StringTask<string> {\n   const commands = [...customArgs];\n   if (commands[0] !== 'remote') {\n      commands.unshift('remote');\n   }\n\n   return straightThroughStringTask(commands);\n}\n\nexport function removeRemoteTask(remoteName: string) {\n   return straightThroughStringTask(['remote', 'remove', remoteName]);\n}\n","import { LogOptions, LogResult } from '../../../typings';\nimport { logFormatFromCommand } from '../args/log-format';\nimport { createListLogSummaryParser } from '../parsers/parse-list-log-summary';\nimport type { StringTask } from '../types';\nimport { validateLogFormatConfig } from './diff';\nimport { parseLogOptions } from './log';\nimport type { EmptyTask } from './task';\n\nexport function stashListTask(\n   opt: LogOptions = {},\n   customArgs: string[]\n): EmptyTask | StringTask<LogResult> {\n   const options = parseLogOptions<any>(opt);\n   const commands = ['stash', 'list', ...options.commands, ...customArgs];\n   const parser = createListLogSummaryParser(\n      options.splitter,\n      options.fields,\n      logFormatFromCommand(commands)\n   );\n\n   return (\n      validateLogFormatConfig(commands) || {\n         commands,\n         format: 'utf-8',\n         parser,\n      }\n   );\n}\n","import { StringTask } from '../types';\nimport { straightThroughStringTask } from './task';\n\nexport function addSubModuleTask(repo: string, path: string): StringTask<string> {\n   return subModuleTask(['add', repo, path]);\n}\n\nexport function initSubModuleTask(customArgs: string[]): StringTask<string> {\n   return subModuleTask(['init', ...customArgs]);\n}\n\nexport function subModuleTask(customArgs: string[]): StringTask<string> {\n   const commands = [...customArgs];\n   if (commands[0] !== 'submodule') {\n      commands.unshift('submodule');\n   }\n\n   return straightThroughStringTask(commands);\n}\n\nexport function updateSubModuleTask(customArgs: string[]): StringTask<string> {\n   return subModuleTask(['update', ...customArgs]);\n}\n","import { TagResult } from '../../../typings';\n\nexport class TagList implements TagResult {\n   constructor(\n      public readonly all: string[],\n      public readonly latest: string | undefined\n   ) {}\n}\n\nexport const parseTagList = function (data: string, customSort = false) {\n   const tags = data.split('\\n').map(trimmed).filter(Boolean);\n\n   if (!customSort) {\n      tags.sort(function (tagA, tagB) {\n         const partsA = tagA.split('.');\n         const partsB = tagB.split('.');\n\n         if (partsA.length === 1 || partsB.length === 1) {\n            return singleSorted(toNumber(partsA[0]), toNumber(partsB[0]));\n         }\n\n         for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) {\n            const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i]));\n\n            if (diff) {\n               return diff;\n            }\n         }\n\n         return 0;\n      });\n   }\n\n   const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf('.') >= 0);\n\n   return new TagList(tags, latest);\n};\n\nfunction singleSorted(a: number, b: number): number {\n   const aIsNum = Number.isNaN(a);\n   const bIsNum = Number.isNaN(b);\n\n   if (aIsNum !== bIsNum) {\n      return aIsNum ? 1 : -1;\n   }\n\n   return aIsNum ? sorted(a, b) : 0;\n}\n\nfunction sorted(a: number, b: number) {\n   return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction trimmed(input: string) {\n   return input.trim();\n}\n\nfunction toNumber(input: string | undefined) {\n   if (typeof input === 'string') {\n      return parseInt(input.replace(/^\\D+/g, ''), 10) || 0;\n   }\n\n   return 0;\n}\n","import { TagResult } from '../../../typings';\nimport { parseTagList } from '../responses/TagList';\nimport { StringTask } from '../types';\n\n/**\n * Task used by `git.tags`\n */\nexport function tagListTask(customArgs: string[] = []): StringTask<TagResult> {\n   const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option));\n\n   return {\n      format: 'utf-8',\n      commands: ['tag', '-l', ...customArgs],\n      parser(text: string) {\n         return parseTagList(text, hasCustomSort);\n      },\n   };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addTagTask(name: string): StringTask<{ name: string }> {\n   return {\n      format: 'utf-8',\n      commands: ['tag', name],\n      parser() {\n         return { name };\n      },\n   };\n}\n\n/**\n * Task used by `git.addTag`\n */\nexport function addAnnotatedTagTask(\n   name: string,\n   tagMessage: string\n): StringTask<{ name: string }> {\n   return {\n      format: 'utf-8',\n      commands: ['tag', '-a', '-m', tagMessage, name],\n      parser() {\n         return { name };\n      },\n   };\n}\n","const { GitExecutor } = require('./lib/runners/git-executor');\nconst { SimpleGitApi } = require('./lib/simple-git-api');\n\nconst { Scheduler } = require('./lib/runners/scheduler');\nconst { configurationErrorTask } = require('./lib/tasks/task');\nconst {\n   asArray,\n   filterArray,\n   filterPrimitives,\n   filterString,\n   filterStringOrStringArray,\n   filterType,\n   getTrailingOptions,\n   trailingFunctionArgument,\n   trailingOptionsArgument,\n} = require('./lib/utils');\nconst { applyPatchTask } = require('./lib/tasks/apply-patch');\nconst {\n   branchTask,\n   branchLocalTask,\n   deleteBranchesTask,\n   deleteBranchTask,\n} = require('./lib/tasks/branch');\nconst { checkIgnoreTask } = require('./lib/tasks/check-ignore');\nconst { checkIsRepoTask } = require('./lib/tasks/check-is-repo');\nconst { cloneTask, cloneMirrorTask } = require('./lib/tasks/clone');\nconst { cleanWithOptionsTask, isCleanOptionsArray } = require('./lib/tasks/clean');\nconst { diffSummaryTask } = require('./lib/tasks/diff');\nconst { fetchTask } = require('./lib/tasks/fetch');\nconst { moveTask } = require('./lib/tasks/move');\nconst { pullTask } = require('./lib/tasks/pull');\nconst { pushTagsTask } = require('./lib/tasks/push');\nconst {\n   addRemoteTask,\n   getRemotesTask,\n   listRemotesTask,\n   remoteTask,\n   removeRemoteTask,\n} = require('./lib/tasks/remote');\nconst { getResetMode, resetTask } = require('./lib/tasks/reset');\nconst { stashListTask } = require('./lib/tasks/stash-list');\nconst {\n   addSubModuleTask,\n   initSubModuleTask,\n   subModuleTask,\n   updateSubModuleTask,\n} = require('./lib/tasks/sub-module');\nconst { addAnnotatedTagTask, addTagTask, tagListTask } = require('./lib/tasks/tag');\nconst { straightThroughBufferTask, straightThroughStringTask } = require('./lib/tasks/task');\n\nfunction Git(options, plugins) {\n   this._plugins = plugins;\n   this._executor = new GitExecutor(\n      options.baseDir,\n      new Scheduler(options.maxConcurrentProcesses),\n      plugins\n   );\n\n   this._trimmed = options.trimmed;\n}\n\n(Git.prototype = Object.create(SimpleGitApi.prototype)).constructor = Git;\n\n/**\n * Sets the path to a custom git binary, should either be `git` when there is an installation of git available on\n * the system path, or a fully qualified path to the executable.\n */\nGit.prototype.customBinary = function (command) {\n   this._plugins.reconfigure('binary', command);\n   return this;\n};\n\n/**\n * Sets an environment variable for the spawned child process, either supply both a name and value as strings or\n * a single object to entirely replace the current environment variables.\n *\n * @param {string|Object} name\n * @param {string} [value]\n * @returns {Git}\n */\nGit.prototype.env = function (name, value) {\n   if (arguments.length === 1 && typeof name === 'object') {\n      this._executor.env = name;\n   } else {\n      (this._executor.env = this._executor.env || {})[name] = value;\n   }\n\n   return this;\n};\n\n/**\n * List the stash(s) of the local repo\n */\nGit.prototype.stashList = function (options) {\n   return this._runTask(\n      stashListTask(\n         trailingOptionsArgument(arguments) || {},\n         (filterArray(options) && options) || []\n      ),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nfunction createCloneTask(api, task, repoPath, localPath) {\n   if (typeof repoPath !== 'string') {\n      return configurationErrorTask(`git.${api}() requires a string 'repoPath'`);\n   }\n\n   return task(repoPath, filterType(localPath, filterString), getTrailingOptions(arguments));\n}\n\n/**\n * Clone a git repo\n */\nGit.prototype.clone = function () {\n   return this._runTask(\n      createCloneTask('clone', cloneTask, ...arguments),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Mirror a git repo\n */\nGit.prototype.mirror = function () {\n   return this._runTask(\n      createCloneTask('mirror', cloneMirrorTask, ...arguments),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Moves one or more files to a new destination.\n *\n * @see https://git-scm.com/docs/git-mv\n *\n * @param {string|string[]} from\n * @param {string} to\n */\nGit.prototype.mv = function (from, to) {\n   return this._runTask(moveTask(from, to), trailingFunctionArgument(arguments));\n};\n\n/**\n * Internally uses pull and tags to get the list of tags then checks out the latest tag.\n *\n * @param {Function} [then]\n */\nGit.prototype.checkoutLatestTag = function (then) {\n   var git = this;\n   return this.pull(function () {\n      git.tags(function (err, tags) {\n         git.checkout(tags.latest, then);\n      });\n   });\n};\n\n/**\n * Pull the updated contents of the current repo\n */\nGit.prototype.pull = function (remote, branch, options, then) {\n   return this._runTask(\n      pullTask(\n         filterType(remote, filterString),\n         filterType(branch, filterString),\n         getTrailingOptions(arguments)\n      ),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Fetch the updated contents of the current repo.\n *\n * @example\n *   .fetch('upstream', 'master') // fetches from master on remote named upstream\n *   .fetch(function () {}) // runs fetch against default remote and branch and calls function\n *\n * @param {string} [remote]\n * @param {string} [branch]\n */\nGit.prototype.fetch = function (remote, branch) {\n   return this._runTask(\n      fetchTask(\n         filterType(remote, filterString),\n         filterType(branch, filterString),\n         getTrailingOptions(arguments)\n      ),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Disables/enables the use of the console for printing warnings and errors, by default messages are not shown in\n * a production environment.\n *\n * @param {boolean} silence\n * @returns {Git}\n */\nGit.prototype.silent = function (silence) {\n   console.warn(\n      'simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3'\n   );\n   return this;\n};\n\n/**\n * List all tags. When using git 2.7.0 or above, include an options object with `\"--sort\": \"property-name\"` to\n * sort the tags by that property instead of using the default semantic versioning sort.\n *\n * Note, supplying this option when it is not supported by your Git version will cause the operation to fail.\n *\n * @param {Object} [options]\n * @param {Function} [then]\n */\nGit.prototype.tags = function (options, then) {\n   return this._runTask(\n      tagListTask(getTrailingOptions(arguments)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Rebases the current working copy. Options can be supplied either as an array of string parameters\n * to be sent to the `git rebase` command, or a standard options object.\n */\nGit.prototype.rebase = function () {\n   return this._runTask(\n      straightThroughStringTask(['rebase', ...getTrailingOptions(arguments)]),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Reset a repo\n */\nGit.prototype.reset = function (mode) {\n   return this._runTask(\n      resetTask(getResetMode(mode), getTrailingOptions(arguments)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Revert one or more commits in the local working copy\n */\nGit.prototype.revert = function (commit) {\n   const next = trailingFunctionArgument(arguments);\n\n   if (typeof commit !== 'string') {\n      return this._runTask(configurationErrorTask('Commit must be a string'), next);\n   }\n\n   return this._runTask(\n      straightThroughStringTask(['revert', ...getTrailingOptions(arguments, 0, true), commit]),\n      next\n   );\n};\n\n/**\n * Add a lightweight tag to the head of the current branch\n */\nGit.prototype.addTag = function (name) {\n   const task =\n      typeof name === 'string'\n         ? addTagTask(name)\n         : configurationErrorTask('Git.addTag requires a tag name');\n\n   return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Add an annotated tag to the head of the current branch\n */\nGit.prototype.addAnnotatedTag = function (tagName, tagMessage) {\n   return this._runTask(\n      addAnnotatedTagTask(tagName, tagMessage),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Delete a local branch\n */\nGit.prototype.deleteLocalBranch = function (branchName, forceDelete, then) {\n   return this._runTask(\n      deleteBranchTask(branchName, typeof forceDelete === 'boolean' ? forceDelete : false),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Delete one or more local branches\n */\nGit.prototype.deleteLocalBranches = function (branchNames, forceDelete, then) {\n   return this._runTask(\n      deleteBranchesTask(branchNames, typeof forceDelete === 'boolean' ? forceDelete : false),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * List all branches\n *\n * @param {Object | string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.branch = function (options, then) {\n   return this._runTask(\n      branchTask(getTrailingOptions(arguments)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Return list of local branches\n *\n * @param {Function} [then]\n */\nGit.prototype.branchLocal = function (then) {\n   return this._runTask(branchLocalTask(), trailingFunctionArgument(arguments));\n};\n\n/**\n * Executes any command against the git binary.\n */\nGit.prototype.raw = function (commands) {\n   const createRestCommands = !Array.isArray(commands);\n   const command = [].slice.call(createRestCommands ? arguments : commands, 0);\n\n   for (let i = 0; i < command.length && createRestCommands; i++) {\n      if (!filterPrimitives(command[i])) {\n         command.splice(i, command.length - i);\n         break;\n      }\n   }\n\n   command.push(...getTrailingOptions(arguments, 0, true));\n\n   var next = trailingFunctionArgument(arguments);\n\n   if (!command.length) {\n      return this._runTask(\n         configurationErrorTask('Raw: must supply one or more command to execute'),\n         next\n      );\n   }\n\n   return this._runTask(straightThroughStringTask(command, this._trimmed), next);\n};\n\nGit.prototype.submoduleAdd = function (repo, path, then) {\n   return this._runTask(addSubModuleTask(repo, path), trailingFunctionArgument(arguments));\n};\n\nGit.prototype.submoduleUpdate = function (args, then) {\n   return this._runTask(\n      updateSubModuleTask(getTrailingOptions(arguments, true)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nGit.prototype.submoduleInit = function (args, then) {\n   return this._runTask(\n      initSubModuleTask(getTrailingOptions(arguments, true)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nGit.prototype.subModule = function (options, then) {\n   return this._runTask(\n      subModuleTask(getTrailingOptions(arguments)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nGit.prototype.listRemote = function () {\n   return this._runTask(\n      listRemotesTask(getTrailingOptions(arguments)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Adds a remote to the list of remotes.\n */\nGit.prototype.addRemote = function (remoteName, remoteRepo, then) {\n   return this._runTask(\n      addRemoteTask(remoteName, remoteRepo, getTrailingOptions(arguments)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Removes an entry by name from the list of remotes.\n */\nGit.prototype.removeRemote = function (remoteName, then) {\n   return this._runTask(removeRemoteTask(remoteName), trailingFunctionArgument(arguments));\n};\n\n/**\n * Gets the currently available remotes, setting the optional verbose argument to true includes additional\n * detail on the remotes themselves.\n */\nGit.prototype.getRemotes = function (verbose, then) {\n   return this._runTask(getRemotesTask(verbose === true), trailingFunctionArgument(arguments));\n};\n\n/**\n * Call any `git remote` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.remote = function (options, then) {\n   return this._runTask(\n      remoteTask(getTrailingOptions(arguments)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Call any `git tag` function with arguments passed as an array of strings.\n *\n * @param {string[]} options\n * @param {Function} [then]\n */\nGit.prototype.tag = function (options, then) {\n   const command = getTrailingOptions(arguments);\n\n   if (command[0] !== 'tag') {\n      command.unshift('tag');\n   }\n\n   return this._runTask(straightThroughStringTask(command), trailingFunctionArgument(arguments));\n};\n\n/**\n * Updates repository server info\n *\n * @param {Function} [then]\n */\nGit.prototype.updateServerInfo = function (then) {\n   return this._runTask(\n      straightThroughStringTask(['update-server-info']),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Pushes the current tag changes to a remote which can be either a URL or named remote. When not specified uses the\n * default configured remote spec.\n *\n * @param {string} [remote]\n * @param {Function} [then]\n */\nGit.prototype.pushTags = function (remote, then) {\n   const task = pushTagsTask(\n      { remote: filterType(remote, filterString) },\n      getTrailingOptions(arguments)\n   );\n\n   return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\n/**\n * Removes the named files from source control.\n */\nGit.prototype.rm = function (files) {\n   return this._runTask(\n      straightThroughStringTask(['rm', '-f', ...asArray(files)]),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Removes the named files from source control but keeps them on disk rather than deleting them entirely. To\n * completely remove the files, use `rm`.\n *\n * @param {string|string[]} files\n */\nGit.prototype.rmKeepLocal = function (files) {\n   return this._runTask(\n      straightThroughStringTask(['rm', '--cached', ...asArray(files)]),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n * Returns a list of objects in a tree based on commit hash. Passing in an object hash returns the object's content,\n * size, and type.\n *\n * Passing \"-p\" will instruct cat-file to determine the object type, and display its formatted contents.\n *\n * @param {string[]} [options]\n * @param {Function} [then]\n */\nGit.prototype.catFile = function (options, then) {\n   return this._catFile('utf-8', arguments);\n};\n\nGit.prototype.binaryCatFile = function () {\n   return this._catFile('buffer', arguments);\n};\n\nGit.prototype._catFile = function (format, args) {\n   var handler = trailingFunctionArgument(args);\n   var command = ['cat-file'];\n   var options = args[0];\n\n   if (typeof options === 'string') {\n      return this._runTask(\n         configurationErrorTask('Git.catFile: options must be supplied as an array of strings'),\n         handler\n      );\n   }\n\n   if (Array.isArray(options)) {\n      command.push.apply(command, options);\n   }\n\n   const task =\n      format === 'buffer' ? straightThroughBufferTask(command) : straightThroughStringTask(command);\n\n   return this._runTask(task, handler);\n};\n\nGit.prototype.diff = function (options, then) {\n   const task = filterString(options)\n      ? configurationErrorTask(\n           'git.diff: supplying options as a single string is no longer supported, switch to an array of strings'\n        )\n      : straightThroughStringTask(['diff', ...getTrailingOptions(arguments)]);\n\n   return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.diffSummary = function () {\n   return this._runTask(\n      diffSummaryTask(getTrailingOptions(arguments, 1)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nGit.prototype.applyPatch = function (patches) {\n   const task = !filterStringOrStringArray(patches)\n      ? configurationErrorTask(\n           `git.applyPatch requires one or more string patches as the first argument`\n        )\n      : applyPatchTask(asArray(patches), getTrailingOptions([].slice.call(arguments, 1)));\n\n   return this._runTask(task, trailingFunctionArgument(arguments));\n};\n\nGit.prototype.revparse = function () {\n   const commands = ['rev-parse', ...getTrailingOptions(arguments, true)];\n   return this._runTask(\n      straightThroughStringTask(commands, true),\n      trailingFunctionArgument(arguments)\n   );\n};\n\n/**\n */\nGit.prototype.clean = function (mode, options, then) {\n   const usingCleanOptionsArray = isCleanOptionsArray(mode);\n   const cleanMode =\n      (usingCleanOptionsArray && mode.join('')) || filterType(mode, filterString) || '';\n   const customArgs = getTrailingOptions([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0));\n\n   return this._runTask(\n      cleanWithOptionsTask(cleanMode, customArgs),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nGit.prototype.exec = function (then) {\n   const task = {\n      commands: [],\n      format: 'utf-8',\n      parser() {\n         if (typeof then === 'function') {\n            then();\n         }\n      },\n   };\n\n   return this._runTask(task);\n};\n\n/**\n * Clears the queue of pending commands and returns the wrapper instance for chaining.\n *\n * @returns {Git}\n */\nGit.prototype.clearQueue = function () {\n   // TODO:\n   // this._executor.clear();\n   return this;\n};\n\n/**\n * Check if a pathname or pathnames are excluded by .gitignore\n *\n * @param {string|string[]} pathnames\n * @param {Function} [then]\n */\nGit.prototype.checkIgnore = function (pathnames, then) {\n   return this._runTask(\n      checkIgnoreTask(asArray(filterType(pathnames, filterStringOrStringArray, []))),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nGit.prototype.checkIsRepo = function (checkType, then) {\n   return this._runTask(\n      checkIsRepoTask(filterType(checkType, filterString)),\n      trailingFunctionArgument(arguments)\n   );\n};\n\nmodule.exports = Git;\n","import { pathspec } from './args/pathspec';\nimport { GitConstructError } from './errors/git-construct-error';\nimport { GitError } from './errors/git-error';\nimport { GitPluginError } from './errors/git-plugin-error';\nimport { GitResponseError } from './errors/git-response-error';\nimport { TaskConfigurationError } from './errors/task-configuration-error';\nimport { CheckRepoActions } from './tasks/check-is-repo';\nimport { CleanOptions } from './tasks/clean';\nimport { GitConfigScope } from './tasks/config';\nimport { DiffNameStatus } from './tasks/diff-name-status';\nimport { grepQueryBuilder } from './tasks/grep';\nimport { ResetMode } from './tasks/reset';\n\nexport {\n   CheckRepoActions,\n   CleanOptions,\n   DiffNameStatus,\n   GitConfigScope,\n   GitConstructError,\n   GitError,\n   GitPluginError,\n   GitResponseError,\n   ResetMode,\n   TaskConfigurationError,\n   grepQueryBuilder,\n   pathspec,\n};\n","import { GitError } from './git-error';\nimport { SimpleGitOptions } from '../types';\n\n/**\n * The `GitConstructError` is thrown when an error occurs in the constructor\n * of the `simple-git` instance itself. Most commonly as a result of using\n * a `baseDir` option that points to a folder that either does not exist,\n * or cannot be read by the user the node script is running as.\n *\n * Check the `.message` property for more detail including the properties\n * passed to the constructor.\n */\nexport class GitConstructError extends GitError {\n   constructor(\n      public readonly config: SimpleGitOptions,\n      message: string\n   ) {\n      super(undefined, message);\n   }\n}\n","import { SimpleGitOptions, SimpleGitTask } from '../types';\nimport { GitError } from './git-error';\n\nexport class GitPluginError extends GitError {\n   constructor(\n      public task?: SimpleGitTask<any>,\n      public readonly plugin?: keyof SimpleGitOptions,\n      message?: string\n   ) {\n      super(task, message);\n      Object.setPrototypeOf(this, new.target.prototype);\n   }\n}\n","import { SimpleGitOptions } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function abortPlugin(signal: SimpleGitOptions['abort']) {\n   if (!signal) {\n      return;\n   }\n\n   const onSpawnAfter: SimpleGitPlugin<'spawn.after'> = {\n      type: 'spawn.after',\n      action(_data, context) {\n         function kill() {\n            context.kill(new GitPluginError(undefined, 'abort', 'Abort signal received'));\n         }\n\n         signal.addEventListener('abort', kill);\n\n         context.spawned.on('close', () => signal.removeEventListener('abort', kill));\n      },\n   };\n\n   const onSpawnBefore: SimpleGitPlugin<'spawn.before'> = {\n      type: 'spawn.before',\n      action(_data, context) {\n         if (signal.aborted) {\n            context.kill(new GitPluginError(undefined, 'abort', 'Abort already signaled'));\n         }\n      },\n   };\n\n   return [onSpawnBefore, onSpawnAfter];\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport type { SimpleGitPluginConfig } from '../types';\n\nfunction isConfigSwitch(arg: string | unknown) {\n   return typeof arg === 'string' && arg.trim().toLowerCase() === '-c';\n}\n\nfunction preventProtocolOverride(arg: string, next: string) {\n   if (!isConfigSwitch(arg)) {\n      return;\n   }\n\n   if (!/^\\s*protocol(.[a-z]+)?.allow/.test(next)) {\n      return;\n   }\n\n   throw new GitPluginError(\n      undefined,\n      'unsafe',\n      'Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol'\n   );\n}\n\nfunction preventUploadPack(arg: string, method: string) {\n   if (/^\\s*--(upload|receive)-pack/.test(arg)) {\n      throw new GitPluginError(\n         undefined,\n         'unsafe',\n         `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`\n      );\n   }\n\n   if (method === 'clone' && /^\\s*-u\\b/.test(arg)) {\n      throw new GitPluginError(\n         undefined,\n         'unsafe',\n         `Use of clone with option -u is not permitted without enabling allowUnsafePack`\n      );\n   }\n\n   if (method === 'push' && /^\\s*--exec\\b/.test(arg)) {\n      throw new GitPluginError(\n         undefined,\n         'unsafe',\n         `Use of push with option --exec is not permitted without enabling allowUnsafePack`\n      );\n   }\n}\n\nexport function blockUnsafeOperationsPlugin({\n   allowUnsafeProtocolOverride = false,\n   allowUnsafePack = false,\n}: SimpleGitPluginConfig['unsafe'] = {}): SimpleGitPlugin<'spawn.args'> {\n   return {\n      type: 'spawn.args',\n      action(args, context) {\n         args.forEach((current, index) => {\n            const next = index < args.length ? args[index + 1] : '';\n\n            allowUnsafeProtocolOverride || preventProtocolOverride(current, next);\n            allowUnsafePack || preventUploadPack(current, context.method);\n         });\n\n         return args;\n      },\n   };\n}\n","import { prefixedArray } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function commandConfigPrefixingPlugin(\n   configuration: string[]\n): SimpleGitPlugin<'spawn.args'> {\n   const prefix = prefixedArray(configuration, '-c');\n\n   return {\n      type: 'spawn.args',\n      action(data) {\n         return [...prefix, ...data];\n      },\n   };\n}\n","import { deferred, DeferredPromise } from '@kwsites/promise-deferred';\nimport { SimpleGitPluginConfig } from '../types';\nimport { delay } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nconst never = deferred().promise;\n\nexport function completionDetectionPlugin({\n   onClose = true,\n   onExit = 50,\n}: SimpleGitPluginConfig['completion'] = {}): SimpleGitPlugin<'spawn.after'> {\n   function createEvents() {\n      let exitCode = -1;\n      const events = {\n         close: deferred(),\n         closeTimeout: deferred(),\n         exit: deferred(),\n         exitTimeout: deferred(),\n      };\n\n      const result = Promise.race([\n         onClose === false ? never : events.closeTimeout.promise,\n         onExit === false ? never : events.exitTimeout.promise,\n      ]);\n\n      configureTimeout(onClose, events.close, events.closeTimeout);\n      configureTimeout(onExit, events.exit, events.exitTimeout);\n\n      return {\n         close(code: number) {\n            exitCode = code;\n            events.close.done();\n         },\n         exit(code: number) {\n            exitCode = code;\n            events.exit.done();\n         },\n         get exitCode() {\n            return exitCode;\n         },\n         result,\n      };\n   }\n\n   function configureTimeout(\n      flag: boolean | number,\n      event: DeferredPromise<void>,\n      timeout: DeferredPromise<void>\n   ) {\n      if (flag === false) {\n         return;\n      }\n\n      (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done);\n   }\n\n   return {\n      type: 'spawn.after',\n      async action(_data, { spawned, close }) {\n         const events = createEvents();\n\n         let deferClose = true;\n         let quickClose = () => void (deferClose = false);\n\n         spawned.stdout?.on('data', quickClose);\n         spawned.stderr?.on('data', quickClose);\n         spawned.on('error', quickClose);\n\n         spawned.on('close', (code: number) => events.close(code));\n         spawned.on('exit', (code: number) => events.exit(code));\n\n         try {\n            await events.result;\n            if (deferClose) {\n               await delay(50);\n            }\n            close(events.exitCode);\n         } catch (err) {\n            close(events.exitCode, err as Error);\n         }\n      },\n   };\n}\n","import type { SimpleGitOptions } from '../types';\n\nimport { GitPluginError } from '../errors/git-plugin-error';\nimport { asArray } from '../utils';\nimport { PluginStore } from './plugin-store';\n\nconst WRONG_NUMBER_ERR = `Invalid value supplied for custom binary, requires a single string or an array containing either one or two strings`;\nconst WRONG_CHARS_ERR = `Invalid value supplied for custom binary, restricted characters must be removed or supply the unsafe.allowUnsafeCustomBinary option`;\n\nfunction isBadArgument(arg: string) {\n   return !arg || !/^([a-z]:)?([a-z0-9/.\\\\_-]+)$/i.test(arg);\n}\n\nfunction toBinaryConfig(\n   input: string[],\n   allowUnsafe: boolean\n): { binary: string; prefix?: string } {\n   if (input.length < 1 || input.length > 2) {\n      throw new GitPluginError(undefined, 'binary', WRONG_NUMBER_ERR);\n   }\n\n   const isBad = input.some(isBadArgument);\n   if (isBad) {\n      if (allowUnsafe) {\n         console.warn(WRONG_CHARS_ERR);\n      } else {\n         throw new GitPluginError(undefined, 'binary', WRONG_CHARS_ERR);\n      }\n   }\n\n   const [binary, prefix] = input;\n   return {\n      binary,\n      prefix,\n   };\n}\n\nexport function customBinaryPlugin(\n   plugins: PluginStore,\n   input: SimpleGitOptions['binary'] = ['git'],\n   allowUnsafe = false\n) {\n   let config = toBinaryConfig(asArray(input), allowUnsafe);\n\n   plugins.on('binary', (input) => {\n      config = toBinaryConfig(asArray(input), allowUnsafe);\n   });\n\n   plugins.append('spawn.binary', () => {\n      return config.binary;\n   });\n\n   plugins.append('spawn.args', (data) => {\n      return config.prefix ? [config.prefix, ...data] : data;\n   });\n}\n","import { GitError } from '../errors/git-error';\nimport { GitExecutorResult, SimpleGitPluginConfig } from '../types';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\ntype TaskResult = Omit<GitExecutorResult, 'rejection'>;\n\nfunction isTaskError(result: TaskResult) {\n   return !!(result.exitCode && result.stdErr.length);\n}\n\nfunction getErrorMessage(result: TaskResult) {\n   return Buffer.concat([...result.stdOut, ...result.stdErr]);\n}\n\nexport function errorDetectionHandler(\n   overwrite = false,\n   isError = isTaskError,\n   errorMessage: (result: TaskResult) => Buffer | Error = getErrorMessage\n) {\n   return (error: Buffer | Error | undefined, result: TaskResult) => {\n      if ((!overwrite && error) || !isError(result)) {\n         return error;\n      }\n\n      return errorMessage(result);\n   };\n}\n\nexport function errorDetectionPlugin(\n   config: SimpleGitPluginConfig['errors']\n): SimpleGitPlugin<'task.error'> {\n   return {\n      type: 'task.error',\n      action(data, context) {\n         const error = config(data.error, {\n            stdErr: context.stdErr,\n            stdOut: context.stdOut,\n            exitCode: context.exitCode,\n         });\n\n         if (Buffer.isBuffer(error)) {\n            return { error: new GitError(undefined, error.toString('utf-8')) };\n         }\n\n         return {\n            error,\n         };\n      },\n   };\n}\n","import { EventEmitter } from 'node:events';\n\nimport type {\n   SimpleGitPlugin,\n   SimpleGitPluginType,\n   SimpleGitPluginTypes,\n} from './simple-git-plugin';\nimport { append, asArray } from '../utils';\nimport type { SimpleGitPluginConfig } from '../types';\n\nexport class PluginStore {\n   private plugins: Set<SimpleGitPlugin<SimpleGitPluginType>> = new Set();\n   private events = new EventEmitter();\n\n   on<K extends keyof SimpleGitPluginConfig>(\n      type: K,\n      listener: (data: SimpleGitPluginConfig[K]) => void\n   ) {\n      this.events.on(type, listener);\n   }\n\n   reconfigure<K extends keyof SimpleGitPluginConfig>(type: K, data: SimpleGitPluginConfig[K]) {\n      this.events.emit(type, data);\n   }\n\n   public append<T extends SimpleGitPluginType>(type: T, action: SimpleGitPlugin<T>['action']) {\n      const plugin = append(this.plugins, { type, action });\n\n      return () => this.plugins.delete(plugin);\n   }\n\n   public add<T extends SimpleGitPluginType>(\n      plugin: void | SimpleGitPlugin<T> | SimpleGitPlugin<T>[]\n   ) {\n      const plugins: SimpleGitPlugin<T>[] = [];\n\n      asArray(plugin).forEach((plugin) => plugin && this.plugins.add(append(plugins, plugin)));\n\n      return () => {\n         plugins.forEach((plugin) => this.plugins.delete(plugin));\n      };\n   }\n\n   public exec<T extends SimpleGitPluginType>(\n      type: T,\n      data: SimpleGitPluginTypes[T]['data'],\n      context: SimpleGitPluginTypes[T]['context']\n   ): typeof data {\n      let output = data;\n      const contextual = Object.freeze(Object.create(context));\n\n      for (const plugin of this.plugins) {\n         if (plugin.type === type) {\n            output = plugin.action(output, contextual);\n         }\n      }\n\n      return output;\n   }\n}\n","import { SimpleGitOptions } from '../types';\nimport { asNumber, including } from '../utils';\n\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function progressMonitorPlugin(progress: Exclude<SimpleGitOptions['progress'], void>) {\n   const progressCommand = '--progress';\n   const progressMethods = ['checkout', 'clone', 'fetch', 'pull', 'push'];\n\n   const onProgress: SimpleGitPlugin<'spawn.after'> = {\n      type: 'spawn.after',\n      action(_data, context) {\n         if (!context.commands.includes(progressCommand)) {\n            return;\n         }\n\n         context.spawned.stderr?.on('data', (chunk: Buffer) => {\n            const message = /^([\\s\\S]+?):\\s*(\\d+)% \\((\\d+)\\/(\\d+)\\)/.exec(chunk.toString('utf8'));\n            if (!message) {\n               return;\n            }\n\n            progress({\n               method: context.method,\n               stage: progressEventStage(message[1]),\n               progress: asNumber(message[2]),\n               processed: asNumber(message[3]),\n               total: asNumber(message[4]),\n            });\n         });\n      },\n   };\n\n   const onArgs: SimpleGitPlugin<'spawn.args'> = {\n      type: 'spawn.args',\n      action(args, context) {\n         if (!progressMethods.includes(context.method)) {\n            return args;\n         }\n\n         return including(args, progressCommand);\n      },\n   };\n\n   return [onArgs, onProgress];\n}\n\nfunction progressEventStage(input: string) {\n   return String(input.toLowerCase().split(' ', 1)) || 'unknown';\n}\n","import { SpawnOptions } from 'child_process';\nimport { pick } from '../utils';\nimport { SimpleGitPlugin } from './simple-git-plugin';\n\nexport function spawnOptionsPlugin(\n   spawnOptions: Partial<SpawnOptions>\n): SimpleGitPlugin<'spawn.options'> {\n   const options = pick(spawnOptions, ['uid', 'gid']);\n\n   return {\n      type: 'spawn.options',\n      action(data) {\n         return { ...options, ...data };\n      },\n   };\n}\n","import type { SimpleGitPlugin } from './simple-git-plugin';\n\nimport type { SimpleGitOptions } from '../types';\nimport { GitPluginError } from '../errors/git-plugin-error';\n\nexport function timeoutPlugin({\n   block,\n   stdErr = true,\n   stdOut = true,\n}: Exclude<SimpleGitOptions['timeout'], undefined>): SimpleGitPlugin<'spawn.after'> | void {\n   if (block > 0) {\n      return {\n         type: 'spawn.after',\n         action(_data, context) {\n            let timeout: NodeJS.Timeout;\n\n            function wait() {\n               timeout && clearTimeout(timeout);\n               timeout = setTimeout(kill, block);\n            }\n\n            function stop() {\n               context.spawned.stdout?.off('data', wait);\n               context.spawned.stderr?.off('data', wait);\n               context.spawned.off('exit', stop);\n               context.spawned.off('close', stop);\n               timeout && clearTimeout(timeout);\n            }\n\n            function kill() {\n               stop();\n               context.kill(new GitPluginError(undefined, 'timeout', `block timeout reached`));\n            }\n\n            stdOut && context.spawned.stdout?.on('data', wait);\n            stdErr && context.spawned.stderr?.on('data', wait);\n            context.spawned.on('exit', stop);\n            context.spawned.on('close', stop);\n\n            wait();\n         },\n      };\n   }\n}\n","import { SimpleGitPlugin } from './simple-git-plugin';\nimport { isPathSpec, toPaths } from '../args/pathspec';\n\nexport function suffixPathsPlugin(): SimpleGitPlugin<'spawn.args'> {\n   return {\n      type: 'spawn.args',\n      action(data) {\n         const prefix: string[] = [];\n         let suffix: undefined | string[];\n         function append(args: string[]) {\n            (suffix = suffix || []).push(...args);\n         }\n\n         for (let i = 0; i < data.length; i++) {\n            const param = data[i];\n\n            if (isPathSpec(param)) {\n               append(toPaths(param));\n               continue;\n            }\n\n            if (param === '--') {\n               append(\n                  data.slice(i + 1).flatMap((item) => (isPathSpec(item) && toPaths(item)) || item)\n               );\n               break;\n            }\n\n            prefix.push(param);\n         }\n\n         return !suffix ? prefix : [...prefix, '--', ...suffix.map(String)];\n      },\n   };\n}\n","import { SimpleGitFactory } from '../../typings';\n\nimport * as api from './api';\nimport {\n   abortPlugin,\n   blockUnsafeOperationsPlugin,\n   commandConfigPrefixingPlugin,\n   completionDetectionPlugin,\n   customBinaryPlugin,\n   errorDetectionHandler,\n   errorDetectionPlugin,\n   PluginStore,\n   progressMonitorPlugin,\n   spawnOptionsPlugin,\n   timeoutPlugin,\n} from './plugins';\nimport { suffixPathsPlugin } from './plugins/suffix-paths.plugin';\nimport { createInstanceConfig, folderExists } from './utils';\nimport { SimpleGitOptions } from './types';\n\nconst Git = require('../git');\n\n/**\n * Adds the necessary properties to the supplied object to enable it for use as\n * the default export of a module.\n *\n * Eg: `module.exports = esModuleFactory({ something () {} })`\n */\nexport function esModuleFactory<T>(defaultExport: T) {\n   return Object.defineProperties(defaultExport, {\n      __esModule: { value: true },\n      default: { value: defaultExport },\n   }) as T & { __esModule: true; default: T };\n}\n\nexport function gitExportFactory(factory: SimpleGitFactory) {\n   return Object.assign(factory.bind(null), api);\n}\n\nexport function gitInstanceFactory(\n   baseDir?: string | Partial<SimpleGitOptions>,\n   options?: Partial<SimpleGitOptions>\n) {\n   const plugins = new PluginStore();\n   const config = createInstanceConfig(\n      (baseDir && (typeof baseDir === 'string' ? { baseDir } : baseDir)) || {},\n      options\n   );\n\n   if (!folderExists(config.baseDir)) {\n      throw new api.GitConstructError(\n         config,\n         `Cannot use simple-git on a directory that does not exist`\n      );\n   }\n\n   if (Array.isArray(config.config)) {\n      plugins.add(commandConfigPrefixingPlugin(config.config));\n   }\n\n   plugins.add(blockUnsafeOperationsPlugin(config.unsafe));\n   plugins.add(suffixPathsPlugin());\n   plugins.add(completionDetectionPlugin(config.completion));\n   config.abort && plugins.add(abortPlugin(config.abort));\n   config.progress && plugins.add(progressMonitorPlugin(config.progress));\n   config.timeout && plugins.add(timeoutPlugin(config.timeout));\n   config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions));\n\n   plugins.add(errorDetectionPlugin(errorDetectionHandler(true)));\n   config.errors && plugins.add(errorDetectionPlugin(config.errors));\n\n   customBinaryPlugin(plugins, config.binary, config.unsafe?.allowUnsafeCustomBinary);\n\n   return new Git(config, plugins);\n}\n","import { SimpleGit, SimpleGitOptions } from '../../../typings';\n\nimport { GitResponseError } from '../errors/git-response-error';\nimport { gitInstanceFactory } from '../git-factory';\nimport { SimpleGitTaskCallback } from '../types';\n\nconst functionNamesBuilderApi = ['customBinary', 'env', 'outputHandler', 'silent'];\n\nconst functionNamesPromiseApi = [\n   'add',\n   'addAnnotatedTag',\n   'addConfig',\n   'addRemote',\n   'addTag',\n   'applyPatch',\n   'binaryCatFile',\n   'branch',\n   'branchLocal',\n   'catFile',\n   'checkIgnore',\n   'checkIsRepo',\n   'checkout',\n   'checkoutBranch',\n   'checkoutLatestTag',\n   'checkoutLocalBranch',\n   'clean',\n   'clone',\n   'commit',\n   'cwd',\n   'deleteLocalBranch',\n   'deleteLocalBranches',\n   'diff',\n   'diffSummary',\n   'exec',\n   'fetch',\n   'getRemotes',\n   'init',\n   'listConfig',\n   'listRemote',\n   'log',\n   'merge',\n   'mergeFromTo',\n   'mirror',\n   'mv',\n   'pull',\n   'push',\n   'pushTags',\n   'raw',\n   'rebase',\n   'remote',\n   'removeRemote',\n   'reset',\n   'revert',\n   'revparse',\n   'rm',\n   'rmKeepLocal',\n   'show',\n   'stash',\n   'stashList',\n   'status',\n   'subModule',\n   'submoduleAdd',\n   'submoduleInit',\n   'submoduleUpdate',\n   'tag',\n   'tags',\n   'updateServerInfo',\n];\n\nexport function gitP(\n   ...args: [] | [string] | [Partial<SimpleGitOptions>] | [string, Partial<SimpleGitOptions>]\n): SimpleGit {\n   let git: any;\n\n   let chain = Promise.resolve();\n\n   try {\n      git = gitInstanceFactory(...args);\n   } catch (e) {\n      chain = Promise.reject(e);\n   }\n\n   function builderReturn() {\n      return promiseApi;\n   }\n\n   function chainReturn() {\n      return chain;\n   }\n\n   const promiseApi = [...functionNamesBuilderApi, ...functionNamesPromiseApi].reduce(\n      (api: any, name: string) => {\n         const isAsync = functionNamesPromiseApi.includes(name);\n\n         const valid = isAsync ? asyncWrapper(name, git) : syncWrapper(name, git, api);\n         const alternative = isAsync ? chainReturn : builderReturn;\n\n         Object.defineProperty(api, name, {\n            enumerable: false,\n            configurable: false,\n            value: git ? valid : alternative,\n         });\n\n         return api;\n      },\n      {}\n   );\n\n   return promiseApi as SimpleGit;\n\n   function asyncWrapper(fn: string, git: any): (...args: any[]) => Promise<any> {\n      return function (...args: any[]) {\n         if (typeof args[args.length] === 'function') {\n            throw new TypeError(\n               'Promise interface requires that handlers are not supplied inline, ' +\n                  'trailing function not allowed in call to ' +\n                  fn\n            );\n         }\n\n         return chain.then(function () {\n            return new Promise(function (resolve, reject) {\n               const callback: SimpleGitTaskCallback = (err: Error | null, result?: any) => {\n                  if (err) {\n                     return reject(toError(err));\n                  }\n\n                  resolve(result);\n               };\n               args.push(callback);\n\n               git[fn].apply(git, args);\n            });\n         });\n      };\n   }\n\n   function syncWrapper(fn: string, git: any, api: SimpleGit) {\n      return (...args: any[]) => {\n         git[fn](...args);\n\n         return api;\n      };\n   }\n}\n\nfunction toError(error: Error | string | any): Error {\n   if (error instanceof Error) {\n      return error;\n   }\n\n   if (typeof error === 'string') {\n      return new Error(error);\n   }\n\n   return new GitResponseError(error);\n}\n","import { gitInstanceFactory } from './lib/git-factory';\n\nexport { gitP } from './lib/runners/promise-wrapped';\nexport * from './lib/api';\n\nexport const simpleGit = gitInstanceFactory;\n\nexport default gitInstanceFactory;\n","import { type SimpleGit, simpleGit } from \"simple-git\";\nimport type { CommitInfo } from \"../types.js\";\n\nexport class GitClient {\n    private git: SimpleGit;\n    private repoPath: string;\n\n    constructor(repoPath: string) {\n        this.repoPath = repoPath;\n        this.git = simpleGit(repoPath);\n    }\n\n    async exec(args: string[]): Promise<string> {\n        return this.git.raw(args);\n    }\n\n    async execWithInput(args: string[], input: string): Promise<string> {\n        // simple-git's raw() doesn't support stdin directly,\n        // so we use spawn for commands that need stdin (e.g. git am)\n        const { spawn } = await import(\"node:child_process\");\n\n        return new Promise((resolve, reject) => {\n            const proc = spawn(\"git\", args, { cwd: this.repoPath });\n            let stdout = \"\";\n            let stderr = \"\";\n\n            proc.stdout.on(\"data\", (data: Buffer) => {\n                stdout += data.toString();\n            });\n            proc.stderr.on(\"data\", (data: Buffer) => {\n                stderr += data.toString();\n            });\n\n            proc.on(\"error\", (err) => {\n                reject(new Error(`git ${args.join(\" \")} failed to spawn: ${err.message}`));\n            });\n\n            // git may exit (success or failure) before consuming all of stdin\n            // (e.g. `git apply` rejecting a large patch early). The resulting\n            // EPIPE on the stdin socket must be swallowed — the outcome is\n            // decided by the exit code in the \"close\" handler.\n            proc.stdin.on(\"error\", () => {});\n\n            proc.on(\"close\", (code) => {\n                if (code === 0) {\n                    resolve(stdout);\n                } else {\n                    reject(new Error(`git ${args.join(\" \")} failed (code ${code}): ${stderr}`));\n                }\n            });\n\n            proc.stdin.write(input);\n            proc.stdin.end();\n        });\n    }\n\n    async formatPatch(commitSha: string): Promise<string> {\n        return this.exec([\"format-patch\", \"-1\", commitSha, \"--stdout\"]);\n    }\n\n    async applyPatch(patchContent: string): Promise<void> {\n        await this.execWithInput([\"am\", \"--3way\"], patchContent);\n    }\n\n    async getTreeHash(commitSha: string): Promise<string> {\n        return (await this.exec([\"rev-parse\", `${commitSha}^{tree}`])).trim();\n    }\n\n    async showFile(treeish: string, filePath: string): Promise<string | null> {\n        try {\n            return await this.exec([\"show\", `${treeish}:${filePath}`]);\n        } catch {\n            return null;\n        }\n    }\n\n    async getCommitInfo(commitSha: string): Promise<CommitInfo> {\n        const format = \"%H%x00%an%x00%ae%x00%s\";\n        const output = await this.exec([\"log\", \"-1\", `--format=${format}`, commitSha]);\n        const [sha, authorName, authorEmail, message] = output.trim().split(\"\\0\");\n        return { sha, authorName, authorEmail, message };\n    }\n\n    async getCommitParents(commitSha: string): Promise<string[]> {\n        const output = await this.exec([\"rev-parse\", `${commitSha}^@`]);\n        return output.trim().split(\"\\n\").filter(Boolean);\n    }\n\n    /**\n     * Detects renames and copies between two trees.\n     *\n     * Both `R` (rename) and `C` (copy) entries are returned as `{from, to}` pairs.\n     * Copies are treated as rename-equivalent because the generator may produce the\n     * new path while the old path remains in the tree (e.g., imperfect cleanup,\n     * customer edits at the old path, or test helpers that only write new files).\n     * Callers that care about \"is the source still present\" should verify via\n     * `showFile(toTree, from)`.\n     */\n    async detectRenames(fromTree: string, toTree: string): Promise<Array<{ from: string; to: string }>> {\n        try {\n            // --find-copies (-C) catches the case where the generator writes the new path\n            // but leaves the old path in the tree (e.g., when the generator's cleanup step\n            // didn't run, or customer edits at the old path kept it present). Rename\n            // detection alone requires the old path to be deleted; copy detection does not.\n            const output = await this.exec([\n                \"diff\", \"--find-renames\", \"--find-copies\", \"--name-status\", fromTree, toTree\n            ]);\n            const renames: Array<{ from: string; to: string }> = [];\n            for (const line of output.trim().split(\"\\n\")) {\n                if (!line) continue;\n                // Lines look like: R095\\told/path.ts\\tnew/path.ts  (rename, 95% similarity)\n                //              or: C095\\tsrc/path.ts\\tnew/path.ts  (copy,   95% similarity)\n                if (line.startsWith(\"R\") || line.startsWith(\"C\")) {\n                    const parts = line.split(\"\\t\");\n                    if (parts.length >= 3) {\n                        renames.push({ from: parts[1]!, to: parts[2]! });\n                    }\n                }\n            }\n            return renames;\n        } catch {\n            return [];\n        }\n    }\n\n    async isAncestor(commit: string, descendant: string): Promise<boolean> {\n        try {\n            const mergeBase = (await this.exec([\"merge-base\", commit, descendant])).trim();\n            return mergeBase === commit;\n        } catch {\n            // No common ancestor (e.g., orphan branches)\n            return false;\n        }\n    }\n\n    async commitExists(sha: string): Promise<boolean> {\n        try {\n            const type = await this.exec([\"cat-file\", \"-t\", sha]);\n            return type.trim() === \"commit\";\n        } catch {\n            return false;\n        }\n    }\n\n    async treeExists(treeHash: string): Promise<boolean> {\n        try {\n            const type = await this.exec([\"cat-file\", \"-t\", treeHash]);\n            return type.trim() === \"tree\";\n        } catch {\n            return false;\n        }\n    }\n\n    async getCommitBody(commitSha: string): Promise<string> {\n        return this.exec([\"log\", \"-1\", \"--format=%B\", commitSha]);\n    }\n\n    getRepoPath(): string {\n        return this.repoPath;\n    }\n}\n","'use strict';\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n  if (a instanceof RegExp) a = maybeMatch(a, str);\n  if (b instanceof RegExp) b = maybeMatch(b, str);\n\n  var r = range(a, b, str);\n\n  return r && {\n    start: r[0],\n    end: r[1],\n    pre: str.slice(0, r[0]),\n    body: str.slice(r[0] + a.length, r[1]),\n    post: str.slice(r[1] + b.length)\n  };\n}\n\nfunction maybeMatch(reg, str) {\n  var m = str.match(reg);\n  return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n  var begs, beg, left, right, result;\n  var ai = str.indexOf(a);\n  var bi = str.indexOf(b, ai + 1);\n  var i = ai;\n\n  if (ai >= 0 && bi > 0) {\n    if(a===b) {\n      return [ai, bi];\n    }\n    begs = [];\n    left = str.length;\n\n    while (i >= 0 && !result) {\n      if (i == ai) {\n        begs.push(i);\n        ai = str.indexOf(a, i + 1);\n      } else if (begs.length == 1) {\n        result = [ begs.pop(), bi ];\n      } else {\n        beg = begs.pop();\n        if (beg < left) {\n          left = beg;\n          right = bi;\n        }\n\n        bi = str.indexOf(b, i + 1);\n      }\n\n      i = ai < bi && ai >= 0 ? ai : bi;\n    }\n\n    if (begs.length) {\n      result = [ left, right ];\n    }\n  }\n\n  return result;\n}\n","var balanced = require('balanced-match');\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n  return parseInt(str, 10) == str\n    ? parseInt(str, 10)\n    : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n  return str.split('\\\\\\\\').join(escSlash)\n            .split('\\\\{').join(escOpen)\n            .split('\\\\}').join(escClose)\n            .split('\\\\,').join(escComma)\n            .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n  return str.split(escSlash).join('\\\\')\n            .split(escOpen).join('{')\n            .split(escClose).join('}')\n            .split(escComma).join(',')\n            .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n  if (!str)\n    return [''];\n\n  var parts = [];\n  var m = balanced('{', '}', str);\n\n  if (!m)\n    return str.split(',');\n\n  var pre = m.pre;\n  var body = m.body;\n  var post = m.post;\n  var p = pre.split(',');\n\n  p[p.length-1] += '{' + body + '}';\n  var postParts = parseCommaParts(post);\n  if (post.length) {\n    p[p.length-1] += postParts.shift();\n    p.push.apply(p, postParts);\n  }\n\n  parts.push.apply(parts, p);\n\n  return parts;\n}\n\nfunction expandTop(str) {\n  if (!str)\n    return [];\n\n  // I don't know why Bash 4.3 does this, but it does.\n  // Anything starting with {} will have the first two bytes preserved\n  // but *only* at the top level, so {},a}b will not expand to anything,\n  // but a{},b}c will be expanded to [a}c,abc].\n  // One could argue that this is a bug in Bash, but since the goal of\n  // this module is to match Bash's rules, we escape a leading {}\n  if (str.substr(0, 2) === '{}') {\n    str = '\\\\{\\\\}' + str.substr(2);\n  }\n\n  return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction embrace(str) {\n  return '{' + str + '}';\n}\nfunction isPadded(el) {\n  return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n  return i <= y;\n}\nfunction gte(i, y) {\n  return i >= y;\n}\n\nfunction expand(str, isTop) {\n  var expansions = [];\n\n  var m = balanced('{', '}', str);\n  if (!m) return [str];\n\n  // no need to expand pre, since it is guaranteed to be free of brace-sets\n  var pre = m.pre;\n  var post = m.post.length\n    ? expand(m.post, false)\n    : [''];\n\n  if (/\\$$/.test(m.pre)) {    \n    for (var k = 0; k < post.length; k++) {\n      var expansion = pre+ '{' + m.body + '}' + post[k];\n      expansions.push(expansion);\n    }\n  } else {\n    var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n    var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n    var isSequence = isNumericSequence || isAlphaSequence;\n    var isOptions = m.body.indexOf(',') >= 0;\n    if (!isSequence && !isOptions) {\n      // {a},b}\n      if (m.post.match(/,(?!,).*\\}/)) {\n        str = m.pre + '{' + m.body + escClose + m.post;\n        return expand(str);\n      }\n      return [str];\n    }\n\n    var n;\n    if (isSequence) {\n      n = m.body.split(/\\.\\./);\n    } else {\n      n = parseCommaParts(m.body);\n      if (n.length === 1) {\n        // x{{a,b}}y ==> x{a}y x{b}y\n        n = expand(n[0], false).map(embrace);\n        if (n.length === 1) {\n          return post.map(function(p) {\n            return m.pre + n[0] + p;\n          });\n        }\n      }\n    }\n\n    // at this point, n is the parts, and we know it's not a comma set\n    // with a single entry.\n    var N;\n\n    if (isSequence) {\n      var x = numeric(n[0]);\n      var y = numeric(n[1]);\n      var width = Math.max(n[0].length, n[1].length)\n      var incr = n.length == 3\n        ? Math.abs(numeric(n[2]))\n        : 1;\n      var test = lte;\n      var reverse = y < x;\n      if (reverse) {\n        incr *= -1;\n        test = gte;\n      }\n      var pad = n.some(isPadded);\n\n      N = [];\n\n      for (var i = x; test(i, y); i += incr) {\n        var c;\n        if (isAlphaSequence) {\n          c = String.fromCharCode(i);\n          if (c === '\\\\')\n            c = '';\n        } else {\n          c = String(i);\n          if (pad) {\n            var need = width - c.length;\n            if (need > 0) {\n              var z = new Array(need + 1).join('0');\n              if (i < 0)\n                c = '-' + z + c.slice(1);\n              else\n                c = z + c;\n            }\n          }\n        }\n        N.push(c);\n      }\n    } else {\n      N = [];\n\n      for (var j = 0; j < n.length; j++) {\n        N.push.apply(N, expand(n[j], false));\n      }\n    }\n\n    for (var j = 0; j < N.length; j++) {\n      for (var k = 0; k < post.length; k++) {\n        var expansion = pre + N[j] + post[k];\n        if (!isTop || isSequence || expansion)\n          expansions.push(expansion);\n      }\n    }\n  }\n\n  return expansions;\n}\n\n","'use strict';\n\nconst ALIAS = Symbol.for('yaml.alias');\nconst DOC = Symbol.for('yaml.document');\nconst MAP = Symbol.for('yaml.map');\nconst PAIR = Symbol.for('yaml.pair');\nconst SCALAR = Symbol.for('yaml.scalar');\nconst SEQ = Symbol.for('yaml.seq');\nconst NODE_TYPE = Symbol.for('yaml.node.type');\nconst isAlias = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === ALIAS;\nconst isDocument = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === DOC;\nconst isMap = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === MAP;\nconst isPair = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === PAIR;\nconst isScalar = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SCALAR;\nconst isSeq = (node) => !!node && typeof node === 'object' && node[NODE_TYPE] === SEQ;\nfunction isCollection(node) {\n    if (node && typeof node === 'object')\n        switch (node[NODE_TYPE]) {\n            case MAP:\n            case SEQ:\n                return true;\n        }\n    return false;\n}\nfunction isNode(node) {\n    if (node && typeof node === 'object')\n        switch (node[NODE_TYPE]) {\n            case ALIAS:\n            case MAP:\n            case SCALAR:\n            case SEQ:\n                return true;\n        }\n    return false;\n}\nconst hasAnchor = (node) => (isScalar(node) || isCollection(node)) && !!node.anchor;\n\nexports.ALIAS = ALIAS;\nexports.DOC = DOC;\nexports.MAP = MAP;\nexports.NODE_TYPE = NODE_TYPE;\nexports.PAIR = PAIR;\nexports.SCALAR = SCALAR;\nexports.SEQ = SEQ;\nexports.hasAnchor = hasAnchor;\nexports.isAlias = isAlias;\nexports.isCollection = isCollection;\nexports.isDocument = isDocument;\nexports.isMap = isMap;\nexports.isNode = isNode;\nexports.isPair = isPair;\nexports.isScalar = isScalar;\nexports.isSeq = isSeq;\n","'use strict';\n\nvar identity = require('./nodes/identity.js');\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove node');\n/**\n * Apply a visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n *   - `key`: For sequence values and map `Pair`, the node's index in the\n *     collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n *     `null` for the root node.\n *   - `node`: The current node.\n *   - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n *   - `undefined` (default): Do nothing and continue\n *   - `visit.SKIP`: Do not visit the children of this node, continue with next\n *     sibling\n *   - `visit.BREAK`: Terminate traversal completely\n *   - `visit.REMOVE`: Remove the current node, then continue with the next one\n *   - `Node`: Replace the current node, then continue by visiting it\n *   - `number`: While iterating the items of a sequence or map, set the index\n *     of the next step. This is useful especially if the index of the current\n *     node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nfunction visit(node, visitor) {\n    const visitor_ = initVisitor(visitor);\n    if (identity.isDocument(node)) {\n        const cd = visit_(null, node.contents, visitor_, Object.freeze([node]));\n        if (cd === REMOVE)\n            node.contents = null;\n    }\n    else\n        visit_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisit.SKIP = SKIP;\n/** Remove the current node */\nvisit.REMOVE = REMOVE;\nfunction visit_(key, node, visitor, path) {\n    const ctrl = callVisitor(key, node, visitor, path);\n    if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n        replaceNode(key, path, ctrl);\n        return visit_(key, ctrl, visitor, path);\n    }\n    if (typeof ctrl !== 'symbol') {\n        if (identity.isCollection(node)) {\n            path = Object.freeze(path.concat(node));\n            for (let i = 0; i < node.items.length; ++i) {\n                const ci = visit_(i, node.items[i], visitor, path);\n                if (typeof ci === 'number')\n                    i = ci - 1;\n                else if (ci === BREAK)\n                    return BREAK;\n                else if (ci === REMOVE) {\n                    node.items.splice(i, 1);\n                    i -= 1;\n                }\n            }\n        }\n        else if (identity.isPair(node)) {\n            path = Object.freeze(path.concat(node));\n            const ck = visit_('key', node.key, visitor, path);\n            if (ck === BREAK)\n                return BREAK;\n            else if (ck === REMOVE)\n                node.key = null;\n            const cv = visit_('value', node.value, visitor, path);\n            if (cv === BREAK)\n                return BREAK;\n            else if (cv === REMOVE)\n                node.value = null;\n        }\n    }\n    return ctrl;\n}\n/**\n * Apply an async visitor to an AST node or document.\n *\n * Walks through the tree (depth-first) starting from `node`, calling a\n * `visitor` function with three arguments:\n *   - `key`: For sequence values and map `Pair`, the node's index in the\n *     collection. Within a `Pair`, `'key'` or `'value'`, correspondingly.\n *     `null` for the root node.\n *   - `node`: The current node.\n *   - `path`: The ancestry of the current node.\n *\n * The return value of the visitor may be used to control the traversal:\n *   - `Promise`: Must resolve to one of the following values\n *   - `undefined` (default): Do nothing and continue\n *   - `visit.SKIP`: Do not visit the children of this node, continue with next\n *     sibling\n *   - `visit.BREAK`: Terminate traversal completely\n *   - `visit.REMOVE`: Remove the current node, then continue with the next one\n *   - `Node`: Replace the current node, then continue by visiting it\n *   - `number`: While iterating the items of a sequence or map, set the index\n *     of the next step. This is useful especially if the index of the current\n *     node has changed.\n *\n * If `visitor` is a single function, it will be called with all values\n * encountered in the tree, including e.g. `null` values. Alternatively,\n * separate visitor functions may be defined for each `Map`, `Pair`, `Seq`,\n * `Alias` and `Scalar` node. To define the same visitor function for more than\n * one node type, use the `Collection` (map and seq), `Value` (map, seq & scalar)\n * and `Node` (alias, map, seq & scalar) targets. Of all these, only the most\n * specific defined one will be used for each node.\n */\nasync function visitAsync(node, visitor) {\n    const visitor_ = initVisitor(visitor);\n    if (identity.isDocument(node)) {\n        const cd = await visitAsync_(null, node.contents, visitor_, Object.freeze([node]));\n        if (cd === REMOVE)\n            node.contents = null;\n    }\n    else\n        await visitAsync_(null, node, visitor_, Object.freeze([]));\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisitAsync.BREAK = BREAK;\n/** Do not visit the children of the current node */\nvisitAsync.SKIP = SKIP;\n/** Remove the current node */\nvisitAsync.REMOVE = REMOVE;\nasync function visitAsync_(key, node, visitor, path) {\n    const ctrl = await callVisitor(key, node, visitor, path);\n    if (identity.isNode(ctrl) || identity.isPair(ctrl)) {\n        replaceNode(key, path, ctrl);\n        return visitAsync_(key, ctrl, visitor, path);\n    }\n    if (typeof ctrl !== 'symbol') {\n        if (identity.isCollection(node)) {\n            path = Object.freeze(path.concat(node));\n            for (let i = 0; i < node.items.length; ++i) {\n                const ci = await visitAsync_(i, node.items[i], visitor, path);\n                if (typeof ci === 'number')\n                    i = ci - 1;\n                else if (ci === BREAK)\n                    return BREAK;\n                else if (ci === REMOVE) {\n                    node.items.splice(i, 1);\n                    i -= 1;\n                }\n            }\n        }\n        else if (identity.isPair(node)) {\n            path = Object.freeze(path.concat(node));\n            const ck = await visitAsync_('key', node.key, visitor, path);\n            if (ck === BREAK)\n                return BREAK;\n            else if (ck === REMOVE)\n                node.key = null;\n            const cv = await visitAsync_('value', node.value, visitor, path);\n            if (cv === BREAK)\n                return BREAK;\n            else if (cv === REMOVE)\n                node.value = null;\n        }\n    }\n    return ctrl;\n}\nfunction initVisitor(visitor) {\n    if (typeof visitor === 'object' &&\n        (visitor.Collection || visitor.Node || visitor.Value)) {\n        return Object.assign({\n            Alias: visitor.Node,\n            Map: visitor.Node,\n            Scalar: visitor.Node,\n            Seq: visitor.Node\n        }, visitor.Value && {\n            Map: visitor.Value,\n            Scalar: visitor.Value,\n            Seq: visitor.Value\n        }, visitor.Collection && {\n            Map: visitor.Collection,\n            Seq: visitor.Collection\n        }, visitor);\n    }\n    return visitor;\n}\nfunction callVisitor(key, node, visitor, path) {\n    if (typeof visitor === 'function')\n        return visitor(key, node, path);\n    if (identity.isMap(node))\n        return visitor.Map?.(key, node, path);\n    if (identity.isSeq(node))\n        return visitor.Seq?.(key, node, path);\n    if (identity.isPair(node))\n        return visitor.Pair?.(key, node, path);\n    if (identity.isScalar(node))\n        return visitor.Scalar?.(key, node, path);\n    if (identity.isAlias(node))\n        return visitor.Alias?.(key, node, path);\n    return undefined;\n}\nfunction replaceNode(key, path, node) {\n    const parent = path[path.length - 1];\n    if (identity.isCollection(parent)) {\n        parent.items[key] = node;\n    }\n    else if (identity.isPair(parent)) {\n        if (key === 'key')\n            parent.key = node;\n        else\n            parent.value = node;\n    }\n    else if (identity.isDocument(parent)) {\n        parent.contents = node;\n    }\n    else {\n        const pt = identity.isAlias(parent) ? 'alias' : 'scalar';\n        throw new Error(`Cannot replace node with ${pt} parent`);\n    }\n}\n\nexports.visit = visit;\nexports.visitAsync = visitAsync;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\nconst escapeChars = {\n    '!': '%21',\n    ',': '%2C',\n    '[': '%5B',\n    ']': '%5D',\n    '{': '%7B',\n    '}': '%7D'\n};\nconst escapeTagName = (tn) => tn.replace(/[!,[\\]{}]/g, ch => escapeChars[ch]);\nclass Directives {\n    constructor(yaml, tags) {\n        /**\n         * The directives-end/doc-start marker `---`. If `null`, a marker may still be\n         * included in the document's stringified representation.\n         */\n        this.docStart = null;\n        /** The doc-end marker `...`.  */\n        this.docEnd = false;\n        this.yaml = Object.assign({}, Directives.defaultYaml, yaml);\n        this.tags = Object.assign({}, Directives.defaultTags, tags);\n    }\n    clone() {\n        const copy = new Directives(this.yaml, this.tags);\n        copy.docStart = this.docStart;\n        return copy;\n    }\n    /**\n     * During parsing, get a Directives instance for the current document and\n     * update the stream state according to the current version's spec.\n     */\n    atDocument() {\n        const res = new Directives(this.yaml, this.tags);\n        switch (this.yaml.version) {\n            case '1.1':\n                this.atNextDocument = true;\n                break;\n            case '1.2':\n                this.atNextDocument = false;\n                this.yaml = {\n                    explicit: Directives.defaultYaml.explicit,\n                    version: '1.2'\n                };\n                this.tags = Object.assign({}, Directives.defaultTags);\n                break;\n        }\n        return res;\n    }\n    /**\n     * @param onError - May be called even if the action was successful\n     * @returns `true` on success\n     */\n    add(line, onError) {\n        if (this.atNextDocument) {\n            this.yaml = { explicit: Directives.defaultYaml.explicit, version: '1.1' };\n            this.tags = Object.assign({}, Directives.defaultTags);\n            this.atNextDocument = false;\n        }\n        const parts = line.trim().split(/[ \\t]+/);\n        const name = parts.shift();\n        switch (name) {\n            case '%TAG': {\n                if (parts.length !== 2) {\n                    onError(0, '%TAG directive should contain exactly two parts');\n                    if (parts.length < 2)\n                        return false;\n                }\n                const [handle, prefix] = parts;\n                this.tags[handle] = prefix;\n                return true;\n            }\n            case '%YAML': {\n                this.yaml.explicit = true;\n                if (parts.length !== 1) {\n                    onError(0, '%YAML directive should contain exactly one part');\n                    return false;\n                }\n                const [version] = parts;\n                if (version === '1.1' || version === '1.2') {\n                    this.yaml.version = version;\n                    return true;\n                }\n                else {\n                    const isValid = /^\\d+\\.\\d+$/.test(version);\n                    onError(6, `Unsupported YAML version ${version}`, isValid);\n                    return false;\n                }\n            }\n            default:\n                onError(0, `Unknown directive ${name}`, true);\n                return false;\n        }\n    }\n    /**\n     * Resolves a tag, matching handles to those defined in %TAG directives.\n     *\n     * @returns Resolved tag, which may also be the non-specific tag `'!'` or a\n     *   `'!local'` tag, or `null` if unresolvable.\n     */\n    tagName(source, onError) {\n        if (source === '!')\n            return '!'; // non-specific tag\n        if (source[0] !== '!') {\n            onError(`Not a valid tag: ${source}`);\n            return null;\n        }\n        if (source[1] === '<') {\n            const verbatim = source.slice(2, -1);\n            if (verbatim === '!' || verbatim === '!!') {\n                onError(`Verbatim tags aren't resolved, so ${source} is invalid.`);\n                return null;\n            }\n            if (source[source.length - 1] !== '>')\n                onError('Verbatim tags must end with a >');\n            return verbatim;\n        }\n        const [, handle, suffix] = source.match(/^(.*!)([^!]*)$/s);\n        if (!suffix)\n            onError(`The ${source} tag has no suffix`);\n        const prefix = this.tags[handle];\n        if (prefix) {\n            try {\n                return prefix + decodeURIComponent(suffix);\n            }\n            catch (error) {\n                onError(String(error));\n                return null;\n            }\n        }\n        if (handle === '!')\n            return source; // local tag\n        onError(`Could not resolve tag: ${source}`);\n        return null;\n    }\n    /**\n     * Given a fully resolved tag, returns its printable string form,\n     * taking into account current tag prefixes and defaults.\n     */\n    tagString(tag) {\n        for (const [handle, prefix] of Object.entries(this.tags)) {\n            if (tag.startsWith(prefix))\n                return handle + escapeTagName(tag.substring(prefix.length));\n        }\n        return tag[0] === '!' ? tag : `!<${tag}>`;\n    }\n    toString(doc) {\n        const lines = this.yaml.explicit\n            ? [`%YAML ${this.yaml.version || '1.2'}`]\n            : [];\n        const tagEntries = Object.entries(this.tags);\n        let tagNames;\n        if (doc && tagEntries.length > 0 && identity.isNode(doc.contents)) {\n            const tags = {};\n            visit.visit(doc.contents, (_key, node) => {\n                if (identity.isNode(node) && node.tag)\n                    tags[node.tag] = true;\n            });\n            tagNames = Object.keys(tags);\n        }\n        else\n            tagNames = [];\n        for (const [handle, prefix] of tagEntries) {\n            if (handle === '!!' && prefix === 'tag:yaml.org,2002:')\n                continue;\n            if (!doc || tagNames.some(tn => tn.startsWith(prefix)))\n                lines.push(`%TAG ${handle} ${prefix}`);\n        }\n        return lines.join('\\n');\n    }\n}\nDirectives.defaultYaml = { explicit: false, version: '1.2' };\nDirectives.defaultTags = { '!!': 'tag:yaml.org,2002:' };\n\nexports.Directives = Directives;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar visit = require('../visit.js');\n\n/**\n * Verify that the input string is a valid anchor.\n *\n * Will throw on errors.\n */\nfunction anchorIsValid(anchor) {\n    if (/[\\x00-\\x19\\s,[\\]{}]/.test(anchor)) {\n        const sa = JSON.stringify(anchor);\n        const msg = `Anchor must not contain whitespace or control characters: ${sa}`;\n        throw new Error(msg);\n    }\n    return true;\n}\nfunction anchorNames(root) {\n    const anchors = new Set();\n    visit.visit(root, {\n        Value(_key, node) {\n            if (node.anchor)\n                anchors.add(node.anchor);\n        }\n    });\n    return anchors;\n}\n/** Find a new anchor name with the given `prefix` and a one-indexed suffix. */\nfunction findNewAnchor(prefix, exclude) {\n    for (let i = 1; true; ++i) {\n        const name = `${prefix}${i}`;\n        if (!exclude.has(name))\n            return name;\n    }\n}\nfunction createNodeAnchors(doc, prefix) {\n    const aliasObjects = [];\n    const sourceObjects = new Map();\n    let prevAnchors = null;\n    return {\n        onAnchor: (source) => {\n            aliasObjects.push(source);\n            prevAnchors ?? (prevAnchors = anchorNames(doc));\n            const anchor = findNewAnchor(prefix, prevAnchors);\n            prevAnchors.add(anchor);\n            return anchor;\n        },\n        /**\n         * With circular references, the source node is only resolved after all\n         * of its child nodes are. This is why anchors are set only after all of\n         * the nodes have been created.\n         */\n        setAnchors: () => {\n            for (const source of aliasObjects) {\n                const ref = sourceObjects.get(source);\n                if (typeof ref === 'object' &&\n                    ref.anchor &&\n                    (identity.isScalar(ref.node) || identity.isCollection(ref.node))) {\n                    ref.node.anchor = ref.anchor;\n                }\n                else {\n                    const error = new Error('Failed to resolve repeated object (this should not happen)');\n                    error.source = source;\n                    throw error;\n                }\n            }\n        },\n        sourceObjects\n    };\n}\n\nexports.anchorIsValid = anchorIsValid;\nexports.anchorNames = anchorNames;\nexports.createNodeAnchors = createNodeAnchors;\nexports.findNewAnchor = findNewAnchor;\n","'use strict';\n\n/**\n * Applies the JSON.parse reviver algorithm as defined in the ECMA-262 spec,\n * in section 24.5.1.1 \"Runtime Semantics: InternalizeJSONProperty\" of the\n * 2021 edition: https://tc39.es/ecma262/#sec-json.parse\n *\n * Includes extensions for handling Map and Set objects.\n */\nfunction applyReviver(reviver, obj, key, val) {\n    if (val && typeof val === 'object') {\n        if (Array.isArray(val)) {\n            for (let i = 0, len = val.length; i < len; ++i) {\n                const v0 = val[i];\n                const v1 = applyReviver(reviver, val, String(i), v0);\n                // eslint-disable-next-line @typescript-eslint/no-array-delete\n                if (v1 === undefined)\n                    delete val[i];\n                else if (v1 !== v0)\n                    val[i] = v1;\n            }\n        }\n        else if (val instanceof Map) {\n            for (const k of Array.from(val.keys())) {\n                const v0 = val.get(k);\n                const v1 = applyReviver(reviver, val, k, v0);\n                if (v1 === undefined)\n                    val.delete(k);\n                else if (v1 !== v0)\n                    val.set(k, v1);\n            }\n        }\n        else if (val instanceof Set) {\n            for (const v0 of Array.from(val)) {\n                const v1 = applyReviver(reviver, val, v0, v0);\n                if (v1 === undefined)\n                    val.delete(v0);\n                else if (v1 !== v0) {\n                    val.delete(v0);\n                    val.add(v1);\n                }\n            }\n        }\n        else {\n            for (const [k, v0] of Object.entries(val)) {\n                const v1 = applyReviver(reviver, val, k, v0);\n                if (v1 === undefined)\n                    delete val[k];\n                else if (v1 !== v0)\n                    val[k] = v1;\n            }\n        }\n    }\n    return reviver.call(obj, key, val);\n}\n\nexports.applyReviver = applyReviver;\n","'use strict';\n\nvar identity = require('./identity.js');\n\n/**\n * Recursively convert any node or its contents to native JavaScript\n *\n * @param value - The input value\n * @param arg - If `value` defines a `toJSON()` method, use this\n *   as its first argument\n * @param ctx - Conversion context, originally set in Document#toJS(). If\n *   `{ keep: true }` is not set, output should be suitable for JSON\n *   stringification.\n */\nfunction toJS(value, arg, ctx) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n    if (Array.isArray(value))\n        return value.map((v, i) => toJS(v, String(i), ctx));\n    if (value && typeof value.toJSON === 'function') {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n        if (!ctx || !identity.hasAnchor(value))\n            return value.toJSON(arg, ctx);\n        const data = { aliasCount: 0, count: 1, res: undefined };\n        ctx.anchors.set(value, data);\n        ctx.onCreate = res => {\n            data.res = res;\n            delete ctx.onCreate;\n        };\n        const res = value.toJSON(arg, ctx);\n        if (ctx.onCreate)\n            ctx.onCreate(res);\n        return res;\n    }\n    if (typeof value === 'bigint' && !ctx?.keep)\n        return Number(value);\n    return value;\n}\n\nexports.toJS = toJS;\n","'use strict';\n\nvar applyReviver = require('../doc/applyReviver.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nclass NodeBase {\n    constructor(type) {\n        Object.defineProperty(this, identity.NODE_TYPE, { value: type });\n    }\n    /** Create a copy of this node.  */\n    clone() {\n        const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n        if (this.range)\n            copy.range = this.range.slice();\n        return copy;\n    }\n    /** A plain JavaScript representation of this node. */\n    toJS(doc, { mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n        if (!identity.isDocument(doc))\n            throw new TypeError('A document argument is required');\n        const ctx = {\n            anchors: new Map(),\n            doc,\n            keep: true,\n            mapAsMap: mapAsMap === true,\n            mapKeyWarned: false,\n            maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n        };\n        const res = toJS.toJS(this, '', ctx);\n        if (typeof onAnchor === 'function')\n            for (const { count, res } of ctx.anchors.values())\n                onAnchor(res, count);\n        return typeof reviver === 'function'\n            ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n            : res;\n    }\n}\n\nexports.NodeBase = NodeBase;\n","'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar visit = require('../visit.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nclass Alias extends Node.NodeBase {\n    constructor(source) {\n        super(identity.ALIAS);\n        this.source = source;\n        Object.defineProperty(this, 'tag', {\n            set() {\n                throw new Error('Alias nodes cannot have tags');\n            }\n        });\n    }\n    /**\n     * Resolve the value of this alias within `doc`, finding the last\n     * instance of the `source` anchor before this node.\n     */\n    resolve(doc, ctx) {\n        let nodes;\n        if (ctx?.aliasResolveCache) {\n            nodes = ctx.aliasResolveCache;\n        }\n        else {\n            nodes = [];\n            visit.visit(doc, {\n                Node: (_key, node) => {\n                    if (identity.isAlias(node) || identity.hasAnchor(node))\n                        nodes.push(node);\n                }\n            });\n            if (ctx)\n                ctx.aliasResolveCache = nodes;\n        }\n        let found = undefined;\n        for (const node of nodes) {\n            if (node === this)\n                break;\n            if (node.anchor === this.source)\n                found = node;\n        }\n        return found;\n    }\n    toJSON(_arg, ctx) {\n        if (!ctx)\n            return { source: this.source };\n        const { anchors, doc, maxAliasCount } = ctx;\n        const source = this.resolve(doc, ctx);\n        if (!source) {\n            const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n            throw new ReferenceError(msg);\n        }\n        let data = anchors.get(source);\n        if (!data) {\n            // Resolve anchors for Node.prototype.toJS()\n            toJS.toJS(source, null, ctx);\n            data = anchors.get(source);\n        }\n        /* istanbul ignore if */\n        if (data?.res === undefined) {\n            const msg = 'This should not happen: Alias anchor was not resolved?';\n            throw new ReferenceError(msg);\n        }\n        if (maxAliasCount >= 0) {\n            data.count += 1;\n            if (data.aliasCount === 0)\n                data.aliasCount = getAliasCount(doc, source, anchors);\n            if (data.count * data.aliasCount > maxAliasCount) {\n                const msg = 'Excessive alias count indicates a resource exhaustion attack';\n                throw new ReferenceError(msg);\n            }\n        }\n        return data.res;\n    }\n    toString(ctx, _onComment, _onChompKeep) {\n        const src = `*${this.source}`;\n        if (ctx) {\n            anchors.anchorIsValid(this.source);\n            if (ctx.options.verifyAliasOrder && !ctx.anchors.has(this.source)) {\n                const msg = `Unresolved alias (the anchor must be set before the alias): ${this.source}`;\n                throw new Error(msg);\n            }\n            if (ctx.implicitKey)\n                return `${src} `;\n        }\n        return src;\n    }\n}\nfunction getAliasCount(doc, node, anchors) {\n    if (identity.isAlias(node)) {\n        const source = node.resolve(doc);\n        const anchor = anchors && source && anchors.get(source);\n        return anchor ? anchor.count * anchor.aliasCount : 0;\n    }\n    else if (identity.isCollection(node)) {\n        let count = 0;\n        for (const item of node.items) {\n            const c = getAliasCount(doc, item, anchors);\n            if (c > count)\n                count = c;\n        }\n        return count;\n    }\n    else if (identity.isPair(node)) {\n        const kc = getAliasCount(doc, node.key, anchors);\n        const vc = getAliasCount(doc, node.value, anchors);\n        return Math.max(kc, vc);\n    }\n    return 1;\n}\n\nexports.Alias = Alias;\n","'use strict';\n\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\nvar toJS = require('./toJS.js');\n\nconst isScalarValue = (value) => !value || (typeof value !== 'function' && typeof value !== 'object');\nclass Scalar extends Node.NodeBase {\n    constructor(value) {\n        super(identity.SCALAR);\n        this.value = value;\n    }\n    toJSON(arg, ctx) {\n        return ctx?.keep ? this.value : toJS.toJS(this.value, arg, ctx);\n    }\n    toString() {\n        return String(this.value);\n    }\n}\nScalar.BLOCK_FOLDED = 'BLOCK_FOLDED';\nScalar.BLOCK_LITERAL = 'BLOCK_LITERAL';\nScalar.PLAIN = 'PLAIN';\nScalar.QUOTE_DOUBLE = 'QUOTE_DOUBLE';\nScalar.QUOTE_SINGLE = 'QUOTE_SINGLE';\n\nexports.Scalar = Scalar;\nexports.isScalarValue = isScalarValue;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\n\nconst defaultTagPrefix = 'tag:yaml.org,2002:';\nfunction findTagObject(value, tagName, tags) {\n    if (tagName) {\n        const match = tags.filter(t => t.tag === tagName);\n        const tagObj = match.find(t => !t.format) ?? match[0];\n        if (!tagObj)\n            throw new Error(`Tag ${tagName} not found`);\n        return tagObj;\n    }\n    return tags.find(t => t.identify?.(value) && !t.format);\n}\nfunction createNode(value, tagName, ctx) {\n    if (identity.isDocument(value))\n        value = value.contents;\n    if (identity.isNode(value))\n        return value;\n    if (identity.isPair(value)) {\n        const map = ctx.schema[identity.MAP].createNode?.(ctx.schema, null, ctx);\n        map.items.push(value);\n        return map;\n    }\n    if (value instanceof String ||\n        value instanceof Number ||\n        value instanceof Boolean ||\n        (typeof BigInt !== 'undefined' && value instanceof BigInt) // not supported everywhere\n    ) {\n        // https://tc39.es/ecma262/#sec-serializejsonproperty\n        value = value.valueOf();\n    }\n    const { aliasDuplicateObjects, onAnchor, onTagObj, schema, sourceObjects } = ctx;\n    // Detect duplicate references to the same object & use Alias nodes for all\n    // after first. The `ref` wrapper allows for circular references to resolve.\n    let ref = undefined;\n    if (aliasDuplicateObjects && value && typeof value === 'object') {\n        ref = sourceObjects.get(value);\n        if (ref) {\n            ref.anchor ?? (ref.anchor = onAnchor(value));\n            return new Alias.Alias(ref.anchor);\n        }\n        else {\n            ref = { anchor: null, node: null };\n            sourceObjects.set(value, ref);\n        }\n    }\n    if (tagName?.startsWith('!!'))\n        tagName = defaultTagPrefix + tagName.slice(2);\n    let tagObj = findTagObject(value, tagName, schema.tags);\n    if (!tagObj) {\n        if (value && typeof value.toJSON === 'function') {\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n            value = value.toJSON();\n        }\n        if (!value || typeof value !== 'object') {\n            const node = new Scalar.Scalar(value);\n            if (ref)\n                ref.node = node;\n            return node;\n        }\n        tagObj =\n            value instanceof Map\n                ? schema[identity.MAP]\n                : Symbol.iterator in Object(value)\n                    ? schema[identity.SEQ]\n                    : schema[identity.MAP];\n    }\n    if (onTagObj) {\n        onTagObj(tagObj);\n        delete ctx.onTagObj;\n    }\n    const node = tagObj?.createNode\n        ? tagObj.createNode(ctx.schema, value, ctx)\n        : typeof tagObj?.nodeClass?.from === 'function'\n            ? tagObj.nodeClass.from(ctx.schema, value, ctx)\n            : new Scalar.Scalar(value);\n    if (tagName)\n        node.tag = tagName;\n    else if (!tagObj.default)\n        node.tag = tagObj.tag;\n    if (ref)\n        ref.node = node;\n    return node;\n}\n\nexports.createNode = createNode;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar identity = require('./identity.js');\nvar Node = require('./Node.js');\n\nfunction collectionFromPath(schema, path, value) {\n    let v = value;\n    for (let i = path.length - 1; i >= 0; --i) {\n        const k = path[i];\n        if (typeof k === 'number' && Number.isInteger(k) && k >= 0) {\n            const a = [];\n            a[k] = v;\n            v = a;\n        }\n        else {\n            v = new Map([[k, v]]);\n        }\n    }\n    return createNode.createNode(v, undefined, {\n        aliasDuplicateObjects: false,\n        keepUndefined: false,\n        onAnchor: () => {\n            throw new Error('This should not happen, please report a bug.');\n        },\n        schema,\n        sourceObjects: new Map()\n    });\n}\n// Type guard is intentionally a little wrong so as to be more useful,\n// as it does not cover untypable empty non-string iterables (e.g. []).\nconst isEmptyPath = (path) => path == null ||\n    (typeof path === 'object' && !!path[Symbol.iterator]().next().done);\nclass Collection extends Node.NodeBase {\n    constructor(type, schema) {\n        super(type);\n        Object.defineProperty(this, 'schema', {\n            value: schema,\n            configurable: true,\n            enumerable: false,\n            writable: true\n        });\n    }\n    /**\n     * Create a copy of this collection.\n     *\n     * @param schema - If defined, overwrites the original's schema\n     */\n    clone(schema) {\n        const copy = Object.create(Object.getPrototypeOf(this), Object.getOwnPropertyDescriptors(this));\n        if (schema)\n            copy.schema = schema;\n        copy.items = copy.items.map(it => identity.isNode(it) || identity.isPair(it) ? it.clone(schema) : it);\n        if (this.range)\n            copy.range = this.range.slice();\n        return copy;\n    }\n    /**\n     * Adds a value to the collection. For `!!map` and `!!omap` the value must\n     * be a Pair instance or a `{ key, value }` object, which may not have a key\n     * that already exists in the map.\n     */\n    addIn(path, value) {\n        if (isEmptyPath(path))\n            this.add(value);\n        else {\n            const [key, ...rest] = path;\n            const node = this.get(key, true);\n            if (identity.isCollection(node))\n                node.addIn(rest, value);\n            else if (node === undefined && this.schema)\n                this.set(key, collectionFromPath(this.schema, rest, value));\n            else\n                throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n        }\n    }\n    /**\n     * Removes a value from the collection.\n     * @returns `true` if the item was found and removed.\n     */\n    deleteIn(path) {\n        const [key, ...rest] = path;\n        if (rest.length === 0)\n            return this.delete(key);\n        const node = this.get(key, true);\n        if (identity.isCollection(node))\n            return node.deleteIn(rest);\n        else\n            throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n    }\n    /**\n     * Returns item at `key`, or `undefined` if not found. By default unwraps\n     * scalar values from their surrounding node; to disable set `keepScalar` to\n     * `true` (collections are always returned intact).\n     */\n    getIn(path, keepScalar) {\n        const [key, ...rest] = path;\n        const node = this.get(key, true);\n        if (rest.length === 0)\n            return !keepScalar && identity.isScalar(node) ? node.value : node;\n        else\n            return identity.isCollection(node) ? node.getIn(rest, keepScalar) : undefined;\n    }\n    hasAllNullValues(allowScalar) {\n        return this.items.every(node => {\n            if (!identity.isPair(node))\n                return false;\n            const n = node.value;\n            return (n == null ||\n                (allowScalar &&\n                    identity.isScalar(n) &&\n                    n.value == null &&\n                    !n.commentBefore &&\n                    !n.comment &&\n                    !n.tag));\n        });\n    }\n    /**\n     * Checks if the collection includes a value with the key `key`.\n     */\n    hasIn(path) {\n        const [key, ...rest] = path;\n        if (rest.length === 0)\n            return this.has(key);\n        const node = this.get(key, true);\n        return identity.isCollection(node) ? node.hasIn(rest) : false;\n    }\n    /**\n     * Sets a value in this collection. For `!!set`, `value` needs to be a\n     * boolean to add/remove the item from the set.\n     */\n    setIn(path, value) {\n        const [key, ...rest] = path;\n        if (rest.length === 0) {\n            this.set(key, value);\n        }\n        else {\n            const node = this.get(key, true);\n            if (identity.isCollection(node))\n                node.setIn(rest, value);\n            else if (node === undefined && this.schema)\n                this.set(key, collectionFromPath(this.schema, rest, value));\n            else\n                throw new Error(`Expected YAML collection at ${key}. Remaining path: ${rest}`);\n        }\n    }\n}\n\nexports.Collection = Collection;\nexports.collectionFromPath = collectionFromPath;\nexports.isEmptyPath = isEmptyPath;\n","'use strict';\n\n/**\n * Stringifies a comment.\n *\n * Empty comment lines are left empty,\n * lines consisting of a single space are replaced by `#`,\n * and all other lines are prefixed with a `#`.\n */\nconst stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, '#');\nfunction indentComment(comment, indent) {\n    if (/^\\n+$/.test(comment))\n        return comment.substring(1);\n    return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;\n}\nconst lineComment = (str, indent, comment) => str.endsWith('\\n')\n    ? indentComment(comment, indent)\n    : comment.includes('\\n')\n        ? '\\n' + indentComment(comment, indent)\n        : (str.endsWith(' ') ? '' : ' ') + comment;\n\nexports.indentComment = indentComment;\nexports.lineComment = lineComment;\nexports.stringifyComment = stringifyComment;\n","'use strict';\n\nconst FOLD_FLOW = 'flow';\nconst FOLD_BLOCK = 'block';\nconst FOLD_QUOTED = 'quoted';\n/**\n * Tries to keep input at up to `lineWidth` characters, splitting only on spaces\n * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are\n * terminated with `\\n` and started with `indent`.\n */\nfunction foldFlowLines(text, indent, mode = 'flow', { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) {\n    if (!lineWidth || lineWidth < 0)\n        return text;\n    if (lineWidth < minContentWidth)\n        minContentWidth = 0;\n    const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);\n    if (text.length <= endStep)\n        return text;\n    const folds = [];\n    const escapedFolds = {};\n    let end = lineWidth - indent.length;\n    if (typeof indentAtStart === 'number') {\n        if (indentAtStart > lineWidth - Math.max(2, minContentWidth))\n            folds.push(0);\n        else\n            end = lineWidth - indentAtStart;\n    }\n    let split = undefined;\n    let prev = undefined;\n    let overflow = false;\n    let i = -1;\n    let escStart = -1;\n    let escEnd = -1;\n    if (mode === FOLD_BLOCK) {\n        i = consumeMoreIndentedLines(text, i, indent.length);\n        if (i !== -1)\n            end = i + endStep;\n    }\n    for (let ch; (ch = text[(i += 1)]);) {\n        if (mode === FOLD_QUOTED && ch === '\\\\') {\n            escStart = i;\n            switch (text[i + 1]) {\n                case 'x':\n                    i += 3;\n                    break;\n                case 'u':\n                    i += 5;\n                    break;\n                case 'U':\n                    i += 9;\n                    break;\n                default:\n                    i += 1;\n            }\n            escEnd = i;\n        }\n        if (ch === '\\n') {\n            if (mode === FOLD_BLOCK)\n                i = consumeMoreIndentedLines(text, i, indent.length);\n            end = i + indent.length + endStep;\n            split = undefined;\n        }\n        else {\n            if (ch === ' ' &&\n                prev &&\n                prev !== ' ' &&\n                prev !== '\\n' &&\n                prev !== '\\t') {\n                // space surrounded by non-space can be replaced with newline + indent\n                const next = text[i + 1];\n                if (next && next !== ' ' && next !== '\\n' && next !== '\\t')\n                    split = i;\n            }\n            if (i >= end) {\n                if (split) {\n                    folds.push(split);\n                    end = split + endStep;\n                    split = undefined;\n                }\n                else if (mode === FOLD_QUOTED) {\n                    // white-space collected at end may stretch past lineWidth\n                    while (prev === ' ' || prev === '\\t') {\n                        prev = ch;\n                        ch = text[(i += 1)];\n                        overflow = true;\n                    }\n                    // Account for newline escape, but don't break preceding escape\n                    const j = i > escEnd + 1 ? i - 2 : escStart - 1;\n                    // Bail out if lineWidth & minContentWidth are shorter than an escape string\n                    if (escapedFolds[j])\n                        return text;\n                    folds.push(j);\n                    escapedFolds[j] = true;\n                    end = j + endStep;\n                    split = undefined;\n                }\n                else {\n                    overflow = true;\n                }\n            }\n        }\n        prev = ch;\n    }\n    if (overflow && onOverflow)\n        onOverflow();\n    if (folds.length === 0)\n        return text;\n    if (onFold)\n        onFold();\n    let res = text.slice(0, folds[0]);\n    for (let i = 0; i < folds.length; ++i) {\n        const fold = folds[i];\n        const end = folds[i + 1] || text.length;\n        if (fold === 0)\n            res = `\\n${indent}${text.slice(0, end)}`;\n        else {\n            if (mode === FOLD_QUOTED && escapedFolds[fold])\n                res += `${text[fold]}\\\\`;\n            res += `\\n${indent}${text.slice(fold + 1, end)}`;\n        }\n    }\n    return res;\n}\n/**\n * Presumes `i + 1` is at the start of a line\n * @returns index of last newline in more-indented block\n */\nfunction consumeMoreIndentedLines(text, i, indent) {\n    let end = i;\n    let start = i + 1;\n    let ch = text[start];\n    while (ch === ' ' || ch === '\\t') {\n        if (i < start + indent) {\n            ch = text[++i];\n        }\n        else {\n            do {\n                ch = text[++i];\n            } while (ch && ch !== '\\n');\n            end = i;\n            start = i + 1;\n            ch = text[start];\n        }\n    }\n    return end;\n}\n\nexports.FOLD_BLOCK = FOLD_BLOCK;\nexports.FOLD_FLOW = FOLD_FLOW;\nexports.FOLD_QUOTED = FOLD_QUOTED;\nexports.foldFlowLines = foldFlowLines;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar foldFlowLines = require('./foldFlowLines.js');\n\nconst getFoldOptions = (ctx, isBlock) => ({\n    indentAtStart: isBlock ? ctx.indent.length : ctx.indentAtStart,\n    lineWidth: ctx.options.lineWidth,\n    minContentWidth: ctx.options.minContentWidth\n});\n// Also checks for lines starting with %, as parsing the output as YAML 1.1 will\n// presume that's starting a new document.\nconst containsDocumentMarker = (str) => /^(%|---|\\.\\.\\.)/m.test(str);\nfunction lineLengthOverLimit(str, lineWidth, indentLength) {\n    if (!lineWidth || lineWidth < 0)\n        return false;\n    const limit = lineWidth - indentLength;\n    const strLen = str.length;\n    if (strLen <= limit)\n        return false;\n    for (let i = 0, start = 0; i < strLen; ++i) {\n        if (str[i] === '\\n') {\n            if (i - start > limit)\n                return true;\n            start = i + 1;\n            if (strLen - start <= limit)\n                return false;\n        }\n    }\n    return true;\n}\nfunction doubleQuotedString(value, ctx) {\n    const json = JSON.stringify(value);\n    if (ctx.options.doubleQuotedAsJSON)\n        return json;\n    const { implicitKey } = ctx;\n    const minMultiLineLength = ctx.options.doubleQuotedMinMultiLineLength;\n    const indent = ctx.indent || (containsDocumentMarker(value) ? '  ' : '');\n    let str = '';\n    let start = 0;\n    for (let i = 0, ch = json[i]; ch; ch = json[++i]) {\n        if (ch === ' ' && json[i + 1] === '\\\\' && json[i + 2] === 'n') {\n            // space before newline needs to be escaped to not be folded\n            str += json.slice(start, i) + '\\\\ ';\n            i += 1;\n            start = i;\n            ch = '\\\\';\n        }\n        if (ch === '\\\\')\n            switch (json[i + 1]) {\n                case 'u':\n                    {\n                        str += json.slice(start, i);\n                        const code = json.substr(i + 2, 4);\n                        switch (code) {\n                            case '0000':\n                                str += '\\\\0';\n                                break;\n                            case '0007':\n                                str += '\\\\a';\n                                break;\n                            case '000b':\n                                str += '\\\\v';\n                                break;\n                            case '001b':\n                                str += '\\\\e';\n                                break;\n                            case '0085':\n                                str += '\\\\N';\n                                break;\n                            case '00a0':\n                                str += '\\\\_';\n                                break;\n                            case '2028':\n                                str += '\\\\L';\n                                break;\n                            case '2029':\n                                str += '\\\\P';\n                                break;\n                            default:\n                                if (code.substr(0, 2) === '00')\n                                    str += '\\\\x' + code.substr(2);\n                                else\n                                    str += json.substr(i, 6);\n                        }\n                        i += 5;\n                        start = i + 1;\n                    }\n                    break;\n                case 'n':\n                    if (implicitKey ||\n                        json[i + 2] === '\"' ||\n                        json.length < minMultiLineLength) {\n                        i += 1;\n                    }\n                    else {\n                        // folding will eat first newline\n                        str += json.slice(start, i) + '\\n\\n';\n                        while (json[i + 2] === '\\\\' &&\n                            json[i + 3] === 'n' &&\n                            json[i + 4] !== '\"') {\n                            str += '\\n';\n                            i += 2;\n                        }\n                        str += indent;\n                        // space after newline needs to be escaped to not be folded\n                        if (json[i + 2] === ' ')\n                            str += '\\\\';\n                        i += 1;\n                        start = i + 1;\n                    }\n                    break;\n                default:\n                    i += 1;\n            }\n    }\n    str = start ? str + json.slice(start) : json;\n    return implicitKey\n        ? str\n        : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_QUOTED, getFoldOptions(ctx, false));\n}\nfunction singleQuotedString(value, ctx) {\n    if (ctx.options.singleQuote === false ||\n        (ctx.implicitKey && value.includes('\\n')) ||\n        /[ \\t]\\n|\\n[ \\t]/.test(value) // single quoted string can't have leading or trailing whitespace around newline\n    )\n        return doubleQuotedString(value, ctx);\n    const indent = ctx.indent || (containsDocumentMarker(value) ? '  ' : '');\n    const res = \"'\" + value.replace(/'/g, \"''\").replace(/\\n+/g, `$&\\n${indent}`) + \"'\";\n    return ctx.implicitKey\n        ? res\n        : foldFlowLines.foldFlowLines(res, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction quotedString(value, ctx) {\n    const { singleQuote } = ctx.options;\n    let qs;\n    if (singleQuote === false)\n        qs = doubleQuotedString;\n    else {\n        const hasDouble = value.includes('\"');\n        const hasSingle = value.includes(\"'\");\n        if (hasDouble && !hasSingle)\n            qs = singleQuotedString;\n        else if (hasSingle && !hasDouble)\n            qs = doubleQuotedString;\n        else\n            qs = singleQuote ? singleQuotedString : doubleQuotedString;\n    }\n    return qs(value, ctx);\n}\n// The negative lookbehind avoids a polynomial search,\n// but isn't supported yet on Safari: https://caniuse.com/js-regexp-lookbehind\nlet blockEndNewlines;\ntry {\n    blockEndNewlines = new RegExp('(^|(?<!\\n))\\n+(?!\\n|$)', 'g');\n}\ncatch {\n    blockEndNewlines = /\\n+(?!\\n|$)/g;\n}\nfunction blockString({ comment, type, value }, ctx, onComment, onChompKeep) {\n    const { blockQuote, commentString, lineWidth } = ctx.options;\n    // 1. Block can't end in whitespace unless the last line is non-empty.\n    // 2. Strings consisting of only whitespace are best rendered explicitly.\n    if (!blockQuote || /\\n[\\t ]+$/.test(value)) {\n        return quotedString(value, ctx);\n    }\n    const indent = ctx.indent ||\n        (ctx.forceBlockIndent || containsDocumentMarker(value) ? '  ' : '');\n    const literal = blockQuote === 'literal'\n        ? true\n        : blockQuote === 'folded' || type === Scalar.Scalar.BLOCK_FOLDED\n            ? false\n            : type === Scalar.Scalar.BLOCK_LITERAL\n                ? true\n                : !lineLengthOverLimit(value, lineWidth, indent.length);\n    if (!value)\n        return literal ? '|\\n' : '>\\n';\n    // determine chomping from whitespace at value end\n    let chomp;\n    let endStart;\n    for (endStart = value.length; endStart > 0; --endStart) {\n        const ch = value[endStart - 1];\n        if (ch !== '\\n' && ch !== '\\t' && ch !== ' ')\n            break;\n    }\n    let end = value.substring(endStart);\n    const endNlPos = end.indexOf('\\n');\n    if (endNlPos === -1) {\n        chomp = '-'; // strip\n    }\n    else if (value === end || endNlPos !== end.length - 1) {\n        chomp = '+'; // keep\n        if (onChompKeep)\n            onChompKeep();\n    }\n    else {\n        chomp = ''; // clip\n    }\n    if (end) {\n        value = value.slice(0, -end.length);\n        if (end[end.length - 1] === '\\n')\n            end = end.slice(0, -1);\n        end = end.replace(blockEndNewlines, `$&${indent}`);\n    }\n    // determine indent indicator from whitespace at value start\n    let startWithSpace = false;\n    let startEnd;\n    let startNlPos = -1;\n    for (startEnd = 0; startEnd < value.length; ++startEnd) {\n        const ch = value[startEnd];\n        if (ch === ' ')\n            startWithSpace = true;\n        else if (ch === '\\n')\n            startNlPos = startEnd;\n        else\n            break;\n    }\n    let start = value.substring(0, startNlPos < startEnd ? startNlPos + 1 : startEnd);\n    if (start) {\n        value = value.substring(start.length);\n        start = start.replace(/\\n+/g, `$&${indent}`);\n    }\n    const indentSize = indent ? '2' : '1'; // root is at -1\n    // Leading | or > is added later\n    let header = (startWithSpace ? indentSize : '') + chomp;\n    if (comment) {\n        header += ' ' + commentString(comment.replace(/ ?[\\r\\n]+/g, ' '));\n        if (onComment)\n            onComment();\n    }\n    if (!literal) {\n        const foldedValue = value\n            .replace(/\\n+/g, '\\n$&')\n            .replace(/(?:^|\\n)([\\t ].*)(?:([\\n\\t ]*)\\n(?![\\n\\t ]))?/g, '$1$2') // more-indented lines aren't folded\n            //                ^ more-ind. ^ empty     ^ capture next empty lines only at end of indent\n            .replace(/\\n+/g, `$&${indent}`);\n        let literalFallback = false;\n        const foldOptions = getFoldOptions(ctx, true);\n        if (blockQuote !== 'folded' && type !== Scalar.Scalar.BLOCK_FOLDED) {\n            foldOptions.onOverflow = () => {\n                literalFallback = true;\n            };\n        }\n        const body = foldFlowLines.foldFlowLines(`${start}${foldedValue}${end}`, indent, foldFlowLines.FOLD_BLOCK, foldOptions);\n        if (!literalFallback)\n            return `>${header}\\n${indent}${body}`;\n    }\n    value = value.replace(/\\n+/g, `$&${indent}`);\n    return `|${header}\\n${indent}${start}${value}${end}`;\n}\nfunction plainString(item, ctx, onComment, onChompKeep) {\n    const { type, value } = item;\n    const { actualString, implicitKey, indent, indentStep, inFlow } = ctx;\n    if ((implicitKey && value.includes('\\n')) ||\n        (inFlow && /[[\\]{},]/.test(value))) {\n        return quotedString(value, ctx);\n    }\n    if (/^[\\n\\t ,[\\]{}#&*!|>'\"%@`]|^[?-]$|^[?-][ \\t]|[\\n:][ \\t]|[ \\t]\\n|[\\n\\t ]#|[\\n\\t :]$/.test(value)) {\n        // not allowed:\n        // - '-' or '?'\n        // - start with an indicator character (except [?:-]) or /[?-] /\n        // - '\\n ', ': ' or ' \\n' anywhere\n        // - '#' not preceded by a non-space char\n        // - end with ' ' or ':'\n        return implicitKey || inFlow || !value.includes('\\n')\n            ? quotedString(value, ctx)\n            : blockString(item, ctx, onComment, onChompKeep);\n    }\n    if (!implicitKey &&\n        !inFlow &&\n        type !== Scalar.Scalar.PLAIN &&\n        value.includes('\\n')) {\n        // Where allowed & type not set explicitly, prefer block style for multiline strings\n        return blockString(item, ctx, onComment, onChompKeep);\n    }\n    if (containsDocumentMarker(value)) {\n        if (indent === '') {\n            ctx.forceBlockIndent = true;\n            return blockString(item, ctx, onComment, onChompKeep);\n        }\n        else if (implicitKey && indent === indentStep) {\n            return quotedString(value, ctx);\n        }\n    }\n    const str = value.replace(/\\n+/g, `$&\\n${indent}`);\n    // Verify that output will be parsed as a string, as e.g. plain numbers and\n    // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'),\n    // and others in v1.1.\n    if (actualString) {\n        const test = (tag) => tag.default && tag.tag !== 'tag:yaml.org,2002:str' && tag.test?.test(str);\n        const { compat, tags } = ctx.doc.schema;\n        if (tags.some(test) || compat?.some(test))\n            return quotedString(value, ctx);\n    }\n    return implicitKey\n        ? str\n        : foldFlowLines.foldFlowLines(str, indent, foldFlowLines.FOLD_FLOW, getFoldOptions(ctx, false));\n}\nfunction stringifyString(item, ctx, onComment, onChompKeep) {\n    const { implicitKey, inFlow } = ctx;\n    const ss = typeof item.value === 'string'\n        ? item\n        : Object.assign({}, item, { value: String(item.value) });\n    let { type } = item;\n    if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n        // force double quotes on control characters & unpaired surrogates\n        if (/[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f\\u{D800}-\\u{DFFF}]/u.test(ss.value))\n            type = Scalar.Scalar.QUOTE_DOUBLE;\n    }\n    const _stringify = (_type) => {\n        switch (_type) {\n            case Scalar.Scalar.BLOCK_FOLDED:\n            case Scalar.Scalar.BLOCK_LITERAL:\n                return implicitKey || inFlow\n                    ? quotedString(ss.value, ctx) // blocks are not valid inside flow containers\n                    : blockString(ss, ctx, onComment, onChompKeep);\n            case Scalar.Scalar.QUOTE_DOUBLE:\n                return doubleQuotedString(ss.value, ctx);\n            case Scalar.Scalar.QUOTE_SINGLE:\n                return singleQuotedString(ss.value, ctx);\n            case Scalar.Scalar.PLAIN:\n                return plainString(ss, ctx, onComment, onChompKeep);\n            default:\n                return null;\n        }\n    };\n    let res = _stringify(type);\n    if (res === null) {\n        const { defaultKeyType, defaultStringType } = ctx.options;\n        const t = (implicitKey && defaultKeyType) || defaultStringType;\n        res = _stringify(t);\n        if (res === null)\n            throw new Error(`Unsupported default string type ${t}`);\n    }\n    return res;\n}\n\nexports.stringifyString = stringifyString;\n","'use strict';\n\nvar anchors = require('../doc/anchors.js');\nvar identity = require('../nodes/identity.js');\nvar stringifyComment = require('./stringifyComment.js');\nvar stringifyString = require('./stringifyString.js');\n\nfunction createStringifyContext(doc, options) {\n    const opt = Object.assign({\n        blockQuote: true,\n        commentString: stringifyComment.stringifyComment,\n        defaultKeyType: null,\n        defaultStringType: 'PLAIN',\n        directives: null,\n        doubleQuotedAsJSON: false,\n        doubleQuotedMinMultiLineLength: 40,\n        falseStr: 'false',\n        flowCollectionPadding: true,\n        indentSeq: true,\n        lineWidth: 80,\n        minContentWidth: 20,\n        nullStr: 'null',\n        simpleKeys: false,\n        singleQuote: null,\n        trueStr: 'true',\n        verifyAliasOrder: true\n    }, doc.schema.toStringOptions, options);\n    let inFlow;\n    switch (opt.collectionStyle) {\n        case 'block':\n            inFlow = false;\n            break;\n        case 'flow':\n            inFlow = true;\n            break;\n        default:\n            inFlow = null;\n    }\n    return {\n        anchors: new Set(),\n        doc,\n        flowCollectionPadding: opt.flowCollectionPadding ? ' ' : '',\n        indent: '',\n        indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : '  ',\n        inFlow,\n        options: opt\n    };\n}\nfunction getTagObject(tags, item) {\n    if (item.tag) {\n        const match = tags.filter(t => t.tag === item.tag);\n        if (match.length > 0)\n            return match.find(t => t.format === item.format) ?? match[0];\n    }\n    let tagObj = undefined;\n    let obj;\n    if (identity.isScalar(item)) {\n        obj = item.value;\n        let match = tags.filter(t => t.identify?.(obj));\n        if (match.length > 1) {\n            const testMatch = match.filter(t => t.test);\n            if (testMatch.length > 0)\n                match = testMatch;\n        }\n        tagObj =\n            match.find(t => t.format === item.format) ?? match.find(t => !t.format);\n    }\n    else {\n        obj = item;\n        tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);\n    }\n    if (!tagObj) {\n        const name = obj?.constructor?.name ?? (obj === null ? 'null' : typeof obj);\n        throw new Error(`Tag not resolved for ${name} value`);\n    }\n    return tagObj;\n}\n// needs to be called before value stringifier to allow for circular anchor refs\nfunction stringifyProps(node, tagObj, { anchors: anchors$1, doc }) {\n    if (!doc.directives)\n        return '';\n    const props = [];\n    const anchor = (identity.isScalar(node) || identity.isCollection(node)) && node.anchor;\n    if (anchor && anchors.anchorIsValid(anchor)) {\n        anchors$1.add(anchor);\n        props.push(`&${anchor}`);\n    }\n    const tag = node.tag ?? (tagObj.default ? null : tagObj.tag);\n    if (tag)\n        props.push(doc.directives.tagString(tag));\n    return props.join(' ');\n}\nfunction stringify(item, ctx, onComment, onChompKeep) {\n    if (identity.isPair(item))\n        return item.toString(ctx, onComment, onChompKeep);\n    if (identity.isAlias(item)) {\n        if (ctx.doc.directives)\n            return item.toString(ctx);\n        if (ctx.resolvedAliases?.has(item)) {\n            throw new TypeError(`Cannot stringify circular structure without alias nodes`);\n        }\n        else {\n            if (ctx.resolvedAliases)\n                ctx.resolvedAliases.add(item);\n            else\n                ctx.resolvedAliases = new Set([item]);\n            item = item.resolve(ctx.doc);\n        }\n    }\n    let tagObj = undefined;\n    const node = identity.isNode(item)\n        ? item\n        : ctx.doc.createNode(item, { onTagObj: o => (tagObj = o) });\n    tagObj ?? (tagObj = getTagObject(ctx.doc.schema.tags, node));\n    const props = stringifyProps(node, tagObj, ctx);\n    if (props.length > 0)\n        ctx.indentAtStart = (ctx.indentAtStart ?? 0) + props.length + 1;\n    const str = typeof tagObj.stringify === 'function'\n        ? tagObj.stringify(node, ctx, onComment, onChompKeep)\n        : identity.isScalar(node)\n            ? stringifyString.stringifyString(node, ctx, onComment, onChompKeep)\n            : node.toString(ctx, onComment, onChompKeep);\n    if (!props)\n        return str;\n    return identity.isScalar(node) || str[0] === '{' || str[0] === '['\n        ? `${props} ${str}`\n        : `${props}\\n${ctx.indent}${str}`;\n}\n\nexports.createStringifyContext = createStringifyContext;\nexports.stringify = stringify;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyPair({ key, value }, ctx, onComment, onChompKeep) {\n    const { allNullValues, doc, indent, indentStep, options: { commentString, indentSeq, simpleKeys } } = ctx;\n    let keyComment = (identity.isNode(key) && key.comment) || null;\n    if (simpleKeys) {\n        if (keyComment) {\n            throw new Error('With simple keys, key nodes cannot have comments');\n        }\n        if (identity.isCollection(key) || (!identity.isNode(key) && typeof key === 'object')) {\n            const msg = 'With simple keys, collection cannot be used as a key value';\n            throw new Error(msg);\n        }\n    }\n    let explicitKey = !simpleKeys &&\n        (!key ||\n            (keyComment && value == null && !ctx.inFlow) ||\n            identity.isCollection(key) ||\n            (identity.isScalar(key)\n                ? key.type === Scalar.Scalar.BLOCK_FOLDED || key.type === Scalar.Scalar.BLOCK_LITERAL\n                : typeof key === 'object'));\n    ctx = Object.assign({}, ctx, {\n        allNullValues: false,\n        implicitKey: !explicitKey && (simpleKeys || !allNullValues),\n        indent: indent + indentStep\n    });\n    let keyCommentDone = false;\n    let chompKeep = false;\n    let str = stringify.stringify(key, ctx, () => (keyCommentDone = true), () => (chompKeep = true));\n    if (!explicitKey && !ctx.inFlow && str.length > 1024) {\n        if (simpleKeys)\n            throw new Error('With simple keys, single line scalar must not span more than 1024 characters');\n        explicitKey = true;\n    }\n    if (ctx.inFlow) {\n        if (allNullValues || value == null) {\n            if (keyCommentDone && onComment)\n                onComment();\n            return str === '' ? '?' : explicitKey ? `? ${str}` : str;\n        }\n    }\n    else if ((allNullValues && !simpleKeys) || (value == null && explicitKey)) {\n        str = `? ${str}`;\n        if (keyComment && !keyCommentDone) {\n            str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n        }\n        else if (chompKeep && onChompKeep)\n            onChompKeep();\n        return str;\n    }\n    if (keyCommentDone)\n        keyComment = null;\n    if (explicitKey) {\n        if (keyComment)\n            str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n        str = `? ${str}\\n${indent}:`;\n    }\n    else {\n        str = `${str}:`;\n        if (keyComment)\n            str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));\n    }\n    let vsb, vcb, valueComment;\n    if (identity.isNode(value)) {\n        vsb = !!value.spaceBefore;\n        vcb = value.commentBefore;\n        valueComment = value.comment;\n    }\n    else {\n        vsb = false;\n        vcb = null;\n        valueComment = null;\n        if (value && typeof value === 'object')\n            value = doc.createNode(value);\n    }\n    ctx.implicitKey = false;\n    if (!explicitKey && !keyComment && identity.isScalar(value))\n        ctx.indentAtStart = str.length + 1;\n    chompKeep = false;\n    if (!indentSeq &&\n        indentStep.length >= 2 &&\n        !ctx.inFlow &&\n        !explicitKey &&\n        identity.isSeq(value) &&\n        !value.flow &&\n        !value.tag &&\n        !value.anchor) {\n        // If indentSeq === false, consider '- ' as part of indentation where possible\n        ctx.indent = ctx.indent.substring(2);\n    }\n    let valueCommentDone = false;\n    const valueStr = stringify.stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));\n    let ws = ' ';\n    if (keyComment || vsb || vcb) {\n        ws = vsb ? '\\n' : '';\n        if (vcb) {\n            const cs = commentString(vcb);\n            ws += `\\n${stringifyComment.indentComment(cs, ctx.indent)}`;\n        }\n        if (valueStr === '' && !ctx.inFlow) {\n            if (ws === '\\n' && valueComment)\n                ws = '\\n\\n';\n        }\n        else {\n            ws += `\\n${ctx.indent}`;\n        }\n    }\n    else if (!explicitKey && identity.isCollection(value)) {\n        const vs0 = valueStr[0];\n        const nl0 = valueStr.indexOf('\\n');\n        const hasNewline = nl0 !== -1;\n        const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0;\n        if (hasNewline || !flow) {\n            let hasPropsLine = false;\n            if (hasNewline && (vs0 === '&' || vs0 === '!')) {\n                let sp0 = valueStr.indexOf(' ');\n                if (vs0 === '&' &&\n                    sp0 !== -1 &&\n                    sp0 < nl0 &&\n                    valueStr[sp0 + 1] === '!') {\n                    sp0 = valueStr.indexOf(' ', sp0 + 1);\n                }\n                if (sp0 === -1 || nl0 < sp0)\n                    hasPropsLine = true;\n            }\n            if (!hasPropsLine)\n                ws = `\\n${ctx.indent}`;\n        }\n    }\n    else if (valueStr === '' || valueStr[0] === '\\n') {\n        ws = '';\n    }\n    str += ws + valueStr;\n    if (ctx.inFlow) {\n        if (valueCommentDone && onComment)\n            onComment();\n    }\n    else if (valueComment && !valueCommentDone) {\n        str += stringifyComment.lineComment(str, ctx.indent, commentString(valueComment));\n    }\n    else if (chompKeep && onChompKeep) {\n        onChompKeep();\n    }\n    return str;\n}\n\nexports.stringifyPair = stringifyPair;\n","'use strict';\n\nvar node_process = require('process');\n\nfunction debug(logLevel, ...messages) {\n    if (logLevel === 'debug')\n        console.log(...messages);\n}\nfunction warn(logLevel, warning) {\n    if (logLevel === 'debug' || logLevel === 'warn') {\n        if (typeof node_process.emitWarning === 'function')\n            node_process.emitWarning(warning);\n        else\n            console.warn(warning);\n    }\n}\n\nexports.debug = debug;\nexports.warn = warn;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Scalar = require('../../nodes/Scalar.js');\n\n// If the value associated with a merge key is a single mapping node, each of\n// its key/value pairs is inserted into the current mapping, unless the key\n// already exists in it. If the value associated with the merge key is a\n// sequence, then this sequence is expected to contain mapping nodes and each\n// of these nodes is merged in turn according to its order in the sequence.\n// Keys in mapping nodes earlier in the sequence override keys specified in\n// later mapping nodes. -- http://yaml.org/type/merge.html\nconst MERGE_KEY = '<<';\nconst merge = {\n    identify: value => value === MERGE_KEY ||\n        (typeof value === 'symbol' && value.description === MERGE_KEY),\n    default: 'key',\n    tag: 'tag:yaml.org,2002:merge',\n    test: /^<<$/,\n    resolve: () => Object.assign(new Scalar.Scalar(Symbol(MERGE_KEY)), {\n        addToJSMap: addMergeToJSMap\n    }),\n    stringify: () => MERGE_KEY\n};\nconst isMergeKey = (ctx, key) => (merge.identify(key) ||\n    (identity.isScalar(key) &&\n        (!key.type || key.type === Scalar.Scalar.PLAIN) &&\n        merge.identify(key.value))) &&\n    ctx?.doc.schema.tags.some(tag => tag.tag === merge.tag && tag.default);\nfunction addMergeToJSMap(ctx, map, value) {\n    value = ctx && identity.isAlias(value) ? value.resolve(ctx.doc) : value;\n    if (identity.isSeq(value))\n        for (const it of value.items)\n            mergeValue(ctx, map, it);\n    else if (Array.isArray(value))\n        for (const it of value)\n            mergeValue(ctx, map, it);\n    else\n        mergeValue(ctx, map, value);\n}\nfunction mergeValue(ctx, map, value) {\n    const source = ctx && identity.isAlias(value) ? value.resolve(ctx.doc) : value;\n    if (!identity.isMap(source))\n        throw new Error('Merge sources must be maps or map aliases');\n    const srcMap = source.toJSON(null, ctx, Map);\n    for (const [key, value] of srcMap) {\n        if (map instanceof Map) {\n            if (!map.has(key))\n                map.set(key, value);\n        }\n        else if (map instanceof Set) {\n            map.add(key);\n        }\n        else if (!Object.prototype.hasOwnProperty.call(map, key)) {\n            Object.defineProperty(map, key, {\n                value,\n                writable: true,\n                enumerable: true,\n                configurable: true\n            });\n        }\n    }\n    return map;\n}\n\nexports.addMergeToJSMap = addMergeToJSMap;\nexports.isMergeKey = isMergeKey;\nexports.merge = merge;\n","'use strict';\n\nvar log = require('../log.js');\nvar merge = require('../schema/yaml-1.1/merge.js');\nvar stringify = require('../stringify/stringify.js');\nvar identity = require('./identity.js');\nvar toJS = require('./toJS.js');\n\nfunction addPairToJSMap(ctx, map, { key, value }) {\n    if (identity.isNode(key) && key.addToJSMap)\n        key.addToJSMap(ctx, map, value);\n    // TODO: Should drop this special case for bare << handling\n    else if (merge.isMergeKey(ctx, key))\n        merge.addMergeToJSMap(ctx, map, value);\n    else {\n        const jsKey = toJS.toJS(key, '', ctx);\n        if (map instanceof Map) {\n            map.set(jsKey, toJS.toJS(value, jsKey, ctx));\n        }\n        else if (map instanceof Set) {\n            map.add(jsKey);\n        }\n        else {\n            const stringKey = stringifyKey(key, jsKey, ctx);\n            const jsValue = toJS.toJS(value, stringKey, ctx);\n            if (stringKey in map)\n                Object.defineProperty(map, stringKey, {\n                    value: jsValue,\n                    writable: true,\n                    enumerable: true,\n                    configurable: true\n                });\n            else\n                map[stringKey] = jsValue;\n        }\n    }\n    return map;\n}\nfunction stringifyKey(key, jsKey, ctx) {\n    if (jsKey === null)\n        return '';\n    // eslint-disable-next-line @typescript-eslint/no-base-to-string\n    if (typeof jsKey !== 'object')\n        return String(jsKey);\n    if (identity.isNode(key) && ctx?.doc) {\n        const strCtx = stringify.createStringifyContext(ctx.doc, {});\n        strCtx.anchors = new Set();\n        for (const node of ctx.anchors.keys())\n            strCtx.anchors.add(node.anchor);\n        strCtx.inFlow = true;\n        strCtx.inStringifyKey = true;\n        const strKey = key.toString(strCtx);\n        if (!ctx.mapKeyWarned) {\n            let jsonStr = JSON.stringify(strKey);\n            if (jsonStr.length > 40)\n                jsonStr = jsonStr.substring(0, 36) + '...\"';\n            log.warn(ctx.doc.options.logLevel, `Keys with collection values will be stringified due to JS Object restrictions: ${jsonStr}. Set mapAsMap: true to use object keys.`);\n            ctx.mapKeyWarned = true;\n        }\n        return strKey;\n    }\n    return JSON.stringify(jsKey);\n}\n\nexports.addPairToJSMap = addPairToJSMap;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyPair = require('../stringify/stringifyPair.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar identity = require('./identity.js');\n\nfunction createPair(key, value, ctx) {\n    const k = createNode.createNode(key, undefined, ctx);\n    const v = createNode.createNode(value, undefined, ctx);\n    return new Pair(k, v);\n}\nclass Pair {\n    constructor(key, value = null) {\n        Object.defineProperty(this, identity.NODE_TYPE, { value: identity.PAIR });\n        this.key = key;\n        this.value = value;\n    }\n    clone(schema) {\n        let { key, value } = this;\n        if (identity.isNode(key))\n            key = key.clone(schema);\n        if (identity.isNode(value))\n            value = value.clone(schema);\n        return new Pair(key, value);\n    }\n    toJSON(_, ctx) {\n        const pair = ctx?.mapAsMap ? new Map() : {};\n        return addPairToJSMap.addPairToJSMap(ctx, pair, this);\n    }\n    toString(ctx, onComment, onChompKeep) {\n        return ctx?.doc\n            ? stringifyPair.stringifyPair(this, ctx, onComment, onChompKeep)\n            : JSON.stringify(this);\n    }\n}\n\nexports.Pair = Pair;\nexports.createPair = createPair;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyCollection(collection, ctx, options) {\n    const flow = ctx.inFlow ?? collection.flow;\n    const stringify = flow ? stringifyFlowCollection : stringifyBlockCollection;\n    return stringify(collection, ctx, options);\n}\nfunction stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, flowChars, itemIndent, onChompKeep, onComment }) {\n    const { indent, options: { commentString } } = ctx;\n    const itemCtx = Object.assign({}, ctx, { indent: itemIndent, type: null });\n    let chompKeep = false; // flag for the preceding node's status\n    const lines = [];\n    for (let i = 0; i < items.length; ++i) {\n        const item = items[i];\n        let comment = null;\n        if (identity.isNode(item)) {\n            if (!chompKeep && item.spaceBefore)\n                lines.push('');\n            addCommentBefore(ctx, lines, item.commentBefore, chompKeep);\n            if (item.comment)\n                comment = item.comment;\n        }\n        else if (identity.isPair(item)) {\n            const ik = identity.isNode(item.key) ? item.key : null;\n            if (ik) {\n                if (!chompKeep && ik.spaceBefore)\n                    lines.push('');\n                addCommentBefore(ctx, lines, ik.commentBefore, chompKeep);\n            }\n        }\n        chompKeep = false;\n        let str = stringify.stringify(item, itemCtx, () => (comment = null), () => (chompKeep = true));\n        if (comment)\n            str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n        if (chompKeep && comment)\n            chompKeep = false;\n        lines.push(blockItemPrefix + str);\n    }\n    let str;\n    if (lines.length === 0) {\n        str = flowChars.start + flowChars.end;\n    }\n    else {\n        str = lines[0];\n        for (let i = 1; i < lines.length; ++i) {\n            const line = lines[i];\n            str += line ? `\\n${indent}${line}` : '\\n';\n        }\n    }\n    if (comment) {\n        str += '\\n' + stringifyComment.indentComment(commentString(comment), indent);\n        if (onComment)\n            onComment();\n    }\n    else if (chompKeep && onChompKeep)\n        onChompKeep();\n    return str;\n}\nfunction stringifyFlowCollection({ items }, ctx, { flowChars, itemIndent }) {\n    const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;\n    itemIndent += indentStep;\n    const itemCtx = Object.assign({}, ctx, {\n        indent: itemIndent,\n        inFlow: true,\n        type: null\n    });\n    let reqNewline = false;\n    let linesAtValue = 0;\n    const lines = [];\n    for (let i = 0; i < items.length; ++i) {\n        const item = items[i];\n        let comment = null;\n        if (identity.isNode(item)) {\n            if (item.spaceBefore)\n                lines.push('');\n            addCommentBefore(ctx, lines, item.commentBefore, false);\n            if (item.comment)\n                comment = item.comment;\n        }\n        else if (identity.isPair(item)) {\n            const ik = identity.isNode(item.key) ? item.key : null;\n            if (ik) {\n                if (ik.spaceBefore)\n                    lines.push('');\n                addCommentBefore(ctx, lines, ik.commentBefore, false);\n                if (ik.comment)\n                    reqNewline = true;\n            }\n            const iv = identity.isNode(item.value) ? item.value : null;\n            if (iv) {\n                if (iv.comment)\n                    comment = iv.comment;\n                if (iv.commentBefore)\n                    reqNewline = true;\n            }\n            else if (item.value == null && ik?.comment) {\n                comment = ik.comment;\n            }\n        }\n        if (comment)\n            reqNewline = true;\n        let str = stringify.stringify(item, itemCtx, () => (comment = null));\n        if (i < items.length - 1)\n            str += ',';\n        if (comment)\n            str += stringifyComment.lineComment(str, itemIndent, commentString(comment));\n        if (!reqNewline && (lines.length > linesAtValue || str.includes('\\n')))\n            reqNewline = true;\n        lines.push(str);\n        linesAtValue = lines.length;\n    }\n    const { start, end } = flowChars;\n    if (lines.length === 0) {\n        return start + end;\n    }\n    else {\n        if (!reqNewline) {\n            const len = lines.reduce((sum, line) => sum + line.length + 2, 2);\n            reqNewline = ctx.options.lineWidth > 0 && len > ctx.options.lineWidth;\n        }\n        if (reqNewline) {\n            let str = start;\n            for (const line of lines)\n                str += line ? `\\n${indentStep}${indent}${line}` : '\\n';\n            return `${str}\\n${indent}${end}`;\n        }\n        else {\n            return `${start}${fcPadding}${lines.join(' ')}${fcPadding}${end}`;\n        }\n    }\n}\nfunction addCommentBefore({ indent, options: { commentString } }, lines, comment, chompKeep) {\n    if (comment && chompKeep)\n        comment = comment.replace(/^\\n+/, '');\n    if (comment) {\n        const ic = stringifyComment.indentComment(commentString(comment), indent);\n        lines.push(ic.trimStart()); // Avoid double indent on first line\n    }\n}\n\nexports.stringifyCollection = stringifyCollection;\n","'use strict';\n\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar addPairToJSMap = require('./addPairToJSMap.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Pair = require('./Pair.js');\nvar Scalar = require('./Scalar.js');\n\nfunction findPair(items, key) {\n    const k = identity.isScalar(key) ? key.value : key;\n    for (const it of items) {\n        if (identity.isPair(it)) {\n            if (it.key === key || it.key === k)\n                return it;\n            if (identity.isScalar(it.key) && it.key.value === k)\n                return it;\n        }\n    }\n    return undefined;\n}\nclass YAMLMap extends Collection.Collection {\n    static get tagName() {\n        return 'tag:yaml.org,2002:map';\n    }\n    constructor(schema) {\n        super(identity.MAP, schema);\n        this.items = [];\n    }\n    /**\n     * A generic collection parsing method that can be extended\n     * to other node classes that inherit from YAMLMap\n     */\n    static from(schema, obj, ctx) {\n        const { keepUndefined, replacer } = ctx;\n        const map = new this(schema);\n        const add = (key, value) => {\n            if (typeof replacer === 'function')\n                value = replacer.call(obj, key, value);\n            else if (Array.isArray(replacer) && !replacer.includes(key))\n                return;\n            if (value !== undefined || keepUndefined)\n                map.items.push(Pair.createPair(key, value, ctx));\n        };\n        if (obj instanceof Map) {\n            for (const [key, value] of obj)\n                add(key, value);\n        }\n        else if (obj && typeof obj === 'object') {\n            for (const key of Object.keys(obj))\n                add(key, obj[key]);\n        }\n        if (typeof schema.sortMapEntries === 'function') {\n            map.items.sort(schema.sortMapEntries);\n        }\n        return map;\n    }\n    /**\n     * Adds a value to the collection.\n     *\n     * @param overwrite - If not set `true`, using a key that is already in the\n     *   collection will throw. Otherwise, overwrites the previous value.\n     */\n    add(pair, overwrite) {\n        let _pair;\n        if (identity.isPair(pair))\n            _pair = pair;\n        else if (!pair || typeof pair !== 'object' || !('key' in pair)) {\n            // In TypeScript, this never happens.\n            _pair = new Pair.Pair(pair, pair?.value);\n        }\n        else\n            _pair = new Pair.Pair(pair.key, pair.value);\n        const prev = findPair(this.items, _pair.key);\n        const sortEntries = this.schema?.sortMapEntries;\n        if (prev) {\n            if (!overwrite)\n                throw new Error(`Key ${_pair.key} already set`);\n            // For scalars, keep the old node & its comments and anchors\n            if (identity.isScalar(prev.value) && Scalar.isScalarValue(_pair.value))\n                prev.value.value = _pair.value;\n            else\n                prev.value = _pair.value;\n        }\n        else if (sortEntries) {\n            const i = this.items.findIndex(item => sortEntries(_pair, item) < 0);\n            if (i === -1)\n                this.items.push(_pair);\n            else\n                this.items.splice(i, 0, _pair);\n        }\n        else {\n            this.items.push(_pair);\n        }\n    }\n    delete(key) {\n        const it = findPair(this.items, key);\n        if (!it)\n            return false;\n        const del = this.items.splice(this.items.indexOf(it), 1);\n        return del.length > 0;\n    }\n    get(key, keepScalar) {\n        const it = findPair(this.items, key);\n        const node = it?.value;\n        return (!keepScalar && identity.isScalar(node) ? node.value : node) ?? undefined;\n    }\n    has(key) {\n        return !!findPair(this.items, key);\n    }\n    set(key, value) {\n        this.add(new Pair.Pair(key, value), true);\n    }\n    /**\n     * @param ctx - Conversion context, originally set in Document#toJS()\n     * @param {Class} Type - If set, forces the returned collection type\n     * @returns Instance of Type, Map, or Object\n     */\n    toJSON(_, ctx, Type) {\n        const map = Type ? new Type() : ctx?.mapAsMap ? new Map() : {};\n        if (ctx?.onCreate)\n            ctx.onCreate(map);\n        for (const item of this.items)\n            addPairToJSMap.addPairToJSMap(ctx, map, item);\n        return map;\n    }\n    toString(ctx, onComment, onChompKeep) {\n        if (!ctx)\n            return JSON.stringify(this);\n        for (const item of this.items) {\n            if (!identity.isPair(item))\n                throw new Error(`Map items must all be pairs; found ${JSON.stringify(item)} instead`);\n        }\n        if (!ctx.allNullValues && this.hasAllNullValues(false))\n            ctx = Object.assign({}, ctx, { allNullValues: true });\n        return stringifyCollection.stringifyCollection(this, ctx, {\n            blockItemPrefix: '',\n            flowChars: { start: '{', end: '}' },\n            itemIndent: ctx.indent || '',\n            onChompKeep,\n            onComment\n        });\n    }\n}\n\nexports.YAMLMap = YAMLMap;\nexports.findPair = findPair;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nconst map = {\n    collection: 'map',\n    default: true,\n    nodeClass: YAMLMap.YAMLMap,\n    tag: 'tag:yaml.org,2002:map',\n    resolve(map, onError) {\n        if (!identity.isMap(map))\n            onError('Expected a mapping for this tag');\n        return map;\n    },\n    createNode: (schema, obj, ctx) => YAMLMap.YAMLMap.from(schema, obj, ctx)\n};\n\nexports.map = map;\n","'use strict';\n\nvar createNode = require('../doc/createNode.js');\nvar stringifyCollection = require('../stringify/stringifyCollection.js');\nvar Collection = require('./Collection.js');\nvar identity = require('./identity.js');\nvar Scalar = require('./Scalar.js');\nvar toJS = require('./toJS.js');\n\nclass YAMLSeq extends Collection.Collection {\n    static get tagName() {\n        return 'tag:yaml.org,2002:seq';\n    }\n    constructor(schema) {\n        super(identity.SEQ, schema);\n        this.items = [];\n    }\n    add(value) {\n        this.items.push(value);\n    }\n    /**\n     * Removes a value from the collection.\n     *\n     * `key` must contain a representation of an integer for this to succeed.\n     * It may be wrapped in a `Scalar`.\n     *\n     * @returns `true` if the item was found and removed.\n     */\n    delete(key) {\n        const idx = asItemIndex(key);\n        if (typeof idx !== 'number')\n            return false;\n        const del = this.items.splice(idx, 1);\n        return del.length > 0;\n    }\n    get(key, keepScalar) {\n        const idx = asItemIndex(key);\n        if (typeof idx !== 'number')\n            return undefined;\n        const it = this.items[idx];\n        return !keepScalar && identity.isScalar(it) ? it.value : it;\n    }\n    /**\n     * Checks if the collection includes a value with the key `key`.\n     *\n     * `key` must contain a representation of an integer for this to succeed.\n     * It may be wrapped in a `Scalar`.\n     */\n    has(key) {\n        const idx = asItemIndex(key);\n        return typeof idx === 'number' && idx < this.items.length;\n    }\n    /**\n     * Sets a value in this collection. For `!!set`, `value` needs to be a\n     * boolean to add/remove the item from the set.\n     *\n     * If `key` does not contain a representation of an integer, this will throw.\n     * It may be wrapped in a `Scalar`.\n     */\n    set(key, value) {\n        const idx = asItemIndex(key);\n        if (typeof idx !== 'number')\n            throw new Error(`Expected a valid index, not ${key}.`);\n        const prev = this.items[idx];\n        if (identity.isScalar(prev) && Scalar.isScalarValue(value))\n            prev.value = value;\n        else\n            this.items[idx] = value;\n    }\n    toJSON(_, ctx) {\n        const seq = [];\n        if (ctx?.onCreate)\n            ctx.onCreate(seq);\n        let i = 0;\n        for (const item of this.items)\n            seq.push(toJS.toJS(item, String(i++), ctx));\n        return seq;\n    }\n    toString(ctx, onComment, onChompKeep) {\n        if (!ctx)\n            return JSON.stringify(this);\n        return stringifyCollection.stringifyCollection(this, ctx, {\n            blockItemPrefix: '- ',\n            flowChars: { start: '[', end: ']' },\n            itemIndent: (ctx.indent || '') + '  ',\n            onChompKeep,\n            onComment\n        });\n    }\n    static from(schema, obj, ctx) {\n        const { replacer } = ctx;\n        const seq = new this(schema);\n        if (obj && Symbol.iterator in Object(obj)) {\n            let i = 0;\n            for (let it of obj) {\n                if (typeof replacer === 'function') {\n                    const key = obj instanceof Set ? it : String(i++);\n                    it = replacer.call(obj, key, it);\n                }\n                seq.items.push(createNode.createNode(it, undefined, ctx));\n            }\n        }\n        return seq;\n    }\n}\nfunction asItemIndex(key) {\n    let idx = identity.isScalar(key) ? key.value : key;\n    if (idx && typeof idx === 'string')\n        idx = Number(idx);\n    return typeof idx === 'number' && Number.isInteger(idx) && idx >= 0\n        ? idx\n        : null;\n}\n\nexports.YAMLSeq = YAMLSeq;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nconst seq = {\n    collection: 'seq',\n    default: true,\n    nodeClass: YAMLSeq.YAMLSeq,\n    tag: 'tag:yaml.org,2002:seq',\n    resolve(seq, onError) {\n        if (!identity.isSeq(seq))\n            onError('Expected a sequence for this tag');\n        return seq;\n    },\n    createNode: (schema, obj, ctx) => YAMLSeq.YAMLSeq.from(schema, obj, ctx)\n};\n\nexports.seq = seq;\n","'use strict';\n\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst string = {\n    identify: value => typeof value === 'string',\n    default: true,\n    tag: 'tag:yaml.org,2002:str',\n    resolve: str => str,\n    stringify(item, ctx, onComment, onChompKeep) {\n        ctx = Object.assign({ actualString: true }, ctx);\n        return stringifyString.stringifyString(item, ctx, onComment, onChompKeep);\n    }\n};\n\nexports.string = string;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst nullTag = {\n    identify: value => value == null,\n    createNode: () => new Scalar.Scalar(null),\n    default: true,\n    tag: 'tag:yaml.org,2002:null',\n    test: /^(?:~|[Nn]ull|NULL)?$/,\n    resolve: () => new Scalar.Scalar(null),\n    stringify: ({ source }, ctx) => typeof source === 'string' && nullTag.test.test(source)\n        ? source\n        : ctx.options.nullStr\n};\n\nexports.nullTag = nullTag;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nconst boolTag = {\n    identify: value => typeof value === 'boolean',\n    default: true,\n    tag: 'tag:yaml.org,2002:bool',\n    test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,\n    resolve: str => new Scalar.Scalar(str[0] === 't' || str[0] === 'T'),\n    stringify({ source, value }, ctx) {\n        if (source && boolTag.test.test(source)) {\n            const sv = source[0] === 't' || source[0] === 'T';\n            if (value === sv)\n                return source;\n        }\n        return value ? ctx.options.trueStr : ctx.options.falseStr;\n    }\n};\n\nexports.boolTag = boolTag;\n","'use strict';\n\nfunction stringifyNumber({ format, minFractionDigits, tag, value }) {\n    if (typeof value === 'bigint')\n        return String(value);\n    const num = typeof value === 'number' ? value : Number(value);\n    if (!isFinite(num))\n        return isNaN(num) ? '.nan' : num < 0 ? '-.inf' : '.inf';\n    let n = Object.is(value, -0) ? '-0' : JSON.stringify(value);\n    if (!format &&\n        minFractionDigits &&\n        (!tag || tag === 'tag:yaml.org,2002:float') &&\n        /^\\d/.test(n)) {\n        let i = n.indexOf('.');\n        if (i < 0) {\n            i = n.length;\n            n += '.';\n        }\n        let d = minFractionDigits - (n.length - i - 1);\n        while (d-- > 0)\n            n += '0';\n    }\n    return n;\n}\n\nexports.stringifyNumber = stringifyNumber;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n    identify: value => typeof value === 'number',\n    default: true,\n    tag: 'tag:yaml.org,2002:float',\n    test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n    resolve: str => str.slice(-3).toLowerCase() === 'nan'\n        ? NaN\n        : str[0] === '-'\n            ? Number.NEGATIVE_INFINITY\n            : Number.POSITIVE_INFINITY,\n    stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n    identify: value => typeof value === 'number',\n    default: true,\n    tag: 'tag:yaml.org,2002:float',\n    format: 'EXP',\n    test: /^[-+]?(?:\\.[0-9]+|[0-9]+(?:\\.[0-9]*)?)[eE][-+]?[0-9]+$/,\n    resolve: str => parseFloat(str),\n    stringify(node) {\n        const num = Number(node.value);\n        return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n    }\n};\nconst float = {\n    identify: value => typeof value === 'number',\n    default: true,\n    tag: 'tag:yaml.org,2002:float',\n    test: /^[-+]?(?:\\.[0-9]+|[0-9]+\\.[0-9]*)$/,\n    resolve(str) {\n        const node = new Scalar.Scalar(parseFloat(str));\n        const dot = str.indexOf('.');\n        if (dot !== -1 && str[str.length - 1] === '0')\n            node.minFractionDigits = str.length - dot - 1;\n        return node;\n    },\n    stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nconst intResolve = (str, offset, radix, { intAsBigInt }) => (intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix));\nfunction intStringify(node, radix, prefix) {\n    const { value } = node;\n    if (intIdentify(value) && value >= 0)\n        return prefix + value.toString(radix);\n    return stringifyNumber.stringifyNumber(node);\n}\nconst intOct = {\n    identify: value => intIdentify(value) && value >= 0,\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    format: 'OCT',\n    test: /^0o[0-7]+$/,\n    resolve: (str, _onError, opt) => intResolve(str, 2, 8, opt),\n    stringify: node => intStringify(node, 8, '0o')\n};\nconst int = {\n    identify: intIdentify,\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    test: /^[-+]?[0-9]+$/,\n    resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n    stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n    identify: value => intIdentify(value) && value >= 0,\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    format: 'HEX',\n    test: /^0x[0-9a-fA-F]+$/,\n    resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n    stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intHex = intHex;\nexports.intOct = intOct;\n","'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\n\nconst schema = [\n    map.map,\n    seq.seq,\n    string.string,\n    _null.nullTag,\n    bool.boolTag,\n    int.intOct,\n    int.int,\n    int.intHex,\n    float.floatNaN,\n    float.floatExp,\n    float.float\n];\n\nexports.schema = schema;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar map = require('../common/map.js');\nvar seq = require('../common/seq.js');\n\nfunction intIdentify(value) {\n    return typeof value === 'bigint' || Number.isInteger(value);\n}\nconst stringifyJSON = ({ value }) => JSON.stringify(value);\nconst jsonScalars = [\n    {\n        identify: value => typeof value === 'string',\n        default: true,\n        tag: 'tag:yaml.org,2002:str',\n        resolve: str => str,\n        stringify: stringifyJSON\n    },\n    {\n        identify: value => value == null,\n        createNode: () => new Scalar.Scalar(null),\n        default: true,\n        tag: 'tag:yaml.org,2002:null',\n        test: /^null$/,\n        resolve: () => null,\n        stringify: stringifyJSON\n    },\n    {\n        identify: value => typeof value === 'boolean',\n        default: true,\n        tag: 'tag:yaml.org,2002:bool',\n        test: /^true$|^false$/,\n        resolve: str => str === 'true',\n        stringify: stringifyJSON\n    },\n    {\n        identify: intIdentify,\n        default: true,\n        tag: 'tag:yaml.org,2002:int',\n        test: /^-?(?:0|[1-9][0-9]*)$/,\n        resolve: (str, _onError, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str, 10),\n        stringify: ({ value }) => intIdentify(value) ? value.toString() : JSON.stringify(value)\n    },\n    {\n        identify: value => typeof value === 'number',\n        default: true,\n        tag: 'tag:yaml.org,2002:float',\n        test: /^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,\n        resolve: str => parseFloat(str),\n        stringify: stringifyJSON\n    }\n];\nconst jsonError = {\n    default: true,\n    tag: '',\n    test: /^/,\n    resolve(str, onError) {\n        onError(`Unresolved plain scalar ${JSON.stringify(str)}`);\n        return str;\n    }\n};\nconst schema = [map.map, seq.seq].concat(jsonScalars, jsonError);\n\nexports.schema = schema;\n","'use strict';\n\nvar node_buffer = require('buffer');\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyString = require('../../stringify/stringifyString.js');\n\nconst binary = {\n    identify: value => value instanceof Uint8Array, // Buffer inherits from Uint8Array\n    default: false,\n    tag: 'tag:yaml.org,2002:binary',\n    /**\n     * Returns a Buffer in node and an Uint8Array in browsers\n     *\n     * To use the resulting buffer as an image, you'll want to do something like:\n     *\n     *   const blob = new Blob([buffer], { type: 'image/jpeg' })\n     *   document.querySelector('#photo').src = URL.createObjectURL(blob)\n     */\n    resolve(src, onError) {\n        if (typeof node_buffer.Buffer === 'function') {\n            return node_buffer.Buffer.from(src, 'base64');\n        }\n        else if (typeof atob === 'function') {\n            // On IE 11, atob() can't handle newlines\n            const str = atob(src.replace(/[\\n\\r]/g, ''));\n            const buffer = new Uint8Array(str.length);\n            for (let i = 0; i < str.length; ++i)\n                buffer[i] = str.charCodeAt(i);\n            return buffer;\n        }\n        else {\n            onError('This environment does not support reading binary tags; either Buffer or atob is required');\n            return src;\n        }\n    },\n    stringify({ comment, type, value }, ctx, onComment, onChompKeep) {\n        if (!value)\n            return '';\n        const buf = value; // checked earlier by binary.identify()\n        let str;\n        if (typeof node_buffer.Buffer === 'function') {\n            str =\n                buf instanceof node_buffer.Buffer\n                    ? buf.toString('base64')\n                    : node_buffer.Buffer.from(buf.buffer).toString('base64');\n        }\n        else if (typeof btoa === 'function') {\n            let s = '';\n            for (let i = 0; i < buf.length; ++i)\n                s += String.fromCharCode(buf[i]);\n            str = btoa(s);\n        }\n        else {\n            throw new Error('This environment does not support writing binary tags; either Buffer or btoa is required');\n        }\n        type ?? (type = Scalar.Scalar.BLOCK_LITERAL);\n        if (type !== Scalar.Scalar.QUOTE_DOUBLE) {\n            const lineWidth = Math.max(ctx.options.lineWidth - ctx.indent.length, ctx.options.minContentWidth);\n            const n = Math.ceil(str.length / lineWidth);\n            const lines = new Array(n);\n            for (let i = 0, o = 0; i < n; ++i, o += lineWidth) {\n                lines[i] = str.substr(o, lineWidth);\n            }\n            str = lines.join(type === Scalar.Scalar.BLOCK_LITERAL ? '\\n' : ' ');\n        }\n        return stringifyString.stringifyString({ comment, type, value: str }, ctx, onComment, onChompKeep);\n    }\n};\n\nexports.binary = binary;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar Scalar = require('../../nodes/Scalar.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\n\nfunction resolvePairs(seq, onError) {\n    if (identity.isSeq(seq)) {\n        for (let i = 0; i < seq.items.length; ++i) {\n            let item = seq.items[i];\n            if (identity.isPair(item))\n                continue;\n            else if (identity.isMap(item)) {\n                if (item.items.length > 1)\n                    onError('Each pair must have its own sequence indicator');\n                const pair = item.items[0] || new Pair.Pair(new Scalar.Scalar(null));\n                if (item.commentBefore)\n                    pair.key.commentBefore = pair.key.commentBefore\n                        ? `${item.commentBefore}\\n${pair.key.commentBefore}`\n                        : item.commentBefore;\n                if (item.comment) {\n                    const cn = pair.value ?? pair.key;\n                    cn.comment = cn.comment\n                        ? `${item.comment}\\n${cn.comment}`\n                        : item.comment;\n                }\n                item = pair;\n            }\n            seq.items[i] = identity.isPair(item) ? item : new Pair.Pair(item);\n        }\n    }\n    else\n        onError('Expected a sequence for this tag');\n    return seq;\n}\nfunction createPairs(schema, iterable, ctx) {\n    const { replacer } = ctx;\n    const pairs = new YAMLSeq.YAMLSeq(schema);\n    pairs.tag = 'tag:yaml.org,2002:pairs';\n    let i = 0;\n    if (iterable && Symbol.iterator in Object(iterable))\n        for (let it of iterable) {\n            if (typeof replacer === 'function')\n                it = replacer.call(iterable, String(i++), it);\n            let key, value;\n            if (Array.isArray(it)) {\n                if (it.length === 2) {\n                    key = it[0];\n                    value = it[1];\n                }\n                else\n                    throw new TypeError(`Expected [key, value] tuple: ${it}`);\n            }\n            else if (it && it instanceof Object) {\n                const keys = Object.keys(it);\n                if (keys.length === 1) {\n                    key = keys[0];\n                    value = it[key];\n                }\n                else {\n                    throw new TypeError(`Expected tuple with one key, not ${keys.length} keys`);\n                }\n            }\n            else {\n                key = it;\n            }\n            pairs.items.push(Pair.createPair(key, value, ctx));\n        }\n    return pairs;\n}\nconst pairs = {\n    collection: 'seq',\n    default: false,\n    tag: 'tag:yaml.org,2002:pairs',\n    resolve: resolvePairs,\n    createNode: createPairs\n};\n\nexports.createPairs = createPairs;\nexports.pairs = pairs;\nexports.resolvePairs = resolvePairs;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar toJS = require('../../nodes/toJS.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\nvar YAMLSeq = require('../../nodes/YAMLSeq.js');\nvar pairs = require('./pairs.js');\n\nclass YAMLOMap extends YAMLSeq.YAMLSeq {\n    constructor() {\n        super();\n        this.add = YAMLMap.YAMLMap.prototype.add.bind(this);\n        this.delete = YAMLMap.YAMLMap.prototype.delete.bind(this);\n        this.get = YAMLMap.YAMLMap.prototype.get.bind(this);\n        this.has = YAMLMap.YAMLMap.prototype.has.bind(this);\n        this.set = YAMLMap.YAMLMap.prototype.set.bind(this);\n        this.tag = YAMLOMap.tag;\n    }\n    /**\n     * If `ctx` is given, the return type is actually `Map<unknown, unknown>`,\n     * but TypeScript won't allow widening the signature of a child method.\n     */\n    toJSON(_, ctx) {\n        if (!ctx)\n            return super.toJSON(_);\n        const map = new Map();\n        if (ctx?.onCreate)\n            ctx.onCreate(map);\n        for (const pair of this.items) {\n            let key, value;\n            if (identity.isPair(pair)) {\n                key = toJS.toJS(pair.key, '', ctx);\n                value = toJS.toJS(pair.value, key, ctx);\n            }\n            else {\n                key = toJS.toJS(pair, '', ctx);\n            }\n            if (map.has(key))\n                throw new Error('Ordered maps must not include duplicate keys');\n            map.set(key, value);\n        }\n        return map;\n    }\n    static from(schema, iterable, ctx) {\n        const pairs$1 = pairs.createPairs(schema, iterable, ctx);\n        const omap = new this();\n        omap.items = pairs$1.items;\n        return omap;\n    }\n}\nYAMLOMap.tag = 'tag:yaml.org,2002:omap';\nconst omap = {\n    collection: 'seq',\n    identify: value => value instanceof Map,\n    nodeClass: YAMLOMap,\n    default: false,\n    tag: 'tag:yaml.org,2002:omap',\n    resolve(seq, onError) {\n        const pairs$1 = pairs.resolvePairs(seq, onError);\n        const seenKeys = [];\n        for (const { key } of pairs$1.items) {\n            if (identity.isScalar(key)) {\n                if (seenKeys.includes(key.value)) {\n                    onError(`Ordered maps must not include duplicate keys: ${key.value}`);\n                }\n                else {\n                    seenKeys.push(key.value);\n                }\n            }\n        }\n        return Object.assign(new YAMLOMap(), pairs$1);\n    },\n    createNode: (schema, iterable, ctx) => YAMLOMap.from(schema, iterable, ctx)\n};\n\nexports.YAMLOMap = YAMLOMap;\nexports.omap = omap;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\n\nfunction boolStringify({ value, source }, ctx) {\n    const boolObj = value ? trueTag : falseTag;\n    if (source && boolObj.test.test(source))\n        return source;\n    return value ? ctx.options.trueStr : ctx.options.falseStr;\n}\nconst trueTag = {\n    identify: value => value === true,\n    default: true,\n    tag: 'tag:yaml.org,2002:bool',\n    test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,\n    resolve: () => new Scalar.Scalar(true),\n    stringify: boolStringify\n};\nconst falseTag = {\n    identify: value => value === false,\n    default: true,\n    tag: 'tag:yaml.org,2002:bool',\n    test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,\n    resolve: () => new Scalar.Scalar(false),\n    stringify: boolStringify\n};\n\nexports.falseTag = falseTag;\nexports.trueTag = trueTag;\n","'use strict';\n\nvar Scalar = require('../../nodes/Scalar.js');\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst floatNaN = {\n    identify: value => typeof value === 'number',\n    default: true,\n    tag: 'tag:yaml.org,2002:float',\n    test: /^(?:[-+]?\\.(?:inf|Inf|INF)|\\.nan|\\.NaN|\\.NAN)$/,\n    resolve: (str) => str.slice(-3).toLowerCase() === 'nan'\n        ? NaN\n        : str[0] === '-'\n            ? Number.NEGATIVE_INFINITY\n            : Number.POSITIVE_INFINITY,\n    stringify: stringifyNumber.stringifyNumber\n};\nconst floatExp = {\n    identify: value => typeof value === 'number',\n    default: true,\n    tag: 'tag:yaml.org,2002:float',\n    format: 'EXP',\n    test: /^[-+]?(?:[0-9][0-9_]*)?(?:\\.[0-9_]*)?[eE][-+]?[0-9]+$/,\n    resolve: (str) => parseFloat(str.replace(/_/g, '')),\n    stringify(node) {\n        const num = Number(node.value);\n        return isFinite(num) ? num.toExponential() : stringifyNumber.stringifyNumber(node);\n    }\n};\nconst float = {\n    identify: value => typeof value === 'number',\n    default: true,\n    tag: 'tag:yaml.org,2002:float',\n    test: /^[-+]?(?:[0-9][0-9_]*)?\\.[0-9_]*$/,\n    resolve(str) {\n        const node = new Scalar.Scalar(parseFloat(str.replace(/_/g, '')));\n        const dot = str.indexOf('.');\n        if (dot !== -1) {\n            const f = str.substring(dot + 1).replace(/_/g, '');\n            if (f[f.length - 1] === '0')\n                node.minFractionDigits = f.length;\n        }\n        return node;\n    },\n    stringify: stringifyNumber.stringifyNumber\n};\n\nexports.float = float;\nexports.floatExp = floatExp;\nexports.floatNaN = floatNaN;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\nconst intIdentify = (value) => typeof value === 'bigint' || Number.isInteger(value);\nfunction intResolve(str, offset, radix, { intAsBigInt }) {\n    const sign = str[0];\n    if (sign === '-' || sign === '+')\n        offset += 1;\n    str = str.substring(offset).replace(/_/g, '');\n    if (intAsBigInt) {\n        switch (radix) {\n            case 2:\n                str = `0b${str}`;\n                break;\n            case 8:\n                str = `0o${str}`;\n                break;\n            case 16:\n                str = `0x${str}`;\n                break;\n        }\n        const n = BigInt(str);\n        return sign === '-' ? BigInt(-1) * n : n;\n    }\n    const n = parseInt(str, radix);\n    return sign === '-' ? -1 * n : n;\n}\nfunction intStringify(node, radix, prefix) {\n    const { value } = node;\n    if (intIdentify(value)) {\n        const str = value.toString(radix);\n        return value < 0 ? '-' + prefix + str.substr(1) : prefix + str;\n    }\n    return stringifyNumber.stringifyNumber(node);\n}\nconst intBin = {\n    identify: intIdentify,\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    format: 'BIN',\n    test: /^[-+]?0b[0-1_]+$/,\n    resolve: (str, _onError, opt) => intResolve(str, 2, 2, opt),\n    stringify: node => intStringify(node, 2, '0b')\n};\nconst intOct = {\n    identify: intIdentify,\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    format: 'OCT',\n    test: /^[-+]?0[0-7_]+$/,\n    resolve: (str, _onError, opt) => intResolve(str, 1, 8, opt),\n    stringify: node => intStringify(node, 8, '0')\n};\nconst int = {\n    identify: intIdentify,\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    test: /^[-+]?[0-9][0-9_]*$/,\n    resolve: (str, _onError, opt) => intResolve(str, 0, 10, opt),\n    stringify: stringifyNumber.stringifyNumber\n};\nconst intHex = {\n    identify: intIdentify,\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    format: 'HEX',\n    test: /^[-+]?0x[0-9a-fA-F_]+$/,\n    resolve: (str, _onError, opt) => intResolve(str, 2, 16, opt),\n    stringify: node => intStringify(node, 16, '0x')\n};\n\nexports.int = int;\nexports.intBin = intBin;\nexports.intHex = intHex;\nexports.intOct = intOct;\n","'use strict';\n\nvar identity = require('../../nodes/identity.js');\nvar Pair = require('../../nodes/Pair.js');\nvar YAMLMap = require('../../nodes/YAMLMap.js');\n\nclass YAMLSet extends YAMLMap.YAMLMap {\n    constructor(schema) {\n        super(schema);\n        this.tag = YAMLSet.tag;\n    }\n    add(key) {\n        let pair;\n        if (identity.isPair(key))\n            pair = key;\n        else if (key &&\n            typeof key === 'object' &&\n            'key' in key &&\n            'value' in key &&\n            key.value === null)\n            pair = new Pair.Pair(key.key, null);\n        else\n            pair = new Pair.Pair(key, null);\n        const prev = YAMLMap.findPair(this.items, pair.key);\n        if (!prev)\n            this.items.push(pair);\n    }\n    /**\n     * If `keepPair` is `true`, returns the Pair matching `key`.\n     * Otherwise, returns the value of that Pair's key.\n     */\n    get(key, keepPair) {\n        const pair = YAMLMap.findPair(this.items, key);\n        return !keepPair && identity.isPair(pair)\n            ? identity.isScalar(pair.key)\n                ? pair.key.value\n                : pair.key\n            : pair;\n    }\n    set(key, value) {\n        if (typeof value !== 'boolean')\n            throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof value}`);\n        const prev = YAMLMap.findPair(this.items, key);\n        if (prev && !value) {\n            this.items.splice(this.items.indexOf(prev), 1);\n        }\n        else if (!prev && value) {\n            this.items.push(new Pair.Pair(key));\n        }\n    }\n    toJSON(_, ctx) {\n        return super.toJSON(_, ctx, Set);\n    }\n    toString(ctx, onComment, onChompKeep) {\n        if (!ctx)\n            return JSON.stringify(this);\n        if (this.hasAllNullValues(true))\n            return super.toString(Object.assign({}, ctx, { allNullValues: true }), onComment, onChompKeep);\n        else\n            throw new Error('Set items must all have null values');\n    }\n    static from(schema, iterable, ctx) {\n        const { replacer } = ctx;\n        const set = new this(schema);\n        if (iterable && Symbol.iterator in Object(iterable))\n            for (let value of iterable) {\n                if (typeof replacer === 'function')\n                    value = replacer.call(iterable, value, value);\n                set.items.push(Pair.createPair(value, null, ctx));\n            }\n        return set;\n    }\n}\nYAMLSet.tag = 'tag:yaml.org,2002:set';\nconst set = {\n    collection: 'map',\n    identify: value => value instanceof Set,\n    nodeClass: YAMLSet,\n    default: false,\n    tag: 'tag:yaml.org,2002:set',\n    createNode: (schema, iterable, ctx) => YAMLSet.from(schema, iterable, ctx),\n    resolve(map, onError) {\n        if (identity.isMap(map)) {\n            if (map.hasAllNullValues(true))\n                return Object.assign(new YAMLSet(), map);\n            else\n                onError('Set items must all have null values');\n        }\n        else\n            onError('Expected a mapping for this tag');\n        return map;\n    }\n};\n\nexports.YAMLSet = YAMLSet;\nexports.set = set;\n","'use strict';\n\nvar stringifyNumber = require('../../stringify/stringifyNumber.js');\n\n/** Internal types handle bigint as number, because TS can't figure it out. */\nfunction parseSexagesimal(str, asBigInt) {\n    const sign = str[0];\n    const parts = sign === '-' || sign === '+' ? str.substring(1) : str;\n    const num = (n) => asBigInt ? BigInt(n) : Number(n);\n    const res = parts\n        .replace(/_/g, '')\n        .split(':')\n        .reduce((res, p) => res * num(60) + num(p), num(0));\n    return (sign === '-' ? num(-1) * res : res);\n}\n/**\n * hhhh:mm:ss.sss\n *\n * Internal types handle bigint as number, because TS can't figure it out.\n */\nfunction stringifySexagesimal(node) {\n    let { value } = node;\n    let num = (n) => n;\n    if (typeof value === 'bigint')\n        num = n => BigInt(n);\n    else if (isNaN(value) || !isFinite(value))\n        return stringifyNumber.stringifyNumber(node);\n    let sign = '';\n    if (value < 0) {\n        sign = '-';\n        value *= num(-1);\n    }\n    const _60 = num(60);\n    const parts = [value % _60]; // seconds, including ms\n    if (value < 60) {\n        parts.unshift(0); // at least one : is required\n    }\n    else {\n        value = (value - parts[0]) / _60;\n        parts.unshift(value % _60); // minutes\n        if (value >= 60) {\n            value = (value - parts[0]) / _60;\n            parts.unshift(value); // hours\n        }\n    }\n    return (sign +\n        parts\n            .map(n => String(n).padStart(2, '0'))\n            .join(':')\n            .replace(/000000\\d*$/, '') // % 60 may introduce error\n    );\n}\nconst intTime = {\n    identify: value => typeof value === 'bigint' || Number.isInteger(value),\n    default: true,\n    tag: 'tag:yaml.org,2002:int',\n    format: 'TIME',\n    test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,\n    resolve: (str, _onError, { intAsBigInt }) => parseSexagesimal(str, intAsBigInt),\n    stringify: stringifySexagesimal\n};\nconst floatTime = {\n    identify: value => typeof value === 'number',\n    default: true,\n    tag: 'tag:yaml.org,2002:float',\n    format: 'TIME',\n    test: /^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*$/,\n    resolve: str => parseSexagesimal(str, false),\n    stringify: stringifySexagesimal\n};\nconst timestamp = {\n    identify: value => value instanceof Date,\n    default: true,\n    tag: 'tag:yaml.org,2002:timestamp',\n    // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part\n    // may be omitted altogether, resulting in a date format. In such a case, the time part is\n    // assumed to be 00:00:00Z (start of day, UTC).\n    test: RegExp('^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})' + // YYYY-Mm-Dd\n        '(?:' + // time is optional\n        '(?:t|T|[ \\\\t]+)' + // t | T | whitespace\n        '([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\\\.[0-9]+)?)' + // Hh:Mm:Ss(.ss)?\n        '(?:[ \\\\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?' + // Z | +5 | -03:30\n        ')?$'),\n    resolve(str) {\n        const match = str.match(timestamp.test);\n        if (!match)\n            throw new Error('!!timestamp expects a date, starting with yyyy-mm-dd');\n        const [, year, month, day, hour, minute, second] = match.map(Number);\n        const millisec = match[7] ? Number((match[7] + '00').substr(1, 3)) : 0;\n        let date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec);\n        const tz = match[8];\n        if (tz && tz !== 'Z') {\n            let d = parseSexagesimal(tz, false);\n            if (Math.abs(d) < 30)\n                d *= 60;\n            date -= 60000 * d;\n        }\n        return new Date(date);\n    },\n    stringify: ({ value }) => value?.toISOString().replace(/(T00:00:00)?\\.000Z$/, '') ?? ''\n};\n\nexports.floatTime = floatTime;\nexports.intTime = intTime;\nexports.timestamp = timestamp;\n","'use strict';\n\nvar map = require('../common/map.js');\nvar _null = require('../common/null.js');\nvar seq = require('../common/seq.js');\nvar string = require('../common/string.js');\nvar binary = require('./binary.js');\nvar bool = require('./bool.js');\nvar float = require('./float.js');\nvar int = require('./int.js');\nvar merge = require('./merge.js');\nvar omap = require('./omap.js');\nvar pairs = require('./pairs.js');\nvar set = require('./set.js');\nvar timestamp = require('./timestamp.js');\n\nconst schema = [\n    map.map,\n    seq.seq,\n    string.string,\n    _null.nullTag,\n    bool.trueTag,\n    bool.falseTag,\n    int.intBin,\n    int.intOct,\n    int.int,\n    int.intHex,\n    float.floatNaN,\n    float.floatExp,\n    float.float,\n    binary.binary,\n    merge.merge,\n    omap.omap,\n    pairs.pairs,\n    set.set,\n    timestamp.intTime,\n    timestamp.floatTime,\n    timestamp.timestamp\n];\n\nexports.schema = schema;\n","'use strict';\n\nvar map = require('./common/map.js');\nvar _null = require('./common/null.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar bool = require('./core/bool.js');\nvar float = require('./core/float.js');\nvar int = require('./core/int.js');\nvar schema = require('./core/schema.js');\nvar schema$1 = require('./json/schema.js');\nvar binary = require('./yaml-1.1/binary.js');\nvar merge = require('./yaml-1.1/merge.js');\nvar omap = require('./yaml-1.1/omap.js');\nvar pairs = require('./yaml-1.1/pairs.js');\nvar schema$2 = require('./yaml-1.1/schema.js');\nvar set = require('./yaml-1.1/set.js');\nvar timestamp = require('./yaml-1.1/timestamp.js');\n\nconst schemas = new Map([\n    ['core', schema.schema],\n    ['failsafe', [map.map, seq.seq, string.string]],\n    ['json', schema$1.schema],\n    ['yaml11', schema$2.schema],\n    ['yaml-1.1', schema$2.schema]\n]);\nconst tagsByName = {\n    binary: binary.binary,\n    bool: bool.boolTag,\n    float: float.float,\n    floatExp: float.floatExp,\n    floatNaN: float.floatNaN,\n    floatTime: timestamp.floatTime,\n    int: int.int,\n    intHex: int.intHex,\n    intOct: int.intOct,\n    intTime: timestamp.intTime,\n    map: map.map,\n    merge: merge.merge,\n    null: _null.nullTag,\n    omap: omap.omap,\n    pairs: pairs.pairs,\n    seq: seq.seq,\n    set: set.set,\n    timestamp: timestamp.timestamp\n};\nconst coreKnownTags = {\n    'tag:yaml.org,2002:binary': binary.binary,\n    'tag:yaml.org,2002:merge': merge.merge,\n    'tag:yaml.org,2002:omap': omap.omap,\n    'tag:yaml.org,2002:pairs': pairs.pairs,\n    'tag:yaml.org,2002:set': set.set,\n    'tag:yaml.org,2002:timestamp': timestamp.timestamp\n};\nfunction getTags(customTags, schemaName, addMergeTag) {\n    const schemaTags = schemas.get(schemaName);\n    if (schemaTags && !customTags) {\n        return addMergeTag && !schemaTags.includes(merge.merge)\n            ? schemaTags.concat(merge.merge)\n            : schemaTags.slice();\n    }\n    let tags = schemaTags;\n    if (!tags) {\n        if (Array.isArray(customTags))\n            tags = [];\n        else {\n            const keys = Array.from(schemas.keys())\n                .filter(key => key !== 'yaml11')\n                .map(key => JSON.stringify(key))\n                .join(', ');\n            throw new Error(`Unknown schema \"${schemaName}\"; use one of ${keys} or define customTags array`);\n        }\n    }\n    if (Array.isArray(customTags)) {\n        for (const tag of customTags)\n            tags = tags.concat(tag);\n    }\n    else if (typeof customTags === 'function') {\n        tags = customTags(tags.slice());\n    }\n    if (addMergeTag)\n        tags = tags.concat(merge.merge);\n    return tags.reduce((tags, tag) => {\n        const tagObj = typeof tag === 'string' ? tagsByName[tag] : tag;\n        if (!tagObj) {\n            const tagName = JSON.stringify(tag);\n            const keys = Object.keys(tagsByName)\n                .map(key => JSON.stringify(key))\n                .join(', ');\n            throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`);\n        }\n        if (!tags.includes(tagObj))\n            tags.push(tagObj);\n        return tags;\n    }, []);\n}\n\nexports.coreKnownTags = coreKnownTags;\nexports.getTags = getTags;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar map = require('./common/map.js');\nvar seq = require('./common/seq.js');\nvar string = require('./common/string.js');\nvar tags = require('./tags.js');\n\nconst sortMapEntriesByKey = (a, b) => a.key < b.key ? -1 : a.key > b.key ? 1 : 0;\nclass Schema {\n    constructor({ compat, customTags, merge, resolveKnownTags, schema, sortMapEntries, toStringDefaults }) {\n        this.compat = Array.isArray(compat)\n            ? tags.getTags(compat, 'compat')\n            : compat\n                ? tags.getTags(null, compat)\n                : null;\n        this.name = (typeof schema === 'string' && schema) || 'core';\n        this.knownTags = resolveKnownTags ? tags.coreKnownTags : {};\n        this.tags = tags.getTags(customTags, this.name, merge);\n        this.toStringOptions = toStringDefaults ?? null;\n        Object.defineProperty(this, identity.MAP, { value: map.map });\n        Object.defineProperty(this, identity.SCALAR, { value: string.string });\n        Object.defineProperty(this, identity.SEQ, { value: seq.seq });\n        // Used by createMap()\n        this.sortMapEntries =\n            typeof sortMapEntries === 'function'\n                ? sortMapEntries\n                : sortMapEntries === true\n                    ? sortMapEntriesByKey\n                    : null;\n    }\n    clone() {\n        const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this));\n        copy.tags = this.tags.slice();\n        return copy;\n    }\n}\n\nexports.Schema = Schema;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar stringify = require('./stringify.js');\nvar stringifyComment = require('./stringifyComment.js');\n\nfunction stringifyDocument(doc, options) {\n    const lines = [];\n    let hasDirectives = options.directives === true;\n    if (options.directives !== false && doc.directives) {\n        const dir = doc.directives.toString(doc);\n        if (dir) {\n            lines.push(dir);\n            hasDirectives = true;\n        }\n        else if (doc.directives.docStart)\n            hasDirectives = true;\n    }\n    if (hasDirectives)\n        lines.push('---');\n    const ctx = stringify.createStringifyContext(doc, options);\n    const { commentString } = ctx.options;\n    if (doc.commentBefore) {\n        if (lines.length !== 1)\n            lines.unshift('');\n        const cs = commentString(doc.commentBefore);\n        lines.unshift(stringifyComment.indentComment(cs, ''));\n    }\n    let chompKeep = false;\n    let contentComment = null;\n    if (doc.contents) {\n        if (identity.isNode(doc.contents)) {\n            if (doc.contents.spaceBefore && hasDirectives)\n                lines.push('');\n            if (doc.contents.commentBefore) {\n                const cs = commentString(doc.contents.commentBefore);\n                lines.push(stringifyComment.indentComment(cs, ''));\n            }\n            // top-level block scalars need to be indented if followed by a comment\n            ctx.forceBlockIndent = !!doc.comment;\n            contentComment = doc.contents.comment;\n        }\n        const onChompKeep = contentComment ? undefined : () => (chompKeep = true);\n        let body = stringify.stringify(doc.contents, ctx, () => (contentComment = null), onChompKeep);\n        if (contentComment)\n            body += stringifyComment.lineComment(body, '', commentString(contentComment));\n        if ((body[0] === '|' || body[0] === '>') &&\n            lines[lines.length - 1] === '---') {\n            // Top-level block scalars with a preceding doc marker ought to use the\n            // same line for their header.\n            lines[lines.length - 1] = `--- ${body}`;\n        }\n        else\n            lines.push(body);\n    }\n    else {\n        lines.push(stringify.stringify(doc.contents, ctx));\n    }\n    if (doc.directives?.docEnd) {\n        if (doc.comment) {\n            const cs = commentString(doc.comment);\n            if (cs.includes('\\n')) {\n                lines.push('...');\n                lines.push(stringifyComment.indentComment(cs, ''));\n            }\n            else {\n                lines.push(`... ${cs}`);\n            }\n        }\n        else {\n            lines.push('...');\n        }\n    }\n    else {\n        let dc = doc.comment;\n        if (dc && chompKeep)\n            dc = dc.replace(/^\\n+/, '');\n        if (dc) {\n            if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '')\n                lines.push('');\n            lines.push(stringifyComment.indentComment(commentString(dc), ''));\n        }\n    }\n    return lines.join('\\n') + '\\n';\n}\n\nexports.stringifyDocument = stringifyDocument;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar Collection = require('../nodes/Collection.js');\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar toJS = require('../nodes/toJS.js');\nvar Schema = require('../schema/Schema.js');\nvar stringifyDocument = require('../stringify/stringifyDocument.js');\nvar anchors = require('./anchors.js');\nvar applyReviver = require('./applyReviver.js');\nvar createNode = require('./createNode.js');\nvar directives = require('./directives.js');\n\nclass Document {\n    constructor(value, replacer, options) {\n        /** A comment before this Document */\n        this.commentBefore = null;\n        /** A comment immediately after this Document */\n        this.comment = null;\n        /** Errors encountered during parsing. */\n        this.errors = [];\n        /** Warnings encountered during parsing. */\n        this.warnings = [];\n        Object.defineProperty(this, identity.NODE_TYPE, { value: identity.DOC });\n        let _replacer = null;\n        if (typeof replacer === 'function' || Array.isArray(replacer)) {\n            _replacer = replacer;\n        }\n        else if (options === undefined && replacer) {\n            options = replacer;\n            replacer = undefined;\n        }\n        const opt = Object.assign({\n            intAsBigInt: false,\n            keepSourceTokens: false,\n            logLevel: 'warn',\n            prettyErrors: true,\n            strict: true,\n            stringKeys: false,\n            uniqueKeys: true,\n            version: '1.2'\n        }, options);\n        this.options = opt;\n        let { version } = opt;\n        if (options?._directives) {\n            this.directives = options._directives.atDocument();\n            if (this.directives.yaml.explicit)\n                version = this.directives.yaml.version;\n        }\n        else\n            this.directives = new directives.Directives({ version });\n        this.setSchema(version, options);\n        // @ts-expect-error We can't really know that this matches Contents.\n        this.contents =\n            value === undefined ? null : this.createNode(value, _replacer, options);\n    }\n    /**\n     * Create a deep copy of this Document and its contents.\n     *\n     * Custom Node values that inherit from `Object` still refer to their original instances.\n     */\n    clone() {\n        const copy = Object.create(Document.prototype, {\n            [identity.NODE_TYPE]: { value: identity.DOC }\n        });\n        copy.commentBefore = this.commentBefore;\n        copy.comment = this.comment;\n        copy.errors = this.errors.slice();\n        copy.warnings = this.warnings.slice();\n        copy.options = Object.assign({}, this.options);\n        if (this.directives)\n            copy.directives = this.directives.clone();\n        copy.schema = this.schema.clone();\n        // @ts-expect-error We can't really know that this matches Contents.\n        copy.contents = identity.isNode(this.contents)\n            ? this.contents.clone(copy.schema)\n            : this.contents;\n        if (this.range)\n            copy.range = this.range.slice();\n        return copy;\n    }\n    /** Adds a value to the document. */\n    add(value) {\n        if (assertCollection(this.contents))\n            this.contents.add(value);\n    }\n    /** Adds a value to the document. */\n    addIn(path, value) {\n        if (assertCollection(this.contents))\n            this.contents.addIn(path, value);\n    }\n    /**\n     * Create a new `Alias` node, ensuring that the target `node` has the required anchor.\n     *\n     * If `node` already has an anchor, `name` is ignored.\n     * Otherwise, the `node.anchor` value will be set to `name`,\n     * or if an anchor with that name is already present in the document,\n     * `name` will be used as a prefix for a new unique anchor.\n     * If `name` is undefined, the generated anchor will use 'a' as a prefix.\n     */\n    createAlias(node, name) {\n        if (!node.anchor) {\n            const prev = anchors.anchorNames(this);\n            node.anchor =\n                // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n                !name || prev.has(name) ? anchors.findNewAnchor(name || 'a', prev) : name;\n        }\n        return new Alias.Alias(node.anchor);\n    }\n    createNode(value, replacer, options) {\n        let _replacer = undefined;\n        if (typeof replacer === 'function') {\n            value = replacer.call({ '': value }, '', value);\n            _replacer = replacer;\n        }\n        else if (Array.isArray(replacer)) {\n            const keyToStr = (v) => typeof v === 'number' || v instanceof String || v instanceof Number;\n            const asStr = replacer.filter(keyToStr).map(String);\n            if (asStr.length > 0)\n                replacer = replacer.concat(asStr);\n            _replacer = replacer;\n        }\n        else if (options === undefined && replacer) {\n            options = replacer;\n            replacer = undefined;\n        }\n        const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options ?? {};\n        const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors(this, \n        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n        anchorPrefix || 'a');\n        const ctx = {\n            aliasDuplicateObjects: aliasDuplicateObjects ?? true,\n            keepUndefined: keepUndefined ?? false,\n            onAnchor,\n            onTagObj,\n            replacer: _replacer,\n            schema: this.schema,\n            sourceObjects\n        };\n        const node = createNode.createNode(value, tag, ctx);\n        if (flow && identity.isCollection(node))\n            node.flow = true;\n        setAnchors();\n        return node;\n    }\n    /**\n     * Convert a key and a value into a `Pair` using the current schema,\n     * recursively wrapping all values as `Scalar` or `Collection` nodes.\n     */\n    createPair(key, value, options = {}) {\n        const k = this.createNode(key, null, options);\n        const v = this.createNode(value, null, options);\n        return new Pair.Pair(k, v);\n    }\n    /**\n     * Removes a value from the document.\n     * @returns `true` if the item was found and removed.\n     */\n    delete(key) {\n        return assertCollection(this.contents) ? this.contents.delete(key) : false;\n    }\n    /**\n     * Removes a value from the document.\n     * @returns `true` if the item was found and removed.\n     */\n    deleteIn(path) {\n        if (Collection.isEmptyPath(path)) {\n            if (this.contents == null)\n                return false;\n            // @ts-expect-error Presumed impossible if Strict extends false\n            this.contents = null;\n            return true;\n        }\n        return assertCollection(this.contents)\n            ? this.contents.deleteIn(path)\n            : false;\n    }\n    /**\n     * Returns item at `key`, or `undefined` if not found. By default unwraps\n     * scalar values from their surrounding node; to disable set `keepScalar` to\n     * `true` (collections are always returned intact).\n     */\n    get(key, keepScalar) {\n        return identity.isCollection(this.contents)\n            ? this.contents.get(key, keepScalar)\n            : undefined;\n    }\n    /**\n     * Returns item at `path`, or `undefined` if not found. By default unwraps\n     * scalar values from their surrounding node; to disable set `keepScalar` to\n     * `true` (collections are always returned intact).\n     */\n    getIn(path, keepScalar) {\n        if (Collection.isEmptyPath(path))\n            return !keepScalar && identity.isScalar(this.contents)\n                ? this.contents.value\n                : this.contents;\n        return identity.isCollection(this.contents)\n            ? this.contents.getIn(path, keepScalar)\n            : undefined;\n    }\n    /**\n     * Checks if the document includes a value with the key `key`.\n     */\n    has(key) {\n        return identity.isCollection(this.contents) ? this.contents.has(key) : false;\n    }\n    /**\n     * Checks if the document includes a value at `path`.\n     */\n    hasIn(path) {\n        if (Collection.isEmptyPath(path))\n            return this.contents !== undefined;\n        return identity.isCollection(this.contents) ? this.contents.hasIn(path) : false;\n    }\n    /**\n     * Sets a value in this document. For `!!set`, `value` needs to be a\n     * boolean to add/remove the item from the set.\n     */\n    set(key, value) {\n        if (this.contents == null) {\n            // @ts-expect-error We can't really know that this matches Contents.\n            this.contents = Collection.collectionFromPath(this.schema, [key], value);\n        }\n        else if (assertCollection(this.contents)) {\n            this.contents.set(key, value);\n        }\n    }\n    /**\n     * Sets a value in this document. For `!!set`, `value` needs to be a\n     * boolean to add/remove the item from the set.\n     */\n    setIn(path, value) {\n        if (Collection.isEmptyPath(path)) {\n            // @ts-expect-error We can't really know that this matches Contents.\n            this.contents = value;\n        }\n        else if (this.contents == null) {\n            // @ts-expect-error We can't really know that this matches Contents.\n            this.contents = Collection.collectionFromPath(this.schema, Array.from(path), value);\n        }\n        else if (assertCollection(this.contents)) {\n            this.contents.setIn(path, value);\n        }\n    }\n    /**\n     * Change the YAML version and schema used by the document.\n     * A `null` version disables support for directives, explicit tags, anchors, and aliases.\n     * It also requires the `schema` option to be given as a `Schema` instance value.\n     *\n     * Overrides all previously set schema options.\n     */\n    setSchema(version, options = {}) {\n        if (typeof version === 'number')\n            version = String(version);\n        let opt;\n        switch (version) {\n            case '1.1':\n                if (this.directives)\n                    this.directives.yaml.version = '1.1';\n                else\n                    this.directives = new directives.Directives({ version: '1.1' });\n                opt = { resolveKnownTags: false, schema: 'yaml-1.1' };\n                break;\n            case '1.2':\n            case 'next':\n                if (this.directives)\n                    this.directives.yaml.version = version;\n                else\n                    this.directives = new directives.Directives({ version });\n                opt = { resolveKnownTags: true, schema: 'core' };\n                break;\n            case null:\n                if (this.directives)\n                    delete this.directives;\n                opt = null;\n                break;\n            default: {\n                const sv = JSON.stringify(version);\n                throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${sv}`);\n            }\n        }\n        // Not using `instanceof Schema` to allow for duck typing\n        if (options.schema instanceof Object)\n            this.schema = options.schema;\n        else if (opt)\n            this.schema = new Schema.Schema(Object.assign(opt, options));\n        else\n            throw new Error(`With a null YAML version, the { schema: Schema } option is required`);\n    }\n    // json & jsonArg are only used from toJSON()\n    toJS({ json, jsonArg, mapAsMap, maxAliasCount, onAnchor, reviver } = {}) {\n        const ctx = {\n            anchors: new Map(),\n            doc: this,\n            keep: !json,\n            mapAsMap: mapAsMap === true,\n            mapKeyWarned: false,\n            maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100\n        };\n        const res = toJS.toJS(this.contents, jsonArg ?? '', ctx);\n        if (typeof onAnchor === 'function')\n            for (const { count, res } of ctx.anchors.values())\n                onAnchor(res, count);\n        return typeof reviver === 'function'\n            ? applyReviver.applyReviver(reviver, { '': res }, '', res)\n            : res;\n    }\n    /**\n     * A JSON representation of the document `contents`.\n     *\n     * @param jsonArg Used by `JSON.stringify` to indicate the array index or\n     *   property name.\n     */\n    toJSON(jsonArg, onAnchor) {\n        return this.toJS({ json: true, jsonArg, mapAsMap: false, onAnchor });\n    }\n    /** A YAML representation of the document. */\n    toString(options = {}) {\n        if (this.errors.length > 0)\n            throw new Error('Document with errors cannot be stringified');\n        if ('indent' in options &&\n            (!Number.isInteger(options.indent) || Number(options.indent) <= 0)) {\n            const s = JSON.stringify(options.indent);\n            throw new Error(`\"indent\" option must be a positive integer, not ${s}`);\n        }\n        return stringifyDocument.stringifyDocument(this, options);\n    }\n}\nfunction assertCollection(contents) {\n    if (identity.isCollection(contents))\n        return true;\n    throw new Error('Expected a YAML collection as document contents');\n}\n\nexports.Document = Document;\n","'use strict';\n\nclass YAMLError extends Error {\n    constructor(name, pos, code, message) {\n        super();\n        this.name = name;\n        this.code = code;\n        this.message = message;\n        this.pos = pos;\n    }\n}\nclass YAMLParseError extends YAMLError {\n    constructor(pos, code, message) {\n        super('YAMLParseError', pos, code, message);\n    }\n}\nclass YAMLWarning extends YAMLError {\n    constructor(pos, code, message) {\n        super('YAMLWarning', pos, code, message);\n    }\n}\nconst prettifyError = (src, lc) => (error) => {\n    if (error.pos[0] === -1)\n        return;\n    error.linePos = error.pos.map(pos => lc.linePos(pos));\n    const { line, col } = error.linePos[0];\n    error.message += ` at line ${line}, column ${col}`;\n    let ci = col - 1;\n    let lineStr = src\n        .substring(lc.lineStarts[line - 1], lc.lineStarts[line])\n        .replace(/[\\n\\r]+$/, '');\n    // Trim to max 80 chars, keeping col position near the middle\n    if (ci >= 60 && lineStr.length > 80) {\n        const trimStart = Math.min(ci - 39, lineStr.length - 79);\n        lineStr = '…' + lineStr.substring(trimStart);\n        ci -= trimStart - 1;\n    }\n    if (lineStr.length > 80)\n        lineStr = lineStr.substring(0, 79) + '…';\n    // Include previous line in context if pointing at line start\n    if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) {\n        // Regexp won't match if start is trimmed\n        let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]);\n        if (prev.length > 80)\n            prev = prev.substring(0, 79) + '…\\n';\n        lineStr = prev + lineStr;\n    }\n    if (/[^ ]/.test(lineStr)) {\n        let count = 1;\n        const end = error.linePos[1];\n        if (end?.line === line && end.col > col) {\n            count = Math.max(1, Math.min(end.col - col, 80 - ci));\n        }\n        const pointer = ' '.repeat(ci) + '^'.repeat(count);\n        error.message += `:\\n\\n${lineStr}\\n${pointer}\\n`;\n    }\n};\n\nexports.YAMLError = YAMLError;\nexports.YAMLParseError = YAMLParseError;\nexports.YAMLWarning = YAMLWarning;\nexports.prettifyError = prettifyError;\n","'use strict';\n\nfunction resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {\n    let spaceBefore = false;\n    let atNewline = startOnNewline;\n    let hasSpace = startOnNewline;\n    let comment = '';\n    let commentSep = '';\n    let hasNewline = false;\n    let reqSpace = false;\n    let tab = null;\n    let anchor = null;\n    let tag = null;\n    let newlineAfterProp = null;\n    let comma = null;\n    let found = null;\n    let start = null;\n    for (const token of tokens) {\n        if (reqSpace) {\n            if (token.type !== 'space' &&\n                token.type !== 'newline' &&\n                token.type !== 'comma')\n                onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n            reqSpace = false;\n        }\n        if (tab) {\n            if (atNewline && token.type !== 'comment' && token.type !== 'newline') {\n                onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n            }\n            tab = null;\n        }\n        switch (token.type) {\n            case 'space':\n                // At the doc level, tabs at line start may be parsed\n                // as leading white space rather than indentation.\n                // In a flow collection, only the parser handles indent.\n                if (!flow &&\n                    (indicator !== 'doc-start' || next?.type !== 'flow-collection') &&\n                    token.source.includes('\\t')) {\n                    tab = token;\n                }\n                hasSpace = true;\n                break;\n            case 'comment': {\n                if (!hasSpace)\n                    onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n                const cb = token.source.substring(1) || ' ';\n                if (!comment)\n                    comment = cb;\n                else\n                    comment += commentSep + cb;\n                commentSep = '';\n                atNewline = false;\n                break;\n            }\n            case 'newline':\n                if (atNewline) {\n                    if (comment)\n                        comment += token.source;\n                    else if (!found || indicator !== 'seq-item-ind')\n                        spaceBefore = true;\n                }\n                else\n                    commentSep += token.source;\n                atNewline = true;\n                hasNewline = true;\n                if (anchor || tag)\n                    newlineAfterProp = token;\n                hasSpace = true;\n                break;\n            case 'anchor':\n                if (anchor)\n                    onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor');\n                if (token.source.endsWith(':'))\n                    onError(token.offset + token.source.length - 1, 'BAD_ALIAS', 'Anchor ending in : is ambiguous', true);\n                anchor = token;\n                start ?? (start = token.offset);\n                atNewline = false;\n                hasSpace = false;\n                reqSpace = true;\n                break;\n            case 'tag': {\n                if (tag)\n                    onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag');\n                tag = token;\n                start ?? (start = token.offset);\n                atNewline = false;\n                hasSpace = false;\n                reqSpace = true;\n                break;\n            }\n            case indicator:\n                // Could here handle preceding comments differently\n                if (anchor || tag)\n                    onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);\n                if (found)\n                    onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow ?? 'collection'}`);\n                found = token;\n                atNewline =\n                    indicator === 'seq-item-ind' || indicator === 'explicit-key-ind';\n                hasSpace = false;\n                break;\n            case 'comma':\n                if (flow) {\n                    if (comma)\n                        onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`);\n                    comma = token;\n                    atNewline = false;\n                    hasSpace = false;\n                    break;\n                }\n            // else fallthrough\n            default:\n                onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`);\n                atNewline = false;\n                hasSpace = false;\n        }\n    }\n    const last = tokens[tokens.length - 1];\n    const end = last ? last.offset + last.source.length : offset;\n    if (reqSpace &&\n        next &&\n        next.type !== 'space' &&\n        next.type !== 'newline' &&\n        next.type !== 'comma' &&\n        (next.type !== 'scalar' || next.source !== '')) {\n        onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');\n    }\n    if (tab &&\n        ((atNewline && tab.indent <= parentIndent) ||\n            next?.type === 'block-map' ||\n            next?.type === 'block-seq'))\n        onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');\n    return {\n        comma,\n        found,\n        spaceBefore,\n        comment,\n        hasNewline,\n        anchor,\n        tag,\n        newlineAfterProp,\n        end,\n        start: start ?? end\n    };\n}\n\nexports.resolveProps = resolveProps;\n","'use strict';\n\nfunction containsNewline(key) {\n    if (!key)\n        return null;\n    switch (key.type) {\n        case 'alias':\n        case 'scalar':\n        case 'double-quoted-scalar':\n        case 'single-quoted-scalar':\n            if (key.source.includes('\\n'))\n                return true;\n            if (key.end)\n                for (const st of key.end)\n                    if (st.type === 'newline')\n                        return true;\n            return false;\n        case 'flow-collection':\n            for (const it of key.items) {\n                for (const st of it.start)\n                    if (st.type === 'newline')\n                        return true;\n                if (it.sep)\n                    for (const st of it.sep)\n                        if (st.type === 'newline')\n                            return true;\n                if (containsNewline(it.key) || containsNewline(it.value))\n                    return true;\n            }\n            return false;\n        default:\n            return true;\n    }\n}\n\nexports.containsNewline = containsNewline;\n","'use strict';\n\nvar utilContainsNewline = require('./util-contains-newline.js');\n\nfunction flowIndentCheck(indent, fc, onError) {\n    if (fc?.type === 'flow-collection') {\n        const end = fc.end[0];\n        if (end.indent === indent &&\n            (end.source === ']' || end.source === '}') &&\n            utilContainsNewline.containsNewline(fc)) {\n            const msg = 'Flow end indicator should be more indented than parent';\n            onError(end, 'BAD_INDENT', msg, true);\n        }\n    }\n}\n\nexports.flowIndentCheck = flowIndentCheck;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\n\nfunction mapIncludes(ctx, items, search) {\n    const { uniqueKeys } = ctx.options;\n    if (uniqueKeys === false)\n        return false;\n    const isEqual = typeof uniqueKeys === 'function'\n        ? uniqueKeys\n        : (a, b) => a === b || (identity.isScalar(a) && identity.isScalar(b) && a.value === b.value);\n    return items.some(pair => isEqual(pair.key, search));\n}\n\nexports.mapIncludes = mapIncludes;\n","'use strict';\n\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst startColMsg = 'All mapping items must start at the same column';\nfunction resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, tag) {\n    const NodeClass = tag?.nodeClass ?? YAMLMap.YAMLMap;\n    const map = new NodeClass(ctx.schema);\n    if (ctx.atRoot)\n        ctx.atRoot = false;\n    let offset = bm.offset;\n    let commentEnd = null;\n    for (const collItem of bm.items) {\n        const { start, key, sep, value } = collItem;\n        // key properties\n        const keyProps = resolveProps.resolveProps(start, {\n            indicator: 'explicit-key-ind',\n            next: key ?? sep?.[0],\n            offset,\n            onError,\n            parentIndent: bm.indent,\n            startOnNewline: true\n        });\n        const implicitKey = !keyProps.found;\n        if (implicitKey) {\n            if (key) {\n                if (key.type === 'block-seq')\n                    onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'A block sequence may not be used as an implicit map key');\n                else if ('indent' in key && key.indent !== bm.indent)\n                    onError(offset, 'BAD_INDENT', startColMsg);\n            }\n            if (!keyProps.anchor && !keyProps.tag && !sep) {\n                commentEnd = keyProps.end;\n                if (keyProps.comment) {\n                    if (map.comment)\n                        map.comment += '\\n' + keyProps.comment;\n                    else\n                        map.comment = keyProps.comment;\n                }\n                continue;\n            }\n            if (keyProps.newlineAfterProp || utilContainsNewline.containsNewline(key)) {\n                onError(key ?? start[start.length - 1], 'MULTILINE_IMPLICIT_KEY', 'Implicit keys need to be on a single line');\n            }\n        }\n        else if (keyProps.found?.indent !== bm.indent) {\n            onError(offset, 'BAD_INDENT', startColMsg);\n        }\n        // key value\n        ctx.atKey = true;\n        const keyStart = keyProps.end;\n        const keyNode = key\n            ? composeNode(ctx, key, keyProps, onError)\n            : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);\n        if (ctx.schema.compat)\n            utilFlowIndentCheck.flowIndentCheck(bm.indent, key, onError);\n        ctx.atKey = false;\n        if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n            onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n        // value properties\n        const valueProps = resolveProps.resolveProps(sep ?? [], {\n            indicator: 'map-value-ind',\n            next: value,\n            offset: keyNode.range[2],\n            onError,\n            parentIndent: bm.indent,\n            startOnNewline: !key || key.type === 'block-scalar'\n        });\n        offset = valueProps.end;\n        if (valueProps.found) {\n            if (implicitKey) {\n                if (value?.type === 'block-map' && !valueProps.hasNewline)\n                    onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'Nested mappings are not allowed in compact mappings');\n                if (ctx.options.strict &&\n                    keyProps.start < valueProps.found.offset - 1024)\n                    onError(keyNode.range, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit block mapping key');\n            }\n            // value value\n            const valueNode = value\n                ? composeNode(ctx, value, valueProps, onError)\n                : composeEmptyNode(ctx, offset, sep, null, valueProps, onError);\n            if (ctx.schema.compat)\n                utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError);\n            offset = valueNode.range[2];\n            const pair = new Pair.Pair(keyNode, valueNode);\n            if (ctx.options.keepSourceTokens)\n                pair.srcToken = collItem;\n            map.items.push(pair);\n        }\n        else {\n            // key with no value\n            if (implicitKey)\n                onError(keyNode.range, 'MISSING_CHAR', 'Implicit map keys need to be followed by map values');\n            if (valueProps.comment) {\n                if (keyNode.comment)\n                    keyNode.comment += '\\n' + valueProps.comment;\n                else\n                    keyNode.comment = valueProps.comment;\n            }\n            const pair = new Pair.Pair(keyNode);\n            if (ctx.options.keepSourceTokens)\n                pair.srcToken = collItem;\n            map.items.push(pair);\n        }\n    }\n    if (commentEnd && commentEnd < offset)\n        onError(commentEnd, 'IMPOSSIBLE', 'Map comment with trailing content');\n    map.range = [bm.offset, offset, commentEnd ?? offset];\n    return map;\n}\n\nexports.resolveBlockMap = resolveBlockMap;\n","'use strict';\n\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilFlowIndentCheck = require('./util-flow-indent-check.js');\n\nfunction resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) {\n    const NodeClass = tag?.nodeClass ?? YAMLSeq.YAMLSeq;\n    const seq = new NodeClass(ctx.schema);\n    if (ctx.atRoot)\n        ctx.atRoot = false;\n    if (ctx.atKey)\n        ctx.atKey = false;\n    let offset = bs.offset;\n    let commentEnd = null;\n    for (const { start, value } of bs.items) {\n        const props = resolveProps.resolveProps(start, {\n            indicator: 'seq-item-ind',\n            next: value,\n            offset,\n            onError,\n            parentIndent: bs.indent,\n            startOnNewline: true\n        });\n        if (!props.found) {\n            if (props.anchor || props.tag || value) {\n                if (value?.type === 'block-seq')\n                    onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');\n                else\n                    onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');\n            }\n            else {\n                commentEnd = props.end;\n                if (props.comment)\n                    seq.comment = props.comment;\n                continue;\n            }\n        }\n        const node = value\n            ? composeNode(ctx, value, props, onError)\n            : composeEmptyNode(ctx, props.end, start, null, props, onError);\n        if (ctx.schema.compat)\n            utilFlowIndentCheck.flowIndentCheck(bs.indent, value, onError);\n        offset = node.range[2];\n        seq.items.push(node);\n    }\n    seq.range = [bs.offset, offset, commentEnd ?? offset];\n    return seq;\n}\n\nexports.resolveBlockSeq = resolveBlockSeq;\n","'use strict';\n\nfunction resolveEnd(end, offset, reqSpace, onError) {\n    let comment = '';\n    if (end) {\n        let hasSpace = false;\n        let sep = '';\n        for (const token of end) {\n            const { source, type } = token;\n            switch (type) {\n                case 'space':\n                    hasSpace = true;\n                    break;\n                case 'comment': {\n                    if (reqSpace && !hasSpace)\n                        onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');\n                    const cb = source.substring(1) || ' ';\n                    if (!comment)\n                        comment = cb;\n                    else\n                        comment += sep + cb;\n                    sep = '';\n                    break;\n                }\n                case 'newline':\n                    if (comment)\n                        sep += source;\n                    hasSpace = true;\n                    break;\n                default:\n                    onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${type} at node end`);\n            }\n            offset += source.length;\n        }\n    }\n    return { comment, offset };\n}\n\nexports.resolveEnd = resolveEnd;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Pair = require('../nodes/Pair.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\nvar utilContainsNewline = require('./util-contains-newline.js');\nvar utilMapIncludes = require('./util-map-includes.js');\n\nconst blockMsg = 'Block collections are not allowed within flow collections';\nconst isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');\nfunction resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {\n    const isMap = fc.start.source === '{';\n    const fcName = isMap ? 'flow map' : 'flow sequence';\n    const NodeClass = (tag?.nodeClass ?? (isMap ? YAMLMap.YAMLMap : YAMLSeq.YAMLSeq));\n    const coll = new NodeClass(ctx.schema);\n    coll.flow = true;\n    const atRoot = ctx.atRoot;\n    if (atRoot)\n        ctx.atRoot = false;\n    if (ctx.atKey)\n        ctx.atKey = false;\n    let offset = fc.offset + fc.start.source.length;\n    for (let i = 0; i < fc.items.length; ++i) {\n        const collItem = fc.items[i];\n        const { start, key, sep, value } = collItem;\n        const props = resolveProps.resolveProps(start, {\n            flow: fcName,\n            indicator: 'explicit-key-ind',\n            next: key ?? sep?.[0],\n            offset,\n            onError,\n            parentIndent: fc.indent,\n            startOnNewline: false\n        });\n        if (!props.found) {\n            if (!props.anchor && !props.tag && !sep && !value) {\n                if (i === 0 && props.comma)\n                    onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n                else if (i < fc.items.length - 1)\n                    onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);\n                if (props.comment) {\n                    if (coll.comment)\n                        coll.comment += '\\n' + props.comment;\n                    else\n                        coll.comment = props.comment;\n                }\n                offset = props.end;\n                continue;\n            }\n            if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key))\n                onError(key, // checked by containsNewline()\n                'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n        }\n        if (i === 0) {\n            if (props.comma)\n                onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);\n        }\n        else {\n            if (!props.comma)\n                onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);\n            if (props.comment) {\n                let prevItemComment = '';\n                loop: for (const st of start) {\n                    switch (st.type) {\n                        case 'comma':\n                        case 'space':\n                            break;\n                        case 'comment':\n                            prevItemComment = st.source.substring(1);\n                            break loop;\n                        default:\n                            break loop;\n                    }\n                }\n                if (prevItemComment) {\n                    let prev = coll.items[coll.items.length - 1];\n                    if (identity.isPair(prev))\n                        prev = prev.value ?? prev.key;\n                    if (prev.comment)\n                        prev.comment += '\\n' + prevItemComment;\n                    else\n                        prev.comment = prevItemComment;\n                    props.comment = props.comment.substring(prevItemComment.length + 1);\n                }\n            }\n        }\n        if (!isMap && !sep && !props.found) {\n            // item is a value in a seq\n            // → key & sep are empty, start does not include ? or :\n            const valueNode = value\n                ? composeNode(ctx, value, props, onError)\n                : composeEmptyNode(ctx, props.end, sep, null, props, onError);\n            coll.items.push(valueNode);\n            offset = valueNode.range[2];\n            if (isBlock(value))\n                onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n        }\n        else {\n            // item is a key+value pair\n            // key value\n            ctx.atKey = true;\n            const keyStart = props.end;\n            const keyNode = key\n                ? composeNode(ctx, key, props, onError)\n                : composeEmptyNode(ctx, keyStart, start, null, props, onError);\n            if (isBlock(key))\n                onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);\n            ctx.atKey = false;\n            // value properties\n            const valueProps = resolveProps.resolveProps(sep ?? [], {\n                flow: fcName,\n                indicator: 'map-value-ind',\n                next: value,\n                offset: keyNode.range[2],\n                onError,\n                parentIndent: fc.indent,\n                startOnNewline: false\n            });\n            if (valueProps.found) {\n                if (!isMap && !props.found && ctx.options.strict) {\n                    if (sep)\n                        for (const st of sep) {\n                            if (st === valueProps.found)\n                                break;\n                            if (st.type === 'newline') {\n                                onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');\n                                break;\n                            }\n                        }\n                    if (props.start < valueProps.found.offset - 1024)\n                        onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');\n                }\n            }\n            else if (value) {\n                if ('source' in value && value.source?.[0] === ':')\n                    onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);\n                else\n                    onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);\n            }\n            // value value\n            const valueNode = value\n                ? composeNode(ctx, value, valueProps, onError)\n                : valueProps.found\n                    ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)\n                    : null;\n            if (valueNode) {\n                if (isBlock(value))\n                    onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);\n            }\n            else if (valueProps.comment) {\n                if (keyNode.comment)\n                    keyNode.comment += '\\n' + valueProps.comment;\n                else\n                    keyNode.comment = valueProps.comment;\n            }\n            const pair = new Pair.Pair(keyNode, valueNode);\n            if (ctx.options.keepSourceTokens)\n                pair.srcToken = collItem;\n            if (isMap) {\n                const map = coll;\n                if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))\n                    onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');\n                map.items.push(pair);\n            }\n            else {\n                const map = new YAMLMap.YAMLMap(ctx.schema);\n                map.flow = true;\n                map.items.push(pair);\n                const endRange = (valueNode ?? keyNode).range;\n                map.range = [keyNode.range[0], endRange[1], endRange[2]];\n                coll.items.push(map);\n            }\n            offset = valueNode ? valueNode.range[2] : valueProps.end;\n        }\n    }\n    const expectedEnd = isMap ? '}' : ']';\n    const [ce, ...ee] = fc.end;\n    let cePos = offset;\n    if (ce?.source === expectedEnd)\n        cePos = ce.offset + ce.source.length;\n    else {\n        const name = fcName[0].toUpperCase() + fcName.substring(1);\n        const msg = atRoot\n            ? `${name} must end with a ${expectedEnd}`\n            : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;\n        onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);\n        if (ce && ce.source.length !== 1)\n            ee.unshift(ce);\n    }\n    if (ee.length > 0) {\n        const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError);\n        if (end.comment) {\n            if (coll.comment)\n                coll.comment += '\\n' + end.comment;\n            else\n                coll.comment = end.comment;\n        }\n        coll.range = [fc.offset, cePos, end.offset];\n    }\n    else {\n        coll.range = [fc.offset, cePos, cePos];\n    }\n    return coll;\n}\n\nexports.resolveFlowCollection = resolveFlowCollection;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar YAMLMap = require('../nodes/YAMLMap.js');\nvar YAMLSeq = require('../nodes/YAMLSeq.js');\nvar resolveBlockMap = require('./resolve-block-map.js');\nvar resolveBlockSeq = require('./resolve-block-seq.js');\nvar resolveFlowCollection = require('./resolve-flow-collection.js');\n\nfunction resolveCollection(CN, ctx, token, onError, tagName, tag) {\n    const coll = token.type === 'block-map'\n        ? resolveBlockMap.resolveBlockMap(CN, ctx, token, onError, tag)\n        : token.type === 'block-seq'\n            ? resolveBlockSeq.resolveBlockSeq(CN, ctx, token, onError, tag)\n            : resolveFlowCollection.resolveFlowCollection(CN, ctx, token, onError, tag);\n    const Coll = coll.constructor;\n    // If we got a tagName matching the class, or the tag name is '!',\n    // then use the tagName from the node class used to create it.\n    if (tagName === '!' || tagName === Coll.tagName) {\n        coll.tag = Coll.tagName;\n        return coll;\n    }\n    if (tagName)\n        coll.tag = tagName;\n    return coll;\n}\nfunction composeCollection(CN, ctx, token, props, onError) {\n    const tagToken = props.tag;\n    const tagName = !tagToken\n        ? null\n        : ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg));\n    if (token.type === 'block-seq') {\n        const { anchor, newlineAfterProp: nl } = props;\n        const lastProp = anchor && tagToken\n            ? anchor.offset > tagToken.offset\n                ? anchor\n                : tagToken\n            : (anchor ?? tagToken);\n        if (lastProp && (!nl || nl.offset < lastProp.offset)) {\n            const message = 'Missing newline after block sequence props';\n            onError(lastProp, 'MISSING_CHAR', message);\n        }\n    }\n    const expType = token.type === 'block-map'\n        ? 'map'\n        : token.type === 'block-seq'\n            ? 'seq'\n            : token.start.source === '{'\n                ? 'map'\n                : 'seq';\n    // shortcut: check if it's a generic YAMLMap or YAMLSeq\n    // before jumping into the custom tag logic.\n    if (!tagToken ||\n        !tagName ||\n        tagName === '!' ||\n        (tagName === YAMLMap.YAMLMap.tagName && expType === 'map') ||\n        (tagName === YAMLSeq.YAMLSeq.tagName && expType === 'seq')) {\n        return resolveCollection(CN, ctx, token, onError, tagName);\n    }\n    let tag = ctx.schema.tags.find(t => t.tag === tagName && t.collection === expType);\n    if (!tag) {\n        const kt = ctx.schema.knownTags[tagName];\n        if (kt?.collection === expType) {\n            ctx.schema.tags.push(Object.assign({}, kt, { default: false }));\n            tag = kt;\n        }\n        else {\n            if (kt) {\n                onError(tagToken, 'BAD_COLLECTION_TYPE', `${kt.tag} used for ${expType} collection, but expects ${kt.collection ?? 'scalar'}`, true);\n            }\n            else {\n                onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true);\n            }\n            return resolveCollection(CN, ctx, token, onError, tagName);\n        }\n    }\n    const coll = resolveCollection(CN, ctx, token, onError, tagName, tag);\n    const res = tag.resolve?.(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options) ?? coll;\n    const node = identity.isNode(res)\n        ? res\n        : new Scalar.Scalar(res);\n    node.range = coll.range;\n    node.tag = tagName;\n    if (tag?.format)\n        node.format = tag.format;\n    return node;\n}\n\nexports.composeCollection = composeCollection;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\n\nfunction resolveBlockScalar(ctx, scalar, onError) {\n    const start = scalar.offset;\n    const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError);\n    if (!header)\n        return { value: '', type: null, comment: '', range: [start, start, start] };\n    const type = header.mode === '>' ? Scalar.Scalar.BLOCK_FOLDED : Scalar.Scalar.BLOCK_LITERAL;\n    const lines = scalar.source ? splitLines(scalar.source) : [];\n    // determine the end of content & start of chomping\n    let chompStart = lines.length;\n    for (let i = lines.length - 1; i >= 0; --i) {\n        const content = lines[i][1];\n        if (content === '' || content === '\\r')\n            chompStart = i;\n        else\n            break;\n    }\n    // shortcut for empty contents\n    if (chompStart === 0) {\n        const value = header.chomp === '+' && lines.length > 0\n            ? '\\n'.repeat(Math.max(1, lines.length - 1))\n            : '';\n        let end = start + header.length;\n        if (scalar.source)\n            end += scalar.source.length;\n        return { value, type, comment: header.comment, range: [start, end, end] };\n    }\n    // find the indentation level to trim from start\n    let trimIndent = scalar.indent + header.indent;\n    let offset = scalar.offset + header.length;\n    let contentStart = 0;\n    for (let i = 0; i < chompStart; ++i) {\n        const [indent, content] = lines[i];\n        if (content === '' || content === '\\r') {\n            if (header.indent === 0 && indent.length > trimIndent)\n                trimIndent = indent.length;\n        }\n        else {\n            if (indent.length < trimIndent) {\n                const message = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator';\n                onError(offset + indent.length, 'MISSING_CHAR', message);\n            }\n            if (header.indent === 0)\n                trimIndent = indent.length;\n            contentStart = i;\n            if (trimIndent === 0 && !ctx.atRoot) {\n                const message = 'Block scalar values in collections must be indented';\n                onError(offset, 'BAD_INDENT', message);\n            }\n            break;\n        }\n        offset += indent.length + content.length + 1;\n    }\n    // include trailing more-indented empty lines in content\n    for (let i = lines.length - 1; i >= chompStart; --i) {\n        if (lines[i][0].length > trimIndent)\n            chompStart = i + 1;\n    }\n    let value = '';\n    let sep = '';\n    let prevMoreIndented = false;\n    // leading whitespace is kept intact\n    for (let i = 0; i < contentStart; ++i)\n        value += lines[i][0].slice(trimIndent) + '\\n';\n    for (let i = contentStart; i < chompStart; ++i) {\n        let [indent, content] = lines[i];\n        offset += indent.length + content.length + 1;\n        const crlf = content[content.length - 1] === '\\r';\n        if (crlf)\n            content = content.slice(0, -1);\n        /* istanbul ignore if already caught in lexer */\n        if (content && indent.length < trimIndent) {\n            const src = header.indent\n                ? 'explicit indentation indicator'\n                : 'first line';\n            const message = `Block scalar lines must not be less indented than their ${src}`;\n            onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message);\n            indent = '';\n        }\n        if (type === Scalar.Scalar.BLOCK_LITERAL) {\n            value += sep + indent.slice(trimIndent) + content;\n            sep = '\\n';\n        }\n        else if (indent.length > trimIndent || content[0] === '\\t') {\n            // more-indented content within a folded block\n            if (sep === ' ')\n                sep = '\\n';\n            else if (!prevMoreIndented && sep === '\\n')\n                sep = '\\n\\n';\n            value += sep + indent.slice(trimIndent) + content;\n            sep = '\\n';\n            prevMoreIndented = true;\n        }\n        else if (content === '') {\n            // empty line\n            if (sep === '\\n')\n                value += '\\n';\n            else\n                sep = '\\n';\n        }\n        else {\n            value += sep + content;\n            sep = ' ';\n            prevMoreIndented = false;\n        }\n    }\n    switch (header.chomp) {\n        case '-':\n            break;\n        case '+':\n            for (let i = chompStart; i < lines.length; ++i)\n                value += '\\n' + lines[i][0].slice(trimIndent);\n            if (value[value.length - 1] !== '\\n')\n                value += '\\n';\n            break;\n        default:\n            value += '\\n';\n    }\n    const end = start + header.length + scalar.source.length;\n    return { value, type, comment: header.comment, range: [start, end, end] };\n}\nfunction parseBlockScalarHeader({ offset, props }, strict, onError) {\n    /* istanbul ignore if should not happen */\n    if (props[0].type !== 'block-scalar-header') {\n        onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found');\n        return null;\n    }\n    const { source } = props[0];\n    const mode = source[0];\n    let indent = 0;\n    let chomp = '';\n    let error = -1;\n    for (let i = 1; i < source.length; ++i) {\n        const ch = source[i];\n        if (!chomp && (ch === '-' || ch === '+'))\n            chomp = ch;\n        else {\n            const n = Number(ch);\n            if (!indent && n)\n                indent = n;\n            else if (error === -1)\n                error = offset + i;\n        }\n    }\n    if (error !== -1)\n        onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`);\n    let hasSpace = false;\n    let comment = '';\n    let length = source.length;\n    for (let i = 1; i < props.length; ++i) {\n        const token = props[i];\n        switch (token.type) {\n            case 'space':\n                hasSpace = true;\n            // fallthrough\n            case 'newline':\n                length += token.source.length;\n                break;\n            case 'comment':\n                if (strict && !hasSpace) {\n                    const message = 'Comments must be separated from other tokens by white space characters';\n                    onError(token, 'MISSING_CHAR', message);\n                }\n                length += token.source.length;\n                comment = token.source.substring(1);\n                break;\n            case 'error':\n                onError(token, 'UNEXPECTED_TOKEN', token.message);\n                length += token.source.length;\n                break;\n            /* istanbul ignore next should not happen */\n            default: {\n                const message = `Unexpected token in block scalar header: ${token.type}`;\n                onError(token, 'UNEXPECTED_TOKEN', message);\n                const ts = token.source;\n                if (ts && typeof ts === 'string')\n                    length += ts.length;\n            }\n        }\n    }\n    return { mode, indent, chomp, comment, length };\n}\n/** @returns Array of lines split up as `[indent, content]` */\nfunction splitLines(source) {\n    const split = source.split(/\\n( *)/);\n    const first = split[0];\n    const m = first.match(/^( *)/);\n    const line0 = m?.[1]\n        ? [m[1], first.slice(m[1].length)]\n        : ['', first];\n    const lines = [line0];\n    for (let i = 1; i < split.length; i += 2)\n        lines.push([split[i], split[i + 1]]);\n    return lines;\n}\n\nexports.resolveBlockScalar = resolveBlockScalar;\n","'use strict';\n\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction resolveFlowScalar(scalar, strict, onError) {\n    const { offset, type, source, end } = scalar;\n    let _type;\n    let value;\n    const _onError = (rel, code, msg) => onError(offset + rel, code, msg);\n    switch (type) {\n        case 'scalar':\n            _type = Scalar.Scalar.PLAIN;\n            value = plainValue(source, _onError);\n            break;\n        case 'single-quoted-scalar':\n            _type = Scalar.Scalar.QUOTE_SINGLE;\n            value = singleQuotedValue(source, _onError);\n            break;\n        case 'double-quoted-scalar':\n            _type = Scalar.Scalar.QUOTE_DOUBLE;\n            value = doubleQuotedValue(source, _onError);\n            break;\n        /* istanbul ignore next should not happen */\n        default:\n            onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`);\n            return {\n                value: '',\n                type: null,\n                comment: '',\n                range: [offset, offset + source.length, offset + source.length]\n            };\n    }\n    const valueEnd = offset + source.length;\n    const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError);\n    return {\n        value,\n        type: _type,\n        comment: re.comment,\n        range: [offset, valueEnd, re.offset]\n    };\n}\nfunction plainValue(source, onError) {\n    let badChar = '';\n    switch (source[0]) {\n        /* istanbul ignore next should not happen */\n        case '\\t':\n            badChar = 'a tab character';\n            break;\n        case ',':\n            badChar = 'flow indicator character ,';\n            break;\n        case '%':\n            badChar = 'directive indicator character %';\n            break;\n        case '|':\n        case '>': {\n            badChar = `block scalar indicator ${source[0]}`;\n            break;\n        }\n        case '@':\n        case '`': {\n            badChar = `reserved character ${source[0]}`;\n            break;\n        }\n    }\n    if (badChar)\n        onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`);\n    return foldLines(source);\n}\nfunction singleQuotedValue(source, onError) {\n    if (source[source.length - 1] !== \"'\" || source.length === 1)\n        onError(source.length, 'MISSING_CHAR', \"Missing closing 'quote\");\n    return foldLines(source.slice(1, -1)).replace(/''/g, \"'\");\n}\nfunction foldLines(source) {\n    /**\n     * The negative lookbehind here and in the `re` RegExp is to\n     * prevent causing a polynomial search time in certain cases.\n     *\n     * The try-catch is for Safari, which doesn't support this yet:\n     * https://caniuse.com/js-regexp-lookbehind\n     */\n    let first, line;\n    try {\n        first = new RegExp('(.*?)(?<![ \\t])[ \\t]*\\r?\\n', 'sy');\n        line = new RegExp('[ \\t]*(.*?)(?:(?<![ \\t])[ \\t]*)?\\r?\\n', 'sy');\n    }\n    catch {\n        first = /(.*?)[ \\t]*\\r?\\n/sy;\n        line = /[ \\t]*(.*?)[ \\t]*\\r?\\n/sy;\n    }\n    let match = first.exec(source);\n    if (!match)\n        return source;\n    let res = match[1];\n    let sep = ' ';\n    let pos = first.lastIndex;\n    line.lastIndex = pos;\n    while ((match = line.exec(source))) {\n        if (match[1] === '') {\n            if (sep === '\\n')\n                res += sep;\n            else\n                sep = '\\n';\n        }\n        else {\n            res += sep + match[1];\n            sep = ' ';\n        }\n        pos = line.lastIndex;\n    }\n    const last = /[ \\t]*(.*)/sy;\n    last.lastIndex = pos;\n    match = last.exec(source);\n    return res + sep + (match?.[1] ?? '');\n}\nfunction doubleQuotedValue(source, onError) {\n    let res = '';\n    for (let i = 1; i < source.length - 1; ++i) {\n        const ch = source[i];\n        if (ch === '\\r' && source[i + 1] === '\\n')\n            continue;\n        if (ch === '\\n') {\n            const { fold, offset } = foldNewline(source, i);\n            res += fold;\n            i = offset;\n        }\n        else if (ch === '\\\\') {\n            let next = source[++i];\n            const cc = escapeCodes[next];\n            if (cc)\n                res += cc;\n            else if (next === '\\n') {\n                // skip escaped newlines, but still trim the following line\n                next = source[i + 1];\n                while (next === ' ' || next === '\\t')\n                    next = source[++i + 1];\n            }\n            else if (next === '\\r' && source[i + 1] === '\\n') {\n                // skip escaped CRLF newlines, but still trim the following line\n                next = source[++i + 1];\n                while (next === ' ' || next === '\\t')\n                    next = source[++i + 1];\n            }\n            else if (next === 'x' || next === 'u' || next === 'U') {\n                const length = { x: 2, u: 4, U: 8 }[next];\n                res += parseCharCode(source, i + 1, length, onError);\n                i += length;\n            }\n            else {\n                const raw = source.substr(i - 1, 2);\n                onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n                res += raw;\n            }\n        }\n        else if (ch === ' ' || ch === '\\t') {\n            // trim trailing whitespace\n            const wsStart = i;\n            let next = source[i + 1];\n            while (next === ' ' || next === '\\t')\n                next = source[++i + 1];\n            if (next !== '\\n' && !(next === '\\r' && source[i + 2] === '\\n'))\n                res += i > wsStart ? source.slice(wsStart, i + 1) : ch;\n        }\n        else {\n            res += ch;\n        }\n    }\n    if (source[source.length - 1] !== '\"' || source.length === 1)\n        onError(source.length, 'MISSING_CHAR', 'Missing closing \"quote');\n    return res;\n}\n/**\n * Fold a single newline into a space, multiple newlines to N - 1 newlines.\n * Presumes `source[offset] === '\\n'`\n */\nfunction foldNewline(source, offset) {\n    let fold = '';\n    let ch = source[offset + 1];\n    while (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\n        if (ch === '\\r' && source[offset + 2] !== '\\n')\n            break;\n        if (ch === '\\n')\n            fold += '\\n';\n        offset += 1;\n        ch = source[offset + 1];\n    }\n    if (!fold)\n        fold = ' ';\n    return { fold, offset };\n}\nconst escapeCodes = {\n    '0': '\\0', // null character\n    a: '\\x07', // bell character\n    b: '\\b', // backspace\n    e: '\\x1b', // escape character\n    f: '\\f', // form feed\n    n: '\\n', // line feed\n    r: '\\r', // carriage return\n    t: '\\t', // horizontal tab\n    v: '\\v', // vertical tab\n    N: '\\u0085', // Unicode next line\n    _: '\\u00a0', // Unicode non-breaking space\n    L: '\\u2028', // Unicode line separator\n    P: '\\u2029', // Unicode paragraph separator\n    ' ': ' ',\n    '\"': '\"',\n    '/': '/',\n    '\\\\': '\\\\',\n    '\\t': '\\t'\n};\nfunction parseCharCode(source, offset, length, onError) {\n    const cc = source.substr(offset, length);\n    const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);\n    const code = ok ? parseInt(cc, 16) : NaN;\n    if (isNaN(code)) {\n        const raw = source.substr(offset - 2, length + 2);\n        onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);\n        return raw;\n    }\n    return String.fromCodePoint(code);\n}\n\nexports.resolveFlowScalar = resolveFlowScalar;\n","'use strict';\n\nvar identity = require('../nodes/identity.js');\nvar Scalar = require('../nodes/Scalar.js');\nvar resolveBlockScalar = require('./resolve-block-scalar.js');\nvar resolveFlowScalar = require('./resolve-flow-scalar.js');\n\nfunction composeScalar(ctx, token, tagToken, onError) {\n    const { value, type, comment, range } = token.type === 'block-scalar'\n        ? resolveBlockScalar.resolveBlockScalar(ctx, token, onError)\n        : resolveFlowScalar.resolveFlowScalar(token, ctx.options.strict, onError);\n    const tagName = tagToken\n        ? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))\n        : null;\n    let tag;\n    if (ctx.options.stringKeys && ctx.atKey) {\n        tag = ctx.schema[identity.SCALAR];\n    }\n    else if (tagName)\n        tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError);\n    else if (token.type === 'scalar')\n        tag = findScalarTagByTest(ctx, value, token, onError);\n    else\n        tag = ctx.schema[identity.SCALAR];\n    let scalar;\n    try {\n        const res = tag.resolve(value, msg => onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg), ctx.options);\n        scalar = identity.isScalar(res) ? res : new Scalar.Scalar(res);\n    }\n    catch (error) {\n        const msg = error instanceof Error ? error.message : String(error);\n        onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg);\n        scalar = new Scalar.Scalar(value);\n    }\n    scalar.range = range;\n    scalar.source = value;\n    if (type)\n        scalar.type = type;\n    if (tagName)\n        scalar.tag = tagName;\n    if (tag.format)\n        scalar.format = tag.format;\n    if (comment)\n        scalar.comment = comment;\n    return scalar;\n}\nfunction findScalarTagByName(schema, value, tagName, tagToken, onError) {\n    if (tagName === '!')\n        return schema[identity.SCALAR]; // non-specific tag\n    const matchWithTest = [];\n    for (const tag of schema.tags) {\n        if (!tag.collection && tag.tag === tagName) {\n            if (tag.default && tag.test)\n                matchWithTest.push(tag);\n            else\n                return tag;\n        }\n    }\n    for (const tag of matchWithTest)\n        if (tag.test?.test(value))\n            return tag;\n    const kt = schema.knownTags[tagName];\n    if (kt && !kt.collection) {\n        // Ensure that the known tag is available for stringifying,\n        // but does not get used by default.\n        schema.tags.push(Object.assign({}, kt, { default: false, test: undefined }));\n        return kt;\n    }\n    onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');\n    return schema[identity.SCALAR];\n}\nfunction findScalarTagByTest({ atKey, directives, schema }, value, token, onError) {\n    const tag = schema.tags.find(tag => (tag.default === true || (atKey && tag.default === 'key')) &&\n        tag.test?.test(value)) || schema[identity.SCALAR];\n    if (schema.compat) {\n        const compat = schema.compat.find(tag => tag.default && tag.test?.test(value)) ??\n            schema[identity.SCALAR];\n        if (tag.tag !== compat.tag) {\n            const ts = directives.tagString(tag.tag);\n            const cs = directives.tagString(compat.tag);\n            const msg = `Value may be parsed as either ${ts} or ${cs}`;\n            onError(token, 'TAG_RESOLVE_FAILED', msg, true);\n        }\n    }\n    return tag;\n}\n\nexports.composeScalar = composeScalar;\n","'use strict';\n\nfunction emptyScalarPosition(offset, before, pos) {\n    if (before) {\n        pos ?? (pos = before.length);\n        for (let i = pos - 1; i >= 0; --i) {\n            let st = before[i];\n            switch (st.type) {\n                case 'space':\n                case 'comment':\n                case 'newline':\n                    offset -= st.source.length;\n                    continue;\n            }\n            // Technically, an empty scalar is immediately after the last non-empty\n            // node, but it's more useful to place it after any whitespace.\n            st = before[++i];\n            while (st?.type === 'space') {\n                offset += st.source.length;\n                st = before[++i];\n            }\n            break;\n        }\n    }\n    return offset;\n}\n\nexports.emptyScalarPosition = emptyScalarPosition;\n","'use strict';\n\nvar Alias = require('../nodes/Alias.js');\nvar identity = require('../nodes/identity.js');\nvar composeCollection = require('./compose-collection.js');\nvar composeScalar = require('./compose-scalar.js');\nvar resolveEnd = require('./resolve-end.js');\nvar utilEmptyScalarPosition = require('./util-empty-scalar-position.js');\n\nconst CN = { composeNode, composeEmptyNode };\nfunction composeNode(ctx, token, props, onError) {\n    const atKey = ctx.atKey;\n    const { spaceBefore, comment, anchor, tag } = props;\n    let node;\n    let isSrcToken = true;\n    switch (token.type) {\n        case 'alias':\n            node = composeAlias(ctx, token, onError);\n            if (anchor || tag)\n                onError(token, 'ALIAS_PROPS', 'An alias node must not specify any properties');\n            break;\n        case 'scalar':\n        case 'single-quoted-scalar':\n        case 'double-quoted-scalar':\n        case 'block-scalar':\n            node = composeScalar.composeScalar(ctx, token, tag, onError);\n            if (anchor)\n                node.anchor = anchor.source.substring(1);\n            break;\n        case 'block-map':\n        case 'block-seq':\n        case 'flow-collection':\n            node = composeCollection.composeCollection(CN, ctx, token, props, onError);\n            if (anchor)\n                node.anchor = anchor.source.substring(1);\n            break;\n        default: {\n            const message = token.type === 'error'\n                ? token.message\n                : `Unsupported token (type: ${token.type})`;\n            onError(token, 'UNEXPECTED_TOKEN', message);\n            node = composeEmptyNode(ctx, token.offset, undefined, null, props, onError);\n            isSrcToken = false;\n        }\n    }\n    if (anchor && node.anchor === '')\n        onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n    if (atKey &&\n        ctx.options.stringKeys &&\n        (!identity.isScalar(node) ||\n            typeof node.value !== 'string' ||\n            (node.tag && node.tag !== 'tag:yaml.org,2002:str'))) {\n        const msg = 'With stringKeys, all keys must be strings';\n        onError(tag ?? token, 'NON_STRING_KEY', msg);\n    }\n    if (spaceBefore)\n        node.spaceBefore = true;\n    if (comment) {\n        if (token.type === 'scalar' && token.source === '')\n            node.comment = comment;\n        else\n            node.commentBefore = comment;\n    }\n    // @ts-expect-error Type checking misses meaning of isSrcToken\n    if (ctx.options.keepSourceTokens && isSrcToken)\n        node.srcToken = token;\n    return node;\n}\nfunction composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) {\n    const token = {\n        type: 'scalar',\n        offset: utilEmptyScalarPosition.emptyScalarPosition(offset, before, pos),\n        indent: -1,\n        source: ''\n    };\n    const node = composeScalar.composeScalar(ctx, token, tag, onError);\n    if (anchor) {\n        node.anchor = anchor.source.substring(1);\n        if (node.anchor === '')\n            onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');\n    }\n    if (spaceBefore)\n        node.spaceBefore = true;\n    if (comment) {\n        node.comment = comment;\n        node.range[2] = end;\n    }\n    return node;\n}\nfunction composeAlias({ options }, { offset, source, end }, onError) {\n    const alias = new Alias.Alias(source.substring(1));\n    if (alias.source === '')\n        onError(offset, 'BAD_ALIAS', 'Alias cannot be an empty string');\n    if (alias.source.endsWith(':'))\n        onError(offset + source.length - 1, 'BAD_ALIAS', 'Alias ending in : is ambiguous', true);\n    const valueEnd = offset + source.length;\n    const re = resolveEnd.resolveEnd(end, valueEnd, options.strict, onError);\n    alias.range = [offset, valueEnd, re.offset];\n    if (re.comment)\n        alias.comment = re.comment;\n    return alias;\n}\n\nexports.composeEmptyNode = composeEmptyNode;\nexports.composeNode = composeNode;\n","'use strict';\n\nvar Document = require('../doc/Document.js');\nvar composeNode = require('./compose-node.js');\nvar resolveEnd = require('./resolve-end.js');\nvar resolveProps = require('./resolve-props.js');\n\nfunction composeDoc(options, directives, { offset, start, value, end }, onError) {\n    const opts = Object.assign({ _directives: directives }, options);\n    const doc = new Document.Document(undefined, opts);\n    const ctx = {\n        atKey: false,\n        atRoot: true,\n        directives: doc.directives,\n        options: doc.options,\n        schema: doc.schema\n    };\n    const props = resolveProps.resolveProps(start, {\n        indicator: 'doc-start',\n        next: value ?? end?.[0],\n        offset,\n        onError,\n        parentIndent: 0,\n        startOnNewline: true\n    });\n    if (props.found) {\n        doc.directives.docStart = true;\n        if (value &&\n            (value.type === 'block-map' || value.type === 'block-seq') &&\n            !props.hasNewline)\n            onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker');\n    }\n    // @ts-expect-error If Contents is set, let's trust the user\n    doc.contents = value\n        ? composeNode.composeNode(ctx, value, props, onError)\n        : composeNode.composeEmptyNode(ctx, props.end, start, null, props, onError);\n    const contentEnd = doc.contents.range[2];\n    const re = resolveEnd.resolveEnd(end, contentEnd, false, onError);\n    if (re.comment)\n        doc.comment = re.comment;\n    doc.range = [offset, contentEnd, re.offset];\n    return doc;\n}\n\nexports.composeDoc = composeDoc;\n","'use strict';\n\nvar node_process = require('process');\nvar directives = require('../doc/directives.js');\nvar Document = require('../doc/Document.js');\nvar errors = require('../errors.js');\nvar identity = require('../nodes/identity.js');\nvar composeDoc = require('./compose-doc.js');\nvar resolveEnd = require('./resolve-end.js');\n\nfunction getErrorPos(src) {\n    if (typeof src === 'number')\n        return [src, src + 1];\n    if (Array.isArray(src))\n        return src.length === 2 ? src : [src[0], src[1]];\n    const { offset, source } = src;\n    return [offset, offset + (typeof source === 'string' ? source.length : 1)];\n}\nfunction parsePrelude(prelude) {\n    let comment = '';\n    let atComment = false;\n    let afterEmptyLine = false;\n    for (let i = 0; i < prelude.length; ++i) {\n        const source = prelude[i];\n        switch (source[0]) {\n            case '#':\n                comment +=\n                    (comment === '' ? '' : afterEmptyLine ? '\\n\\n' : '\\n') +\n                        (source.substring(1) || ' ');\n                atComment = true;\n                afterEmptyLine = false;\n                break;\n            case '%':\n                if (prelude[i + 1]?.[0] !== '#')\n                    i += 1;\n                atComment = false;\n                break;\n            default:\n                // This may be wrong after doc-end, but in that case it doesn't matter\n                if (!atComment)\n                    afterEmptyLine = true;\n                atComment = false;\n        }\n    }\n    return { comment, afterEmptyLine };\n}\n/**\n * Compose a stream of CST nodes into a stream of YAML Documents.\n *\n * ```ts\n * import { Composer, Parser } from 'yaml'\n *\n * const src: string = ...\n * const tokens = new Parser().parse(src)\n * const docs = new Composer().compose(tokens)\n * ```\n */\nclass Composer {\n    constructor(options = {}) {\n        this.doc = null;\n        this.atDirectives = false;\n        this.prelude = [];\n        this.errors = [];\n        this.warnings = [];\n        this.onError = (source, code, message, warning) => {\n            const pos = getErrorPos(source);\n            if (warning)\n                this.warnings.push(new errors.YAMLWarning(pos, code, message));\n            else\n                this.errors.push(new errors.YAMLParseError(pos, code, message));\n        };\n        // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n        this.directives = new directives.Directives({ version: options.version || '1.2' });\n        this.options = options;\n    }\n    decorate(doc, afterDoc) {\n        const { comment, afterEmptyLine } = parsePrelude(this.prelude);\n        //console.log({ dc: doc.comment, prelude, comment })\n        if (comment) {\n            const dc = doc.contents;\n            if (afterDoc) {\n                doc.comment = doc.comment ? `${doc.comment}\\n${comment}` : comment;\n            }\n            else if (afterEmptyLine || doc.directives.docStart || !dc) {\n                doc.commentBefore = comment;\n            }\n            else if (identity.isCollection(dc) && !dc.flow && dc.items.length > 0) {\n                let it = dc.items[0];\n                if (identity.isPair(it))\n                    it = it.key;\n                const cb = it.commentBefore;\n                it.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n            }\n            else {\n                const cb = dc.commentBefore;\n                dc.commentBefore = cb ? `${comment}\\n${cb}` : comment;\n            }\n        }\n        if (afterDoc) {\n            Array.prototype.push.apply(doc.errors, this.errors);\n            Array.prototype.push.apply(doc.warnings, this.warnings);\n        }\n        else {\n            doc.errors = this.errors;\n            doc.warnings = this.warnings;\n        }\n        this.prelude = [];\n        this.errors = [];\n        this.warnings = [];\n    }\n    /**\n     * Current stream status information.\n     *\n     * Mostly useful at the end of input for an empty stream.\n     */\n    streamInfo() {\n        return {\n            comment: parsePrelude(this.prelude).comment,\n            directives: this.directives,\n            errors: this.errors,\n            warnings: this.warnings\n        };\n    }\n    /**\n     * Compose tokens into documents.\n     *\n     * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n     * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n     */\n    *compose(tokens, forceDoc = false, endOffset = -1) {\n        for (const token of tokens)\n            yield* this.next(token);\n        yield* this.end(forceDoc, endOffset);\n    }\n    /** Advance the composer by one CST token. */\n    *next(token) {\n        if (node_process.env.LOG_STREAM)\n            console.dir(token, { depth: null });\n        switch (token.type) {\n            case 'directive':\n                this.directives.add(token.source, (offset, message, warning) => {\n                    const pos = getErrorPos(token);\n                    pos[0] += offset;\n                    this.onError(pos, 'BAD_DIRECTIVE', message, warning);\n                });\n                this.prelude.push(token.source);\n                this.atDirectives = true;\n                break;\n            case 'document': {\n                const doc = composeDoc.composeDoc(this.options, this.directives, token, this.onError);\n                if (this.atDirectives && !doc.directives.docStart)\n                    this.onError(token, 'MISSING_CHAR', 'Missing directives-end/doc-start indicator line');\n                this.decorate(doc, false);\n                if (this.doc)\n                    yield this.doc;\n                this.doc = doc;\n                this.atDirectives = false;\n                break;\n            }\n            case 'byte-order-mark':\n            case 'space':\n                break;\n            case 'comment':\n            case 'newline':\n                this.prelude.push(token.source);\n                break;\n            case 'error': {\n                const msg = token.source\n                    ? `${token.message}: ${JSON.stringify(token.source)}`\n                    : token.message;\n                const error = new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg);\n                if (this.atDirectives || !this.doc)\n                    this.errors.push(error);\n                else\n                    this.doc.errors.push(error);\n                break;\n            }\n            case 'doc-end': {\n                if (!this.doc) {\n                    const msg = 'Unexpected doc-end without preceding document';\n                    this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg));\n                    break;\n                }\n                this.doc.directives.docEnd = true;\n                const end = resolveEnd.resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError);\n                this.decorate(this.doc, true);\n                if (end.comment) {\n                    const dc = this.doc.comment;\n                    this.doc.comment = dc ? `${dc}\\n${end.comment}` : end.comment;\n                }\n                this.doc.range[2] = end.offset;\n                break;\n            }\n            default:\n                this.errors.push(new errors.YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', `Unsupported token ${token.type}`));\n        }\n    }\n    /**\n     * Call at end of input to yield any remaining document.\n     *\n     * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.\n     * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.\n     */\n    *end(forceDoc = false, endOffset = -1) {\n        if (this.doc) {\n            this.decorate(this.doc, true);\n            yield this.doc;\n            this.doc = null;\n        }\n        else if (forceDoc) {\n            const opts = Object.assign({ _directives: this.directives }, this.options);\n            const doc = new Document.Document(undefined, opts);\n            if (this.atDirectives)\n                this.onError(endOffset, 'MISSING_CHAR', 'Missing directives-end indicator line');\n            doc.range = [0, endOffset, endOffset];\n            this.decorate(doc, false);\n            yield doc;\n        }\n    }\n}\n\nexports.Composer = Composer;\n","'use strict';\n\nvar resolveBlockScalar = require('../compose/resolve-block-scalar.js');\nvar resolveFlowScalar = require('../compose/resolve-flow-scalar.js');\nvar errors = require('../errors.js');\nvar stringifyString = require('../stringify/stringifyString.js');\n\nfunction resolveAsScalar(token, strict = true, onError) {\n    if (token) {\n        const _onError = (pos, code, message) => {\n            const offset = typeof pos === 'number' ? pos : Array.isArray(pos) ? pos[0] : pos.offset;\n            if (onError)\n                onError(offset, code, message);\n            else\n                throw new errors.YAMLParseError([offset, offset + 1], code, message);\n        };\n        switch (token.type) {\n            case 'scalar':\n            case 'single-quoted-scalar':\n            case 'double-quoted-scalar':\n                return resolveFlowScalar.resolveFlowScalar(token, strict, _onError);\n            case 'block-scalar':\n                return resolveBlockScalar.resolveBlockScalar({ options: { strict } }, token, _onError);\n        }\n    }\n    return null;\n}\n/**\n * Create a new scalar token with `value`\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.end Comments and whitespace after the end of the value, or after the block scalar header. If undefined, a newline will be added.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.indent The indent level of the token.\n * @param context.inFlow Is this scalar within a flow collection? This may affect the resolved type of the token's value.\n * @param context.offset The offset position of the token.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction createScalarToken(value, context) {\n    const { implicitKey = false, indent, inFlow = false, offset = -1, type = 'PLAIN' } = context;\n    const source = stringifyString.stringifyString({ type, value }, {\n        implicitKey,\n        indent: indent > 0 ? ' '.repeat(indent) : '',\n        inFlow,\n        options: { blockQuote: true, lineWidth: -1 }\n    });\n    const end = context.end ?? [\n        { type: 'newline', offset: -1, indent, source: '\\n' }\n    ];\n    switch (source[0]) {\n        case '|':\n        case '>': {\n            const he = source.indexOf('\\n');\n            const head = source.substring(0, he);\n            const body = source.substring(he + 1) + '\\n';\n            const props = [\n                { type: 'block-scalar-header', offset, indent, source: head }\n            ];\n            if (!addEndtoBlockProps(props, end))\n                props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n            return { type: 'block-scalar', offset, indent, props, source: body };\n        }\n        case '\"':\n            return { type: 'double-quoted-scalar', offset, indent, source, end };\n        case \"'\":\n            return { type: 'single-quoted-scalar', offset, indent, source, end };\n        default:\n            return { type: 'scalar', offset, indent, source, end };\n    }\n}\n/**\n * Set the value of `token` to the given string `value`, overwriting any previous contents and type that it may have.\n *\n * Best efforts are made to retain any comments previously associated with the `token`,\n * though all contents within a collection's `items` will be overwritten.\n *\n * Values that represent an actual string but may be parsed as a different type should use a `type` other than `'PLAIN'`,\n * as this function does not support any schema operations and won't check for such conflicts.\n *\n * @param token Any token. If it does not include an `indent` value, the value will be stringified as if it were an implicit key.\n * @param value The string representation of the value, which will have its content properly indented.\n * @param context.afterKey In most cases, values after a key should have an additional level of indentation.\n * @param context.implicitKey Being within an implicit key may affect the resolved type of the token's value.\n * @param context.inFlow Being within a flow collection may affect the resolved type of the token's value.\n * @param context.type The preferred type of the scalar token. If undefined, the previous type of the `token` will be used, defaulting to `'PLAIN'`.\n */\nfunction setScalarValue(token, value, context = {}) {\n    let { afterKey = false, implicitKey = false, inFlow = false, type } = context;\n    let indent = 'indent' in token ? token.indent : null;\n    if (afterKey && typeof indent === 'number')\n        indent += 2;\n    if (!type)\n        switch (token.type) {\n            case 'single-quoted-scalar':\n                type = 'QUOTE_SINGLE';\n                break;\n            case 'double-quoted-scalar':\n                type = 'QUOTE_DOUBLE';\n                break;\n            case 'block-scalar': {\n                const header = token.props[0];\n                if (header.type !== 'block-scalar-header')\n                    throw new Error('Invalid block scalar header');\n                type = header.source[0] === '>' ? 'BLOCK_FOLDED' : 'BLOCK_LITERAL';\n                break;\n            }\n            default:\n                type = 'PLAIN';\n        }\n    const source = stringifyString.stringifyString({ type, value }, {\n        implicitKey: implicitKey || indent === null,\n        indent: indent !== null && indent > 0 ? ' '.repeat(indent) : '',\n        inFlow,\n        options: { blockQuote: true, lineWidth: -1 }\n    });\n    switch (source[0]) {\n        case '|':\n        case '>':\n            setBlockScalarValue(token, source);\n            break;\n        case '\"':\n            setFlowScalarValue(token, source, 'double-quoted-scalar');\n            break;\n        case \"'\":\n            setFlowScalarValue(token, source, 'single-quoted-scalar');\n            break;\n        default:\n            setFlowScalarValue(token, source, 'scalar');\n    }\n}\nfunction setBlockScalarValue(token, source) {\n    const he = source.indexOf('\\n');\n    const head = source.substring(0, he);\n    const body = source.substring(he + 1) + '\\n';\n    if (token.type === 'block-scalar') {\n        const header = token.props[0];\n        if (header.type !== 'block-scalar-header')\n            throw new Error('Invalid block scalar header');\n        header.source = head;\n        token.source = body;\n    }\n    else {\n        const { offset } = token;\n        const indent = 'indent' in token ? token.indent : -1;\n        const props = [\n            { type: 'block-scalar-header', offset, indent, source: head }\n        ];\n        if (!addEndtoBlockProps(props, 'end' in token ? token.end : undefined))\n            props.push({ type: 'newline', offset: -1, indent, source: '\\n' });\n        for (const key of Object.keys(token))\n            if (key !== 'type' && key !== 'offset')\n                delete token[key];\n        Object.assign(token, { type: 'block-scalar', indent, props, source: body });\n    }\n}\n/** @returns `true` if last token is a newline */\nfunction addEndtoBlockProps(props, end) {\n    if (end)\n        for (const st of end)\n            switch (st.type) {\n                case 'space':\n                case 'comment':\n                    props.push(st);\n                    break;\n                case 'newline':\n                    props.push(st);\n                    return true;\n            }\n    return false;\n}\nfunction setFlowScalarValue(token, source, type) {\n    switch (token.type) {\n        case 'scalar':\n        case 'double-quoted-scalar':\n        case 'single-quoted-scalar':\n            token.type = type;\n            token.source = source;\n            break;\n        case 'block-scalar': {\n            const end = token.props.slice(1);\n            let oa = source.length;\n            if (token.props[0].type === 'block-scalar-header')\n                oa -= token.props[0].source.length;\n            for (const tok of end)\n                tok.offset += oa;\n            delete token.props;\n            Object.assign(token, { type, source, end });\n            break;\n        }\n        case 'block-map':\n        case 'block-seq': {\n            const offset = token.offset + source.length;\n            const nl = { type: 'newline', offset, indent: token.indent, source: '\\n' };\n            delete token.items;\n            Object.assign(token, { type, source, end: [nl] });\n            break;\n        }\n        default: {\n            const indent = 'indent' in token ? token.indent : -1;\n            const end = 'end' in token && Array.isArray(token.end)\n                ? token.end.filter(st => st.type === 'space' ||\n                    st.type === 'comment' ||\n                    st.type === 'newline')\n                : [];\n            for (const key of Object.keys(token))\n                if (key !== 'type' && key !== 'offset')\n                    delete token[key];\n            Object.assign(token, { type, indent, source, end });\n        }\n    }\n}\n\nexports.createScalarToken = createScalarToken;\nexports.resolveAsScalar = resolveAsScalar;\nexports.setScalarValue = setScalarValue;\n","'use strict';\n\n/**\n * Stringify a CST document, token, or collection item\n *\n * Fair warning: This applies no validation whatsoever, and\n * simply concatenates the sources in their logical order.\n */\nconst stringify = (cst) => 'type' in cst ? stringifyToken(cst) : stringifyItem(cst);\nfunction stringifyToken(token) {\n    switch (token.type) {\n        case 'block-scalar': {\n            let res = '';\n            for (const tok of token.props)\n                res += stringifyToken(tok);\n            return res + token.source;\n        }\n        case 'block-map':\n        case 'block-seq': {\n            let res = '';\n            for (const item of token.items)\n                res += stringifyItem(item);\n            return res;\n        }\n        case 'flow-collection': {\n            let res = token.start.source;\n            for (const item of token.items)\n                res += stringifyItem(item);\n            for (const st of token.end)\n                res += st.source;\n            return res;\n        }\n        case 'document': {\n            let res = stringifyItem(token);\n            if (token.end)\n                for (const st of token.end)\n                    res += st.source;\n            return res;\n        }\n        default: {\n            let res = token.source;\n            if ('end' in token && token.end)\n                for (const st of token.end)\n                    res += st.source;\n            return res;\n        }\n    }\n}\nfunction stringifyItem({ start, key, sep, value }) {\n    let res = '';\n    for (const st of start)\n        res += st.source;\n    if (key)\n        res += stringifyToken(key);\n    if (sep)\n        for (const st of sep)\n            res += st.source;\n    if (value)\n        res += stringifyToken(value);\n    return res;\n}\n\nexports.stringify = stringify;\n","'use strict';\n\nconst BREAK = Symbol('break visit');\nconst SKIP = Symbol('skip children');\nconst REMOVE = Symbol('remove item');\n/**\n * Apply a visitor to a CST document or item.\n *\n * Walks through the tree (depth-first) starting from the root, calling a\n * `visitor` function with two arguments when entering each item:\n *   - `item`: The current item, which included the following members:\n *     - `start: SourceToken[]` – Source tokens before the key or value,\n *       possibly including its anchor or tag.\n *     - `key?: Token | null` – Set for pair values. May then be `null`, if\n *       the key before the `:` separator is empty.\n *     - `sep?: SourceToken[]` – Source tokens between the key and the value,\n *       which should include the `:` map value indicator if `value` is set.\n *     - `value?: Token` – The value of a sequence item, or of a map pair.\n *   - `path`: The steps from the root to the current node, as an array of\n *     `['key' | 'value', number]` tuples.\n *\n * The return value of the visitor may be used to control the traversal:\n *   - `undefined` (default): Do nothing and continue\n *   - `visit.SKIP`: Do not visit the children of this token, continue with\n *      next sibling\n *   - `visit.BREAK`: Terminate traversal completely\n *   - `visit.REMOVE`: Remove the current item, then continue with the next one\n *   - `number`: Set the index of the next step. This is useful especially if\n *     the index of the current token has changed.\n *   - `function`: Define the next visitor for this item. After the original\n *     visitor is called on item entry, next visitors are called after handling\n *     a non-empty `key` and when exiting the item.\n */\nfunction visit(cst, visitor) {\n    if ('type' in cst && cst.type === 'document')\n        cst = { start: cst.start, value: cst.value };\n    _visit(Object.freeze([]), cst, visitor);\n}\n// Without the `as symbol` casts, TS declares these in the `visit`\n// namespace using `var`, but then complains about that because\n// `unique symbol` must be `const`.\n/** Terminate visit traversal completely */\nvisit.BREAK = BREAK;\n/** Do not visit the children of the current item */\nvisit.SKIP = SKIP;\n/** Remove the current item */\nvisit.REMOVE = REMOVE;\n/** Find the item at `path` from `cst` as the root */\nvisit.itemAtPath = (cst, path) => {\n    let item = cst;\n    for (const [field, index] of path) {\n        const tok = item?.[field];\n        if (tok && 'items' in tok) {\n            item = tok.items[index];\n        }\n        else\n            return undefined;\n    }\n    return item;\n};\n/**\n * Get the immediate parent collection of the item at `path` from `cst` as the root.\n *\n * Throws an error if the collection is not found, which should never happen if the item itself exists.\n */\nvisit.parentCollection = (cst, path) => {\n    const parent = visit.itemAtPath(cst, path.slice(0, -1));\n    const field = path[path.length - 1][0];\n    const coll = parent?.[field];\n    if (coll && 'items' in coll)\n        return coll;\n    throw new Error('Parent collection not found');\n};\nfunction _visit(path, item, visitor) {\n    let ctrl = visitor(item, path);\n    if (typeof ctrl === 'symbol')\n        return ctrl;\n    for (const field of ['key', 'value']) {\n        const token = item[field];\n        if (token && 'items' in token) {\n            for (let i = 0; i < token.items.length; ++i) {\n                const ci = _visit(Object.freeze(path.concat([[field, i]])), token.items[i], visitor);\n                if (typeof ci === 'number')\n                    i = ci - 1;\n                else if (ci === BREAK)\n                    return BREAK;\n                else if (ci === REMOVE) {\n                    token.items.splice(i, 1);\n                    i -= 1;\n                }\n            }\n            if (typeof ctrl === 'function' && field === 'key')\n                ctrl = ctrl(item, path);\n        }\n    }\n    return typeof ctrl === 'function' ? ctrl(item, path) : ctrl;\n}\n\nexports.visit = visit;\n","'use strict';\n\nvar cstScalar = require('./cst-scalar.js');\nvar cstStringify = require('./cst-stringify.js');\nvar cstVisit = require('./cst-visit.js');\n\n/** The byte order mark */\nconst BOM = '\\u{FEFF}';\n/** Start of doc-mode */\nconst DOCUMENT = '\\x02'; // C0: Start of Text\n/** Unexpected end of flow-mode */\nconst FLOW_END = '\\x18'; // C0: Cancel\n/** Next token is a scalar value */\nconst SCALAR = '\\x1f'; // C0: Unit Separator\n/** @returns `true` if `token` is a flow or block collection */\nconst isCollection = (token) => !!token && 'items' in token;\n/** @returns `true` if `token` is a flow or block scalar; not an alias */\nconst isScalar = (token) => !!token &&\n    (token.type === 'scalar' ||\n        token.type === 'single-quoted-scalar' ||\n        token.type === 'double-quoted-scalar' ||\n        token.type === 'block-scalar');\n/* istanbul ignore next */\n/** Get a printable representation of a lexer token */\nfunction prettyToken(token) {\n    switch (token) {\n        case BOM:\n            return '<BOM>';\n        case DOCUMENT:\n            return '<DOC>';\n        case FLOW_END:\n            return '<FLOW_END>';\n        case SCALAR:\n            return '<SCALAR>';\n        default:\n            return JSON.stringify(token);\n    }\n}\n/** Identify the type of a lexer token. May return `null` for unknown tokens. */\nfunction tokenType(source) {\n    switch (source) {\n        case BOM:\n            return 'byte-order-mark';\n        case DOCUMENT:\n            return 'doc-mode';\n        case FLOW_END:\n            return 'flow-error-end';\n        case SCALAR:\n            return 'scalar';\n        case '---':\n            return 'doc-start';\n        case '...':\n            return 'doc-end';\n        case '':\n        case '\\n':\n        case '\\r\\n':\n            return 'newline';\n        case '-':\n            return 'seq-item-ind';\n        case '?':\n            return 'explicit-key-ind';\n        case ':':\n            return 'map-value-ind';\n        case '{':\n            return 'flow-map-start';\n        case '}':\n            return 'flow-map-end';\n        case '[':\n            return 'flow-seq-start';\n        case ']':\n            return 'flow-seq-end';\n        case ',':\n            return 'comma';\n    }\n    switch (source[0]) {\n        case ' ':\n        case '\\t':\n            return 'space';\n        case '#':\n            return 'comment';\n        case '%':\n            return 'directive-line';\n        case '*':\n            return 'alias';\n        case '&':\n            return 'anchor';\n        case '!':\n            return 'tag';\n        case \"'\":\n            return 'single-quoted-scalar';\n        case '\"':\n            return 'double-quoted-scalar';\n        case '|':\n        case '>':\n            return 'block-scalar-header';\n    }\n    return null;\n}\n\nexports.createScalarToken = cstScalar.createScalarToken;\nexports.resolveAsScalar = cstScalar.resolveAsScalar;\nexports.setScalarValue = cstScalar.setScalarValue;\nexports.stringify = cstStringify.stringify;\nexports.visit = cstVisit.visit;\nexports.BOM = BOM;\nexports.DOCUMENT = DOCUMENT;\nexports.FLOW_END = FLOW_END;\nexports.SCALAR = SCALAR;\nexports.isCollection = isCollection;\nexports.isScalar = isScalar;\nexports.prettyToken = prettyToken;\nexports.tokenType = tokenType;\n","'use strict';\n\nvar cst = require('./cst.js');\n\n/*\nSTART -> stream\n\nstream\n  directive -> line-end -> stream\n  indent + line-end -> stream\n  [else] -> line-start\n\nline-end\n  comment -> line-end\n  newline -> .\n  input-end -> END\n\nline-start\n  doc-start -> doc\n  doc-end -> stream\n  [else] -> indent -> block-start\n\nblock-start\n  seq-item-start -> block-start\n  explicit-key-start -> block-start\n  map-value-start -> block-start\n  [else] -> doc\n\ndoc\n  line-end -> line-start\n  spaces -> doc\n  anchor -> doc\n  tag -> doc\n  flow-start -> flow -> doc\n  flow-end -> error -> doc\n  seq-item-start -> error -> doc\n  explicit-key-start -> error -> doc\n  map-value-start -> doc\n  alias -> doc\n  quote-start -> quoted-scalar -> doc\n  block-scalar-header -> line-end -> block-scalar(min) -> line-start\n  [else] -> plain-scalar(false, min) -> doc\n\nflow\n  line-end -> flow\n  spaces -> flow\n  anchor -> flow\n  tag -> flow\n  flow-start -> flow -> flow\n  flow-end -> .\n  seq-item-start -> error -> flow\n  explicit-key-start -> flow\n  map-value-start -> flow\n  alias -> flow\n  quote-start -> quoted-scalar -> flow\n  comma -> flow\n  [else] -> plain-scalar(true, 0) -> flow\n\nquoted-scalar\n  quote-end -> .\n  [else] -> quoted-scalar\n\nblock-scalar(min)\n  newline + peek(indent < min) -> .\n  [else] -> block-scalar(min)\n\nplain-scalar(is-flow, min)\n  scalar-end(is-flow) -> .\n  peek(newline + (indent < min)) -> .\n  [else] -> plain-scalar(min)\n*/\nfunction isEmpty(ch) {\n    switch (ch) {\n        case undefined:\n        case ' ':\n        case '\\n':\n        case '\\r':\n        case '\\t':\n            return true;\n        default:\n            return false;\n    }\n}\nconst hexDigits = new Set('0123456789ABCDEFabcdef');\nconst tagChars = new Set(\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()\");\nconst flowIndicatorChars = new Set(',[]{}');\nconst invalidAnchorChars = new Set(' ,[]{}\\n\\r\\t');\nconst isNotAnchorChar = (ch) => !ch || invalidAnchorChars.has(ch);\n/**\n * Splits an input string into lexical tokens, i.e. smaller strings that are\n * easily identifiable by `tokens.tokenType()`.\n *\n * Lexing starts always in a \"stream\" context. Incomplete input may be buffered\n * until a complete token can be emitted.\n *\n * In addition to slices of the original input, the following control characters\n * may also be emitted:\n *\n * - `\\x02` (Start of Text): A document starts with the next token\n * - `\\x18` (Cancel): Unexpected end of flow-mode (indicates an error)\n * - `\\x1f` (Unit Separator): Next token is a scalar value\n * - `\\u{FEFF}` (Byte order mark): Emitted separately outside documents\n */\nclass Lexer {\n    constructor() {\n        /**\n         * Flag indicating whether the end of the current buffer marks the end of\n         * all input\n         */\n        this.atEnd = false;\n        /**\n         * Explicit indent set in block scalar header, as an offset from the current\n         * minimum indent, so e.g. set to 1 from a header `|2+`. Set to -1 if not\n         * explicitly set.\n         */\n        this.blockScalarIndent = -1;\n        /**\n         * Block scalars that include a + (keep) chomping indicator in their header\n         * include trailing empty lines, which are otherwise excluded from the\n         * scalar's contents.\n         */\n        this.blockScalarKeep = false;\n        /** Current input */\n        this.buffer = '';\n        /**\n         * Flag noting whether the map value indicator : can immediately follow this\n         * node within a flow context.\n         */\n        this.flowKey = false;\n        /** Count of surrounding flow collection levels. */\n        this.flowLevel = 0;\n        /**\n         * Minimum level of indentation required for next lines to be parsed as a\n         * part of the current scalar value.\n         */\n        this.indentNext = 0;\n        /** Indentation level of the current line. */\n        this.indentValue = 0;\n        /** Position of the next \\n character. */\n        this.lineEndPos = null;\n        /** Stores the state of the lexer if reaching the end of incpomplete input */\n        this.next = null;\n        /** A pointer to `buffer`; the current position of the lexer. */\n        this.pos = 0;\n    }\n    /**\n     * Generate YAML tokens from the `source` string. If `incomplete`,\n     * a part of the last line may be left as a buffer for the next call.\n     *\n     * @returns A generator of lexical tokens\n     */\n    *lex(source, incomplete = false) {\n        if (source) {\n            if (typeof source !== 'string')\n                throw TypeError('source is not a string');\n            this.buffer = this.buffer ? this.buffer + source : source;\n            this.lineEndPos = null;\n        }\n        this.atEnd = !incomplete;\n        let next = this.next ?? 'stream';\n        while (next && (incomplete || this.hasChars(1)))\n            next = yield* this.parseNext(next);\n    }\n    atLineEnd() {\n        let i = this.pos;\n        let ch = this.buffer[i];\n        while (ch === ' ' || ch === '\\t')\n            ch = this.buffer[++i];\n        if (!ch || ch === '#' || ch === '\\n')\n            return true;\n        if (ch === '\\r')\n            return this.buffer[i + 1] === '\\n';\n        return false;\n    }\n    charAt(n) {\n        return this.buffer[this.pos + n];\n    }\n    continueScalar(offset) {\n        let ch = this.buffer[offset];\n        if (this.indentNext > 0) {\n            let indent = 0;\n            while (ch === ' ')\n                ch = this.buffer[++indent + offset];\n            if (ch === '\\r') {\n                const next = this.buffer[indent + offset + 1];\n                if (next === '\\n' || (!next && !this.atEnd))\n                    return offset + indent + 1;\n            }\n            return ch === '\\n' || indent >= this.indentNext || (!ch && !this.atEnd)\n                ? offset + indent\n                : -1;\n        }\n        if (ch === '-' || ch === '.') {\n            const dt = this.buffer.substr(offset, 3);\n            if ((dt === '---' || dt === '...') && isEmpty(this.buffer[offset + 3]))\n                return -1;\n        }\n        return offset;\n    }\n    getLine() {\n        let end = this.lineEndPos;\n        if (typeof end !== 'number' || (end !== -1 && end < this.pos)) {\n            end = this.buffer.indexOf('\\n', this.pos);\n            this.lineEndPos = end;\n        }\n        if (end === -1)\n            return this.atEnd ? this.buffer.substring(this.pos) : null;\n        if (this.buffer[end - 1] === '\\r')\n            end -= 1;\n        return this.buffer.substring(this.pos, end);\n    }\n    hasChars(n) {\n        return this.pos + n <= this.buffer.length;\n    }\n    setNext(state) {\n        this.buffer = this.buffer.substring(this.pos);\n        this.pos = 0;\n        this.lineEndPos = null;\n        this.next = state;\n        return null;\n    }\n    peek(n) {\n        return this.buffer.substr(this.pos, n);\n    }\n    *parseNext(next) {\n        switch (next) {\n            case 'stream':\n                return yield* this.parseStream();\n            case 'line-start':\n                return yield* this.parseLineStart();\n            case 'block-start':\n                return yield* this.parseBlockStart();\n            case 'doc':\n                return yield* this.parseDocument();\n            case 'flow':\n                return yield* this.parseFlowCollection();\n            case 'quoted-scalar':\n                return yield* this.parseQuotedScalar();\n            case 'block-scalar':\n                return yield* this.parseBlockScalar();\n            case 'plain-scalar':\n                return yield* this.parsePlainScalar();\n        }\n    }\n    *parseStream() {\n        let line = this.getLine();\n        if (line === null)\n            return this.setNext('stream');\n        if (line[0] === cst.BOM) {\n            yield* this.pushCount(1);\n            line = line.substring(1);\n        }\n        if (line[0] === '%') {\n            let dirEnd = line.length;\n            let cs = line.indexOf('#');\n            while (cs !== -1) {\n                const ch = line[cs - 1];\n                if (ch === ' ' || ch === '\\t') {\n                    dirEnd = cs - 1;\n                    break;\n                }\n                else {\n                    cs = line.indexOf('#', cs + 1);\n                }\n            }\n            while (true) {\n                const ch = line[dirEnd - 1];\n                if (ch === ' ' || ch === '\\t')\n                    dirEnd -= 1;\n                else\n                    break;\n            }\n            const n = (yield* this.pushCount(dirEnd)) + (yield* this.pushSpaces(true));\n            yield* this.pushCount(line.length - n); // possible comment\n            this.pushNewline();\n            return 'stream';\n        }\n        if (this.atLineEnd()) {\n            const sp = yield* this.pushSpaces(true);\n            yield* this.pushCount(line.length - sp);\n            yield* this.pushNewline();\n            return 'stream';\n        }\n        yield cst.DOCUMENT;\n        return yield* this.parseLineStart();\n    }\n    *parseLineStart() {\n        const ch = this.charAt(0);\n        if (!ch && !this.atEnd)\n            return this.setNext('line-start');\n        if (ch === '-' || ch === '.') {\n            if (!this.atEnd && !this.hasChars(4))\n                return this.setNext('line-start');\n            const s = this.peek(3);\n            if ((s === '---' || s === '...') && isEmpty(this.charAt(3))) {\n                yield* this.pushCount(3);\n                this.indentValue = 0;\n                this.indentNext = 0;\n                return s === '---' ? 'doc' : 'stream';\n            }\n        }\n        this.indentValue = yield* this.pushSpaces(false);\n        if (this.indentNext > this.indentValue && !isEmpty(this.charAt(1)))\n            this.indentNext = this.indentValue;\n        return yield* this.parseBlockStart();\n    }\n    *parseBlockStart() {\n        const [ch0, ch1] = this.peek(2);\n        if (!ch1 && !this.atEnd)\n            return this.setNext('block-start');\n        if ((ch0 === '-' || ch0 === '?' || ch0 === ':') && isEmpty(ch1)) {\n            const n = (yield* this.pushCount(1)) + (yield* this.pushSpaces(true));\n            this.indentNext = this.indentValue + 1;\n            this.indentValue += n;\n            return yield* this.parseBlockStart();\n        }\n        return 'doc';\n    }\n    *parseDocument() {\n        yield* this.pushSpaces(true);\n        const line = this.getLine();\n        if (line === null)\n            return this.setNext('doc');\n        let n = yield* this.pushIndicators();\n        switch (line[n]) {\n            case '#':\n                yield* this.pushCount(line.length - n);\n            // fallthrough\n            case undefined:\n                yield* this.pushNewline();\n                return yield* this.parseLineStart();\n            case '{':\n            case '[':\n                yield* this.pushCount(1);\n                this.flowKey = false;\n                this.flowLevel = 1;\n                return 'flow';\n            case '}':\n            case ']':\n                // this is an error\n                yield* this.pushCount(1);\n                return 'doc';\n            case '*':\n                yield* this.pushUntil(isNotAnchorChar);\n                return 'doc';\n            case '\"':\n            case \"'\":\n                return yield* this.parseQuotedScalar();\n            case '|':\n            case '>':\n                n += yield* this.parseBlockScalarHeader();\n                n += yield* this.pushSpaces(true);\n                yield* this.pushCount(line.length - n);\n                yield* this.pushNewline();\n                return yield* this.parseBlockScalar();\n            default:\n                return yield* this.parsePlainScalar();\n        }\n    }\n    *parseFlowCollection() {\n        let nl, sp;\n        let indent = -1;\n        do {\n            nl = yield* this.pushNewline();\n            if (nl > 0) {\n                sp = yield* this.pushSpaces(false);\n                this.indentValue = indent = sp;\n            }\n            else {\n                sp = 0;\n            }\n            sp += yield* this.pushSpaces(true);\n        } while (nl + sp > 0);\n        const line = this.getLine();\n        if (line === null)\n            return this.setNext('flow');\n        if ((indent !== -1 && indent < this.indentNext && line[0] !== '#') ||\n            (indent === 0 &&\n                (line.startsWith('---') || line.startsWith('...')) &&\n                isEmpty(line[3]))) {\n            // Allowing for the terminal ] or } at the same (rather than greater)\n            // indent level as the initial [ or { is technically invalid, but\n            // failing here would be surprising to users.\n            const atFlowEndMarker = indent === this.indentNext - 1 &&\n                this.flowLevel === 1 &&\n                (line[0] === ']' || line[0] === '}');\n            if (!atFlowEndMarker) {\n                // this is an error\n                this.flowLevel = 0;\n                yield cst.FLOW_END;\n                return yield* this.parseLineStart();\n            }\n        }\n        let n = 0;\n        while (line[n] === ',') {\n            n += yield* this.pushCount(1);\n            n += yield* this.pushSpaces(true);\n            this.flowKey = false;\n        }\n        n += yield* this.pushIndicators();\n        switch (line[n]) {\n            case undefined:\n                return 'flow';\n            case '#':\n                yield* this.pushCount(line.length - n);\n                return 'flow';\n            case '{':\n            case '[':\n                yield* this.pushCount(1);\n                this.flowKey = false;\n                this.flowLevel += 1;\n                return 'flow';\n            case '}':\n            case ']':\n                yield* this.pushCount(1);\n                this.flowKey = true;\n                this.flowLevel -= 1;\n                return this.flowLevel ? 'flow' : 'doc';\n            case '*':\n                yield* this.pushUntil(isNotAnchorChar);\n                return 'flow';\n            case '\"':\n            case \"'\":\n                this.flowKey = true;\n                return yield* this.parseQuotedScalar();\n            case ':': {\n                const next = this.charAt(1);\n                if (this.flowKey || isEmpty(next) || next === ',') {\n                    this.flowKey = false;\n                    yield* this.pushCount(1);\n                    yield* this.pushSpaces(true);\n                    return 'flow';\n                }\n            }\n            // fallthrough\n            default:\n                this.flowKey = false;\n                return yield* this.parsePlainScalar();\n        }\n    }\n    *parseQuotedScalar() {\n        const quote = this.charAt(0);\n        let end = this.buffer.indexOf(quote, this.pos + 1);\n        if (quote === \"'\") {\n            while (end !== -1 && this.buffer[end + 1] === \"'\")\n                end = this.buffer.indexOf(\"'\", end + 2);\n        }\n        else {\n            // double-quote\n            while (end !== -1) {\n                let n = 0;\n                while (this.buffer[end - 1 - n] === '\\\\')\n                    n += 1;\n                if (n % 2 === 0)\n                    break;\n                end = this.buffer.indexOf('\"', end + 1);\n            }\n        }\n        // Only looking for newlines within the quotes\n        const qb = this.buffer.substring(0, end);\n        let nl = qb.indexOf('\\n', this.pos);\n        if (nl !== -1) {\n            while (nl !== -1) {\n                const cs = this.continueScalar(nl + 1);\n                if (cs === -1)\n                    break;\n                nl = qb.indexOf('\\n', cs);\n            }\n            if (nl !== -1) {\n                // this is an error caused by an unexpected unindent\n                end = nl - (qb[nl - 1] === '\\r' ? 2 : 1);\n            }\n        }\n        if (end === -1) {\n            if (!this.atEnd)\n                return this.setNext('quoted-scalar');\n            end = this.buffer.length;\n        }\n        yield* this.pushToIndex(end + 1, false);\n        return this.flowLevel ? 'flow' : 'doc';\n    }\n    *parseBlockScalarHeader() {\n        this.blockScalarIndent = -1;\n        this.blockScalarKeep = false;\n        let i = this.pos;\n        while (true) {\n            const ch = this.buffer[++i];\n            if (ch === '+')\n                this.blockScalarKeep = true;\n            else if (ch > '0' && ch <= '9')\n                this.blockScalarIndent = Number(ch) - 1;\n            else if (ch !== '-')\n                break;\n        }\n        return yield* this.pushUntil(ch => isEmpty(ch) || ch === '#');\n    }\n    *parseBlockScalar() {\n        let nl = this.pos - 1; // may be -1 if this.pos === 0\n        let indent = 0;\n        let ch;\n        loop: for (let i = this.pos; (ch = this.buffer[i]); ++i) {\n            switch (ch) {\n                case ' ':\n                    indent += 1;\n                    break;\n                case '\\n':\n                    nl = i;\n                    indent = 0;\n                    break;\n                case '\\r': {\n                    const next = this.buffer[i + 1];\n                    if (!next && !this.atEnd)\n                        return this.setNext('block-scalar');\n                    if (next === '\\n')\n                        break;\n                } // fallthrough\n                default:\n                    break loop;\n            }\n        }\n        if (!ch && !this.atEnd)\n            return this.setNext('block-scalar');\n        if (indent >= this.indentNext) {\n            if (this.blockScalarIndent === -1)\n                this.indentNext = indent;\n            else {\n                this.indentNext =\n                    this.blockScalarIndent + (this.indentNext === 0 ? 1 : this.indentNext);\n            }\n            do {\n                const cs = this.continueScalar(nl + 1);\n                if (cs === -1)\n                    break;\n                nl = this.buffer.indexOf('\\n', cs);\n            } while (nl !== -1);\n            if (nl === -1) {\n                if (!this.atEnd)\n                    return this.setNext('block-scalar');\n                nl = this.buffer.length;\n            }\n        }\n        // Trailing insufficiently indented tabs are invalid.\n        // To catch that during parsing, we include them in the block scalar value.\n        let i = nl + 1;\n        ch = this.buffer[i];\n        while (ch === ' ')\n            ch = this.buffer[++i];\n        if (ch === '\\t') {\n            while (ch === '\\t' || ch === ' ' || ch === '\\r' || ch === '\\n')\n                ch = this.buffer[++i];\n            nl = i - 1;\n        }\n        else if (!this.blockScalarKeep) {\n            do {\n                let i = nl - 1;\n                let ch = this.buffer[i];\n                if (ch === '\\r')\n                    ch = this.buffer[--i];\n                const lastChar = i; // Drop the line if last char not more indented\n                while (ch === ' ')\n                    ch = this.buffer[--i];\n                if (ch === '\\n' && i >= this.pos && i + 1 + indent > lastChar)\n                    nl = i;\n                else\n                    break;\n            } while (true);\n        }\n        yield cst.SCALAR;\n        yield* this.pushToIndex(nl + 1, true);\n        return yield* this.parseLineStart();\n    }\n    *parsePlainScalar() {\n        const inFlow = this.flowLevel > 0;\n        let end = this.pos - 1;\n        let i = this.pos - 1;\n        let ch;\n        while ((ch = this.buffer[++i])) {\n            if (ch === ':') {\n                const next = this.buffer[i + 1];\n                if (isEmpty(next) || (inFlow && flowIndicatorChars.has(next)))\n                    break;\n                end = i;\n            }\n            else if (isEmpty(ch)) {\n                let next = this.buffer[i + 1];\n                if (ch === '\\r') {\n                    if (next === '\\n') {\n                        i += 1;\n                        ch = '\\n';\n                        next = this.buffer[i + 1];\n                    }\n                    else\n                        end = i;\n                }\n                if (next === '#' || (inFlow && flowIndicatorChars.has(next)))\n                    break;\n                if (ch === '\\n') {\n                    const cs = this.continueScalar(i + 1);\n                    if (cs === -1)\n                        break;\n                    i = Math.max(i, cs - 2); // to advance, but still account for ' #'\n                }\n            }\n            else {\n                if (inFlow && flowIndicatorChars.has(ch))\n                    break;\n                end = i;\n            }\n        }\n        if (!ch && !this.atEnd)\n            return this.setNext('plain-scalar');\n        yield cst.SCALAR;\n        yield* this.pushToIndex(end + 1, true);\n        return inFlow ? 'flow' : 'doc';\n    }\n    *pushCount(n) {\n        if (n > 0) {\n            yield this.buffer.substr(this.pos, n);\n            this.pos += n;\n            return n;\n        }\n        return 0;\n    }\n    *pushToIndex(i, allowEmpty) {\n        const s = this.buffer.slice(this.pos, i);\n        if (s) {\n            yield s;\n            this.pos += s.length;\n            return s.length;\n        }\n        else if (allowEmpty)\n            yield '';\n        return 0;\n    }\n    *pushIndicators() {\n        switch (this.charAt(0)) {\n            case '!':\n                return ((yield* this.pushTag()) +\n                    (yield* this.pushSpaces(true)) +\n                    (yield* this.pushIndicators()));\n            case '&':\n                return ((yield* this.pushUntil(isNotAnchorChar)) +\n                    (yield* this.pushSpaces(true)) +\n                    (yield* this.pushIndicators()));\n            case '-': // this is an error\n            case '?': // this is an error outside flow collections\n            case ':': {\n                const inFlow = this.flowLevel > 0;\n                const ch1 = this.charAt(1);\n                if (isEmpty(ch1) || (inFlow && flowIndicatorChars.has(ch1))) {\n                    if (!inFlow)\n                        this.indentNext = this.indentValue + 1;\n                    else if (this.flowKey)\n                        this.flowKey = false;\n                    return ((yield* this.pushCount(1)) +\n                        (yield* this.pushSpaces(true)) +\n                        (yield* this.pushIndicators()));\n                }\n            }\n        }\n        return 0;\n    }\n    *pushTag() {\n        if (this.charAt(1) === '<') {\n            let i = this.pos + 2;\n            let ch = this.buffer[i];\n            while (!isEmpty(ch) && ch !== '>')\n                ch = this.buffer[++i];\n            return yield* this.pushToIndex(ch === '>' ? i + 1 : i, false);\n        }\n        else {\n            let i = this.pos + 1;\n            let ch = this.buffer[i];\n            while (ch) {\n                if (tagChars.has(ch))\n                    ch = this.buffer[++i];\n                else if (ch === '%' &&\n                    hexDigits.has(this.buffer[i + 1]) &&\n                    hexDigits.has(this.buffer[i + 2])) {\n                    ch = this.buffer[(i += 3)];\n                }\n                else\n                    break;\n            }\n            return yield* this.pushToIndex(i, false);\n        }\n    }\n    *pushNewline() {\n        const ch = this.buffer[this.pos];\n        if (ch === '\\n')\n            return yield* this.pushCount(1);\n        else if (ch === '\\r' && this.charAt(1) === '\\n')\n            return yield* this.pushCount(2);\n        else\n            return 0;\n    }\n    *pushSpaces(allowTabs) {\n        let i = this.pos - 1;\n        let ch;\n        do {\n            ch = this.buffer[++i];\n        } while (ch === ' ' || (allowTabs && ch === '\\t'));\n        const n = i - this.pos;\n        if (n > 0) {\n            yield this.buffer.substr(this.pos, n);\n            this.pos = i;\n        }\n        return n;\n    }\n    *pushUntil(test) {\n        let i = this.pos;\n        let ch = this.buffer[i];\n        while (!test(ch))\n            ch = this.buffer[++i];\n        return yield* this.pushToIndex(i, false);\n    }\n}\n\nexports.Lexer = Lexer;\n","'use strict';\n\n/**\n * Tracks newlines during parsing in order to provide an efficient API for\n * determining the one-indexed `{ line, col }` position for any offset\n * within the input.\n */\nclass LineCounter {\n    constructor() {\n        this.lineStarts = [];\n        /**\n         * Should be called in ascending order. Otherwise, call\n         * `lineCounter.lineStarts.sort()` before calling `linePos()`.\n         */\n        this.addNewLine = (offset) => this.lineStarts.push(offset);\n        /**\n         * Performs a binary search and returns the 1-indexed { line, col }\n         * position of `offset`. If `line === 0`, `addNewLine` has never been\n         * called or `offset` is before the first known newline.\n         */\n        this.linePos = (offset) => {\n            let low = 0;\n            let high = this.lineStarts.length;\n            while (low < high) {\n                const mid = (low + high) >> 1; // Math.floor((low + high) / 2)\n                if (this.lineStarts[mid] < offset)\n                    low = mid + 1;\n                else\n                    high = mid;\n            }\n            if (this.lineStarts[low] === offset)\n                return { line: low + 1, col: 1 };\n            if (low === 0)\n                return { line: 0, col: offset };\n            const start = this.lineStarts[low - 1];\n            return { line: low, col: offset - start + 1 };\n        };\n    }\n}\n\nexports.LineCounter = LineCounter;\n","'use strict';\n\nvar node_process = require('process');\nvar cst = require('./cst.js');\nvar lexer = require('./lexer.js');\n\nfunction includesToken(list, type) {\n    for (let i = 0; i < list.length; ++i)\n        if (list[i].type === type)\n            return true;\n    return false;\n}\nfunction findNonEmptyIndex(list) {\n    for (let i = 0; i < list.length; ++i) {\n        switch (list[i].type) {\n            case 'space':\n            case 'comment':\n            case 'newline':\n                break;\n            default:\n                return i;\n        }\n    }\n    return -1;\n}\nfunction isFlowToken(token) {\n    switch (token?.type) {\n        case 'alias':\n        case 'scalar':\n        case 'single-quoted-scalar':\n        case 'double-quoted-scalar':\n        case 'flow-collection':\n            return true;\n        default:\n            return false;\n    }\n}\nfunction getPrevProps(parent) {\n    switch (parent.type) {\n        case 'document':\n            return parent.start;\n        case 'block-map': {\n            const it = parent.items[parent.items.length - 1];\n            return it.sep ?? it.start;\n        }\n        case 'block-seq':\n            return parent.items[parent.items.length - 1].start;\n        /* istanbul ignore next should not happen */\n        default:\n            return [];\n    }\n}\n/** Note: May modify input array */\nfunction getFirstKeyStartProps(prev) {\n    if (prev.length === 0)\n        return [];\n    let i = prev.length;\n    loop: while (--i >= 0) {\n        switch (prev[i].type) {\n            case 'doc-start':\n            case 'explicit-key-ind':\n            case 'map-value-ind':\n            case 'seq-item-ind':\n            case 'newline':\n                break loop;\n        }\n    }\n    while (prev[++i]?.type === 'space') {\n        /* loop */\n    }\n    return prev.splice(i, prev.length);\n}\nfunction fixFlowSeqItems(fc) {\n    if (fc.start.type === 'flow-seq-start') {\n        for (const it of fc.items) {\n            if (it.sep &&\n                !it.value &&\n                !includesToken(it.start, 'explicit-key-ind') &&\n                !includesToken(it.sep, 'map-value-ind')) {\n                if (it.key)\n                    it.value = it.key;\n                delete it.key;\n                if (isFlowToken(it.value)) {\n                    if (it.value.end)\n                        Array.prototype.push.apply(it.value.end, it.sep);\n                    else\n                        it.value.end = it.sep;\n                }\n                else\n                    Array.prototype.push.apply(it.start, it.sep);\n                delete it.sep;\n            }\n        }\n    }\n}\n/**\n * A YAML concrete syntax tree (CST) parser\n *\n * ```ts\n * const src: string = ...\n * for (const token of new Parser().parse(src)) {\n *   // token: Token\n * }\n * ```\n *\n * To use the parser with a user-provided lexer:\n *\n * ```ts\n * function* parse(source: string, lexer: Lexer) {\n *   const parser = new Parser()\n *   for (const lexeme of lexer.lex(source))\n *     yield* parser.next(lexeme)\n *   yield* parser.end()\n * }\n *\n * const src: string = ...\n * const lexer = new Lexer()\n * for (const token of parse(src, lexer)) {\n *   // token: Token\n * }\n * ```\n */\nclass Parser {\n    /**\n     * @param onNewLine - If defined, called separately with the start position of\n     *   each new line (in `parse()`, including the start of input).\n     */\n    constructor(onNewLine) {\n        /** If true, space and sequence indicators count as indentation */\n        this.atNewLine = true;\n        /** If true, next token is a scalar value */\n        this.atScalar = false;\n        /** Current indentation level */\n        this.indent = 0;\n        /** Current offset since the start of parsing */\n        this.offset = 0;\n        /** On the same line with a block map key */\n        this.onKeyLine = false;\n        /** Top indicates the node that's currently being built */\n        this.stack = [];\n        /** The source of the current token, set in parse() */\n        this.source = '';\n        /** The type of the current token, set in parse() */\n        this.type = '';\n        // Must be defined after `next()`\n        this.lexer = new lexer.Lexer();\n        this.onNewLine = onNewLine;\n    }\n    /**\n     * Parse `source` as a YAML stream.\n     * If `incomplete`, a part of the last line may be left as a buffer for the next call.\n     *\n     * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens.\n     *\n     * @returns A generator of tokens representing each directive, document, and other structure.\n     */\n    *parse(source, incomplete = false) {\n        if (this.onNewLine && this.offset === 0)\n            this.onNewLine(0);\n        for (const lexeme of this.lexer.lex(source, incomplete))\n            yield* this.next(lexeme);\n        if (!incomplete)\n            yield* this.end();\n    }\n    /**\n     * Advance the parser by the `source` of one lexical token.\n     */\n    *next(source) {\n        this.source = source;\n        if (node_process.env.LOG_TOKENS)\n            console.log('|', cst.prettyToken(source));\n        if (this.atScalar) {\n            this.atScalar = false;\n            yield* this.step();\n            this.offset += source.length;\n            return;\n        }\n        const type = cst.tokenType(source);\n        if (!type) {\n            const message = `Not a YAML token: ${source}`;\n            yield* this.pop({ type: 'error', offset: this.offset, message, source });\n            this.offset += source.length;\n        }\n        else if (type === 'scalar') {\n            this.atNewLine = false;\n            this.atScalar = true;\n            this.type = 'scalar';\n        }\n        else {\n            this.type = type;\n            yield* this.step();\n            switch (type) {\n                case 'newline':\n                    this.atNewLine = true;\n                    this.indent = 0;\n                    if (this.onNewLine)\n                        this.onNewLine(this.offset + source.length);\n                    break;\n                case 'space':\n                    if (this.atNewLine && source[0] === ' ')\n                        this.indent += source.length;\n                    break;\n                case 'explicit-key-ind':\n                case 'map-value-ind':\n                case 'seq-item-ind':\n                    if (this.atNewLine)\n                        this.indent += source.length;\n                    break;\n                case 'doc-mode':\n                case 'flow-error-end':\n                    return;\n                default:\n                    this.atNewLine = false;\n            }\n            this.offset += source.length;\n        }\n    }\n    /** Call at end of input to push out any remaining constructions */\n    *end() {\n        while (this.stack.length > 0)\n            yield* this.pop();\n    }\n    get sourceToken() {\n        const st = {\n            type: this.type,\n            offset: this.offset,\n            indent: this.indent,\n            source: this.source\n        };\n        return st;\n    }\n    *step() {\n        const top = this.peek(1);\n        if (this.type === 'doc-end' && top?.type !== 'doc-end') {\n            while (this.stack.length > 0)\n                yield* this.pop();\n            this.stack.push({\n                type: 'doc-end',\n                offset: this.offset,\n                source: this.source\n            });\n            return;\n        }\n        if (!top)\n            return yield* this.stream();\n        switch (top.type) {\n            case 'document':\n                return yield* this.document(top);\n            case 'alias':\n            case 'scalar':\n            case 'single-quoted-scalar':\n            case 'double-quoted-scalar':\n                return yield* this.scalar(top);\n            case 'block-scalar':\n                return yield* this.blockScalar(top);\n            case 'block-map':\n                return yield* this.blockMap(top);\n            case 'block-seq':\n                return yield* this.blockSequence(top);\n            case 'flow-collection':\n                return yield* this.flowCollection(top);\n            case 'doc-end':\n                return yield* this.documentEnd(top);\n        }\n        /* istanbul ignore next should not happen */\n        yield* this.pop();\n    }\n    peek(n) {\n        return this.stack[this.stack.length - n];\n    }\n    *pop(error) {\n        const token = error ?? this.stack.pop();\n        /* istanbul ignore if should not happen */\n        if (!token) {\n            const message = 'Tried to pop an empty stack';\n            yield { type: 'error', offset: this.offset, source: '', message };\n        }\n        else if (this.stack.length === 0) {\n            yield token;\n        }\n        else {\n            const top = this.peek(1);\n            if (token.type === 'block-scalar') {\n                // Block scalars use their parent rather than header indent\n                token.indent = 'indent' in top ? top.indent : 0;\n            }\n            else if (token.type === 'flow-collection' && top.type === 'document') {\n                // Ignore all indent for top-level flow collections\n                token.indent = 0;\n            }\n            if (token.type === 'flow-collection')\n                fixFlowSeqItems(token);\n            switch (top.type) {\n                case 'document':\n                    top.value = token;\n                    break;\n                case 'block-scalar':\n                    top.props.push(token); // error\n                    break;\n                case 'block-map': {\n                    const it = top.items[top.items.length - 1];\n                    if (it.value) {\n                        top.items.push({ start: [], key: token, sep: [] });\n                        this.onKeyLine = true;\n                        return;\n                    }\n                    else if (it.sep) {\n                        it.value = token;\n                    }\n                    else {\n                        Object.assign(it, { key: token, sep: [] });\n                        this.onKeyLine = !it.explicitKey;\n                        return;\n                    }\n                    break;\n                }\n                case 'block-seq': {\n                    const it = top.items[top.items.length - 1];\n                    if (it.value)\n                        top.items.push({ start: [], value: token });\n                    else\n                        it.value = token;\n                    break;\n                }\n                case 'flow-collection': {\n                    const it = top.items[top.items.length - 1];\n                    if (!it || it.value)\n                        top.items.push({ start: [], key: token, sep: [] });\n                    else if (it.sep)\n                        it.value = token;\n                    else\n                        Object.assign(it, { key: token, sep: [] });\n                    return;\n                }\n                /* istanbul ignore next should not happen */\n                default:\n                    yield* this.pop();\n                    yield* this.pop(token);\n            }\n            if ((top.type === 'document' ||\n                top.type === 'block-map' ||\n                top.type === 'block-seq') &&\n                (token.type === 'block-map' || token.type === 'block-seq')) {\n                const last = token.items[token.items.length - 1];\n                if (last &&\n                    !last.sep &&\n                    !last.value &&\n                    last.start.length > 0 &&\n                    findNonEmptyIndex(last.start) === -1 &&\n                    (token.indent === 0 ||\n                        last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) {\n                    if (top.type === 'document')\n                        top.end = last.start;\n                    else\n                        top.items.push({ start: last.start });\n                    token.items.splice(-1, 1);\n                }\n            }\n        }\n    }\n    *stream() {\n        switch (this.type) {\n            case 'directive-line':\n                yield { type: 'directive', offset: this.offset, source: this.source };\n                return;\n            case 'byte-order-mark':\n            case 'space':\n            case 'comment':\n            case 'newline':\n                yield this.sourceToken;\n                return;\n            case 'doc-mode':\n            case 'doc-start': {\n                const doc = {\n                    type: 'document',\n                    offset: this.offset,\n                    start: []\n                };\n                if (this.type === 'doc-start')\n                    doc.start.push(this.sourceToken);\n                this.stack.push(doc);\n                return;\n            }\n        }\n        yield {\n            type: 'error',\n            offset: this.offset,\n            message: `Unexpected ${this.type} token in YAML stream`,\n            source: this.source\n        };\n    }\n    *document(doc) {\n        if (doc.value)\n            return yield* this.lineEnd(doc);\n        switch (this.type) {\n            case 'doc-start': {\n                if (findNonEmptyIndex(doc.start) !== -1) {\n                    yield* this.pop();\n                    yield* this.step();\n                }\n                else\n                    doc.start.push(this.sourceToken);\n                return;\n            }\n            case 'anchor':\n            case 'tag':\n            case 'space':\n            case 'comment':\n            case 'newline':\n                doc.start.push(this.sourceToken);\n                return;\n        }\n        const bv = this.startBlockValue(doc);\n        if (bv)\n            this.stack.push(bv);\n        else {\n            yield {\n                type: 'error',\n                offset: this.offset,\n                message: `Unexpected ${this.type} token in YAML document`,\n                source: this.source\n            };\n        }\n    }\n    *scalar(scalar) {\n        if (this.type === 'map-value-ind') {\n            const prev = getPrevProps(this.peek(2));\n            const start = getFirstKeyStartProps(prev);\n            let sep;\n            if (scalar.end) {\n                sep = scalar.end;\n                sep.push(this.sourceToken);\n                delete scalar.end;\n            }\n            else\n                sep = [this.sourceToken];\n            const map = {\n                type: 'block-map',\n                offset: scalar.offset,\n                indent: scalar.indent,\n                items: [{ start, key: scalar, sep }]\n            };\n            this.onKeyLine = true;\n            this.stack[this.stack.length - 1] = map;\n        }\n        else\n            yield* this.lineEnd(scalar);\n    }\n    *blockScalar(scalar) {\n        switch (this.type) {\n            case 'space':\n            case 'comment':\n            case 'newline':\n                scalar.props.push(this.sourceToken);\n                return;\n            case 'scalar':\n                scalar.source = this.source;\n                // block-scalar source includes trailing newline\n                this.atNewLine = true;\n                this.indent = 0;\n                if (this.onNewLine) {\n                    let nl = this.source.indexOf('\\n') + 1;\n                    while (nl !== 0) {\n                        this.onNewLine(this.offset + nl);\n                        nl = this.source.indexOf('\\n', nl) + 1;\n                    }\n                }\n                yield* this.pop();\n                break;\n            /* istanbul ignore next should not happen */\n            default:\n                yield* this.pop();\n                yield* this.step();\n        }\n    }\n    *blockMap(map) {\n        const it = map.items[map.items.length - 1];\n        // it.sep is true-ish if pair already has key or : separator\n        switch (this.type) {\n            case 'newline':\n                this.onKeyLine = false;\n                if (it.value) {\n                    const end = 'end' in it.value ? it.value.end : undefined;\n                    const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n                    if (last?.type === 'comment')\n                        end?.push(this.sourceToken);\n                    else\n                        map.items.push({ start: [this.sourceToken] });\n                }\n                else if (it.sep) {\n                    it.sep.push(this.sourceToken);\n                }\n                else {\n                    it.start.push(this.sourceToken);\n                }\n                return;\n            case 'space':\n            case 'comment':\n                if (it.value) {\n                    map.items.push({ start: [this.sourceToken] });\n                }\n                else if (it.sep) {\n                    it.sep.push(this.sourceToken);\n                }\n                else {\n                    if (this.atIndentedComment(it.start, map.indent)) {\n                        const prev = map.items[map.items.length - 2];\n                        const end = prev?.value?.end;\n                        if (Array.isArray(end)) {\n                            Array.prototype.push.apply(end, it.start);\n                            end.push(this.sourceToken);\n                            map.items.pop();\n                            return;\n                        }\n                    }\n                    it.start.push(this.sourceToken);\n                }\n                return;\n        }\n        if (this.indent >= map.indent) {\n            const atMapIndent = !this.onKeyLine && this.indent === map.indent;\n            const atNextItem = atMapIndent &&\n                (it.sep || it.explicitKey) &&\n                this.type !== 'seq-item-ind';\n            // For empty nodes, assign newline-separated not indented empty tokens to following node\n            let start = [];\n            if (atNextItem && it.sep && !it.value) {\n                const nl = [];\n                for (let i = 0; i < it.sep.length; ++i) {\n                    const st = it.sep[i];\n                    switch (st.type) {\n                        case 'newline':\n                            nl.push(i);\n                            break;\n                        case 'space':\n                            break;\n                        case 'comment':\n                            if (st.indent > map.indent)\n                                nl.length = 0;\n                            break;\n                        default:\n                            nl.length = 0;\n                    }\n                }\n                if (nl.length >= 2)\n                    start = it.sep.splice(nl[1]);\n            }\n            switch (this.type) {\n                case 'anchor':\n                case 'tag':\n                    if (atNextItem || it.value) {\n                        start.push(this.sourceToken);\n                        map.items.push({ start });\n                        this.onKeyLine = true;\n                    }\n                    else if (it.sep) {\n                        it.sep.push(this.sourceToken);\n                    }\n                    else {\n                        it.start.push(this.sourceToken);\n                    }\n                    return;\n                case 'explicit-key-ind':\n                    if (!it.sep && !it.explicitKey) {\n                        it.start.push(this.sourceToken);\n                        it.explicitKey = true;\n                    }\n                    else if (atNextItem || it.value) {\n                        start.push(this.sourceToken);\n                        map.items.push({ start, explicitKey: true });\n                    }\n                    else {\n                        this.stack.push({\n                            type: 'block-map',\n                            offset: this.offset,\n                            indent: this.indent,\n                            items: [{ start: [this.sourceToken], explicitKey: true }]\n                        });\n                    }\n                    this.onKeyLine = true;\n                    return;\n                case 'map-value-ind':\n                    if (it.explicitKey) {\n                        if (!it.sep) {\n                            if (includesToken(it.start, 'newline')) {\n                                Object.assign(it, { key: null, sep: [this.sourceToken] });\n                            }\n                            else {\n                                const start = getFirstKeyStartProps(it.start);\n                                this.stack.push({\n                                    type: 'block-map',\n                                    offset: this.offset,\n                                    indent: this.indent,\n                                    items: [{ start, key: null, sep: [this.sourceToken] }]\n                                });\n                            }\n                        }\n                        else if (it.value) {\n                            map.items.push({ start: [], key: null, sep: [this.sourceToken] });\n                        }\n                        else if (includesToken(it.sep, 'map-value-ind')) {\n                            this.stack.push({\n                                type: 'block-map',\n                                offset: this.offset,\n                                indent: this.indent,\n                                items: [{ start, key: null, sep: [this.sourceToken] }]\n                            });\n                        }\n                        else if (isFlowToken(it.key) &&\n                            !includesToken(it.sep, 'newline')) {\n                            const start = getFirstKeyStartProps(it.start);\n                            const key = it.key;\n                            const sep = it.sep;\n                            sep.push(this.sourceToken);\n                            // @ts-expect-error type guard is wrong here\n                            delete it.key;\n                            // @ts-expect-error type guard is wrong here\n                            delete it.sep;\n                            this.stack.push({\n                                type: 'block-map',\n                                offset: this.offset,\n                                indent: this.indent,\n                                items: [{ start, key, sep }]\n                            });\n                        }\n                        else if (start.length > 0) {\n                            // Not actually at next item\n                            it.sep = it.sep.concat(start, this.sourceToken);\n                        }\n                        else {\n                            it.sep.push(this.sourceToken);\n                        }\n                    }\n                    else {\n                        if (!it.sep) {\n                            Object.assign(it, { key: null, sep: [this.sourceToken] });\n                        }\n                        else if (it.value || atNextItem) {\n                            map.items.push({ start, key: null, sep: [this.sourceToken] });\n                        }\n                        else if (includesToken(it.sep, 'map-value-ind')) {\n                            this.stack.push({\n                                type: 'block-map',\n                                offset: this.offset,\n                                indent: this.indent,\n                                items: [{ start: [], key: null, sep: [this.sourceToken] }]\n                            });\n                        }\n                        else {\n                            it.sep.push(this.sourceToken);\n                        }\n                    }\n                    this.onKeyLine = true;\n                    return;\n                case 'alias':\n                case 'scalar':\n                case 'single-quoted-scalar':\n                case 'double-quoted-scalar': {\n                    const fs = this.flowScalar(this.type);\n                    if (atNextItem || it.value) {\n                        map.items.push({ start, key: fs, sep: [] });\n                        this.onKeyLine = true;\n                    }\n                    else if (it.sep) {\n                        this.stack.push(fs);\n                    }\n                    else {\n                        Object.assign(it, { key: fs, sep: [] });\n                        this.onKeyLine = true;\n                    }\n                    return;\n                }\n                default: {\n                    const bv = this.startBlockValue(map);\n                    if (bv) {\n                        if (bv.type === 'block-seq') {\n                            if (!it.explicitKey &&\n                                it.sep &&\n                                !includesToken(it.sep, 'newline')) {\n                                yield* this.pop({\n                                    type: 'error',\n                                    offset: this.offset,\n                                    message: 'Unexpected block-seq-ind on same line with key',\n                                    source: this.source\n                                });\n                                return;\n                            }\n                        }\n                        else if (atMapIndent) {\n                            map.items.push({ start });\n                        }\n                        this.stack.push(bv);\n                        return;\n                    }\n                }\n            }\n        }\n        yield* this.pop();\n        yield* this.step();\n    }\n    *blockSequence(seq) {\n        const it = seq.items[seq.items.length - 1];\n        switch (this.type) {\n            case 'newline':\n                if (it.value) {\n                    const end = 'end' in it.value ? it.value.end : undefined;\n                    const last = Array.isArray(end) ? end[end.length - 1] : undefined;\n                    if (last?.type === 'comment')\n                        end?.push(this.sourceToken);\n                    else\n                        seq.items.push({ start: [this.sourceToken] });\n                }\n                else\n                    it.start.push(this.sourceToken);\n                return;\n            case 'space':\n            case 'comment':\n                if (it.value)\n                    seq.items.push({ start: [this.sourceToken] });\n                else {\n                    if (this.atIndentedComment(it.start, seq.indent)) {\n                        const prev = seq.items[seq.items.length - 2];\n                        const end = prev?.value?.end;\n                        if (Array.isArray(end)) {\n                            Array.prototype.push.apply(end, it.start);\n                            end.push(this.sourceToken);\n                            seq.items.pop();\n                            return;\n                        }\n                    }\n                    it.start.push(this.sourceToken);\n                }\n                return;\n            case 'anchor':\n            case 'tag':\n                if (it.value || this.indent <= seq.indent)\n                    break;\n                it.start.push(this.sourceToken);\n                return;\n            case 'seq-item-ind':\n                if (this.indent !== seq.indent)\n                    break;\n                if (it.value || includesToken(it.start, 'seq-item-ind'))\n                    seq.items.push({ start: [this.sourceToken] });\n                else\n                    it.start.push(this.sourceToken);\n                return;\n        }\n        if (this.indent > seq.indent) {\n            const bv = this.startBlockValue(seq);\n            if (bv) {\n                this.stack.push(bv);\n                return;\n            }\n        }\n        yield* this.pop();\n        yield* this.step();\n    }\n    *flowCollection(fc) {\n        const it = fc.items[fc.items.length - 1];\n        if (this.type === 'flow-error-end') {\n            let top;\n            do {\n                yield* this.pop();\n                top = this.peek(1);\n            } while (top?.type === 'flow-collection');\n        }\n        else if (fc.end.length === 0) {\n            switch (this.type) {\n                case 'comma':\n                case 'explicit-key-ind':\n                    if (!it || it.sep)\n                        fc.items.push({ start: [this.sourceToken] });\n                    else\n                        it.start.push(this.sourceToken);\n                    return;\n                case 'map-value-ind':\n                    if (!it || it.value)\n                        fc.items.push({ start: [], key: null, sep: [this.sourceToken] });\n                    else if (it.sep)\n                        it.sep.push(this.sourceToken);\n                    else\n                        Object.assign(it, { key: null, sep: [this.sourceToken] });\n                    return;\n                case 'space':\n                case 'comment':\n                case 'newline':\n                case 'anchor':\n                case 'tag':\n                    if (!it || it.value)\n                        fc.items.push({ start: [this.sourceToken] });\n                    else if (it.sep)\n                        it.sep.push(this.sourceToken);\n                    else\n                        it.start.push(this.sourceToken);\n                    return;\n                case 'alias':\n                case 'scalar':\n                case 'single-quoted-scalar':\n                case 'double-quoted-scalar': {\n                    const fs = this.flowScalar(this.type);\n                    if (!it || it.value)\n                        fc.items.push({ start: [], key: fs, sep: [] });\n                    else if (it.sep)\n                        this.stack.push(fs);\n                    else\n                        Object.assign(it, { key: fs, sep: [] });\n                    return;\n                }\n                case 'flow-map-end':\n                case 'flow-seq-end':\n                    fc.end.push(this.sourceToken);\n                    return;\n            }\n            const bv = this.startBlockValue(fc);\n            /* istanbul ignore else should not happen */\n            if (bv)\n                this.stack.push(bv);\n            else {\n                yield* this.pop();\n                yield* this.step();\n            }\n        }\n        else {\n            const parent = this.peek(2);\n            if (parent.type === 'block-map' &&\n                ((this.type === 'map-value-ind' && parent.indent === fc.indent) ||\n                    (this.type === 'newline' &&\n                        !parent.items[parent.items.length - 1].sep))) {\n                yield* this.pop();\n                yield* this.step();\n            }\n            else if (this.type === 'map-value-ind' &&\n                parent.type !== 'flow-collection') {\n                const prev = getPrevProps(parent);\n                const start = getFirstKeyStartProps(prev);\n                fixFlowSeqItems(fc);\n                const sep = fc.end.splice(1, fc.end.length);\n                sep.push(this.sourceToken);\n                const map = {\n                    type: 'block-map',\n                    offset: fc.offset,\n                    indent: fc.indent,\n                    items: [{ start, key: fc, sep }]\n                };\n                this.onKeyLine = true;\n                this.stack[this.stack.length - 1] = map;\n            }\n            else {\n                yield* this.lineEnd(fc);\n            }\n        }\n    }\n    flowScalar(type) {\n        if (this.onNewLine) {\n            let nl = this.source.indexOf('\\n') + 1;\n            while (nl !== 0) {\n                this.onNewLine(this.offset + nl);\n                nl = this.source.indexOf('\\n', nl) + 1;\n            }\n        }\n        return {\n            type,\n            offset: this.offset,\n            indent: this.indent,\n            source: this.source\n        };\n    }\n    startBlockValue(parent) {\n        switch (this.type) {\n            case 'alias':\n            case 'scalar':\n            case 'single-quoted-scalar':\n            case 'double-quoted-scalar':\n                return this.flowScalar(this.type);\n            case 'block-scalar-header':\n                return {\n                    type: 'block-scalar',\n                    offset: this.offset,\n                    indent: this.indent,\n                    props: [this.sourceToken],\n                    source: ''\n                };\n            case 'flow-map-start':\n            case 'flow-seq-start':\n                return {\n                    type: 'flow-collection',\n                    offset: this.offset,\n                    indent: this.indent,\n                    start: this.sourceToken,\n                    items: [],\n                    end: []\n                };\n            case 'seq-item-ind':\n                return {\n                    type: 'block-seq',\n                    offset: this.offset,\n                    indent: this.indent,\n                    items: [{ start: [this.sourceToken] }]\n                };\n            case 'explicit-key-ind': {\n                this.onKeyLine = true;\n                const prev = getPrevProps(parent);\n                const start = getFirstKeyStartProps(prev);\n                start.push(this.sourceToken);\n                return {\n                    type: 'block-map',\n                    offset: this.offset,\n                    indent: this.indent,\n                    items: [{ start, explicitKey: true }]\n                };\n            }\n            case 'map-value-ind': {\n                this.onKeyLine = true;\n                const prev = getPrevProps(parent);\n                const start = getFirstKeyStartProps(prev);\n                return {\n                    type: 'block-map',\n                    offset: this.offset,\n                    indent: this.indent,\n                    items: [{ start, key: null, sep: [this.sourceToken] }]\n                };\n            }\n        }\n        return null;\n    }\n    atIndentedComment(start, indent) {\n        if (this.type !== 'comment')\n            return false;\n        if (this.indent <= indent)\n            return false;\n        return start.every(st => st.type === 'newline' || st.type === 'space');\n    }\n    *documentEnd(docEnd) {\n        if (this.type !== 'doc-mode') {\n            if (docEnd.end)\n                docEnd.end.push(this.sourceToken);\n            else\n                docEnd.end = [this.sourceToken];\n            if (this.type === 'newline')\n                yield* this.pop();\n        }\n    }\n    *lineEnd(token) {\n        switch (this.type) {\n            case 'comma':\n            case 'doc-start':\n            case 'doc-end':\n            case 'flow-seq-end':\n            case 'flow-map-end':\n            case 'map-value-ind':\n                yield* this.pop();\n                yield* this.step();\n                break;\n            case 'newline':\n                this.onKeyLine = false;\n            // fallthrough\n            case 'space':\n            case 'comment':\n            default:\n                // all other values are errors\n                if (token.end)\n                    token.end.push(this.sourceToken);\n                else\n                    token.end = [this.sourceToken];\n                if (this.type === 'newline')\n                    yield* this.pop();\n        }\n    }\n}\n\nexports.Parser = Parser;\n","'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar errors = require('./errors.js');\nvar log = require('./log.js');\nvar identity = require('./nodes/identity.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\n\nfunction parseOptions(options) {\n    const prettyErrors = options.prettyErrors !== false;\n    const lineCounter$1 = options.lineCounter || (prettyErrors && new lineCounter.LineCounter()) || null;\n    return { lineCounter: lineCounter$1, prettyErrors };\n}\n/**\n * Parse the input as a stream of YAML documents.\n *\n * Documents should be separated from each other by `...` or `---` marker lines.\n *\n * @returns If an empty `docs` array is returned, it will be of type\n *   EmptyStream and contain additional stream information. In\n *   TypeScript, you should use `'empty' in docs` as a type guard for it.\n */\nfunction parseAllDocuments(source, options = {}) {\n    const { lineCounter, prettyErrors } = parseOptions(options);\n    const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n    const composer$1 = new composer.Composer(options);\n    const docs = Array.from(composer$1.compose(parser$1.parse(source)));\n    if (prettyErrors && lineCounter)\n        for (const doc of docs) {\n            doc.errors.forEach(errors.prettifyError(source, lineCounter));\n            doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n        }\n    if (docs.length > 0)\n        return docs;\n    return Object.assign([], { empty: true }, composer$1.streamInfo());\n}\n/** Parse an input string into a single YAML.Document */\nfunction parseDocument(source, options = {}) {\n    const { lineCounter, prettyErrors } = parseOptions(options);\n    const parser$1 = new parser.Parser(lineCounter?.addNewLine);\n    const composer$1 = new composer.Composer(options);\n    // `doc` is always set by compose.end(true) at the very latest\n    let doc = null;\n    for (const _doc of composer$1.compose(parser$1.parse(source), true, source.length)) {\n        if (!doc)\n            doc = _doc;\n        else if (doc.options.logLevel !== 'silent') {\n            doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0, 2), 'MULTIPLE_DOCS', 'Source contains multiple documents; please use YAML.parseAllDocuments()'));\n            break;\n        }\n    }\n    if (prettyErrors && lineCounter) {\n        doc.errors.forEach(errors.prettifyError(source, lineCounter));\n        doc.warnings.forEach(errors.prettifyError(source, lineCounter));\n    }\n    return doc;\n}\nfunction parse(src, reviver, options) {\n    let _reviver = undefined;\n    if (typeof reviver === 'function') {\n        _reviver = reviver;\n    }\n    else if (options === undefined && reviver && typeof reviver === 'object') {\n        options = reviver;\n    }\n    const doc = parseDocument(src, options);\n    if (!doc)\n        return null;\n    doc.warnings.forEach(warning => log.warn(doc.options.logLevel, warning));\n    if (doc.errors.length > 0) {\n        if (doc.options.logLevel !== 'silent')\n            throw doc.errors[0];\n        else\n            doc.errors = [];\n    }\n    return doc.toJS(Object.assign({ reviver: _reviver }, options));\n}\nfunction stringify(value, replacer, options) {\n    let _replacer = null;\n    if (typeof replacer === 'function' || Array.isArray(replacer)) {\n        _replacer = replacer;\n    }\n    else if (options === undefined && replacer) {\n        options = replacer;\n    }\n    if (typeof options === 'string')\n        options = options.length;\n    if (typeof options === 'number') {\n        const indent = Math.round(options);\n        options = indent < 1 ? undefined : indent > 8 ? { indent: 8 } : { indent };\n    }\n    if (value === undefined) {\n        const { keepUndefined } = options ?? replacer ?? {};\n        if (!keepUndefined)\n            return undefined;\n    }\n    if (identity.isDocument(value) && !_replacer)\n        return value.toString(options);\n    return new Document.Document(value, _replacer, options).toString(options);\n}\n\nexports.parse = parse;\nexports.parseAllDocuments = parseAllDocuments;\nexports.parseDocument = parseDocument;\nexports.stringify = stringify;\n","'use strict';\n\nvar composer = require('./compose/composer.js');\nvar Document = require('./doc/Document.js');\nvar Schema = require('./schema/Schema.js');\nvar errors = require('./errors.js');\nvar Alias = require('./nodes/Alias.js');\nvar identity = require('./nodes/identity.js');\nvar Pair = require('./nodes/Pair.js');\nvar Scalar = require('./nodes/Scalar.js');\nvar YAMLMap = require('./nodes/YAMLMap.js');\nvar YAMLSeq = require('./nodes/YAMLSeq.js');\nvar cst = require('./parse/cst.js');\nvar lexer = require('./parse/lexer.js');\nvar lineCounter = require('./parse/line-counter.js');\nvar parser = require('./parse/parser.js');\nvar publicApi = require('./public-api.js');\nvar visit = require('./visit.js');\n\n\n\nexports.Composer = composer.Composer;\nexports.Document = Document.Document;\nexports.Schema = Schema.Schema;\nexports.YAMLError = errors.YAMLError;\nexports.YAMLParseError = errors.YAMLParseError;\nexports.YAMLWarning = errors.YAMLWarning;\nexports.Alias = Alias.Alias;\nexports.isAlias = identity.isAlias;\nexports.isCollection = identity.isCollection;\nexports.isDocument = identity.isDocument;\nexports.isMap = identity.isMap;\nexports.isNode = identity.isNode;\nexports.isPair = identity.isPair;\nexports.isScalar = identity.isScalar;\nexports.isSeq = identity.isSeq;\nexports.Pair = Pair.Pair;\nexports.Scalar = Scalar.Scalar;\nexports.YAMLMap = YAMLMap.YAMLMap;\nexports.YAMLSeq = YAMLSeq.YAMLSeq;\nexports.CST = cst;\nexports.Lexer = lexer.Lexer;\nexports.LineCounter = lineCounter.LineCounter;\nexports.Parser = parser.Parser;\nexports.parse = publicApi.parse;\nexports.parseAllDocuments = publicApi.parseAllDocuments;\nexports.parseDocument = publicApi.parseDocument;\nexports.stringify = publicApi.stringify;\nexports.visit = visit.visit;\nexports.visitAsync = visit.visitAsync;\n","/**\n * Hybrid BASE reconstruction for ghost commits.\n *\n * When a patch's base generation tree is unreachable (GC'd after squash merge,\n * shallow clone), we reconstruct BASE and THEIRS from the unified diff and\n * the current OURS content on disk.\n *\n * The unified diff encodes:\n *   - BASE = context lines + removed lines\n *   - THEIRS = context lines + added lines\n *\n * By matching context lines against OURS, we anchor hunks to positions in the\n * current file and fill gaps with OURS content, producing hybrid BASE and\n * THEIRS suitable for threeWayMerge().\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DiffHunk {\n    /** 1-based line number in the old (BASE) file where this hunk starts */\n    oldStart: number;\n    /** Number of lines in the old (BASE) file this hunk spans */\n    oldCount: number;\n    /** 1-based line number in the new (THEIRS) file where this hunk starts */\n    newStart: number;\n    /** Number of lines in the new (THEIRS) file this hunk spans */\n    newCount: number;\n    /** Ordered entries: context lines, removed lines, added lines */\n    lines: HunkLine[];\n}\n\nexport type HunkLine =\n    | { type: \"context\"; content: string }\n    | { type: \"remove\"; content: string }\n    | { type: \"add\"; content: string };\n\nexport interface LocatedHunk {\n    hunk: DiffHunk;\n    /** 0-based index in OURS lines where this hunk's context starts */\n    oursOffset: number;\n    /** Number of OURS lines this hunk covers */\n    oursSpan: number;\n}\n\nexport interface ReconstructionResult {\n    base: string;\n    theirs: string;\n}\n\n// ---------------------------------------------------------------------------\n// 1. Hunk Parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a unified diff (for a single file) into structured hunks.\n * Input should start with `diff --git` and contain `@@` hunk headers.\n */\nexport function parseHunks(fileDiff: string): DiffHunk[] {\n    const lines = fileDiff.split(\"\\n\");\n    const hunks: DiffHunk[] = [];\n    let currentHunk: DiffHunk | null = null;\n\n    for (const line of lines) {\n        const headerMatch = line.match(\n            /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/\n        );\n        if (headerMatch) {\n            if (currentHunk) {\n                hunks.push(currentHunk);\n            }\n            currentHunk = {\n                oldStart: parseInt(headerMatch[1]!, 10),\n                oldCount: headerMatch[2] != null ? parseInt(headerMatch[2], 10) : 1,\n                newStart: parseInt(headerMatch[3]!, 10),\n                newCount: headerMatch[4] != null ? parseInt(headerMatch[4], 10) : 1,\n                lines: []\n            };\n            continue;\n        }\n\n        if (!currentHunk) continue;\n\n        // Skip metadata lines\n        if (\n            line.startsWith(\"diff --git\") ||\n            line.startsWith(\"index \") ||\n            line.startsWith(\"---\") ||\n            line.startsWith(\"+++\") ||\n            line.startsWith(\"old mode\") ||\n            line.startsWith(\"new mode\") ||\n            line.startsWith(\"similarity index\") ||\n            line.startsWith(\"rename from\") ||\n            line.startsWith(\"rename to\") ||\n            line.startsWith(\"new file mode\") ||\n            line.startsWith(\"deleted file mode\")\n        ) {\n            continue;\n        }\n\n        if (line === \"\\\\ No newline at end of file\") {\n            continue;\n        }\n\n        if (line.startsWith(\"-\")) {\n            currentHunk.lines.push({ type: \"remove\", content: line.slice(1) });\n        } else if (line.startsWith(\"+\")) {\n            currentHunk.lines.push({ type: \"add\", content: line.slice(1) });\n        } else if (line.startsWith(\" \") || line === \"\") {\n            // Context line. A bare empty string is a context line for an empty line\n            // (unified diff uses \" \" prefix but trailing whitespace stripping may remove it).\n            currentHunk.lines.push({\n                type: \"context\",\n                content: line.startsWith(\" \") ? line.slice(1) : line\n            });\n        }\n    }\n\n    if (currentHunk) {\n        hunks.push(currentHunk);\n    }\n\n    return hunks;\n}\n\n// ---------------------------------------------------------------------------\n// 2. Context Matcher\n// ---------------------------------------------------------------------------\n\nfunction extractLeadingContext(hunk: DiffHunk): string[] {\n    const result: string[] = [];\n    for (const line of hunk.lines) {\n        if (line.type !== \"context\") break;\n        result.push(line.content);\n    }\n    return result;\n}\n\nfunction extractTrailingContext(hunk: DiffHunk): string[] {\n    const result: string[] = [];\n    for (let i = hunk.lines.length - 1; i >= 0; i--) {\n        if (hunk.lines[i]!.type !== \"context\") break;\n        result.unshift(hunk.lines[i]!.content);\n    }\n    return result;\n}\n\nfunction countOursLinesBeforeTrailing(hunk: DiffHunk): number {\n    let count = 0;\n    const trailingStart = findTrailingContextStart(hunk);\n    for (let i = 0; i < trailingStart; i++) {\n        if (hunk.lines[i]!.type === \"context\") count++;\n    }\n    return count;\n}\n\nfunction findTrailingContextStart(hunk: DiffHunk): number {\n    let i = hunk.lines.length - 1;\n    while (i >= 0 && hunk.lines[i]!.type === \"context\") {\n        i--;\n    }\n    return i + 1;\n}\n\nfunction matchesAt(needle: string[], haystack: string[], offset: number): boolean {\n    for (let i = 0; i < needle.length; i++) {\n        if (haystack[offset + i] !== needle[i]) return false;\n    }\n    return true;\n}\n\n/**\n * Find a sequence of context lines in OURS, starting search near `hint`.\n * Returns 0-based index of the first matching line, or -1 if not found.\n */\nfunction findContextInOurs(\n    contextLines: string[],\n    oursLines: string[],\n    minIndex: number,\n    hint: number\n): number {\n    const SEARCH_WINDOW = 200;\n    const maxStart = oursLines.length - contextLines.length;\n\n    const clampedHint = Math.max(minIndex, Math.min(hint, maxStart));\n\n    // Check hint position first, then expand outward symmetrically\n    if (clampedHint >= minIndex && clampedHint <= maxStart) {\n        if (matchesAt(contextLines, oursLines, clampedHint)) {\n            return clampedHint;\n        }\n    }\n    for (let delta = 1; delta <= SEARCH_WINDOW; delta++) {\n        for (const sign of [1, -1] as const) {\n            const idx = clampedHint + delta * sign;\n            if (idx < minIndex || idx > maxStart) continue;\n            if (matchesAt(contextLines, oursLines, idx)) {\n                return idx;\n            }\n        }\n    }\n\n    return -1;\n}\n\n/**\n * Compute how many lines this hunk spans in OURS.\n */\nfunction computeOursSpan(\n    hunk: DiffHunk,\n    oursLines: string[],\n    oursOffset: number\n): number {\n    const leading = extractLeadingContext(hunk);\n    const trailing = extractTrailingContext(hunk);\n\n    if (trailing.length === 0) {\n        const contextCount = hunk.lines.filter(\n            (l) => l.type === \"context\"\n        ).length;\n        return Math.min(contextCount, oursLines.length - oursOffset);\n    }\n\n    // Find trailing context starting after leading context\n    const searchStart = oursOffset + leading.length;\n    for (let i = searchStart; i <= oursLines.length - trailing.length; i++) {\n        if (matchesAt(trailing, oursLines, i)) {\n            return i + trailing.length - oursOffset;\n        }\n    }\n\n    // Trailing context not found — fall back to context-only estimate\n    const contextCount = hunk.lines.filter(\n        (l) => l.type === \"context\"\n    ).length;\n    return Math.min(contextCount, oursLines.length - oursOffset);\n}\n\n/**\n * Locate each hunk's position in OURS by matching context lines.\n * Returns null if any hunk cannot be located.\n */\nexport function locateHunksInOurs(\n    hunks: DiffHunk[],\n    oursLines: string[]\n): LocatedHunk[] | null {\n    const located: LocatedHunk[] = [];\n    let minOursIndex = 0;\n\n    for (const hunk of hunks) {\n        const contextLines = extractLeadingContext(hunk);\n        let oursOffset: number;\n\n        if (contextLines.length > 0) {\n            const found = findContextInOurs(\n                contextLines,\n                oursLines,\n                minOursIndex,\n                hunk.newStart - 1\n            );\n            if (found === -1) {\n                // Try trailing context as fallback\n                const trailingContext = extractTrailingContext(hunk);\n                if (trailingContext.length > 0) {\n                    const trailingFound = findContextInOurs(\n                        trailingContext,\n                        oursLines,\n                        minOursIndex,\n                        hunk.newStart - 1\n                    );\n                    if (trailingFound === -1) return null;\n                    const nonTrailingCount = countOursLinesBeforeTrailing(hunk);\n                    oursOffset = trailingFound - nonTrailingCount;\n                    if (oursOffset < minOursIndex) return null;\n                } else {\n                    return null;\n                }\n            } else {\n                oursOffset = found;\n            }\n        } else if (hunk.oldStart === 1 && hunk.oldCount === 0) {\n            // Pure addition at start of file (or to empty file)\n            oursOffset = 0;\n        } else {\n            // No context lines — use @@ header as best guess\n            oursOffset = Math.max(hunk.newStart - 1, minOursIndex);\n        }\n\n        const oursSpan = computeOursSpan(hunk, oursLines, oursOffset);\n\n        located.push({ hunk, oursOffset, oursSpan });\n        minOursIndex = oursOffset + oursSpan;\n    }\n\n    return located;\n}\n\n// ---------------------------------------------------------------------------\n// 3. Assembler\n// ---------------------------------------------------------------------------\n\n/**\n * Assemble hybridBASE and hybridTHEIRS from located hunks and OURS.\n *\n * In gaps between hunks, BASE and THEIRS both get OURS content (3-way merge\n * treats gaps as \"no change\"). In hunk regions, BASE = context + removed,\n * THEIRS = context + added.\n */\nexport function assembleHybrid(\n    locatedHunks: LocatedHunk[],\n    oursLines: string[]\n): ReconstructionResult {\n    const baseLines: string[] = [];\n    const theirsLines: string[] = [];\n    let oursCursor = 0;\n\n    for (const { hunk, oursOffset, oursSpan } of locatedHunks) {\n        // Gap before this hunk: fill with OURS content\n        if (oursOffset > oursCursor) {\n            const gapLines = oursLines.slice(oursCursor, oursOffset);\n            baseLines.push(...gapLines);\n            theirsLines.push(...gapLines);\n        }\n\n        // Hunk region: extract BASE lines and THEIRS lines from the diff\n        for (const line of hunk.lines) {\n            switch (line.type) {\n                case \"context\":\n                    baseLines.push(line.content);\n                    theirsLines.push(line.content);\n                    break;\n                case \"remove\":\n                    baseLines.push(line.content);\n                    break;\n                case \"add\":\n                    theirsLines.push(line.content);\n                    break;\n            }\n        }\n\n        oursCursor = oursOffset + oursSpan;\n    }\n\n    // Trailing gap after last hunk\n    if (oursCursor < oursLines.length) {\n        const gapLines = oursLines.slice(oursCursor);\n        baseLines.push(...gapLines);\n        theirsLines.push(...gapLines);\n    }\n\n    return {\n        base: baseLines.join(\"\\n\"),\n        theirs: theirsLines.join(\"\\n\")\n    };\n}\n\n// ---------------------------------------------------------------------------\n// 4. Top-Level Entry Point\n// ---------------------------------------------------------------------------\n\n/**\n * Attempt to reconstruct BASE and THEIRS from a unified diff and OURS content.\n * Used when the patch's base generation tree is unreachable (ghost commit).\n *\n * Returns null if reconstruction fails (context mismatch, new/deleted file).\n */\nexport function reconstructFromGhostPatch(\n    fileDiff: string,\n    ours: string\n): ReconstructionResult | null {\n    const hunks = parseHunks(fileDiff);\n\n    if (hunks.length === 0) {\n        return null;\n    }\n\n    // Pure new-file diff — use extractNewFileFromPatch instead\n    const isPureAddition = hunks.every(\n        (h) => h.oldCount === 0 && h.lines.every((l) => l.type !== \"remove\")\n    );\n    if (isPureAddition) {\n        return null;\n    }\n\n    // Pure deletion\n    const isPureDeletion = hunks.every(\n        (h) => h.newCount === 0 && h.lines.every((l) => l.type !== \"add\")\n    );\n    if (isPureDeletion) {\n        const baseLines: string[] = [];\n        for (const hunk of hunks) {\n            for (const line of hunk.lines) {\n                if (line.type === \"context\" || line.type === \"remove\") {\n                    baseLines.push(line.content);\n                }\n            }\n        }\n        return {\n            base: baseLines.join(\"\\n\"),\n            theirs: \"\"\n        };\n    }\n\n    const oursLines = ours.split(\"\\n\");\n    const located = locateHunksInOurs(hunks, oursLines);\n\n    if (!located) {\n        return null;\n    }\n\n    return assembleHybrid(located, oursLines);\n}\n","import { mkdtemp, mkdir, writeFile, readFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { GitClient } from \"./git/GitClient.js\";\n\n/**\n * Apply a patch's `patch_content` to a base content string, returning the\n * post-apply (THEIRS) content.\n *\n * Free-function counterpart to `ReplayApplicator.applyPatchToContent`,\n * usable from `ReplayService.migratePatchesToSnapshot` without the\n * applicator's instance state. Creates its own temporary git repo each\n * call — fine for the one-shot migration path; not a hot loop.\n *\n * Returns `null` when the patch can't apply against the base (line\n * anchors don't match, malformed diff, or git apply rejects). Callers\n * fall back to a different THEIRS source.\n */\nexport async function applyPatchToContent(\n    base: string,\n    patchContent: string,\n    filePath: string,\n): Promise<string | null> {\n    const fileDiff = extractFileDiff(patchContent, filePath);\n    if (!fileDiff) return null;\n\n    const tempDir = await mkdtemp(join(tmpdir(), \"replay-migrate-\"));\n    const tempGit = new GitClient(tempDir);\n    try {\n        await tempGit.exec([\"init\"]);\n        await tempGit.exec([\"config\", \"user.email\", \"migrate@fern.com\"]);\n        await tempGit.exec([\"config\", \"user.name\", \"Fern Replay Migration\"]);\n        await tempGit.exec([\"config\", \"commit.gpgSign\", \"false\"]);\n\n        const tempFilePath = join(tempDir, filePath);\n        await mkdir(dirname(tempFilePath), { recursive: true });\n        await writeFile(tempFilePath, base);\n\n        await tempGit.exec([\"add\", filePath]);\n        await tempGit.exec([\"commit\", \"-m\", `base for ${filePath}`, \"--allow-empty\"]);\n\n        await tempGit.execWithInput([\"apply\", \"--allow-empty\"], fileDiff);\n\n        return await readFile(tempFilePath, \"utf-8\");\n    } catch {\n        return null;\n    } finally {\n        await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n    }\n}\n\n/**\n * Extract the diff hunks for `filePath` from a multi-file unified-diff\n * patch. Returns the slice starting at the file's `diff --git` header\n * up to the next `diff --git` (or end of input). Mirrors the logic in\n * `ReplayApplicator.extractFileDiff` — kept here for reuse without\n * exposing the private method.\n */\nfunction extractFileDiff(patchContent: string, filePath: string): string | null {\n    const lines = patchContent.split(\"\\n\");\n    const out: string[] = [];\n    let inTarget = false;\n    for (const line of lines) {\n        if (line.startsWith(\"diff --git\")) {\n            if (inTarget) break;\n            const match = line.match(/^diff --git a\\/.+ b\\/(.+)$/);\n            if (match && match[1] === filePath) {\n                inTarget = true;\n                out.push(line);\n            }\n            continue;\n        }\n        if (inTarget) out.push(line);\n    }\n    return out.length > 0 ? out.join(\"\\n\") + \"\\n\" : null;\n}\n","#!/usr/bin/env node\n\nimport { resolve as resolvePath } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\nimport { GitClient } from \"./git/GitClient.js\";\nimport { LockfileManager } from \"./LockfileManager.js\";\nimport { ReplayDetector } from \"./ReplayDetector.js\";\nimport { ReplayService } from \"./ReplayService.js\";\nimport { FernignoreMigrator } from \"./FernignoreMigrator.js\";\nimport { bootstrap } from \"./commands/bootstrap.js\";\nimport { forget, type MatchedPatch } from \"./commands/forget.js\";\nimport { reset } from \"./commands/reset.js\";\nimport { resolve as resolveConflicts } from \"./commands/resolve.js\";\nimport { status, type StatusResult } from \"./commands/status.js\";\n\nconst COMMANDS = [\"bootstrap\", \"status\", \"detect\", \"replay\", \"migrate\", \"forget\", \"reset\", \"resolve\"] as const;\ntype Command = (typeof COMMANDS)[number];\n\nfunction usage(): void {\n    console.log(`Usage: fern-replay <command> <sdk-dir> [options]\n\nCommands:\n  bootstrap   Initialize Replay for an existing SDK repository\n  status      Show tracked patches and generation info\n  detect      Detect new customization patches (dry-run)\n  replay      Run full replay (detect + apply patches)\n  migrate     Analyze .fernignore migration\n  forget      Remove specific patches (by ID, search, or --all)\n  reset       Remove all Replay state (nuclear option)\n  resolve     Finish replay after manually resolving conflicts\n\nOptions:\n  --dry-run         Report what would happen without modifying anything\n  --import-history  Scan git history for existing patches (migration use case)\n  --no-check        Skip conflict marker check (resolve command only)\n  --migrate-fernignore  Move untrackable .fernignore patterns to replay.yml\n  --max-commits <n>     Max commits to scan (default: 500)\n  --all               Remove all tracked patches (forget only)\n  --yes, -y           Skip interactive selection/confirmation (forget only)\n\nExamples:\n  fern-replay bootstrap ./my-sdk\n  fern-replay bootstrap ./my-sdk --import-history\n  fern-replay bootstrap ./my-sdk --import-history --dry-run\n  fern-replay status ./my-sdk\n  fern-replay detect ./my-sdk\n  fern-replay replay ./my-sdk --dry-run\n  fern-replay migrate ./my-sdk\n  fern-replay forget ./my-sdk patch-def45678\n  fern-replay forget ./my-sdk \"src/utils/retry.ts\"\n  fern-replay forget ./my-sdk --all\n  fern-replay reset ./my-sdk\n  fern-replay reset ./my-sdk --dry-run`);\n}\n\ninterface ParsedArgs {\n    command: Command;\n    dir: string;\n    flags: Record<string, string | boolean>;\n    /** Extra positional args (e.g., patch IDs or search pattern for forget) */\n    positionals: string[];\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n    const args = argv.slice(2);\n\n    if (args.length === 0 || args[0] === \"--help\" || args[0] === \"-h\") {\n        usage();\n        process.exit(0);\n    }\n\n    const command = args[0] as Command;\n    if (!COMMANDS.includes(command)) {\n        console.error(`Unknown command: ${command}\\n`);\n        usage();\n        process.exit(1);\n    }\n\n    const dir = args[1];\n    if (!dir) {\n        console.error(`Missing <sdk-dir> argument\\n`);\n        usage();\n        process.exit(1);\n    }\n\n    const flags: Record<string, string | boolean> = {};\n    const positionals: string[] = [];\n\n    for (let i = 2; i < args.length; i++) {\n        const arg = args[i]!;\n        if (arg === \"--dry-run\") {\n            flags.dryRun = true;\n        } else if (arg === \"--migrate-fernignore\") {\n            flags.migrateFernignore = true;\n        } else if (arg === \"--max-commits\" && args[i + 1]) {\n            flags.maxCommits = args[++i]!;\n        } else if (arg === \"--import-history\") {\n            flags.importHistory = true;\n        } else if (arg === \"--force\") {\n            flags.force = true;\n        } else if (arg === \"--no-check\") {\n            flags.noCheck = true;\n        } else if (arg === \"--verbose\" || arg === \"-v\") {\n            flags.verbose = true;\n        } else if (arg === \"--all\") {\n            flags.all = true;\n        } else if (arg === \"--yes\" || arg === \"-y\") {\n            flags.yes = true;\n        } else if (!arg.startsWith(\"--\")) {\n            positionals.push(arg);\n        }\n    }\n\n    return { command, dir: resolvePath(dir), flags, positionals };\n}\n\nasync function runBootstrap(dir: string, flags: Record<string, string | boolean>): Promise<void> {\n    const dryRun = !!flags.dryRun;\n    const importHistory = !!flags.importHistory;\n    const maxCommits = flags.maxCommits ? parseInt(flags.maxCommits as string, 10) : undefined;\n    const fernignoreAction = flags.migrateFernignore ? \"migrate\" as const : \"skip\" as const;\n\n    console.log(`Bootstrapping Replay for: ${dir}`);\n    if (dryRun) console.log(\"(dry-run mode)\\n\");\n    else console.log();\n\n    const force = !!flags.force;\n    const result = await bootstrap(dir, { dryRun, importHistory, maxCommitsToScan: maxCommits, fernignoreAction, force });\n\n    if (!result.generationCommit) {\n        console.log(\"No generation commits found.\");\n        if (result.warnings.length > 0) {\n            for (const w of result.warnings) console.log(`  ${w}`);\n        }\n        return;\n    }\n\n    console.log(`Generation commit: ${result.generationCommit.sha.slice(0, 7)} \"${result.generationCommit.message.slice(0, 60)}\"`);\n\n    if (importHistory) {\n        console.log(`Scanned commits since: ${result.scannedSinceGeneration.slice(0, 7)} (last generation)`);\n        if (result.staleGenerationsSkipped > 0) {\n            console.log(`Skipped ${result.staleGenerationsSkipped} older generation(s) — only tracking recent commits`);\n        }\n        console.log(`Patches ${dryRun ? \"detected\" : \"created\"}: ${dryRun ? result.patchesDetected : result.patchesCreated}`);\n\n        if (result.patches.length > 0) {\n            console.log(\"\\nPatches:\");\n            for (const patch of result.patches) {\n                console.log(`  ${patch.id}: \"${patch.original_message.slice(0, 50)}\" (${patch.files.length} files)`);\n                for (const f of patch.files) {\n                    console.log(`    ${f}`);\n                }\n            }\n        }\n\n        if (result.fernignorePatterns.length > 0) {\n            console.log(`\\n.fernignore: ${result.fernignorePatterns.length} patterns`);\n            if (result.fernignoreAnalysis) {\n                console.log(`  Can track: ${result.fernignoreAnalysis.trackedByBoth.length}`);\n                console.log(`  Need exclude: ${result.fernignoreAnalysis.fernignoreOnly.length}`);\n                console.log(`  Unprotected: ${result.fernignoreAnalysis.commitsOnly.length}`);\n            }\n        }\n    } else {\n        console.log(\"Clean start — tracking future edits only.\");\n        console.log(\"Use --import-history to scan git history for existing patches.\");\n    }\n\n    if (result.warnings.length > 0) {\n        console.log(\"\\nWarnings:\");\n        for (const w of result.warnings) console.log(`  ${w}`);\n    }\n}\n\nasync function runStatus(dir: string, flags: Record<string, string | boolean>): Promise<void> {\n    const result = status(dir);\n    const verbose = !!flags.verbose;\n\n    if (!result.initialized) {\n        console.log(\"Replay is not initialized. Run 'fern replay init' to get started.\");\n        return;\n    }\n\n    // Header\n    console.log(\"Replay: initialized\");\n\n    // Last generation info\n    if (result.lastGeneration) {\n        const gen = result.lastGeneration;\n        if (verbose) {\n            console.log(`Last generation: ${gen.sha} (${gen.timestamp})`);\n            console.log(`  CLI: ${gen.cliVersion}`);\n            for (const [name, ver] of Object.entries(gen.generatorVersions)) {\n                console.log(`  ${name}: ${ver}`);\n            }\n            console.log(`Generations tracked: ${result.generationCount}`);\n        } else {\n            const genVersions = Object.entries(gen.generatorVersions);\n            const versionSuffix = genVersions.length > 0\n                ? `, ${genVersions[0]![0]}@${genVersions[0]![1]}`\n                : \"\";\n            console.log(`Last generation: ${gen.sha} (${gen.timestamp}${versionSuffix})`);\n        }\n    }\n\n    // Patches summary\n    if (result.patches.length === 0) {\n        console.log(\"\\nNo customizations tracked. Edit SDK files and commit \\u2014 Replay will detect them on next generation.\");\n        printDismissedSection(result);\n        return;\n    }\n\n    const unresolvedSuffix = result.unresolvedCount > 0\n        ? `, ${result.unresolvedCount} unresolved`\n        : \"\";\n    console.log(`\\nPatches: ${result.patches.length} tracked${unresolvedSuffix}`);\n\n    if (verbose) {\n        // Verbose: all patches with full details\n        for (const patch of result.patches) {\n            const prefix = patch.status ? \"\\u26A0 \" : \"  \";\n            console.log(`\\n${prefix}${patch.id}  [${patch.type}]  \"${patch.message}\"`);\n            console.log(`    by ${patch.author} (${patch.sha})`);\n            for (const f of patch.files) {\n                console.log(`    ${f}`);\n            }\n            if (patch.status) {\n                console.log(\"    Run `fern replay resolve` to fix.\");\n            }\n        }\n\n        // Exclude patterns\n        if (result.excludePatterns.length > 0) {\n            console.log(\"\\nExclude patterns (from replay.yml):\");\n            for (const p of result.excludePatterns) {\n                console.log(`  ${p}`);\n            }\n        }\n    } else {\n        // Compact: max 10 patches as one-liners\n        console.log(\"\");\n        const maxDisplay = 10;\n        const displayPatches = result.patches.slice(0, maxDisplay);\n        for (const patch of displayPatches) {\n            const prefix = patch.status ? \"\\u26A0 \" : \"  \";\n            const filesLabel = patch.fileCount === 1 ? \"1 file\" : `${patch.fileCount} files`;\n            console.log(`${prefix}${patch.id}  \"${patch.message}\"  ${filesLabel}`);\n        }\n        if (result.patches.length > maxDisplay) {\n            console.log(`  ... and ${result.patches.length - maxDisplay} more`);\n        }\n    }\n\n    printDismissedSection(result);\n}\n\n/**\n * Render the \"Dismissed customizations\" section of `status` — customizations\n * the customer permanently retired (via `forget`, or by keeping the\n * generator's version during conflict resolution). Prints nothing when there\n * are no dismissals.\n */\nfunction printDismissedSection(result: StatusResult): void {\n    if (result.dismissed.length === 0 && result.legacyDismissedCount === 0) {\n        return;\n    }\n    const total = result.dismissed.length + result.legacyDismissedCount;\n    console.log(`\\nDismissed customizations: ${total}`);\n    for (const d of result.dismissed) {\n        const shaSuffix = d.sha ? ` (${d.sha})` : \"\";\n        const date = d.dismissedAt ? d.dismissedAt.slice(0, 10) : \"\";\n        const dateSuffix = date ? ` on ${date}` : \"\";\n        console.log(`  \"${d.message}\"${shaSuffix} — dismissed via ${d.via}${dateSuffix}`);\n    }\n    if (result.legacyDismissedCount > 0) {\n        console.log(\n            `  ... and ${result.legacyDismissedCount} dismissed before this version — details unavailable`\n        );\n    }\n}\n\nasync function runDetect(dir: string): Promise<void> {\n    const lockManager = new LockfileManager(dir);\n\n    if (!lockManager.exists()) {\n        console.log(\"Replay is not initialized. Run 'fern-replay bootstrap <dir>' first.\");\n        return;\n    }\n\n    lockManager.read();\n    const git = new GitClient(dir);\n    const detector = new ReplayDetector(git, lockManager, dir);\n    const { patches, revertedPatchIds } = await detector.detectNewPatches();\n\n    printDegradedBanner(detector.degradedReasons);\n\n    if (detector.warnings.length > 0) {\n        for (const w of detector.warnings) console.log(`Warning: ${w}`);\n        console.log();\n    }\n\n    if (revertedPatchIds.length > 0) {\n        console.log(`Reverted patches: ${revertedPatchIds.length}`);\n    }\n\n    console.log(`Detected ${patches.length} new patch(es) since last generation:\\n`);\n\n    if (patches.length === 0) {\n        console.log(\"No new customizations found.\");\n        return;\n    }\n\n    for (const patch of patches) {\n        console.log(`  ${patch.id}: \"${patch.original_message.slice(0, 50)}\"`);\n        console.log(`    by ${patch.original_author} (${patch.original_commit.slice(0, 7)})`);\n        for (const f of patch.files) {\n            console.log(`    ${f}`);\n        }\n    }\n}\n\nasync function runReplay(dir: string, flags: Record<string, string | boolean>): Promise<void> {\n    const dryRun = !!flags.dryRun;\n\n    console.log(`Running Replay: ${dir}`);\n    if (dryRun) console.log(\"(dry-run mode)\\n\");\n    else console.log();\n\n    const service = new ReplayService(dir, { enabled: true });\n    const report = await service.runReplay({ dryRun });\n\n    printReport(report);\n}\n\nfunction printDegradedBanner(reasons: ReadonlyArray<import(\"./types.js\").DegradedReason>): void {\n    if (reasons.length === 0) return;\n    console.log(\"============================================================\");\n    console.log(\"  REPLAY DEGRADED — customizations may not have been\");\n    console.log(\"  carried forward in this run. Review the result before\");\n    console.log(\"  merging.\");\n    console.log(\"============================================================\");\n    for (const reason of reasons) {\n        console.log(`  [${reason.code}] ${reason.message}`);\n    }\n    console.log();\n}\n\nfunction printReport(report: import(\"./ReplayService.js\").ReplayReport): void {\n    printDegradedBanner(report.degradedReasons ?? []);\n    console.log(`Flow: ${report.flow}`);\n    console.log(`Patches detected: ${report.patchesDetected}`);\n    console.log(`Patches applied: ${report.patchesApplied}`);\n    console.log(`Patches with conflicts: ${report.patchesWithConflicts}`);\n    console.log(`Patches skipped: ${report.patchesSkipped}`);\n    if (report.patchesAbsorbed) {\n        console.log(`Patches absorbed by generator: ${report.patchesAbsorbed}`);\n    }\n    if (report.patchesRepointed) {\n        console.log(`Patches repointed: ${report.patchesRepointed}`);\n    }\n    if (report.patchesContentRebased) {\n        console.log(`Patches content rebased: ${report.patchesContentRebased}`);\n    }\n    if (report.patchesKeptAsUserOwned) {\n        console.log(`Patches kept (user-owned files): ${report.patchesKeptAsUserOwned}`);\n    }\n    if (report.patchesReverted) {\n        console.log(`Patches reverted by user: ${report.patchesReverted}`);\n    }\n    if (report.patchesPartiallyApplied) {\n        console.log(`Patches partially applied: ${report.patchesPartiallyApplied}`);\n    }\n    if (report.patchesConflictResolved) {\n        console.log(`Patches conflict-resolved (pre-rebase): ${report.patchesConflictResolved}`);\n    }\n    if (report.patchesRefreshed) {\n        console.log(`Patches refreshed (user modified): ${report.patchesRefreshed}`);\n    }\n\n    if (report.wouldApply && report.wouldApply.length > 0) {\n        console.log(\"\\nWould apply:\");\n        for (const patch of report.wouldApply) {\n            console.log(`  ${patch.id}: \"${patch.original_message.slice(0, 50)}\" (${patch.files.length} files)`);\n        }\n    }\n\n    if (report.conflictDetails && report.conflictDetails.length > 0) {\n        console.log(\"\\nConflict Details:\");\n        for (const detail of report.conflictDetails) {\n            console.log(`  Patch: ${detail.patchId} - \"${detail.patchMessage}\"`);\n            if (detail.reason) {\n                console.log(`    Reason: ${formatConflictReason(detail.reason)}`);\n            }\n            for (const file of detail.files) {\n                const reason = file.conflictReason ?? \"merge conflict\";\n                const regionCount = file.conflicts?.length ?? 0;\n                console.log(`    CONFLICT ${file.file}: ${formatConflictReason(reason)} (${regionCount} region(s))`);\n            }\n            if (detail.cleanFiles && detail.cleanFiles.length > 0) {\n                for (const file of detail.cleanFiles) {\n                    console.log(`    OK       ${file}: applied cleanly`);\n                }\n            }\n        }\n        console.log(\"\\nOr run: fern-replay forget <file-pattern>  to remove problematic patches\");\n    } else if (report.conflicts.length > 0) {\n        console.log(\"\\nConflicts:\");\n        for (const conflict of report.conflicts) {\n            console.log(`  ${conflict.file}: ${conflict.reason ?? \"merge conflict\"}`);\n        }\n    }\n\n    if (report.unresolvedPatches && report.unresolvedPatches.length > 0) {\n        console.log(\"\\nUnresolved Patches (need local resolution):\");\n        for (const patch of report.unresolvedPatches) {\n            console.log(`  Patch: ${patch.patchId} - \"${patch.patchMessage}\"`);\n            for (const file of patch.files) {\n                console.log(`    ${file}`);\n            }\n        }\n        console.log(\"\\nRun 'fern-replay resolve <dir>' on this branch to resolve conflicts.\");\n    }\n\n    if (report.warnings && report.warnings.length > 0) {\n        console.log(\"\\nWarnings:\");\n        for (const w of report.warnings) console.log(`  ${w}`);\n    }\n}\n\nasync function runMigrate(dir: string): Promise<void> {\n    const lockManager = new LockfileManager(dir);\n    const git = new GitClient(dir);\n\n    if (!lockManager.exists()) {\n        // Initialize temporarily for analysis\n        console.log(\"No lockfile found. Running bootstrap analysis first...\\n\");\n        const result = await bootstrap(dir, { dryRun: true });\n        if (!result.generationCommit) {\n            console.log(\"No generation commits found. Cannot analyze migration.\");\n            return;\n        }\n    } else {\n        lockManager.read();\n    }\n\n    const migrator = new FernignoreMigrator(git, lockManager, dir);\n\n    if (!migrator.fernignoreExists()) {\n        console.log(\"No .fernignore found.\");\n        return;\n    }\n\n    const patterns = migrator.readFernignorePatterns();\n    console.log(`.fernignore has ${patterns.length} patterns:\\n`);\n    for (const p of patterns) console.log(`  ${p}`);\n\n    try {\n        const analysis = await migrator.analyzeMigration();\n\n        if (analysis.trackedByBoth.length > 0) {\n            console.log(`\\nCan migrate to Replay (${analysis.trackedByBoth.length}):`);\n            for (const item of analysis.trackedByBoth) {\n                console.log(`  + ${item.file} (commit: ${item.commit.slice(0, 7)})`);\n            }\n        }\n\n        if (analysis.fernignoreOnly.length > 0) {\n            console.log(`\\nNeed exclude rule (${analysis.fernignoreOnly.length}):`);\n            for (const file of analysis.fernignoreOnly) {\n                console.log(`  ! ${file}`);\n            }\n        }\n\n        if (analysis.commitsOnly.length > 0) {\n            console.log(`\\nUnprotected customizations (${analysis.commitsOnly.length}):`);\n            for (const patch of analysis.commitsOnly) {\n                console.log(`  * ${patch.id}: \"${patch.original_message.slice(0, 50)}\" (${patch.files.length} files)`);\n            }\n        }\n    } catch {\n        console.log(\"\\nCould not analyze migration (lockfile may need bootstrap first).\");\n        console.log(\"Run: fern-replay bootstrap <dir>\");\n    }\n}\n\nfunction formatDiffStat(patch: MatchedPatch): string {\n    return `+${patch.diffstat.additions} -${patch.diffstat.deletions}`;\n}\n\nfunction formatPatchLine(index: number, patch: MatchedPatch): string {\n    const status = patch.status ? ` [${patch.status}]` : \"\";\n    const filesStr = patch.files.join(\", \");\n    return `  [${index}]  ${patch.id}  \"${patch.message}\"  ${formatDiffStat(patch)}  ${filesStr}${status}`;\n}\n\nfunction printForgetWarnings(warnings: string[]): void {\n    for (const w of warnings) {\n        console.log(`Warning: ${w}`);\n    }\n}\n\nfunction promptLine(question: string): Promise<string> {\n    const rl = createInterface({ input: process.stdin, output: process.stdout });\n    return new Promise((resolve) => {\n        rl.question(question, (answer) => {\n            rl.close();\n            resolve(answer.trim());\n        });\n    });\n}\n\nfunction parseSelection(input: string, max: number): number[] | \"all\" | \"none\" | null {\n    const trimmed = input.trim().toLowerCase();\n    if (trimmed === \"all\") return \"all\";\n    if (trimmed === \"none\" || trimmed === \"\") return \"none\";\n\n    const nums: number[] = [];\n    for (const part of trimmed.split(\",\")) {\n        const n = parseInt(part.trim(), 10);\n        if (isNaN(n) || n < 1 || n > max) return null;\n        if (!nums.includes(n)) nums.push(n);\n    }\n    return nums.length > 0 ? nums : null;\n}\n\nasync function runForget(dir: string, flags: Record<string, string | boolean>, positionals: string[]): Promise<void> {\n    const dryRun = !!flags.dryRun;\n    const yes = !!flags.yes;\n    const all = !!flags.all;\n\n    // Detect mode from positionals\n    const isPatchIdMode = positionals.length > 0 && positionals.every((a) => a.startsWith(\"patch-\"));\n    const pattern = !isPatchIdMode && positionals.length > 0 ? positionals[0] : undefined;\n    const patchIds = isPatchIdMode ? positionals : undefined;\n\n    // --all mode: remove all patches\n    if (all) {\n        // Always dry-run first to get patch count for confirmation prompt\n        const preview = await forget(dir, { all: true, dryRun: true });\n\n        if (!preview.initialized) {\n            console.log(\"Replay is not initialized. Run 'fern replay init' to get started.\");\n            process.exit(1);\n        }\n\n        if (preview.totalPatches === 0) {\n            console.log(\"No patches tracked. Nothing to remove.\");\n            return;\n        }\n\n        if (!dryRun && !yes) {\n            console.log(`WARNING: This will remove all ${preview.totalPatches} tracked patches.`);\n            console.log(\"Affected files will be overwritten on next generation.\");\n            console.log(\"Replay will remain initialized and detect new customizations.\\n\");\n            const confirm = await promptLine(\"Proceed? [y/N] \");\n            if (confirm.toLowerCase() !== \"y\") {\n                console.log(\"Aborted.\");\n                return;\n            }\n        }\n\n        // Perform actual removal (or stay in dry-run if --dry-run was passed)\n        const finalResult = dryRun ? preview : await forget(dir, { all: true });\n        printForgetWarnings(finalResult.warnings);\n\n        const verb = dryRun ? \"Would remove\" : \"Removed\";\n        console.log(`${verb} ${finalResult.removed.length} patches. ${finalResult.remaining} patches remaining.`);\n        return;\n    }\n\n    // Patch ID mode: direct removal\n    if (isPatchIdMode && patchIds) {\n        const result = await forget(dir, { patchIds, dryRun });\n\n        if (!result.initialized) {\n            console.log(\"Replay is not initialized. Run 'fern replay init' to get started.\");\n            process.exit(1);\n        }\n\n        if (result.alreadyForgotten.length > 0 && result.removed.length === 0) {\n            for (const id of result.alreadyForgotten) {\n                console.log(`${id} is not tracked. Nothing to remove.`);\n            }\n            return;\n        }\n\n        printForgetWarnings(result.warnings);\n\n        if (result.alreadyForgotten.length > 0) {\n            for (const id of result.alreadyForgotten) {\n                console.log(`${id} is not tracked (skipped).`);\n            }\n        }\n\n        const verb = dryRun ? \"Would remove\" : \"Removed\";\n        if (result.removed.length === 1) {\n            const p = result.removed[0]!;\n            console.log(`${verb} 1 patch: \"${p.message}\" (${p.files.length} files)`);\n        } else {\n            console.log(`${verb} ${result.removed.length} patches.`);\n        }\n        console.log(`${result.remaining} patches remaining.`);\n        return;\n    }\n\n    // Search / no-arg mode: get matches for interactive selection\n    const searchResult = pattern\n        ? await forget(dir, { pattern })\n        : await forget(dir);\n\n    if (!searchResult.initialized) {\n        console.log(\"Replay is not initialized. Run 'fern replay init' to get started.\");\n        process.exit(1);\n    }\n\n    const matches = searchResult.matched ?? [];\n\n    if (matches.length === 0) {\n        if (pattern) {\n            console.log(`No patches found matching \"${pattern}\". Run 'fern replay status -v' to see all tracked patches.`);\n        } else {\n            console.log(\"No patches tracked. Nothing to remove.\");\n        }\n        return;\n    }\n\n    // Display matches\n    if (pattern) {\n        console.log(`Found ${matches.length} patch(es) matching \"${pattern}\":\\n`);\n    } else {\n        console.log(\"All tracked patches:\\n\");\n    }\n\n    for (let i = 0; i < matches.length; i++) {\n        console.log(formatPatchLine(i + 1, matches[i]!));\n    }\n\n    // Non-TTY check\n    if (!process.stdin.isTTY && !yes) {\n        console.error(\"\\nError: Interactive selection required. Use patch IDs directly or add --yes to remove all matches.\");\n        process.exit(1);\n    }\n\n    // Get selection\n    let selectedIds: string[];\n    if (yes) {\n        selectedIds = matches.map((m) => m.id);\n    } else {\n        console.log();\n        const input = await promptLine(\"Remove which? (comma-separated numbers, 'all', or 'none'): \");\n        const selection = parseSelection(input, matches.length);\n\n        if (selection === \"none\" || selection === null) {\n            if (selection === null) console.log(\"Invalid selection.\");\n            console.log(\"Aborted.\");\n            return;\n        }\n\n        selectedIds = selection === \"all\"\n            ? matches.map((m) => m.id)\n            : selection.map((i) => matches[i - 1]!.id);\n\n        // Confirmation prompt\n        console.log(`\\nThis will remove ${selectedIds.length} patch(es). Affected files will be overwritten on next generation.`);\n        const confirm = await promptLine(\"Proceed? [y/N] \");\n        if (confirm.toLowerCase() !== \"y\") {\n            console.log(\"Aborted.\");\n            return;\n        }\n    }\n\n    // Perform removal\n    const result = await forget(dir, { patchIds: selectedIds, dryRun });\n    printForgetWarnings(result.warnings);\n\n    const verb = dryRun ? \"Would remove\" : \"Removed\";\n    console.log(`\\n${verb} ${result.removed.length} patch(es).`);\n    console.log(`${result.remaining} patches remaining.`);\n}\n\nasync function runReset(dir: string, flags: Record<string, string | boolean>): Promise<void> {\n    const dryRun = !!flags.dryRun;\n\n    if (dryRun) {\n        console.log(\"(dry-run mode)\\n\");\n    } else {\n        console.log(\"WARNING: This will remove ALL tracked customizations.\");\n        console.log(\"Your code changes will NOT be deleted, but they will no longer\");\n        console.log(\"be automatically preserved across regenerations.\\n\");\n    }\n\n    const result = reset(dir, { dryRun });\n\n    if (result.nothingToReset) {\n        console.log(\"Replay is not initialized. Nothing to reset.\");\n        return;\n    }\n\n    console.log(`${dryRun ? \"Would remove\" : \"Removed\"} ${result.patchesRemoved} patch(es).`);\n    console.log(`${dryRun ? \"Would delete\" : \"Deleted\"} replay.lock.`);\n\n    if (!dryRun) {\n        console.log(\"\\nTo re-initialize, run: fern-replay bootstrap <dir>\");\n    }\n}\n\nasync function runResolve(dir: string, flags: Record<string, string | boolean>): Promise<void> {\n    const checkMarkers = !flags.noCheck;\n\n    console.log(`Resolving conflicts: ${dir}\\n`);\n\n    const result = await resolveConflicts(dir, { checkMarkers });\n\n    if (!result.success) {\n        switch (result.reason) {\n            case \"no-lockfile\":\n                console.error(\"Replay is not initialized. Nothing to resolve.\");\n                break;\n            case \"no-patches\":\n                console.error(\"No patches in lockfile. Nothing to resolve.\");\n                break;\n            case \"conflicts-applied\":\n                console.log(`Applied ${result.patchesApplied} unresolved patch(es) to working tree.`);\n                console.log(`\\n${result.unresolvedFiles!.length} file(s) have conflicts:`);\n                for (const f of result.unresolvedFiles!) {\n                    console.log(`  ${f}`);\n                }\n                console.log(`\\nResolve the conflicts in your editor, then run 'fern-replay resolve ${dir}' again.`);\n                return; // Normal flow, don't exit(1)\n            case \"unresolved-conflicts\":\n                console.error(\"Conflict markers still present in:\");\n                for (const f of result.unresolvedFiles ?? []) {\n                    console.error(`  ${f}`);\n                }\n                console.error(\"\\nResolve all conflict markers, then run 'fern-replay resolve' again.\");\n                console.error(\"Or use --no-check to skip this check.\");\n                break;\n            default:\n                console.error(`Resolve failed: ${result.reason}`);\n        }\n        process.exit(1);\n    }\n\n    if (result.patchesResolved) {\n        console.log(`Resolution complete. Updated ${result.patchesResolved} patch(es) in lockfile.`);\n    }\n    if (result.patchesDismissed && result.patchesDismissed.length > 0) {\n        console.log(`Permanently dismissed ${result.patchesDismissed.length} customization(s) (you kept the generated code):`);\n        for (const d of result.patchesDismissed) {\n            console.log(`  \"${d.message}\" (${d.id}) — will not return on future generations`);\n        }\n    }\n    if (result.warnings) {\n        for (const w of result.warnings) {\n            console.log(`Warning: ${w}`);\n        }\n    }\n    console.log(`Created [fern-replay] commit: ${result.commitSha?.slice(0, 7)}`);\n    console.log(\"Push to update the PR.\");\n}\n\nasync function main(): Promise<void> {\n    const { command, dir, flags, positionals } = parseArgs(process.argv);\n\n    if (!existsSync(dir)) {\n        console.error(`Directory not found: ${dir}`);\n        process.exit(1);\n    }\n\n    switch (command) {\n        case \"bootstrap\":\n            await runBootstrap(dir, flags);\n            break;\n        case \"status\":\n            await runStatus(dir, flags);\n            break;\n        case \"detect\":\n            await runDetect(dir);\n            break;\n        case \"replay\":\n            await runReplay(dir, flags);\n            break;\n        case \"migrate\":\n            await runMigrate(dir);\n            break;\n        case \"forget\":\n            await runForget(dir, flags, positionals);\n            break;\n        case \"reset\":\n            await runReset(dir, flags);\n            break;\n        case \"resolve\":\n            await runResolve(dir, flags);\n            break;\n    }\n}\n\nfunction formatConflictReason(reason: string): string {\n    switch (reason) {\n        case \"same-line-edit\": return \"same lines edited\";\n        case \"new-file-both\": return \"new file created by both user and generator\";\n        case \"base-generation-mismatch\": return \"patches from different generations overlap\";\n        case \"patch-apply-failed\": return \"patch could not be applied\";\n        default: return reason;\n    }\n}\n\nmain().catch((err) => {\n    console.error(err);\n    process.exit(1);\n});\n","import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport { stringify, parse } from \"yaml\";\nimport { isSensitiveFile, scanForCredentials } from \"./credentials.js\";\nimport type {\n    DismissalRecord,\n    GenerationLock,\n    GenerationRecord,\n    StoredPatch,\n    CustomizationsConfig,\n} from \"./types.js\";\n\nconst LOCKFILE_HEADER = \"# DO NOT EDIT MANUALLY - Managed by Fern Replay\\n\";\n\nexport class LockfileNotFoundError extends Error {\n    constructor(path: string) {\n        super(`Lockfile not found: ${path}`);\n        this.name = \"LockfileNotFoundError\";\n    }\n}\n\nexport class LockfileManager {\n    private outputDir: string;\n    private lock: GenerationLock | null = null;\n    private fernignorePatterns: string[] = [];\n    readonly warnings: string[] = [];\n\n    constructor(outputDir: string) {\n        this.outputDir = outputDir;\n    }\n\n    /**\n     * Inform the lockfile of the customer's `.fernignore` patterns so that\n     * `save()` can suppress its \"Patch X removed from lockfile\" warning when\n     * every file in the stripped patch is already `.fernignore`-protected.\n     * The strip itself still happens (credentials never persist); only the\n     * customer-visible warning is suppressed in that case, because the\n     * protected files survive the generator wipe regardless of whether the\n     * lockfile tracks them, so there's nothing for the customer to action.\n     */\n    setFernignorePatterns(patterns: string[]): void {\n        this.fernignorePatterns = patterns;\n    }\n\n    get lockfilePath(): string {\n        return join(this.outputDir, \".fern\", \"replay.lock\");\n    }\n\n    get customizationsPath(): string {\n        return join(this.outputDir, \".fern\", \"replay.yml\");\n    }\n\n    exists(): boolean {\n        return existsSync(this.lockfilePath);\n    }\n\n    read(): GenerationLock {\n        if (this.lock) {\n            return this.lock;\n        }\n        try {\n            const content = readFileSync(this.lockfilePath, \"utf-8\");\n            this.lock = parse(content) as GenerationLock;\n            return this.lock;\n        } catch (error: unknown) {\n            if (\n                error instanceof Error &&\n                \"code\" in error &&\n                (error as NodeJS.ErrnoException).code === \"ENOENT\"\n            ) {\n                throw new LockfileNotFoundError(this.lockfilePath);\n            }\n            throw error;\n        }\n    }\n\n    initialize(firstGeneration: GenerationRecord): void {\n        this.initializeInMemory(firstGeneration);\n        this.save();\n    }\n\n    /**\n     * Set up in-memory lock state without writing to disk.\n     * Useful for bootstrap dry-run where we need state for detection\n     * but don't want to persist anything.\n     */\n    initializeInMemory(firstGeneration: GenerationRecord): void {\n        this.lock = {\n            version: \"1.0\",\n            generations: [firstGeneration],\n            current_generation: firstGeneration.commit_sha,\n            patches: [],\n        };\n    }\n\n    save(): void {\n        if (!this.lock) {\n            throw new Error(\"No lockfile data to save. Call read() or initialize() first.\");\n        }\n\n        // Clear warnings from any previous save() call to prevent accumulation.\n        this.warnings.length = 0;\n\n        // Layer 2 credential safety net: scan all patches before writing.\n        // Strips ENTIRE patches that contain credential content (in either\n        // `patch_content` or `theirs_snapshot`) or reference sensitive files.\n        // Snapshot scanning is essential — snapshots store full file content,\n        // so they're strictly more credential-rich than the diff alone.\n        // Without scanning snapshots, a customer-edited config with a\n        // committed token would leak into `.fern/replay.lock` via the\n        // snapshot field even though the patch_content scan caught nothing.\n        //\n        // Note: if a patch modifies both a sensitive file and a legitimate file, the entire\n        // patch is dropped. This is a deliberate safety trade-off — partial redaction risks\n        // leaving credential context that regex didn't catch. The customer gets a warning.\n        const cleanPatches: StoredPatch[] = [];\n        for (const patch of this.lock.patches) {\n            const diffMatches = scanForCredentials(patch.patch_content);\n            const snapshotMatches: string[] = [];\n            if (patch.theirs_snapshot) {\n                for (const content of Object.values(patch.theirs_snapshot)) {\n                    const m = scanForCredentials(content);\n                    for (const x of m) {\n                        if (!snapshotMatches.includes(x)) snapshotMatches.push(x);\n                    }\n                }\n            }\n            const credentialMatches = [...diffMatches, ...snapshotMatches.filter((m) => !diffMatches.includes(m))];\n            const sensitiveFiles = patch.files.filter((f) => isSensitiveFile(f));\n\n            if (credentialMatches.length > 0 || sensitiveFiles.length > 0) {\n                const reasons: string[] = [];\n                if (credentialMatches.length > 0) {\n                    reasons.push(`credential patterns: ${credentialMatches.join(\", \")}`);\n                }\n                if (sensitiveFiles.length > 0) {\n                    reasons.push(`sensitive files: ${sensitiveFiles.join(\", \")}`);\n                }\n                // Suppress the customer-visible warning when every file in\n                // the patch is `.fernignore`-protected. Such files survive\n                // the generator wipe by themselves; the lockfile strip is a\n                // background safety measure with no customer-visible\n                // consequence. The strip itself still happens.\n                const allProtected = patch.files.length > 0 && patch.files.every((f) =>\n                    this.fernignorePatterns.some((p) => f === p || minimatch(f, p))\n                );\n                if (!allProtected) {\n                    this.warnings.push(\n                        `Patch ${patch.id} removed from lockfile: ${reasons.join(\"; \")}. ` +\n                        `This prevents credential exposure in committed lockfiles.`\n                    );\n                }\n            } else {\n                cleanPatches.push(patch);\n            }\n        }\n        this.lock.patches = cleanPatches;\n\n        const dir = dirname(this.lockfilePath);\n        if (!existsSync(dir)) {\n            mkdirSync(dir, { recursive: true });\n        }\n        const yaml = stringify(this.lock, {\n            lineWidth: 0,\n            blockQuote: \"literal\",\n        });\n        const content = LOCKFILE_HEADER + yaml;\n        // Atomic write: write to temp file then rename (rename is atomic on most filesystems)\n        const tmpPath = this.lockfilePath + \".tmp\";\n        writeFileSync(tmpPath, content, \"utf-8\");\n        renameSync(tmpPath, this.lockfilePath);\n    }\n\n    addGeneration(record: GenerationRecord): void {\n        this.ensureLoaded();\n        this.lock!.generations.push(record);\n        this.lock!.current_generation = record.commit_sha;\n    }\n\n    addPatch(patch: StoredPatch): void {\n        this.ensureLoaded();\n        this.lock!.patches.push(patch);\n    }\n\n    updatePatch(\n        patchId: string,\n        updates: Partial<Pick<StoredPatch, \"base_generation\" | \"patch_content\" | \"content_hash\" | \"files\" | \"status\" | \"user_owned\" | \"theirs_snapshot\">>,\n    ): void {\n        this.ensureLoaded();\n        const patch = this.lock!.patches.find((p) => p.id === patchId);\n        if (!patch) {\n            throw new Error(`Patch not found: ${patchId}`);\n        }\n        Object.assign(patch, updates);\n    }\n\n    removePatch(patchId: string): void {\n        this.ensureLoaded();\n        this.lock!.patches = this.lock!.patches.filter((p) => p.id !== patchId);\n    }\n\n    clearPatches(): void {\n        this.ensureLoaded();\n        this.lock!.patches = [];\n    }\n\n    addForgottenHash(hash: string): void {\n        this.ensureLoaded();\n        if (!this.lock!.forgotten_hashes) {\n            this.lock!.forgotten_hashes = [];\n        }\n        if (!this.lock!.forgotten_hashes.includes(hash)) {\n            this.lock!.forgotten_hashes.push(hash);\n        }\n    }\n\n    /**\n     * Record a dismissed customization: visibility metadata in `dismissals`\n     * plus a tombstone in `forgotten_hashes` for every content hash.\n     * `forgotten_hashes` stays the only list the detector consults; the\n     * metadata exists so `status` can show what was dismissed.\n     */\n    addDismissal(record: DismissalRecord): void {\n        this.ensureLoaded();\n        if (!this.lock!.dismissals) {\n            this.lock!.dismissals = [];\n        }\n        this.lock!.dismissals.push(record);\n        for (const hash of record.content_hashes) {\n            this.addForgottenHash(hash);\n        }\n    }\n\n    getUnresolvedPatches(): StoredPatch[] {\n        this.ensureLoaded();\n        return this.lock!.patches.filter((p) => p.status === \"unresolved\");\n    }\n\n    getResolvingPatches(): StoredPatch[] {\n        this.ensureLoaded();\n        return this.lock!.patches.filter((p) => p.status === \"resolving\");\n    }\n\n    markPatchUnresolved(patchId: string): void {\n        this.updatePatch(patchId, { status: \"unresolved\" });\n    }\n\n    markPatchResolved(\n        patchId: string,\n        updates: Pick<StoredPatch, \"patch_content\" | \"content_hash\" | \"base_generation\" | \"files\" | \"theirs_snapshot\">,\n    ): void {\n        this.ensureLoaded();\n        const patch = this.lock!.patches.find((p) => p.id === patchId);\n        if (!patch) {\n            throw new Error(`Patch not found: ${patchId}`);\n        }\n        delete patch.status;\n        Object.assign(patch, updates);\n    }\n\n    getPatches(): StoredPatch[] {\n        this.ensureLoaded();\n        return this.lock!.patches;\n    }\n\n    setReplaySkippedAt(timestamp: string): void {\n        this.ensureLoaded();\n        this.lock!.replay_skipped_at = timestamp;\n    }\n\n    clearReplaySkippedAt(): void {\n        this.ensureLoaded();\n        delete this.lock!.replay_skipped_at;\n    }\n\n    isReplaySkipped(): boolean {\n        this.ensureLoaded();\n        return this.lock!.replay_skipped_at != null;\n    }\n\n    getGeneration(commitSha: string): GenerationRecord | undefined {\n        this.ensureLoaded();\n        return this.lock!.generations.find((g) => g.commit_sha === commitSha);\n    }\n\n    getCustomizationsConfig(): CustomizationsConfig {\n        if (!existsSync(this.customizationsPath)) {\n            return {};\n        }\n        const content = readFileSync(this.customizationsPath, \"utf-8\");\n        return (parse(content) as CustomizationsConfig) ?? {};\n    }\n\n    private ensureLoaded(): void {\n        if (!this.lock) {\n            throw new Error(\"No lockfile loaded. Call read() or initialize() first.\");\n        }\n    }\n}\n","import expand from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  nobrace?: boolean\n  nocomment?: boolean\n  nonegate?: boolean\n  debug?: boolean\n  noglobstar?: boolean\n  noext?: boolean\n  nonull?: boolean\n  windowsPathsNoEscape?: boolean\n  allowWindowsEscape?: boolean\n  partial?: boolean\n  dot?: boolean\n  nocase?: boolean\n  nocaseMagicOnly?: boolean\n  magicalBraces?: boolean\n  matchBase?: boolean\n  flipNegate?: boolean\n  preserveMultipleSlashes?: boolean\n  optimizationLevel?: number\n  platform?: Platform\n  windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process\n    ? (typeof process.env === 'object' &&\n        process.env &&\n        process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n      process.platform\n    : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {}\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n      orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li <https://github.com/yetingli> for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined\n        ? options.windowsNoMagicRoot\n        : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: any[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      this.debug = (...args: any[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn all ** into *\n    if (this.options.noglobstar) {\n      for (let i = 0; i < globParts.length; i++) {\n        for (let j = 0; j < globParts[i].length; j++) {\n          if (globParts[i][j] === '**') {\n            globParts[i][j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      // just collapse multiple ** portions into one\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n    do {\n      didSomething = false\n      // <pre>/<e>/<rest> -> <pre>/<rest>\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // <pre>/<p>/../<rest> -> <pre>/<rest>\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (p && p !== '.' && p !== '..' && p !== '**') {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // <pre> is 1 or more portions\n  // <rest> is 1 or more portions\n  // <p> is any portion other than ., .., '', or **\n  // <e> is . or ''\n  //\n  // **/.. is *brutal* for filesystem walking performance, because\n  // it effectively resets the recursive walk each time it occurs,\n  // and ** cannot be reduced out by a .. pattern part like a regexp\n  // or most strings (other than .., ., and '') can be.\n  //\n  // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n  // <pre>/<e>/<rest> -> <pre>/<rest>\n  // <pre>/<p>/../<rest> -> <pre>/<rest>\n  // **/**/<rest> -> **/<rest>\n  //\n  // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n      for (let parts of globParts) {\n        let gs: number = -1\n        while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n          let gss: number = gs\n          while (parts[gss + 1] === '**') {\n            // <pre>/**/**/<rest> -> <pre>/**/<rest>\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // <pre>/<e>/<rest> -> <pre>/<rest>\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // <pre>/<p>/../<rest> -> <pre>/<rest>\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n  // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n  // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n  //\n  // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes\n        )\n        if (matched) {\n          globParts[i] = []\n          globParts[j] = matched\n          break\n        }\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n    const options = this.options\n\n    // UNC paths like //?/X:/... can match X:/... and vice versa\n    // Drive letters in absolute drive or unc paths are always compared\n    // case-insensitively.\n    if (this.isWindows) {\n      const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n      const fileUNC =\n        !fileDrive &&\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        /^[a-z]:$/i.test(file[3])\n\n      const patternDrive =\n        typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n      const patternUNC =\n        !patternDrive &&\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n      const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n      if (typeof fdi === 'number' && typeof pdi === 'number') {\n        const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          pattern[pdi] = fd\n          if (pdi > fdi) {\n            pattern = pattern.slice(pdi)\n          } else if (fdi > pdi) {\n            file = file.slice(fdi)\n          }\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // dont' need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    this.debug('matchOne', this, { file, pattern })\n    this.debug('matchOne', file.length, pattern.length)\n\n    for (\n      var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      var p = pattern[pi]\n      var f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      if (p === GLOBSTAR) {\n        this.debug('GLOBSTAR', [pattern, p, f])\n\n        // \"**\"\n        // a/**/b/**/c would match the following:\n        // a/b/x/y/z/c\n        // a/x/y/z/b/c\n        // a/b/x/b/x/c\n        // a/b/c\n        // To do this, take the rest of the pattern after\n        // the **, and see if it would match the file remainder.\n        // If so, return success.\n        // If not, the ** \"swallows\" a segment, and try again.\n        // This is recursively awful.\n        //\n        // a/**/b/**/c matching a/b/x/y/z/c\n        // - a matches a\n        // - doublestar\n        //   - matchOne(b/x/y/z/c, b/**/c)\n        //     - b matches b\n        //     - doublestar\n        //       - matchOne(x/y/z/c, c) -> no\n        //       - matchOne(y/z/c, c) -> no\n        //       - matchOne(z/c, c) -> no\n        //       - matchOne(c, c) yes, hit\n        var fr = fi\n        var pr = pi + 1\n        if (pr === pl) {\n          this.debug('** at the end')\n          // a ** at the end will just swallow the rest.\n          // We have found a match.\n          // however, it will not swallow /.x, unless\n          // options.dot is set.\n          // . and .. are *never* matched by **, for explosively\n          // exponential reasons.\n          for (; fi < fl; fi++) {\n            if (\n              file[fi] === '.' ||\n              file[fi] === '..' ||\n              (!options.dot && file[fi].charAt(0) === '.')\n            )\n              return false\n          }\n          return true\n        }\n\n        // ok, let's see if we can swallow whatever we can.\n        while (fr < fl) {\n          var swallowee = file[fr]\n\n          this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n          // XXX remove this slice.  Just pass the start index.\n          if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n            this.debug('globstar found match!', fr, fl, swallowee)\n            // found a match.\n            return true\n          } else {\n            // can't swallow \".\" or \"..\" ever.\n            // can only swallow \".foo\" when explicitly asked.\n            if (\n              swallowee === '.' ||\n              swallowee === '..' ||\n              (!options.dot && swallowee.charAt(0) === '.')\n            ) {\n              this.debug('dot detected!', file, fr, pattern, pr)\n              break\n            }\n\n            // ** swallows a segment, and continue.\n            this.debug('globstar swallow a segment, and continue')\n            fr++\n          }\n        }\n\n        // no match was found.\n        // However, in partial mode, we can't say this is necessarily over.\n        /* c8 ignore start */\n        if (partial) {\n          // ran out of file\n          this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n          if (fr === fl) {\n            return true\n          }\n        }\n        /* c8 ignore stop */\n        return false\n      }\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.<ext>  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? starDotExtTestNocaseDot\n            : starDotExtTestNocase\n          : options.dot\n          ? starDotExtTestDot\n          : starDotExtTest\n      )(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? qmarksTestNocaseDot\n            : qmarksTestNocase\n          : options.dot\n          ? qmarksTestDot\n          : qmarksTest\n      )(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    if (fastTest && typeof re === 'object') {\n      // Avoids overriding in frozen environments\n      Reflect.defineProperty(re, 'test', { value: fastTest })\n    }\n    return re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar = options.noglobstar\n      ? star\n      : options.dot\n      ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return typeof p === 'string'\n            ? regExpEscape(p)\n            : p === GLOBSTAR\n            ? GLOBSTAR\n            : p._src\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        return pp.filter(p => p !== GLOBSTAR).join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch (ex) {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (let i = 0; i < set.length; i++) {\n      const pattern = set[i]\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n","const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n  pattern: any\n): asserts pattern is string => {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('invalid pattern')\n  }\n\n  if (pattern.length > MAX_PATTERN_LENGTH) {\n    throw new TypeError('pattern is too long')\n  }\n}\n","// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n  '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n  '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n  '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n  '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n  '[:cntrl:]': ['\\\\p{Cc}', true],\n  '[:digit:]': ['\\\\p{Nd}', true],\n  '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n  '[:lower:]': ['\\\\p{Ll}', true],\n  '[:print:]': ['\\\\p{C}', true],\n  '[:punct:]': ['\\\\p{P}', true],\n  '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n  '[:upper:]': ['\\\\p{Lu}', true],\n  '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n  '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n  src: string,\n  uFlag: boolean,\n  consumed: number,\n  hasMagic: boolean\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n  glob: string,\n  position: number\n): ParseClassResult => {\n  const pos = position\n  /* c8 ignore start */\n  if (glob.charAt(pos) !== '[') {\n    throw new Error('not in a brace expression')\n  }\n  /* c8 ignore stop */\n  const ranges: string[] = []\n  const negs: string[] = []\n\n  let i = pos + 1\n  let sawStart = false\n  let uflag = false\n  let escaping = false\n  let negate = false\n  let endPos = pos\n  let rangeStart = ''\n  WHILE: while (i < glob.length) {\n    const c = glob.charAt(i)\n    if ((c === '!' || c === '^') && i === pos + 1) {\n      negate = true\n      i++\n      continue\n    }\n\n    if (c === ']' && sawStart && !escaping) {\n      endPos = i + 1\n      break\n    }\n\n    sawStart = true\n    if (c === '\\\\') {\n      if (!escaping) {\n        escaping = true\n        i++\n        continue\n      }\n      // escaped \\ char, fall through and treat like normal char\n    }\n    if (c === '[' && !escaping) {\n      // either a posix class, a collation equivalent, or just a [\n      for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n        if (glob.startsWith(cls, i)) {\n          // invalid, [a-[] is fine, but not [a-[:alpha]]\n          if (rangeStart) {\n            return ['$.', false, glob.length - pos, true]\n          }\n          i += cls.length\n          if (neg) negs.push(unip)\n          else ranges.push(unip)\n          uflag = uflag || u\n          continue WHILE\n        }\n      }\n    }\n\n    // now it's just a normal character, effectively\n    escaping = false\n    if (rangeStart) {\n      // throw this range away if it's not valid, but others\n      // can still match.\n      if (c > rangeStart) {\n        ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n      } else if (c === rangeStart) {\n        ranges.push(braceEscape(c))\n      }\n      rangeStart = ''\n      i++\n      continue\n    }\n\n    // now might be the start of a range.\n    // can be either c-d or c-] or c<more...>] or c] at this point\n    if (glob.startsWith('-]', i + 1)) {\n      ranges.push(braceEscape(c + '-'))\n      i += 2\n      continue\n    }\n    if (glob.startsWith('-', i + 1)) {\n      rangeStart = c\n      i += 2\n      continue\n    }\n\n    // not the start of a range, just a single character\n    ranges.push(braceEscape(c))\n    i++\n  }\n\n  if (endPos < i) {\n    // didn't see the end of the class, not a valid class,\n    // but might still be valid as a literal match.\n    return ['', false, 0, false]\n  }\n\n  // if we got no ranges and no negates, then we have a range that\n  // cannot possibly match anything, and that poisons the whole glob\n  if (!ranges.length && !negs.length) {\n    return ['$.', false, glob.length - pos, true]\n  }\n\n  // if we got one positive range, and it's a single character, then that's\n  // not actually a magic pattern, it's just that one literal character.\n  // we should not treat that as \"magic\", we should just return the literal\n  // character. [_] is a perfectly valid way to escape glob magic chars.\n  if (\n    negs.length === 0 &&\n    ranges.length === 1 &&\n    /^\\\\?.$/.test(ranges[0]) &&\n    !negate\n  ) {\n    const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n    return [regexpEscape(r), false, endPos - pos, false]\n  }\n\n  const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n  const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n  const comb =\n    ranges.length && negs.length\n      ? '(' + sranges + '|' + snegs + ')'\n      : ranges.length\n      ? sranges\n      : snegs\n\n  return [comb, uflag, endPos - pos, true]\n}\n","import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes.  For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n  return windowsPathsNoEscape\n    ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n    : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n","// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n//   1   2 3   4 5 6      1   2    3   46      5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n//                                 v----- .* because there's more following,\n//                                 v    v  otherwise, .+ because it must be\n//                                 v    v  *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n//   copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n  types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n  type: ExtglobType | null\n  readonly #root: AST\n\n  #hasMagic?: boolean\n  #uflag: boolean = false\n  #parts: (string | AST)[] = []\n  readonly #parent?: AST\n  readonly #parentIndex: number\n  #negs: AST[]\n  #filledNegs: boolean = false\n  #options: MinimatchOptions\n  #toString?: string\n  // set to true if it's an extglob with no children\n  // (which really means one child of '')\n  #emptyExt: boolean = false\n\n  constructor(\n    type: ExtglobType | null,\n    parent?: AST,\n    options: MinimatchOptions = {}\n  ) {\n    this.type = type\n    // extglobs are inherently magical\n    if (type) this.#hasMagic = true\n    this.#parent = parent\n    this.#root = this.#parent ? this.#parent.#root : this\n    this.#options = this.#root === this ? options : this.#root.#options\n    this.#negs = this.#root === this ? [] : this.#root.#negs\n    if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n    this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n  }\n\n  get hasMagic(): boolean | undefined {\n    /* c8 ignore start */\n    if (this.#hasMagic !== undefined) return this.#hasMagic\n    /* c8 ignore stop */\n    for (const p of this.#parts) {\n      if (typeof p === 'string') continue\n      if (p.type || p.hasMagic) return (this.#hasMagic = true)\n    }\n    // note: will be undefined until we generate the regexp src and find out\n    return this.#hasMagic\n  }\n\n  // reconstructs the pattern\n  toString(): string {\n    if (this.#toString !== undefined) return this.#toString\n    if (!this.type) {\n      return (this.#toString = this.#parts.map(p => String(p)).join(''))\n    } else {\n      return (this.#toString =\n        this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n    }\n  }\n\n  #fillNegs() {\n    /* c8 ignore start */\n    if (this !== this.#root) throw new Error('should only call on root')\n    if (this.#filledNegs) return this\n    /* c8 ignore stop */\n\n    // call toString() once to fill this out\n    this.toString()\n    this.#filledNegs = true\n    let n: AST | undefined\n    while ((n = this.#negs.pop())) {\n      if (n.type !== '!') continue\n      // walk up the tree, appending everthing that comes AFTER parentIndex\n      let p: AST | undefined = n\n      let pp = p.#parent\n      while (pp) {\n        for (\n          let i = p.#parentIndex + 1;\n          !pp.type && i < pp.#parts.length;\n          i++\n        ) {\n          for (const part of n.#parts) {\n            /* c8 ignore start */\n            if (typeof part === 'string') {\n              throw new Error('string part in extglob AST??')\n            }\n            /* c8 ignore stop */\n            part.copyIn(pp.#parts[i])\n          }\n        }\n        p = pp\n        pp = p.#parent\n      }\n    }\n    return this\n  }\n\n  push(...parts: (string | AST)[]) {\n    for (const p of parts) {\n      if (p === '') continue\n      /* c8 ignore start */\n      if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n        throw new Error('invalid part: ' + p)\n      }\n      /* c8 ignore stop */\n      this.#parts.push(p)\n    }\n  }\n\n  toJSON() {\n    const ret: any[] =\n      this.type === null\n        ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n        : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n    if (this.isStart() && !this.type) ret.unshift([])\n    if (\n      this.isEnd() &&\n      (this === this.#root ||\n        (this.#root.#filledNegs && this.#parent?.type === '!'))\n    ) {\n      ret.push({})\n    }\n    return ret\n  }\n\n  isStart(): boolean {\n    if (this.#root === this) return true\n    // if (this.type) return !!this.#parent?.isStart()\n    if (!this.#parent?.isStart()) return false\n    if (this.#parentIndex === 0) return true\n    // if everything AHEAD of this is a negation, then it's still the \"start\"\n    const p = this.#parent\n    for (let i = 0; i < this.#parentIndex; i++) {\n      const pp = p.#parts[i]\n      if (!(pp instanceof AST && pp.type === '!')) {\n        return false\n      }\n    }\n    return true\n  }\n\n  isEnd(): boolean {\n    if (this.#root === this) return true\n    if (this.#parent?.type === '!') return true\n    if (!this.#parent?.isEnd()) return false\n    if (!this.type) return this.#parent?.isEnd()\n    // if not root, it'll always have a parent\n    /* c8 ignore start */\n    const pl = this.#parent ? this.#parent.#parts.length : 0\n    /* c8 ignore stop */\n    return this.#parentIndex === pl - 1\n  }\n\n  copyIn(part: AST | string) {\n    if (typeof part === 'string') this.push(part)\n    else this.push(part.clone(this))\n  }\n\n  clone(parent: AST) {\n    const c = new AST(this.type, parent)\n    for (const p of this.#parts) {\n      c.copyIn(p)\n    }\n    return c\n  }\n\n  static #parseAST(\n    str: string,\n    ast: AST,\n    pos: number,\n    opt: MinimatchOptions\n  ): number {\n    let escaping = false\n    let inBrace = false\n    let braceStart = -1\n    let braceNeg = false\n    if (ast.type === null) {\n      // outside of a extglob, append until we find a start\n      let i = pos\n      let acc = ''\n      while (i < str.length) {\n        const c = str.charAt(i++)\n        // still accumulate escapes at this point, but we do ignore\n        // starts that are escaped\n        if (escaping || c === '\\\\') {\n          escaping = !escaping\n          acc += c\n          continue\n        }\n\n        if (inBrace) {\n          if (i === braceStart + 1) {\n            if (c === '^' || c === '!') {\n              braceNeg = true\n            }\n          } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n            inBrace = false\n          }\n          acc += c\n          continue\n        } else if (c === '[') {\n          inBrace = true\n          braceStart = i\n          braceNeg = false\n          acc += c\n          continue\n        }\n\n        if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n          ast.push(acc)\n          acc = ''\n          const ext = new AST(c, ast)\n          i = AST.#parseAST(str, ext, i, opt)\n          ast.push(ext)\n          continue\n        }\n        acc += c\n      }\n      ast.push(acc)\n      return i\n    }\n\n    // some kind of extglob, pos is at the (\n    // find the next | or )\n    let i = pos + 1\n    let part = new AST(null, ast)\n    const parts: AST[] = []\n    let acc = ''\n    while (i < str.length) {\n      const c = str.charAt(i++)\n      // still accumulate escapes at this point, but we do ignore\n      // starts that are escaped\n      if (escaping || c === '\\\\') {\n        escaping = !escaping\n        acc += c\n        continue\n      }\n\n      if (inBrace) {\n        if (i === braceStart + 1) {\n          if (c === '^' || c === '!') {\n            braceNeg = true\n          }\n        } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n          inBrace = false\n        }\n        acc += c\n        continue\n      } else if (c === '[') {\n        inBrace = true\n        braceStart = i\n        braceNeg = false\n        acc += c\n        continue\n      }\n\n      if (isExtglobType(c) && str.charAt(i) === '(') {\n        part.push(acc)\n        acc = ''\n        const ext = new AST(c, part)\n        part.push(ext)\n        i = AST.#parseAST(str, ext, i, opt)\n        continue\n      }\n      if (c === '|') {\n        part.push(acc)\n        acc = ''\n        parts.push(part)\n        part = new AST(null, ast)\n        continue\n      }\n      if (c === ')') {\n        if (acc === '' && ast.#parts.length === 0) {\n          ast.#emptyExt = true\n        }\n        part.push(acc)\n        acc = ''\n        ast.push(...parts, part)\n        return i\n      }\n      acc += c\n    }\n\n    // unfinished extglob\n    // if we got here, it was a malformed extglob! not an extglob, but\n    // maybe something else in there.\n    ast.type = null\n    ast.#hasMagic = undefined\n    ast.#parts = [str.substring(pos - 1)]\n    return i\n  }\n\n  static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n    const ast = new AST(null, undefined, options)\n    AST.#parseAST(pattern, ast, 0, options)\n    return ast\n  }\n\n  // returns the regular expression if there's magic, or the unescaped\n  // string if not.\n  toMMPattern(): MMRegExp | string {\n    // should only be called on root\n    /* c8 ignore start */\n    if (this !== this.#root) return this.#root.toMMPattern()\n    /* c8 ignore stop */\n    const glob = this.toString()\n    const [re, body, hasMagic, uflag] = this.toRegExpSource()\n    // if we're in nocase mode, and not nocaseMagicOnly, then we do\n    // still need a regular expression if we have to case-insensitively\n    // match capital/lowercase characters.\n    const anyMagic =\n      hasMagic ||\n      this.#hasMagic ||\n      (this.#options.nocase &&\n        !this.#options.nocaseMagicOnly &&\n        glob.toUpperCase() !== glob.toLowerCase())\n    if (!anyMagic) {\n      return body\n    }\n\n    const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n    return Object.assign(new RegExp(`^${re}$`, flags), {\n      _src: re,\n      _glob: glob,\n    })\n  }\n\n  get options() {\n    return this.#options\n  }\n\n  // returns the string match, the regexp source, whether there's magic\n  // in the regexp (so a regular expression is required) and whether or\n  // not the uflag is needed for the regular expression (for posix classes)\n  // TODO: instead of injecting the start/end at this point, just return\n  // the BODY of the regexp, along with the start/end portions suitable\n  // for binding the start/end in either a joined full-path makeRe context\n  // (where we bind to (^|/), or a standalone matchPart context (where\n  // we bind to ^, and not /).  Otherwise slashes get duped!\n  //\n  // In part-matching mode, the start is:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n  // - if dots allowed or not possible: ^\n  // - if dots possible and not allowed: ^(?!\\.)\n  // end is:\n  // - if not isEnd(): nothing\n  // - else: $\n  //\n  // In full-path matching mode, we put the slash at the START of the\n  // pattern, so start is:\n  // - if first pattern: same as part-matching mode\n  // - if not isStart(): nothing\n  // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n  // - if dots allowed or not possible: /\n  // - if dots possible and not allowed: /(?!\\.)\n  // end is:\n  // - if last pattern, same as part-matching mode\n  // - else nothing\n  //\n  // Always put the (?:$|/) on negated tails, though, because that has to be\n  // there to bind the end of the negated pattern portion, and it's easier to\n  // just stick it in now rather than try to inject it later in the middle of\n  // the pattern.\n  //\n  // We can just always return the same end, and leave it up to the caller\n  // to know whether it's going to be used joined or in parts.\n  // And, if the start is adjusted slightly, can do the same there:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n  // - if dots allowed or not possible: (?:/|^)\n  // - if dots possible and not allowed: (?:/|^)(?!\\.)\n  //\n  // But it's better to have a simpler binding without a conditional, for\n  // performance, so probably better to return both start options.\n  //\n  // Then the caller just ignores the end if it's not the first pattern,\n  // and the start always gets applied.\n  //\n  // But that's always going to be $ if it's the ending pattern, or nothing,\n  // so the caller can just attach $ at the end of the pattern when building.\n  //\n  // So the todo is:\n  // - better detect what kind of start is needed\n  // - return both flavors of starting pattern\n  // - attach $ at the end of the pattern when creating the actual RegExp\n  //\n  // Ah, but wait, no, that all only applies to the root when the first pattern\n  // is not an extglob. If the first pattern IS an extglob, then we need all\n  // that dot prevention biz to live in the extglob portions, because eg\n  // +(*|.x*) can match .xy but not .yx.\n  //\n  // So, return the two flavors if it's #root and the first child is not an\n  // AST, otherwise leave it to the child AST to handle it, and there,\n  // use the (?:^|/) style of start binding.\n  //\n  // Even simplified further:\n  // - Since the start for a join is eg /(?!\\.) and the start for a part\n  // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n  // or start or whatever) and prepend ^ or / at the Regexp construction.\n  toRegExpSource(\n    allowDot?: boolean\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    const dot = allowDot ?? !!this.#options.dot\n    if (this.#root === this) this.#fillNegs()\n    if (!this.type) {\n      const noEmpty = this.isStart() && this.isEnd()\n      const src = this.#parts\n        .map(p => {\n          const [re, _, hasMagic, uflag] =\n            typeof p === 'string'\n              ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n              : p.toRegExpSource(allowDot)\n          this.#hasMagic = this.#hasMagic || hasMagic\n          this.#uflag = this.#uflag || uflag\n          return re\n        })\n        .join('')\n\n      let start = ''\n      if (this.isStart()) {\n        if (typeof this.#parts[0] === 'string') {\n          // this is the string that will match the start of the pattern,\n          // so we need to protect against dots and such.\n\n          // '.' and '..' cannot match unless the pattern is that exactly,\n          // even if it starts with . or dot:true is set.\n          const dotTravAllowed =\n            this.#parts.length === 1 && justDots.has(this.#parts[0])\n          if (!dotTravAllowed) {\n            const aps = addPatternStart\n            // check if we have a possibility of matching . or ..,\n            // and prevent that.\n            const needNoTrav =\n              // dots are allowed, and the pattern starts with [ or .\n              (dot && aps.has(src.charAt(0))) ||\n              // the pattern starts with \\., and then [ or .\n              (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n              // the pattern starts with \\.\\., and then [ or .\n              (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n            // no need to prevent dots if it can't match a dot, or if a\n            // sub-pattern will be preventing it anyway.\n            const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n            start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n          }\n        }\n      }\n\n      // append the \"end of path portion\" pattern to negation tails\n      let end = ''\n      if (\n        this.isEnd() &&\n        this.#root.#filledNegs &&\n        this.#parent?.type === '!'\n      ) {\n        end = '(?:$|\\\\/)'\n      }\n      const final = start + src + end\n      return [\n        final,\n        unescape(src),\n        (this.#hasMagic = !!this.#hasMagic),\n        this.#uflag,\n      ]\n    }\n\n    // We need to calculate the body *twice* if it's a repeat pattern\n    // at the start, once in nodot mode, then again in dot mode, so a\n    // pattern like *(?) can match 'x.y'\n\n    const repeated = this.type === '*' || this.type === '+'\n    // some kind of extglob\n    const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n    let body = this.#partsToRegExp(dot)\n\n    if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n      // invalid extglob, has to at least be *something* present, if it's\n      // the entire path portion.\n      const s = this.toString()\n      this.#parts = [s]\n      this.type = null\n      this.#hasMagic = undefined\n      return [s, unescape(this.toString()), false, false]\n    }\n\n    // XXX abstract out this map method\n    let bodyDotAllowed =\n      !repeated || allowDot || dot || !startNoDot\n        ? ''\n        : this.#partsToRegExp(true)\n    if (bodyDotAllowed === body) {\n      bodyDotAllowed = ''\n    }\n    if (bodyDotAllowed) {\n      body = `(?:${body})(?:${bodyDotAllowed})*?`\n    }\n\n    // an empty !() is exactly equivalent to a starNoEmpty\n    let final = ''\n    if (this.type === '!' && this.#emptyExt) {\n      final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n    } else {\n      const close =\n        this.type === '!'\n          ? // !() must match something,but !(x) can match ''\n            '))' +\n            (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n            star +\n            ')'\n          : this.type === '@'\n          ? ')'\n          : this.type === '?'\n          ? ')?'\n          : this.type === '+' && bodyDotAllowed\n          ? ')'\n          : this.type === '*' && bodyDotAllowed\n          ? `)?`\n          : `)${this.type}`\n      final = start + body + close\n    }\n    return [\n      final,\n      unescape(body),\n      (this.#hasMagic = !!this.#hasMagic),\n      this.#uflag,\n    ]\n  }\n\n  #partsToRegExp(dot: boolean) {\n    return this.#parts\n      .map(p => {\n        // extglob ASTs should only contain parent ASTs\n        /* c8 ignore start */\n        if (typeof p === 'string') {\n          throw new Error('string type in extglob ast??')\n        }\n        /* c8 ignore stop */\n        // can ignore hasMagic, because extglobs are already always magic\n        const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n        this.#uflag = this.#uflag || uflag\n        return re\n      })\n      .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n      .join('|')\n  }\n\n  static #parseGlob(\n    glob: string,\n    hasMagic: boolean | undefined,\n    noEmpty: boolean = false\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    let escaping = false\n    let re = ''\n    let uflag = false\n    for (let i = 0; i < glob.length; i++) {\n      const c = glob.charAt(i)\n      if (escaping) {\n        escaping = false\n        re += (reSpecials.has(c) ? '\\\\' : '') + c\n        continue\n      }\n      if (c === '\\\\') {\n        if (i === glob.length - 1) {\n          re += '\\\\\\\\'\n        } else {\n          escaping = true\n        }\n        continue\n      }\n      if (c === '[') {\n        const [src, needUflag, consumed, magic] = parseClass(glob, i)\n        if (consumed) {\n          re += src\n          uflag = uflag || needUflag\n          i += consumed - 1\n          hasMagic = hasMagic || magic\n          continue\n        }\n      }\n      if (c === '*') {\n        if (noEmpty && glob === '*') re += starNoEmpty\n        else re += star\n        hasMagic = true\n        continue\n      }\n      if (c === '?') {\n        re += qmark\n        hasMagic = true\n        continue\n      }\n      re += regExpEscape(c)\n    }\n    return [re, unescape(glob), !!hasMagic, uflag]\n  }\n}\n","import { MinimatchOptions } from './index.js'\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character.  In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n */\nexport const escape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n  // don't need to escape +@! because we escape the parens\n  // that make those magic, and escaping ! as [!] isn't valid,\n  // because [!]] is a valid glob class meaning not ']'.\n  return windowsPathsNoEscape\n    ? s.replace(/[?*()[\\]]/g, '[$&]')\n    : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n","/**\n * Credential detection patterns for the replay pipeline.\n *\n * Two-layer defense against credential leaks in .fern/replay.lock:\n *   Layer 1 — file-level: SENSITIVE_FILE_PATTERNS blocks entire files (.env, .pem, etc.)\n *   Layer 2 — content-level: CREDENTIAL_PATTERNS catches inline secrets in any file\n *\n * These patterns mirror the invariant assertions in __tests__/invariants/i4-credential-containment.ts.\n * If they diverge, the invariant tests independently catch real leaks.\n */\n\nexport interface CredentialPattern {\n    name: string;\n    re: RegExp;\n}\n\nexport const CREDENTIAL_PATTERNS: ReadonlyArray<CredentialPattern> = [\n    { name: \"PRIVATE KEY block\", re: /-----BEGIN [A-Z ]*PRIVATE KEY-----/ },\n    { name: \"OPENSSH key\", re: /-----BEGIN OPENSSH PRIVATE KEY-----/ },\n    { name: \"RSA key\", re: /-----BEGIN RSA PRIVATE KEY-----/ },\n    { name: \"CERTIFICATE\", re: /-----BEGIN CERTIFICATE-----/ },\n    { name: \"TOKEN=\", re: /\\bTOKEN\\s*=\\s*[\"']?[A-Za-z0-9._\\-+/=]{10,}/ },\n    { name: \"api_key=\", re: /\\bapi[_-]?key\\s*=\\s*[\"']?[A-Za-z0-9._\\-+/=]{10,}/i },\n    { name: \"password=\", re: /\\bpassword\\s*=\\s*[\"']?[^\\s\"']{6,}/i },\n    { name: \"AWS_SECRET_ACCESS_KEY\", re: /AWS_SECRET_ACCESS_KEY/ },\n    { name: \"JWT (eyJ...)\", re: /\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b/ },\n];\n\nexport const SENSITIVE_FILE_PATTERNS: ReadonlyArray<RegExp> = [\n    /(^|\\/)\\.env(\\.[^/]+)?$/,\n    /\\.pem$/,\n    /\\.key$/,\n    /\\.pkce_state\\.json$/,\n    /(^|\\/)id_rsa$/,\n    /(^|\\/)id_ed25519$/,\n];\n\n/** Check if a file path matches any sensitive file pattern. */\nexport function isSensitiveFile(filePath: string): boolean {\n    return SENSITIVE_FILE_PATTERNS.some((re) => re.test(filePath));\n}\n\n/** Scan content for credential patterns. Returns matched pattern names. */\nexport function scanForCredentials(content: string): string[] {\n    const matches: string[] = [];\n    for (const { name, re } of CREDENTIAL_PATTERNS) {\n        if (re.test(content)) {\n            matches.push(name);\n        }\n    }\n    return matches;\n}\n","import { createHash } from \"node:crypto\";\nimport { minimatch } from \"minimatch\";\nimport { isSensitiveFile } from \"./credentials.js\";\nimport { isBinaryFile } from \"./shared/binary.js\";\nimport { isGenerationBoundary, isGenerationCommit, isRevertCommit, parseRevertedMessage, parseRevertedSha } from \"./git/CommitDetection.js\";\nimport type { GitClient } from \"./git/GitClient.js\";\nimport type { LockfileManager } from \"./LockfileManager.js\";\nimport type { CommitInfo, DegradedReason, GenerationLock, GenerationRecord, StoredPatch } from \"./types.js\";\n\n// Infrastructure files managed by the generation pipeline, not user code.\n// Changes to these should never be captured as customization patches.\nconst INFRASTRUCTURE_FILES = new Set([\".fernignore\"]);\n\nfunction matchesFernignorePattern(filePath: string, patterns: readonly string[]): boolean {\n    if (patterns.length === 0) return false;\n    return patterns.some((rawPattern) => {\n        // Gitignore directory syntax: `docs/` means the directory and\n        // everything underneath it. Strip the trailing slash so the exact,\n        // glob, and bare-directory checks below all apply.\n        const p = rawPattern.endsWith(\"/\") ? rawPattern.slice(0, -1) : rawPattern;\n        if (filePath === p) return true;\n        if (minimatch(filePath, p)) return true;\n        // Gitignore-style: a bare directory name (no wildcard) also\n        // matches all paths underneath it. Customers commonly write\n        // `api-report` (not `api-report/**`) and expect children to be\n        // protected. This expansion mirrors fern's wipe semantics.\n        if (!p.includes(\"*\") && !p.includes(\"?\") && filePath.startsWith(p + \"/\")) return true;\n        return false;\n    });\n}\n\n/**\n * Parse the `diff --git a/<p> b/<p>` headers out of a `git format-patch` blob\n * and classify each file as a creation (`new file mode …`), deletion\n * (`deleted file mode …`), or neither (modify / rename / chmod).\n *\n * Only handles the unquoted `a/…` `b/…` form — git quotes paths that contain\n * control characters or non-UTF-8 bytes (`\"a/weird\\tname.txt\"`), which the\n * parser skips. SDK files don't contain such characters in practice; if that\n * assumption is ever violated, quoted headers yield `currentPath = null` and\n * are silently ignored (false negative, never a false positive).\n */\nfunction parsePatchFileHeaders(patchContent: string): Array<{ path: string; isCreate: boolean; isDelete: boolean }> {\n    const results: Array<{ path: string; isCreate: boolean; isDelete: boolean }> = [];\n    let currentPath: string | null = null;\n    let currentIsCreate = false;\n    let currentIsDelete = false;\n\n    const flush = () => {\n        if (currentPath !== null) {\n            results.push({ path: currentPath, isCreate: currentIsCreate, isDelete: currentIsDelete });\n        }\n    };\n\n    for (const line of patchContent.split(\"\\n\")) {\n        if (line.startsWith(\"diff --git \")) {\n            flush();\n            currentPath = null;\n            currentIsCreate = false;\n            currentIsDelete = false;\n            // Unquoted form: \"diff --git a/<path> b/<path>\". Non-greedy matching\n            // handles paths with spaces (e.g. \"sdk files/helper.py\") in the common\n            // case. Pathological paths containing the literal substring \" b/\" are\n            // mis-parsed; see the docstring for the safety argument (false\n            // negatives are harmless, false positives are impossible).\n            const match = line.match(/^diff --git a\\/(.+?) b\\/(.+?)$/);\n            if (match) {\n                // Track both sides — rename commits have a != b. Creations and\n                // deletions always have a == b, so we record the (post-rename)\n                // \"b\" path which is what `patch.files` will contain.\n                currentPath = match[2] ?? null;\n            }\n        } else if (currentPath !== null) {\n            if (line.startsWith(\"new file mode \")) {\n                currentIsCreate = true;\n            } else if (line.startsWith(\"deleted file mode \")) {\n                currentIsDelete = true;\n            }\n        }\n    }\n    flush();\n    return results;\n}\n\nasync function capturePatchSnapshot(\n    git: GitClient,\n    files: string[],\n    treeish: string,\n): Promise<Record<string, string>> {\n    const snapshot: Record<string, string> = {};\n    for (const file of files) {\n        if (isBinaryFile(file)) continue;\n        const content = await git.showFile(treeish, file).catch(() => null);\n        if (content != null) snapshot[file] = content;\n    }\n    return snapshot;\n}\n\nfunction filterInfrastructureAndSensitiveFiles(\n    rawFilesOutput: string,\n    fernignorePatterns: readonly string[],\n): { files: string[]; sensitiveFiles: string[]; fernignoredFiles: string[]; infrastructureFiles: string[] } {\n    const rawFiles = rawFilesOutput.trim().split(\"\\n\").filter(Boolean);\n    const infrastructureFiles = rawFiles.filter((f) => INFRASTRUCTURE_FILES.has(f) || f.startsWith(\".fern/\"));\n    const allFiles = rawFiles.filter((f) => !INFRASTRUCTURE_FILES.has(f) && !f.startsWith(\".fern/\"));\n    const sensitiveFiles = allFiles.filter((f) => isSensitiveFile(f));\n    const nonSensitive = allFiles.filter((f) => !isSensitiveFile(f));\n    // ADR 0002: `.fernignore`-matched files are invisible to Replay. They\n    // never enter `patch.files`, `patch_content`, or `theirs_snapshot`.\n    const fernignoredFiles = nonSensitive.filter((f) => matchesFernignorePattern(f, fernignorePatterns));\n    const files = nonSensitive.filter((f) => !matchesFernignorePattern(f, fernignorePatterns));\n    return { files, sensitiveFiles, fernignoredFiles, infrastructureFiles };\n}\n\nexport interface DetectionResult {\n    patches: StoredPatch[];\n    revertedPatchIds: string[];\n}\n\n/**\n * Result of materializing a commit into patch content through the exact\n * pipeline detection uses (file filtering → scoped diff or format-patch →\n * content hash). `sensitiveFiles` / `fernignoredFiles` are surfaced so\n * callers can emit the same customer-facing warnings detection does.\n *\n * - `ok` — patch content and its content hash were produced.\n * - `unreachable` — the commit (or its patch text) could not be read, e.g.\n *   a shallow clone window or a GC'd object.\n * - `empty` — nothing survives filtering (only infrastructure / sensitive /\n *   fernignored files, or the scoped diff is empty).\n */\nexport type MaterializedCommitPatch =\n    | {\n          status: \"ok\";\n          files: string[];\n          sensitiveFiles: string[];\n          fernignoredFiles: string[];\n          patchContent: string;\n          contentHash: string;\n      }\n    | { status: \"unreachable\"; sensitiveFiles: string[]; fernignoredFiles: string[] }\n    | { status: \"empty\"; sensitiveFiles: string[]; fernignoredFiles: string[] };\n\nexport class ReplayDetector {\n    private git: GitClient;\n    private lockManager: LockfileManager;\n    private sdkOutputDir: string;\n    private fernignorePatterns: readonly string[];\n    readonly warnings: string[] = [];\n    /**\n     * Structured degraded-state channel, mirroring `warnings`. Populated when\n     * detection cannot guarantee customizations were carried forward (baseline\n     * unreachable in this clone). Cleared per-run by `ReplayService.prepareReplay`\n     * alongside `warnings`. Merged into `ReplayReport.degradedReasons` by each\n     * flow handler. Degraded is observability only: detection results are\n     * unchanged.\n     */\n    readonly degradedReasons: DegradedReason[] = [];\n\n    constructor(\n        git: GitClient,\n        lockManager: LockfileManager,\n        sdkOutputDir: string,\n        fernignorePatterns: readonly string[] = [],\n    ) {\n        this.git = git;\n        this.lockManager = lockManager;\n        this.sdkOutputDir = sdkOutputDir;\n        this.fernignorePatterns = fernignorePatterns;\n    }\n\n    /**\n     * Derive the previous-generation SHA from git history instead of trusting\n     * `lock.current_generation`.\n     *\n     * Walks `git log HEAD --first-parent` and returns the SHA of the most recent\n     * commit that `isGenerationBoundary` classifies as a customization-baseline\n     * boundary, or null if no such commit is reachable from HEAD on the mainline.\n     *\n     * `isGenerationBoundary` is intentionally narrower than `isGenerationCommit`:\n     * it excludes `[fern-autoversion]` (lightweight bumps that don't reset the\n     * baseline) and the GitHub merge-commit subject for fern-bot regen PRs\n     * (which sits on first-parent but where the customer fix-up commits live\n     * on second-parent — stopping at the merge would hide them).\n     *\n     * See docs/adr/0001-derived-scan-boundary.md.\n     */\n    async findPreviousGenerationFromHistory(): Promise<string | null> {\n        let log: string;\n        try {\n            log = await this.git.exec([\n                \"log\",\n                \"--first-parent\",\n                \"--format=%H%x00%an%x00%ae%x00%s\",\n                \"HEAD\",\n            ]);\n        } catch {\n            return null;\n        }\n\n        for (const commit of this.parseGitLog(log)) {\n            // Use the narrower `isGenerationBoundary` predicate — autoversion\n            // commits skip the detector but DON'T reset the customization\n            // baseline, so they must not be treated as the scan boundary.\n            if (isGenerationBoundary(commit)) {\n                return commit.sha;\n            }\n        }\n\n        // Fallback: the first-parent walk found no boundary. This happens when the only\n        // [fern-generated] commit lives on a merge's SECOND parent (e.g. a regen PR merged\n        // via \"Create a merge commit\"). `--first-parent` never visits it, so walk the full\n        // graph (excluding merge commits themselves) before giving up — otherwise the\n        // boundary is invisible and the customer's customizations are silently dropped.\n        // Safety: only reached when first-parent found nothing, so we cannot pick a\n        // boundary on an unrelated branch ahead of the mainline one.\n        let fullLog: string;\n        try {\n            fullLog = await this.git.exec([\n                \"log\",\n                \"--no-merges\",\n                \"--format=%H%x00%an%x00%ae%x00%s\",\n                \"HEAD\",\n            ]);\n        } catch {\n            return null;\n        }\n        for (const commit of this.parseGitLog(fullLog)) {\n            if (isGenerationBoundary(commit)) {\n                return commit.sha;\n            }\n        }\n        return null;\n    }\n\n    async detectNewPatches(): Promise<DetectionResult> {\n        const lock = this.lockManager.read();\n\n        // Prefer the previous-generation SHA derived from git history. This\n        // self-heals when `lock.current_generation` is stale (orphaned by a\n        // squash-merge, GC'd, or pointing at an older generation than what's\n        // actually reachable from HEAD). See docs/adr/0001-derived-scan-boundary.md.\n        const derivedSha = await this.findPreviousGenerationFromHistory();\n        if (derivedSha !== null) {\n            const derivedRecord = await this.synthesizeGenerationRecord(derivedSha);\n            return this.detectPatchesInRange(derivedSha, derivedRecord, lock);\n        }\n\n        const lastGen = this.getLastGeneration(lock);\n        if (!lastGen) {\n            // Guard against silent 0-patch loss. When `current_generation` is set, the\n            // lockfile was tracking a prior generation that is now unresolvable (no\n            // boundary in history AND no matching record in `lock.generations`). We\n            // cannot recover patches without a baseline, but staying silent would let\n            // the next regeneration drop the customer's customizations unnoticed.\n            if (lock.current_generation) {\n                this.warnings.push(\n                    `No generation boundary found in git history and the lockfile's recorded ` +\n                    `generation (${lock.current_generation.slice(0, 7)}) matches no entry in its ` +\n                    `generation records. Customer customizations may differ from the last known ` +\n                    `generation and could be lost on the next regeneration. Run ` +\n                    `\\`fern-replay bootstrap --force\\` to re-initialize tracking.`\n                );\n                // Structured channel: no baseline at all = this run cannot\n                // verify customizations were carried forward.\n                this.degradedReasons.push({\n                    code: \"baseline-unresolvable\",\n                    message:\n                        `The previous generation recorded in the lockfile ` +\n                        `(${lock.current_generation.slice(0, 7)}) could not be resolved to any ` +\n                        `reachable baseline during this run. Customizations may not have been ` +\n                        `carried forward — review the result before merging.`,\n                });\n            }\n            return { patches: [], revertedPatchIds: [] };\n        }\n\n        // Lockfile-driven fall-through. Two cases reach here:\n        //  - Shallow clone where the generation commit isn't in the clone\n        //    window. `commitExists` returns false; `detectPatchesViaTreeDiff`\n        //    recovers from the recorded `tree_hash` (commit-free).\n        //  - Pathological topology where the recorded generation is reachable\n        //    in the object database but not on HEAD's first-parent line.\n        //    Rare; we route through tree-diff for safety.\n        //\n        // The pre-FER-10498 `detectPatchesViaMergeBase` recovery is gone —\n        // first-parent walking in `findPreviousGenerationFromHistory` handles\n        // squash-merge orphaning directly.\n        const exists = await this.git.commitExists(lastGen.commit_sha);\n        if (!exists) {\n            this.warnings.push(\n                `Generation commit ${lastGen.commit_sha.slice(0, 7)} not found in git history. ` +\n                    `Falling back to tree-diff detection (likely a shallow clone).`\n            );\n            // Structured channel: when tracked patches exist, an unreachable\n            // anchor means they cannot be verified against their baseline.\n            // With zero tracked patches, tree-diff recovery against a\n            // reachable tree is recovery, not degradation — warning only.\n            if (lock.patches.length > 0) {\n                this.degradedReasons.push({\n                    code: \"generation-anchor-unreachable\",\n                    message:\n                        `The previous generation (${lastGen.commit_sha.slice(0, 7)}) was not ` +\n                        `reachable during this run, and ${lock.patches.length} tracked ` +\n                        `customization(s) could not be verified against it. Customizations may ` +\n                        `not have been carried forward — review the result before merging.`,\n                });\n            }\n            return this.detectPatchesViaTreeDiff(lastGen, /* commitKnownMissing */ true);\n        }\n\n        return this.detectPatchesInRange(lastGen.commit_sha, lastGen, lock);\n    }\n\n    /**\n     * Walk `${rangeStart}..HEAD`, classify each commit, emit one\n     * `StoredPatch` per customer commit. Body shared by the linear path\n     * (rangeStart = lastGen.commit_sha) and the merge-base path.\n     *\n     * Patch `base_generation` is always `lastGen.commit_sha` — the\n     * lockfile-tracked reference the applicator uses to fetch base file\n     * content, regardless of where the walk actually started.\n     */\n    private async detectPatchesInRange(\n        rangeStart: string,\n        lastGen: GenerationRecord,\n        lock: GenerationLock,\n    ): Promise<DetectionResult> {\n        // `--no-merges` walks every non-merge commit reachable in the range,\n        // including ones that arrived via a merged-in branch (e.g. a regen PR\n        // merged with \"Create a merge commit\"). The prior `--first-parent`\n        // would skip those silently, dropping customer fix-up commits.\n        // Merge-commit-only edits (\"evil merges\") are a known limitation.\n        const log = await this.git.exec([\n            \"log\",\n            \"--no-merges\",\n            \"--format=%H%x00%an%x00%ae%x00%s\",\n            `${rangeStart}..HEAD`,\n            \"--\",\n            this.sdkOutputDir\n        ]);\n\n        if (!log.trim()) {\n            return { patches: [], revertedPatchIds: [] };\n        }\n\n        const commits = this.parseGitLog(log);\n        const newPatches: StoredPatch[] = [];\n        const forgottenHashes = new Set(lock.forgotten_hashes ?? []);\n\n        for (const commit of commits) {\n            if (isGenerationCommit(commit)) {\n                continue;\n            }\n\n            if (lock.patches.find((p) => p.original_commit === commit.sha)) {\n                continue;\n            }\n\n            const materialized = await this.materializeCommitPatch(commit.sha);\n\n            if (materialized.sensitiveFiles.length > 0) {\n                this.warnings.push(\n                    `Sensitive file(s) excluded from patch for commit ${commit.sha.slice(0, 7)}: ` +\n                    `${materialized.sensitiveFiles.join(\", \")}. These files will not be tracked by replay.`\n                );\n            }\n\n            if (materialized.fernignoredFiles.length > 0) {\n                this.warnings.push(\n                    `.fernignore-protected file(s) excluded from patch for commit ${commit.sha.slice(0, 7)}: ` +\n                    `${materialized.fernignoredFiles.join(\", \")}. These files are managed by .fernignore, not Replay.`\n                );\n            }\n\n            if (materialized.status === \"unreachable\") {\n                this.warnings.push(\n                    `Could not generate patch for commit ${commit.sha.slice(0, 7)} — ` +\n                    `it may be unreachable in a shallow clone. Skipping.`\n                );\n                continue;\n            }\n\n            // Skip patches that only touch infrastructure/sensitive/fernignored files.\n            if (materialized.status === \"empty\") {\n                continue;\n            }\n\n            const { files, patchContent, contentHash } = materialized;\n            if (lock.patches.find((p) => p.content_hash === contentHash) || forgottenHashes.has(contentHash)) {\n                continue;\n            }\n\n            // Snapshot THEIRS from the customer's commit tree (post-edit content).\n            const theirsSnapshot = await capturePatchSnapshot(this.git, files, commit.sha);\n\n            newPatches.push({\n                id: `patch-${commit.sha.slice(0, 8)}`,\n                content_hash: contentHash,\n                original_commit: commit.sha,\n                original_message: commit.message,\n                original_author: `${commit.authorName} <${commit.authorEmail}>`,\n                base_generation: lastGen.commit_sha,\n                files,\n                patch_content: patchContent,\n                ...(Object.keys(theirsSnapshot).length > 0 ? { theirs_snapshot: theirsSnapshot } : {}),\n                ...(this.isCreationOnlyPatch(patchContent) ? { user_owned: true } : {})\n            });\n        }\n\n        // Collapse zero-net-change files. Each commit becomes its own\n        // patch, so a file created in commit A and deleted in commit B\n        // survives as two patches whose cumulative diff is empty. This\n        // filter drops such patches before they reach the lockfile — and\n        // importantly, this also prevents committed-then-deleted\n        // credentials (.env, .pem) from leaking their contents verbatim\n        // into replay.lock.\n        const survivingPatches = await this.collapseNetZeroFiles(newPatches);\n\n        // Reverse so patches apply in chronological order (oldest first)\n        survivingPatches.reverse();\n\n        // Reconcile revert commits: match against existing and newly-detected patches.\n        // Uses a Set for revertedPatchIds to avoid duplicate counting when multiple\n        // reverts target the same patch.\n        const revertedPatchIdSet = new Set<string>();\n        const revertIndicesToRemove = new Set<number>();\n\n        for (let i = 0; i < survivingPatches.length; i++) {\n            const patch = survivingPatches[i]!;\n            if (!isRevertCommit(patch.original_message)) continue;\n\n            // Get full commit body for SHA extraction. May fail in shallow clones\n            // or if the commit was GC'd — fall back to message-only matching.\n            let body = \"\";\n            try {\n                body = await this.git.getCommitBody(patch.original_commit);\n            } catch {\n                // Shallow clone or unreachable commit — message matching only\n            }\n            const revertedSha = parseRevertedSha(body);\n            const revertedMessage = parseRevertedMessage(patch.original_message);\n\n            // Try to match against existing lockfile patches\n            let matchedExisting = false;\n            if (revertedSha) {\n                const existing = lock.patches.find((p) => p.original_commit === revertedSha);\n                if (existing) {\n                    revertedPatchIdSet.add(existing.id);\n                    revertIndicesToRemove.add(i);\n                    matchedExisting = true;\n                }\n            }\n            if (!matchedExisting && revertedMessage) {\n                const existing = lock.patches.find((p) => p.original_message === revertedMessage);\n                if (existing) {\n                    revertedPatchIdSet.add(existing.id);\n                    revertIndicesToRemove.add(i);\n                    matchedExisting = true;\n                }\n            }\n\n            if (matchedExisting) continue;\n\n            // Try to match against newly-detected patches in the same run\n            let matchedNew = false;\n            if (revertedSha) {\n                const idx = survivingPatches.findIndex(\n                    (p, j) => j !== i && !revertIndicesToRemove.has(j) && p.original_commit === revertedSha\n                );\n                if (idx !== -1) {\n                    revertIndicesToRemove.add(i);\n                    revertIndicesToRemove.add(idx);\n                    matchedNew = true;\n                }\n            }\n            if (!matchedNew && revertedMessage) {\n                const idx = survivingPatches.findIndex(\n                    (p, j) => j !== i && !revertIndicesToRemove.has(j) && p.original_message === revertedMessage\n                );\n                if (idx !== -1) {\n                    revertIndicesToRemove.add(i);\n                    revertIndicesToRemove.add(idx);\n                }\n            }\n\n            // Unmatched revert: the original commit predates replay (e.g. .fernignore era).\n            // A revert is never a customization — drop it so it doesn't become a patch.\n            if (!matchedExisting && !matchedNew) {\n                revertIndicesToRemove.add(i);\n            }\n        }\n\n        const filteredPatches = survivingPatches.filter((_, i) => !revertIndicesToRemove.has(i));\n        return { patches: filteredPatches, revertedPatchIds: [...revertedPatchIdSet] };\n    }\n\n    /**\n     * Materialize a commit into patch content exactly as detection does.\n     *\n     * Pipeline: `diff-tree --name-only` → filter infrastructure / sensitive /\n     * `.fernignore`d files → scoped `git diff` when files were stripped,\n     * otherwise full `git format-patch` → content hash.\n     *\n     * This is THE definition of a commit's re-emission identity: the content\n     * hash this method returns is what `detectPatchesInRange` will compute if\n     * the commit re-enters the scan range (e.g. after a regen PR is merged\n     * with a merge commit). Callers that tombstone a dismissed patch must use\n     * this hash — the stored `content_hash` drifts every time the patch is\n     * carried forward, so it does not identify the commit on re-detection.\n     *\n     * Never throws; failures are reported through the `status` discriminant.\n     */\n    async materializeCommitPatch(sha: string): Promise<MaterializedCommitPatch> {\n        let parents: string[];\n        let filesOutput: string;\n        try {\n            parents = await this.git.getCommitParents(sha);\n            filesOutput = await this.git.exec([\"diff-tree\", \"--no-commit-id\", \"--name-only\", \"-r\", sha]);\n        } catch {\n            return { status: \"unreachable\", sensitiveFiles: [], fernignoredFiles: [] };\n        }\n\n        const { files, sensitiveFiles, fernignoredFiles, infrastructureFiles } =\n            filterInfrastructureAndSensitiveFiles(filesOutput, this.fernignorePatterns);\n\n        // Nothing survives filtering — only infrastructure/sensitive/fernignored files.\n        if (files.length === 0) {\n            return { status: \"empty\", sensitiveFiles, fernignoredFiles };\n        }\n\n        // When ANY files were stripped (infrastructure, sensitive, or\n        // fernignored), use a diff scoped to the surviving files so\n        // `patch_content` matches `files`. This prevents infrastructure file\n        // changes (e.g. .fernignore edits) from being bundled into patches and\n        // silently re-applied on every regeneration.\n        const wasFiltered =\n            sensitiveFiles.length > 0 || fernignoredFiles.length > 0 || infrastructureFiles.length > 0;\n        const parentSha = parents[0];\n        let patchContent: string;\n        if (wasFiltered && parentSha) {\n            try {\n                patchContent = await this.git.exec([\"diff\", parentSha, sha, \"--\", ...files]);\n            } catch {\n                return { status: \"empty\", sensitiveFiles, fernignoredFiles };\n            }\n            if (!patchContent.trim()) {\n                return { status: \"empty\", sensitiveFiles, fernignoredFiles };\n            }\n        } else {\n            try {\n                patchContent = await this.git.formatPatch(sha);\n            } catch {\n                return { status: \"unreachable\", sensitiveFiles, fernignoredFiles };\n            }\n        }\n\n        return {\n            status: \"ok\",\n            files,\n            sensitiveFiles,\n            fernignoredFiles,\n            patchContent,\n            contentHash: this.computeContentHash(patchContent),\n        };\n    }\n\n    /**\n     * Compute content hash for deduplication.\n     *\n     * Produces a format-agnostic hash so both `git format-patch` output\n     * (email-wrapped) and plain `git diff` output hash to the same value\n     * when the underlying diff hunks are identical.\n     *\n     * Normalization:\n     *   1. Strip email wrapper: everything before the first `diff --git` line\n     *      (From:, Subject:, Date:, diffstat, blank separators).\n     *   2. Strip `index` lines (blob SHA pairs change across rebases).\n     *   3. Strip trailing git version marker (`-- \\n<version>`).\n     *\n     * This ensures content hashes match across the no-patches and normal-\n     * regeneration flows, which store formatPatch and git-diff formats\n     * respectively.\n     */\n    computeContentHash(patchContent: string): string {\n        const lines = patchContent.split(\"\\n\");\n\n        // Strip email wrapper: everything before the first 'diff --git'\n        const diffStart = lines.findIndex((l) => l.startsWith(\"diff --git \"));\n        const relevantLines = diffStart > 0 ? lines.slice(diffStart) : lines;\n\n        const normalized = relevantLines\n            .filter((line) => !line.startsWith(\"index \"))\n            .join(\"\\n\")\n            // Strip trailing git version marker (\"-- \\n2.x.x\")\n            .replace(/\\n-- \\n[\\d]+\\.[\\d]+[^\\n]*\\s*$/, \"\");\n\n        return `sha256:${createHash(\"sha256\").update(normalized).digest(\"hex\")}`;\n    }\n\n    /**\n     * Drop patches whose files were transiently created and then deleted\n     * within the current linear detection window, and are absent from\n     * HEAD at the end of the window.\n     *\n     * Rationale: each commit becomes its own patch, so a file that was\n     * briefly added and later removed survives as a create+delete pair whose\n     * cumulative diff is empty. We drop such patches before they reach the\n     * lockfile.\n     *\n     * A file is \"transient\" when:\n     *   1. some patch in the window sets `new file mode` for it (a creation), AND\n     *   2. some patch in the window sets `deleted file mode` for it (a deletion), AND\n     *   3. it is absent from HEAD's tree.\n     *\n     * The HEAD guard (#3) prevents false positives when a file is deleted\n     * and then recreated with different content — the cumulative diff of\n     * such a pair is non-empty and must be preserved.\n     *\n     * This only drops patches whose `files` are a subset of the transient\n     * set. A partial-transient patch (one that touches a transient file\n     * alongside a persistent one) is left unmodified; surgical stripping of\n     * single files from a multi-file patch would require a follow-up that\n     * regenerates the patch content via `git format-patch -- <files>`. No\n     * current failing test exercises this, and leaving the patch intact\n     * preserves today's behaviour. Revisit if a future adversarial test\n     * demands per-file stripping.\n     */\n    private async collapseNetZeroFiles(patches: StoredPatch[]): Promise<StoredPatch[]> {\n        if (patches.length === 0) return patches;\n\n        type FileState = { created: boolean; deleted: boolean };\n        const stateByFile = new Map<string, FileState>();\n\n        for (const patch of patches) {\n            for (const header of parsePatchFileHeaders(patch.patch_content)) {\n                if (!header.isCreate && !header.isDelete) continue;\n                const prior = stateByFile.get(header.path) ?? { created: false, deleted: false };\n                if (header.isCreate) prior.created = true;\n                if (header.isDelete) prior.deleted = true;\n                stateByFile.set(header.path, prior);\n            }\n        }\n\n        // No file has both a create and a delete event in the window → nothing to collapse.\n        let anyCandidate = false;\n        for (const state of stateByFile.values()) {\n            if (state.created && state.deleted) { anyCandidate = true; break; }\n        }\n        if (!anyCandidate) return patches;\n\n        const headFiles = await this.listHeadFiles();\n\n        const transient = new Set<string>();\n        for (const [file, state] of stateByFile) {\n            if (state.created && state.deleted && !headFiles.has(file)) {\n                transient.add(file);\n            }\n        }\n\n        if (transient.size === 0) return patches;\n\n        return patches.filter((patch) => !patch.files.every((f) => transient.has(f)));\n    }\n\n    /**\n     * List every tracked path at HEAD (one `git ls-tree -r` invocation).\n     * Returns an empty Set if HEAD is unborn or the invocation fails — the\n     * caller then treats every candidate as \"not in HEAD\" and may collapse\n     * more aggressively. On typical SDK repos this is a single sub-10ms call.\n     */\n    private async listHeadFiles(): Promise<Set<string>> {\n        try {\n            const out = await this.git.exec([\"ls-tree\", \"-r\", \"--name-only\", \"HEAD\"]);\n            return new Set(out.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n        } catch {\n            return new Set();\n        }\n    }\n\n    /**\n     * Detect patches via tree diff for non-linear history. Returns a composite patch.\n     * Revert reconciliation is skipped here because tree-diff produces a single composite\n     * patch from the aggregate diff — individual revert commits are not distinguishable.\n     */\n    private async detectPatchesViaTreeDiff(\n        lastGen: GenerationRecord,\n        commitKnownMissing: boolean\n    ): Promise<DetectionResult> {\n        // Use commit_sha if reachable, fall back to tree_hash for unreachable commits.\n        // git diff accepts both commit and tree objects as arguments.\n        const diffBase = await this.resolveDiffBase(lastGen, commitKnownMissing);\n        if (!diffBase) {\n            // Both commit and tree are gone (aggressive GC / shallow clone with\n            // the generation outside the window). Fall back to scanning all\n            // commits from HEAD and filtering against known lockfile patches.\n            //\n            // This transition was previously SILENT — the production incident\n            // path: the commit scan cannot see customizations older than the\n            // clone window, so a regen PR can wipe customer code with zero\n            // signal. Always loud, regardless of how many patches are tracked.\n            this.warnings.push(\n                `Neither the previous generation's commit (${lastGen.commit_sha.slice(0, 7)}) ` +\n                    `nor its recorded tree was reachable during this run. Falling back to a ` +\n                    `bounded commit scan, which cannot see customizations older than the clone ` +\n                    `window. Widen the clone window (e.g. \\`git fetch --unshallow\\`) and re-run ` +\n                    `replay to verify customizations were carried forward.`\n            );\n            this.degradedReasons.push({\n                code: \"generation-tree-unreachable\",\n                message:\n                    `The previous generation (${lastGen.commit_sha.slice(0, 7)}) was not ` +\n                    `reachable during this run — neither its commit nor its recorded tree. ` +\n                    `Customizations may not have been carried forward — review the result ` +\n                    `before merging, or widen the clone window and re-run replay.`,\n            });\n            return this.detectPatchesViaCommitScan();\n        }\n\n        // Data-integrity guard: composite patches must anchor on a recorded\n        // [fern-generated] commit. When the original generation commit is\n        // gone and diffBase resolves to some pre-Fern commit, emitting a\n        // composite patch with that diffBase as base_generation would\n        // orphan the patch — `resolveBaseGeneration` only finds SHAs in\n        // `lock.generations`. Re-anchor on the lockfile's recorded\n        // generation instead so downstream remains consistent.\n        const lockForGuard = this.lockManager.read();\n        const knownGenerations = new Set(lockForGuard.generations.map((g) => g.commit_sha));\n        let resolvedBaseGeneration = commitKnownMissing ? diffBase : lastGen.commit_sha;\n        if (commitKnownMissing && !knownGenerations.has(diffBase)) {\n            const fallback = lockForGuard.current_generation\n                ?? lockForGuard.generations[lockForGuard.generations.length - 1]?.commit_sha;\n            if (!fallback) {\n                this.warnings.push(\n                    `Composite-patch fallback skipped: diff base ${diffBase.slice(0, 7)} ` +\n                    `is not a recorded generation and the lockfile has no recorded generations ` +\n                    `to anchor on. Customer customizations on disk are preserved; tracked ` +\n                    `patches will resume on the next regeneration.`\n                );\n                return { patches: [], revertedPatchIds: [] };\n            }\n            resolvedBaseGeneration = fallback;\n        }\n\n        // Get changed files first, then filter before computing the diff\n        const filesOutput = await this.git.exec([\"diff\", \"--name-only\", diffBase, \"HEAD\"]);\n        const { files, sensitiveFiles, fernignoredFiles } = filterInfrastructureAndSensitiveFiles(\n            filesOutput,\n            this.fernignorePatterns,\n        );\n\n        if (sensitiveFiles.length > 0) {\n            this.warnings.push(\n                `Sensitive file(s) excluded from composite patch: ` +\n                `${sensitiveFiles.join(\", \")}. These files will not be tracked by replay.`\n            );\n        }\n\n        if (fernignoredFiles.length > 0) {\n            this.warnings.push(\n                `.fernignore-protected file(s) excluded from composite patch: ` +\n                `${fernignoredFiles.join(\", \")}. These files are managed by .fernignore, not Replay.`\n            );\n        }\n\n        if (files.length === 0) return { patches: [], revertedPatchIds: [] };\n\n        // Compute diff only for the filtered files\n        const diff = await this.git.exec([\"diff\", diffBase, \"HEAD\", \"--\", ...files]);\n        if (!diff.trim()) return { patches: [], revertedPatchIds: [] };\n\n        const contentHash = this.computeContentHash(diff);\n\n        // Dedup against existing patches and forgotten hashes — if an existing patch\n        // already captures this content, or it was explicitly forgotten, skip it.\n        const lock = this.lockManager.read();\n        if (lock.patches.some((p) => p.content_hash === contentHash) || (lock.forgotten_hashes ?? []).includes(contentHash)) {\n            return { patches: [], revertedPatchIds: [] };\n        }\n\n        const headSha = (await this.git.exec([\"rev-parse\", \"HEAD\"])).trim();\n\n        // Snapshot THEIRS from HEAD (the diff is diffBase → HEAD).\n        const theirsSnapshot = await capturePatchSnapshot(this.git, files, \"HEAD\");\n\n        const compositePatch: StoredPatch = {\n            id: `patch-composite-${headSha.slice(0, 8)}`,\n            content_hash: contentHash,\n            original_commit: headSha,\n            original_message: \"Customer customizations (composite)\",\n            original_author: \"composite\",\n            // Anchor `base_generation` on a SHA the applicator's\n            // `resolveBaseGeneration` can find — always a member of\n            // `lock.generations`. When `diffBase` is a recorded\n            // generation, use it directly; otherwise the guard above\n            // has already mapped it onto `current_generation`.\n            base_generation: resolvedBaseGeneration,\n            files,\n            patch_content: diff,\n            ...(Object.keys(theirsSnapshot).length > 0 ? { theirs_snapshot: theirsSnapshot } : {}),\n            ...(this.isCreationOnlyPatch(diff) ? { user_owned: true } : {})\n        };\n\n        return { patches: [compositePatch], revertedPatchIds: [] };\n    }\n\n    /**\n     * Last-resort detection when both generation commit and tree are unreachable.\n     * Scans all commits from HEAD, filters against known lockfile patches, and\n     * skips creation-only commits (squashed history after force push).\n     *\n     * Detected patches use the commit's parent as base_generation so the applicator\n     * can find base file content from the parent's tree (which IS reachable).\n     */\n    private async detectPatchesViaCommitScan(): Promise<DetectionResult> {\n        const lock = this.lockManager.read();\n        const knownGenerations = new Set(lock.generations.map((g) => g.commit_sha));\n        // Anchor for emitted patches when the parent commit isn't itself a\n        // recorded generation: prefer current_generation, fall back to the\n        // last generation in the list. This keeps `base_generation` pointing\n        // at a SHA that the applicator's `resolveBaseGeneration` can find,\n        // even when the actual git history is rewritten or shallow.\n        const fallbackAnchor =\n            lock.current_generation ?? lock.generations[lock.generations.length - 1]?.commit_sha;\n        const log = await this.git.exec([\n            \"log\",\n            \"--max-count=200\",\n            \"--format=%H%x00%an%x00%ae%x00%s\",\n            \"HEAD\",\n            \"--\",\n            this.sdkOutputDir\n        ]);\n\n        if (!log.trim()) {\n            return { patches: [], revertedPatchIds: [] };\n        }\n\n        const commits = this.parseGitLog(log);\n        const newPatches: StoredPatch[] = [];\n        const forgottenHashes = new Set(lock.forgotten_hashes ?? []);\n        const existingHashes = new Set(lock.patches.map((p) => p.content_hash));\n        const existingCommits = new Set(lock.patches.map((p) => p.original_commit));\n\n        for (const commit of commits) {\n            if (isGenerationCommit(commit)) {\n                continue;\n            }\n\n            const parents = await this.git.getCommitParents(commit.sha);\n            if (parents.length > 1) {\n                continue;\n            }\n\n            if (existingCommits.has(commit.sha)) {\n                continue;\n            }\n\n            let patchContent: string;\n            try {\n                patchContent = await this.git.formatPatch(commit.sha);\n            } catch {\n                continue;\n            }\n\n            let contentHash = this.computeContentHash(patchContent);\n            if (existingHashes.has(contentHash) || forgottenHashes.has(contentHash)) {\n                continue;\n            }\n\n            // Skip creation-only commits (all diffs are new-file additions).\n            // After force push, squashed commits create all files from scratch — these\n            // aren't user customizations, they're history-rewriting artifacts.\n            if (this.isCreationOnlyPatch(patchContent)) {\n                continue;\n            }\n\n            const filesOutput = await this.git.exec([\"diff-tree\", \"--no-commit-id\", \"--name-only\", \"-r\", commit.sha]);\n            const { files, sensitiveFiles, fernignoredFiles, infrastructureFiles } =\n                filterInfrastructureAndSensitiveFiles(filesOutput, this.fernignorePatterns);\n\n            if (sensitiveFiles.length > 0) {\n                this.warnings.push(\n                    `Sensitive file(s) excluded from patch for commit ${commit.sha.slice(0, 7)}: ` +\n                    `${sensitiveFiles.join(\", \")}. These files will not be tracked by replay.`\n                );\n            }\n\n            if (fernignoredFiles.length > 0) {\n                this.warnings.push(\n                    `.fernignore-protected file(s) excluded from patch for commit ${commit.sha.slice(0, 7)}: ` +\n                    `${fernignoredFiles.join(\", \")}. These files are managed by .fernignore, not Replay.`\n                );\n            }\n\n            // Regenerate patch content scoped to surviving files when any files\n            // were stripped (infrastructure, sensitive, or fernignored).\n            const wasFiltered =\n                sensitiveFiles.length > 0 || fernignoredFiles.length > 0 || infrastructureFiles.length > 0;\n            if (wasFiltered && files.length > 0) {\n                if (parents.length === 0) {\n                    continue;\n                }\n                try {\n                    patchContent = await this.git.exec([\"diff\", parents[0]!, commit.sha, \"--\", ...files]);\n                } catch {\n                    continue;\n                }\n                if (!patchContent.trim()) continue;\n                contentHash = this.computeContentHash(patchContent);\n            }\n\n            if (files.length === 0) {\n                continue;\n            }\n\n            // Use the parent commit as base_generation when it's a recorded\n            // generation, so the applicator can find base file content from\n            // a known anchor. Otherwise fall back to the lockfile's most\n            // recent recorded generation — patches with a parent SHA outside\n            // `lock.generations` would otherwise create orphans the\n            // applicator's `resolveBaseGeneration` cannot resolve, cascading\n            // into spurious unresolved-conflict classifications.\n            // Root commits (no parents) can't use this strategy — skip them.\n            if (parents.length === 0) {\n                continue;\n            }\n            const parentSha = parents[0]!;\n            let baseGeneration: string;\n            if (knownGenerations.has(parentSha)) {\n                baseGeneration = parentSha;\n            } else if (fallbackAnchor) {\n                baseGeneration = fallbackAnchor;\n            } else {\n                // No recorded generations at all — nothing safe to anchor on.\n                this.warnings.push(\n                    `Skipping commit ${commit.sha.slice(0, 7)} (${commit.message.split(\"\\n\")[0]}): ` +\n                    `no recorded generation in the lockfile to anchor on. The customer's ` +\n                    `state on disk is preserved; tracked patches will resume on the next regeneration.`\n                );\n                continue;\n            }\n\n            // user_owned not tagged here — see known-divergences.md §3.\n            const theirsSnapshot = await capturePatchSnapshot(this.git, files, commit.sha);\n            newPatches.push({\n                id: `patch-${commit.sha.slice(0, 8)}`,\n                content_hash: contentHash,\n                original_commit: commit.sha,\n                original_message: commit.message,\n                original_author: `${commit.authorName} <${commit.authorEmail}>`,\n                base_generation: baseGeneration,\n                files,\n                patch_content: patchContent,\n                ...(Object.keys(theirsSnapshot).length > 0 ? { theirs_snapshot: theirsSnapshot } : {})\n            });\n        }\n\n        newPatches.reverse();\n        return { patches: newPatches, revertedPatchIds: [] };\n    }\n\n    /**\n     * Check if a format-patch consists entirely of new-file creations.\n     * Used to identify squashed commits after force push, which create all files\n     * from scratch (--- /dev/null) rather than modifying existing files.\n     */\n    private isCreationOnlyPatch(patchContent: string): boolean {\n        const diffOldHeaders = patchContent.split(\"\\n\").filter((l) => l.startsWith(\"--- \"));\n        if (diffOldHeaders.length === 0) {\n            return false;\n        }\n        return diffOldHeaders.every((l) => l === \"--- /dev/null\");\n    }\n\n    /**\n     * Resolve the best available diff base for a generation record.\n     * Prefers commit_sha, falls back to tree_hash for unreachable commits.\n     * When commitKnownMissing is true, skips the redundant commitExists check.\n     */\n    private async resolveDiffBase(gen: GenerationRecord, commitKnownMissing: boolean): Promise<string | null> {\n        if (!commitKnownMissing && await this.git.commitExists(gen.commit_sha)) {\n            return gen.commit_sha;\n        }\n        if (await this.git.treeExists(gen.tree_hash)) {\n            return gen.tree_hash;\n        }\n        return null;\n    }\n\n    private parseGitLog(log: string): CommitInfo[] {\n        return log\n            .trim()\n            .split(\"\\n\")\n            .map((line) => {\n                const [sha, authorName, authorEmail, message] = line.split(\"\\0\");\n                return { sha, authorName, authorEmail, message };\n            });\n    }\n\n    private getLastGeneration(lock: GenerationLock) {\n        return lock.generations.find((g) => g.commit_sha === lock.current_generation);\n    }\n\n    /**\n     * Build a transient `GenerationRecord` from a SHA derived by walking git\n     * history. Only `commit_sha` (and `tree_hash` when needed downstream) is\n     * load-bearing here; the rest are filled with defensible placeholders.\n     * This record is consumed by `detectPatchesInRange` and is never persisted.\n     */\n    private async synthesizeGenerationRecord(sha: string): Promise<GenerationRecord> {\n        let tree_hash = \"\";\n        try {\n            tree_hash = await this.git.getTreeHash(sha);\n        } catch {\n            // Reachable by construction (we just walked git log to find it),\n            // but defensively swallow — downstream uses commit_sha, not tree.\n        }\n        return {\n            commit_sha: sha,\n            tree_hash,\n            timestamp: new Date(0).toISOString(),\n            cli_version: \"\",\n            generator_versions: {},\n        };\n    }\n}\n","import { extname } from \"node:path\";\n\n/**\n * File extensions that replay treats as binary. Binary files are skipped\n * during merge — no diff3, no patch_content extraction, no theirs_snapshot.\n *\n * Covers images, documents, archives, fonts, media, databases, and\n * compiled artifacts. Detection is extension-based (not magic-byte) — fast\n * and good enough for SDK-generation outputs.\n */\nexport const BINARY_EXTENSIONS: ReadonlySet<string> = new Set([\n    \".png\",\n    \".jpg\",\n    \".jpeg\",\n    \".gif\",\n    \".bmp\",\n    \".ico\",\n    \".webp\",\n    \".svg\",\n    \".pdf\",\n    \".doc\",\n    \".docx\",\n    \".xls\",\n    \".xlsx\",\n    \".ppt\",\n    \".pptx\",\n    \".zip\",\n    \".gz\",\n    \".tar\",\n    \".bz2\",\n    \".7z\",\n    \".rar\",\n    \".jar\",\n    \".war\",\n    \".ear\",\n    \".class\",\n    \".exe\",\n    \".dll\",\n    \".so\",\n    \".dylib\",\n    \".o\",\n    \".a\",\n    \".woff\",\n    \".woff2\",\n    \".ttf\",\n    \".eot\",\n    \".otf\",\n    \".mp3\",\n    \".mp4\",\n    \".avi\",\n    \".mov\",\n    \".wav\",\n    \".flac\",\n    \".sqlite\",\n    \".db\",\n    \".pyc\",\n    \".pyo\",\n    \".DS_Store\",\n]);\n\nexport function isBinaryFile(filePath: string): boolean {\n    const ext = extname(filePath).toLowerCase();\n    return BINARY_EXTENSIONS.has(ext);\n}\n","import type { CommitInfo } from \"../types.js\";\n\n// Constants from Fern's PR #11502\nexport const FERN_BOT_NAME = \"fern-api\";\nexport const FERN_BOT_EMAIL = \"115122769+fern-api[bot]@users.noreply.github.com\";\nexport const FERN_BOT_LOGIN = \"fern-api[bot]\";\n\n// Fern-support commits (via bot account) are excluded from generation detection.\nconst FERN_SUPPORT_NAMES = [\"fern-support\", \"Fern Support\"];\n\nexport function isGenerationCommit(commit: CommitInfo): boolean {\n    const isFernSupport = FERN_SUPPORT_NAMES.includes(commit.authorName);\n\n    const isBotAuthor =\n        !isFernSupport &&\n        (commit.authorLogin === FERN_BOT_LOGIN ||\n            commit.authorEmail === FERN_BOT_EMAIL ||\n            commit.authorName === FERN_BOT_NAME);\n\n    const hasGenerationMarker =\n        commit.message.startsWith(\"[fern-generated]\") ||\n        commit.message.startsWith(\"[fern-replay]\") ||\n        commit.message.startsWith(\"[fern-autoversion]\") ||\n        commit.message.includes(\"Generated by Fern\") ||\n        commit.message.includes(\"\\u{1F916} Generated with Fern\") ||\n        // Squash merge of a Fern-generated PR uses the PR title as commit message.\n        // The default PR title is \"SDK Generation\" (from GithubStep's commitMessage default).\n        // GitHub appends \"(#N)\" for the PR number, e.g. \"SDK Generation (#70)\".\n        commit.message.startsWith(\"SDK Generation\") ||\n        // Merge commit (GitHub's \"Create a merge commit\" option) of a fern-bot\n        // regen PR. First-parent walking lands on this commit, not on the\n        // generation commit on the side branch, so the classifier must treat\n        // it as a generation boundary. GitHub's default subject is\n        // \"Merge pull request #N from <owner>/<branch>\"; fern-bot branches are\n        // named \"<owner>/fern-bot/<...>\".\n        /^Merge pull request #\\d+ from [^/]+\\/fern-bot\\//.test(commit.message);\n\n    return isBotAuthor || hasGenerationMarker;\n}\n\n/**\n * Narrower predicate than `isGenerationCommit`: which commits reset the\n * customer-customization baseline?\n *\n * `isGenerationCommit` is inclusive (it answers \"should the detector skip this\n * commit when emitting patches?\"), so it accepts lightweight markers like\n * `[fern-autoversion]` — those bump the version without producing a fresh\n * baseline.\n *\n * The derived-anchor walk needs a stricter predicate: only commits that\n * actually represent a full generation state should be treated as the\n * scan boundary. Otherwise customer commits between the last real generation\n * and an autoversion get dropped (they sit *before* the derived anchor).\n *\n * See docs/adr/0001-derived-scan-boundary.md.\n */\nexport function isGenerationBoundary(commit: CommitInfo): boolean {\n    const isFernSupport = FERN_SUPPORT_NAMES.includes(commit.authorName);\n\n    const isBotAuthor =\n        !isFernSupport &&\n        (commit.authorLogin === FERN_BOT_LOGIN ||\n            commit.authorEmail === FERN_BOT_EMAIL ||\n            commit.authorName === FERN_BOT_NAME);\n\n    // Autoversion commits are bot-authored AND prefixed with [fern-autoversion]\n    // — they bump version numbers without producing a fresh customization\n    // baseline. They must not be the scan boundary regardless of authorship.\n    const isAutoversion = commit.message.startsWith(\"[fern-autoversion]\");\n\n    // We deliberately do NOT treat the GitHub merge-commit subject for a\n    // fern-bot regen PR (`Merge pull request #N from <owner>/fern-bot/...`)\n    // as a boundary. The merge commit sits on first-parent, but the customer\n    // fix-up commits authored on the regen PR branch are on the second-parent\n    // side. If we stopped at the merge, those fix-ups would be invisible.\n    // Continuing past the merge to the previous mainline generation lets the\n    // detector walk through the side-branch commits and emit them as patches;\n    // any commits already tracked in the lockfile (from the prior regen\n    // cycle that opened the PR) get deduped by SHA / content_hash.\n    const hasBoundaryMarker =\n        commit.message.startsWith(\"[fern-generated]\") ||\n        commit.message.startsWith(\"[fern-replay]\") ||\n        commit.message.includes(\"Generated by Fern\") ||\n        commit.message.includes(\"\\u{1F916} Generated with Fern\") ||\n        commit.message.startsWith(\"SDK Generation\");\n\n    return ((isBotAuthor && !isAutoversion) || hasBoundaryMarker);\n}\n\nexport function isReplayCommit(commit: CommitInfo): boolean {\n    return commit.message.startsWith(\"[fern-replay]\");\n}\n\n/** Check if a commit message matches git's standard revert format: Revert \"...\" */\nexport function isRevertCommit(message: string): boolean {\n    return /^Revert \".+\"$/.test(message);\n}\n\n/** Extract the reverted commit SHA from a full commit body containing \"This reverts commit SHA.\" */\nexport function parseRevertedSha(fullBody: string): string | undefined {\n    const match = fullBody.match(/This reverts commit ([0-9a-f]{40})\\./);\n    return match?.[1];\n}\n\n/** Extract the original commit message from a revert subject like 'Revert \"original message\"' */\nexport function parseRevertedMessage(subject: string): string | undefined {\n    const match = subject.match(/^Revert \"(.+)\"$/);\n    return match?.[1];\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { readFile as readFileAsync } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport { isGenerationCommit } from \"./git/CommitDetection.js\";\nimport { GitClient } from \"./git/GitClient.js\";\nimport { LockfileManager, LockfileNotFoundError } from \"./LockfileManager.js\";\nimport { ReplayApplicator } from \"./ReplayApplicator.js\";\nimport { isBinaryFile } from \"./shared/binary.js\";\nimport { readFernignorePatterns } from \"./shared/fernignore.js\";\nimport { ReplayCommitter } from \"./ReplayCommitter.js\";\nimport { ReplayDetector } from \"./ReplayDetector.js\";\nimport { stripConflictMarkers } from \"./conflict-utils.js\";\nimport { computePerPatchDiffWithFallback, synthesizeNewFileDiff, unifiedDiff } from \"./PatchRegionDiff.js\";\nimport { containsPlaceholder, neutralizeAutoversionTheirs } from \"./autoversion.js\";\nimport { FileOwnership } from \"./classifier/FileOwnership.js\";\nimport {\n    type Flow,\n    FirstGenerationFlow,\n    NoPatchesFlow,\n    NormalRegenerationFlow,\n    SkipApplicationFlow,\n} from \"./flows/index.js\";\nimport type { DegradedReason, FileResult, FlowKind, ReplayConfig, ReplayResult, StoredPatch } from \"./types.js\";\n\nexport interface ConflictDetail {\n    patchId: string;\n    patchMessage: string;\n    reason?: string;\n    files: FileResult[];\n    /** Files that applied cleanly in a patch that also had conflicts. */\n    cleanFiles?: string[];\n}\n\nexport interface UnresolvedPatchInfo {\n    patchId: string;\n    patchMessage: string;\n    files: string[];\n    conflictDetails: FileResult[];\n}\n\nexport interface ReplayReport {\n    flow: \"first-generation\" | \"no-patches\" | \"normal-regeneration\" | \"skip-application\";\n    patchesDetected: number;\n    patchesApplied: number;\n    patchesWithConflicts: number;\n    patchesSkipped: number;\n    patchesAbsorbed?: number;\n    patchesRepointed?: number;\n    patchesContentRebased?: number;\n    patchesKeptAsUserOwned?: number;\n    patchesPartiallyApplied?: number;\n    patchesConflictResolved?: number;\n    patchesReverted?: number;\n    patchesRefreshed?: number;\n    conflicts: FileResult[];\n    conflictDetails?: ConflictDetail[];\n    /** Patches that conflicted and need local resolution via `fern-replay resolve` */\n    unresolvedPatches?: UnresolvedPatchInfo[];\n    wouldApply?: StoredPatch[];\n    warnings?: string[];\n    /**\n     * True iff `degradedReasons` is non-empty: the run completed but could not\n     * guarantee customizations were carried forward because the baseline it\n     * needed (the previous generation) was unreachable during the run.\n     * Both fields are undefined on healthy runs, matching the `warnings`\n     * convention. Degraded is observability only — it never changes detection\n     * results, lockfile saves, or commit decisions.\n     */\n    degraded?: boolean;\n    degradedReasons?: DegradedReason[];\n}\n\nexport interface ReplayOptions {\n    /** Log what would happen but don't modify anything */\n    dryRun?: boolean;\n    /** Write files and stage changes, but don't commit */\n    stageOnly?: boolean;\n    /** CLI version for commit metadata */\n    cliVersion?: string;\n    /** Generator versions for commit metadata */\n    generatorVersions?: Record<string, string>;\n    /** Commit generation + update lockfile, skip detection/application */\n    skipApplication?: boolean;\n}\n\n/**\n * Options honored by `applyPreparedReplay()`. `cliVersion`, `generatorVersions`,\n * `dryRun`, and `skipApplication` were all captured in phase 1\n * and re-supplying them here is meaningless.\n */\nexport interface ApplyOptions {\n    /** Write files and stage changes, but don't commit */\n    stageOnly?: boolean;\n}\n\n/**\n * Opaque handle returned by `prepareReplay()`. Consumed by `applyPreparedReplay()`\n * to complete the run.\n *\n * Contract for consumers (e.g., generator-cli pipeline inserting AutoVersionStep):\n *\n * - Between `prepareReplay` and `applyPreparedReplay`, HEAD is at the new\n *   `[fern-generated]` commit (unless `_prepared.kind === \"terminal\"`, e.g. dry-run).\n * - Consumers MAY land additional commits on HEAD between phases. `applyPatches`\n *   runs against current HEAD at phase-2 call time, so mid-phase commits are\n *   respected. `rebasePatches` uses `currentGenerationSha` (the pure `[fern-generated]`\n *   SHA), NOT HEAD — mid-phase commits do not retarget patches' `base_generation`.\n * - The service instance is single-use across the phase boundary: do not call\n *   another `prepareReplay()` between phases. In-memory lockfile and warning\n *   state would be corrupted.\n * - If the caller's mid-phase work throws or `applyPreparedReplay` is never called,\n *   the repo is left with the new `[fern-generated]` commit but a stale lockfile.\n *   Consumers MUST either (a) still call `applyPreparedReplay` so the lockfile\n *   advances, or (b) reset HEAD to `previousGenerationSha` and surface the failure.\n *\n * To decide whether to run autoversion between phases, use:\n *     prep.previousGenerationSha != null && prep.flow !== \"skip-application\"\n */\nexport interface ReplayPreparation {\n    flow: FlowKind;\n    /** lockfile.current_generation from BEFORE this run; null iff no prior generation exists */\n    previousGenerationSha: string | null;\n    /** SHA of the new [fern-generated] commit created by prepareReplay (or HEAD for dry-run terminals) */\n    currentGenerationSha: string;\n    /** @internal Opaque state consumed by applyPreparedReplay */\n    readonly _prepared: InternalPreparationState;\n}\n\n/**\n * @internal\n * Opaque state passed from `prepareReplay` to `applyPreparedReplay`.\n *\n * Discriminated by `kind`:\n * - `\"terminal\"` — phase 2 returns `preparedReport` without disk/git work\n *   (dry-run, first-generation with no patch work, no-patches with no\n *   detection results). Apply is a no-op.\n * - `\"active\"` — phase 2 must apply patches, rebase, save lockfile, commit.\n *   Carries the patch set + cached phase-1 state.\n */\ntype InternalPreparationState = InternalPreparationTerminal | InternalPreparationActive;\n\ninterface InternalPreparationTerminal {\n    readonly kind: \"terminal\";\n    readonly flow: FlowKind;\n    readonly preparedReport: ReplayReport;\n}\n\ninterface InternalPreparationActive {\n    readonly kind: \"active\";\n    readonly flow: FlowKind;\n    /** post-preGenRebase, post-detection, post-absorption (references, not copies) */\n    patchesToApply: StoredPatch[];\n    /** subset of patchesToApply that were freshly detected this cycle (vs already in the lockfile) */\n    newPatchIds: Set<string>;\n    preRebaseCounts?: { conflictResolved: number; conflictAbsorbed: number; contentRefreshed: number };\n    /** detector warnings snapshotted at end of phase 1 */\n    detectorWarnings: string[];\n    /**\n     * Detector degraded reasons snapshotted at end of phase 1 (next to\n     * `detectorWarnings`) so degraded state survives the two-phase\n     * prepare/apply split and any mid-phase commits (e.g. autoversion).\n     */\n    detectorDegraded: DegradedReason[];\n    revertedCount: number;\n    /** [fern-generated] SHA; passed to rebasePatches as currentGenSha */\n    genSha: string;\n    /** cached phase-1 options for constructing the final ReplayReport in phase 2 */\n    optionsSnapshot?: ReplayOptions;\n}\n\n/** ReplayPreparation narrowed to its active variant (terminal cases handled by dispatcher). */\ntype ActiveReplayPreparation = ReplayPreparation & { readonly _prepared: InternalPreparationActive };\n\n/**\n * Narrow `ReplayPreparation` to its active variant at the entry of each\n * Flow's `apply()`. Terminal cases are short-circuited in `applyPreparedReplay`\n * before any flow's apply method is called, so this should never fire in practice.\n *\n * @internal Used by Flow implementations in `src/flows/`.\n */\nexport function assertActive(prep: ReplayPreparation): asserts prep is ActiveReplayPreparation {\n    if (prep._prepared.kind !== \"active\") {\n        throw new Error(\n            `Flow.apply() called with terminal preparation (kind=${prep._prepared.kind}); ` +\n                `terminal cases must be handled by applyPreparedReplay's dispatcher`\n        );\n    }\n}\n\nexport class ReplayService {\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    git: GitClient;\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    detector: ReplayDetector;\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    applicator: ReplayApplicator;\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    committer: ReplayCommitter;\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    lockManager: LockfileManager;\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    fileOwnership!: FileOwnership;\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    outputDir: string;\n    /** @internal Test-only. Captures the last ReplayResult[] returned from applicator.applyPatches(). */\n    _lastApplyResults: ReplayResult[] = [];\n    /**\n     * Service-level warnings accumulated during a single runReplay() call.\n     * Merged with `detector.warnings` into `ReplayReport.warnings` by each flow handler.\n     * Populated by `FileOwnership.resolveCanonical` when a patch's base generation tree\n     * is unreachable (shallow clone / aggressive `git gc --prune`) and we fall back to a\n     * conservative heuristic. Cleared at the top of `runReplay()`.\n     *\n     * @internal Used by Flow implementations in `src/flows/`.\n     */\n    warnings: string[] = [];\n\n    /**\n     * Service-level structured degraded reasons, mirroring `warnings`.\n     * Populated at apply time (e.g. `recordUnreachableBaseWarnings` when a\n     * patch's base-generation tree is unreachable). Merged with\n     * `detector.degradedReasons` into `ReplayReport.degradedReasons` by each\n     * flow handler. Cleared at the top of `prepareReplay()`.\n     *\n     * @internal Used by Flow implementations in `src/flows/`.\n     */\n    degradedReasons: DegradedReason[] = [];\n\n    /**\n     * @internal Test-only accessor.\n     * Returns the ReplayApplicator instance used for the last run. Tests use this\n     * to inspect the inter-patch accumulator after runReplay() completes (invariant I2).\n     */\n    get applicatorRef(): ReplayApplicator {\n        return this.applicator;\n    }\n\n    /**\n     * @internal Test-only accessor.\n     * Returns the ReplayResult[] from the most recent applyPatches() call. Tests use\n     * this to filter applied-vs-conflicted-vs-absorbed patches for invariant\n     * assertions. Returns an empty array if no patches have been applied yet.\n     */\n    getLastResults(): ReadonlyArray<ReplayResult> {\n        return this._lastApplyResults;\n    }\n\n    constructor(outputDir: string, _config: ReplayConfig) {\n        const git = new GitClient(outputDir);\n        this.git = git;\n        this.outputDir = outputDir;\n        this.lockManager = new LockfileManager(outputDir);\n        // ADR 0002: `.fernignore` patterns plumbed to the detector so it\n        // filters fernignore-matched files out at capture time. Patterns\n        // are read once at construction; if `.fernignore` changes mid-run\n        // the next `ReplayService` instance will pick up the new patterns.\n        const fernignorePatterns = this.readFernignorePatterns();\n        this.detector = new ReplayDetector(git, this.lockManager, outputDir, fernignorePatterns);\n        this.applicator = new ReplayApplicator(git, this.lockManager, outputDir);\n        this.committer = new ReplayCommitter(git, outputDir);\n        this.fileOwnership = new FileOwnership(git);\n    }\n\n    /**\n     * Phase 1 of the two-phase replay flow. Runs preGenerationRebase (when applicable),\n     * detects new patches, and creates the `[fern-generated]` commit. Leaves HEAD at\n     * the generation commit (or unchanged for dry-run).\n     *\n     * Does NOT apply patches — the returned handle must be passed to\n     * `applyPreparedReplay()` to complete the run. No disk writes to the lockfile\n     * happen here; lockfile persistence is deferred to phase 2.\n     *\n     * Callers may land additional commits on HEAD between `prepareReplay` and\n     * `applyPreparedReplay` (e.g., `[fern-autoversion]`).\n     */\n    async prepareReplay(options?: ReplayOptions): Promise<ReplayPreparation> {\n        // Reset per-run state so warnings from prior invocations don't leak.\n        // Both the service-level and detector-level warnings must be cleared —\n        // the two-phase API (`prepareReplay` + `applyPreparedReplay`) enlarges\n        // the observability window for callers like generator-cli's autoversion\n        // step, so we tighten the per-call cleanup here.\n        this.warnings = [];\n        this.detector.warnings.length = 0;\n        this.degradedReasons = [];\n        this.detector.degradedReasons.length = 0;\n        // ADR 0002 migration: strip legacy `.fernignore`-matched entries from\n        // existing patches in the lockfile. One-shot, idempotent, audited.\n        // Runs ONCE per `prepareReplay` so every flow benefits.\n        this.cleanseLegacyFernignoreEntries();\n        // Strip infrastructure file diffs (e.g. .fernignore itself) that were\n        // bundled into patch_content by older detection logic. Prevents\n        // .fernignore edits from being silently re-applied on each regen.\n        this.cleanseInfrastructureFileEntries();\n        return this.selectFlow(options).prepare(options);\n    }\n\n    /**\n     * ADR 0002 migration step. Strips `.fernignore`-matched entries from\n     * `patch.files`, `patch.theirs_snapshot` keys, and `diff --git` sections\n     * in `patch.patch_content` for every patch in the lockfile. Patches that\n     * end up with no surviving files are removed entirely.\n     *\n     * Idempotent: a second run is a no-op because the first run already\n     * matches the contract. Per-patch try/catch ensures one bad patch does\n     * not block the rest. Each affected patch emits a warning naming the\n     * stripped paths. `patch_content` is left untouched if no parseable\n     * `diff --git` headers are found (fail-safe for exotic legacy formats).\n     */\n    private cleanseLegacyFernignoreEntries(): void {\n        const patterns = this.readFernignorePatterns();\n        if (patterns.length === 0) return;\n        // No lockfile yet (first-generation flow before bootstrap) — nothing\n        // to cleanse.\n        if (!this.lockManager.exists()) return;\n        // Ensure the lockfile is loaded before mutation.\n        this.lockManager.read();\n\n        let lockfileMutated = false;\n        const patches = this.lockManager.getPatches();\n        for (const patch of patches) {\n            try {\n                const result = computeLegacyFernignoreCleanse(patch, patterns, (content) =>\n                    this.detector.computeContentHash(content),\n                );\n                if (result.unchanged) continue;\n                if (result.remove) {\n                    this.lockManager.removePatch(patch.id);\n                    this.warnings.push(\n                        `Cleansed legacy patch ${patch.id}: all referenced files match .fernignore — ` +\n                            `patch removed. Customer's on-disk content for those files is preserved by .fernignore. ` +\n                            `(ADR 0002: .fernignore-protected files are not tracked by Replay.)`\n                    );\n                } else {\n                    this.lockManager.updatePatch(patch.id, {\n                        files: result.files,\n                        patch_content: result.patch_content,\n                        content_hash: result.content_hash,\n                        ...(result.theirs_snapshot !== undefined\n                            ? { theirs_snapshot: result.theirs_snapshot }\n                            : {}),\n                    });\n                    this.warnings.push(\n                        `Cleansed legacy patch ${patch.id}: stripped .fernignore-matched entries ` +\n                            `(${result.strippedPaths.join(\", \")}). Customer's on-disk content for those ` +\n                            `files is preserved by .fernignore. (ADR 0002.)`\n                    );\n                }\n                lockfileMutated = true;\n            } catch {\n                // Per-patch isolation — one bad patch does not block the rest.\n                // The patch survives unchanged, which is strictly safer than\n                // partial mutation.\n            }\n        }\n\n        if (lockfileMutated) {\n            this.lockManager.save();\n        }\n    }\n\n    /**\n     * Migration step: strips infrastructure file diffs (`.fernignore`, `.fern/*`)\n     * from existing patches' `patch_content`. These diffs were bundled by older\n     * detection logic that did not scope `git diff` when only infrastructure files\n     * were stripped. Patches that end up with no surviving diff sections are\n     * removed entirely.\n     *\n     * Idempotent: a second run is a no-op because the first run already removed\n     * all infrastructure sections. Per-patch try/catch ensures isolation.\n     */\n    private cleanseInfrastructureFileEntries(): void {\n        if (!this.lockManager.exists()) return;\n        this.lockManager.read();\n\n        let lockfileMutated = false;\n        const patches = this.lockManager.getPatches();\n        for (const patch of patches) {\n            try {\n                const result = computeInfrastructureFileCleanse(\n                    patch,\n                    (content) => this.detector.computeContentHash(content),\n                );\n                if (result.unchanged) continue;\n                if (result.remove) {\n                    this.lockManager.removePatch(patch.id);\n                    this.warnings.push(\n                        `Stripped infrastructure file diffs from patch ${patch.id}: patch contained ` +\n                            `only infrastructure file changes (${result.strippedPaths.join(\", \")}) — removed.`\n                    );\n                } else {\n                    this.lockManager.updatePatch(patch.id, {\n                        patch_content: result.patch_content,\n                        content_hash: result.content_hash,\n                    });\n                    this.warnings.push(\n                        `Stripped infrastructure file diffs from patch ${patch.id}: ` +\n                            `removed bundled diffs for ${result.strippedPaths.join(\", \")}.`\n                    );\n                }\n                lockfileMutated = true;\n            } catch {\n                // Per-patch isolation\n            }\n        }\n\n        if (lockfileMutated) {\n            this.lockManager.save();\n        }\n    }\n\n    /**\n     * Phase 2 of the two-phase replay flow. Applies patches, rebases them against\n     * the generation, saves the lockfile, and commits `[fern-replay]` (or stages\n     * under `stageOnly`). Operates on HEAD at call time — mid-phase commits are\n     * respected.\n     *\n     * For terminal handles (dry-run, first-gen has no patch work, skip-app does\n     * its own post-commit logic), this returns the precomputed report.\n     */\n    async applyPreparedReplay(\n        prep: ReplayPreparation,\n        options?: ApplyOptions\n    ): Promise<ReplayReport> {\n        if (prep._prepared.kind === \"terminal\") {\n            // Dry-run path: report was fully built in phase 1 and no disk/git work\n            // is needed in phase 2.\n            return prep._prepared.preparedReport;\n        }\n        return this.flowForKind(prep._prepared.flow).apply(prep, options);\n    }\n\n    /**\n     * Construct the flow for the current run. `selectFlow` is called from\n     * `prepareReplay` and decides based on options + lockfile state.\n     */\n    private selectFlow(options?: ReplayOptions): Flow {\n        if (options?.skipApplication) return new SkipApplicationFlow(this);\n        return this.flowForKind(this.determineFlow());\n    }\n\n    /**\n     * Construct a flow given its kind. Used by `applyPreparedReplay` to\n     * route to the same kind that was selected in phase 1.\n     */\n    private flowForKind(kind: FlowKind): Flow {\n        switch (kind) {\n            case \"first-generation\":\n                return new FirstGenerationFlow(this);\n            case \"no-patches\":\n                return new NoPatchesFlow(this);\n            case \"normal-regeneration\":\n                return new NormalRegenerationFlow(this);\n            case \"skip-application\":\n                return new SkipApplicationFlow(this);\n        }\n    }\n\n    /**\n     * Backwards-compatible atomic entry point. Composes `prepareReplay` + `applyPreparedReplay`.\n     * Behavior is byte-identical to the pre-split implementation for all existing callers.\n     */\n    async runReplay(options?: ReplayOptions): Promise<ReplayReport> {\n        const prep = await this.prepareReplay(options);\n        return this.applyPreparedReplay(prep, options);\n    }\n\n    private determineFlow(): \"first-generation\" | \"no-patches\" | \"normal-regeneration\" {\n        try {\n            const lock = this.lockManager.read();\n            return lock.patches.length === 0 ? \"no-patches\" : \"normal-regeneration\";\n        } catch (error) {\n            if (error instanceof LockfileNotFoundError) {\n                return \"first-generation\";\n            }\n            throw error;\n        }\n    }\n\n    /**\n     * Rebase cleanly applied patches so they are relative to the current generation.\n     * This prevents recurring conflicts on subsequent regenerations.\n     * Returns the number of patches rebased.\n     *\n     * @internal Used by Flow implementations in `src/flows/`.\n     */\n    async rebasePatches(\n        results: ReplayResult[],\n        currentGenSha: string\n    ): Promise<{\n        absorbed: number;\n        repointed: number;\n        contentRebased: number;\n        keptAsUserOwned: number;\n        absorbedPatchIds: Set<string>;\n    }> {\n        let absorbed = 0;\n        let repointed = 0;\n        let contentRebased = 0;\n        let keptAsUserOwned = 0;\n        // Track content hashes seen this rebase cycle. When two patches end\n        // up with byte-identical post-rebase patch_content, they encode the\n        // SAME customer-side delta — applying both back-to-back would corrupt\n        // the file via duplicate-apply. Consolidate to one (the first seen)\n        // and remove the rest. Per-commit attribution is recoverable from\n        // `git log`. Map value is the surviving patch's id, used in the\n        // consolidation warning.\n        const seenContentHashes = new Map<string, string>();\n        const absorbedPatchIds = new Set<string>();\n        // Cache once — used per patch below to classify protected vs non-protected files.\n        const fernignorePatterns = this.readFernignorePatterns();\n        // `resolveCanonical` may push a one-time unreachable-base warning per\n        // base SHA when `patch.base_generation` is GC'd. Sharing one set across\n        // every patch in this rebase keeps the warning to one line per affected\n        // base, not one per file.\n        const warnedGens = new Set<string>();\n\n        // Pre-pass: Update patch.files with resolved (renamed) paths from application.\n        // This ensures downstream operations (user-owned check, git diff, git show)\n        // use the current file paths rather than stale pre-rename paths.\n        for (const result of results) {\n            if (result.resolvedFiles && Object.keys(result.resolvedFiles).length > 0) {\n                const patch = result.patch;\n                const updatedFiles = patch.files.map((f) => result.resolvedFiles![f] ?? f);\n                patch.files = updatedFiles;\n                try {\n                    this.lockManager.updatePatch(patch.id, { files: updatedFiles });\n                } catch {\n                    // New patches aren't in lockfile yet — in-memory update sufficient\n                }\n            }\n        }\n\n        // Build set of file paths that any earlier patch CONFLICTED on in this\n        // run. The absorption branch below uses this to detect a clean follow-up\n        // patch whose disk state was reset to OURS by revertConflictingFiles or\n        // applyPatches' cross-patch marker stripping (ReplayApplicator.ts:157-189).\n        // Such a patch shows an empty diff vs currentGen and would otherwise be\n        // silently absorbed — masking a real customization. Preserve as\n        // unresolved instead so the customer can recover via `fern replay resolve`.\n        const conflictedFilePaths = new Set<string>();\n        for (const r of results) {\n            if (r.status !== \"conflict\") continue;\n            if (r.fileResults) {\n                for (const fr of r.fileResults) {\n                    if (fr.status !== \"conflict\") continue;\n                    conflictedFilePaths.add(fr.file);\n                    if (r.resolvedFiles) {\n                        for (const [orig, resolved] of Object.entries(r.resolvedFiles)) {\n                            if (resolved === fr.file) conflictedFilePaths.add(orig);\n                        }\n                    }\n                }\n            } else {\n                // Defensive: a conflict result without fileResults isn't produced\n                // by the current applicator, but if a future change introduces\n                // one, fall back to patch.files so we don't silently regress.\n                for (const f of r.patch.files) conflictedFilePaths.add(f);\n            }\n        }\n\n        for (const result of results) {\n            if (result.status === \"conflict\" && result.fileResults) {\n                // For conflict patches with mixed results, trim any clean files\n                // that were absorbed by the generator. This prevents absorbed files\n                // from poisoning the pre-generation rebase conflict marker check.\n                await this.trimAbsorbedFiles(result, currentGenSha);\n                continue;\n            }\n\n            // Only rebase cleanly applied patches.\n            // Conflicted patches keep their old base_generation so they retry.\n            if (result.status !== \"applied\") continue;\n\n            const patch = result.patch;\n\n            // Skip if already based on the current generation\n            if (patch.base_generation === currentGenSha) continue;\n\n            try {\n                // Classify file ownership via the single canonical resolver.\n                // Widens \"protected = .fernignore only\" to every user-owned\n                // file: persisted `user_owned` flag, `.fernignore` patterns,\n                // patch_content `--- /dev/null` creation signal, and a tree\n                // lookup against `patch.base_generation` (with a fall-back to\n                // `currentGenSha` for legacy one-gen lockfiles). This keeps\n                // user-created files in mixed composites from being absorbed\n                // alongside the generator-modified half.\n                const originalByResolved: Record<string, string> = {};\n                if (result.resolvedFiles) {\n                    for (const [orig, resolved] of Object.entries(result.resolvedFiles)) {\n                        originalByResolved[resolved] = orig;\n                    }\n                }\n                const isUserOwnedPerFile = await Promise.all(\n                    patch.files.map((file) =>\n                        this.fileOwnership.resolveCanonical({\n                            file,\n                            originalFileName: originalByResolved[file],\n                            patch,\n                            currentGenSha,\n                            fernignorePatterns,\n                            warnedGens,\n                            warnings: this.warnings,\n                        })\n                    )\n                );\n                // Match main's \"protected\" semantics for the compact subset:\n                // .fernignore itself OR fernignore-pattern-matched files. These\n                // must never be absorbed even on empty diff.\n                const hasProtectedFiles = patch.files.some(\n                    (file) => file === \".fernignore\" ||\n                        fernignorePatterns.some((p) => file === p || minimatch(file, p))\n                );\n                // The \"keep\" branch fires only when EVERY file in the patch\n                // is user-owned. Mixed composite patches (user + gen files,\n                // e.g. from tree-diff fallback) still flow through the\n                // absorption/rebase branch below so the gen-file halves get\n                // content-rebased; this also avoids regressing the long-horizon\n                // accumulator invariants on mixed-ownership composites.\n                const allUserOwned = isUserOwnedPerFile.every(Boolean);\n\n                if (allUserOwned && patch.files.length > 0) {\n                    const baseChanged = patch.base_generation !== currentGenSha;\n\n                    // Rebase content hash against current generation so both the\n                    // no-patches and normal-regeneration flows produce identical\n                    // hashes for user-owned patches. preGenerationRebase (normal\n                    // flow) converts patch_content to `git diff currentGen HEAD`\n                    // and recomputes the hash. Without this, the no-patches flow\n                    // keeps the original formatPatch hash, which differs because\n                    // the diff base and format are both different.\n                    const userDiff = await this.git\n                        .exec([\"diff\", currentGenSha, \"--\", ...patch.files])\n                        .catch(() => null);\n                    let userDiffSnapshot: Record<string, string> | null = null;\n                    if (userDiff != null && userDiff.trim()) {\n                        const newHash = this.detector.computeContentHash(userDiff);\n                        patch.patch_content = userDiff;\n                        patch.content_hash = newHash;\n                        // rebasePatches only operates on `status === \"applied\"`\n                        // patches (clean merges). Working tree is the correctly\n                        // merged customer state at the new generation —\n                        // including any path renames carried by `patch.files`.\n                        // Snapshot capture here is what keeps snapshot keys\n                        // aligned with current paths across regen cycles\n                        // (W5 rename-churn relies on this).\n                        const snap = await this.readSnapshotFromDisk(patch.files);\n                        if (Object.keys(snap).length > 0) {\n                            userDiffSnapshot = snap;\n                            patch.theirs_snapshot = snap;\n                        }\n                    }\n\n                    patch.base_generation = currentGenSha;\n                    try {\n                        this.lockManager.updatePatch(patch.id, {\n                            base_generation: currentGenSha,\n                            ...(!patch.user_owned ? { user_owned: true } : {}),\n                            ...(userDiff != null && userDiff.trim()\n                                ? {\n                                    patch_content: patch.patch_content,\n                                    content_hash: patch.content_hash,\n                                    ...(userDiffSnapshot != null && Object.keys(userDiffSnapshot).length > 0\n                                        ? { theirs_snapshot: userDiffSnapshot }\n                                        : {})\n                                }\n                                : {})\n                        });\n                    } catch {\n                        // Not in lockfile yet — in-memory mutation is sufficient.\n                    }\n                    patch.user_owned = true;\n                    keptAsUserOwned++;\n                    // Count as repointed when base advanced — tests track this.\n                    if (baseChanged) repointed++;\n                    continue;\n                }\n\n                // Mixed or generator-only patch — compute diff vs currentGen\n                // for absorption/rebase decisions.\n                //\n                // Note: rebasePatches uses the cumulative diff here (matching\n                // preGenerationRebase's behavior). The content-hash dedup at\n                // line ~1140 below preserves patches with distinct\n                // `original_commit`s when their rebased content_hash\n                // converges. Per-patch surgical scoping in this hot path\n                // interacts badly with bundled user-owned files (file already\n                // in currentGen due to commitGeneration), causing false\n                // absorption — kept cumulative here for safety. The\n                // customer-facing per-patch-region fix lives in\n                // `commands/resolve.ts`.\n                // Autoversion-aware rebase: when the raw diff carries the\n                // placeholder (`--version AUTO` swap folded in), re-derive the\n                // diff and snapshot against a version-neutralized THEIRS so the\n                // pipeline-owned version line is never captured. Gated on the\n                // cheap `containsPlaceholder(rawDiff)` string check so fixed-\n                // version SDKs (no placeholder) keep the original single-`git\n                // diff` cost — no extra per-file `showFile` calls.\n                const rawDiff = await this.git\n                    .exec([\"diff\", currentGenSha, \"--\", ...patch.files])\n                    .catch(() => null);\n                const neutralizedRebase =\n                    rawDiff != null && containsPlaceholder(rawDiff)\n                        ? await this.computeAutoversionNeutralizedRebase(patch.files, currentGenSha)\n                        : null;\n                const diff = neutralizedRebase ? neutralizedRebase.diff : rawDiff;\n\n                if (diff === null) continue;\n\n                if (!diff.trim()) {\n                    if (hasProtectedFiles) {\n                        // Protected files — never absorb. Advance base_generation only.\n                        patch.base_generation = currentGenSha;\n                        try {\n                            this.lockManager.updatePatch(patch.id, { base_generation: currentGenSha });\n                        } catch {\n                            // Not in lockfile yet — in-memory mutation is sufficient.\n                        }\n                        keptAsUserOwned++;\n                        continue;\n                    }\n                    // Conflict-by-association guard: do not absorb if a predecessor\n                    // in this run conflicted on any of this patch's files. Empty\n                    // diff is suspicious here — disk was reset to OURS by marker\n                    // stripping, masking a real customization. Preserve as\n                    // unresolved so `fern replay resolve` can recover it.\n                    const overlapsConflicted = patch.files.some((f) => conflictedFilePaths.has(f));\n                    if (overlapsConflicted) {\n                        patch.status = \"unresolved\";\n                        try {\n                            this.lockManager.updatePatch(patch.id, { status: \"unresolved\" });\n                        } catch {\n                            // New patch — addPatch() in the caller carries the\n                            // in-memory status through into the lockfile.\n                        }\n                        this.warnings.push(\n                            `Patch ${patch.id} (${patch.original_message}) was preserved as unresolved ` +\n                                `because an earlier patch conflicted on the same file(s) (${patch.files.join(\", \")}). ` +\n                                `Run \\`fern replay resolve\\` to apply this customization manually.`\n                        );\n                        continue;\n                    }\n                    // Generator file with empty net effect — absorb.\n                    this.lockManager.removePatch(patch.id);\n                    absorbedPatchIds.add(patch.id);\n                    absorbed++;\n                    continue;\n                }\n\n                if (hasProtectedFiles) {\n                    // Protected files with a real diff: keep patch_content as-is.\n                    // Only advance base_generation.\n                    patch.base_generation = currentGenSha;\n                    try {\n                        this.lockManager.updatePatch(patch.id, { base_generation: currentGenSha });\n                    } catch {\n                        // Not in lockfile yet — in-memory mutation is sufficient.\n                    }\n                    keptAsUserOwned++;\n                    continue;\n                }\n\n                // Generator files OR mixed patches with some user-owned files:\n                // rebase patch_content to the canonical git-diff against new\n                // generation.\n                const newContentHash = this.detector.computeContentHash(diff);\n\n                // Consolidate when another patch already captured this exact\n                // diff. Two patches with byte-identical post-rebase\n                // patch_content encode the SAME customer-side delta — applying\n                // both back-to-back at the next regen produces duplicate-apply\n                // corruption (the same lines spliced in twice). Consolidate\n                // to one canonical patch; per-commit attribution is recoverable\n                // from `git log -- <file>`. See preGenerationRebase for the\n                // full rationale.\n                const priorPatchId = seenContentHashes.get(newContentHash);\n                if (priorPatchId !== undefined) {\n                    this.lockManager.removePatch(patch.id);\n                    absorbedPatchIds.add(patch.id);\n                    absorbed++;\n                    if (priorPatchId !== patch.id) {\n                        this.warnings.push(\n                            `Consolidated patch ${patch.id} (commit ${(patch.original_commit || \"<missing>\").slice(0, 7)}) ` +\n                                `into prior patch ${priorPatchId}: byte-identical patch_content after rebase. ` +\n                                `Per-commit attribution preserved in git log.`\n                        );\n                    }\n                    continue;\n                } else {\n                    seenContentHashes.set(newContentHash, patch.id);\n                }\n\n                // Mutate in-memory AND lockfile. For new patches (not yet added to\n                // the lockfile), updatePatch throws; the in-memory mutation ensures\n                // the correct values end up persisted when addPatch runs later.\n                patch.base_generation = currentGenSha;\n                patch.patch_content = diff;\n                patch.content_hash = newContentHash;\n                // Snapshot from working tree. Same rationale as the\n                // user-owned branch above: only fires for cleanly-applied\n                // patches (`status === \"applied\"` filter at the top of\n                // the loop), so disk = correctly-merged customer state at\n                // the new generation. Captures rename keys for next regen.\n                const snapshot = neutralizedRebase\n                    ? neutralizedRebase.snapshot\n                    : await this.readSnapshotFromDisk(patch.files);\n                const snapshotIsNonEmpty = Object.keys(snapshot).length > 0;\n                if (snapshotIsNonEmpty) {\n                    patch.theirs_snapshot = snapshot;\n                }\n                try {\n                    this.lockManager.updatePatch(patch.id, {\n                        base_generation: currentGenSha,\n                        patch_content: diff,\n                        content_hash: newContentHash,\n                        ...(snapshotIsNonEmpty ? { theirs_snapshot: snapshot } : {})\n                    });\n                } catch {\n                    // Not in lockfile yet — in-memory mutation is sufficient.\n                }\n                contentRebased++;\n            } catch {\n                // If rebasing fails for any reason, keep the original patch unchanged\n            }\n        }\n\n        return { absorbed, repointed, contentRebased, keptAsUserOwned, absorbedPatchIds };\n    }\n\n    /**\n     * Read THEIRS snapshot (post-customer-edit content) for a list of files\n     * from the working tree on disk. Used by `rebasePatches` after a clean\n     * apply — disk = correctly-merged customer state at the new generation.\n     * Skips binary files (matches `mergeFile`/`populateAccumulatorForPatch`\n     * policy — binary content as `utf-8` is lossy and snapshots of it would\n     * never be used during apply anyway).\n     */\n    private async readSnapshotFromDisk(files: string[]): Promise<Record<string, string>> {\n        const snapshot: Record<string, string> = {};\n        for (const file of files) {\n            if (isBinaryFile(file)) continue;\n            try {\n                const content = await readFileAsync(join(this.outputDir, file), \"utf-8\");\n                snapshot[file] = content;\n            } catch {\n                // Missing file — omit (the file might have been deleted by the customer).\n            }\n        }\n        return snapshot;\n    }\n\n    /**\n     * Autoversion-aware replacement for the naive `git diff currentGen -- files`\n     * + on-disk snapshot used when rebasing a cleanly-applied patch.\n     *\n     * The generation tree (BASE) still carries the placeholder on version lines\n     * (autoversion runs after `[fern-generated]`), but the working tree holds\n     * autoversion's resolved semver. A raw diff/snapshot would fold the\n     * placeholder->semver swap into the customer's patch_content/theirs_snapshot,\n     * pinning a stale version. This re-derives both against a version-neutralized\n     * THEIRS so the pipeline-owned version line never enters the patch.\n     *\n     * Returns null when no file is under autoversion (fixed `--version`, i.e. no\n     * placeholder in the generation tree) — callers keep their existing behavior.\n     */\n    private async computeAutoversionNeutralizedRebase(\n        files: string[],\n        currentGenSha: string,\n    ): Promise<{ diff: string; snapshot: Record<string, string> } | null> {\n        const genByFile = new Map<string, string | null>();\n        let anyPlaceholder = false;\n        for (const file of files) {\n            const gen = await this.git.showFile(currentGenSha, file).catch(() => null);\n            genByFile.set(file, gen);\n            if (containsPlaceholder(gen)) anyPlaceholder = true;\n        }\n        if (!anyPlaceholder) return null;\n\n        const snapshot: Record<string, string> = {};\n        const fragments: string[] = [];\n        for (const file of files) {\n            if (isBinaryFile(file)) continue;\n            const disk = await readFileAsync(join(this.outputDir, file), \"utf-8\").catch(() => null);\n            if (disk == null) continue;\n            const gen = genByFile.get(file) ?? null;\n            const neutralized = gen != null ? neutralizeAutoversionTheirs(gen, disk) : disk;\n            snapshot[file] = neutralized;\n            if (gen == null) {\n                fragments.push(synthesizeNewFileDiff(file, neutralized));\n            } else if (gen !== neutralized) {\n                const fileDiff = await unifiedDiff(gen, neutralized, file);\n                if (fileDiff.trim()) fragments.push(fileDiff);\n            }\n        }\n        return { diff: fragments.join(\"\"), snapshot };\n    }\n\n    /**\n     * Detects autoversion contamination — returns true when a\n     * `[fern-autoversion]` commit between `fromSha` and `toSha` touched any\n     * of the patch's `files`. Re-classifies each grep match via\n     * `isGenerationCommit` so a customer commit that merely quotes the\n     * marker in its body doesn't false-positive.\n     *\n     * Used by preGenerationRebase to skip the customer-content rebuild for\n     * patches whose files were last touched by an autoversion step — a\n     * naive `git diff currentGen HEAD` there would capture the\n     * placeholder→semver swap as customer customization.\n     */\n    private async hasAutoversionContamination(\n        fromSha: string,\n        toSha: string,\n        files: string[],\n    ): Promise<boolean> {\n        if (files.length === 0) return false;\n        const log = await this.git\n            .exec([\n                \"log\",\n                `${fromSha}..${toSha}`,\n                \"--grep=\\\\[fern-autoversion\\\\]\",\n                \"--extended-regexp\",\n                \"--format=%H%x09%aN%x09%ae%x09%s\",\n                \"--\",\n                ...files,\n            ])\n            .catch(() => \"\");\n        if (!log.trim()) return false;\n        for (const line of log.trim().split(\"\\n\")) {\n            const [sha, authorName, authorEmail, message] = line.split(\"\\t\");\n            if (sha == null) continue;\n            if (\n                isGenerationCommit({\n                    sha,\n                    authorName: authorName ?? \"\",\n                    authorEmail: authorEmail ?? \"\",\n                    message: message ?? \"\",\n                })\n            ) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    /**\n     * Rebuild patch_content from `theirs_snapshot` (captured at detection\n     * time, predates pipeline content) rather than a HEAD-relative diff.\n     * Returns `null` when snapshot is missing or doesn't cover every file\n     * in `patch.files` — caller leaves the patch unchanged.\n     *\n     * Used as the autoversion-contamination escape hatch: when the\n     * HEAD-relative diff would capture pipeline content (autoversion's\n     * placeholder swap) as customer customization, the snapshot path\n     * preserves the customer's actual intent.\n     */\n    private async computeSnapshotBasedPatchDiff(\n        patch: StoredPatch,\n        currentGen: string,\n    ): Promise<string | null> {\n        if (!patch.theirs_snapshot) return null;\n        if (Object.keys(patch.theirs_snapshot).length === 0) return null;\n        for (const file of patch.files) {\n            if (patch.theirs_snapshot[file] == null) return null;\n        }\n\n        const fragments: string[] = [];\n        for (const file of patch.files) {\n            const theirsContent = patch.theirs_snapshot[file]!;\n            const oursContent = await this.git.showFile(currentGen, file).catch(() => null);\n            if (oursContent == null) {\n                fragments.push(synthesizeNewFileDiff(file, theirsContent));\n                continue;\n            }\n            if (oursContent === theirsContent) continue;\n            const fileDiff = await unifiedDiff(oursContent, theirsContent, file);\n            if (fileDiff.trim()) {\n                fragments.push(fileDiff);\n            }\n        }\n        return fragments.join(\"\");\n    }\n\n    /**\n     * Read THEIRS snapshot from a git tree-ish (commit, branch, or tree).\n     * Used when the diff that produced `patch_content` was relative to that\n     * tree (e.g., `git diff currentGen HEAD --` → snapshot from HEAD).\n     * Skips binary files.\n     */\n    private async readSnapshotFromTree(treeRef: string, files: string[]): Promise<Record<string, string>> {\n        const snapshot: Record<string, string> = {};\n        for (const file of files) {\n            if (isBinaryFile(file)) continue;\n            const content = await this.git.showFile(treeRef, file).catch(() => null);\n            if (content != null) snapshot[file] = content;\n        }\n        return snapshot;\n    }\n\n    /**\n     * One-shot auto-migration: backfill `theirs_snapshot` on existing\n     * patches that predate the snapshot encoding. Computes the snapshot by\n     * applying the patch's `patch_content` to its `base_generation` tree —\n     * yielding the patch's INDIVIDUAL contribution.\n     *\n     * **Skips patches sharing files with other patches.** HEAD's content\n     * for a file shared by N patches is cumulative across all of them, so\n     * a HEAD-fallback would falsely encode other patches' contributions\n     * into one patch's snapshot — breaking cross-patch isolation\n     * if the snapshot fallback later fires. Per-patch snapshots only\n     * make sense when the patch owns its file. Multi-patch-same-file\n     * legacy lockfiles keep using line-anchored reconstruction (the\n     * existing path); they're no worse than pre-upgrade.\n     *\n     * **Does not fall back to HEAD when BASE-reconstruction fails.** Same\n     * reason — HEAD content can be cumulative. Patches whose\n     * reconstruction fails just don't get a snapshot; legacy paths\n     * (PR #73's by-association gate, accumulator fallback) handle them.\n     *\n     * Skips patches that already have a snapshot.\n     */\n    private async migratePatchesToSnapshot(patches: StoredPatch[]): Promise<void> {\n        const { applyPatchToContent } = await import(\"./PatchApplyTheirs.js\");\n        // Identify files that appear in MULTIPLE patches in the lockfile.\n        const fileFreq = new Map<string, number>();\n        for (const p of patches) {\n            for (const f of p.files) {\n                fileFreq.set(f, (fileFreq.get(f) ?? 0) + 1);\n            }\n        }\n        let migrated = 0;\n        let skipped = 0;\n        for (const patch of patches) {\n            if (patch.theirs_snapshot != null) continue;\n            const sharesAnyFile = patch.files.some((f) => (fileFreq.get(f) ?? 0) > 1);\n            if (sharesAnyFile) {\n                skipped++;\n                continue;\n            }\n            const snapshot: Record<string, string> = {};\n            for (const file of patch.files) {\n                if (isBinaryFile(file)) continue;\n                try {\n                    const base = await this.git.showFile(patch.base_generation, file).catch(() => null);\n                    if (base != null) {\n                        const content = await applyPatchToContent(base, patch.patch_content, file);\n                        if (content != null) snapshot[file] = content;\n                    }\n                } catch {\n                    // Reconstruction failed — leave this file out of the snapshot.\n                }\n            }\n            // Only persist when at least one file's snapshot was computed.\n            // Empty snapshots provide no value and would suppress retries.\n            if (Object.keys(snapshot).length > 0) {\n                patch.theirs_snapshot = snapshot;\n                try {\n                    this.lockManager.updatePatch(patch.id, { theirs_snapshot: snapshot });\n                    migrated++;\n                } catch {\n                    // Patch not in lockfile yet (shouldn't happen here, but be defensive).\n                }\n            }\n        }\n        if (migrated > 0) {\n            this.warnings.push(\n                `Migrated ${migrated} patch(es) to snapshot encoding. Future regens use 3-way merge ` +\n                    `with stored THEIRS, robust to generator structural changes.`\n            );\n        }\n        if (skipped > 0) {\n            this.warnings.push(\n                `Skipped snapshot migration for ${skipped} patch(es) sharing files with other patches. ` +\n                    `These continue to use line-anchored reconstruction (the existing path).`\n            );\n        }\n    }\n\n    /**\n     * For conflict patches with mixed results (some files merged, some conflicted),\n     * check if the cleanly merged files were absorbed by the generator (empty diff).\n     * If so, remove them from patch.files so they don't pollute the pre-generation\n     * rebase conflict marker check (`git grep <<<<<<< -- ...patch.files`).\n     *\n     * Non-absorbed clean files stay in patch.files — removing them would lose\n     * the customization on the next generation.\n     */\n    private async trimAbsorbedFiles(result: ReplayResult, currentGenSha: string): Promise<void> {\n        const cleanFiles = result.fileResults!.filter((f) => f.status === \"merged\").map((f) => f.file);\n        if (cleanFiles.length === 0) return;\n\n        const patch = result.patch;\n        // If the entire patch is persisted as user-owned, nothing is ever a\n        // generator-clean candidate for trimming — short-circuit.\n        if (patch.user_owned) return;\n\n        const fernignorePatterns = this.readFernignorePatterns();\n        const warnedGens = new Set<string>();\n\n        // Filter to only generator-produced clean files (not user-owned)\n        const generatorCleanFiles: string[] = [];\n        for (const file of cleanFiles) {\n            const userOwned = await this.fileOwnership.resolveCanonical({\n                file,\n                patch,\n                currentGenSha,\n                fernignorePatterns,\n                warnedGens,\n                warnings: this.warnings,\n            });\n            if (userOwned) {\n                continue; // user-owned file — never a candidate for absorption trimming\n            }\n            generatorCleanFiles.push(file);\n        }\n        if (generatorCleanFiles.length === 0) return;\n\n        // Check which clean files have an empty diff (absorbed by generator)\n        const absorbedFiles = new Set<string>();\n        for (const file of generatorCleanFiles) {\n            try {\n                const diff = await this.git.exec([\"diff\", currentGenSha, \"--\", file]).catch(() => null);\n                if (!diff || !diff.trim()) {\n                    absorbedFiles.add(file);\n                }\n            } catch {\n                // If diff fails, leave the file in the patch\n            }\n        }\n        if (absorbedFiles.size === 0) return;\n\n        // Remove absorbed files from the patch's file list\n        const remainingFiles = patch.files.filter((f) => !absorbedFiles.has(f));\n        if (remainingFiles.length === patch.files.length) return; // nothing changed\n\n        try {\n            this.lockManager.updatePatch(patch.id, { files: remainingFiles });\n        } catch {\n            // New patches aren't in lockfile yet — update in-memory only\n            patch.files = remainingFiles;\n        }\n    }\n\n    /**\n     * Pre-generation rebase: update patches using the customer's current state.\n     * Called BEFORE commitGeneration() while HEAD has customer code.\n     */\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    async preGenerationRebase(\n        patches: StoredPatch[]\n    ): Promise<{ conflictResolved: number; conflictAbsorbed: number; contentRefreshed: number }> {\n        const lock = this.lockManager.read();\n        const currentGen = lock.current_generation;\n\n        // If the previous run was skip-application, clear the marker and\n        // skip all revert detection. Patches are preserved as-is.\n        if (this.lockManager.isReplaySkipped()) {\n            this.lockManager.clearReplaySkippedAt();\n            return { conflictResolved: 0, conflictAbsorbed: 0, contentRefreshed: 0 };\n        }\n\n        // Auto-migrate legacy patches lacking `theirs_snapshot` to the new\n        // encoding. One-shot per existing patch — once migrated, future\n        // regens use the snapshot path. Compute snapshot from BASE +\n        // patch_content (same logic the slow apply path uses today and\n        // already trusts). Falls back to HEAD content if BASE is GC'd.\n        await this.migratePatchesToSnapshot(patches);\n\n        // Detect whether HEAD is a [fern-generated] commit AND it changed\n        // *source* files (vs HEAD~1) — the discriminator for the\n        // \"manually-staged-generation-at-HEAD\" bug case where `git diff\n        // currentGen HEAD -- file` would produce generator-vs-generator\n        // content (not customer intent) and corrupt patch_content/snapshot.\n        //\n        // Test helpers and infrastructure commits (e.g.,\n        // `[fern-generated] store patches` that only touches .fern/) are\n        // also generation commits but DON'T change source — they're safe\n        // to content-refresh against. The HEAD~1 source-diff check\n        // distinguishes these: the bug case mutates a source file vs its\n        // parent (customer's last code → generator output), while infra\n        // commits don't.\n        //\n        // Per-patch evaluation happens below — this just precomputes the\n        // generation-author signal.\n        const headMessage = await this.git.exec([\"log\", \"-1\", \"--format=%s%n%aN%n%ae\", \"HEAD\"]).catch(() => \"\");\n        const [headMsgLine, headAuthorName, headAuthorEmail] = headMessage.split(\"\\n\");\n        const headIsGeneration = headMsgLine\n            ? isGenerationCommit({\n                sha: \"HEAD\",\n                authorName: headAuthorName ?? \"\",\n                authorEmail: headAuthorEmail ?? \"\",\n                message: headMsgLine\n            })\n            : false;\n        const headParentChangedFiles = async (patchFiles: string[]): Promise<Set<string>> => {\n            if (patchFiles.length === 0) return new Set();\n            const diff = await this.git\n                .exec([\"diff\", \"--name-only\", \"HEAD~1\", \"HEAD\", \"--\", ...patchFiles])\n                .catch(() => \"\");\n            return new Set(diff.trim().split(\"\\n\").filter(Boolean));\n        };\n\n        let conflictResolved = 0;\n        let conflictAbsorbed = 0;\n        let contentRefreshed = 0;\n        const fernignorePatterns = this.readFernignorePatterns();\n        const warnedGens = new Set<string>();\n        // Cache reachability checks per-SHA to avoid repeating commitExists/treeExists\n        // git subprocess calls for the same base across many patches (N patches ×\n        // 2 calls is the main per-cycle cost in long-horizon scenarios like W11).\n        const reachabilityCache = new Map<string, boolean>();\n        const isReachable = async (sha: string): Promise<boolean> => {\n            const cached = reachabilityCache.get(sha);\n            if (cached !== undefined) return cached;\n            const reachable =\n                (await this.git.commitExists(sha)) || (await this.git.treeExists(sha));\n            reachabilityCache.set(sha, reachable);\n            return reachable;\n        };\n\n        // A patch whose every file is user-owned produces an empty diff\n        // between currentGen and HEAD (because commitGeneration bundled the file\n        // into currentGen — both sides are identical). That empty diff is NOT a\n        // revert signal. Only patches with at least one generator-produced file\n        // can have their emptiness legitimately interpreted as \"user reverted.\"\n        const allPatchFilesUserOwned = async (patch: StoredPatch): Promise<boolean> => {\n            if (patch.user_owned) return true;\n            if (patch.files.length === 0) return false;\n            for (const file of patch.files) {\n                const userOwned = await this.fileOwnership.resolveCanonical({\n                    file,\n                    patch,\n                    currentGenSha: currentGen,\n                    fernignorePatterns,\n                    warnedGens,\n                    warnings: this.warnings,\n                });\n                if (!userOwned) {\n                    return false;\n                }\n            }\n            return true;\n        };\n\n        for (const patch of patches) {\n            // Surface a warning when the patch's declared base_generation\n            // is unreachable (shallow clone / aggressive `git gc --prune`). Check\n            // this BEFORE any status gating — the warning is a reachability signal\n            // independent of whether the patch is currently unresolved/resolving.\n            if (\n                patch.base_generation &&\n                patch.base_generation !== currentGen &&\n                !warnedGens.has(patch.base_generation)\n            ) {\n                if (!(await isReachable(patch.base_generation))) {\n                    warnedGens.add(patch.base_generation);\n                    this.warnings.push(\n                        `Base generation ${patch.base_generation.slice(0, 7)} is unreachable ` +\n                            `(shallow clone or pruned history). Treating affected files as user-owned ` +\n                            `to avoid silent data loss. ` +\n                            `Run \\`git fetch --unshallow\\` or avoid \\`git gc --prune\\` to restore full history.`\n                    );\n                }\n            }\n\n            // Skip patches with any status (unresolved/resolving) — they weren't\n            // successfully applied last time. Clear status so applyPatches() can\n            // try them against the new generation.\n            if (patch.status != null) {\n                delete patch.status;\n                continue;\n            }\n\n            // When HEAD is a generation commit AND it mutated this patch's\n            // source files vs its parent, the customer manually staged a\n            // new generation at HEAD without running replay. Both the\n            // content-refresh and stale-base branches below would treat\n            // `git diff currentGen → HEAD` as customer intent — but here\n            // it's generator-vs-generator structural changes (the customer\n            // overwrote their own resolved file with the generator's new\n            // output). Refreshing patch_content/snapshot with that diff\n            // silently erases the customization. Skip and let the patch\n            // survive intact; `mergeFile`'s slow path will reconcile via\n            // 3-way merge against the (still-valid) theirs_snapshot.\n            //\n            // Infrastructure [fern-generated] commits (e.g. test helpers,\n            // store-patches commits) don't mutate source files vs parent,\n            // so they fall through to the normal refresh path.\n            if (headIsGeneration) {\n                const parentChangedFiles = await headParentChangedFiles(patch.files);\n                const headTouchedSource = patch.files.some((f) => parentChangedFiles.has(f));\n                if (headTouchedSource) {\n                    continue;\n                }\n            }\n\n            if (patch.base_generation === currentGen) {\n                // Content refresh: check if user modified their customization\n                // since the last replay commit. When an autoversion commit\n                // contaminated HEAD between replay runs, route via\n                // snapshot-based reconstruction to avoid baking the\n                // placeholder→semver swap into customer patch_content.\n                try {\n                    const contaminated = await this.hasAutoversionContamination(\n                        currentGen,\n                        \"HEAD\",\n                        patch.files,\n                    );\n\n                    if (contaminated) {\n                        const snapshotDiff = await this.computeSnapshotBasedPatchDiff(\n                            patch,\n                            currentGen,\n                        );\n                        if (snapshotDiff === null) continue;\n                        if (!snapshotDiff.trim()) {\n                            if (await allPatchFilesUserOwned(patch)) continue;\n                            this.lockManager.removePatch(patch.id);\n                            contentRefreshed++;\n                            continue;\n                        }\n                        const snapHasStaleMarkers = snapshotDiff.split(\"\\n\").some(\n                            (l) => l.startsWith(\"+<<<<<<< Generated\") || l.startsWith(\"+>>>>>>> Your customization\")\n                        );\n                        if (snapHasStaleMarkers) continue;\n                        const isProtectedSnap = patch.files.some(\n                            (file) => file === \".fernignore\" ||\n                                fernignorePatterns.some((p) => file === p || minimatch(file, p))\n                        );\n                        if (isProtectedSnap) continue;\n                        const snapHash = this.detector.computeContentHash(snapshotDiff);\n                        if (snapHash !== patch.content_hash) {\n                            this.lockManager.updatePatch(patch.id, {\n                                patch_content: snapshotDiff,\n                                content_hash: snapHash,\n                            });\n                            contentRefreshed++;\n                        }\n                        continue;\n                    }\n\n                    const ppResult = await computePerPatchDiffWithFallback(\n                        patch,\n                        (f) => this.git.showFile(currentGen, f),\n                        (f) => this.git.showFile(\"HEAD\", f),\n                        (files) => this.git\n                            .exec([\"diff\", currentGen, \"HEAD\", \"--\", ...files])\n                            .catch(() => null)\n                    );\n\n                    if (ppResult === null) continue;\n                    if (ppResult.hadFallback) {\n                        this.warnings.push(\n                            `Patch ${patch.id}: couldn't fully isolate ${ppResult.fallbackFiles.join(\", \")} — ` +\n                                `customization preserved, attribution may have merged with another patch.`\n                        );\n                    }\n                    const diff = ppResult.diff;\n\n                    if (!diff.trim()) {\n                        // Empty diff usually means customer reverted the\n                        // customization. But if every file is user-owned, empty\n                        // diff is expected (the generator bundled the files\n                        // into currentGen) — preserve the patch.\n                        if (await allPatchFilesUserOwned(patch)) continue;\n                        // User reverted all customizations in this patch\n                        this.lockManager.removePatch(patch.id);\n                        contentRefreshed++;\n                        continue;\n                    }\n\n                    // Skip content refresh if the diff contains stale conflict\n                    // markers from a previous crashed run. Only check added lines\n                    // (prefixed with \"+\") to avoid false positives from files that\n                    // legitimately contain marker text (e.g., documentation).\n                    const diffLines = diff.split(\"\\n\");\n                    const hasStaleMarkers = diffLines.some(\n                        (l) => l.startsWith(\"+<<<<<<< Generated\") || l.startsWith(\"+>>>>>>> Your customization\")\n                    );\n                    if (hasStaleMarkers) {\n                        continue;\n                    }\n\n                    // Skip content conversion for .fernignore-protected files —\n                    // matches rebasePatches' behavior so both flows end with\n                    // identical patch_content for the same scenario.\n                    // User-created (non-protected) files go through the regular\n                    // content-refresh path so they can be deduplicated when\n                    // multiple incremental patches resolve to the same cumulative\n                    // state.\n                    const isProtected = patch.files.some(\n                        (file) => file === \".fernignore\" ||\n                            fernignorePatterns.some((p) => file === p || minimatch(file, p))\n                    );\n                    if (isProtected) {\n                        continue;\n                    }\n\n                    const newContentHash = this.detector.computeContentHash(diff);\n                    if (newContentHash !== patch.content_hash) {\n                        // User changed their customization — update patch content\n                        // and recalculate the files list (some files may no longer differ)\n                        const filesOutput = await this.git\n                            .exec([\"diff\", \"--name-only\", currentGen, \"HEAD\", \"--\", ...patch.files])\n                            .catch(() => null);\n\n                        const newFiles = filesOutput\n                            ? filesOutput\n                                  .trim()\n                                  .split(\"\\n\")\n                                  .filter(Boolean)\n                                  .filter((f) => !f.startsWith(\".fern/\"))\n                            : patch.files;\n\n                        if (newFiles.length === 0) {\n                            this.lockManager.removePatch(patch.id);\n                        } else {\n                            // Snapshot THEIRS from HEAD (the diff is\n                            // currentGen → HEAD). The `headIsGeneration`\n                            // early-continue above already protects against\n                            // the manual-gen-commit-at-HEAD case (where HEAD\n                            // is generator content with no customer intent).\n                            // For genuine customer edits, HEAD is the\n                            // authoritative customer state — refresh\n                            // snapshot to match so subsequent regens see\n                            // the customer's latest intent.\n                            const snapshot = await this.readSnapshotFromTree(\"HEAD\", newFiles);\n                            this.lockManager.updatePatch(patch.id, {\n                                patch_content: diff,\n                                content_hash: newContentHash,\n                                files: newFiles,\n                                ...(Object.keys(snapshot).length > 0 ? { theirs_snapshot: snapshot } : {})\n                            });\n                        }\n                        contentRefreshed++;\n                    }\n                } catch {\n                    // If anything fails, leave the patch unchanged\n                }\n                continue;\n            }\n\n            try {\n                // Check for unresolved conflict markers in HEAD\n                const markerFiles = await this.git\n                    .exec([\"grep\", \"-l\", \"<<<<<<< Generated\", \"HEAD\", \"--\", ...patch.files])\n                    .catch(() => \"\");\n\n                if (markerFiles.trim()) continue;\n\n                // Snapshot-based reconstruction when autoversion contaminated.\n                const contaminated = await this.hasAutoversionContamination(\n                    currentGen,\n                    \"HEAD\",\n                    patch.files,\n                );\n\n                if (contaminated) {\n                    const snapshotDiff = await this.computeSnapshotBasedPatchDiff(\n                        patch,\n                        currentGen,\n                    );\n                    if (snapshotDiff === null) continue;\n                    if (!snapshotDiff.trim()) {\n                        if (await allPatchFilesUserOwned(patch)) {\n                            try {\n                                this.lockManager.updatePatch(patch.id, { base_generation: currentGen });\n                            } catch {\n                                // New patch — not in lockfile yet\n                            }\n                            continue;\n                        }\n                        this.lockManager.removePatch(patch.id);\n                        conflictAbsorbed++;\n                        continue;\n                    }\n                    const snapHasStaleMarkers = snapshotDiff.split(\"\\n\").some(\n                        (l) => l.startsWith(\"+<<<<<<< Generated\") || l.startsWith(\"+>>>>>>> Your customization\")\n                    );\n                    if (snapHasStaleMarkers) continue;\n                    const snapHash = this.detector.computeContentHash(snapshotDiff);\n                    this.lockManager.updatePatch(patch.id, {\n                        base_generation: currentGen,\n                        patch_content: snapshotDiff,\n                        content_hash: snapHash,\n                    });\n                    conflictResolved++;\n                    continue;\n                }\n\n                // Per-patch-region diff with cumulative fallback for the\n                // unlocatable subset (see content-refresh branch above for\n                // the rationale around partially-anchorable hunks).\n                const ppResult = await computePerPatchDiffWithFallback(\n                    patch,\n                    (f) => this.git.showFile(currentGen, f),\n                    (f) => this.git.showFile(\"HEAD\", f),\n                    (files) => this.git\n                        .exec([\"diff\", currentGen, \"HEAD\", \"--\", ...files])\n                        .catch(() => null)\n                );\n\n                // ppResult === null only when cumulative fallback explicitly\n                // failed — skip the patch rather than corrupt the lockfile.\n                if (ppResult === null) continue;\n                if (ppResult.hadFallback) {\n                    this.warnings.push(\n                        `Patch ${patch.id}: couldn't fully isolate ${ppResult.fallbackFiles.join(\", \")} — ` +\n                            `customization preserved, attribution may have merged with another patch.`\n                    );\n                }\n                const diff = ppResult.diff;\n\n                if (!diff.trim()) {\n                    // Empty diff: for user-owned patches this is expected\n                    // (currentGen has bundled copies), not a revert signal.\n                    if (await allPatchFilesUserOwned(patch)) {\n                        // Repoint stale base onto current so the next cycle\n                        // routes via the fast content-refresh branch.\n                        try {\n                            this.lockManager.updatePatch(patch.id, { base_generation: currentGen });\n                        } catch {\n                            // New patches aren't in lockfile yet\n                        }\n                        continue;\n                    }\n                    // Empty diff — customer reverted their customization\n                    this.lockManager.removePatch(patch.id);\n                    conflictAbsorbed++;\n                    continue;\n                }\n\n                // Update the patch with the resolved content. The\n                // `headIsGeneration` early-continue above protects the\n                // bug case (HEAD is a generator commit with no customer\n                // intent). For genuine customer resolutions, refresh\n                // snapshot from HEAD too.\n                const newContentHash = this.detector.computeContentHash(diff);\n                const snapshot = await this.readSnapshotFromTree(\"HEAD\", patch.files);\n                this.lockManager.updatePatch(patch.id, {\n                    base_generation: currentGen,\n                    patch_content: diff,\n                    content_hash: newContentHash,\n                    ...(Object.keys(snapshot).length > 0 ? { theirs_snapshot: snapshot } : {})\n                });\n                conflictResolved++;\n            } catch {\n                // If anything fails, leave the patch unchanged\n            }\n        }\n\n        return { conflictResolved, conflictAbsorbed, contentRefreshed };\n    }\n\n    /**\n     * After applyPatches(), surface a warning for each (patch × file) where\n     * diff3 silently dropped lines that were unchanged context in the\n     * customer's THEIRS. The deletion stays on disk (correct diff3 outcome),\n     * but the customer must learn so they can re-add the lines if they\n     * relied on them. This is the \"surface or preserve, never silently drop\"\n     * contract for legitimate-deletion cases.\n     */\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    recordDroppedContextLineWarnings(results: ReplayResult[]): void {\n        const PREVIEW_COUNT = 5;\n        for (const result of results) {\n            if (!result.fileResults) continue;\n            for (const fr of result.fileResults) {\n                const dropped = fr.droppedContextLines;\n                if (!dropped || dropped.length === 0) continue;\n                const preview = dropped\n                    .slice(0, PREVIEW_COUNT)\n                    .map((line) => `    ${line}`)\n                    .join(\"\\n\");\n                const more = dropped.length > PREVIEW_COUNT\n                    ? `\\n    ... and ${dropped.length - PREVIEW_COUNT} more`\n                    : \"\";\n                this.warnings.push(\n                    `${fr.file}: ${dropped.length} line(s) that appeared as unchanged ` +\n                        `context in your customization were deleted by the new generator output. ` +\n                        `The merge followed the deletion. First lines deleted:\\n${preview}${more}\\n` +\n                        `If you want to keep these lines, restore them in a follow-up commit and ` +\n                        `re-run replay; otherwise this warning can be safely ignored.`\n                );\n            }\n        }\n    }\n\n    /**\n     * After applyPatches(), surface a warning for each (patch × file) where a\n     * customization's BASE could not be read because the patch's\n     * base-generation tree is unreachable in this clone (shallow-clone window\n     * too small / pruned history). In that state the merge pipeline falls\n     * through to `new-file-both` and the customer's edit can be dropped with NO\n     * conflict and NO error — the INC-866 silent-loss class. This converts that\n     * silence into an explicit, actionable warning naming the file and the\n     * likely cause (insufficient clone window).\n     *\n     * Mirrors `recordDroppedContextLineWarnings`'s \"surface, never silently\n     * drop\" contract. De-duplicated per file path so a single insufficient\n     * window doesn't spam one warning per touched file repeatedly.\n     */\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    recordUnreachableBaseWarnings(results: ReplayResult[]): void {\n        const warned = new Set<string>();\n        for (const result of results) {\n            if (!result.fileResults) continue;\n            for (const fr of result.fileResults) {\n                if (!fr.baseTreeUnreachable) continue;\n                if (warned.has(fr.file)) continue;\n                warned.add(fr.file);\n                const base = fr.conflictMetadata?.baseGeneration;\n                const baseRef = base ? ` (base generation ${base.slice(0, 7)})` : \"\";\n                this.warnings.push(\n                    `${fr.file}: could not read the prior generation's version of this ` +\n                        `file${baseRef} because that generation's tree is outside the clone ` +\n                        `window (insufficient shallow-clone depth or pruned history). The ` +\n                        `customization was treated as a new file, which can drop your edits ` +\n                        `silently. Re-run with the prior generation in the clone window — e.g. ` +\n                        `\\`git fetch --shallow-since=<date just before the prior [fern-generated] ` +\n                        `commit>\\` or \\`git fetch --unshallow\\` — then re-run replay.`\n                );\n            }\n        }\n        // Structured channel: ONE summarizing degraded reason for the run\n        // (per-file detail already lives in the warnings above).\n        if (warned.size > 0) {\n            this.degradedReasons.push({\n                code: \"patch-base-unreachable\",\n                message:\n                    `${warned.size} customization file(s) could not be checked against the ` +\n                    `generation they were made on because that generation's tree was not ` +\n                    `reachable during this run. Customizations may not have been carried ` +\n                    `forward — review the result before merging, or widen the clone window ` +\n                    `and re-run replay.`,\n            });\n        }\n    }\n\n    /**\n     * After applyPatches(), strip conflict markers from conflicting files\n     * so only clean content is committed. Keeps the Generated (OURS) side.\n     */\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    revertConflictingFiles(results: ReplayResult[]): void {\n        for (const result of results) {\n            if (result.status !== \"conflict\" || !result.fileResults) continue;\n\n            for (const fileResult of result.fileResults) {\n                if (fileResult.status !== \"conflict\") continue;\n\n                const filePath = join(this.outputDir, fileResult.file);\n                try {\n                    const content = readFileSync(filePath, \"utf-8\");\n                    const stripped = stripConflictMarkers(content);\n                    writeFileSync(filePath, stripped);\n                } catch {\n                    // If file doesn't exist or can't be read, skip\n                }\n            }\n        }\n    }\n\n    /**\n     * Clean up stale conflict markers left by a previous crashed run.\n     * Called after commitGeneration() when HEAD is the [fern-generated] commit.\n     * Restores files to their clean generated state from HEAD.\n     * Skips .fernignore-protected files to prevent overwriting user content.\n     */\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    async cleanupStaleConflictMarkers(): Promise<void> {\n        const markerFiles = await this.git\n            .exec([\"grep\", \"-l\", \"<<<<<<< Generated\", \"--\", \".\"])\n            .catch(() => \"\");\n\n        const files = markerFiles.trim().split(\"\\n\").filter(Boolean);\n        if (files.length === 0) return;\n\n        const fernignorePatterns = this.readFernignorePatterns();\n\n        for (const file of files) {\n            if (fernignorePatterns.some((pattern) => minimatch(file, pattern))) continue;\n\n            try {\n                await this.git.exec([\"checkout\", \"HEAD\", \"--\", file]);\n            } catch {\n                // File may not exist in the generation tree (e.g., user-created\n                // file). Skip — revertConflictingFiles will handle it later.\n            }\n        }\n    }\n\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    readFernignorePatterns(): string[] {\n        return readFernignorePatterns(this.outputDir);\n    }\n\n    /** @internal Used by Flow implementations in `src/flows/`. */\n    buildReport(\n        flow: \"first-generation\" | \"no-patches\" | \"normal-regeneration\" | \"skip-application\",\n        patches: StoredPatch[],\n        results: ReplayResult[],\n        options?: ReplayOptions,\n        warnings?: string[],\n        rebaseCounts?: {\n            absorbed: number;\n            repointed: number;\n            contentRebased: number;\n            keptAsUserOwned: number;\n            absorbedPatchIds: Set<string>;\n        },\n        preRebaseCounts?: { conflictResolved: number; conflictAbsorbed: number; contentRefreshed: number },\n        patchesReverted?: number,\n        degradedReasons?: DegradedReason[]\n    ): ReplayReport {\n        const degraded = dedupeDegradedReasons(degradedReasons ?? []);\n        const conflictResults = results.filter((r) => r.status === \"conflict\");\n        const conflictDetails = conflictResults\n            .map((r) => {\n                const conflictFiles = r.fileResults?.filter((f) => f.status === \"conflict\") ?? [];\n                const cleanFiles = r.fileResults?.filter((f) => f.status === \"merged\").map((f) => f.file) ?? [];\n                return {\n                    patchId: r.patch.id,\n                    patchMessage: r.patch.original_message,\n                    reason: r.conflictReason,\n                    files: conflictFiles,\n                    cleanFiles: cleanFiles.length > 0 ? cleanFiles : undefined\n                };\n            })\n            .filter((d) => d.files.length > 0);\n        const partialCount = conflictDetails.filter((d) => d.cleanFiles && d.cleanFiles.length > 0).length;\n\n        // Widen unresolvedPatches to include conflict-by-association entries:\n        // patches whose result.status is \"applied\" but whose patch.status was\n        // set to \"unresolved\" by the rebase guard (clean follow-up after\n        // same-file conflict). They have no file-level merge conflicts of\n        // their own but must surface so the resolve workflow handles them.\n        const unresolvedResults = results.filter(\n            (r) => r.status === \"conflict\" || r.patch.status === \"unresolved\"\n        );\n\n        return {\n            flow,\n            patchesDetected: patches.length,\n            patchesApplied: results.filter((r) => r.status === \"applied\").length,\n            patchesWithConflicts: conflictResults.length,\n            patchesSkipped: results.filter((r) => r.status === \"skipped\").length,\n            patchesPartiallyApplied: partialCount > 0 ? partialCount : undefined,\n            patchesAbsorbed: rebaseCounts && rebaseCounts.absorbed > 0 ? rebaseCounts.absorbed : undefined,\n            patchesRepointed: rebaseCounts && rebaseCounts.repointed > 0 ? rebaseCounts.repointed : undefined,\n            patchesContentRebased:\n                rebaseCounts && rebaseCounts.contentRebased > 0 ? rebaseCounts.contentRebased : undefined,\n            patchesKeptAsUserOwned:\n                rebaseCounts && rebaseCounts.keptAsUserOwned > 0 ? rebaseCounts.keptAsUserOwned : undefined,\n            patchesReverted: patchesReverted && patchesReverted > 0 ? patchesReverted : undefined,\n            patchesConflictResolved:\n                preRebaseCounts && preRebaseCounts.conflictResolved + preRebaseCounts.conflictAbsorbed > 0\n                    ? preRebaseCounts.conflictResolved + preRebaseCounts.conflictAbsorbed\n                    : undefined,\n            patchesRefreshed:\n                preRebaseCounts && preRebaseCounts.contentRefreshed > 0 ? preRebaseCounts.contentRefreshed : undefined,\n            conflicts: conflictResults.flatMap((r) => r.fileResults?.filter((f) => f.status === \"conflict\") ?? []),\n            conflictDetails: conflictDetails.length > 0 ? conflictDetails : undefined,\n            unresolvedPatches:\n                unresolvedResults.length > 0\n                    ? unresolvedResults.map((r) => ({\n                          patchId: r.patch.id,\n                          patchMessage: r.patch.original_message,\n                          files: r.patch.files,\n                          conflictDetails: r.fileResults?.filter((f) => f.status === \"conflict\") ?? []\n                      }))\n                    : undefined,\n            wouldApply: options?.dryRun ? patches : undefined,\n            warnings: warnings && warnings.length > 0 ? warnings : undefined,\n            degraded: degraded.length > 0 ? true : undefined,\n            degradedReasons: degraded.length > 0 ? degraded : undefined\n        };\n    }\n}\n\n/**\n * Merge degraded-reason lists, dropping exact duplicates (same code AND\n * message). A run can legitimately hit multiple set-points (e.g. anchor\n * unreachable at detect time AND patch base unreachable at apply time);\n * distinct reasons are all kept.\n *\n * @internal Used by Flow implementations in `src/flows/`.\n */\nexport function dedupeDegradedReasons(reasons: DegradedReason[]): DegradedReason[] {\n    const seen = new Set<string>();\n    const out: DegradedReason[] = [];\n    for (const reason of reasons) {\n        const key = `${reason.code}\u0000${reason.message}`;\n        if (seen.has(key)) continue;\n        seen.add(key);\n        out.push(reason);\n    }\n    return out;\n}\n\n/**\n * Bucket the patches given to commitReplay so the commit message body is\n * an honest reflection of outcomes. A patch is:\n *   - `unresolved`: file-level merge conflict OR PR #73 conflict-by-association\n *     (`patch.status === \"unresolved\"` set by `rebasePatches`)\n *   - `absorbed`: in `absorbedPatchIds` (rebase removed it because the\n *     generator now emits the customization natively)\n *   - `applied`: everything else with status === \"applied\"\n * Skipped/binary patches don't surface in the commit message at all.\n *\n * `patchesPassedToCommit` is what the caller hands to `commitReplay` (e.g.,\n * `allPatches` for normal regen, `newPatches` for the no-patches flow).\n * The function preserves its order so the commit body matches lockfile order.\n */\n/** @internal Used by Flow implementations in `src/flows/`. */\nexport function computeCommitBuckets(\n    results: ReplayResult[],\n    absorbedPatchIds: Set<string>,\n    patchesPassedToCommit: StoredPatch[]\n): { applied: StoredPatch[]; unresolved: StoredPatch[]; absorbed: StoredPatch[] } {\n    const resultByPatchId = new Map<string, ReplayResult>();\n    for (const r of results) resultByPatchId.set(r.patch.id, r);\n\n    const applied: StoredPatch[] = [];\n    const unresolved: StoredPatch[] = [];\n    const absorbed: StoredPatch[] = [];\n\n    for (const patch of patchesPassedToCommit) {\n        if (absorbedPatchIds.has(patch.id)) {\n            absorbed.push(patch);\n            continue;\n        }\n        const r = resultByPatchId.get(patch.id);\n        if (!r) {\n            // No result (e.g., patch wasn't applied this cycle but is in\n            // the lockfile). Treat as applied for legacy parity — the\n            // alternative would silently disappear from the commit body.\n            applied.push(patch);\n            continue;\n        }\n        if (r.status === \"conflict\" || patch.status === \"unresolved\") {\n            unresolved.push(patch);\n            continue;\n        }\n        if (r.status === \"applied\") {\n            applied.push(patch);\n            continue;\n        }\n        // status === \"skipped\" — omit. Skipped patches typically come from\n        // exclude patterns; surfacing them in the commit body is noise.\n    }\n\n    return { applied, unresolved, absorbed };\n}\n\n/**\n * Result of cleansing a single patch against the current `.fernignore`\n * patterns. Discriminated three ways:\n *   - `unchanged`: patch had no fernignore-matched references; leave alone.\n *   - `remove`: patch's surviving files / patch_content are both empty;\n *     remove the patch from the lockfile.\n *   - otherwise: patch survives with `files` / `patch_content` /\n *     `theirs_snapshot` / `content_hash` updated.\n *\n * @internal Exported for unit tests; called from\n * `ReplayService.cleanseLegacyFernignoreEntries`.\n */\nexport interface LegacyFernignoreCleanseResult {\n    readonly unchanged: boolean;\n    readonly remove: boolean;\n    readonly files: string[];\n    readonly patch_content: string;\n    readonly content_hash: string;\n    readonly theirs_snapshot?: Record<string, string>;\n    readonly strippedPaths: string[];\n}\n\n/**\n * Pure function — operates on `StoredPatch` fields and the current\n * `.fernignore` patterns. Returns what the cleanse step in\n * `ReplayService.prepareReplay` should do for this patch.\n *\n * Safety properties:\n *   - Returns `unchanged: true` if no fernignore-matched paths appear\n *     anywhere in `files`, `theirs_snapshot`, or `patch_content`.\n *   - Leaves `patch_content` byte-identical when no `diff --git` headers\n *     can be parsed (fail-safe for exotic legacy formats — the applicator\n *     iterates `files`, not `patch_content`, so the fernignored file is\n *     still untouched).\n *   - `content_hash` is only recomputed when `patch_content` actually\n *     changes. Otherwise the original hash is preserved.\n */\nexport function computeLegacyFernignoreCleanse(\n    patch: StoredPatch,\n    fernignorePatterns: readonly string[],\n    computeContentHash: (content: string) => string,\n): LegacyFernignoreCleanseResult {\n    const matchesFernignore = (filePath: string): boolean =>\n        fernignorePatterns.some((p) => {\n            if (filePath === p) return true;\n            if (minimatch(filePath, p)) return true;\n            // Gitignore-style: a bare directory name also matches all\n            // paths underneath it. See ReplayDetector for rationale.\n            if (!p.includes(\"*\") && !p.includes(\"?\") && filePath.startsWith(p + \"/\")) return true;\n            return false;\n        });\n\n    const strippedFromFiles = patch.files.filter(matchesFernignore);\n    const survivingFiles = patch.files.filter((f) => !matchesFernignore(f));\n\n    let survivingSnapshot: Record<string, string> | undefined = undefined;\n    let snapshotChanged = false;\n    if (patch.theirs_snapshot) {\n        survivingSnapshot = {};\n        for (const [key, value] of Object.entries(patch.theirs_snapshot)) {\n            if (matchesFernignore(key)) {\n                snapshotChanged = true;\n            } else {\n                survivingSnapshot[key] = value;\n            }\n        }\n    }\n\n    const { stripped: patchContentStripped, content: newPatchContent, strippedSectionPaths } =\n        stripDiffSectionsByPredicate(patch.patch_content, matchesFernignore);\n\n    const unchanged = strippedFromFiles.length === 0 && !snapshotChanged && !patchContentStripped;\n    if (unchanged) {\n        return {\n            unchanged: true,\n            remove: false,\n            files: patch.files,\n            patch_content: patch.patch_content,\n            content_hash: patch.content_hash,\n            theirs_snapshot: patch.theirs_snapshot,\n            strippedPaths: [],\n        };\n    }\n\n    const strippedPaths = Array.from(new Set([...strippedFromFiles, ...strippedSectionPaths]));\n\n    if (survivingFiles.length === 0 || newPatchContent.trim() === \"\") {\n        return {\n            unchanged: false,\n            remove: true,\n            files: [],\n            patch_content: \"\",\n            content_hash: \"\",\n            strippedPaths,\n        };\n    }\n\n    const newContentHash = patchContentStripped\n        ? computeContentHash(newPatchContent)\n        : patch.content_hash;\n\n    return {\n        unchanged: false,\n        remove: false,\n        files: survivingFiles,\n        patch_content: newPatchContent,\n        content_hash: newContentHash,\n        ...(survivingSnapshot !== undefined ? { theirs_snapshot: survivingSnapshot } : {}),\n        strippedPaths,\n    };\n}\n\n/**\n * Infrastructure file predicate — matches files managed by the generation\n * pipeline that must never appear in patch content. Mirrors the\n * `INFRASTRUCTURE_FILES` constant in `ReplayDetector.ts`.\n */\nfunction isInfrastructureFile(filePath: string): boolean {\n    return filePath === \".fernignore\" || filePath.startsWith(\".fern/\");\n}\n\ninterface InfrastructureFileCleanseResult {\n    unchanged: boolean;\n    remove: boolean;\n    patch_content: string;\n    content_hash: string;\n    strippedPaths: string[];\n}\n\n/**\n * Strips infrastructure file diff sections (`.fernignore`, `.fern/*`) from a\n * patch's `patch_content`. These were bundled by older detection logic that\n * used `git format-patch` without scoping to surviving files when only\n * infrastructure files were stripped.\n *\n * Only operates on `patch_content` — infrastructure files never appear in\n * `patch.files` or `theirs_snapshot` (those were correctly filtered at\n * detection time). The bug was solely that `format-patch` captured the full\n * commit diff.\n */\nexport function computeInfrastructureFileCleanse(\n    patch: StoredPatch,\n    computeContentHash: (content: string) => string,\n): InfrastructureFileCleanseResult {\n    const { stripped, content: newPatchContent, strippedSectionPaths } =\n        stripDiffSectionsByPredicate(patch.patch_content, isInfrastructureFile);\n\n    if (!stripped) {\n        return {\n            unchanged: true,\n            remove: false,\n            patch_content: patch.patch_content,\n            content_hash: patch.content_hash,\n            strippedPaths: [],\n        };\n    }\n\n    // All diff sections were infrastructure files — the patch has no\n    // surviving SDK content.\n    if (newPatchContent.trim() === \"\" || patch.files.length === 0) {\n        return {\n            unchanged: false,\n            remove: true,\n            patch_content: \"\",\n            content_hash: \"\",\n            strippedPaths: strippedSectionPaths,\n        };\n    }\n\n    return {\n        unchanged: false,\n        remove: false,\n        patch_content: newPatchContent,\n        content_hash: computeContentHash(newPatchContent),\n        strippedPaths: strippedSectionPaths,\n    };\n}\n\n/**\n * Syntactic stripper for `diff --git` sections. Drops sections whose\n * target (`b/<path>`) matches the predicate. Fail-safe behavior:\n *\n *   - If `patch_content` has NO `diff --git` headers, returns it\n *     unchanged. The cleanse step relies on this to avoid corrupting\n *     legacy or exotic patch formats.\n *   - If a `diff --git` line's path cannot be parsed (e.g., git-quoted\n *     form with special characters), the section is KEPT — false\n *     positives are zero by design.\n */\nfunction stripDiffSectionsByPredicate(\n    patchContent: string,\n    shouldStrip: (filePath: string) => boolean,\n): { stripped: boolean; content: string; strippedSectionPaths: string[] } {\n    const lines = patchContent.split(\"\\n\");\n    const sectionStarts: { idx: number; path: string | null }[] = [];\n\n    for (let i = 0; i < lines.length; i++) {\n        const line = lines[i]!;\n        if (line.startsWith(\"diff --git \")) {\n            const match = line.match(/^diff --git a\\/(.+?) b\\/(.+?)$/);\n            const path = match ? match[2]! : null;\n            sectionStarts.push({ idx: i, path });\n        }\n    }\n\n    if (sectionStarts.length === 0) {\n        return { stripped: false, content: patchContent, strippedSectionPaths: [] };\n    }\n\n    const preamble = lines.slice(0, sectionStarts[0]!.idx);\n    const newLines: string[] = [...preamble];\n    const strippedSectionPaths: string[] = [];\n    let stripped = false;\n\n    for (let i = 0; i < sectionStarts.length; i++) {\n        const section = sectionStarts[i]!;\n        const next = sectionStarts[i + 1];\n        const endIdx = next ? next.idx : lines.length;\n        if (section.path !== null && shouldStrip(section.path)) {\n            stripped = true;\n            strippedSectionPaths.push(section.path);\n            continue;\n        }\n        newLines.push(...lines.slice(section.idx, endIdx));\n    }\n\n    return { stripped, content: newLines.join(\"\\n\"), strippedSectionPaths };\n}\n","import { mkdir, mkdtemp, readFile, rm, unlink, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport { MergeAccumulator, type AccumulatorEntry } from \"./accumulator/MergeAccumulator.js\";\nimport { buildMergePlan, resolveInputs, runMergeAndRecord } from \"./applicator/index.js\";\nimport { stripConflictMarkers } from \"./conflict-utils.js\";\nimport type { GitClient } from \"./git/GitClient.js\";\nimport type { LockfileManager } from \"./LockfileManager.js\";\nimport { isBinaryFile } from \"./shared/binary.js\";\nimport type {\n    ConflictReason,\n    FileResult,\n    GenerationRecord,\n    ReplayResult,\n    StoredPatch\n} from \"./types.js\";\n\n// Re-exported from `./shared/binary.js` — kept here for back-compat with\n// external imports (`@fern-api/replay/dist/ReplayApplicator`). New code\n// should import from `./shared/binary.js` directly.\nexport { isBinaryFile } from \"./shared/binary.js\";\n\nexport class ReplayApplicator {\n    private git: GitClient;\n    private lockManager: LockfileManager;\n    private outputDir: string;\n    private renameCache = new Map<string, Array<{ from: string; to: string }>>();\n    private treeExistsCache = new Map<string, boolean>();\n\n    /**\n     * Inter-patch THEIRS coordination. Created fresh in each `applyPatches`\n     * invocation with the run's apply mode + precomputed shared-file set.\n     * See `src/accumulator/MergeAccumulator.ts` for the full contract.\n     *\n     * Initialized to an empty default in the constructor so type narrowing\n     * works for callers that read it before any `applyPatches` invocation\n     * (e.g., the `getAccumulatorSnapshot` test accessor).\n     */\n    private accumulator = new MergeAccumulator(\"replay\", new Set());\n\n    constructor(git: GitClient, lockManager: LockfileManager, outputDir: string) {\n        this.git = git;\n        this.lockManager = lockManager;\n        this.outputDir = outputDir;\n    }\n\n    /**\n     * Resolve the GenerationRecord for a patch's base_generation.\n     * Falls back to constructing an ad-hoc record from the commit's tree\n     * when base_generation isn't a tracked generation (commit-scan patches).\n     */\n    private async resolveBaseGeneration(baseGeneration: string): Promise<GenerationRecord | undefined> {\n        const gen = this.lockManager.getGeneration(baseGeneration);\n        if (gen) return gen;\n        try {\n            const treeHash = await this.git.getTreeHash(baseGeneration);\n            return {\n                commit_sha: baseGeneration,\n                tree_hash: treeHash,\n                timestamp: new Date().toISOString(),\n                cli_version: \"unknown\",\n                generator_versions: {}\n            };\n        } catch {\n            return undefined;\n        }\n    }\n\n    /**\n     * @internal Test-only.\n     * Returns a defensive copy of the inter-patch accumulator. Used by\n     * invariant I2 to assert that after every applied patch, the\n     * accumulator has an entry for each file the patch touched, and the\n     * entry's content matches on-disk.\n     */\n    getAccumulatorSnapshot(): ReadonlyMap<string, AccumulatorEntry> {\n        return this.accumulator.snapshot();\n    }\n\n    /**\n     * Apply all patches, returning results for each.\n     * Skips patches that match exclude patterns in replay.yml\n     *\n     * `applyMode` controls the post-conflict marker strategy:\n     *   - `\"replay\"` (default): strip conflict markers from disk between\n     *     iterations whenever a later patch touches the same file. Lets the\n     *     follow-up patch's `git apply --3way` see clean OURS content,\n     *     which is what the silent-loss fix (PR #73) relies on. The replay\n     *     pipeline calls `revertConflictingFiles` after the loop to clean\n     *     any markers that survive.\n     *   - `\"resolve\"`: keep markers on disk. The resolve command needs the\n     *     customer to see them. Slow-path 3-way merge naturally preserves\n     *     A's markers and B's clean writes when their regions don't overlap;\n     *     when they do overlap, the customer gets nested markers and\n     *     resolves manually. Either way they aren't silently dropped.\n     */\n    async applyPatches(\n        patches: StoredPatch[],\n        opts?: { applyMode?: \"replay\" | \"resolve\" }\n    ): Promise<ReplayResult[]> {\n        const applyMode = opts?.applyMode ?? \"replay\";\n\n        // Compute set of files shared by 2+ patches in this run. Used by\n        // the accumulator to gate snapshot-as-primary in mergeFile and\n        // populateAccumulatorForPatch — see cross-patch isolation.\n        const fileFreq = new Map<string, number>();\n        for (const p of patches) {\n            for (const f of p.files) {\n                fileFreq.set(f, (fileFreq.get(f) ?? 0) + 1);\n            }\n        }\n        const sharedFiles = new Set(\n            Array.from(fileFreq.entries())\n                .filter(([, n]) => n > 1)\n                .map(([f]) => f),\n        );\n\n        // Fresh accumulator per apply cycle — single-use, single owner.\n        this.accumulator = new MergeAccumulator(applyMode, sharedFiles);\n\n        const results: ReplayResult[] = [];\n\n        for (let i = 0; i < patches.length; i++) {\n            const patch = patches[i]!;\n\n            if (this.isExcluded(patch)) {\n                results.push({\n                    patch,\n                    status: \"skipped\",\n                    method: \"git-am\"\n                });\n                continue;\n            }\n\n            const result = await this.applyPatchWithFallback(patch);\n            results.push(result);\n\n            // Strip conflict markers from files that a later patch will also\n            // touch. This prevents marker cascade into the next patch's OURS\n            // while preserving markers on files only this patch touches (needed\n            // by the resolve workflow for user resolution). Only fires in\n            // replay mode — resolve mode keeps markers on disk so the customer\n            // can see and edit them.\n            if (applyMode !== \"resolve\" && result.status === \"conflict\" && result.fileResults) {\n                // Later patches list original (pre-rename) paths in their files array.\n                const laterFiles = new Set<string>();\n                for (let j = i + 1; j < patches.length; j++) {\n                    for (const f of patches[j]!.files) {\n                        laterFiles.add(f);\n                    }\n                }\n\n                // Build reverse rename map: resolved path → original path.\n                // fileResult.file is the resolved path, but laterFiles has originals.\n                const resolvedToOriginal = new Map<string, string>();\n                if (result.resolvedFiles) {\n                    for (const [orig, resolved] of Object.entries(result.resolvedFiles)) {\n                        resolvedToOriginal.set(resolved, orig);\n                    }\n                }\n\n                for (const fileResult of result.fileResults) {\n                    if (fileResult.status !== \"conflict\") continue;\n                    // Check both resolved and original paths against later patches\n                    const originalPath = resolvedToOriginal.get(fileResult.file) ?? fileResult.file;\n                    if (laterFiles.has(fileResult.file) || laterFiles.has(originalPath)) {\n                        const filePath = join(this.outputDir, fileResult.file);\n                        try {\n                            const content = await readFile(filePath, \"utf-8\");\n                            const stripped = stripConflictMarkers(content);\n                            await writeFile(filePath, stripped);\n                        } catch {\n                            // File doesn't exist or can't be read — skip\n                        }\n                    }\n                }\n            }\n        }\n\n        return results;\n    }\n\n    /**\n     * Populate accumulator after git apply succeeds, AND collect per-file\n     * results including any \"dropped context lines\" — lines that were\n     * present in BASE and THEIRS (unchanged context) but absent from the\n     * final on-disk state because OURS deleted them. This is the fast-path\n     * counterpart to ThreeWayMerge.computeDroppedContextLines used by the\n     * 3-way slow path; both must surface the same warning.\n     */\n    private async populateAccumulatorForPatch(\n        patch: StoredPatch,\n        baseGen: GenerationRecord | undefined,\n        currentTreeHash: string\n    ): Promise<FileResult[]> {\n        const fileResults: FileResult[] = [];\n        if (!baseGen) return fileResults;\n\n        // Create temp git repo to apply patches to base content\n        const tempDir = await mkdtemp(join(tmpdir(), \"replay-acc-\"));\n        const { GitClient } = await import(\"./git/GitClient.js\");\n        const tempGit = new GitClient(tempDir);\n        await tempGit.exec([\"init\"]);\n        await tempGit.exec([\"config\", \"user.email\", \"replay@fern.com\"]);\n        await tempGit.exec([\"config\", \"user.name\", \"Fern Replay\"]);\n\n        try {\n            for (const filePath of patch.files) {\n                if (isBinaryFile(filePath)) continue;\n\n                const resolvedPath = await this.resolveFilePath(filePath, baseGen.tree_hash, currentTreeHash);\n\n                const base = await this.git.showFile(baseGen.tree_hash, filePath);\n\n                // For non-shared-file patches, the stored snapshot IS this\n                // patch's THEIRS for the accumulator (individual contribution\n                // by definition: only this patch touches the file). Skip\n                // reconstruction. For shared-file patches, fall back to\n                // line-anchored reconstruction so the accumulator entry is\n                // each patch's INDIVIDUAL contribution (cross-patch isolation).\n                // See `mergeFile` for the full rationale.\n                const snapshotForFile =\n                    patch.theirs_snapshot?.[resolvedPath] ?? patch.theirs_snapshot?.[filePath];\n                const fileIsShared =\n                    this.accumulator.isShared(resolvedPath) || this.accumulator.isShared(filePath);\n                const theirs = !fileIsShared && snapshotForFile != null\n                    ? snapshotForFile\n                    : await this.applyPatchToContent(base, patch.patch_content, filePath, tempGit, tempDir);\n\n                // For user-created files (base=null), applyPatchToContent may return null\n                // for modification diffs. Fall back to reading the on-disk content that\n                // git apply --3way just wrote successfully.\n                const finalOnDisk = await readFile(join(this.outputDir, resolvedPath), \"utf-8\").catch(() => null);\n                const effectiveTheirs = theirs ?? finalOnDisk;\n                if (effectiveTheirs != null) {\n                    this.accumulator.recordMerge(resolvedPath, effectiveTheirs, patch.base_generation);\n                }\n\n                // Detect lines that were in BOTH base and theirs but absent\n                // from the final on-disk state — silently dropped by OURS.\n                if (base != null && effectiveTheirs != null && finalOnDisk != null) {\n                    const dropped = computeDroppedContextLinesForFile(base, effectiveTheirs, finalOnDisk);\n                    if (dropped.length > 0) {\n                        fileResults.push({\n                            file: resolvedPath,\n                            status: \"merged\",\n                            droppedContextLines: dropped\n                        });\n                    }\n                }\n            }\n        } finally {\n            await rm(tempDir, { recursive: true }).catch(() => {});\n        }\n        return fileResults;\n    }\n\n    private async applyPatchWithFallback(patch: StoredPatch): Promise<ReplayResult> {\n        // Resolve all file paths to check accumulator (need baseGen for resolution)\n        const baseGen = await this.resolveBaseGeneration(patch.base_generation);\n        const lock = this.lockManager.read();\n        const currentGen = lock.generations.find((g) => g.commit_sha === lock.current_generation);\n        const currentTreeHash = currentGen?.tree_hash ?? baseGen?.tree_hash ?? \"\";\n\n        // Check if any file in this patch needs accumulation\n        // If so, skip fast path to ensure we benefit from pre-merge logic\n        const needsAccumulation = await Promise.all(\n            patch.files.map(async (f) => {\n                if (!baseGen) return false;\n                const resolved = await this.resolveFilePath(f, baseGen.tree_hash, currentTreeHash);\n                return this.accumulator.has(resolved);\n            })\n        ).then((results) => results.some(Boolean));\n\n        // Pre-compute resolved paths. If the tree-level rename/copy detection says\n        // a file moved but the patch content itself doesn't describe the rename,\n        // this is a GENERATOR rename and the git-apply fast path is unsafe: it would\n        // apply the content diff against the original path (even if still on disk)\n        // rather than the resolved new path. The 3-way merge path uses `resolvedPath`\n        // for OURS and for the output write, so it handles this correctly.\n        //\n        // USER renames (patch contains `rename from`/`rename to` headers) go through\n        // the fast path because git apply handles those natively — skipping the fast\n        // path there would break user-rename scenarios.\n        const resolvedFiles: Record<string, string> = {};\n        for (const filePath of patch.files) {\n            const resolvedPath = baseGen\n                ? await this.resolveFilePath(filePath, baseGen.tree_hash, currentTreeHash)\n                : filePath;\n            if (resolvedPath !== filePath) {\n                resolvedFiles[filePath] = resolvedPath;\n            }\n        }\n        const patchIsRenameAware = /^rename from /m.test(patch.patch_content);\n        const hasGeneratorRename = Object.keys(resolvedFiles).length > 0 && !patchIsRenameAware;\n\n        // Strategy 1: Try git apply --3way (skip if accumulation needed or a generator rename was detected)\n        if (!needsAccumulation && !hasGeneratorRename) {\n            // Snapshot files before git apply (may leave conflict markers on failure)\n            const snapshots = new Map<string, string | null>();\n            for (const filePath of patch.files) {\n                const fullPath = join(this.outputDir, filePath);\n                snapshots.set(filePath, await readFile(fullPath, \"utf-8\").catch(() => null));\n            }\n\n            try {\n                await this.git.execWithInput([\"apply\", \"--3way\"], patch.patch_content);\n\n                // Success! Populate accumulator so subsequent patches on these files\n                // will skip fast path and use the pre-merge logic instead.\n                // Also collect per-file results (notably droppedContextLines).\n                const fastPathFileResults = await this.populateAccumulatorForPatch(patch, baseGen, currentTreeHash);\n\n                return {\n                    patch,\n                    status: \"applied\",\n                    method: \"git-am\",\n                    ...(fastPathFileResults.length > 0 && { fileResults: fastPathFileResults }),\n                    ...(Object.keys(resolvedFiles).length > 0 && { resolvedFiles })\n                };\n            } catch {\n                // git apply --3way failed and may have left conflict markers on disk\n                // Restore files from snapshot to undo any corruption before fallback\n                for (const [filePath, content] of snapshots) {\n                    const fullPath = join(this.outputDir, filePath);\n                    if (content != null) {\n                        await writeFile(fullPath, content);\n                    } else {\n                        // Delete files created by the failed git apply that didn't exist before\n                        await unlink(fullPath).catch(() => {});\n                    }\n                }\n            }\n        }\n\n        // Strategy 2: Fall back to file-by-file 3-way merge (uses accumulator)\n        return this.applyWithThreeWayMerge(patch);\n    }\n\n    private async applyWithThreeWayMerge(patch: StoredPatch): Promise<ReplayResult> {\n        const fileResults: FileResult[] = [];\n        const resolvedFiles: Record<string, string> = {};\n\n        const tempDir = await mkdtemp(join(tmpdir(), \"replay-\"));\n        const { GitClient } = await import(\"./git/GitClient.js\");\n        const tempGit = new GitClient(tempDir);\n        await tempGit.exec([\"init\"]);\n        await tempGit.exec([\"config\", \"user.email\", \"replay@fern.com\"]);\n        await tempGit.exec([\"config\", \"user.name\", \"Fern Replay\"]);\n\n        try {\n            for (const filePath of patch.files) {\n                if (isBinaryFile(filePath)) {\n                    fileResults.push({\n                        file: filePath,\n                        status: \"skipped\",\n                        reason: \"binary-file\"\n                    });\n                    continue;\n                }\n                const result = await this.mergeFile(patch, filePath, tempGit, tempDir);\n                if (result.file !== filePath) {\n                    resolvedFiles[filePath] = result.file;\n                }\n                fileResults.push(result);\n            }\n        } finally {\n            await rm(tempDir, { recursive: true }).catch(() => {});\n        }\n\n        const conflictFiles = fileResults.filter((r) => r.status === \"conflict\");\n        const hasConflicts = conflictFiles.length > 0;\n\n        // Aggregate conflict reason from file-level to patch-level\n        const conflictReason: ConflictReason | undefined = hasConflicts\n            ? conflictFiles.some((f) => f.conflictReason === \"base-generation-mismatch\")\n                ? \"base-generation-mismatch\"\n                : conflictFiles[0]?.conflictReason\n            : undefined;\n\n        return {\n            patch,\n            status: hasConflicts ? \"conflict\" : \"applied\",\n            method: \"3way-merge\",\n            fileResults,\n            conflictReason,\n            ...(Object.keys(resolvedFiles).length > 0 && { resolvedFiles })\n        };\n    }\n\n    private async mergeFile(\n        patch: StoredPatch,\n        filePath: string,\n        tempGit: GitClient,\n        tempDir: string\n    ): Promise<FileResult> {\n        try {\n            const inputs = await resolveInputs({\n                patch,\n                filePath,\n                git: this.git,\n                lockManager: this.lockManager,\n                outputDir: this.outputDir,\n                isTreeReachable: (h) => this.isTreeReachable(h),\n                resolveBaseGeneration: (s) => this.resolveBaseGeneration(s),\n                resolveFilePath: (f, b, c) => this.resolveFilePath(f, b, c),\n                extractRenameSource: (p, f) => this.extractRenameSource(p, f),\n                extractFileDiff: (p, f) => this.extractFileDiff(p, f),\n            });\n            if (inputs.earlyExit) {\n                return { file: filePath, ...inputs.earlyExit };\n            }\n            const plan = await buildMergePlan({\n                inputs,\n                patch,\n                filePath,\n                accumulator: this.accumulator,\n                tempGit,\n                tempDir,\n                applyPatchToContent: (b, p, f, g, d, s) =>\n                    this.applyPatchToContent(b, p, f, g, d, s),\n                isPatchAlreadyApplied: (p, f, c, g, d) =>\n                    this.isPatchAlreadyApplied(p, f, c, g, d),\n            });\n            return await runMergeAndRecord({\n                plan,\n                inputs,\n                patch,\n                accumulator: this.accumulator,\n            });\n        } catch (error) {\n            return {\n                file: filePath,\n                status: \"skipped\",\n                reason: `error: ${error instanceof Error ? error.message : String(error)}`\n            };\n        }\n    }\n\n    private async isTreeReachable(treeHash: string): Promise<boolean> {\n        let result = this.treeExistsCache.get(treeHash);\n        if (result === undefined) {\n            result = await this.git.treeExists(treeHash);\n            this.treeExistsCache.set(treeHash, result);\n        }\n        return result;\n    }\n\n    private isExcluded(patch: StoredPatch): boolean {\n        const config = this.lockManager.getCustomizationsConfig();\n        if (!config.exclude) return false;\n\n        return patch.files.some((file) => config.exclude!.some((pattern) => minimatch(file, pattern)));\n    }\n\n    private async resolveFilePath(filePath: string, baseTreeHash: string, currentTreeHash: string): Promise<string> {\n        // Priority 1: Manual moves from replay.yml\n        const config = this.lockManager.getCustomizationsConfig();\n        if (config.moves) {\n            for (const move of config.moves) {\n                if (minimatch(filePath, move.from) || filePath === move.from) {\n                    // For exact matches, replace directly\n                    if (filePath === move.from) {\n                        return move.to;\n                    }\n                    // For glob matches, replace the matching prefix\n                    // e.g., from: \"src/api/**\" to: \"src/resources/**\"\n                    // filePath: \"src/api/client.ts\" → \"src/resources/client.ts\"\n                    const fromBase = move.from.replace(/\\*\\*.*$/, \"\");\n                    const toBase = move.to.replace(/\\*\\*.*$/, \"\");\n                    if (filePath.startsWith(fromBase)) {\n                        return toBase + filePath.slice(fromBase.length);\n                    }\n                }\n            }\n        }\n\n        // Priority 2: Git rename detection (cached per tree pair)\n        const cacheKey = `${baseTreeHash}:${currentTreeHash}`;\n        let renames = this.renameCache.get(cacheKey);\n        if (!renames) {\n            renames = await this.git.detectRenames(baseTreeHash, currentTreeHash);\n            this.renameCache.set(cacheKey, renames);\n        }\n\n        const gitRename = renames.find((r) => r.from === filePath);\n        if (gitRename) {\n            return gitRename.to;\n        }\n\n        // Priority 3: No rename detected\n        return filePath;\n    }\n\n    private async applyPatchToContent(\n        base: string | null,\n        patchContent: string,\n        filePath: string,\n        tempGit: GitClient,\n        tempDir: string,\n        sourceFilePath?: string\n    ): Promise<string | null> {\n        if (!base) {\n            // New file - extract content directly from patch\n            return this.extractNewFileFromPatch(patchContent, filePath);\n        }\n\n        // Extract only the diff for this specific file\n        const fileDiff = this.extractFileDiff(patchContent, filePath);\n        if (!fileDiff) return null;\n\n        try {\n            if (sourceFilePath) {\n                // Rename case: write base at the OLD path, apply the rename diff,\n                // then read from the NEW path (filePath).\n                const tempSourcePath = join(tempDir, sourceFilePath);\n                await mkdir(dirname(tempSourcePath), { recursive: true });\n                await writeFile(tempSourcePath, base);\n\n                await tempGit.exec([\"add\", sourceFilePath]);\n                await tempGit.exec([\n                    \"commit\",\n                    \"-m\",\n                    `base for rename ${sourceFilePath} -> ${filePath}`,\n                    \"--allow-empty\"\n                ]);\n\n                await tempGit.execWithInput([\"apply\", \"--allow-empty\"], fileDiff);\n\n                const tempTargetPath = join(tempDir, filePath);\n                return await readFile(tempTargetPath, \"utf-8\");\n            }\n\n            // Normal case: write base at filePath, apply diff, read back\n            const tempFilePath = join(tempDir, filePath);\n            await mkdir(dirname(tempFilePath), { recursive: true });\n            await writeFile(tempFilePath, base);\n\n            // Stage and commit so git apply has a clean base\n            await tempGit.exec([\"add\", filePath]);\n            await tempGit.exec([\"commit\", \"-m\", `base for ${filePath}`, \"--allow-empty\"]);\n\n            // Apply this file's diff\n            await tempGit.execWithInput([\"apply\", \"--allow-empty\"], fileDiff);\n\n            return await readFile(tempFilePath, \"utf-8\");\n        } catch {\n            return null;\n        }\n    }\n\n    /**\n     * Detects whether a patch's additions are already present in `content`.\n     * Uses `git apply --reverse --check` — if the reverse patch applies cleanly,\n     * the forward patch is effectively a no-op (its +lines are already there and\n     * its -lines are already gone). Used to distinguish \"patch already applied\"\n     * from \"patch base mismatch\" after a forward-apply fails.\n     */\n    private async isPatchAlreadyApplied(\n        patchContent: string,\n        filePath: string,\n        content: string,\n        tempGit: GitClient,\n        tempDir: string\n    ): Promise<boolean> {\n        const fileDiff = this.extractFileDiff(patchContent, filePath);\n        if (!fileDiff) return false;\n        try {\n            const tempFilePath = join(tempDir, filePath);\n            await mkdir(dirname(tempFilePath), { recursive: true });\n            await writeFile(tempFilePath, content);\n            await tempGit.exec([\"add\", filePath]);\n            await tempGit.exec([\"commit\", \"-m\", `check already-applied ${filePath}`, \"--allow-empty\"]);\n            await tempGit.execWithInput([\"apply\", \"--reverse\", \"--check\", \"--allow-empty\"], fileDiff);\n            return true;\n        } catch {\n            return false;\n        }\n    }\n\n    private extractFileDiff(patchContent: string, filePath: string): string | null {\n        const lines = patchContent.split(\"\\n\");\n        const diffLines: string[] = [];\n        let inTargetFile = false;\n\n        for (const line of lines) {\n            if (line.startsWith(\"diff --git\")) {\n                if (inTargetFile) {\n                    // Hit the next file's diff, stop collecting\n                    break;\n                }\n                if (isDiffLineForFile(line, filePath)) {\n                    inTargetFile = true;\n                    diffLines.push(line);\n                }\n                continue;\n            }\n\n            if (inTargetFile) {\n                diffLines.push(line);\n            }\n        }\n\n        return diffLines.length > 0 ? diffLines.join(\"\\n\") + \"\\n\" : null;\n    }\n\n    private extractRenameSource(patchContent: string, targetFilePath: string): string | null {\n        const lines = patchContent.split(\"\\n\");\n        let inTargetFile = false;\n\n        for (const line of lines) {\n            if (line.startsWith(\"diff --git\")) {\n                if (inTargetFile) break; // past the target block\n                inTargetFile = isDiffLineForFile(line, targetFilePath);\n                continue;\n            }\n            if (!inTargetFile) continue;\n\n            // Stop at first hunk — rename headers appear before @@\n            if (line.startsWith(\"@@\")) break;\n\n            if (line.startsWith(\"rename from \")) {\n                return line.slice(\"rename from \".length);\n            }\n        }\n\n        return null;\n    }\n\n    private extractNewFileFromPatch(patchContent: string, filePath: string): string | null {\n        const lines = patchContent.split(\"\\n\");\n        const addedLines: string[] = [];\n        let inTargetFile = false;\n        let inHunk = false;\n        let isNewFile = false;\n        let noTrailingNewline = false;\n\n        for (const line of lines) {\n            if (line.startsWith(\"diff --git\")) {\n                if (inTargetFile) break; // hit next file's diff\n                inTargetFile = isDiffLineForFile(line, filePath);\n                inHunk = false;\n                isNewFile = false;\n                continue;\n            }\n            if (!inTargetFile) continue;\n\n            if (!inHunk) {\n                if (line === \"--- /dev/null\" || line.startsWith(\"new file mode\")) {\n                    isNewFile = true;\n                }\n            }\n\n            if (line.startsWith(\"@@\")) {\n                if (!isNewFile) return null; // modification diff, not a new-file creation\n                inHunk = true;\n                continue;\n            }\n            if (!inHunk) continue;\n\n            if (line === \"\\\\ No newline at end of file\") {\n                noTrailingNewline = true;\n                continue;\n            }\n\n            if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n                addedLines.push(line.slice(1));\n            }\n        }\n\n        if (addedLines.length === 0) return null;\n        return addedLines.join(\"\\n\") + (noTrailingNewline ? \"\" : \"\\n\");\n    }\n}\n\n/**\n * Lines present in BOTH base and theirs (unchanged context in customer's\n * THEIRS) but absent from finalContent. Mirrors the slow-path detection in\n * ThreeWayMerge.computeDroppedContextLines so the warning surfaces\n * regardless of whether `git apply --3way` (fast path) or per-file diff3\n * (slow path) produced finalContent. Order preserved per first occurrence\n * in `base`. Multi-occurrence lines are reported as dropped when their\n * multiplicity decreased.\n */\nfunction computeDroppedContextLinesForFile(\n    base: string,\n    theirs: string,\n    finalContent: string\n): string[] {\n    const baseLines = base.split(\"\\n\");\n    const theirsLines = theirs.split(\"\\n\");\n    const finalLines = finalContent.split(\"\\n\");\n\n    const baseCounts = new Map<string, number>();\n    const theirsCounts = new Map<string, number>();\n    const finalCounts = new Map<string, number>();\n\n    for (const l of baseLines) baseCounts.set(l, (baseCounts.get(l) ?? 0) + 1);\n    for (const l of theirsLines) theirsCounts.set(l, (theirsCounts.get(l) ?? 0) + 1);\n    for (const l of finalLines) finalCounts.set(l, (finalCounts.get(l) ?? 0) + 1);\n\n    const dropped: string[] = [];\n    const seen = new Set<string>();\n    for (const line of baseLines) {\n        if (seen.has(line)) continue;\n        const inBase = baseCounts.get(line) ?? 0;\n        const inTheirs = theirsCounts.get(line) ?? 0;\n        const inFinal = finalCounts.get(line) ?? 0;\n        if (inBase > 0 && inTheirs > 0 && inFinal < Math.min(inBase, inTheirs)) {\n            dropped.push(line);\n            seen.add(line);\n        }\n    }\n    return dropped;\n}\n\n/**\n * Check if a `diff --git` line targets the given file path.\n * Uses a regex anchored to the line format to avoid substring false positives\n * (e.g., `lib/foo.ts` matching `b/lib/foo.ts-backup`).\n */\nfunction isDiffLineForFile(diffLine: string, filePath: string): boolean {\n    const match = diffLine.match(/^diff --git a\\/.+ b\\/(.+)$/);\n    return match !== null && match[1] === filePath;\n}\n","import type { StoredPatch } from \"../types.js\";\n\nexport interface AccumulatorEntry {\n    readonly content: string;\n    readonly baseGeneration: string;\n}\n\n/**\n * Inter-patch THEIRS coordination across `applyPatches()`.\n *\n * When two patches modify the same file, the second patch's 3-way merge has\n * to know about the first patch's edits — otherwise it overwrites them. The\n * accumulator threads each patch's computed THEIRS by resolved file path so\n * subsequent patches can use it as a merge base / pre-merge.\n *\n * # API\n *\n * - `isShared(path)` — is this file touched by 2+ patches in this run?\n * - `has(path)` / `lookup(path)` — has any prior patch already stored a\n *   result for this path? Returns the stored entry.\n * - `shouldSkipFastPath(patch)` — true if any of the patch's files have\n *   prior accumulator entries; the fast path (`git apply --3way`) cannot\n *   see accumulator state, so we route through the slow path.\n * - `recordMerge(path, content, baseGen)` — store a successful merge result.\n *   Always populates.\n * - `recordConflict(path, content, baseGen)` — store a conflicted merge\n *   result. Populates only in `\"resolve\"` mode (replay mode keeps the\n *   accumulator free of marker-laden content).\n * - `snapshot()` — defensive copy for test introspection (invariant I2).\n *\n * # Mode semantics (`recordConflict`)\n *\n * Replay mode strips conflict markers off-disk after the apply loop and\n * commits clean files; the accumulator must NOT carry marker-laden content\n * forward to subsequent patches. In resolve mode the customer is going to\n * see and edit markers, so storing them lets a later patch use the\n * conflicted file as a structurally-correct merge base.\n *\n * # Lifecycle\n *\n * One accumulator instance per `applyPatches()` invocation. Constructed\n * with the run's apply mode and the precomputed set of shared files. The\n * instance is single-use — tests that want to inspect post-run state call\n * `snapshot()`, then the next `applyPatches()` constructs a fresh one.\n */\nexport class MergeAccumulator {\n    private readonly entries = new Map<string, AccumulatorEntry>();\n\n    constructor(\n        private readonly mode: \"replay\" | \"resolve\",\n        private readonly sharedFiles: ReadonlySet<string>,\n    ) {}\n\n    /** Was this file touched by 2+ patches in the current `applyPatches` invocation? */\n    isShared(path: string): boolean {\n        return this.sharedFiles.has(path);\n    }\n\n    /** Has any prior patch already recorded a result for this path? */\n    has(path: string): boolean {\n        return this.entries.has(path);\n    }\n\n    /** Look up the accumulated content + base generation for this path. */\n    lookup(path: string): AccumulatorEntry | undefined {\n        return this.entries.get(path);\n    }\n\n    /**\n     * True if any of the patch's files have a prior accumulator entry — in\n     * which case the fast path (`git apply --3way`) cannot honor prior\n     * patches' contributions and we must route through the slow path.\n     */\n    shouldSkipFastPath(patch: StoredPatch): boolean {\n        return patch.files.some((f) => this.entries.has(f));\n    }\n\n    /** Record a successful (clean) merge result. */\n    recordMerge(path: string, content: string, baseGeneration: string): void {\n        this.entries.set(path, { content, baseGeneration });\n    }\n\n    /**\n     * Record a conflicted merge result. Populates only in `\"resolve\"` mode\n     * — replay mode keeps the accumulator clean of marker-laden content\n     * since markers will be stripped from disk after the apply loop.\n     */\n    recordConflict(path: string, content: string, baseGeneration: string): void {\n        if (this.mode === \"resolve\") {\n            this.entries.set(path, { content, baseGeneration });\n        }\n    }\n\n    /**\n     * Defensive copy for test introspection. Used by invariant I2 to assert\n     * that after every applied patch, the accumulator has an entry for each\n     * file the patch touched (see `__tests__/invariants/i2-accumulator-correctness.ts`).\n     *\n     * @internal\n     */\n    snapshot(): ReadonlyMap<string, AccumulatorEntry> {\n        const copy = new Map<string, AccumulatorEntry>();\n        for (const [path, entry] of this.entries) {\n            copy.set(path, { content: entry.content, baseGeneration: entry.baseGeneration });\n        }\n        return copy;\n    }\n}\n","// resolveInputs.ts — Phase 1 of the mergeFile pipeline (FER-10394).\n//\n// Owns: base-generation lookup, file-path resolution (rename detection),\n// metadata construction, BASE/OURS content fetches (with rename-source\n// fallback), and ghost-commit hybrid reconstruction when the base tree is\n// unreachable.\n//\n// Behavioral equivalence claim: for every input combination, the returned\n// `ResolvedInputs` (or `earlyExit`) carries the same values as the\n// pre-refactor `mergeFile` had at line 442 (just before the snapshot\n// decision block).\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { GitClient } from \"../git/GitClient.js\";\nimport type { LockfileManager } from \"../LockfileManager.js\";\nimport type { ConflictMetadata, GenerationRecord, StoredPatch } from \"../types.js\";\nimport type { ResolvedInputs } from \"./MergePlan.js\";\n\nexport interface ResolveInputsArgs {\n    patch: StoredPatch;\n    filePath: string;\n    git: GitClient;\n    lockManager: LockfileManager;\n    outputDir: string;\n    isTreeReachable: (treeHash: string) => Promise<boolean>;\n    resolveBaseGeneration: (sha: string) => Promise<GenerationRecord | undefined>;\n    resolveFilePath: (filePath: string, baseTree: string, currentTree: string) => Promise<string>;\n    extractRenameSource: (patchContent: string, filePath: string) => string | null;\n    extractFileDiff: (patchContent: string, filePath: string) => string | null;\n}\n\nexport async function resolveInputs(args: ResolveInputsArgs): Promise<ResolvedInputs> {\n    const {\n        patch,\n        filePath,\n        git,\n        lockManager,\n        outputDir,\n        isTreeReachable,\n        resolveBaseGeneration,\n        resolveFilePath,\n        extractRenameSource,\n        extractFileDiff,\n    } = args;\n\n    const baseGen = await resolveBaseGeneration(patch.base_generation);\n    if (!baseGen) {\n        return {\n            resolvedPath: filePath,\n            metadata: {\n                patchId: patch.id,\n                patchMessage: patch.original_message,\n                baseGeneration: patch.base_generation,\n                currentGeneration: lockManager.read().current_generation,\n            },\n            base: null,\n            ours: null,\n            oursPath: join(outputDir, filePath),\n            renameSourcePath: undefined,\n            ghostTheirs: null,\n            earlyExit: { status: \"skipped\", reason: \"base-generation-not-found\" },\n        };\n    }\n\n    const lock = lockManager.read();\n    const currentGen = lock.generations.find((g) => g.commit_sha === lock.current_generation);\n    const currentTreeHash = currentGen?.tree_hash ?? baseGen.tree_hash;\n    const resolvedPath = await resolveFilePath(filePath, baseGen.tree_hash, currentTreeHash);\n\n    const metadata: ConflictMetadata = {\n        patchId: patch.id,\n        patchMessage: patch.original_message,\n        baseGeneration: patch.base_generation,\n        currentGeneration: lock.current_generation,\n    };\n\n    let base = await git.showFile(baseGen.tree_hash, filePath);\n\n    let renameSourcePath: string | undefined;\n    if (!base) {\n        const renameSource = extractRenameSource(patch.patch_content, filePath);\n        if (renameSource) {\n            base = await git.showFile(baseGen.tree_hash, renameSource);\n            renameSourcePath = renameSource;\n        }\n    }\n\n    const oursPath = join(outputDir, resolvedPath);\n    const ours = await readFile(oursPath, \"utf-8\").catch(() => null);\n\n    let ghostTheirs: string | null = null;\n\n    // Silent-loss signal (INC-866): when BASE can't be read because the\n    // base-generation tree is outside the clone window, record it so Phase 2/3\n    // can warn rather than silently misclassifying an edited-existing-file\n    // patch as `new-file-both` and dropping the customer's edit. We probe\n    // reachability whenever BASE is null and we didn't recover it via a rename\n    // source (a reachable rename source means the tree WAS reachable).\n    let baseTreeUnreachable = false;\n\n    // Ghost-commit reconstruction: when the base tree is unreachable (GC'd\n    // after squash merge, shallow clone), reconstruct hybrid BASE and THEIRS\n    // from the unified diff's context/removed/added lines matched against OURS.\n    if (!base && !renameSourcePath) {\n        const treeReachable = await isTreeReachable(baseGen.tree_hash);\n        if (!treeReachable) {\n            baseTreeUnreachable = true;\n            if (ours) {\n                const fileDiff = extractFileDiff(patch.patch_content, filePath);\n                if (fileDiff) {\n                    const { reconstructFromGhostPatch } = await import(\"../HybridReconstruction.js\");\n                    const result = reconstructFromGhostPatch(fileDiff, ours);\n                    if (result) {\n                        base = result.base;\n                        ghostTheirs = result.theirs;\n                    }\n                }\n            }\n        }\n    }\n\n    return {\n        resolvedPath,\n        metadata,\n        base,\n        ours,\n        oursPath,\n        renameSourcePath,\n        ghostTheirs,\n        // Only meaningful when ghost reconstruction did NOT recover a base; if it\n        // did, `base` is non-null and the merge proceeds normally. We still set\n        // the flag truthfully (the tree IS unreachable) so Phase 3 can decide.\n        baseTreeUnreachable,\n    };\n}\n","/**\n * Strip conflict markers from file content, keeping the OURS (Generated) side.\n *\n * Two-pass parser that only recognizes replay-specific markers:\n *   Opener:    \"<<<<<<< Generated\"\n *   Separator: \"=======\"\n *   Closer:    \">>>>>>> Your customization\"\n *\n * Pass 1: Scan for complete valid triplets (opener + separator + closer).\n *         Nested openers abandon the current triplet.\n * Pass 2: Build output keeping OURS lines, skipping THEIRS and marker lines.\n */\n\nconst CONFLICT_OPENER = \"<<<<<<< Generated\";\nconst CONFLICT_SEPARATOR = \"=======\";\nconst CONFLICT_CLOSER = \">>>>>>> Your customization\";\n\ninterface ConflictRange {\n    start: number;\n    separator: number;\n    end: number;\n}\n\nfunction trimCR(line: string): string {\n    return line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n}\n\nfunction findConflictRanges(lines: string[]): ConflictRange[] {\n    const ranges: ConflictRange[] = [];\n    let i = 0;\n    while (i < lines.length) {\n        if (trimCR(lines[i]) === CONFLICT_OPENER) {\n            let separatorIdx = -1;\n            let j = i + 1;\n            let found = false;\n            while (j < lines.length) {\n                const trimmed = trimCR(lines[j]);\n                if (trimmed === CONFLICT_OPENER) {\n                    break; // nested opener, abandon current triplet\n                }\n                if (separatorIdx === -1 && trimmed === CONFLICT_SEPARATOR) {\n                    separatorIdx = j;\n                } else if (separatorIdx !== -1 && trimmed === CONFLICT_CLOSER) {\n                    ranges.push({ start: i, separator: separatorIdx, end: j });\n                    i = j;\n                    found = true;\n                    break;\n                }\n                j++;\n            }\n            if (!found) {\n                i++;\n                continue;\n            }\n        }\n        i++;\n    }\n    return ranges;\n}\n\nexport function stripConflictMarkers(content: string): string {\n    const lines = content.split(/\\r?\\n/);\n    const ranges = findConflictRanges(lines);\n\n    if (ranges.length === 0) {\n        return content;\n    }\n\n    const result: string[] = [];\n    let rangeIdx = 0;\n\n    for (let i = 0; i < lines.length; i++) {\n        if (rangeIdx < ranges.length) {\n            const range = ranges[rangeIdx];\n            if (i === range.start) {\n                continue;\n            }\n            if (i > range.start && i < range.separator) {\n                result.push(lines[i]);\n                continue;\n            }\n            if (i === range.separator) {\n                continue;\n            }\n            if (i > range.separator && i < range.end) {\n                continue;\n            }\n            if (i === range.end) {\n                rangeIdx++;\n                continue;\n            }\n        }\n        result.push(lines[i]);\n    }\n\n    return result.join(\"\\n\");\n}\n\nexport function hasConflictMarkers(content: string): boolean {\n    const lines = content.split(/\\r?\\n/);\n    return findConflictRanges(lines).length > 0;\n}\n\n/**\n * Loose substring check: returns true if the content contains either the\n * opener or closer marker text (without verifying a complete triplet).\n *\n * Differs from `hasConflictMarkers` (which performs structural parsing of\n * complete opener+separator+closer triplets). Used at sites where the\n * presence of a marker substring — even a partial or mid-block one — is\n * a signal that something polluted the content (e.g., reconstruction\n * produced a marker-laden result, accumulator state crossed runs, etc.).\n *\n * Accepts `null` / `undefined` for ergonomic use at sites where the\n * content variable may not be set yet.\n */\nexport function hasConflictMarkerStrings(content: string | null | undefined): boolean {\n    if (content == null) return false;\n    return content.includes(CONFLICT_OPENER) || content.includes(CONFLICT_CLOSER);\n}\n","export {\n  LCS,\n  diffComm,\n  diffIndices,\n  diffPatch,\n  diff3MergeRegions,\n  diff3Merge,\n  mergeDiff3,\n  merge,\n  mergeDigIn,\n  patch,\n  stripPatch,\n  invertPatch\n};\n\n\n// Text diff algorithm following Hunt and McIlroy 1976.\n// J. W. Hunt and M. D. McIlroy, An algorithm for differential buffer\n// comparison, Bell Telephone Laboratories CSTR #41 (1976)\n// http://www.cs.dartmouth.edu/~doug/\n// https://en.wikipedia.org/wiki/Longest_common_subsequence_problem\n//\n// Expects two arrays, finds longest common sequence\nfunction LCS(buffer1, buffer2) {\n  let equivalenceClasses = {};\n  for (let j = 0; j < buffer2.length; j++) {\n    const item = buffer2[j];\n    if (equivalenceClasses[item]) {\n      equivalenceClasses[item].push(j);\n    } else {\n      equivalenceClasses[item] = [j];\n    }\n  }\n\n  const NULLRESULT = { buffer1index: -1, buffer2index: -1, chain: null };\n  let candidates = [NULLRESULT];\n\n  for (let i = 0; i < buffer1.length; i++) {\n    const item = buffer1[i];\n    const buffer2indices = equivalenceClasses[item] || [];\n    let r = 0;\n    let c = candidates[0];\n\n    for (let jx = 0; jx < buffer2indices.length; jx++) {\n      const j = buffer2indices[jx];\n\n      let s;\n      for (s = r; s < candidates.length; s++) {\n        if ((candidates[s].buffer2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].buffer2index > j))) {\n          break;\n        }\n      }\n\n      if (s < candidates.length) {\n        const newCandidate = { buffer1index: i, buffer2index: j, chain: candidates[s] };\n        if (r === candidates.length) {\n          candidates.push(c);\n        } else {\n          candidates[r] = c;\n        }\n        r = s + 1;\n        c = newCandidate;\n        if (r === candidates.length) {\n          break; // no point in examining further (j)s\n        }\n      }\n    }\n\n    candidates[r] = c;\n  }\n\n  // At this point, we know the LCS: it's in the reverse of the\n  // linked-list through .chain of candidates[candidates.length - 1].\n\n  return candidates[candidates.length - 1];\n}\n\n\n// We apply the LCS to build a 'comm'-style picture of the\n// differences between buffer1 and buffer2.\nfunction diffComm(buffer1, buffer2) {\n  const lcs = LCS(buffer1, buffer2);\n  let result = [];\n  let tail1 = buffer1.length;\n  let tail2 = buffer2.length;\n  let common = {common: []};\n\n  function processCommon() {\n    if (common.common.length) {\n      common.common.reverse();\n      result.push(common);\n      common = {common: []};\n    }\n  }\n\n  for (let candidate = lcs; candidate !== null; candidate = candidate.chain) {\n    let different = {buffer1: [], buffer2: []};\n\n    while (--tail1 > candidate.buffer1index) {\n      different.buffer1.push(buffer1[tail1]);\n    }\n\n    while (--tail2 > candidate.buffer2index) {\n      different.buffer2.push(buffer2[tail2]);\n    }\n\n    if (different.buffer1.length || different.buffer2.length) {\n      processCommon();\n      different.buffer1.reverse();\n      different.buffer2.reverse();\n      result.push(different);\n    }\n\n    if (tail1 >= 0) {\n      common.common.push(buffer1[tail1]);\n    }\n  }\n\n  processCommon();\n\n  result.reverse();\n  return result;\n}\n\n\n// We apply the LCS to give a simple representation of the\n// offsets and lengths of mismatched chunks in the input\n// buffers. This is used by diff3MergeRegions.\nfunction diffIndices(buffer1, buffer2) {\n  const lcs = LCS(buffer1, buffer2);\n  let result = [];\n  let tail1 = buffer1.length;\n  let tail2 = buffer2.length;\n\n  for (let candidate = lcs; candidate !== null; candidate = candidate.chain) {\n    const mismatchLength1 = tail1 - candidate.buffer1index - 1;\n    const mismatchLength2 = tail2 - candidate.buffer2index - 1;\n    tail1 = candidate.buffer1index;\n    tail2 = candidate.buffer2index;\n\n    if (mismatchLength1 || mismatchLength2) {\n      result.push({\n        buffer1: [tail1 + 1, mismatchLength1],\n        buffer1Content: buffer1.slice(tail1 + 1, tail1 + 1 + mismatchLength1),\n        buffer2: [tail2 + 1, mismatchLength2],\n        buffer2Content: buffer2.slice(tail2 + 1, tail2 + 1 + mismatchLength2)\n      });\n    }\n  }\n\n  result.reverse();\n  return result;\n}\n\n\n// We apply the LCS to build a JSON representation of a\n// diff(1)-style patch.\nfunction diffPatch(buffer1, buffer2) {\n  const lcs = LCS(buffer1, buffer2);\n  let result = [];\n  let tail1 = buffer1.length;\n  let tail2 = buffer2.length;\n\n  function chunkDescription(buffer, offset, length) {\n    let chunk = [];\n    for (let i = 0; i < length; i++) {\n      chunk.push(buffer[offset + i]);\n    }\n    return {\n      offset: offset,\n      length: length,\n      chunk: chunk\n    };\n  }\n\n  for (let candidate = lcs; candidate !== null; candidate = candidate.chain) {\n    const mismatchLength1 = tail1 - candidate.buffer1index - 1;\n    const mismatchLength2 = tail2 - candidate.buffer2index - 1;\n    tail1 = candidate.buffer1index;\n    tail2 = candidate.buffer2index;\n\n    if (mismatchLength1 || mismatchLength2) {\n      result.push({\n        buffer1: chunkDescription(buffer1, candidate.buffer1index + 1, mismatchLength1),\n        buffer2: chunkDescription(buffer2, candidate.buffer2index + 1, mismatchLength2)\n      });\n    }\n  }\n\n  result.reverse();\n  return result;\n}\n\n\n// Given three buffers, A, O, and B, where both A and B are\n// independently derived from O, returns a fairly complicated\n// internal representation of merge decisions it's taken. The\n// interested reader may wish to consult\n//\n// Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.\n// 'A Formal Investigation of ' In Arvind and Prasad,\n// editors, Foundations of Software Technology and Theoretical\n// Computer Science (FSTTCS), December 2007.\n//\n// (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)\n//\nfunction diff3MergeRegions(a, o, b) {\n\n  // \"hunks\" are array subsets where `a` or `b` are different from `o`\n  // https://www.gnu.org/software/diffutils/manual/html_node/diff3-Hunks.html\n  let hunks = [];\n  function addHunk(h, ab) {\n    hunks.push({\n      ab: ab,\n      oStart: h.buffer1[0],\n      oLength: h.buffer1[1],   // length of o to remove\n      abStart: h.buffer2[0],\n      abLength: h.buffer2[1]   // length of a/b to insert\n      // abContent: (ab === 'a' ? a : b).slice(h.buffer2[0], h.buffer2[0] + h.buffer2[1])\n    });\n  }\n\n  diffIndices(o, a).forEach(item => addHunk(item, 'a'));\n  diffIndices(o, b).forEach(item => addHunk(item, 'b'));\n  hunks.sort((x,y) => x.oStart - y.oStart);\n\n  let results = [];\n  let currOffset = 0;\n\n  function advanceTo(endOffset) {\n    if (endOffset > currOffset) {\n      results.push({\n        stable: true,\n        buffer: 'o',\n        bufferStart: currOffset,\n        bufferLength: endOffset - currOffset,\n        bufferContent: o.slice(currOffset, endOffset)\n      });\n      currOffset = endOffset;\n    }\n  }\n\n  while (hunks.length) {\n    let hunk = hunks.shift();\n    let regionStart = hunk.oStart;\n    let regionEnd = hunk.oStart + hunk.oLength;\n    let regionHunks = [hunk];\n    advanceTo(regionStart);\n\n    // Try to pull next overlapping hunk into this region\n    while (hunks.length) {\n      const nextHunk = hunks[0];\n      const nextHunkStart = nextHunk.oStart;\n      if (nextHunkStart > regionEnd) break;   // no overlap\n\n      regionEnd = Math.max(regionEnd, nextHunkStart + nextHunk.oLength);\n      regionHunks.push(hunks.shift());\n    }\n\n    if (regionHunks.length === 1) {\n      // Only one hunk touches this region, meaning that there is no conflict here.\n      // Either `a` or `b` is inserting into a region of `o` unchanged by the other.\n      if (hunk.abLength > 0) {\n        const buffer = (hunk.ab === 'a' ? a : b);\n        results.push({\n          stable: true,\n          buffer: hunk.ab,\n          bufferStart: hunk.abStart,\n          bufferLength: hunk.abLength,\n          bufferContent: buffer.slice(hunk.abStart, hunk.abStart + hunk.abLength)\n        });\n      }\n    } else {\n      // A true a/b conflict. Determine the bounds involved from `a`, `o`, and `b`.\n      // Effectively merge all the `a` hunks into one giant hunk, then do the\n      // same for the `b` hunks; then, correct for skew in the regions of `o`\n      // that each side changed, and report appropriate spans for the three sides.\n      let bounds = {\n        a: [a.length, -1, o.length, -1],\n        b: [b.length, -1, o.length, -1]\n      };\n      while (regionHunks.length) {\n        hunk = regionHunks.shift();\n        const oStart = hunk.oStart;\n        const oEnd = oStart + hunk.oLength;\n        const abStart = hunk.abStart;\n        const abEnd = abStart + hunk.abLength;\n        let b = bounds[hunk.ab];\n        b[0] = Math.min(abStart, b[0]);\n        b[1] = Math.max(abEnd, b[1]);\n        b[2] = Math.min(oStart, b[2]);\n        b[3] = Math.max(oEnd, b[3]);\n      }\n\n      const aStart = bounds.a[0] + (regionStart - bounds.a[2]);\n      const aEnd = bounds.a[1] + (regionEnd - bounds.a[3]);\n      const bStart = bounds.b[0] + (regionStart - bounds.b[2]);\n      const bEnd = bounds.b[1] + (regionEnd - bounds.b[3]);\n\n      let result = {\n        stable: false,\n        aStart: aStart,\n        aLength: aEnd - aStart,\n        aContent: a.slice(aStart, aEnd),\n        oStart: regionStart,\n        oLength: regionEnd - regionStart,\n        oContent: o.slice(regionStart, regionEnd),\n        bStart: bStart,\n        bLength: bEnd - bStart,\n        bContent: b.slice(bStart, bEnd)\n      };\n      results.push(result);\n    }\n    currOffset = regionEnd;\n  }\n\n  advanceTo(o.length);\n\n  return results;\n}\n\n\n// Applies the output of diff3MergeRegions to actually\n// construct the merged buffer; the returned result alternates\n// between 'ok' and 'conflict' blocks.\n// A \"false conflict\" is where `a` and `b` both change the same from `o`\nfunction diff3Merge(a, o, b, options) {\n  let defaults = {\n    excludeFalseConflicts: true,\n    stringSeparator: /\\s+/\n  };\n  options = Object.assign(defaults, options);\n\n  if (typeof a === 'string') a = a.split(options.stringSeparator);\n  if (typeof o === 'string') o = o.split(options.stringSeparator);\n  if (typeof b === 'string') b = b.split(options.stringSeparator);\n\n  let results = [];\n  const regions = diff3MergeRegions(a, o, b);\n\n  let okBuffer = [];\n  function flushOk() {\n    if (okBuffer.length) {\n      results.push({ ok: okBuffer });\n    }\n    okBuffer = [];\n  }\n\n  function isFalseConflict(a, b) {\n    if (a.length !== b.length) return false;\n    for (let i = 0; i < a.length; i++) {\n      if (a[i] !== b[i]) return false;\n    }\n    return true;\n  }\n\n  regions.forEach(region =>  {\n    if (region.stable) {\n      okBuffer.push(...region.bufferContent);\n    } else {\n      if (options.excludeFalseConflicts && isFalseConflict(region.aContent, region.bContent)) {\n        okBuffer.push(...region.aContent);\n      } else {\n        flushOk();\n        results.push({\n          conflict: {\n            a: region.aContent,\n            aIndex: region.aStart,\n            o: region.oContent,\n            oIndex: region.oStart,\n            b: region.bContent,\n            bIndex: region.bStart\n          }\n        });\n      }\n    }\n  });\n\n  flushOk();\n  return results;\n}\n\n\nfunction mergeDiff3(a, o, b, options) {\n  const defaults = {\n    excludeFalseConflicts: true,\n    stringSeparator: /\\s+/,\n    label: {}\n  };\n  options = Object.assign(defaults, options);\n\n  const aSection = '<<<<<<<' + (options.label.a ? ` ${options.label.a}` : '');\n  const oSection = '|||||||' + (options.label.o ? ` ${options.label.o}` : '');\n  const xSection = '=======';\n  const bSection = '>>>>>>>' + (options.label.b ? ` ${options.label.b}` : '');\n\n  const regions = diff3Merge(a, o, b, options);\n  let conflict = false;\n  let result = [];\n\n  regions.forEach(region => {\n    if (region.ok) {\n      result = result.concat(region.ok);\n    } else if (region.conflict) {\n      conflict = true;\n      result = result.concat(\n        [aSection],\n        region.conflict.a,\n        [oSection],\n        region.conflict.o,\n        [xSection],\n        region.conflict.b,\n        [bSection]\n      );\n    }\n  });\n\n  return {\n    conflict: conflict,\n    result: result\n  };\n}\n\n\nfunction merge(a, o, b, options) {\n  const defaults = {\n    excludeFalseConflicts: true,\n    stringSeparator: /\\s+/,\n    label: {}\n  };\n  options = Object.assign(defaults, options);\n\n  const aSection = '<<<<<<<' + (options.label.a ? ` ${options.label.a}` : '');\n  const xSection = '=======';\n  const bSection = '>>>>>>>' + (options.label.b ? ` ${options.label.b}` : '');\n\n  const regions = diff3Merge(a, o, b, options);\n  let conflict = false;\n  let result = [];\n\n  regions.forEach(region => {\n    if (region.ok) {\n      result = result.concat(region.ok);\n    } else if (region.conflict) {\n      conflict = true;\n      result = result.concat(\n        [aSection],\n        region.conflict.a,\n        [xSection],\n        region.conflict.b,\n        [bSection]\n      );\n    }\n  });\n\n  return {\n    conflict: conflict,\n    result: result\n  };\n}\n\n\nfunction mergeDigIn(a, o, b, options) {\n  const defaults = {\n    excludeFalseConflicts: true,\n    stringSeparator: /\\s+/,\n    label: {}\n  };\n  options = Object.assign(defaults, options);\n\n  const aSection = '<<<<<<<' + (options.label.a ? ` ${options.label.a}` : '');\n  const xSection = '=======';\n  const bSection = '>>>>>>>' + (options.label.b ? ` ${options.label.b}` : '');\n\n  const regions = diff3Merge(a, o, b, options);\n  let conflict = false;\n  let result = [];\n\n  regions.forEach(region => {\n    if (region.ok) {\n      result = result.concat(region.ok);\n    } else {\n      const c = diffComm(region.conflict.a, region.conflict.b);\n      for (let j = 0; j < c.length; j++) {\n        let inner = c[j];\n        if (inner.common) {\n          result = result.concat(inner.common);\n        } else {\n          conflict = true;\n          result = result.concat(\n            [aSection],\n            inner.buffer1,\n            [xSection],\n            inner.buffer2,\n            [bSection]\n          );\n        }\n      }\n    }\n  });\n\n  return {\n    conflict: conflict,\n    result: result\n  };\n}\n\n\n// Applies a patch to a buffer.\n// Given buffer1 and buffer2, `patch(buffer1, diffPatch(buffer1, buffer2))` should give buffer2.\nfunction patch(buffer, patch) {\n  let result = [];\n  let currOffset = 0;\n\n  function advanceTo(targetOffset) {\n    while (currOffset < targetOffset) {\n      result.push(buffer[currOffset]);\n      currOffset++;\n    }\n  }\n\n  for (let chunkIndex = 0; chunkIndex < patch.length; chunkIndex++) {\n    let chunk = patch[chunkIndex];\n    advanceTo(chunk.buffer1.offset);\n    for (let itemIndex = 0; itemIndex < chunk.buffer2.chunk.length; itemIndex++) {\n      result.push(chunk.buffer2.chunk[itemIndex]);\n    }\n    currOffset += chunk.buffer1.length;\n  }\n\n  advanceTo(buffer.length);\n  return result;\n}\n\n\n// Takes the output of diffPatch(), and removes extra information from it.\n// It can still be used by patch(), below, but can no longer be inverted.\nfunction stripPatch(patch) {\n  return patch.map(chunk => ({\n    buffer1: { offset: chunk.buffer1.offset, length: chunk.buffer1.length },\n    buffer2: { chunk: chunk.buffer2.chunk }\n  }));\n}\n\n\n// Takes the output of diffPatch(), and inverts the sense of it, so that it\n// can be applied to buffer2 to give buffer1 rather than the other way around.\nfunction invertPatch(patch) {\n  return patch.map(chunk => ({\n    buffer1: chunk.buffer2,\n    buffer2: chunk.buffer1\n  }));\n}\n","import { diff3Merge, diffPatch } from \"node-diff3\";\nimport type { IPatchRes } from \"node-diff3\";\nimport type { ConflictRegion, MergeResult } from \"./types.js\";\n\n/**\n * Performs a 3-way merge using the diff3 algorithm.\n *\n * @param base - The common ancestor (pristine generated state user edited against)\n * @param ours - The new generated version\n * @param theirs - The user's customized version\n * @returns MergeResult with content, conflict flag, and conflict regions\n */\nexport function threeWayMerge(base: string, ours: string, theirs: string): MergeResult {\n    const baseLines = base.split(\"\\n\");\n    const oursLines = ours.split(\"\\n\");\n    const theirsLines = theirs.split(\"\\n\");\n\n    const regions = diff3Merge(oursLines, baseLines, theirsLines);\n\n    const outputLines: string[] = [];\n    const conflicts: ConflictRegion[] = [];\n    let currentLine = 1;\n\n    for (const region of regions) {\n        if (region.ok) {\n            outputLines.push(...region.ok);\n            currentLine += region.ok.length;\n        } else if (region.conflict) {\n            // Attempt to resolve false conflicts caused by adjacent non-overlapping changes.\n            // node-diff3 groups adjacent edits into one conflict region even when the\n            // generator and user changed completely different lines within that region.\n            const resolved = tryResolveConflict(\n                region.conflict.a,  // ours (generator)\n                region.conflict.o,  // base\n                region.conflict.b   // theirs (user)\n            );\n\n            if (resolved !== null) {\n                outputLines.push(...resolved);\n                currentLine += resolved.length;\n            } else {\n                const startLine = currentLine;\n\n                outputLines.push(\"<<<<<<< Generated\");\n                outputLines.push(...region.conflict.a);\n                outputLines.push(\"=======\");\n                outputLines.push(...region.conflict.b);\n                outputLines.push(\">>>>>>> Your customization\");\n\n                // Total lines in conflict block: 3 markers + a.length + b.length\n                // endLine is the line number of the \">>>>>>>\" marker\n                const conflictLines = region.conflict.a.length + region.conflict.b.length + 3;\n                conflicts.push({\n                    startLine,\n                    endLine: startLine + conflictLines - 1,\n                    ours: region.conflict.a,\n                    theirs: region.conflict.b\n                });\n\n                currentLine += conflictLines;\n            }\n        }\n    }\n\n    const result: MergeResult = {\n        content: outputLines.join(\"\\n\"),\n        hasConflicts: conflicts.length > 0,\n        conflicts\n    };\n\n    // Detect lines that were unchanged context in the customer's THEIRS but\n    // got silently deleted by the generator. Only meaningful when no\n    // conflicts surfaced — when conflicts exist, the customer already has a\n    // marker to review. We compare against the lines diff3 actually emitted,\n    // which means a deleted-once-but-still-present-elsewhere line counts as\n    // dropped if its multiplicity decreased; that's accurate for the auth0\n    // case (each wiring line is a unique signature).\n    if (conflicts.length === 0) {\n        const dropped = computeDroppedContextLines(baseLines, theirsLines, outputLines);\n        if (dropped.length > 0) {\n            result.droppedContextLines = dropped;\n        }\n    }\n\n    return result;\n}\n\n/**\n * Lines present in BOTH base and theirs but absent from the merge output.\n * These are lines the customer's THEIRS treated as context (didn't edit);\n * OURS deleted; diff3 sided with the deletion. Returns empty array when\n * none. Order preserved per first occurrence in `base`.\n */\nfunction computeDroppedContextLines(\n    baseLines: string[],\n    theirsLines: string[],\n    mergedLines: string[]\n): string[] {\n    const baseCounts = countLines(baseLines);\n    const theirsCounts = countLines(theirsLines);\n    const mergedCounts = countLines(mergedLines);\n\n    const dropped: string[] = [];\n    const seen = new Set<string>();\n\n    for (const line of baseLines) {\n        if (seen.has(line)) continue;\n        const inBase = baseCounts.get(line) ?? 0;\n        const inTheirs = theirsCounts.get(line) ?? 0;\n        const inMerged = mergedCounts.get(line) ?? 0;\n\n        // Line was in BOTH base and theirs (unchanged context) AND its\n        // multiplicity went down in the merge. The deletion came from OURS.\n        if (inBase > 0 && inTheirs > 0 && inMerged < Math.min(inBase, inTheirs)) {\n            dropped.push(line);\n            seen.add(line);\n        }\n    }\n\n    return dropped;\n}\n\nfunction countLines(lines: string[]): Map<string, number> {\n    const counts = new Map<string, number>();\n    for (const line of lines) {\n        counts.set(line, (counts.get(line) ?? 0) + 1);\n    }\n    return counts;\n}\n\n/**\n * Attempts to resolve a false conflict by checking if ours and theirs\n * changed non-overlapping lines within the conflict region's base.\n * Returns merged lines if resolvable, or null for a real conflict.\n */\nfunction tryResolveConflict(\n    oursLines: string[],\n    baseLines: string[],\n    theirsLines: string[]\n): string[] | null {\n    if (baseLines.length === 0) {\n        return null;\n    }\n\n    const oursPatches = diffPatch(baseLines, oursLines);\n    const theirsPatches = diffPatch(baseLines, theirsLines);\n\n    if (oursPatches.length === 0) return theirsLines;\n    if (theirsPatches.length === 0) return oursLines;\n\n    if (patchesOverlap(oursPatches, theirsPatches)) {\n        return null;\n    }\n\n    return applyBothPatches(baseLines, oursPatches, theirsPatches);\n}\n\n/**\n * Checks if any patch ranges overlap in base coordinates.\n */\nfunction patchesOverlap(\n    oursPatches: IPatchRes<string>[],\n    theirsPatches: IPatchRes<string>[]\n): boolean {\n    for (const op of oursPatches) {\n        const oStart = op.buffer1.offset;\n        const oEnd = oStart + op.buffer1.length;\n        for (const tp of theirsPatches) {\n            const tStart = tp.buffer1.offset;\n            const tEnd = tStart + tp.buffer1.length;\n\n            // Both are pure insertions at the same point\n            if (op.buffer1.length === 0 && tp.buffer1.length === 0 && oStart === tStart) {\n                return true;\n            }\n            // Insertion at the exact boundary of a deletion/replacement.\n            // Example: generator deletes lines [0,2) and user inserts at offset 2.\n            // The insertion's surrounding context has been rewritten, so splicing\n            // both into base would produce a semantically broken result (e.g. user\n            // content appended after a file-deletion). Treating this as overlap is\n            // conservative — it keeps the conflict for manual resolution rather than\n            // silently producing a bad merge.\n            if (tp.buffer1.length === 0 && tStart === oEnd) {\n                return true;\n            }\n            if (op.buffer1.length === 0 && oStart === tEnd) {\n                return true;\n            }\n            // Standard range overlap\n            if (oStart < tEnd && tStart < oEnd) {\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\n/**\n * Applies both sets of non-overlapping patches to base.\n * Patches are sorted by descending offset and applied via splice\n * to avoid index invalidation.\n */\nfunction applyBothPatches(\n    baseLines: string[],\n    oursPatches: IPatchRes<string>[],\n    theirsPatches: IPatchRes<string>[]\n): string[] {\n    const allPatches = [\n        ...oursPatches.map(p => ({\n            offset: p.buffer1.offset,\n            length: p.buffer1.length,\n            replacement: p.buffer2.chunk,\n        })),\n        ...theirsPatches.map(p => ({\n            offset: p.buffer1.offset,\n            length: p.buffer1.length,\n            replacement: p.buffer2.chunk,\n        })),\n    ];\n\n    allPatches.sort((a, b) => b.offset - a.offset);\n\n    const result = [...baseLines];\n    for (const p of allPatches) {\n        result.splice(p.offset, p.length, ...p.replacement);\n    }\n    return result;\n}\n","// buildMergePlan.ts — Phase 2 of the mergeFile pipeline (FER-10394).\n//\n// Owns: snapshot-vs-reconstruction selection, marker-rescue, stale-marker\n// detection (pre + post accumulator), accumulator-base fallback, pre-merge\n// with accumulator, baseMismatchSkipped detection, and the variant-selection\n// step that emits the discriminated `MergePlan`.\n//\n// Behavioral equivalence claim: for every input combination, the returned\n// `MergePlan` carries the same effective `theirs`, `mergeBase`,\n// `conflictReasonHint`, and (implicitly through `kind`) the same flow-control\n// decision the pre-refactor `mergeFile` would have taken into Phase 3.\n//\n// The boolean trio (`useAccumulatorAsMergeBase`, `baseMismatchSkipped`,\n// `ghostReconstructed`) is now internal to this function. Callers consume\n// only the `MergePlan` discriminant + fields.\n\nimport type { GitClient } from \"../git/GitClient.js\";\nimport { hasConflictMarkerStrings } from \"../conflict-utils.js\";\nimport { threeWayMerge } from \"../ThreeWayMerge.js\";\nimport type { ConflictReason, StoredPatch } from \"../types.js\";\nimport type { MergeAccumulator } from \"../accumulator/MergeAccumulator.js\";\nimport type { MergePlan, ResolvedInputs } from \"./MergePlan.js\";\n\nexport interface BuildMergePlanArgs {\n    inputs: ResolvedInputs;\n    patch: StoredPatch;\n    filePath: string;\n    accumulator: MergeAccumulator;\n    tempGit: GitClient;\n    tempDir: string;\n    applyPatchToContent: (\n        base: string | null,\n        patchContent: string,\n        filePath: string,\n        tempGit: GitClient,\n        tempDir: string,\n        sourceFilePath?: string,\n    ) => Promise<string | null>;\n    isPatchAlreadyApplied: (\n        patchContent: string,\n        filePath: string,\n        content: string,\n        tempGit: GitClient,\n        tempDir: string,\n    ) => Promise<boolean>;\n}\n\nexport async function buildMergePlan(args: BuildMergePlanArgs): Promise<MergePlan> {\n    const {\n        inputs,\n        patch,\n        filePath,\n        accumulator,\n        tempGit,\n        tempDir,\n        applyPatchToContent,\n        isPatchAlreadyApplied,\n    } = args;\n    const { base, ours, resolvedPath, renameSourcePath, ghostTheirs } = inputs;\n\n    let theirs: string | null = ghostTheirs;\n    const ghostReconstructed = ghostTheirs != null;\n\n    // Snapshot-vs-reconstruction selection.\n    //\n    // **Snapshot-as-primary** when the patch owns its file (no other patch in\n    // this run touches it): the stored `theirs_snapshot` IS the customer's\n    // intent for the file post-regen. Using it directly bypasses line-anchored\n    // reconstruction and survives generator structural changes that would\n    // invalidate the diff's line anchors. Architectural fix for the\n    // silent-loss class of bugs.\n    //\n    // **Reconstruction-as-primary** when the patch shares its file with\n    // another patch in this run (cross-patch isolation). Snapshots from commit\n    // trees are CUMULATIVE across the patches touching a shared file, so using\n    // a later patch's snapshot as its individual THEIRS would propagate prior\n    // patches' edits into the merge — surfacing nested conflicts at regions\n    // the patch alone never touched. The line-anchored diff produces each\n    // patch's INDIVIDUAL contribution, which is what the cross-patch flow\n    // needs.\n    //\n    // For shared-file patches, snapshot is still used as a narrow\n    // markers-only fallback: when reconstruction produces marker-laden\n    // content (cross-patch context mismatch where the diff applies fuzzy-\n    // cleanly but yields stale-base markers), snapshot rescues. The\n    // pure-null-return case (strict context mismatch — patch can't apply\n    // against this base at all) is left as \"skipped\" so legacy paths\n    // (by-association gate, accumulator fallback) handle recovery with their\n    // established UX.\n    const snapshotForFile =\n        patch.theirs_snapshot?.[resolvedPath] ?? patch.theirs_snapshot?.[filePath];\n    const fileIsShared = accumulator.isShared(resolvedPath) || accumulator.isShared(filePath);\n    const useSnapshotAsPrimary = !fileIsShared && snapshotForFile != null;\n\n    // Track which path produced theirs (for the `kind` discriminant). The\n    // marker-rescue case keeps \"reconstructed\" because reconstruction was the\n    // primary attempt; snapshot only rescued its output.\n    let primarySource: \"ghost\" | \"snapshot\" | \"reconstructed\" = ghostReconstructed\n        ? \"ghost\"\n        : \"reconstructed\";\n\n    if (!ghostReconstructed) {\n        if (useSnapshotAsPrimary) {\n            // Snapshot IS THEIRS. Skip the brittle reconstruction step entirely.\n            // 3-way merge below uses BASE → snapshot for \"what the customer\n            // changed\", which works on content (not line anchors) and survives\n            // generator structural changes.\n            theirs = snapshotForFile;\n            primarySource = \"snapshot\";\n        } else {\n            theirs = await applyPatchToContent(\n                base,\n                patch.patch_content,\n                filePath,\n                tempGit,\n                tempDir,\n                renameSourcePath,\n            );\n            const reconstructionHasMarkers = hasConflictMarkerStrings(theirs);\n            const baseHadMarkers = hasConflictMarkerStrings(base);\n            if (reconstructionHasMarkers && !baseHadMarkers && snapshotForFile != null) {\n                theirs = snapshotForFile;\n            }\n        }\n    }\n\n    // Detect markers that bled into THEIRS from a cross-patch context\n    // mismatch: the patch's diff was authored against post-A state but we\n    // tried to apply it to gen-anchor BASE. When this happens AND a prior\n    // patch's accumulator entry is available with the right base_generation,\n    // we want the accumulator fallback below to retry against the\n    // accumulator. Treat THEIRS as null in that case so the existing fallback\n    // logic fires naturally.\n    //\n    // Only skip outright (with `stale-conflict-markers`) when there's no\n    // accumulator to fall back on — that's the original \"stale markers from\n    // a crashed run\" case.\n    const accumulatorEntry = accumulator.lookup(resolvedPath);\n    if (theirs) {\n        const theirsHasMarkers = hasConflictMarkerStrings(theirs);\n        const baseHasMarkers = hasConflictMarkerStrings(base);\n        if (theirsHasMarkers && !baseHasMarkers) {\n            if (accumulatorEntry) {\n                // Accumulator-based fallback below will try against\n                // post-prior-patch state.\n                theirs = null;\n            } else {\n                return { kind: \"skipped\", reason: \"stale-conflict-markers\" };\n            }\n        }\n    }\n\n    // Fall back to accumulator as merge base for incremental patches.\n    let useAccumulatorAsMergeBase = false;\n\n    if (accumulatorEntry && (theirs == null || base == null)) {\n        theirs = await applyPatchToContent(\n            accumulatorEntry.content,\n            patch.patch_content,\n            filePath,\n            tempGit,\n            tempDir,\n        );\n        if (theirs != null) {\n            useAccumulatorAsMergeBase = true;\n        } else if (\n            await isPatchAlreadyApplied(\n                patch.patch_content,\n                filePath,\n                accumulatorEntry.content,\n                tempGit,\n                tempDir,\n            )\n        ) {\n            // The patch's additions are already present in the accumulator.\n            // This happens when preGenerationRebase's content refresh absorbs\n            // a new user commit into an existing patch, and detectNewPatches\n            // also creates a separate patch for that same commit. The\n            // effective THEIRS is the accumulator content itself — no further\n            // apply needed.\n            theirs = accumulatorEntry.content;\n            useAccumulatorAsMergeBase = true;\n        }\n    }\n\n    // Re-check after accumulator fallback — git apply --3way against\n    // accumulated content can also produce conflict markers.\n    if (theirs) {\n        const theirsHasMarkers = hasConflictMarkerStrings(theirs);\n        const accBaseHasMarkers =\n            accumulatorEntry != null && hasConflictMarkerStrings(accumulatorEntry.content);\n        if (theirsHasMarkers && !accBaseHasMarkers && !hasConflictMarkerStrings(base)) {\n            return { kind: \"skipped\", reason: \"stale-conflict-markers\" };\n        }\n    }\n\n    // Pre-merge with accumulated customizations (skip when accumulator is\n    // already serving as merge base).\n    let effective_theirs = theirs;\n    let conflictReasonHint: ConflictReason | undefined;\n\n    if (theirs != null && base != null && !useAccumulatorAsMergeBase) {\n        if (accumulatorEntry && accumulatorEntry.baseGeneration === patch.base_generation) {\n            // Pre-merge: combine previous customizations with current patch.\n            try {\n                const preMerged = threeWayMerge(base, accumulatorEntry.content, theirs);\n                if (!preMerged.hasConflicts) {\n                    // Clean merge — use the combined result.\n                    effective_theirs = preMerged.content;\n                } else {\n                    // Pre-merge has conflicts — skip accumulator for this\n                    // patch to avoid nested conflict markers. User patches\n                    // conflict with each other and require manual resolution.\n                    effective_theirs = theirs;\n                }\n            } catch {\n                // If pre-merge fails unexpectedly, fall back to current_theirs.\n                effective_theirs = theirs;\n            }\n        } else if (accumulatorEntry) {\n            // Base generations differ — accumulator pre-merge skipped. The\n            // main merge below will still run, but if it conflicts we flag it\n            // as a base-generation-mismatch.\n            conflictReasonHint = \"base-generation-mismatch\";\n        }\n    }\n\n    // ===== Variant selection =====\n    //\n    // Order mirrors the pre-refactor branch order at lines 593-708:\n    //   1. new-file paths (require effective_theirs != null).\n    //   2. missing-content guards.\n    //   3. accumulator-base path.\n    //   4. main merge against base (ghost / snapshot / reconstructed).\n\n    if (base == null && ours == null && effective_theirs != null) {\n        return { kind: \"new-file-only-user\", theirs: effective_theirs };\n    }\n    if (base == null && ours != null && effective_theirs != null && !useAccumulatorAsMergeBase) {\n        // Forward the unreachable-base signal so Phase 3 can warn: a null base\n        // caused by an out-of-window prior-generation tree means this is most\n        // likely an edited-existing-file patch misclassified as both-created,\n        // and the customer's edit is at risk of being dropped silently.\n        return {\n            kind: \"new-file-both\",\n            theirs: effective_theirs,\n            ...(inputs.baseTreeUnreachable ? { baseTreeUnreachable: true } : {}),\n        };\n    }\n\n    if (effective_theirs == null) {\n        return { kind: \"skipped\", reason: \"missing-content\" };\n    }\n    if ((base == null && !useAccumulatorAsMergeBase) || ours == null) {\n        return { kind: \"skipped\", reason: \"missing-content\" };\n    }\n\n    if (useAccumulatorAsMergeBase) {\n        // Invariant: useAccumulatorAsMergeBase is set only inside the\n        // `if (accumulatorEntry && ...)` block above, so accumulatorEntry\n        // is non-null here. The fallback to base preserves pre-refactor\n        // behavior at line 645 in the unreachable case.\n        const mergeBase = accumulatorEntry?.content ?? base;\n        if (mergeBase == null) {\n            return { kind: \"skipped\", reason: \"missing-content\" };\n        }\n        return {\n            kind: \"accumulator-base\",\n            theirs: effective_theirs,\n            mergeBase,\n            conflictReasonHint,\n        };\n    }\n\n    // base and ours are both non-null at this point.\n    return {\n        kind: primarySource,\n        base: base!,\n        theirs: effective_theirs,\n        mergeBase: base!,\n        conflictReasonHint,\n    };\n}\n","// runMergeAndRecord.ts — Phase 3 of the mergeFile pipeline (FER-10394).\n//\n// Owns: dispatching on `MergePlan.kind`, running the appropriate\n// `threeWayMerge` (for non-skipped variants), writing merged content to\n// disk, populating the accumulator (mode-aware via MergeAccumulator), and\n// classifying the resulting `FileResult`.\n//\n// Behavioral equivalence claim: for every `MergePlan` + `ResolvedInputs`\n// combination, the returned `FileResult`, the on-disk content at\n// `oursPath`, and the post-call accumulator state are byte-identical to\n// the pre-refactor `mergeFile`'s outputs at the corresponding return path.\n//\n// Two deliberately-preserved divergences in the new-file-both branch\n// (FER-10399): clean merge stores `merged.content` (not `plan.theirs`),\n// conflict path skips the accumulator entirely. Both flagged with\n// inline comments referencing FER-10399.\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { MergeAccumulator } from \"../accumulator/MergeAccumulator.js\";\nimport { alignAutoversionToOurs } from \"../autoversion.js\";\nimport { threeWayMerge } from \"../ThreeWayMerge.js\";\nimport type { FileResult, StoredPatch } from \"../types.js\";\nimport type { MergePlan, ResolvedInputs } from \"./MergePlan.js\";\n\nexport interface RunMergeAndRecordArgs {\n    plan: MergePlan;\n    inputs: ResolvedInputs;\n    patch: StoredPatch;\n    accumulator: MergeAccumulator;\n}\n\nexport async function runMergeAndRecord(args: RunMergeAndRecordArgs): Promise<FileResult> {\n    const { plan, inputs, patch, accumulator } = args;\n    const { resolvedPath, metadata, oursPath, ours } = inputs;\n\n    if (plan.kind === \"skipped\") {\n        return { file: resolvedPath, status: \"skipped\", reason: plan.reason };\n    }\n\n    // New-file-only-user: file user-created, generator never produced it.\n    // Order matters: accumulator BEFORE writeFile, so the next patch's\n    // fast-path-fallback sees the entry. Pre-refactor matches.\n    if (plan.kind === \"new-file-only-user\") {\n        accumulator.recordMerge(resolvedPath, plan.theirs, patch.base_generation);\n        await mkdir(dirname(oursPath), { recursive: true });\n        await writeFile(oursPath, plan.theirs);\n        return { file: resolvedPath, status: \"merged\", reason: \"new-file\" };\n    }\n\n    // New-file-both: file created by both generator and user. Run 3-way\n    // merge against an empty BASE so the diff3 algorithm can interleave\n    // the two contributions.\n    if (plan.kind === \"new-file-both\") {\n        // ours is non-null here by buildMergePlan's variant invariant\n        // (this branch is only emitted when base==null && ours!=null).\n        const merged = threeWayMerge(\"\", ours!, plan.theirs);\n        await mkdir(dirname(oursPath), { recursive: true });\n        await writeFile(oursPath, merged.content);\n        // INC-866: when this `new-file-both` was produced because the base tree\n        // is unreachable (shallow clone window too small), flag the result so the\n        // service can warn. Otherwise the customer's edit can be lost silently.\n        const unreachableFlag = plan.baseTreeUnreachable ? { baseTreeUnreachable: true } : {};\n        if (merged.hasConflicts) {\n            // FER-10399 preserved: no accumulator population on this path.\n            // Asymmetric vs the main-merge conflict path (which calls\n            // recordConflict). Tracked for triage; do not touch in\n            // this refactor.\n            return {\n                file: resolvedPath,\n                status: \"conflict\",\n                conflicts: merged.conflicts,\n                conflictReason: \"new-file-both\",\n                conflictMetadata: metadata,\n                ...unreachableFlag,\n            };\n        }\n        // FER-10399 preserved: stores `merged.content` (with potentially\n        // interleaved generator bytes), not `plan.theirs`. The\n        // MergeAccumulator docstring says \"stores each patch's THEIRS\";\n        // this site stores the merged result instead. Tracked for triage.\n        accumulator.recordMerge(resolvedPath, merged.content, patch.base_generation);\n        return { file: resolvedPath, status: \"merged\", ...unreachableFlag };\n    }\n\n    // Main 3-way merge path: ghost / snapshot / reconstructed / accumulator-base.\n    // ours is non-null here by buildMergePlan's variant invariant.\n    //\n    // Autoversion alignment: the SDK version line is pipeline-owned. When the\n    // pristine generation base (`inputs.base`) still carries the placeholder\n    // (`--version AUTO`), align the version lines of BOTH the merge base and\n    // THEIRS to OURS's freshly-resolved value. That makes the version line\n    // identical across all three sides — stable context that diff3 never treats\n    // as a change — so the merge takes the current version with no conflict even\n    // when a customer edit sits adjacent to it, and a stale version baked into a\n    // legacy THEIRS self-heals. No-op for fixed `--version` (no placeholder) or a\n    // null base (new-file).\n    const mergeBase =\n        inputs.base != null ? alignAutoversionToOurs(inputs.base, ours!, plan.mergeBase) : plan.mergeBase;\n    const theirs =\n        inputs.base != null ? alignAutoversionToOurs(inputs.base, ours!, plan.theirs) : plan.theirs;\n    const merged = threeWayMerge(mergeBase, ours!, theirs);\n    await mkdir(dirname(oursPath), { recursive: true });\n    await writeFile(oursPath, merged.content);\n\n    // Update accumulator after merge so subsequent patches on the same file\n    // have a structurally-correct THEIRS to anchor against.\n    //\n    // Cross-patch isolation guard: in REPLAY mode, `recordConflict` is a\n    // no-op — the next iteration's intra-loop strip will reset disk to OURS,\n    // and a poisoned accumulator entry could cause the next patch to see\n    // false conflicts on regions it never touched.\n    //\n    // RESOLVE mode: `recordConflict` populates. We store `plan.theirs` (the\n    // clean THEIRS, NOT `merged.content` with markers), so there's no marker\n    // poisoning. A follow-up patch authored against post-this-patch\n    // structure NEEDS this entry to anchor against.\n    //\n    // Mode dispatch lives entirely inside MergeAccumulator.recordConflict.\n    if (merged.hasConflicts) {\n        accumulator.recordConflict(resolvedPath, theirs, patch.base_generation);\n        return {\n            file: resolvedPath,\n            status: \"conflict\",\n            conflicts: merged.conflicts,\n            conflictReason: plan.conflictReasonHint ?? \"same-line-edit\",\n            conflictMetadata: metadata,\n        };\n    }\n    accumulator.recordMerge(resolvedPath, theirs, patch.base_generation);\n\n    return {\n        file: resolvedPath,\n        status: \"merged\",\n        ...(merged.droppedContextLines && merged.droppedContextLines.length > 0\n            ? { droppedContextLines: merged.droppedContextLines }\n            : {}),\n    };\n}\n","// The Fern generator stamps a magic placeholder version into generated SDK\n// code (package.json \"version\", src/version.ts SDK_VERSION, the\n// X-Fern-SDK-Version / User-Agent headers, pyproject.toml, Cargo.toml, ...).\n// The [fern-autoversion] pipeline step then swaps that placeholder for the\n// real semver, running BETWEEN replay's prepare and apply phases. The version\n// line is therefore pipeline-owned, NOT a customer customization -- replay must\n// never capture it into a patch nor let a stored patch pin it.\n//\n// The reliable anchor: the pristine generation tree replay reads as merge BASE\n// still carries the placeholder (autoversion runs after [fern-generated]).\n// So \"a line whose BASE content carries a placeholder\" is autoversion-managed.\n// This is only ever true under --version AUTO; a fixed-version SDK has no\n// placeholder, so every helper here is a hard no-op for those customers.\n//\n// Source of truth for the literals: the generator-cli (VersionUtils.ts\n// MAGIC_VERSION / MAGIC_VERSION_PYTHON and the Go v-prefixed variant). Kept in\n// sync manually; a shared constant is a possible future follow-up.\n\nexport const AUTOVERSION_PLACEHOLDERS = [\n    \"v0.0.0-fern-placeholder\", // Go -- a superstring of the default; check first\n    \"0.0.0-fern-placeholder\", // TS/Java/C#/Ruby/PHP/Rust/default\n    \"0.0.0.dev0\", // Python (PEP 440 -- Poetry rejects hyphens)\n] as const;\n\n// Matches a semver-ish version token, including the placeholders above and\n// v-prefixed / pre-release / build-metadata forms. Single character class (no\n// nested quantifiers) so it is linear-time -- no catastrophic backtracking.\nconst VERSION_TOKEN = /(?:v)?\\d+\\.\\d+\\.\\d+[0-9A-Za-z.+-]*/g;\n\n// Distinctive printable sentinel a version token is replaced with when\n// comparing two lines \"modulo the version\". Printable ASCII (never a NUL) so\n// the source stays a normal text file, and vanishingly unlikely to occur\n// verbatim in real SDK source.\nconst VERSION_MASK = \"@@FERN_VERSION@@\";\n\nfunction maskVersions(line: string): string {\n    return line.replace(VERSION_TOKEN, VERSION_MASK);\n}\n\n/** True when `content` carries an autoversion placeholder (the `--version AUTO` signal). */\nexport function containsPlaceholder(content: string | null | undefined): boolean {\n    if (!content) return false;\n    return AUTOVERSION_PLACEHOLDERS.some((p) => content.includes(p));\n}\n\n/**\n * Core remap: rewrite each THEIRS line that matches an autoversion-managed line\n * of `genBase` (a placeholder-bearing line, compared modulo the version token)\n * to the corresponding line from `target`. Only full-line matches against a\n * managed line are rewritten, so the customer's real edits -- including edits on\n * lines adjacent to (or sharing a hunk with) a version line -- are untouched.\n *\n * `genBase` is always the pristine generation tree; its placeholders are both\n * the `--version AUTO` signal and the identifier of which lines are managed.\n * No-op when `genBase` has no placeholder (fixed `--version`).\n */\nfunction remapManagedLines(genBase: string, target: string, theirs: string): string {\n    if (!containsPlaceholder(genBase)) return theirs;\n\n    const managedMasks = new Set<string>();\n    for (const line of genBase.split(\"\\n\")) {\n        if (AUTOVERSION_PLACEHOLDERS.some((p) => line.includes(p))) managedMasks.add(maskVersions(line));\n    }\n    if (managedMasks.size === 0) return theirs;\n\n    const targetByMask = new Map<string, string>();\n    for (const line of target.split(\"\\n\")) {\n        const mask = maskVersions(line);\n        if (managedMasks.has(mask) && !targetByMask.has(mask)) targetByMask.set(mask, line);\n    }\n\n    return theirs\n        .split(\"\\n\")\n        .map((line) => {\n            const mask = maskVersions(line);\n            const replacement = managedMasks.has(mask) ? targetByMask.get(mask) : undefined;\n            return replacement !== undefined && replacement !== line ? replacement : line;\n        })\n        .join(\"\\n\");\n}\n\n/**\n * CAPTURE side: reset THEIRS's autoversion-managed lines back to the pristine\n * placeholder (from `genBase`), so a captured `patch_content`/`theirs_snapshot`\n * never pins a concrete version. No-op for fixed `--version`.\n */\nexport function neutralizeAutoversionTheirs(genBase: string, theirs: string): string {\n    return remapManagedLines(genBase, genBase, theirs);\n}\n\n/**\n * MERGE side: align THEIRS's autoversion-managed lines to OURS's current values\n * (the freshly-resolved semver), so THEIRS agrees with OURS on the pipeline-owned\n * version lines. This makes the 3-way merge take the current version with no\n * conflict -- even when a customer edit sits adjacent to a version line -- and\n * self-heals a stale version baked into a legacy THEIRS. No-op for fixed\n * `--version` (no placeholder in `genBase`).\n */\nexport function alignAutoversionToOurs(genBase: string, ours: string, theirs: string): string {\n    return remapManagedLines(genBase, ours, theirs);\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Read `.fernignore` patterns from the SDK output directory.\n *\n * Single source of truth for every surface that constructs a\n * `ReplayDetector`: the patterns scope which files survive into patch\n * content, which in turn determines the content hash a commit materializes\n * to. A detector built without these patterns computes different hashes\n * for commits touching `.fernignore`-protected files — silently breaking\n * dedupe and tombstone checks.\n */\nexport function readFernignorePatterns(outputDir: string): string[] {\n    const fernignorePath = join(outputDir, \".fernignore\");\n    if (!existsSync(fernignorePath)) return [];\n    return readFileSync(fernignorePath, \"utf-8\")\n        .split(\"\\n\")\n        .map((line) => line.trim())\n        .filter((line) => line && !line.startsWith(\"#\"));\n}\n","import type { GitClient } from \"./git/GitClient.js\";\nimport type { GenerationRecord, StoredPatch } from \"./types.js\";\n\nexport interface CommitOptions {\n    cliVersion: string;\n    generatorVersions: Record<string, string>;\n}\n\nexport class ReplayCommitter {\n    private git: GitClient;\n    private outputDir: string;\n\n    constructor(git: GitClient, outputDir: string) {\n        this.git = git;\n        this.outputDir = outputDir;\n    }\n\n    async commitGeneration(message: string, options?: CommitOptions): Promise<string> {\n        await this.stageAll();\n\n        if (!(await this.hasStagedChanges())) {\n            return (await this.git.exec([\"rev-parse\", \"HEAD\"])).trim();\n        }\n\n        let fullMessage = `[fern-generated] ${message}\\n\\nGenerated by Fern`;\n\n        if (options?.cliVersion) {\n            fullMessage += `\\nCLI Version: ${options.cliVersion}`;\n        }\n\n        if (options?.generatorVersions && Object.keys(options.generatorVersions).length > 0) {\n            fullMessage += \"\\nGenerators:\";\n            for (const [name, version] of Object.entries(options.generatorVersions)) {\n                fullMessage += `\\n  - ${name}: ${version}`;\n            }\n        }\n\n        await this.git.exec([\"commit\", \"-m\", fullMessage]);\n        return (await this.git.exec([\"rev-parse\", \"HEAD\"])).trim();\n    }\n\n    async commitReplay(\n        _patchCount: number,\n        patches?: StoredPatch[],\n        message?: string,\n        options?: {\n            buckets?: {\n                applied: StoredPatch[];\n                unresolved: StoredPatch[];\n                absorbed: StoredPatch[];\n            };\n        }\n    ): Promise<string> {\n        await this.stageAll();\n\n        if (!(await this.hasStagedChanges())) {\n            return (await this.git.exec([\"rev-parse\", \"HEAD\"])).trim();\n        }\n\n        let fullMessage = message ?? `[fern-replay] Applied customizations`;\n\n        const buckets = options?.buckets;\n        if (buckets) {\n            // Honest, bucketed body so the customer can tell at a glance\n            // which patches truly applied, which need their attention via\n            // `fern replay resolve`, and which the generator now emits\n            // natively. Empty buckets are omitted.\n            if (buckets.applied.length > 0) {\n                fullMessage += `\\n\\nPatches applied (${buckets.applied.length}):`;\n                for (const p of buckets.applied) {\n                    fullMessage += `\\n  - ${p.id}: ${p.original_message}`;\n                }\n            }\n            if (buckets.unresolved.length > 0) {\n                fullMessage += `\\n\\nPatches with unresolved conflicts (${buckets.unresolved.length}):`;\n                for (const p of buckets.unresolved) {\n                    fullMessage += `\\n  - ${p.id}: ${p.original_message}`;\n                }\n                fullMessage += `\\n    Run \\`fern-replay resolve\\` to apply these customizations.`;\n            }\n            if (buckets.absorbed.length > 0) {\n                fullMessage += `\\n\\nPatches absorbed by generator (${buckets.absorbed.length}):`;\n                for (const p of buckets.absorbed) {\n                    fullMessage += `\\n  - ${p.id}: ${p.original_message}`;\n                }\n                fullMessage += `\\n    The generator now produces these customizations natively.`;\n            }\n        } else if (patches && patches.length > 0) {\n            // Legacy flat-list path (used by `commands/resolve.ts` after\n            // hand-resolution and by tests that don't pass buckets). Every\n            // patch is presumed applied at this point.\n            fullMessage += \"\\n\\nPatches replayed:\";\n            for (const patch of patches) {\n                fullMessage += `\\n  - ${patch.id}: ${patch.original_message}`;\n            }\n        }\n\n        await this.git.exec([\"commit\", \"-m\", fullMessage]);\n        return (await this.git.exec([\"rev-parse\", \"HEAD\"])).trim();\n    }\n\n    async createGenerationRecord(options?: CommitOptions): Promise<GenerationRecord> {\n        const commitSha = (await this.git.exec([\"rev-parse\", \"HEAD\"])).trim();\n        const treeHash = await this.getTreeHash(commitSha);\n\n        return {\n            commit_sha: commitSha,\n            tree_hash: treeHash,\n            timestamp: new Date().toISOString(),\n            cli_version: options?.cliVersion ?? \"unknown\",\n            generator_versions: options?.generatorVersions ?? {},\n        };\n    }\n\n    async stageAll(): Promise<void> {\n        await this.git.exec([\"add\", \"-A\", this.outputDir]);\n    }\n\n    async hasStagedChanges(): Promise<boolean> {\n        const output = await this.git.exec([\"diff\", \"--cached\", \"--name-only\"]);\n        return output.trim().length > 0;\n    }\n\n    async getTreeHash(commitSha: string): Promise<string> {\n        return this.git.getTreeHash(commitSha);\n    }\n}\n","/**\n * Per-patch contribution diff.\n *\n * Given a stored patch, the post-regen `currentGen` content of each file, and\n * the working-tree (post-resolution) content, compute a unified diff that\n * captures ONLY this patch's contribution — scoped to the regions identified\n * by the patch's stored hunks via context-line anchoring.\n *\n * Why this exists: `git diff currentGen -- patch.files` returns the full\n * cumulative diff for those files. When two patches share a file, the\n * cumulative diff includes BOTH patches' customizations — which means each\n * patch ends up with the same `patch_content` and `content_hash`. The\n * dedup-by-hash logic downstream then collapses them into one and silently\n * loses provenance.\n */\n\nimport { mkdtemp, writeFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { parseHunks, locateHunksInOurs, type DiffHunk, type LocatedHunk } from \"./HybridReconstruction.js\";\n\n/**\n * Trim a hunk's body to exactly the line counts declared in its `@@` header.\n *\n * `parseHunks` keeps appending lines to a hunk's body until it hits the next\n * `@@` header or end of input. When the patch text has trailing blank lines\n * (e.g. from a trailing newline in the multi-file diff), those blanks get\n * conflated with context lines (per the helper's \"bare empty = context\"\n * heuristic), inflating the parsed body past `oldCount`/`newCount`. That\n * inflation causes `locateHunksInOurs` to overshoot when computing\n * `oursSpan` because trailing context anchoring lands on lines beyond the\n * hunk's actual region.\n */\nfunction normalizeHunkBody(hunk: DiffHunk): DiffHunk {\n    let contextC = 0;\n    let removeC = 0;\n    let addC = 0;\n    const trimmed: typeof hunk.lines = [];\n    for (const line of hunk.lines) {\n        const oldUsed = contextC + removeC;\n        const newUsed = contextC + addC;\n        if (oldUsed >= hunk.oldCount && newUsed >= hunk.newCount) break;\n        trimmed.push(line);\n        if (line.type === \"context\") contextC++;\n        else if (line.type === \"remove\") removeC++;\n        else if (line.type === \"add\") addC++;\n    }\n    return { ...hunk, lines: trimmed };\n}\n\nexport interface PerPatchDiffResult {\n    /** Concatenated unified diff (one `diff --git` block per file). Empty string if patch contributes nothing. */\n    diff: string;\n    /** Files where the patch's hunks could not be anchored against either currentGen or working tree. Caller should fall back. */\n    unlocatableFiles: string[];\n}\n\n/**\n * Extract the per-file unified diff for `filePath` from a multi-file unified diff.\n * Mirrors `ReplayApplicator.extractFileDiff` — kept here to avoid cross-module\n * private-method exposure.\n */\nexport function extractFileDiffForFile(patchContent: string, filePath: string): string | null {\n    const lines = patchContent.split(\"\\n\");\n    const out: string[] = [];\n    let inTarget = false;\n    for (const line of lines) {\n        if (line.startsWith(\"diff --git\")) {\n            if (inTarget) break;\n            if (isDiffLineForFile(line, filePath)) {\n                inTarget = true;\n                out.push(line);\n            }\n            continue;\n        }\n        if (inTarget) out.push(line);\n    }\n    return out.length > 0 ? out.join(\"\\n\") + \"\\n\" : null;\n}\n\nfunction isDiffLineForFile(line: string, filePath: string): boolean {\n    // Use anchored regex (matches `ReplayApplicator.ts` pattern) to avoid\n    // substring false positives — e.g. `src/user.ts` matching `src/user.tsx`,\n    // or `lib/foo.ts` matching `lib/foo.ts-backup`. Match on the b-path\n    // (post-image) since it's the canonical destination, including for\n    // renames (`diff --git a/old b/new`).\n    const match = line.match(/^diff --git a\\/(.+) b\\/(.+)$/);\n    return match !== null && (match[2] === filePath || match[1] === filePath);\n}\n\n/**\n * Compute the per-patch contribution diff.\n *\n * The caller owns content reads via `getCurrentGenContent` / `getWorkingTreeContent`\n * so that the helper is reusable from `resolve.ts` (reads from disk) and\n * `rebasePatches` (reads from git tree + disk).\n *\n * Algorithm:\n *  1. For each file in `patch.files`:\n *     a. Parse the patch's hunks for this file.\n *     b. Anchor the hunks in `currentGen` content via `locateHunksInOurs`.\n *     c. Anchor the hunks in `workingTree` content via `locateHunksInOurs`.\n *     d. Overlay each anchored region from working tree onto currentGen,\n *        producing a \"currentGen + just this patch's contribution\" string.\n *     e. Compute a unified diff between currentGen and that overlay via\n *        `git diff --no-index`. This is the per-patch diff for the file.\n *  2. Concatenate per-file diffs.\n *\n * Falls back to `unlocatableFiles` for files where steps b/c fail (rename,\n * heavy generator restructure, etc.) — caller's responsibility to handle.\n */\nexport async function computePerPatchDiff(\n    patch: { patch_content: string; files: string[] },\n    getCurrentGenContent: (file: string) => Promise<string | null>,\n    getWorkingTreeContent: (file: string) => Promise<string | null>\n): Promise<PerPatchDiffResult> {\n    const fragments: string[] = [];\n    const unlocatableFiles: string[] = [];\n\n    for (const file of patch.files) {\n        const fileDiff = extractFileDiffForFile(patch.patch_content, file);\n        if (fileDiff == null) {\n            // patch.files lists this path, but patch_content doesn't reference it.\n            // This commonly happens after a generator rename (resolvedFiles pre-pass\n            // updated patch.files to the NEW path, but patch_content still uses the\n            // OLD path). Treat as unlocatable so the caller falls back to the legacy\n            // cumulative-file diff for this file.\n            unlocatableFiles.push(file);\n            continue;\n        }\n\n        const hunksRaw = parseHunks(fileDiff).map(normalizeHunkBody);\n        // M1: drop hunks whose body is empty after trimming or whose body\n        // line counts don't match the `@@` header. Either is a sign of a\n        // malformed/truncated diff; passing them downstream into\n        // `locateHunksInOurs` would yield garbage offsets and silently\n        // corrupt the overlay.\n        const hunks = hunksRaw.filter((h) => {\n            if (h.lines.length === 0) return false;\n            let ctx = 0, rm = 0, add = 0;\n            for (const ln of h.lines) {\n                if (ln.type === \"context\") ctx++;\n                else if (ln.type === \"remove\") rm++;\n                else if (ln.type === \"add\") add++;\n            }\n            return ctx + rm === h.oldCount && ctx + add === h.newCount;\n        });\n        if (hunks.length === 0) {\n            // If parseHunks returned hunks but none survived the body check,\n            // signal unlocatable so the caller falls back to cumulative diff.\n            if (hunksRaw.length > 0) unlocatableFiles.push(file);\n            continue;\n        }\n\n        const currentGen = await getCurrentGenContent(file);\n        const workingTree = await getWorkingTreeContent(file);\n\n        // Determine whether the patch is a pure new-file patch (no remove lines\n        // anywhere). True new-file patches have all hunks with oldCount === 0.\n        const isPureNewFile = hunks.every((h) => h.oldCount === 0);\n        const isPureDelete = hunks.every((h) => h.newCount === 0);\n\n        // New-file patch: file didn't exist in currentGen. Only valid if patch is\n        // genuinely a new-file patch — otherwise we may be in the ghost case\n        // (currentGen tree unreachable for a file the patch knows existed).\n        if (currentGen == null) {\n            if (!isPureNewFile) {\n                unlocatableFiles.push(file);\n                continue;\n            }\n            if (workingTree == null) continue;\n            fragments.push(synthesizeNewFileDiff(file, workingTree));\n            continue;\n        }\n\n        // Pure-new-file patch where currentGen ALREADY has the file: the\n        // user-owned bundling case (a previous generation commit bundled\n        // the customer's file into the gen tree via `git add -A`). Compare full\n        // contents directly — anchoring an empty `oldSide` would over-grab.\n        // If contents match → no contribution since last cycle. If they\n        // differ → customer modified, emit a full-file diff.\n        if (isPureNewFile) {\n            if (workingTree == null) {\n                // File deleted in working tree → emit deletion diff.\n                fragments.push(synthesizeDeleteFileDiff(file, currentGen));\n                continue;\n            }\n            if (workingTree === currentGen) {\n                // No change since bundling — no contribution.\n                continue;\n            }\n            const fullDiff = await unifiedDiff(currentGen, workingTree, file);\n            if (fullDiff && fullDiff.trim()) fragments.push(fullDiff);\n            continue;\n        }\n\n        // Deleted in working tree: file existed in currentGen.\n        if (workingTree == null) {\n            if (!isPureDelete) {\n                unlocatableFiles.push(file);\n                continue;\n            }\n            fragments.push(synthesizeDeleteFileDiff(file, currentGen));\n            continue;\n        }\n\n        const currentGenLines = splitLines(currentGen);\n        const workingTreeLines = splitLines(workingTree);\n\n        const locInCurrentGenRaw = locateHunksInOurs(hunks, currentGenLines);\n        const locInWorkingTreeRaw = locateHunksInOurs(hunks, workingTreeLines);\n\n        if (locInCurrentGenRaw == null || locInWorkingTreeRaw == null) {\n            unlocatableFiles.push(file);\n            continue;\n        }\n\n        // HybridReconstruction.computeOursSpan returns the context\n        // count when trailing context is empty, which doesn't account for\n        // remove/add lines. Re-derive span by content matching with a\n        // domain hint: currentGen is expected to look like the patch's \"old\"\n        // side (pre-patch); workingTree is expected to look like the \"new\"\n        // side (post-patch). The hint disambiguates pure-insertion hunks\n        // where oldSide is a prefix of newSide and both fit by coincidence.\n        //\n        // If ANY hunk fails to resolve (neither side fits OURS at the\n        // anchor), mark the file unlocatable so the caller falls back to a\n        // cumulative diff. Per-patch isolation is no longer honest here:\n        // the previous fallthrough returned a raw span that silently\n        // truncated `+` lines on overlay.\n        const locInCurrentGen: LocatedHunk[] = [];\n        const locInWorkingTree: LocatedHunk[] = [];\n        let spanResolutionFailed = false;\n        for (let i = 0; i < locInCurrentGenRaw.length; i++) {\n            const cg = resolveSpan(locInCurrentGenRaw[i]!, currentGenLines, \"old\");\n            const wt = resolveSpan(locInWorkingTreeRaw[i]!, workingTreeLines, \"new\");\n            if (cg === null || wt === null) {\n                spanResolutionFailed = true;\n                break;\n            }\n            locInCurrentGen.push(cg);\n            locInWorkingTree.push(wt);\n        }\n        if (spanResolutionFailed) {\n            unlocatableFiles.push(file);\n            continue;\n        }\n\n        // Overlay each region from working tree onto currentGen.\n        const overlay = overlayRegions(\n            currentGenLines,\n            locInCurrentGen,\n            workingTreeLines,\n            locInWorkingTree\n        );\n\n        // M2: overlay returned null → invariant violation (mismatched\n        // anchored hunk counts). Signal unlocatable so caller falls back\n        // to cumulative; do NOT silently treat as \"no contribution\".\n        if (overlay === null) {\n            unlocatableFiles.push(file);\n            continue;\n        }\n\n        if (overlay === currentGen) {\n            // Patch contributed nothing in this file — customer reverted or absorbed.\n            continue;\n        }\n\n        const fileUnifiedDiff = await unifiedDiff(currentGen, overlay, file);\n        if (fileUnifiedDiff && fileUnifiedDiff.trim()) {\n            fragments.push(fileUnifiedDiff);\n        }\n    }\n\n    return {\n        diff: fragments.join(\"\"),\n        unlocatableFiles\n    };\n}\n\n/**\n * Combine a per-patch diff with a cumulative-diff fallback for any files\n * whose hunks couldn't be anchored. This is the helper used by both\n * `commands/resolve.ts` and `ReplayService.preGenerationRebase` to ensure\n * unlocatable files don't silently drop the patch when the locatable\n * subset's per-patch diff is empty.\n *\n * Algorithm:\n *   1. Run per-patch diff on `patch.files`.\n *   2. If `unlocatableFiles` is non-empty, run cumulative diff scoped to\n *      ONLY those unlocatable files via `runCumulativeDiff(files)`.\n *   3. Concatenate the two. Return null if the cumulative invocation fails.\n *\n * Returns:\n *   - `{ diff, hadFallback }` where `diff` may be empty (true patch revert)\n *     and `hadFallback` indicates whether the cumulative subset was used.\n *   - `null` if the cumulative invocation explicitly failed (callers should\n *     skip the patch — same semantics as a missing diff).\n */\nexport async function computePerPatchDiffWithFallback(\n    patch: { patch_content: string; files: string[] },\n    getCurrentGenContent: (file: string) => Promise<string | null>,\n    getWorkingTreeContent: (file: string) => Promise<string | null>,\n    runCumulativeDiff: (files: string[]) => Promise<string | null>\n): Promise<{ diff: string; hadFallback: boolean; fallbackFiles: string[] } | null> {\n    const ppDiff = await computePerPatchDiff(\n        patch,\n        getCurrentGenContent,\n        getWorkingTreeContent\n    );\n\n    if (ppDiff.unlocatableFiles.length === 0) {\n        return { diff: ppDiff.diff, hadFallback: false, fallbackFiles: [] };\n    }\n\n    // Run cumulative diff scoped to ONLY the unlocatable files. Merging\n    // them with the per-patch diff for locatable files preserves the\n    // surgical scoping for files we COULD anchor, while still capturing\n    // contributions for files we couldn't.\n    const cumulative = await runCumulativeDiff(ppDiff.unlocatableFiles);\n    if (cumulative === null) {\n        return null;\n    }\n\n    const merged = ppDiff.diff + (cumulative.trim() ? cumulative : \"\");\n    return { diff: merged, hadFallback: true, fallbackFiles: ppDiff.unlocatableFiles };\n}\n\nfunction splitLines(content: string): string[] {\n    // Match parseHunks's line semantics: split on \"\\n\", preserving trailing-newline behavior.\n    return content.split(\"\\n\");\n}\n\n/**\n * Determine the correct `oursSpan` for an anchored hunk by content-matching.\n *\n * `prefer` tells us which side of the patch we EXPECT OURS to look like:\n *   - `\"old\"`  → OURS is patch's BASE (e.g. currentGen, pre-patch state).\n *                Default to `oldCount` when both sides fit.\n *   - `\"new\"`  → OURS is patch's THEIRS (e.g. workingTree post-apply).\n *                Default to `newCount` when both sides fit.\n *\n * For pure-insertion hunks (no remove lines), `oldSide` is a strict prefix\n * of `newSide`. Both sides will fit whenever oldSide does AND the next OURS\n * lines coincide with the patch's added lines — common for generic adds\n * like `}` or empty lines. Without the `prefer` hint, picking the longer\n * (or shorter) match unconditionally over-includes (or under-includes)\n * sibling-patch content. With `prefer`, we use the caller's domain\n * knowledge to pick the right span.\n *\n * Asymmetric null-return:\n *   - `prefer === \"new\"` (workingTree): if neither side fits, the patch's\n *     idea of the customer's content is stale (customer restructured the\n *     region past either shape the hunk depicts). Return `null` so the\n *     caller routes to the cumulative-diff fallback — previously this\n *     fell through to a stale `oursSpan`, producing an overlay that\n *     dropped `+` lines while keeping `-` lines (silent customer-\n *     customization loss; smallest-ai).\n *   - `prefer === \"old\"` (currentGen): keep the best-effort fallthrough.\n *     The generator commonly restructures the region during a regen, in\n *     which case currentGen matches neither side, but the\n *     trailing-context-anchored position from `HybridReconstruction` is\n *     still the right place to splice in workingTree's content. Returning\n *     null here would over-fire for every conflicting regen and collapse\n *     disjoint-region patches into a single cumulative diff.\n */\nfunction resolveSpan(\n    loc: LocatedHunk,\n    oursLines: string[],\n    prefer: \"old\" | \"new\"\n): LocatedHunk | null {\n    const { hunk, oursOffset } = loc;\n\n    // Build the expected \"old\" content sequence from the hunk: context + remove lines, in order.\n    const oldSide: string[] = [];\n    const newSide: string[] = [];\n    for (const line of hunk.lines) {\n        if (line.type === \"context\") {\n            oldSide.push(line.content);\n            newSide.push(line.content);\n        } else if (line.type === \"remove\") {\n            oldSide.push(line.content);\n        } else if (line.type === \"add\") {\n            newSide.push(line.content);\n        }\n    }\n\n    const oldFits = sequenceMatches(oldSide, oursLines, oursOffset);\n    const newFits = sequenceMatches(newSide, oursLines, oursOffset);\n\n    if (prefer === \"old\") {\n        if (oldFits) return { ...loc, oursSpan: hunk.oldCount };\n        if (newFits) return { ...loc, oursSpan: hunk.newCount };\n        // currentGen diverged from both sides (generator restructured this\n        // region in the regen). Fall through to the raw computeOursSpan\n        // from HybridReconstruction — trailing-context anchoring still\n        // gives a positionally-correct splice point.\n        return loc;\n    }\n\n    // prefer === \"new\"\n    if (newFits) return { ...loc, oursSpan: hunk.newCount };\n    if (oldFits) return { ...loc, oursSpan: hunk.oldCount };\n    return null;\n}\n\nfunction sequenceMatches(needle: string[], haystack: string[], offset: number): boolean {\n    if (offset + needle.length > haystack.length) return false;\n    for (let i = 0; i < needle.length; i++) {\n        if (haystack[offset + i] !== needle[i]) return false;\n    }\n    return true;\n}\n\n/**\n * Reconstruct currentGen with each anchored region replaced by the\n * corresponding region from working tree. Returns the joined string, or\n * `null` to signal an irrecoverable inconsistency (caller should treat as\n * unlocatable rather than silently produce a corrupt overlay).\n */\nfunction overlayRegions(\n    currentGenLines: string[],\n    locInCurrentGen: LocatedHunk[],\n    workingTreeLines: string[],\n    locInWorkingTree: LocatedHunk[]\n): string | null {\n    // Same hunks parsed against both, lengths must match. If they don't,\n    // something invariant-violating happened — signal failure rather than\n    // returning currentGen (which the caller would interpret as \"patch\n    // contributed nothing\" and silently drop the patch).\n    if (locInCurrentGen.length !== locInWorkingTree.length) {\n        return null;\n    }\n    const out: string[] = [];\n    let cursor = 0;\n    for (let i = 0; i < locInCurrentGen.length; i++) {\n        const cg = locInCurrentGen[i]!;\n        const wt = locInWorkingTree[i]!;\n        // Gap before this hunk: keep currentGen content\n        if (cg.oursOffset > cursor) {\n            out.push(...currentGenLines.slice(cursor, cg.oursOffset));\n        }\n        // Replace currentGen's region with working tree's region for this hunk\n        out.push(...workingTreeLines.slice(wt.oursOffset, wt.oursOffset + wt.oursSpan));\n        cursor = cg.oursOffset + cg.oursSpan;\n    }\n    // Trailing gap: keep currentGen content\n    if (cursor < currentGenLines.length) {\n        out.push(...currentGenLines.slice(cursor));\n    }\n    return out.join(\"\\n\");\n}\n\n/**\n * Compute a unified diff between two strings using `git diff --no-index`.\n * Headers are rewritten to `a/<file>` / `b/<file>` for compatibility with\n * `git apply` and the rest of the codebase's patch handling.\n */\nexport async function unifiedDiff(beforeContent: string, afterContent: string, filePath: string): Promise<string> {\n    if (beforeContent === afterContent) return \"\";\n\n    const tmp = await mkdtemp(join(tmpdir(), \"fern-replay-pp-\"));\n    try {\n        const beforePath = join(tmp, \"before\");\n        const afterPath = join(tmp, \"after\");\n        await writeFile(beforePath, beforeContent, \"utf-8\");\n        await writeFile(afterPath, afterContent, \"utf-8\");\n\n        const raw = await runGitDiffNoIndex(beforePath, afterPath);\n        if (!raw.trim()) return \"\";\n\n        return rewriteDiffHeaders(raw, filePath);\n    } finally {\n        await rm(tmp, { recursive: true, force: true });\n    }\n}\n\nfunction runGitDiffNoIndex(beforePath: string, afterPath: string): Promise<string> {\n    return new Promise((resolve, reject) => {\n        const proc = spawn(\"git\", [\"diff\", \"--no-index\", \"--\", beforePath, afterPath]);\n        let stdout = \"\";\n        let stderr = \"\";\n        proc.stdout.on(\"data\", (d: Buffer) => (stdout += d.toString()));\n        proc.stderr.on(\"data\", (d: Buffer) => (stderr += d.toString()));\n        proc.on(\"close\", (code) => {\n            // git diff --no-index returns 0 (no diff) or 1 (diff present) on success;\n            // anything else is a real error.\n            if (code === 0 || code === 1) resolve(stdout);\n            else reject(new Error(`git diff --no-index failed (code ${code}): ${stderr}`));\n        });\n    });\n}\n\n/**\n * Rewrite the `diff --git`, `---`, and `+++` headers from temp paths to\n * `a/<file>` and `b/<file>` so the diff applies cleanly via `git apply`.\n */\nfunction rewriteDiffHeaders(raw: string, filePath: string): string {\n    const lines = raw.split(\"\\n\");\n    const out: string[] = [];\n    let seenFirstHeader = false;\n    for (const line of lines) {\n        if (line.startsWith(\"diff --git \")) {\n            out.push(`diff --git a/${filePath} b/${filePath}`);\n            seenFirstHeader = true;\n            continue;\n        }\n        if (!seenFirstHeader) {\n            // Skip preamble before first diff header\n            continue;\n        }\n        if (line.startsWith(\"--- \")) {\n            out.push(`--- a/${filePath}`);\n            continue;\n        }\n        if (line.startsWith(\"+++ \")) {\n            out.push(`+++ b/${filePath}`);\n            continue;\n        }\n        out.push(line);\n    }\n    return out.join(\"\\n\");\n}\n\nexport function synthesizeNewFileDiff(file: string, content: string): string {\n    const lines = content.split(\"\\n\");\n    // Drop trailing empty element if file ends with newline (matches git's diff format).\n    const hasTrailingNewline = content.endsWith(\"\\n\");\n    const bodyLines = hasTrailingNewline ? lines.slice(0, -1) : lines;\n    const header = [\n        `diff --git a/${file} b/${file}`,\n        \"new file mode 100644\",\n        \"--- /dev/null\",\n        `+++ b/${file}`,\n        `@@ -0,0 +1,${bodyLines.length} @@`,\n    ].join(\"\\n\");\n    const body = bodyLines.map((l) => `+${l}`).join(\"\\n\");\n    const trailer = hasTrailingNewline ? \"\" : \"\\n\\\\ No newline at end of file\";\n    return header + \"\\n\" + body + trailer + \"\\n\";\n}\n\nexport function synthesizeDeleteFileDiff(file: string, content: string): string {\n    const lines = content.split(\"\\n\");\n    const hasTrailingNewline = content.endsWith(\"\\n\");\n    const bodyLines = hasTrailingNewline ? lines.slice(0, -1) : lines;\n    const header = [\n        `diff --git a/${file} b/${file}`,\n        \"deleted file mode 100644\",\n        `--- a/${file}`,\n        \"+++ /dev/null\",\n        `@@ -1,${bodyLines.length} +0,0 @@`,\n    ].join(\"\\n\");\n    const body = bodyLines.map((l) => `-${l}`).join(\"\\n\");\n    const trailer = hasTrailingNewline ? \"\" : \"\\n\\\\ No newline at end of file\";\n    return header + \"\\n\" + body + trailer + \"\\n\";\n}\n","import { minimatch } from \"minimatch\";\nimport type { GitClient } from \"../git/GitClient.js\";\nimport type { StoredPatch } from \"../types.js\";\n\n/**\n * Inputs for one ownership resolution call.\n *\n * `originalFileName` is the pre-rename path used when the generator moved\n * the file between generations — tree lookups at ancestor generations need\n * the original path because that's where the generator produced the content.\n *\n * `warnedGens` and `warnings` are mutable accumulators threaded across calls\n * within a single replay run. The canonical path appends a one-time warning\n * when a base generation tree is unreachable (shallow clone / aggressive GC)\n * so the customer sees a single message per affected base, not one per file.\n */\nexport interface OwnershipContext {\n    readonly file: string;\n    readonly originalFileName?: string;\n    readonly patch: StoredPatch;\n    readonly currentGenSha: string;\n    readonly fernignorePatterns: readonly string[];\n    readonly warnedGens: Set<string>;\n    readonly warnings: string[];\n}\n\n/**\n * Single canonical home for \"is this file user-owned?\" resolution. Every\n * service-level check (preGenerationRebase, rebasePatches, trimAbsorbedFiles)\n * routes through `resolveCanonical`.\n *\n * The earlier `rebasePatches` inline variant (`resolveAtCurrentGen`) was\n * collapsed under FER-10386 once pre-flight investigation showed its\n * narrower fall-back was harmless on every reachable scenario but worse\n * on the unreachable-base-tree case. See `docs/known-divergences.md`\n * entry 5 for the closed-out divergence record.\n */\nexport class FileOwnership {\n    constructor(private readonly git: GitClient) {}\n\n    /**\n     * Canonical resolution. Returns true if `file` is user-owned per:\n     *\n     *   1. `patch.user_owned === true` — authoritative, persisted flag.\n     *   2. `file === \".fernignore\"` — always user-owned.\n     *   3. File matches a `.fernignore` pattern (via minimatch).\n     *   4. Patch content shows `--- /dev/null` for this file (legacy-safe\n     *      signal for patches predating `user_owned` or whose flag was lost).\n     *   5. Tree-based check against `patch.base_generation` when reachable\n     *      AND distinct from `currentGenSha`. Unreachable base → conservative\n     *      user-owned (silent-absorption safety net), with a one-time warning\n     *      per base SHA.\n     *   6. Final fallback: check `currentGenSha` when no usable base exists\n     *      (legacy one-gen lockfile).\n     */\n    async resolveCanonical(ctx: OwnershipContext): Promise<boolean> {\n        const { file, originalFileName, patch, currentGenSha, fernignorePatterns, warnedGens, warnings } = ctx;\n        if (patch.user_owned) return true;\n        if (file === \".fernignore\") return true;\n        if (fernignorePatterns.some((p) => file === p || minimatch(file, p))) return true;\n\n        if (fileIsCreationInPatchContent(patch.patch_content, originalFileName ?? file)) {\n            return true;\n        }\n\n        const base = patch.base_generation;\n        if (base && base !== currentGenSha) {\n            const reachable =\n                (await this.git.commitExists(base)) || (await this.git.treeExists(base));\n            if (!reachable) {\n                if (!warnedGens.has(base)) {\n                    warnedGens.add(base);\n                    warnings.push(\n                        `Base generation ${base.slice(0, 7)} is unreachable (shallow clone or pruned history). ` +\n                            `Treating affected files as user-owned to avoid silent data loss. ` +\n                            `Run \\`git fetch --unshallow\\` or avoid \\`git gc --prune\\` to restore full history.`\n                    );\n                }\n                return true;\n            }\n            return (await this.git.showFile(base, originalFileName ?? file)) === null;\n        }\n\n        return (await this.git.showFile(currentGenSha, originalFileName ?? file)) === null;\n    }\n}\n\n/**\n * Returns true if `file`'s diff section in `patchContent` starts with\n * `--- /dev/null`, meaning the patch introduces this file (user creation).\n *\n * Pure parser — no git access. Used as a legacy-safe fallback when\n * `patch.user_owned` is absent or cleared.\n */\nexport function fileIsCreationInPatchContent(patchContent: string, file: string): boolean {\n    const lines = patchContent.split(\"\\n\");\n    let inFileSection = false;\n    for (const line of lines) {\n        if (line.startsWith(\"diff --git \")) {\n            inFileSection = line.includes(` b/${file}`) || line.endsWith(` b/${file}`);\n            continue;\n        }\n        if (inFileSection && line.startsWith(\"--- \")) {\n            return line === \"--- /dev/null\";\n        }\n    }\n    return false;\n}\n","import type { ReplayService, ReplayOptions, ReplayPreparation, ReplayReport } from \"../ReplayService.js\";\nimport type { Flow } from \"./Flow.js\";\n\n/**\n * No prior lockfile exists. This run records the initial generation and\n * writes the lockfile. No patch detection or application happens — there's\n * nothing to compare against.\n */\nexport class FirstGenerationFlow implements Flow {\n    constructor(private readonly service: ReplayService) {}\n\n    async prepare(options?: ReplayOptions): Promise<ReplayPreparation> {\n        if (options?.dryRun) {\n            // Dry-run may be called on a repo with no commits yet (truly first-gen).\n            // `git rev-parse HEAD` fails in that case; fall back to empty string.\n            const headSha = await this.service.git\n                .exec([\"rev-parse\", \"HEAD\"])\n                .then((s) => s.trim())\n                .catch(() => \"\");\n            return {\n                flow: \"first-generation\",\n                previousGenerationSha: null,\n                currentGenerationSha: headSha,\n                _prepared: {\n                    kind: \"terminal\",\n                    flow: \"first-generation\",\n                    preparedReport: firstGenerationReport(),\n                },\n            };\n        }\n\n        const commitOpts = options\n            ? {\n                  cliVersion: options.cliVersion ?? \"unknown\",\n                  generatorVersions: options.generatorVersions ?? {},\n              }\n            : undefined;\n\n        await this.service.committer.commitGeneration(\"Initial SDK generation\", commitOpts);\n        const genRecord = await this.service.committer.createGenerationRecord(commitOpts);\n        // Phase 1: in-memory only. Disk save deferred to apply().\n        this.service.lockManager.initializeInMemory(genRecord);\n\n        return {\n            flow: \"first-generation\",\n            previousGenerationSha: null,\n            currentGenerationSha: genRecord.commit_sha,\n            _prepared: {\n                kind: \"active\",\n                flow: \"first-generation\",\n                patchesToApply: [],\n                newPatchIds: new Set(),\n                detectorWarnings: [],\n                detectorDegraded: [],\n                revertedCount: 0,\n                genSha: genRecord.commit_sha,\n                optionsSnapshot: options,\n            },\n        };\n    }\n\n    async apply(_prep: ReplayPreparation): Promise<ReplayReport> {\n        // Save the in-memory lockfile to disk. Matches today's behavior of\n        // `lockManager.initialize(genRecord)` which internally calls save().\n        // No replay commit in first-gen — the lockfile file lands untracked\n        // and is committed by the next cycle's [fern-replay] commit.\n        this.service.lockManager.setFernignorePatterns(this.service.readFernignorePatterns());\n        this.service.lockManager.save();\n        return firstGenerationReport();\n    }\n}\n\n/**\n * Empty report shape returned by both the dry-run terminal and the active\n * apply path. Defined here (not on the service) because both this flow's\n * prepare and apply construct it identically.\n */\nexport function firstGenerationReport(): ReplayReport {\n    return {\n        flow: \"first-generation\",\n        patchesDetected: 0,\n        patchesApplied: 0,\n        patchesWithConflicts: 0,\n        patchesSkipped: 0,\n        conflicts: [],\n    };\n}\n","import { LockfileNotFoundError } from \"../LockfileManager.js\";\nimport type { ApplyOptions, ReplayService, ReplayOptions, ReplayPreparation, ReplayReport } from \"../ReplayService.js\";\nimport type { Flow } from \"./Flow.js\";\n\n/**\n * `--no-replay` mode: commit the generation, set the replay-skipped marker\n * in the lockfile, return early. The next normal run sees the marker and\n * skips revert detection in pre-rebase (patches are stale-base by definition\n * and haven't been applied).\n */\nexport class SkipApplicationFlow implements Flow {\n    constructor(private readonly service: ReplayService) {}\n\n    async prepare(options?: ReplayOptions): Promise<ReplayPreparation> {\n        const commitOpts = options\n            ? {\n                  cliVersion: options.cliVersion ?? \"unknown\",\n                  generatorVersions: options.generatorVersions ?? {},\n              }\n            : undefined;\n\n        await this.service.committer.commitGeneration(\"Update SDK (replay skipped)\", commitOpts);\n\n        // Clean up stale conflict markers from a previous crashed run.\n        await this.service.cleanupStaleConflictMarkers();\n\n        const genRecord = await this.service.committer.createGenerationRecord(commitOpts);\n\n        let previousGenerationSha: string | null = null;\n        try {\n            const lock = this.service.lockManager.read();\n            previousGenerationSha = lock.current_generation ?? null;\n            this.service.lockManager.addGeneration(genRecord);\n        } catch (error) {\n            if (error instanceof LockfileNotFoundError) {\n                this.service.lockManager.initializeInMemory(genRecord);\n            } else {\n                throw error;\n            }\n        }\n\n        this.service.lockManager.setReplaySkippedAt(new Date().toISOString());\n\n        return {\n            flow: \"skip-application\",\n            previousGenerationSha,\n            currentGenerationSha: genRecord.commit_sha,\n            _prepared: {\n                kind: \"active\",\n                flow: \"skip-application\",\n                patchesToApply: [],\n                newPatchIds: new Set(),\n                detectorWarnings: [],\n                detectorDegraded: [],\n                revertedCount: 0,\n                genSha: genRecord.commit_sha,\n                optionsSnapshot: options,\n            },\n        };\n    }\n\n    async apply(_prep: ReplayPreparation, options?: ApplyOptions): Promise<ReplayReport> {\n        this.service.lockManager.setFernignorePatterns(this.service.readFernignorePatterns());\n        this.service.lockManager.save();\n        const credentialWarnings = [...this.service.lockManager.warnings];\n\n        // Commit the lockfile update so it's pushed with the branch.\n        // Without this, the marker and generation record stay in the\n        // working tree and are lost when GithubStep pushes.\n        if (!options?.stageOnly) {\n            await this.service.committer.commitReplay(0);\n        } else {\n            await this.service.committer.stageAll();\n        }\n\n        return {\n            flow: \"skip-application\",\n            patchesDetected: 0,\n            patchesApplied: 0,\n            patchesWithConflicts: 0,\n            patchesSkipped: 0,\n            conflicts: [],\n            warnings: credentialWarnings.length > 0 ? credentialWarnings : undefined,\n        };\n    }\n}\n","import type {\n    ApplyOptions,\n    ReplayService,\n    ReplayOptions,\n    ReplayPreparation,\n    ReplayReport,\n} from \"../ReplayService.js\";\nimport { assertActive, computeCommitBuckets, dedupeDegradedReasons } from \"../ReplayService.js\";\nimport type { ReplayResult } from \"../types.js\";\nimport type { Flow } from \"./Flow.js\";\n\n/**\n * Lockfile exists with zero tracked patches. Only newly detected patches\n * apply. Simpler than NormalRegeneration because there's no pre-rebase work\n * (no existing patches to refresh).\n */\nexport class NoPatchesFlow implements Flow {\n    constructor(private readonly service: ReplayService) {}\n\n    async prepare(options?: ReplayOptions): Promise<ReplayPreparation> {\n        const preLock = this.service.lockManager.read();\n        const previousGenerationSha = preLock.current_generation ?? null;\n\n        let { patches: newPatches, revertedPatchIds } = await this.service.detector.detectNewPatches();\n        // Snapshot of warnings available at detection time. Re-merged with\n        // service-level warnings (populated during rebase) when the final report\n        // is built in phase 2.\n        const detectorWarnings = [...this.service.detector.warnings];\n        const detectorDegraded = [...this.service.detector.degradedReasons];\n\n        if (options?.dryRun) {\n            const dryRunWarnings = [...detectorWarnings, ...this.service.warnings];\n            const dryRunDegraded = dedupeDegradedReasons([...detectorDegraded, ...this.service.degradedReasons]);\n            const preparedReport: ReplayReport = {\n                flow: \"no-patches\",\n                patchesDetected: newPatches.length,\n                patchesApplied: 0,\n                patchesWithConflicts: 0,\n                patchesSkipped: 0,\n                patchesReverted: revertedPatchIds.length,\n                conflicts: [],\n                wouldApply: newPatches,\n                warnings: dryRunWarnings.length > 0 ? dryRunWarnings : undefined,\n                degraded: dryRunDegraded.length > 0 ? true : undefined,\n                degradedReasons: dryRunDegraded.length > 0 ? dryRunDegraded : undefined,\n            };\n            const headSha = await this.service.git\n                .exec([\"rev-parse\", \"HEAD\"])\n                .then((s) => s.trim())\n                .catch(() => \"\");\n            return {\n                flow: \"no-patches\",\n                previousGenerationSha,\n                currentGenerationSha: headSha,\n                _prepared: {\n                    kind: \"terminal\",\n                    flow: \"no-patches\",\n                    preparedReport,\n                },\n            };\n        }\n\n        // Pre-apply absorption: drop patches whose net customer effect (from\n        // currentGen → HEAD) on all of their files is empty. This mirrors the\n        // empty-diff branch of preGenerationRebase which runs only on the\n        // normal-regeneration path — without this, flows diverge when the\n        // applicator cannot fully cancel a create+delete sequence (parity\n        // with normal-regen's revert-detection path).\n        {\n            const preCurrentGen = preLock.current_generation;\n            const uniqueFiles = [...new Set(newPatches.flatMap((p) => p.files))];\n            const absorbedFiles = new Set<string>();\n            for (const file of uniqueFiles) {\n                const diff = await this.service.git\n                    .exec([\"diff\", preCurrentGen, \"HEAD\", \"--\", file])\n                    .catch(() => null);\n                if (diff !== null && !diff.trim()) {\n                    absorbedFiles.add(file);\n                }\n            }\n            if (absorbedFiles.size > 0) {\n                newPatches = newPatches.filter(\n                    (p) => p.files.length === 0 || !p.files.every((f) => absorbedFiles.has(f))\n                );\n            }\n        }\n\n        // Remove reverted patches from lockfile (after dry-run check to avoid mutating state)\n        for (const id of revertedPatchIds) {\n            try {\n                this.service.lockManager.removePatch(id);\n            } catch {\n                // patch may not be in lockfile\n            }\n        }\n\n        const commitOpts = options\n            ? {\n                  cliVersion: options.cliVersion ?? \"unknown\",\n                  generatorVersions: options.generatorVersions ?? {},\n              }\n            : undefined;\n\n        await this.service.committer.commitGeneration(\"Update SDK\", commitOpts);\n\n        // Clean up stale conflict markers from a previous crashed run.\n        await this.service.cleanupStaleConflictMarkers();\n\n        const genRecord = await this.service.committer.createGenerationRecord(commitOpts);\n\n        // Add generation to lockfile BEFORE applying patches so the applicator\n        // can read the current generation's tree hash for rename detection.\n        this.service.lockManager.addGeneration(genRecord);\n\n        return {\n            flow: \"no-patches\",\n            previousGenerationSha,\n            currentGenerationSha: genRecord.commit_sha,\n            _prepared: {\n                kind: \"active\",\n                flow: \"no-patches\",\n                patchesToApply: newPatches,\n                newPatchIds: new Set(newPatches.map((p) => p.id)),\n                detectorWarnings,\n                detectorDegraded,\n                revertedCount: revertedPatchIds.length,\n                genSha: genRecord.commit_sha,\n                optionsSnapshot: options,\n            },\n        };\n    }\n\n    async apply(prep: ReplayPreparation, options?: ApplyOptions): Promise<ReplayReport> {\n        assertActive(prep);\n        const newPatches = prep._prepared.patchesToApply;\n        const detectorWarnings = prep._prepared.detectorWarnings;\n        const genSha = prep._prepared.genSha;\n\n        let results: ReplayResult[] = [];\n        if (newPatches.length > 0) {\n            results = await this.service.applicator.applyPatches(newPatches);\n            this.service._lastApplyResults = results;\n\n            // Surface \"dropped context line\" warnings — see NormalRegenerationFlow.\n            this.service.recordDroppedContextLineWarnings(results);\n\n            // Surface \"unreachable base\" warnings (INC-866) — see NormalRegenerationFlow.\n            this.service.recordUnreachableBaseWarnings(results);\n\n            // Strip conflict markers from conflicting files so the commit is clean.\n            this.service.revertConflictingFiles(results);\n\n            // Mark conflict patches as unresolved on the patch objects before adding to lockfile.\n            for (const result of results) {\n                if (result.status === \"conflict\") {\n                    result.patch.status = \"unresolved\";\n                }\n            }\n        }\n\n        // Rebase cleanly applied patches to the current generation.\n        // This prevents recurring conflicts on subsequent regenerations.\n        const rebaseCounts = await this.service.rebasePatches(results, genSha);\n\n        // Save lockfile BEFORE commit — lockfile is source of truth.\n        for (const patch of newPatches) {\n            if (!rebaseCounts.absorbedPatchIds.has(patch.id)) {\n                this.service.lockManager.addPatch(patch);\n            }\n        }\n        this.service.lockManager.setFernignorePatterns(this.service.readFernignorePatterns());\n        this.service.lockManager.save();\n        this.service.warnings.push(...this.service.lockManager.warnings);\n\n        // Preserve today's L422 guard: when no new patches were detected, neither\n        // commitReplay nor stageAll runs. The in-memory `addGeneration` still\n        // happened in phase 1; the save just above persisted it.\n        if (newPatches.length > 0) {\n            if (!options?.stageOnly) {\n                // Count only cleanly applied patches for the commit message.\n                const appliedCount = results.filter((r) => r.status === \"applied\").length;\n                const buckets = computeCommitBuckets(results, rebaseCounts.absorbedPatchIds, newPatches);\n                await this.service.committer.commitReplay(appliedCount, newPatches, undefined, { buckets });\n            } else {\n                await this.service.committer.stageAll();\n            }\n        }\n\n        const warnings = [...detectorWarnings, ...this.service.warnings];\n        const degradedReasons = [...prep._prepared.detectorDegraded, ...this.service.degradedReasons];\n        return this.service.buildReport(\n            \"no-patches\",\n            newPatches,\n            results,\n            prep._prepared.optionsSnapshot,\n            warnings,\n            rebaseCounts,\n            undefined,\n            prep._prepared.revertedCount,\n            degradedReasons,\n        );\n    }\n}\n","import { isRevertCommit, parseRevertedMessage } from \"../git/CommitDetection.js\";\nimport type {\n    ApplyOptions,\n    ReplayService,\n    ReplayOptions,\n    ReplayPreparation,\n    ReplayReport,\n} from \"../ReplayService.js\";\nimport { assertActive, computeCommitBuckets, dedupeDegradedReasons } from \"../ReplayService.js\";\nimport type { Flow } from \"./Flow.js\";\n\n/**\n * The full regeneration pipeline:\n *\n *   pre-rebase → dedup → detect → apply → strip-markers → post-rebase → save → commit\n *\n * Pre-rebase runs BEFORE `commitGeneration` while HEAD has customer code.\n * Post-rebase runs AFTER `applyPatches` against the new generation tree.\n * The two phases share concerns (revert detection, content refresh, dedup,\n * user-owned classification) but operate on different reference states —\n * unifying them is tracked as FER-10387 (deferred post-GA).\n */\nexport class NormalRegenerationFlow implements Flow {\n    constructor(private readonly service: ReplayService) {}\n\n    async prepare(options?: ReplayOptions): Promise<ReplayPreparation> {\n        const preLock = this.service.lockManager.read();\n        const previousGenerationSha = preLock.current_generation ?? null;\n\n        if (options?.dryRun) {\n            const existingPatches = this.service.lockManager.getPatches();\n            const { patches: newPatches, revertedPatchIds: dryRunReverted } =\n                await this.service.detector.detectNewPatches();\n            const warnings = [...this.service.detector.warnings, ...this.service.warnings];\n            const dryRunDegraded = dedupeDegradedReasons([\n                ...this.service.detector.degradedReasons,\n                ...this.service.degradedReasons,\n            ]);\n            const allPatches = [...existingPatches, ...newPatches];\n            const preparedReport: ReplayReport = {\n                flow: \"normal-regeneration\",\n                patchesDetected: allPatches.length,\n                patchesApplied: 0,\n                patchesWithConflicts: 0,\n                patchesSkipped: 0,\n                patchesReverted: dryRunReverted.length,\n                conflicts: [],\n                wouldApply: allPatches,\n                warnings: warnings.length > 0 ? warnings : undefined,\n                degraded: dryRunDegraded.length > 0 ? true : undefined,\n                degradedReasons: dryRunDegraded.length > 0 ? dryRunDegraded : undefined,\n            };\n            const headSha = await this.service.git\n                .exec([\"rev-parse\", \"HEAD\"])\n                .then((s) => s.trim())\n                .catch(() => \"\");\n            return {\n                flow: \"normal-regeneration\",\n                previousGenerationSha,\n                currentGenerationSha: headSha,\n                _prepared: {\n                    kind: \"terminal\",\n                    flow: \"normal-regeneration\",\n                    preparedReport,\n                },\n            };\n        }\n\n        // Pre-generation rebase: update stale/modified patches while HEAD has customer code.\n        let existingPatches = this.service.lockManager.getPatches();\n        const preRebasePatchIds = new Set(existingPatches.map((p) => p.id));\n        const preRebaseCounts = await this.service.preGenerationRebase(existingPatches);\n\n        // Track which patches preGenRebase removed (user reverted → empty diff).\n        // These are needed to reconcile re-detected commits and revert commits after detection.\n        const postRebasePatchIds = new Set(this.service.lockManager.getPatches().map((p) => p.id));\n        const removedByPreRebase = existingPatches.filter(\n            (p) => preRebasePatchIds.has(p.id) && !postRebasePatchIds.has(p.id),\n        );\n\n        // Dedup patches by content hash after pre-generation rebase.\n        //\n        // **Consolidation, not preservation.** When two patches have\n        // byte-identical `patch_content`, they encode the SAME customer-side\n        // delta — neither captures its individual contribution. Applying\n        // both back-to-back at the next regen produces duplicated additions\n        // (e.g., the same wiring lines spliced into `__all__` twice) and\n        // syntactic corruption. The customer's *file* breaks, regardless of\n        // how clean the lockfile bookkeeping looks.\n        //\n        // PR #74's earlier \"preserve both with warning\" rule prioritized\n        // provenance preservation over functional correctness — empirically\n        // it produced the corruption we're now fixing. Per replay's actual\n        // contract (the customer's code stays in the file across N regens,\n        // automatically), the right move is to consolidate to ONE canonical\n        // patch (the most-recently-seen, by `patchesToCommit` order) and\n        // remove the others. Per-commit attribution is recoverable from\n        // `git log -- <file>`; corrupted code is not.\n        //\n        // True duplicates (rebase converging two incremental patches) are\n        // a special case of \"same content_hash\" — consolidating them is\n        // also right; nothing changes for those tests.\n        existingPatches = this.service.lockManager.getPatches();\n        const seenHashes = new Map<string, string>();\n        for (const p of existingPatches) {\n            // Only consolidate SYNTHETIC patches (empty `original_commit`).\n            // Real customer commits with distinct `original_commit` SHAs\n            // represent separate user intents that should keep per-commit\n            // attribution even if their `patch_content` converges to the\n            // same cumulative diff after preGenerationRebase. The\n            // duplicate-apply corruption case the dedup was designed to\n            // catch — two .fernignore patterns producing the same synthetic\n            // patch — keeps firing because those patches have empty\n            // `original_commit`. See FER-9983 H3.\n            if (!p.original_commit || p.original_commit === \"\") {\n                const priorPatchId = seenHashes.get(p.content_hash);\n                if (priorPatchId !== undefined) {\n                    this.service.lockManager.removePatch(p.id);\n                    this.service.warnings.push(\n                        `Consolidated patch ${p.id}` +\n                            ` into prior patch ${priorPatchId}: byte-identical patch_content. ` +\n                            `Lockfile collapsed to avoid duplicate-apply corruption on next regen.`,\n                    );\n                } else {\n                    seenHashes.set(p.content_hash, p.id);\n                }\n            }\n        }\n        existingPatches = this.service.lockManager.getPatches();\n\n        let { patches: newPatches, revertedPatchIds } = await this.service.detector.detectNewPatches();\n        // Snapshot of detector warnings; merged with service-level warnings\n        // (populated by preGenerationRebase + rebasePatches) when the final\n        // report is built in phase 2.\n        const detectorWarnings = [...this.service.detector.warnings];\n        const detectorDegraded = [...this.service.detector.degradedReasons];\n\n        // Post-detection reconciliation for patches removed by preGenerationRebase.\n        // When a user does git revert on a tracked customization, preGenRebase sees an\n        // empty diff and removes the patch. detectNewPatches then re-detects both the\n        // original commit AND the revert commit as new patches (since the lockfile no\n        // longer tracks the original). We need to:\n        // 1. Filter out re-detected originals (already handled by preGenRebase removal)\n        // 2. Filter out their corresponding revert commits\n        if (removedByPreRebase.length > 0) {\n            const removedOriginalCommits = new Set(removedByPreRebase.map((p) => p.original_commit));\n            const removedOriginalMessages = new Set(removedByPreRebase.map((p) => p.original_message));\n\n            newPatches = newPatches.filter((p) => {\n                // Filter out re-detected originals\n                if (removedOriginalCommits.has(p.original_commit)) return false;\n                // Filter out revert commits matching removed patches\n                if (isRevertCommit(p.original_message)) {\n                    const revertedMsg = parseRevertedMessage(p.original_message);\n                    if (revertedMsg && removedOriginalMessages.has(revertedMsg)) return false;\n                }\n                return true;\n            });\n        }\n\n        // Remove reverted patches from lockfile and filter from existing\n        for (const id of revertedPatchIds) {\n            try {\n                this.service.lockManager.removePatch(id);\n            } catch {\n                // patch may not be in lockfile\n            }\n        }\n        const revertedSet = new Set(revertedPatchIds);\n        existingPatches = existingPatches.filter((p) => !revertedSet.has(p.id));\n\n        const allPatches = [...existingPatches, ...newPatches];\n\n        const commitOpts = options\n            ? {\n                  cliVersion: options.cliVersion ?? \"unknown\",\n                  generatorVersions: options.generatorVersions ?? {},\n              }\n            : undefined;\n\n        await this.service.committer.commitGeneration(\"Update SDK\", commitOpts);\n\n        // Clean up stale conflict markers from a previous crashed run.\n        // HEAD is now the [fern-generated] commit with clean generated content.\n        await this.service.cleanupStaleConflictMarkers();\n\n        const genRecord = await this.service.committer.createGenerationRecord(commitOpts);\n\n        // Add generation to lockfile BEFORE applying patches so the applicator\n        // can read the current generation's tree hash for rename detection.\n        this.service.lockManager.addGeneration(genRecord);\n\n        return {\n            flow: \"normal-regeneration\",\n            previousGenerationSha,\n            currentGenerationSha: genRecord.commit_sha,\n            _prepared: {\n                kind: \"active\",\n                flow: \"normal-regeneration\",\n                patchesToApply: allPatches,\n                newPatchIds: new Set(newPatches.map((p) => p.id)),\n                preRebaseCounts,\n                detectorWarnings,\n                detectorDegraded,\n                revertedCount: revertedPatchIds.length,\n                genSha: genRecord.commit_sha,\n                optionsSnapshot: options,\n            },\n        };\n    }\n\n    async apply(prep: ReplayPreparation, options?: ApplyOptions): Promise<ReplayReport> {\n        assertActive(prep);\n        const allPatches = prep._prepared.patchesToApply;\n        const newPatchIds = prep._prepared.newPatchIds;\n        const detectorWarnings = prep._prepared.detectorWarnings;\n        const genSha = prep._prepared.genSha;\n\n        const results = await this.service.applicator.applyPatches(allPatches);\n        this.service._lastApplyResults = results;\n\n        // Surface \"dropped context line\" warnings — lines that appeared as\n        // unchanged context in customer's THEIRS but were silently deleted by\n        // the new generator output. diff3 sided with the deletion correctly,\n        // but the customer should know so they can re-add intentionally-kept\n        // lines if needed. See ThreeWayMerge.computeDroppedContextLines.\n        this.service.recordDroppedContextLineWarnings(results);\n\n        // Surface \"unreachable base\" warnings (INC-866) — customizations whose\n        // prior-generation tree is outside the clone window, which the pipeline\n        // misclassifies as new-file-both and can drop silently. Make it loud.\n        this.service.recordUnreachableBaseWarnings(results);\n\n        // Strip conflict markers from conflicting files so the commit is clean.\n        // Keeps the Generated (OURS) side, preserving clean patches' changes.\n        this.service.revertConflictingFiles(results);\n\n        // Mark conflict patches as unresolved on the patch objects before adding to lockfile.\n        // For new patches, this object mutation is what persists — they're appended to\n        // the lockfile via addPatch() below, carrying the status through.\n        for (const result of results) {\n            if (result.status === \"conflict\") {\n                result.patch.status = \"unresolved\";\n            }\n        }\n\n        // Rebase cleanly applied patches to the current generation.\n        const rebaseCounts = await this.service.rebasePatches(results, genSha);\n\n        // Save lockfile BEFORE commit — lockfile is source of truth.\n        const newPatches = allPatches.filter((p) => newPatchIds.has(p.id));\n        for (const patch of newPatches) {\n            if (!rebaseCounts.absorbedPatchIds.has(patch.id)) {\n                this.service.lockManager.addPatch(patch);\n            }\n        }\n\n        // Also mark existing (non-new) conflict patches as unresolved in the lockfile.\n        // This is a DISTINCT mutation path from the object mutation above — existing\n        // patches are already in the lockfile, and we need `updatePatch(id, {status})`\n        // to flag them. The try/catch handles the new-patch case where the id is not\n        // yet in the lockfile (object mutation above already set the status).\n        for (const result of results) {\n            if (result.status === \"conflict\") {\n                try {\n                    this.service.lockManager.markPatchUnresolved(result.patch.id);\n                } catch {\n                    // New patches already have status set via the object mutation above\n                }\n            }\n        }\n\n        this.service.lockManager.setFernignorePatterns(this.service.readFernignorePatterns());\n        this.service.lockManager.save();\n        this.service.warnings.push(...this.service.lockManager.warnings);\n\n        if (options?.stageOnly) {\n            await this.service.committer.stageAll();\n        } else {\n            // Always commit to persist the lockfile (which tracks unresolved patches).\n            // Count only cleanly applied patches for the commit message.\n            const appliedCount = results.filter((r) => r.status === \"applied\").length;\n            const buckets = computeCommitBuckets(results, rebaseCounts.absorbedPatchIds, allPatches);\n            await this.service.committer.commitReplay(appliedCount, allPatches, undefined, { buckets });\n        }\n\n        const warnings = [...detectorWarnings, ...this.service.warnings];\n        const degradedReasons = [...prep._prepared.detectorDegraded, ...this.service.degradedReasons];\n        return this.service.buildReport(\n            \"normal-regeneration\",\n            allPatches,\n            results,\n            prep._prepared.optionsSnapshot,\n            warnings,\n            rebaseCounts,\n            prep._prepared.preRebaseCounts,\n            prep._prepared.revertedCount,\n            degradedReasons,\n        );\n    }\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport { parse, stringify } from \"yaml\";\nimport type { GitClient } from \"./git/GitClient.js\";\nimport type { LockfileManager } from \"./LockfileManager.js\";\nimport { ReplayDetector } from \"./ReplayDetector.js\";\nimport { isBinaryFile } from \"./shared/binary.js\";\nimport type { CustomizationsConfig, StoredPatch } from \"./types.js\";\n\nexport interface MigrationAnalysis {\n    /** Files in .fernignore that have git commit history (can be tracked by Replay) */\n    trackedByBoth: Array<{ file: string; commit: string }>;\n    /** Files in .fernignore but NO recent commit history found after last generation */\n    fernignoreOnly: string[];\n    /** Commits found that AREN'T in .fernignore (inline edits to generated files) */\n    commitsOnly: StoredPatch[];\n    /** Synthetic patches created for .fernignore files that differ from pristine generation */\n    syntheticPatches: StoredPatch[];\n}\n\nexport interface MigrationResult {\n    patchesCreated: number;\n    filesSkipped: string[];\n    warnings: string[];\n}\n\nexport class FernignoreMigrator {\n    private git: GitClient;\n    private lockManager: LockfileManager;\n    private outputDir: string;\n\n    constructor(git: GitClient, lockManager: LockfileManager, outputDir: string) {\n        this.git = git;\n        this.lockManager = lockManager;\n        this.outputDir = outputDir;\n    }\n\n    fernignoreExists(): boolean {\n        return existsSync(join(this.outputDir, \".fernignore\"));\n    }\n\n    readFernignorePatterns(): string[] {\n        const fernignorePath = join(this.outputDir, \".fernignore\");\n        if (!existsSync(fernignorePath)) {\n            return [];\n        }\n        const content = readFileSync(fernignorePath, \"utf-8\");\n        return content\n            .split(\"\\n\")\n            .map((line) => line.trim())\n            .filter((line) => line && !line.startsWith(\"#\"));\n    }\n\n    /** Analyze .fernignore patterns vs git history. Creates synthetic patches for files differing from pristine generation. */\n    async analyzeMigration(): Promise<MigrationAnalysis> {\n        const patterns = this.readFernignorePatterns();\n        const detector = new ReplayDetector(this.git, this.lockManager, this.outputDir);\n        const { patches } = await detector.detectNewPatches();\n\n        const trackedByBoth: Array<{ file: string; commit: string }> = [];\n        const fernignoreOnly: string[] = [];\n        const commitsOnly: StoredPatch[] = [];\n        const syntheticPatches: StoredPatch[] = [];\n\n        // Check each fernignore pattern against recent patches\n        for (const pattern of patterns) {\n            const matchingPatch = patches.find((p) => p.files.some((f) => minimatch(f, pattern) || f === pattern));\n            if (matchingPatch) {\n                trackedByBoth.push({\n                    file: pattern,\n                    commit: matchingPatch.original_commit\n                });\n            } else {\n                fernignoreOnly.push(pattern);\n            }\n        }\n\n        // For fernignore-only patterns, try to create synthetic patches\n        // by diffing current file state against pristine generation tree\n        const lock = this.lockManager.read();\n        const currentGen = lock.generations.find((g) => g.commit_sha === lock.current_generation);\n\n        if (currentGen && fernignoreOnly.length > 0) {\n            const resolvedFiles = await this.resolvePatterns(fernignoreOnly);\n            const remainingFernignoreOnly: string[] = [];\n\n            for (const { pattern, files } of resolvedFiles) {\n                const patchFiles: string[] = [];\n                const diffParts: string[] = [];\n\n                for (const filePath of files) {\n                    const pristine = await this.git.showFile(currentGen.tree_hash, filePath);\n                    const currentContent = this.readFileContent(filePath);\n\n                    if (currentContent === null) {\n                        // File in .fernignore but not on disk — nothing to track\n                        continue;\n                    }\n\n                    if (pristine === null) {\n                        // File doesn't exist in generation tree — it's a wholly new file\n                        patchFiles.push(filePath);\n                        diffParts.push(this.createNewFileDiff(filePath, currentContent));\n                    } else if (pristine !== currentContent) {\n                        // File differs from pristine — user has customized it\n                        patchFiles.push(filePath);\n                        diffParts.push(this.createFileDiff(filePath, pristine, currentContent));\n                    }\n                    // If pristine === currentContent, file is unchanged — skip\n                }\n\n                if (patchFiles.length > 0) {\n                    const patchContent = diffParts.join(\"\\n\");\n                    const contentHash = `sha256:${createHash(\"sha256\").update(patchContent).digest(\"hex\")}`;\n\n                    // Snapshot THEIRS from the customer's working tree (the\n                    // diff is pristine → currentContent on disk). Skip\n                    // binary files (utf-8 read of binary content is lossy).\n                    const theirsSnapshot: Record<string, string> = {};\n                    for (const filePath of patchFiles) {\n                        if (isBinaryFile(filePath)) continue;\n                        const c = this.readFileContent(filePath);\n                        if (c != null) theirsSnapshot[filePath] = c;\n                    }\n\n                    syntheticPatches.push({\n                        id: `patch-fernignore-${createHash(\"sha256\").update(pattern).digest(\"hex\").slice(0, 8)}`,\n                        content_hash: contentHash,\n                        original_commit: currentGen.commit_sha,\n                        original_message: `[fernignore-migration] Customizations for ${pattern}`,\n                        original_author: \"Fern Replay <replay@buildwithfern.com>\",\n                        base_generation: currentGen.commit_sha,\n                        files: patchFiles,\n                        patch_content: patchContent,\n                        ...(Object.keys(theirsSnapshot).length > 0 ? { theirs_snapshot: theirsSnapshot } : {}),\n                        // Synthetic patches captured from .fernignore-protected files\n                        // are user-owned by definition — the customer's content\n                        // diverges from the generator's pristine output, and the\n                        // generator never produced this divergent content. Without\n                        // this flag, removing the file from .fernignore later (so\n                        // it leaves the protection check in `isFileUserOwned`) would\n                        // expose the patch to absorption on the next regen,\n                        // silently losing the customization.\n                        user_owned: true\n                    });\n\n                    trackedByBoth.push({\n                        file: pattern,\n                        commit: `synthetic (differs from generated)`\n                    });\n                } else {\n                    // No diff found — file matches generated output or doesn't exist\n                    remainingFernignoreOnly.push(pattern);\n                }\n            }\n\n            // Replace fernignoreOnly with only truly untrackable patterns\n            fernignoreOnly.length = 0;\n            fernignoreOnly.push(...remainingFernignoreOnly);\n        }\n\n        // Find patches that touch files NOT in .fernignore\n        for (const patch of patches) {\n            const hasUnprotectedFiles = patch.files.some((f) => !patterns.some((p) => minimatch(f, p) || f === p));\n            if (hasUnprotectedFiles) {\n                commitsOnly.push(patch);\n            }\n        }\n\n        return { trackedByBoth, fernignoreOnly, commitsOnly, syntheticPatches };\n    }\n\n    private async resolvePatterns(patterns: string[]): Promise<Array<{ pattern: string; files: string[] }>> {\n        const allFiles = (await this.git.exec([\"ls-files\"])).trim().split(\"\\n\").filter(Boolean);\n        const results: Array<{ pattern: string; files: string[] }> = [];\n\n        for (const pattern of patterns) {\n            const matching = allFiles.filter(\n                (f) => minimatch(f, pattern) || f === pattern || f.startsWith(pattern + \"/\")\n            );\n            results.push({ pattern, files: matching.length > 0 ? matching : [pattern] });\n        }\n\n        return results;\n    }\n\n    private readFileContent(filePath: string): string | null {\n        const fullPath = join(this.outputDir, filePath);\n        if (!existsSync(fullPath)) {\n            return null;\n        }\n        try {\n            const stat = statSync(fullPath);\n            if (stat.isDirectory()) {\n                return null;\n            }\n            return readFileSync(fullPath, \"utf-8\");\n        } catch {\n            return null;\n        }\n    }\n\n    private createNewFileDiff(filePath: string, content: string): string {\n        const lines = content.split(\"\\n\");\n        const hunks = lines.map((l) => `+${l}`).join(\"\\n\");\n        return [\n            `diff --git a/${filePath} b/${filePath}`,\n            \"new file mode 100644\",\n            `--- /dev/null`,\n            `+++ b/${filePath}`,\n            `@@ -0,0 +1,${lines.length} @@`,\n            hunks\n        ].join(\"\\n\");\n    }\n\n    private createFileDiff(filePath: string, pristine: string, current: string): string {\n        const oldLines = pristine.split(\"\\n\");\n        const newLines = current.split(\"\\n\");\n        // Simple full-file replacement diff — not optimal but correct\n        const removals = oldLines.map((l) => `-${l}`).join(\"\\n\");\n        const additions = newLines.map((l) => `+${l}`).join(\"\\n\");\n        return [\n            `diff --git a/${filePath} b/${filePath}`,\n            `--- a/${filePath}`,\n            `+++ b/${filePath}`,\n            `@@ -1,${oldLines.length} +1,${newLines.length} @@`,\n            removals,\n            additions\n        ].join(\"\\n\");\n    }\n\n    async migrate(): Promise<MigrationResult> {\n        const analysis = await this.analyzeMigration();\n        const detector = new ReplayDetector(this.git, this.lockManager, this.outputDir);\n        const { patches } = await detector.detectNewPatches();\n\n        const warnings: string[] = [];\n        let patchesCreated = 0;\n\n        // Add all detected patches to lockfile\n        for (const patch of patches) {\n            this.lockManager.addPatch(patch);\n            patchesCreated++;\n        }\n\n        if (patchesCreated > 0) {\n            this.lockManager.save();\n        }\n\n        // Warn about fernignore-only files\n        for (const file of analysis.fernignoreOnly) {\n            warnings.push(\n                `${file}: in .fernignore but no commit history found. Commit this file or keep in .fernignore as fallback.`\n            );\n        }\n\n        return {\n            patchesCreated,\n            filesSkipped: analysis.fernignoreOnly,\n            warnings\n        };\n    }\n\n    movePatternsToReplayYml(patterns: string[]): void {\n        const replayYmlPath = join(this.outputDir, \".fern\", \"replay.yml\");\n        let config: CustomizationsConfig = {};\n\n        if (existsSync(replayYmlPath)) {\n            const content = readFileSync(replayYmlPath, \"utf-8\");\n            config = (parse(content) as CustomizationsConfig) ?? {};\n        }\n\n        const existing = config.exclude ?? [];\n        const merged = [...new Set([...existing, ...patterns])];\n        config.exclude = merged;\n\n        const dir = dirname(replayYmlPath);\n        if (!existsSync(dir)) {\n            mkdirSync(dir, { recursive: true });\n        }\n        writeFileSync(replayYmlPath, stringify(config, { lineWidth: 0 }), \"utf-8\");\n    }\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { FernignoreMigrator, type MigrationAnalysis } from \"../FernignoreMigrator.js\";\nimport { isGenerationCommit, isReplayCommit } from \"../git/CommitDetection.js\";\nimport { GitClient } from \"../git/GitClient.js\";\nimport { LockfileManager } from \"../LockfileManager.js\";\nimport type { CommitInfo, StoredPatch } from \"../types.js\";\n\nexport interface BootstrapOptions {\n    /** Log what would happen but don't modify anything */\n    dryRun?: boolean;\n    /** How to handle .fernignore: \"migrate\" moves patterns to replay.yml, \"delete\" removes it, \"skip\" leaves it */\n    fernignoreAction?: \"migrate\" | \"delete\" | \"skip\";\n    /** Maximum number of commits to scan for generation history (default: 500) */\n    maxCommitsToScan?: number;\n    /** Allow overwriting an existing lockfile */\n    force?: boolean;\n    /** When true, scan git history for existing patches. Default: false (clean start with 0 patches). */\n    importHistory?: boolean;\n}\n\nexport interface BootstrapResult {\n    /** The generation commit used as baseline, or null if none found */\n    generationCommit: CommitInfo | null;\n    /** Number of customization patches detected */\n    patchesDetected: number;\n    /** Number of patches written to lockfile */\n    patchesCreated: number;\n    /** The detected patches (for dry-run inspection) */\n    patches: StoredPatch[];\n    /** .fernignore patterns found, if any */\n    fernignorePatterns: string[];\n    /** .fernignore migration analysis, if .fernignore exists */\n    fernignoreAnalysis?: MigrationAnalysis;\n    /** Whether .fernignore was updated to protect replay files */\n    fernignoreUpdated: boolean;\n    /** Warnings about edge cases */\n    warnings: string[];\n    /** Number of older generation commits that were skipped (stale commits ignored) */\n    staleGenerationsSkipped: number;\n    /** The generation commit SHA used as cutoff for patch detection */\n    scannedSinceGeneration: string;\n}\n\n/**\n * Bootstrap Replay for an existing SDK repository.\n *\n * Scans git history to find all generation commits, identifies\n * user customization patches between them, and creates the initial replay.lock.\n *\n * This is a one-time migration step for SDKs that existed before Replay.\n */\nexport async function bootstrap(outputDir: string, options?: BootstrapOptions): Promise<BootstrapResult> {\n    const git = new GitClient(outputDir);\n    const lockManager = new LockfileManager(outputDir);\n    const maxCommits = options?.maxCommitsToScan ?? 500;\n    const warnings: string[] = [];\n\n    // Check for existing lockfile\n    if (lockManager.exists() && !options?.force) {\n        return {\n            generationCommit: null,\n            patchesDetected: 0,\n            patchesCreated: 0,\n            patches: [],\n            fernignorePatterns: [],\n            fernignoreUpdated: false,\n            warnings: [\"Replay lockfile already exists. Use --force to overwrite.\"],\n            staleGenerationsSkipped: 0,\n            scannedSinceGeneration: \"\"\n        };\n    }\n\n    // 1. Find ALL generation commits (newest first, excluding replay commits)\n    const genCommits = await findAllGenerationCommits(git, maxCommits);\n\n    if (genCommits.length === 0) {\n        return {\n            generationCommit: null,\n            patchesDetected: 0,\n            patchesCreated: 0,\n            patches: [],\n            fernignorePatterns: [],\n            fernignoreUpdated: false,\n            warnings: [\n                \"No generation commits found in the last \" +\n                    maxCommits +\n                    \" commits. \" +\n                    \"Run 'fern generate' first to establish a baseline.\"\n            ],\n            staleGenerationsSkipped: 0,\n            scannedSinceGeneration: \"\"\n        };\n    }\n\n    const latestGen = genCommits[0]!;\n\n    // 2. Set up in-memory lockfile (don't write to disk yet — we may be in dry-run mode)\n    // For clean start (no importHistory), use HEAD as current_generation so that\n    // the next fern generate detects 0 old commits. When importing history, use\n    // the actual generation commit as the base for patch detection.\n    const anchorSha = options?.importHistory ? latestGen.sha : (await git.exec([\"rev-parse\", \"HEAD\"])).trim();\n    const treeHash = await git.getTreeHash(anchorSha);\n    const genRecord = {\n        commit_sha: anchorSha,\n        tree_hash: treeHash,\n        timestamp: new Date().toISOString(),\n        cli_version: \"unknown\",\n        generator_versions: {} as Record<string, string>\n    };\n\n    lockManager.initializeInMemory(genRecord);\n\n    // 3. Scan for user patches (only when importing history)\n    const patches: StoredPatch[] = options?.importHistory ? await findAllUserPatches(git, genCommits) : [];\n\n    // 4. Handle .fernignore if present (only when importing history)\n    const migrator = new FernignoreMigrator(git, lockManager, outputDir);\n    const fernignorePatterns = migrator.readFernignorePatterns();\n    let fernignoreAnalysis: MigrationAnalysis | undefined;\n\n    if (options?.importHistory && migrator.fernignoreExists() && fernignorePatterns.length > 0) {\n        fernignoreAnalysis = await migrator.analyzeMigration();\n\n        // Add synthetic patches from .fernignore analysis\n        if (fernignoreAnalysis.syntheticPatches.length > 0) {\n            patches.push(...fernignoreAnalysis.syntheticPatches);\n        }\n\n        if (fernignoreAnalysis.fernignoreOnly.length > 0) {\n            for (const file of fernignoreAnalysis.fernignoreOnly) {\n                warnings.push(\n                    `${file}: in .fernignore but no recent commits found since last generation. ` +\n                        \"File may be stale, matches generated output, or does not exist. No customization to track.\"\n                );\n            }\n        }\n    }\n\n    // In dry-run mode, don't persist anything\n    if (options?.dryRun) {\n        return {\n            generationCommit: latestGen,\n            patchesDetected: patches.length,\n            patchesCreated: 0,\n            patches,\n            fernignorePatterns,\n            fernignoreAnalysis,\n            fernignoreUpdated: false,\n            warnings,\n            staleGenerationsSkipped: genCommits.length - 1,\n            scannedSinceGeneration: latestGen.sha\n        };\n    }\n\n    // 5. Persist patches to lockfile\n    for (const patch of patches) {\n        lockManager.addPatch(patch);\n    }\n    lockManager.save();\n\n    // 6. Ensure .fernignore protects replay files from generation wipe\n    const fernignoreUpdated = ensureFernignoreEntries(outputDir);\n\n    // 7. Ensure .gitattributes marks replay.lock as generated (collapses diff in GitHub PRs)\n    ensureGitattributesEntries(outputDir);\n\n    // 8. Handle .fernignore migration\n    if (migrator.fernignoreExists() && fernignorePatterns.length > 0) {\n        const action = options?.fernignoreAction ?? \"skip\";\n        if (action === \"migrate\") {\n            // Move truly untrackable patterns (no diff from generated) to replay.yml exclude list\n            const patternsToExclude = fernignoreAnalysis?.fernignoreOnly ?? [];\n            if (patternsToExclude.length > 0) {\n                migrator.movePatternsToReplayYml(patternsToExclude);\n            }\n        }\n    }\n\n    return {\n        generationCommit: latestGen,\n        patchesDetected: patches.length,\n        patchesCreated: patches.length,\n        patches,\n        fernignorePatterns,\n        fernignoreAnalysis,\n        fernignoreUpdated,\n        warnings,\n        staleGenerationsSkipped: genCommits.length - 1,\n        scannedSinceGeneration: latestGen.sha\n    };\n}\n\nasync function findAllGenerationCommits(git: GitClient, maxCommits: number): Promise<CommitInfo[]> {\n    const log = await git.exec([\"log\", \"--format=%H%x00%an%x00%ae%x00%s\", `-${maxCommits}`]);\n\n    if (!log.trim()) {\n        return [];\n    }\n\n    const genCommits: CommitInfo[] = [];\n    for (const line of log.trim().split(\"\\n\")) {\n        if (!line) continue;\n        const [sha, authorName, authorEmail, message] = line.split(\"\\0\");\n        const commit: CommitInfo = { sha, authorName, authorEmail, message };\n        if (isGenerationCommit(commit) && !isReplayCommit(commit)) {\n            genCommits.push(commit);\n        }\n    }\n\n    return genCommits;\n}\n\nasync function findAllUserPatches(\n    git: GitClient,\n    genCommits: CommitInfo[] // newest first\n): Promise<StoredPatch[]> {\n    const patches: StoredPatch[] = [];\n    const seenHashes = new Set<string>();\n\n    // Only scan since the LAST (most recent) generation commit to HEAD\n    // This ignores \"stale\" commits that were regenerated over before the customer activated replay\n    const latestGen = genCommits[0]!;\n    const recentPatches = await extractUserPatches(git, latestGen.sha, \"HEAD\", latestGen.sha, seenHashes);\n    patches.push(...recentPatches);\n\n    return patches;\n}\n\nasync function extractUserPatches(\n    git: GitClient,\n    fromSha: string,\n    toRef: string,\n    baseGeneration: string,\n    seenHashes: Set<string>\n): Promise<StoredPatch[]> {\n    const log = await git.exec([\"log\", \"--format=%H%x00%an%x00%ae%x00%s\", `${fromSha}..${toRef}`]);\n\n    if (!log.trim()) {\n        return [];\n    }\n\n    const commits = parseGitLog(log);\n    const patches: StoredPatch[] = [];\n\n    // Process in reverse (oldest first) for chronological order\n    for (const commit of commits.reverse()) {\n        if (isGenerationCommit(commit)) continue;\n\n        const parents = await git.getCommitParents(commit.sha);\n        if (parents.length > 1) continue;\n\n        const patchContent = await git.formatPatch(commit.sha);\n        const contentHash = computeContentHash(patchContent);\n\n        if (seenHashes.has(contentHash)) continue;\n        seenHashes.add(contentHash);\n\n        const filesOutput = await git.exec([\"diff-tree\", \"--no-commit-id\", \"--name-only\", \"-r\", commit.sha]);\n\n        patches.push({\n            id: `patch-${commit.sha.slice(0, 8)}`,\n            content_hash: contentHash,\n            original_commit: commit.sha,\n            original_message: commit.message,\n            original_author: `${commit.authorName} <${commit.authorEmail}>`,\n            base_generation: baseGeneration,\n            files: filesOutput.trim().split(\"\\n\").filter(Boolean),\n            patch_content: patchContent\n        });\n    }\n\n    return patches;\n}\n\nfunction parseGitLog(log: string): CommitInfo[] {\n    return log\n        .trim()\n        .split(\"\\n\")\n        .filter(Boolean)\n        .map((line) => {\n            const [sha, authorName, authorEmail, message] = line.split(\"\\0\");\n            return { sha, authorName, authorEmail, message };\n        });\n}\n\nconst REPLAY_FERNIGNORE_ENTRIES = [\".fern/replay.lock\", \".fern/replay.yml\", \".gitattributes\"];\n\nfunction ensureFernignoreEntries(outputDir: string): boolean {\n    const fernignorePath = join(outputDir, \".fernignore\");\n    let content = \"\";\n\n    if (existsSync(fernignorePath)) {\n        content = readFileSync(fernignorePath, \"utf-8\");\n    }\n\n    const lines = content.split(\"\\n\");\n    const toAdd: string[] = [];\n\n    for (const entry of REPLAY_FERNIGNORE_ENTRIES) {\n        if (!lines.some((line) => line.trim() === entry)) {\n            toAdd.push(entry);\n        }\n    }\n\n    if (toAdd.length === 0) {\n        return false;\n    }\n\n    if (content && !content.endsWith(\"\\n\")) {\n        content += \"\\n\";\n    }\n    content += toAdd.join(\"\\n\") + \"\\n\";\n    writeFileSync(fernignorePath, content, \"utf-8\");\n    return true;\n}\n\nconst GITATTRIBUTES_ENTRIES = [\".fern/replay.lock linguist-generated=true\"];\n\nfunction ensureGitattributesEntries(outputDir: string): void {\n    const gitattributesPath = join(outputDir, \".gitattributes\");\n    let content = \"\";\n\n    if (existsSync(gitattributesPath)) {\n        content = readFileSync(gitattributesPath, \"utf-8\");\n    }\n\n    const lines = content.split(\"\\n\");\n    const toAdd: string[] = [];\n\n    for (const entry of GITATTRIBUTES_ENTRIES) {\n        if (!lines.some((line) => line.trim() === entry)) {\n            toAdd.push(entry);\n        }\n    }\n\n    if (toAdd.length === 0) {\n        return;\n    }\n\n    if (content && !content.endsWith(\"\\n\")) {\n        content += \"\\n\";\n    }\n    content += toAdd.join(\"\\n\") + \"\\n\";\n    writeFileSync(gitattributesPath, content, \"utf-8\");\n}\n\nfunction computeContentHash(patchContent: string): string {\n    const lines = patchContent.split(\"\\n\");\n\n    // Strip email wrapper from format-patch output (matches ReplayDetector)\n    const diffStart = lines.findIndex((l) => l.startsWith(\"diff --git \"));\n    const relevantLines = diffStart > 0 ? lines.slice(diffStart) : lines;\n\n    const normalized = relevantLines\n        .filter((line) => !line.startsWith(\"index \"))\n        .join(\"\\n\")\n        .replace(/\\n-- \\n[\\d]+\\.[\\d]+[^\\n]*\\s*$/, \"\");\n\n    return `sha256:${createHash(\"sha256\").update(normalized).digest(\"hex\")}`;\n}\n","import { minimatch } from \"minimatch\";\nimport { GitClient } from \"../git/GitClient.js\";\nimport { LockfileManager } from \"../LockfileManager.js\";\nimport { ReplayDetector } from \"../ReplayDetector.js\";\nimport { readFernignorePatterns } from \"../shared/fernignore.js\";\nimport type { StoredPatch } from \"../types.js\";\n\nexport interface ForgetOptions {\n    /** Don't actually remove, just show what would be removed */\n    dryRun?: boolean;\n    /** Remove all tracked patches (keep lockfile and generation history) */\n    all?: boolean;\n    /** Specific patch IDs to remove */\n    patchIds?: string[];\n    /** Search pattern: file path, glob, or commit message substring */\n    pattern?: string;\n}\n\nexport interface DiffStat {\n    additions: number;\n    deletions: number;\n}\n\nexport interface MatchedPatch {\n    id: string;\n    message: string;\n    files: string[];\n    diffstat: DiffStat;\n    status?: \"unresolved\" | \"resolving\";\n}\n\nexport interface ForgetResult {\n    /** Whether replay is initialized (lockfile exists) */\n    initialized: boolean;\n    /** Patches that were (or would be in dry-run) removed */\n    removed: MatchedPatch[];\n    /** Number of patches remaining after removal */\n    remaining: number;\n    /** True if a search/pattern was given but nothing matched */\n    notFound: boolean;\n    /** Patch IDs that were specified but don't exist (idempotent mode) */\n    alreadyForgotten: string[];\n    /** Total patches before removal */\n    totalPatches: number;\n    /** Warnings (e.g., forgetting patches with conflict markers on disk) */\n    warnings: string[];\n    /** Matching patches for interactive selection (search/no-arg mode only) */\n    matched?: MatchedPatch[];\n}\n\nfunction parseDiffStat(patchContent: string): DiffStat {\n    let additions = 0;\n    let deletions = 0;\n    let inDiffHunk = false;\n    for (const line of patchContent.split(\"\\n\")) {\n        if (line.startsWith(\"diff --git \")) {\n            inDiffHunk = true;\n            continue;\n        }\n        if (!inDiffHunk) continue;\n        if (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n            additions++;\n        } else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n            deletions++;\n        }\n    }\n    return { additions, deletions };\n}\n\nfunction toMatchedPatch(patch: StoredPatch): MatchedPatch {\n    return {\n        id: patch.id,\n        message: patch.original_message,\n        files: patch.files,\n        diffstat: parseDiffStat(patch.patch_content),\n        ...(patch.status ? { status: patch.status } : {}),\n    };\n}\n\nfunction matchesPatch(patch: StoredPatch, pattern: string): boolean {\n    // File path match: exact or glob\n    const fileMatch = patch.files.some(\n        (file) => file === pattern || minimatch(file, pattern),\n    );\n    if (fileMatch) return true;\n\n    // Commit message match: case-insensitive substring\n    return patch.original_message.toLowerCase().includes(pattern.toLowerCase());\n}\n\nfunction buildWarnings(patches: StoredPatch[]): string[] {\n    const warnings: string[] = [];\n    for (const patch of patches) {\n        if (patch.status === \"resolving\") {\n            warnings.push(\n                `patch ${patch.id} has conflict markers in these files: ${patch.files.join(\", \")}. ` +\n                `Run \\`git checkout -- <files>\\` to restore the generated versions.`,\n            );\n        } else if (patch.status === \"unresolved\") {\n            warnings.push(\n                `patch ${patch.id} had unresolved conflicts (files: ${patch.files.join(\", \")}).`,\n            );\n        }\n    }\n    return warnings;\n}\n\nconst EMPTY_RESULT: ForgetResult = {\n    initialized: false,\n    removed: [],\n    remaining: 0,\n    notFound: false,\n    alreadyForgotten: [],\n    totalPatches: 0,\n    warnings: [],\n};\n\n/**\n * Record one dismissal per patch, tombstoning both the stored content hash\n * and (best effort) the re-emission hash recomputed from the original commit\n * through the exact detection pipeline. The stored hash drifts every time a\n * patch is carried forward across a clean regen, so it alone does not block\n * the detector from re-emitting the original commit when it re-enters the\n * scan range (e.g. after a regen PR is merged with a merge commit).\n *\n * Unreachable commits (shallow clone, GC, synthetic patches with no commit)\n * fall back to the stored hash silently — dismissal never fails.\n */\nasync function dismissPatches(\n    outputDir: string,\n    lockManager: LockfileManager,\n    patches: StoredPatch[],\n): Promise<void> {\n    const git = new GitClient(outputDir);\n    const detector = new ReplayDetector(git, lockManager, outputDir, readFernignorePatterns(outputDir));\n    for (const patch of patches) {\n        const hashes = [patch.content_hash];\n        if (patch.original_commit) {\n            const materialized = await detector.materializeCommitPatch(patch.original_commit);\n            if (materialized.status === \"ok\" && !hashes.includes(materialized.contentHash)) {\n                hashes.push(materialized.contentHash);\n            }\n        }\n        lockManager.addDismissal({\n            patch_id: patch.id,\n            original_commit: patch.original_commit,\n            original_message: patch.original_message,\n            content_hashes: hashes,\n            dismissed_at: new Date().toISOString(),\n            via: \"forget\",\n        });\n    }\n}\n\nexport async function forget(outputDir: string, options?: ForgetOptions): Promise<ForgetResult> {\n    const lockManager = new LockfileManager(outputDir);\n\n    if (!lockManager.exists()) {\n        return { ...EMPTY_RESULT };\n    }\n\n    const lock = lockManager.read();\n    const totalPatches = lock.patches.length;\n\n    // --all: remove all patches\n    if (options?.all) {\n        const removed = lock.patches.map(toMatchedPatch);\n        const warnings = buildWarnings(lock.patches);\n\n        if (!options.dryRun) {\n            await dismissPatches(outputDir, lockManager, lock.patches);\n            lockManager.clearPatches();\n            lockManager.save();\n        }\n\n        return {\n            initialized: true,\n            removed,\n            remaining: 0,\n            notFound: false,\n            alreadyForgotten: [],\n            totalPatches,\n            warnings,\n        };\n    }\n\n    // Patch ID mode: remove specific patches by ID\n    if (options?.patchIds && options.patchIds.length > 0) {\n        const removed: MatchedPatch[] = [];\n        const alreadyForgotten: string[] = [];\n        const patchesToRemove: StoredPatch[] = [];\n\n        for (const id of options.patchIds) {\n            const patch = lock.patches.find((p) => p.id === id);\n            if (patch) {\n                removed.push(toMatchedPatch(patch));\n                patchesToRemove.push(patch);\n            } else {\n                alreadyForgotten.push(id);\n            }\n        }\n\n        const warnings = buildWarnings(patchesToRemove);\n\n        if (!options.dryRun) {\n            await dismissPatches(outputDir, lockManager, patchesToRemove);\n            for (const patch of patchesToRemove) {\n                lockManager.removePatch(patch.id);\n            }\n            lockManager.save();\n        }\n\n        return {\n            initialized: true,\n            removed,\n            remaining: totalPatches - removed.length,\n            notFound: removed.length === 0 && alreadyForgotten.length > 0,\n            alreadyForgotten,\n            totalPatches,\n            warnings,\n        };\n    }\n\n    // Search mode: match by pattern (file path, glob, or commit message)\n    if (options?.pattern) {\n        const matched = lock.patches\n            .filter((p) => matchesPatch(p, options.pattern!))\n            .map(toMatchedPatch);\n\n        return {\n            initialized: true,\n            removed: [],\n            remaining: totalPatches,\n            notFound: matched.length === 0,\n            alreadyForgotten: [],\n            totalPatches,\n            warnings: [],\n            matched,\n        };\n    }\n\n    // No argument: return all patches for interactive selection\n    return {\n        initialized: true,\n        removed: [],\n        remaining: totalPatches,\n        notFound: totalPatches === 0,\n        alreadyForgotten: [],\n        totalPatches,\n        warnings: [],\n        matched: lock.patches.map(toMatchedPatch),\n    };\n}\n","import { unlinkSync } from \"node:fs\";\nimport { LockfileManager } from \"../LockfileManager.js\";\n\nexport interface ResetOptions {\n    /** Don't actually delete, just show what would happen */\n    dryRun?: boolean;\n}\n\nexport interface ResetResult {\n    /** Whether reset was successful (or would be) */\n    success: boolean;\n    /** Number of patches that were (or would be) removed */\n    patchesRemoved: number;\n    /** Whether the lockfile was (or would be) deleted */\n    lockfileDeleted: boolean;\n    /** True if there was nothing to reset */\n    nothingToReset: boolean;\n}\n\nexport function reset(outputDir: string, options?: ResetOptions): ResetResult {\n    const lockManager = new LockfileManager(outputDir);\n\n    if (!lockManager.exists()) {\n        return {\n            success: true,\n            patchesRemoved: 0,\n            lockfileDeleted: false,\n            nothingToReset: true\n        };\n    }\n\n    const lock = lockManager.read();\n    const patchCount = lock.patches.length;\n\n    if (!options?.dryRun) {\n        unlinkSync(lockManager.lockfilePath);\n    }\n\n    return {\n        success: true,\n        patchesRemoved: patchCount,\n        lockfileDeleted: true,\n        nothingToReset: false\n    };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { GitClient } from \"../git/GitClient.js\";\nimport { LockfileManager } from \"../LockfileManager.js\";\nimport { ReplayApplicator } from \"../ReplayApplicator.js\";\nimport { isBinaryFile } from \"../shared/binary.js\";\nimport { readFernignorePatterns } from \"../shared/fernignore.js\";\nimport { ReplayCommitter } from \"../ReplayCommitter.js\";\nimport { ReplayDetector } from \"../ReplayDetector.js\";\nimport { computePerPatchDiffWithFallback } from \"../PatchRegionDiff.js\";\n\nexport interface ResolveOptions {\n    /** Check for remaining conflict markers before committing. Default: true */\n    checkMarkers?: boolean;\n}\n\nexport interface ResolveResult {\n    /** Whether the resolve succeeded */\n    success: boolean;\n    /** Commit SHA of the [fern-replay] commit, if created */\n    commitSha?: string;\n    /** Reason for failure or current state */\n    reason?: string;\n    /** Files that have conflict markers */\n    unresolvedFiles?: string[];\n    /** Phase the command executed */\n    phase?: \"applied\" | \"committed\" | \"nothing-to-resolve\";\n    /** Number of patches applied to working tree (phase 1) */\n    patchesApplied?: number;\n    /** Number of patches resolved and committed (phase 2) */\n    patchesResolved?: number;\n    /**\n     * Patches permanently dismissed during phase 2 — the customer kept the\n     * generator's version for every file in the patch. These are tombstoned\n     * in the lockfile and will not be re-detected on future generations.\n     */\n    patchesDismissed?: Array<{ id: string; message: string }>;\n    /** Non-fatal diagnostic messages (e.g., per-patch fallbacks) */\n    warnings?: string[];\n}\n\nexport async function resolve(outputDir: string, options?: ResolveOptions): Promise<ResolveResult> {\n    const lockManager = new LockfileManager(outputDir);\n\n    if (!lockManager.exists()) {\n        return { success: false, reason: \"no-lockfile\" };\n    }\n\n    const lock = lockManager.read();\n    if (lock.patches.length === 0) {\n        return { success: false, reason: \"no-patches\" };\n    }\n\n    const git = new GitClient(outputDir);\n    const unresolvedPatches = lockManager.getUnresolvedPatches();\n    const resolvingPatches = lockManager.getResolvingPatches();\n\n    // ---- Phase 1: Apply unresolved patches to working tree ----\n    if (unresolvedPatches.length > 0) {\n        const applicator = new ReplayApplicator(git, lockManager, outputDir);\n        // applyMode: \"resolve\" — preserve conflict markers on disk so the\n        // customer sees A's conflicts (instead of having them silently\n        // stripped by the intra-loop sanitize that the replay pipeline\n        // depends on for clean follow-up patches). See ReplayApplicator\n        // applyPatches docstring for the rationale.\n        await applicator.applyPatches(unresolvedPatches, { applyMode: \"resolve\" });\n\n        const markerFiles = await findConflictMarkerFiles(git);\n\n        if (markerFiles.length > 0) {\n            // Mark as \"resolving\" so next call knows Phase 1 happened\n            for (const patch of unresolvedPatches) {\n                lockManager.updatePatch(patch.id, { status: \"resolving\" });\n            }\n            lockManager.save();\n\n            return {\n                success: false,\n                reason: \"conflicts-applied\",\n                unresolvedFiles: markerFiles,\n                phase: \"applied\",\n                patchesApplied: unresolvedPatches.length\n            };\n        }\n\n        // All patches applied cleanly — fall through to commit phase.\n        // Treat these as needing commit (same as resolving patches).\n    }\n\n    // ---- Phase 1.5: Conflict markers still present ----\n    if (options?.checkMarkers !== false) {\n        const currentMarkerFiles = await findConflictMarkerFiles(git);\n        if (currentMarkerFiles.length > 0) {\n            return { success: false, reason: \"unresolved-conflicts\", unresolvedFiles: currentMarkerFiles };\n        }\n    }\n\n    // ---- Phase 2: Commit resolution ----\n    // Includes both \"resolving\" patches (from a previous Phase 1 call) and\n    // \"unresolved\" patches that applied cleanly (from Phase 1 above).\n    const patchesToCommit = [...resolvingPatches, ...unresolvedPatches];\n    if (patchesToCommit.length > 0) {\n        const currentGen = lock.current_generation;\n        // The detector must see the same `.fernignore` patterns production\n        // detection uses — they scope patch materialization, and the\n        // rejection tombstone below recomputes re-emission hashes through it.\n        const detector = new ReplayDetector(git, lockManager, outputDir, readFernignorePatterns(outputDir));\n        const warnings: string[] = [];\n        const patchesDismissed: Array<{ id: string; message: string }> = [];\n        let patchesResolved = 0;\n\n        // Two-pass: pass 1 computes per-patch attribution; pass 2 applies\n        // it with consolidation when multiple patches end up with byte-\n        // identical content (which would otherwise duplicate-apply at the\n        // next regen and corrupt the customer's file).\n        type PassResult =\n            | { kind: \"skip\" }\n            | { kind: \"revert\" }\n            | { kind: \"apply\"; diff: string; hash: string; hadFallback: boolean; fallbackFiles: string[] };\n\n        const pass1: PassResult[] = [];\n        for (const patch of patchesToCommit) {\n            // Per-patch contribution diff. Using a cumulative\n            // `git diff currentGen -- patch.files` would assign byte-\n            // identical patch_content to every patch sharing a file —\n            // which the consolidation pass below catches, but per-patch\n            // attribution (when achievable) preserves better provenance.\n            const result = await computePerPatchDiffWithFallback(\n                patch,\n                (f) => git.showFile(currentGen, f),\n                (f) => readFile(join(outputDir, f), \"utf-8\").catch(() => null),\n                (files) => git.exec([\"diff\", currentGen, \"--\", ...files]).catch(() => null)\n            );\n\n            if (result === null) {\n                warnings.push(\n                    `Patch ${patch.id}: cumulative-diff fallback failed for unlocatable files; preserving patch unchanged`\n                );\n                pass1.push({ kind: \"skip\" });\n                continue;\n            }\n\n            const diff = result.diff;\n            if (!diff.trim()) {\n                pass1.push({ kind: \"revert\" });\n                continue;\n            }\n\n            const hash = detector.computeContentHash(diff);\n            pass1.push({\n                kind: \"apply\",\n                diff,\n                hash,\n                hadFallback: result.hadFallback,\n                fallbackFiles: result.fallbackFiles,\n            });\n        }\n\n        // Pass 2 setup: identify the LAST occurrence of each content hash —\n        // that's the canonical patch (most recent customer intent). Earlier\n        // patches with the same hash get consolidated into that one. Per\n        // user direction (criterion #5 in the brief): \"consolidate to ONE\n        // canonical patch rather than copying cumulative content into all.\"\n        const lastIndexByHash = new Map<string, number>();\n        for (let i = 0; i < pass1.length; i++) {\n            const r = pass1[i]!;\n            if (r.kind === \"apply\") lastIndexByHash.set(r.hash, i);\n        }\n\n        for (let i = 0; i < patchesToCommit.length; i++) {\n            const patch = patchesToCommit[i]!;\n            const r = pass1[i]!;\n            if (r.kind === \"skip\") continue;\n            if (r.kind === \"revert\") {\n                // Rejection: the customer kept the generator's version for\n                // every file in the patch. Tombstone the patch so the detector\n                // doesn't re-emit the original commit on the next regeneration\n                // (merge commits of regen PRs keep the commit inside the scan\n                // range forever).\n                //\n                // Two hashes are tombstoned: the stored content_hash, and the\n                // re-emission hash recomputed from the original commit through\n                // the exact detection pipeline. The stored hash alone is not\n                // enough — it is rewritten every time the patch is carried\n                // forward across a clean regen, so it no longer matches what\n                // detection will compute when the commit re-enters the scan\n                // range.\n                const hashes = [patch.content_hash];\n                if (patch.original_commit) {\n                    const materialized = await detector.materializeCommitPatch(patch.original_commit);\n                    if (materialized.status === \"ok\" && !hashes.includes(materialized.contentHash)) {\n                        hashes.push(materialized.contentHash);\n                    } else if (materialized.status === \"unreachable\") {\n                        warnings.push(\n                            `Patch ${patch.id}: original commit ${patch.original_commit.slice(0, 7)} is ` +\n                                `unreachable; dismissed using the stored content hash only. If this commit ` +\n                                `reappears in history, the customization may be re-detected once.`\n                        );\n                    }\n                }\n                lockManager.addDismissal({\n                    patch_id: patch.id,\n                    original_commit: patch.original_commit,\n                    original_message: patch.original_message,\n                    content_hashes: hashes,\n                    dismissed_at: new Date().toISOString(),\n                    via: \"resolve\",\n                });\n                lockManager.removePatch(patch.id);\n                patchesDismissed.push({ id: patch.id, message: patch.original_message });\n                continue;\n            }\n\n            // r.kind === \"apply\"\n            if (lastIndexByHash.get(r.hash) !== i) {\n                // Duplicate of a later patch — consolidate by removing.\n                // The customer's contribution survives on the canonical\n                // patch (the last one with this hash). Per-commit\n                // attribution is recoverable from `git log -- <file>`.\n                const canonicalIdx = lastIndexByHash.get(r.hash)!;\n                const canonical = patchesToCommit[canonicalIdx]!;\n                lockManager.removePatch(patch.id);\n                warnings.push(\n                    `Consolidated patch ${patch.id} (commit ${(patch.original_commit || \"<missing>\").slice(0, 7)}) ` +\n                        `into patch ${canonical.id} (commit ${(canonical.original_commit || \"<missing>\").slice(0, 7)}): ` +\n                        `byte-identical patch_content after resolution. Per-commit attribution preserved in git log; ` +\n                        `lockfile collapsed to avoid duplicate-apply corruption on next regen.`\n                );\n                continue;\n            }\n\n            if (r.hadFallback) {\n                warnings.push(\n                    `Patch ${patch.id}: ${r.fallbackFiles.join(\", \")} could not be anchored; cumulative-diff fallback applied for those files`\n                );\n            }\n\n            const changedFiles = r.hadFallback\n                ? await getChangedFiles(git, currentGen, patch.files)\n                : extractFilesFromDiff(r.diff);\n\n            // Capture THEIRS as a snapshot of the customer's resolved file\n            // content. This is what THEIRS *means* — the post-customer-edit\n            // state. Storing it directly (instead of relying on\n            // patch_content's diff to reconstruct it) makes future regens\n            // robust to generator structural changes that would invalidate\n            // the diff's line anchors.\n            const filesForSnapshot = changedFiles.length > 0 ? changedFiles : patch.files;\n            const theirsSnapshot: Record<string, string> = {};\n            for (const file of filesForSnapshot) {\n                if (isBinaryFile(file)) continue;\n                const content = await readFile(join(outputDir, file), \"utf-8\").catch(() => null);\n                if (content != null) {\n                    theirsSnapshot[file] = content;\n                }\n            }\n\n            lockManager.markPatchResolved(patch.id, {\n                patch_content: r.diff,\n                content_hash: r.hash,\n                base_generation: currentGen,\n                files: filesForSnapshot,\n                ...(Object.keys(theirsSnapshot).length > 0 ? { theirs_snapshot: theirsSnapshot } : {})\n            });\n            patchesResolved++;\n        }\n\n        lockManager.save();\n\n        const committer = new ReplayCommitter(git, outputDir);\n        await committer.stageAll();\n        const commitSha = await committer.commitReplay(\n            lock.patches.length,\n            lock.patches,\n            \"[fern-replay] Resolved conflicts\"\n        );\n\n        return {\n            success: true,\n            commitSha,\n            phase: \"committed\",\n            patchesResolved,\n            patchesDismissed: patchesDismissed.length > 0 ? patchesDismissed : undefined,\n            warnings: warnings.length > 0 ? warnings : undefined\n        };\n    }\n\n    // ---- No unresolved/resolving patches → legacy behavior ----\n    const committer = new ReplayCommitter(git, outputDir);\n    await committer.stageAll();\n    const commitSha = await committer.commitReplay(lock.patches.length, lock.patches);\n\n    return { success: true, commitSha, phase: \"committed\" };\n}\n\nasync function findConflictMarkerFiles(git: GitClient): Promise<string[]> {\n    const output = await git.exec([\"grep\", \"-l\", \"<<<<<<<\", \"--\", \".\"]).catch(() => \"\");\n    return output.trim() ? output.trim().split(\"\\n\").filter(Boolean) : [];\n}\n\nasync function getChangedFiles(git: GitClient, currentGen: string, files: string[]): Promise<string[]> {\n    const filesOutput = await git.exec([\"diff\", \"--name-only\", currentGen, \"--\", ...files]).catch(() => null);\n\n    if (!filesOutput || !filesOutput.trim()) return files;\n\n    const changed = filesOutput\n        .trim()\n        .split(\"\\n\")\n        .filter(Boolean)\n        .filter((f) => !f.startsWith(\".fern/\"));\n\n    return changed.length > 0 ? changed : files;\n}\n\n/**\n * Parse `diff --git a/<X> b/<Y>` headers from a unified diff and return the\n * destination paths. For renames, the \"to\" side is preferred. Filters out\n * `.fern/` paths.\n */\nfunction extractFilesFromDiff(unifiedDiff: string): string[] {\n    const out = new Set<string>();\n    const renameSources = new Set<string>();\n    let currentTarget: string | null = null;\n\n    for (const line of unifiedDiff.split(\"\\n\")) {\n        const headerMatch = line.match(/^diff --git a\\/(.+?) b\\/(.+)$/);\n        if (headerMatch) {\n            currentTarget = headerMatch[2]!;\n            if (!currentTarget.startsWith(\".fern/\")) out.add(currentTarget);\n            continue;\n        }\n        if (currentTarget && line.startsWith(\"rename from \")) {\n            renameSources.add(line.slice(\"rename from \".length));\n        }\n    }\n    // Drop rename sources (we want the post-rename path, not the pre-rename path).\n    for (const src of renameSources) out.delete(src);\n    return Array.from(out);\n}\n","import { LockfileManager } from \"../LockfileManager.js\";\n\nexport interface StatusResult {\n    /** Whether replay is initialized (lockfile exists) */\n    initialized: boolean;\n    /** Total number of generations tracked */\n    generationCount: number;\n    /** Last generation info, if available */\n    lastGeneration: StatusGeneration | undefined;\n    /** Tracked customization patches */\n    patches: StatusPatch[];\n    /** Count of patches with \"unresolved\" or \"resolving\" status */\n    unresolvedCount: number;\n    /** Exclude patterns from replay.yml */\n    excludePatterns: string[];\n    /**\n     * Customizations the customer permanently dismissed — via `forget`, or by\n     * keeping the generator's version when resolving a conflict. These will\n     * not be re-detected on future generations.\n     */\n    dismissed: StatusDismissal[];\n    /**\n     * Count of forgotten hashes recorded before dismissal metadata existed.\n     * Such entries still tombstone re-detection but carry no message/commit\n     * details to display.\n     */\n    legacyDismissedCount: number;\n}\n\nexport interface StatusDismissal {\n    /** The customer's original commit message */\n    message: string;\n    /** Short SHA of the original commit (7 chars; empty for synthetic patches) */\n    sha: string;\n    /** Which route dismissed it */\n    via: \"forget\" | \"resolve\";\n    /** ISO timestamp of the dismissal */\n    dismissedAt: string;\n}\n\nexport interface StatusPatch {\n    /** Patch ID (e.g. \"patch-def45678\") */\n    id: string;\n    /** \"added\" if patch_content contains \"new file mode\", otherwise \"modified\" */\n    type: \"added\" | \"modified\";\n    /** Original commit message */\n    message: string;\n    /** Author name (without email) */\n    author: string;\n    /** Short SHA of the original commit (7 chars) */\n    sha: string;\n    /** Files touched by this patch */\n    files: string[];\n    /** Number of files */\n    fileCount: number;\n    /** Patch resolution status, if any */\n    status?: \"unresolved\" | \"resolving\";\n}\n\nexport interface StatusGeneration {\n    /** Short commit SHA (7 chars) */\n    sha: string;\n    /** Generation timestamp */\n    timestamp: string;\n    /** CLI version used for generation */\n    cliVersion: string;\n    /** Generator versions (e.g. { \"fern-java-sdk\": \"3.35.0\" }) */\n    generatorVersions: Record<string, string>;\n}\n\nexport function status(outputDir: string): StatusResult {\n    const lockManager = new LockfileManager(outputDir);\n\n    if (!lockManager.exists()) {\n        return {\n            initialized: false,\n            generationCount: 0,\n            lastGeneration: undefined,\n            patches: [],\n            unresolvedCount: 0,\n            excludePatterns: [],\n            dismissed: [],\n            legacyDismissedCount: 0,\n        };\n    }\n\n    const lock = lockManager.read();\n\n    const patches: StatusPatch[] = lock.patches.map((patch) => ({\n        id: patch.id,\n        type: patch.patch_content.includes(\"new file mode\") ? \"added\" as const : \"modified\" as const,\n        message: patch.original_message,\n        author: patch.original_author.split(\"<\")[0]?.trim() || \"unknown\",\n        sha: patch.original_commit.slice(0, 7),\n        files: patch.files,\n        fileCount: patch.files.length,\n        ...(patch.status ? { status: patch.status } : {}),\n    }));\n\n    const unresolvedCount = lock.patches.filter(\n        (p) => p.status === \"unresolved\" || p.status === \"resolving\"\n    ).length;\n\n    let lastGeneration: StatusGeneration | undefined;\n    const lastGen = lock.generations.find((g) => g.commit_sha === lock.current_generation);\n    if (lastGen) {\n        lastGeneration = {\n            sha: lastGen.commit_sha.slice(0, 7),\n            timestamp: lastGen.timestamp,\n            cliVersion: lastGen.cli_version,\n            generatorVersions: lastGen.generator_versions,\n        };\n    }\n\n    const config = lockManager.getCustomizationsConfig();\n    const excludePatterns = config.exclude ?? [];\n\n    const dismissals = lock.dismissals ?? [];\n    const dismissed: StatusDismissal[] = dismissals.map((d) => ({\n        message: d.original_message,\n        sha: d.original_commit.slice(0, 7),\n        via: d.via,\n        dismissedAt: d.dismissed_at,\n    }));\n\n    // Forgotten hashes recorded before dismissal metadata existed: still\n    // operative tombstones, but with nothing to display beyond a count.\n    const coveredHashes = new Set(dismissals.flatMap((d) => d.content_hashes));\n    const legacyDismissedCount = (lock.forgotten_hashes ?? []).filter((h) => !coveredHashes.has(h)).length;\n\n    return {\n        initialized: true,\n        generationCount: lock.generations.length,\n        lastGeneration,\n        patches,\n        unresolvedCount,\n        excludePatterns,\n        dismissed,\n        legacyDismissedCount,\n    };\n}\n"],"mappings":"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","names":["exports","module","parse","match","exports","module","debug","match","exports","module","match","exports","module","exports","module","exports","module","useColors","debug","exports","module","path","exists","exports","__export","deferred","status","exports","path","trimmed","Buffer","filter","commands","parser","parsers","parse","append","debug","onError","status","disallowedCommand","input","import_promise_deferred","__esm","ExitCodes","__export","CheckRepoActions","CleanOptions","GitConfigScope","DiffNameStatus","ResetMode","excludeOptions","__commonJS","exports","module","GitExecutor","SimpleGitApi","Scheduler","configurationErrorTask","asArray","filterArray","filterPrimitives","filterString","filterStringOrStringArray","filterType","getTrailingOptions","trailingFunctionArgument","trailingOptionsArgument","applyPatchTask","branchTask","branchLocalTask","deleteBranchesTask","deleteBranchTask","checkIgnoreTask","checkIsRepoTask","cloneTask","cloneMirrorTask","cleanWithOptionsTask","isCleanOptionsArray","diffSummaryTask","fetchTask","moveTask","pullTask","pushTagsTask","addRemoteTask","getRemotesTask","listRemotesTask","remoteTask","removeRemoteTask","getResetMode","resetTask","stashListTask","addSubModuleTask","initSubModuleTask","subModuleTask","updateSubModuleTask","addAnnotatedTagTask","addTagTask","tagListTask","straightThroughBufferTask","straightThroughStringTask","Git","plugin","spawn","resolve","exports","module","exports","module","expand","exports","exports","path","exports","onError","exports","exports","exports","res","exports","res","exports","anchors","exports","exports","match","node","exports","path","exports","exports","i","end","exports","exports","match","stringify","exports","stringify","exports","debug","exports","value","exports","stringify","exports","exports","stringify","comment","str","exports","exports","map","onError","exports","exports","seq","onError","exports","exports","exports","exports","exports","exports","exports","require_schema","exports","onError","exports","onError","exports","onError","pairs","exports","omap","onError","require_bool","exports","require_float","exports","require_int","exports","n","exports","set","onError","exports","res","match","require_schema","exports","exports","tags","exports","exports","stringify","exports","path","res","exports","exports","onError","last","exports","exports","onError","exports","exports","onError","sep","exports","onError","exports","onError","sep","exports","onError","sep","exports","onError","exports","onError","splitLines","value","end","sep","first","exports","onError","first","match","sep","last","exports","onError","tag","exports","exports","onError","exports","onError","exports","exports","onError","exports","stringify","sep","exports","path","exports","exports","i","ch","exports","exports","last","sep","start","exports","parser","lineCounter","parse","stringify","require_dist","exports","parser","contextCount","match","import_promises","import_node_os","import_node_path","import_node_path","import_node_fs","import_node_path","i","acc","ext","start","final","ext","qmark","star","expand","regExpEscape","path","content","import_node_path","ext","match","match","exists","import_node_fs","import_promises","import_node_path","import_promises","import_node_path","path","import_node_path","extractFileDiff","reconstructFromGhostPatch","trimmed","defaults","conflicts","applyPatchToContent","import_promises","import_node_path","merged","GitClient","match","import_node_fs","import_node_path","import_promises","import_node_os","import_node_path","trimmed","isDiffLineForFile","match","rm","resolve","existingPatches","newPatches","allPatches","readFileAsync","applyPatchToContent","computeContentHash","match","path","import_node_crypto","import_node_fs","import_node_path","import_yaml","import_node_crypto","import_node_fs","import_node_path","import_node_fs","import_promises","import_node_path","committer","commitSha","unifiedDiff","resolvePath","status","resolve","trimmed","verb","result"]}